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,665 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filesystem store for v3 Saved Workflows.
|
|
3
|
+
*
|
|
4
|
+
* The caller always supplies `dataDir`; this store never consults HOME/cwd and
|
|
5
|
+
* therefore cannot accidentally mix the new library with the legacy workflow
|
|
6
|
+
* search paths. Mutable metadata updates are locked + atomic. Revision files
|
|
7
|
+
* are immutable, content-addressed, and installed without replacement.
|
|
8
|
+
*/
|
|
9
|
+
import { constants as fsConstants, promises as fs } from 'node:fs';
|
|
10
|
+
import { randomUUID } from 'node:crypto';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
import { atomicWriteFile } from '../../utils/atomic-write.js';
|
|
13
|
+
import { fsyncDirectorySyncPortable, fsyncRegularFileSync, } from '../../utils/fs-durability.js';
|
|
14
|
+
import { withFileLock } from '../../utils/file-lock.js';
|
|
15
|
+
import { SAVED_WORKFLOW_ID_RE, SAVED_WORKFLOW_METADATA_SCHEMA_VERSION, SAVED_WORKFLOW_REVISION_ID_RE, buildSavedWorkflowRevision, canonicalJsonStringify, loadSavedWorkflowRevision, mintSavedWorkflowId, normalizeSavedWorkflowLookupKey, validateSavedWorkflowMetadata, } from './library-schema.js';
|
|
16
|
+
const LIBRARY_DIR = 'workflow-library';
|
|
17
|
+
const METADATA_FILE = 'metadata.json';
|
|
18
|
+
const REVISIONS_DIR = 'revisions';
|
|
19
|
+
export class SavedWorkflowNotFoundError extends Error {
|
|
20
|
+
workflowId;
|
|
21
|
+
constructor(workflowId) {
|
|
22
|
+
super(`Saved workflow '${workflowId}' not found`);
|
|
23
|
+
this.workflowId = workflowId;
|
|
24
|
+
this.name = 'SavedWorkflowNotFoundError';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export class SavedWorkflowPermissionError extends Error {
|
|
28
|
+
workflowId;
|
|
29
|
+
constructor(workflowId) {
|
|
30
|
+
super(`Only the owner may modify saved workflow '${workflowId}'`);
|
|
31
|
+
this.workflowId = workflowId;
|
|
32
|
+
this.name = 'SavedWorkflowPermissionError';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export class SavedWorkflowConflictError extends Error {
|
|
36
|
+
constructor(message) {
|
|
37
|
+
super(message);
|
|
38
|
+
this.name = 'SavedWorkflowConflictError';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export function workflowLibraryRoot(dataDir) {
|
|
42
|
+
if (!dataDir)
|
|
43
|
+
throw new Error('dataDir is required');
|
|
44
|
+
return join(dataDir, LIBRARY_DIR);
|
|
45
|
+
}
|
|
46
|
+
export function savedWorkflowDir(dataDir, workflowId) {
|
|
47
|
+
assertWorkflowId(workflowId);
|
|
48
|
+
return join(workflowLibraryRoot(dataDir), workflowId);
|
|
49
|
+
}
|
|
50
|
+
export function savedWorkflowMetadataPath(dataDir, workflowId) {
|
|
51
|
+
return join(savedWorkflowDir(dataDir, workflowId), METADATA_FILE);
|
|
52
|
+
}
|
|
53
|
+
/** Stable lock outside the not-yet-created workflow directory. */
|
|
54
|
+
function savedWorkflowMutationLockTarget(dataDir, workflowId) {
|
|
55
|
+
assertWorkflowId(workflowId);
|
|
56
|
+
return join(workflowLibraryRoot(dataDir), `.mutation-${workflowId}`);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Existing workflows take both the stable library lock and the pre-v3.1
|
|
60
|
+
* metadata lock. This preserves mutual exclusion during a coordinated rolling
|
|
61
|
+
* upgrade while keeping the stable lock available before a workflow directory
|
|
62
|
+
* exists. Lock order is always stable -> legacy metadata; no new caller takes
|
|
63
|
+
* the reverse order.
|
|
64
|
+
*/
|
|
65
|
+
function withExistingSavedWorkflowMutationLock(dataDir, workflowId, fn) {
|
|
66
|
+
return withFileLock(savedWorkflowMutationLockTarget(dataDir, workflowId), () => withFileLock(savedWorkflowMetadataPath(dataDir, workflowId), fn));
|
|
67
|
+
}
|
|
68
|
+
export function savedWorkflowRevisionPath(dataDir, workflowId, revisionId) {
|
|
69
|
+
assertRevisionId(revisionId);
|
|
70
|
+
return join(savedWorkflowDir(dataDir, workflowId), REVISIONS_DIR, `${revisionId}.json`);
|
|
71
|
+
}
|
|
72
|
+
function assertWorkflowId(workflowId) {
|
|
73
|
+
if (!SAVED_WORKFLOW_ID_RE.test(workflowId)) {
|
|
74
|
+
throw new Error(`Invalid saved workflow id: ${JSON.stringify(workflowId)}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function assertRevisionId(revisionId) {
|
|
78
|
+
if (!SAVED_WORKFLOW_REVISION_ID_RE.test(revisionId)) {
|
|
79
|
+
throw new Error(`Invalid saved workflow revision id: ${JSON.stringify(revisionId)}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function sameOwner(a, b) {
|
|
83
|
+
return !!a && a.openId === b.openId && a.larkAppId === b.larkAppId;
|
|
84
|
+
}
|
|
85
|
+
function assertOwner(metadata, actor) {
|
|
86
|
+
if (!sameOwner(metadata.owner, actor))
|
|
87
|
+
throw new SavedWorkflowPermissionError(metadata.workflowId);
|
|
88
|
+
}
|
|
89
|
+
function buildRevisionPayload(workflowId, humanVersion, createdAt, createdBy, draft) {
|
|
90
|
+
return {
|
|
91
|
+
...draft,
|
|
92
|
+
workflowId,
|
|
93
|
+
humanVersion,
|
|
94
|
+
createdAt,
|
|
95
|
+
createdBy,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
function loadedFromStored(stored) {
|
|
99
|
+
return loadSavedWorkflowRevision(stored, {
|
|
100
|
+
workflowId: stored.payload.workflowId,
|
|
101
|
+
revisionId: stored.revisionId,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
function exactLibraryBytes(input) {
|
|
105
|
+
const metadata = validateSavedWorkflowMetadata(input.expectedMetadata);
|
|
106
|
+
if (canonicalJsonStringify(metadata) !== canonicalJsonStringify(input.expectedMetadata)) {
|
|
107
|
+
throw new SavedWorkflowConflictError('Expected Saved Workflow metadata is not canonical');
|
|
108
|
+
}
|
|
109
|
+
const revisionKeys = Object.keys(input.expectedRevision).sort();
|
|
110
|
+
if (canonicalJsonStringify(revisionKeys) !== canonicalJsonStringify([
|
|
111
|
+
'contentHash', 'payload', 'revisionId', 'schemaVersion',
|
|
112
|
+
])) {
|
|
113
|
+
throw new SavedWorkflowConflictError('Expected Saved Workflow revision has unsupported fields');
|
|
114
|
+
}
|
|
115
|
+
const loadedRevision = loadSavedWorkflowRevision(input.expectedRevision, {
|
|
116
|
+
workflowId: metadata.workflowId,
|
|
117
|
+
revisionId: input.expectedRevision.revisionId,
|
|
118
|
+
});
|
|
119
|
+
const rebuiltRevision = buildSavedWorkflowRevision(loadedRevision.payload);
|
|
120
|
+
if (canonicalJsonStringify(rebuiltRevision) !== canonicalJsonStringify(input.expectedRevision)) {
|
|
121
|
+
throw new SavedWorkflowConflictError('Expected Saved Workflow revision is not canonical');
|
|
122
|
+
}
|
|
123
|
+
if (metadata.latestRevision !== loadedRevision.revisionId ||
|
|
124
|
+
(metadata.publishedRevision !== undefined && metadata.publishedRevision !== loadedRevision.revisionId)) {
|
|
125
|
+
throw new SavedWorkflowConflictError('Expected Saved Workflow metadata/revision pointers do not match');
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
metadata,
|
|
129
|
+
revision: input.expectedRevision,
|
|
130
|
+
metadataBytes: `${canonicalJsonStringify(metadata)}\n`,
|
|
131
|
+
revisionBytes: `${canonicalJsonStringify(input.expectedRevision)}\n`,
|
|
132
|
+
loadedRevision,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
function exactMode(stat, expected) {
|
|
136
|
+
return process.platform === 'win32' || (stat.mode & 0o777) === expected;
|
|
137
|
+
}
|
|
138
|
+
async function assertExactPrivateDirectory(path, label) {
|
|
139
|
+
let stat;
|
|
140
|
+
try {
|
|
141
|
+
stat = await fs.lstat(path);
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
if (error.code === 'ENOENT') {
|
|
145
|
+
throw new SavedWorkflowNotFoundError(label);
|
|
146
|
+
}
|
|
147
|
+
throw error;
|
|
148
|
+
}
|
|
149
|
+
if (!stat.isDirectory() || stat.isSymbolicLink() || !exactMode(stat, 0o700)) {
|
|
150
|
+
throw new SavedWorkflowConflictError(`Saved Workflow ${label} has unsafe directory topology or permissions`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
async function readPrivateFileBytes(path, label) {
|
|
154
|
+
let before;
|
|
155
|
+
try {
|
|
156
|
+
before = await fs.lstat(path);
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
if (error.code === 'ENOENT') {
|
|
160
|
+
throw new SavedWorkflowConflictError(`Saved Workflow ${label} is missing`);
|
|
161
|
+
}
|
|
162
|
+
throw error;
|
|
163
|
+
}
|
|
164
|
+
if (!before.isFile() || before.isSymbolicLink() || !exactMode(before, 0o600) ||
|
|
165
|
+
(process.platform !== 'win32' && before.nlink !== 1)) {
|
|
166
|
+
throw new SavedWorkflowConflictError(`Saved Workflow ${label} has unsafe file topology or permissions`);
|
|
167
|
+
}
|
|
168
|
+
const noFollow = fsConstants.O_NOFOLLOW ?? 0;
|
|
169
|
+
const handle = await fs.open(path, fsConstants.O_RDONLY | noFollow);
|
|
170
|
+
try {
|
|
171
|
+
const opened = await handle.stat();
|
|
172
|
+
if (opened.dev !== before.dev || opened.ino !== before.ino || !opened.isFile()) {
|
|
173
|
+
throw new SavedWorkflowConflictError(`Saved Workflow ${label} changed while being verified`);
|
|
174
|
+
}
|
|
175
|
+
const bytes = await handle.readFile({ encoding: 'utf8' });
|
|
176
|
+
const after = await handle.stat();
|
|
177
|
+
const finalPath = await fs.lstat(path);
|
|
178
|
+
if (after.dev !== opened.dev || after.ino !== opened.ino || after.size !== opened.size ||
|
|
179
|
+
after.mtimeMs !== opened.mtimeMs || after.ctimeMs !== opened.ctimeMs ||
|
|
180
|
+
finalPath.dev !== opened.dev || finalPath.ino !== opened.ino ||
|
|
181
|
+
!finalPath.isFile() || finalPath.isSymbolicLink() ||
|
|
182
|
+
!exactMode(finalPath, 0o600) ||
|
|
183
|
+
(process.platform !== 'win32' && finalPath.nlink !== 1)) {
|
|
184
|
+
throw new SavedWorkflowConflictError(`Saved Workflow ${label} changed while being verified`);
|
|
185
|
+
}
|
|
186
|
+
return bytes;
|
|
187
|
+
}
|
|
188
|
+
finally {
|
|
189
|
+
await handle.close();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
async function readExactPrivateFile(path, expected, label) {
|
|
193
|
+
if (await readPrivateFileBytes(path, label) !== expected) {
|
|
194
|
+
throw new SavedWorkflowConflictError(`Saved Workflow ${label} bytes do not match the expected object`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
async function assertExactSavedWorkflowDirectory(dataDir, expected) {
|
|
198
|
+
const workflowId = expected.metadata.workflowId;
|
|
199
|
+
const dir = savedWorkflowDir(dataDir, workflowId);
|
|
200
|
+
const revisionsDir = join(dir, REVISIONS_DIR);
|
|
201
|
+
await assertExactPrivateDirectory(dir, workflowId);
|
|
202
|
+
const rootEntries = (await fs.readdir(dir)).sort();
|
|
203
|
+
if (canonicalJsonStringify(rootEntries) !== canonicalJsonStringify([METADATA_FILE, REVISIONS_DIR])) {
|
|
204
|
+
throw new SavedWorkflowConflictError(`Saved workflow '${workflowId}' has unexpected entries`);
|
|
205
|
+
}
|
|
206
|
+
await assertExactPrivateDirectory(revisionsDir, `${workflowId}/${REVISIONS_DIR}`);
|
|
207
|
+
const revisionName = `${expected.revision.revisionId}.json`;
|
|
208
|
+
const revisionEntries = await fs.readdir(revisionsDir);
|
|
209
|
+
if (revisionEntries.length !== 1 || revisionEntries[0] !== revisionName) {
|
|
210
|
+
throw new SavedWorkflowConflictError(`Saved workflow '${workflowId}' has unexpected revisions`);
|
|
211
|
+
}
|
|
212
|
+
await readExactPrivateFile(savedWorkflowMetadataPath(dataDir, workflowId), expected.metadataBytes, `${workflowId}/${METADATA_FILE}`);
|
|
213
|
+
await readExactPrivateFile(savedWorkflowRevisionPath(dataDir, workflowId, expected.revision.revisionId), expected.revisionBytes, `${workflowId}/${REVISIONS_DIR}/${revisionName}`);
|
|
214
|
+
}
|
|
215
|
+
async function writePrivateStagedFile(path, bytes) {
|
|
216
|
+
await fs.writeFile(path, bytes, { flag: 'wx', mode: 0o600 });
|
|
217
|
+
await fs.chmod(path, 0o600);
|
|
218
|
+
fsyncRegularFileSync(path);
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Publish one deterministic Saved Workflow as an all-or-nothing directory.
|
|
222
|
+
* The final target is never cleaned up or repaired in place. Recovery accepts
|
|
223
|
+
* it only after exact topology, permission, and canonical-byte verification.
|
|
224
|
+
*/
|
|
225
|
+
export async function createOrRecoverExactSavedWorkflow(dataDir, input) {
|
|
226
|
+
const expected = exactLibraryBytes(input);
|
|
227
|
+
const workflowId = expected.metadata.workflowId;
|
|
228
|
+
const root = workflowLibraryRoot(dataDir);
|
|
229
|
+
await fs.mkdir(root, { recursive: true, mode: 0o700 });
|
|
230
|
+
fsyncDirectorySyncPortable(dataDir);
|
|
231
|
+
const lockTarget = savedWorkflowMutationLockTarget(dataDir, workflowId);
|
|
232
|
+
return withFileLock(lockTarget, async () => {
|
|
233
|
+
try {
|
|
234
|
+
await assertExactSavedWorkflowDirectory(dataDir, expected);
|
|
235
|
+
// A prior process may have renamed the final directory and crashed
|
|
236
|
+
// before fsyncing the library root. Recovery must close that durability
|
|
237
|
+
// window before it reports the exact object as committed.
|
|
238
|
+
fsyncRegularFileSync(savedWorkflowMetadataPath(dataDir, workflowId));
|
|
239
|
+
fsyncRegularFileSync(savedWorkflowRevisionPath(dataDir, workflowId, expected.revision.revisionId));
|
|
240
|
+
fsyncDirectorySyncPortable(join(savedWorkflowDir(dataDir, workflowId), REVISIONS_DIR));
|
|
241
|
+
fsyncDirectorySyncPortable(savedWorkflowDir(dataDir, workflowId));
|
|
242
|
+
fsyncDirectorySyncPortable(root);
|
|
243
|
+
return { metadata: expected.metadata, revision: expected.loadedRevision, created: false };
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
if (!(error instanceof SavedWorkflowNotFoundError))
|
|
247
|
+
throw error;
|
|
248
|
+
if (input.createIfMissing === false)
|
|
249
|
+
throw error;
|
|
250
|
+
}
|
|
251
|
+
const stage = join(root, `.staging-exact-${workflowId}-${randomUUID()}`);
|
|
252
|
+
const stagedRevisions = join(stage, REVISIONS_DIR);
|
|
253
|
+
let stageOwned = false;
|
|
254
|
+
try {
|
|
255
|
+
await fs.mkdir(stage, { mode: 0o700 });
|
|
256
|
+
stageOwned = true;
|
|
257
|
+
await fs.chmod(stage, 0o700);
|
|
258
|
+
await fs.mkdir(stagedRevisions, { mode: 0o700 });
|
|
259
|
+
await fs.chmod(stagedRevisions, 0o700);
|
|
260
|
+
await writePrivateStagedFile(join(stage, METADATA_FILE), expected.metadataBytes);
|
|
261
|
+
await writePrivateStagedFile(join(stagedRevisions, `${expected.revision.revisionId}.json`), expected.revisionBytes);
|
|
262
|
+
fsyncDirectorySyncPortable(stagedRevisions);
|
|
263
|
+
fsyncDirectorySyncPortable(stage);
|
|
264
|
+
// The workflow-specific lock serializes cooperating publishers. Refuse
|
|
265
|
+
// any pre-existing final path; in particular, never rm or adopt a
|
|
266
|
+
// foreign partial directory.
|
|
267
|
+
try {
|
|
268
|
+
await fs.lstat(savedWorkflowDir(dataDir, workflowId));
|
|
269
|
+
throw new SavedWorkflowConflictError(`Saved workflow '${workflowId}' already exists incompletely`);
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
if (error.code !== 'ENOENT')
|
|
273
|
+
throw error;
|
|
274
|
+
}
|
|
275
|
+
await fs.rename(stage, savedWorkflowDir(dataDir, workflowId));
|
|
276
|
+
stageOwned = false;
|
|
277
|
+
fsyncDirectorySyncPortable(root);
|
|
278
|
+
await assertExactSavedWorkflowDirectory(dataDir, expected);
|
|
279
|
+
return { metadata: expected.metadata, revision: expected.loadedRevision, created: true };
|
|
280
|
+
}
|
|
281
|
+
finally {
|
|
282
|
+
if (stageOwned) {
|
|
283
|
+
try {
|
|
284
|
+
await fs.rm(stage, { recursive: true, force: true });
|
|
285
|
+
}
|
|
286
|
+
catch { /* owned staging only */ }
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Recover an exact publisher after its original single-revision directory was
|
|
293
|
+
* legitimately advanced by ordinary owner mutations. The immutable origin
|
|
294
|
+
* revision must still have the exact canonical bytes and private topology that
|
|
295
|
+
* were approved; current metadata and later revisions are read under the same
|
|
296
|
+
* workflow mutation lock and must themselves remain canonical private files.
|
|
297
|
+
*/
|
|
298
|
+
export async function verifyExactSavedWorkflowOrigin(dataDir, input) {
|
|
299
|
+
const expected = exactLibraryBytes(input);
|
|
300
|
+
const workflowId = expected.metadata.workflowId;
|
|
301
|
+
return withExistingSavedWorkflowMutationLock(dataDir, workflowId, async () => {
|
|
302
|
+
const dir = savedWorkflowDir(dataDir, workflowId);
|
|
303
|
+
const revisionsDir = join(dir, REVISIONS_DIR);
|
|
304
|
+
await assertExactPrivateDirectory(dir, workflowId);
|
|
305
|
+
const rootEntries = (await fs.readdir(dir)).sort();
|
|
306
|
+
// This verifier deliberately holds the legacy metadata lock as the inner
|
|
307
|
+
// half of the rolling-upgrade dual lock. Stale-break protocols may leave
|
|
308
|
+
// rigorously named, inert hard-link/owner artifacts after the public lock
|
|
309
|
+
// is gone. They never participate in metadata/revision reads, but rejecting
|
|
310
|
+
// them here would permanently wedge deterministic commit recovery.
|
|
311
|
+
const requiredRootEntries = [
|
|
312
|
+
METADATA_FILE,
|
|
313
|
+
`${METADATA_FILE}.lock`,
|
|
314
|
+
REVISIONS_DIR,
|
|
315
|
+
];
|
|
316
|
+
const allowedLockArtifact = (name) => name === `${METADATA_FILE}.lock.stale-claim` ||
|
|
317
|
+
/^\.botmux-stale-claim-[0-9a-f]{24}(?:\.owner-[0-9]{12})?$/.test(name);
|
|
318
|
+
const unexpected = rootEntries.filter((name) => !requiredRootEntries.includes(name) && !allowedLockArtifact(name));
|
|
319
|
+
if (unexpected.length > 0 || requiredRootEntries.some((name) => !rootEntries.includes(name))) {
|
|
320
|
+
throw new SavedWorkflowConflictError(`Saved workflow '${workflowId}' has unexpected entries`);
|
|
321
|
+
}
|
|
322
|
+
for (const name of rootEntries.filter(allowedLockArtifact)) {
|
|
323
|
+
const artifact = await fs.lstat(join(dir, name));
|
|
324
|
+
if (!artifact.isFile() || artifact.isSymbolicLink()) {
|
|
325
|
+
throw new SavedWorkflowConflictError(`Saved workflow '${workflowId}' has unsafe lock artifacts`);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
await assertExactPrivateDirectory(revisionsDir, `${workflowId}/${REVISIONS_DIR}`);
|
|
329
|
+
const metadataBytes = await readPrivateFileBytes(savedWorkflowMetadataPath(dataDir, workflowId), `${workflowId}/${METADATA_FILE}`);
|
|
330
|
+
let metadata;
|
|
331
|
+
try {
|
|
332
|
+
metadata = validateSavedWorkflowMetadata(JSON.parse(metadataBytes));
|
|
333
|
+
}
|
|
334
|
+
catch {
|
|
335
|
+
throw new SavedWorkflowConflictError(`Saved workflow '${workflowId}' metadata is invalid`);
|
|
336
|
+
}
|
|
337
|
+
if (metadataBytes !== `${canonicalJsonStringify(metadata)}\n`) {
|
|
338
|
+
throw new SavedWorkflowConflictError(`Saved workflow '${workflowId}' metadata is not canonical`);
|
|
339
|
+
}
|
|
340
|
+
const revisionNames = (await fs.readdir(revisionsDir)).sort();
|
|
341
|
+
const expectedName = `${expected.revision.revisionId}.json`;
|
|
342
|
+
if (!revisionNames.includes(expectedName)) {
|
|
343
|
+
throw new SavedWorkflowConflictError(`Saved workflow '${workflowId}' origin revision is missing`);
|
|
344
|
+
}
|
|
345
|
+
const loadedRevisions = [];
|
|
346
|
+
for (const name of revisionNames) {
|
|
347
|
+
const revisionId = name.endsWith('.json') ? name.slice(0, -5) : '';
|
|
348
|
+
if (!SAVED_WORKFLOW_REVISION_ID_RE.test(revisionId)) {
|
|
349
|
+
throw new SavedWorkflowConflictError(`Saved workflow '${workflowId}' has an invalid revision entry`);
|
|
350
|
+
}
|
|
351
|
+
const path = savedWorkflowRevisionPath(dataDir, workflowId, revisionId);
|
|
352
|
+
if (name === expectedName) {
|
|
353
|
+
await readExactPrivateFile(path, expected.revisionBytes, `${workflowId}/${REVISIONS_DIR}/${name}`);
|
|
354
|
+
loadedRevisions.push(expected.loadedRevision);
|
|
355
|
+
continue;
|
|
356
|
+
}
|
|
357
|
+
const bytes = await readPrivateFileBytes(path, `${workflowId}/${REVISIONS_DIR}/${name}`);
|
|
358
|
+
try {
|
|
359
|
+
const parsed = JSON.parse(bytes);
|
|
360
|
+
const loaded = loadSavedWorkflowRevision(parsed, { workflowId, revisionId });
|
|
361
|
+
if (bytes !== `${canonicalJsonStringify(buildSavedWorkflowRevision(loaded.payload))}\n`) {
|
|
362
|
+
throw new Error('non-canonical');
|
|
363
|
+
}
|
|
364
|
+
loadedRevisions.push(loaded);
|
|
365
|
+
}
|
|
366
|
+
catch {
|
|
367
|
+
throw new SavedWorkflowConflictError(`Saved workflow '${workflowId}' has an invalid revision`);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
const expectedOwner = canonicalJsonStringify(expected.metadata.owner);
|
|
371
|
+
const versions = new Map();
|
|
372
|
+
for (const revision of loadedRevisions) {
|
|
373
|
+
if (canonicalJsonStringify(revision.payload.createdBy) !== expectedOwner ||
|
|
374
|
+
versions.has(revision.payload.humanVersion)) {
|
|
375
|
+
throw new SavedWorkflowConflictError(`Saved workflow '${workflowId}' revision lineage is invalid`);
|
|
376
|
+
}
|
|
377
|
+
versions.set(revision.payload.humanVersion, revision);
|
|
378
|
+
}
|
|
379
|
+
const minVersion = expected.loadedRevision.payload.humanVersion;
|
|
380
|
+
const maxVersion = Math.max(...versions.keys());
|
|
381
|
+
for (let version = minVersion; version <= maxVersion; version++) {
|
|
382
|
+
if (!versions.has(version)) {
|
|
383
|
+
throw new SavedWorkflowConflictError(`Saved workflow '${workflowId}' revision lineage is incomplete`);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
const latest = versions.get(maxVersion);
|
|
387
|
+
const stableMetadata = metadata.workflowId === expected.metadata.workflowId &&
|
|
388
|
+
metadata.displayName === expected.metadata.displayName &&
|
|
389
|
+
canonicalJsonStringify(metadata.aliases) === canonicalJsonStringify(expected.metadata.aliases) &&
|
|
390
|
+
canonicalJsonStringify(metadata.owner) === expectedOwner &&
|
|
391
|
+
canonicalJsonStringify(metadata.scope) === canonicalJsonStringify(expected.metadata.scope) &&
|
|
392
|
+
metadata.createdAt === expected.metadata.createdAt;
|
|
393
|
+
if (!stableMetadata ||
|
|
394
|
+
(metadata.status !== 'active' && metadata.status !== 'archived') ||
|
|
395
|
+
metadata.latestRevision !== latest.revisionId ||
|
|
396
|
+
!metadata.publishedRevision ||
|
|
397
|
+
!revisionNames.includes(`${metadata.publishedRevision}.json`)) {
|
|
398
|
+
throw new SavedWorkflowConflictError(`Saved workflow '${workflowId}' metadata lineage is invalid`);
|
|
399
|
+
}
|
|
400
|
+
fsyncRegularFileSync(savedWorkflowMetadataPath(dataDir, workflowId));
|
|
401
|
+
for (const name of revisionNames) {
|
|
402
|
+
fsyncRegularFileSync(join(revisionsDir, name));
|
|
403
|
+
}
|
|
404
|
+
fsyncDirectorySyncPortable(revisionsDir);
|
|
405
|
+
fsyncDirectorySyncPortable(dir);
|
|
406
|
+
fsyncDirectorySyncPortable(workflowLibraryRoot(dataDir));
|
|
407
|
+
return { metadata, revision: expected.loadedRevision };
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
export async function createSavedWorkflow(dataDir, input) {
|
|
411
|
+
const workflowId = input.workflowId ?? mintSavedWorkflowId();
|
|
412
|
+
assertWorkflowId(workflowId);
|
|
413
|
+
const now = (input.now ?? new Date()).toISOString();
|
|
414
|
+
const stored = buildSavedWorkflowRevision(buildRevisionPayload(workflowId, 1, now, input.owner, input.revision));
|
|
415
|
+
const publish = input.publish !== false;
|
|
416
|
+
const metadata = validateSavedWorkflowMetadata({
|
|
417
|
+
schemaVersion: SAVED_WORKFLOW_METADATA_SCHEMA_VERSION,
|
|
418
|
+
workflowId,
|
|
419
|
+
displayName: input.displayName,
|
|
420
|
+
aliases: input.aliases ?? [],
|
|
421
|
+
owner: input.owner,
|
|
422
|
+
scope: input.scope,
|
|
423
|
+
status: publish ? 'active' : 'draft',
|
|
424
|
+
latestRevision: stored.revisionId,
|
|
425
|
+
...(publish ? { publishedRevision: stored.revisionId } : {}),
|
|
426
|
+
createdAt: now,
|
|
427
|
+
updatedAt: now,
|
|
428
|
+
});
|
|
429
|
+
const root = workflowLibraryRoot(dataDir);
|
|
430
|
+
const dir = savedWorkflowDir(dataDir, workflowId);
|
|
431
|
+
await fs.mkdir(root, { recursive: true, mode: 0o700 });
|
|
432
|
+
fsyncDirectorySyncPortable(dataDir);
|
|
433
|
+
return withFileLock(savedWorkflowMutationLockTarget(dataDir, workflowId), async () => {
|
|
434
|
+
try {
|
|
435
|
+
await fs.mkdir(dir, { mode: 0o700 });
|
|
436
|
+
fsyncDirectorySyncPortable(root);
|
|
437
|
+
}
|
|
438
|
+
catch (err) {
|
|
439
|
+
if (err.code === 'EEXIST') {
|
|
440
|
+
throw new SavedWorkflowConflictError(`Saved workflow '${workflowId}' already exists`);
|
|
441
|
+
}
|
|
442
|
+
throw err;
|
|
443
|
+
}
|
|
444
|
+
try {
|
|
445
|
+
await fs.mkdir(join(dir, REVISIONS_DIR), { mode: 0o700 });
|
|
446
|
+
fsyncDirectorySyncPortable(dir);
|
|
447
|
+
await writeImmutableRevision(dataDir, workflowId, stored);
|
|
448
|
+
await writeMetadata(dataDir, metadata);
|
|
449
|
+
}
|
|
450
|
+
catch (err) {
|
|
451
|
+
// The id was newly allocated by this call. A failed create is not visible
|
|
452
|
+
// through metadata, so remove its private partial directory best-effort.
|
|
453
|
+
try {
|
|
454
|
+
await fs.rm(dir, { recursive: true, force: true });
|
|
455
|
+
}
|
|
456
|
+
catch { /* best effort */ }
|
|
457
|
+
throw err;
|
|
458
|
+
}
|
|
459
|
+
return { metadata, revision: loadedFromStored(stored) };
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
export async function readSavedWorkflowMetadata(dataDir, workflowId) {
|
|
463
|
+
const path = savedWorkflowMetadataPath(dataDir, workflowId);
|
|
464
|
+
let raw;
|
|
465
|
+
try {
|
|
466
|
+
raw = await fs.readFile(path, 'utf-8');
|
|
467
|
+
}
|
|
468
|
+
catch (err) {
|
|
469
|
+
if (err.code === 'ENOENT')
|
|
470
|
+
throw new SavedWorkflowNotFoundError(workflowId);
|
|
471
|
+
throw err;
|
|
472
|
+
}
|
|
473
|
+
return validateSavedWorkflowMetadata(JSON.parse(raw));
|
|
474
|
+
}
|
|
475
|
+
export async function readSavedWorkflowRevision(dataDir, workflowId, revisionId) {
|
|
476
|
+
const path = savedWorkflowRevisionPath(dataDir, workflowId, revisionId);
|
|
477
|
+
let raw;
|
|
478
|
+
try {
|
|
479
|
+
raw = await fs.readFile(path, 'utf-8');
|
|
480
|
+
}
|
|
481
|
+
catch (err) {
|
|
482
|
+
if (err.code === 'ENOENT') {
|
|
483
|
+
throw new SavedWorkflowNotFoundError(`${workflowId}@${revisionId}`);
|
|
484
|
+
}
|
|
485
|
+
throw err;
|
|
486
|
+
}
|
|
487
|
+
return loadSavedWorkflowRevision(JSON.parse(raw), { workflowId, revisionId });
|
|
488
|
+
}
|
|
489
|
+
export async function loadCurrentSavedWorkflow(dataDir, workflowId, opts = {}) {
|
|
490
|
+
const metadata = await readSavedWorkflowMetadata(dataDir, workflowId);
|
|
491
|
+
const usePublished = (opts.revision ?? 'published') === 'published';
|
|
492
|
+
if (opts.requireActive !== false && (metadata.status !== 'active' || !metadata.publishedRevision)) {
|
|
493
|
+
throw new SavedWorkflowConflictError(`Saved workflow '${workflowId}' is not active`);
|
|
494
|
+
}
|
|
495
|
+
const revisionId = usePublished ? metadata.publishedRevision : metadata.latestRevision;
|
|
496
|
+
if (!revisionId)
|
|
497
|
+
throw new SavedWorkflowConflictError(`Saved workflow '${workflowId}' has no published revision`);
|
|
498
|
+
return { metadata, revision: await readSavedWorkflowRevision(dataDir, workflowId, revisionId) };
|
|
499
|
+
}
|
|
500
|
+
export async function appendSavedWorkflowRevision(dataDir, workflowId, input) {
|
|
501
|
+
return withExistingSavedWorkflowMutationLock(dataDir, workflowId, async () => {
|
|
502
|
+
const metadata = await readSavedWorkflowMetadata(dataDir, workflowId);
|
|
503
|
+
assertOwner(metadata, input.actor);
|
|
504
|
+
if (metadata.status === 'archived') {
|
|
505
|
+
throw new SavedWorkflowConflictError(`Saved workflow '${workflowId}' is archived`);
|
|
506
|
+
}
|
|
507
|
+
if (input.expectedLatestRevision && metadata.latestRevision !== input.expectedLatestRevision) {
|
|
508
|
+
throw new SavedWorkflowConflictError(`Saved workflow '${workflowId}' changed: expected latest ${input.expectedLatestRevision}, got ${metadata.latestRevision}`);
|
|
509
|
+
}
|
|
510
|
+
const previous = await readSavedWorkflowRevision(dataDir, workflowId, metadata.latestRevision);
|
|
511
|
+
const now = (input.now ?? new Date()).toISOString();
|
|
512
|
+
const stored = buildSavedWorkflowRevision(buildRevisionPayload(workflowId, previous.payload.humanVersion + 1, now, input.actor, input.revision));
|
|
513
|
+
await writeImmutableRevision(dataDir, workflowId, stored);
|
|
514
|
+
const publish = input.publish === true;
|
|
515
|
+
const next = validateSavedWorkflowMetadata({
|
|
516
|
+
...metadata,
|
|
517
|
+
latestRevision: stored.revisionId,
|
|
518
|
+
...(publish ? { publishedRevision: stored.revisionId } : {}),
|
|
519
|
+
status: publish || metadata.publishedRevision ? 'active' : 'draft',
|
|
520
|
+
updatedAt: now,
|
|
521
|
+
});
|
|
522
|
+
await writeMetadata(dataDir, next);
|
|
523
|
+
return { metadata: next, revision: loadedFromStored(stored) };
|
|
524
|
+
});
|
|
525
|
+
}
|
|
526
|
+
/** Publish an already-saved latest draft without creating a new revision. */
|
|
527
|
+
export async function publishLatestSavedWorkflow(dataDir, workflowId, input) {
|
|
528
|
+
return withExistingSavedWorkflowMutationLock(dataDir, workflowId, async () => {
|
|
529
|
+
const metadata = await readSavedWorkflowMetadata(dataDir, workflowId);
|
|
530
|
+
assertOwner(metadata, input.actor);
|
|
531
|
+
if (metadata.status === 'archived')
|
|
532
|
+
throw new SavedWorkflowConflictError(`Saved workflow '${workflowId}' is archived`);
|
|
533
|
+
if (input.expectedLatestRevision && input.expectedLatestRevision !== metadata.latestRevision) {
|
|
534
|
+
throw new SavedWorkflowConflictError(`Saved workflow '${workflowId}' changed: expected latest ${input.expectedLatestRevision}, got ${metadata.latestRevision}`);
|
|
535
|
+
}
|
|
536
|
+
// Validate the target before exposing it as runnable.
|
|
537
|
+
await readSavedWorkflowRevision(dataDir, workflowId, metadata.latestRevision);
|
|
538
|
+
const next = validateSavedWorkflowMetadata({
|
|
539
|
+
...metadata,
|
|
540
|
+
status: 'active',
|
|
541
|
+
publishedRevision: metadata.latestRevision,
|
|
542
|
+
updatedAt: (input.now ?? new Date()).toISOString(),
|
|
543
|
+
});
|
|
544
|
+
await writeMetadata(dataDir, next);
|
|
545
|
+
return next;
|
|
546
|
+
});
|
|
547
|
+
}
|
|
548
|
+
export async function archiveSavedWorkflow(dataDir, workflowId, input) {
|
|
549
|
+
return withExistingSavedWorkflowMutationLock(dataDir, workflowId, async () => {
|
|
550
|
+
const metadata = await readSavedWorkflowMetadata(dataDir, workflowId);
|
|
551
|
+
assertOwner(metadata, input.actor);
|
|
552
|
+
const next = validateSavedWorkflowMetadata({
|
|
553
|
+
...metadata,
|
|
554
|
+
status: 'archived',
|
|
555
|
+
updatedAt: (input.now ?? new Date()).toISOString(),
|
|
556
|
+
});
|
|
557
|
+
await writeMetadata(dataDir, next);
|
|
558
|
+
return next;
|
|
559
|
+
});
|
|
560
|
+
}
|
|
561
|
+
export async function listSavedWorkflows(dataDir, opts = {}) {
|
|
562
|
+
const root = workflowLibraryRoot(dataDir);
|
|
563
|
+
let names;
|
|
564
|
+
try {
|
|
565
|
+
names = await fs.readdir(root);
|
|
566
|
+
}
|
|
567
|
+
catch (err) {
|
|
568
|
+
if (err.code === 'ENOENT')
|
|
569
|
+
return { entries: [], invalid: [] };
|
|
570
|
+
throw err;
|
|
571
|
+
}
|
|
572
|
+
const entries = [];
|
|
573
|
+
const invalid = [];
|
|
574
|
+
for (const workflowId of names.sort()) {
|
|
575
|
+
if (!SAVED_WORKFLOW_ID_RE.test(workflowId))
|
|
576
|
+
continue;
|
|
577
|
+
try {
|
|
578
|
+
const metadata = await readSavedWorkflowMetadata(dataDir, workflowId);
|
|
579
|
+
if (!isVisible(metadata, opts))
|
|
580
|
+
continue;
|
|
581
|
+
entries.push(metadata);
|
|
582
|
+
}
|
|
583
|
+
catch (err) {
|
|
584
|
+
invalid.push({ workflowId, error: err instanceof Error ? err.message : String(err) });
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
entries.sort((a, b) => a.displayName.localeCompare(b.displayName) || a.workflowId.localeCompare(b.workflowId));
|
|
588
|
+
return { entries, invalid };
|
|
589
|
+
}
|
|
590
|
+
function isVisible(metadata, opts) {
|
|
591
|
+
// Every saved workflow is namespaced by the app that created it. `global`
|
|
592
|
+
// means global to that bot/app, not global to every bot sharing dataDir.
|
|
593
|
+
if (!opts.actor || metadata.owner.larkAppId !== opts.actor.larkAppId)
|
|
594
|
+
return false;
|
|
595
|
+
if (metadata.status === 'archived' && opts.includeArchived !== true)
|
|
596
|
+
return false;
|
|
597
|
+
if (metadata.scope.kind === 'chat' && metadata.scope.chatId !== opts.chatId)
|
|
598
|
+
return false;
|
|
599
|
+
if (metadata.status === 'draft') {
|
|
600
|
+
if (opts.includeDrafts === false)
|
|
601
|
+
return false;
|
|
602
|
+
if (!sameOwner(opts.actor, metadata.owner))
|
|
603
|
+
return false;
|
|
604
|
+
}
|
|
605
|
+
return true;
|
|
606
|
+
}
|
|
607
|
+
export async function resolveSavedWorkflowRef(dataDir, ref, opts = {}) {
|
|
608
|
+
const normalized = normalizeSavedWorkflowLookupKey(ref);
|
|
609
|
+
const { entries } = await listSavedWorkflows(dataDir, opts);
|
|
610
|
+
const matches = entries.filter((metadata) => metadata.workflowId === ref ||
|
|
611
|
+
normalizeSavedWorkflowLookupKey(metadata.displayName) === normalized ||
|
|
612
|
+
metadata.aliases.some((alias) => normalizeSavedWorkflowLookupKey(alias) === normalized));
|
|
613
|
+
if (matches.length === 0)
|
|
614
|
+
return { kind: 'not_found' };
|
|
615
|
+
if (matches.length > 1)
|
|
616
|
+
return { kind: 'ambiguous', matches };
|
|
617
|
+
return { kind: 'resolved', metadata: matches[0] };
|
|
618
|
+
}
|
|
619
|
+
async function writeMetadata(dataDir, metadata) {
|
|
620
|
+
const normalized = validateSavedWorkflowMetadata(metadata);
|
|
621
|
+
await atomicWriteFile(savedWorkflowMetadataPath(dataDir, normalized.workflowId), `${canonicalJsonStringify(normalized)}\n`, { mode: 0o600 });
|
|
622
|
+
const path = savedWorkflowMetadataPath(dataDir, normalized.workflowId);
|
|
623
|
+
fsyncRegularFileSync(path);
|
|
624
|
+
fsyncDirectorySyncPortable(savedWorkflowDir(dataDir, normalized.workflowId));
|
|
625
|
+
}
|
|
626
|
+
/**
|
|
627
|
+
* Install a completed sibling temp file via hard-link. `link` is atomic and
|
|
628
|
+
* refuses replacement, unlike rename(2). The workflow mutation lock
|
|
629
|
+
* serializes normal writers; EEXIST comparison keeps retries idempotent and
|
|
630
|
+
* detects tamper.
|
|
631
|
+
*/
|
|
632
|
+
async function writeImmutableRevision(dataDir, workflowId, revision) {
|
|
633
|
+
const target = savedWorkflowRevisionPath(dataDir, workflowId, revision.revisionId);
|
|
634
|
+
const tmp = `${target}.${process.pid}.${randomUUID()}.tmp`;
|
|
635
|
+
const encoded = `${canonicalJsonStringify(revision)}\n`;
|
|
636
|
+
try {
|
|
637
|
+
await fs.writeFile(tmp, encoded, { flag: 'wx', mode: 0o600 });
|
|
638
|
+
await fs.chmod(tmp, 0o600);
|
|
639
|
+
fsyncRegularFileSync(tmp);
|
|
640
|
+
try {
|
|
641
|
+
await fs.link(tmp, target);
|
|
642
|
+
}
|
|
643
|
+
catch (err) {
|
|
644
|
+
if (err.code !== 'EEXIST')
|
|
645
|
+
throw err;
|
|
646
|
+
const existing = await fs.readFile(target, 'utf-8');
|
|
647
|
+
if (existing !== encoded) {
|
|
648
|
+
throw new SavedWorkflowConflictError(`Immutable revision ${revision.revisionId} already exists with different content`);
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
finally {
|
|
653
|
+
try {
|
|
654
|
+
await fs.unlink(tmp);
|
|
655
|
+
}
|
|
656
|
+
catch { /* best effort */ }
|
|
657
|
+
}
|
|
658
|
+
// Defense-in-depth: ensure the installed target is readable before a
|
|
659
|
+
// metadata pointer can expose it. access() also catches a failed link on odd
|
|
660
|
+
// filesystems before the pointer update.
|
|
661
|
+
await fs.access(target, fsConstants.R_OK);
|
|
662
|
+
fsyncRegularFileSync(target);
|
|
663
|
+
fsyncDirectorySyncPortable(join(savedWorkflowDir(dataDir, workflowId), REVISIONS_DIR));
|
|
664
|
+
}
|
|
665
|
+
//# sourceMappingURL=library-store.js.map
|