botmux 3.15.0 → 3.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +2 -2
- package/README.md +2 -2
- package/dist/.runtime-build-id +1 -1
- package/dist/adapters/backend/destroy-result.d.ts +159 -0
- package/dist/adapters/backend/destroy-result.d.ts.map +1 -0
- package/dist/adapters/backend/destroy-result.js +223 -0
- package/dist/adapters/backend/destroy-result.js.map +1 -0
- package/dist/adapters/backend/herdr-backend.d.ts +4 -0
- package/dist/adapters/backend/herdr-backend.d.ts.map +1 -1
- package/dist/adapters/backend/herdr-backend.js +23 -1
- package/dist/adapters/backend/herdr-backend.js.map +1 -1
- package/dist/adapters/backend/mojo-backend.d.ts +577 -0
- package/dist/adapters/backend/mojo-backend.d.ts.map +1 -0
- package/dist/adapters/backend/mojo-backend.js +2471 -0
- package/dist/adapters/backend/mojo-backend.js.map +1 -0
- package/dist/adapters/backend/mojo-budgets.d.ts +21 -0
- package/dist/adapters/backend/mojo-budgets.d.ts.map +1 -0
- package/dist/adapters/backend/mojo-budgets.js +22 -0
- package/dist/adapters/backend/mojo-budgets.js.map +1 -0
- package/dist/adapters/backend/mojo-isolated-workspace.d.ts +69 -0
- package/dist/adapters/backend/mojo-isolated-workspace.d.ts.map +1 -0
- package/dist/adapters/backend/mojo-isolated-workspace.js +213 -0
- package/dist/adapters/backend/mojo-isolated-workspace.js.map +1 -0
- package/dist/adapters/backend/mojo-process-tree.d.ts +292 -0
- package/dist/adapters/backend/mojo-process-tree.d.ts.map +1 -0
- package/dist/adapters/backend/mojo-process-tree.js +486 -0
- package/dist/adapters/backend/mojo-process-tree.js.map +1 -0
- package/dist/adapters/backend/mojo-types.d.ts +542 -0
- package/dist/adapters/backend/mojo-types.d.ts.map +1 -0
- package/dist/adapters/backend/mojo-types.js +682 -0
- package/dist/adapters/backend/mojo-types.js.map +1 -0
- package/dist/adapters/backend/reproduce-command.js +3 -3
- package/dist/adapters/backend/reproduce-command.js.map +1 -1
- package/dist/adapters/backend/riff-backend.js +1 -1
- package/dist/adapters/backend/riff-backend.js.map +1 -1
- package/dist/adapters/backend/sandbox.d.ts +44 -7
- package/dist/adapters/backend/sandbox.d.ts.map +1 -1
- package/dist/adapters/backend/sandbox.js +30 -7
- package/dist/adapters/backend/sandbox.js.map +1 -1
- package/dist/adapters/backend/session-backend-selector.d.ts +14 -1
- package/dist/adapters/backend/session-backend-selector.d.ts.map +1 -1
- package/dist/adapters/backend/session-backend-selector.js +82 -10
- package/dist/adapters/backend/session-backend-selector.js.map +1 -1
- package/dist/adapters/backend/types.d.ts +101 -6
- package/dist/adapters/backend/types.d.ts.map +1 -1
- package/dist/adapters/backend/types.js.map +1 -1
- package/dist/adapters/backend/zmx-backend.d.ts +11 -0
- package/dist/adapters/backend/zmx-backend.d.ts.map +1 -1
- package/dist/adapters/backend/zmx-backend.js +16 -1
- package/dist/adapters/backend/zmx-backend.js.map +1 -1
- package/dist/adapters/cli/codex-app.d.ts.map +1 -1
- package/dist/adapters/cli/codex-app.js +2 -2
- package/dist/adapters/cli/codex-app.js.map +1 -1
- package/dist/adapters/cli/codex.d.ts.map +1 -1
- package/dist/adapters/cli/codex.js +7 -0
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/adapters/cli/copilot.d.ts +3 -1
- package/dist/adapters/cli/copilot.d.ts.map +1 -1
- package/dist/adapters/cli/copilot.js +23 -5
- package/dist/adapters/cli/copilot.js.map +1 -1
- package/dist/adapters/cli/cursor.d.ts.map +1 -1
- package/dist/adapters/cli/cursor.js +13 -3
- package/dist/adapters/cli/cursor.js.map +1 -1
- package/dist/adapters/cli/grok.d.ts.map +1 -1
- package/dist/adapters/cli/grok.js +24 -5
- package/dist/adapters/cli/grok.js.map +1 -1
- package/dist/adapters/cli/kimi.d.ts.map +1 -1
- package/dist/adapters/cli/kimi.js +19 -1
- package/dist/adapters/cli/kimi.js.map +1 -1
- package/dist/adapters/cli/mojo.d.ts +28 -0
- package/dist/adapters/cli/mojo.d.ts.map +1 -0
- package/dist/adapters/cli/mojo.js +58 -0
- package/dist/adapters/cli/mojo.js.map +1 -0
- package/dist/adapters/cli/pi.d.ts +6 -4
- package/dist/adapters/cli/pi.d.ts.map +1 -1
- package/dist/adapters/cli/pi.js +6 -4
- package/dist/adapters/cli/pi.js.map +1 -1
- package/dist/adapters/cli/read-isolation.d.ts +251 -1
- package/dist/adapters/cli/read-isolation.d.ts.map +1 -1
- package/dist/adapters/cli/read-isolation.js +254 -1
- package/dist/adapters/cli/read-isolation.js.map +1 -1
- package/dist/adapters/cli/registry.d.ts +13 -1
- package/dist/adapters/cli/registry.d.ts.map +1 -1
- package/dist/adapters/cli/registry.js +19 -1
- package/dist/adapters/cli/registry.js.map +1 -1
- package/dist/adapters/cli/runner-input.d.ts +3 -3
- package/dist/adapters/cli/runner-input.d.ts.map +1 -1
- package/dist/adapters/cli/runner-input.js +4 -3
- package/dist/adapters/cli/runner-input.js.map +1 -1
- package/dist/adapters/cli/shared-hints.d.ts +3 -1
- package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
- package/dist/adapters/cli/shared-hints.js +22 -6
- package/dist/adapters/cli/shared-hints.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +29 -4
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/bot-registry.d.ts +20 -0
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +30 -4
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli/arg-utils.d.ts +5 -0
- package/dist/cli/arg-utils.d.ts.map +1 -1
- package/dist/cli/arg-utils.js +7 -0
- package/dist/cli/arg-utils.js.map +1 -1
- package/dist/cli/bots-list-output.d.ts +130 -2
- package/dist/cli/bots-list-output.d.ts.map +1 -1
- package/dist/cli/bots-list-output.js +173 -27
- package/dist/cli/bots-list-output.js.map +1 -1
- package/dist/cli/daemon-lifecycle-env.d.ts +10 -3
- package/dist/cli/daemon-lifecycle-env.d.ts.map +1 -1
- package/dist/cli/daemon-lifecycle-env.js +38 -11
- package/dist/cli/daemon-lifecycle-env.js.map +1 -1
- package/dist/cli/dashboard-command.d.ts +15 -0
- package/dist/cli/dashboard-command.d.ts.map +1 -1
- package/dist/cli/dashboard-command.js +22 -0
- package/dist/cli/dashboard-command.js.map +1 -1
- package/dist/cli/log-tail.d.ts +54 -0
- package/dist/cli/log-tail.d.ts.map +1 -0
- package/dist/cli/log-tail.js +167 -0
- package/dist/cli/log-tail.js.map +1 -0
- package/dist/cli/pm2-env.d.ts +16 -0
- package/dist/cli/pm2-env.d.ts.map +1 -0
- package/dist/cli/pm2-env.js +63 -0
- package/dist/cli/pm2-env.js.map +1 -0
- package/dist/cli/pm2-fleet-lock.d.ts +26 -0
- package/dist/cli/pm2-fleet-lock.d.ts.map +1 -0
- package/dist/cli/pm2-fleet-lock.js +50 -0
- package/dist/cli/pm2-fleet-lock.js.map +1 -0
- package/dist/cli/pm2-god-retirement.d.ts +59 -0
- package/dist/cli/pm2-god-retirement.d.ts.map +1 -0
- package/dist/cli/pm2-god-retirement.js +95 -0
- package/dist/cli/pm2-god-retirement.js.map +1 -0
- package/dist/cli/session-list-wake.d.ts +41 -0
- package/dist/cli/session-list-wake.d.ts.map +1 -0
- package/dist/cli/session-list-wake.js +102 -0
- package/dist/cli/session-list-wake.js.map +1 -0
- package/dist/cli/workflow.d.ts.map +1 -1
- package/dist/cli/workflow.js +26 -0
- package/dist/cli/workflow.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +933 -115
- package/dist/cli.js.map +1 -1
- package/dist/codex-app-runner.js +261 -49
- package/dist/codex-app-runner.js.map +1 -1
- package/dist/core/cli-runtime-update.d.ts +8 -0
- package/dist/core/cli-runtime-update.d.ts.map +1 -1
- package/dist/core/cli-runtime-update.js +127 -8
- package/dist/core/cli-runtime-update.js.map +1 -1
- package/dist/core/close-residual.d.ts +64 -0
- package/dist/core/close-residual.d.ts.map +1 -0
- package/dist/core/close-residual.js +93 -0
- package/dist/core/close-residual.js.map +1 -0
- package/dist/core/closed-session-card.d.ts.map +1 -1
- package/dist/core/closed-session-card.js +11 -3
- package/dist/core/closed-session-card.js.map +1 -1
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +129 -27
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/cost-calculator.d.ts +3 -1
- package/dist/core/cost-calculator.d.ts.map +1 -1
- package/dist/core/cost-calculator.js +230 -1
- package/dist/core/cost-calculator.js.map +1 -1
- package/dist/core/daemon-background-close.d.ts +19 -0
- package/dist/core/daemon-background-close.d.ts.map +1 -0
- package/dist/core/daemon-background-close.js +39 -0
- package/dist/core/daemon-background-close.js.map +1 -0
- package/dist/core/dashboard-command/overview.d.ts +4 -0
- package/dist/core/dashboard-command/overview.d.ts.map +1 -1
- package/dist/core/dashboard-command/overview.js +8 -1
- package/dist/core/dashboard-command/overview.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +373 -41
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/dashboard-rows.d.ts +4 -0
- package/dist/core/dashboard-rows.d.ts.map +1 -1
- package/dist/core/dashboard-rows.js +3 -0
- package/dist/core/dashboard-rows.js.map +1 -1
- package/dist/core/dashboard-url.d.ts +37 -0
- package/dist/core/dashboard-url.d.ts.map +1 -1
- package/dist/core/dashboard-url.js +71 -0
- package/dist/core/dashboard-url.js.map +1 -1
- package/dist/core/deferred-schedule-settlement.d.ts +15 -1
- package/dist/core/deferred-schedule-settlement.d.ts.map +1 -1
- package/dist/core/deferred-schedule-settlement.js +4 -1
- package/dist/core/deferred-schedule-settlement.js.map +1 -1
- package/dist/core/device-isolation-daemon.d.ts +91 -1
- package/dist/core/device-isolation-daemon.d.ts.map +1 -1
- package/dist/core/device-isolation-daemon.js +346 -2
- package/dist/core/device-isolation-daemon.js.map +1 -1
- package/dist/core/local-terminal-opener.d.ts.map +1 -1
- package/dist/core/local-terminal-opener.js +5 -1
- package/dist/core/local-terminal-opener.js.map +1 -1
- package/dist/core/loopback-target.d.ts +14 -0
- package/dist/core/loopback-target.d.ts.map +1 -0
- package/dist/core/loopback-target.js +20 -0
- package/dist/core/loopback-target.js.map +1 -0
- package/dist/core/maintenance.d.ts.map +1 -1
- package/dist/core/maintenance.js +16 -2
- package/dist/core/maintenance.js.map +1 -1
- package/dist/core/mojo-containment-command.d.ts +20 -0
- package/dist/core/mojo-containment-command.d.ts.map +1 -0
- package/dist/core/mojo-containment-command.js +266 -0
- package/dist/core/mojo-containment-command.js.map +1 -0
- package/dist/core/mojo-containment.d.ts +575 -0
- package/dist/core/mojo-containment.d.ts.map +1 -0
- package/dist/core/mojo-containment.js +1158 -0
- package/dist/core/mojo-containment.js.map +1 -0
- package/dist/core/mojo-launcher-env-quarantine.d.ts +30 -0
- package/dist/core/mojo-launcher-env-quarantine.d.ts.map +1 -0
- package/dist/core/mojo-launcher-env-quarantine.js +175 -0
- package/dist/core/mojo-launcher-env-quarantine.js.map +1 -0
- package/dist/core/mojo-session-identity.d.ts +3 -0
- package/dist/core/mojo-session-identity.d.ts.map +1 -0
- package/dist/core/mojo-session-identity.js +126 -0
- package/dist/core/mojo-session-identity.js.map +1 -0
- package/dist/core/persistent-backend.d.ts +32 -8
- package/dist/core/persistent-backend.d.ts.map +1 -1
- package/dist/core/persistent-backend.js +55 -17
- package/dist/core/persistent-backend.js.map +1 -1
- package/dist/core/plugins/mcp/gateway.d.ts +14 -1
- package/dist/core/plugins/mcp/gateway.d.ts.map +1 -1
- package/dist/core/plugins/mcp/gateway.js +70 -3
- package/dist/core/plugins/mcp/gateway.js.map +1 -1
- package/dist/core/plugins/mcp/host.d.ts +2 -0
- package/dist/core/plugins/mcp/host.d.ts.map +1 -1
- package/dist/core/plugins/mcp/host.js +2 -0
- package/dist/core/plugins/mcp/host.js.map +1 -1
- package/dist/core/plugins/pm2.d.ts.map +1 -1
- package/dist/core/plugins/pm2.js +16 -3
- package/dist/core/plugins/pm2.js.map +1 -1
- package/dist/core/plugins/service-manager.d.ts +9 -0
- package/dist/core/plugins/service-manager.d.ts.map +1 -1
- package/dist/core/plugins/service-manager.js +33 -16
- package/dist/core/plugins/service-manager.js.map +1 -1
- package/dist/core/preview-port-owner.d.ts +109 -0
- package/dist/core/preview-port-owner.d.ts.map +1 -0
- package/dist/core/preview-port-owner.js +320 -0
- package/dist/core/preview-port-owner.js.map +1 -0
- package/dist/core/remote-cli-ids.d.ts +5 -0
- package/dist/core/remote-cli-ids.d.ts.map +1 -0
- package/dist/core/remote-cli-ids.js +24 -0
- package/dist/core/remote-cli-ids.js.map +1 -0
- package/dist/core/{riff-shutdown-detach.d.ts → remote-shutdown-detach.d.ts} +40 -39
- package/dist/core/remote-shutdown-detach.d.ts.map +1 -0
- package/dist/core/{riff-shutdown-detach.js → remote-shutdown-detach.js} +85 -83
- package/dist/core/remote-shutdown-detach.js.map +1 -0
- package/dist/core/{riff-worker-shutdown-readiness.d.ts → remote-worker-shutdown-readiness.d.ts} +5 -4
- package/dist/core/remote-worker-shutdown-readiness.d.ts.map +1 -0
- package/dist/core/{riff-worker-shutdown-readiness.js → remote-worker-shutdown-readiness.js} +4 -3
- package/dist/core/remote-worker-shutdown-readiness.js.map +1 -0
- package/dist/core/reply-target.d.ts +16 -1
- package/dist/core/reply-target.d.ts.map +1 -1
- package/dist/core/reply-target.js +61 -0
- package/dist/core/reply-target.js.map +1 -1
- package/dist/core/session-group-birth.d.ts +26 -0
- package/dist/core/session-group-birth.d.ts.map +1 -1
- package/dist/core/session-group-birth.js +81 -4
- package/dist/core/session-group-birth.js.map +1 -1
- package/dist/core/session-manager.d.ts +15 -2
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +259 -5
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-model.d.ts +46 -0
- package/dist/core/session-model.d.ts.map +1 -0
- package/dist/core/session-model.js +42 -0
- package/dist/core/session-model.js.map +1 -0
- package/dist/core/session-owner-reminder.d.ts +63 -0
- package/dist/core/session-owner-reminder.d.ts.map +1 -0
- package/dist/core/session-owner-reminder.js +196 -0
- package/dist/core/session-owner-reminder.js.map +1 -0
- package/dist/core/session-preview-registry.d.ts +53 -0
- package/dist/core/session-preview-registry.d.ts.map +1 -0
- package/dist/core/session-preview-registry.js +82 -0
- package/dist/core/session-preview-registry.js.map +1 -0
- package/dist/core/session-preview.d.ts +114 -0
- package/dist/core/session-preview.d.ts.map +1 -0
- package/dist/core/session-preview.js +184 -0
- package/dist/core/session-preview.js.map +1 -0
- package/dist/core/session-rename.d.ts.map +1 -1
- package/dist/core/session-rename.js +5 -3
- package/dist/core/session-rename.js.map +1 -1
- package/dist/core/session-wake-deadline.d.ts +5 -0
- package/dist/core/session-wake-deadline.d.ts.map +1 -0
- package/dist/core/session-wake-deadline.js +13 -0
- package/dist/core/session-wake-deadline.js.map +1 -0
- package/dist/core/shutdown-budgets.d.ts +7 -6
- package/dist/core/shutdown-budgets.d.ts.map +1 -1
- package/dist/core/shutdown-budgets.js +11 -10
- package/dist/core/shutdown-budgets.js.map +1 -1
- package/dist/core/terminal-control-grant.d.ts +74 -0
- package/dist/core/terminal-control-grant.d.ts.map +1 -0
- package/dist/core/terminal-control-grant.js +183 -0
- package/dist/core/terminal-control-grant.js.map +1 -0
- package/dist/core/terminal-proxy.d.ts.map +1 -1
- package/dist/core/terminal-proxy.js +4 -5
- package/dist/core/terminal-proxy.js.map +1 -1
- package/dist/core/terminal-write-auth.d.ts +4 -11
- package/dist/core/terminal-write-auth.d.ts.map +1 -1
- package/dist/core/terminal-write-auth.js +19 -16
- package/dist/core/terminal-write-auth.js.map +1 -1
- package/dist/core/trigger-session.d.ts.map +1 -1
- package/dist/core/trigger-session.js +36 -29
- package/dist/core/trigger-session.js.map +1 -1
- package/dist/core/types.d.ts +88 -10
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +9 -7
- package/dist/core/types.js.map +1 -1
- package/dist/core/workbench-link.d.ts +81 -0
- package/dist/core/workbench-link.d.ts.map +1 -0
- package/dist/core/workbench-link.js +109 -0
- package/dist/core/workbench-link.js.map +1 -0
- package/dist/core/worker-pool.d.ts +312 -11
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +2494 -209
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts +6 -0
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +443 -106
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/aggregator.d.ts +33 -3
- package/dist/dashboard/aggregator.d.ts.map +1 -1
- package/dist/dashboard/aggregator.js +93 -17
- package/dist/dashboard/aggregator.js.map +1 -1
- package/dist/dashboard/auth-session-connections.d.ts +59 -0
- package/dist/dashboard/auth-session-connections.d.ts.map +1 -0
- package/dist/dashboard/auth-session-connections.js +109 -0
- package/dist/dashboard/auth-session-connections.js.map +1 -0
- package/dist/dashboard/auth.d.ts +99 -1
- package/dist/dashboard/auth.d.ts.map +1 -1
- package/dist/dashboard/auth.js +176 -64
- package/dist/dashboard/auth.js.map +1 -1
- package/dist/dashboard/bot-payload.d.ts +1 -0
- package/dist/dashboard/bot-payload.d.ts.map +1 -1
- package/dist/dashboard/bot-payload.js +3 -0
- package/dist/dashboard/bot-payload.js.map +1 -1
- package/dist/dashboard/control-audit.d.ts +112 -0
- package/dist/dashboard/control-audit.d.ts.map +1 -0
- package/dist/dashboard/control-audit.js +195 -0
- package/dist/dashboard/control-audit.js.map +1 -0
- package/dist/dashboard/control-csrf.d.ts +123 -0
- package/dist/dashboard/control-csrf.d.ts.map +1 -0
- package/dist/dashboard/control-csrf.js +392 -0
- package/dist/dashboard/control-csrf.js.map +1 -0
- package/dist/dashboard/daemon-reconcile.d.ts +26 -0
- package/dist/dashboard/daemon-reconcile.d.ts.map +1 -0
- package/dist/dashboard/daemon-reconcile.js +46 -0
- package/dist/dashboard/daemon-reconcile.js.map +1 -0
- package/dist/dashboard/debug-terminal.d.ts.map +1 -1
- package/dist/dashboard/debug-terminal.js +18 -4
- package/dist/dashboard/debug-terminal.js.map +1 -1
- package/dist/dashboard/events-sse.d.ts +60 -0
- package/dist/dashboard/events-sse.d.ts.map +1 -0
- package/dist/dashboard/events-sse.js +63 -0
- package/dist/dashboard/events-sse.js.map +1 -0
- package/dist/dashboard/h5-auth.d.ts +256 -0
- package/dist/dashboard/h5-auth.d.ts.map +1 -0
- package/dist/dashboard/h5-auth.js +825 -0
- package/dist/dashboard/h5-auth.js.map +1 -0
- package/dist/dashboard/managed-spawn.d.ts +36 -0
- package/dist/dashboard/managed-spawn.d.ts.map +1 -0
- package/dist/dashboard/managed-spawn.js +169 -0
- package/dist/dashboard/managed-spawn.js.map +1 -0
- package/dist/dashboard/preview-content-capability.d.ts +41 -0
- package/dist/dashboard/preview-content-capability.d.ts.map +1 -0
- package/dist/dashboard/preview-content-capability.js +127 -0
- package/dist/dashboard/preview-content-capability.js.map +1 -0
- package/dist/dashboard/preview-contract.d.ts +85 -0
- package/dist/dashboard/preview-contract.d.ts.map +1 -0
- package/dist/dashboard/preview-contract.js +198 -0
- package/dist/dashboard/preview-contract.js.map +1 -0
- package/dist/dashboard/preview-guard-page.d.ts +52 -0
- package/dist/dashboard/preview-guard-page.d.ts.map +1 -0
- package/dist/dashboard/preview-guard-page.js +162 -0
- package/dist/dashboard/preview-guard-page.js.map +1 -0
- package/dist/dashboard/preview-interaction.d.ts +57 -0
- package/dist/dashboard/preview-interaction.d.ts.map +1 -0
- package/dist/dashboard/preview-interaction.js +198 -0
- package/dist/dashboard/preview-interaction.js.map +1 -0
- package/dist/dashboard/preview-proxy.d.ts +113 -0
- package/dist/dashboard/preview-proxy.d.ts.map +1 -0
- package/dist/dashboard/preview-proxy.js +543 -0
- package/dist/dashboard/preview-proxy.js.map +1 -0
- package/dist/dashboard/public-redact.d.ts +23 -0
- package/dist/dashboard/public-redact.d.ts.map +1 -1
- package/dist/dashboard/public-redact.js +90 -21
- package/dist/dashboard/public-redact.js.map +1 -1
- package/dist/dashboard/request-identity.d.ts +77 -0
- package/dist/dashboard/request-identity.d.ts.map +1 -0
- package/dist/dashboard/request-identity.js +72 -0
- package/dist/dashboard/request-identity.js.map +1 -0
- package/dist/dashboard/session-cleanup.d.ts +5 -0
- package/dist/dashboard/session-cleanup.d.ts.map +1 -1
- package/dist/dashboard/session-cleanup.js +4 -0
- package/dist/dashboard/session-cleanup.js.map +1 -1
- package/dist/dashboard/settings-write-applier.d.ts +5 -1
- package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
- package/dist/dashboard/settings-write-applier.js +14 -0
- package/dist/dashboard/settings-write-applier.js.map +1 -1
- package/dist/dashboard/standing-link.d.ts +76 -0
- package/dist/dashboard/standing-link.d.ts.map +1 -0
- package/dist/dashboard/standing-link.js +111 -0
- package/dist/dashboard/standing-link.js.map +1 -0
- package/dist/dashboard/terminal-control.d.ts +105 -0
- package/dist/dashboard/terminal-control.d.ts.map +1 -0
- package/dist/dashboard/terminal-control.js +296 -0
- package/dist/dashboard/terminal-control.js.map +1 -0
- package/dist/dashboard/terminal-front-proxy.d.ts +55 -0
- package/dist/dashboard/terminal-front-proxy.d.ts.map +1 -0
- package/dist/dashboard/terminal-front-proxy.js +397 -0
- package/dist/dashboard/terminal-front-proxy.js.map +1 -0
- package/dist/dashboard/terminal-view-capability.d.ts +97 -0
- package/dist/dashboard/terminal-view-capability.d.ts.map +1 -0
- package/dist/dashboard/terminal-view-capability.js +145 -0
- package/dist/dashboard/terminal-view-capability.js.map +1 -0
- package/dist/dashboard/web/agent-workbench-api.d.ts +59 -0
- package/dist/dashboard/web/agent-workbench-api.d.ts.map +1 -0
- package/dist/dashboard/web/agent-workbench-api.js +227 -0
- package/dist/dashboard/web/agent-workbench-api.js.map +1 -0
- package/dist/dashboard/web/agent-workbench-appearance-menu.d.ts +59 -0
- package/dist/dashboard/web/agent-workbench-appearance-menu.d.ts.map +1 -0
- package/dist/dashboard/web/agent-workbench-appearance-menu.js +195 -0
- package/dist/dashboard/web/agent-workbench-appearance-menu.js.map +1 -0
- package/dist/dashboard/web/agent-workbench-appearance.d.ts +222 -0
- package/dist/dashboard/web/agent-workbench-appearance.d.ts.map +1 -0
- package/dist/dashboard/web/agent-workbench-appearance.js +499 -0
- package/dist/dashboard/web/agent-workbench-appearance.js.map +1 -0
- package/dist/dashboard/web/agent-workbench-capabilities.d.ts +13 -0
- package/dist/dashboard/web/agent-workbench-capabilities.d.ts.map +1 -0
- package/dist/dashboard/web/agent-workbench-capabilities.js +24 -0
- package/dist/dashboard/web/agent-workbench-capabilities.js.map +1 -0
- package/dist/dashboard/web/agent-workbench-chat.d.ts +90 -0
- package/dist/dashboard/web/agent-workbench-chat.d.ts.map +1 -0
- package/dist/dashboard/web/agent-workbench-chat.js +168 -0
- package/dist/dashboard/web/agent-workbench-chat.js.map +1 -0
- package/dist/dashboard/web/agent-workbench-dock-page.d.ts +3 -0
- package/dist/dashboard/web/agent-workbench-dock-page.d.ts.map +1 -0
- package/dist/dashboard/web/agent-workbench-dock-page.js +23 -0
- package/dist/dashboard/web/agent-workbench-dock-page.js.map +1 -0
- package/dist/dashboard/web/agent-workbench-dock-view.d.ts +22 -0
- package/dist/dashboard/web/agent-workbench-dock-view.d.ts.map +1 -0
- package/dist/dashboard/web/agent-workbench-dock-view.js +76 -0
- package/dist/dashboard/web/agent-workbench-dock-view.js.map +1 -0
- package/dist/dashboard/web/agent-workbench-model.d.ts +196 -0
- package/dist/dashboard/web/agent-workbench-model.d.ts.map +1 -0
- package/dist/dashboard/web/agent-workbench-model.js +529 -0
- package/dist/dashboard/web/agent-workbench-model.js.map +1 -0
- package/dist/dashboard/web/agent-workbench-page.d.ts +3 -0
- package/dist/dashboard/web/agent-workbench-page.d.ts.map +1 -0
- package/dist/dashboard/web/agent-workbench-page.js +27 -0
- package/dist/dashboard/web/agent-workbench-page.js.map +1 -0
- package/dist/dashboard/web/agent-workbench-panes.d.ts +49 -0
- package/dist/dashboard/web/agent-workbench-panes.d.ts.map +1 -0
- package/dist/dashboard/web/agent-workbench-panes.js +468 -0
- package/dist/dashboard/web/agent-workbench-panes.js.map +1 -0
- package/dist/dashboard/web/agent-workbench-session-list.d.ts +42 -0
- package/dist/dashboard/web/agent-workbench-session-list.d.ts.map +1 -0
- package/dist/dashboard/web/agent-workbench-session-list.js +353 -0
- package/dist/dashboard/web/agent-workbench-session-list.js.map +1 -0
- package/dist/dashboard/web/agent-workbench-storage.d.ts +49 -0
- package/dist/dashboard/web/agent-workbench-storage.d.ts.map +1 -0
- package/dist/dashboard/web/agent-workbench-storage.js +197 -0
- package/dist/dashboard/web/agent-workbench-storage.js.map +1 -0
- package/dist/dashboard/web/agent-workbench-touch.d.ts +46 -0
- package/dist/dashboard/web/agent-workbench-touch.d.ts.map +1 -0
- package/dist/dashboard/web/agent-workbench-touch.js +96 -0
- package/dist/dashboard/web/agent-workbench-touch.js.map +1 -0
- package/dist/dashboard/web/agent-workbench-view.d.ts +34 -0
- package/dist/dashboard/web/agent-workbench-view.d.ts.map +1 -0
- package/dist/dashboard/web/agent-workbench-view.js +439 -0
- package/dist/dashboard/web/agent-workbench-view.js.map +1 -0
- package/dist/dashboard/web/app.d.ts.map +1 -1
- package/dist/dashboard/web/app.js +63 -2
- package/dist/dashboard/web/app.js.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.d.ts +11 -0
- package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.js +267 -36
- package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
- package/dist/dashboard/web/bot-defaults.d.ts +6 -0
- package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults.js.map +1 -1
- package/dist/dashboard/web/control-csrf.d.ts +4 -0
- package/dist/dashboard/web/control-csrf.d.ts.map +1 -0
- package/dist/dashboard/web/control-csrf.js +26 -0
- package/dist/dashboard/web/control-csrf.js.map +1 -0
- package/dist/dashboard/web/dashboard-routes.d.ts.map +1 -1
- package/dist/dashboard/web/dashboard-routes.js +2 -0
- package/dist/dashboard/web/dashboard-routes.js.map +1 -1
- package/dist/dashboard/web/groups-page.d.ts.map +1 -1
- package/dist/dashboard/web/groups-page.js +11 -2
- package/dist/dashboard/web/groups-page.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +132 -6
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/overview-page.d.ts.map +1 -1
- package/dist/dashboard/web/overview-page.js +3 -2
- package/dist/dashboard/web/overview-page.js.map +1 -1
- package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
- package/dist/dashboard/web/sessions-page.js +41 -1
- package/dist/dashboard/web/sessions-page.js.map +1 -1
- package/dist/dashboard/web/sessions.d.ts.map +1 -1
- package/dist/dashboard/web/sessions.js +5 -1
- package/dist/dashboard/web/sessions.js.map +1 -1
- package/dist/dashboard/web/settings-page.d.ts +3 -0
- package/dist/dashboard/web/settings-page.d.ts.map +1 -1
- package/dist/dashboard/web/settings-page.js +56 -10
- package/dist/dashboard/web/settings-page.js.map +1 -1
- package/dist/dashboard/web/store.d.ts +27 -2
- package/dist/dashboard/web/store.d.ts.map +1 -1
- package/dist/dashboard/web/store.js +43 -4
- package/dist/dashboard/web/store.js.map +1 -1
- package/dist/dashboard/web/ui.d.ts +3 -0
- package/dist/dashboard/web/ui.d.ts.map +1 -1
- package/dist/dashboard/web/ui.js +11 -0
- package/dist/dashboard/web/ui.js.map +1 -1
- package/dist/dashboard/web/update-action.d.ts +12 -0
- package/dist/dashboard/web/update-action.d.ts.map +1 -1
- package/dist/dashboard/web/update-action.js +11 -0
- package/dist/dashboard/web/update-action.js.map +1 -1
- package/dist/dashboard/workbench-doctor.d.ts +114 -0
- package/dist/dashboard/workbench-doctor.d.ts.map +1 -0
- package/dist/dashboard/workbench-doctor.js +620 -0
- package/dist/dashboard/workbench-doctor.js.map +1 -0
- package/dist/dashboard/workbench-ticket.d.ts +165 -0
- package/dist/dashboard/workbench-ticket.d.ts.map +1 -0
- package/dist/dashboard/workbench-ticket.js +495 -0
- package/dist/dashboard/workbench-ticket.js.map +1 -0
- package/dist/dashboard-web/app.js +1 -1
- package/dist/dashboard-web/chunks/agent-workbench-dock-page-IKAC5CFL.js +1 -0
- package/dist/dashboard-web/chunks/agent-workbench-page-M53UN5EB.js +1 -0
- package/dist/dashboard-web/chunks/bot-defaults-page-YKE5SDZF.js +10 -0
- package/dist/dashboard-web/chunks/chunk-22WIADUT.js +2 -0
- package/dist/dashboard-web/chunks/chunk-24ONYQMR.js +1 -0
- package/dist/dashboard-web/chunks/{chunk-Z7B3E3US.js → chunk-2W6SCN3M.js} +1 -1
- package/dist/dashboard-web/chunks/chunk-4XNJX6B3.js +1 -0
- package/dist/dashboard-web/chunks/{chunk-VMWNR3SV.js → chunk-F6KNPF4R.js} +11 -9
- package/dist/dashboard-web/chunks/chunk-FXW3V4JR.js +1 -0
- package/dist/dashboard-web/chunks/chunk-G5ZS2YUS.js +1 -0
- package/dist/dashboard-web/chunks/chunk-KTQ7B6ZR.js +1 -0
- package/dist/dashboard-web/chunks/{chunk-Z7DO42GJ.js → chunk-NACP7BMR.js} +1 -1
- package/dist/dashboard-web/chunks/{connectors-page-CPH6VVFY.js → connectors-page-VOISXXII.js} +1 -1
- package/dist/dashboard-web/chunks/{feedback-page-J2FKQ3LK.js → feedback-page-RN6HRZMS.js} +1 -1
- package/dist/dashboard-web/chunks/groups-page-UQT6DCB7.js +8 -0
- package/dist/dashboard-web/chunks/{insights-page-A2LWTKJD.js → insights-page-HJFDYR5N.js} +3 -3
- package/dist/dashboard-web/chunks/{monitor-room-2YR752E3.js → monitor-room-V7PCP47V.js} +1 -1
- package/dist/dashboard-web/chunks/{monitoring-page-BGYSKZGM.js → monitoring-page-NKEKVQAP.js} +1 -1
- package/dist/dashboard-web/chunks/{office-page-ZZHTEAE4.js → office-page-GVJF73XW.js} +1 -1
- package/dist/dashboard-web/chunks/overview-page-KHLV6VTI.js +1 -0
- package/dist/dashboard-web/chunks/{plugin-page-VEGTCEAS.js → plugin-page-J3OF5IY4.js} +1 -1
- package/dist/dashboard-web/chunks/{roles-page-YUC4YLJG.js → roles-page-WQIRSOLZ.js} +1 -1
- package/dist/dashboard-web/chunks/{schedules-page-2L2NKTDJ.js → schedules-page-J2DEY2X6.js} +1 -1
- package/dist/dashboard-web/chunks/sessions-page-7BQFEA5P.js +8 -0
- package/dist/dashboard-web/chunks/settings-page-BJEIOFJH.js +2 -0
- package/dist/dashboard-web/chunks/{skills-page-DQPBBI3T.js → skills-page-HGIFR3IU.js} +1 -1
- package/dist/dashboard-web/chunks/{team-federation-page-LQKLDV4K.js → team-federation-page-MR5ZPL4B.js} +1 -1
- package/dist/dashboard-web/chunks/{v3-page-RVKQIMAP.js → v3-page-GBR5JWPE.js} +2 -2
- package/dist/dashboard-web/chunks/{whiteboards-page-S5K55HRZ.js → whiteboards-page-QAZM4BN3.js} +1 -1
- package/dist/dashboard-web/index.html +8 -1
- package/dist/dashboard-web/style.css +2006 -10
- package/dist/dashboard.js +1006 -263
- package/dist/dashboard.js.map +1 -1
- package/dist/global-config.d.ts +30 -0
- package/dist/global-config.d.ts.map +1 -1
- package/dist/global-config.js +33 -0
- package/dist/global-config.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +31 -1
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +28 -1
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts +1 -1
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +22 -6
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +118 -24
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts +15 -0
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +30 -0
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts +48 -0
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +133 -22
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/identity-cache.d.ts +14 -6
- package/dist/im/lark/identity-cache.d.ts.map +1 -1
- package/dist/im/lark/identity-cache.js +69 -26
- package/dist/im/lark/identity-cache.js.map +1 -1
- package/dist/im/lark/lark-hosts.d.ts +13 -0
- package/dist/im/lark/lark-hosts.d.ts.map +1 -1
- package/dist/im/lark/lark-hosts.js +16 -0
- package/dist/im/lark/lark-hosts.js.map +1 -1
- package/dist/im/lark/overview-card.d.ts +22 -0
- package/dist/im/lark/overview-card.d.ts.map +1 -1
- package/dist/im/lark/overview-card.js +53 -3
- package/dist/im/lark/overview-card.js.map +1 -1
- package/dist/im/lark/sessions-card.d.ts.map +1 -1
- package/dist/im/lark/sessions-card.js +26 -3
- package/dist/im/lark/sessions-card.js.map +1 -1
- package/dist/im/lark/workflow-slash-command.d.ts +6 -0
- package/dist/im/lark/workflow-slash-command.d.ts.map +1 -1
- package/dist/im/lark/workflow-slash-command.js +7 -0
- package/dist/im/lark/workflow-slash-command.js.map +1 -1
- package/dist/index-daemon.js +27 -4
- package/dist/index-daemon.js.map +1 -1
- package/dist/index-dashboard.d.ts +3 -0
- package/dist/index-dashboard.d.ts.map +1 -0
- package/dist/index-dashboard.js +94 -0
- package/dist/index-dashboard.js.map +1 -0
- package/dist/platform/team-agents-client.d.ts +199 -0
- package/dist/platform/team-agents-client.d.ts.map +1 -0
- package/dist/platform/team-agents-client.js +263 -0
- package/dist/platform/team-agents-client.js.map +1 -0
- package/dist/platform/tunnel-client.d.ts +6 -0
- package/dist/platform/tunnel-client.d.ts.map +1 -1
- package/dist/platform/tunnel-client.js.map +1 -1
- package/dist/services/async-trigger-state.d.ts +7 -3
- package/dist/services/async-trigger-state.d.ts.map +1 -1
- package/dist/services/async-trigger-state.js +28 -0
- package/dist/services/async-trigger-state.js.map +1 -1
- package/dist/services/async-trigger-store.d.ts +13 -4
- package/dist/services/async-trigger-store.d.ts.map +1 -1
- package/dist/services/async-trigger-store.js +55 -8
- package/dist/services/async-trigger-store.js.map +1 -1
- package/dist/services/bot-config-store.d.ts +1 -11
- package/dist/services/bot-config-store.d.ts.map +1 -1
- package/dist/services/bot-config-store.js +27 -3
- package/dist/services/bot-config-store.js.map +1 -1
- package/dist/services/bot-profile-store.d.ts +17 -2
- package/dist/services/bot-profile-store.d.ts.map +1 -1
- package/dist/services/bot-profile-store.js +93 -12
- package/dist/services/bot-profile-store.js.map +1 -1
- package/dist/services/bridge-turn-queue.d.ts +10 -1
- package/dist/services/bridge-turn-queue.d.ts.map +1 -1
- package/dist/services/bridge-turn-queue.js +29 -9
- package/dist/services/bridge-turn-queue.js.map +1 -1
- package/dist/services/claude-transcript.d.ts +19 -0
- package/dist/services/claude-transcript.d.ts.map +1 -1
- package/dist/services/claude-transcript.js +57 -5
- package/dist/services/claude-transcript.js.map +1 -1
- package/dist/services/codex-app-threads.d.ts +2 -0
- package/dist/services/codex-app-threads.d.ts.map +1 -1
- package/dist/services/codex-app-threads.js +1 -1
- package/dist/services/codex-app-threads.js.map +1 -1
- package/dist/services/codex-reasoning-effort.d.ts +8 -0
- package/dist/services/codex-reasoning-effort.d.ts.map +1 -1
- package/dist/services/codex-reasoning-effort.js +24 -0
- package/dist/services/codex-reasoning-effort.js.map +1 -1
- package/dist/services/cursor-resume-policy.d.ts.map +1 -1
- package/dist/services/cursor-resume-policy.js +15 -3
- package/dist/services/cursor-resume-policy.js.map +1 -1
- package/dist/services/open-platform-rename.d.ts.map +1 -1
- package/dist/services/open-platform-rename.js +3 -2
- package/dist/services/open-platform-rename.js.map +1 -1
- package/dist/services/ordinary-turn-recovery.d.ts +76 -0
- package/dist/services/ordinary-turn-recovery.d.ts.map +1 -0
- package/dist/services/ordinary-turn-recovery.js +349 -0
- package/dist/services/ordinary-turn-recovery.js.map +1 -0
- package/dist/services/resume-fresh-policy.d.ts +17 -0
- package/dist/services/resume-fresh-policy.d.ts.map +1 -0
- package/dist/services/resume-fresh-policy.js +24 -0
- package/dist/services/resume-fresh-policy.js.map +1 -0
- package/dist/services/session-group-title.d.ts +1 -0
- package/dist/services/session-group-title.d.ts.map +1 -1
- package/dist/services/session-group-title.js +16 -1
- package/dist/services/session-group-title.js.map +1 -1
- package/dist/services/session-groups-store.d.ts +30 -0
- package/dist/services/session-groups-store.d.ts.map +1 -1
- package/dist/services/session-groups-store.js +26 -4
- package/dist/services/session-groups-store.js.map +1 -1
- package/dist/services/session-owner-notification.d.ts +9 -0
- package/dist/services/session-owner-notification.d.ts.map +1 -0
- package/dist/services/session-owner-notification.js +10 -0
- package/dist/services/session-owner-notification.js.map +1 -0
- package/dist/services/session-owner-reminder-config-store.d.ts +9 -0
- package/dist/services/session-owner-reminder-config-store.d.ts.map +1 -0
- package/dist/services/session-owner-reminder-config-store.js +24 -0
- package/dist/services/session-owner-reminder-config-store.js.map +1 -0
- package/dist/services/session-owner-reminder-store.d.ts +5 -0
- package/dist/services/session-owner-reminder-store.d.ts.map +1 -0
- package/dist/services/session-owner-reminder-store.js +54 -0
- package/dist/services/session-owner-reminder-store.js.map +1 -0
- package/dist/services/session-store.d.ts +98 -21
- package/dist/services/session-store.d.ts.map +1 -1
- package/dist/services/session-store.js +406 -48
- package/dist/services/session-store.js.map +1 -1
- package/dist/services/structured-bridge-clis.d.ts +9 -5
- package/dist/services/structured-bridge-clis.d.ts.map +1 -1
- package/dist/services/structured-bridge-clis.js +9 -4
- package/dist/services/structured-bridge-clis.js.map +1 -1
- package/dist/services/transcript-resolver.d.ts +1 -1
- package/dist/services/transcript-resolver.d.ts.map +1 -1
- package/dist/services/transcript-resolver.js +6 -1
- package/dist/services/transcript-resolver.js.map +1 -1
- package/dist/setup/bot-config-editor.d.ts.map +1 -1
- package/dist/setup/bot-config-editor.js +7 -2
- package/dist/setup/bot-config-editor.js.map +1 -1
- package/dist/setup/ensure-herdr-integrations.d.ts +13 -0
- package/dist/setup/ensure-herdr-integrations.d.ts.map +1 -1
- package/dist/setup/ensure-herdr-integrations.js +21 -3
- package/dist/setup/ensure-herdr-integrations.js.map +1 -1
- package/dist/setup/open-platform-automation.d.ts +1 -0
- package/dist/setup/open-platform-automation.d.ts.map +1 -1
- package/dist/setup/open-platform-automation.js +107 -7
- package/dist/setup/open-platform-automation.js.map +1 -1
- package/dist/skills/definitions.d.ts +17 -0
- package/dist/skills/definitions.d.ts.map +1 -1
- package/dist/skills/definitions.js +78 -8
- package/dist/skills/definitions.js.map +1 -1
- package/dist/skills/injection-mode.d.ts +24 -3
- package/dist/skills/injection-mode.d.ts.map +1 -1
- package/dist/skills/injection-mode.js +64 -15
- package/dist/skills/injection-mode.js.map +1 -1
- package/dist/skills/installer.d.ts +18 -0
- package/dist/skills/installer.d.ts.map +1 -1
- package/dist/skills/installer.js +45 -1
- package/dist/skills/installer.js.map +1 -1
- package/dist/types.d.ts +221 -10
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/child-env.d.ts +92 -2
- package/dist/utils/child-env.d.ts.map +1 -1
- package/dist/utils/child-env.js +195 -1
- package/dist/utils/child-env.js.map +1 -1
- package/dist/utils/cli-usage-limit.d.ts +25 -14
- package/dist/utils/cli-usage-limit.d.ts.map +1 -1
- package/dist/utils/cli-usage-limit.js +25 -15
- package/dist/utils/cli-usage-limit.js.map +1 -1
- package/dist/utils/daemon-rejection-guard.d.ts +35 -0
- package/dist/utils/daemon-rejection-guard.d.ts.map +1 -0
- package/dist/utils/daemon-rejection-guard.js +101 -0
- package/dist/utils/daemon-rejection-guard.js.map +1 -0
- package/dist/utils/dashboard-env.d.ts +53 -0
- package/dist/utils/dashboard-env.d.ts.map +1 -0
- package/dist/utils/dashboard-env.js +116 -0
- package/dist/utils/dashboard-env.js.map +1 -0
- package/dist/utils/global-install.d.ts.map +1 -1
- package/dist/utils/global-install.js +61 -5
- package/dist/utils/global-install.js.map +1 -1
- package/dist/utils/install-diagnostics.d.ts +14 -7
- package/dist/utils/install-diagnostics.d.ts.map +1 -1
- package/dist/utils/install-diagnostics.js +20 -11
- package/dist/utils/install-diagnostics.js.map +1 -1
- package/dist/utils/local-dev-update.d.ts +132 -0
- package/dist/utils/local-dev-update.d.ts.map +1 -0
- package/dist/utils/local-dev-update.js +176 -0
- package/dist/utils/local-dev-update.js.map +1 -0
- package/dist/utils/pending-input-queue.d.ts +12 -1
- package/dist/utils/pending-input-queue.d.ts.map +1 -1
- package/dist/utils/pending-input-queue.js.map +1 -1
- package/dist/worker.js +1284 -225
- package/dist/worker.js.map +1 -1
- package/dist/workflows/definition.d.ts +68 -68
- package/dist/workflows/events/payloads.d.ts +14 -14
- package/dist/workflows/events/schema.d.ts +312 -312
- package/dist/workflows/migration/v2-run-archive-schema.d.ts +40 -40
- package/dist/workflows/v3/cli-run.d.ts.map +1 -1
- package/dist/workflows/v3/cli-run.js +7 -0
- package/dist/workflows/v3/cli-run.js.map +1 -1
- package/dist/workflows/v3/goal-cli.d.ts +3 -0
- package/dist/workflows/v3/goal-cli.d.ts.map +1 -1
- package/dist/workflows/v3/goal-cli.js +11 -0
- package/dist/workflows/v3/goal-cli.js.map +1 -1
- package/dist/workflows/v3/run-envelope.d.ts +144 -144
- package/package.json +3 -2
- package/dist/cli/pm2-god-admission.d.ts +0 -8
- package/dist/cli/pm2-god-admission.d.ts.map +0 -1
- package/dist/cli/pm2-god-admission.js +0 -25
- package/dist/cli/pm2-god-admission.js.map +0 -1
- package/dist/core/riff-shutdown-detach.d.ts.map +0 -1
- package/dist/core/riff-shutdown-detach.js.map +0 -1
- package/dist/core/riff-worker-shutdown-readiness.d.ts.map +0 -1
- package/dist/core/riff-worker-shutdown-readiness.js.map +0 -1
- package/dist/dashboard-web/chunks/bot-defaults-page-65SMZ4QY.js +0 -10
- package/dist/dashboard-web/chunks/chunk-G5XGBCM6.js +0 -1
- package/dist/dashboard-web/chunks/chunk-IKN6WURK.js +0 -1
- package/dist/dashboard-web/chunks/chunk-WLIVBPJC.js +0 -1
- package/dist/dashboard-web/chunks/groups-page-VDOOLS4M.js +0 -8
- package/dist/dashboard-web/chunks/overview-page-7NYPKQSB.js +0 -1
- package/dist/dashboard-web/chunks/sessions-page-DYZZMKFL.js +0 -8
- package/dist/dashboard-web/chunks/settings-page-LIULUSMH.js +0 -2
|
@@ -10,6 +10,20 @@ import { removePromptContextDir } from './prompt-context-store.js';
|
|
|
10
10
|
let sessions = new Map();
|
|
11
11
|
let loaded = false;
|
|
12
12
|
let currentAppId;
|
|
13
|
+
let loadFailure;
|
|
14
|
+
/**
|
|
15
|
+
* The compatibility reader deliberately exposes an empty projection after a
|
|
16
|
+
* read/parse failure. Destructive callers must use the strict API below so an
|
|
17
|
+
* unreadable store cannot be mistaken for "there are no durable sessions".
|
|
18
|
+
*/
|
|
19
|
+
export class SessionStoreUnavailableError extends Error {
|
|
20
|
+
loadError;
|
|
21
|
+
name = 'SessionStoreUnavailableError';
|
|
22
|
+
constructor(loadError) {
|
|
23
|
+
super(`session store is unavailable: ${loadError.message}`);
|
|
24
|
+
this.loadError = loadError;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
13
27
|
// Legacy fields from the removed「处理中」placeholder-card PATCH delivery. They
|
|
14
28
|
// no longer exist on Session and nothing reads them, but sessions persisted
|
|
15
29
|
// before the removal still carry them on disk. Strip on write so the file
|
|
@@ -20,34 +34,34 @@ export function stripLegacyPendingCardFields(session) {
|
|
|
20
34
|
delete session[f];
|
|
21
35
|
}
|
|
22
36
|
/** The active row no longer has the lineage/ownership sampled by the caller. */
|
|
23
|
-
export class
|
|
24
|
-
name = '
|
|
37
|
+
export class RemoteLineageOwnershipError extends Error {
|
|
38
|
+
name = 'RemoteLineageOwnershipError';
|
|
25
39
|
}
|
|
26
|
-
export class
|
|
40
|
+
export class RemoteLineageBatchError extends Error {
|
|
27
41
|
stage;
|
|
28
42
|
sessionIds;
|
|
29
|
-
name = '
|
|
43
|
+
name = 'RemoteLineageBatchError';
|
|
30
44
|
constructor(stage, sessionIds, message) {
|
|
31
45
|
super(message);
|
|
32
46
|
this.stage = stage;
|
|
33
47
|
this.sessionIds = sessionIds;
|
|
34
48
|
}
|
|
35
49
|
}
|
|
36
|
-
function
|
|
50
|
+
function remoteDurableOwner(session) {
|
|
37
51
|
return {
|
|
38
52
|
pid: session.pid ?? null,
|
|
39
53
|
larkAppId: session.larkAppId ?? null,
|
|
40
54
|
backendType: session.backendType ?? null,
|
|
41
55
|
};
|
|
42
56
|
}
|
|
43
|
-
function
|
|
57
|
+
function remoteOwnersEqual(left, right) {
|
|
44
58
|
return left.pid === right.pid
|
|
45
59
|
&& left.larkAppId === right.larkAppId
|
|
46
60
|
&& left.backendType === right.backendType;
|
|
47
61
|
}
|
|
48
|
-
let
|
|
49
|
-
export function
|
|
50
|
-
|
|
62
|
+
let testOnlyAfterRemoteBatchRename;
|
|
63
|
+
export function __testOnly_setAfterRemoteBatchRename(hook) {
|
|
64
|
+
testOnlyAfterRemoteBatchRename = hook;
|
|
51
65
|
}
|
|
52
66
|
/**
|
|
53
67
|
* Initialise session store for a specific bot (multi-daemon mode).
|
|
@@ -58,6 +72,7 @@ export function init(appId) {
|
|
|
58
72
|
currentAppId = appId;
|
|
59
73
|
loaded = false;
|
|
60
74
|
sessions = new Map();
|
|
75
|
+
loadFailure = undefined;
|
|
61
76
|
}
|
|
62
77
|
function getFilePath() {
|
|
63
78
|
const fileName = currentAppId ? `sessions-${currentAppId}.json` : 'sessions.json';
|
|
@@ -97,6 +112,13 @@ function repairMissingChatScopes() {
|
|
|
97
112
|
}
|
|
98
113
|
return repaired;
|
|
99
114
|
}
|
|
115
|
+
function parseSessionsProjectionStrict(raw, fp) {
|
|
116
|
+
const value = JSON.parse(raw);
|
|
117
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
118
|
+
throw new Error(`invalid sessions projection at ${fp}`);
|
|
119
|
+
}
|
|
120
|
+
return value;
|
|
121
|
+
}
|
|
100
122
|
// Sessions persisted before 2026-04-29 lack `cliId`; consumers must fall back to 'unknown' at the render boundary.
|
|
101
123
|
function load() {
|
|
102
124
|
if (loaded)
|
|
@@ -106,7 +128,7 @@ function load() {
|
|
|
106
128
|
withFileLockSync(fp, () => {
|
|
107
129
|
if (existsSync(fp)) {
|
|
108
130
|
try {
|
|
109
|
-
const data =
|
|
131
|
+
const data = parseSessionsProjectionStrict(readFileSync(fp, 'utf-8'), fp);
|
|
110
132
|
sessions = new Map(Object.entries(data));
|
|
111
133
|
const repaired = repairMissingChatScopes();
|
|
112
134
|
if (repaired > 0) {
|
|
@@ -126,6 +148,7 @@ function load() {
|
|
|
126
148
|
}
|
|
127
149
|
catch (err) {
|
|
128
150
|
logger.error(`Failed to load sessions: ${err}`);
|
|
151
|
+
loadFailure = err instanceof Error ? err : new Error(String(err));
|
|
129
152
|
sessions = new Map();
|
|
130
153
|
}
|
|
131
154
|
}
|
|
@@ -135,7 +158,7 @@ function load() {
|
|
|
135
158
|
const legacyFp = join(config.session.dataDir, 'sessions.json');
|
|
136
159
|
if (existsSync(legacyFp)) {
|
|
137
160
|
try {
|
|
138
|
-
const data =
|
|
161
|
+
const data = parseSessionsProjectionStrict(readFileSync(legacyFp, 'utf-8'), legacyFp);
|
|
139
162
|
sessions = new Map();
|
|
140
163
|
for (const [k, v] of Object.entries(data)) {
|
|
141
164
|
if (v.larkAppId === currentAppId)
|
|
@@ -155,6 +178,7 @@ function load() {
|
|
|
155
178
|
}
|
|
156
179
|
catch (err) {
|
|
157
180
|
logger.error(`Failed to migrate sessions from legacy file: ${err}`);
|
|
181
|
+
loadFailure = err instanceof Error ? err : new Error(String(err));
|
|
158
182
|
sessions = new Map();
|
|
159
183
|
}
|
|
160
184
|
}
|
|
@@ -162,6 +186,18 @@ function load() {
|
|
|
162
186
|
});
|
|
163
187
|
loaded = true;
|
|
164
188
|
}
|
|
189
|
+
/**
|
|
190
|
+
* Mutations must never proceed from the compatibility reader's empty
|
|
191
|
+
* projection after a load failure. In particular, serialising that empty
|
|
192
|
+
* cache would replace the unreadable durable file and destroy the only copy
|
|
193
|
+
* of its rows. Keep the failure sticky until init() explicitly reloads the
|
|
194
|
+
* selected store, matching listSessionsStrict().
|
|
195
|
+
*/
|
|
196
|
+
function loadForWrite() {
|
|
197
|
+
load();
|
|
198
|
+
if (loadFailure)
|
|
199
|
+
throw new SessionStoreUnavailableError(loadFailure);
|
|
200
|
+
}
|
|
165
201
|
function readExistingSessionsFromDisk(fp) {
|
|
166
202
|
if (!existsSync(fp))
|
|
167
203
|
return { raw: '', parsed: {} };
|
|
@@ -177,11 +213,7 @@ function readSessionsProjectionStrict(fp) {
|
|
|
177
213
|
if (!existsSync(fp))
|
|
178
214
|
return { raw: '', parsed: {} };
|
|
179
215
|
const raw = readFileSync(fp, 'utf-8');
|
|
180
|
-
|
|
181
|
-
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
182
|
-
throw new Error(`invalid sessions projection at ${fp}`);
|
|
183
|
-
}
|
|
184
|
-
return { raw, parsed: value };
|
|
216
|
+
return { raw, parsed: parseSessionsProjectionStrict(raw, fp) };
|
|
185
217
|
}
|
|
186
218
|
function duplicateIds(ids) {
|
|
187
219
|
const seen = new Set();
|
|
@@ -195,15 +227,15 @@ function duplicateIds(ids) {
|
|
|
195
227
|
return [...duplicates];
|
|
196
228
|
}
|
|
197
229
|
/**
|
|
198
|
-
* Sample every active
|
|
230
|
+
* Sample every active remote participant from one fresh sessions projection.
|
|
199
231
|
* Fleet shutdown takes this snapshot before fencing any worker.
|
|
200
232
|
*/
|
|
201
|
-
export function
|
|
233
|
+
export function getActiveRemoteShutdownSnapshotsBatch(sessionIds, options = {}) {
|
|
202
234
|
if (sessionIds.length === 0)
|
|
203
235
|
return [];
|
|
204
236
|
const duplicates = duplicateIds(sessionIds);
|
|
205
237
|
if (duplicates.length > 0) {
|
|
206
|
-
throw new
|
|
238
|
+
throw new RemoteLineageBatchError('prewrite_ownership', duplicates, `duplicate remote shutdown session ids: ${duplicates.join(', ')}`);
|
|
207
239
|
}
|
|
208
240
|
ensureDir();
|
|
209
241
|
const fp = getFilePath();
|
|
@@ -215,37 +247,38 @@ export function getActiveRiffShutdownSnapshotsBatch(sessionIds, options = {}) {
|
|
|
215
247
|
return !session || session.status !== 'active';
|
|
216
248
|
});
|
|
217
249
|
if (invalid.length > 0) {
|
|
218
|
-
throw new
|
|
250
|
+
throw new RemoteLineageBatchError('prewrite_ownership', invalid, `cannot snapshot non-active remote sessions: ${invalid.join(', ')}`);
|
|
219
251
|
}
|
|
220
252
|
return sessionIds.map((sessionId) => {
|
|
221
253
|
const session = parsed[sessionId];
|
|
222
254
|
return {
|
|
223
255
|
sessionId,
|
|
224
256
|
taskId: session.riffParentTaskId ?? null,
|
|
225
|
-
owner:
|
|
257
|
+
owner: remoteDurableOwner(session),
|
|
226
258
|
};
|
|
227
259
|
});
|
|
228
260
|
}, { maxWaitMs: options.maxWaitMs });
|
|
229
261
|
}
|
|
230
262
|
catch (error) {
|
|
231
|
-
if (error instanceof
|
|
263
|
+
if (error instanceof RemoteLineageBatchError)
|
|
232
264
|
throw error;
|
|
233
|
-
throw new
|
|
265
|
+
throw new RemoteLineageBatchError('prewrite_io', [...sessionIds], `failed to snapshot active remote sessions: ${String(error)}`);
|
|
234
266
|
}
|
|
235
267
|
}
|
|
236
268
|
/**
|
|
237
|
-
* Commit every prepared
|
|
269
|
+
* Commit every prepared remote lineage as one compare-and-set transaction.
|
|
238
270
|
* The published projection is read back under the same lock before workers
|
|
239
271
|
* are allowed to exit.
|
|
240
272
|
*/
|
|
241
|
-
export function
|
|
273
|
+
export function persistActiveRemoteLineagesExactBatch(updates, options = {}) {
|
|
242
274
|
if (updates.length === 0)
|
|
243
275
|
return [];
|
|
244
276
|
const sessionIds = updates.map(update => update.sessionId);
|
|
245
277
|
const duplicates = duplicateIds(sessionIds);
|
|
246
278
|
if (duplicates.length > 0) {
|
|
247
|
-
throw new
|
|
279
|
+
throw new RemoteLineageBatchError('prewrite_ownership', duplicates, `duplicate remote lineage batch session ids: ${duplicates.join(', ')}`);
|
|
248
280
|
}
|
|
281
|
+
loadForWrite();
|
|
249
282
|
ensureDir();
|
|
250
283
|
const fp = getFilePath();
|
|
251
284
|
let published = false;
|
|
@@ -260,12 +293,12 @@ export function persistActiveRiffLineagesExactBatch(updates, options = {}) {
|
|
|
260
293
|
if (!durable
|
|
261
294
|
|| durable.status !== 'active'
|
|
262
295
|
|| !update.expectedCurrentTaskIds.some(candidate => candidate === durableTaskId)
|
|
263
|
-
|| !
|
|
296
|
+
|| !remoteOwnersEqual(remoteDurableOwner(durable), update.owner)) {
|
|
264
297
|
conflicts.push(update.sessionId);
|
|
265
298
|
}
|
|
266
299
|
}
|
|
267
300
|
if (conflicts.length > 0) {
|
|
268
|
-
throw new
|
|
301
|
+
throw new RemoteLineageBatchError('prewrite_ownership', conflicts, `Remote lineage batch compare-and-set failed for: ${conflicts.join(', ')}`);
|
|
269
302
|
}
|
|
270
303
|
for (const update of updates) {
|
|
271
304
|
const durable = parsed[update.sessionId];
|
|
@@ -283,29 +316,29 @@ export function persistActiveRiffLineagesExactBatch(updates, options = {}) {
|
|
|
283
316
|
renameSync(tmpFp, fp);
|
|
284
317
|
tmpFp = undefined;
|
|
285
318
|
published = true;
|
|
286
|
-
|
|
319
|
+
testOnlyAfterRemoteBatchRename?.();
|
|
287
320
|
}
|
|
288
321
|
let verifiedProjection;
|
|
289
322
|
try {
|
|
290
323
|
verifiedProjection = readSessionsProjectionStrict(fp).parsed;
|
|
291
324
|
}
|
|
292
325
|
catch (error) {
|
|
293
|
-
throw new
|
|
326
|
+
throw new RemoteLineageBatchError(published ? 'postrename_ambiguity' : 'prewrite_io', [...sessionIds], `failed to read back Remote lineage batch: ${String(error)}`);
|
|
294
327
|
}
|
|
295
328
|
const ambiguous = updates.filter((update) => {
|
|
296
329
|
const durable = verifiedProjection[update.sessionId];
|
|
297
330
|
return !durable
|
|
298
331
|
|| durable.status !== 'active'
|
|
299
332
|
|| (durable.riffParentTaskId ?? null) !== update.targetTaskId
|
|
300
|
-
|| !
|
|
333
|
+
|| !remoteOwnersEqual(remoteDurableOwner(durable), update.owner);
|
|
301
334
|
}).map(update => update.sessionId);
|
|
302
335
|
if (ambiguous.length > 0) {
|
|
303
|
-
throw new
|
|
336
|
+
throw new RemoteLineageBatchError(published ? 'postrename_ambiguity' : 'prewrite_ownership', ambiguous, `Remote lineage batch readback mismatch for: ${ambiguous.join(', ')}`);
|
|
304
337
|
}
|
|
305
338
|
const verified = updates.map((update) => ({
|
|
306
339
|
sessionId: update.sessionId,
|
|
307
340
|
taskId: update.targetTaskId,
|
|
308
|
-
owner:
|
|
341
|
+
owner: remoteDurableOwner(verifiedProjection[update.sessionId]),
|
|
309
342
|
}));
|
|
310
343
|
if (loaded) {
|
|
311
344
|
for (const update of updates) {
|
|
@@ -318,9 +351,9 @@ export function persistActiveRiffLineagesExactBatch(updates, options = {}) {
|
|
|
318
351
|
}, { maxWaitMs: options.maxWaitMs });
|
|
319
352
|
}
|
|
320
353
|
catch (error) {
|
|
321
|
-
if (error instanceof
|
|
354
|
+
if (error instanceof RemoteLineageBatchError)
|
|
322
355
|
throw error;
|
|
323
|
-
throw new
|
|
356
|
+
throw new RemoteLineageBatchError(published ? 'postrename_ambiguity' : 'prewrite_io', [...sessionIds], `failed to persist Remote lineage batch: ${String(error)}`);
|
|
324
357
|
}
|
|
325
358
|
finally {
|
|
326
359
|
if (tmpFp) {
|
|
@@ -332,6 +365,8 @@ export function persistActiveRiffLineagesExactBatch(updates, options = {}) {
|
|
|
332
365
|
}
|
|
333
366
|
}
|
|
334
367
|
function save() {
|
|
368
|
+
if (loadFailure)
|
|
369
|
+
throw new SessionStoreUnavailableError(loadFailure);
|
|
335
370
|
ensureDir();
|
|
336
371
|
const fp = getFilePath();
|
|
337
372
|
withFileLockSync(fp, () => {
|
|
@@ -354,7 +389,7 @@ function save() {
|
|
|
354
389
|
});
|
|
355
390
|
}
|
|
356
391
|
export function createSession(chatId, rootMessageId, title, chatType, scope) {
|
|
357
|
-
|
|
392
|
+
loadForWrite();
|
|
358
393
|
const session = {
|
|
359
394
|
sessionId: randomUUID(),
|
|
360
395
|
chatId,
|
|
@@ -457,8 +492,270 @@ export function cleanupSessionBridgeSendMarkers(sessionId) {
|
|
|
457
492
|
}
|
|
458
493
|
cleanupSessionBridgeSendMarkersNow(sessionId);
|
|
459
494
|
}
|
|
495
|
+
export function isValidMojoCloseJournal(value) {
|
|
496
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
497
|
+
return false;
|
|
498
|
+
const journal = value;
|
|
499
|
+
if (journal.phase !== 'preparing'
|
|
500
|
+
&& journal.phase !== 'prepared'
|
|
501
|
+
&& journal.phase !== 'uncertain')
|
|
502
|
+
return false;
|
|
503
|
+
if (typeof journal.requestId !== 'string' || !journal.requestId.trim())
|
|
504
|
+
return false;
|
|
505
|
+
if (typeof journal.updatedAt !== 'string' || !journal.updatedAt.trim())
|
|
506
|
+
return false;
|
|
507
|
+
if (journal.recovery !== undefined
|
|
508
|
+
&& journal.recovery !== 'retryable'
|
|
509
|
+
&& journal.recovery !== 'uncertain'
|
|
510
|
+
&& journal.recovery !== 'irreversible')
|
|
511
|
+
return false;
|
|
512
|
+
if (journal.admission !== undefined
|
|
513
|
+
&& journal.admission !== 'restorable'
|
|
514
|
+
&& journal.admission !== 'fenced')
|
|
515
|
+
return false;
|
|
516
|
+
if (journal.commitOnly !== undefined && typeof journal.commitOnly !== 'boolean')
|
|
517
|
+
return false;
|
|
518
|
+
if (journal.localResidual !== undefined
|
|
519
|
+
&& journal.localResidual !== 'local_subtree_unprovable_on_platform'
|
|
520
|
+
&& journal.localResidual !== 'local_subtree_boundary_unproven')
|
|
521
|
+
return false;
|
|
522
|
+
// A retryable verdict never proves an irreversible teardown, so it must not
|
|
523
|
+
// arrive wearing the marker that suppresses further cancellation.
|
|
524
|
+
if (journal.recovery === 'retryable' && journal.commitOnly === true)
|
|
525
|
+
return false;
|
|
526
|
+
// An irreversible verdict is only ever legal as a commit-only `prepared` row:
|
|
527
|
+
// the remote side is gone, so nothing may cancel or abort it again.
|
|
528
|
+
if (journal.recovery === 'irreversible'
|
|
529
|
+
&& (journal.phase !== 'prepared' || journal.commitOnly !== true))
|
|
530
|
+
return false;
|
|
531
|
+
if (journal.commitOnly === true && journal.phase !== 'prepared')
|
|
532
|
+
return false;
|
|
533
|
+
return journal.taskId === undefined
|
|
534
|
+
|| (typeof journal.taskId === 'string' && !!journal.taskId.trim());
|
|
535
|
+
}
|
|
536
|
+
function mutateMojoCloseJournal(sessionId, mutate) {
|
|
537
|
+
loadForWrite();
|
|
538
|
+
const session = sessions.get(sessionId);
|
|
539
|
+
if (!session || session.status !== 'active') {
|
|
540
|
+
throw new Error(`cannot mutate Mojo close journal for non-active session ${sessionId}`);
|
|
541
|
+
}
|
|
542
|
+
if (session.backendType !== 'mojo') {
|
|
543
|
+
throw new Error(`cannot mutate Mojo close journal for non-Mojo session ${sessionId}`);
|
|
544
|
+
}
|
|
545
|
+
const priorJournal = session.mojoCloseJournal
|
|
546
|
+
? { ...session.mojoCloseJournal }
|
|
547
|
+
: undefined;
|
|
548
|
+
const priorTaskId = session.riffParentTaskId;
|
|
549
|
+
if (session.mojoCloseJournal && !isValidMojoCloseJournal(session.mojoCloseJournal)) {
|
|
550
|
+
throw new Error(`cannot mutate malformed Mojo close journal for ${sessionId}`);
|
|
551
|
+
}
|
|
552
|
+
mutate(session);
|
|
553
|
+
try {
|
|
554
|
+
save();
|
|
555
|
+
}
|
|
556
|
+
catch (error) {
|
|
557
|
+
session.mojoCloseJournal = priorJournal;
|
|
558
|
+
session.riffParentTaskId = priorTaskId;
|
|
559
|
+
throw error;
|
|
560
|
+
}
|
|
561
|
+
return session;
|
|
562
|
+
}
|
|
563
|
+
/** Persist the admission fence before any authoritative Mojo cancel begins. */
|
|
564
|
+
export function beginMojoCloseJournal(sessionId, requestId, expectedTaskId) {
|
|
565
|
+
return mutateMojoCloseJournal(sessionId, (session) => {
|
|
566
|
+
if (session.riffParentTaskId !== expectedTaskId) {
|
|
567
|
+
throw new Error(`Mojo close lineage changed before prepare for ${sessionId}`);
|
|
568
|
+
}
|
|
569
|
+
const existing = session.mojoCloseJournal;
|
|
570
|
+
if (existing) {
|
|
571
|
+
if (existing.commitOnly) {
|
|
572
|
+
// The remote teardown already completed irreversibly; only the local
|
|
573
|
+
// commit may be retried. Starting a second cancel here is exactly the
|
|
574
|
+
// double teardown this journal exists to prevent.
|
|
575
|
+
throw new Error(`cannot re-cancel commit-only Mojo close journal for ${sessionId}`);
|
|
576
|
+
}
|
|
577
|
+
if (existing.phase !== 'preparing' && existing.phase !== 'uncertain') {
|
|
578
|
+
throw new Error(`cannot restart ${existing.phase} Mojo close journal for ${sessionId}`);
|
|
579
|
+
}
|
|
580
|
+
if (existing.taskId !== expectedTaskId) {
|
|
581
|
+
throw new Error(`Mojo close journal lineage changed before retry for ${sessionId}`);
|
|
582
|
+
}
|
|
583
|
+
if (existing.requestId !== requestId) {
|
|
584
|
+
if (existing.phase !== 'uncertain' && existing.recovery !== 'retryable') {
|
|
585
|
+
throw new Error(`another Mojo close journal already owns ${sessionId}`);
|
|
586
|
+
}
|
|
587
|
+
// Two journal shapes accept a fresh attempt under a NEW requestId:
|
|
588
|
+
// * `retryable` — the failed prepare durably recorded that retrying
|
|
589
|
+
// the cancel is legitimate. Refusing every fresh requestId here is
|
|
590
|
+
// what made `retryable` dead-code and the row a permanent brick
|
|
591
|
+
// (P1-1/P1-2).
|
|
592
|
+
// * `uncertain` — an explicit close IS the manual reconciliation the
|
|
593
|
+
// fence demanded. Only a live worker's prepare/commit reaches this
|
|
594
|
+
// takeover (ownerless uncertain rows DRAIN instead — see
|
|
595
|
+
// prepareMojoExplicitClose), and re-running the cancel is the
|
|
596
|
+
// fail-safe direction: the frozen identity pins the tenant, and an
|
|
597
|
+
// already-terminal remote session is classified as gone, not as a
|
|
598
|
+
// second teardown. Without the takeover the live-worker case had no
|
|
599
|
+
// exit at all (P0-new).
|
|
600
|
+
// commitOnly / `prepared` journals were rejected above and stay
|
|
601
|
+
// non-restartable: those record an IRREVERSIBLE teardown. The row is
|
|
602
|
+
// rebuilt from scratch so the stale recovery/admission verdict cannot
|
|
603
|
+
// survive into the new attempt; lineage equality was asserted above, so
|
|
604
|
+
// the retry still addresses the same remote session.
|
|
605
|
+
session.mojoCloseJournal = {
|
|
606
|
+
phase: 'preparing',
|
|
607
|
+
requestId,
|
|
608
|
+
...(expectedTaskId ? { taskId: expectedTaskId } : {}),
|
|
609
|
+
updatedAt: new Date().toISOString(),
|
|
610
|
+
};
|
|
611
|
+
}
|
|
612
|
+
return;
|
|
613
|
+
}
|
|
614
|
+
session.mojoCloseJournal = {
|
|
615
|
+
phase: 'preparing',
|
|
616
|
+
requestId,
|
|
617
|
+
...(expectedTaskId ? { taskId: expectedTaskId } : {}),
|
|
618
|
+
updatedAt: new Date().toISOString(),
|
|
619
|
+
};
|
|
620
|
+
});
|
|
621
|
+
}
|
|
622
|
+
/** Publish irreversible remote-cancel proof before the local close commit. */
|
|
623
|
+
export function markMojoClosePrepared(sessionId, requestId, taskId, localResidual) {
|
|
624
|
+
return mutateMojoCloseJournal(sessionId, (session) => {
|
|
625
|
+
const existing = session.mojoCloseJournal;
|
|
626
|
+
if (existing && existing.requestId !== requestId) {
|
|
627
|
+
throw new Error(`stale Mojo close prepare for ${sessionId}`);
|
|
628
|
+
}
|
|
629
|
+
if (existing?.phase === 'uncertain') {
|
|
630
|
+
throw new Error(`cannot promote uncertain Mojo close journal for ${sessionId}`);
|
|
631
|
+
}
|
|
632
|
+
if (existing?.taskId && taskId && existing.taskId !== taskId) {
|
|
633
|
+
throw new Error(`Mojo close proof changed journal lineage for ${sessionId}`);
|
|
634
|
+
}
|
|
635
|
+
const provenTaskId = taskId ?? existing?.taskId;
|
|
636
|
+
if (provenTaskId && session.riffParentTaskId
|
|
637
|
+
&& session.riffParentTaskId !== provenTaskId) {
|
|
638
|
+
throw new Error(`Mojo close result lineage changed for ${sessionId}`);
|
|
639
|
+
}
|
|
640
|
+
if (provenTaskId)
|
|
641
|
+
session.riffParentTaskId = provenTaskId;
|
|
642
|
+
// The residual is part of the PROOF being published: a replay of this
|
|
643
|
+
// prepared journal (runtime commit retry, or a daemon restart) must publish
|
|
644
|
+
// the same residual close it describes. A repeat prepare without one keeps
|
|
645
|
+
// the recorded residual — the evidence grade of the original close does not
|
|
646
|
+
// improve by being replayed.
|
|
647
|
+
const provenResidual = localResidual ?? existing?.localResidual;
|
|
648
|
+
session.mojoCloseJournal = {
|
|
649
|
+
phase: 'prepared',
|
|
650
|
+
requestId,
|
|
651
|
+
...(provenTaskId ? { taskId: provenTaskId } : {}),
|
|
652
|
+
...(provenResidual ? { localResidual: provenResidual } : {}),
|
|
653
|
+
updatedAt: new Date().toISOString(),
|
|
654
|
+
};
|
|
655
|
+
});
|
|
656
|
+
}
|
|
657
|
+
/**
|
|
658
|
+
* Finish a failed prepare after worker admission restore. If restore was not
|
|
659
|
+
* proven, keep a durable uncertain fence; either way retain a newly discovered
|
|
660
|
+
* pre-init lineage for later reconciliation.
|
|
661
|
+
*/
|
|
662
|
+
export function finishMojoCloseAbort(sessionId, requestId, options) {
|
|
663
|
+
return mutateMojoCloseJournal(sessionId, (session) => {
|
|
664
|
+
const existing = session.mojoCloseJournal;
|
|
665
|
+
if (!existing || existing.requestId !== requestId) {
|
|
666
|
+
throw new Error(`stale Mojo close abort for ${sessionId}`);
|
|
667
|
+
}
|
|
668
|
+
if (existing.commitOnly || existing.recovery === 'irreversible') {
|
|
669
|
+
// Checked BEFORE the generic prepared guard so the refusal names the reason:
|
|
670
|
+
// rolling this back would re-open write admission on a lineage whose remote
|
|
671
|
+
// side is already gone, leaving a session that looks writable and can never
|
|
672
|
+
// continue.
|
|
673
|
+
throw new Error(`cannot abort irreversible Mojo close journal for ${sessionId}`);
|
|
674
|
+
}
|
|
675
|
+
if (existing.phase === 'prepared') {
|
|
676
|
+
throw new Error(`cannot abort prepared Mojo close proof for ${sessionId}`);
|
|
677
|
+
}
|
|
678
|
+
if (existing.taskId && options.taskId && existing.taskId !== options.taskId) {
|
|
679
|
+
throw new Error(`Mojo close abort changed journal lineage for ${sessionId}`);
|
|
680
|
+
}
|
|
681
|
+
const retainedTaskId = options.taskId ?? existing.taskId;
|
|
682
|
+
if (retainedTaskId && session.riffParentTaskId
|
|
683
|
+
&& session.riffParentTaskId !== retainedTaskId) {
|
|
684
|
+
throw new Error(`Mojo close abort lineage changed for ${sessionId}`);
|
|
685
|
+
}
|
|
686
|
+
if (retainedTaskId)
|
|
687
|
+
session.riffParentTaskId = retainedTaskId;
|
|
688
|
+
if (options.admissionRestored) {
|
|
689
|
+
session.mojoCloseJournal = undefined;
|
|
690
|
+
return;
|
|
691
|
+
}
|
|
692
|
+
session.mojoCloseJournal = {
|
|
693
|
+
phase: 'uncertain',
|
|
694
|
+
requestId,
|
|
695
|
+
...(retainedTaskId ? { taskId: retainedTaskId } : {}),
|
|
696
|
+
recovery: 'uncertain',
|
|
697
|
+
admission: 'fenced',
|
|
698
|
+
updatedAt: new Date().toISOString(),
|
|
699
|
+
};
|
|
700
|
+
});
|
|
701
|
+
}
|
|
702
|
+
/**
|
|
703
|
+
* Persist a FAILED prepare that must NOT be rolled back, with its exact verdict.
|
|
704
|
+
*
|
|
705
|
+
* Such a prepare previously left the journal at `preparing` carrying the
|
|
706
|
+
* PRE-prepare task id: a restart could not tell "reconcile me" apart from "only
|
|
707
|
+
* the local commit is left", the lineage the worker actually reported was
|
|
708
|
+
* dropped, and nothing recorded that write admission was never re-opened.
|
|
709
|
+
*
|
|
710
|
+
* `irreversible` is stored as a commit-only `prepared` row on purpose - every
|
|
711
|
+
* existing recovery path (restore, retry, abort) then treats it as
|
|
712
|
+
* un-cancellable and finishes only the local close.
|
|
713
|
+
*/
|
|
714
|
+
export function markMojoCloseUnresolved(sessionId, requestId, options) {
|
|
715
|
+
return mutateMojoCloseJournal(sessionId, (session) => {
|
|
716
|
+
const existing = session.mojoCloseJournal;
|
|
717
|
+
if (existing && existing.requestId !== requestId) {
|
|
718
|
+
throw new Error(`stale Mojo close verdict for ${sessionId}`);
|
|
719
|
+
}
|
|
720
|
+
if (existing?.commitOnly && options.recovery !== 'irreversible') {
|
|
721
|
+
// Never downgrade a recorded irreversible teardown into something a later
|
|
722
|
+
// caller may cancel or abort again.
|
|
723
|
+
throw new Error(`cannot downgrade commit-only Mojo close journal for ${sessionId}`);
|
|
724
|
+
}
|
|
725
|
+
if (existing?.taskId && options.taskId && existing.taskId !== options.taskId) {
|
|
726
|
+
throw new Error(`Mojo close verdict changed journal lineage for ${sessionId}`);
|
|
727
|
+
}
|
|
728
|
+
const exactTaskId = options.taskId ?? existing?.taskId;
|
|
729
|
+
if (exactTaskId && session.riffParentTaskId
|
|
730
|
+
&& session.riffParentTaskId !== exactTaskId) {
|
|
731
|
+
throw new Error(`Mojo close verdict lineage changed for ${sessionId}`);
|
|
732
|
+
}
|
|
733
|
+
// The worker may have learned the lineage only DURING the prepare (the
|
|
734
|
+
// pre-init window), so persist that exact id: a retry or a manual
|
|
735
|
+
// reconciliation must address the real remote session, not the stale guess.
|
|
736
|
+
if (exactTaskId)
|
|
737
|
+
session.riffParentTaskId = exactTaskId;
|
|
738
|
+
const irreversible = options.recovery === 'irreversible';
|
|
739
|
+
// A still-retryable close keeps its `preparing` intent: a retry SHOULD re-run
|
|
740
|
+
// the cancel. Promoting it to `uncertain` would demand manual reconciliation
|
|
741
|
+
// for a failure the retry can clear on its own -- while `admission: 'fenced'`
|
|
742
|
+
// independently keeps writes out.
|
|
743
|
+
const phase = irreversible
|
|
744
|
+
? 'prepared'
|
|
745
|
+
: options.recovery === 'retryable' ? 'preparing' : 'uncertain';
|
|
746
|
+
session.mojoCloseJournal = {
|
|
747
|
+
phase,
|
|
748
|
+
requestId,
|
|
749
|
+
...(exactTaskId ? { taskId: exactTaskId } : {}),
|
|
750
|
+
recovery: options.recovery,
|
|
751
|
+
admission: options.admission,
|
|
752
|
+
...(irreversible ? { commitOnly: true } : {}),
|
|
753
|
+
updatedAt: new Date().toISOString(),
|
|
754
|
+
};
|
|
755
|
+
});
|
|
756
|
+
}
|
|
460
757
|
export function closeSession(sessionId, opts = {}) {
|
|
461
|
-
|
|
758
|
+
loadForWrite();
|
|
462
759
|
const session = sessions.get(sessionId);
|
|
463
760
|
if (session) {
|
|
464
761
|
const priorStatus = session.status;
|
|
@@ -466,10 +763,42 @@ export function closeSession(sessionId, opts = {}) {
|
|
|
466
763
|
const priorRiffParentTaskId = session.riffParentTaskId;
|
|
467
764
|
const priorDashboardAttachments = session.dashboardAttachments;
|
|
468
765
|
const priorQueuedAttachments = session.queuedAttachments;
|
|
766
|
+
const priorPreviewTarget = session.previewTarget;
|
|
767
|
+
const priorQuarantinedLineage = session.mojoQuarantinedLineage;
|
|
768
|
+
const priorQuarantineNoticePending = session.mojoQuarantineNoticePending;
|
|
769
|
+
const priorLocalResidual = session.mojoLocalResidual;
|
|
770
|
+
const priorMojoCloseJournal = session.mojoCloseJournal
|
|
771
|
+
? { ...session.mojoCloseJournal }
|
|
772
|
+
: undefined;
|
|
469
773
|
session.status = 'closed';
|
|
470
774
|
session.closedAt = new Date().toISOString();
|
|
471
775
|
session.dashboardAttachments = undefined;
|
|
472
776
|
session.queuedAttachments = undefined;
|
|
777
|
+
// `previewTarget` is a live loopback (host, port) the session's agent
|
|
778
|
+
// registered with `botmux preview <port>` for its CURRENT worker
|
|
779
|
+
// generation — routing state, not a durable property of the conversation.
|
|
780
|
+
// A closed session owns no port any more, and the OS is free to hand that
|
|
781
|
+
// number to an unrelated local server; the preview proxy dials a target by
|
|
782
|
+
// host/port alone, so a retained value would let a later reader (resume,
|
|
783
|
+
// an offline row copy, a dashboard snapshot) proxy the user into someone
|
|
784
|
+
// else's service. Drop it in the same atomic save as status='closed'.
|
|
785
|
+
// Cleanup only: registration and proxying are untouched, and a resumed
|
|
786
|
+
// session simply re-runs `botmux preview <port>`.
|
|
787
|
+
session.previewTarget = undefined;
|
|
788
|
+
session.mojoCloseJournal = undefined;
|
|
789
|
+
// Survives close on purpose — the containment handle is still in the durable
|
|
790
|
+
// store, so the row must keep reporting the residual until the handle clears.
|
|
791
|
+
if (opts.parkLocalResidual)
|
|
792
|
+
session.mojoLocalResidual = opts.parkLocalResidual;
|
|
793
|
+
if (opts.parkMojoLineage) {
|
|
794
|
+
// Keep both ids when a different one was already parked: each is the only
|
|
795
|
+
// handle left for manual cleanup of its remote session.
|
|
796
|
+
const already = session.mojoQuarantinedLineage;
|
|
797
|
+
session.mojoQuarantinedLineage = already && already !== opts.parkMojoLineage
|
|
798
|
+
? `${already},${opts.parkMojoLineage}`
|
|
799
|
+
: opts.parkMojoLineage;
|
|
800
|
+
session.mojoQuarantineNoticePending = true;
|
|
801
|
+
}
|
|
473
802
|
// Riff cancellation has already completed before this durable transition.
|
|
474
803
|
// Clear its retry handle in the same atomic save as status='closed'.
|
|
475
804
|
if (opts.clearRiffParentTaskId)
|
|
@@ -483,6 +812,14 @@ export function closeSession(sessionId, opts = {}) {
|
|
|
483
812
|
session.riffParentTaskId = priorRiffParentTaskId;
|
|
484
813
|
session.dashboardAttachments = priorDashboardAttachments;
|
|
485
814
|
session.queuedAttachments = priorQueuedAttachments;
|
|
815
|
+
session.previewTarget = priorPreviewTarget;
|
|
816
|
+
// Without these two the row keeps a parked lineage after a FAILED close, so
|
|
817
|
+
// the next turn treats a still-live remote session as quarantined and starts
|
|
818
|
+
// a new one — i.e. the "close failed, retry unchanged" guarantee is broken.
|
|
819
|
+
session.mojoQuarantinedLineage = priorQuarantinedLineage;
|
|
820
|
+
session.mojoQuarantineNoticePending = priorQuarantineNoticePending;
|
|
821
|
+
session.mojoLocalResidual = priorLocalResidual;
|
|
822
|
+
session.mojoCloseJournal = priorMojoCloseJournal;
|
|
486
823
|
throw err;
|
|
487
824
|
}
|
|
488
825
|
if (session.larkAppId && priorDashboardAttachments?.length) {
|
|
@@ -512,9 +849,13 @@ export function closeSession(sessionId, opts = {}) {
|
|
|
512
849
|
* since 2026-07, but older closed rows can still contain prepared input. A
|
|
513
850
|
* generic resume is an explicit new lifecycle and must never revive that
|
|
514
851
|
* abandoned FIFO.
|
|
852
|
+
*
|
|
853
|
+
* `previewTarget` is cleared here for the same reason: closeSession() now drops
|
|
854
|
+
* it, but rows closed by an older build still carry one on disk, and resume
|
|
855
|
+
* starts a new worker generation that has not registered any port.
|
|
515
856
|
*/
|
|
516
857
|
export function reactivateClosedSession(sessionId) {
|
|
517
|
-
|
|
858
|
+
loadForWrite();
|
|
518
859
|
const session = sessions.get(sessionId);
|
|
519
860
|
if (!session)
|
|
520
861
|
return { ok: false, error: 'not_found' };
|
|
@@ -539,6 +880,8 @@ export function reactivateClosedSession(sessionId) {
|
|
|
539
880
|
queuedActivationTail: session.queuedActivationTail,
|
|
540
881
|
queuedActivationTailNextOrder: session.queuedActivationTailNextOrder,
|
|
541
882
|
pendingRepoSetup: session.pendingRepoSetup,
|
|
883
|
+
previewTarget: session.previewTarget,
|
|
884
|
+
mojoCloseJournal: session.mojoCloseJournal,
|
|
542
885
|
};
|
|
543
886
|
session.status = 'active';
|
|
544
887
|
session.closedAt = undefined;
|
|
@@ -558,6 +901,8 @@ export function reactivateClosedSession(sessionId) {
|
|
|
558
901
|
session.queuedActivationTail = undefined;
|
|
559
902
|
session.queuedActivationTailNextOrder = undefined;
|
|
560
903
|
session.pendingRepoSetup = undefined;
|
|
904
|
+
session.previewTarget = undefined;
|
|
905
|
+
session.mojoCloseJournal = undefined;
|
|
561
906
|
try {
|
|
562
907
|
save();
|
|
563
908
|
}
|
|
@@ -568,7 +913,7 @@ export function reactivateClosedSession(sessionId) {
|
|
|
568
913
|
return { ok: true, session };
|
|
569
914
|
}
|
|
570
915
|
export function updateSessionPid(sessionId, pid) {
|
|
571
|
-
|
|
916
|
+
loadForWrite();
|
|
572
917
|
const session = sessions.get(sessionId);
|
|
573
918
|
if (session) {
|
|
574
919
|
session.pid = pid ?? undefined;
|
|
@@ -576,33 +921,33 @@ export function updateSessionPid(sessionId, pid) {
|
|
|
576
921
|
}
|
|
577
922
|
}
|
|
578
923
|
export function updateSession(session) {
|
|
579
|
-
|
|
924
|
+
loadForWrite();
|
|
580
925
|
sessions.set(session.sessionId, session);
|
|
581
926
|
save();
|
|
582
927
|
}
|
|
583
928
|
/**
|
|
584
|
-
* Persist one exact
|
|
929
|
+
* Persist one exact remote follow-up lineage for an active durable owner.
|
|
585
930
|
* The process cache changes only after the atomic file replacement succeeds.
|
|
586
931
|
*/
|
|
587
|
-
export function
|
|
588
|
-
|
|
932
|
+
export function persistActiveRemoteLineageExact(sessionId, taskId, options = {}) {
|
|
933
|
+
loadForWrite();
|
|
589
934
|
ensureDir();
|
|
590
935
|
const fp = getFilePath();
|
|
591
936
|
return withFileLockSync(fp, () => {
|
|
592
937
|
const { raw, parsed } = readExistingSessionsFromDisk(fp);
|
|
593
938
|
const durable = parsed[sessionId];
|
|
594
939
|
if (!durable || durable.status !== 'active') {
|
|
595
|
-
throw new
|
|
940
|
+
throw new RemoteLineageOwnershipError(`cannot persist remote lineage for non-active session ${sessionId}`);
|
|
596
941
|
}
|
|
597
942
|
const durableTaskId = durable.riffParentTaskId ?? null;
|
|
598
943
|
const expected = options.expectedCurrentTaskIds;
|
|
599
944
|
if (expected && !expected.some(candidate => candidate === durableTaskId)) {
|
|
600
|
-
throw new
|
|
945
|
+
throw new RemoteLineageOwnershipError(`Remote lineage compare-and-set failed for ${sessionId} `
|
|
601
946
|
+ `(current=${durableTaskId ?? 'none'}, expected=${expected.map(id => id ?? 'none').join('|')})`);
|
|
602
947
|
}
|
|
603
|
-
if (options.expectedOwner && !
|
|
604
|
-
throw new
|
|
605
|
-
+ `(current=${JSON.stringify(
|
|
948
|
+
if (options.expectedOwner && !remoteOwnersEqual(remoteDurableOwner(durable), options.expectedOwner)) {
|
|
949
|
+
throw new RemoteLineageOwnershipError(`Remote owner compare-and-set failed for ${sessionId} `
|
|
950
|
+
+ `(current=${JSON.stringify(remoteDurableOwner(durable))}, `
|
|
606
951
|
+ `expected=${JSON.stringify(options.expectedOwner)})`);
|
|
607
952
|
}
|
|
608
953
|
const next = {
|
|
@@ -630,6 +975,19 @@ export function listSessions() {
|
|
|
630
975
|
load();
|
|
631
976
|
return [...sessions.values()];
|
|
632
977
|
}
|
|
978
|
+
/**
|
|
979
|
+
* Return the current projection only when its backing file was loaded safely.
|
|
980
|
+
* Use this for decisions that delete, retire, or reconfigure resources: the
|
|
981
|
+
* legacy empty-on-error behaviour of listSessions() is unsafe at those gates.
|
|
982
|
+
* A failed load remains unhealthy until init() explicitly selects/reloads a
|
|
983
|
+
* store, avoiding a silent mid-transaction recovery against a different view.
|
|
984
|
+
*/
|
|
985
|
+
export function listSessionsStrict() {
|
|
986
|
+
load();
|
|
987
|
+
if (loadFailure)
|
|
988
|
+
throw new SessionStoreUnavailableError(loadFailure);
|
|
989
|
+
return [...sessions.values()];
|
|
990
|
+
}
|
|
633
991
|
/**
|
|
634
992
|
* Cross-file lookup: find every active session attached to a thread, across
|
|
635
993
|
* all bots. Used when a not-yet-initialized bot is mentioned in a thread that
|