botmux 2.111.0 → 2.112.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 +19 -7
- package/README.md +19 -7
- package/dist/adapters/adopt-route.d.ts.map +1 -1
- package/dist/adapters/adopt-route.js +2 -1
- package/dist/adapters/adopt-route.js.map +1 -1
- package/dist/adapters/backend/herdr-backend.d.ts +29 -0
- package/dist/adapters/backend/herdr-backend.d.ts.map +1 -1
- package/dist/adapters/backend/herdr-backend.js +167 -0
- package/dist/adapters/backend/herdr-backend.js.map +1 -1
- package/dist/adapters/backend/riff-backend.js +2 -2
- package/dist/adapters/backend/sandbox.d.ts +61 -6
- package/dist/adapters/backend/sandbox.d.ts.map +1 -1
- package/dist/adapters/backend/sandbox.js +235 -43
- package/dist/adapters/backend/sandbox.js.map +1 -1
- package/dist/adapters/backend/tmux-backend.d.ts +1 -0
- package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-backend.js +1 -0
- package/dist/adapters/backend/tmux-backend.js.map +1 -1
- package/dist/adapters/cli/claude-code.d.ts +2 -0
- package/dist/adapters/cli/claude-code.d.ts.map +1 -1
- package/dist/adapters/cli/claude-code.js +7 -0
- package/dist/adapters/cli/claude-code.js.map +1 -1
- package/dist/adapters/cli/codex-app-turn.d.ts +16 -0
- package/dist/adapters/cli/codex-app-turn.d.ts.map +1 -1
- package/dist/adapters/cli/codex-app-turn.js +26 -0
- package/dist/adapters/cli/codex-app-turn.js.map +1 -1
- package/dist/adapters/cli/codex.d.ts.map +1 -1
- package/dist/adapters/cli/codex.js +1 -0
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/adapters/cli/grok.d.ts +8 -6
- package/dist/adapters/cli/grok.d.ts.map +1 -1
- package/dist/adapters/cli/grok.js +14 -6
- package/dist/adapters/cli/grok.js.map +1 -1
- package/dist/adapters/cli/read-isolation.d.ts +40 -14
- package/dist/adapters/cli/read-isolation.d.ts.map +1 -1
- package/dist/adapters/cli/read-isolation.js +116 -19
- package/dist/adapters/cli/read-isolation.js.map +1 -1
- package/dist/adapters/cli/runner-control-channel.d.ts +32 -0
- package/dist/adapters/cli/runner-control-channel.d.ts.map +1 -0
- package/dist/adapters/cli/runner-control-channel.js +104 -0
- package/dist/adapters/cli/runner-control-channel.js.map +1 -0
- package/dist/adapters/cli/shared-hints.d.ts +1 -1
- package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
- package/dist/adapters/cli/shared-hints.js +9 -0
- package/dist/adapters/cli/shared-hints.js.map +1 -1
- package/dist/adapters/cli/traex.d.ts.map +1 -1
- package/dist/adapters/cli/traex.js +100 -64
- package/dist/adapters/cli/traex.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +13 -0
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/bot-registry.d.ts +36 -27
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +354 -8
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli/saved-workflow.d.ts +25 -0
- package/dist/cli/saved-workflow.d.ts.map +1 -0
- package/dist/cli/saved-workflow.js +338 -0
- package/dist/cli/saved-workflow.js.map +1 -0
- package/dist/cli/send-dispatch.d.ts +18 -3
- package/dist/cli/send-dispatch.d.ts.map +1 -1
- package/dist/cli/send-dispatch.js +22 -3
- package/dist/cli/send-dispatch.js.map +1 -1
- package/dist/cli/v3-run-cancel.d.ts +47 -0
- package/dist/cli/v3-run-cancel.d.ts.map +1 -0
- package/dist/cli/v3-run-cancel.js +96 -0
- package/dist/cli/v3-run-cancel.js.map +1 -0
- package/dist/cli/vc-agent.d.ts.map +1 -1
- package/dist/cli/vc-agent.js +54 -1
- package/dist/cli/vc-agent.js.map +1 -1
- package/dist/cli/workflow-migration.d.ts +39 -0
- package/dist/cli/workflow-migration.d.ts.map +1 -0
- package/dist/cli/workflow-migration.js +302 -0
- package/dist/cli/workflow-migration.js.map +1 -0
- package/dist/cli/workflow-run-archive.d.ts +29 -0
- package/dist/cli/workflow-run-archive.d.ts.map +1 -0
- package/dist/cli/workflow-run-archive.js +183 -0
- package/dist/cli/workflow-run-archive.js.map +1 -0
- package/dist/cli/workflow.d.ts +5 -10
- package/dist/cli/workflow.d.ts.map +1 -1
- package/dist/cli/workflow.js +85 -764
- package/dist/cli/workflow.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +1018 -191
- package/dist/cli.js.map +1 -1
- package/dist/codex-app-runner.js +30 -21
- package/dist/codex-app-runner.js.map +1 -1
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +21 -9
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/current-turn-provenance.d.ts +39 -0
- package/dist/core/current-turn-provenance.d.ts.map +1 -0
- package/dist/core/current-turn-provenance.js +122 -0
- package/dist/core/current-turn-provenance.js.map +1 -0
- package/dist/core/daemon-ipc-auth.d.ts +20 -0
- package/dist/core/daemon-ipc-auth.d.ts.map +1 -0
- package/dist/core/daemon-ipc-auth.js +44 -0
- package/dist/core/daemon-ipc-auth.js.map +1 -0
- package/dist/core/daemon-ipc-session-auth.d.ts +37 -0
- package/dist/core/daemon-ipc-session-auth.d.ts.map +1 -0
- package/dist/core/daemon-ipc-session-auth.js +35 -0
- package/dist/core/daemon-ipc-session-auth.js.map +1 -0
- package/dist/core/dashboard-command/index.d.ts +0 -2
- package/dist/core/dashboard-command/index.d.ts.map +1 -1
- package/dist/core/dashboard-command/index.js +2 -2
- package/dist/core/dashboard-command/index.js.map +1 -1
- package/dist/core/dashboard-command/stub.d.ts +1 -1
- package/dist/core/dashboard-command/stub.d.ts.map +1 -1
- package/dist/core/dashboard-command/stub.js +0 -1
- package/dist/core/dashboard-command/stub.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts +11 -2
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +266 -41
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/dashboard-secret.d.ts +3 -0
- package/dist/core/dashboard-secret.d.ts.map +1 -0
- package/dist/core/dashboard-secret.js +7 -0
- package/dist/core/dashboard-secret.js.map +1 -0
- package/dist/core/data-dir.d.ts +24 -0
- package/dist/core/data-dir.d.ts.map +1 -0
- package/dist/core/data-dir.js +48 -0
- package/dist/core/data-dir.js.map +1 -0
- package/dist/core/inflight-input-tracker.d.ts +4 -2
- package/dist/core/inflight-input-tracker.d.ts.map +1 -1
- package/dist/core/inflight-input-tracker.js +6 -5
- package/dist/core/inflight-input-tracker.js.map +1 -1
- package/dist/core/inject-queue-policy.d.ts +70 -0
- package/dist/core/inject-queue-policy.d.ts.map +1 -0
- package/dist/core/inject-queue-policy.js +30 -0
- package/dist/core/inject-queue-policy.js.map +1 -0
- package/dist/core/maintenance.d.ts +1 -1
- package/dist/core/maintenance.d.ts.map +1 -1
- package/dist/core/maintenance.js +3 -2
- package/dist/core/maintenance.js.map +1 -1
- package/dist/core/managed-origin-capability.d.ts +30 -0
- package/dist/core/managed-origin-capability.d.ts.map +1 -0
- package/dist/core/managed-origin-capability.js +88 -0
- package/dist/core/managed-origin-capability.js.map +1 -0
- package/dist/core/role-library.d.ts +15 -0
- package/dist/core/role-library.d.ts.map +1 -0
- package/dist/core/role-library.js +75 -0
- package/dist/core/role-library.js.map +1 -0
- package/dist/core/session-cwd.d.ts +14 -0
- package/dist/core/session-cwd.d.ts.map +1 -0
- package/dist/core/session-cwd.js +17 -0
- package/dist/core/session-cwd.js.map +1 -0
- package/dist/core/session-manager.d.ts +4 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +27 -8
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-marker.d.ts +22 -0
- package/dist/core/session-marker.d.ts.map +1 -1
- package/dist/core/session-marker.js +185 -20
- package/dist/core/session-marker.js.map +1 -1
- package/dist/core/slash-inject.d.ts +15 -0
- package/dist/core/slash-inject.d.ts.map +1 -0
- package/dist/core/slash-inject.js +25 -0
- package/dist/core/slash-inject.js.map +1 -0
- package/dist/core/terminal-url.d.ts +1 -0
- package/dist/core/terminal-url.d.ts.map +1 -1
- package/dist/core/terminal-url.js +14 -8
- package/dist/core/terminal-url.js.map +1 -1
- package/dist/core/terminal-write-auth.d.ts +26 -0
- package/dist/core/terminal-write-auth.d.ts.map +1 -1
- package/dist/core/terminal-write-auth.js +48 -3
- package/dist/core/terminal-write-auth.js.map +1 -1
- package/dist/core/trigger-session.d.ts +24 -1
- package/dist/core/trigger-session.d.ts.map +1 -1
- package/dist/core/trigger-session.js +106 -15
- package/dist/core/trigger-session.js.map +1 -1
- package/dist/core/types.d.ts +26 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +10 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-pool.d.ts +65 -2
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +459 -39
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts +249 -8
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +7383 -1195
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/aggregator.d.ts +1 -1
- package/dist/dashboard/aggregator.d.ts.map +1 -1
- package/dist/dashboard/aggregator.js +2 -2
- package/dist/dashboard/aggregator.js.map +1 -1
- package/dist/dashboard/auth.d.ts +3 -8
- package/dist/dashboard/auth.d.ts.map +1 -1
- package/dist/dashboard/auth.js +63 -22
- package/dist/dashboard/auth.js.map +1 -1
- package/dist/dashboard/bot-onboarding.d.ts +5 -0
- package/dist/dashboard/bot-onboarding.d.ts.map +1 -1
- package/dist/dashboard/bot-onboarding.js +37 -0
- package/dist/dashboard/bot-onboarding.js.map +1 -1
- package/dist/dashboard/connector-api.d.ts.map +1 -1
- package/dist/dashboard/connector-api.js +42 -2
- package/dist/dashboard/connector-api.js.map +1 -1
- package/dist/dashboard/daemon-internal-api.d.ts +0 -2
- package/dist/dashboard/daemon-internal-api.d.ts.map +1 -1
- package/dist/dashboard/daemon-internal-api.js +26 -93
- package/dist/dashboard/daemon-internal-api.js.map +1 -1
- package/dist/dashboard/daemon-internal-client.d.ts.map +1 -1
- package/dist/dashboard/daemon-internal-client.js +2 -3
- package/dist/dashboard/daemon-internal-client.js.map +1 -1
- package/dist/dashboard/federation-api.js +1 -1
- package/dist/dashboard/federation-api.js.map +1 -1
- package/dist/dashboard/federation-spoke-api.js +1 -1
- package/dist/dashboard/federation-spoke-api.js.map +1 -1
- package/dist/dashboard/history-senders.d.ts +3 -0
- package/dist/dashboard/history-senders.d.ts.map +1 -1
- package/dist/dashboard/history-senders.js.map +1 -1
- package/dist/dashboard/http.d.ts +4 -0
- package/dist/dashboard/http.d.ts.map +1 -0
- package/dist/dashboard/http.js +6 -0
- package/dist/dashboard/http.js.map +1 -0
- package/dist/dashboard/registry.d.ts +4 -0
- package/dist/dashboard/registry.d.ts.map +1 -1
- package/dist/dashboard/registry.js.map +1 -1
- package/dist/dashboard/trigger-api.js +1 -1
- package/dist/dashboard/trigger-api.js.map +1 -1
- package/dist/dashboard/v3-runs-api.d.ts +13 -10
- package/dist/dashboard/v3-runs-api.d.ts.map +1 -1
- package/dist/dashboard/v3-runs-api.js +121 -4
- package/dist/dashboard/v3-runs-api.js.map +1 -1
- package/dist/dashboard/vc-consumer-profiles-api.d.ts +105 -0
- package/dist/dashboard/vc-consumer-profiles-api.d.ts.map +1 -0
- package/dist/dashboard/vc-consumer-profiles-api.js +312 -0
- package/dist/dashboard/vc-consumer-profiles-api.js.map +1 -0
- package/dist/dashboard/web/app.d.ts.map +1 -1
- package/dist/dashboard/web/app.js +7 -6
- package/dist/dashboard/web/app.js.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.js +9 -14
- package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
- package/dist/dashboard/web/bot-onboarding.d.ts.map +1 -1
- package/dist/dashboard/web/bot-onboarding.js +7 -3
- package/dist/dashboard/web/bot-onboarding.js.map +1 -1
- package/dist/dashboard/web/connectors-page.d.ts +5 -0
- package/dist/dashboard/web/connectors-page.d.ts.map +1 -1
- package/dist/dashboard/web/connectors-page.js +16 -12
- package/dist/dashboard/web/connectors-page.js.map +1 -1
- package/dist/dashboard/web/create-session-entry.d.ts +4 -0
- package/dist/dashboard/web/create-session-entry.d.ts.map +1 -0
- package/dist/dashboard/web/create-session-entry.js +17 -0
- package/dist/dashboard/web/create-session-entry.js.map +1 -0
- package/dist/dashboard/web/dashboard-components.d.ts +5 -0
- package/dist/dashboard/web/dashboard-components.d.ts.map +1 -1
- package/dist/dashboard/web/dashboard-components.js +29 -4
- package/dist/dashboard/web/dashboard-components.js.map +1 -1
- package/dist/dashboard/web/dashboard-routes.d.ts.map +1 -1
- package/dist/dashboard/web/dashboard-routes.js +0 -1
- package/dist/dashboard/web/dashboard-routes.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +192 -382
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/preferences.d.ts +3 -0
- package/dist/dashboard/web/preferences.d.ts.map +1 -1
- package/dist/dashboard/web/preferences.js +18 -0
- package/dist/dashboard/web/preferences.js.map +1 -1
- package/dist/dashboard/web/schedules-page.d.ts.map +1 -1
- package/dist/dashboard/web/schedules-page.js +4 -1
- package/dist/dashboard/web/schedules-page.js.map +1 -1
- package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
- package/dist/dashboard/web/sessions-page.js +64 -18
- package/dist/dashboard/web/sessions-page.js.map +1 -1
- package/dist/dashboard/web/settings-page.d.ts.map +1 -1
- package/dist/dashboard/web/settings-page.js +2 -1
- package/dist/dashboard/web/settings-page.js.map +1 -1
- package/dist/dashboard/web/v3-api.d.ts +12 -2
- package/dist/dashboard/web/v3-api.d.ts.map +1 -1
- package/dist/dashboard/web/v3-api.js +34 -6
- package/dist/dashboard/web/v3-api.js.map +1 -1
- package/dist/dashboard/web/v3-components.d.ts +6 -0
- package/dist/dashboard/web/v3-components.d.ts.map +1 -1
- package/dist/dashboard/web/v3-components.js +66 -23
- package/dist/dashboard/web/v3-components.js.map +1 -1
- package/dist/dashboard/web/v3-model.js +1 -1
- package/dist/dashboard/web/v3-model.js.map +1 -1
- package/dist/dashboard/web/v3-terminal.js +2 -2
- package/dist/dashboard/web/v3-terminal.js.map +1 -1
- package/dist/dashboard/web/vc-consumer-profiles-section.d.ts +19 -0
- package/dist/dashboard/web/vc-consumer-profiles-section.d.ts.map +1 -0
- package/dist/dashboard/web/vc-consumer-profiles-section.js +382 -0
- package/dist/dashboard/web/vc-consumer-profiles-section.js.map +1 -0
- package/dist/dashboard/webhook-routes.d.ts.map +1 -1
- package/dist/dashboard/webhook-routes.js +29 -6
- package/dist/dashboard/webhook-routes.js.map +1 -1
- package/dist/dashboard-web/app.js +1 -1
- package/dist/dashboard-web/chunks/bot-defaults-page-RYBL4ZYE.js +4 -0
- package/dist/dashboard-web/chunks/{chunk-OEJIT66L.js → chunk-CMDPZOPK.js} +1 -1
- package/dist/dashboard-web/chunks/chunk-I35DXGM4.js +1 -0
- package/dist/dashboard-web/chunks/chunk-NYZHARIU.js +47 -0
- package/dist/dashboard-web/chunks/chunk-SZOB6VK2.js +1 -0
- package/dist/dashboard-web/chunks/{chunk-YQFXGRSD.js → chunk-YBOHL7T7.js} +1 -1
- package/dist/dashboard-web/chunks/chunk-YWCPDL4S.js +1 -0
- package/dist/dashboard-web/chunks/connectors-page-DAMP7TTV.js +1 -0
- package/dist/dashboard-web/chunks/{groups-page-5AJPPJH2.js → groups-page-BPFA356N.js} +1 -1
- package/dist/dashboard-web/chunks/{insights-page-R3DFECX4.js → insights-page-SHOPHTWY.js} +1 -1
- package/dist/dashboard-web/chunks/{monitor-room-NLMKJLDY.js → monitor-room-PXPJGZCN.js} +1 -1
- package/dist/dashboard-web/chunks/{monitoring-page-EHSOX4GV.js → monitoring-page-4DF54M5Y.js} +1 -1
- package/dist/dashboard-web/chunks/{office-page-OXJKFJ4R.js → office-page-6OHU6KMZ.js} +1 -1
- package/dist/dashboard-web/chunks/{overview-page-GJHIVXJF.js → overview-page-IHIZ6F5M.js} +1 -1
- package/dist/dashboard-web/chunks/{roles-page-6ZODQISW.js → roles-page-JYTBYKEF.js} +1 -1
- package/dist/dashboard-web/chunks/{schedules-page-DAGMHVCH.js → schedules-page-WJ72T7KV.js} +1 -1
- package/dist/dashboard-web/chunks/sessions-page-QC56OIAI.js +3 -0
- package/dist/dashboard-web/chunks/settings-page-TCKWEXTN.js +2 -0
- package/dist/dashboard-web/chunks/{skills-page-J7EVUHXP.js → skills-page-RJJNIECW.js} +1 -1
- package/dist/dashboard-web/chunks/{team-federation-page-YM5JBIII.js → team-federation-page-ZMDX3E7K.js} +1 -1
- package/dist/dashboard-web/chunks/v3-page-VLLAUQ33.js +94 -0
- package/dist/dashboard-web/chunks/{whiteboards-page-75N2U6W4.js → whiteboards-page-NAO53CKM.js} +1 -1
- package/dist/dashboard-web/style.css +363 -274
- package/dist/dashboard.js +194 -78
- package/dist/dashboard.js.map +1 -1
- package/dist/global-config.d.ts +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +12 -87
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +12 -87
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/brand-template.d.ts +15 -0
- package/dist/im/lark/brand-template.d.ts.map +1 -0
- package/dist/im/lark/brand-template.js +114 -0
- package/dist/im/lark/brand-template.js.map +1 -0
- package/dist/im/lark/card-handler.d.ts +6 -3
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +23 -39
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts +8 -2
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +33 -31
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/doc-comment.d.ts +18 -0
- package/dist/im/lark/doc-comment.d.ts.map +1 -1
- package/dist/im/lark/doc-comment.js +119 -5
- package/dist/im/lark/doc-comment.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts +18 -2
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +41 -19
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/merge-forward.d.ts.map +1 -1
- package/dist/im/lark/merge-forward.js +7 -2
- package/dist/im/lark/merge-forward.js.map +1 -1
- package/dist/im/lark/message-parser.d.ts.map +1 -1
- package/dist/im/lark/message-parser.js +7 -0
- package/dist/im/lark/message-parser.js.map +1 -1
- package/dist/im/lark/overview-card.d.ts +1 -2
- package/dist/im/lark/overview-card.d.ts.map +1 -1
- package/dist/im/lark/overview-card.js +1 -48
- package/dist/im/lark/overview-card.js.map +1 -1
- package/dist/im/lark/v3-blocked-card-handler.d.ts.map +1 -1
- package/dist/im/lark/v3-blocked-card-handler.js +5 -5
- package/dist/im/lark/v3-blocked-card-handler.js.map +1 -1
- package/dist/im/lark/v3-blocked-card.d.ts +1 -0
- package/dist/im/lark/v3-blocked-card.d.ts.map +1 -1
- package/dist/im/lark/v3-blocked-card.js +19 -2
- package/dist/im/lark/v3-blocked-card.js.map +1 -1
- package/dist/im/lark/v3-distillation-card-handler.d.ts +12 -0
- package/dist/im/lark/v3-distillation-card-handler.d.ts.map +1 -0
- package/dist/im/lark/v3-distillation-card-handler.js +107 -0
- package/dist/im/lark/v3-distillation-card-handler.js.map +1 -0
- package/dist/im/lark/v3-distillation-card.d.ts +42 -0
- package/dist/im/lark/v3-distillation-card.d.ts.map +1 -0
- package/dist/im/lark/v3-distillation-card.js +206 -0
- package/dist/im/lark/v3-distillation-card.js.map +1 -0
- package/dist/im/lark/v3-gate-card-handler.d.ts +1 -1
- package/dist/im/lark/v3-gate-card-handler.d.ts.map +1 -1
- package/dist/im/lark/v3-gate-card-handler.js +6 -5
- package/dist/im/lark/v3-gate-card-handler.js.map +1 -1
- package/dist/im/lark/v3-gate-card.d.ts +8 -1
- package/dist/im/lark/v3-gate-card.d.ts.map +1 -1
- package/dist/im/lark/v3-gate-card.js +38 -7
- package/dist/im/lark/v3-gate-card.js.map +1 -1
- package/dist/im/lark/v3-loop-grant-card-handler.d.ts.map +1 -1
- package/dist/im/lark/v3-loop-grant-card-handler.js +3 -4
- package/dist/im/lark/v3-loop-grant-card-handler.js.map +1 -1
- package/dist/im/lark/v3-loop-grant-card.js +1 -1
- package/dist/im/lark/v3-loop-grant-card.js.map +1 -1
- package/dist/im/lark/v3-progress-card-manager.d.ts +79 -0
- package/dist/im/lark/v3-progress-card-manager.d.ts.map +1 -0
- package/dist/im/lark/v3-progress-card-manager.js +444 -0
- package/dist/im/lark/v3-progress-card-manager.js.map +1 -0
- package/dist/im/lark/v3-progress-card.d.ts +26 -0
- package/dist/im/lark/v3-progress-card.d.ts.map +1 -0
- package/dist/im/lark/v3-progress-card.js +211 -0
- package/dist/im/lark/v3-progress-card.js.map +1 -0
- package/dist/im/lark/v3-revisit-grant-card-handler.d.ts.map +1 -1
- package/dist/im/lark/v3-revisit-grant-card-handler.js +3 -4
- package/dist/im/lark/v3-revisit-grant-card-handler.js.map +1 -1
- package/dist/im/lark/v3-revisit-grant-card.js +1 -1
- package/dist/im/lark/v3-revisit-grant-card.js.map +1 -1
- package/dist/im/lark/v3-run-save-card-handler.d.ts +12 -0
- package/dist/im/lark/v3-run-save-card-handler.d.ts.map +1 -0
- package/dist/im/lark/v3-run-save-card-handler.js +160 -0
- package/dist/im/lark/v3-run-save-card-handler.js.map +1 -0
- package/dist/im/lark/v3-run-save-card.d.ts +38 -0
- package/dist/im/lark/v3-run-save-card.d.ts.map +1 -0
- package/dist/im/lark/v3-run-save-card.js +125 -0
- package/dist/im/lark/v3-run-save-card.js.map +1 -0
- package/dist/im/lark/v3-saved-workflow-command.d.ts +36 -0
- package/dist/im/lark/v3-saved-workflow-command.d.ts.map +1 -0
- package/dist/im/lark/v3-saved-workflow-command.js +186 -0
- package/dist/im/lark/v3-saved-workflow-command.js.map +1 -0
- package/dist/im/lark/v3-saved-workflow-handler.d.ts +89 -0
- package/dist/im/lark/v3-saved-workflow-handler.d.ts.map +1 -0
- package/dist/im/lark/v3-saved-workflow-handler.js +212 -0
- package/dist/im/lark/v3-saved-workflow-handler.js.map +1 -0
- package/dist/im/lark/workflow-slash-command.d.ts +7 -110
- package/dist/im/lark/workflow-slash-command.d.ts.map +1 -1
- package/dist/im/lark/workflow-slash-command.js +16 -230
- package/dist/im/lark/workflow-slash-command.js.map +1 -1
- package/dist/index-daemon.js +1 -1
- package/dist/index-daemon.js.map +1 -1
- package/dist/mir-runner.js +11 -15
- package/dist/mir-runner.js.map +1 -1
- package/dist/mira-runner.js +8 -12
- package/dist/mira-runner.js.map +1 -1
- package/dist/services/bridge-turn-queue.d.ts +29 -12
- package/dist/services/bridge-turn-queue.d.ts.map +1 -1
- package/dist/services/bridge-turn-queue.js +59 -23
- package/dist/services/bridge-turn-queue.js.map +1 -1
- package/dist/services/claude-transcript.d.ts +15 -0
- package/dist/services/claude-transcript.d.ts.map +1 -1
- package/dist/services/claude-transcript.js +24 -0
- package/dist/services/claude-transcript.js.map +1 -1
- package/dist/services/codex-bridge-queue.d.ts +13 -2
- package/dist/services/codex-bridge-queue.d.ts.map +1 -1
- package/dist/services/codex-bridge-queue.js +20 -3
- package/dist/services/codex-bridge-queue.js.map +1 -1
- package/dist/services/codex-transcript.d.ts +6 -0
- package/dist/services/codex-transcript.d.ts.map +1 -1
- package/dist/services/codex-transcript.js.map +1 -1
- package/dist/services/grok-transcript.d.ts +3 -2
- package/dist/services/grok-transcript.d.ts.map +1 -1
- package/dist/services/grok-transcript.js +73 -22
- package/dist/services/grok-transcript.js.map +1 -1
- package/dist/services/hook-runner.d.ts.map +1 -1
- package/dist/services/hook-runner.js +26 -3
- package/dist/services/hook-runner.js.map +1 -1
- package/dist/services/schedule-store.d.ts +37 -0
- package/dist/services/schedule-store.d.ts.map +1 -1
- package/dist/services/schedule-store.js +259 -141
- package/dist/services/schedule-store.js.map +1 -1
- package/dist/services/send-policy.d.ts +50 -0
- package/dist/services/send-policy.d.ts.map +1 -1
- package/dist/services/send-policy.js +65 -0
- package/dist/services/send-policy.js.map +1 -1
- package/dist/services/session-lifecycle-hooks.d.ts.map +1 -1
- package/dist/services/session-lifecycle-hooks.js +12 -0
- package/dist/services/session-lifecycle-hooks.js.map +1 -1
- package/dist/services/traex-transcript.d.ts +11 -2
- package/dist/services/traex-transcript.d.ts.map +1 -1
- package/dist/services/traex-transcript.js +142 -8
- package/dist/services/traex-transcript.js.map +1 -1
- package/dist/services/trigger-types.d.ts +6 -1
- package/dist/services/trigger-types.d.ts.map +1 -1
- package/dist/services/trigger-types.js.map +1 -1
- package/dist/services/turn-terminal-deduper.d.ts +14 -0
- package/dist/services/turn-terminal-deduper.d.ts.map +1 -0
- package/dist/services/turn-terminal-deduper.js +34 -0
- package/dist/services/turn-terminal-deduper.js.map +1 -0
- package/dist/services/vc-meeting-action-gate.d.ts +246 -0
- package/dist/services/vc-meeting-action-gate.d.ts.map +1 -0
- package/dist/services/vc-meeting-action-gate.js +756 -0
- package/dist/services/vc-meeting-action-gate.js.map +1 -0
- package/dist/services/vc-meeting-action-store.d.ts +222 -0
- package/dist/services/vc-meeting-action-store.d.ts.map +1 -0
- package/dist/services/vc-meeting-action-store.js +806 -0
- package/dist/services/vc-meeting-action-store.js.map +1 -0
- package/dist/services/vc-meeting-consumer-isolation.d.ts +27 -0
- package/dist/services/vc-meeting-consumer-isolation.d.ts.map +1 -0
- package/dist/services/vc-meeting-consumer-isolation.js +37 -0
- package/dist/services/vc-meeting-consumer-isolation.js.map +1 -0
- package/dist/services/vc-meeting-consumer-profile-bootstrap.d.ts +72 -0
- package/dist/services/vc-meeting-consumer-profile-bootstrap.d.ts.map +1 -0
- package/dist/services/vc-meeting-consumer-profile-bootstrap.js +343 -0
- package/dist/services/vc-meeting-consumer-profile-bootstrap.js.map +1 -0
- package/dist/services/vc-meeting-consumer-profile-store.d.ts +39 -0
- package/dist/services/vc-meeting-consumer-profile-store.d.ts.map +1 -0
- package/dist/services/vc-meeting-consumer-profile-store.js +190 -0
- package/dist/services/vc-meeting-consumer-profile-store.js.map +1 -0
- package/dist/services/vc-meeting-daemon-auth.d.ts +29 -0
- package/dist/services/vc-meeting-daemon-auth.d.ts.map +1 -0
- package/dist/services/vc-meeting-daemon-auth.js +117 -0
- package/dist/services/vc-meeting-daemon-auth.js.map +1 -0
- package/dist/services/vc-meeting-delivery-feed.d.ts +52 -0
- package/dist/services/vc-meeting-delivery-feed.d.ts.map +1 -0
- package/dist/services/vc-meeting-delivery-feed.js +231 -0
- package/dist/services/vc-meeting-delivery-feed.js.map +1 -0
- package/dist/services/vc-meeting-delivery-hub-store.d.ts +213 -0
- package/dist/services/vc-meeting-delivery-hub-store.d.ts.map +1 -0
- package/dist/services/vc-meeting-delivery-hub-store.js +1230 -0
- package/dist/services/vc-meeting-delivery-hub-store.js.map +1 -0
- package/dist/services/vc-meeting-delivery-protocol.d.ts +159 -0
- package/dist/services/vc-meeting-delivery-protocol.d.ts.map +1 -0
- package/dist/services/vc-meeting-delivery-protocol.js +443 -0
- package/dist/services/vc-meeting-delivery-protocol.js.map +1 -0
- package/dist/services/vc-meeting-delivery-receiver.d.ts +80 -0
- package/dist/services/vc-meeting-delivery-receiver.d.ts.map +1 -0
- package/dist/services/vc-meeting-delivery-receiver.js +543 -0
- package/dist/services/vc-meeting-delivery-receiver.js.map +1 -0
- package/dist/services/vc-meeting-delivery-store.d.ts +339 -0
- package/dist/services/vc-meeting-delivery-store.d.ts.map +1 -0
- package/dist/services/vc-meeting-delivery-store.js +1024 -0
- package/dist/services/vc-meeting-delivery-store.js.map +1 -0
- package/dist/services/vc-meeting-feed-metadata-store.d.ts +58 -0
- package/dist/services/vc-meeting-feed-metadata-store.d.ts.map +1 -0
- package/dist/services/vc-meeting-feed-metadata-store.js +356 -0
- package/dist/services/vc-meeting-feed-metadata-store.js.map +1 -0
- package/dist/services/vc-meeting-im-reply.d.ts +55 -0
- package/dist/services/vc-meeting-im-reply.d.ts.map +1 -0
- package/dist/services/vc-meeting-im-reply.js +279 -0
- package/dist/services/vc-meeting-im-reply.js.map +1 -0
- package/dist/services/vc-meeting-im-routing.d.ts +131 -0
- package/dist/services/vc-meeting-im-routing.d.ts.map +1 -0
- package/dist/services/vc-meeting-im-routing.js +449 -0
- package/dist/services/vc-meeting-im-routing.js.map +1 -0
- package/dist/services/vc-meeting-listener-message-store.d.ts +23 -0
- package/dist/services/vc-meeting-listener-message-store.d.ts.map +1 -0
- package/dist/services/vc-meeting-listener-message-store.js +142 -0
- package/dist/services/vc-meeting-listener-message-store.js.map +1 -0
- package/dist/services/vc-meeting-member-policy.d.ts +37 -0
- package/dist/services/vc-meeting-member-policy.d.ts.map +1 -0
- package/dist/services/vc-meeting-member-policy.js +102 -0
- package/dist/services/vc-meeting-member-policy.js.map +1 -0
- package/dist/services/vc-meeting-profile-instructions.d.ts +22 -0
- package/dist/services/vc-meeting-profile-instructions.d.ts.map +1 -0
- package/dist/services/vc-meeting-profile-instructions.js +64 -0
- package/dist/services/vc-meeting-profile-instructions.js.map +1 -0
- package/dist/services/vc-meeting-runtime-store.d.ts +63 -0
- package/dist/services/vc-meeting-runtime-store.d.ts.map +1 -1
- package/dist/services/vc-meeting-runtime-store.js +605 -116
- package/dist/services/vc-meeting-runtime-store.js.map +1 -1
- package/dist/services/vc-meeting-send-policy.d.ts +89 -0
- package/dist/services/vc-meeting-send-policy.d.ts.map +1 -0
- package/dist/services/vc-meeting-send-policy.js +150 -0
- package/dist/services/vc-meeting-send-policy.js.map +1 -0
- package/dist/services/vc-meeting-terminal-reconciler.d.ts +93 -0
- package/dist/services/vc-meeting-terminal-reconciler.d.ts.map +1 -0
- package/dist/services/vc-meeting-terminal-reconciler.js +198 -0
- package/dist/services/vc-meeting-terminal-reconciler.js.map +1 -0
- package/dist/setup/open-platform-automation.d.ts +2 -0
- package/dist/setup/open-platform-automation.d.ts.map +1 -1
- package/dist/setup/open-platform-automation.js +1 -0
- package/dist/setup/open-platform-automation.js.map +1 -1
- package/dist/setup/open-platform-outcome.d.ts +50 -0
- package/dist/setup/open-platform-outcome.d.ts.map +1 -0
- package/dist/setup/open-platform-outcome.js +56 -0
- package/dist/setup/open-platform-outcome.js.map +1 -0
- package/dist/setup/setup-args.d.ts +7 -2
- package/dist/setup/setup-args.d.ts.map +1 -1
- package/dist/setup/setup-args.js +21 -5
- package/dist/setup/setup-args.js.map +1 -1
- package/dist/skills/definitions.d.ts.map +1 -1
- package/dist/skills/definitions.js +66 -54
- package/dist/skills/definitions.js.map +1 -1
- package/dist/skills/injection-mode.d.ts +5 -4
- package/dist/skills/injection-mode.d.ts.map +1 -1
- package/dist/skills/injection-mode.js +19 -10
- package/dist/skills/injection-mode.js.map +1 -1
- package/dist/types.d.ts +187 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/canonical-input-hash.d.ts +5 -0
- package/dist/utils/canonical-input-hash.d.ts.map +1 -0
- package/dist/utils/canonical-input-hash.js +43 -0
- package/dist/utils/canonical-input-hash.js.map +1 -0
- package/dist/utils/canonical-json.d.ts +10 -0
- package/dist/utils/canonical-json.d.ts.map +1 -0
- package/dist/utils/canonical-json.js +23 -0
- package/dist/utils/canonical-json.js.map +1 -0
- 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 +8 -0
- package/dist/utils/child-env.js.map +1 -1
- package/dist/utils/daemon-discovery.d.ts +4 -0
- package/dist/utils/daemon-discovery.d.ts.map +1 -1
- package/dist/utils/daemon-discovery.js +12 -6
- package/dist/utils/daemon-discovery.js.map +1 -1
- package/dist/utils/file-lock.d.ts.map +1 -1
- package/dist/utils/file-lock.js +696 -102
- package/dist/utils/file-lock.js.map +1 -1
- package/dist/utils/fs-durability.d.ts +20 -0
- package/dist/utils/fs-durability.d.ts.map +1 -0
- package/dist/utils/fs-durability.js +84 -0
- package/dist/utils/fs-durability.js.map +1 -0
- package/dist/utils/global-install.d.ts +5 -2
- package/dist/utils/global-install.d.ts.map +1 -1
- package/dist/utils/global-install.js +22 -4
- package/dist/utils/global-install.js.map +1 -1
- package/dist/utils/herdr-web-history.d.ts +12 -0
- package/dist/utils/herdr-web-history.d.ts.map +1 -0
- package/dist/utils/herdr-web-history.js +74 -0
- package/dist/utils/herdr-web-history.js.map +1 -0
- package/dist/utils/herdr-web-terminal-binding.d.ts +39 -0
- package/dist/utils/herdr-web-terminal-binding.d.ts.map +1 -0
- package/dist/utils/herdr-web-terminal-binding.js +56 -0
- package/dist/utils/herdr-web-terminal-binding.js.map +1 -0
- package/dist/utils/pending-input-queue.d.ts +30 -1
- package/dist/utils/pending-input-queue.d.ts.map +1 -1
- package/dist/utils/pending-input-queue.js +45 -5
- package/dist/utils/pending-input-queue.js.map +1 -1
- package/dist/vc-agent/cards.d.ts +49 -4
- package/dist/vc-agent/cards.d.ts.map +1 -1
- package/dist/vc-agent/cards.js +460 -70
- package/dist/vc-agent/cards.js.map +1 -1
- package/dist/vc-agent/polling-source.d.ts +6 -1
- package/dist/vc-agent/polling-source.d.ts.map +1 -1
- package/dist/vc-agent/polling-source.js +17 -4
- package/dist/vc-agent/polling-source.js.map +1 -1
- package/dist/worker.js +1333 -283
- package/dist/worker.js.map +1 -1
- package/dist/workflows/definition.d.ts +28 -35
- package/dist/workflows/definition.d.ts.map +1 -1
- package/dist/workflows/definition.js +7 -24
- package/dist/workflows/definition.js.map +1 -1
- package/dist/workflows/events/payloads.d.ts +28 -28
- package/dist/workflows/events/replay.d.ts +5 -0
- package/dist/workflows/events/replay.d.ts.map +1 -1
- package/dist/workflows/events/replay.js +6 -1
- package/dist/workflows/events/replay.js.map +1 -1
- package/dist/workflows/events/schema.d.ts +663 -663
- package/dist/workflows/events/schema.d.ts.map +1 -1
- package/dist/workflows/events/schema.js +1 -4
- package/dist/workflows/events/schema.js.map +1 -1
- package/dist/workflows/hostExecutors/botmux-schedule.d.ts +5 -4
- package/dist/workflows/hostExecutors/botmux-schedule.d.ts.map +1 -1
- package/dist/workflows/hostExecutors/botmux-schedule.js +80 -35
- package/dist/workflows/hostExecutors/botmux-schedule.js.map +1 -1
- package/dist/workflows/hostExecutors/feishu-im.d.ts +3 -3
- package/dist/workflows/hostExecutors/feishu-im.d.ts.map +1 -1
- package/dist/workflows/hostExecutors/feishu-im.js +3 -3
- package/dist/workflows/hostExecutors/feishu-im.js.map +1 -1
- package/dist/workflows/hostExecutors/feishu-reply.d.ts +1 -1
- package/dist/workflows/hostExecutors/feishu-reply.d.ts.map +1 -1
- package/dist/workflows/hostExecutors/feishu-reply.js +1 -1
- package/dist/workflows/hostExecutors/feishu-reply.js.map +1 -1
- package/dist/workflows/hostExecutors/feishu-send.d.ts +1 -1
- package/dist/workflows/hostExecutors/feishu-send.d.ts.map +1 -1
- package/dist/workflows/hostExecutors/feishu-send.js +1 -1
- package/dist/workflows/hostExecutors/feishu-send.js.map +1 -1
- package/dist/workflows/hostExecutors/index.d.ts +0 -1
- package/dist/workflows/hostExecutors/index.d.ts.map +1 -1
- package/dist/workflows/hostExecutors/index.js +0 -1
- package/dist/workflows/hostExecutors/index.js.map +1 -1
- package/dist/workflows/hostExecutors/registry.d.ts +1 -1
- package/dist/workflows/hostExecutors/registry.d.ts.map +1 -1
- package/dist/workflows/hostExecutors/types.d.ts +21 -29
- package/dist/workflows/hostExecutors/types.d.ts.map +1 -1
- package/dist/workflows/migration/v2-definition-paths.d.ts +3 -0
- package/dist/workflows/migration/v2-definition-paths.d.ts.map +1 -0
- package/dist/workflows/migration/v2-definition-paths.js +10 -0
- package/dist/workflows/migration/v2-definition-paths.js.map +1 -0
- package/dist/workflows/migration/v2-ledger.d.ts +138 -0
- package/dist/workflows/migration/v2-ledger.d.ts.map +1 -0
- package/dist/workflows/migration/v2-ledger.js +599 -0
- package/dist/workflows/migration/v2-ledger.js.map +1 -0
- package/dist/workflows/migration/v2-migration-service.d.ts +40 -0
- package/dist/workflows/migration/v2-migration-service.d.ts.map +1 -0
- package/dist/workflows/migration/v2-migration-service.js +454 -0
- package/dist/workflows/migration/v2-migration-service.js.map +1 -0
- package/dist/workflows/migration/v2-read-only-ids.d.ts +7 -0
- package/dist/workflows/migration/v2-read-only-ids.d.ts.map +1 -0
- package/dist/workflows/migration/v2-read-only-ids.js +9 -0
- package/dist/workflows/migration/v2-read-only-ids.js.map +1 -0
- package/dist/workflows/migration/v2-run-archive-schema.d.ts +976 -0
- package/dist/workflows/migration/v2-run-archive-schema.d.ts.map +1 -0
- package/dist/workflows/migration/v2-run-archive-schema.js +113 -0
- package/dist/workflows/migration/v2-run-archive-schema.js.map +1 -0
- package/dist/workflows/migration/v2-run-archive.d.ts +92 -0
- package/dist/workflows/migration/v2-run-archive.d.ts.map +1 -0
- package/dist/workflows/migration/v2-run-archive.js +1220 -0
- package/dist/workflows/migration/v2-run-archive.js.map +1 -0
- package/dist/workflows/migration/v2-scanner.d.ts +22 -0
- package/dist/workflows/migration/v2-scanner.d.ts.map +1 -0
- package/dist/workflows/migration/v2-scanner.js +114 -0
- package/dist/workflows/migration/v2-scanner.js.map +1 -0
- package/dist/workflows/migration/v2-to-v3.d.ts +32 -0
- package/dist/workflows/migration/v2-to-v3.d.ts.map +1 -0
- package/dist/workflows/migration/v2-to-v3.js +494 -0
- package/dist/workflows/migration/v2-to-v3.js.map +1 -0
- package/dist/workflows/ops-projection.d.ts.map +1 -1
- package/dist/workflows/ops-projection.js +4 -3
- package/dist/workflows/ops-projection.js.map +1 -1
- package/dist/workflows/shared/idempotency-key.d.ts +19 -0
- package/dist/workflows/shared/idempotency-key.d.ts.map +1 -0
- package/dist/workflows/shared/idempotency-key.js +23 -0
- package/dist/workflows/shared/idempotency-key.js.map +1 -0
- package/dist/workflows/{params.d.ts → shared/params.d.ts} +42 -6
- package/dist/workflows/shared/params.d.ts.map +1 -0
- package/dist/workflows/{params.js → shared/params.js} +91 -4
- package/dist/workflows/shared/params.js.map +1 -0
- package/dist/workflows/shared/provider-reconciler.d.ts +47 -0
- package/dist/workflows/shared/provider-reconciler.d.ts.map +1 -0
- package/dist/workflows/shared/provider-reconciler.js +17 -0
- package/dist/workflows/shared/provider-reconciler.js.map +1 -0
- package/dist/workflows/{spawn-policy.d.ts → shared/sandbox-policy.d.ts} +2 -2
- package/dist/workflows/shared/sandbox-policy.d.ts.map +1 -0
- package/dist/workflows/{spawn-policy.js → shared/sandbox-policy.js} +1 -1
- package/dist/workflows/shared/sandbox-policy.js.map +1 -0
- package/dist/workflows/shared/worker-process.d.ts +29 -0
- package/dist/workflows/shared/worker-process.d.ts.map +1 -0
- package/dist/workflows/shared/worker-process.js +56 -0
- package/dist/workflows/shared/worker-process.js.map +1 -0
- package/dist/workflows/v3/architect.d.ts.map +1 -1
- package/dist/workflows/v3/architect.js +16 -4
- package/dist/workflows/v3/architect.js.map +1 -1
- package/dist/workflows/v3/attempt-ledger.d.ts +23 -0
- package/dist/workflows/v3/attempt-ledger.d.ts.map +1 -0
- package/dist/workflows/v3/attempt-ledger.js +74 -0
- package/dist/workflows/v3/attempt-ledger.js.map +1 -0
- package/dist/workflows/v3/bot-resolve.d.ts +19 -1
- package/dist/workflows/v3/bot-resolve.d.ts.map +1 -1
- package/dist/workflows/v3/bot-resolve.js +129 -3
- package/dist/workflows/v3/bot-resolve.js.map +1 -1
- package/dist/workflows/v3/cli-daemon-command-authority.d.ts +59 -0
- package/dist/workflows/v3/cli-daemon-command-authority.d.ts.map +1 -0
- package/dist/workflows/v3/cli-daemon-command-authority.js +175 -0
- package/dist/workflows/v3/cli-daemon-command-authority.js.map +1 -0
- package/dist/workflows/v3/cli-run.d.ts +27 -0
- package/dist/workflows/v3/cli-run.d.ts.map +1 -1
- package/dist/workflows/v3/cli-run.js +113 -29
- package/dist/workflows/v3/cli-run.js.map +1 -1
- package/dist/workflows/v3/contract.d.ts +16 -16
- package/dist/workflows/v3/contract.d.ts.map +1 -1
- package/dist/workflows/v3/contract.js +15 -11
- package/dist/workflows/v3/contract.js.map +1 -1
- package/dist/workflows/v3/daemon-ipc-auth.d.ts +113 -0
- package/dist/workflows/v3/daemon-ipc-auth.d.ts.map +1 -0
- package/dist/workflows/v3/daemon-ipc-auth.js +294 -0
- package/dist/workflows/v3/daemon-ipc-auth.js.map +1 -0
- package/dist/workflows/v3/daemon-ipc-body.d.ts +30 -0
- package/dist/workflows/v3/daemon-ipc-body.d.ts.map +1 -0
- package/dist/workflows/v3/daemon-ipc-body.js +65 -0
- package/dist/workflows/v3/daemon-ipc-body.js.map +1 -0
- package/dist/workflows/v3/daemon-ipc-client.d.ts +32 -0
- package/dist/workflows/v3/daemon-ipc-client.d.ts.map +1 -0
- package/dist/workflows/v3/daemon-ipc-client.js +74 -0
- package/dist/workflows/v3/daemon-ipc-client.js.map +1 -0
- package/dist/workflows/v3/daemon-run.d.ts +87 -2
- package/dist/workflows/v3/daemon-run.d.ts.map +1 -1
- package/dist/workflows/v3/daemon-run.js +863 -68
- package/dist/workflows/v3/daemon-run.js.map +1 -1
- package/dist/workflows/v3/dag.d.ts +22 -8
- package/dist/workflows/v3/dag.d.ts.map +1 -1
- package/dist/workflows/v3/dag.js +214 -22
- package/dist/workflows/v3/dag.js.map +1 -1
- package/dist/workflows/v3/distillation-compiler.d.ts +36 -0
- package/dist/workflows/v3/distillation-compiler.d.ts.map +1 -0
- package/dist/workflows/v3/distillation-compiler.js +704 -0
- package/dist/workflows/v3/distillation-compiler.js.map +1 -0
- package/dist/workflows/v3/distillation-private-root.d.ts +10 -0
- package/dist/workflows/v3/distillation-private-root.d.ts.map +1 -0
- package/dist/workflows/v3/distillation-private-root.js +34 -0
- package/dist/workflows/v3/distillation-private-root.js.map +1 -0
- package/dist/workflows/v3/distillation-runner.d.ts +64 -0
- package/dist/workflows/v3/distillation-runner.d.ts.map +1 -0
- package/dist/workflows/v3/distillation-runner.js +1028 -0
- package/dist/workflows/v3/distillation-runner.js.map +1 -0
- package/dist/workflows/v3/distillation-schema.d.ts +63 -0
- package/dist/workflows/v3/distillation-schema.d.ts.map +1 -0
- package/dist/workflows/v3/distillation-schema.js +184 -0
- package/dist/workflows/v3/distillation-schema.js.map +1 -0
- package/dist/workflows/v3/distillation-service.d.ts +78 -0
- package/dist/workflows/v3/distillation-service.d.ts.map +1 -0
- package/dist/workflows/v3/distillation-service.js +416 -0
- package/dist/workflows/v3/distillation-service.js.map +1 -0
- package/dist/workflows/v3/distillation-source.d.ts +35 -0
- package/dist/workflows/v3/distillation-source.d.ts.map +1 -0
- package/dist/workflows/v3/distillation-source.js +118 -0
- package/dist/workflows/v3/distillation-source.js.map +1 -0
- package/dist/workflows/v3/distillation-store.d.ts +185 -0
- package/dist/workflows/v3/distillation-store.d.ts.map +1 -0
- package/dist/workflows/v3/distillation-store.js +1127 -0
- package/dist/workflows/v3/distillation-store.js.map +1 -0
- package/dist/workflows/v3/drive-lease.d.ts +7 -0
- package/dist/workflows/v3/drive-lease.d.ts.map +1 -0
- package/dist/workflows/v3/drive-lease.js +10 -0
- package/dist/workflows/v3/drive-lease.js.map +1 -0
- package/dist/workflows/v3/ephemeral-pool.d.ts +1 -1
- package/dist/workflows/v3/ephemeral-pool.d.ts.map +1 -1
- package/dist/workflows/v3/ephemeral-pool.js +222 -37
- package/dist/workflows/v3/ephemeral-pool.js.map +1 -1
- package/dist/workflows/v3/grill-state.d.ts +18 -3
- package/dist/workflows/v3/grill-state.d.ts.map +1 -1
- package/dist/workflows/v3/grill-state.js +22 -5
- package/dist/workflows/v3/grill-state.js.map +1 -1
- package/dist/workflows/v3/host-bindings.d.ts +40 -0
- package/dist/workflows/v3/host-bindings.d.ts.map +1 -0
- package/dist/workflows/v3/host-bindings.js +272 -0
- package/dist/workflows/v3/host-bindings.js.map +1 -0
- package/dist/workflows/v3/host-effect-ledger.d.ts +22 -0
- package/dist/workflows/v3/host-effect-ledger.d.ts.map +1 -0
- package/dist/workflows/v3/host-effect-ledger.js +110 -0
- package/dist/workflows/v3/host-effect-ledger.js.map +1 -0
- package/dist/workflows/v3/host-execution.d.ts +142 -0
- package/dist/workflows/v3/host-execution.d.ts.map +1 -0
- package/dist/workflows/v3/host-execution.js +424 -0
- package/dist/workflows/v3/host-execution.js.map +1 -0
- package/dist/workflows/v3/host.d.ts +46 -10
- package/dist/workflows/v3/host.d.ts.map +1 -1
- package/dist/workflows/v3/host.js +419 -140
- package/dist/workflows/v3/host.js.map +1 -1
- package/dist/workflows/v3/human-gate.d.ts +19 -1
- package/dist/workflows/v3/human-gate.d.ts.map +1 -1
- package/dist/workflows/v3/human-gate.js +145 -19
- package/dist/workflows/v3/human-gate.js.map +1 -1
- package/dist/workflows/v3/journal.d.ts +125 -7
- package/dist/workflows/v3/journal.d.ts.map +1 -1
- package/dist/workflows/v3/journal.js +154 -38
- package/dist/workflows/v3/journal.js.map +1 -1
- package/dist/workflows/v3/library-materialize.d.ts +88 -0
- package/dist/workflows/v3/library-materialize.d.ts.map +1 -0
- package/dist/workflows/v3/library-materialize.js +294 -0
- package/dist/workflows/v3/library-materialize.js.map +1 -0
- package/dist/workflows/v3/library-schema.d.ts +138 -0
- package/dist/workflows/v3/library-schema.d.ts.map +1 -0
- package/dist/workflows/v3/library-schema.js +573 -0
- package/dist/workflows/v3/library-schema.js.map +1 -0
- package/dist/workflows/v3/library-service.d.ts +126 -0
- package/dist/workflows/v3/library-service.d.ts.map +1 -0
- package/dist/workflows/v3/library-service.js +542 -0
- package/dist/workflows/v3/library-service.js.map +1 -0
- package/dist/workflows/v3/library-store.d.ts +124 -0
- package/dist/workflows/v3/library-store.d.ts.map +1 -0
- package/dist/workflows/v3/library-store.js +665 -0
- package/dist/workflows/v3/library-store.js.map +1 -0
- package/dist/workflows/v3/orchestrator.d.ts +9 -1
- package/dist/workflows/v3/orchestrator.d.ts.map +1 -1
- package/dist/workflows/v3/orchestrator.js +2 -1
- package/dist/workflows/v3/orchestrator.js.map +1 -1
- package/dist/workflows/v3/progress-projection.d.ts +99 -0
- package/dist/workflows/v3/progress-projection.d.ts.map +1 -0
- package/dist/workflows/v3/progress-projection.js +197 -0
- package/dist/workflows/v3/progress-projection.js.map +1 -0
- package/dist/workflows/v3/run-envelope.d.ts +1279 -0
- package/dist/workflows/v3/run-envelope.d.ts.map +1 -0
- package/dist/workflows/v3/run-envelope.js +681 -0
- package/dist/workflows/v3/run-envelope.js.map +1 -0
- package/dist/workflows/v3/runtime.d.ts +39 -7
- package/dist/workflows/v3/runtime.d.ts.map +1 -1
- package/dist/workflows/v3/runtime.js +1992 -100
- package/dist/workflows/v3/runtime.js.map +1 -1
- package/dist/workflows/v3/session-relay-client.d.ts +61 -0
- package/dist/workflows/v3/session-relay-client.d.ts.map +1 -0
- package/dist/workflows/v3/session-relay-client.js +92 -0
- package/dist/workflows/v3/session-relay-client.js.map +1 -0
- package/dist/workflows/v3/session-relay.d.ts +66 -0
- package/dist/workflows/v3/session-relay.d.ts.map +1 -0
- package/dist/workflows/v3/session-relay.js +157 -0
- package/dist/workflows/v3/session-relay.js.map +1 -0
- package/dist/workflows/v3/start-intent.d.ts +8 -0
- package/dist/workflows/v3/start-intent.d.ts.map +1 -0
- package/dist/workflows/v3/start-intent.js +34 -0
- package/dist/workflows/v3/start-intent.js.map +1 -0
- package/dist/workflows/v3/state.d.ts +11 -2
- package/dist/workflows/v3/state.d.ts.map +1 -1
- package/dist/workflows/v3/state.js +182 -10
- package/dist/workflows/v3/state.js.map +1 -1
- package/dist/workflows/v3/template-bindings.d.ts +22 -0
- package/dist/workflows/v3/template-bindings.d.ts.map +1 -0
- package/dist/workflows/v3/template-bindings.js +204 -0
- package/dist/workflows/v3/template-bindings.js.map +1 -0
- package/dist/workflows/v3/worker-fence.d.ts +158 -0
- package/dist/workflows/v3/worker-fence.d.ts.map +1 -0
- package/dist/workflows/v3/worker-fence.js +685 -0
- package/dist/workflows/v3/worker-fence.js.map +1 -0
- package/package.json +3 -2
- package/dist/core/dashboard-command/workflows.d.ts +0 -20
- package/dist/core/dashboard-command/workflows.d.ts.map +0 -1
- package/dist/core/dashboard-command/workflows.js +0 -45
- package/dist/core/dashboard-command/workflows.js.map +0 -1
- package/dist/dashboard/web/legacy-workflow-link.d.ts +0 -2
- package/dist/dashboard/web/legacy-workflow-link.d.ts.map +0 -1
- package/dist/dashboard/web/legacy-workflow-link.js +0 -12
- package/dist/dashboard/web/legacy-workflow-link.js.map +0 -1
- package/dist/dashboard/web/legacy-workflow-page.d.ts +0 -3
- package/dist/dashboard/web/legacy-workflow-page.d.ts.map +0 -1
- package/dist/dashboard/web/legacy-workflow-page.js +0 -717
- package/dist/dashboard/web/legacy-workflow-page.js.map +0 -1
- package/dist/dashboard/web/workflow-version-switch.d.ts +0 -8
- package/dist/dashboard/web/workflow-version-switch.d.ts.map +0 -1
- package/dist/dashboard/web/workflow-version-switch.js +0 -9
- package/dist/dashboard/web/workflow-version-switch.js.map +0 -1
- package/dist/dashboard/web/workflows.d.ts +0 -273
- package/dist/dashboard/web/workflows.d.ts.map +0 -1
- package/dist/dashboard/web/workflows.js +0 -436
- package/dist/dashboard/web/workflows.js.map +0 -1
- package/dist/dashboard/workflow-api.d.ts +0 -30
- package/dist/dashboard/workflow-api.d.ts.map +0 -1
- package/dist/dashboard/workflow-api.js +0 -397
- package/dist/dashboard/workflow-api.js.map +0 -1
- package/dist/dashboard/workflow-card-model.d.ts +0 -127
- package/dist/dashboard/workflow-card-model.d.ts.map +0 -1
- package/dist/dashboard/workflow-card-model.js +0 -186
- package/dist/dashboard/workflow-card-model.js.map +0 -1
- package/dist/dashboard/workflows-action-helpers.d.ts +0 -105
- package/dist/dashboard/workflows-action-helpers.d.ts.map +0 -1
- package/dist/dashboard/workflows-action-helpers.js +0 -196
- package/dist/dashboard/workflows-action-helpers.js.map +0 -1
- package/dist/dashboard-web/chunks/bot-defaults-page-7T7DPOV6.js +0 -4
- package/dist/dashboard-web/chunks/chunk-IGXYYRYJ.js +0 -1
- package/dist/dashboard-web/chunks/chunk-ISOD7VDX.js +0 -1
- package/dist/dashboard-web/chunks/chunk-PNK3HQBI.js +0 -37
- package/dist/dashboard-web/chunks/chunk-SRIE4MLQ.js +0 -1
- package/dist/dashboard-web/chunks/connectors-page-UQ4QBE45.js +0 -1
- package/dist/dashboard-web/chunks/legacy-workflow-page-QMC7OZXH.js +0 -2
- package/dist/dashboard-web/chunks/sessions-page-NNZIDHZM.js +0 -3
- package/dist/dashboard-web/chunks/settings-page-LJIXX5LQ.js +0 -2
- package/dist/dashboard-web/chunks/v3-page-YLYVHGKD.js +0 -94
- package/dist/dashboard-web/terminal-replay.html +0 -227
- package/dist/im/lark/workflow-card-handler.d.ts +0 -51
- package/dist/im/lark/workflow-card-handler.d.ts.map +0 -1
- package/dist/im/lark/workflow-card-handler.js +0 -163
- package/dist/im/lark/workflow-card-handler.js.map +0 -1
- package/dist/im/lark/workflow-cards.d.ts +0 -47
- package/dist/im/lark/workflow-cards.d.ts.map +0 -1
- package/dist/im/lark/workflow-cards.js +0 -231
- package/dist/im/lark/workflow-cards.js.map +0 -1
- package/dist/im/lark/workflow-progress-card.d.ts +0 -81
- package/dist/im/lark/workflow-progress-card.d.ts.map +0 -1
- package/dist/im/lark/workflow-progress-card.js +0 -336
- package/dist/im/lark/workflow-progress-card.js.map +0 -1
- package/dist/im/lark/workflows-card.d.ts +0 -102
- package/dist/im/lark/workflows-card.d.ts.map +0 -1
- package/dist/im/lark/workflows-card.js +0 -737
- package/dist/im/lark/workflows-card.js.map +0 -1
- package/dist/workflows/attempt-resume.d.ts +0 -119
- package/dist/workflows/attempt-resume.d.ts.map +0 -1
- package/dist/workflows/attempt-resume.js +0 -392
- package/dist/workflows/attempt-resume.js.map +0 -1
- package/dist/workflows/blob.d.ts +0 -27
- package/dist/workflows/blob.d.ts.map +0 -1
- package/dist/workflows/blob.js +0 -40
- package/dist/workflows/blob.js.map +0 -1
- package/dist/workflows/cancel-run.d.ts +0 -45
- package/dist/workflows/cancel-run.d.ts.map +0 -1
- package/dist/workflows/cancel-run.js +0 -99
- package/dist/workflows/cancel-run.js.map +0 -1
- package/dist/workflows/cancel.d.ts +0 -111
- package/dist/workflows/cancel.d.ts.map +0 -1
- package/dist/workflows/cancel.js +0 -120
- package/dist/workflows/cancel.js.map +0 -1
- package/dist/workflows/catalog.d.ts +0 -60
- package/dist/workflows/catalog.d.ts.map +0 -1
- package/dist/workflows/catalog.js +0 -119
- package/dist/workflows/catalog.js.map +0 -1
- package/dist/workflows/cold-attach.d.ts +0 -30
- package/dist/workflows/cold-attach.d.ts.map +0 -1
- package/dist/workflows/cold-attach.js +0 -40
- package/dist/workflows/cold-attach.js.map +0 -1
- package/dist/workflows/cold-scan.d.ts +0 -21
- package/dist/workflows/cold-scan.d.ts.map +0 -1
- package/dist/workflows/cold-scan.js +0 -70
- package/dist/workflows/cold-scan.js.map +0 -1
- package/dist/workflows/daemon-spawn.d.ts +0 -119
- package/dist/workflows/daemon-spawn.d.ts.map +0 -1
- package/dist/workflows/daemon-spawn.js +0 -564
- package/dist/workflows/daemon-spawn.js.map +0 -1
- package/dist/workflows/effect-input.d.ts +0 -4
- package/dist/workflows/effect-input.d.ts.map +0 -1
- package/dist/workflows/effect-input.js +0 -19
- package/dist/workflows/effect-input.js.map +0 -1
- package/dist/workflows/events/append.d.ts +0 -77
- package/dist/workflows/events/append.d.ts.map +0 -1
- package/dist/workflows/events/append.js +0 -214
- package/dist/workflows/events/append.js.map +0 -1
- package/dist/workflows/events/idempotency.d.ts +0 -77
- package/dist/workflows/events/idempotency.d.ts.map +0 -1
- package/dist/workflows/events/idempotency.js +0 -116
- package/dist/workflows/events/idempotency.js.map +0 -1
- package/dist/workflows/events/index.d.ts +0 -7
- package/dist/workflows/events/index.d.ts.map +0 -1
- package/dist/workflows/events/index.js +0 -7
- package/dist/workflows/events/index.js.map +0 -1
- package/dist/workflows/fanout.d.ts +0 -36
- package/dist/workflows/fanout.d.ts.map +0 -1
- package/dist/workflows/fanout.js +0 -115
- package/dist/workflows/fanout.js.map +0 -1
- package/dist/workflows/hostExecutors/protocol.d.ts +0 -42
- package/dist/workflows/hostExecutors/protocol.d.ts.map +0 -1
- package/dist/workflows/hostExecutors/protocol.js +0 -181
- package/dist/workflows/hostExecutors/protocol.js.map +0 -1
- package/dist/workflows/loader.d.ts +0 -30
- package/dist/workflows/loader.d.ts.map +0 -1
- package/dist/workflows/loader.js +0 -84
- package/dist/workflows/loader.js.map +0 -1
- package/dist/workflows/loop.d.ts +0 -50
- package/dist/workflows/loop.d.ts.map +0 -1
- package/dist/workflows/loop.js +0 -408
- package/dist/workflows/loop.js.map +0 -1
- package/dist/workflows/orchestrator.d.ts +0 -171
- package/dist/workflows/orchestrator.d.ts.map +0 -1
- package/dist/workflows/orchestrator.js +0 -609
- package/dist/workflows/orchestrator.js.map +0 -1
- package/dist/workflows/output-binding.d.ts +0 -77
- package/dist/workflows/output-binding.d.ts.map +0 -1
- package/dist/workflows/output-binding.js +0 -329
- package/dist/workflows/output-binding.js.map +0 -1
- package/dist/workflows/params.d.ts.map +0 -1
- package/dist/workflows/params.js.map +0 -1
- package/dist/workflows/resume.d.ts +0 -263
- package/dist/workflows/resume.d.ts.map +0 -1
- package/dist/workflows/resume.js +0 -808
- package/dist/workflows/resume.js.map +0 -1
- package/dist/workflows/run-id.d.ts +0 -2
- package/dist/workflows/run-id.d.ts.map +0 -1
- package/dist/workflows/run-id.js +0 -7
- package/dist/workflows/run-id.js.map +0 -1
- package/dist/workflows/run-init.d.ts +0 -48
- package/dist/workflows/run-init.d.ts.map +0 -1
- package/dist/workflows/run-init.js +0 -100
- package/dist/workflows/run-init.js.map +0 -1
- package/dist/workflows/runs-dir.d.ts +0 -4
- package/dist/workflows/runs-dir.d.ts.map +0 -1
- package/dist/workflows/runs-dir.js +0 -15
- package/dist/workflows/runs-dir.js.map +0 -1
- package/dist/workflows/runtime.d.ts +0 -215
- package/dist/workflows/runtime.d.ts.map +0 -1
- package/dist/workflows/runtime.js +0 -630
- package/dist/workflows/runtime.js.map +0 -1
- package/dist/workflows/spawn-bot.d.ts +0 -165
- package/dist/workflows/spawn-bot.d.ts.map +0 -1
- package/dist/workflows/spawn-bot.js +0 -215
- package/dist/workflows/spawn-bot.js.map +0 -1
- package/dist/workflows/spawn-policy.d.ts.map +0 -1
- package/dist/workflows/spawn-policy.js.map +0 -1
- package/dist/workflows/system.d.ts +0 -49
- package/dist/workflows/system.d.ts.map +0 -1
- package/dist/workflows/system.js +0 -48
- package/dist/workflows/system.js.map +0 -1
- package/dist/workflows/trigger-from-envelope.d.ts +0 -13
- package/dist/workflows/trigger-from-envelope.d.ts.map +0 -1
- package/dist/workflows/trigger-from-envelope.js +0 -68
- package/dist/workflows/trigger-from-envelope.js.map +0 -1
- package/dist/workflows/trigger-run.d.ts +0 -70
- package/dist/workflows/trigger-run.d.ts.map +0 -1
- package/dist/workflows/trigger-run.js +0 -88
- package/dist/workflows/trigger-run.js.map +0 -1
- package/dist/workflows/wait.d.ts +0 -141
- package/dist/workflows/wait.d.ts.map +0 -1
- package/dist/workflows/wait.js +0 -203
- package/dist/workflows/wait.js.map +0 -1
package/dist/core/worker-pool.js
CHANGED
|
@@ -28,6 +28,7 @@ import { botLocale, localeForBot, t as tr } from '../i18n/index.js';
|
|
|
28
28
|
import { claudeJsonlPathForSession } from '../adapters/cli/claude-code.js';
|
|
29
29
|
import { findUniqueClaudeSessionByCwd } from './session-discovery.js';
|
|
30
30
|
import { buildMarkdownCard, buildContextualReplyCard } from '../im/lark/md-card.js';
|
|
31
|
+
import { renderBrandTemplate } from '../im/lark/brand-template.js';
|
|
31
32
|
import { replyToDocComment, chunkCommentText, unsubscribeDocFile, removeCommentReaction } from '../im/lark/doc-comment.js';
|
|
32
33
|
import { listDocSubscriptionsForSession, removeDocSubscription } from '../services/doc-subs-store.js';
|
|
33
34
|
import { TmuxBackend } from '../adapters/backend/tmux-backend.js';
|
|
@@ -39,6 +40,9 @@ import { getBot, getAllBots, resolveBrandLabel } from '../bot-registry.js';
|
|
|
39
40
|
* isolated persistent panes so a suspend→resume reattach (same id) is
|
|
40
41
|
* distinguishable from a pane surviving a daemon restart (different id). */
|
|
41
42
|
const DAEMON_BOOT_ID = randomUUID();
|
|
43
|
+
export function getDaemonBootId() {
|
|
44
|
+
return DAEMON_BOOT_ID;
|
|
45
|
+
}
|
|
42
46
|
function daemonCardLocalHomeLinkMode(ds) {
|
|
43
47
|
// The daemon is outside file/read isolation. Never use its host namespace
|
|
44
48
|
// to disambiguate isolated or remote output; lexical repair performs no
|
|
@@ -62,11 +66,15 @@ import { emitSessionLifecycleHook, emitSessionStateTransitionHook } from '../ser
|
|
|
62
66
|
import { anchorUsageForDaemonSession, recordOwnershipForDaemonSession, recordUsageForDaemonSession, reconcileUsageForDaemonSession } from '../services/usage-ledger.js';
|
|
63
67
|
import { isStructuredBridgeAdoptCli } from '../services/structured-bridge-clis.js';
|
|
64
68
|
import { ensureGatewayEntry } from './plugins/mcp/gateway-installer.js';
|
|
65
|
-
import { sessionKey, sessionAnchorId, isDocNativeSession } from './types.js';
|
|
69
|
+
import { activeSessionKey, sessionKey, sessionAnchorId, isDocNativeSession } from './types.js';
|
|
66
70
|
import { DONE_REACTION_EMOJI_TYPE } from './pending-response.js';
|
|
67
71
|
import { buildTerminalUrl } from './terminal-url.js';
|
|
68
72
|
import { prependBotmuxBin } from './botmux-wrapper.js';
|
|
69
73
|
import { usageLimitStateKey } from '../utils/cli-usage-limit.js';
|
|
74
|
+
import { evaluateVcMeetingManagedSend, resolveVcMeetingImTurnOrigin, } from '../services/vc-meeting-send-policy.js';
|
|
75
|
+
import { finishVcMeetingImReply, prepareVcMeetingDeliveryReply, prepareVcMeetingImReply, } from '../services/vc-meeting-im-reply.js';
|
|
76
|
+
import { neutralizeLarkAtTags } from '../services/send-policy.js';
|
|
77
|
+
import { recordVcMeetingListenerMessage } from '../services/vc-meeting-listener-message-store.js';
|
|
70
78
|
import { isLocalCliOpenEnabled, isLocalCliOpenReady } from '../services/local-cli-opener.js';
|
|
71
79
|
const __filename = fileURLToPath(import.meta.url);
|
|
72
80
|
const __dirname = dirname(__filename);
|
|
@@ -365,6 +373,11 @@ export function cardUsageLimit(ds) {
|
|
|
365
373
|
return ds.lastScreenStatus === 'limited' ? ds.usageLimit : undefined;
|
|
366
374
|
}
|
|
367
375
|
function scheduleUsageLimitCardPatch(ds) {
|
|
376
|
+
// Dedicated VC receivers keep limit state for dashboard/audit only. A timer
|
|
377
|
+
// must never revive or mutate an old/manual Lark card after the synchronous
|
|
378
|
+
// screen_update path has already suppressed auxiliary UI.
|
|
379
|
+
if (ds.session.vcMeetingReceiver)
|
|
380
|
+
return;
|
|
368
381
|
if (ds.lastScreenStatus !== 'limited')
|
|
369
382
|
return;
|
|
370
383
|
const port = ds.workerPort ?? ds.session.webPort;
|
|
@@ -520,6 +533,10 @@ export function recallFrozenCards(ds) {
|
|
|
520
533
|
* that so the card keeps live-patching afterwards even when the bot opted out.
|
|
521
534
|
*/
|
|
522
535
|
export async function postFreshStreamingCard(ds, sessionReply) {
|
|
536
|
+
// Receiver terminals can contain meeting-derived private context. Never
|
|
537
|
+
// publish one into the listener chat as a streaming-card side channel.
|
|
538
|
+
if (ds.session.vcMeetingReceiver)
|
|
539
|
+
return false;
|
|
523
540
|
if (isDocNativeSession(ds))
|
|
524
541
|
return false;
|
|
525
542
|
const port = ds.workerPort ?? ds.session.webPort;
|
|
@@ -1006,6 +1023,11 @@ export function ensureClaudeFolderTrust(workingDir, stateJsonPath = join(homedir
|
|
|
1006
1023
|
// ─── Kill worker ────────────────────────────────────────────────────────────
|
|
1007
1024
|
export function killWorker(ds) {
|
|
1008
1025
|
clearUsageLimitState(ds);
|
|
1026
|
+
// A managed-turn capability belongs to one concrete worker generation.
|
|
1027
|
+
// Retiring (or observing the absence of) that generation must revoke the
|
|
1028
|
+
// daemon-side copy synchronously; the worker may never get a chance to send
|
|
1029
|
+
// its ordered revoke IPC on close/crash paths.
|
|
1030
|
+
ds.managedTurnOrigin = undefined;
|
|
1009
1031
|
if (!ds.worker || ds.worker.killed) {
|
|
1010
1032
|
// No live worker to receive {type:'close'}, so its destroySession() — which
|
|
1011
1033
|
// tears down the persistent backing session (tmux/herdr/zellij) — never
|
|
@@ -1030,6 +1052,7 @@ export function killWorker(ds) {
|
|
|
1030
1052
|
ds.worker = null;
|
|
1031
1053
|
ds.workerPort = null;
|
|
1032
1054
|
ds.workerToken = null;
|
|
1055
|
+
ds.workerViewToken = null;
|
|
1033
1056
|
}
|
|
1034
1057
|
/**
|
|
1035
1058
|
* Tear down a persistent backing session (tmux/herdr/zellij) directly from the
|
|
@@ -1098,8 +1121,11 @@ function reclaimParkedCrashDiagnostic(ds) {
|
|
|
1098
1121
|
catch { /* absent — benign */ }
|
|
1099
1122
|
}
|
|
1100
1123
|
export function suspendWorker(ds, reason = 'suspended_idle') {
|
|
1101
|
-
if (!ds.worker || ds.worker.killed)
|
|
1124
|
+
if (!ds.worker || ds.worker.killed) {
|
|
1125
|
+
// There is no live generation that can still own this capability.
|
|
1126
|
+
ds.managedTurnOrigin = undefined;
|
|
1102
1127
|
return false;
|
|
1128
|
+
}
|
|
1103
1129
|
if (!isSuspendableBackendType(ds.initConfig?.backendType))
|
|
1104
1130
|
return false;
|
|
1105
1131
|
const w = ds.worker;
|
|
@@ -1116,6 +1142,8 @@ export function suspendWorker(ds, reason = 'suspended_idle') {
|
|
|
1116
1142
|
ds.worker = null;
|
|
1117
1143
|
ds.workerPort = null;
|
|
1118
1144
|
ds.workerToken = null;
|
|
1145
|
+
ds.workerViewToken = null;
|
|
1146
|
+
ds.managedTurnOrigin = undefined;
|
|
1119
1147
|
// Screen state describes the process we just stopped. Keeping it would make
|
|
1120
1148
|
// the dashboard hydrate this process-less logical session as idle/working.
|
|
1121
1149
|
ds.lastScreenStatus = undefined;
|
|
@@ -1212,7 +1240,7 @@ export async function closeSession(sessionId) {
|
|
|
1212
1240
|
catch (err) {
|
|
1213
1241
|
logger.warn(`[doc-comment] cleanup on close failed for ${sessionId.slice(0, 8)}: ${err?.message ?? err}`);
|
|
1214
1242
|
}
|
|
1215
|
-
activeSessionsRegistry?.delete(
|
|
1243
|
+
activeSessionsRegistry?.delete(activeSessionKey(ds));
|
|
1216
1244
|
killedLive = true;
|
|
1217
1245
|
if (!ds.exitEventEmitted) {
|
|
1218
1246
|
ds.exitEventEmitted = true;
|
|
@@ -1341,6 +1369,8 @@ targetScope, opts) {
|
|
|
1341
1369
|
const ds = findActiveBySessionId(sessionId);
|
|
1342
1370
|
if (!ds)
|
|
1343
1371
|
return { ok: false, error: 'session_not_active' };
|
|
1372
|
+
if (ds.session.vcMeetingReceiver)
|
|
1373
|
+
return { ok: false, error: 'vc_receiver_not_relayable' };
|
|
1344
1374
|
// Anchor-based identity. A thread-scope session in the SAME chat (different
|
|
1345
1375
|
// root) is a legitimate cross-topic move, so we refuse only when the target
|
|
1346
1376
|
// anchor equals the source anchor (relaying a session onto itself). Replaces
|
|
@@ -1525,16 +1555,21 @@ function codexAppInputForSession(ds, input, turnId) {
|
|
|
1525
1555
|
/** Send one normal (non-raw) worker turn while applying the per-bot Codex App
|
|
1526
1556
|
* clean-input gate at message acceptance time. This freezes the sidecar onto
|
|
1527
1557
|
* the IPC item, so later config flips do not mutate an already queued turn. */
|
|
1528
|
-
export function sendWorkerInput(ds, payload, turnId) {
|
|
1558
|
+
export function sendWorkerInput(ds, payload, turnId, opts = {}) {
|
|
1529
1559
|
if (!ds.worker || ds.worker.killed)
|
|
1530
1560
|
return false;
|
|
1531
1561
|
const normalized = typeof payload === 'string' ? { content: payload } : payload;
|
|
1532
1562
|
const codexAppInput = codexAppInputForSession(ds, normalized.codexAppInput, turnId);
|
|
1563
|
+
const vcMeetingImTurnOrigin = resolveVcMeetingImTurnOrigin(ds.session, turnId);
|
|
1533
1564
|
ds.worker.send({
|
|
1534
1565
|
type: 'message',
|
|
1535
1566
|
content: normalized.content,
|
|
1536
1567
|
...(codexAppInput ? { codexAppInput } : {}),
|
|
1537
1568
|
...(turnId ? { turnId } : {}),
|
|
1569
|
+
...(opts.dispatchAttempt !== undefined ? { dispatchAttempt: opts.dispatchAttempt } : {}),
|
|
1570
|
+
...(vcMeetingImTurnOrigin
|
|
1571
|
+
? { vcMeetingImTurnOrigin }
|
|
1572
|
+
: {}),
|
|
1538
1573
|
});
|
|
1539
1574
|
return true;
|
|
1540
1575
|
}
|
|
@@ -1559,16 +1594,26 @@ export function forkWorker(ds, promptInput, resumeOrTurnId = false) {
|
|
|
1559
1594
|
const t = tag(ds);
|
|
1560
1595
|
let resume = false;
|
|
1561
1596
|
let initTurnId;
|
|
1597
|
+
let initDispatchAttempt;
|
|
1562
1598
|
if (typeof resumeOrTurnId === 'string') {
|
|
1563
1599
|
initTurnId = resumeOrTurnId;
|
|
1564
1600
|
}
|
|
1565
1601
|
else if (typeof resumeOrTurnId === 'object' && resumeOrTurnId !== null) {
|
|
1566
1602
|
resume = resumeOrTurnId.resume === true;
|
|
1567
1603
|
initTurnId = resumeOrTurnId.turnId;
|
|
1604
|
+
initDispatchAttempt = resumeOrTurnId.dispatchAttempt;
|
|
1568
1605
|
}
|
|
1569
1606
|
else {
|
|
1570
1607
|
resume = resumeOrTurnId;
|
|
1571
1608
|
}
|
|
1609
|
+
// An empty prompt is a pure worker reattach/restore, not a newly accepted
|
|
1610
|
+
// user turn. Never inherit the previous reply target in that case: doing so
|
|
1611
|
+
// would re-publish stale per-turn authority (notably an explicit meeting IM
|
|
1612
|
+
// origin) into a fresh worker lifetime after a daemon restart. Non-empty
|
|
1613
|
+
// prompts keep the historical fallback for callers that accepted a turn
|
|
1614
|
+
// before they learned to pass its id explicitly.
|
|
1615
|
+
const initAttributionTurnId = initTurnId
|
|
1616
|
+
?? (prompt.length > 0 ? ds.currentReplyTarget?.turnId : undefined);
|
|
1572
1617
|
// A fork() whose cwd no longer exists emits an unhandled 'error' (spawn
|
|
1573
1618
|
// ENOENT) that crashes the WHOLE daemon (→ pm2 crash-loop). Fall back to
|
|
1574
1619
|
// home so a stale session workingDir can never take the daemon down.
|
|
@@ -1637,6 +1682,8 @@ export function forkWorker(ds, promptInput, resumeOrTurnId = false) {
|
|
|
1637
1682
|
ds.worker = null;
|
|
1638
1683
|
ds.workerPort = null;
|
|
1639
1684
|
ds.workerToken = null;
|
|
1685
|
+
ds.workerViewToken = null;
|
|
1686
|
+
ds.managedTurnOrigin = undefined;
|
|
1640
1687
|
}
|
|
1641
1688
|
// Re-establishing a worker ends the cold-resume-suspended state: clear the
|
|
1642
1689
|
// persisted marker so a future restart no longer treats this session's
|
|
@@ -1680,7 +1727,9 @@ export function forkWorker(ds, promptInput, resumeOrTurnId = false) {
|
|
|
1680
1727
|
LARK_APP_SECRET: botCfg.larkAppSecret,
|
|
1681
1728
|
},
|
|
1682
1729
|
});
|
|
1683
|
-
const startupState = {
|
|
1730
|
+
const startupState = {
|
|
1731
|
+
ready: false, failureNotified: false, initTurnId, initDispatchAttempt,
|
|
1732
|
+
};
|
|
1684
1733
|
// A fork-level failure (spawn ENOENT, etc.) emits 'error'; without a handler
|
|
1685
1734
|
// the unhandled event crashes the daemon. It also happens before worker IPC
|
|
1686
1735
|
// exists, so this daemon-side branch must be the user-visible fallback.
|
|
@@ -1690,13 +1739,23 @@ export function forkWorker(ds, promptInput, resumeOrTurnId = false) {
|
|
|
1690
1739
|
if (startupState.failureNotified)
|
|
1691
1740
|
return;
|
|
1692
1741
|
startupState.failureNotified = true;
|
|
1742
|
+
// A dedicated VC receiver has no auxiliary Lark output channel. Durable
|
|
1743
|
+
// failures stay on the receipt/lease chain, and exact IM turns may only
|
|
1744
|
+
// produce their ledgered final reply — never a fork diagnostic.
|
|
1745
|
+
if (ds.session.vcMeetingReceiver) {
|
|
1746
|
+
logger.info(`[${t}] VC receiver fork failure kept out of auxiliary Lark UI `
|
|
1747
|
+
+ `turn=${initTurnId?.slice(0, 12) ?? '-'} attempt=${initDispatchAttempt}: ${reason}`);
|
|
1748
|
+
return;
|
|
1749
|
+
}
|
|
1693
1750
|
const cliName = getCliDisplayName(agentCfg.cliId);
|
|
1694
1751
|
const message = tr('worker.start_failed', { cliName, reason }, botLocale(botCfg));
|
|
1695
1752
|
emitSessionLifecycleHook(ds, 'session.requires_attention', {
|
|
1696
1753
|
reason: 'worker_fork_error',
|
|
1697
1754
|
message: reason,
|
|
1698
1755
|
});
|
|
1699
|
-
void cb.sessionReply(sessionAnchorId(ds), message, 'text', ds.larkAppId, fallbackTurnId(ds, initTurnId)
|
|
1756
|
+
void cb.sessionReply(sessionAnchorId(ds), message, 'text', ds.larkAppId, fallbackTurnId(ds, initTurnId), ds.session.vcMeetingReceiver
|
|
1757
|
+
? { sourceSessionId: ds.session.sessionId }
|
|
1758
|
+
: undefined).catch(replyErr => logger.error(`[${t}] Failed to deliver worker fork error to Lark: ${replyErr}`));
|
|
1700
1759
|
});
|
|
1701
1760
|
// Pipe worker stdout/stderr to daemon logger.
|
|
1702
1761
|
// Both go through logger.info → daemon.log (not error.log). Worker stderr
|
|
@@ -1717,11 +1776,12 @@ export function forkWorker(ds, promptInput, resumeOrTurnId = false) {
|
|
|
1717
1776
|
}
|
|
1718
1777
|
});
|
|
1719
1778
|
// Send init config — use per-bot settings
|
|
1720
|
-
const promptCodexAppInput = codexAppInputForSession(ds, promptPayload.codexAppInput,
|
|
1779
|
+
const promptCodexAppInput = codexAppInputForSession(ds, promptPayload.codexAppInput, initAttributionTurnId);
|
|
1721
1780
|
const initMsg = {
|
|
1722
1781
|
type: 'init',
|
|
1723
1782
|
sessionId: ds.session.sessionId,
|
|
1724
1783
|
chatId: ds.chatId,
|
|
1784
|
+
chatType: ds.chatType,
|
|
1725
1785
|
rootMessageId: sessionAnchorId(ds),
|
|
1726
1786
|
workingDir: cwd,
|
|
1727
1787
|
cliId: agentCfg.cliId,
|
|
@@ -1775,7 +1835,9 @@ export function forkWorker(ds, promptInput, resumeOrTurnId = false) {
|
|
|
1775
1835
|
botName: bot.botName,
|
|
1776
1836
|
botOpenId: bot.botOpenId,
|
|
1777
1837
|
locale: botLocale(botCfg),
|
|
1778
|
-
turnId:
|
|
1838
|
+
turnId: initAttributionTurnId,
|
|
1839
|
+
dispatchAttempt: initDispatchAttempt,
|
|
1840
|
+
vcMeetingImTurnOrigin: resolveVcMeetingImTurnOrigin(ds.session, initAttributionTurnId),
|
|
1779
1841
|
pluginBindings: botCfg.plugins,
|
|
1780
1842
|
skillPolicy: botCfg.skills,
|
|
1781
1843
|
};
|
|
@@ -1834,6 +1896,13 @@ export function forkWorker(ds, promptInput, resumeOrTurnId = false) {
|
|
|
1834
1896
|
function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureNotified: false }) {
|
|
1835
1897
|
const cb = requireCallbacks();
|
|
1836
1898
|
const t = tag(ds);
|
|
1899
|
+
const workerGeneration = (ds.workerGeneration ?? 0) + 1;
|
|
1900
|
+
ds.workerGeneration = workerGeneration;
|
|
1901
|
+
// Managed turn authority is issued by one concrete worker lifetime. A
|
|
1902
|
+
// replacement must advertise a fresh capability before daemon-mediated
|
|
1903
|
+
// exits may use it; carrying the old value across a restore/refork would
|
|
1904
|
+
// let stale per-turn authority escape its generation.
|
|
1905
|
+
ds.managedTurnOrigin = undefined;
|
|
1837
1906
|
// Source authorization belongs to one worker lifetime. A replacement worker
|
|
1838
1907
|
// must announce its own Hermes sources before any stamped final_output is
|
|
1839
1908
|
// trusted; `/clear` rebinds within the same lifetime accumulate afterwards.
|
|
@@ -1843,14 +1912,59 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
|
|
|
1843
1912
|
// Worker messages without a turn of their own (first streaming card, crash
|
|
1844
1913
|
// notices) anchor to the session's current reply-target turn so a shared
|
|
1845
1914
|
// fold-back topic keeps them in-thread instead of leaking top-level.
|
|
1846
|
-
const scopedReply = (content, msgType, turnId) => cb.sessionReply(sessionAnchorId(ds), content, msgType, ds.larkAppId, fallbackTurnId(ds, turnId)
|
|
1915
|
+
const scopedReply = (content, msgType, turnId, opts) => cb.sessionReply(sessionAnchorId(ds), content, msgType, ds.larkAppId, fallbackTurnId(ds, turnId), ds.session.vcMeetingReceiver
|
|
1916
|
+
? { ...opts, sourceSessionId: ds.session.sessionId }
|
|
1917
|
+
: opts);
|
|
1918
|
+
const ordinaryManagedSuppression = (turnId, dispatchAttempt) => {
|
|
1919
|
+
const armedThrough = turnId ? ds.suppressedFinalOutputTurns?.get(turnId) : undefined;
|
|
1920
|
+
return dispatchAttempt !== undefined
|
|
1921
|
+
&& armedThrough !== undefined
|
|
1922
|
+
&& dispatchAttempt <= armedThrough;
|
|
1923
|
+
};
|
|
1924
|
+
/** Auxiliary worker UI is never an authorized output channel for a dedicated
|
|
1925
|
+
* VC receiver. Dashboard/audit state is still updated before these guards. */
|
|
1926
|
+
const managedAuxUiSuppressed = (turnId, dispatchAttempt) => {
|
|
1927
|
+
if (ds.session.vcMeetingReceiver)
|
|
1928
|
+
return true;
|
|
1929
|
+
return ordinaryManagedSuppression(turnId, dispatchAttempt);
|
|
1930
|
+
};
|
|
1931
|
+
/** final_output is the sole exception: listener_thread and exact IM replies
|
|
1932
|
+
* may proceed into the durable action ledger; silent/stale attempts do not. */
|
|
1933
|
+
const managedFinalOutputSuppressed = (turnId, dispatchAttempt) => {
|
|
1934
|
+
if (!ds.session.vcMeetingReceiver) {
|
|
1935
|
+
return ordinaryManagedSuppression(turnId, dispatchAttempt);
|
|
1936
|
+
}
|
|
1937
|
+
// Resolve every Lark-facing worker event against durable origin state. The
|
|
1938
|
+
// receipt freezes responseMode, so terminal→idle updates and daemon restore
|
|
1939
|
+
// cannot become loud merely because an in-memory suppression map was
|
|
1940
|
+
// cleared/lost. Missing attribution on a dedicated receiver fails closed.
|
|
1941
|
+
const decision = evaluateVcMeetingManagedSend(config.session.dataDir, {
|
|
1942
|
+
receiverSessionId: ds.session.sessionId,
|
|
1943
|
+
receiverSession: true,
|
|
1944
|
+
turnId,
|
|
1945
|
+
dispatchAttempt,
|
|
1946
|
+
currentImTurnOrigin: resolveVcMeetingImTurnOrigin(ds.session, turnId),
|
|
1947
|
+
allowTerminalReceipt: true,
|
|
1948
|
+
});
|
|
1949
|
+
return !decision.ok;
|
|
1950
|
+
};
|
|
1847
1951
|
const bot = getBot(ds.larkAppId);
|
|
1848
1952
|
const botCfg = bot.config;
|
|
1849
1953
|
const loc = botLocale(botCfg);
|
|
1850
|
-
const notifyStartupFailure = async (reason, turnId) => {
|
|
1954
|
+
const notifyStartupFailure = async (reason, turnId, dispatchAttempt) => {
|
|
1851
1955
|
if (startupState.failureNotified)
|
|
1852
1956
|
return;
|
|
1853
1957
|
startupState.failureNotified = true;
|
|
1958
|
+
// A durable VC meeting delivery attempt must not surface its startup/relaunch
|
|
1959
|
+
// failure out-of-band. The worker-generation exit is fenced to the receipt
|
|
1960
|
+
// (marked ambiguous and retried under the side-effect boundary); a direct
|
|
1961
|
+
// sessionReply here would bypass that and could post on a silent delivery.
|
|
1962
|
+
// Ordinary IM turns and non-receiver sessions still notify exactly once.
|
|
1963
|
+
if (managedAuxUiSuppressed(turnId, dispatchAttempt)) {
|
|
1964
|
+
logger.info(`[${t}] VC receiver startup failure kept out of auxiliary Lark UI `
|
|
1965
|
+
+ `turn=${turnId?.slice(0, 12) ?? '-'} attempt=${dispatchAttempt}: ${reason}`);
|
|
1966
|
+
return;
|
|
1967
|
+
}
|
|
1854
1968
|
const cliName = getCliDisplayName(sessionCliId(ds, botCfg));
|
|
1855
1969
|
const message = tr('worker.start_failed', { cliName, reason }, loc);
|
|
1856
1970
|
emitSessionLifecycleHook(ds, 'session.requires_attention', {
|
|
@@ -1875,12 +1989,13 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
|
|
|
1875
1989
|
startupState.ready = true;
|
|
1876
1990
|
ds.workerPort = msg.port;
|
|
1877
1991
|
ds.workerToken = msg.token;
|
|
1992
|
+
ds.workerViewToken = msg.viewToken ?? null;
|
|
1878
1993
|
// Persist port so it can be reused after daemon restart
|
|
1879
1994
|
ds.session.webPort = msg.port;
|
|
1880
1995
|
sessionStore.updateSession(ds.session);
|
|
1881
1996
|
const readOnlyUrl = buildTerminalUrl(ds);
|
|
1882
1997
|
const writeUrl = buildTerminalUrl(ds, { write: true });
|
|
1883
|
-
logger.info(`[${t}] Worker ready, terminal at ${readOnlyUrl}`);
|
|
1998
|
+
logger.info(`[${t}] Worker ready, terminal at ${readOnlyUrl.replace(/\?.*$/, '?viewToken=[redacted]')}`);
|
|
1884
1999
|
if (ds.usageLimit) {
|
|
1885
2000
|
ds.lastScreenStatus = 'limited';
|
|
1886
2001
|
armUsageLimitRetryTimer(ds);
|
|
@@ -1893,6 +2008,10 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
|
|
|
1893
2008
|
patch: { webPort: msg.port },
|
|
1894
2009
|
},
|
|
1895
2010
|
});
|
|
2011
|
+
if (managedAuxUiSuppressed(msg.turnId, msg.dispatchAttempt)) {
|
|
2012
|
+
logger.info(`[${t}] Managed VC receiver — suppressing ready/streaming card output`);
|
|
2013
|
+
break;
|
|
2014
|
+
}
|
|
1896
2015
|
// Bot opted out of the streaming card: the terminal is up and the
|
|
1897
2016
|
// final answer will still arrive via `botmux send`; just don't post the
|
|
1898
2017
|
// live status card. (workerPort/token above are still set so the web
|
|
@@ -2096,7 +2215,9 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
|
|
|
2096
2215
|
// is known, so consumers exclude this session from native parsers
|
|
2097
2216
|
// before its first positive-delta record exists.
|
|
2098
2217
|
recordOwnershipForDaemonSession(ds);
|
|
2099
|
-
if (!
|
|
2218
|
+
if (!managedAuxUiSuppressed()
|
|
2219
|
+
&& !wasLocalCliOpenReady
|
|
2220
|
+
&& isLocalCliOpenReady(ds, { cliId: effectiveCliId })) {
|
|
2100
2221
|
scheduleLocalCliOpenReadinessPatch(ds);
|
|
2101
2222
|
}
|
|
2102
2223
|
break;
|
|
@@ -2151,6 +2272,8 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
|
|
|
2151
2272
|
queueMicrotask(cb.enforceLiveSessionCap);
|
|
2152
2273
|
}
|
|
2153
2274
|
}
|
|
2275
|
+
if (managedAuxUiSuppressed(msg.turnId, msg.dispatchAttempt))
|
|
2276
|
+
break;
|
|
2154
2277
|
// Bot opted out of the streaming card — dashboard SSE above already got
|
|
2155
2278
|
// the status patch; just don't touch any Lark card.
|
|
2156
2279
|
if (streamingCardDisabled(ds))
|
|
@@ -2232,6 +2355,8 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
|
|
|
2232
2355
|
content: ds.lastScreenContent ?? '',
|
|
2233
2356
|
});
|
|
2234
2357
|
persistStreamCardState(ds);
|
|
2358
|
+
if (managedAuxUiSuppressed())
|
|
2359
|
+
break;
|
|
2235
2360
|
if ((ds.displayMode ?? 'hidden') !== 'screenshot')
|
|
2236
2361
|
break;
|
|
2237
2362
|
if (!ds.streamCardId || ds.streamCardId === CARD_POSTING_SENTINEL || !ds.workerPort)
|
|
@@ -2269,6 +2394,10 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
|
|
|
2269
2394
|
// session.title; publishing this prompt description as `patch.title`
|
|
2270
2395
|
// would temporarily overwrite a user-issued /rename until refresh.
|
|
2271
2396
|
ds.currentTurnTitle = msg.description;
|
|
2397
|
+
if (managedAuxUiSuppressed(msg.turnId, msg.dispatchAttempt)) {
|
|
2398
|
+
logger.info(`[${t}] Managed VC receiver — TUI prompt kept in dashboard/audit only`);
|
|
2399
|
+
break;
|
|
2400
|
+
}
|
|
2272
2401
|
try {
|
|
2273
2402
|
const cardJson = buildTuiPromptCard(sessionAnchorId(ds), ds.session.sessionId, msg.description, msg.options, msg.multiSelect, undefined, loc);
|
|
2274
2403
|
const cardMsgId = await scopedReply(cardJson, 'interactive', msg.turnId);
|
|
@@ -2283,6 +2412,11 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
|
|
|
2283
2412
|
case 'tui_prompt_resolved': {
|
|
2284
2413
|
// TUI prompt is no longer showing — update card if it exists
|
|
2285
2414
|
logger.info(`[${t}] TUI prompt resolved${msg.selectedText ? `: ${msg.selectedText}` : ''}`);
|
|
2415
|
+
if (managedAuxUiSuppressed()) {
|
|
2416
|
+
ds.tuiPromptCardId = undefined;
|
|
2417
|
+
ds.tuiPromptOptions = undefined;
|
|
2418
|
+
break;
|
|
2419
|
+
}
|
|
2286
2420
|
if (ds.tuiPromptCardId) {
|
|
2287
2421
|
const resolvedCard = buildTuiPromptResolvedCard(msg.selectedText ?? tr('card.action.tui_done', undefined, loc), loc);
|
|
2288
2422
|
updateMessage(ds.larkAppId, ds.tuiPromptCardId, resolvedCard).catch(err => logger.debug(`[${t}] Failed to update TUI prompt card: ${err}`));
|
|
@@ -2293,13 +2427,33 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
|
|
|
2293
2427
|
break;
|
|
2294
2428
|
}
|
|
2295
2429
|
case 'claude_exit': {
|
|
2430
|
+
// CLI-generation authority must not outlive the concrete worker/CLI
|
|
2431
|
+
// pair that issued it. A delayed message from a replaced Node worker
|
|
2432
|
+
// must neither clear nor restart the replacement generation.
|
|
2433
|
+
if (ds.worker !== worker) {
|
|
2434
|
+
logger.warn(`[${t}] Ignored claude_exit from stale worker generation`);
|
|
2435
|
+
break;
|
|
2436
|
+
}
|
|
2437
|
+
ds.managedTurnOrigin = undefined;
|
|
2296
2438
|
logger.info(`[${t}] ${getCliDisplayName(effectiveCliId)} exited (code: ${msg.code}, signal: ${msg.signal})`);
|
|
2297
2439
|
ds.hasHistory = true;
|
|
2440
|
+
try {
|
|
2441
|
+
await cb.onCliExit?.(ds, {
|
|
2442
|
+
sessionId: ds.session.sessionId,
|
|
2443
|
+
workerGeneration,
|
|
2444
|
+
code: msg.code,
|
|
2445
|
+
signal: msg.signal,
|
|
2446
|
+
});
|
|
2447
|
+
}
|
|
2448
|
+
catch (err) {
|
|
2449
|
+
logger.error(`[${t}] Failed to reconcile CLI exit generation ${workerGeneration}: ${err.message}`);
|
|
2450
|
+
}
|
|
2451
|
+
const suppressExitUi = managedAuxUiSuppressed(msg.turnId, msg.dispatchAttempt);
|
|
2298
2452
|
// Do NOT auto-restart in adopt mode — there's nothing to restart
|
|
2299
2453
|
if (ds.adoptedFrom) {
|
|
2300
2454
|
logger.info(`[${t}] Adopted session ended`);
|
|
2301
2455
|
// Freeze the streaming card
|
|
2302
|
-
if (ds.streamCardId && (ds.workerPort || ds.riffAccessUrl)) {
|
|
2456
|
+
if (!suppressExitUi && ds.streamCardId && (ds.workerPort || ds.riffAccessUrl)) {
|
|
2303
2457
|
const readUrl = buildTerminalUrl(ds);
|
|
2304
2458
|
const turnTitle = ds.currentTurnTitle || ds.session.title || getCliDisplayName(effectiveCliId);
|
|
2305
2459
|
const frozenCard = buildStreamingCard(ds.session.sessionId, sessionAnchorId(ds), readUrl, turnTitle, ds.lastScreenContent ?? '', 'idle', effectiveCliId, ds.displayMode ?? 'hidden', ds.streamCardNonce, ds.currentImageKey, isAdopt, showTakeover, loc, undefined, writableTerminalLinkFor(ds), isLocalCliOpenReady(ds, { cliId: effectiveCliId }));
|
|
@@ -2311,7 +2465,7 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
|
|
|
2311
2465
|
// 不受影响" right before killing us, so another exit message here
|
|
2312
2466
|
// is just noise. Natural exits (user typed `exit`, CLI crashed)
|
|
2313
2467
|
// leave status='active' and still get the notice.
|
|
2314
|
-
if (ds.session.status !== 'closed') {
|
|
2468
|
+
if (!suppressExitUi && ds.session.status !== 'closed') {
|
|
2315
2469
|
try {
|
|
2316
2470
|
await scopedReply(tr('worker.adopted_session_exited', undefined, loc), 'text', undefined);
|
|
2317
2471
|
}
|
|
@@ -2334,7 +2488,7 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
|
|
|
2334
2488
|
// Freeze the last streaming card so it doesn't stay at "working" forever.
|
|
2335
2489
|
// 读链接严格要求 workerPort(riffAccessUrl 是写能力且 worker 退出后不清,
|
|
2336
2490
|
// 用它放行会构造 host:undefined 的坏读链接)。
|
|
2337
|
-
if (ds.streamCardId && ds.workerPort) {
|
|
2491
|
+
if (!suppressExitUi && ds.streamCardId && ds.workerPort) {
|
|
2338
2492
|
const readUrl = buildTerminalUrl(ds);
|
|
2339
2493
|
const turnTitle = ds.currentTurnTitle || ds.session.title || getCliDisplayName(effectiveCliId);
|
|
2340
2494
|
const frozenCard = buildStreamingCard(ds.session.sessionId, sessionAnchorId(ds), readUrl, turnTitle, ds.lastScreenContent ?? '', 'idle', effectiveCliId, ds.displayMode ?? 'hidden', ds.streamCardNonce, ds.currentImageKey, isAdopt, showTakeover, loc, undefined, writableTerminalLinkFor(ds), isLocalCliOpenReady(ds, { cliId: effectiveCliId }));
|
|
@@ -2370,13 +2524,15 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
|
|
|
2370
2524
|
if (msg.logTail?.trim()) {
|
|
2371
2525
|
parts.push(`${tr('worker.crash_recent_output', undefined, loc)}\n${msg.logTail.trim()}`);
|
|
2372
2526
|
}
|
|
2373
|
-
|
|
2374
|
-
|
|
2375
|
-
|
|
2376
|
-
|
|
2377
|
-
|
|
2378
|
-
|
|
2379
|
-
|
|
2527
|
+
if (!suppressExitUi) {
|
|
2528
|
+
try {
|
|
2529
|
+
await scopedReply(parts.join('\n\n'), 'text', undefined);
|
|
2530
|
+
}
|
|
2531
|
+
catch (replyErr) {
|
|
2532
|
+
if (replyErr instanceof MessageWithdrawnError) {
|
|
2533
|
+
logger.warn(`[${t}] Root message withdrawn, closing stale session`);
|
|
2534
|
+
cb.closeSession(ds);
|
|
2535
|
+
}
|
|
2380
2536
|
}
|
|
2381
2537
|
}
|
|
2382
2538
|
break;
|
|
@@ -2393,7 +2549,7 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
|
|
|
2393
2549
|
// `error` is a fatal launch-generation signal. It normally arrives
|
|
2394
2550
|
// during init, but can also follow a previously-ready worker whose CLI
|
|
2395
2551
|
// recovery/restart fails; that later failure must remain user-visible.
|
|
2396
|
-
await notifyStartupFailure(msg.message, msg.turnId);
|
|
2552
|
+
await notifyStartupFailure(msg.message, msg.turnId, msg.dispatchAttempt);
|
|
2397
2553
|
break;
|
|
2398
2554
|
}
|
|
2399
2555
|
case 'riff_access_url': {
|
|
@@ -2412,7 +2568,8 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
|
|
|
2412
2568
|
});
|
|
2413
2569
|
// Refresh the live streaming card (writable/AIO link) — parks a pending
|
|
2414
2570
|
// flag when the card POST is still in-flight and flushes once it lands.
|
|
2415
|
-
|
|
2571
|
+
if (!managedAuxUiSuppressed())
|
|
2572
|
+
scheduleRiffAccessUrlPatch(ds);
|
|
2416
2573
|
break;
|
|
2417
2574
|
}
|
|
2418
2575
|
case 'riff_task_id': {
|
|
@@ -2461,6 +2618,8 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
|
|
|
2461
2618
|
reason: 'user_notify',
|
|
2462
2619
|
message: msg.message,
|
|
2463
2620
|
});
|
|
2621
|
+
if (managedAuxUiSuppressed(msg.turnId, msg.dispatchAttempt))
|
|
2622
|
+
break;
|
|
2464
2623
|
try {
|
|
2465
2624
|
await scopedReply(msg.message, 'text', msg.turnId);
|
|
2466
2625
|
}
|
|
@@ -2469,6 +2628,104 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
|
|
|
2469
2628
|
}
|
|
2470
2629
|
break;
|
|
2471
2630
|
}
|
|
2631
|
+
case 'turn_terminal': {
|
|
2632
|
+
if (ds.worker !== worker) {
|
|
2633
|
+
logger.warn(`[${t}] Ignored turn_terminal from stale worker generation`);
|
|
2634
|
+
break;
|
|
2635
|
+
}
|
|
2636
|
+
if (msg.sessionId !== ds.session.sessionId) {
|
|
2637
|
+
logger.warn(`[${t}] Dropped turn_terminal with mismatched sessionId ` +
|
|
2638
|
+
`(worker=${msg.sessionId}, daemon=${ds.session.sessionId}, turn=${msg.turnId.substring(0, 8)})`);
|
|
2639
|
+
break;
|
|
2640
|
+
}
|
|
2641
|
+
// Defense in depth: the worker sends a token-matched revoke before the
|
|
2642
|
+
// terminal IPC, but an older/mixed worker must still lose authority at
|
|
2643
|
+
// this exact terminal edge. Tuple-match prevents a late turn N event
|
|
2644
|
+
// from clearing a capability already rotated for turn N+1.
|
|
2645
|
+
if (ds.managedTurnOrigin?.turnId === msg.turnId
|
|
2646
|
+
&& ds.managedTurnOrigin.dispatchAttempt === msg.dispatchAttempt) {
|
|
2647
|
+
ds.managedTurnOrigin = undefined;
|
|
2648
|
+
}
|
|
2649
|
+
try {
|
|
2650
|
+
await cb.onTurnTerminal?.(ds, msg, { workerGeneration });
|
|
2651
|
+
}
|
|
2652
|
+
catch (err) {
|
|
2653
|
+
// The durable receipt remains non-terminal and can be reconciled;
|
|
2654
|
+
// never let a projection/store failure crash the worker IPC loop.
|
|
2655
|
+
logger.error(`[${t}] Failed to persist turn_terminal for ${msg.turnId.substring(0, 8)}: ${err.message}`);
|
|
2656
|
+
}
|
|
2657
|
+
break;
|
|
2658
|
+
}
|
|
2659
|
+
case 'receiver_reset_ready': {
|
|
2660
|
+
if (msg.sessionId !== ds.session.sessionId) {
|
|
2661
|
+
logger.warn(`[${t}] Dropped receiver_reset_ready with mismatched sessionId`);
|
|
2662
|
+
break;
|
|
2663
|
+
}
|
|
2664
|
+
cb.onReceiverResetReady?.(ds, {
|
|
2665
|
+
sessionId: msg.sessionId,
|
|
2666
|
+
turnId: msg.turnId,
|
|
2667
|
+
dispatchAttempt: msg.dispatchAttempt,
|
|
2668
|
+
});
|
|
2669
|
+
break;
|
|
2670
|
+
}
|
|
2671
|
+
case 'durable_expiry_ready': {
|
|
2672
|
+
if (msg.sessionId !== ds.session.sessionId) {
|
|
2673
|
+
logger.warn(`[${t}] Dropped durable_expiry_ready with mismatched sessionId`);
|
|
2674
|
+
break;
|
|
2675
|
+
}
|
|
2676
|
+
cb.onDurableExpiryReady?.(ds, {
|
|
2677
|
+
sessionId: msg.sessionId,
|
|
2678
|
+
turnId: msg.turnId,
|
|
2679
|
+
dispatchAttempt: msg.dispatchAttempt,
|
|
2680
|
+
workerGeneration,
|
|
2681
|
+
disposition: msg.disposition,
|
|
2682
|
+
});
|
|
2683
|
+
break;
|
|
2684
|
+
}
|
|
2685
|
+
case 'managed_turn_origin': {
|
|
2686
|
+
if (ds.worker !== worker) {
|
|
2687
|
+
logger.warn(`[${t}] Ignored managed_turn_origin from stale worker generation`);
|
|
2688
|
+
break;
|
|
2689
|
+
}
|
|
2690
|
+
if (msg.sessionId !== ds.session.sessionId) {
|
|
2691
|
+
logger.warn(`[${t}] Dropped managed_turn_origin with mismatched sessionId`);
|
|
2692
|
+
break;
|
|
2693
|
+
}
|
|
2694
|
+
ds.managedTurnOrigin = {
|
|
2695
|
+
capability: msg.capability,
|
|
2696
|
+
...(msg.turnId ? { turnId: msg.turnId } : {}),
|
|
2697
|
+
...(msg.dispatchAttempt !== undefined
|
|
2698
|
+
? { dispatchAttempt: msg.dispatchAttempt }
|
|
2699
|
+
: {}),
|
|
2700
|
+
};
|
|
2701
|
+
break;
|
|
2702
|
+
}
|
|
2703
|
+
case 'managed_turn_origin_revoked': {
|
|
2704
|
+
if (ds.worker !== worker) {
|
|
2705
|
+
logger.warn(`[${t}] Ignored managed_turn_origin_revoked from stale worker generation`);
|
|
2706
|
+
break;
|
|
2707
|
+
}
|
|
2708
|
+
if (msg.sessionId !== ds.session.sessionId) {
|
|
2709
|
+
logger.warn(`[${t}] Dropped managed_turn_origin_revoked with mismatched sessionId`);
|
|
2710
|
+
break;
|
|
2711
|
+
}
|
|
2712
|
+
// Same-worker IPC is ordered, but token-match as well so a delayed
|
|
2713
|
+
// revoke can never clear authority already rotated by the next turn.
|
|
2714
|
+
if (msg.capability
|
|
2715
|
+
&& ds.managedTurnOrigin?.capability
|
|
2716
|
+
&& ds.managedTurnOrigin.capability !== msg.capability) {
|
|
2717
|
+
logger.warn(`[${t}] Ignored stale managed turn origin revoke after capability rotation`);
|
|
2718
|
+
break;
|
|
2719
|
+
}
|
|
2720
|
+
if (!msg.capability && ds.managedTurnOrigin
|
|
2721
|
+
&& (ds.managedTurnOrigin.turnId !== msg.turnId
|
|
2722
|
+
|| ds.managedTurnOrigin.dispatchAttempt !== msg.dispatchAttempt)) {
|
|
2723
|
+
logger.warn(`[${t}] Ignored unbound stale managed turn origin revoke`);
|
|
2724
|
+
break;
|
|
2725
|
+
}
|
|
2726
|
+
ds.managedTurnOrigin = undefined;
|
|
2727
|
+
break;
|
|
2728
|
+
}
|
|
2472
2729
|
case 'final_output': {
|
|
2473
2730
|
// Adopt-bridge: worker harvested the assistant turn from Claude Code's
|
|
2474
2731
|
// transcript JSONL and forwarded it to us. Dedup with a session-scoped
|
|
@@ -2480,6 +2737,10 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
|
|
|
2480
2737
|
break;
|
|
2481
2738
|
if (shouldDropMismatchedHermesFinalOutput(ds, msg, t))
|
|
2482
2739
|
break;
|
|
2740
|
+
if (managedFinalOutputSuppressed(msg.turnId, msg.dispatchAttempt)) {
|
|
2741
|
+
logger.debug(`[${t}] final_output captured/discarded for silent turn ${msg.turnId.substring(0, 8)}`);
|
|
2742
|
+
break;
|
|
2743
|
+
}
|
|
2483
2744
|
if (!msg.sessionId) {
|
|
2484
2745
|
logger.warn(`[${t}] final_output missing sessionId; accepting for compatibility (session=${ds.session.sessionId}, turn=${msg.turnId.substring(0, 8)})`);
|
|
2485
2746
|
}
|
|
@@ -2506,6 +2767,8 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
|
|
|
2506
2767
|
logger.warn(`[${t}] Ignored adopt_preamble from non-adopt worker`);
|
|
2507
2768
|
break;
|
|
2508
2769
|
}
|
|
2770
|
+
if (managedAuxUiSuppressed(msg.turnId))
|
|
2771
|
+
break;
|
|
2509
2772
|
if (!msg.userText.trim() && !msg.assistantText.trim())
|
|
2510
2773
|
break;
|
|
2511
2774
|
const recipientOpenId = daemonCardFooterRecipientOpenId(ds, effectiveCliId);
|
|
@@ -2515,7 +2778,7 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
|
|
|
2515
2778
|
assistantText: msg.assistantText,
|
|
2516
2779
|
assistantLabel: getCliDisplayName(effectiveCliId),
|
|
2517
2780
|
recipientOpenId,
|
|
2518
|
-
brand: resolveBrandLabel(ds.larkAppId),
|
|
2781
|
+
brand: renderBrandTemplate(resolveBrandLabel(ds.larkAppId), ds.workingDir),
|
|
2519
2782
|
locale: localeForBot(ds.larkAppId),
|
|
2520
2783
|
workingDir: ds.workingDir,
|
|
2521
2784
|
localHomeLinkMode: daemonCardLocalHomeLinkMode(ds),
|
|
@@ -2527,7 +2790,7 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
|
|
|
2527
2790
|
}
|
|
2528
2791
|
}
|
|
2529
2792
|
});
|
|
2530
|
-
worker.on('exit', (code) => {
|
|
2793
|
+
worker.on('exit', (code, signal) => {
|
|
2531
2794
|
logger.info(`[${t}] Worker process exited (code: ${code})`);
|
|
2532
2795
|
// Last-resort startup guard: syntax/import crashes and abrupt exits can
|
|
2533
2796
|
// happen before the worker sends either ready or a structured error. Do
|
|
@@ -2535,13 +2798,33 @@ function setupWorkerHandlers(ds, worker, startupState = { ready: false, failureN
|
|
|
2535
2798
|
// replacement kills are excluded to avoid noisy false alarms.
|
|
2536
2799
|
if (!startupState.ready && !startupState.failureNotified && !worker.killed && ds.session.status !== 'closed') {
|
|
2537
2800
|
const reason = tr('worker.start_exited_early', { code: code ?? 'null' }, loc);
|
|
2538
|
-
|
|
2801
|
+
// Carry the frozen init attribution so an abrupt pre-ready exit of a
|
|
2802
|
+
// durable VC delivery is fenced to the receipt/lease chain, not replied
|
|
2803
|
+
// out-of-band (which could post on a silent delivery).
|
|
2804
|
+
void notifyStartupFailure(reason, startupState.initTurnId, startupState.initDispatchAttempt);
|
|
2539
2805
|
}
|
|
2540
|
-
//
|
|
2541
|
-
//
|
|
2806
|
+
// Clear the current child before notifying durable consumers. A callback
|
|
2807
|
+
// may schedule a retry; it must not observe/send to this dead IPC channel.
|
|
2808
|
+
// A stale takeover worker never clears the replacement — during takeover the
|
|
2809
|
+
// old worker's exit fires AFTER the new worker has been assigned.
|
|
2542
2810
|
if (ds.worker === worker) {
|
|
2543
2811
|
ds.worker = null;
|
|
2544
2812
|
ds.workerPort = null;
|
|
2813
|
+
ds.managedTurnOrigin = undefined;
|
|
2814
|
+
}
|
|
2815
|
+
try {
|
|
2816
|
+
const notified = cb.onWorkerExit?.(ds, {
|
|
2817
|
+
sessionId: ds.session.sessionId,
|
|
2818
|
+
workerGeneration,
|
|
2819
|
+
code,
|
|
2820
|
+
signal,
|
|
2821
|
+
});
|
|
2822
|
+
void Promise.resolve(notified).catch((err) => {
|
|
2823
|
+
logger.error(`[${t}] Failed to reconcile worker exit generation ${workerGeneration}: ${err.message}`);
|
|
2824
|
+
});
|
|
2825
|
+
}
|
|
2826
|
+
catch (err) {
|
|
2827
|
+
logger.error(`[${t}] Failed to reconcile worker exit generation ${workerGeneration}: ${err.message}`);
|
|
2545
2828
|
}
|
|
2546
2829
|
// Notify dashboard, but only once per session lifecycle. The
|
|
2547
2830
|
// dashboard-driven `closeSession()` path also publishes; whichever
|
|
@@ -2612,6 +2895,10 @@ async function finishTurnReactions(ds) {
|
|
|
2612
2895
|
return;
|
|
2613
2896
|
// Detach the batch first so a second idle edge can't double-flip it.
|
|
2614
2897
|
ds.pendingAckReactions = [];
|
|
2898
|
+
// A dedicated receiver has no progress-reaction channel. Clear any stale
|
|
2899
|
+
// in-memory entries restored from an older build without touching Lark.
|
|
2900
|
+
if (ds.session.vcMeetingReceiver)
|
|
2901
|
+
return;
|
|
2615
2902
|
const silent = silentTurnReactions(ds);
|
|
2616
2903
|
const doneEmoji = doneReactionEmojiFor(ds);
|
|
2617
2904
|
for (const ack of list) {
|
|
@@ -2639,17 +2926,20 @@ async function finishTurnReactions(ds) {
|
|
|
2639
2926
|
* and give up — the user's answer is lost; better than leaking memory
|
|
2640
2927
|
* via an unbounded retry loop. */
|
|
2641
2928
|
function deliverFinalOutput(ds, msg, t, attempt) {
|
|
2929
|
+
const managedReceiver = !!ds.session.vcMeetingReceiver;
|
|
2642
2930
|
// Wait Mode / HTTP Sync Override:
|
|
2643
2931
|
// If this turn is being waited for by an HTTP webhook request, intercept the
|
|
2644
2932
|
// output, resolve the Promise immediately, and DO NOT send it to Lark.
|
|
2645
|
-
|
|
2933
|
+
// Dedicated receivers are structurally pinned to their audited listener
|
|
2934
|
+
// action and may never be diverted into these generic host-side sinks.
|
|
2935
|
+
const waitPromise = managedReceiver ? undefined : ds.pendingWaitPromises?.get(msg.turnId);
|
|
2646
2936
|
if (waitPromise) {
|
|
2647
2937
|
waitPromise.resolve(msg.content);
|
|
2648
2938
|
ds.lastBridgeEmittedUuid = finalOutputDedupeKey(ds, msg);
|
|
2649
2939
|
logger.info(`[${t}] Intercepted final_output for Wait Mode HTTP request (turn ${msg.turnId.substring(0, 8)})`);
|
|
2650
2940
|
return;
|
|
2651
2941
|
}
|
|
2652
|
-
const asyncResult = ds.asyncTriggerResults?.get(msg.turnId);
|
|
2942
|
+
const asyncResult = managedReceiver ? undefined : ds.asyncTriggerResults?.get(msg.turnId);
|
|
2653
2943
|
if (asyncResult) {
|
|
2654
2944
|
asyncResult.status = 'completed';
|
|
2655
2945
|
asyncResult.content = msg.content;
|
|
@@ -2660,7 +2950,9 @@ function deliverFinalOutput(ds, msg, t, attempt) {
|
|
|
2660
2950
|
}
|
|
2661
2951
|
const cb = requireCallbacks();
|
|
2662
2952
|
const effectiveCliId = ds.session.cliId ?? getBot(ds.larkAppId).config.cliId;
|
|
2663
|
-
const scopedReply = (content, msgType, turnId) => cb.sessionReply(sessionAnchorId(ds), content, msgType, ds.larkAppId, fallbackTurnId(ds, turnId)
|
|
2953
|
+
const scopedReply = (content, msgType, turnId, opts) => cb.sessionReply(sessionAnchorId(ds), content, msgType, ds.larkAppId, fallbackTurnId(ds, turnId), ds.session.vcMeetingReceiver
|
|
2954
|
+
? { ...opts, sourceSessionId: ds.session.sessionId }
|
|
2955
|
+
: opts);
|
|
2664
2956
|
setTimeout(async () => {
|
|
2665
2957
|
// Guard: if the user closed the session (or it was torn down for any
|
|
2666
2958
|
// other reason) between attempts, don't post a stale final answer to
|
|
@@ -2672,7 +2964,7 @@ function deliverFinalOutput(ds, msg, t, attempt) {
|
|
|
2672
2964
|
try {
|
|
2673
2965
|
// 文档评论入口分流:本轮若来自飞书文档评论(/watch-comment / /subscribe-lark-doc),把正文
|
|
2674
2966
|
// 发表为文档评论(而非飞书卡片),状态卡/占位卡仍留在飞书会话起点。
|
|
2675
|
-
const docTurn = ds.docCommentTurns?.get(msg.turnId);
|
|
2967
|
+
const docTurn = managedReceiver ? undefined : ds.docCommentTurns?.get(msg.turnId);
|
|
2676
2968
|
if (docTurn) {
|
|
2677
2969
|
// 嵌套回复到用户那条评论 thread(已挂在其下,无需再 ↪ 前缀)。这是兜底路径
|
|
2678
2970
|
// (模型没显式 botmux send),默认 @ 回原评论人,仅首块加。
|
|
@@ -2708,27 +3000,152 @@ function deliverFinalOutput(ds, msg, t, attempt) {
|
|
|
2708
3000
|
// they use the contextual card so the user prompt sits in a
|
|
2709
3001
|
// blockquote and only the assistant body goes through full markdown
|
|
2710
3002
|
// rendering.
|
|
2711
|
-
const
|
|
3003
|
+
const imOrigin = msg.dispatchAttempt === undefined
|
|
3004
|
+
? resolveVcMeetingImTurnOrigin(ds.session, msg.turnId)
|
|
3005
|
+
: undefined;
|
|
3006
|
+
const managedDecision = ds.session.vcMeetingReceiver
|
|
3007
|
+
? evaluateVcMeetingManagedSend(config.session.dataDir, {
|
|
3008
|
+
receiverSessionId: ds.session.sessionId,
|
|
3009
|
+
receiverSession: true,
|
|
3010
|
+
turnId: msg.turnId,
|
|
3011
|
+
dispatchAttempt: msg.dispatchAttempt,
|
|
3012
|
+
currentImTurnOrigin: imOrigin,
|
|
3013
|
+
allowTerminalReceipt: true,
|
|
3014
|
+
})
|
|
3015
|
+
: undefined;
|
|
3016
|
+
if (managedDecision && !managedDecision.ok) {
|
|
3017
|
+
ds.lastBridgeEmittedUuid = finalOutputDedupeKey(ds, msg);
|
|
3018
|
+
logger.warn(`[${t}] VC final_output lost current membership authority `
|
|
3019
|
+
+ `(${managedDecision.errorCode}) turn=${msg.turnId.substring(0, 8)}`);
|
|
3020
|
+
return;
|
|
3021
|
+
}
|
|
3022
|
+
const revalidateManagedSend = () => {
|
|
3023
|
+
if (!ds.session.vcMeetingReceiver)
|
|
3024
|
+
return;
|
|
3025
|
+
const current = evaluateVcMeetingManagedSend(config.session.dataDir, {
|
|
3026
|
+
receiverSessionId: ds.session.sessionId,
|
|
3027
|
+
receiverSession: true,
|
|
3028
|
+
turnId: msg.turnId,
|
|
3029
|
+
dispatchAttempt: msg.dispatchAttempt,
|
|
3030
|
+
currentImTurnOrigin: imOrigin,
|
|
3031
|
+
allowTerminalReceipt: true,
|
|
3032
|
+
});
|
|
3033
|
+
if (!current.ok) {
|
|
3034
|
+
throw new Error(`VC final_output authority expired (${current.errorCode}): ${current.error}`);
|
|
3035
|
+
}
|
|
3036
|
+
if (current.kind !== 'listener_thread') {
|
|
3037
|
+
throw new Error('VC final_output authority no longer targets the listener thread');
|
|
3038
|
+
}
|
|
3039
|
+
};
|
|
3040
|
+
const listenerOutputOwner = managedDecision?.ok
|
|
3041
|
+
&& managedDecision.kind === 'listener_thread'
|
|
3042
|
+
? managedDecision.meetingOwner
|
|
3043
|
+
: undefined;
|
|
3044
|
+
// Meeting-derived text is untrusted card markdown. A model-authored
|
|
3045
|
+
// native <at> tag and the ordinary owner footer would both create a
|
|
3046
|
+
// second addressing side effect outside the action ledger.
|
|
3047
|
+
const safeAssistantText = managedReceiver
|
|
3048
|
+
? neutralizeLarkAtTags(msg.content)
|
|
3049
|
+
: msg.content;
|
|
3050
|
+
const safeUserText = managedReceiver && msg.userText !== undefined
|
|
3051
|
+
? neutralizeLarkAtTags(msg.userText)
|
|
3052
|
+
: msg.userText;
|
|
3053
|
+
const recipientOpenId = managedReceiver
|
|
3054
|
+
? undefined
|
|
3055
|
+
: imOrigin?.replyTargetSenderOpenId
|
|
3056
|
+
?? daemonCardFooterRecipientOpenId(ds, effectiveCliId);
|
|
2712
3057
|
const localHomeLinkMode = daemonCardLocalHomeLinkMode(ds);
|
|
2713
3058
|
const cardJson = msg.kind === 'local-turn' || msg.kind === 'local-turn-headless'
|
|
2714
3059
|
? buildContextualReplyCard({
|
|
2715
3060
|
title: msg.kind === 'local-turn-headless'
|
|
2716
3061
|
? tr('card.local_turn_resumed', undefined, localeForBot(ds.larkAppId))
|
|
2717
3062
|
: tr('card.local_turn', undefined, localeForBot(ds.larkAppId)),
|
|
2718
|
-
userText: msg.kind === 'local-turn' ?
|
|
2719
|
-
assistantText:
|
|
3063
|
+
userText: msg.kind === 'local-turn' ? safeUserText ?? '' : undefined,
|
|
3064
|
+
assistantText: safeAssistantText,
|
|
2720
3065
|
assistantLabel: getCliDisplayName(effectiveCliId),
|
|
2721
3066
|
recipientOpenId,
|
|
2722
|
-
brand: resolveBrandLabel(ds.larkAppId),
|
|
3067
|
+
brand: renderBrandTemplate(resolveBrandLabel(ds.larkAppId), ds.workingDir),
|
|
2723
3068
|
locale: localeForBot(ds.larkAppId),
|
|
2724
3069
|
workingDir: ds.workingDir,
|
|
2725
3070
|
localHomeLinkMode,
|
|
2726
3071
|
})
|
|
2727
|
-
: buildMarkdownCard(
|
|
3072
|
+
: buildMarkdownCard(safeAssistantText, recipientOpenId, renderBrandTemplate(resolveBrandLabel(ds.larkAppId), ds.workingDir), localeForBot(ds.larkAppId), ds.workingDir, localHomeLinkMode);
|
|
3073
|
+
const proposedOutput = {
|
|
3074
|
+
targetChatId: ds.chatId,
|
|
3075
|
+
...(imOrigin ? { quoteTargetId: imOrigin.larkMessageId } : {}),
|
|
3076
|
+
msgType: 'interactive',
|
|
3077
|
+
content: cardJson,
|
|
3078
|
+
};
|
|
3079
|
+
const preparedImReply = imOrigin
|
|
3080
|
+
? prepareVcMeetingImReply(config.session.dataDir, imOrigin, proposedOutput)
|
|
3081
|
+
: undefined;
|
|
3082
|
+
const preparedDeliveryReply = !imOrigin
|
|
3083
|
+
&& listenerOutputOwner
|
|
3084
|
+
&& msg.dispatchAttempt !== undefined
|
|
3085
|
+
? prepareVcMeetingDeliveryReply(config.session.dataDir, {
|
|
3086
|
+
receiverSessionId: ds.session.sessionId,
|
|
3087
|
+
stableTurnId: msg.turnId,
|
|
3088
|
+
dispatchAttempt: msg.dispatchAttempt,
|
|
3089
|
+
}, proposedOutput)
|
|
3090
|
+
: undefined;
|
|
3091
|
+
const preparedListenerReply = preparedImReply ?? preparedDeliveryReply;
|
|
3092
|
+
if (preparedListenerReply?.kind === 'conflict') {
|
|
3093
|
+
ds.lastBridgeEmittedUuid = finalOutputDedupeKey(ds, msg);
|
|
3094
|
+
logger.error(`[${t}] VC listener fallback suppressed (${preparedListenerReply.reason}) `
|
|
3095
|
+
+ `turn=${msg.turnId.substring(0, 8)}: ${preparedListenerReply.detail}`);
|
|
3096
|
+
return;
|
|
3097
|
+
}
|
|
3098
|
+
const canonicalOutput = preparedListenerReply?.canonicalOutput ?? proposedOutput;
|
|
3099
|
+
if (preparedListenerReply?.outputMismatch) {
|
|
3100
|
+
logger.warn(`[${t}] VC listener reply output_mismatch action=${preparedListenerReply.ref.actionId} `
|
|
3101
|
+
+ `turn=${msg.turnId}; reusing first canonical output`);
|
|
3102
|
+
}
|
|
3103
|
+
const recordPrimaryOutput = (messageId) => {
|
|
3104
|
+
if (!listenerOutputOwner)
|
|
3105
|
+
return;
|
|
3106
|
+
try {
|
|
3107
|
+
const recorded = recordVcMeetingListenerMessage(config.session.dataDir, {
|
|
3108
|
+
...listenerOutputOwner,
|
|
3109
|
+
targetChatId: canonicalOutput.targetChatId,
|
|
3110
|
+
messageId,
|
|
3111
|
+
});
|
|
3112
|
+
if (!recorded.ok) {
|
|
3113
|
+
logger.warn(`[${t}] VC listener-message index rejected message=${messageId} reason=${recorded.reason}`);
|
|
3114
|
+
}
|
|
3115
|
+
}
|
|
3116
|
+
catch (error) {
|
|
3117
|
+
// Lark already accepted the primary message. Never enter the delivery
|
|
3118
|
+
// retry loop solely because the auxiliary quote index failed.
|
|
3119
|
+
logger.error(`[${t}] VC listener-message index write failed after send: `
|
|
3120
|
+
+ `${error instanceof Error ? error.message : String(error)}`);
|
|
3121
|
+
}
|
|
3122
|
+
};
|
|
3123
|
+
if (preparedListenerReply?.kind === 'succeeded' && preparedListenerReply.messageId) {
|
|
3124
|
+
recordPrimaryOutput(preparedListenerReply.messageId);
|
|
3125
|
+
ds.lastBridgeEmittedUuid = finalOutputDedupeKey(ds, msg);
|
|
3126
|
+
logger.info(`[${t}] VC listener fallback replayed existing provider result `
|
|
3127
|
+
+ `(turn ${msg.turnId.substring(0, 8)})`);
|
|
3128
|
+
return;
|
|
3129
|
+
}
|
|
2728
3130
|
// Always deliver the answer as a fresh message — never PATCH a card in
|
|
2729
3131
|
// place. message.patch is silent (no Feishu notification / unread), which
|
|
2730
3132
|
// used to swallow the answer; a brand-new message always pings.
|
|
2731
|
-
|
|
3133
|
+
revalidateManagedSend();
|
|
3134
|
+
const messageId = await scopedReply(canonicalOutput.content, canonicalOutput.msgType, msg.turnId, preparedListenerReply
|
|
3135
|
+
? {
|
|
3136
|
+
uuid: preparedListenerReply.providerKey,
|
|
3137
|
+
quoteMessageId: canonicalOutput.quoteTargetId,
|
|
3138
|
+
beforeQuoteFallback: revalidateManagedSend,
|
|
3139
|
+
// Managed output has one audited external effect (the Lark
|
|
3140
|
+
// provider call). Never fan meeting content out to user hooks,
|
|
3141
|
+
// including the first attempt and crash reconciliation replay.
|
|
3142
|
+
suppressHook: true,
|
|
3143
|
+
}
|
|
3144
|
+
: undefined);
|
|
3145
|
+
recordPrimaryOutput(messageId);
|
|
3146
|
+
if (preparedListenerReply?.kind === 'send' || preparedListenerReply?.kind === 'succeeded') {
|
|
3147
|
+
finishVcMeetingImReply(config.session.dataDir, preparedListenerReply.ref, messageId);
|
|
3148
|
+
}
|
|
2732
3149
|
ds.lastBridgeEmittedUuid = finalOutputDedupeKey(ds, msg);
|
|
2733
3150
|
logger.info(`[${t}] Bridge final_output forwarded (turn ${msg.turnId.substring(0, 8)}, ${msg.content.length} chars, kind=${msg.kind ?? 'bridge'}, attempt ${attempt + 1})`);
|
|
2734
3151
|
}
|
|
@@ -2791,6 +3208,8 @@ export function forkAdoptWorker(ds, opts) {
|
|
|
2791
3208
|
ds.worker = null;
|
|
2792
3209
|
ds.workerPort = null;
|
|
2793
3210
|
ds.workerToken = null;
|
|
3211
|
+
ds.workerViewToken = null;
|
|
3212
|
+
ds.managedTurnOrigin = undefined;
|
|
2794
3213
|
}
|
|
2795
3214
|
// No ensureCliSkills — adopt mode attaches to an existing CLI session
|
|
2796
3215
|
// Fall back to home if the adopted cwd is gone — a missing fork cwd emits an
|
|
@@ -2891,6 +3310,7 @@ export function forkAdoptWorker(ds, opts) {
|
|
|
2891
3310
|
type: 'init',
|
|
2892
3311
|
sessionId: ds.session.sessionId,
|
|
2893
3312
|
chatId: ds.chatId,
|
|
3313
|
+
chatType: ds.chatType,
|
|
2894
3314
|
rootMessageId: sessionAnchorId(ds),
|
|
2895
3315
|
workingDir: adopted.cwd,
|
|
2896
3316
|
cliId: adoptedCliId,
|