botmux 3.7.1 → 3.8.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/dist/.runtime-build-id +1 -1
- package/dist/adapters/backend/capabilities.d.ts +17 -0
- package/dist/adapters/backend/capabilities.d.ts.map +1 -0
- package/dist/adapters/backend/capabilities.js +22 -0
- package/dist/adapters/backend/capabilities.js.map +1 -0
- package/dist/adapters/backend/critical-control-key.d.ts +19 -0
- package/dist/adapters/backend/critical-control-key.d.ts.map +1 -0
- package/dist/adapters/backend/critical-control-key.js +34 -0
- package/dist/adapters/backend/critical-control-key.js.map +1 -0
- package/dist/adapters/backend/herdr-backend.d.ts +9 -0
- package/dist/adapters/backend/herdr-backend.d.ts.map +1 -1
- package/dist/adapters/backend/herdr-backend.js +23 -4
- package/dist/adapters/backend/herdr-backend.js.map +1 -1
- package/dist/adapters/backend/riff-backend.d.ts.map +1 -1
- package/dist/adapters/backend/riff-backend.js +3 -2
- package/dist/adapters/backend/riff-backend.js.map +1 -1
- package/dist/adapters/backend/session-backend-selector.d.ts +61 -6
- package/dist/adapters/backend/session-backend-selector.d.ts.map +1 -1
- package/dist/adapters/backend/session-backend-selector.js +173 -9
- package/dist/adapters/backend/session-backend-selector.js.map +1 -1
- package/dist/adapters/backend/tmux-backend.d.ts +10 -3
- package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-backend.js +25 -8
- package/dist/adapters/backend/tmux-backend.js.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.js +3 -2
- package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
- package/dist/adapters/backend/types.d.ts +45 -4
- package/dist/adapters/backend/types.d.ts.map +1 -1
- package/dist/adapters/backend/types.js +11 -0
- package/dist/adapters/backend/types.js.map +1 -1
- package/dist/adapters/backend/zellij-backend.d.ts.map +1 -1
- package/dist/adapters/backend/zellij-backend.js +3 -2
- package/dist/adapters/backend/zellij-backend.js.map +1 -1
- package/dist/adapters/backend/zmx-backend.d.ts +286 -0
- package/dist/adapters/backend/zmx-backend.d.ts.map +1 -0
- package/dist/adapters/backend/zmx-backend.js +2396 -0
- package/dist/adapters/backend/zmx-backend.js.map +1 -0
- package/dist/adapters/cli/claude-code.d.ts.map +1 -1
- package/dist/adapters/cli/claude-code.js +3 -0
- package/dist/adapters/cli/claude-code.js.map +1 -1
- package/dist/adapters/cli/codex-app.d.ts.map +1 -1
- package/dist/adapters/cli/codex-app.js +5 -1
- 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 +26 -1
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/adapters/cli/fs-policy.d.ts +79 -1
- package/dist/adapters/cli/fs-policy.d.ts.map +1 -1
- package/dist/adapters/cli/fs-policy.js +290 -13
- package/dist/adapters/cli/fs-policy.js.map +1 -1
- package/dist/adapters/cli/grok.d.ts.map +1 -1
- package/dist/adapters/cli/grok.js +4 -1
- package/dist/adapters/cli/grok.js.map +1 -1
- package/dist/adapters/cli/oh-my-pi.d.ts.map +1 -1
- package/dist/adapters/cli/oh-my-pi.js +5 -3
- package/dist/adapters/cli/oh-my-pi.js.map +1 -1
- package/dist/adapters/cli/shared-hints.d.ts +7 -4
- package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
- package/dist/adapters/cli/shared-hints.js +52 -35
- package/dist/adapters/cli/shared-hints.js.map +1 -1
- package/dist/adapters/cli/strict-input-handle.d.ts +13 -0
- package/dist/adapters/cli/strict-input-handle.d.ts.map +1 -0
- package/dist/adapters/cli/strict-input-handle.js +39 -0
- package/dist/adapters/cli/strict-input-handle.js.map +1 -0
- package/dist/adapters/cli/traex.d.ts.map +1 -1
- package/dist/adapters/cli/traex.js +6 -4
- package/dist/adapters/cli/traex.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +16 -0
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/bot-registry.d.ts +137 -8
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +298 -12
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli/session-list-liveness.d.ts +1 -1
- package/dist/cli/session-list-liveness.js +1 -1
- package/dist/cli/zmx-managed-attach.d.ts +41 -0
- package/dist/cli/zmx-managed-attach.d.ts.map +1 -0
- package/dist/cli/zmx-managed-attach.js +72 -0
- package/dist/cli/zmx-managed-attach.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +780 -131
- package/dist/cli.js.map +1 -1
- package/dist/codex-app-runner.js +90 -2
- package/dist/codex-app-runner.js.map +1 -1
- package/dist/codex-rpc-engine.d.ts.map +1 -1
- package/dist/codex-rpc-engine.js +22 -6
- package/dist/codex-rpc-engine.js.map +1 -1
- package/dist/config.d.ts +5 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +29 -1
- package/dist/config.js.map +1 -1
- package/dist/core/ask-broker.d.ts +22 -1
- package/dist/core/ask-broker.d.ts.map +1 -1
- package/dist/core/ask-broker.js +12 -5
- package/dist/core/ask-broker.js.map +1 -1
- package/dist/core/botmux-wrapper.d.ts +18 -0
- package/dist/core/botmux-wrapper.d.ts.map +1 -1
- package/dist/core/botmux-wrapper.js +25 -1
- package/dist/core/botmux-wrapper.js.map +1 -1
- package/dist/core/chat-rename.d.ts +27 -0
- package/dist/core/chat-rename.d.ts.map +1 -0
- package/dist/core/chat-rename.js +53 -0
- package/dist/core/chat-rename.js.map +1 -0
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +160 -12
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/cost-calculator.d.ts +25 -1
- package/dist/core/cost-calculator.d.ts.map +1 -1
- package/dist/core/cost-calculator.js +102 -4
- package/dist/core/cost-calculator.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts +16 -2
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +611 -62
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/dashboard-rows.d.ts +22 -1
- package/dist/core/dashboard-rows.d.ts.map +1 -1
- package/dist/core/dashboard-rows.js +61 -0
- package/dist/core/dashboard-rows.js.map +1 -1
- package/dist/core/dashboard-url.d.ts +6 -0
- package/dist/core/dashboard-url.d.ts.map +1 -1
- package/dist/core/dashboard-url.js +11 -1
- package/dist/core/dashboard-url.js.map +1 -1
- package/dist/core/device-isolation-daemon.d.ts +28 -6
- package/dist/core/device-isolation-daemon.d.ts.map +1 -1
- package/dist/core/device-isolation-daemon.js +96 -13
- package/dist/core/device-isolation-daemon.js.map +1 -1
- package/dist/core/host-overload-alert.d.ts +75 -0
- package/dist/core/host-overload-alert.d.ts.map +1 -1
- package/dist/core/host-overload-alert.js +103 -0
- package/dist/core/host-overload-alert.js.map +1 -1
- package/dist/core/idle-worker-sweeper.js +1 -1
- package/dist/core/idle-worker-sweeper.js.map +1 -1
- package/dist/core/inflight-input-tracker.d.ts +3 -0
- package/dist/core/inflight-input-tracker.d.ts.map +1 -1
- package/dist/core/inflight-input-tracker.js +9 -0
- package/dist/core/inflight-input-tracker.js.map +1 -1
- package/dist/core/passthrough-commands.d.ts.map +1 -1
- package/dist/core/passthrough-commands.js +10 -0
- package/dist/core/passthrough-commands.js.map +1 -1
- package/dist/core/persistent-backend.d.ts +32 -4
- package/dist/core/persistent-backend.d.ts.map +1 -1
- package/dist/core/persistent-backend.js +75 -6
- package/dist/core/persistent-backend.js.map +1 -1
- package/dist/core/plugins/mcp/gateway.js +2 -2
- package/dist/core/plugins/mcp/gateway.js.map +1 -1
- package/dist/core/plugins/runtime.d.ts +3 -0
- package/dist/core/plugins/runtime.d.ts.map +1 -1
- package/dist/core/plugins/runtime.js.map +1 -1
- package/dist/core/plugins/service-manager.d.ts +4 -1
- package/dist/core/plugins/service-manager.d.ts.map +1 -1
- package/dist/core/plugins/service-manager.js +11 -6
- package/dist/core/plugins/service-manager.js.map +1 -1
- package/dist/core/role-library.d.ts +48 -1
- package/dist/core/role-library.d.ts.map +1 -1
- package/dist/core/role-library.js +111 -3
- package/dist/core/role-library.js.map +1 -1
- package/dist/core/role-resolver.d.ts +14 -2
- package/dist/core/role-resolver.d.ts.map +1 -1
- package/dist/core/role-resolver.js +47 -4
- package/dist/core/role-resolver.js.map +1 -1
- package/dist/core/session-activity.d.ts +14 -0
- package/dist/core/session-activity.d.ts.map +1 -1
- package/dist/core/session-activity.js +46 -1
- package/dist/core/session-activity.js.map +1 -1
- package/dist/core/session-board.d.ts +5 -2
- package/dist/core/session-board.d.ts.map +1 -1
- package/dist/core/session-board.js +5 -2
- package/dist/core/session-board.js.map +1 -1
- package/dist/core/session-liveness.d.ts +6 -5
- package/dist/core/session-liveness.d.ts.map +1 -1
- package/dist/core/session-liveness.js +34 -13
- package/dist/core/session-liveness.js.map +1 -1
- package/dist/core/session-manager.d.ts +3 -2
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +397 -103
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-marker.d.ts +11 -2
- package/dist/core/session-marker.d.ts.map +1 -1
- package/dist/core/session-marker.js +50 -11
- package/dist/core/session-marker.js.map +1 -1
- package/dist/core/session-message-preview.d.ts +20 -0
- package/dist/core/session-message-preview.d.ts.map +1 -0
- package/dist/core/session-message-preview.js +188 -0
- package/dist/core/session-message-preview.js.map +1 -0
- package/dist/core/session-title.d.ts +5 -1
- package/dist/core/session-title.d.ts.map +1 -1
- package/dist/core/session-title.js +20 -3
- package/dist/core/session-title.js.map +1 -1
- package/dist/core/startup-commands.d.ts +1 -1
- package/dist/core/startup-commands.js +1 -1
- package/dist/core/terminal-url.d.ts.map +1 -1
- package/dist/core/terminal-url.js +3 -2
- package/dist/core/terminal-url.js.map +1 -1
- package/dist/core/trigger-session.d.ts.map +1 -1
- package/dist/core/trigger-session.js +75 -12
- package/dist/core/trigger-session.js.map +1 -1
- package/dist/core/types.d.ts +35 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +23 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-ipc.d.ts +11 -0
- package/dist/core/worker-ipc.d.ts.map +1 -0
- package/dist/core/worker-ipc.js +26 -0
- package/dist/core/worker-ipc.js.map +1 -0
- package/dist/core/worker-pool.d.ts +179 -29
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +2118 -331
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts +132 -3
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +1327 -449
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/auth.d.ts +2 -0
- package/dist/dashboard/auth.d.ts.map +1 -1
- package/dist/dashboard/auth.js +9 -0
- package/dist/dashboard/auth.js.map +1 -1
- package/dist/dashboard/bot-payload.d.ts +4 -0
- package/dist/dashboard/bot-payload.d.ts.map +1 -1
- package/dist/dashboard/bot-payload.js +5 -0
- package/dist/dashboard/bot-payload.js.map +1 -1
- package/dist/dashboard/federation-api.d.ts.map +1 -1
- package/dist/dashboard/federation-api.js +4 -0
- package/dist/dashboard/federation-api.js.map +1 -1
- package/dist/dashboard/federation-spoke-api.d.ts.map +1 -1
- package/dist/dashboard/federation-spoke-api.js +32 -5
- package/dist/dashboard/federation-spoke-api.js.map +1 -1
- package/dist/dashboard/public-redact.d.ts +8 -2
- package/dist/dashboard/public-redact.d.ts.map +1 -1
- package/dist/dashboard/public-redact.js +34 -7
- package/dist/dashboard/public-redact.js.map +1 -1
- package/dist/dashboard/session-card-model.d.ts.map +1 -1
- package/dist/dashboard/session-card-model.js +10 -2
- package/dist/dashboard/session-card-model.js.map +1 -1
- package/dist/dashboard/settings-write-applier.d.ts +35 -1
- package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
- package/dist/dashboard/settings-write-applier.js +88 -1
- package/dist/dashboard/settings-write-applier.js.map +1 -1
- package/dist/dashboard/web/app.d.ts.map +1 -1
- package/dist/dashboard/web/app.js +0 -1
- package/dist/dashboard/web/app.js.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.d.ts +15 -0
- package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.js +212 -58
- package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
- package/dist/dashboard/web/bot-defaults.d.ts +3 -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/bot-onboarding.d.ts +2 -1
- package/dist/dashboard/web/bot-onboarding.d.ts.map +1 -1
- package/dist/dashboard/web/bot-onboarding.js.map +1 -1
- package/dist/dashboard/web/clipboard.d.ts +2 -0
- package/dist/dashboard/web/clipboard.d.ts.map +1 -0
- package/dist/dashboard/web/clipboard.js +42 -0
- package/dist/dashboard/web/clipboard.js.map +1 -0
- package/dist/dashboard/web/connectors-page.d.ts.map +1 -1
- package/dist/dashboard/web/connectors-page.js +12 -8
- package/dist/dashboard/web/connectors-page.js.map +1 -1
- package/dist/dashboard/web/dashboard-components.d.ts +17 -16
- package/dist/dashboard/web/dashboard-components.d.ts.map +1 -1
- package/dist/dashboard/web/dashboard-components.js.map +1 -1
- package/dist/dashboard/web/groups-page.d.ts.map +1 -1
- package/dist/dashboard/web/groups-page.js +7 -3
- 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 +205 -12
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/icon-tooltip.d.ts.map +1 -1
- package/dist/dashboard/web/icon-tooltip.js +16 -1
- package/dist/dashboard/web/icon-tooltip.js.map +1 -1
- package/dist/dashboard/web/listener-filters.d.ts +23 -0
- package/dist/dashboard/web/listener-filters.d.ts.map +1 -0
- package/dist/dashboard/web/listener-filters.js +36 -0
- package/dist/dashboard/web/listener-filters.js.map +1 -0
- package/dist/dashboard/web/overview-page.d.ts.map +1 -1
- package/dist/dashboard/web/overview-page.js.map +1 -1
- package/dist/dashboard/web/plugin-page.d.ts.map +1 -1
- package/dist/dashboard/web/plugin-page.js.map +1 -1
- package/dist/dashboard/web/preview-markdown.d.ts +5 -0
- package/dist/dashboard/web/preview-markdown.d.ts.map +1 -0
- package/dist/dashboard/web/preview-markdown.js +52 -0
- package/dist/dashboard/web/preview-markdown.js.map +1 -0
- package/dist/dashboard/web/roles-page.d.ts.map +1 -1
- package/dist/dashboard/web/roles-page.js +535 -10
- package/dist/dashboard/web/roles-page.js.map +1 -1
- package/dist/dashboard/web/roles.d.ts +77 -0
- package/dist/dashboard/web/roles.d.ts.map +1 -1
- package/dist/dashboard/web/roles.js +98 -0
- package/dist/dashboard/web/roles.js.map +1 -1
- package/dist/dashboard/web/session-terminal.d.ts.map +1 -1
- package/dist/dashboard/web/session-terminal.js +6 -4
- package/dist/dashboard/web/session-terminal.js.map +1 -1
- package/dist/dashboard/web/sessions-kanban.d.ts +4 -1
- package/dist/dashboard/web/sessions-kanban.d.ts.map +1 -1
- package/dist/dashboard/web/sessions-kanban.js +1 -1
- package/dist/dashboard/web/sessions-kanban.js.map +1 -1
- package/dist/dashboard/web/sessions-page.d.ts +3 -2
- package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
- package/dist/dashboard/web/sessions-page.js +163 -28
- package/dist/dashboard/web/sessions-page.js.map +1 -1
- package/dist/dashboard/web/sessions.d.ts +25 -0
- package/dist/dashboard/web/sessions.d.ts.map +1 -1
- package/dist/dashboard/web/sessions.js +58 -7
- package/dist/dashboard/web/sessions.js.map +1 -1
- package/dist/dashboard/web/settings-page.d.ts +28 -3
- package/dist/dashboard/web/settings-page.d.ts.map +1 -1
- package/dist/dashboard/web/settings-page.js +61 -1
- package/dist/dashboard/web/settings-page.js.map +1 -1
- package/dist/dashboard/web/skills-page.d.ts +6 -5
- package/dist/dashboard/web/skills-page.d.ts.map +1 -1
- package/dist/dashboard/web/skills-page.js +2 -0
- package/dist/dashboard/web/skills-page.js.map +1 -1
- package/dist/dashboard/web/v3-components.d.ts +3 -2
- package/dist/dashboard/web/v3-components.d.ts.map +1 -1
- package/dist/dashboard/web/v3-components.js.map +1 -1
- package/dist/dashboard/web/vc-consumer-profiles-section.d.ts +12 -2
- package/dist/dashboard/web/vc-consumer-profiles-section.d.ts.map +1 -1
- package/dist/dashboard/web/vc-consumer-profiles-section.js +0 -9
- package/dist/dashboard/web/vc-consumer-profiles-section.js.map +1 -1
- package/dist/dashboard/web/webhook-logs-page.d.ts +2 -1
- package/dist/dashboard/web/webhook-logs-page.d.ts.map +1 -1
- package/dist/dashboard/web/webhook-logs-page.js +4 -1
- package/dist/dashboard/web/webhook-logs-page.js.map +1 -1
- package/dist/dashboard-web/app.js +1 -1
- package/dist/dashboard-web/chunks/bot-defaults-page-FAPIMQV3.js +10 -0
- package/dist/dashboard-web/chunks/{chunk-QFMH6ITB.js → chunk-5CJMHTT4.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-KQB42ML5.js → chunk-DLZK52JU.js} +14 -12
- package/dist/dashboard-web/chunks/chunk-FDZ7WOBW.js +16 -0
- package/dist/dashboard-web/chunks/{chunk-3QAUJXAS.js → chunk-GTAJV5YC.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-FNPGOZMX.js → chunk-IHNG6KE6.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-FLGXZJTD.js → chunk-VA6QWSGQ.js} +1 -1
- package/dist/dashboard-web/chunks/chunk-XJ7BGPJH.js +1 -0
- package/dist/dashboard-web/chunks/chunk-ZJVTGU5X.js +1 -0
- package/dist/dashboard-web/chunks/connectors-page-LKWRT3GS.js +1 -0
- package/dist/dashboard-web/chunks/groups-page-V6654ICQ.js +8 -0
- package/dist/dashboard-web/chunks/insights-page-237RMFQ5.js +7 -0
- package/dist/dashboard-web/chunks/{monitor-room-7IVIS75W.js → monitor-room-OO5Y4FRQ.js} +1 -1
- package/dist/dashboard-web/chunks/{monitoring-page-5SSJRQZF.js → monitoring-page-OUEITM5P.js} +1 -1
- package/dist/dashboard-web/chunks/{office-page-EOND3L5D.js → office-page-4KNAHQ4Q.js} +1 -1
- package/dist/dashboard-web/chunks/{overview-page-NISBVBBJ.js → overview-page-QDP4YK2S.js} +1 -1
- package/dist/dashboard-web/chunks/{plugin-page-JXC5F5YV.js → plugin-page-VEGTCEAS.js} +1 -1
- package/dist/dashboard-web/chunks/roles-page-PGXNZZNP.js +1 -0
- package/dist/dashboard-web/chunks/{schedules-page-AVOOKLUH.js → schedules-page-BJNC5TID.js} +1 -1
- package/dist/dashboard-web/chunks/sessions-page-M2ZYYCMO.js +6 -0
- package/dist/dashboard-web/chunks/settings-page-IJFZKUUW.js +2 -0
- package/dist/dashboard-web/chunks/{skills-page-5MW54PCC.js → skills-page-YRAIRZOQ.js} +3 -3
- package/dist/dashboard-web/chunks/{team-federation-page-2SNIMVXI.js → team-federation-page-DEU27GRU.js} +1 -1
- package/dist/dashboard-web/chunks/{v3-page-W6SBXXQC.js → v3-page-6KHEW2YL.js} +5 -5
- package/dist/dashboard-web/chunks/{whiteboards-page-STC54KTP.js → whiteboards-page-VDECAALH.js} +1 -1
- package/dist/dashboard-web/style.css +12545 -11432
- package/dist/dashboard.js +215 -36
- package/dist/dashboard.js.map +1 -1
- package/dist/global-config.d.ts +41 -2
- package/dist/global-config.d.ts.map +1 -1
- package/dist/global-config.js +47 -0
- package/dist/global-config.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +71 -19
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +71 -19
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/callback-button-marker.d.ts +34 -0
- package/dist/im/lark/callback-button-marker.d.ts.map +1 -0
- package/dist/im/lark/callback-button-marker.js +99 -0
- package/dist/im/lark/callback-button-marker.js.map +1 -0
- package/dist/im/lark/card-builder.d.ts +46 -10
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +299 -78
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts +3 -4
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +380 -148
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts +24 -1
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +101 -8
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/doc-comment.d.ts.map +1 -1
- package/dist/im/lark/doc-comment.js +6 -1
- package/dist/im/lark/doc-comment.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts +115 -3
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +534 -147
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/grant-command.d.ts +16 -12
- package/dist/im/lark/grant-command.d.ts.map +1 -1
- package/dist/im/lark/grant-command.js +48 -151
- package/dist/im/lark/grant-command.js.map +1 -1
- package/dist/im/lark/grant-pending.d.ts +12 -4
- package/dist/im/lark/grant-pending.d.ts.map +1 -1
- package/dist/im/lark/grant-pending.js +31 -8
- package/dist/im/lark/grant-pending.js.map +1 -1
- package/dist/im/lark/invite-command.d.ts +20 -0
- package/dist/im/lark/invite-command.d.ts.map +1 -0
- package/dist/im/lark/invite-command.js +239 -0
- package/dist/im/lark/invite-command.js.map +1 -0
- package/dist/im/lark/md-card.d.ts +66 -4
- package/dist/im/lark/md-card.d.ts.map +1 -1
- package/dist/im/lark/md-card.js +201 -31
- package/dist/im/lark/md-card.js.map +1 -1
- package/dist/im/lark/mention-targets.d.ts +43 -0
- package/dist/im/lark/mention-targets.d.ts.map +1 -0
- package/dist/im/lark/mention-targets.js +190 -0
- package/dist/im/lark/mention-targets.js.map +1 -0
- package/dist/im/lark/message-parser.d.ts +31 -0
- package/dist/im/lark/message-parser.d.ts.map +1 -1
- package/dist/im/lark/message-parser.js +305 -32
- package/dist/im/lark/message-parser.js.map +1 -1
- package/dist/im/lark/reply-card-footer-signature.d.ts +7 -0
- package/dist/im/lark/reply-card-footer-signature.d.ts.map +1 -0
- package/dist/im/lark/reply-card-footer-signature.js +7 -0
- package/dist/im/lark/reply-card-footer-signature.js.map +1 -0
- package/dist/im/lark/sessions-card.d.ts.map +1 -1
- package/dist/im/lark/sessions-card.js +4 -1
- package/dist/im/lark/sessions-card.js.map +1 -1
- package/dist/im/lark/substitute-command.d.ts.map +1 -1
- package/dist/im/lark/substitute-command.js +8 -0
- package/dist/im/lark/substitute-command.js.map +1 -1
- package/dist/im/lark/topic-root-context.d.ts +35 -0
- package/dist/im/lark/topic-root-context.d.ts.map +1 -0
- package/dist/im/lark/topic-root-context.js +37 -0
- package/dist/im/lark/topic-root-context.js.map +1 -0
- package/dist/im/lark/v3-blocked-card.d.ts.map +1 -1
- package/dist/im/lark/v3-blocked-card.js +2 -1
- package/dist/im/lark/v3-blocked-card.js.map +1 -1
- package/dist/im/lark/v3-gate-card.d.ts.map +1 -1
- package/dist/im/lark/v3-gate-card.js +2 -1
- package/dist/im/lark/v3-gate-card.js.map +1 -1
- package/dist/im/lark/v3-loop-grant-card.d.ts.map +1 -1
- package/dist/im/lark/v3-loop-grant-card.js +2 -1
- package/dist/im/lark/v3-loop-grant-card.js.map +1 -1
- package/dist/im/lark/v3-progress-card.d.ts.map +1 -1
- package/dist/im/lark/v3-progress-card.js +2 -1
- package/dist/im/lark/v3-progress-card.js.map +1 -1
- package/dist/im/lark/v3-revisit-grant-card.d.ts.map +1 -1
- package/dist/im/lark/v3-revisit-grant-card.js +2 -1
- package/dist/im/lark/v3-revisit-grant-card.js.map +1 -1
- package/dist/index-core-only.d.ts +3 -0
- package/dist/index-core-only.d.ts.map +1 -0
- package/dist/index-core-only.js +107 -0
- package/dist/index-core-only.js.map +1 -0
- package/dist/services/async-trigger-state.d.ts +8 -0
- package/dist/services/async-trigger-state.d.ts.map +1 -1
- package/dist/services/async-trigger-state.js +3 -2
- package/dist/services/async-trigger-state.js.map +1 -1
- package/dist/services/async-trigger-store.d.ts +10 -2
- package/dist/services/async-trigger-store.d.ts.map +1 -1
- package/dist/services/async-trigger-store.js +3 -2
- package/dist/services/async-trigger-store.js.map +1 -1
- package/dist/services/backend-availability.d.ts +3 -1
- package/dist/services/backend-availability.d.ts.map +1 -1
- package/dist/services/backend-availability.js +14 -1
- package/dist/services/backend-availability.js.map +1 -1
- package/dist/services/backend-type-store.d.ts.map +1 -1
- package/dist/services/backend-type-store.js +1 -1
- package/dist/services/backend-type-store.js.map +1 -1
- package/dist/services/bot-config-store.d.ts.map +1 -1
- package/dist/services/bot-config-store.js +2 -1
- package/dist/services/bot-config-store.js.map +1 -1
- package/dist/services/bridge-fallback-gate.d.ts +14 -1
- package/dist/services/bridge-fallback-gate.d.ts.map +1 -1
- package/dist/services/bridge-fallback-gate.js +65 -1
- package/dist/services/bridge-fallback-gate.js.map +1 -1
- package/dist/services/card-prefs-store.d.ts +7 -2
- package/dist/services/card-prefs-store.d.ts.map +1 -1
- package/dist/services/card-prefs-store.js +30 -4
- package/dist/services/card-prefs-store.js.map +1 -1
- package/dist/services/codex-app-runner-protocol.d.ts +9 -0
- package/dist/services/codex-app-runner-protocol.d.ts.map +1 -1
- package/dist/services/codex-app-runner-protocol.js +17 -0
- package/dist/services/codex-app-runner-protocol.js.map +1 -1
- package/dist/services/codex-app-token-usage.d.ts +93 -0
- package/dist/services/codex-app-token-usage.d.ts.map +1 -0
- package/dist/services/codex-app-token-usage.js +190 -0
- package/dist/services/codex-app-token-usage.js.map +1 -0
- package/dist/services/codex-transcript.d.ts +6 -1
- package/dist/services/codex-transcript.d.ts.map +1 -1
- package/dist/services/codex-transcript.js +103 -32
- package/dist/services/codex-transcript.js.map +1 -1
- package/dist/services/federation-roster.d.ts +4 -0
- package/dist/services/federation-roster.d.ts.map +1 -1
- package/dist/services/federation-roster.js +3 -0
- package/dist/services/federation-roster.js.map +1 -1
- package/dist/services/federation-store.d.ts +6 -0
- package/dist/services/federation-store.d.ts.map +1 -1
- package/dist/services/federation-store.js.map +1 -1
- package/dist/services/grant-policy.d.ts +13 -0
- package/dist/services/grant-policy.d.ts.map +1 -0
- package/dist/services/grant-policy.js +40 -0
- package/dist/services/grant-policy.js.map +1 -0
- package/dist/services/grant-store.d.ts +24 -3
- package/dist/services/grant-store.d.ts.map +1 -1
- package/dist/services/grant-store.js +196 -12
- package/dist/services/grant-store.js.map +1 -1
- package/dist/services/groups-store.d.ts +36 -0
- package/dist/services/groups-store.d.ts.map +1 -1
- package/dist/services/groups-store.js +123 -1
- package/dist/services/groups-store.js.map +1 -1
- package/dist/services/jsonl-cursor.d.ts.map +1 -1
- package/dist/services/jsonl-cursor.js +8 -2
- package/dist/services/jsonl-cursor.js.map +1 -1
- package/dist/services/local-cli-opener.d.ts.map +1 -1
- package/dist/services/local-cli-opener.js +32 -0
- package/dist/services/local-cli-opener.js.map +1 -1
- package/dist/services/message-listener-run-preview-store.d.ts +43 -0
- package/dist/services/message-listener-run-preview-store.d.ts.map +1 -0
- package/dist/services/message-listener-run-preview-store.js +152 -0
- package/dist/services/message-listener-run-preview-store.js.map +1 -0
- package/dist/services/message-listener-store.d.ts +26 -0
- package/dist/services/message-listener-store.d.ts.map +1 -0
- package/dist/services/message-listener-store.js +138 -0
- package/dist/services/message-listener-store.js.map +1 -0
- package/dist/services/message-listener.d.ts +112 -0
- package/dist/services/message-listener.d.ts.map +1 -0
- package/dist/services/message-listener.js +391 -0
- package/dist/services/message-listener.js.map +1 -0
- package/dist/services/overload-alert-migration.d.ts +15 -0
- package/dist/services/overload-alert-migration.d.ts.map +1 -0
- package/dist/services/overload-alert-migration.js +115 -0
- package/dist/services/overload-alert-migration.js.map +1 -0
- package/dist/services/send-policy.d.ts +38 -0
- package/dist/services/send-policy.d.ts.map +1 -1
- package/dist/services/send-policy.js +34 -0
- package/dist/services/send-policy.js.map +1 -1
- package/dist/services/session-store.d.ts +12 -1
- package/dist/services/session-store.d.ts.map +1 -1
- package/dist/services/session-store.js +44 -2
- package/dist/services/session-store.js.map +1 -1
- package/dist/services/skill-registry-store.d.ts.map +1 -1
- package/dist/services/skill-registry-store.js +87 -12
- package/dist/services/skill-registry-store.js.map +1 -1
- package/dist/services/substitute-mode-normalize.d.ts +3 -0
- package/dist/services/substitute-mode-normalize.d.ts.map +1 -1
- package/dist/services/substitute-mode-normalize.js +8 -0
- package/dist/services/substitute-mode-normalize.js.map +1 -1
- package/dist/services/substitute-mode-store.d.ts.map +1 -1
- package/dist/services/substitute-mode-store.js +8 -1
- package/dist/services/substitute-mode-store.js.map +1 -1
- package/dist/services/transcript-resolver.d.ts +6 -1
- package/dist/services/transcript-resolver.d.ts.map +1 -1
- package/dist/services/transcript-resolver.js +145 -29
- package/dist/services/transcript-resolver.js.map +1 -1
- package/dist/services/trigger-types.d.ts +16 -0
- package/dist/services/trigger-types.d.ts.map +1 -1
- package/dist/services/trigger-types.js +6 -0
- package/dist/services/trigger-types.js.map +1 -1
- package/dist/setup/bot-config-editor.js +2 -2
- package/dist/setup/bot-config-editor.js.map +1 -1
- package/dist/setup/ensure-zmx.d.ts +31 -0
- package/dist/setup/ensure-zmx.d.ts.map +1 -0
- package/dist/setup/ensure-zmx.js +161 -0
- package/dist/setup/ensure-zmx.js.map +1 -0
- package/dist/setup/index.d.ts +1 -1
- package/dist/setup/index.js +1 -1
- package/dist/setup/open-platform-automation.d.ts +9 -0
- package/dist/setup/open-platform-automation.d.ts.map +1 -1
- package/dist/setup/open-platform-automation.js +15 -2
- package/dist/setup/open-platform-automation.js.map +1 -1
- package/dist/setup/setup-args.d.ts +1 -1
- package/dist/setup/setup-args.d.ts.map +1 -1
- package/dist/setup/setup-args.js +1 -1
- package/dist/skills/definitions.d.ts.map +1 -1
- package/dist/skills/definitions.js +32 -0
- package/dist/skills/definitions.js.map +1 -1
- package/dist/skills/injection-mode.d.ts +6 -2
- package/dist/skills/injection-mode.d.ts.map +1 -1
- package/dist/skills/injection-mode.js +10 -5
- package/dist/skills/injection-mode.js.map +1 -1
- package/dist/types.d.ts +79 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/child-env.d.ts +1 -1
- package/dist/utils/child-env.d.ts.map +1 -1
- package/dist/utils/child-env.js +4 -0
- package/dist/utils/child-env.js.map +1 -1
- package/dist/utils/effort-confirm-dialog.d.ts +40 -0
- package/dist/utils/effort-confirm-dialog.d.ts.map +1 -0
- package/dist/utils/effort-confirm-dialog.js +74 -0
- package/dist/utils/effort-confirm-dialog.js.map +1 -0
- package/dist/utils/pending-input-queue.d.ts +56 -0
- package/dist/utils/pending-input-queue.d.ts.map +1 -1
- package/dist/utils/pending-input-queue.js +80 -0
- package/dist/utils/pending-input-queue.js.map +1 -1
- package/dist/utils/render-dimensions.d.ts +8 -0
- package/dist/utils/render-dimensions.d.ts.map +1 -1
- package/dist/utils/render-dimensions.js +10 -0
- package/dist/utils/render-dimensions.js.map +1 -1
- package/dist/utils/stuck-key-guard.d.ts +3 -2
- package/dist/utils/stuck-key-guard.d.ts.map +1 -1
- package/dist/utils/stuck-key-guard.js +3 -3
- package/dist/utils/stuck-key-guard.js.map +1 -1
- package/dist/utils/terminal-renderer.d.ts +6 -0
- package/dist/utils/terminal-renderer.d.ts.map +1 -1
- package/dist/utils/terminal-renderer.js +15 -0
- package/dist/utils/terminal-renderer.js.map +1 -1
- package/dist/utils/tui-input-delivery.d.ts +32 -0
- package/dist/utils/tui-input-delivery.d.ts.map +1 -0
- package/dist/utils/tui-input-delivery.js +53 -0
- package/dist/utils/tui-input-delivery.js.map +1 -0
- package/dist/utils/xml.d.ts +19 -0
- package/dist/utils/xml.d.ts.map +1 -0
- package/dist/utils/xml.js +26 -0
- package/dist/utils/xml.js.map +1 -0
- package/dist/worker.js +1852 -374
- package/dist/worker.js.map +1 -1
- package/dist/workflows/definition.d.ts +8 -8
- package/dist/workflows/events/payloads.d.ts +8 -8
- package/dist/workflows/events/schema.d.ts +160 -160
- package/dist/workflows/v3/session-relay-client.js +1 -1
- package/dist/workflows/v3/session-relay-client.js.map +1 -1
- package/dist/workflows/v3/worker-fence.d.ts.map +1 -1
- package/dist/workflows/v3/worker-fence.js +15 -10
- package/dist/workflows/v3/worker-fence.js.map +1 -1
- package/package.json +1 -1
- package/dist/dashboard-web/chunks/bot-defaults-page-UKA7K4JV.js +0 -10
- package/dist/dashboard-web/chunks/chunk-DFLNXQNT.js +0 -1
- package/dist/dashboard-web/chunks/connectors-page-A77YAB5Y.js +0 -1
- package/dist/dashboard-web/chunks/groups-page-RUZNVXQB.js +0 -8
- package/dist/dashboard-web/chunks/insights-page-RF7U7RTA.js +0 -22
- package/dist/dashboard-web/chunks/roles-page-BUMKD7Y4.js +0 -1
- package/dist/dashboard-web/chunks/sessions-page-6HLSEAB7.js +0 -2
- package/dist/dashboard-web/chunks/settings-page-MJDZHQ4X.js +0 -2
|
@@ -3,7 +3,8 @@ import type { Session, StreamStatus } from '../types.js';
|
|
|
3
3
|
import type { CliId } from '../adapters/cli/types.js';
|
|
4
4
|
import { type Brand } from '../im/lark/lark-hosts.js';
|
|
5
5
|
import { type SessionTokenUsage } from './cost-calculator.js';
|
|
6
|
-
|
|
6
|
+
import { type SessionMessagePreview } from './session-message-preview.js';
|
|
7
|
+
export interface SessionRow extends SessionMessagePreview {
|
|
7
8
|
sessionId: string;
|
|
8
9
|
larkAppId: string;
|
|
9
10
|
botName: string;
|
|
@@ -30,6 +31,13 @@ export interface SessionRow {
|
|
|
30
31
|
* Absent on rows from older daemons → callers keep the locate behavior. */
|
|
31
32
|
scope?: 'thread' | 'chat';
|
|
32
33
|
title?: string;
|
|
34
|
+
titleUpdatedAt?: string;
|
|
35
|
+
/** Informational only; callers must not treat it as authenticated identity. */
|
|
36
|
+
titleSource?: Session['titleSource'];
|
|
37
|
+
/** Backend stamped at spawn time. Exposed so external surfaces can filter zmx/tmux/etc. */
|
|
38
|
+
backendType?: Session['backendType'];
|
|
39
|
+
/** Persisted backing multiplexer host name, not proof the target is currently live. */
|
|
40
|
+
backendSessionName?: string;
|
|
33
41
|
/** 看板视图的手动放置(列 id / 列内排序位置),用户拖拽后持久化在 Session 上。
|
|
34
42
|
* 未设置时前端按运行状态推导默认列。 */
|
|
35
43
|
kanbanColumn?: string;
|
|
@@ -69,6 +77,10 @@ export interface SessionRow {
|
|
|
69
77
|
tokenUsage?: SessionTokenUsage | null;
|
|
70
78
|
/** Worker process PID, active rows only. Used by dashboard resource attribution. */
|
|
71
79
|
workerPid?: number;
|
|
80
|
+
/** Persisted row intentionally kept active but detached from daemon routing
|
|
81
|
+
* because exact backing teardown could not be proven. It is rendered as
|
|
82
|
+
* dormant (never closed) and remains explicitly closeable for a retry. */
|
|
83
|
+
quarantined?: boolean;
|
|
72
84
|
/** Adopted external CLI PID, active rows only when the source backend exposed it. */
|
|
73
85
|
adoptCliPid?: number;
|
|
74
86
|
/** Riff AIO Sandbox web terminal link. When set, the dashboard "Web终端"
|
|
@@ -89,4 +101,13 @@ export declare function getBotName(): string;
|
|
|
89
101
|
export declare function sessionLastActivityAtMs(s: Session): number;
|
|
90
102
|
export declare function composeRowFromActive(ds: DaemonSession): SessionRow;
|
|
91
103
|
export declare function composeRowFromClosed(s: Session): SessionRow;
|
|
104
|
+
/**
|
|
105
|
+
* Project a persisted active row that currently has no DaemonSession runtime.
|
|
106
|
+
*
|
|
107
|
+
* This is deliberately not composeRowFromClosed(): `status='active'` remains
|
|
108
|
+
* the ownership truth when a persistent-backend kill was inconclusive. The
|
|
109
|
+
* dashboard presents it as dormant, with no terminal port, so operators can
|
|
110
|
+
* see and explicitly retry closing it without an unsafe resume affordance.
|
|
111
|
+
*/
|
|
112
|
+
export declare function composeRowFromPersistedActive(s: Session): SessionRow;
|
|
92
113
|
//# sourceMappingURL=dashboard-rows.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-rows.d.ts","sourceRoot":"","sources":["../../src/core/dashboard-rows.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAGtD,OAAO,EAAE,KAAK,KAAK,EAAe,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAwB,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"dashboard-rows.d.ts","sourceRoot":"","sources":["../../src/core/dashboard-rows.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAGtD,OAAO,EAAE,KAAK,KAAK,EAAe,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAwB,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEpF,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,8BAA8B,CAAC;AAGtC,MAAM,WAAW,UAAW,SAAQ,qBAAqB;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IACzB,MAAM,EAAE,YAAY,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC5C,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;iFAG6E;IAC7E,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;gFAG4E;IAC5E,KAAK,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACrC,2FAA2F;IAC3F,WAAW,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACrC,uFAAuF;IACvF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;4BACwB;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iEAAiE;IACjE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;;;8EAG0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB;mDAC+C;IAC/C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;6CACyC;IACzC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;mDAC+C;IAC/C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;wEAIoE;IACpE,cAAc,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9D,6EAA6E;IAC7E,UAAU,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACtC,oFAAoF;IACpF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;+EAE2E;IAC3E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,qFAAqF;IACrF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;gFAC4E;IAC5E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;8DAE0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,KAAgB,GAAG,MAAM,CAE9E;AAGD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAA0B;AACxE,wBAAgB,UAAU,IAAI,MAAM,CAA0B;AAY9D,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAE1D;AAoCD,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,aAAa,GAAG,UAAU,CAuDlE;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,OAAO,GAAG,UAAU,CAgC3D;AAED;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAAC,CAAC,EAAE,OAAO,GAAG,UAAU,CAkCpE"}
|
|
@@ -3,6 +3,8 @@ import { getBotBrand } from '../bot-registry.js';
|
|
|
3
3
|
import { chatAppLink } from '../im/lark/lark-hosts.js';
|
|
4
4
|
import { getSessionTokenUsage } from './cost-calculator.js';
|
|
5
5
|
import { getIdentity } from '../im/lark/identity-cache.js';
|
|
6
|
+
import { buildSessionMessagePreview, } from './session-message-preview.js';
|
|
7
|
+
import { isSuspendableBackendType, resolvePersistentBackendTarget } from './persistent-backend.js';
|
|
6
8
|
export function feishuChatLink(chatId, brand = 'feishu') {
|
|
7
9
|
return chatAppLink(chatId, brand);
|
|
8
10
|
}
|
|
@@ -48,6 +50,12 @@ function directChatDisplayName(s, larkAppId) {
|
|
|
48
50
|
}
|
|
49
51
|
return undefined;
|
|
50
52
|
}
|
|
53
|
+
function backendSessionNameForRow(s) {
|
|
54
|
+
const backendType = s.backendType;
|
|
55
|
+
if (s.adoptedFrom || !isSuspendableBackendType(backendType))
|
|
56
|
+
return undefined;
|
|
57
|
+
return resolvePersistentBackendTarget(backendType, s.sessionId, s.persistentBackendTarget).sessionName;
|
|
58
|
+
}
|
|
51
59
|
export function composeRowFromActive(ds) {
|
|
52
60
|
return {
|
|
53
61
|
sessionId: ds.session.sessionId,
|
|
@@ -73,6 +81,10 @@ export function composeRowFromActive(ds) {
|
|
|
73
81
|
lastInputFromBot: ds.session.quoteTargetSenderIsBot === true,
|
|
74
82
|
scope: ds.session.scope,
|
|
75
83
|
title: ds.session.title,
|
|
84
|
+
titleUpdatedAt: ds.session.titleUpdatedAt,
|
|
85
|
+
titleSource: ds.session.titleSource,
|
|
86
|
+
backendType: ds.session.backendType,
|
|
87
|
+
backendSessionName: backendSessionNameForRow(ds.session),
|
|
76
88
|
kanbanColumn: ds.session.kanbanColumn,
|
|
77
89
|
kanbanPosition: ds.session.kanbanPosition,
|
|
78
90
|
locked: !!ds.session.locked,
|
|
@@ -97,6 +109,7 @@ export function composeRowFromActive(ds) {
|
|
|
97
109
|
tokenUsage: sessionTokenUsage(ds.session, ds.workingDir),
|
|
98
110
|
...(ds.worker?.pid !== undefined ? { workerPid: ds.worker.pid } : {}),
|
|
99
111
|
...(ds.adoptedFrom?.originalCliPid !== undefined ? { adoptCliPid: ds.adoptedFrom.originalCliPid } : {}),
|
|
112
|
+
...buildSessionMessagePreview(ds.session),
|
|
100
113
|
};
|
|
101
114
|
}
|
|
102
115
|
export function composeRowFromClosed(s) {
|
|
@@ -118,6 +131,10 @@ export function composeRowFromClosed(s) {
|
|
|
118
131
|
lastInputFromBot: s.quoteTargetSenderIsBot === true,
|
|
119
132
|
scope: s.scope,
|
|
120
133
|
title: s.title,
|
|
134
|
+
titleUpdatedAt: s.titleUpdatedAt,
|
|
135
|
+
titleSource: s.titleSource,
|
|
136
|
+
backendType: s.backendType,
|
|
137
|
+
backendSessionName: backendSessionNameForRow(s),
|
|
121
138
|
kanbanColumn: s.kanbanColumn,
|
|
122
139
|
kanbanPosition: s.kanbanPosition,
|
|
123
140
|
locked: !!s.locked,
|
|
@@ -125,6 +142,50 @@ export function composeRowFromClosed(s) {
|
|
|
125
142
|
webPort: s.webPort ?? null,
|
|
126
143
|
feishuChatLink: feishuChatLink(s.chatId, getBotBrand(s.larkAppId ?? '')),
|
|
127
144
|
tokenUsage: sessionTokenUsage(s),
|
|
145
|
+
...buildSessionMessagePreview(s),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Project a persisted active row that currently has no DaemonSession runtime.
|
|
150
|
+
*
|
|
151
|
+
* This is deliberately not composeRowFromClosed(): `status='active'` remains
|
|
152
|
+
* the ownership truth when a persistent-backend kill was inconclusive. The
|
|
153
|
+
* dashboard presents it as dormant, with no terminal port, so operators can
|
|
154
|
+
* see and explicitly retry closing it without an unsafe resume affordance.
|
|
155
|
+
*/
|
|
156
|
+
export function composeRowFromPersistedActive(s) {
|
|
157
|
+
return {
|
|
158
|
+
sessionId: s.sessionId,
|
|
159
|
+
larkAppId: s.larkAppId ?? '',
|
|
160
|
+
botName: cachedBotName,
|
|
161
|
+
cliId: s.cliId ?? 'unknown',
|
|
162
|
+
status: s.queued ? 'idle' : 'dormant',
|
|
163
|
+
adopt: !!s.adoptedFrom,
|
|
164
|
+
spawnedAt: sessionCreatedAtMs(s),
|
|
165
|
+
lastMessageAt: sessionLastActivityAtMs(s),
|
|
166
|
+
workingDir: s.workingDir,
|
|
167
|
+
chatId: s.chatId,
|
|
168
|
+
chatType: s.chatType,
|
|
169
|
+
chatDisplayName: directChatDisplayName(s, s.larkAppId),
|
|
170
|
+
rootMessageId: s.rootMessageId,
|
|
171
|
+
lastInputFromBot: s.quoteTargetSenderIsBot === true,
|
|
172
|
+
scope: s.scope,
|
|
173
|
+
title: s.title,
|
|
174
|
+
titleUpdatedAt: s.titleUpdatedAt,
|
|
175
|
+
titleSource: s.titleSource,
|
|
176
|
+
backendType: s.backendType,
|
|
177
|
+
backendSessionName: backendSessionNameForRow(s),
|
|
178
|
+
kanbanColumn: s.kanbanColumn,
|
|
179
|
+
kanbanPosition: s.kanbanPosition,
|
|
180
|
+
locked: !!s.locked,
|
|
181
|
+
ownerOpenId: s.ownerOpenId,
|
|
182
|
+
webPort: null,
|
|
183
|
+
feishuChatLink: feishuChatLink(s.chatId, getBotBrand(s.larkAppId ?? '')),
|
|
184
|
+
queued: !!s.queued,
|
|
185
|
+
hasHistory: !!(s.cliId || s.lastCliInput || s.backendType || s.adoptedFrom),
|
|
186
|
+
quarantined: !!s.restoreQuarantinedAt,
|
|
187
|
+
tokenUsage: sessionTokenUsage(s),
|
|
188
|
+
...buildSessionMessagePreview(s),
|
|
128
189
|
};
|
|
129
190
|
}
|
|
130
191
|
//# sourceMappingURL=dashboard-rows.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-rows.js","sourceRoot":"","sources":["../../src/core/dashboard-rows.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAc,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAA0B,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"dashboard-rows.js","sourceRoot":"","sources":["../../src/core/dashboard-rows.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,12 @@ export interface DashboardUrls {
|
|
|
12
12
|
*/
|
|
13
13
|
localUrl?: string;
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Format a host for use inside a URL. An IPv6 literal (contains ':', e.g. `::1`)
|
|
17
|
+
* must be wrapped in brackets or `http://::1:7891/` is an invalid URL. IPv4,
|
|
18
|
+
* hostnames, and already-bracketed literals pass through unchanged.
|
|
19
|
+
*/
|
|
20
|
+
export declare function formatUrlHost(host: string): string;
|
|
15
21
|
/**
|
|
16
22
|
* Builds the dashboard URL(s) for a token.
|
|
17
23
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-url.d.ts","sourceRoot":"","sources":["../../src/core/dashboard-url.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,aAAa,CAW/G;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAEvG"}
|
|
1
|
+
{"version":3,"file":"dashboard-url.d.ts","sourceRoot":"","sources":["../../src/core/dashboard-url.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,aAAa,CAW/G;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAEvG"}
|
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
import { platformMachineBaseUrl, publicReverseProxyBaseUrl } from '../platform/binding.js';
|
|
2
2
|
import { isRemoteAccessEnabled } from '../global-config.js';
|
|
3
|
+
/**
|
|
4
|
+
* Format a host for use inside a URL. An IPv6 literal (contains ':', e.g. `::1`)
|
|
5
|
+
* must be wrapped in brackets or `http://::1:7891/` is an invalid URL. IPv4,
|
|
6
|
+
* hostnames, and already-bracketed literals pass through unchanged.
|
|
7
|
+
*/
|
|
8
|
+
export function formatUrlHost(host) {
|
|
9
|
+
if (host.includes(':') && !host.startsWith('['))
|
|
10
|
+
return `[${host}]`;
|
|
11
|
+
return host;
|
|
12
|
+
}
|
|
3
13
|
/**
|
|
4
14
|
* Builds the dashboard URL(s) for a token.
|
|
5
15
|
*
|
|
@@ -21,7 +31,7 @@ import { isRemoteAccessEnabled } from '../global-config.js';
|
|
|
21
31
|
* dashboard link being the one place that always stays local.
|
|
22
32
|
*/
|
|
23
33
|
export function buildDashboardUrls(opts) {
|
|
24
|
-
const localOrigin = `http://${opts.host}:${opts.port}`;
|
|
34
|
+
const localOrigin = `http://${formatUrlHost(String(opts.host))}:${opts.port}`;
|
|
25
35
|
// 对外基址:中心平台优先(远程访问开 + 已绑定),否则自建反代基址 BOTMUX_PUBLIC_URL。
|
|
26
36
|
const platformBase = isRemoteAccessEnabled() ? platformMachineBaseUrl() : null;
|
|
27
37
|
const remoteBase = platformBase ?? publicReverseProxyBaseUrl();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-url.js","sourceRoot":"","sources":["../../src/core/dashboard-url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAC3F,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAiB5D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAA6D;IAC9F,MAAM,WAAW,GAAG,UAAU,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"dashboard-url.js","sourceRoot":"","sources":["../../src/core/dashboard-url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAC3F,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAiB5D;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,IAAI,GAAG,CAAC;IACpE,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAA6D;IAC9F,MAAM,WAAW,GAAG,UAAU,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IAC9E,uDAAuD;IACvD,MAAM,YAAY,GAAG,qBAAqB,EAAE,CAAC,CAAC,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/E,MAAM,UAAU,GAAG,YAAY,IAAI,yBAAyB,EAAE,CAAC;IAC/D,MAAM,aAAa,GAAG,UAAU,IAAI,WAAW,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IACtD,OAAO;QACL,GAAG,EAAE,GAAG,aAAa,GAAG,MAAM,EAAE;QAChC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,WAAW,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS;KAC7D,CAAC;AACJ,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,iBAAiB,CAAC,IAA6D;IAC7F,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;AACtC,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type { BackendType, SessionProbe } from '../adapters/backend/types.js';
|
|
1
|
+
import type { BackendType, PersistentBackendTarget, SessionProbe } from '../adapters/backend/types.js';
|
|
2
|
+
import type { Session } from '../types.js';
|
|
2
3
|
import type { DaemonSession } from './types.js';
|
|
3
4
|
export declare const DEVICE_ISOLATION_PREPARE_PATH = "/api/device-isolation/activation/prepare";
|
|
4
5
|
export declare const DEVICE_ISOLATION_COMMIT_PATH = "/api/device-isolation/activation/commit";
|
|
5
6
|
export declare const DEVICE_ISOLATION_RELEASE_PATH = "/api/device-isolation/activation/release";
|
|
6
|
-
type LocalPersistentBackend = 'tmux' | 'herdr' | 'zellij';
|
|
7
7
|
type InventoryBackend = BackendType | 'unknown';
|
|
8
8
|
type ProcessIdentity = {
|
|
9
9
|
pid: number;
|
|
@@ -15,6 +15,13 @@ export interface DeviceIsolationRuntimeSession {
|
|
|
15
15
|
adopted: boolean;
|
|
16
16
|
/** Backend stamped by daemon-owned state, if this session predates no stamp. */
|
|
17
17
|
frozenBackend?: BackendType;
|
|
18
|
+
/** Exact worker-selected persistent resource. Shared Herdr carries both the
|
|
19
|
+
* host session and the one Botmux-owned agent inside it. */
|
|
20
|
+
persistentBackendTarget?: PersistentBackendTarget;
|
|
21
|
+
/** PID carried only by an unregistered persisted row. It has no process-start
|
|
22
|
+
* identity or worker-generation attestation, so a still-live/reused PID must
|
|
23
|
+
* block activation instead of being mistaken for a quiescent PTY session. */
|
|
24
|
+
unregisteredPid?: number;
|
|
18
25
|
workerPresent: boolean;
|
|
19
26
|
workerGeneration?: number;
|
|
20
27
|
worker?: ProcessIdentity;
|
|
@@ -36,8 +43,7 @@ export interface DeviceIsolationInventoryEntry {
|
|
|
36
43
|
cli?: ProcessIdentity;
|
|
37
44
|
workerGeneration?: number;
|
|
38
45
|
persistent?: {
|
|
39
|
-
|
|
40
|
-
name: string;
|
|
46
|
+
target: PersistentBackendTarget;
|
|
41
47
|
probe: SessionProbe;
|
|
42
48
|
};
|
|
43
49
|
blocker?: DeviceIsolationBlocker;
|
|
@@ -60,8 +66,10 @@ export interface DeviceIsolationDaemonDependencies {
|
|
|
60
66
|
processStart: (pid: number) => string | undefined;
|
|
61
67
|
processExists: (pid: number) => boolean;
|
|
62
68
|
signalProcess: (pid: number, signal: NodeJS.Signals) => void;
|
|
63
|
-
probePersistent: (
|
|
64
|
-
|
|
69
|
+
probePersistent: (target: PersistentBackendTarget) => SessionProbe;
|
|
70
|
+
/** Full sessionId is mandatory so prefix-addressed backends such as ZMX can
|
|
71
|
+
* re-verify ownership before destructive teardown. */
|
|
72
|
+
killPersistent: (target: PersistentBackendTarget, sessionId: string) => void;
|
|
65
73
|
closeWorker: (session: DeviceIsolationRuntimeSession) => void;
|
|
66
74
|
readMarker: () => string | null;
|
|
67
75
|
sleep: (ms: number) => Promise<void>;
|
|
@@ -71,6 +79,20 @@ export type DeviceIsolationDaemonResult = {
|
|
|
71
79
|
status: 200 | 409 | 423 | 503;
|
|
72
80
|
body: Record<string, unknown>;
|
|
73
81
|
};
|
|
82
|
+
/**
|
|
83
|
+
* Add durable, persisted local-resource rows that startup restore intentionally
|
|
84
|
+
* kept active but could not safely register. Device isolation must see those
|
|
85
|
+
* ownership records even when the routing registry cannot: otherwise an
|
|
86
|
+
* inconclusive teardown could disappear from the activation inventory.
|
|
87
|
+
*
|
|
88
|
+
* Runtime state wins by complete session id because it carries the current
|
|
89
|
+
* worker generation and attestation. Queued rows and command scratches have no
|
|
90
|
+
* running local resource. Legacy rows with a CLI/PID/target marker are still
|
|
91
|
+
* evidence of a possibly-live local resource even when backendType was never
|
|
92
|
+
* stamped; include them as `unknown_backend` blockers instead of silently
|
|
93
|
+
* excluding them from a credential-isolation transaction.
|
|
94
|
+
*/
|
|
95
|
+
export declare function mergePersistedDeviceIsolationSessions(runtimeSessions: readonly DeviceIsolationRuntimeSession[], persistedSessions: readonly Session[]): DeviceIsolationRuntimeSession[];
|
|
74
96
|
export declare function buildDeviceIsolationInventory(): DeviceIsolationInventory;
|
|
75
97
|
export declare function setDeviceIsolationDaemonIdentity(identity: DeviceIsolationDaemonIdentity | null): void;
|
|
76
98
|
export declare function prepareDeviceIsolationActivation(body: unknown): DeviceIsolationDaemonResult;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device-isolation-daemon.d.ts","sourceRoot":"","sources":["../../src/core/device-isolation-daemon.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"device-isolation-daemon.d.ts","sourceRoot":"","sources":["../../src/core/device-isolation-daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,9 +11,10 @@ import { homedir } from 'node:os';
|
|
|
11
11
|
import { deviceCredentialIsolationMarkerPath } from '../adapters/cli/read-isolation.js';
|
|
12
12
|
import { config } from '../config.js';
|
|
13
13
|
import { readSecureHostFileSync } from '../platform/secure-host-file.js';
|
|
14
|
+
import * as sessionStore from '../services/session-store.js';
|
|
14
15
|
import { logger } from '../utils/logger.js';
|
|
15
16
|
import { acquireDeviceIsolationFreeze, bindDeviceIsolationFreezeInventoryGeneration, DEVICE_ISOLATION_ACTIVATION_VERSION, releaseDeviceIsolationFreeze, requireDeviceIsolationFreeze, } from './device-isolation-activation.js';
|
|
16
|
-
import {
|
|
17
|
+
import { killPersistentBackendTarget, probePersistentBackendTarget, resolvePersistentBackendTarget, } from './persistent-backend.js';
|
|
17
18
|
import { readProcessStartIdentity } from './session-marker.js';
|
|
18
19
|
import { killWorker, listActiveSessions } from './worker-pool.js';
|
|
19
20
|
export const DEVICE_ISOLATION_PREPARE_PATH = '/api/device-isolation/activation/prepare';
|
|
@@ -22,7 +23,7 @@ export const DEVICE_ISOLATION_RELEASE_PATH = '/api/device-isolation/activation/r
|
|
|
22
23
|
let daemonIdentity = null;
|
|
23
24
|
let transaction = null;
|
|
24
25
|
function isPersistentBackend(value) {
|
|
25
|
-
return value === 'tmux' || value === 'herdr' || value === 'zellij';
|
|
26
|
+
return value === 'tmux' || value === 'herdr' || value === 'zellij' || value === 'zmx';
|
|
26
27
|
}
|
|
27
28
|
function isLocalBackend(value) {
|
|
28
29
|
return value === 'pty' || isPersistentBackend(value);
|
|
@@ -36,8 +37,54 @@ function safeProcessExists(pid) {
|
|
|
36
37
|
return error.code !== 'ESRCH';
|
|
37
38
|
}
|
|
38
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* Add durable, persisted local-resource rows that startup restore intentionally
|
|
42
|
+
* kept active but could not safely register. Device isolation must see those
|
|
43
|
+
* ownership records even when the routing registry cannot: otherwise an
|
|
44
|
+
* inconclusive teardown could disappear from the activation inventory.
|
|
45
|
+
*
|
|
46
|
+
* Runtime state wins by complete session id because it carries the current
|
|
47
|
+
* worker generation and attestation. Queued rows and command scratches have no
|
|
48
|
+
* running local resource. Legacy rows with a CLI/PID/target marker are still
|
|
49
|
+
* evidence of a possibly-live local resource even when backendType was never
|
|
50
|
+
* stamped; include them as `unknown_backend` blockers instead of silently
|
|
51
|
+
* excluding them from a credential-isolation transaction.
|
|
52
|
+
*/
|
|
53
|
+
export function mergePersistedDeviceIsolationSessions(runtimeSessions, persistedSessions) {
|
|
54
|
+
const merged = [...runtimeSessions];
|
|
55
|
+
const runtimeIds = new Set(runtimeSessions.map(session => session.sessionId));
|
|
56
|
+
for (const session of persistedSessions) {
|
|
57
|
+
if (runtimeIds.has(session.sessionId)
|
|
58
|
+
|| session.status !== 'active'
|
|
59
|
+
|| session.queued)
|
|
60
|
+
continue;
|
|
61
|
+
const adopted = !!session.adoptedFrom;
|
|
62
|
+
const frozenBackend = session.backendType ?? session.persistentBackendTarget?.backendType;
|
|
63
|
+
const hasDurableLocalEvidence = adopted
|
|
64
|
+
|| !!session.persistentBackendTarget
|
|
65
|
+
|| isPersistentBackend(frozenBackend ?? 'unknown')
|
|
66
|
+
|| (typeof session.pid === 'number' && session.pid > 0)
|
|
67
|
+
|| !!session.cliSessionId;
|
|
68
|
+
if (!hasDurableLocalEvidence)
|
|
69
|
+
continue;
|
|
70
|
+
merged.push({
|
|
71
|
+
sessionId: session.sessionId,
|
|
72
|
+
adopted,
|
|
73
|
+
...(frozenBackend ? { frozenBackend } : {}),
|
|
74
|
+
...(session.persistentBackendTarget
|
|
75
|
+
? { persistentBackendTarget: session.persistentBackendTarget }
|
|
76
|
+
: {}),
|
|
77
|
+
...(typeof session.pid === 'number' && session.pid > 0
|
|
78
|
+
? { unregisteredPid: session.pid }
|
|
79
|
+
: {}),
|
|
80
|
+
workerPresent: false,
|
|
81
|
+
});
|
|
82
|
+
runtimeIds.add(session.sessionId);
|
|
83
|
+
}
|
|
84
|
+
return merged;
|
|
85
|
+
}
|
|
39
86
|
function defaultRuntimeSessions() {
|
|
40
|
-
|
|
87
|
+
const runtime = listActiveSessions().map((ds) => {
|
|
41
88
|
const workerPresent = !!ds.worker && !ds.worker.killed;
|
|
42
89
|
const workerPid = workerPresent ? ds.worker?.pid : undefined;
|
|
43
90
|
const workerStart = workerPid ? readProcessStartIdentity(workerPid) : undefined;
|
|
@@ -45,10 +92,12 @@ function defaultRuntimeSessions() {
|
|
|
45
92
|
const cli = attestation?.cliPid && attestation.cliProcStart
|
|
46
93
|
? { pid: attestation.cliPid, procStart: attestation.cliProcStart }
|
|
47
94
|
: undefined;
|
|
95
|
+
const persistentBackendTarget = ds.session.persistentBackendTarget ?? ds.initConfig?.persistentBackendTarget;
|
|
48
96
|
return {
|
|
49
97
|
sessionId: ds.session.sessionId,
|
|
50
98
|
adopted: !!(ds.adoptedFrom || ds.initConfig?.adoptMode || ds.session.adoptedFrom),
|
|
51
99
|
frozenBackend: ds.initConfig?.backendType ?? ds.session.backendType,
|
|
100
|
+
...(persistentBackendTarget ? { persistentBackendTarget } : {}),
|
|
52
101
|
workerPresent,
|
|
53
102
|
...(ds.workerGeneration !== undefined ? { workerGeneration: ds.workerGeneration } : {}),
|
|
54
103
|
...(workerPid && workerStart ? { worker: { pid: workerPid, procStart: workerStart } } : {}),
|
|
@@ -65,6 +114,9 @@ function defaultRuntimeSessions() {
|
|
|
65
114
|
source: ds,
|
|
66
115
|
};
|
|
67
116
|
});
|
|
117
|
+
// sessionStore is initialized for this daemon's own bot partition. Do not
|
|
118
|
+
// scan sibling files: every daemon proves only the local resources it owns.
|
|
119
|
+
return mergePersistedDeviceIsolationSessions(runtime, sessionStore.listSessions());
|
|
68
120
|
}
|
|
69
121
|
const defaultDependencies = {
|
|
70
122
|
now: () => Date.now(),
|
|
@@ -72,8 +124,8 @@ const defaultDependencies = {
|
|
|
72
124
|
processStart: readProcessStartIdentity,
|
|
73
125
|
processExists: safeProcessExists,
|
|
74
126
|
signalProcess: (pid, signal) => { process.kill(pid, signal); },
|
|
75
|
-
probePersistent:
|
|
76
|
-
killPersistent:
|
|
127
|
+
probePersistent: probePersistentBackendTarget,
|
|
128
|
+
killPersistent: killPersistentBackendTarget,
|
|
77
129
|
closeWorker: (session) => {
|
|
78
130
|
if (!session.source)
|
|
79
131
|
throw new Error('missing daemon session handle');
|
|
@@ -111,6 +163,19 @@ function classifySession(session) {
|
|
|
111
163
|
&& session.frozenBackend !== session.attestation.backendType) {
|
|
112
164
|
return blockerEntry(session, backendType, 'backend_inconsistent');
|
|
113
165
|
}
|
|
166
|
+
if (session.unregisteredPid !== undefined) {
|
|
167
|
+
let processMayStillExist = true;
|
|
168
|
+
try {
|
|
169
|
+
processMayStillExist = dependencies.processExists(session.unregisteredPid);
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
// Process inspection is itself part of the safety proof. An unavailable
|
|
173
|
+
// probe cannot authorize activation around an unregistered local PID.
|
|
174
|
+
}
|
|
175
|
+
if (processMayStillExist) {
|
|
176
|
+
return blockerEntry(session, backendType, 'process_identity_unavailable');
|
|
177
|
+
}
|
|
178
|
+
}
|
|
114
179
|
if (backendType === 'riff') {
|
|
115
180
|
return {
|
|
116
181
|
sessionId: session.sessionId,
|
|
@@ -121,11 +186,13 @@ function classifySession(session) {
|
|
|
121
186
|
: {}),
|
|
122
187
|
};
|
|
123
188
|
}
|
|
124
|
-
const
|
|
189
|
+
const persistentTarget = isPersistentBackend(backendType)
|
|
190
|
+
? resolvePersistentBackendTarget(backendType, session.sessionId, session.persistentBackendTarget)
|
|
191
|
+
: undefined;
|
|
192
|
+
const persistent = persistentTarget
|
|
125
193
|
? {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
probe: dependencies.probePersistent(backendType, persistentSessionName(backendType, session.sessionId)),
|
|
194
|
+
target: persistentTarget,
|
|
195
|
+
probe: dependencies.probePersistent(persistentTarget),
|
|
129
196
|
}
|
|
130
197
|
: undefined;
|
|
131
198
|
if (!session.workerPresent) {
|
|
@@ -140,6 +207,21 @@ function classifySession(session) {
|
|
|
140
207
|
if (persistent.probe === 'unknown') {
|
|
141
208
|
return { ...blockerEntry(session, backendType, 'backend_probe_unknown'), persistent };
|
|
142
209
|
}
|
|
210
|
+
// A persisted shared-Herdr agent is an exact Botmux-owned resource even
|
|
211
|
+
// after its worker/viewer is gone. Keep it in the teardown inventory so
|
|
212
|
+
// activation closes only that agent and verifies its disappearance; never
|
|
213
|
+
// mistake a missing derived bmx-* host for quiescence while the real agent
|
|
214
|
+
// is still running inside a shared host session.
|
|
215
|
+
if (persistent.target.backendType === 'herdr'
|
|
216
|
+
&& persistent.target.agentName) {
|
|
217
|
+
return {
|
|
218
|
+
sessionId: session.sessionId,
|
|
219
|
+
backendType,
|
|
220
|
+
disposition: 'owned_local',
|
|
221
|
+
credentialIsolated: false,
|
|
222
|
+
persistent,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
143
225
|
// A detached pane may still be executing a legacy unconfined CLI, but the
|
|
144
226
|
// daemon no longer has a private-IPC attestation for its exact process.
|
|
145
227
|
return { ...blockerEntry(session, backendType, 'unattested_worker'), persistent };
|
|
@@ -315,9 +397,10 @@ async function quiesceOwnedSessions(prepared, lease) {
|
|
|
315
397
|
const session = sessions.get(target.sessionId);
|
|
316
398
|
if (!session)
|
|
317
399
|
return 'teardown_failed';
|
|
318
|
-
|
|
400
|
+
if (session.workerPresent)
|
|
401
|
+
dependencies.closeWorker(session);
|
|
319
402
|
if (target.persistent) {
|
|
320
|
-
dependencies.killPersistent(target.persistent.
|
|
403
|
+
dependencies.killPersistent(target.persistent.target, target.sessionId);
|
|
321
404
|
}
|
|
322
405
|
}
|
|
323
406
|
}
|
|
@@ -344,13 +427,13 @@ async function quiesceOwnedSessions(prepared, lease) {
|
|
|
344
427
|
unknown = true;
|
|
345
428
|
}
|
|
346
429
|
if (target.persistent) {
|
|
347
|
-
const probe = dependencies.probePersistent(target.persistent.
|
|
430
|
+
const probe = dependencies.probePersistent(target.persistent.target);
|
|
348
431
|
if (probe === 'unknown')
|
|
349
432
|
unknown = true;
|
|
350
433
|
if (probe === 'exists') {
|
|
351
434
|
clean = false;
|
|
352
435
|
try {
|
|
353
|
-
dependencies.killPersistent(target.persistent.
|
|
436
|
+
dependencies.killPersistent(target.persistent.target, target.sessionId);
|
|
354
437
|
}
|
|
355
438
|
catch { /* verified by the next probe */ }
|
|
356
439
|
}
|