botmux 2.111.0 → 2.112.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +19 -7
- package/README.md +19 -7
- package/dist/adapters/adopt-route.d.ts.map +1 -1
- package/dist/adapters/adopt-route.js +2 -1
- package/dist/adapters/adopt-route.js.map +1 -1
- package/dist/adapters/backend/herdr-backend.d.ts +29 -0
- package/dist/adapters/backend/herdr-backend.d.ts.map +1 -1
- package/dist/adapters/backend/herdr-backend.js +167 -0
- package/dist/adapters/backend/herdr-backend.js.map +1 -1
- package/dist/adapters/backend/riff-backend.js +2 -2
- package/dist/adapters/backend/sandbox.d.ts +61 -6
- package/dist/adapters/backend/sandbox.d.ts.map +1 -1
- package/dist/adapters/backend/sandbox.js +235 -43
- package/dist/adapters/backend/sandbox.js.map +1 -1
- package/dist/adapters/backend/tmux-backend.d.ts +1 -0
- package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-backend.js +1 -0
- package/dist/adapters/backend/tmux-backend.js.map +1 -1
- package/dist/adapters/cli/claude-code.d.ts +2 -0
- package/dist/adapters/cli/claude-code.d.ts.map +1 -1
- package/dist/adapters/cli/claude-code.js +7 -0
- package/dist/adapters/cli/claude-code.js.map +1 -1
- package/dist/adapters/cli/codex-app-turn.d.ts +16 -0
- package/dist/adapters/cli/codex-app-turn.d.ts.map +1 -1
- package/dist/adapters/cli/codex-app-turn.js +26 -0
- package/dist/adapters/cli/codex-app-turn.js.map +1 -1
- package/dist/adapters/cli/codex.d.ts.map +1 -1
- package/dist/adapters/cli/codex.js +1 -0
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/adapters/cli/grok.d.ts +8 -6
- package/dist/adapters/cli/grok.d.ts.map +1 -1
- package/dist/adapters/cli/grok.js +14 -6
- package/dist/adapters/cli/grok.js.map +1 -1
- package/dist/adapters/cli/read-isolation.d.ts +40 -14
- package/dist/adapters/cli/read-isolation.d.ts.map +1 -1
- package/dist/adapters/cli/read-isolation.js +116 -19
- package/dist/adapters/cli/read-isolation.js.map +1 -1
- package/dist/adapters/cli/runner-control-channel.d.ts +32 -0
- package/dist/adapters/cli/runner-control-channel.d.ts.map +1 -0
- package/dist/adapters/cli/runner-control-channel.js +104 -0
- package/dist/adapters/cli/runner-control-channel.js.map +1 -0
- package/dist/adapters/cli/shared-hints.d.ts +1 -1
- package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
- package/dist/adapters/cli/shared-hints.js +9 -0
- package/dist/adapters/cli/shared-hints.js.map +1 -1
- package/dist/adapters/cli/traex.d.ts.map +1 -1
- package/dist/adapters/cli/traex.js +100 -64
- package/dist/adapters/cli/traex.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +13 -0
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/bot-registry.d.ts +36 -27
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +354 -8
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli/saved-workflow.d.ts +25 -0
- package/dist/cli/saved-workflow.d.ts.map +1 -0
- package/dist/cli/saved-workflow.js +338 -0
- package/dist/cli/saved-workflow.js.map +1 -0
- package/dist/cli/send-dispatch.d.ts +18 -3
- package/dist/cli/send-dispatch.d.ts.map +1 -1
- package/dist/cli/send-dispatch.js +22 -3
- package/dist/cli/send-dispatch.js.map +1 -1
- package/dist/cli/v3-run-cancel.d.ts +47 -0
- package/dist/cli/v3-run-cancel.d.ts.map +1 -0
- package/dist/cli/v3-run-cancel.js +96 -0
- package/dist/cli/v3-run-cancel.js.map +1 -0
- package/dist/cli/vc-agent.d.ts.map +1 -1
- package/dist/cli/vc-agent.js +54 -1
- package/dist/cli/vc-agent.js.map +1 -1
- package/dist/cli/workflow-migration.d.ts +39 -0
- package/dist/cli/workflow-migration.d.ts.map +1 -0
- package/dist/cli/workflow-migration.js +302 -0
- package/dist/cli/workflow-migration.js.map +1 -0
- package/dist/cli/workflow-run-archive.d.ts +29 -0
- package/dist/cli/workflow-run-archive.d.ts.map +1 -0
- package/dist/cli/workflow-run-archive.js +183 -0
- package/dist/cli/workflow-run-archive.js.map +1 -0
- package/dist/cli/workflow.d.ts +5 -10
- package/dist/cli/workflow.d.ts.map +1 -1
- package/dist/cli/workflow.js +85 -764
- package/dist/cli/workflow.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +1018 -191
- package/dist/cli.js.map +1 -1
- package/dist/codex-app-runner.js +30 -21
- package/dist/codex-app-runner.js.map +1 -1
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +21 -9
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/current-turn-provenance.d.ts +39 -0
- package/dist/core/current-turn-provenance.d.ts.map +1 -0
- package/dist/core/current-turn-provenance.js +122 -0
- package/dist/core/current-turn-provenance.js.map +1 -0
- package/dist/core/daemon-ipc-auth.d.ts +20 -0
- package/dist/core/daemon-ipc-auth.d.ts.map +1 -0
- package/dist/core/daemon-ipc-auth.js +44 -0
- package/dist/core/daemon-ipc-auth.js.map +1 -0
- package/dist/core/daemon-ipc-session-auth.d.ts +37 -0
- package/dist/core/daemon-ipc-session-auth.d.ts.map +1 -0
- package/dist/core/daemon-ipc-session-auth.js +35 -0
- package/dist/core/daemon-ipc-session-auth.js.map +1 -0
- package/dist/core/dashboard-command/index.d.ts +0 -2
- package/dist/core/dashboard-command/index.d.ts.map +1 -1
- package/dist/core/dashboard-command/index.js +2 -2
- package/dist/core/dashboard-command/index.js.map +1 -1
- package/dist/core/dashboard-command/stub.d.ts +1 -1
- package/dist/core/dashboard-command/stub.d.ts.map +1 -1
- package/dist/core/dashboard-command/stub.js +0 -1
- package/dist/core/dashboard-command/stub.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts +11 -2
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +266 -41
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/dashboard-secret.d.ts +3 -0
- package/dist/core/dashboard-secret.d.ts.map +1 -0
- package/dist/core/dashboard-secret.js +7 -0
- package/dist/core/dashboard-secret.js.map +1 -0
- package/dist/core/data-dir.d.ts +24 -0
- package/dist/core/data-dir.d.ts.map +1 -0
- package/dist/core/data-dir.js +48 -0
- package/dist/core/data-dir.js.map +1 -0
- package/dist/core/inflight-input-tracker.d.ts +4 -2
- package/dist/core/inflight-input-tracker.d.ts.map +1 -1
- package/dist/core/inflight-input-tracker.js +6 -5
- package/dist/core/inflight-input-tracker.js.map +1 -1
- package/dist/core/inject-queue-policy.d.ts +70 -0
- package/dist/core/inject-queue-policy.d.ts.map +1 -0
- package/dist/core/inject-queue-policy.js +30 -0
- package/dist/core/inject-queue-policy.js.map +1 -0
- package/dist/core/maintenance.d.ts +1 -1
- package/dist/core/maintenance.d.ts.map +1 -1
- package/dist/core/maintenance.js +3 -2
- package/dist/core/maintenance.js.map +1 -1
- package/dist/core/managed-origin-capability.d.ts +30 -0
- package/dist/core/managed-origin-capability.d.ts.map +1 -0
- package/dist/core/managed-origin-capability.js +88 -0
- package/dist/core/managed-origin-capability.js.map +1 -0
- package/dist/core/role-library.d.ts +15 -0
- package/dist/core/role-library.d.ts.map +1 -0
- package/dist/core/role-library.js +75 -0
- package/dist/core/role-library.js.map +1 -0
- package/dist/core/session-cwd.d.ts +14 -0
- package/dist/core/session-cwd.d.ts.map +1 -0
- package/dist/core/session-cwd.js +17 -0
- package/dist/core/session-cwd.js.map +1 -0
- package/dist/core/session-manager.d.ts +4 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +27 -8
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-marker.d.ts +22 -0
- package/dist/core/session-marker.d.ts.map +1 -1
- package/dist/core/session-marker.js +185 -20
- package/dist/core/session-marker.js.map +1 -1
- package/dist/core/slash-inject.d.ts +15 -0
- package/dist/core/slash-inject.d.ts.map +1 -0
- package/dist/core/slash-inject.js +25 -0
- package/dist/core/slash-inject.js.map +1 -0
- package/dist/core/terminal-url.d.ts +1 -0
- package/dist/core/terminal-url.d.ts.map +1 -1
- package/dist/core/terminal-url.js +14 -8
- package/dist/core/terminal-url.js.map +1 -1
- package/dist/core/terminal-write-auth.d.ts +26 -0
- package/dist/core/terminal-write-auth.d.ts.map +1 -1
- package/dist/core/terminal-write-auth.js +48 -3
- package/dist/core/terminal-write-auth.js.map +1 -1
- package/dist/core/trigger-session.d.ts +24 -1
- package/dist/core/trigger-session.d.ts.map +1 -1
- package/dist/core/trigger-session.js +106 -15
- package/dist/core/trigger-session.js.map +1 -1
- package/dist/core/types.d.ts +26 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +10 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-pool.d.ts +65 -2
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +459 -39
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts +249 -8
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +7383 -1195
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/aggregator.d.ts +1 -1
- package/dist/dashboard/aggregator.d.ts.map +1 -1
- package/dist/dashboard/aggregator.js +2 -2
- package/dist/dashboard/aggregator.js.map +1 -1
- package/dist/dashboard/auth.d.ts +3 -8
- package/dist/dashboard/auth.d.ts.map +1 -1
- package/dist/dashboard/auth.js +63 -22
- package/dist/dashboard/auth.js.map +1 -1
- package/dist/dashboard/bot-onboarding.d.ts +5 -0
- package/dist/dashboard/bot-onboarding.d.ts.map +1 -1
- package/dist/dashboard/bot-onboarding.js +37 -0
- package/dist/dashboard/bot-onboarding.js.map +1 -1
- package/dist/dashboard/connector-api.d.ts.map +1 -1
- package/dist/dashboard/connector-api.js +42 -2
- package/dist/dashboard/connector-api.js.map +1 -1
- package/dist/dashboard/daemon-internal-api.d.ts +0 -2
- package/dist/dashboard/daemon-internal-api.d.ts.map +1 -1
- package/dist/dashboard/daemon-internal-api.js +26 -93
- package/dist/dashboard/daemon-internal-api.js.map +1 -1
- package/dist/dashboard/daemon-internal-client.d.ts.map +1 -1
- package/dist/dashboard/daemon-internal-client.js +2 -3
- package/dist/dashboard/daemon-internal-client.js.map +1 -1
- package/dist/dashboard/federation-api.js +1 -1
- package/dist/dashboard/federation-api.js.map +1 -1
- package/dist/dashboard/federation-spoke-api.js +1 -1
- package/dist/dashboard/federation-spoke-api.js.map +1 -1
- package/dist/dashboard/history-senders.d.ts +3 -0
- package/dist/dashboard/history-senders.d.ts.map +1 -1
- package/dist/dashboard/history-senders.js.map +1 -1
- package/dist/dashboard/http.d.ts +4 -0
- package/dist/dashboard/http.d.ts.map +1 -0
- package/dist/dashboard/http.js +6 -0
- package/dist/dashboard/http.js.map +1 -0
- package/dist/dashboard/registry.d.ts +4 -0
- package/dist/dashboard/registry.d.ts.map +1 -1
- package/dist/dashboard/registry.js.map +1 -1
- package/dist/dashboard/trigger-api.js +1 -1
- package/dist/dashboard/trigger-api.js.map +1 -1
- package/dist/dashboard/v3-runs-api.d.ts +13 -10
- package/dist/dashboard/v3-runs-api.d.ts.map +1 -1
- package/dist/dashboard/v3-runs-api.js +121 -4
- package/dist/dashboard/v3-runs-api.js.map +1 -1
- package/dist/dashboard/vc-consumer-profiles-api.d.ts +105 -0
- package/dist/dashboard/vc-consumer-profiles-api.d.ts.map +1 -0
- package/dist/dashboard/vc-consumer-profiles-api.js +312 -0
- package/dist/dashboard/vc-consumer-profiles-api.js.map +1 -0
- package/dist/dashboard/web/app.d.ts.map +1 -1
- package/dist/dashboard/web/app.js +7 -6
- package/dist/dashboard/web/app.js.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.js +9 -14
- package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
- package/dist/dashboard/web/bot-onboarding.d.ts.map +1 -1
- package/dist/dashboard/web/bot-onboarding.js +7 -3
- package/dist/dashboard/web/bot-onboarding.js.map +1 -1
- package/dist/dashboard/web/connectors-page.d.ts +5 -0
- package/dist/dashboard/web/connectors-page.d.ts.map +1 -1
- package/dist/dashboard/web/connectors-page.js +16 -12
- package/dist/dashboard/web/connectors-page.js.map +1 -1
- package/dist/dashboard/web/create-session-entry.d.ts +4 -0
- package/dist/dashboard/web/create-session-entry.d.ts.map +1 -0
- package/dist/dashboard/web/create-session-entry.js +17 -0
- package/dist/dashboard/web/create-session-entry.js.map +1 -0
- package/dist/dashboard/web/dashboard-components.d.ts +5 -0
- package/dist/dashboard/web/dashboard-components.d.ts.map +1 -1
- package/dist/dashboard/web/dashboard-components.js +29 -4
- package/dist/dashboard/web/dashboard-components.js.map +1 -1
- package/dist/dashboard/web/dashboard-routes.d.ts.map +1 -1
- package/dist/dashboard/web/dashboard-routes.js +0 -1
- package/dist/dashboard/web/dashboard-routes.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +192 -382
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/preferences.d.ts +3 -0
- package/dist/dashboard/web/preferences.d.ts.map +1 -1
- package/dist/dashboard/web/preferences.js +18 -0
- package/dist/dashboard/web/preferences.js.map +1 -1
- package/dist/dashboard/web/schedules-page.d.ts.map +1 -1
- package/dist/dashboard/web/schedules-page.js +4 -1
- package/dist/dashboard/web/schedules-page.js.map +1 -1
- package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
- package/dist/dashboard/web/sessions-page.js +64 -18
- package/dist/dashboard/web/sessions-page.js.map +1 -1
- package/dist/dashboard/web/settings-page.d.ts.map +1 -1
- package/dist/dashboard/web/settings-page.js +2 -1
- package/dist/dashboard/web/settings-page.js.map +1 -1
- package/dist/dashboard/web/v3-api.d.ts +12 -2
- package/dist/dashboard/web/v3-api.d.ts.map +1 -1
- package/dist/dashboard/web/v3-api.js +34 -6
- package/dist/dashboard/web/v3-api.js.map +1 -1
- package/dist/dashboard/web/v3-components.d.ts +6 -0
- package/dist/dashboard/web/v3-components.d.ts.map +1 -1
- package/dist/dashboard/web/v3-components.js +66 -23
- package/dist/dashboard/web/v3-components.js.map +1 -1
- package/dist/dashboard/web/v3-model.js +1 -1
- package/dist/dashboard/web/v3-model.js.map +1 -1
- package/dist/dashboard/web/v3-terminal.js +2 -2
- package/dist/dashboard/web/v3-terminal.js.map +1 -1
- package/dist/dashboard/web/vc-consumer-profiles-section.d.ts +19 -0
- package/dist/dashboard/web/vc-consumer-profiles-section.d.ts.map +1 -0
- package/dist/dashboard/web/vc-consumer-profiles-section.js +382 -0
- package/dist/dashboard/web/vc-consumer-profiles-section.js.map +1 -0
- package/dist/dashboard/webhook-routes.d.ts.map +1 -1
- package/dist/dashboard/webhook-routes.js +29 -6
- package/dist/dashboard/webhook-routes.js.map +1 -1
- package/dist/dashboard-web/app.js +1 -1
- package/dist/dashboard-web/chunks/bot-defaults-page-RYBL4ZYE.js +4 -0
- package/dist/dashboard-web/chunks/{chunk-OEJIT66L.js → chunk-CMDPZOPK.js} +1 -1
- package/dist/dashboard-web/chunks/chunk-I35DXGM4.js +1 -0
- package/dist/dashboard-web/chunks/chunk-NYZHARIU.js +47 -0
- package/dist/dashboard-web/chunks/chunk-SZOB6VK2.js +1 -0
- package/dist/dashboard-web/chunks/{chunk-YQFXGRSD.js → chunk-YBOHL7T7.js} +1 -1
- package/dist/dashboard-web/chunks/chunk-YWCPDL4S.js +1 -0
- package/dist/dashboard-web/chunks/connectors-page-DAMP7TTV.js +1 -0
- package/dist/dashboard-web/chunks/{groups-page-5AJPPJH2.js → groups-page-BPFA356N.js} +1 -1
- package/dist/dashboard-web/chunks/{insights-page-R3DFECX4.js → insights-page-SHOPHTWY.js} +1 -1
- package/dist/dashboard-web/chunks/{monitor-room-NLMKJLDY.js → monitor-room-PXPJGZCN.js} +1 -1
- package/dist/dashboard-web/chunks/{monitoring-page-EHSOX4GV.js → monitoring-page-4DF54M5Y.js} +1 -1
- package/dist/dashboard-web/chunks/{office-page-OXJKFJ4R.js → office-page-6OHU6KMZ.js} +1 -1
- package/dist/dashboard-web/chunks/{overview-page-GJHIVXJF.js → overview-page-IHIZ6F5M.js} +1 -1
- package/dist/dashboard-web/chunks/{roles-page-6ZODQISW.js → roles-page-JYTBYKEF.js} +1 -1
- package/dist/dashboard-web/chunks/{schedules-page-DAGMHVCH.js → schedules-page-WJ72T7KV.js} +1 -1
- package/dist/dashboard-web/chunks/sessions-page-QC56OIAI.js +3 -0
- package/dist/dashboard-web/chunks/settings-page-TCKWEXTN.js +2 -0
- package/dist/dashboard-web/chunks/{skills-page-J7EVUHXP.js → skills-page-RJJNIECW.js} +1 -1
- package/dist/dashboard-web/chunks/{team-federation-page-YM5JBIII.js → team-federation-page-ZMDX3E7K.js} +1 -1
- package/dist/dashboard-web/chunks/v3-page-VLLAUQ33.js +94 -0
- package/dist/dashboard-web/chunks/{whiteboards-page-75N2U6W4.js → whiteboards-page-NAO53CKM.js} +1 -1
- package/dist/dashboard-web/style.css +363 -274
- package/dist/dashboard.js +194 -78
- package/dist/dashboard.js.map +1 -1
- package/dist/global-config.d.ts +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +12 -87
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +12 -87
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/brand-template.d.ts +15 -0
- package/dist/im/lark/brand-template.d.ts.map +1 -0
- package/dist/im/lark/brand-template.js +114 -0
- package/dist/im/lark/brand-template.js.map +1 -0
- package/dist/im/lark/card-handler.d.ts +6 -3
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +23 -39
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts +8 -2
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +33 -31
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/doc-comment.d.ts +18 -0
- package/dist/im/lark/doc-comment.d.ts.map +1 -1
- package/dist/im/lark/doc-comment.js +119 -5
- package/dist/im/lark/doc-comment.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts +18 -2
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +41 -19
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/merge-forward.d.ts.map +1 -1
- package/dist/im/lark/merge-forward.js +7 -2
- package/dist/im/lark/merge-forward.js.map +1 -1
- package/dist/im/lark/message-parser.d.ts.map +1 -1
- package/dist/im/lark/message-parser.js +7 -0
- package/dist/im/lark/message-parser.js.map +1 -1
- package/dist/im/lark/overview-card.d.ts +1 -2
- package/dist/im/lark/overview-card.d.ts.map +1 -1
- package/dist/im/lark/overview-card.js +1 -48
- package/dist/im/lark/overview-card.js.map +1 -1
- package/dist/im/lark/v3-blocked-card-handler.d.ts.map +1 -1
- package/dist/im/lark/v3-blocked-card-handler.js +5 -5
- package/dist/im/lark/v3-blocked-card-handler.js.map +1 -1
- package/dist/im/lark/v3-blocked-card.d.ts +1 -0
- package/dist/im/lark/v3-blocked-card.d.ts.map +1 -1
- package/dist/im/lark/v3-blocked-card.js +19 -2
- package/dist/im/lark/v3-blocked-card.js.map +1 -1
- package/dist/im/lark/v3-distillation-card-handler.d.ts +12 -0
- package/dist/im/lark/v3-distillation-card-handler.d.ts.map +1 -0
- package/dist/im/lark/v3-distillation-card-handler.js +107 -0
- package/dist/im/lark/v3-distillation-card-handler.js.map +1 -0
- package/dist/im/lark/v3-distillation-card.d.ts +42 -0
- package/dist/im/lark/v3-distillation-card.d.ts.map +1 -0
- package/dist/im/lark/v3-distillation-card.js +206 -0
- package/dist/im/lark/v3-distillation-card.js.map +1 -0
- package/dist/im/lark/v3-gate-card-handler.d.ts +1 -1
- package/dist/im/lark/v3-gate-card-handler.d.ts.map +1 -1
- package/dist/im/lark/v3-gate-card-handler.js +6 -5
- package/dist/im/lark/v3-gate-card-handler.js.map +1 -1
- package/dist/im/lark/v3-gate-card.d.ts +8 -1
- package/dist/im/lark/v3-gate-card.d.ts.map +1 -1
- package/dist/im/lark/v3-gate-card.js +38 -7
- package/dist/im/lark/v3-gate-card.js.map +1 -1
- package/dist/im/lark/v3-loop-grant-card-handler.d.ts.map +1 -1
- package/dist/im/lark/v3-loop-grant-card-handler.js +3 -4
- package/dist/im/lark/v3-loop-grant-card-handler.js.map +1 -1
- package/dist/im/lark/v3-loop-grant-card.js +1 -1
- package/dist/im/lark/v3-loop-grant-card.js.map +1 -1
- package/dist/im/lark/v3-progress-card-manager.d.ts +79 -0
- package/dist/im/lark/v3-progress-card-manager.d.ts.map +1 -0
- package/dist/im/lark/v3-progress-card-manager.js +444 -0
- package/dist/im/lark/v3-progress-card-manager.js.map +1 -0
- package/dist/im/lark/v3-progress-card.d.ts +26 -0
- package/dist/im/lark/v3-progress-card.d.ts.map +1 -0
- package/dist/im/lark/v3-progress-card.js +211 -0
- package/dist/im/lark/v3-progress-card.js.map +1 -0
- package/dist/im/lark/v3-revisit-grant-card-handler.d.ts.map +1 -1
- package/dist/im/lark/v3-revisit-grant-card-handler.js +3 -4
- package/dist/im/lark/v3-revisit-grant-card-handler.js.map +1 -1
- package/dist/im/lark/v3-revisit-grant-card.js +1 -1
- package/dist/im/lark/v3-revisit-grant-card.js.map +1 -1
- package/dist/im/lark/v3-run-save-card-handler.d.ts +12 -0
- package/dist/im/lark/v3-run-save-card-handler.d.ts.map +1 -0
- package/dist/im/lark/v3-run-save-card-handler.js +160 -0
- package/dist/im/lark/v3-run-save-card-handler.js.map +1 -0
- package/dist/im/lark/v3-run-save-card.d.ts +38 -0
- package/dist/im/lark/v3-run-save-card.d.ts.map +1 -0
- package/dist/im/lark/v3-run-save-card.js +125 -0
- package/dist/im/lark/v3-run-save-card.js.map +1 -0
- package/dist/im/lark/v3-saved-workflow-command.d.ts +36 -0
- package/dist/im/lark/v3-saved-workflow-command.d.ts.map +1 -0
- package/dist/im/lark/v3-saved-workflow-command.js +186 -0
- package/dist/im/lark/v3-saved-workflow-command.js.map +1 -0
- package/dist/im/lark/v3-saved-workflow-handler.d.ts +89 -0
- package/dist/im/lark/v3-saved-workflow-handler.d.ts.map +1 -0
- package/dist/im/lark/v3-saved-workflow-handler.js +212 -0
- package/dist/im/lark/v3-saved-workflow-handler.js.map +1 -0
- package/dist/im/lark/workflow-slash-command.d.ts +7 -110
- package/dist/im/lark/workflow-slash-command.d.ts.map +1 -1
- package/dist/im/lark/workflow-slash-command.js +16 -230
- package/dist/im/lark/workflow-slash-command.js.map +1 -1
- package/dist/index-daemon.js +1 -1
- package/dist/index-daemon.js.map +1 -1
- package/dist/mir-runner.js +11 -15
- package/dist/mir-runner.js.map +1 -1
- package/dist/mira-runner.js +8 -12
- package/dist/mira-runner.js.map +1 -1
- package/dist/services/bridge-turn-queue.d.ts +29 -12
- package/dist/services/bridge-turn-queue.d.ts.map +1 -1
- package/dist/services/bridge-turn-queue.js +59 -23
- package/dist/services/bridge-turn-queue.js.map +1 -1
- package/dist/services/claude-transcript.d.ts +15 -0
- package/dist/services/claude-transcript.d.ts.map +1 -1
- package/dist/services/claude-transcript.js +24 -0
- package/dist/services/claude-transcript.js.map +1 -1
- package/dist/services/codex-bridge-queue.d.ts +13 -2
- package/dist/services/codex-bridge-queue.d.ts.map +1 -1
- package/dist/services/codex-bridge-queue.js +20 -3
- package/dist/services/codex-bridge-queue.js.map +1 -1
- package/dist/services/codex-transcript.d.ts +6 -0
- package/dist/services/codex-transcript.d.ts.map +1 -1
- package/dist/services/codex-transcript.js.map +1 -1
- package/dist/services/grok-transcript.d.ts +3 -2
- package/dist/services/grok-transcript.d.ts.map +1 -1
- package/dist/services/grok-transcript.js +73 -22
- package/dist/services/grok-transcript.js.map +1 -1
- package/dist/services/hook-runner.d.ts.map +1 -1
- package/dist/services/hook-runner.js +26 -3
- package/dist/services/hook-runner.js.map +1 -1
- package/dist/services/schedule-store.d.ts +37 -0
- package/dist/services/schedule-store.d.ts.map +1 -1
- package/dist/services/schedule-store.js +259 -141
- package/dist/services/schedule-store.js.map +1 -1
- package/dist/services/send-policy.d.ts +50 -0
- package/dist/services/send-policy.d.ts.map +1 -1
- package/dist/services/send-policy.js +65 -0
- package/dist/services/send-policy.js.map +1 -1
- package/dist/services/session-lifecycle-hooks.d.ts.map +1 -1
- package/dist/services/session-lifecycle-hooks.js +12 -0
- package/dist/services/session-lifecycle-hooks.js.map +1 -1
- package/dist/services/traex-transcript.d.ts +11 -2
- package/dist/services/traex-transcript.d.ts.map +1 -1
- package/dist/services/traex-transcript.js +142 -8
- package/dist/services/traex-transcript.js.map +1 -1
- package/dist/services/trigger-types.d.ts +6 -1
- package/dist/services/trigger-types.d.ts.map +1 -1
- package/dist/services/trigger-types.js.map +1 -1
- package/dist/services/turn-terminal-deduper.d.ts +14 -0
- package/dist/services/turn-terminal-deduper.d.ts.map +1 -0
- package/dist/services/turn-terminal-deduper.js +34 -0
- package/dist/services/turn-terminal-deduper.js.map +1 -0
- package/dist/services/vc-meeting-action-gate.d.ts +246 -0
- package/dist/services/vc-meeting-action-gate.d.ts.map +1 -0
- package/dist/services/vc-meeting-action-gate.js +756 -0
- package/dist/services/vc-meeting-action-gate.js.map +1 -0
- package/dist/services/vc-meeting-action-store.d.ts +222 -0
- package/dist/services/vc-meeting-action-store.d.ts.map +1 -0
- package/dist/services/vc-meeting-action-store.js +806 -0
- package/dist/services/vc-meeting-action-store.js.map +1 -0
- package/dist/services/vc-meeting-consumer-isolation.d.ts +27 -0
- package/dist/services/vc-meeting-consumer-isolation.d.ts.map +1 -0
- package/dist/services/vc-meeting-consumer-isolation.js +37 -0
- package/dist/services/vc-meeting-consumer-isolation.js.map +1 -0
- package/dist/services/vc-meeting-consumer-profile-bootstrap.d.ts +72 -0
- package/dist/services/vc-meeting-consumer-profile-bootstrap.d.ts.map +1 -0
- package/dist/services/vc-meeting-consumer-profile-bootstrap.js +343 -0
- package/dist/services/vc-meeting-consumer-profile-bootstrap.js.map +1 -0
- package/dist/services/vc-meeting-consumer-profile-store.d.ts +39 -0
- package/dist/services/vc-meeting-consumer-profile-store.d.ts.map +1 -0
- package/dist/services/vc-meeting-consumer-profile-store.js +190 -0
- package/dist/services/vc-meeting-consumer-profile-store.js.map +1 -0
- package/dist/services/vc-meeting-daemon-auth.d.ts +29 -0
- package/dist/services/vc-meeting-daemon-auth.d.ts.map +1 -0
- package/dist/services/vc-meeting-daemon-auth.js +117 -0
- package/dist/services/vc-meeting-daemon-auth.js.map +1 -0
- package/dist/services/vc-meeting-delivery-feed.d.ts +52 -0
- package/dist/services/vc-meeting-delivery-feed.d.ts.map +1 -0
- package/dist/services/vc-meeting-delivery-feed.js +231 -0
- package/dist/services/vc-meeting-delivery-feed.js.map +1 -0
- package/dist/services/vc-meeting-delivery-hub-store.d.ts +213 -0
- package/dist/services/vc-meeting-delivery-hub-store.d.ts.map +1 -0
- package/dist/services/vc-meeting-delivery-hub-store.js +1230 -0
- package/dist/services/vc-meeting-delivery-hub-store.js.map +1 -0
- package/dist/services/vc-meeting-delivery-protocol.d.ts +159 -0
- package/dist/services/vc-meeting-delivery-protocol.d.ts.map +1 -0
- package/dist/services/vc-meeting-delivery-protocol.js +443 -0
- package/dist/services/vc-meeting-delivery-protocol.js.map +1 -0
- package/dist/services/vc-meeting-delivery-receiver.d.ts +80 -0
- package/dist/services/vc-meeting-delivery-receiver.d.ts.map +1 -0
- package/dist/services/vc-meeting-delivery-receiver.js +543 -0
- package/dist/services/vc-meeting-delivery-receiver.js.map +1 -0
- package/dist/services/vc-meeting-delivery-store.d.ts +339 -0
- package/dist/services/vc-meeting-delivery-store.d.ts.map +1 -0
- package/dist/services/vc-meeting-delivery-store.js +1024 -0
- package/dist/services/vc-meeting-delivery-store.js.map +1 -0
- package/dist/services/vc-meeting-feed-metadata-store.d.ts +58 -0
- package/dist/services/vc-meeting-feed-metadata-store.d.ts.map +1 -0
- package/dist/services/vc-meeting-feed-metadata-store.js +356 -0
- package/dist/services/vc-meeting-feed-metadata-store.js.map +1 -0
- package/dist/services/vc-meeting-im-reply.d.ts +55 -0
- package/dist/services/vc-meeting-im-reply.d.ts.map +1 -0
- package/dist/services/vc-meeting-im-reply.js +279 -0
- package/dist/services/vc-meeting-im-reply.js.map +1 -0
- package/dist/services/vc-meeting-im-routing.d.ts +131 -0
- package/dist/services/vc-meeting-im-routing.d.ts.map +1 -0
- package/dist/services/vc-meeting-im-routing.js +449 -0
- package/dist/services/vc-meeting-im-routing.js.map +1 -0
- package/dist/services/vc-meeting-listener-message-store.d.ts +23 -0
- package/dist/services/vc-meeting-listener-message-store.d.ts.map +1 -0
- package/dist/services/vc-meeting-listener-message-store.js +142 -0
- package/dist/services/vc-meeting-listener-message-store.js.map +1 -0
- package/dist/services/vc-meeting-member-policy.d.ts +37 -0
- package/dist/services/vc-meeting-member-policy.d.ts.map +1 -0
- package/dist/services/vc-meeting-member-policy.js +102 -0
- package/dist/services/vc-meeting-member-policy.js.map +1 -0
- package/dist/services/vc-meeting-profile-instructions.d.ts +22 -0
- package/dist/services/vc-meeting-profile-instructions.d.ts.map +1 -0
- package/dist/services/vc-meeting-profile-instructions.js +64 -0
- package/dist/services/vc-meeting-profile-instructions.js.map +1 -0
- package/dist/services/vc-meeting-runtime-store.d.ts +63 -0
- package/dist/services/vc-meeting-runtime-store.d.ts.map +1 -1
- package/dist/services/vc-meeting-runtime-store.js +605 -116
- package/dist/services/vc-meeting-runtime-store.js.map +1 -1
- package/dist/services/vc-meeting-send-policy.d.ts +89 -0
- package/dist/services/vc-meeting-send-policy.d.ts.map +1 -0
- package/dist/services/vc-meeting-send-policy.js +150 -0
- package/dist/services/vc-meeting-send-policy.js.map +1 -0
- package/dist/services/vc-meeting-terminal-reconciler.d.ts +93 -0
- package/dist/services/vc-meeting-terminal-reconciler.d.ts.map +1 -0
- package/dist/services/vc-meeting-terminal-reconciler.js +198 -0
- package/dist/services/vc-meeting-terminal-reconciler.js.map +1 -0
- package/dist/setup/open-platform-automation.d.ts +2 -0
- package/dist/setup/open-platform-automation.d.ts.map +1 -1
- package/dist/setup/open-platform-automation.js +1 -0
- package/dist/setup/open-platform-automation.js.map +1 -1
- package/dist/setup/open-platform-outcome.d.ts +50 -0
- package/dist/setup/open-platform-outcome.d.ts.map +1 -0
- package/dist/setup/open-platform-outcome.js +56 -0
- package/dist/setup/open-platform-outcome.js.map +1 -0
- package/dist/setup/setup-args.d.ts +7 -2
- package/dist/setup/setup-args.d.ts.map +1 -1
- package/dist/setup/setup-args.js +21 -5
- package/dist/setup/setup-args.js.map +1 -1
- package/dist/skills/definitions.d.ts.map +1 -1
- package/dist/skills/definitions.js +66 -54
- package/dist/skills/definitions.js.map +1 -1
- package/dist/skills/injection-mode.d.ts +5 -4
- package/dist/skills/injection-mode.d.ts.map +1 -1
- package/dist/skills/injection-mode.js +19 -10
- package/dist/skills/injection-mode.js.map +1 -1
- package/dist/types.d.ts +187 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/canonical-input-hash.d.ts +5 -0
- package/dist/utils/canonical-input-hash.d.ts.map +1 -0
- package/dist/utils/canonical-input-hash.js +43 -0
- package/dist/utils/canonical-input-hash.js.map +1 -0
- package/dist/utils/canonical-json.d.ts +10 -0
- package/dist/utils/canonical-json.d.ts.map +1 -0
- package/dist/utils/canonical-json.js +23 -0
- package/dist/utils/canonical-json.js.map +1 -0
- package/dist/utils/child-env.d.ts +1 -1
- package/dist/utils/child-env.d.ts.map +1 -1
- package/dist/utils/child-env.js +8 -0
- package/dist/utils/child-env.js.map +1 -1
- package/dist/utils/daemon-discovery.d.ts +4 -0
- package/dist/utils/daemon-discovery.d.ts.map +1 -1
- package/dist/utils/daemon-discovery.js +12 -6
- package/dist/utils/daemon-discovery.js.map +1 -1
- package/dist/utils/file-lock.d.ts.map +1 -1
- package/dist/utils/file-lock.js +696 -102
- package/dist/utils/file-lock.js.map +1 -1
- package/dist/utils/fs-durability.d.ts +20 -0
- package/dist/utils/fs-durability.d.ts.map +1 -0
- package/dist/utils/fs-durability.js +84 -0
- package/dist/utils/fs-durability.js.map +1 -0
- package/dist/utils/global-install.d.ts +5 -2
- package/dist/utils/global-install.d.ts.map +1 -1
- package/dist/utils/global-install.js +22 -4
- package/dist/utils/global-install.js.map +1 -1
- package/dist/utils/herdr-web-history.d.ts +12 -0
- package/dist/utils/herdr-web-history.d.ts.map +1 -0
- package/dist/utils/herdr-web-history.js +74 -0
- package/dist/utils/herdr-web-history.js.map +1 -0
- package/dist/utils/herdr-web-terminal-binding.d.ts +39 -0
- package/dist/utils/herdr-web-terminal-binding.d.ts.map +1 -0
- package/dist/utils/herdr-web-terminal-binding.js +56 -0
- package/dist/utils/herdr-web-terminal-binding.js.map +1 -0
- package/dist/utils/pending-input-queue.d.ts +30 -1
- package/dist/utils/pending-input-queue.d.ts.map +1 -1
- package/dist/utils/pending-input-queue.js +45 -5
- package/dist/utils/pending-input-queue.js.map +1 -1
- package/dist/vc-agent/cards.d.ts +49 -4
- package/dist/vc-agent/cards.d.ts.map +1 -1
- package/dist/vc-agent/cards.js +460 -70
- package/dist/vc-agent/cards.js.map +1 -1
- package/dist/vc-agent/polling-source.d.ts +6 -1
- package/dist/vc-agent/polling-source.d.ts.map +1 -1
- package/dist/vc-agent/polling-source.js +17 -4
- package/dist/vc-agent/polling-source.js.map +1 -1
- package/dist/worker.js +1333 -283
- package/dist/worker.js.map +1 -1
- package/dist/workflows/definition.d.ts +28 -35
- package/dist/workflows/definition.d.ts.map +1 -1
- package/dist/workflows/definition.js +7 -24
- package/dist/workflows/definition.js.map +1 -1
- package/dist/workflows/events/payloads.d.ts +28 -28
- package/dist/workflows/events/replay.d.ts +5 -0
- package/dist/workflows/events/replay.d.ts.map +1 -1
- package/dist/workflows/events/replay.js +6 -1
- package/dist/workflows/events/replay.js.map +1 -1
- package/dist/workflows/events/schema.d.ts +663 -663
- package/dist/workflows/events/schema.d.ts.map +1 -1
- package/dist/workflows/events/schema.js +1 -4
- package/dist/workflows/events/schema.js.map +1 -1
- package/dist/workflows/hostExecutors/botmux-schedule.d.ts +5 -4
- package/dist/workflows/hostExecutors/botmux-schedule.d.ts.map +1 -1
- package/dist/workflows/hostExecutors/botmux-schedule.js +80 -35
- package/dist/workflows/hostExecutors/botmux-schedule.js.map +1 -1
- package/dist/workflows/hostExecutors/feishu-im.d.ts +3 -3
- package/dist/workflows/hostExecutors/feishu-im.d.ts.map +1 -1
- package/dist/workflows/hostExecutors/feishu-im.js +3 -3
- package/dist/workflows/hostExecutors/feishu-im.js.map +1 -1
- package/dist/workflows/hostExecutors/feishu-reply.d.ts +1 -1
- package/dist/workflows/hostExecutors/feishu-reply.d.ts.map +1 -1
- package/dist/workflows/hostExecutors/feishu-reply.js +1 -1
- package/dist/workflows/hostExecutors/feishu-reply.js.map +1 -1
- package/dist/workflows/hostExecutors/feishu-send.d.ts +1 -1
- package/dist/workflows/hostExecutors/feishu-send.d.ts.map +1 -1
- package/dist/workflows/hostExecutors/feishu-send.js +1 -1
- package/dist/workflows/hostExecutors/feishu-send.js.map +1 -1
- package/dist/workflows/hostExecutors/index.d.ts +0 -1
- package/dist/workflows/hostExecutors/index.d.ts.map +1 -1
- package/dist/workflows/hostExecutors/index.js +0 -1
- package/dist/workflows/hostExecutors/index.js.map +1 -1
- package/dist/workflows/hostExecutors/registry.d.ts +1 -1
- package/dist/workflows/hostExecutors/registry.d.ts.map +1 -1
- package/dist/workflows/hostExecutors/types.d.ts +21 -29
- package/dist/workflows/hostExecutors/types.d.ts.map +1 -1
- package/dist/workflows/migration/v2-definition-paths.d.ts +3 -0
- package/dist/workflows/migration/v2-definition-paths.d.ts.map +1 -0
- package/dist/workflows/migration/v2-definition-paths.js +10 -0
- package/dist/workflows/migration/v2-definition-paths.js.map +1 -0
- package/dist/workflows/migration/v2-ledger.d.ts +138 -0
- package/dist/workflows/migration/v2-ledger.d.ts.map +1 -0
- package/dist/workflows/migration/v2-ledger.js +599 -0
- package/dist/workflows/migration/v2-ledger.js.map +1 -0
- package/dist/workflows/migration/v2-migration-service.d.ts +40 -0
- package/dist/workflows/migration/v2-migration-service.d.ts.map +1 -0
- package/dist/workflows/migration/v2-migration-service.js +454 -0
- package/dist/workflows/migration/v2-migration-service.js.map +1 -0
- package/dist/workflows/migration/v2-read-only-ids.d.ts +7 -0
- package/dist/workflows/migration/v2-read-only-ids.d.ts.map +1 -0
- package/dist/workflows/migration/v2-read-only-ids.js +9 -0
- package/dist/workflows/migration/v2-read-only-ids.js.map +1 -0
- package/dist/workflows/migration/v2-run-archive-schema.d.ts +976 -0
- package/dist/workflows/migration/v2-run-archive-schema.d.ts.map +1 -0
- package/dist/workflows/migration/v2-run-archive-schema.js +113 -0
- package/dist/workflows/migration/v2-run-archive-schema.js.map +1 -0
- package/dist/workflows/migration/v2-run-archive.d.ts +92 -0
- package/dist/workflows/migration/v2-run-archive.d.ts.map +1 -0
- package/dist/workflows/migration/v2-run-archive.js +1220 -0
- package/dist/workflows/migration/v2-run-archive.js.map +1 -0
- package/dist/workflows/migration/v2-scanner.d.ts +22 -0
- package/dist/workflows/migration/v2-scanner.d.ts.map +1 -0
- package/dist/workflows/migration/v2-scanner.js +114 -0
- package/dist/workflows/migration/v2-scanner.js.map +1 -0
- package/dist/workflows/migration/v2-to-v3.d.ts +32 -0
- package/dist/workflows/migration/v2-to-v3.d.ts.map +1 -0
- package/dist/workflows/migration/v2-to-v3.js +494 -0
- package/dist/workflows/migration/v2-to-v3.js.map +1 -0
- package/dist/workflows/ops-projection.d.ts.map +1 -1
- package/dist/workflows/ops-projection.js +4 -3
- package/dist/workflows/ops-projection.js.map +1 -1
- package/dist/workflows/shared/idempotency-key.d.ts +19 -0
- package/dist/workflows/shared/idempotency-key.d.ts.map +1 -0
- package/dist/workflows/shared/idempotency-key.js +23 -0
- package/dist/workflows/shared/idempotency-key.js.map +1 -0
- package/dist/workflows/{params.d.ts → shared/params.d.ts} +42 -6
- package/dist/workflows/shared/params.d.ts.map +1 -0
- package/dist/workflows/{params.js → shared/params.js} +91 -4
- package/dist/workflows/shared/params.js.map +1 -0
- package/dist/workflows/shared/provider-reconciler.d.ts +47 -0
- package/dist/workflows/shared/provider-reconciler.d.ts.map +1 -0
- package/dist/workflows/shared/provider-reconciler.js +17 -0
- package/dist/workflows/shared/provider-reconciler.js.map +1 -0
- package/dist/workflows/{spawn-policy.d.ts → shared/sandbox-policy.d.ts} +2 -2
- package/dist/workflows/shared/sandbox-policy.d.ts.map +1 -0
- package/dist/workflows/{spawn-policy.js → shared/sandbox-policy.js} +1 -1
- package/dist/workflows/shared/sandbox-policy.js.map +1 -0
- package/dist/workflows/shared/worker-process.d.ts +29 -0
- package/dist/workflows/shared/worker-process.d.ts.map +1 -0
- package/dist/workflows/shared/worker-process.js +56 -0
- package/dist/workflows/shared/worker-process.js.map +1 -0
- package/dist/workflows/v3/architect.d.ts.map +1 -1
- package/dist/workflows/v3/architect.js +16 -4
- package/dist/workflows/v3/architect.js.map +1 -1
- package/dist/workflows/v3/attempt-ledger.d.ts +23 -0
- package/dist/workflows/v3/attempt-ledger.d.ts.map +1 -0
- package/dist/workflows/v3/attempt-ledger.js +74 -0
- package/dist/workflows/v3/attempt-ledger.js.map +1 -0
- package/dist/workflows/v3/bot-resolve.d.ts +19 -1
- package/dist/workflows/v3/bot-resolve.d.ts.map +1 -1
- package/dist/workflows/v3/bot-resolve.js +129 -3
- package/dist/workflows/v3/bot-resolve.js.map +1 -1
- package/dist/workflows/v3/cli-daemon-command-authority.d.ts +59 -0
- package/dist/workflows/v3/cli-daemon-command-authority.d.ts.map +1 -0
- package/dist/workflows/v3/cli-daemon-command-authority.js +175 -0
- package/dist/workflows/v3/cli-daemon-command-authority.js.map +1 -0
- package/dist/workflows/v3/cli-run.d.ts +27 -0
- package/dist/workflows/v3/cli-run.d.ts.map +1 -1
- package/dist/workflows/v3/cli-run.js +113 -29
- package/dist/workflows/v3/cli-run.js.map +1 -1
- package/dist/workflows/v3/contract.d.ts +16 -16
- package/dist/workflows/v3/contract.d.ts.map +1 -1
- package/dist/workflows/v3/contract.js +15 -11
- package/dist/workflows/v3/contract.js.map +1 -1
- package/dist/workflows/v3/daemon-ipc-auth.d.ts +113 -0
- package/dist/workflows/v3/daemon-ipc-auth.d.ts.map +1 -0
- package/dist/workflows/v3/daemon-ipc-auth.js +294 -0
- package/dist/workflows/v3/daemon-ipc-auth.js.map +1 -0
- package/dist/workflows/v3/daemon-ipc-body.d.ts +30 -0
- package/dist/workflows/v3/daemon-ipc-body.d.ts.map +1 -0
- package/dist/workflows/v3/daemon-ipc-body.js +65 -0
- package/dist/workflows/v3/daemon-ipc-body.js.map +1 -0
- package/dist/workflows/v3/daemon-ipc-client.d.ts +32 -0
- package/dist/workflows/v3/daemon-ipc-client.d.ts.map +1 -0
- package/dist/workflows/v3/daemon-ipc-client.js +74 -0
- package/dist/workflows/v3/daemon-ipc-client.js.map +1 -0
- package/dist/workflows/v3/daemon-run.d.ts +87 -2
- package/dist/workflows/v3/daemon-run.d.ts.map +1 -1
- package/dist/workflows/v3/daemon-run.js +863 -68
- package/dist/workflows/v3/daemon-run.js.map +1 -1
- package/dist/workflows/v3/dag.d.ts +22 -8
- package/dist/workflows/v3/dag.d.ts.map +1 -1
- package/dist/workflows/v3/dag.js +214 -22
- package/dist/workflows/v3/dag.js.map +1 -1
- package/dist/workflows/v3/distillation-compiler.d.ts +36 -0
- package/dist/workflows/v3/distillation-compiler.d.ts.map +1 -0
- package/dist/workflows/v3/distillation-compiler.js +704 -0
- package/dist/workflows/v3/distillation-compiler.js.map +1 -0
- package/dist/workflows/v3/distillation-private-root.d.ts +10 -0
- package/dist/workflows/v3/distillation-private-root.d.ts.map +1 -0
- package/dist/workflows/v3/distillation-private-root.js +34 -0
- package/dist/workflows/v3/distillation-private-root.js.map +1 -0
- package/dist/workflows/v3/distillation-runner.d.ts +64 -0
- package/dist/workflows/v3/distillation-runner.d.ts.map +1 -0
- package/dist/workflows/v3/distillation-runner.js +1028 -0
- package/dist/workflows/v3/distillation-runner.js.map +1 -0
- package/dist/workflows/v3/distillation-schema.d.ts +63 -0
- package/dist/workflows/v3/distillation-schema.d.ts.map +1 -0
- package/dist/workflows/v3/distillation-schema.js +184 -0
- package/dist/workflows/v3/distillation-schema.js.map +1 -0
- package/dist/workflows/v3/distillation-service.d.ts +78 -0
- package/dist/workflows/v3/distillation-service.d.ts.map +1 -0
- package/dist/workflows/v3/distillation-service.js +416 -0
- package/dist/workflows/v3/distillation-service.js.map +1 -0
- package/dist/workflows/v3/distillation-source.d.ts +35 -0
- package/dist/workflows/v3/distillation-source.d.ts.map +1 -0
- package/dist/workflows/v3/distillation-source.js +118 -0
- package/dist/workflows/v3/distillation-source.js.map +1 -0
- package/dist/workflows/v3/distillation-store.d.ts +185 -0
- package/dist/workflows/v3/distillation-store.d.ts.map +1 -0
- package/dist/workflows/v3/distillation-store.js +1127 -0
- package/dist/workflows/v3/distillation-store.js.map +1 -0
- package/dist/workflows/v3/drive-lease.d.ts +7 -0
- package/dist/workflows/v3/drive-lease.d.ts.map +1 -0
- package/dist/workflows/v3/drive-lease.js +10 -0
- package/dist/workflows/v3/drive-lease.js.map +1 -0
- package/dist/workflows/v3/ephemeral-pool.d.ts +1 -1
- package/dist/workflows/v3/ephemeral-pool.d.ts.map +1 -1
- package/dist/workflows/v3/ephemeral-pool.js +222 -37
- package/dist/workflows/v3/ephemeral-pool.js.map +1 -1
- package/dist/workflows/v3/grill-state.d.ts +18 -3
- package/dist/workflows/v3/grill-state.d.ts.map +1 -1
- package/dist/workflows/v3/grill-state.js +22 -5
- package/dist/workflows/v3/grill-state.js.map +1 -1
- package/dist/workflows/v3/host-bindings.d.ts +40 -0
- package/dist/workflows/v3/host-bindings.d.ts.map +1 -0
- package/dist/workflows/v3/host-bindings.js +272 -0
- package/dist/workflows/v3/host-bindings.js.map +1 -0
- package/dist/workflows/v3/host-effect-ledger.d.ts +22 -0
- package/dist/workflows/v3/host-effect-ledger.d.ts.map +1 -0
- package/dist/workflows/v3/host-effect-ledger.js +110 -0
- package/dist/workflows/v3/host-effect-ledger.js.map +1 -0
- package/dist/workflows/v3/host-execution.d.ts +142 -0
- package/dist/workflows/v3/host-execution.d.ts.map +1 -0
- package/dist/workflows/v3/host-execution.js +424 -0
- package/dist/workflows/v3/host-execution.js.map +1 -0
- package/dist/workflows/v3/host.d.ts +46 -10
- package/dist/workflows/v3/host.d.ts.map +1 -1
- package/dist/workflows/v3/host.js +419 -140
- package/dist/workflows/v3/host.js.map +1 -1
- package/dist/workflows/v3/human-gate.d.ts +19 -1
- package/dist/workflows/v3/human-gate.d.ts.map +1 -1
- package/dist/workflows/v3/human-gate.js +145 -19
- package/dist/workflows/v3/human-gate.js.map +1 -1
- package/dist/workflows/v3/journal.d.ts +125 -7
- package/dist/workflows/v3/journal.d.ts.map +1 -1
- package/dist/workflows/v3/journal.js +154 -38
- package/dist/workflows/v3/journal.js.map +1 -1
- package/dist/workflows/v3/library-materialize.d.ts +88 -0
- package/dist/workflows/v3/library-materialize.d.ts.map +1 -0
- package/dist/workflows/v3/library-materialize.js +294 -0
- package/dist/workflows/v3/library-materialize.js.map +1 -0
- package/dist/workflows/v3/library-schema.d.ts +138 -0
- package/dist/workflows/v3/library-schema.d.ts.map +1 -0
- package/dist/workflows/v3/library-schema.js +573 -0
- package/dist/workflows/v3/library-schema.js.map +1 -0
- package/dist/workflows/v3/library-service.d.ts +126 -0
- package/dist/workflows/v3/library-service.d.ts.map +1 -0
- package/dist/workflows/v3/library-service.js +542 -0
- package/dist/workflows/v3/library-service.js.map +1 -0
- package/dist/workflows/v3/library-store.d.ts +124 -0
- package/dist/workflows/v3/library-store.d.ts.map +1 -0
- package/dist/workflows/v3/library-store.js +665 -0
- package/dist/workflows/v3/library-store.js.map +1 -0
- package/dist/workflows/v3/orchestrator.d.ts +9 -1
- package/dist/workflows/v3/orchestrator.d.ts.map +1 -1
- package/dist/workflows/v3/orchestrator.js +2 -1
- package/dist/workflows/v3/orchestrator.js.map +1 -1
- package/dist/workflows/v3/progress-projection.d.ts +99 -0
- package/dist/workflows/v3/progress-projection.d.ts.map +1 -0
- package/dist/workflows/v3/progress-projection.js +197 -0
- package/dist/workflows/v3/progress-projection.js.map +1 -0
- package/dist/workflows/v3/run-envelope.d.ts +1279 -0
- package/dist/workflows/v3/run-envelope.d.ts.map +1 -0
- package/dist/workflows/v3/run-envelope.js +681 -0
- package/dist/workflows/v3/run-envelope.js.map +1 -0
- package/dist/workflows/v3/runtime.d.ts +39 -7
- package/dist/workflows/v3/runtime.d.ts.map +1 -1
- package/dist/workflows/v3/runtime.js +1992 -100
- package/dist/workflows/v3/runtime.js.map +1 -1
- package/dist/workflows/v3/session-relay-client.d.ts +61 -0
- package/dist/workflows/v3/session-relay-client.d.ts.map +1 -0
- package/dist/workflows/v3/session-relay-client.js +92 -0
- package/dist/workflows/v3/session-relay-client.js.map +1 -0
- package/dist/workflows/v3/session-relay.d.ts +66 -0
- package/dist/workflows/v3/session-relay.d.ts.map +1 -0
- package/dist/workflows/v3/session-relay.js +157 -0
- package/dist/workflows/v3/session-relay.js.map +1 -0
- package/dist/workflows/v3/start-intent.d.ts +8 -0
- package/dist/workflows/v3/start-intent.d.ts.map +1 -0
- package/dist/workflows/v3/start-intent.js +34 -0
- package/dist/workflows/v3/start-intent.js.map +1 -0
- package/dist/workflows/v3/state.d.ts +11 -2
- package/dist/workflows/v3/state.d.ts.map +1 -1
- package/dist/workflows/v3/state.js +182 -10
- package/dist/workflows/v3/state.js.map +1 -1
- package/dist/workflows/v3/template-bindings.d.ts +22 -0
- package/dist/workflows/v3/template-bindings.d.ts.map +1 -0
- package/dist/workflows/v3/template-bindings.js +204 -0
- package/dist/workflows/v3/template-bindings.js.map +1 -0
- package/dist/workflows/v3/worker-fence.d.ts +158 -0
- package/dist/workflows/v3/worker-fence.d.ts.map +1 -0
- package/dist/workflows/v3/worker-fence.js +685 -0
- package/dist/workflows/v3/worker-fence.js.map +1 -0
- package/package.json +3 -2
- package/dist/core/dashboard-command/workflows.d.ts +0 -20
- package/dist/core/dashboard-command/workflows.d.ts.map +0 -1
- package/dist/core/dashboard-command/workflows.js +0 -45
- package/dist/core/dashboard-command/workflows.js.map +0 -1
- package/dist/dashboard/web/legacy-workflow-link.d.ts +0 -2
- package/dist/dashboard/web/legacy-workflow-link.d.ts.map +0 -1
- package/dist/dashboard/web/legacy-workflow-link.js +0 -12
- package/dist/dashboard/web/legacy-workflow-link.js.map +0 -1
- package/dist/dashboard/web/legacy-workflow-page.d.ts +0 -3
- package/dist/dashboard/web/legacy-workflow-page.d.ts.map +0 -1
- package/dist/dashboard/web/legacy-workflow-page.js +0 -717
- package/dist/dashboard/web/legacy-workflow-page.js.map +0 -1
- package/dist/dashboard/web/workflow-version-switch.d.ts +0 -8
- package/dist/dashboard/web/workflow-version-switch.d.ts.map +0 -1
- package/dist/dashboard/web/workflow-version-switch.js +0 -9
- package/dist/dashboard/web/workflow-version-switch.js.map +0 -1
- package/dist/dashboard/web/workflows.d.ts +0 -273
- package/dist/dashboard/web/workflows.d.ts.map +0 -1
- package/dist/dashboard/web/workflows.js +0 -436
- package/dist/dashboard/web/workflows.js.map +0 -1
- package/dist/dashboard/workflow-api.d.ts +0 -30
- package/dist/dashboard/workflow-api.d.ts.map +0 -1
- package/dist/dashboard/workflow-api.js +0 -397
- package/dist/dashboard/workflow-api.js.map +0 -1
- package/dist/dashboard/workflow-card-model.d.ts +0 -127
- package/dist/dashboard/workflow-card-model.d.ts.map +0 -1
- package/dist/dashboard/workflow-card-model.js +0 -186
- package/dist/dashboard/workflow-card-model.js.map +0 -1
- package/dist/dashboard/workflows-action-helpers.d.ts +0 -105
- package/dist/dashboard/workflows-action-helpers.d.ts.map +0 -1
- package/dist/dashboard/workflows-action-helpers.js +0 -196
- package/dist/dashboard/workflows-action-helpers.js.map +0 -1
- package/dist/dashboard-web/chunks/bot-defaults-page-7T7DPOV6.js +0 -4
- package/dist/dashboard-web/chunks/chunk-IGXYYRYJ.js +0 -1
- package/dist/dashboard-web/chunks/chunk-ISOD7VDX.js +0 -1
- package/dist/dashboard-web/chunks/chunk-PNK3HQBI.js +0 -37
- package/dist/dashboard-web/chunks/chunk-SRIE4MLQ.js +0 -1
- package/dist/dashboard-web/chunks/connectors-page-UQ4QBE45.js +0 -1
- package/dist/dashboard-web/chunks/legacy-workflow-page-QMC7OZXH.js +0 -2
- package/dist/dashboard-web/chunks/sessions-page-NNZIDHZM.js +0 -3
- package/dist/dashboard-web/chunks/settings-page-LJIXX5LQ.js +0 -2
- package/dist/dashboard-web/chunks/v3-page-YLYVHGKD.js +0 -94
- package/dist/dashboard-web/terminal-replay.html +0 -227
- package/dist/im/lark/workflow-card-handler.d.ts +0 -51
- package/dist/im/lark/workflow-card-handler.d.ts.map +0 -1
- package/dist/im/lark/workflow-card-handler.js +0 -163
- package/dist/im/lark/workflow-card-handler.js.map +0 -1
- package/dist/im/lark/workflow-cards.d.ts +0 -47
- package/dist/im/lark/workflow-cards.d.ts.map +0 -1
- package/dist/im/lark/workflow-cards.js +0 -231
- package/dist/im/lark/workflow-cards.js.map +0 -1
- package/dist/im/lark/workflow-progress-card.d.ts +0 -81
- package/dist/im/lark/workflow-progress-card.d.ts.map +0 -1
- package/dist/im/lark/workflow-progress-card.js +0 -336
- package/dist/im/lark/workflow-progress-card.js.map +0 -1
- package/dist/im/lark/workflows-card.d.ts +0 -102
- package/dist/im/lark/workflows-card.d.ts.map +0 -1
- package/dist/im/lark/workflows-card.js +0 -737
- package/dist/im/lark/workflows-card.js.map +0 -1
- package/dist/workflows/attempt-resume.d.ts +0 -119
- package/dist/workflows/attempt-resume.d.ts.map +0 -1
- package/dist/workflows/attempt-resume.js +0 -392
- package/dist/workflows/attempt-resume.js.map +0 -1
- package/dist/workflows/blob.d.ts +0 -27
- package/dist/workflows/blob.d.ts.map +0 -1
- package/dist/workflows/blob.js +0 -40
- package/dist/workflows/blob.js.map +0 -1
- package/dist/workflows/cancel-run.d.ts +0 -45
- package/dist/workflows/cancel-run.d.ts.map +0 -1
- package/dist/workflows/cancel-run.js +0 -99
- package/dist/workflows/cancel-run.js.map +0 -1
- package/dist/workflows/cancel.d.ts +0 -111
- package/dist/workflows/cancel.d.ts.map +0 -1
- package/dist/workflows/cancel.js +0 -120
- package/dist/workflows/cancel.js.map +0 -1
- package/dist/workflows/catalog.d.ts +0 -60
- package/dist/workflows/catalog.d.ts.map +0 -1
- package/dist/workflows/catalog.js +0 -119
- package/dist/workflows/catalog.js.map +0 -1
- package/dist/workflows/cold-attach.d.ts +0 -30
- package/dist/workflows/cold-attach.d.ts.map +0 -1
- package/dist/workflows/cold-attach.js +0 -40
- package/dist/workflows/cold-attach.js.map +0 -1
- package/dist/workflows/cold-scan.d.ts +0 -21
- package/dist/workflows/cold-scan.d.ts.map +0 -1
- package/dist/workflows/cold-scan.js +0 -70
- package/dist/workflows/cold-scan.js.map +0 -1
- package/dist/workflows/daemon-spawn.d.ts +0 -119
- package/dist/workflows/daemon-spawn.d.ts.map +0 -1
- package/dist/workflows/daemon-spawn.js +0 -564
- package/dist/workflows/daemon-spawn.js.map +0 -1
- package/dist/workflows/effect-input.d.ts +0 -4
- package/dist/workflows/effect-input.d.ts.map +0 -1
- package/dist/workflows/effect-input.js +0 -19
- package/dist/workflows/effect-input.js.map +0 -1
- package/dist/workflows/events/append.d.ts +0 -77
- package/dist/workflows/events/append.d.ts.map +0 -1
- package/dist/workflows/events/append.js +0 -214
- package/dist/workflows/events/append.js.map +0 -1
- package/dist/workflows/events/idempotency.d.ts +0 -77
- package/dist/workflows/events/idempotency.d.ts.map +0 -1
- package/dist/workflows/events/idempotency.js +0 -116
- package/dist/workflows/events/idempotency.js.map +0 -1
- package/dist/workflows/events/index.d.ts +0 -7
- package/dist/workflows/events/index.d.ts.map +0 -1
- package/dist/workflows/events/index.js +0 -7
- package/dist/workflows/events/index.js.map +0 -1
- package/dist/workflows/fanout.d.ts +0 -36
- package/dist/workflows/fanout.d.ts.map +0 -1
- package/dist/workflows/fanout.js +0 -115
- package/dist/workflows/fanout.js.map +0 -1
- package/dist/workflows/hostExecutors/protocol.d.ts +0 -42
- package/dist/workflows/hostExecutors/protocol.d.ts.map +0 -1
- package/dist/workflows/hostExecutors/protocol.js +0 -181
- package/dist/workflows/hostExecutors/protocol.js.map +0 -1
- package/dist/workflows/loader.d.ts +0 -30
- package/dist/workflows/loader.d.ts.map +0 -1
- package/dist/workflows/loader.js +0 -84
- package/dist/workflows/loader.js.map +0 -1
- package/dist/workflows/loop.d.ts +0 -50
- package/dist/workflows/loop.d.ts.map +0 -1
- package/dist/workflows/loop.js +0 -408
- package/dist/workflows/loop.js.map +0 -1
- package/dist/workflows/orchestrator.d.ts +0 -171
- package/dist/workflows/orchestrator.d.ts.map +0 -1
- package/dist/workflows/orchestrator.js +0 -609
- package/dist/workflows/orchestrator.js.map +0 -1
- package/dist/workflows/output-binding.d.ts +0 -77
- package/dist/workflows/output-binding.d.ts.map +0 -1
- package/dist/workflows/output-binding.js +0 -329
- package/dist/workflows/output-binding.js.map +0 -1
- package/dist/workflows/params.d.ts.map +0 -1
- package/dist/workflows/params.js.map +0 -1
- package/dist/workflows/resume.d.ts +0 -263
- package/dist/workflows/resume.d.ts.map +0 -1
- package/dist/workflows/resume.js +0 -808
- package/dist/workflows/resume.js.map +0 -1
- package/dist/workflows/run-id.d.ts +0 -2
- package/dist/workflows/run-id.d.ts.map +0 -1
- package/dist/workflows/run-id.js +0 -7
- package/dist/workflows/run-id.js.map +0 -1
- package/dist/workflows/run-init.d.ts +0 -48
- package/dist/workflows/run-init.d.ts.map +0 -1
- package/dist/workflows/run-init.js +0 -100
- package/dist/workflows/run-init.js.map +0 -1
- package/dist/workflows/runs-dir.d.ts +0 -4
- package/dist/workflows/runs-dir.d.ts.map +0 -1
- package/dist/workflows/runs-dir.js +0 -15
- package/dist/workflows/runs-dir.js.map +0 -1
- package/dist/workflows/runtime.d.ts +0 -215
- package/dist/workflows/runtime.d.ts.map +0 -1
- package/dist/workflows/runtime.js +0 -630
- package/dist/workflows/runtime.js.map +0 -1
- package/dist/workflows/spawn-bot.d.ts +0 -165
- package/dist/workflows/spawn-bot.d.ts.map +0 -1
- package/dist/workflows/spawn-bot.js +0 -215
- package/dist/workflows/spawn-bot.js.map +0 -1
- package/dist/workflows/spawn-policy.d.ts.map +0 -1
- package/dist/workflows/spawn-policy.js.map +0 -1
- package/dist/workflows/system.d.ts +0 -49
- package/dist/workflows/system.d.ts.map +0 -1
- package/dist/workflows/system.js +0 -48
- package/dist/workflows/system.js.map +0 -1
- package/dist/workflows/trigger-from-envelope.d.ts +0 -13
- package/dist/workflows/trigger-from-envelope.d.ts.map +0 -1
- package/dist/workflows/trigger-from-envelope.js +0 -68
- package/dist/workflows/trigger-from-envelope.js.map +0 -1
- package/dist/workflows/trigger-run.d.ts +0 -70
- package/dist/workflows/trigger-run.d.ts.map +0 -1
- package/dist/workflows/trigger-run.js +0 -88
- package/dist/workflows/trigger-run.js.map +0 -1
- package/dist/workflows/wait.d.ts +0 -141
- package/dist/workflows/wait.d.ts.map +0 -1
- package/dist/workflows/wait.js +0 -203
- package/dist/workflows/wait.js.map +0 -1
package/dist/utils/file-lock.js
CHANGED
|
@@ -7,20 +7,26 @@
|
|
|
7
7
|
* O_CREAT|O_EXCL atomic, so exactly one waiter wins.
|
|
8
8
|
*
|
|
9
9
|
* Stale-break: a holder that crashes mid-section leaves the lock file
|
|
10
|
-
* behind with its
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
10
|
+
* behind with its PID + process-start identity (legacy plain PIDs remain
|
|
11
|
+
* readable). A crash before the payload write leaves an empty lock, reclaimed
|
|
12
|
+
* only after a longer grace. To reclaim either shape we create a generation-
|
|
13
|
+
* scoped hard-link claim. Breaker ownership is an append-only epoch lease:
|
|
14
|
+
* `owner-000...`, `owner-001...`, etc. A dead owner is replaced by atomically
|
|
15
|
+
* creating the next epoch, so a crash at any point can be resumed without
|
|
16
|
+
* reusing or deleting an active owner's pathname. Only the live highest epoch
|
|
17
|
+
* may unlink the public lock, after proving the claim, its pinned observation,
|
|
18
|
+
* and the public path are the same inode. This avoids both the classic delayed
|
|
19
|
+
* pathname-unlink race and the old fixed `.stale-claim` crash wedge.
|
|
16
20
|
*
|
|
17
21
|
* Not reentrant. Don't nest `withFileLock` calls on the same path within
|
|
18
22
|
* the same process — the inner call would wait MAX_WAIT_MS and then time
|
|
19
23
|
* out. (We could allow reentrancy via PID-equal check, but our callers
|
|
20
24
|
* don't need it and the equality check would re-open the stale-break race.)
|
|
21
25
|
*/
|
|
22
|
-
import { closeSync, openSync, promises as fsp, readFileSync,
|
|
23
|
-
import {
|
|
26
|
+
import { closeSync, constants, fstatSync, linkSync, lstatSync, openSync, promises as fsp, readFileSync, readdirSync, unlinkSync, writeFileSync, } from 'node:fs';
|
|
27
|
+
import { createHash } from 'node:crypto';
|
|
28
|
+
import { basename, dirname, join } from 'node:path';
|
|
29
|
+
import { readLinuxBootIdentity, readProcessStartIdentity } from '../core/session-marker.js';
|
|
24
30
|
import { logger } from './logger.js';
|
|
25
31
|
const MAX_WAIT_MS = 5_000;
|
|
26
32
|
const RETRY_BASE_MS = 25;
|
|
@@ -28,7 +34,80 @@ const RETRY_BASE_MS = 25;
|
|
|
28
34
|
// Prevents racing on freshly-acquired locks where the holder might not have
|
|
29
35
|
// finished writing its PID file yet.
|
|
30
36
|
const MIN_STALE_AGE_MS = 100;
|
|
31
|
-
|
|
37
|
+
// `open(..., 'wx')` creates the inode before the holder PID is written. A
|
|
38
|
+
// crash in that tiny window leaves an empty/invalid lock. Never steal a live
|
|
39
|
+
// writer's freshly-created file, but do reclaim an invalid holder after a more
|
|
40
|
+
// conservative grace period so crash recovery cannot deadlock forever.
|
|
41
|
+
const MIN_INVALID_HOLDER_STALE_AGE_MS = 1_000;
|
|
42
|
+
const STALE_CLAIM_PREFIX = '.botmux-stale-claim-';
|
|
43
|
+
const STALE_CLAIM_OWNER_SUFFIX = '.owner-';
|
|
44
|
+
const STALE_CLAIM_OWNER_WIDTH = 12;
|
|
45
|
+
let selfProcStartResolved = false;
|
|
46
|
+
let selfProcStart;
|
|
47
|
+
let selfBootIdResolved = false;
|
|
48
|
+
let selfBootId;
|
|
49
|
+
function currentLockHolderPayload() {
|
|
50
|
+
if (!selfProcStartResolved) {
|
|
51
|
+
selfProcStart = readProcessStartIdentity(process.pid);
|
|
52
|
+
selfProcStartResolved = true;
|
|
53
|
+
}
|
|
54
|
+
if (!selfBootIdResolved) {
|
|
55
|
+
selfBootId = readLinuxBootIdentity();
|
|
56
|
+
selfBootIdResolved = true;
|
|
57
|
+
}
|
|
58
|
+
return selfProcStart || selfBootId
|
|
59
|
+
? JSON.stringify({
|
|
60
|
+
pid: process.pid,
|
|
61
|
+
...(selfProcStart ? { procStart: selfProcStart } : {}),
|
|
62
|
+
...(selfBootId ? { bootId: selfBootId } : {}),
|
|
63
|
+
})
|
|
64
|
+
: String(process.pid);
|
|
65
|
+
}
|
|
66
|
+
function parseLockHolder(raw) {
|
|
67
|
+
const text = raw.trim();
|
|
68
|
+
if (!text)
|
|
69
|
+
return undefined;
|
|
70
|
+
if (/^\d+$/.test(text)) {
|
|
71
|
+
const pid = Number(text);
|
|
72
|
+
return Number.isSafeInteger(pid) && pid > 1 ? { pid } : undefined;
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
const value = JSON.parse(text);
|
|
76
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
77
|
+
return undefined;
|
|
78
|
+
const record = value;
|
|
79
|
+
if (!Number.isSafeInteger(record.pid) || record.pid <= 1)
|
|
80
|
+
return undefined;
|
|
81
|
+
if (record.procStart !== undefined &&
|
|
82
|
+
(typeof record.procStart !== 'string' || !record.procStart || record.procStart.length > 256))
|
|
83
|
+
return undefined;
|
|
84
|
+
if (record.bootId !== undefined &&
|
|
85
|
+
(typeof record.bootId !== 'string' || !record.bootId || record.bootId.length > 256))
|
|
86
|
+
return undefined;
|
|
87
|
+
return {
|
|
88
|
+
pid: record.pid,
|
|
89
|
+
...(typeof record.procStart === 'string' ? { procStart: record.procStart } : {}),
|
|
90
|
+
...(typeof record.bootId === 'string' ? { bootId: record.bootId } : {}),
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async function isHolderAlive(holder) {
|
|
98
|
+
if (holder.bootId) {
|
|
99
|
+
const liveBoot = readLinuxBootIdentity();
|
|
100
|
+
if (liveBoot === undefined)
|
|
101
|
+
return true;
|
|
102
|
+
if (liveBoot !== holder.bootId)
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
if (holder.procStart) {
|
|
106
|
+
const liveStart = readProcessStartIdentity(holder.pid);
|
|
107
|
+
if (liveStart !== undefined)
|
|
108
|
+
return liveStart === holder.procStart;
|
|
109
|
+
}
|
|
110
|
+
const pid = holder.pid;
|
|
32
111
|
if (!pid)
|
|
33
112
|
return false;
|
|
34
113
|
if (pid === process.pid)
|
|
@@ -41,7 +120,20 @@ async function isPidAlive(pid) {
|
|
|
41
120
|
return false;
|
|
42
121
|
}
|
|
43
122
|
}
|
|
44
|
-
function
|
|
123
|
+
function isHolderAliveSync(holder) {
|
|
124
|
+
if (holder.bootId) {
|
|
125
|
+
const liveBoot = readLinuxBootIdentity();
|
|
126
|
+
if (liveBoot === undefined)
|
|
127
|
+
return true;
|
|
128
|
+
if (liveBoot !== holder.bootId)
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
if (holder.procStart) {
|
|
132
|
+
const liveStart = readProcessStartIdentity(holder.pid);
|
|
133
|
+
if (liveStart !== undefined)
|
|
134
|
+
return liveStart === holder.procStart;
|
|
135
|
+
}
|
|
136
|
+
const pid = holder.pid;
|
|
45
137
|
if (!pid)
|
|
46
138
|
return false;
|
|
47
139
|
if (pid === process.pid)
|
|
@@ -57,76 +149,545 @@ function isPidAliveSync(pid) {
|
|
|
57
149
|
function sleepSync(ms) {
|
|
58
150
|
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
|
|
59
151
|
}
|
|
152
|
+
function sameInode(left, right) {
|
|
153
|
+
return left.dev === right.dev && left.ino === right.ino;
|
|
154
|
+
}
|
|
155
|
+
async function releaseOwnedLock(lockPath, owned) {
|
|
156
|
+
try {
|
|
157
|
+
const current = await fsp.lstat(lockPath);
|
|
158
|
+
if (current.isFile() && !current.isSymbolicLink() && sameInode(current, owned)) {
|
|
159
|
+
await fsp.unlink(lockPath);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
if (error.code !== 'ENOENT')
|
|
164
|
+
throw error;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
function releaseOwnedLockSync(lockPath, owned) {
|
|
168
|
+
try {
|
|
169
|
+
const current = lstatSync(lockPath);
|
|
170
|
+
if (current.isFile() && !current.isSymbolicLink() && sameInode(current, owned)) {
|
|
171
|
+
unlinkSync(lockPath);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
if (error.code !== 'ENOENT')
|
|
176
|
+
throw error;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
function staleClaimPathFor(lockPath, observed) {
|
|
180
|
+
// link(2) changes ctime, so the generation deliberately uses only identity
|
|
181
|
+
// metadata that remains stable for the inode's entire lifetime. In
|
|
182
|
+
// particular, size and mtime are excluded: a late holder write must not let
|
|
183
|
+
// two breakers elect different claims for the same inode.
|
|
184
|
+
// The digest keeps the sibling filename well below NAME_MAX even when the
|
|
185
|
+
// target filename itself is long.
|
|
186
|
+
const generation = createHash('sha256')
|
|
187
|
+
.update([
|
|
188
|
+
String(observed.dev),
|
|
189
|
+
String(observed.ino),
|
|
190
|
+
String(observed.birthtimeMs),
|
|
191
|
+
].join('\0'))
|
|
192
|
+
.digest('hex')
|
|
193
|
+
.slice(0, 24);
|
|
194
|
+
return join(dirname(lockPath), `${STALE_CLAIM_PREFIX}${generation}`);
|
|
195
|
+
}
|
|
196
|
+
function staleClaimOwnerPath(claimPath, epoch) {
|
|
197
|
+
return `${claimPath}${STALE_CLAIM_OWNER_SUFFIX}${String(epoch).padStart(STALE_CLAIM_OWNER_WIDTH, '0')}`;
|
|
198
|
+
}
|
|
199
|
+
function parseStaleClaimOwnerEpoch(claimPath, name) {
|
|
200
|
+
const prefix = `${basename(claimPath)}${STALE_CLAIM_OWNER_SUFFIX}`;
|
|
201
|
+
if (!name.startsWith(prefix))
|
|
202
|
+
return undefined;
|
|
203
|
+
const raw = name.slice(prefix.length);
|
|
204
|
+
if (raw.length !== STALE_CLAIM_OWNER_WIDTH || !/^\d+$/.test(raw))
|
|
205
|
+
return undefined;
|
|
206
|
+
const epoch = Number(raw);
|
|
207
|
+
return Number.isSafeInteger(epoch) ? epoch : undefined;
|
|
208
|
+
}
|
|
209
|
+
async function readPinnedHolder(path) {
|
|
210
|
+
const handle = await fsp.open(path, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
211
|
+
try {
|
|
212
|
+
const before = await handle.stat();
|
|
213
|
+
const raw = await handle.readFile('utf8');
|
|
214
|
+
const after = await handle.stat();
|
|
215
|
+
if (!before.isFile() || !sameInode(before, after) || before.size !== after.size ||
|
|
216
|
+
before.mtimeMs !== after.mtimeMs || before.ctimeMs !== after.ctimeMs) {
|
|
217
|
+
throw new Error('file-lock stale-claim owner changed while reading');
|
|
218
|
+
}
|
|
219
|
+
return { holder: parseLockHolder(raw), ageMs: Date.now() - after.mtimeMs, stats: after };
|
|
220
|
+
}
|
|
221
|
+
finally {
|
|
222
|
+
await handle.close();
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
function readPinnedHolderSync(path) {
|
|
226
|
+
const fd = openSync(path, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
227
|
+
try {
|
|
228
|
+
const before = fstatSync(fd);
|
|
229
|
+
const raw = readFileSync(fd, 'utf8');
|
|
230
|
+
const after = fstatSync(fd);
|
|
231
|
+
if (!before.isFile() || !sameInode(before, after) || before.size !== after.size ||
|
|
232
|
+
before.mtimeMs !== after.mtimeMs || before.ctimeMs !== after.ctimeMs) {
|
|
233
|
+
throw new Error('file-lock stale-claim owner changed while reading');
|
|
234
|
+
}
|
|
235
|
+
return { holder: parseLockHolder(raw), ageMs: Date.now() - after.mtimeMs, stats: after };
|
|
236
|
+
}
|
|
237
|
+
finally {
|
|
238
|
+
closeSync(fd);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
async function tryAcquireStaleClaimOwnership(claimPath, claimWasCreated, minStaleAgeMs) {
|
|
242
|
+
let claim;
|
|
243
|
+
try {
|
|
244
|
+
claim = await fsp.lstat(claimPath);
|
|
245
|
+
}
|
|
246
|
+
catch (error) {
|
|
247
|
+
if (error.code === 'ENOENT')
|
|
248
|
+
return undefined;
|
|
249
|
+
throw error;
|
|
250
|
+
}
|
|
251
|
+
if (!claim.isFile() || claim.isSymbolicLink()) {
|
|
252
|
+
throw new Error('file-lock stale-claim is not a regular file');
|
|
253
|
+
}
|
|
254
|
+
const ownerEpochs = (await fsp.readdir(dirname(claimPath)))
|
|
255
|
+
.map(name => parseStaleClaimOwnerEpoch(claimPath, name))
|
|
256
|
+
.filter((epoch) => epoch !== undefined)
|
|
257
|
+
.sort((left, right) => left - right);
|
|
258
|
+
let nextEpoch = 0;
|
|
259
|
+
const latestEpoch = ownerEpochs.at(-1);
|
|
260
|
+
if (latestEpoch === undefined) {
|
|
261
|
+
// The creator may still be between link(2) and owner publication. The
|
|
262
|
+
// claim inode's ctime is refreshed by link(2), unlike its old mtime.
|
|
263
|
+
const ownerlessAgeMs = Date.now() - claim.ctimeMs;
|
|
264
|
+
if (!claimWasCreated && ownerlessAgeMs < Math.max(minStaleAgeMs, MIN_INVALID_HOLDER_STALE_AGE_MS)) {
|
|
265
|
+
return undefined;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
let observedOwner;
|
|
270
|
+
try {
|
|
271
|
+
observedOwner = await readPinnedHolder(staleClaimOwnerPath(claimPath, latestEpoch));
|
|
272
|
+
}
|
|
273
|
+
catch (error) {
|
|
274
|
+
if (error.code === 'ENOENT')
|
|
275
|
+
return undefined;
|
|
276
|
+
throw error;
|
|
277
|
+
}
|
|
278
|
+
const staleAge = observedOwner.holder
|
|
279
|
+
? minStaleAgeMs
|
|
280
|
+
: Math.max(minStaleAgeMs, MIN_INVALID_HOLDER_STALE_AGE_MS);
|
|
281
|
+
if (observedOwner.ageMs < staleAge ||
|
|
282
|
+
(observedOwner.holder && await isHolderAlive(observedOwner.holder))) {
|
|
283
|
+
return undefined;
|
|
284
|
+
}
|
|
285
|
+
nextEpoch = latestEpoch + 1;
|
|
286
|
+
if (!Number.isSafeInteger(nextEpoch) || nextEpoch >= 10 ** STALE_CLAIM_OWNER_WIDTH) {
|
|
287
|
+
throw new Error('file-lock stale-claim owner epoch exhausted');
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
const ownerPath = staleClaimOwnerPath(claimPath, nextEpoch);
|
|
291
|
+
let handle;
|
|
292
|
+
try {
|
|
293
|
+
handle = await fsp.open(ownerPath, 'wx');
|
|
294
|
+
}
|
|
295
|
+
catch (error) {
|
|
296
|
+
if (error.code === 'EEXIST' ||
|
|
297
|
+
error.code === 'ENOENT')
|
|
298
|
+
return undefined;
|
|
299
|
+
throw error;
|
|
300
|
+
}
|
|
301
|
+
try {
|
|
302
|
+
// As with the public lock, publish the identity without an async gap.
|
|
303
|
+
writeFileSync(handle.fd, currentLockHolderPayload());
|
|
304
|
+
const owner = await handle.stat();
|
|
305
|
+
const currentClaim = await fsp.lstat(claimPath);
|
|
306
|
+
if (!owner.isFile() || !sameInode(currentClaim, claim)) {
|
|
307
|
+
await handle.close();
|
|
308
|
+
try {
|
|
309
|
+
await releaseOwnedLock(ownerPath, owner);
|
|
310
|
+
}
|
|
311
|
+
catch { /* tolerate */ }
|
|
312
|
+
return undefined;
|
|
313
|
+
}
|
|
314
|
+
return { ownerPath, handle };
|
|
315
|
+
}
|
|
316
|
+
catch (error) {
|
|
317
|
+
try {
|
|
318
|
+
await handle.close();
|
|
319
|
+
}
|
|
320
|
+
catch { /* tolerate */ }
|
|
321
|
+
try {
|
|
322
|
+
await fsp.unlink(ownerPath);
|
|
323
|
+
}
|
|
324
|
+
catch { /* tolerate */ }
|
|
325
|
+
if (error.code === 'ENOENT')
|
|
326
|
+
return undefined;
|
|
327
|
+
throw error;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
function tryAcquireStaleClaimOwnershipSync(claimPath, claimWasCreated, minStaleAgeMs) {
|
|
331
|
+
let claim;
|
|
332
|
+
try {
|
|
333
|
+
claim = lstatSync(claimPath);
|
|
334
|
+
}
|
|
335
|
+
catch (error) {
|
|
336
|
+
if (error.code === 'ENOENT')
|
|
337
|
+
return undefined;
|
|
338
|
+
throw error;
|
|
339
|
+
}
|
|
340
|
+
if (!claim.isFile() || claim.isSymbolicLink()) {
|
|
341
|
+
throw new Error('file-lock stale-claim is not a regular file');
|
|
342
|
+
}
|
|
343
|
+
const ownerEpochs = readdirSync(dirname(claimPath))
|
|
344
|
+
.map(name => parseStaleClaimOwnerEpoch(claimPath, name))
|
|
345
|
+
.filter((epoch) => epoch !== undefined)
|
|
346
|
+
.sort((left, right) => left - right);
|
|
347
|
+
let nextEpoch = 0;
|
|
348
|
+
const latestEpoch = ownerEpochs.at(-1);
|
|
349
|
+
if (latestEpoch === undefined) {
|
|
350
|
+
const ownerlessAgeMs = Date.now() - claim.ctimeMs;
|
|
351
|
+
if (!claimWasCreated && ownerlessAgeMs < Math.max(minStaleAgeMs, MIN_INVALID_HOLDER_STALE_AGE_MS)) {
|
|
352
|
+
return undefined;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
else {
|
|
356
|
+
let observedOwner;
|
|
357
|
+
try {
|
|
358
|
+
observedOwner = readPinnedHolderSync(staleClaimOwnerPath(claimPath, latestEpoch));
|
|
359
|
+
}
|
|
360
|
+
catch (error) {
|
|
361
|
+
if (error.code === 'ENOENT')
|
|
362
|
+
return undefined;
|
|
363
|
+
throw error;
|
|
364
|
+
}
|
|
365
|
+
const staleAge = observedOwner.holder
|
|
366
|
+
? minStaleAgeMs
|
|
367
|
+
: Math.max(minStaleAgeMs, MIN_INVALID_HOLDER_STALE_AGE_MS);
|
|
368
|
+
if (observedOwner.ageMs < staleAge ||
|
|
369
|
+
(observedOwner.holder && isHolderAliveSync(observedOwner.holder))) {
|
|
370
|
+
return undefined;
|
|
371
|
+
}
|
|
372
|
+
nextEpoch = latestEpoch + 1;
|
|
373
|
+
if (!Number.isSafeInteger(nextEpoch) || nextEpoch >= 10 ** STALE_CLAIM_OWNER_WIDTH) {
|
|
374
|
+
throw new Error('file-lock stale-claim owner epoch exhausted');
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
const ownerPath = staleClaimOwnerPath(claimPath, nextEpoch);
|
|
378
|
+
let fd;
|
|
379
|
+
try {
|
|
380
|
+
fd = openSync(ownerPath, 'wx');
|
|
381
|
+
}
|
|
382
|
+
catch (error) {
|
|
383
|
+
if (error.code === 'EEXIST' ||
|
|
384
|
+
error.code === 'ENOENT')
|
|
385
|
+
return undefined;
|
|
386
|
+
throw error;
|
|
387
|
+
}
|
|
388
|
+
try {
|
|
389
|
+
writeFileSync(fd, currentLockHolderPayload());
|
|
390
|
+
const owner = fstatSync(fd);
|
|
391
|
+
const currentClaim = lstatSync(claimPath);
|
|
392
|
+
if (!owner.isFile() || !sameInode(currentClaim, claim)) {
|
|
393
|
+
closeSync(fd);
|
|
394
|
+
try {
|
|
395
|
+
releaseOwnedLockSync(ownerPath, owner);
|
|
396
|
+
}
|
|
397
|
+
catch { /* tolerate */ }
|
|
398
|
+
return undefined;
|
|
399
|
+
}
|
|
400
|
+
return { ownerPath, fd };
|
|
401
|
+
}
|
|
402
|
+
catch (error) {
|
|
403
|
+
try {
|
|
404
|
+
closeSync(fd);
|
|
405
|
+
}
|
|
406
|
+
catch { /* tolerate */ }
|
|
407
|
+
try {
|
|
408
|
+
unlinkSync(ownerPath);
|
|
409
|
+
}
|
|
410
|
+
catch { /* tolerate */ }
|
|
411
|
+
if (error.code === 'ENOENT')
|
|
412
|
+
return undefined;
|
|
413
|
+
throw error;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
async function cleanStaleClaimOwnership(claimPath, ownership) {
|
|
417
|
+
try {
|
|
418
|
+
await ownership.handle.close();
|
|
419
|
+
}
|
|
420
|
+
catch { /* tolerate */ }
|
|
421
|
+
try {
|
|
422
|
+
await fsp.unlink(ownership.ownerPath);
|
|
423
|
+
}
|
|
424
|
+
catch { /* tolerate */ }
|
|
425
|
+
// Older dead epochs are no longer security-relevant after the claim itself
|
|
426
|
+
// is gone. Clean them best-effort; a loser that was already in flight may
|
|
427
|
+
// leave another harmless orphan owner file behind.
|
|
428
|
+
try {
|
|
429
|
+
const names = await fsp.readdir(dirname(claimPath));
|
|
430
|
+
await Promise.all(names.filter(name => parseStaleClaimOwnerEpoch(claimPath, name) !== undefined).map(async (name) => {
|
|
431
|
+
try {
|
|
432
|
+
await fsp.unlink(join(dirname(claimPath), name));
|
|
433
|
+
}
|
|
434
|
+
catch { /* tolerate */ }
|
|
435
|
+
}));
|
|
436
|
+
}
|
|
437
|
+
catch { /* tolerate */ }
|
|
438
|
+
}
|
|
439
|
+
function cleanStaleClaimOwnershipSync(claimPath, ownership) {
|
|
440
|
+
try {
|
|
441
|
+
closeSync(ownership.fd);
|
|
442
|
+
}
|
|
443
|
+
catch { /* tolerate */ }
|
|
444
|
+
try {
|
|
445
|
+
unlinkSync(ownership.ownerPath);
|
|
446
|
+
}
|
|
447
|
+
catch { /* tolerate */ }
|
|
448
|
+
try {
|
|
449
|
+
for (const name of readdirSync(dirname(claimPath))) {
|
|
450
|
+
if (parseStaleClaimOwnerEpoch(claimPath, name) === undefined)
|
|
451
|
+
continue;
|
|
452
|
+
try {
|
|
453
|
+
unlinkSync(join(dirname(claimPath), name));
|
|
454
|
+
}
|
|
455
|
+
catch { /* tolerate */ }
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
catch { /* tolerate */ }
|
|
459
|
+
}
|
|
460
|
+
async function resumeStaleBreak(lockPath, claimPath, observed, claimWasCreated, minStaleAgeMs) {
|
|
461
|
+
const ownership = await tryAcquireStaleClaimOwnership(claimPath, claimWasCreated, minStaleAgeMs);
|
|
462
|
+
if (!ownership)
|
|
463
|
+
return false;
|
|
464
|
+
let claimRemoved = false;
|
|
465
|
+
try {
|
|
466
|
+
const claim = await fsp.lstat(claimPath);
|
|
467
|
+
if (!sameInode(claim, observed)) {
|
|
468
|
+
// The public stale inode may have been released and replaced after our
|
|
469
|
+
// observation but before link(2). In that case link(2) pinned the newer
|
|
470
|
+
// inode under the older generation name. Remove only that pinned claim;
|
|
471
|
+
// never touch the public path, which may now be a live holder.
|
|
472
|
+
await releaseOwnedLock(claimPath, claim);
|
|
473
|
+
claimRemoved = true;
|
|
474
|
+
return false;
|
|
475
|
+
}
|
|
476
|
+
let current;
|
|
477
|
+
try {
|
|
478
|
+
current = await readPinnedHolder(lockPath);
|
|
479
|
+
}
|
|
480
|
+
catch (error) {
|
|
481
|
+
if (error.code !== 'ENOENT')
|
|
482
|
+
throw error;
|
|
483
|
+
}
|
|
484
|
+
if (current && sameInode(current.stats, observed)) {
|
|
485
|
+
const staleAge = current.holder
|
|
486
|
+
? minStaleAgeMs
|
|
487
|
+
: Math.max(minStaleAgeMs, MIN_INVALID_HOLDER_STALE_AGE_MS);
|
|
488
|
+
const stillBreakable = current.ageMs >= staleAge &&
|
|
489
|
+
(!current.holder || !(await isHolderAlive(current.holder)));
|
|
490
|
+
if (!stillBreakable) {
|
|
491
|
+
// A once-empty holder may have finished publishing a live identity
|
|
492
|
+
// while the claim was being elected. Withdraw the claim, never steal.
|
|
493
|
+
await releaseOwnedLock(claimPath, claim);
|
|
494
|
+
claimRemoved = true;
|
|
495
|
+
return false;
|
|
496
|
+
}
|
|
497
|
+
await fsp.unlink(lockPath);
|
|
498
|
+
logger.warn(`[file-lock] broke stale lock at ${lockPath} ` +
|
|
499
|
+
`(${current.holder ? `dead/reused pid ${current.holder.pid}` : 'empty/invalid holder'}, age ${current.ageMs}ms)`);
|
|
500
|
+
}
|
|
501
|
+
// If the public path is absent or names a newer inode, a previous owner
|
|
502
|
+
// completed the destructive step and crashed before cleanup. Removing the
|
|
503
|
+
// generation-scoped claim is the replay operation.
|
|
504
|
+
await releaseOwnedLock(claimPath, claim);
|
|
505
|
+
claimRemoved = true;
|
|
506
|
+
return true;
|
|
507
|
+
}
|
|
508
|
+
finally {
|
|
509
|
+
// Only the elected live epoch may remove the claim. If claim cleanup
|
|
510
|
+
// failed, keep owner history so another process can take over after this
|
|
511
|
+
// process dies rather than allowing two concurrent breakers.
|
|
512
|
+
if (claimRemoved)
|
|
513
|
+
await cleanStaleClaimOwnership(claimPath, ownership);
|
|
514
|
+
else {
|
|
515
|
+
try {
|
|
516
|
+
await ownership.handle.close();
|
|
517
|
+
}
|
|
518
|
+
catch { /* tolerate */ }
|
|
519
|
+
// This owner is returning synchronously and cannot later resume an
|
|
520
|
+
// unlink. Withdraw its epoch so the same process does not look like a
|
|
521
|
+
// permanently-live crashed breaker after a transient I/O error.
|
|
522
|
+
try {
|
|
523
|
+
await fsp.unlink(ownership.ownerPath);
|
|
524
|
+
}
|
|
525
|
+
catch { /* tolerate */ }
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
function resumeStaleBreakSync(lockPath, claimPath, observed, claimWasCreated, minStaleAgeMs) {
|
|
530
|
+
const ownership = tryAcquireStaleClaimOwnershipSync(claimPath, claimWasCreated, minStaleAgeMs);
|
|
531
|
+
if (!ownership)
|
|
532
|
+
return false;
|
|
533
|
+
let claimRemoved = false;
|
|
534
|
+
try {
|
|
535
|
+
const claim = lstatSync(claimPath);
|
|
536
|
+
if (!sameInode(claim, observed)) {
|
|
537
|
+
releaseOwnedLockSync(claimPath, claim);
|
|
538
|
+
claimRemoved = true;
|
|
539
|
+
return false;
|
|
540
|
+
}
|
|
541
|
+
let current;
|
|
542
|
+
try {
|
|
543
|
+
current = readPinnedHolderSync(lockPath);
|
|
544
|
+
}
|
|
545
|
+
catch (error) {
|
|
546
|
+
if (error.code !== 'ENOENT')
|
|
547
|
+
throw error;
|
|
548
|
+
}
|
|
549
|
+
if (current && sameInode(current.stats, observed)) {
|
|
550
|
+
const staleAge = current.holder
|
|
551
|
+
? minStaleAgeMs
|
|
552
|
+
: Math.max(minStaleAgeMs, MIN_INVALID_HOLDER_STALE_AGE_MS);
|
|
553
|
+
const stillBreakable = current.ageMs >= staleAge &&
|
|
554
|
+
(!current.holder || !isHolderAliveSync(current.holder));
|
|
555
|
+
if (!stillBreakable) {
|
|
556
|
+
releaseOwnedLockSync(claimPath, claim);
|
|
557
|
+
claimRemoved = true;
|
|
558
|
+
return false;
|
|
559
|
+
}
|
|
560
|
+
unlinkSync(lockPath);
|
|
561
|
+
logger.warn(`[file-lock] broke stale lock at ${lockPath} ` +
|
|
562
|
+
`(${current.holder ? `dead/reused pid ${current.holder.pid}` : 'empty/invalid holder'}, age ${current.ageMs}ms)`);
|
|
563
|
+
}
|
|
564
|
+
releaseOwnedLockSync(claimPath, claim);
|
|
565
|
+
claimRemoved = true;
|
|
566
|
+
return true;
|
|
567
|
+
}
|
|
568
|
+
finally {
|
|
569
|
+
if (claimRemoved)
|
|
570
|
+
cleanStaleClaimOwnershipSync(claimPath, ownership);
|
|
571
|
+
else {
|
|
572
|
+
try {
|
|
573
|
+
closeSync(ownership.fd);
|
|
574
|
+
}
|
|
575
|
+
catch { /* tolerate */ }
|
|
576
|
+
try {
|
|
577
|
+
unlinkSync(ownership.ownerPath);
|
|
578
|
+
}
|
|
579
|
+
catch { /* tolerate */ }
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
}
|
|
60
583
|
export async function withFileLock(targetPath, fn, opts = {}) {
|
|
61
584
|
const maxWaitMs = opts.maxWaitMs ?? MAX_WAIT_MS;
|
|
62
585
|
const minStaleAgeMs = opts.minStaleAgeMs ?? MIN_STALE_AGE_MS;
|
|
63
586
|
const lockPath = targetPath + '.lock';
|
|
64
587
|
const start = Date.now();
|
|
588
|
+
// Resolve the (potentially ps-backed on non-Linux) birth identity before
|
|
589
|
+
// publishing an empty O_EXCL inode. The cached payload makes open→write a
|
|
590
|
+
// tiny synchronous step rather than a seconds-long stale-break window.
|
|
591
|
+
const holderPayload = currentLockHolderPayload();
|
|
65
592
|
while (true) {
|
|
593
|
+
let fh;
|
|
66
594
|
try {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
595
|
+
fh = await fsp.open(lockPath, 'wx');
|
|
596
|
+
}
|
|
597
|
+
catch (error) {
|
|
598
|
+
if (error.code !== 'EEXIST')
|
|
599
|
+
throw error;
|
|
600
|
+
}
|
|
601
|
+
if (fh) {
|
|
602
|
+
let owned;
|
|
70
603
|
try {
|
|
71
|
-
|
|
604
|
+
// Synchronous fd write avoids yielding with a publicly-visible empty
|
|
605
|
+
// lock between O_EXCL creation and holder publication.
|
|
606
|
+
writeFileSync(fh.fd, holderPayload);
|
|
607
|
+
owned = fstatSync(fh.fd);
|
|
72
608
|
}
|
|
73
|
-
|
|
609
|
+
catch (writeErr) {
|
|
74
610
|
try {
|
|
75
|
-
await
|
|
611
|
+
await fh.close();
|
|
76
612
|
}
|
|
77
|
-
catch { /*
|
|
78
|
-
|
|
79
|
-
}
|
|
80
|
-
catch (e) {
|
|
81
|
-
if (e.code !== 'EEXIST')
|
|
82
|
-
throw e;
|
|
83
|
-
// EEXIST: someone holds the lock. Check whether it's stale (dead PID
|
|
84
|
-
// + old enough). If so, attempt an atomic rename — POSIX guarantees
|
|
85
|
-
// exactly one caller succeeds.
|
|
86
|
-
let holder = 0;
|
|
87
|
-
let lockAgeMs = Infinity;
|
|
88
|
-
try {
|
|
89
|
-
const [raw, stat] = await Promise.all([
|
|
90
|
-
fsp.readFile(lockPath, 'utf-8'),
|
|
91
|
-
fsp.stat(lockPath),
|
|
92
|
-
]);
|
|
93
|
-
holder = parseInt(raw, 10) || 0;
|
|
94
|
-
lockAgeMs = Date.now() - stat.mtimeMs;
|
|
95
|
-
}
|
|
96
|
-
catch (re) {
|
|
97
|
-
if (re.code === 'ENOENT')
|
|
98
|
-
continue; // released between EEXIST and read
|
|
99
|
-
throw re;
|
|
100
|
-
}
|
|
101
|
-
const breakable = holder
|
|
102
|
-
&& lockAgeMs >= minStaleAgeMs
|
|
103
|
-
&& !(await isPidAlive(holder));
|
|
104
|
-
if (breakable) {
|
|
105
|
-
// Atomic rename: only ONE caller wins. The winner is responsible
|
|
106
|
-
// for cleaning up the stale carcass; losers get ENOENT and retry
|
|
107
|
-
// the lock acquisition on the next iteration.
|
|
108
|
-
const stalePath = `${lockPath}.stale.${process.pid}.${randomBytes(4).toString('hex')}`;
|
|
109
|
-
try {
|
|
110
|
-
await fsp.rename(lockPath, stalePath);
|
|
111
|
-
logger.warn(`[file-lock] broke stale lock at ${lockPath} (dead pid ${holder}, age ${lockAgeMs}ms)`);
|
|
613
|
+
catch { /* tolerate */ }
|
|
614
|
+
if (owned) {
|
|
112
615
|
try {
|
|
113
|
-
await
|
|
616
|
+
await releaseOwnedLock(lockPath, owned);
|
|
114
617
|
}
|
|
115
618
|
catch { /* tolerate */ }
|
|
116
|
-
continue;
|
|
117
619
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
620
|
+
throw writeErr;
|
|
621
|
+
}
|
|
622
|
+
try {
|
|
623
|
+
return await fn();
|
|
624
|
+
}
|
|
625
|
+
finally {
|
|
626
|
+
try {
|
|
627
|
+
if (owned)
|
|
628
|
+
await releaseOwnedLock(lockPath, owned);
|
|
629
|
+
}
|
|
630
|
+
catch { /* tolerate */ }
|
|
631
|
+
try {
|
|
632
|
+
await fh.close();
|
|
122
633
|
}
|
|
634
|
+
catch { /* tolerate */ }
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
// EEXIST from open: someone holds the lock. Callback exceptions never
|
|
638
|
+
// reach this branch, even when user code happens to use the same code.
|
|
639
|
+
let holder;
|
|
640
|
+
let lockAgeMs = Infinity;
|
|
641
|
+
let observed;
|
|
642
|
+
try {
|
|
643
|
+
const observedHandle = await fsp.open(lockPath, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
644
|
+
try {
|
|
645
|
+
const before = await observedHandle.stat();
|
|
646
|
+
const raw = await observedHandle.readFile('utf8');
|
|
647
|
+
const after = await observedHandle.stat();
|
|
648
|
+
if (!before.isFile() || !sameInode(before, after) || before.size !== after.size ||
|
|
649
|
+
before.mtimeMs !== after.mtimeMs || before.ctimeMs !== after.ctimeMs)
|
|
650
|
+
continue;
|
|
651
|
+
observed = after;
|
|
652
|
+
holder = parseLockHolder(raw);
|
|
653
|
+
lockAgeMs = Date.now() - after.mtimeMs;
|
|
654
|
+
}
|
|
655
|
+
finally {
|
|
656
|
+
await observedHandle.close();
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
catch (re) {
|
|
660
|
+
if (re.code === 'ENOENT')
|
|
661
|
+
continue; // released between EEXIST and read
|
|
662
|
+
throw re;
|
|
663
|
+
}
|
|
664
|
+
const staleAge = holder
|
|
665
|
+
? minStaleAgeMs
|
|
666
|
+
: Math.max(minStaleAgeMs, MIN_INVALID_HOLDER_STALE_AGE_MS);
|
|
667
|
+
const breakable = lockAgeMs >= staleAge &&
|
|
668
|
+
(!holder || !(await isHolderAlive(holder)));
|
|
669
|
+
if (breakable) {
|
|
670
|
+
const stalePath = staleClaimPathFor(lockPath, observed);
|
|
671
|
+
let claimWasCreated = false;
|
|
672
|
+
try {
|
|
673
|
+
await fsp.link(lockPath, stalePath);
|
|
674
|
+
claimWasCreated = true;
|
|
123
675
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
676
|
+
catch (claimErr) {
|
|
677
|
+
if (claimErr.code === 'ENOENT')
|
|
678
|
+
continue;
|
|
679
|
+
if (claimErr.code !== 'EEXIST')
|
|
680
|
+
throw claimErr;
|
|
127
681
|
}
|
|
128
|
-
|
|
682
|
+
if (await resumeStaleBreak(lockPath, stalePath, observed, claimWasCreated, minStaleAgeMs)) {
|
|
683
|
+
continue;
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
if (Date.now() - start > maxWaitMs) {
|
|
687
|
+
throw new Error(`file-lock timeout waiting for ${lockPath} ` +
|
|
688
|
+
`(held by pid ${holder?.pid || '?'}, age ${Math.round(lockAgeMs)}ms)`);
|
|
129
689
|
}
|
|
690
|
+
await new Promise(r => setTimeout(r, RETRY_BASE_MS + Math.random() * RETRY_BASE_MS));
|
|
130
691
|
}
|
|
131
692
|
}
|
|
132
693
|
export function withFileLockSync(targetPath, fn, opts = {}) {
|
|
@@ -134,69 +695,102 @@ export function withFileLockSync(targetPath, fn, opts = {}) {
|
|
|
134
695
|
const minStaleAgeMs = opts.minStaleAgeMs ?? MIN_STALE_AGE_MS;
|
|
135
696
|
const lockPath = targetPath + '.lock';
|
|
136
697
|
const start = Date.now();
|
|
698
|
+
const holderPayload = currentLockHolderPayload();
|
|
137
699
|
while (true) {
|
|
138
700
|
let fd = null;
|
|
139
701
|
try {
|
|
140
702
|
fd = openSync(lockPath, 'wx');
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
703
|
+
}
|
|
704
|
+
catch (error) {
|
|
705
|
+
if (error.code !== 'EEXIST')
|
|
706
|
+
throw error;
|
|
707
|
+
}
|
|
708
|
+
if (fd !== null) {
|
|
709
|
+
let owned;
|
|
710
|
+
try {
|
|
711
|
+
writeFileSync(fd, holderPayload);
|
|
712
|
+
owned = fstatSync(fd);
|
|
713
|
+
}
|
|
714
|
+
catch (writeError) {
|
|
715
|
+
try {
|
|
716
|
+
closeSync(fd);
|
|
717
|
+
}
|
|
718
|
+
catch { /* tolerate */ }
|
|
719
|
+
if (owned) {
|
|
720
|
+
try {
|
|
721
|
+
releaseOwnedLockSync(lockPath, owned);
|
|
722
|
+
}
|
|
723
|
+
catch { /* tolerate */ }
|
|
724
|
+
}
|
|
725
|
+
throw writeError;
|
|
726
|
+
}
|
|
144
727
|
try {
|
|
145
728
|
return fn();
|
|
146
729
|
}
|
|
147
730
|
finally {
|
|
148
731
|
try {
|
|
149
|
-
|
|
732
|
+
if (owned)
|
|
733
|
+
releaseOwnedLockSync(lockPath, owned);
|
|
150
734
|
}
|
|
151
|
-
catch { /*
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
catch (e) {
|
|
155
|
-
if (fd !== null) {
|
|
735
|
+
catch { /* tolerate */ }
|
|
156
736
|
try {
|
|
157
737
|
closeSync(fd);
|
|
158
738
|
}
|
|
159
739
|
catch { /* tolerate */ }
|
|
160
740
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
741
|
+
}
|
|
742
|
+
let holder;
|
|
743
|
+
let lockAgeMs = Infinity;
|
|
744
|
+
let observed;
|
|
745
|
+
try {
|
|
746
|
+
const observedFd = openSync(lockPath, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
165
747
|
try {
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
748
|
+
const before = fstatSync(observedFd);
|
|
749
|
+
const raw = readFileSync(observedFd, 'utf-8');
|
|
750
|
+
const after = fstatSync(observedFd);
|
|
751
|
+
if (!before.isFile() || !sameInode(before, after) || before.size !== after.size ||
|
|
752
|
+
before.mtimeMs !== after.mtimeMs || before.ctimeMs !== after.ctimeMs)
|
|
171
753
|
continue;
|
|
172
|
-
|
|
754
|
+
observed = after;
|
|
755
|
+
holder = parseLockHolder(raw);
|
|
756
|
+
lockAgeMs = Date.now() - after.mtimeMs;
|
|
173
757
|
}
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
758
|
+
finally {
|
|
759
|
+
closeSync(observedFd);
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
catch (re) {
|
|
763
|
+
if (re.code === 'ENOENT')
|
|
764
|
+
continue;
|
|
765
|
+
throw re;
|
|
766
|
+
}
|
|
767
|
+
const staleAge = holder
|
|
768
|
+
? minStaleAgeMs
|
|
769
|
+
: Math.max(minStaleAgeMs, MIN_INVALID_HOLDER_STALE_AGE_MS);
|
|
770
|
+
const breakable = lockAgeMs >= staleAge &&
|
|
771
|
+
(!holder || !isHolderAliveSync(holder));
|
|
772
|
+
if (breakable) {
|
|
773
|
+
const stalePath = staleClaimPathFor(lockPath, observed);
|
|
774
|
+
let claimWasCreated = false;
|
|
775
|
+
try {
|
|
776
|
+
linkSync(lockPath, stalePath);
|
|
777
|
+
claimWasCreated = true;
|
|
778
|
+
}
|
|
779
|
+
catch (claimErr) {
|
|
780
|
+
if (claimErr.code === 'ENOENT')
|
|
186
781
|
continue;
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
if (renameErr.code === 'ENOENT')
|
|
190
|
-
continue;
|
|
191
|
-
throw renameErr;
|
|
192
|
-
}
|
|
782
|
+
if (claimErr.code !== 'EEXIST')
|
|
783
|
+
throw claimErr;
|
|
193
784
|
}
|
|
194
|
-
if (
|
|
195
|
-
|
|
196
|
-
`(held by pid ${holder || '?'}, age ${Math.round(lockAgeMs)}ms)`);
|
|
785
|
+
if (resumeStaleBreakSync(lockPath, stalePath, observed, claimWasCreated, minStaleAgeMs)) {
|
|
786
|
+
continue;
|
|
197
787
|
}
|
|
198
|
-
sleepSync(RETRY_BASE_MS + Math.random() * RETRY_BASE_MS);
|
|
199
788
|
}
|
|
789
|
+
if (Date.now() - start > maxWaitMs) {
|
|
790
|
+
throw new Error(`file-lock timeout waiting for ${lockPath} ` +
|
|
791
|
+
`(held by pid ${holder?.pid || '?'}, age ${Math.round(lockAgeMs)}ms)`);
|
|
792
|
+
}
|
|
793
|
+
sleepSync(RETRY_BASE_MS + Math.random() * RETRY_BASE_MS);
|
|
200
794
|
}
|
|
201
795
|
}
|
|
202
796
|
//# sourceMappingURL=file-lock.js.map
|