maestro-flow 0.3.0 → 0.3.2
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/.claude/commands/maestro-overlay.md +178 -122
- package/.claude/commands/manage-harvest.md +4 -4
- package/.codex/skills/maestro-coordinate/SKILL.md +3 -4
- package/dist/src/commands/launcher.js +1 -1
- package/dist/src/commands/launcher.js.map +1 -1
- package/dist/src/commands/overlay-ui/OverlayList.d.ts +35 -0
- package/dist/src/commands/overlay-ui/OverlayList.d.ts.map +1 -0
- package/dist/src/commands/overlay-ui/OverlayList.js +143 -0
- package/dist/src/commands/overlay-ui/OverlayList.js.map +1 -0
- package/dist/src/commands/overlay-ui/index.d.ts +2 -0
- package/dist/src/commands/overlay-ui/index.d.ts.map +1 -0
- package/dist/src/commands/overlay-ui/index.js +188 -0
- package/dist/src/commands/overlay-ui/index.js.map +1 -0
- package/dist/src/commands/overlay.d.ts.map +1 -1
- package/dist/src/commands/overlay.js +79 -59
- package/dist/src/commands/overlay.js.map +1 -1
- package/dist/src/core/overlay/applier.d.ts +32 -1
- package/dist/src/core/overlay/applier.d.ts.map +1 -1
- package/dist/src/core/overlay/applier.js +109 -1
- package/dist/src/core/overlay/applier.js.map +1 -1
- package/package.json +1 -1
- package/dist/agents/cli-agent-runner.d.ts +0 -131
- package/dist/agents/cli-agent-runner.d.ts.map +0 -1
- package/dist/agents/cli-agent-runner.js +0 -688
- package/dist/agents/cli-agent-runner.js.map +0 -1
- package/dist/agents/cli-history-store.d.ts +0 -63
- package/dist/agents/cli-history-store.d.ts.map +0 -1
- package/dist/agents/cli-history-store.js +0 -242
- package/dist/agents/cli-history-store.js.map +0 -1
- package/dist/agents/dashboard-bridge.d.ts +0 -39
- package/dist/agents/dashboard-bridge.d.ts.map +0 -1
- package/dist/agents/dashboard-bridge.js +0 -76
- package/dist/agents/dashboard-bridge.js.map +0 -1
- package/dist/agents/parallel-cli-runner.d.ts +0 -46
- package/dist/agents/parallel-cli-runner.d.ts.map +0 -1
- package/dist/agents/parallel-cli-runner.js +0 -277
- package/dist/agents/parallel-cli-runner.js.map +0 -1
- package/dist/agents/terminal-adapter.d.ts +0 -94
- package/dist/agents/terminal-adapter.d.ts.map +0 -1
- package/dist/agents/terminal-adapter.js +0 -132
- package/dist/agents/terminal-adapter.js.map +0 -1
- package/dist/agents/terminal-backend.d.ts +0 -53
- package/dist/agents/terminal-backend.d.ts.map +0 -1
- package/dist/agents/terminal-backend.js +0 -286
- package/dist/agents/terminal-backend.js.map +0 -1
- package/dist/async/delegate-broker-client.d.ts +0 -22
- package/dist/async/delegate-broker-client.d.ts.map +0 -1
- package/dist/async/delegate-broker-client.js +0 -47
- package/dist/async/delegate-broker-client.js.map +0 -1
- package/dist/async/delegate-broker.d.ts +0 -180
- package/dist/async/delegate-broker.d.ts.map +0 -1
- package/dist/async/delegate-broker.js +0 -1040
- package/dist/async/delegate-broker.js.map +0 -1
- package/dist/async/delegate-control.d.ts +0 -37
- package/dist/async/delegate-control.d.ts.map +0 -1
- package/dist/async/delegate-control.js +0 -155
- package/dist/async/delegate-control.js.map +0 -1
- package/dist/async/index.d.ts +0 -3
- package/dist/async/index.d.ts.map +0 -1
- package/dist/async/index.js +0 -3
- package/dist/async/index.js.map +0 -1
- package/dist/cli.d.ts +0 -2
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -40
- package/dist/cli.js.map +0 -1
- package/dist/commands/cli.d.ts +0 -3
- package/dist/commands/cli.d.ts.map +0 -1
- package/dist/commands/cli.js +0 -262
- package/dist/commands/cli.js.map +0 -1
- package/dist/commands/coordinate.d.ts +0 -3
- package/dist/commands/coordinate.d.ts.map +0 -1
- package/dist/commands/coordinate.js +0 -275
- package/dist/commands/coordinate.js.map +0 -1
- package/dist/commands/delegate.d.ts +0 -37
- package/dist/commands/delegate.d.ts.map +0 -1
- package/dist/commands/delegate.js +0 -470
- package/dist/commands/delegate.js.map +0 -1
- package/dist/commands/ext.d.ts +0 -3
- package/dist/commands/ext.d.ts.map +0 -1
- package/dist/commands/ext.js +0 -28
- package/dist/commands/ext.js.map +0 -1
- package/dist/commands/hooks.d.ts +0 -3
- package/dist/commands/hooks.d.ts.map +0 -1
- package/dist/commands/hooks.js +0 -126
- package/dist/commands/hooks.js.map +0 -1
- package/dist/commands/install.d.ts +0 -3
- package/dist/commands/install.d.ts.map +0 -1
- package/dist/commands/install.js +0 -621
- package/dist/commands/install.js.map +0 -1
- package/dist/commands/launcher.d.ts +0 -3
- package/dist/commands/launcher.d.ts.map +0 -1
- package/dist/commands/launcher.js +0 -635
- package/dist/commands/launcher.js.map +0 -1
- package/dist/commands/link-coordinate.d.ts +0 -3
- package/dist/commands/link-coordinate.d.ts.map +0 -1
- package/dist/commands/link-coordinate.js +0 -225
- package/dist/commands/link-coordinate.js.map +0 -1
- package/dist/commands/msg.d.ts +0 -3
- package/dist/commands/msg.d.ts.map +0 -1
- package/dist/commands/msg.js +0 -110
- package/dist/commands/msg.js.map +0 -1
- package/dist/commands/overlay.d.ts +0 -3
- package/dist/commands/overlay.d.ts.map +0 -1
- package/dist/commands/overlay.js +0 -243
- package/dist/commands/overlay.js.map +0 -1
- package/dist/commands/run.d.ts +0 -3
- package/dist/commands/run.d.ts.map +0 -1
- package/dist/commands/run.js +0 -15
- package/dist/commands/run.js.map +0 -1
- package/dist/commands/serve.d.ts +0 -3
- package/dist/commands/serve.d.ts.map +0 -1
- package/dist/commands/serve.js +0 -16
- package/dist/commands/serve.js.map +0 -1
- package/dist/commands/spec.d.ts +0 -8
- package/dist/commands/spec.d.ts.map +0 -1
- package/dist/commands/spec.js +0 -147
- package/dist/commands/spec.js.map +0 -1
- package/dist/commands/stop.d.ts +0 -3
- package/dist/commands/stop.d.ts.map +0 -1
- package/dist/commands/stop.js +0 -218
- package/dist/commands/stop.js.map +0 -1
- package/dist/commands/tool.d.ts +0 -3
- package/dist/commands/tool.d.ts.map +0 -1
- package/dist/commands/tool.js +0 -29
- package/dist/commands/tool.js.map +0 -1
- package/dist/commands/uninstall.d.ts +0 -3
- package/dist/commands/uninstall.d.ts.map +0 -1
- package/dist/commands/uninstall.js +0 -77
- package/dist/commands/uninstall.js.map +0 -1
- package/dist/commands/view.d.ts +0 -3
- package/dist/commands/view.d.ts.map +0 -1
- package/dist/commands/view.js +0 -337
- package/dist/commands/view.js.map +0 -1
- package/dist/config/cli-tools-config.d.ts +0 -26
- package/dist/config/cli-tools-config.d.ts.map +0 -1
- package/dist/config/cli-tools-config.js +0 -49
- package/dist/config/cli-tools-config.js.map +0 -1
- package/dist/config/cli-tools-config.test.d.ts +0 -2
- package/dist/config/cli-tools-config.test.d.ts.map +0 -1
- package/dist/config/cli-tools-config.test.js +0 -59
- package/dist/config/cli-tools-config.test.js.map +0 -1
- package/dist/config/index.d.ts +0 -4
- package/dist/config/index.d.ts.map +0 -1
- package/dist/config/index.js +0 -27
- package/dist/config/index.js.map +0 -1
- package/dist/config/paths.d.ts +0 -15
- package/dist/config/paths.d.ts.map +0 -1
- package/dist/config/paths.js +0 -27
- package/dist/config/paths.js.map +0 -1
- package/dist/config/template-discovery.d.ts +0 -32
- package/dist/config/template-discovery.d.ts.map +0 -1
- package/dist/config/template-discovery.js +0 -128
- package/dist/config/template-discovery.js.map +0 -1
- package/dist/coordinator/cli-executor.d.ts +0 -22
- package/dist/coordinator/cli-executor.d.ts.map +0 -1
- package/dist/coordinator/cli-executor.js +0 -49
- package/dist/coordinator/cli-executor.js.map +0 -1
- package/dist/coordinator/expr-evaluator.d.ts +0 -11
- package/dist/coordinator/expr-evaluator.d.ts.map +0 -1
- package/dist/coordinator/expr-evaluator.js +0 -351
- package/dist/coordinator/expr-evaluator.js.map +0 -1
- package/dist/coordinator/graph-loader.d.ts +0 -16
- package/dist/coordinator/graph-loader.d.ts.map +0 -1
- package/dist/coordinator/graph-loader.js +0 -190
- package/dist/coordinator/graph-loader.js.map +0 -1
- package/dist/coordinator/graph-types.d.ts +0 -304
- package/dist/coordinator/graph-types.d.ts.map +0 -1
- package/dist/coordinator/graph-types.js +0 -6
- package/dist/coordinator/graph-types.js.map +0 -1
- package/dist/coordinator/graph-walker.d.ts +0 -51
- package/dist/coordinator/graph-walker.d.ts.map +0 -1
- package/dist/coordinator/graph-walker.js +0 -666
- package/dist/coordinator/graph-walker.js.map +0 -1
- package/dist/coordinator/index.d.ts +0 -13
- package/dist/coordinator/index.d.ts.map +0 -1
- package/dist/coordinator/index.js +0 -14
- package/dist/coordinator/index.js.map +0 -1
- package/dist/coordinator/intent-router.d.ts +0 -11
- package/dist/coordinator/intent-router.d.ts.map +0 -1
- package/dist/coordinator/intent-router.js +0 -65
- package/dist/coordinator/intent-router.js.map +0 -1
- package/dist/coordinator/link-session.d.ts +0 -29
- package/dist/coordinator/link-session.d.ts.map +0 -1
- package/dist/coordinator/link-session.js +0 -192
- package/dist/coordinator/link-session.js.map +0 -1
- package/dist/coordinator/link-walker.d.ts +0 -56
- package/dist/coordinator/link-walker.d.ts.map +0 -1
- package/dist/coordinator/link-walker.js +0 -548
- package/dist/coordinator/link-walker.js.map +0 -1
- package/dist/coordinator/output-parser.d.ts +0 -5
- package/dist/coordinator/output-parser.d.ts.map +0 -1
- package/dist/coordinator/output-parser.js +0 -114
- package/dist/coordinator/output-parser.js.map +0 -1
- package/dist/coordinator/parallel-executor.d.ts +0 -24
- package/dist/coordinator/parallel-executor.d.ts.map +0 -1
- package/dist/coordinator/parallel-executor.js +0 -43
- package/dist/coordinator/parallel-executor.js.map +0 -1
- package/dist/coordinator/prompt-assembler.d.ts +0 -15
- package/dist/coordinator/prompt-assembler.d.ts.map +0 -1
- package/dist/coordinator/prompt-assembler.js +0 -228
- package/dist/coordinator/prompt-assembler.js.map +0 -1
- package/dist/coordinator/step-analyzer.d.ts +0 -8
- package/dist/coordinator/step-analyzer.d.ts.map +0 -1
- package/dist/coordinator/step-analyzer.js +0 -82
- package/dist/coordinator/step-analyzer.js.map +0 -1
- package/dist/core/extension-loader.d.ts +0 -11
- package/dist/core/extension-loader.d.ts.map +0 -1
- package/dist/core/extension-loader.js +0 -54
- package/dist/core/extension-loader.js.map +0 -1
- package/dist/core/manifest.d.ts +0 -24
- package/dist/core/manifest.d.ts.map +0 -1
- package/dist/core/manifest.js +0 -139
- package/dist/core/manifest.js.map +0 -1
- package/dist/core/mcp-tool-registry.integration.test.d.ts +0 -2
- package/dist/core/mcp-tool-registry.integration.test.d.ts.map +0 -1
- package/dist/core/mcp-tool-registry.integration.test.js +0 -220
- package/dist/core/mcp-tool-registry.integration.test.js.map +0 -1
- package/dist/core/overlay/applier.d.ts +0 -73
- package/dist/core/overlay/applier.d.ts.map +0 -1
- package/dist/core/overlay/applier.js +0 -248
- package/dist/core/overlay/applier.js.map +0 -1
- package/dist/core/overlay/loader.d.ts +0 -26
- package/dist/core/overlay/loader.d.ts.map +0 -1
- package/dist/core/overlay/loader.js +0 -199
- package/dist/core/overlay/loader.js.map +0 -1
- package/dist/core/overlay/patcher.d.ts +0 -26
- package/dist/core/overlay/patcher.d.ts.map +0 -1
- package/dist/core/overlay/patcher.js +0 -212
- package/dist/core/overlay/patcher.js.map +0 -1
- package/dist/core/overlay/section-parser.d.ts +0 -25
- package/dist/core/overlay/section-parser.d.ts.map +0 -1
- package/dist/core/overlay/section-parser.js +0 -99
- package/dist/core/overlay/section-parser.js.map +0 -1
- package/dist/core/overlay/types.d.ts +0 -51
- package/dist/core/overlay/types.d.ts.map +0 -1
- package/dist/core/overlay/types.js +0 -15
- package/dist/core/overlay/types.js.map +0 -1
- package/dist/core/tool-registry.d.ts +0 -10
- package/dist/core/tool-registry.d.ts.map +0 -1
- package/dist/core/tool-registry.js +0 -29
- package/dist/core/tool-registry.js.map +0 -1
- package/dist/core/tool-registry.test.d.ts +0 -2
- package/dist/core/tool-registry.test.d.ts.map +0 -1
- package/dist/core/tool-registry.test.js +0 -78
- package/dist/core/tool-registry.test.js.map +0 -1
- package/dist/db/connection-pool.d.ts +0 -21
- package/dist/db/connection-pool.d.ts.map +0 -1
- package/dist/db/connection-pool.js +0 -53
- package/dist/db/connection-pool.js.map +0 -1
- package/dist/db/index.d.ts +0 -6
- package/dist/db/index.d.ts.map +0 -1
- package/dist/db/index.js +0 -9
- package/dist/db/index.js.map +0 -1
- package/dist/db/schema/core/index.d.ts +0 -5
- package/dist/db/schema/core/index.d.ts.map +0 -1
- package/dist/db/schema/core/index.js +0 -5
- package/dist/db/schema/core/index.js.map +0 -1
- package/dist/db/schema/core/organizations.d.ts +0 -244
- package/dist/db/schema/core/organizations.d.ts.map +0 -1
- package/dist/db/schema/core/organizations.js +0 -44
- package/dist/db/schema/core/organizations.js.map +0 -1
- package/dist/db/schema/core/permissions.d.ts +0 -158
- package/dist/db/schema/core/permissions.d.ts.map +0 -1
- package/dist/db/schema/core/permissions.js +0 -62
- package/dist/db/schema/core/permissions.js.map +0 -1
- package/dist/db/schema/core/refresh-tokens.d.ts +0 -147
- package/dist/db/schema/core/refresh-tokens.d.ts.map +0 -1
- package/dist/db/schema/core/refresh-tokens.js +0 -22
- package/dist/db/schema/core/refresh-tokens.js.map +0 -1
- package/dist/db/schema/core/users.d.ts +0 -178
- package/dist/db/schema/core/users.d.ts.map +0 -1
- package/dist/db/schema/core/users.js +0 -14
- package/dist/db/schema/core/users.js.map +0 -1
- package/dist/db/tenant-migrator.d.ts +0 -11
- package/dist/db/tenant-migrator.d.ts.map +0 -1
- package/dist/db/tenant-migrator.js +0 -74
- package/dist/db/tenant-migrator.js.map +0 -1
- package/dist/db/tenant-schema.d.ts +0 -290
- package/dist/db/tenant-schema.d.ts.map +0 -1
- package/dist/db/tenant-schema.js +0 -32
- package/dist/db/tenant-schema.js.map +0 -1
- package/dist/hooks/constants.d.ts +0 -40
- package/dist/hooks/constants.d.ts.map +0 -1
- package/dist/hooks/constants.js +0 -53
- package/dist/hooks/constants.js.map +0 -1
- package/dist/hooks/context-monitor.d.ts +0 -33
- package/dist/hooks/context-monitor.d.ts.map +0 -1
- package/dist/hooks/context-monitor.js +0 -117
- package/dist/hooks/context-monitor.js.map +0 -1
- package/dist/hooks/delegate-monitor.d.ts +0 -24
- package/dist/hooks/delegate-monitor.d.ts.map +0 -1
- package/dist/hooks/delegate-monitor.js +0 -76
- package/dist/hooks/delegate-monitor.js.map +0 -1
- package/dist/hooks/index.d.ts +0 -4
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/hooks/index.js +0 -4
- package/dist/hooks/index.js.map +0 -1
- package/dist/hooks/statusline.d.ts +0 -29
- package/dist/hooks/statusline.d.ts.map +0 -1
- package/dist/hooks/statusline.js +0 -134
- package/dist/hooks/statusline.js.map +0 -1
- package/dist/index.d.ts +0 -8
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -6
- package/dist/index.js.map +0 -1
- package/dist/mcp/delegate-channel-relay.d.ts +0 -51
- package/dist/mcp/delegate-channel-relay.d.ts.map +0 -1
- package/dist/mcp/delegate-channel-relay.js +0 -307
- package/dist/mcp/delegate-channel-relay.js.map +0 -1
- package/dist/mcp/server.d.ts +0 -6
- package/dist/mcp/server.d.ts.map +0 -1
- package/dist/mcp/server.js +0 -64
- package/dist/mcp/server.js.map +0 -1
- package/dist/middleware/auth.d.ts +0 -13
- package/dist/middleware/auth.d.ts.map +0 -1
- package/dist/middleware/auth.js +0 -27
- package/dist/middleware/auth.js.map +0 -1
- package/dist/middleware/permission.d.ts +0 -9
- package/dist/middleware/permission.d.ts.map +0 -1
- package/dist/middleware/permission.js +0 -19
- package/dist/middleware/permission.js.map +0 -1
- package/dist/middleware/rate-limit.d.ts +0 -9
- package/dist/middleware/rate-limit.d.ts.map +0 -1
- package/dist/middleware/rate-limit.js +0 -40
- package/dist/middleware/rate-limit.js.map +0 -1
- package/dist/middleware/tenant.d.ts +0 -17
- package/dist/middleware/tenant.d.ts.map +0 -1
- package/dist/middleware/tenant.js +0 -57
- package/dist/middleware/tenant.js.map +0 -1
- package/dist/middleware/validation.d.ts +0 -40
- package/dist/middleware/validation.d.ts.map +0 -1
- package/dist/middleware/validation.js +0 -51
- package/dist/middleware/validation.js.map +0 -1
- package/dist/routes/auth.d.ts +0 -3
- package/dist/routes/auth.d.ts.map +0 -1
- package/dist/routes/auth.js +0 -77
- package/dist/routes/auth.js.map +0 -1
- package/dist/routes/members.d.ts +0 -4
- package/dist/routes/members.d.ts.map +0 -1
- package/dist/routes/members.js +0 -114
- package/dist/routes/members.js.map +0 -1
- package/dist/routes/organizations.d.ts +0 -5
- package/dist/routes/organizations.d.ts.map +0 -1
- package/dist/routes/organizations.js +0 -97
- package/dist/routes/organizations.js.map +0 -1
- package/dist/services/auth.service.d.ts +0 -24
- package/dist/services/auth.service.d.ts.map +0 -1
- package/dist/services/auth.service.js +0 -70
- package/dist/services/auth.service.js.map +0 -1
- package/dist/services/password.service.d.ts +0 -3
- package/dist/services/password.service.d.ts.map +0 -1
- package/dist/services/password.service.js +0 -18
- package/dist/services/password.service.js.map +0 -1
- package/dist/services/rbac.service.d.ts +0 -7
- package/dist/services/rbac.service.d.ts.map +0 -1
- package/dist/services/rbac.service.js +0 -36
- package/dist/services/rbac.service.js.map +0 -1
- package/dist/services/token.service.d.ts +0 -18
- package/dist/services/token.service.d.ts.map +0 -1
- package/dist/services/token.service.js +0 -86
- package/dist/services/token.service.js.map +0 -1
- package/dist/tools/core-memory.d.ts +0 -12
- package/dist/tools/core-memory.d.ts.map +0 -1
- package/dist/tools/core-memory.js +0 -276
- package/dist/tools/core-memory.js.map +0 -1
- package/dist/tools/edit-file.d.ts +0 -25
- package/dist/tools/edit-file.d.ts.map +0 -1
- package/dist/tools/edit-file.js +0 -462
- package/dist/tools/edit-file.js.map +0 -1
- package/dist/tools/index.d.ts +0 -8
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/index.js +0 -536
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/read-file.d.ts +0 -13
- package/dist/tools/read-file.d.ts.map +0 -1
- package/dist/tools/read-file.js +0 -91
- package/dist/tools/read-file.js.map +0 -1
- package/dist/tools/read-many-files.d.ts +0 -15
- package/dist/tools/read-many-files.d.ts.map +0 -1
- package/dist/tools/read-many-files.js +0 -187
- package/dist/tools/read-many-files.js.map +0 -1
- package/dist/tools/spec-index-builder.d.ts +0 -58
- package/dist/tools/spec-index-builder.d.ts.map +0 -1
- package/dist/tools/spec-index-builder.js +0 -211
- package/dist/tools/spec-index-builder.js.map +0 -1
- package/dist/tools/spec-init.d.ts +0 -17
- package/dist/tools/spec-init.d.ts.map +0 -1
- package/dist/tools/spec-init.js +0 -215
- package/dist/tools/spec-init.js.map +0 -1
- package/dist/tools/spec-keyword-extractor.d.ts +0 -24
- package/dist/tools/spec-keyword-extractor.d.ts.map +0 -1
- package/dist/tools/spec-keyword-extractor.js +0 -84
- package/dist/tools/spec-keyword-extractor.js.map +0 -1
- package/dist/tools/spec-keyword-extractor.test.d.ts +0 -2
- package/dist/tools/spec-keyword-extractor.test.d.ts.map +0 -1
- package/dist/tools/spec-keyword-extractor.test.js +0 -99
- package/dist/tools/spec-keyword-extractor.test.js.map +0 -1
- package/dist/tools/spec-loader.d.ts +0 -15
- package/dist/tools/spec-loader.d.ts.map +0 -1
- package/dist/tools/spec-loader.js +0 -93
- package/dist/tools/spec-loader.js.map +0 -1
- package/dist/tools/team-msg.d.ts +0 -52
- package/dist/tools/team-msg.d.ts.map +0 -1
- package/dist/tools/team-msg.js +0 -449
- package/dist/tools/team-msg.js.map +0 -1
- package/dist/tools/write-file.d.ts +0 -19
- package/dist/tools/write-file.d.ts.map +0 -1
- package/dist/tools/write-file.js +0 -165
- package/dist/tools/write-file.js.map +0 -1
- package/dist/types/index.d.ts +0 -47
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -2
- package/dist/types/index.js.map +0 -1
- package/dist/types/tool-schema.d.ts +0 -37
- package/dist/types/tool-schema.d.ts.map +0 -1
- package/dist/types/tool-schema.js +0 -24
- package/dist/types/tool-schema.js.map +0 -1
- package/dist/utils/file-reader.d.ts +0 -74
- package/dist/utils/file-reader.d.ts.map +0 -1
- package/dist/utils/file-reader.js +0 -217
- package/dist/utils/file-reader.js.map +0 -1
- package/dist/utils/path-validator.d.ts +0 -52
- package/dist/utils/path-validator.d.ts.map +0 -1
- package/dist/utils/path-validator.js +0 -151
- package/dist/utils/path-validator.js.map +0 -1
|
@@ -1,688 +0,0 @@
|
|
|
1
|
-
// ---------------------------------------------------------------------------
|
|
2
|
-
// CLI Agent Runner
|
|
3
|
-
// Orchestrates adapter selection, process spawning, stdout rendering, and
|
|
4
|
-
// exit handling for the `maestro cli` command.
|
|
5
|
-
// ---------------------------------------------------------------------------
|
|
6
|
-
import { resolve, join } from 'node:path';
|
|
7
|
-
import { pathToFileURL } from 'node:url';
|
|
8
|
-
import { randomBytes } from 'node:crypto';
|
|
9
|
-
import { spawn } from 'node:child_process';
|
|
10
|
-
import { readFileSync, appendFileSync, existsSync } from 'node:fs';
|
|
11
|
-
import { tmpdir } from 'node:os';
|
|
12
|
-
import { DashboardBridge } from './dashboard-bridge.js';
|
|
13
|
-
import { CliHistoryStore } from './cli-history-store.js';
|
|
14
|
-
import { loadTemplate, loadProtocol } from '../config/template-discovery.js';
|
|
15
|
-
import { NOTIFY_PREFIX } from '../hooks/constants.js';
|
|
16
|
-
import { DelegateBrokerClient } from '../async/index.js';
|
|
17
|
-
// ---------------------------------------------------------------------------
|
|
18
|
-
// Tool name -> AgentType mapping
|
|
19
|
-
// ---------------------------------------------------------------------------
|
|
20
|
-
const TOOL_TO_AGENT_TYPE = {
|
|
21
|
-
gemini: 'gemini',
|
|
22
|
-
'gemini-a2a': 'gemini-a2a',
|
|
23
|
-
qwen: 'qwen',
|
|
24
|
-
codex: 'codex',
|
|
25
|
-
'codex-server': 'codex-server',
|
|
26
|
-
claude: 'claude-code',
|
|
27
|
-
opencode: 'opencode',
|
|
28
|
-
};
|
|
29
|
-
// ---------------------------------------------------------------------------
|
|
30
|
-
// AgentType -> terminal CLI command mapping
|
|
31
|
-
// ---------------------------------------------------------------------------
|
|
32
|
-
const AGENT_TYPE_TO_TERMINAL_CMD = {
|
|
33
|
-
'gemini': 'gemini',
|
|
34
|
-
'gemini-a2a': 'gemini',
|
|
35
|
-
'qwen': 'qwen',
|
|
36
|
-
'codex': 'codex',
|
|
37
|
-
'codex-server': 'codex',
|
|
38
|
-
'claude-code': 'claude',
|
|
39
|
-
'opencode': 'opencode',
|
|
40
|
-
};
|
|
41
|
-
// ---------------------------------------------------------------------------
|
|
42
|
-
// Execution ID generation
|
|
43
|
-
// ---------------------------------------------------------------------------
|
|
44
|
-
const TOOL_PREFIX = {
|
|
45
|
-
gemini: 'gem',
|
|
46
|
-
'gemini-a2a': 'gma',
|
|
47
|
-
qwen: 'qwn',
|
|
48
|
-
codex: 'cdx',
|
|
49
|
-
'codex-server': 'cxs',
|
|
50
|
-
claude: 'cld',
|
|
51
|
-
opencode: 'opc',
|
|
52
|
-
};
|
|
53
|
-
export function generateCliExecId(tool) {
|
|
54
|
-
const prefix = TOOL_PREFIX[tool] ?? 'run';
|
|
55
|
-
const now = new Date();
|
|
56
|
-
const hh = String(now.getHours()).padStart(2, '0');
|
|
57
|
-
const mm = String(now.getMinutes()).padStart(2, '0');
|
|
58
|
-
const ss = String(now.getSeconds()).padStart(2, '0');
|
|
59
|
-
const rand = randomBytes(2).toString('hex'); // 4 hex chars
|
|
60
|
-
return `${prefix}-${hh}${mm}${ss}-${rand}`;
|
|
61
|
-
}
|
|
62
|
-
// ---------------------------------------------------------------------------
|
|
63
|
-
// Prompt assembly — protocol + user prompt + template
|
|
64
|
-
// ---------------------------------------------------------------------------
|
|
65
|
-
async function assemblePrompt(userPrompt, mode, rule) {
|
|
66
|
-
const parts = [];
|
|
67
|
-
// 1. Load mode protocol
|
|
68
|
-
const protocol = await loadProtocol(mode);
|
|
69
|
-
if (protocol) {
|
|
70
|
-
parts.push(protocol);
|
|
71
|
-
}
|
|
72
|
-
// 2. User prompt
|
|
73
|
-
parts.push(userPrompt);
|
|
74
|
-
// 3. Load rule template (if specified)
|
|
75
|
-
if (rule) {
|
|
76
|
-
const template = await loadTemplate(rule);
|
|
77
|
-
if (template) {
|
|
78
|
-
parts.push(template);
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
console.error(`Warning: template "${rule}" not found, proceeding without it.`);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
return parts.join('\n\n');
|
|
85
|
-
}
|
|
86
|
-
// ---------------------------------------------------------------------------
|
|
87
|
-
// Adapter factory — dynamic import avoids rootDir cross-boundary issues
|
|
88
|
-
// ---------------------------------------------------------------------------
|
|
89
|
-
async function loadAdapterModule(adapterFile) {
|
|
90
|
-
const baseDir = import.meta.dirname ?? __dirname;
|
|
91
|
-
// Prefer tsc-compiled output; fall back to legacy vite bundle path
|
|
92
|
-
const tscAgents = resolve(baseDir, '..', '..', 'dashboard', 'dist-server', 'dashboard', 'src', 'server', 'agents');
|
|
93
|
-
const legacyAgents = resolve(baseDir, '..', '..', 'dashboard', 'dist-server', 'server', 'agents');
|
|
94
|
-
const tscPath = resolve(tscAgents, adapterFile);
|
|
95
|
-
const legacyPath = resolve(legacyAgents, adapterFile);
|
|
96
|
-
const fullPath = existsSync(tscPath) ? tscPath : legacyPath;
|
|
97
|
-
// Convert to file:// URL for Windows compatibility with dynamic import()
|
|
98
|
-
const fileUrl = pathToFileURL(fullPath).href;
|
|
99
|
-
return await import(fileUrl);
|
|
100
|
-
}
|
|
101
|
-
async function createAdapter(agentType, backend) {
|
|
102
|
-
if (backend === 'terminal') {
|
|
103
|
-
const { detectBackend } = await import('./terminal-backend.js');
|
|
104
|
-
const { TerminalAdapter } = await import('./terminal-adapter.js');
|
|
105
|
-
const termBackend = detectBackend();
|
|
106
|
-
if (!termBackend) {
|
|
107
|
-
throw new Error('No terminal multiplexer detected (need TMUX or WEZTERM_PANE env)');
|
|
108
|
-
}
|
|
109
|
-
const cmd = AGENT_TYPE_TO_TERMINAL_CMD[agentType] ?? agentType;
|
|
110
|
-
return new TerminalAdapter(termBackend, cmd);
|
|
111
|
-
}
|
|
112
|
-
const mod = await loadAdapterModule('adapter-factory.js');
|
|
113
|
-
const factory = mod.createAdapterForType;
|
|
114
|
-
return await factory(agentType);
|
|
115
|
-
}
|
|
116
|
-
// ---------------------------------------------------------------------------
|
|
117
|
-
// Entry renderer — writes normalized entries to stdout/stderr
|
|
118
|
-
// ---------------------------------------------------------------------------
|
|
119
|
-
function renderEntry(entry) {
|
|
120
|
-
switch (entry.type) {
|
|
121
|
-
case 'assistant_message':
|
|
122
|
-
process.stdout.write(entry.content);
|
|
123
|
-
break;
|
|
124
|
-
case 'tool_use':
|
|
125
|
-
if (entry.status === 'running') {
|
|
126
|
-
console.log(`[Tool: ${entry.name}]`);
|
|
127
|
-
}
|
|
128
|
-
else if (entry.status === 'completed' || entry.status === 'failed') {
|
|
129
|
-
console.log(`[Tool ${entry.name}: ${entry.status}]`);
|
|
130
|
-
if (entry.result) {
|
|
131
|
-
console.log(entry.result);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
break;
|
|
135
|
-
case 'error':
|
|
136
|
-
console.error(`Error: ${entry.message}`);
|
|
137
|
-
break;
|
|
138
|
-
case 'file_change':
|
|
139
|
-
console.log(`[File ${entry.action}: ${entry.path}]`);
|
|
140
|
-
break;
|
|
141
|
-
case 'command_exec':
|
|
142
|
-
console.log(`[Exec: ${entry.command}]`);
|
|
143
|
-
break;
|
|
144
|
-
case 'token_usage':
|
|
145
|
-
console.log(`[Tokens: ${entry.inputTokens}in/${entry.outputTokens}out]`);
|
|
146
|
-
break;
|
|
147
|
-
// Silently skip: user_message, thinking, approval_request,
|
|
148
|
-
// approval_response, status_change (handled by the runner itself)
|
|
149
|
-
default:
|
|
150
|
-
break;
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
function buildJobMetadata(options) {
|
|
154
|
-
const metadata = {
|
|
155
|
-
tool: options.tool,
|
|
156
|
-
mode: options.mode,
|
|
157
|
-
workDir: options.workDir,
|
|
158
|
-
prompt: options.prompt.substring(0, 200),
|
|
159
|
-
cancelRequestedAt: null,
|
|
160
|
-
cancelRequestedBy: null,
|
|
161
|
-
cancelReason: null,
|
|
162
|
-
};
|
|
163
|
-
if (options.model) {
|
|
164
|
-
metadata.model = options.model;
|
|
165
|
-
}
|
|
166
|
-
if (options.rule) {
|
|
167
|
-
metadata.rule = options.rule;
|
|
168
|
-
}
|
|
169
|
-
if (options.backend) {
|
|
170
|
-
metadata.backend = options.backend;
|
|
171
|
-
}
|
|
172
|
-
if (options.sessionId) {
|
|
173
|
-
metadata.sessionId = options.sessionId;
|
|
174
|
-
}
|
|
175
|
-
if (options.includeDirs && options.includeDirs.length > 0) {
|
|
176
|
-
metadata.includeDirs = options.includeDirs;
|
|
177
|
-
}
|
|
178
|
-
return metadata;
|
|
179
|
-
}
|
|
180
|
-
function mergeJsonObjects(base, patch) {
|
|
181
|
-
return patch ? { ...base, ...patch } : { ...base };
|
|
182
|
-
}
|
|
183
|
-
function spawnQueuedDelegateWorker(options, execId, prompt) {
|
|
184
|
-
const entryScript = process.argv[1];
|
|
185
|
-
if (!entryScript) {
|
|
186
|
-
return false;
|
|
187
|
-
}
|
|
188
|
-
const args = [
|
|
189
|
-
entryScript,
|
|
190
|
-
'delegate',
|
|
191
|
-
prompt,
|
|
192
|
-
'--worker',
|
|
193
|
-
'--to',
|
|
194
|
-
options.tool,
|
|
195
|
-
'--mode',
|
|
196
|
-
options.mode,
|
|
197
|
-
'--cd',
|
|
198
|
-
options.workDir,
|
|
199
|
-
'--id',
|
|
200
|
-
execId,
|
|
201
|
-
'--backend',
|
|
202
|
-
options.backend ?? 'direct',
|
|
203
|
-
'--resume',
|
|
204
|
-
execId,
|
|
205
|
-
];
|
|
206
|
-
if (options.model) {
|
|
207
|
-
args.push('--model', options.model);
|
|
208
|
-
}
|
|
209
|
-
if (options.rule) {
|
|
210
|
-
args.push('--rule', options.rule);
|
|
211
|
-
}
|
|
212
|
-
if (options.includeDirs && options.includeDirs.length > 0) {
|
|
213
|
-
args.push('--includeDirs', options.includeDirs.join(','));
|
|
214
|
-
}
|
|
215
|
-
if (options.sessionId) {
|
|
216
|
-
args.push('--session', options.sessionId);
|
|
217
|
-
}
|
|
218
|
-
const child = spawn(process.execPath, args, {
|
|
219
|
-
cwd: options.workDir,
|
|
220
|
-
detached: true,
|
|
221
|
-
stdio: 'ignore',
|
|
222
|
-
env: {
|
|
223
|
-
...process.env,
|
|
224
|
-
MAESTRO_DISABLE_DASHBOARD_BRIDGE: '1',
|
|
225
|
-
},
|
|
226
|
-
});
|
|
227
|
-
child.unref();
|
|
228
|
-
return true;
|
|
229
|
-
}
|
|
230
|
-
function isTerminalStatus(status) {
|
|
231
|
-
return status === 'completed' || status === 'failed' || status === 'cancelled';
|
|
232
|
-
}
|
|
233
|
-
function summarizeEntry(entry) {
|
|
234
|
-
switch (entry.type) {
|
|
235
|
-
case 'assistant_message':
|
|
236
|
-
return entry.content.replace(/\s+/g, ' ').trim().slice(0, 200) || 'Assistant response updated';
|
|
237
|
-
case 'tool_use':
|
|
238
|
-
return `Tool ${entry.name} ${entry.status}`;
|
|
239
|
-
case 'file_change':
|
|
240
|
-
return `File ${entry.action}: ${entry.path}`;
|
|
241
|
-
case 'command_exec':
|
|
242
|
-
return `Command: ${entry.command}`;
|
|
243
|
-
case 'error':
|
|
244
|
-
return entry.message;
|
|
245
|
-
case 'status_change':
|
|
246
|
-
return `Status changed to ${entry.status}`;
|
|
247
|
-
default:
|
|
248
|
-
return `Event: ${entry.type}`;
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
function shouldPublishSnapshot(entry) {
|
|
252
|
-
switch (entry.type) {
|
|
253
|
-
case 'assistant_message':
|
|
254
|
-
return entry.partial !== true;
|
|
255
|
-
case 'tool_use':
|
|
256
|
-
return entry.status === 'completed' || entry.status === 'failed';
|
|
257
|
-
case 'file_change':
|
|
258
|
-
case 'command_exec':
|
|
259
|
-
case 'error':
|
|
260
|
-
return true;
|
|
261
|
-
default:
|
|
262
|
-
return false;
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
function createNoopBridge() {
|
|
266
|
-
return {
|
|
267
|
-
async tryConnect() {
|
|
268
|
-
return false;
|
|
269
|
-
},
|
|
270
|
-
forwardSpawn() {
|
|
271
|
-
return;
|
|
272
|
-
},
|
|
273
|
-
forwardEntry() {
|
|
274
|
-
return;
|
|
275
|
-
},
|
|
276
|
-
forwardStopped() {
|
|
277
|
-
return;
|
|
278
|
-
},
|
|
279
|
-
close() {
|
|
280
|
-
return;
|
|
281
|
-
},
|
|
282
|
-
};
|
|
283
|
-
}
|
|
284
|
-
// ---------------------------------------------------------------------------
|
|
285
|
-
// CliAgentRunner
|
|
286
|
-
// ---------------------------------------------------------------------------
|
|
287
|
-
export class CliAgentRunner {
|
|
288
|
-
dependencies;
|
|
289
|
-
constructor(dependencies = {}) {
|
|
290
|
-
this.dependencies = dependencies;
|
|
291
|
-
}
|
|
292
|
-
/** Resolve dashboard WS URL from env → config → default port 3001 */
|
|
293
|
-
static getDashboardWsUrl() {
|
|
294
|
-
const envPort = process.env.MAESTRO_DASHBOARD_PORT;
|
|
295
|
-
if (envPort) {
|
|
296
|
-
const p = parseInt(envPort, 10);
|
|
297
|
-
if (!isNaN(p))
|
|
298
|
-
return `ws://127.0.0.1:${p}/ws`;
|
|
299
|
-
}
|
|
300
|
-
try {
|
|
301
|
-
const configPath = resolve(process.cwd(), '.workflow', 'config.json');
|
|
302
|
-
const raw = readFileSync(configPath, 'utf-8');
|
|
303
|
-
const json = JSON.parse(raw);
|
|
304
|
-
const dashboard = json['dashboard'];
|
|
305
|
-
if (dashboard?.port && typeof dashboard.port === 'number') {
|
|
306
|
-
return `ws://127.0.0.1:${dashboard.port}/ws`;
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
catch {
|
|
310
|
-
// Config missing or unreadable — use default
|
|
311
|
-
}
|
|
312
|
-
return 'ws://127.0.0.1:3001/ws';
|
|
313
|
-
}
|
|
314
|
-
/**
|
|
315
|
-
* Send MCP channel notification (primary path).
|
|
316
|
-
* If maestro MCP server is running in this process, push a
|
|
317
|
-
* notifications/claude/channel message directly.
|
|
318
|
-
*/
|
|
319
|
-
static sendChannelNotification(_sessionId, execId, tool, mode, status, exitCode) {
|
|
320
|
-
try {
|
|
321
|
-
// Dynamic import to avoid circular dependency — getMcpServer is exported
|
|
322
|
-
// from mcp/server.ts which may not be loaded in CLI-only mode.
|
|
323
|
-
const { getMcpServer } = require('../mcp/server.js');
|
|
324
|
-
const server = getMcpServer();
|
|
325
|
-
if (!server)
|
|
326
|
-
return;
|
|
327
|
-
const label = status === 'completed'
|
|
328
|
-
? 'DELEGATE COMPLETED'
|
|
329
|
-
: status === 'cancelled'
|
|
330
|
-
? 'DELEGATE CANCELLED'
|
|
331
|
-
: 'DELEGATE FAILED';
|
|
332
|
-
const result = status === 'completed'
|
|
333
|
-
? 'done'
|
|
334
|
-
: status === 'cancelled'
|
|
335
|
-
? 'cancelled'
|
|
336
|
-
: `exit:${exitCode}`;
|
|
337
|
-
const content = `[${label}] ${execId} (${tool}/${mode}) ${result}\nUse \`maestro delegate output ${execId}\` for full result.`;
|
|
338
|
-
// Fire-and-forget notification via MCP protocol
|
|
339
|
-
server.notification({
|
|
340
|
-
method: 'notifications/claude/channel',
|
|
341
|
-
params: {
|
|
342
|
-
content,
|
|
343
|
-
meta: { exec_id: execId, job_id: execId, tool, mode, exit_code: String(exitCode), event_type: status, status },
|
|
344
|
-
},
|
|
345
|
-
}).catch((err) => { console.error(`[${execId}] MCP notification send failed: ${err instanceof Error ? err.message : err}`); });
|
|
346
|
-
}
|
|
347
|
-
catch (err) {
|
|
348
|
-
console.error(`[${execId}] MCP server not available for channel notification: ${err instanceof Error ? err.message : err}`);
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
/**
|
|
352
|
-
* Run a CLI agent to completion and return its exit code (0 = success).
|
|
353
|
-
*/
|
|
354
|
-
async run(options) {
|
|
355
|
-
const agentType = TOOL_TO_AGENT_TYPE[options.tool];
|
|
356
|
-
if (!agentType) {
|
|
357
|
-
console.error(`Unknown tool: ${options.tool}`);
|
|
358
|
-
return 1;
|
|
359
|
-
}
|
|
360
|
-
// Generate or use provided execution ID
|
|
361
|
-
const execId = options.execId ?? generateCliExecId(options.tool);
|
|
362
|
-
process.stderr.write(`[MAESTRO_EXEC_ID=${execId}]\n`);
|
|
363
|
-
// History store for persistence and resume
|
|
364
|
-
const store = new CliHistoryStore();
|
|
365
|
-
const broker = this.dependencies.brokerClient ?? new DelegateBrokerClient();
|
|
366
|
-
const now = this.dependencies.now ?? (() => new Date().toISOString());
|
|
367
|
-
const jobMetadata = buildJobMetadata(options);
|
|
368
|
-
// Handle --resume: prepend previous session context to user prompt
|
|
369
|
-
let userPrompt = options.prompt;
|
|
370
|
-
if (options.resume) {
|
|
371
|
-
let resumeId = options.resume;
|
|
372
|
-
if (resumeId === 'last') {
|
|
373
|
-
const recent = store.listRecent(1);
|
|
374
|
-
resumeId = recent.length > 0 ? recent[0].execId : '';
|
|
375
|
-
}
|
|
376
|
-
if (resumeId) {
|
|
377
|
-
userPrompt = store.buildResumePrompt(resumeId, userPrompt);
|
|
378
|
-
}
|
|
379
|
-
else {
|
|
380
|
-
console.error('No previous execution found for --resume');
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
// Assemble final prompt: protocol + user prompt + template
|
|
384
|
-
const finalPrompt = await assemblePrompt(userPrompt, options.mode, options.rule);
|
|
385
|
-
const adapterFactory = this.dependencies.createAdapter ?? createAdapter;
|
|
386
|
-
const adapter = await adapterFactory(agentType, options.backend);
|
|
387
|
-
// Optional Dashboard bridge — connect silently, don't block startup
|
|
388
|
-
const bridgeEnabled = process.env.MAESTRO_DISABLE_DASHBOARD_BRIDGE !== '1';
|
|
389
|
-
const bridge = bridgeEnabled
|
|
390
|
-
? (this.dependencies.createBridge?.() ?? new DashboardBridge())
|
|
391
|
-
: createNoopBridge();
|
|
392
|
-
const bridgeConnected = bridgeEnabled
|
|
393
|
-
? await bridge.tryConnect(CliAgentRunner.getDashboardWsUrl(), 1000)
|
|
394
|
-
: false;
|
|
395
|
-
if (!bridgeConnected) {
|
|
396
|
-
process.stderr.write('[Dashboard not connected — real-time view unavailable]\n');
|
|
397
|
-
}
|
|
398
|
-
const config = {
|
|
399
|
-
type: agentType,
|
|
400
|
-
prompt: finalPrompt,
|
|
401
|
-
workDir: options.workDir,
|
|
402
|
-
model: options.model,
|
|
403
|
-
approvalMode: options.mode === 'write' ? 'auto' : 'suggest',
|
|
404
|
-
interactive: adapter.supportsInteractive?.() === true,
|
|
405
|
-
};
|
|
406
|
-
const agentProcess = await adapter.spawn(config);
|
|
407
|
-
bridge.forwardSpawn(agentProcess);
|
|
408
|
-
const agentJobMetadata = {
|
|
409
|
-
...jobMetadata,
|
|
410
|
-
agentProcessId: agentProcess.id,
|
|
411
|
-
};
|
|
412
|
-
store.saveMeta(execId, {
|
|
413
|
-
execId,
|
|
414
|
-
tool: options.tool,
|
|
415
|
-
model: options.model,
|
|
416
|
-
mode: options.mode,
|
|
417
|
-
prompt: options.prompt.substring(0, 500),
|
|
418
|
-
workDir: options.workDir,
|
|
419
|
-
startedAt: agentProcess.startedAt,
|
|
420
|
-
});
|
|
421
|
-
const publishEvent = (type, status, summary, extraPayload = {}, extraJobMetadata) => {
|
|
422
|
-
try {
|
|
423
|
-
const snapshot = store.buildSnapshot(execId);
|
|
424
|
-
broker.publishEvent({
|
|
425
|
-
jobId: execId,
|
|
426
|
-
type,
|
|
427
|
-
status,
|
|
428
|
-
snapshot: snapshot,
|
|
429
|
-
payload: {
|
|
430
|
-
execId,
|
|
431
|
-
summary,
|
|
432
|
-
...extraPayload,
|
|
433
|
-
},
|
|
434
|
-
jobMetadata: mergeJsonObjects(agentJobMetadata, extraJobMetadata),
|
|
435
|
-
});
|
|
436
|
-
}
|
|
437
|
-
catch {
|
|
438
|
-
// Broker publication is best-effort and must not break CLI execution
|
|
439
|
-
}
|
|
440
|
-
};
|
|
441
|
-
publishEvent('status_update', 'running', `Delegate started for ${options.tool}/${options.mode}`);
|
|
442
|
-
// Safety net: if the process exits without a stopped event (e.g. Windows
|
|
443
|
-
// shell process tree doesn't fire exit/close reliably), write meta.json
|
|
444
|
-
// from the synchronous process.on('exit') handler as a last resort.
|
|
445
|
-
let metaWritten = false;
|
|
446
|
-
let cancellationRequested = Boolean(broker.getJob(execId)?.metadata?.cancelRequestedAt);
|
|
447
|
-
let cancellationInitiated = false;
|
|
448
|
-
let cancellationPoller = null;
|
|
449
|
-
const clearCancellationPoller = () => {
|
|
450
|
-
if (cancellationPoller) {
|
|
451
|
-
clearInterval(cancellationPoller);
|
|
452
|
-
cancellationPoller = null;
|
|
453
|
-
}
|
|
454
|
-
};
|
|
455
|
-
const saveMeta = (status, exitCode) => {
|
|
456
|
-
if (metaWritten)
|
|
457
|
-
return;
|
|
458
|
-
metaWritten = true;
|
|
459
|
-
const completedAt = now();
|
|
460
|
-
store.saveMeta(execId, {
|
|
461
|
-
execId,
|
|
462
|
-
tool: options.tool,
|
|
463
|
-
model: options.model,
|
|
464
|
-
mode: options.mode,
|
|
465
|
-
prompt: options.prompt.substring(0, 500),
|
|
466
|
-
workDir: options.workDir,
|
|
467
|
-
startedAt: agentProcess.startedAt,
|
|
468
|
-
completedAt,
|
|
469
|
-
exitCode,
|
|
470
|
-
...(status === 'cancelled' ? { cancelledAt: completedAt } : {}),
|
|
471
|
-
});
|
|
472
|
-
publishEvent(status, status, status === 'completed'
|
|
473
|
-
? `Delegate completed: ${execId}`
|
|
474
|
-
: status === 'cancelled'
|
|
475
|
-
? `Delegate cancelled: ${execId}`
|
|
476
|
-
: `Delegate failed: ${execId}`, {
|
|
477
|
-
exitCode,
|
|
478
|
-
completedAt,
|
|
479
|
-
status,
|
|
480
|
-
});
|
|
481
|
-
// Write delegate completion notification (for hook fallback)
|
|
482
|
-
const sessionId = options.sessionId;
|
|
483
|
-
if (sessionId) {
|
|
484
|
-
// JSONL file write (for hook fallback)
|
|
485
|
-
try {
|
|
486
|
-
const notifyPath = join(tmpdir(), `${NOTIFY_PREFIX}${sessionId}.jsonl`);
|
|
487
|
-
const entry = JSON.stringify({
|
|
488
|
-
execId,
|
|
489
|
-
tool: options.tool,
|
|
490
|
-
mode: options.mode,
|
|
491
|
-
prompt: options.prompt.substring(0, 200),
|
|
492
|
-
exitCode,
|
|
493
|
-
completedAt,
|
|
494
|
-
status,
|
|
495
|
-
});
|
|
496
|
-
appendFileSync(notifyPath, entry + '\n', 'utf-8');
|
|
497
|
-
}
|
|
498
|
-
catch (err) {
|
|
499
|
-
console.error(`[${execId}] Failed to write JSONL notification: ${err instanceof Error ? err.message : err}`);
|
|
500
|
-
}
|
|
501
|
-
// MCP channel notification (primary path)
|
|
502
|
-
try {
|
|
503
|
-
CliAgentRunner.sendChannelNotification(sessionId, execId, options.tool, options.mode, status, exitCode);
|
|
504
|
-
}
|
|
505
|
-
catch (err) {
|
|
506
|
-
console.error(`[${execId}] Failed to send channel notification: ${err instanceof Error ? err.message : err}`);
|
|
507
|
-
}
|
|
508
|
-
}
|
|
509
|
-
};
|
|
510
|
-
const processExitHandler = () => {
|
|
511
|
-
saveMeta(cancellationRequested ? 'cancelled' : 'completed', cancellationRequested ? 130 : 0);
|
|
512
|
-
};
|
|
513
|
-
process.on('exit', processExitHandler);
|
|
514
|
-
const requestCancellation = async () => {
|
|
515
|
-
cancellationRequested = true;
|
|
516
|
-
if (cancellationInitiated) {
|
|
517
|
-
return;
|
|
518
|
-
}
|
|
519
|
-
cancellationInitiated = true;
|
|
520
|
-
publishEvent('status_update', 'running', `Cancellation requested for ${execId}`, {
|
|
521
|
-
cancelRequested: true,
|
|
522
|
-
});
|
|
523
|
-
try {
|
|
524
|
-
await adapter.stop(agentProcess.id);
|
|
525
|
-
}
|
|
526
|
-
catch {
|
|
527
|
-
// Adapter stop failures are surfaced by subsequent process status events.
|
|
528
|
-
}
|
|
529
|
-
};
|
|
530
|
-
const dispatchQueuedFollowup = (finalStatus) => {
|
|
531
|
-
let queuedMessage;
|
|
532
|
-
try {
|
|
533
|
-
queuedMessage = broker.listMessages(execId).find((message) => (message.status === 'queued'
|
|
534
|
-
&& ((message.delivery === 'inject'
|
|
535
|
-
&& (finalStatus === 'cancelled' || finalStatus === 'completed' || finalStatus === 'failed'))
|
|
536
|
-
|| (message.delivery === 'after_complete' && finalStatus === 'completed'))));
|
|
537
|
-
}
|
|
538
|
-
catch {
|
|
539
|
-
return;
|
|
540
|
-
}
|
|
541
|
-
if (!queuedMessage) {
|
|
542
|
-
return;
|
|
543
|
-
}
|
|
544
|
-
const dispatchedAt = now();
|
|
545
|
-
let launched = false;
|
|
546
|
-
try {
|
|
547
|
-
launched = (this.dependencies.spawnDetachedDelegate ?? spawnQueuedDelegateWorker)(options, execId, queuedMessage.message);
|
|
548
|
-
}
|
|
549
|
-
catch {
|
|
550
|
-
launched = false;
|
|
551
|
-
}
|
|
552
|
-
if (!launched) {
|
|
553
|
-
broker.updateMessage({
|
|
554
|
-
jobId: execId,
|
|
555
|
-
messageId: queuedMessage.messageId,
|
|
556
|
-
status: 'dropped',
|
|
557
|
-
dispatchReason: 'missing-entry-script',
|
|
558
|
-
now: dispatchedAt,
|
|
559
|
-
});
|
|
560
|
-
return;
|
|
561
|
-
}
|
|
562
|
-
broker.updateMessage({
|
|
563
|
-
jobId: execId,
|
|
564
|
-
messageId: queuedMessage.messageId,
|
|
565
|
-
status: 'dispatched',
|
|
566
|
-
dispatchReason: finalStatus,
|
|
567
|
-
now: dispatchedAt,
|
|
568
|
-
});
|
|
569
|
-
publishEvent('status_update', finalStatus, `Queued follow-up dispatched via ${queuedMessage.delivery}`, {
|
|
570
|
-
delivery: queuedMessage.delivery,
|
|
571
|
-
messageId: queuedMessage.messageId,
|
|
572
|
-
}, {
|
|
573
|
-
cancelRequestedAt: null,
|
|
574
|
-
cancelRequestedBy: null,
|
|
575
|
-
cancelReason: null,
|
|
576
|
-
});
|
|
577
|
-
};
|
|
578
|
-
const inFlightMessageIds = new Set();
|
|
579
|
-
if (!isTerminalStatus(broker.getJob(execId)?.status)) {
|
|
580
|
-
cancellationPoller = setInterval(() => {
|
|
581
|
-
try {
|
|
582
|
-
const job = broker.getJob(execId);
|
|
583
|
-
if (job?.metadata?.cancelRequestedAt && !cancellationInitiated) {
|
|
584
|
-
void requestCancellation();
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
catch {
|
|
588
|
-
// Best-effort polling only.
|
|
589
|
-
}
|
|
590
|
-
// Poll for inject messages and auto-route based on adapter capabilities
|
|
591
|
-
try {
|
|
592
|
-
const injectMessages = broker.listMessages(execId)
|
|
593
|
-
.filter((msg) => msg.status === 'queued' && msg.delivery === 'inject' && !inFlightMessageIds.has(msg.messageId))
|
|
594
|
-
.sort((a, b) => a.createdAt.localeCompare(b.createdAt));
|
|
595
|
-
for (const msg of injectMessages) {
|
|
596
|
-
const polledNow = now();
|
|
597
|
-
if (adapter.sendMessage && (adapter.supportsInteractive?.() !== false)) {
|
|
598
|
-
// Interactive adapter: inject via stdin without interruption
|
|
599
|
-
inFlightMessageIds.add(msg.messageId);
|
|
600
|
-
void adapter.sendMessage(agentProcess.id, msg.message).then(() => {
|
|
601
|
-
broker.updateMessage({
|
|
602
|
-
jobId: execId,
|
|
603
|
-
messageId: msg.messageId,
|
|
604
|
-
status: 'injected',
|
|
605
|
-
dispatchReason: 'inject-streaming',
|
|
606
|
-
now: polledNow,
|
|
607
|
-
});
|
|
608
|
-
}).catch(() => {
|
|
609
|
-
broker.updateMessage({
|
|
610
|
-
jobId: execId,
|
|
611
|
-
messageId: msg.messageId,
|
|
612
|
-
status: 'dropped',
|
|
613
|
-
dispatchReason: 'send-failed',
|
|
614
|
-
now: polledNow,
|
|
615
|
-
});
|
|
616
|
-
}).finally(() => {
|
|
617
|
-
inFlightMessageIds.delete(msg.messageId);
|
|
618
|
-
});
|
|
619
|
-
}
|
|
620
|
-
else {
|
|
621
|
-
// Non-interactive adapter: fall back to cancel + resume
|
|
622
|
-
if (!cancellationInitiated) {
|
|
623
|
-
void requestCancellation();
|
|
624
|
-
}
|
|
625
|
-
break; // Messages stay queued for dispatchQueuedFollowup after restart
|
|
626
|
-
}
|
|
627
|
-
}
|
|
628
|
-
}
|
|
629
|
-
catch {
|
|
630
|
-
// Best-effort inject message polling.
|
|
631
|
-
}
|
|
632
|
-
}, 750);
|
|
633
|
-
}
|
|
634
|
-
if (cancellationRequested) {
|
|
635
|
-
void requestCancellation();
|
|
636
|
-
}
|
|
637
|
-
return new Promise((resolvePromise) => {
|
|
638
|
-
const unsubscribe = adapter.onEntry(agentProcess.id, (entry) => {
|
|
639
|
-
// Persist entry to JSONL history before rendering
|
|
640
|
-
store.appendEntry(execId, entry);
|
|
641
|
-
(this.dependencies.renderEntry ?? renderEntry)(entry);
|
|
642
|
-
bridge.forwardEntry(entry);
|
|
643
|
-
if (shouldPublishSnapshot(entry)) {
|
|
644
|
-
publishEvent('snapshot', 'running', summarizeEntry(entry), {
|
|
645
|
-
entryType: entry.type,
|
|
646
|
-
});
|
|
647
|
-
}
|
|
648
|
-
// Interactive mode: when Claude emits token_usage (end of turn) and no
|
|
649
|
-
// more inject messages are queued, close stdin to let the process exit.
|
|
650
|
-
if (config.interactive && entry.type === 'token_usage' && broker) {
|
|
651
|
-
try {
|
|
652
|
-
const pending = broker.listMessages(execId)
|
|
653
|
-
.filter((m) => m.status === 'queued' && m.delivery === 'inject');
|
|
654
|
-
if (pending.length === 0 && !cancellationRequested) {
|
|
655
|
-
adapter.endInput?.(agentProcess.id);
|
|
656
|
-
}
|
|
657
|
-
}
|
|
658
|
-
catch { /* best-effort */ }
|
|
659
|
-
}
|
|
660
|
-
// Resolve when the agent process stops
|
|
661
|
-
if (entry.type === 'status_change' && entry.status === 'stopped') {
|
|
662
|
-
clearCancellationPoller();
|
|
663
|
-
const finalStatus = cancellationRequested ? 'cancelled' : 'completed';
|
|
664
|
-
saveMeta(finalStatus, cancellationRequested ? 130 : 0);
|
|
665
|
-
dispatchQueuedFollowup(finalStatus);
|
|
666
|
-
process.removeListener('exit', processExitHandler);
|
|
667
|
-
bridge.forwardStopped(agentProcess.id);
|
|
668
|
-
bridge.close();
|
|
669
|
-
unsubscribe();
|
|
670
|
-
resolvePromise(cancellationRequested ? 130 : 0);
|
|
671
|
-
}
|
|
672
|
-
// Resolve with error code on error status
|
|
673
|
-
if (entry.type === 'status_change' && entry.status === 'error') {
|
|
674
|
-
clearCancellationPoller();
|
|
675
|
-
const finalStatus = cancellationRequested ? 'cancelled' : 'failed';
|
|
676
|
-
saveMeta(finalStatus, cancellationRequested ? 130 : 1);
|
|
677
|
-
dispatchQueuedFollowup(finalStatus);
|
|
678
|
-
process.removeListener('exit', processExitHandler);
|
|
679
|
-
bridge.forwardStopped(agentProcess.id);
|
|
680
|
-
bridge.close();
|
|
681
|
-
unsubscribe();
|
|
682
|
-
resolvePromise(cancellationRequested ? 130 : 1);
|
|
683
|
-
}
|
|
684
|
-
});
|
|
685
|
-
});
|
|
686
|
-
}
|
|
687
|
-
}
|
|
688
|
-
//# sourceMappingURL=cli-agent-runner.js.map
|