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
|
@@ -0,0 +1,756 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic action gate for managed VC-meeting side effects.
|
|
3
|
+
*
|
|
4
|
+
* The receiver daemon supplies a trusted origin (session + stable delivery
|
|
5
|
+
* turn + dispatch attempt). This service resolves that origin from the durable
|
|
6
|
+
* delivery ledger, persists an immutable action intent, applies current
|
|
7
|
+
* membership fencing, and write-ahead claims the next provider effect. It
|
|
8
|
+
* deliberately never calls Lark, the realtime voice provider, or an approval
|
|
9
|
+
* card provider; callers execute only the returned plan.
|
|
10
|
+
*/
|
|
11
|
+
import { createHash } from 'node:crypto';
|
|
12
|
+
import { approveAndClaimVcMeetingAction, beginVcMeetingAction, claimVcMeetingActionAttempt, claimVcMeetingApprovalCardAttempt, deriveVcMeetingActionId, findVcMeetingAction, finishVcMeetingAction, finishVcMeetingApprovalCard, isVcMeetingActionTerminal, markVcMeetingActionPendingApproval, rejectVcMeetingAction, resolveVcMeetingActionApproval, VC_MEETING_ACTION_SINKS, } from './vc-meeting-action-store.js';
|
|
13
|
+
import { findVcMeetingDeliveryByKey, getVcMeetingMemberProjection, listVcMeetingMemberProjections, } from './vc-meeting-delivery-store.js';
|
|
14
|
+
import { canonicalJson, computeInputHash } from '../utils/canonical-input-hash.js';
|
|
15
|
+
const MAX_OUTPUT_CHARS = 200;
|
|
16
|
+
function errorResult(status, errorCode, error, action) {
|
|
17
|
+
return {
|
|
18
|
+
status,
|
|
19
|
+
body: { ok: false, kind: 'rejected', errorCode, error, ...(action ? { action } : {}) },
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function normalizeText(value) {
|
|
23
|
+
if (typeof value !== 'string')
|
|
24
|
+
return undefined;
|
|
25
|
+
const normalized = value.replace(/\s+/g, ' ').trim();
|
|
26
|
+
return normalized || undefined;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Stable IM source key. The canonical tuple avoids delimiter ambiguity and the
|
|
30
|
+
* 50-character namespace matches the bounded ids used by the action ledger.
|
|
31
|
+
*/
|
|
32
|
+
export function deriveVcMeetingImTurnSourceKey(receiverSessionId, larkMessageId) {
|
|
33
|
+
const normalizedSessionId = normalizeText(receiverSessionId);
|
|
34
|
+
const normalizedMessageId = normalizeText(larkMessageId);
|
|
35
|
+
if (!normalizedSessionId || !normalizedMessageId) {
|
|
36
|
+
throw new Error('receiverSessionId and larkMessageId must be non-empty');
|
|
37
|
+
}
|
|
38
|
+
const seed = canonicalJson({
|
|
39
|
+
receiverSessionId: normalizedSessionId,
|
|
40
|
+
larkMessageId: normalizedMessageId,
|
|
41
|
+
});
|
|
42
|
+
const hex = createHash('sha256').update(seed, 'utf8').digest('hex');
|
|
43
|
+
return `vci_${hex.slice(0, 46)}`;
|
|
44
|
+
}
|
|
45
|
+
function isPlainObject(value) {
|
|
46
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
47
|
+
return false;
|
|
48
|
+
const prototype = Object.getPrototypeOf(value);
|
|
49
|
+
return prototype === Object.prototype || prototype === null;
|
|
50
|
+
}
|
|
51
|
+
function normalizeImActionRequest(raw) {
|
|
52
|
+
if (!raw || typeof raw !== 'object' || !raw.origin || typeof raw.origin !== 'object') {
|
|
53
|
+
return { ok: false, result: errorResult(400, 'invalid_request', 'IM action request and trusted origin are required') };
|
|
54
|
+
}
|
|
55
|
+
const listenerAppId = normalizeText(raw.origin.listenerAppId);
|
|
56
|
+
const meetingId = normalizeText(raw.origin.meetingId);
|
|
57
|
+
const memberId = normalizeText(raw.origin.memberId);
|
|
58
|
+
const agentAppId = normalizeText(raw.origin.agentAppId);
|
|
59
|
+
const ownerBootId = normalizeText(raw.origin.ownerBootId);
|
|
60
|
+
const receiverSessionId = normalizeText(raw.origin.receiverSessionId);
|
|
61
|
+
const larkMessageId = normalizeText(raw.origin.larkMessageId);
|
|
62
|
+
const reason = normalizeText(raw.reason);
|
|
63
|
+
if (!listenerAppId || !meetingId || !memberId || !agentAppId || !ownerBootId
|
|
64
|
+
|| !receiverSessionId || !larkMessageId
|
|
65
|
+
|| !isPositiveSafeInteger(raw.origin.ownerEpoch)
|
|
66
|
+
|| !isPositiveSafeInteger(raw.origin.memberEpoch)
|
|
67
|
+
|| !isPositiveSafeInteger(raw.origin.membershipGeneration)
|
|
68
|
+
|| !isPositiveSafeInteger(raw.origin.sinkOwnerGeneration)) {
|
|
69
|
+
return { ok: false, result: errorResult(400, 'invalid_request', 'trusted IM action origin is invalid') };
|
|
70
|
+
}
|
|
71
|
+
if (!VC_MEETING_ACTION_SINKS.includes(raw.sink)) {
|
|
72
|
+
return { ok: false, result: errorResult(400, 'unsupported_sink', 'managed action sink is unsupported') };
|
|
73
|
+
}
|
|
74
|
+
if (reason && reason.length > MAX_OUTPUT_CHARS) {
|
|
75
|
+
return { ok: false, result: errorResult(400, 'content_too_long', `reason must be at most ${MAX_OUTPUT_CHARS} characters`) };
|
|
76
|
+
}
|
|
77
|
+
if (!isPlainObject(raw.canonicalInput)) {
|
|
78
|
+
return { ok: false, result: errorResult(400, 'invalid_canonical_input', 'canonicalInput must be a plain object') };
|
|
79
|
+
}
|
|
80
|
+
let canonicalInput;
|
|
81
|
+
try {
|
|
82
|
+
canonicalInput = JSON.parse(canonicalJson(raw.canonicalInput));
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
return {
|
|
86
|
+
ok: false,
|
|
87
|
+
result: errorResult(400, 'invalid_canonical_input', err instanceof Error ? err.message : String(err)),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
ok: true,
|
|
92
|
+
request: {
|
|
93
|
+
origin: {
|
|
94
|
+
listenerAppId,
|
|
95
|
+
meetingId,
|
|
96
|
+
memberId,
|
|
97
|
+
memberEpoch: raw.origin.memberEpoch,
|
|
98
|
+
agentAppId,
|
|
99
|
+
ownerBootId,
|
|
100
|
+
ownerEpoch: raw.origin.ownerEpoch,
|
|
101
|
+
membershipGeneration: raw.origin.membershipGeneration,
|
|
102
|
+
sinkOwnerGeneration: raw.origin.sinkOwnerGeneration,
|
|
103
|
+
receiverSessionId,
|
|
104
|
+
larkMessageId,
|
|
105
|
+
},
|
|
106
|
+
sink: raw.sink,
|
|
107
|
+
canonicalInput,
|
|
108
|
+
...(reason ? { reason } : {}),
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
function normalizeRequest(raw) {
|
|
113
|
+
if (!raw || typeof raw !== 'object') {
|
|
114
|
+
return { ok: false, result: errorResult(400, 'invalid_request', 'action request must be an object') };
|
|
115
|
+
}
|
|
116
|
+
const agentAppId = normalizeText(raw.agentAppId);
|
|
117
|
+
const receiverSessionId = normalizeText(raw.receiverSessionId);
|
|
118
|
+
const stableTurnId = normalizeText(raw.stableTurnId);
|
|
119
|
+
const content = normalizeText(raw.content);
|
|
120
|
+
const fallbackText = normalizeText(raw.fallbackText);
|
|
121
|
+
const reason = normalizeText(raw.reason);
|
|
122
|
+
if (!agentAppId || !receiverSessionId || !stableTurnId || !content
|
|
123
|
+
|| !Number.isInteger(raw.dispatchAttempt) || raw.dispatchAttempt < 1) {
|
|
124
|
+
return { ok: false, result: errorResult(400, 'invalid_request', 'trusted action origin or content is invalid') };
|
|
125
|
+
}
|
|
126
|
+
if (raw.channel !== 'text' && raw.channel !== 'voice') {
|
|
127
|
+
return { ok: false, result: errorResult(400, 'unsupported_channel', 'channel must be text or voice') };
|
|
128
|
+
}
|
|
129
|
+
if (content.length > MAX_OUTPUT_CHARS
|
|
130
|
+
|| (fallbackText?.length ?? 0) > MAX_OUTPUT_CHARS
|
|
131
|
+
|| (reason?.length ?? 0) > MAX_OUTPUT_CHARS) {
|
|
132
|
+
return { ok: false, result: errorResult(400, 'content_too_long', `content fields must be at most ${MAX_OUTPUT_CHARS} characters`) };
|
|
133
|
+
}
|
|
134
|
+
if (raw.channel === 'text' && fallbackText) {
|
|
135
|
+
return { ok: false, result: errorResult(400, 'fallback_not_allowed', 'fallbackText only applies to voice output') };
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
ok: true,
|
|
139
|
+
request: {
|
|
140
|
+
agentAppId,
|
|
141
|
+
receiverSessionId,
|
|
142
|
+
stableTurnId,
|
|
143
|
+
dispatchAttempt: raw.dispatchAttempt,
|
|
144
|
+
channel: raw.channel,
|
|
145
|
+
content,
|
|
146
|
+
...(fallbackText ? { fallbackText } : {}),
|
|
147
|
+
...(reason ? { reason } : {}),
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function actionRef(record) {
|
|
152
|
+
return {
|
|
153
|
+
listenerAppId: record.listenerAppId,
|
|
154
|
+
meetingId: record.meetingId,
|
|
155
|
+
actionId: record.actionId,
|
|
156
|
+
inputHash: record.inputHash,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
function executionPlan(record) {
|
|
160
|
+
const input = record.canonicalInput;
|
|
161
|
+
const channel = record.sink === 'meeting_voice' ? 'voice' : 'text';
|
|
162
|
+
return {
|
|
163
|
+
actionId: record.actionId,
|
|
164
|
+
inputHash: record.inputHash,
|
|
165
|
+
providerKey: record.providerKey,
|
|
166
|
+
channel,
|
|
167
|
+
sink: record.sink,
|
|
168
|
+
content: input.content,
|
|
169
|
+
...(input.fallbackText ? { fallbackText: input.fallbackText } : {}),
|
|
170
|
+
ambiguousRecovery: channel === 'voice' ? 'manual_unknown' : 'lookup_or_idempotent_retry',
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
function genericExecutionPlan(record) {
|
|
174
|
+
return {
|
|
175
|
+
actionId: record.actionId,
|
|
176
|
+
inputHash: record.inputHash,
|
|
177
|
+
providerKey: record.providerKey,
|
|
178
|
+
sink: record.sink,
|
|
179
|
+
canonicalInput: structuredClone(record.canonicalInput),
|
|
180
|
+
ambiguousRecovery: record.sink === 'meeting_voice'
|
|
181
|
+
? 'manual_unknown'
|
|
182
|
+
: 'lookup_or_idempotent_retry',
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
function existingResult(record) {
|
|
186
|
+
return { status: 200, body: { ok: true, kind: 'existing', action: record } };
|
|
187
|
+
}
|
|
188
|
+
function imExistingResult(record) {
|
|
189
|
+
return { status: 200, body: { ok: true, kind: 'existing', action: record } };
|
|
190
|
+
}
|
|
191
|
+
function rejectStatus(reason) {
|
|
192
|
+
return reason === 'listener_session_inactive' || reason === 'meeting_phase_closed' ? 409 : 403;
|
|
193
|
+
}
|
|
194
|
+
function isPositiveSafeInteger(value) {
|
|
195
|
+
return Number.isSafeInteger(value) && value > 0;
|
|
196
|
+
}
|
|
197
|
+
function rejectNewAction(deps, record, status, errorCode, error, now) {
|
|
198
|
+
const rejected = rejectVcMeetingAction(deps.dataDir, actionRef(record), { errorCode }, now);
|
|
199
|
+
if (rejected.kind === 'conflict') {
|
|
200
|
+
return errorResult(500, 'action_reject_transition_failed', `could not durably reject action: ${rejected.reason}`, record);
|
|
201
|
+
}
|
|
202
|
+
return errorResult(status, errorCode, error, rejected.record);
|
|
203
|
+
}
|
|
204
|
+
function currentProjection(dataDir, historical) {
|
|
205
|
+
const projections = listVcMeetingMemberProjections(dataDir, {
|
|
206
|
+
listenerAppId: historical.listenerAppId,
|
|
207
|
+
meetingId: historical.meetingId,
|
|
208
|
+
}).filter((candidate) => candidate.memberId === historical.memberId);
|
|
209
|
+
return {
|
|
210
|
+
projection: projections.find((candidate) => candidate.memberEpoch === historical.memberEpoch),
|
|
211
|
+
maxEpoch: Math.max(0, ...projections.map((candidate) => candidate.memberEpoch)),
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Resolve, fence, authorize and write-ahead claim one managed meeting action.
|
|
216
|
+
* Existing non-requested records are returned before current membership
|
|
217
|
+
* fencing; this is what makes terminal/approval/provider replay deterministic
|
|
218
|
+
* across epoch or owner changes.
|
|
219
|
+
*/
|
|
220
|
+
export async function requestVcMeetingManagedAction(raw, deps, now = Date.now()) {
|
|
221
|
+
const normalized = normalizeRequest(raw);
|
|
222
|
+
if (!normalized.ok)
|
|
223
|
+
return normalized.result;
|
|
224
|
+
const request = normalized.request;
|
|
225
|
+
if (request.agentAppId !== deps.selfAgentAppId) {
|
|
226
|
+
return errorResult(409, 'wrong_agent', 'trusted action origin does not match this consumer daemon');
|
|
227
|
+
}
|
|
228
|
+
// Session binding is part of trusted-origin validation and always precedes
|
|
229
|
+
// ledger lookup/replay. A sibling daemon sharing dataDir may not disclose an
|
|
230
|
+
// action merely because it knows a delivery key.
|
|
231
|
+
const lookup = findVcMeetingDeliveryByKey(deps.dataDir, request.stableTurnId);
|
|
232
|
+
if (!lookup)
|
|
233
|
+
return errorResult(404, 'receipt_not_found', 'delivery receipt was not found');
|
|
234
|
+
if (lookup.receiverSessionId !== request.receiverSessionId) {
|
|
235
|
+
return errorResult(409, 'receiver_session_mismatch', 'delivery is bound to a different receiver session');
|
|
236
|
+
}
|
|
237
|
+
const historicalProjection = getVcMeetingMemberProjection(deps.dataDir, lookup.memberKey);
|
|
238
|
+
if (!historicalProjection) {
|
|
239
|
+
return errorResult(409, 'projection_not_found', 'delivery membership projection was not found');
|
|
240
|
+
}
|
|
241
|
+
if (historicalProjection.agentAppId !== deps.selfAgentAppId) {
|
|
242
|
+
return errorResult(409, 'wrong_agent', 'delivery receipt belongs to another consumer agent');
|
|
243
|
+
}
|
|
244
|
+
if (historicalProjection.receiverSessionId !== request.receiverSessionId) {
|
|
245
|
+
return errorResult(409, 'receiver_session_changed', 'membership receiver session no longer matches the delivery');
|
|
246
|
+
}
|
|
247
|
+
const sink = request.channel === 'voice' ? 'meeting_voice' : 'meeting_text';
|
|
248
|
+
const canonicalInput = {
|
|
249
|
+
content: request.content,
|
|
250
|
+
...(request.channel === 'voice' && request.fallbackText
|
|
251
|
+
? { fallbackText: request.fallbackText }
|
|
252
|
+
: {}),
|
|
253
|
+
};
|
|
254
|
+
const source = {
|
|
255
|
+
kind: 'delivery',
|
|
256
|
+
key: lookup.receipt.deliveryKey,
|
|
257
|
+
deliverySeq: lookup.receipt.toSeq,
|
|
258
|
+
};
|
|
259
|
+
// Read an already-established lifecycle before *current* receipt/member
|
|
260
|
+
// fencing. This preserves deterministic terminal/pending/attempting replay,
|
|
261
|
+
// while a stale attempt that is first to arrive still cannot create and
|
|
262
|
+
// poison the primary action identity.
|
|
263
|
+
const proposedActionId = deriveVcMeetingActionId({
|
|
264
|
+
meetingId: lookup.memberKey.meetingId,
|
|
265
|
+
memberId: lookup.memberKey.memberId,
|
|
266
|
+
memberEpoch: lookup.memberKey.memberEpoch,
|
|
267
|
+
source,
|
|
268
|
+
sink,
|
|
269
|
+
actionSlot: 'primary',
|
|
270
|
+
});
|
|
271
|
+
const proposedInputHash = computeInputHash(canonicalInput);
|
|
272
|
+
const existing = findVcMeetingAction(deps.dataDir, {
|
|
273
|
+
listenerAppId: lookup.memberKey.listenerAppId,
|
|
274
|
+
meetingId: lookup.memberKey.meetingId,
|
|
275
|
+
}, proposedActionId);
|
|
276
|
+
if (existing) {
|
|
277
|
+
if (existing.inputHash !== proposedInputHash) {
|
|
278
|
+
return errorResult(409, 'action_input_mismatch', 'this delivery already has an action for the sink; treat it as handled and do not change content or slot', existing);
|
|
279
|
+
}
|
|
280
|
+
if (existing.agentAppId !== deps.selfAgentAppId) {
|
|
281
|
+
return errorResult(409, 'wrong_agent', 'existing action belongs to another consumer agent');
|
|
282
|
+
}
|
|
283
|
+
if (existing.status !== 'requested')
|
|
284
|
+
return existingResult(existing);
|
|
285
|
+
}
|
|
286
|
+
// An origin that has not yet established an action must be the exact live
|
|
287
|
+
// dispatched attempt. In particular, attempt N may not create a terminal
|
|
288
|
+
// rejected action after attempt N+1 has taken over the same stable turn.
|
|
289
|
+
if (lookup.receipt.stableTurnId !== request.stableTurnId) {
|
|
290
|
+
return errorResult(409, 'source_turn_mismatch', 'stable turn does not match the delivery receipt');
|
|
291
|
+
}
|
|
292
|
+
if (lookup.receipt.status !== 'dispatched') {
|
|
293
|
+
return errorResult(409, 'delivery_not_dispatched', `delivery is ${lookup.receipt.status}, not dispatched`);
|
|
294
|
+
}
|
|
295
|
+
if (lookup.receipt.dispatchAttempt !== request.dispatchAttempt) {
|
|
296
|
+
return errorResult(409, 'stale_dispatch_attempt', 'action origin does not match the live delivery attempt');
|
|
297
|
+
}
|
|
298
|
+
let record = existing;
|
|
299
|
+
let begunKind = existing ? 'existing' : 'created';
|
|
300
|
+
if (!record) {
|
|
301
|
+
// This is the authorization snapshot carried by the source turn. Reading
|
|
302
|
+
// the mutable projection here would let a delivery accepted under owner
|
|
303
|
+
// generation N execute for the first time after ownership churned to N+2.
|
|
304
|
+
if (!isPositiveSafeInteger(lookup.receipt.sinkOwnerGeneration)) {
|
|
305
|
+
return errorResult(409, 'receipt_policy_snapshot_missing', 'delivery receipt has no valid sink owner generation snapshot');
|
|
306
|
+
}
|
|
307
|
+
const begun = beginVcMeetingAction(deps.dataDir, {
|
|
308
|
+
listenerAppId: lookup.memberKey.listenerAppId,
|
|
309
|
+
meetingId: lookup.memberKey.meetingId,
|
|
310
|
+
memberId: lookup.memberKey.memberId,
|
|
311
|
+
memberEpoch: lookup.memberKey.memberEpoch,
|
|
312
|
+
agentAppId: deps.selfAgentAppId,
|
|
313
|
+
ownerGeneration: lookup.receipt.sinkOwnerGeneration,
|
|
314
|
+
source,
|
|
315
|
+
sink,
|
|
316
|
+
actionSlot: 'primary',
|
|
317
|
+
canonicalInput,
|
|
318
|
+
}, now);
|
|
319
|
+
if (begun.kind === 'conflict') {
|
|
320
|
+
if (begun.reason === 'input_mismatch') {
|
|
321
|
+
return errorResult(409, 'action_input_mismatch', 'this delivery already has an action for the sink; treat it as handled and do not change content or slot', begun.record);
|
|
322
|
+
}
|
|
323
|
+
return errorResult(400, `action_${begun.reason}`, begun.detail ?? 'action intent is invalid', begun.record);
|
|
324
|
+
}
|
|
325
|
+
record = begun.record;
|
|
326
|
+
begunKind = begun.kind;
|
|
327
|
+
}
|
|
328
|
+
if (record.agentAppId !== deps.selfAgentAppId) {
|
|
329
|
+
return errorResult(409, 'wrong_agent', 'existing action belongs to another consumer agent');
|
|
330
|
+
}
|
|
331
|
+
// A requested record may be the crash residue between begin and policy. It
|
|
332
|
+
// is safe to resume because all subsequent claims are store-atomic. Every
|
|
333
|
+
// other status is an observable existing lifecycle result and is replayed
|
|
334
|
+
// before current fencing.
|
|
335
|
+
if (begunKind === 'existing' && record.status !== 'requested')
|
|
336
|
+
return existingResult(record);
|
|
337
|
+
const recordBeforeFencing = record;
|
|
338
|
+
const rejectFencing = (code, message) => rejectNewAction(deps, recordBeforeFencing, 409, code, message, now);
|
|
339
|
+
const current = currentProjection(deps.dataDir, historicalProjection);
|
|
340
|
+
if (current.maxEpoch !== lookup.memberKey.memberEpoch) {
|
|
341
|
+
return rejectFencing('stale_member_epoch', 'delivery member epoch is no longer current');
|
|
342
|
+
}
|
|
343
|
+
if (!current.projection) {
|
|
344
|
+
return rejectFencing('projection_not_found', 'current membership projection was not found');
|
|
345
|
+
}
|
|
346
|
+
if (current.projection.status !== 'active') {
|
|
347
|
+
return rejectFencing(`membership_${current.projection.status}`, `membership is ${current.projection.status}`);
|
|
348
|
+
}
|
|
349
|
+
if (current.projection.receiverSessionId !== request.receiverSessionId) {
|
|
350
|
+
return rejectFencing('receiver_session_changed', 'current membership uses a different receiver session');
|
|
351
|
+
}
|
|
352
|
+
if (current.projection.agentAppId !== deps.selfAgentAppId) {
|
|
353
|
+
return rejectFencing('wrong_agent', 'current membership belongs to another consumer agent');
|
|
354
|
+
}
|
|
355
|
+
if (!isPositiveSafeInteger(current.projection.sinkOwnerGeneration)) {
|
|
356
|
+
return rejectFencing('projection_policy_invalid', 'current membership has no valid sink owner generation');
|
|
357
|
+
}
|
|
358
|
+
if (record.ownerGeneration !== current.projection.sinkOwnerGeneration) {
|
|
359
|
+
return rejectFencing('stale_owner_generation', 'action authorization snapshot is no longer current');
|
|
360
|
+
}
|
|
361
|
+
let authorization;
|
|
362
|
+
try {
|
|
363
|
+
authorization = await deps.authorize({
|
|
364
|
+
request,
|
|
365
|
+
projection: current.projection,
|
|
366
|
+
receipt: lookup.receipt,
|
|
367
|
+
action: record,
|
|
368
|
+
sink,
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
catch (err) {
|
|
372
|
+
return errorResult(503, 'authorization_unavailable', err instanceof Error ? err.message : String(err), record);
|
|
373
|
+
}
|
|
374
|
+
if (!authorization || !['allow', 'approval', 'deny'].includes(authorization.kind)) {
|
|
375
|
+
return errorResult(503, 'authorization_invalid_result', 'authorization callback returned an invalid decision', record);
|
|
376
|
+
}
|
|
377
|
+
if (authorization.kind === 'deny') {
|
|
378
|
+
const allowedReasons = new Set([
|
|
379
|
+
'listener_session_inactive',
|
|
380
|
+
'meeting_phase_closed',
|
|
381
|
+
'capability_denied',
|
|
382
|
+
'not_sink_owner',
|
|
383
|
+
'output_policy_denied',
|
|
384
|
+
]);
|
|
385
|
+
if (!allowedReasons.has(authorization.reason)) {
|
|
386
|
+
return errorResult(503, 'authorization_invalid_result', 'authorization denial reason is invalid', record);
|
|
387
|
+
}
|
|
388
|
+
return rejectNewAction(deps, record, rejectStatus(authorization.reason), authorization.reason, authorization.detail ?? `managed meeting action denied: ${authorization.reason}`, now);
|
|
389
|
+
}
|
|
390
|
+
if (authorization.kind === 'approval') {
|
|
391
|
+
const pending = markVcMeetingActionPendingApproval(deps.dataDir, actionRef(record), now);
|
|
392
|
+
if (pending.kind === 'conflict') {
|
|
393
|
+
return errorResult(500, 'approval_transition_failed', `could not persist approval state: ${pending.reason}`, record);
|
|
394
|
+
}
|
|
395
|
+
record = pending.record;
|
|
396
|
+
const claimed = claimVcMeetingApprovalCardAttempt(deps.dataDir, actionRef(record), now);
|
|
397
|
+
if (claimed.kind === 'existing')
|
|
398
|
+
return existingResult(claimed.record);
|
|
399
|
+
if (claimed.kind === 'conflict') {
|
|
400
|
+
return errorResult(500, 'approval_claim_failed', `could not claim approval presentation: ${claimed.reason}`, record);
|
|
401
|
+
}
|
|
402
|
+
record = claimed.record;
|
|
403
|
+
return {
|
|
404
|
+
status: 202,
|
|
405
|
+
body: {
|
|
406
|
+
ok: true,
|
|
407
|
+
kind: 'needsApproval',
|
|
408
|
+
action: record,
|
|
409
|
+
plan: {
|
|
410
|
+
actionId: record.actionId,
|
|
411
|
+
inputHash: record.inputHash,
|
|
412
|
+
providerKey: record.approvalCard.providerKey,
|
|
413
|
+
channel: request.channel,
|
|
414
|
+
content: request.content,
|
|
415
|
+
...(request.fallbackText ? { fallbackText: request.fallbackText } : {}),
|
|
416
|
+
...(request.reason ? { reason: request.reason } : {}),
|
|
417
|
+
},
|
|
418
|
+
},
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
const claimed = claimVcMeetingActionAttempt(deps.dataDir, actionRef(record), now);
|
|
422
|
+
if (claimed.kind === 'existing')
|
|
423
|
+
return existingResult(claimed.record);
|
|
424
|
+
if (claimed.kind === 'conflict') {
|
|
425
|
+
return errorResult(500, 'provider_claim_failed', `could not claim provider execution: ${claimed.reason}`, record);
|
|
426
|
+
}
|
|
427
|
+
record = claimed.record;
|
|
428
|
+
return {
|
|
429
|
+
status: 202,
|
|
430
|
+
body: { ok: true, kind: 'execute', action: record, plan: executionPlan(record) },
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Resolve and execute a managed action from an explicit user IM turn.
|
|
435
|
+
*
|
|
436
|
+
* Unlike delivery-origin actions this path has no delivery receipt or
|
|
437
|
+
* dispatchAttempt: the durable identity is the authoritative membership
|
|
438
|
+
* projection plus `hash(receiverSessionId, larkMessageId)`. The receiver
|
|
439
|
+
* binding is checked before ledger lookup so a different session cannot use a
|
|
440
|
+
* guessed message id to inspect an action. Exact action replays still return
|
|
441
|
+
* their established lifecycle before current owner/member fencing, matching
|
|
442
|
+
* delivery-origin replay semantics.
|
|
443
|
+
*/
|
|
444
|
+
export async function requestVcMeetingManagedImAction(raw, deps, now = Date.now()) {
|
|
445
|
+
const normalized = normalizeImActionRequest(raw);
|
|
446
|
+
if (!normalized.ok)
|
|
447
|
+
return normalized.result;
|
|
448
|
+
const request = normalized.request;
|
|
449
|
+
const { origin } = request;
|
|
450
|
+
if (origin.agentAppId !== deps.selfAgentAppId) {
|
|
451
|
+
return errorResult(409, 'wrong_agent', 'trusted IM action origin does not match this consumer daemon');
|
|
452
|
+
}
|
|
453
|
+
const memberKey = {
|
|
454
|
+
listenerAppId: origin.listenerAppId,
|
|
455
|
+
meetingId: origin.meetingId,
|
|
456
|
+
memberId: origin.memberId,
|
|
457
|
+
memberEpoch: origin.memberEpoch,
|
|
458
|
+
};
|
|
459
|
+
const historicalProjection = getVcMeetingMemberProjection(deps.dataDir, memberKey);
|
|
460
|
+
if (!historicalProjection) {
|
|
461
|
+
return errorResult(404, 'projection_not_found', 'IM turn membership projection was not found');
|
|
462
|
+
}
|
|
463
|
+
// Receiver and agent binding are authentication checks, not mutable policy
|
|
464
|
+
// fences, so they intentionally precede action replay.
|
|
465
|
+
if (historicalProjection.receiverSessionId !== origin.receiverSessionId) {
|
|
466
|
+
return errorResult(409, 'receiver_session_mismatch', 'IM turn is bound to a different receiver session');
|
|
467
|
+
}
|
|
468
|
+
if (historicalProjection.agentAppId !== origin.agentAppId
|
|
469
|
+
|| historicalProjection.agentAppId !== deps.selfAgentAppId) {
|
|
470
|
+
return errorResult(409, 'wrong_agent', 'IM turn membership belongs to another consumer agent');
|
|
471
|
+
}
|
|
472
|
+
const sourceKey = deriveVcMeetingImTurnSourceKey(origin.receiverSessionId, origin.larkMessageId);
|
|
473
|
+
const actionIdentity = {
|
|
474
|
+
listenerAppId: origin.listenerAppId,
|
|
475
|
+
meetingId: origin.meetingId,
|
|
476
|
+
memberId: origin.memberId,
|
|
477
|
+
memberEpoch: origin.memberEpoch,
|
|
478
|
+
agentAppId: origin.agentAppId,
|
|
479
|
+
ownerGeneration: origin.sinkOwnerGeneration,
|
|
480
|
+
source: {
|
|
481
|
+
kind: 'im_turn',
|
|
482
|
+
key: sourceKey,
|
|
483
|
+
larkMessageId: origin.larkMessageId,
|
|
484
|
+
},
|
|
485
|
+
sink: request.sink,
|
|
486
|
+
actionSlot: 'primary',
|
|
487
|
+
canonicalInput: request.canonicalInput,
|
|
488
|
+
};
|
|
489
|
+
const proposedActionId = deriveVcMeetingActionId(actionIdentity);
|
|
490
|
+
const proposedInputHash = computeInputHash(request.canonicalInput);
|
|
491
|
+
const existing = findVcMeetingAction(deps.dataDir, {
|
|
492
|
+
listenerAppId: origin.listenerAppId,
|
|
493
|
+
meetingId: origin.meetingId,
|
|
494
|
+
}, proposedActionId);
|
|
495
|
+
if (existing) {
|
|
496
|
+
if (existing.inputHash !== proposedInputHash) {
|
|
497
|
+
return errorResult(409, 'action_input_mismatch', 'this IM message already has an action for the sink; treat it as handled and do not change content or slot', existing);
|
|
498
|
+
}
|
|
499
|
+
if (existing.agentAppId !== deps.selfAgentAppId) {
|
|
500
|
+
return errorResult(409, 'wrong_agent', 'existing action belongs to another consumer agent');
|
|
501
|
+
}
|
|
502
|
+
if (existing.status !== 'requested')
|
|
503
|
+
return imExistingResult(existing);
|
|
504
|
+
}
|
|
505
|
+
const begun = beginVcMeetingAction(deps.dataDir, actionIdentity, now);
|
|
506
|
+
if (begun.kind === 'conflict') {
|
|
507
|
+
if (begun.reason === 'input_mismatch') {
|
|
508
|
+
return errorResult(409, 'action_input_mismatch', 'this IM message already has an action for the sink; treat it as handled and do not change content or slot', begun.record);
|
|
509
|
+
}
|
|
510
|
+
return errorResult(400, `action_${begun.reason}`, begun.detail ?? 'action intent is invalid', begun.record);
|
|
511
|
+
}
|
|
512
|
+
let record = begun.record;
|
|
513
|
+
if (record.agentAppId !== deps.selfAgentAppId) {
|
|
514
|
+
return errorResult(409, 'wrong_agent', 'existing action belongs to another consumer agent');
|
|
515
|
+
}
|
|
516
|
+
if (begun.kind === 'existing' && record.status !== 'requested')
|
|
517
|
+
return imExistingResult(record);
|
|
518
|
+
const rejectFencing = (code, message) => rejectNewAction(deps, record, 409, code, message, now);
|
|
519
|
+
const current = currentProjection(deps.dataDir, historicalProjection);
|
|
520
|
+
if (current.maxEpoch !== origin.memberEpoch) {
|
|
521
|
+
return rejectFencing('stale_member_epoch', 'IM turn member epoch is no longer current');
|
|
522
|
+
}
|
|
523
|
+
if (!current.projection) {
|
|
524
|
+
return rejectFencing('projection_not_found', 'current membership projection was not found');
|
|
525
|
+
}
|
|
526
|
+
if (current.projection.status !== 'active') {
|
|
527
|
+
return rejectFencing(`membership_${current.projection.status}`, `membership is ${current.projection.status}`);
|
|
528
|
+
}
|
|
529
|
+
if (current.projection.receiverSessionId !== origin.receiverSessionId) {
|
|
530
|
+
return rejectFencing('receiver_session_changed', 'current membership uses a different receiver session');
|
|
531
|
+
}
|
|
532
|
+
if (current.projection.agentAppId !== deps.selfAgentAppId) {
|
|
533
|
+
return rejectFencing('wrong_agent', 'current membership belongs to another consumer agent');
|
|
534
|
+
}
|
|
535
|
+
if (current.projection.ownerEpoch !== origin.ownerEpoch) {
|
|
536
|
+
return rejectFencing('stale_owner_epoch', 'IM turn meeting owner epoch is no longer current');
|
|
537
|
+
}
|
|
538
|
+
if (current.projection.ownerBootId !== origin.ownerBootId) {
|
|
539
|
+
return rejectFencing('stale_owner_boot', 'IM turn meeting owner boot is no longer current');
|
|
540
|
+
}
|
|
541
|
+
if (!isPositiveSafeInteger(current.projection.sinkOwnerGeneration)) {
|
|
542
|
+
return rejectFencing('projection_policy_invalid', 'current membership has no valid sink owner generation');
|
|
543
|
+
}
|
|
544
|
+
if (record.ownerGeneration !== current.projection.sinkOwnerGeneration) {
|
|
545
|
+
return rejectFencing('stale_owner_generation', 'action authorization snapshot is no longer current');
|
|
546
|
+
}
|
|
547
|
+
let authorization;
|
|
548
|
+
try {
|
|
549
|
+
authorization = await deps.authorize({
|
|
550
|
+
request,
|
|
551
|
+
projection: current.projection,
|
|
552
|
+
action: record,
|
|
553
|
+
sink: request.sink,
|
|
554
|
+
});
|
|
555
|
+
}
|
|
556
|
+
catch (err) {
|
|
557
|
+
return errorResult(503, 'authorization_unavailable', err instanceof Error ? err.message : String(err), record);
|
|
558
|
+
}
|
|
559
|
+
if (!authorization || !['allow', 'approval', 'deny'].includes(authorization.kind)) {
|
|
560
|
+
return errorResult(503, 'authorization_invalid_result', 'authorization callback returned an invalid decision', record);
|
|
561
|
+
}
|
|
562
|
+
if (authorization.kind === 'deny') {
|
|
563
|
+
const allowedReasons = new Set([
|
|
564
|
+
'listener_session_inactive',
|
|
565
|
+
'meeting_phase_closed',
|
|
566
|
+
'capability_denied',
|
|
567
|
+
'not_sink_owner',
|
|
568
|
+
'output_policy_denied',
|
|
569
|
+
]);
|
|
570
|
+
if (!allowedReasons.has(authorization.reason)) {
|
|
571
|
+
return errorResult(503, 'authorization_invalid_result', 'authorization denial reason is invalid', record);
|
|
572
|
+
}
|
|
573
|
+
return rejectNewAction(deps, record, rejectStatus(authorization.reason), authorization.reason, authorization.detail ?? `managed meeting action denied: ${authorization.reason}`, now);
|
|
574
|
+
}
|
|
575
|
+
if (authorization.kind === 'approval') {
|
|
576
|
+
const pending = markVcMeetingActionPendingApproval(deps.dataDir, actionRef(record), now);
|
|
577
|
+
if (pending.kind === 'conflict') {
|
|
578
|
+
return errorResult(500, 'approval_transition_failed', `could not persist approval state: ${pending.reason}`, record);
|
|
579
|
+
}
|
|
580
|
+
record = pending.record;
|
|
581
|
+
const claimed = claimVcMeetingApprovalCardAttempt(deps.dataDir, actionRef(record), now);
|
|
582
|
+
if (claimed.kind === 'existing')
|
|
583
|
+
return imExistingResult(claimed.record);
|
|
584
|
+
if (claimed.kind === 'conflict') {
|
|
585
|
+
return errorResult(500, 'approval_claim_failed', `could not claim approval presentation: ${claimed.reason}`, record);
|
|
586
|
+
}
|
|
587
|
+
record = claimed.record;
|
|
588
|
+
return {
|
|
589
|
+
status: 202,
|
|
590
|
+
body: {
|
|
591
|
+
ok: true,
|
|
592
|
+
kind: 'needsApproval',
|
|
593
|
+
action: record,
|
|
594
|
+
plan: {
|
|
595
|
+
actionId: record.actionId,
|
|
596
|
+
inputHash: record.inputHash,
|
|
597
|
+
providerKey: record.approvalCard.providerKey,
|
|
598
|
+
sink: record.sink,
|
|
599
|
+
canonicalInput: structuredClone(record.canonicalInput),
|
|
600
|
+
...(request.reason ? { reason: request.reason } : {}),
|
|
601
|
+
},
|
|
602
|
+
},
|
|
603
|
+
};
|
|
604
|
+
}
|
|
605
|
+
const claimed = claimVcMeetingActionAttempt(deps.dataDir, actionRef(record), now);
|
|
606
|
+
if (claimed.kind === 'existing')
|
|
607
|
+
return imExistingResult(claimed.record);
|
|
608
|
+
if (claimed.kind === 'conflict') {
|
|
609
|
+
return errorResult(500, 'provider_claim_failed', `could not claim provider execution: ${claimed.reason}`, record);
|
|
610
|
+
}
|
|
611
|
+
record = claimed.record;
|
|
612
|
+
return {
|
|
613
|
+
status: 202,
|
|
614
|
+
body: { ok: true, kind: 'execute', action: record, plan: genericExecutionPlan(record) },
|
|
615
|
+
};
|
|
616
|
+
}
|
|
617
|
+
/** Persist the provider terminal result after executing an `execute` plan. */
|
|
618
|
+
export function finishVcMeetingManagedActionProvider(dataDir, input, now = Date.now()) {
|
|
619
|
+
const { status, externalRefs, errorCode, ...ref } = input;
|
|
620
|
+
return finishVcMeetingAction(dataDir, ref, {
|
|
621
|
+
status,
|
|
622
|
+
...(externalRefs ? { externalRefs } : {}),
|
|
623
|
+
...(errorCode ? { errorCode } : {}),
|
|
624
|
+
}, now);
|
|
625
|
+
}
|
|
626
|
+
/** Persist the approval-card provider result after a `needsApproval` plan. */
|
|
627
|
+
export function finishVcMeetingManagedApprovalCard(dataDir, input, now = Date.now()) {
|
|
628
|
+
const { status, externalRefs, errorCode, ...ref } = input;
|
|
629
|
+
return finishVcMeetingApprovalCard(dataDir, ref, {
|
|
630
|
+
status,
|
|
631
|
+
...(externalRefs ? { externalRefs } : {}),
|
|
632
|
+
...(errorCode ? { errorCode } : {}),
|
|
633
|
+
}, now);
|
|
634
|
+
}
|
|
635
|
+
function approvalResolutionFromTransition(result) {
|
|
636
|
+
if (result.kind === 'conflict') {
|
|
637
|
+
return {
|
|
638
|
+
kind: 'conflict',
|
|
639
|
+
reason: result.reason,
|
|
640
|
+
...(result.record ? { action: result.record } : {}),
|
|
641
|
+
};
|
|
642
|
+
}
|
|
643
|
+
return {
|
|
644
|
+
kind: result.kind === 'existing' ? 'existing' : 'resolved',
|
|
645
|
+
action: result.record,
|
|
646
|
+
};
|
|
647
|
+
}
|
|
648
|
+
function expireApprovalAfterFenceFailure(dataDir, ref, opts, errorCode, now) {
|
|
649
|
+
return approvalResolutionFromTransition(resolveVcMeetingActionApproval(dataDir, ref, 'expired', {
|
|
650
|
+
...(opts.externalRefs ? { externalRefs: opts.externalRefs } : {}),
|
|
651
|
+
errorCode,
|
|
652
|
+
}, now));
|
|
653
|
+
}
|
|
654
|
+
function validateApprovalStructuralFence(dataDir, action) {
|
|
655
|
+
const historicalProjection = getVcMeetingMemberProjection(dataDir, {
|
|
656
|
+
listenerAppId: action.listenerAppId,
|
|
657
|
+
meetingId: action.meetingId,
|
|
658
|
+
memberId: action.memberId,
|
|
659
|
+
memberEpoch: action.memberEpoch,
|
|
660
|
+
});
|
|
661
|
+
if (!historicalProjection)
|
|
662
|
+
return { ok: false, errorCode: 'projection_not_found' };
|
|
663
|
+
const current = currentProjection(dataDir, historicalProjection);
|
|
664
|
+
if (current.maxEpoch !== action.memberEpoch) {
|
|
665
|
+
return { ok: false, errorCode: 'stale_member_epoch' };
|
|
666
|
+
}
|
|
667
|
+
if (!current.projection)
|
|
668
|
+
return { ok: false, errorCode: 'projection_not_found' };
|
|
669
|
+
if (current.projection.status !== 'active') {
|
|
670
|
+
return { ok: false, errorCode: `membership_${current.projection.status}` };
|
|
671
|
+
}
|
|
672
|
+
if (current.projection.agentAppId !== action.agentAppId) {
|
|
673
|
+
return { ok: false, errorCode: 'wrong_agent' };
|
|
674
|
+
}
|
|
675
|
+
if (!isPositiveSafeInteger(current.projection.sinkOwnerGeneration)) {
|
|
676
|
+
return { ok: false, errorCode: 'projection_policy_invalid' };
|
|
677
|
+
}
|
|
678
|
+
if (current.projection.sinkOwnerGeneration !== action.ownerGeneration) {
|
|
679
|
+
return { ok: false, errorCode: 'stale_owner_generation' };
|
|
680
|
+
}
|
|
681
|
+
return { ok: true, projection: current.projection };
|
|
682
|
+
}
|
|
683
|
+
/**
|
|
684
|
+
* Apply a human approval decision. Approval write and provider claim are both
|
|
685
|
+
* durable before an execution plan is returned.
|
|
686
|
+
*/
|
|
687
|
+
export async function resolveVcMeetingManagedActionApproval(dataDir, ref, decision, opts = {}, now = Date.now()) {
|
|
688
|
+
if (decision === 'approved') {
|
|
689
|
+
const action = findVcMeetingAction(dataDir, {
|
|
690
|
+
listenerAppId: ref.listenerAppId,
|
|
691
|
+
meetingId: ref.meetingId,
|
|
692
|
+
}, ref.actionId);
|
|
693
|
+
if (!action)
|
|
694
|
+
return { kind: 'conflict', reason: 'not_found' };
|
|
695
|
+
if (action.inputHash !== ref.inputHash) {
|
|
696
|
+
return { kind: 'conflict', reason: 'input_mismatch', action };
|
|
697
|
+
}
|
|
698
|
+
// Replays after the write-ahead claim or a terminal result disclose the
|
|
699
|
+
// established lifecycle without consulting mutable current authority.
|
|
700
|
+
if (action.status === 'attempting' || isVcMeetingActionTerminal(action.status)) {
|
|
701
|
+
return { kind: 'existing', action };
|
|
702
|
+
}
|
|
703
|
+
if (action.status !== 'pendingApproval' && action.status !== 'approved') {
|
|
704
|
+
return { kind: 'conflict', reason: 'invalid_transition', action };
|
|
705
|
+
}
|
|
706
|
+
const beforeAuthorization = validateApprovalStructuralFence(dataDir, action);
|
|
707
|
+
if (!beforeAuthorization.ok) {
|
|
708
|
+
return expireApprovalAfterFenceFailure(dataDir, ref, opts, beforeAuthorization.errorCode, now);
|
|
709
|
+
}
|
|
710
|
+
if (!opts.revalidate) {
|
|
711
|
+
return { kind: 'conflict', reason: 'approval_revalidation_required', action };
|
|
712
|
+
}
|
|
713
|
+
let authorization;
|
|
714
|
+
try {
|
|
715
|
+
authorization = await opts.revalidate({
|
|
716
|
+
projection: beforeAuthorization.projection,
|
|
717
|
+
action,
|
|
718
|
+
sink: action.sink,
|
|
719
|
+
});
|
|
720
|
+
}
|
|
721
|
+
catch {
|
|
722
|
+
return { kind: 'conflict', reason: 'authorization_unavailable', action };
|
|
723
|
+
}
|
|
724
|
+
if (!authorization || !['allow', 'approval', 'deny'].includes(authorization.kind)) {
|
|
725
|
+
return { kind: 'conflict', reason: 'authorization_invalid_result', action };
|
|
726
|
+
}
|
|
727
|
+
if (authorization.kind === 'deny') {
|
|
728
|
+
return expireApprovalAfterFenceFailure(dataDir, ref, opts, authorization.reason, now);
|
|
729
|
+
}
|
|
730
|
+
// The live phase hook may be asynchronous. Re-read cross-process member
|
|
731
|
+
// fences after it resolves so a concurrent remove/re-add or owner transfer
|
|
732
|
+
// cannot win the await window and then be followed by a stale claim.
|
|
733
|
+
const beforeClaim = validateApprovalStructuralFence(dataDir, action);
|
|
734
|
+
if (!beforeClaim.ok) {
|
|
735
|
+
return expireApprovalAfterFenceFailure(dataDir, ref, opts, beforeClaim.errorCode, now);
|
|
736
|
+
}
|
|
737
|
+
const claimed = approveAndClaimVcMeetingAction(dataDir, ref, {
|
|
738
|
+
...(opts.externalRefs ? { externalRefs: opts.externalRefs } : {}),
|
|
739
|
+
}, now);
|
|
740
|
+
if (claimed.kind === 'conflict') {
|
|
741
|
+
return { kind: 'conflict', reason: claimed.reason, ...(claimed.record ? { action: claimed.record } : {}) };
|
|
742
|
+
}
|
|
743
|
+
if (claimed.kind === 'existing')
|
|
744
|
+
return { kind: 'existing', action: claimed.record };
|
|
745
|
+
return { kind: 'execute', action: claimed.record, plan: executionPlan(claimed.record) };
|
|
746
|
+
}
|
|
747
|
+
return approvalResolutionFromTransition(resolveVcMeetingActionApproval(dataDir, ref, decision, {
|
|
748
|
+
...(opts.externalRefs ? { externalRefs: opts.externalRefs } : {}),
|
|
749
|
+
...(opts.errorCode ? { errorCode: opts.errorCode } : {}),
|
|
750
|
+
}, now));
|
|
751
|
+
}
|
|
752
|
+
/** Useful to callers deciding whether an existing result is final for display. */
|
|
753
|
+
export function isVcMeetingManagedActionTerminal(record) {
|
|
754
|
+
return isVcMeetingActionTerminal(record.status);
|
|
755
|
+
}
|
|
756
|
+
//# sourceMappingURL=vc-meeting-action-gate.js.map
|