diff --git a/apps/machine/src/stores/atm.ts b/apps/machine/src/stores/atm.ts
index a65f900..f1764e0 100644
--- a/apps/machine/src/stores/atm.ts
+++ b/apps/machine/src/stores/atm.ts
@@ -1639,6 +1639,15 @@ export const useAtmStore = defineStore('atm', () => {
send({ type: 'DEV_UNLOCK' })
}
+ /**
+ * End the current tap-in session on demand and re-lock immediately (drops the
+ * loaded Bolt Card via `locked`'s entry), instead of waiting out the idle
+ * timeout. No-op unless the gate is active and we're on the idle menu.
+ */
+ function endSession() {
+ send({ type: 'END_SESSION' })
+ }
+
// Convenience methods for common events
function selectCashIn() {
send({ type: 'SELECT_CASH_IN' })
@@ -1799,6 +1808,7 @@ export const useAtmStore = defineStore('atm', () => {
grantAccess,
denyAccess,
devUnlock,
+ endSession,
// Actions
initialize,
diff --git a/apps/machine/src/views/IdleView.vue b/apps/machine/src/views/IdleView.vue
index 3465cc1..a538ff2 100644
--- a/apps/machine/src/views/IdleView.vue
+++ b/apps/machine/src/views/IdleView.vue
@@ -183,6 +183,21 @@ function handleCashOut() {
?
+
+
+