botmux 2.46.1 → 2.47.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 +5 -10
- package/README.md +5 -10
- package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-backend.js +0 -11
- package/dist/adapters/backend/tmux-backend.js.map +1 -1
- package/dist/adapters/cli/claude-code.d.ts.map +1 -1
- package/dist/adapters/cli/claude-code.js +9 -36
- package/dist/adapters/cli/claude-code.js.map +1 -1
- package/dist/adapters/cli/coco.d.ts.map +1 -1
- package/dist/adapters/cli/coco.js +1 -26
- package/dist/adapters/cli/coco.js.map +1 -1
- package/dist/adapters/cli/codex.d.ts.map +1 -1
- package/dist/adapters/cli/codex.js +1 -6
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/adapters/cli/cursor.d.ts.map +1 -1
- package/dist/adapters/cli/cursor.js +12 -58
- package/dist/adapters/cli/cursor.js.map +1 -1
- package/dist/adapters/cli/gemini.d.ts.map +1 -1
- package/dist/adapters/cli/gemini.js +1 -5
- package/dist/adapters/cli/gemini.js.map +1 -1
- package/dist/adapters/cli/opencode.d.ts.map +1 -1
- package/dist/adapters/cli/opencode.js +1 -19
- package/dist/adapters/cli/opencode.js.map +1 -1
- package/dist/adapters/cli/registry.d.ts +1 -5
- package/dist/adapters/cli/registry.d.ts.map +1 -1
- package/dist/adapters/cli/registry.js +2 -22
- package/dist/adapters/cli/registry.js.map +1 -1
- 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 +1 -2
- package/dist/adapters/cli/shared-hints.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +2 -35
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/bot-registry.d.ts +0 -59
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +0 -67
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli/bots-list-output.d.ts +0 -8
- package/dist/cli/bots-list-output.d.ts.map +1 -1
- package/dist/cli/bots-list-output.js +0 -9
- package/dist/cli/bots-list-output.js.map +1 -1
- package/dist/cli.d.ts +1 -15
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +106 -603
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +2 -11
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +4 -17
- package/dist/config.js.map +1 -1
- package/dist/core/command-handler.d.ts +0 -20
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +313 -762
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts +0 -2
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +2 -222
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/role-resolver.d.ts +1 -17
- package/dist/core/role-resolver.d.ts.map +1 -1
- package/dist/core/role-resolver.js +10 -64
- package/dist/core/role-resolver.js.map +1 -1
- package/dist/core/session-discovery.d.ts.map +1 -1
- package/dist/core/session-discovery.js +5 -19
- package/dist/core/session-discovery.js.map +1 -1
- package/dist/core/session-manager.d.ts +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +20 -37
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/types.d.ts +0 -5
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-pool.d.ts +0 -141
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +24 -543
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +58 -213
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/auth.d.ts +1 -6
- package/dist/dashboard/auth.d.ts.map +1 -1
- package/dist/dashboard/auth.js +1 -9
- package/dist/dashboard/auth.js.map +1 -1
- package/dist/dashboard/web/app.js +0 -8
- package/dist/dashboard/web/app.js.map +1 -1
- package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults.js +21 -205
- package/dist/dashboard/web/bot-defaults.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +5 -43
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/sessions.d.ts.map +1 -1
- package/dist/dashboard/web/sessions.js +0 -4
- package/dist/dashboard/web/sessions.js.map +1 -1
- package/dist/dashboard/web/workflows.js +3 -3
- package/dist/dashboard/web/workflows.js.map +1 -1
- package/dist/dashboard/workflow-api.d.ts +1 -8
- package/dist/dashboard/workflow-api.d.ts.map +1 -1
- package/dist/dashboard/workflow-api.js +4 -19
- package/dist/dashboard/workflow-api.js.map +1 -1
- package/dist/dashboard-web/app.js +375 -539
- package/dist/dashboard-web/index.html +1 -3
- package/dist/dashboard-web/style.css +0 -22
- package/dist/dashboard.js +2 -199
- package/dist/dashboard.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +11 -104
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +11 -104
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts +3 -108
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +50 -480
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +18 -241
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts +0 -83
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +70 -286
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +4 -29
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/grant-command.d.ts +1 -2
- package/dist/im/lark/grant-command.d.ts.map +1 -1
- package/dist/im/lark/grant-command.js +2 -3
- package/dist/im/lark/grant-command.js.map +1 -1
- package/dist/im/lark/identity-cache.d.ts.map +1 -1
- package/dist/im/lark/identity-cache.js +3 -3
- package/dist/im/lark/identity-cache.js.map +1 -1
- package/dist/im/lark/md-card.d.ts +2 -20
- package/dist/im/lark/md-card.d.ts.map +1 -1
- package/dist/im/lark/md-card.js +17 -49
- package/dist/im/lark/md-card.js.map +1 -1
- package/dist/im/lark/message-parser.d.ts.map +1 -1
- package/dist/im/lark/message-parser.js +31 -87
- package/dist/im/lark/message-parser.js.map +1 -1
- package/dist/im/lark/workflow-card-handler.d.ts +2 -2
- package/dist/im/lark/workflow-card-handler.d.ts.map +1 -1
- package/dist/im/lark/workflow-card-handler.js +1 -12
- package/dist/im/lark/workflow-card-handler.js.map +1 -1
- package/dist/im/lark/workflow-progress-card.d.ts.map +1 -1
- package/dist/im/lark/workflow-progress-card.js +0 -53
- package/dist/im/lark/workflow-progress-card.js.map +1 -1
- package/dist/services/codex-bridge-queue.d.ts +0 -1
- package/dist/services/codex-bridge-queue.d.ts.map +1 -1
- package/dist/services/codex-bridge-queue.js +0 -23
- package/dist/services/codex-bridge-queue.js.map +1 -1
- package/dist/services/codex-transcript.d.ts +0 -1
- package/dist/services/codex-transcript.d.ts.map +1 -1
- package/dist/services/codex-transcript.js.map +1 -1
- package/dist/services/feishu-task-client.d.ts +28 -0
- package/dist/services/feishu-task-client.d.ts.map +1 -0
- package/dist/services/feishu-task-client.js +123 -0
- package/dist/services/feishu-task-client.js.map +1 -0
- package/dist/services/grant-store.d.ts +2 -12
- package/dist/services/grant-store.d.ts.map +1 -1
- package/dist/services/grant-store.js +4 -51
- package/dist/services/grant-store.js.map +1 -1
- package/dist/services/group-creator.d.ts +0 -10
- package/dist/services/group-creator.d.ts.map +1 -1
- package/dist/services/group-creator.js +1 -26
- package/dist/services/group-creator.js.map +1 -1
- package/dist/services/groups-store.d.ts +0 -30
- package/dist/services/groups-store.d.ts.map +1 -1
- package/dist/services/groups-store.js +12 -85
- package/dist/services/groups-store.js.map +1 -1
- package/dist/services/project-scanner.d.ts +0 -10
- package/dist/services/project-scanner.d.ts.map +1 -1
- package/dist/services/project-scanner.js +0 -11
- package/dist/services/project-scanner.js.map +1 -1
- package/dist/services/session-store.js +1 -1
- package/dist/services/session-store.js.map +1 -1
- package/dist/services/task-store.d.ts +37 -0
- package/dist/services/task-store.d.ts.map +1 -0
- package/dist/services/task-store.js +115 -0
- package/dist/services/task-store.js.map +1 -0
- package/dist/setup/bot-config-editor.d.ts +1 -8
- package/dist/setup/bot-config-editor.d.ts.map +1 -1
- package/dist/setup/bot-config-editor.js +2 -20
- package/dist/setup/bot-config-editor.js.map +1 -1
- package/dist/setup/ensure-tmux.d.ts +22 -0
- package/dist/setup/ensure-tmux.d.ts.map +1 -1
- package/dist/setup/ensure-tmux.js +1 -25
- package/dist/setup/ensure-tmux.js.map +1 -1
- package/dist/setup/verify-permissions.d.ts.map +1 -1
- package/dist/setup/verify-permissions.js +1 -15
- package/dist/setup/verify-permissions.js.map +1 -1
- package/dist/skills/definitions.d.ts +0 -2
- package/dist/skills/definitions.d.ts.map +1 -1
- package/dist/skills/definitions.js +12 -178
- package/dist/skills/definitions.js.map +1 -1
- package/dist/skills/installer.d.ts +0 -34
- package/dist/skills/installer.d.ts.map +1 -1
- package/dist/skills/installer.js +2 -119
- package/dist/skills/installer.js.map +1 -1
- package/dist/types.d.ts +0 -25
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/bot-routing.d.ts +0 -50
- package/dist/utils/bot-routing.d.ts.map +1 -1
- package/dist/utils/bot-routing.js +0 -83
- package/dist/utils/bot-routing.js.map +1 -1
- package/dist/utils/user-token.d.ts.map +1 -1
- package/dist/utils/user-token.js +2 -0
- package/dist/utils/user-token.js.map +1 -1
- package/dist/worker.js +27 -198
- package/dist/worker.js.map +1 -1
- package/dist/workflows/attempt-resume.d.ts.map +1 -1
- package/dist/workflows/attempt-resume.js +2 -2
- package/dist/workflows/attempt-resume.js.map +1 -1
- package/dist/workflows/definition.d.ts +9 -412
- package/dist/workflows/definition.d.ts.map +1 -1
- package/dist/workflows/definition.js +3 -238
- package/dist/workflows/definition.js.map +1 -1
- package/dist/workflows/events/payloads.d.ts +11 -114
- package/dist/workflows/events/payloads.d.ts.map +1 -1
- package/dist/workflows/events/payloads.js +0 -46
- package/dist/workflows/events/payloads.js.map +1 -1
- package/dist/workflows/events/replay.d.ts +0 -21
- package/dist/workflows/events/replay.d.ts.map +1 -1
- package/dist/workflows/events/replay.js +0 -103
- package/dist/workflows/events/replay.js.map +1 -1
- package/dist/workflows/events/schema.d.ts +1017 -1712
- package/dist/workflows/events/schema.d.ts.map +1 -1
- package/dist/workflows/events/schema.js +1 -37
- package/dist/workflows/events/schema.js.map +1 -1
- package/dist/workflows/events/types.d.ts +1 -5
- package/dist/workflows/events/types.d.ts.map +1 -1
- package/dist/workflows/loader.d.ts +0 -14
- package/dist/workflows/loader.d.ts.map +1 -1
- package/dist/workflows/loader.js +0 -27
- package/dist/workflows/loader.js.map +1 -1
- package/dist/workflows/loop.js +0 -58
- package/dist/workflows/loop.js.map +1 -1
- package/dist/workflows/ops-projection.d.ts +0 -58
- package/dist/workflows/ops-projection.d.ts.map +1 -1
- package/dist/workflows/ops-projection.js +0 -74
- package/dist/workflows/ops-projection.js.map +1 -1
- package/dist/workflows/orchestrator.d.ts +1 -65
- package/dist/workflows/orchestrator.d.ts.map +1 -1
- package/dist/workflows/orchestrator.js +74 -486
- package/dist/workflows/orchestrator.js.map +1 -1
- package/dist/workflows/output-binding.d.ts +1 -8
- package/dist/workflows/output-binding.d.ts.map +1 -1
- package/dist/workflows/output-binding.js +11 -75
- package/dist/workflows/output-binding.js.map +1 -1
- package/dist/workflows/runtime.d.ts +1 -1
- package/dist/workflows/runtime.d.ts.map +1 -1
- package/dist/workflows/runtime.js +4 -39
- package/dist/workflows/runtime.js.map +1 -1
- package/dist/workflows/wait.d.ts +2 -23
- package/dist/workflows/wait.d.ts.map +1 -1
- package/dist/workflows/wait.js +17 -39
- package/dist/workflows/wait.js.map +1 -1
- package/package.json +1 -1
- package/dist/adapters/adopt-route.d.ts +0 -63
- package/dist/adapters/adopt-route.d.ts.map +0 -1
- package/dist/adapters/adopt-route.js +0 -195
- package/dist/adapters/adopt-route.js.map +0 -1
- package/dist/adapters/cli/codex-app.d.ts +0 -4
- package/dist/adapters/cli/codex-app.d.ts.map +0 -1
- package/dist/adapters/cli/codex-app.js +0 -72
- package/dist/adapters/cli/codex-app.js.map +0 -1
- package/dist/adapters/cli/hermes.d.ts +0 -4
- package/dist/adapters/cli/hermes.d.ts.map +0 -1
- package/dist/adapters/cli/hermes.js +0 -40
- package/dist/adapters/cli/hermes.js.map +0 -1
- package/dist/adapters/cli/mira.d.ts +0 -4
- package/dist/adapters/cli/mira.d.ts.map +0 -1
- package/dist/adapters/cli/mira.js +0 -67
- package/dist/adapters/cli/mira.js.map +0 -1
- package/dist/adapters/cli/mtr.d.ts +0 -5
- package/dist/adapters/cli/mtr.d.ts.map +0 -1
- package/dist/adapters/cli/mtr.js +0 -62
- package/dist/adapters/cli/mtr.js.map +0 -1
- package/dist/adapters/hook-command.d.ts +0 -18
- package/dist/adapters/hook-command.d.ts.map +0 -1
- package/dist/adapters/hook-command.js +0 -38
- package/dist/adapters/hook-command.js.map +0 -1
- package/dist/adapters/hook-installer.d.ts +0 -14
- package/dist/adapters/hook-installer.d.ts.map +0 -1
- package/dist/adapters/hook-installer.js +0 -192
- package/dist/adapters/hook-installer.js.map +0 -1
- package/dist/codex-app-runner.d.ts +0 -3
- package/dist/codex-app-runner.d.ts.map +0 -1
- package/dist/codex-app-runner.js +0 -512
- package/dist/codex-app-runner.js.map +0 -1
- package/dist/core/ask-api.d.ts +0 -47
- package/dist/core/ask-api.d.ts.map +0 -1
- package/dist/core/ask-api.js +0 -139
- package/dist/core/ask-api.js.map +0 -1
- package/dist/core/ask-args.d.ts +0 -53
- package/dist/core/ask-args.d.ts.map +0 -1
- package/dist/core/ask-args.js +0 -122
- package/dist/core/ask-args.js.map +0 -1
- package/dist/core/ask-broker.d.ts +0 -98
- package/dist/core/ask-broker.d.ts.map +0 -1
- package/dist/core/ask-broker.js +0 -329
- package/dist/core/ask-broker.js.map +0 -1
- package/dist/core/ask-hook/claude-code.d.ts +0 -50
- package/dist/core/ask-hook/claude-code.d.ts.map +0 -1
- package/dist/core/ask-hook/claude-code.js +0 -145
- package/dist/core/ask-hook/claude-code.js.map +0 -1
- package/dist/core/ask-hook/codex.d.ts +0 -43
- package/dist/core/ask-hook/codex.d.ts.map +0 -1
- package/dist/core/ask-hook/codex.js +0 -69
- package/dist/core/ask-hook/codex.js.map +0 -1
- package/dist/core/ask-hook/opencode.d.ts +0 -41
- package/dist/core/ask-hook/opencode.d.ts.map +0 -1
- package/dist/core/ask-hook/opencode.js +0 -108
- package/dist/core/ask-hook/opencode.js.map +0 -1
- package/dist/core/ask-hook/registry.d.ts +0 -3
- package/dist/core/ask-hook/registry.d.ts.map +0 -1
- package/dist/core/ask-hook/registry.js +0 -12
- package/dist/core/ask-hook/registry.js.map +0 -1
- package/dist/core/ask-hook/types.d.ts +0 -26
- package/dist/core/ask-hook/types.d.ts.map +0 -1
- package/dist/core/ask-hook/types.js +0 -2
- package/dist/core/ask-hook/types.js.map +0 -1
- package/dist/core/ask-types.d.ts +0 -146
- package/dist/core/ask-types.d.ts.map +0 -1
- package/dist/core/ask-types.js +0 -18
- package/dist/core/ask-types.js.map +0 -1
- package/dist/core/trigger-session.d.ts +0 -9
- package/dist/core/trigger-session.d.ts.map +0 -1
- package/dist/core/trigger-session.js +0 -158
- package/dist/core/trigger-session.js.map +0 -1
- package/dist/dashboard/connector-api.d.ts +0 -3
- package/dist/dashboard/connector-api.d.ts.map +0 -1
- package/dist/dashboard/connector-api.js +0 -351
- package/dist/dashboard/connector-api.js.map +0 -1
- package/dist/dashboard/federated-group-core.d.ts +0 -54
- package/dist/dashboard/federated-group-core.d.ts.map +0 -1
- package/dist/dashboard/federated-group-core.js +0 -165
- package/dist/dashboard/federated-group-core.js.map +0 -1
- package/dist/dashboard/federation-api.d.ts +0 -42
- package/dist/dashboard/federation-api.d.ts.map +0 -1
- package/dist/dashboard/federation-api.js +0 -408
- package/dist/dashboard/federation-api.js.map +0 -1
- package/dist/dashboard/federation-spoke-api.d.ts +0 -76
- package/dist/dashboard/federation-spoke-api.d.ts.map +0 -1
- package/dist/dashboard/federation-spoke-api.js +0 -618
- package/dist/dashboard/federation-spoke-api.js.map +0 -1
- package/dist/dashboard/team-group.d.ts +0 -18
- package/dist/dashboard/team-group.d.ts.map +0 -1
- package/dist/dashboard/team-group.js +0 -7
- package/dist/dashboard/team-group.js.map +0 -1
- package/dist/dashboard/trigger-api.d.ts +0 -13
- package/dist/dashboard/trigger-api.d.ts.map +0 -1
- package/dist/dashboard/trigger-api.js +0 -77
- package/dist/dashboard/trigger-api.js.map +0 -1
- package/dist/dashboard/web/connectors.d.ts +0 -2
- package/dist/dashboard/web/connectors.d.ts.map +0 -1
- package/dist/dashboard/web/connectors.js +0 -187
- package/dist/dashboard/web/connectors.js.map +0 -1
- package/dist/dashboard/web/team-federation.d.ts +0 -3
- package/dist/dashboard/web/team-federation.d.ts.map +0 -1
- package/dist/dashboard/web/team-federation.js +0 -487
- package/dist/dashboard/web/team-federation.js.map +0 -1
- package/dist/dashboard/webhook-routes.d.ts +0 -19
- package/dist/dashboard/webhook-routes.d.ts.map +0 -1
- package/dist/dashboard/webhook-routes.js +0 -321
- package/dist/dashboard/webhook-routes.js.map +0 -1
- package/dist/im/lark/ask-card.d.ts +0 -55
- package/dist/im/lark/ask-card.d.ts.map +0 -1
- package/dist/im/lark/ask-card.js +0 -328
- package/dist/im/lark/ask-card.js.map +0 -1
- package/dist/mira-output.d.ts +0 -3
- package/dist/mira-output.d.ts.map +0 -1
- package/dist/mira-output.js +0 -136
- package/dist/mira-output.js.map +0 -1
- package/dist/mira-runner.d.ts +0 -3
- package/dist/mira-runner.d.ts.map +0 -1
- package/dist/mira-runner.js +0 -534
- package/dist/mira-runner.js.map +0 -1
- package/dist/services/bot-owner-store.d.ts +0 -28
- package/dist/services/bot-owner-store.d.ts.map +0 -1
- package/dist/services/bot-owner-store.js +0 -82
- package/dist/services/bot-owner-store.js.map +0 -1
- package/dist/services/bot-profile-store.d.ts +0 -16
- package/dist/services/bot-profile-store.d.ts.map +0 -1
- package/dist/services/bot-profile-store.js +0 -98
- package/dist/services/bot-profile-store.js.map +0 -1
- package/dist/services/brand-store.d.ts +0 -15
- package/dist/services/brand-store.d.ts.map +0 -1
- package/dist/services/brand-store.js +0 -47
- package/dist/services/brand-store.js.map +0 -1
- package/dist/services/card-prefs-store.d.ts +0 -20
- package/dist/services/card-prefs-store.d.ts.map +0 -1
- package/dist/services/card-prefs-store.js +0 -82
- package/dist/services/card-prefs-store.js.map +0 -1
- package/dist/services/connector-store.d.ts +0 -58
- package/dist/services/connector-store.d.ts.map +0 -1
- package/dist/services/connector-store.js +0 -79
- package/dist/services/connector-store.js.map +0 -1
- package/dist/services/deployment-identity.d.ts +0 -22
- package/dist/services/deployment-identity.d.ts.map +0 -1
- package/dist/services/deployment-identity.js +0 -67
- package/dist/services/deployment-identity.js.map +0 -1
- package/dist/services/federation-membership-store.d.ts +0 -23
- package/dist/services/federation-membership-store.d.ts.map +0 -1
- package/dist/services/federation-membership-store.js +0 -66
- package/dist/services/federation-membership-store.js.map +0 -1
- package/dist/services/federation-roster.d.ts +0 -54
- package/dist/services/federation-roster.d.ts.map +0 -1
- package/dist/services/federation-roster.js +0 -51
- package/dist/services/federation-roster.js.map +0 -1
- package/dist/services/federation-store.d.ts +0 -76
- package/dist/services/federation-store.d.ts.map +0 -1
- package/dist/services/federation-store.js +0 -133
- package/dist/services/federation-store.js.map +0 -1
- package/dist/services/hermes-transcript.d.ts +0 -7
- package/dist/services/hermes-transcript.d.ts.map +0 -1
- package/dist/services/hermes-transcript.js +0 -117
- package/dist/services/hermes-transcript.js.map +0 -1
- package/dist/services/invite-store.d.ts +0 -28
- package/dist/services/invite-store.d.ts.map +0 -1
- package/dist/services/invite-store.js +0 -85
- package/dist/services/invite-store.js.map +0 -1
- package/dist/services/pairing-store.d.ts +0 -47
- package/dist/services/pairing-store.d.ts.map +0 -1
- package/dist/services/pairing-store.js +0 -132
- package/dist/services/pairing-store.js.map +0 -1
- package/dist/services/relay-picker.d.ts +0 -22
- package/dist/services/relay-picker.d.ts.map +0 -1
- package/dist/services/relay-picker.js +0 -62
- package/dist/services/relay-picker.js.map +0 -1
- package/dist/services/send-policy.d.ts +0 -55
- package/dist/services/send-policy.d.ts.map +0 -1
- package/dist/services/send-policy.js +0 -47
- package/dist/services/send-policy.js.map +0 -1
- package/dist/services/team-roster.d.ts +0 -38
- package/dist/services/team-roster.d.ts.map +0 -1
- package/dist/services/team-roster.js +0 -82
- package/dist/services/team-roster.js.map +0 -1
- package/dist/services/team-store.d.ts +0 -54
- package/dist/services/team-store.d.ts.map +0 -1
- package/dist/services/team-store.js +0 -156
- package/dist/services/team-store.js.map +0 -1
- package/dist/services/trigger-log-store.d.ts +0 -46
- package/dist/services/trigger-log-store.d.ts.map +0 -1
- package/dist/services/trigger-log-store.js +0 -132
- package/dist/services/trigger-log-store.js.map +0 -1
- package/dist/services/trigger-types.d.ts +0 -57
- package/dist/services/trigger-types.d.ts.map +0 -1
- package/dist/services/trigger-types.js +0 -28
- package/dist/services/trigger-types.js.map +0 -1
- package/dist/services/webhook-key.d.ts +0 -16
- package/dist/services/webhook-key.d.ts.map +0 -1
- package/dist/services/webhook-key.js +0 -123
- package/dist/services/webhook-key.js.map +0 -1
- package/dist/services/webhook-lifecycle-extractors.d.ts +0 -15
- package/dist/services/webhook-lifecycle-extractors.d.ts.map +0 -1
- package/dist/services/webhook-lifecycle-extractors.js +0 -59
- package/dist/services/webhook-lifecycle-extractors.js.map +0 -1
- package/dist/services/webhook-lifecycle-store.d.ts +0 -45
- package/dist/services/webhook-lifecycle-store.d.ts.map +0 -1
- package/dist/services/webhook-lifecycle-store.js +0 -159
- package/dist/services/webhook-lifecycle-store.js.map +0 -1
- package/dist/utils/daemon-discovery.d.ts +0 -11
- package/dist/utils/daemon-discovery.d.ts.map +0 -1
- package/dist/utils/daemon-discovery.js +0 -59
- package/dist/utils/daemon-discovery.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 -67
- package/dist/workflows/trigger-from-envelope.js.map +0 -1
|
@@ -21,16 +21,6 @@
|
|
|
21
21
|
*
|
|
22
22
|
* One node may own at most one gate (before-gate) and one work
|
|
23
23
|
* activity in v0. After-gates and re-runs are deferred.
|
|
24
|
-
*
|
|
25
|
-
* v0.2 loop body activities are scoped by a `loop::<loopId>.<N>` segment:
|
|
26
|
-
*
|
|
27
|
-
* loop work activity: `<runId>::loop::<loopId>.<N>::work::<bodyNodeId>`
|
|
28
|
-
* loop gate activity: `<runId>::loop::<loopId>.<N>::gate::<bodyNodeId>`
|
|
29
|
-
*
|
|
30
|
-
* `<N>` is the 1-indexed iteration; `<loopId>` is the loop block's
|
|
31
|
-
* nodeId. All segments stay within `SEGMENT_RE` (allows
|
|
32
|
-
* `[A-Za-z0-9._:-]`), so existing `isValidPathSegment` / attempt-
|
|
33
|
-
* sidecar path guards continue to apply without modification.
|
|
34
24
|
* ────────────────────────────────────────────────────────────────────
|
|
35
25
|
*/
|
|
36
26
|
import { topologicalOrder, } from './definition.js';
|
|
@@ -41,58 +31,6 @@ export function gateActivityId(runId, nodeId) {
|
|
|
41
31
|
export function workActivityId(runId, nodeId) {
|
|
42
32
|
return `${runId}::work::${nodeId}`;
|
|
43
33
|
}
|
|
44
|
-
// ─── Loop iteration activity IDs (v0.2) ───────────────────────────────────
|
|
45
|
-
//
|
|
46
|
-
// See /tmp/wf-loop-v02.md §4.2 and the top-of-file ASCII spec.
|
|
47
|
-
//
|
|
48
|
-
// Iteration `N` is 1-indexed. We refuse to encode `N < 1` so callers
|
|
49
|
-
// never accidentally emit `loop::foo.0` ids (the iteration counter is a
|
|
50
|
-
// real loop-state position, not a placeholder).
|
|
51
|
-
export function loopWorkActivityId(runId, loopId, iteration, bodyNodeId) {
|
|
52
|
-
if (!Number.isInteger(iteration) || iteration < 1) {
|
|
53
|
-
throw new Error(`loopWorkActivityId: iteration must be a positive integer (got ${iteration})`);
|
|
54
|
-
}
|
|
55
|
-
return `${runId}::loop::${loopId}.${iteration}::work::${bodyNodeId}`;
|
|
56
|
-
}
|
|
57
|
-
export function loopGateActivityId(runId, loopId, iteration, bodyNodeId) {
|
|
58
|
-
if (!Number.isInteger(iteration) || iteration < 1) {
|
|
59
|
-
throw new Error(`loopGateActivityId: iteration must be a positive integer (got ${iteration})`);
|
|
60
|
-
}
|
|
61
|
-
return `${runId}::loop::${loopId}.${iteration}::gate::${bodyNodeId}`;
|
|
62
|
-
}
|
|
63
|
-
const PLAIN_RE = /^([^:]+(?:::?[^:]+)*?)::(work|gate)::([A-Za-z0-9_.-]+)$/;
|
|
64
|
-
const LOOP_RE = /^(.+)::loop::([A-Za-z0-9_.-]+)\.(\d+)::(work|gate)::([A-Za-z0-9_.-]+)$/;
|
|
65
|
-
export function parseActivityId(s) {
|
|
66
|
-
// Loop form first — the `::loop::` segment is unambiguous and would
|
|
67
|
-
// also accidentally satisfy a greedy plain match if we tried plain
|
|
68
|
-
// first (`runId` would absorb `::loop::<id>.<N>::work`).
|
|
69
|
-
const loopMatch = LOOP_RE.exec(s);
|
|
70
|
-
if (loopMatch) {
|
|
71
|
-
const [, runId, loopId, iterStr, activityKind, nodeId] = loopMatch;
|
|
72
|
-
const iteration = Number(iterStr);
|
|
73
|
-
if (!Number.isFinite(iteration) || iteration < 1)
|
|
74
|
-
return undefined;
|
|
75
|
-
return {
|
|
76
|
-
kind: 'loop',
|
|
77
|
-
runId,
|
|
78
|
-
loopId,
|
|
79
|
-
iteration,
|
|
80
|
-
activityKind: activityKind,
|
|
81
|
-
nodeId,
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
const plainMatch = PLAIN_RE.exec(s);
|
|
85
|
-
if (plainMatch) {
|
|
86
|
-
const [, runId, activityKind, nodeId] = plainMatch;
|
|
87
|
-
return {
|
|
88
|
-
kind: 'plain',
|
|
89
|
-
runId,
|
|
90
|
-
activityKind: activityKind,
|
|
91
|
-
nodeId,
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
return undefined;
|
|
95
|
-
}
|
|
96
34
|
// ─── Decision function ───────────────────────────────────────────────────
|
|
97
35
|
/**
|
|
98
36
|
* Pure decision function. Read-only — never throws on graph cycles
|
|
@@ -126,309 +64,110 @@ export function decideNextActions(snapshot, def) {
|
|
|
126
64
|
const actions = [];
|
|
127
65
|
const runId = snapshot.run.runId;
|
|
128
66
|
const order = topologicalOrder(def);
|
|
129
|
-
// v0.2: compute loop body membership once so the top-level scheduler
|
|
130
|
-
// skips body nodes (they're dispatched by the loop branch only).
|
|
131
|
-
const bodyOwner = buildBodyOwnerMap(def);
|
|
132
67
|
let failedNodeId;
|
|
133
68
|
let pendingCount = 0;
|
|
134
|
-
// ─── Loop lifecycle + body dispatch pass (v0.2) ──────────────────────
|
|
135
|
-
//
|
|
136
|
-
// For each loop block in topo order, this pass owns:
|
|
137
|
-
// 1. emitting `startLoop` when the loop's `depends` first go green
|
|
138
|
-
// 2. emitting `startLoopIteration` to open each iteration
|
|
139
|
-
// 3. dispatching body activities under loop-iteration activityIds
|
|
140
|
-
// 4. emitting `finishLoopIteration` once the terminator decision
|
|
141
|
-
// attempt settles (approve or reject)
|
|
142
|
-
// 5. emitting `finishLoop` once iteration loop closes (approved /
|
|
143
|
-
// max-iterations-exceeded / non-terminator body failure / decision
|
|
144
|
-
// humanGate timeout)
|
|
145
|
-
//
|
|
146
|
-
// Per codex round 3: lifecycle actions are returned as the SOLE action
|
|
147
|
-
// of the tick so event ordering — `loopStarted` → `loopIterationStarted`
|
|
148
|
-
// → body attempts — is deterministic and never interleaves with body
|
|
149
|
-
// dispatches. Body dispatches batch up only when no lifecycle action
|
|
150
|
-
// fires this tick.
|
|
151
69
|
for (const nodeId of order) {
|
|
152
70
|
const node = def.nodes[nodeId];
|
|
153
|
-
|
|
71
|
+
const nstatus = snapshot.nodes.get(nodeId)?.status ?? 'idle';
|
|
72
|
+
// Already settled at the node level — nothing for us to advance.
|
|
73
|
+
if (nstatus === 'succeeded' || nstatus === 'skipped' || nstatus === 'cancelled') {
|
|
154
74
|
continue;
|
|
155
|
-
const loopId = nodeId;
|
|
156
|
-
const loopState = snapshot.loops.get(loopId);
|
|
157
|
-
const depsOk = (node.depends ?? []).every((dep) => snapshot.nodes.get(dep)?.status === 'succeeded');
|
|
158
|
-
// (1) Loop not yet entered.
|
|
159
|
-
if (!loopState) {
|
|
160
|
-
if (!depsOk) {
|
|
161
|
-
pendingCount++;
|
|
162
|
-
continue;
|
|
163
|
-
}
|
|
164
|
-
return [{ kind: 'startLoop', loopId, maxIterations: node.maxIterations }];
|
|
165
75
|
}
|
|
166
|
-
|
|
167
|
-
|
|
76
|
+
if (nstatus === 'failed') {
|
|
77
|
+
failedNodeId = failedNodeId ?? nodeId;
|
|
168
78
|
continue;
|
|
169
|
-
// (2) Loop started but no iteration opened yet.
|
|
170
|
-
if (loopState.iteration === 0) {
|
|
171
|
-
return [
|
|
172
|
-
{ kind: 'startLoopIteration', loopId, iteration: 1, prevResolution: 'initial' },
|
|
173
|
-
];
|
|
174
79
|
}
|
|
175
|
-
//
|
|
176
|
-
const
|
|
177
|
-
|
|
178
|
-
if (!iterState) {
|
|
80
|
+
// Dependencies gate dispatch.
|
|
81
|
+
const depsOk = (node.depends ?? []).every((dep) => snapshot.nodes.get(dep)?.status === 'succeeded');
|
|
82
|
+
if (!depsOk) {
|
|
179
83
|
pendingCount++;
|
|
180
|
-
continue;
|
|
181
|
-
}
|
|
182
|
-
// (4) Current iteration already has a settled resolution:
|
|
183
|
-
if (iterState.status === 'approved') {
|
|
184
|
-
const outputRef = computeLoopOutputRef(snapshot, runId, node, loopId, currentIter);
|
|
185
|
-
return [
|
|
186
|
-
{
|
|
187
|
-
kind: 'finishLoop',
|
|
188
|
-
loopId,
|
|
189
|
-
finalIteration: currentIter,
|
|
190
|
-
resolution: 'approved',
|
|
191
|
-
outputRef,
|
|
192
|
-
},
|
|
193
|
-
];
|
|
194
|
-
}
|
|
195
|
-
if (iterState.status === 'rejected') {
|
|
196
|
-
if (currentIter < loopState.maxIterations) {
|
|
197
|
-
return [
|
|
198
|
-
{
|
|
199
|
-
kind: 'startLoopIteration',
|
|
200
|
-
loopId,
|
|
201
|
-
iteration: currentIter + 1,
|
|
202
|
-
prevResolution: 'rejected',
|
|
203
|
-
},
|
|
204
|
-
];
|
|
205
|
-
}
|
|
206
|
-
return [
|
|
207
|
-
{
|
|
208
|
-
kind: 'finishLoop',
|
|
209
|
-
loopId,
|
|
210
|
-
finalIteration: currentIter,
|
|
211
|
-
resolution: 'max-iterations-exceeded',
|
|
212
|
-
errorCode: 'LoopMaxIterationsExceeded',
|
|
213
|
-
errorClass: 'userFault',
|
|
214
|
-
},
|
|
215
|
-
];
|
|
216
|
-
}
|
|
217
|
-
if (iterState.status === 'failed' || iterState.status === 'cancelled') {
|
|
218
|
-
// Non-terminator failure already finalized this iteration; close
|
|
219
|
-
// the loop block with `body-failed` resolution (codex Step 3
|
|
220
|
-
// review Medium). `cancelled` is reserved for user-initiated
|
|
221
|
-
// cancel; `body-failed` distinguishes "this loop died because a
|
|
222
|
-
// body node failed" from "user clicked cancel".
|
|
223
|
-
return [
|
|
224
|
-
{
|
|
225
|
-
kind: 'finishLoop',
|
|
226
|
-
loopId,
|
|
227
|
-
finalIteration: currentIter,
|
|
228
|
-
resolution: 'body-failed',
|
|
229
|
-
errorCode: 'LoopBodyFailed',
|
|
230
|
-
errorClass: 'fatal',
|
|
231
|
-
},
|
|
232
|
-
];
|
|
84
|
+
continue;
|
|
233
85
|
}
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
// Intra-body dep check: all body-side deps must have a succeeded
|
|
247
|
-
// activity in *this* iteration; loop-external deps were guaranteed
|
|
248
|
-
// already by the loop block's own `depends` gate.
|
|
249
|
-
const intraDepsOk = (bodyNode.depends ?? [])
|
|
250
|
-
.filter((d) => bodySet.has(d))
|
|
251
|
-
.every((d) => bodyDone.get(d) === true);
|
|
252
|
-
if (!intraDepsOk) {
|
|
86
|
+
const gateActId = gateActivityId(runId, nodeId);
|
|
87
|
+
const workActId = workActivityId(runId, nodeId);
|
|
88
|
+
const gateAct = snapshot.activities.get(gateActId);
|
|
89
|
+
const workAct = snapshot.activities.get(workActId);
|
|
90
|
+
if (node.humanGate) {
|
|
91
|
+
if (!gateAct) {
|
|
92
|
+
actions.push({
|
|
93
|
+
kind: 'dispatchGate',
|
|
94
|
+
nodeId,
|
|
95
|
+
activityId: gateActId,
|
|
96
|
+
humanGate: node.humanGate,
|
|
97
|
+
});
|
|
253
98
|
pendingCount++;
|
|
254
99
|
continue;
|
|
255
100
|
}
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
// Terminator settled — read its wait resolution out of the
|
|
264
|
-
// activity attempt, then return `finishLoopIteration` as the
|
|
265
|
-
// sole action this tick so the iteration advances cleanly.
|
|
266
|
-
const decisionAct = snapshot.activities.get(bodyGateActId);
|
|
267
|
-
const lastAt = decisionAct?.attempts[decisionAct.attempts.length - 1];
|
|
268
|
-
const wait = lastAt?.wait?.resolution;
|
|
269
|
-
if (wait &&
|
|
270
|
-
wait.kind === 'resolved' &&
|
|
271
|
-
(wait.resolution === 'approved' || wait.resolution === 'rejected')) {
|
|
272
|
-
return [
|
|
273
|
-
{
|
|
274
|
-
kind: 'finishLoopIteration',
|
|
275
|
-
loopId,
|
|
276
|
-
iteration: currentIter,
|
|
277
|
-
resolution: wait.resolution,
|
|
278
|
-
decisionActivityId: bodyGateActId,
|
|
279
|
-
waitResolvedEventId: wait.eventId,
|
|
280
|
-
by: wait.by,
|
|
281
|
-
comment: wait.comment,
|
|
282
|
-
},
|
|
283
|
-
];
|
|
284
|
-
}
|
|
285
|
-
if (wait && wait.kind === 'deadlineExceeded') {
|
|
286
|
-
return [
|
|
287
|
-
{
|
|
288
|
-
kind: 'finishLoopIteration',
|
|
289
|
-
loopId,
|
|
290
|
-
iteration: currentIter,
|
|
291
|
-
resolution: 'rejected',
|
|
292
|
-
decisionActivityId: bodyGateActId,
|
|
293
|
-
waitResolvedEventId: wait.eventId,
|
|
294
|
-
by: 'system',
|
|
295
|
-
timedOut: true,
|
|
296
|
-
},
|
|
297
|
-
];
|
|
298
|
-
}
|
|
299
|
-
// Decision attempt succeeded but no resolution found — defer.
|
|
300
|
-
pendingCount++;
|
|
301
|
-
}
|
|
101
|
+
if (gateAct.status === 'failed') {
|
|
102
|
+
actions.push({
|
|
103
|
+
kind: 'completeNodeFailed',
|
|
104
|
+
nodeId,
|
|
105
|
+
lastActivityId: gateActId,
|
|
106
|
+
errorClass: 'userFault',
|
|
107
|
+
});
|
|
302
108
|
continue;
|
|
303
109
|
}
|
|
304
|
-
if (
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
// Medium — schema invariant requires this errorCode pairing).
|
|
309
|
-
bodyFailureFinish = {
|
|
310
|
-
kind: 'finishLoop',
|
|
311
|
-
loopId,
|
|
312
|
-
finalIteration: currentIter,
|
|
313
|
-
resolution: 'timeout',
|
|
314
|
-
errorCode: 'WaitDeadlineExceeded',
|
|
315
|
-
errorClass: 'userFault',
|
|
316
|
-
};
|
|
317
|
-
}
|
|
318
|
-
else {
|
|
319
|
-
// Non-terminator body node failed (subagent crash / hostExecutor
|
|
320
|
-
// error / non-terminator humanGate.reject = fail-run per
|
|
321
|
-
// /tmp/wf-loop-v02.md §10.8) → close as `body-failed`.
|
|
322
|
-
bodyFailureFinish = {
|
|
323
|
-
kind: 'finishLoop',
|
|
324
|
-
loopId,
|
|
325
|
-
finalIteration: currentIter,
|
|
326
|
-
resolution: 'body-failed',
|
|
327
|
-
errorCode: 'LoopBodyFailed',
|
|
328
|
-
errorClass: 'fatal',
|
|
329
|
-
};
|
|
330
|
-
}
|
|
331
|
-
break; // stop iterating body; we'll close the loop instead
|
|
110
|
+
if (gateAct.status !== 'succeeded') {
|
|
111
|
+
// gate in-flight (acquired / running / waiting) — wait.
|
|
112
|
+
pendingCount++;
|
|
113
|
+
continue;
|
|
332
114
|
}
|
|
333
|
-
//
|
|
334
|
-
iterDispatch.push(...advance.actions);
|
|
335
|
-
pendingCount += advance.actions.length === 0 ? 1 : 0;
|
|
336
|
-
}
|
|
337
|
-
if (bodyFailureFinish) {
|
|
338
|
-
return [bodyFailureFinish];
|
|
339
|
-
}
|
|
340
|
-
// Body dispatches accumulate into the outer `actions` array; the
|
|
341
|
-
// legacy plain-node pass below will also push into it, so a single
|
|
342
|
-
// tick can dispatch multiple body nodes + plain nodes together.
|
|
343
|
-
// Lifecycle actions never reach this branch (they early-return
|
|
344
|
-
// above).
|
|
345
|
-
for (const a of iterDispatch)
|
|
346
|
-
actions.push(a);
|
|
347
|
-
}
|
|
348
|
-
// ─── Loop terminal propagation ────────────────────────────────────────
|
|
349
|
-
//
|
|
350
|
-
// After the loop branch may have emitted `finishLoop`, the next tick
|
|
351
|
-
// sees `loopState.status` settled but the legacy node-level state
|
|
352
|
-
// machine doesn't know about it. Propagate failed / cancelled loop
|
|
353
|
-
// blocks into `failedNodeId` so the actions.length===0 sweep below
|
|
354
|
-
// can emit `completeRunFailed`. Succeeded loop blocks expose their
|
|
355
|
-
// projected output via `outputs[workActivityId(runId, loopId)]` and
|
|
356
|
-
// are handled naturally by the sink sweep.
|
|
357
|
-
for (const [loopId, loopState] of snapshot.loops) {
|
|
358
|
-
if (loopState.status === 'failed' || loopState.status === 'cancelled') {
|
|
359
|
-
failedNodeId = failedNodeId ?? loopId;
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
// ─── Plain (non-loop, non-body) node pass ────────────────────────────
|
|
363
|
-
//
|
|
364
|
-
// Same logic as v0.1: dispatch gate → dispatch work → settle node.
|
|
365
|
-
// Skips loop blocks (already handled) + decision nodes (only valid in
|
|
366
|
-
// loop body) + body nodes (dispatched only by the loop branch above).
|
|
367
|
-
for (const nodeId of order) {
|
|
368
|
-
const node = def.nodes[nodeId];
|
|
369
|
-
if (node.type === 'loop')
|
|
370
|
-
continue;
|
|
371
|
-
if (node.type === 'decision')
|
|
372
|
-
continue; // validateLoopBlocks guarantees in-body
|
|
373
|
-
if (bodyOwner.has(nodeId))
|
|
374
|
-
continue; // dispatched by loop branch
|
|
375
|
-
const nstatus = snapshot.nodes.get(nodeId)?.status ?? 'idle';
|
|
376
|
-
if (nstatus === 'succeeded' || nstatus === 'skipped' || nstatus === 'cancelled') {
|
|
377
|
-
continue;
|
|
378
|
-
}
|
|
379
|
-
if (nstatus === 'failed') {
|
|
380
|
-
failedNodeId = failedNodeId ?? nodeId;
|
|
381
|
-
continue;
|
|
115
|
+
// gate cleared → fall through to work dispatch / advancement
|
|
382
116
|
}
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
return snapshot.loops.get(dep)?.status === 'succeeded';
|
|
391
|
-
}
|
|
392
|
-
return snapshot.nodes.get(dep)?.status === 'succeeded';
|
|
393
|
-
});
|
|
394
|
-
if (!depsOk) {
|
|
117
|
+
if (!workAct) {
|
|
118
|
+
actions.push({
|
|
119
|
+
kind: 'dispatchWork',
|
|
120
|
+
nodeId,
|
|
121
|
+
activityId: workActId,
|
|
122
|
+
node,
|
|
123
|
+
});
|
|
395
124
|
pendingCount++;
|
|
396
125
|
continue;
|
|
397
126
|
}
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
127
|
+
if (workAct.status === 'succeeded') {
|
|
128
|
+
const output = snapshot.outputs.get(workActId);
|
|
129
|
+
if (output) {
|
|
130
|
+
actions.push({
|
|
131
|
+
kind: 'completeNodeSucceeded',
|
|
132
|
+
nodeId,
|
|
133
|
+
lastActivityId: workActId,
|
|
134
|
+
outputRef: output,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
pendingCount++;
|
|
139
|
+
}
|
|
404
140
|
continue;
|
|
405
141
|
}
|
|
406
|
-
if (
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
//
|
|
410
|
-
//
|
|
411
|
-
|
|
142
|
+
if (workAct.status === 'failed' || workAct.status === 'timedOut') {
|
|
143
|
+
// activityTimedOut payload pins errorClass='retryable' (spec §2.1),
|
|
144
|
+
// but replay doesn't propagate it onto the attempt's `error` field —
|
|
145
|
+
// it only records `runningMs`. Special-case here so the orchestrator
|
|
146
|
+
// doesn't silently upgrade the class to fatal via `deriveErrorClass`.
|
|
147
|
+
const errorClass = workAct.status === 'timedOut' ? 'retryable' : deriveErrorClass(workAct);
|
|
148
|
+
actions.push({
|
|
149
|
+
kind: 'completeNodeFailed',
|
|
150
|
+
nodeId,
|
|
151
|
+
lastActivityId: workActId,
|
|
152
|
+
errorClass,
|
|
153
|
+
});
|
|
412
154
|
continue;
|
|
413
155
|
}
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
if (advance.actions.length === 0)
|
|
417
|
-
pendingCount++;
|
|
156
|
+
// running / waiting / acquired / effectAttempting — pending.
|
|
157
|
+
pendingCount++;
|
|
418
158
|
}
|
|
419
159
|
if (actions.length === 0) {
|
|
420
160
|
if (failedNodeId) {
|
|
161
|
+
// Fail-fast: a node terminal-failed. Any pending downstream nodes
|
|
162
|
+
// are stuck on the failed dep and will never advance; in-flight
|
|
163
|
+
// peer nodes are caller's problem to cancel-fanout if they want.
|
|
421
164
|
actions.push({ kind: 'completeRunFailed', failedNodeId });
|
|
422
165
|
}
|
|
423
166
|
else if (pendingCount === 0) {
|
|
424
167
|
const sinks = findSinks(def);
|
|
425
168
|
if (sinks.length === 1) {
|
|
426
169
|
const sinkId = sinks[0];
|
|
427
|
-
const
|
|
428
|
-
const sinkActId = workActivityId(runId, sinkId);
|
|
429
|
-
const sinkOutput = sinkNode?.type === 'loop'
|
|
430
|
-
? snapshot.outputs.get(sinkActId) // loopFinished projection (codex Step 2)
|
|
431
|
-
: snapshot.outputs.get(sinkActId);
|
|
170
|
+
const sinkOutput = snapshot.outputs.get(workActivityId(runId, sinkId));
|
|
432
171
|
if (sinkOutput) {
|
|
433
172
|
actions.push({
|
|
434
173
|
kind: 'completeRunSucceeded',
|
|
@@ -437,173 +176,22 @@ export function decideNextActions(snapshot, def) {
|
|
|
437
176
|
});
|
|
438
177
|
}
|
|
439
178
|
}
|
|
179
|
+
// Multi-sink: caller composes the run output (out of v0 scope).
|
|
440
180
|
}
|
|
441
181
|
}
|
|
442
182
|
return actions;
|
|
443
183
|
}
|
|
444
|
-
/**
|
|
445
|
-
* Per-node advancement decision used by both the top-level scheduler
|
|
446
|
-
* (plain nodes) and the v0.2 loop branch (body / decision nodes). The
|
|
447
|
-
* caller supplies the gate and work activityIds so the same logic
|
|
448
|
-
* applies to plain `runId::work::node` ids and loop iteration
|
|
449
|
-
* `runId::loop::loopId.N::work::node` ids without leaking the
|
|
450
|
-
* activityId convention into this helper.
|
|
451
|
-
*
|
|
452
|
-
* Returns the actions the caller should emit plus a small status
|
|
453
|
-
* triplet — exactly one of `isSucceeded` / `isFailed` is true when
|
|
454
|
-
* the node has reached its terminal; otherwise the call is "pending"
|
|
455
|
-
* (in-flight) and the returned actions are dispatch instructions for
|
|
456
|
-
* gate/work that haven't yet been emitted.
|
|
457
|
-
*/
|
|
458
|
-
function decideNodeAdvancement(snapshot, node, nodeId, gateActId, workActId) {
|
|
459
|
-
const actions = [];
|
|
460
|
-
// Decision node: gate-only. Both reject and approve resolve to
|
|
461
|
-
// `activitySucceeded` per wait.ts decision-mode (see N2 in
|
|
462
|
-
// /tmp/wf-loop-v02.md §4.3); only humanGate timeout produces a
|
|
463
|
-
// failed activity.
|
|
464
|
-
if (node.type === 'decision') {
|
|
465
|
-
const gateAct = snapshot.activities.get(gateActId);
|
|
466
|
-
if (!gateAct) {
|
|
467
|
-
actions.push({
|
|
468
|
-
kind: 'dispatchGate',
|
|
469
|
-
nodeId,
|
|
470
|
-
activityId: gateActId,
|
|
471
|
-
humanGate: node.humanGate,
|
|
472
|
-
});
|
|
473
|
-
return { actions, isSucceeded: false, isFailed: false };
|
|
474
|
-
}
|
|
475
|
-
if (gateAct.status === 'succeeded') {
|
|
476
|
-
return { actions, isSucceeded: true, isFailed: false };
|
|
477
|
-
}
|
|
478
|
-
if (gateAct.status === 'failed' || gateAct.status === 'timedOut') {
|
|
479
|
-
return { actions, isSucceeded: false, isFailed: true };
|
|
480
|
-
}
|
|
481
|
-
return { actions, isSucceeded: false, isFailed: false };
|
|
482
|
-
}
|
|
483
|
-
// Loop blocks are not handled by this helper.
|
|
484
|
-
if (node.type === 'loop') {
|
|
485
|
-
return { actions, isSucceeded: false, isFailed: false };
|
|
486
|
-
}
|
|
487
|
-
const gateAct = snapshot.activities.get(gateActId);
|
|
488
|
-
const workAct = snapshot.activities.get(workActId);
|
|
489
|
-
if (node.humanGate) {
|
|
490
|
-
if (!gateAct) {
|
|
491
|
-
actions.push({
|
|
492
|
-
kind: 'dispatchGate',
|
|
493
|
-
nodeId,
|
|
494
|
-
activityId: gateActId,
|
|
495
|
-
humanGate: node.humanGate,
|
|
496
|
-
});
|
|
497
|
-
return { actions, isSucceeded: false, isFailed: false };
|
|
498
|
-
}
|
|
499
|
-
if (gateAct.status === 'failed' || gateAct.status === 'timedOut') {
|
|
500
|
-
actions.push({
|
|
501
|
-
kind: 'completeNodeFailed',
|
|
502
|
-
nodeId,
|
|
503
|
-
lastActivityId: gateActId,
|
|
504
|
-
errorClass: 'userFault',
|
|
505
|
-
});
|
|
506
|
-
return { actions, isSucceeded: false, isFailed: true };
|
|
507
|
-
}
|
|
508
|
-
if (gateAct.status !== 'succeeded') {
|
|
509
|
-
// gate in-flight — caller treats this as pending
|
|
510
|
-
return { actions, isSucceeded: false, isFailed: false };
|
|
511
|
-
}
|
|
512
|
-
// gate cleared → fall through to work
|
|
513
|
-
}
|
|
514
|
-
if (!workAct) {
|
|
515
|
-
actions.push({
|
|
516
|
-
kind: 'dispatchWork',
|
|
517
|
-
nodeId,
|
|
518
|
-
activityId: workActId,
|
|
519
|
-
node,
|
|
520
|
-
});
|
|
521
|
-
return { actions, isSucceeded: false, isFailed: false };
|
|
522
|
-
}
|
|
523
|
-
if (workAct.status === 'succeeded') {
|
|
524
|
-
const output = snapshot.outputs.get(workActId);
|
|
525
|
-
if (output) {
|
|
526
|
-
actions.push({
|
|
527
|
-
kind: 'completeNodeSucceeded',
|
|
528
|
-
nodeId,
|
|
529
|
-
lastActivityId: workActId,
|
|
530
|
-
outputRef: output,
|
|
531
|
-
});
|
|
532
|
-
return { actions, isSucceeded: true, isFailed: false };
|
|
533
|
-
}
|
|
534
|
-
return { actions, isSucceeded: false, isFailed: false };
|
|
535
|
-
}
|
|
536
|
-
if (workAct.status === 'failed' || workAct.status === 'timedOut') {
|
|
537
|
-
const errorClass = workAct.status === 'timedOut' ? 'retryable' : deriveErrorClass(workAct);
|
|
538
|
-
actions.push({
|
|
539
|
-
kind: 'completeNodeFailed',
|
|
540
|
-
nodeId,
|
|
541
|
-
lastActivityId: workActId,
|
|
542
|
-
errorClass,
|
|
543
|
-
});
|
|
544
|
-
return { actions, isSucceeded: false, isFailed: true };
|
|
545
|
-
}
|
|
546
|
-
// running / waiting / acquired / effectAttempting — pending.
|
|
547
|
-
return { actions, isSucceeded: false, isFailed: false };
|
|
548
|
-
}
|
|
549
|
-
/**
|
|
550
|
-
* Build `bodyNodeId → owningLoopId` map for fast carve-out lookups.
|
|
551
|
-
* Mirrors `validateLoopBlocks`'s body collection but built every tick
|
|
552
|
-
* because the orchestrator is a pure function and doesn't carry state.
|
|
553
|
-
*/
|
|
554
|
-
function buildBodyOwnerMap(def) {
|
|
555
|
-
const owner = new Map();
|
|
556
|
-
for (const [id, node] of Object.entries(def.nodes)) {
|
|
557
|
-
if (node.type !== 'loop')
|
|
558
|
-
continue;
|
|
559
|
-
for (const bodyId of node.body)
|
|
560
|
-
owner.set(bodyId, id);
|
|
561
|
-
}
|
|
562
|
-
return owner;
|
|
563
|
-
}
|
|
564
|
-
/**
|
|
565
|
-
* Filter a workflow-level topological order down to body nodes only,
|
|
566
|
-
* preserving the global order. Used to dispatch body nodes inside an
|
|
567
|
-
* active loop iteration in deterministic order.
|
|
568
|
-
*/
|
|
569
|
-
function orderForBody(allOrder, bodySet) {
|
|
570
|
-
return allOrder.filter((id) => bodySet.has(id));
|
|
571
|
-
}
|
|
572
|
-
/**
|
|
573
|
-
* Resolve `loop.output.from` to the OutputRef of the body node's
|
|
574
|
-
* latest successful iteration so `finishLoop` can carry it forward.
|
|
575
|
-
* Returns `undefined` if the loop did not declare `output.from`, or if
|
|
576
|
-
* the body node hasn't produced a succeeded output in `iteration` yet
|
|
577
|
-
* (which shouldn't happen if the terminator already approved — but
|
|
578
|
-
* defensive against partial replay state).
|
|
579
|
-
*/
|
|
580
|
-
function computeLoopOutputRef(snapshot, runId, loopNode, loopId, iteration) {
|
|
581
|
-
const from = loopNode.output?.from;
|
|
582
|
-
if (!from)
|
|
583
|
-
return undefined;
|
|
584
|
-
const bodyWorkActId = loopWorkActivityId(runId, loopId, iteration, from);
|
|
585
|
-
return snapshot.outputs.get(bodyWorkActId);
|
|
586
|
-
}
|
|
587
184
|
// ─── Helpers ─────────────────────────────────────────────────────────────
|
|
588
185
|
function deriveErrorClass(activity) {
|
|
589
186
|
const last = activity.attempts[activity.attempts.length - 1];
|
|
590
187
|
return last?.error?.errorClass ?? 'fatal';
|
|
591
188
|
}
|
|
592
189
|
function findSinks(def) {
|
|
593
|
-
const bodyOwner = buildBodyOwnerMap(def);
|
|
594
|
-
// Only consider top-level (non-body) nodes when computing sinks. Body
|
|
595
|
-
// nodes are dispatched by their owning loop block; the outside view of
|
|
596
|
-
// a loop is "the loop block itself produces output" so body nodes must
|
|
597
|
-
// never count as workflow-level sinks even if no peer depends on them
|
|
598
|
-
// directly. (`reviewDecision` is the canonical example — nothing
|
|
599
|
-
// outside the loop depends on it, but it's structurally internal.)
|
|
600
190
|
const referenced = new Set();
|
|
601
|
-
for (const
|
|
602
|
-
if (bodyOwner.has(id))
|
|
603
|
-
continue;
|
|
191
|
+
for (const node of Object.values(def.nodes)) {
|
|
604
192
|
for (const dep of node.depends ?? [])
|
|
605
193
|
referenced.add(dep);
|
|
606
194
|
}
|
|
607
|
-
return Object.keys(def.nodes).filter((id) => !
|
|
195
|
+
return Object.keys(def.nodes).filter((id) => !referenced.has(id));
|
|
608
196
|
}
|
|
609
197
|
//# sourceMappingURL=orchestrator.js.map
|