trellis-he 0.6.0-beta.17
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/LICENSE +235 -0
- package/README.md +149 -0
- package/bin/trellis.js +3 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +207 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/commands/channel/adapters/claude.d.ts +38 -0
- package/dist/commands/channel/adapters/claude.d.ts.map +1 -0
- package/dist/commands/channel/adapters/claude.js +209 -0
- package/dist/commands/channel/adapters/claude.js.map +1 -0
- package/dist/commands/channel/adapters/codex.d.ts +81 -0
- package/dist/commands/channel/adapters/codex.d.ts.map +1 -0
- package/dist/commands/channel/adapters/codex.js +512 -0
- package/dist/commands/channel/adapters/codex.js.map +1 -0
- package/dist/commands/channel/adapters/index.d.ts +79 -0
- package/dist/commands/channel/adapters/index.d.ts.map +1 -0
- package/dist/commands/channel/adapters/index.js +109 -0
- package/dist/commands/channel/adapters/index.js.map +1 -0
- package/dist/commands/channel/adapters/types.d.ts +33 -0
- package/dist/commands/channel/adapters/types.d.ts.map +1 -0
- package/dist/commands/channel/adapters/types.js +2 -0
- package/dist/commands/channel/adapters/types.js.map +1 -0
- package/dist/commands/channel/agent-loader.d.ts +32 -0
- package/dist/commands/channel/agent-loader.d.ts.map +1 -0
- package/dist/commands/channel/agent-loader.js +154 -0
- package/dist/commands/channel/agent-loader.js.map +1 -0
- package/dist/commands/channel/context-loader.d.ts +26 -0
- package/dist/commands/channel/context-loader.d.ts.map +1 -0
- package/dist/commands/channel/context-loader.js +290 -0
- package/dist/commands/channel/context-loader.js.map +1 -0
- package/dist/commands/channel/context.d.ts +16 -0
- package/dist/commands/channel/context.d.ts.map +1 -0
- package/dist/commands/channel/context.js +83 -0
- package/dist/commands/channel/context.js.map +1 -0
- package/dist/commands/channel/create.d.ts +27 -0
- package/dist/commands/channel/create.d.ts.map +1 -0
- package/dist/commands/channel/create.js +39 -0
- package/dist/commands/channel/create.js.map +1 -0
- package/dist/commands/channel/dev-parse-trace.d.ts +14 -0
- package/dist/commands/channel/dev-parse-trace.d.ts.map +1 -0
- package/dist/commands/channel/dev-parse-trace.js +70 -0
- package/dist/commands/channel/dev-parse-trace.js.map +1 -0
- package/dist/commands/channel/index.d.ts +3 -0
- package/dist/commands/channel/index.d.ts.map +1 -0
- package/dist/commands/channel/index.js +503 -0
- package/dist/commands/channel/index.js.map +1 -0
- package/dist/commands/channel/kill.d.ts +7 -0
- package/dist/commands/channel/kill.d.ts.map +1 -0
- package/dist/commands/channel/kill.js +121 -0
- package/dist/commands/channel/kill.js.map +1 -0
- package/dist/commands/channel/list.d.ts +17 -0
- package/dist/commands/channel/list.d.ts.map +1 -0
- package/dist/commands/channel/list.js +233 -0
- package/dist/commands/channel/list.js.map +1 -0
- package/dist/commands/channel/messages.d.ts +16 -0
- package/dist/commands/channel/messages.d.ts.map +1 -0
- package/dist/commands/channel/messages.js +249 -0
- package/dist/commands/channel/messages.js.map +1 -0
- package/dist/commands/channel/rm.d.ts +27 -0
- package/dist/commands/channel/rm.d.ts.map +1 -0
- package/dist/commands/channel/rm.js +216 -0
- package/dist/commands/channel/rm.js.map +1 -0
- package/dist/commands/channel/run.d.ts +31 -0
- package/dist/commands/channel/run.d.ts.map +1 -0
- package/dist/commands/channel/run.js +137 -0
- package/dist/commands/channel/run.js.map +1 -0
- package/dist/commands/channel/send.d.ts +13 -0
- package/dist/commands/channel/send.d.ts.map +1 -0
- package/dist/commands/channel/send.js +26 -0
- package/dist/commands/channel/send.js.map +1 -0
- package/dist/commands/channel/spawn.d.ts +30 -0
- package/dist/commands/channel/spawn.d.ts.map +1 -0
- package/dist/commands/channel/spawn.js +194 -0
- package/dist/commands/channel/spawn.js.map +1 -0
- package/dist/commands/channel/store/events.d.ts +39 -0
- package/dist/commands/channel/store/events.d.ts.map +1 -0
- package/dist/commands/channel/store/events.js +87 -0
- package/dist/commands/channel/store/events.js.map +1 -0
- package/dist/commands/channel/store/filter.d.ts +3 -0
- package/dist/commands/channel/store/filter.d.ts.map +1 -0
- package/dist/commands/channel/store/filter.js +2 -0
- package/dist/commands/channel/store/filter.js.map +1 -0
- package/dist/commands/channel/store/lock.d.ts +23 -0
- package/dist/commands/channel/store/lock.d.ts.map +1 -0
- package/dist/commands/channel/store/lock.js +99 -0
- package/dist/commands/channel/store/lock.js.map +1 -0
- package/dist/commands/channel/store/paths.d.ts +63 -0
- package/dist/commands/channel/store/paths.d.ts.map +1 -0
- package/dist/commands/channel/store/paths.js +246 -0
- package/dist/commands/channel/store/paths.js.map +1 -0
- package/dist/commands/channel/store/schema.d.ts +27 -0
- package/dist/commands/channel/store/schema.d.ts.map +1 -0
- package/dist/commands/channel/store/schema.js +34 -0
- package/dist/commands/channel/store/schema.js.map +1 -0
- package/dist/commands/channel/store/thread-state.d.ts +5 -0
- package/dist/commands/channel/store/thread-state.d.ts.map +1 -0
- package/dist/commands/channel/store/thread-state.js +16 -0
- package/dist/commands/channel/store/thread-state.js.map +1 -0
- package/dist/commands/channel/store/watch.d.ts +19 -0
- package/dist/commands/channel/store/watch.d.ts.map +1 -0
- package/dist/commands/channel/store/watch.js +146 -0
- package/dist/commands/channel/store/watch.js.map +1 -0
- package/dist/commands/channel/supervisor/inbox.d.ts +30 -0
- package/dist/commands/channel/supervisor/inbox.d.ts.map +1 -0
- package/dist/commands/channel/supervisor/inbox.js +160 -0
- package/dist/commands/channel/supervisor/inbox.js.map +1 -0
- package/dist/commands/channel/supervisor/shutdown.d.ts +66 -0
- package/dist/commands/channel/supervisor/shutdown.d.ts.map +1 -0
- package/dist/commands/channel/supervisor/shutdown.js +143 -0
- package/dist/commands/channel/supervisor/shutdown.js.map +1 -0
- package/dist/commands/channel/supervisor/stdout.d.ts +51 -0
- package/dist/commands/channel/supervisor/stdout.d.ts.map +1 -0
- package/dist/commands/channel/supervisor/stdout.js +121 -0
- package/dist/commands/channel/supervisor/stdout.js.map +1 -0
- package/dist/commands/channel/supervisor/turns.d.ts +20 -0
- package/dist/commands/channel/supervisor/turns.d.ts.map +1 -0
- package/dist/commands/channel/supervisor/turns.js +28 -0
- package/dist/commands/channel/supervisor/turns.js.map +1 -0
- package/dist/commands/channel/supervisor/warning.d.ts +48 -0
- package/dist/commands/channel/supervisor/warning.d.ts.map +1 -0
- package/dist/commands/channel/supervisor/warning.js +77 -0
- package/dist/commands/channel/supervisor/warning.js.map +1 -0
- package/dist/commands/channel/supervisor.d.ts +53 -0
- package/dist/commands/channel/supervisor.d.ts.map +1 -0
- package/dist/commands/channel/supervisor.js +304 -0
- package/dist/commands/channel/supervisor.js.map +1 -0
- package/dist/commands/channel/text-body.d.ts +13 -0
- package/dist/commands/channel/text-body.d.ts.map +1 -0
- package/dist/commands/channel/text-body.js +47 -0
- package/dist/commands/channel/text-body.js.map +1 -0
- package/dist/commands/channel/threads.d.ts +39 -0
- package/dist/commands/channel/threads.d.ts.map +1 -0
- package/dist/commands/channel/threads.js +106 -0
- package/dist/commands/channel/threads.js.map +1 -0
- package/dist/commands/channel/title.d.ts +12 -0
- package/dist/commands/channel/title.d.ts.map +1 -0
- package/dist/commands/channel/title.js +24 -0
- package/dist/commands/channel/title.js.map +1 -0
- package/dist/commands/channel/wait.d.ts +18 -0
- package/dist/commands/channel/wait.d.ts.map +1 -0
- package/dist/commands/channel/wait.js +76 -0
- package/dist/commands/channel/wait.js.map +1 -0
- package/dist/commands/init.d.ts +59 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +1459 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/mem.d.ts +30 -0
- package/dist/commands/mem.d.ts.map +1 -0
- package/dist/commands/mem.js +424 -0
- package/dist/commands/mem.js.map +1 -0
- package/dist/commands/uninstall.d.ts +27 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +339 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +72 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +1926 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/upgrade.d.ts +28 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +84 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/commands/workflow.d.ts +35 -0
- package/dist/commands/workflow.d.ts.map +1 -0
- package/dist/commands/workflow.js +219 -0
- package/dist/commands/workflow.js.map +1 -0
- package/dist/configurators/antigravity.d.ts +7 -0
- package/dist/configurators/antigravity.d.ts.map +1 -0
- package/dist/configurators/antigravity.js +19 -0
- package/dist/configurators/antigravity.js.map +1 -0
- package/dist/configurators/claude.d.ts +9 -0
- package/dist/configurators/claude.d.ts.map +1 -0
- package/dist/configurators/claude.js +72 -0
- package/dist/configurators/claude.js.map +1 -0
- package/dist/configurators/codebuddy.d.ts +10 -0
- package/dist/configurators/codebuddy.d.ts.map +1 -0
- package/dist/configurators/codebuddy.js +30 -0
- package/dist/configurators/codebuddy.js.map +1 -0
- package/dist/configurators/codex.d.ts +8 -0
- package/dist/configurators/codex.d.ts.map +1 -0
- package/dist/configurators/codex.js +87 -0
- package/dist/configurators/codex.js.map +1 -0
- package/dist/configurators/copilot.d.ts +10 -0
- package/dist/configurators/copilot.d.ts.map +1 -0
- package/dist/configurators/copilot.js +51 -0
- package/dist/configurators/copilot.js.map +1 -0
- package/dist/configurators/cursor.d.ts +10 -0
- package/dist/configurators/cursor.d.ts.map +1 -0
- package/dist/configurators/cursor.js +29 -0
- package/dist/configurators/cursor.js.map +1 -0
- package/dist/configurators/droid.d.ts +10 -0
- package/dist/configurators/droid.d.ts.map +1 -0
- package/dist/configurators/droid.js +30 -0
- package/dist/configurators/droid.js.map +1 -0
- package/dist/configurators/gemini.d.ts +16 -0
- package/dist/configurators/gemini.d.ts.map +1 -0
- package/dist/configurators/gemini.js +38 -0
- package/dist/configurators/gemini.js.map +1 -0
- package/dist/configurators/index.d.ts +65 -0
- package/dist/configurators/index.d.ts.map +1 -0
- package/dist/configurators/index.js +367 -0
- package/dist/configurators/index.js.map +1 -0
- package/dist/configurators/kilo.d.ts +7 -0
- package/dist/configurators/kilo.d.ts.map +1 -0
- package/dist/configurators/kilo.js +19 -0
- package/dist/configurators/kilo.js.map +1 -0
- package/dist/configurators/kiro.d.ts +8 -0
- package/dist/configurators/kiro.d.ts.map +1 -0
- package/dist/configurators/kiro.js +24 -0
- package/dist/configurators/kiro.js.map +1 -0
- package/dist/configurators/opencode.d.ts +14 -0
- package/dist/configurators/opencode.d.ts.map +1 -0
- package/dist/configurators/opencode.js +96 -0
- package/dist/configurators/opencode.js.map +1 -0
- package/dist/configurators/pi.d.ts +3 -0
- package/dist/configurators/pi.d.ts.map +1 -0
- package/dist/configurators/pi.js +45 -0
- package/dist/configurators/pi.js.map +1 -0
- package/dist/configurators/qoder.d.ts +11 -0
- package/dist/configurators/qoder.d.ts.map +1 -0
- package/dist/configurators/qoder.js +31 -0
- package/dist/configurators/qoder.js.map +1 -0
- package/dist/configurators/shared.d.ts +178 -0
- package/dist/configurators/shared.d.ts.map +1 -0
- package/dist/configurators/shared.js +541 -0
- package/dist/configurators/shared.js.map +1 -0
- package/dist/configurators/windsurf.d.ts +7 -0
- package/dist/configurators/windsurf.d.ts.map +1 -0
- package/dist/configurators/windsurf.js +19 -0
- package/dist/configurators/windsurf.js.map +1 -0
- package/dist/configurators/workflow.d.ts +37 -0
- package/dist/configurators/workflow.d.ts.map +1 -0
- package/dist/configurators/workflow.js +164 -0
- package/dist/configurators/workflow.js.map +1 -0
- package/dist/constants/paths.d.ts +70 -0
- package/dist/constants/paths.d.ts.map +1 -0
- package/dist/constants/paths.js +79 -0
- package/dist/constants/paths.js.map +1 -0
- package/dist/constants/version.d.ts +9 -0
- package/dist/constants/version.d.ts.map +1 -0
- package/dist/constants/version.js +15 -0
- package/dist/constants/version.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/migrations/index.d.ts +62 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +187 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/manifests/0.1.9.json +30 -0
- package/dist/migrations/manifests/0.2.0.json +49 -0
- package/dist/migrations/manifests/0.2.12.json +9 -0
- package/dist/migrations/manifests/0.2.13.json +9 -0
- package/dist/migrations/manifests/0.2.14.json +175 -0
- package/dist/migrations/manifests/0.2.15.json +33 -0
- package/dist/migrations/manifests/0.3.0-beta.0.json +297 -0
- package/dist/migrations/manifests/0.3.0-beta.1.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.10.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.11.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.12.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.13.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.14.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.15.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.16.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.2.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.3.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.4.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.5.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.6.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.7.json +11 -0
- package/dist/migrations/manifests/0.3.0-beta.8.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.9.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.0.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.1.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.2.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.3.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.4.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.5.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.6.json +9 -0
- package/dist/migrations/manifests/0.3.0.json +11 -0
- package/dist/migrations/manifests/0.3.1.json +9 -0
- package/dist/migrations/manifests/0.3.10.json +9 -0
- package/dist/migrations/manifests/0.3.2.json +9 -0
- package/dist/migrations/manifests/0.3.3.json +9 -0
- package/dist/migrations/manifests/0.3.4.json +21 -0
- package/dist/migrations/manifests/0.3.5.json +9 -0
- package/dist/migrations/manifests/0.3.6.json +9 -0
- package/dist/migrations/manifests/0.3.7.json +9 -0
- package/dist/migrations/manifests/0.3.8.json +9 -0
- package/dist/migrations/manifests/0.3.9.json +9 -0
- package/dist/migrations/manifests/0.4.0-beta.1.json +228 -0
- package/dist/migrations/manifests/0.4.0-beta.10.json +9 -0
- package/dist/migrations/manifests/0.4.0-beta.2.json +9 -0
- package/dist/migrations/manifests/0.4.0-beta.3.json +9 -0
- package/dist/migrations/manifests/0.4.0-beta.4.json +9 -0
- package/dist/migrations/manifests/0.4.0-beta.5.json +9 -0
- package/dist/migrations/manifests/0.4.0-beta.6.json +9 -0
- package/dist/migrations/manifests/0.4.0-beta.7.json +9 -0
- package/dist/migrations/manifests/0.4.0-beta.8.json +34 -0
- package/dist/migrations/manifests/0.4.0-beta.9.json +9 -0
- package/dist/migrations/manifests/0.4.0-rc.0.json +9 -0
- package/dist/migrations/manifests/0.4.0-rc.1.json +9 -0
- package/dist/migrations/manifests/0.4.0.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.0.json +1646 -0
- package/dist/migrations/manifests/0.5.0-beta.1.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.10.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.11.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.12.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.13.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.14.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.15.json +116 -0
- package/dist/migrations/manifests/0.5.0-beta.16.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.17.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.18.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.19.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.2.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.3.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.4.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.5.json +222 -0
- package/dist/migrations/manifests/0.5.0-beta.6.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.7.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.8.json +9 -0
- package/dist/migrations/manifests/0.5.0-beta.9.json +48 -0
- package/dist/migrations/manifests/0.5.0-rc.0.json +9 -0
- package/dist/migrations/manifests/0.5.0-rc.1.json +9 -0
- package/dist/migrations/manifests/0.5.0-rc.2.json +9 -0
- package/dist/migrations/manifests/0.5.0-rc.3.json +9 -0
- package/dist/migrations/manifests/0.5.0-rc.4.json +9 -0
- package/dist/migrations/manifests/0.5.0-rc.5.json +9 -0
- package/dist/migrations/manifests/0.5.0-rc.6.json +9 -0
- package/dist/migrations/manifests/0.5.0-rc.7.json +9 -0
- package/dist/migrations/manifests/0.5.0.json +9 -0
- package/dist/migrations/manifests/0.5.1.json +9 -0
- package/dist/migrations/manifests/0.5.10.json +9 -0
- package/dist/migrations/manifests/0.5.11.json +16 -0
- package/dist/migrations/manifests/0.5.12.json +9 -0
- package/dist/migrations/manifests/0.5.13.json +9 -0
- package/dist/migrations/manifests/0.5.14.json +9 -0
- package/dist/migrations/manifests/0.5.15.json +9 -0
- package/dist/migrations/manifests/0.5.2.json +9 -0
- package/dist/migrations/manifests/0.5.3.json +9 -0
- package/dist/migrations/manifests/0.5.4.json +9 -0
- package/dist/migrations/manifests/0.5.5.json +9 -0
- package/dist/migrations/manifests/0.5.6.json +9 -0
- package/dist/migrations/manifests/0.5.7.json +16 -0
- package/dist/migrations/manifests/0.5.8.json +9 -0
- package/dist/migrations/manifests/0.5.9.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.0.json +16 -0
- package/dist/migrations/manifests/0.6.0-beta.1.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.10.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.11.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.12.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.13.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.14.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.15.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.16.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.17.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.2.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.3.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.4.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.5.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.6.json +16 -0
- package/dist/migrations/manifests/0.6.0-beta.7.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.8.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.9.json +9 -0
- package/dist/templates/claude/agents/trellis-check.md +123 -0
- package/dist/templates/claude/agents/trellis-code-architecture-review.md +71 -0
- package/dist/templates/claude/agents/trellis-code-review.md +71 -0
- package/dist/templates/claude/agents/trellis-implement.md +118 -0
- package/dist/templates/claude/agents/trellis-merge-review.md +72 -0
- package/dist/templates/claude/agents/trellis-research.md +137 -0
- package/dist/templates/claude/agents/trellis-spec-review.md +71 -0
- package/dist/templates/claude/index.d.ts +22 -0
- package/dist/templates/claude/index.d.ts.map +1 -0
- package/dist/templates/claude/index.js +46 -0
- package/dist/templates/claude/index.js.map +1 -0
- package/dist/templates/claude/settings.json +73 -0
- package/dist/templates/codebuddy/agents/trellis-check.md +115 -0
- package/dist/templates/codebuddy/agents/trellis-implement.md +110 -0
- package/dist/templates/codebuddy/agents/trellis-research.md +137 -0
- package/dist/templates/codebuddy/index.d.ts +15 -0
- package/dist/templates/codebuddy/index.d.ts.map +1 -0
- package/dist/templates/codebuddy/index.js +15 -0
- package/dist/templates/codebuddy/index.js.map +1 -0
- package/dist/templates/codebuddy/settings.json +59 -0
- package/dist/templates/codex/agents/trellis-check.toml +84 -0
- package/dist/templates/codex/agents/trellis-implement.toml +65 -0
- package/dist/templates/codex/agents/trellis-research.toml +73 -0
- package/dist/templates/codex/config.toml +35 -0
- package/dist/templates/codex/hooks/session-start.py +545 -0
- package/dist/templates/codex/hooks.json +15 -0
- package/dist/templates/codex/index.d.ts +39 -0
- package/dist/templates/codex/index.d.ts.map +1 -0
- package/dist/templates/codex/index.js +85 -0
- package/dist/templates/codex/index.js.map +1 -0
- package/dist/templates/codex/skills/before-dev/SKILL.md +40 -0
- package/dist/templates/codex/skills/brainstorm/SKILL.md +112 -0
- package/dist/templates/codex/skills/break-loop/SKILL.md +130 -0
- package/dist/templates/codex/skills/check/SKILL.md +98 -0
- package/dist/templates/codex/skills/check-cross-layer/SKILL.md +158 -0
- package/dist/templates/codex/skills/create-command/SKILL.md +101 -0
- package/dist/templates/codex/skills/finish-work/SKILL.md +90 -0
- package/dist/templates/codex/skills/improve-ut/SKILL.md +69 -0
- package/dist/templates/codex/skills/integrate-skill/SKILL.md +221 -0
- package/dist/templates/codex/skills/onboard/SKILL.md +363 -0
- package/dist/templates/codex/skills/record-session/SKILL.md +67 -0
- package/dist/templates/codex/skills/start/SKILL.md +64 -0
- package/dist/templates/codex/skills/update-spec/SKILL.md +335 -0
- package/dist/templates/common/bundled-skills/trellis-meta/SKILL.md +73 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/add-project-local-conventions.md +83 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-agents.md +54 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-context-loading.md +84 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-hooks.md +57 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-skills-or-commands.md +78 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-spec-structure.md +83 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-task-lifecycle.md +90 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-workflow.md +65 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/overview.md +55 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/context-injection.md +68 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/generated-files.md +80 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/overview.md +51 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/spec-system.md +102 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/task-system.md +130 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/workflow.md +75 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/workspace-memory.md +71 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/agents.md +80 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/hooks-and-settings.md +69 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/overview.md +59 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/platform-map.md +74 -0
- package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/skills-and-commands.md +83 -0
- package/dist/templates/common/commands/continue.md +56 -0
- package/dist/templates/common/commands/finish-work.md +66 -0
- package/dist/templates/common/commands/start.md +59 -0
- package/dist/templates/common/index.d.ts +48 -0
- package/dist/templates/common/index.d.ts.map +1 -0
- package/dist/templates/common/index.js +104 -0
- package/dist/templates/common/index.js.map +1 -0
- package/dist/templates/common/skills/before-dev.md +41 -0
- package/dist/templates/common/skills/brainstorm.md +112 -0
- package/dist/templates/common/skills/break-loop.md +125 -0
- package/dist/templates/common/skills/check.md +93 -0
- package/dist/templates/common/skills/grill-me.md +49 -0
- package/dist/templates/common/skills/improve-codebase-architecture.md +38 -0
- package/dist/templates/common/skills/tdd.md +34 -0
- package/dist/templates/common/skills/update-spec.md +351 -0
- package/dist/templates/copilot/hooks/session-start.py +547 -0
- package/dist/templates/copilot/hooks.json +19 -0
- package/dist/templates/copilot/index.d.ts +23 -0
- package/dist/templates/copilot/index.d.ts.map +1 -0
- package/dist/templates/copilot/index.js +54 -0
- package/dist/templates/copilot/index.js.map +1 -0
- package/dist/templates/copilot/prompts/before-dev.prompt.md +39 -0
- package/dist/templates/copilot/prompts/brainstorm.prompt.md +111 -0
- package/dist/templates/copilot/prompts/break-loop.prompt.md +129 -0
- package/dist/templates/copilot/prompts/check-cross-layer.prompt.md +157 -0
- package/dist/templates/copilot/prompts/check.prompt.md +97 -0
- package/dist/templates/copilot/prompts/create-command.prompt.md +116 -0
- package/dist/templates/copilot/prompts/finish-work.prompt.md +99 -0
- package/dist/templates/copilot/prompts/integrate-skill.prompt.md +223 -0
- package/dist/templates/copilot/prompts/onboard.prompt.md +362 -0
- package/dist/templates/copilot/prompts/parallel.prompt.md +204 -0
- package/dist/templates/copilot/prompts/record-session.prompt.md +66 -0
- package/dist/templates/copilot/prompts/start.prompt.md +63 -0
- package/dist/templates/copilot/prompts/update-spec.prompt.md +358 -0
- package/dist/templates/cursor/agents/trellis-check.md +114 -0
- package/dist/templates/cursor/agents/trellis-implement.md +109 -0
- package/dist/templates/cursor/agents/trellis-research.md +136 -0
- package/dist/templates/cursor/hooks.json +24 -0
- package/dist/templates/cursor/index.d.ts +13 -0
- package/dist/templates/cursor/index.d.ts.map +1 -0
- package/dist/templates/cursor/index.js +13 -0
- package/dist/templates/cursor/index.js.map +1 -0
- package/dist/templates/droid/droids/trellis-check.md +107 -0
- package/dist/templates/droid/droids/trellis-implement.md +102 -0
- package/dist/templates/droid/droids/trellis-research.md +137 -0
- package/dist/templates/droid/index.d.ts +15 -0
- package/dist/templates/droid/index.d.ts.map +1 -0
- package/dist/templates/droid/index.js +15 -0
- package/dist/templates/droid/index.js.map +1 -0
- package/dist/templates/droid/settings.json +59 -0
- package/dist/templates/extract.d.ts +40 -0
- package/dist/templates/extract.d.ts.map +1 -0
- package/dist/templates/extract.js +106 -0
- package/dist/templates/extract.js.map +1 -0
- package/dist/templates/gemini/agents/trellis-check.md +107 -0
- package/dist/templates/gemini/agents/trellis-implement.md +102 -0
- package/dist/templates/gemini/agents/trellis-research.md +136 -0
- package/dist/templates/gemini/index.d.ts +13 -0
- package/dist/templates/gemini/index.d.ts.map +1 -0
- package/dist/templates/gemini/index.js +13 -0
- package/dist/templates/gemini/index.js.map +1 -0
- package/dist/templates/gemini/settings.json +28 -0
- package/dist/templates/kiro/agents/trellis-check.json +26 -0
- package/dist/templates/kiro/agents/trellis-implement.json +26 -0
- package/dist/templates/kiro/agents/trellis-research.json +30 -0
- package/dist/templates/kiro/index.d.ts +18 -0
- package/dist/templates/kiro/index.d.ts.map +1 -0
- package/dist/templates/kiro/index.js +18 -0
- package/dist/templates/kiro/index.js.map +1 -0
- package/dist/templates/markdown/agents.md +21 -0
- package/dist/templates/markdown/gitignore.txt +15 -0
- package/dist/templates/markdown/index.d.ts +27 -0
- package/dist/templates/markdown/index.d.ts.map +1 -0
- package/dist/templates/markdown/index.js +52 -0
- package/dist/templates/markdown/index.js.map +1 -0
- package/dist/templates/markdown/spec/backend/database-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/backend/directory-structure.md.txt +54 -0
- package/dist/templates/markdown/spec/backend/error-handling.md.txt +51 -0
- package/dist/templates/markdown/spec/backend/index.md.txt +38 -0
- package/dist/templates/markdown/spec/backend/logging-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/backend/quality-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/frontend/component-guidelines.md.txt +59 -0
- package/dist/templates/markdown/spec/frontend/directory-structure.md.txt +54 -0
- package/dist/templates/markdown/spec/frontend/hook-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/frontend/index.md.txt +39 -0
- package/dist/templates/markdown/spec/frontend/quality-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/frontend/state-management.md.txt +51 -0
- package/dist/templates/markdown/spec/frontend/type-safety.md.txt +51 -0
- package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md.txt +223 -0
- package/dist/templates/markdown/spec/guides/cross-layer-thinking-guide.md.txt +259 -0
- package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md.txt +595 -0
- package/dist/templates/markdown/spec/guides/index.md.txt +97 -0
- package/dist/templates/markdown/workspace-index.md +125 -0
- package/dist/templates/markdown/worktree.yaml.txt +58 -0
- package/dist/templates/opencode/agents/trellis-check.md +122 -0
- package/dist/templates/opencode/agents/trellis-implement.md +118 -0
- package/dist/templates/opencode/agents/trellis-research.md +145 -0
- package/dist/templates/opencode/lib/session-utils.js +521 -0
- package/dist/templates/opencode/lib/trellis-context.js +381 -0
- package/dist/templates/opencode/package.json +5 -0
- package/dist/templates/opencode/plugins/inject-subagent-context.js +513 -0
- package/dist/templates/opencode/plugins/inject-workflow-state.js +159 -0
- package/dist/templates/opencode/plugins/session-start.js +101 -0
- package/dist/templates/pi/agents/trellis-check.md +37 -0
- package/dist/templates/pi/agents/trellis-implement.md +42 -0
- package/dist/templates/pi/agents/trellis-research.md +25 -0
- package/dist/templates/pi/extensions/trellis/index.ts.txt +1174 -0
- package/dist/templates/pi/index.d.ts +5 -0
- package/dist/templates/pi/index.d.ts.map +1 -0
- package/dist/templates/pi/index.js +12 -0
- package/dist/templates/pi/index.js.map +1 -0
- package/dist/templates/pi/settings.json +21 -0
- package/dist/templates/qoder/agents/trellis-check.md +108 -0
- package/dist/templates/qoder/agents/trellis-implement.md +103 -0
- package/dist/templates/qoder/agents/trellis-research.md +137 -0
- package/dist/templates/qoder/index.d.ts +15 -0
- package/dist/templates/qoder/index.d.ts.map +1 -0
- package/dist/templates/qoder/index.js +15 -0
- package/dist/templates/qoder/index.js.map +1 -0
- package/dist/templates/qoder/settings.json +47 -0
- package/dist/templates/shared-hooks/index.d.ts +50 -0
- package/dist/templates/shared-hooks/index.d.ts.map +1 -0
- package/dist/templates/shared-hooks/index.js +88 -0
- package/dist/templates/shared-hooks/index.js.map +1 -0
- package/dist/templates/shared-hooks/inject-shell-session-context.py +183 -0
- package/dist/templates/shared-hooks/inject-subagent-context.py +771 -0
- package/dist/templates/shared-hooks/inject-workflow-state.py +363 -0
- package/dist/templates/shared-hooks/session-start.py +832 -0
- package/dist/templates/template-utils.d.ts +26 -0
- package/dist/templates/template-utils.d.ts.map +1 -0
- package/dist/templates/template-utils.js +60 -0
- package/dist/templates/template-utils.js.map +1 -0
- package/dist/templates/trellis/config.yaml +90 -0
- package/dist/templates/trellis/gitignore.txt +32 -0
- package/dist/templates/trellis/index.d.ts +52 -0
- package/dist/templates/trellis/index.d.ts.map +1 -0
- package/dist/templates/trellis/index.js +97 -0
- package/dist/templates/trellis/index.js.map +1 -0
- package/dist/templates/trellis/scripts/__init__.py +5 -0
- package/dist/templates/trellis/scripts/add_session.py +547 -0
- package/dist/templates/trellis/scripts/common/__init__.py +92 -0
- package/dist/templates/trellis/scripts/common/active_task.py +626 -0
- package/dist/templates/trellis/scripts/common/cli_adapter.py +811 -0
- package/dist/templates/trellis/scripts/common/config.py +445 -0
- package/dist/templates/trellis/scripts/common/developer.py +190 -0
- package/dist/templates/trellis/scripts/common/git.py +31 -0
- package/dist/templates/trellis/scripts/common/git_context.py +106 -0
- package/dist/templates/trellis/scripts/common/io.py +37 -0
- package/dist/templates/trellis/scripts/common/log.py +45 -0
- package/dist/templates/trellis/scripts/common/packages_context.py +238 -0
- package/dist/templates/trellis/scripts/common/paths.py +447 -0
- package/dist/templates/trellis/scripts/common/safe_commit.py +285 -0
- package/dist/templates/trellis/scripts/common/session_context.py +821 -0
- package/dist/templates/trellis/scripts/common/task_context.py +223 -0
- package/dist/templates/trellis/scripts/common/task_queue.py +188 -0
- package/dist/templates/trellis/scripts/common/task_store.py +698 -0
- package/dist/templates/trellis/scripts/common/task_utils.py +274 -0
- package/dist/templates/trellis/scripts/common/tasks.py +112 -0
- package/dist/templates/trellis/scripts/common/trellis_config.py +131 -0
- package/dist/templates/trellis/scripts/common/types.py +110 -0
- package/dist/templates/trellis/scripts/common/workflow_phase.py +212 -0
- package/dist/templates/trellis/scripts/get_context.py +16 -0
- package/dist/templates/trellis/scripts/get_developer.py +26 -0
- package/dist/templates/trellis/scripts/hooks/linear_sync.py +243 -0
- package/dist/templates/trellis/scripts/init_developer.py +51 -0
- package/dist/templates/trellis/scripts/task.py +500 -0
- package/dist/templates/trellis/tasks/.gitkeep +0 -0
- package/dist/templates/trellis/workflow.md +750 -0
- package/dist/types/ai-tools.d.ts +95 -0
- package/dist/types/ai-tools.d.ts.map +1 -0
- package/dist/types/ai-tools.js +280 -0
- package/dist/types/ai-tools.js.map +1 -0
- package/dist/types/migration.d.ts +125 -0
- package/dist/types/migration.d.ts.map +1 -0
- package/dist/types/migration.js +8 -0
- package/dist/types/migration.js.map +1 -0
- package/dist/utils/compare-versions.d.ts +12 -0
- package/dist/utils/compare-versions.d.ts.map +1 -0
- package/dist/utils/compare-versions.js +86 -0
- package/dist/utils/compare-versions.js.map +1 -0
- package/dist/utils/cwd-guard.d.ts +38 -0
- package/dist/utils/cwd-guard.d.ts.map +1 -0
- package/dist/utils/cwd-guard.js +62 -0
- package/dist/utils/cwd-guard.js.map +1 -0
- package/dist/utils/file-writer.d.ts +36 -0
- package/dist/utils/file-writer.d.ts.map +1 -0
- package/dist/utils/file-writer.js +203 -0
- package/dist/utils/file-writer.js.map +1 -0
- package/dist/utils/manifest-prune.d.ts +61 -0
- package/dist/utils/manifest-prune.d.ts.map +1 -0
- package/dist/utils/manifest-prune.js +136 -0
- package/dist/utils/manifest-prune.js.map +1 -0
- package/dist/utils/posix.d.ts +13 -0
- package/dist/utils/posix.d.ts.map +1 -0
- package/dist/utils/posix.js +15 -0
- package/dist/utils/posix.js.map +1 -0
- package/dist/utils/project-detector.d.ts +46 -0
- package/dist/utils/project-detector.d.ts.map +1 -0
- package/dist/utils/project-detector.js +666 -0
- package/dist/utils/project-detector.js.map +1 -0
- package/dist/utils/proxy.d.ts +25 -0
- package/dist/utils/proxy.d.ts.map +1 -0
- package/dist/utils/proxy.js +60 -0
- package/dist/utils/proxy.js.map +1 -0
- package/dist/utils/task-json.d.ts +13 -0
- package/dist/utils/task-json.d.ts.map +1 -0
- package/dist/utils/task-json.js +12 -0
- package/dist/utils/task-json.js.map +1 -0
- package/dist/utils/template-fetcher.d.ts +150 -0
- package/dist/utils/template-fetcher.d.ts.map +1 -0
- package/dist/utils/template-fetcher.js +907 -0
- package/dist/utils/template-fetcher.js.map +1 -0
- package/dist/utils/template-hash.d.ts +123 -0
- package/dist/utils/template-hash.d.ts.map +1 -0
- package/dist/utils/template-hash.js +334 -0
- package/dist/utils/template-hash.js.map +1 -0
- package/dist/utils/uninstall-scrubbers.d.ts +66 -0
- package/dist/utils/uninstall-scrubbers.d.ts.map +1 -0
- package/dist/utils/uninstall-scrubbers.js +342 -0
- package/dist/utils/uninstall-scrubbers.js.map +1 -0
- package/dist/utils/workflow-resolver.d.ts +86 -0
- package/dist/utils/workflow-resolver.d.ts.map +1 -0
- package/dist/utils/workflow-resolver.js +265 -0
- package/dist/utils/workflow-resolver.js.map +1 -0
- package/package.json +90 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inbox watcher: tails events.jsonl for `kind:message` events addressed
|
|
3
|
+
* to this worker and forwards them into the worker's stdin via the
|
|
4
|
+
* adapter's `encodeUserMessage`. A persisted cursor file keeps respawns
|
|
5
|
+
* from replaying messages the previous supervisor already delivered.
|
|
6
|
+
*
|
|
7
|
+
* Step 3 of the supervisor refactor: pulled out of supervisor.ts so the
|
|
8
|
+
* orchestrator only needs to call `runInboxWatcher(...)`. Cursor
|
|
9
|
+
* read/write helpers stay private to this module.
|
|
10
|
+
*/
|
|
11
|
+
import fs from "node:fs";
|
|
12
|
+
import { DEFAULT_INBOX_POLICY, matchesInboxPolicy, } from "trellis-he-core/channel";
|
|
13
|
+
import { appendEvent } from "../store/events.js";
|
|
14
|
+
import { workerFile } from "../store/paths.js";
|
|
15
|
+
import { watchEvents } from "../store/watch.js";
|
|
16
|
+
export async function runInboxWatcher(args) {
|
|
17
|
+
const { channelName, workerName, adapter, ctx, child, signal } = args;
|
|
18
|
+
const inboxPolicy = args.inboxPolicy ?? DEFAULT_INBOX_POLICY;
|
|
19
|
+
// Resume from persisted cursor: first-time spawn → 0 (read full backlog);
|
|
20
|
+
// respawn after kill → last forwarded seq (no replay).
|
|
21
|
+
let cursor = readInboxCursor(channelName, workerName);
|
|
22
|
+
for await (const ev of watchEvents(channelName, {
|
|
23
|
+
self: workerName, // ignore our own events
|
|
24
|
+
to: workerName, // explicit-to-other is filtered here; broadcasts pass
|
|
25
|
+
kind: "message",
|
|
26
|
+
},
|
|
27
|
+
// First run with cursor=0 reads backlog from start; subsequent runs
|
|
28
|
+
// use sinceSeq to skip already-processed events. Both cases tail
|
|
29
|
+
// future events normally.
|
|
30
|
+
{ signal, sinceSeq: cursor, fromStart: cursor === 0 ? true : undefined })) {
|
|
31
|
+
if (signal.aborted)
|
|
32
|
+
return;
|
|
33
|
+
// Core decides delivery from the worker's inbox policy: explicitOnly
|
|
34
|
+
// (default) consumes only targeted messages; broadcastAndExplicit
|
|
35
|
+
// also consumes broadcasts.
|
|
36
|
+
if (!matchesInboxPolicy(ev, workerName, inboxPolicy))
|
|
37
|
+
continue;
|
|
38
|
+
const text = (ev.text ?? "").trim();
|
|
39
|
+
if (!text)
|
|
40
|
+
continue;
|
|
41
|
+
const tag = ev.tag;
|
|
42
|
+
// Block until the adapter says it can accept input (e.g. codex
|
|
43
|
+
// thread/start has produced a threadId). Drop the message if we
|
|
44
|
+
// never get ready before being aborted.
|
|
45
|
+
if (!adapter.isReady(ctx)) {
|
|
46
|
+
const deadline = Date.now() + 60_000;
|
|
47
|
+
while (!adapter.isReady(ctx) &&
|
|
48
|
+
Date.now() < deadline &&
|
|
49
|
+
!signal.aborted) {
|
|
50
|
+
await sleep(25);
|
|
51
|
+
}
|
|
52
|
+
if (!adapter.isReady(ctx)) {
|
|
53
|
+
// never became ready; advance the cursor anyway so we don't
|
|
54
|
+
// re-attempt this exact event on next start.
|
|
55
|
+
cursor = ev.seq;
|
|
56
|
+
writeInboxCursor(channelName, workerName, cursor);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (tag !== "interrupt") {
|
|
61
|
+
await waitForActiveTurnToFinish(args.turnTracker, signal);
|
|
62
|
+
if (signal.aborted)
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (tag === "interrupt") {
|
|
66
|
+
await appendEvent(channelName, {
|
|
67
|
+
kind: "interrupt_requested",
|
|
68
|
+
by: ev.by,
|
|
69
|
+
worker: workerName,
|
|
70
|
+
reason: "user",
|
|
71
|
+
message: text,
|
|
72
|
+
});
|
|
73
|
+
const aborted = args.turnTracker?.abortCurrent();
|
|
74
|
+
if (aborted) {
|
|
75
|
+
await appendEvent(channelName, {
|
|
76
|
+
kind: "turn_finished",
|
|
77
|
+
by: workerName,
|
|
78
|
+
worker: workerName,
|
|
79
|
+
inputSeq: aborted.inputSeq,
|
|
80
|
+
turnId: aborted.turnId,
|
|
81
|
+
outcome: "aborted",
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
await appendEvent(channelName, {
|
|
85
|
+
kind: "interrupted",
|
|
86
|
+
by: workerName,
|
|
87
|
+
worker: workerName,
|
|
88
|
+
...(aborted?.turnId ? { turnId: aborted.turnId } : {}),
|
|
89
|
+
reason: "user",
|
|
90
|
+
method: "stdin",
|
|
91
|
+
outcome: aborted ? "interrupted" : "no-active-turn",
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
let turn = args.turnTracker?.begin(ev.seq);
|
|
95
|
+
try {
|
|
96
|
+
if (turn) {
|
|
97
|
+
await appendEvent(channelName, {
|
|
98
|
+
kind: "turn_started",
|
|
99
|
+
by: workerName,
|
|
100
|
+
worker: workerName,
|
|
101
|
+
inputSeq: ev.seq,
|
|
102
|
+
turnId: turn.turnId,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
child.stdin.write(adapter.encodeUserMessage(text, tag, ctx));
|
|
106
|
+
cursor = ev.seq;
|
|
107
|
+
writeInboxCursor(channelName, workerName, cursor);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
if (turn) {
|
|
111
|
+
args.turnTracker?.finish();
|
|
112
|
+
await appendEvent(channelName, {
|
|
113
|
+
kind: "turn_finished",
|
|
114
|
+
by: workerName,
|
|
115
|
+
worker: workerName,
|
|
116
|
+
inputSeq: turn.inputSeq,
|
|
117
|
+
turnId: turn.turnId,
|
|
118
|
+
outcome: "aborted",
|
|
119
|
+
}).catch(() => undefined);
|
|
120
|
+
turn = undefined;
|
|
121
|
+
}
|
|
122
|
+
// stdin closed, worker exiting — bail out
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Per-worker inbox consumption cursor. Persisted to
|
|
129
|
+
* `<worker>.inbox-cursor` so a respawn (same worker name) doesn't replay
|
|
130
|
+
* messages that the previous supervisor already forwarded into the worker
|
|
131
|
+
* process. The cursor is the highest seq we've already turned into a
|
|
132
|
+
* worker stdin write.
|
|
133
|
+
*/
|
|
134
|
+
function readInboxCursor(channelName, workerName) {
|
|
135
|
+
try {
|
|
136
|
+
const raw = fs.readFileSync(workerFile(channelName, workerName, "inbox-cursor"), "utf-8");
|
|
137
|
+
const n = Number(raw.trim());
|
|
138
|
+
return Number.isFinite(n) && n > 0 ? n : 0;
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
return 0;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
function writeInboxCursor(channelName, workerName, seq) {
|
|
145
|
+
try {
|
|
146
|
+
fs.writeFileSync(workerFile(channelName, workerName, "inbox-cursor"), String(seq), "utf-8");
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
// ignore — cursor is best-effort; worst case we replay a message
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function sleep(ms) {
|
|
153
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
154
|
+
}
|
|
155
|
+
async function waitForActiveTurnToFinish(turnTracker, signal) {
|
|
156
|
+
while (turnTracker?.current() && !signal.aborted) {
|
|
157
|
+
await sleep(25);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=inbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../../../src/commands/channel/supervisor/inbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ShutdownController — the single funnel for every "this worker is going
|
|
3
|
+
* away" trigger (explicit kill, timeout, post-spawn crash, signal, child
|
|
4
|
+
* exit). It owns:
|
|
5
|
+
*
|
|
6
|
+
* - the `shutdownReason` flag (idempotent — first call wins)
|
|
7
|
+
* - the SIGTERM → grace → SIGKILL ladder
|
|
8
|
+
* - the trailing `killed` event append
|
|
9
|
+
* - a `terminalEmitted` flag tracking adapter-emitted done/error
|
|
10
|
+
* - `finalizeOnExit` — synthesises a fallback `done`/`error` when the
|
|
11
|
+
* worker exited without the adapter sending one (otherwise
|
|
12
|
+
* `wait --kind done` would hang forever)
|
|
13
|
+
* - `awaitFinalize` — lets `child.on("exit")` block process.exit until
|
|
14
|
+
* any in-progress killed-append from a concurrent shutdown completes
|
|
15
|
+
*
|
|
16
|
+
* Step 2 of the supervisor refactor: this absorbs the 5 reviewer issues
|
|
17
|
+
* (codex #1 crashed-without-done, #2 fire-and-forget shutdown, #3 spawn
|
|
18
|
+
* after shutdown requested, #4 handshake error detail; claude M2 post-
|
|
19
|
+
* spawn error ordering, L1 pre-spawn double-fire guard) into a single
|
|
20
|
+
* state machine. The supervisor.ts orchestrator stays mostly mechanical.
|
|
21
|
+
*/
|
|
22
|
+
import type { ChildProcessByStdio } from "node:child_process";
|
|
23
|
+
import type { Readable, Writable } from "node:stream";
|
|
24
|
+
type Child = ChildProcessByStdio<Writable, Readable, Readable>;
|
|
25
|
+
export type ShutdownReason = "explicit-kill" | "timeout" | "crash";
|
|
26
|
+
export interface ShutdownController {
|
|
27
|
+
/** Idempotent: only the first call wins. Returns the killed-append
|
|
28
|
+
* promise so callers can await ordering if they need to. */
|
|
29
|
+
request(signal: NodeJS.Signals, reason: ShutdownReason): Promise<void>;
|
|
30
|
+
/** Synchronously mark shutdown intent without starting the kill
|
|
31
|
+
* ladder or appending `killed`. Use when other code must see
|
|
32
|
+
* `isShuttingDown=true` BEFORE the caller proceeds to any await
|
|
33
|
+
* (e.g. post-spawn error handler that needs to `await appendEvent`
|
|
34
|
+
* first, but doesn't want the main flow to keep writing `spawned`).
|
|
35
|
+
* Returns true if this call claimed the flag, false if already set. */
|
|
36
|
+
claim(reason: ShutdownReason): boolean;
|
|
37
|
+
isShuttingDown(): boolean;
|
|
38
|
+
reason(): ShutdownReason | null;
|
|
39
|
+
/** Mark that the adapter has produced a `done` or `error` event, so
|
|
40
|
+
* `finalizeOnExit` won't synthesise a fallback. */
|
|
41
|
+
markTerminalEmitted(): void;
|
|
42
|
+
hasTerminalEvent(): boolean;
|
|
43
|
+
/** Call from `child.on("exit")` — synthesises a fallback terminal
|
|
44
|
+
* event if the adapter never produced one, then awaits any pending
|
|
45
|
+
* `request()` so `killed` lands before the supervisor exits. */
|
|
46
|
+
finalizeOnExit(code: number | null, signal: NodeJS.Signals | null): Promise<void>;
|
|
47
|
+
/** Promise that resolves when the current (or last) `request()` has
|
|
48
|
+
* finished writing its `killed` event. No-op when never requested. */
|
|
49
|
+
awaitFinalize(): Promise<void>;
|
|
50
|
+
}
|
|
51
|
+
export interface CreateShutdownArgs {
|
|
52
|
+
channelName: string;
|
|
53
|
+
workerName: string;
|
|
54
|
+
log: {
|
|
55
|
+
write: (data: string) => void;
|
|
56
|
+
};
|
|
57
|
+
/** Lazy child getter — the controller is created before `spawn()`
|
|
58
|
+
* returns, so we read the child handle at shutdown time. */
|
|
59
|
+
getChild: () => Child;
|
|
60
|
+
graceMs: number;
|
|
61
|
+
/** Recorded on the `killed` event for the timeout reason. */
|
|
62
|
+
timeoutMs?: number;
|
|
63
|
+
}
|
|
64
|
+
export declare function createShutdown(args: CreateShutdownArgs): ShutdownController;
|
|
65
|
+
export {};
|
|
66
|
+
//# sourceMappingURL=shutdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shutdown.d.ts","sourceRoot":"","sources":["../../../../src/commands/channel/supervisor/shutdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAItD,KAAK,KAAK,GAAG,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAE/D,MAAM,MAAM,cAAc,GAAG,eAAe,GAAG,SAAS,GAAG,OAAO,CAAC;AAEnE,MAAM,WAAW,kBAAkB;IACjC;iEAC6D;IAC7D,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE;;;;;4EAKwE;IACxE,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC;IACvC,cAAc,IAAI,OAAO,CAAC;IAC1B,MAAM,IAAI,cAAc,GAAG,IAAI,CAAC;IAEhC;wDACoD;IACpD,mBAAmB,IAAI,IAAI,CAAC;IAC5B,gBAAgB,IAAI,OAAO,CAAC;IAE5B;;qEAEiE;IACjE,cAAc,CACZ,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,GAC5B,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;2EACuE;IACvE,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE;QAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;IACvC;iEAC6D;IAC7D,QAAQ,EAAE,MAAM,KAAK,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,kBAAkB,CAuI3E"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ShutdownController — the single funnel for every "this worker is going
|
|
3
|
+
* away" trigger (explicit kill, timeout, post-spawn crash, signal, child
|
|
4
|
+
* exit). It owns:
|
|
5
|
+
*
|
|
6
|
+
* - the `shutdownReason` flag (idempotent — first call wins)
|
|
7
|
+
* - the SIGTERM → grace → SIGKILL ladder
|
|
8
|
+
* - the trailing `killed` event append
|
|
9
|
+
* - a `terminalEmitted` flag tracking adapter-emitted done/error
|
|
10
|
+
* - `finalizeOnExit` — synthesises a fallback `done`/`error` when the
|
|
11
|
+
* worker exited without the adapter sending one (otherwise
|
|
12
|
+
* `wait --kind done` would hang forever)
|
|
13
|
+
* - `awaitFinalize` — lets `child.on("exit")` block process.exit until
|
|
14
|
+
* any in-progress killed-append from a concurrent shutdown completes
|
|
15
|
+
*
|
|
16
|
+
* Step 2 of the supervisor refactor: this absorbs the 5 reviewer issues
|
|
17
|
+
* (codex #1 crashed-without-done, #2 fire-and-forget shutdown, #3 spawn
|
|
18
|
+
* after shutdown requested, #4 handshake error detail; claude M2 post-
|
|
19
|
+
* spawn error ordering, L1 pre-spawn double-fire guard) into a single
|
|
20
|
+
* state machine. The supervisor.ts orchestrator stays mostly mechanical.
|
|
21
|
+
*/
|
|
22
|
+
import { appendEvent } from "../store/events.js";
|
|
23
|
+
export function createShutdown(args) {
|
|
24
|
+
const { channelName, workerName, log, getChild, graceMs, timeoutMs } = args;
|
|
25
|
+
let shutdownReason = null;
|
|
26
|
+
let requestSignal = null;
|
|
27
|
+
let terminalEmitted = false;
|
|
28
|
+
let killedPromise = null;
|
|
29
|
+
const childStillRunning = (child) => child.exitCode === null && child.signalCode === null;
|
|
30
|
+
const startKillLadder = (child) => {
|
|
31
|
+
try {
|
|
32
|
+
child.stdin.end();
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// already closed
|
|
36
|
+
}
|
|
37
|
+
setTimeout(() => {
|
|
38
|
+
if (childStillRunning(child)) {
|
|
39
|
+
log.write(`[supervisor] grace expired, SIGTERM worker\n`);
|
|
40
|
+
try {
|
|
41
|
+
child.kill("SIGTERM");
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// already dead
|
|
45
|
+
}
|
|
46
|
+
setTimeout(() => {
|
|
47
|
+
if (childStillRunning(child)) {
|
|
48
|
+
log.write(`[supervisor] still alive, SIGKILL worker\n`);
|
|
49
|
+
try {
|
|
50
|
+
child.kill("SIGKILL");
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// already dead
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}, graceMs);
|
|
57
|
+
}
|
|
58
|
+
}, graceMs);
|
|
59
|
+
};
|
|
60
|
+
const writeKilled = async (reason, signal) => {
|
|
61
|
+
await appendEvent(channelName, {
|
|
62
|
+
kind: "killed",
|
|
63
|
+
by: `supervisor:${workerName}`,
|
|
64
|
+
reason,
|
|
65
|
+
signal,
|
|
66
|
+
...(reason === "timeout" && timeoutMs ? { timeout_ms: timeoutMs } : {}),
|
|
67
|
+
});
|
|
68
|
+
};
|
|
69
|
+
const claim = (reason) => {
|
|
70
|
+
if (shutdownReason)
|
|
71
|
+
return false;
|
|
72
|
+
shutdownReason = reason;
|
|
73
|
+
return true;
|
|
74
|
+
};
|
|
75
|
+
const request = async (signal, reason) => {
|
|
76
|
+
// The kill ladder + killed-append are one-shot; whether we got here
|
|
77
|
+
// via `claim()` + `request()` (post-spawn error) or a single
|
|
78
|
+
// `request()` (signal / timeout), only run them once.
|
|
79
|
+
if (killedPromise) {
|
|
80
|
+
await killedPromise.catch(() => undefined);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
shutdownReason ??= reason;
|
|
84
|
+
requestSignal ??= signal;
|
|
85
|
+
log.write(`[supervisor] shutting down worker (reason=${shutdownReason}, signal=${requestSignal})\n`);
|
|
86
|
+
startKillLadder(getChild());
|
|
87
|
+
killedPromise = writeKilled(shutdownReason, requestSignal);
|
|
88
|
+
await killedPromise;
|
|
89
|
+
};
|
|
90
|
+
const finalizeOnExit = async (code, signal) => {
|
|
91
|
+
log.write(`[supervisor] worker exit code=${code ?? "null"} signal=${signal ?? "null"}\n`);
|
|
92
|
+
// #1 fix: synthesise a terminal event so consumers blocked on
|
|
93
|
+
// `wait --kind done` don't hang when the adapter never produced
|
|
94
|
+
// one. Only applies to COLD exits (no explicit shutdown requested);
|
|
95
|
+
// when shutdown was requested the `killed` event already serves as
|
|
96
|
+
// the terminal signal and a synthesised error would just duplicate.
|
|
97
|
+
//
|
|
98
|
+
// The flag is claimed SYNCHRONOUSLY before the await so two
|
|
99
|
+
// concurrent `finalizeOnExit` calls (or `applyParseResult` racing
|
|
100
|
+
// with `child.on("exit")`) can't both pass the guard and emit
|
|
101
|
+
// duplicate synthetic events. `by` is the worker name (not
|
|
102
|
+
// `supervisor:<name>`) so `wait --from <worker> --kind done` wakes
|
|
103
|
+
// for the synthesised event same as for an adapter-emitted one.
|
|
104
|
+
if (!terminalEmitted && shutdownReason === null) {
|
|
105
|
+
terminalEmitted = true;
|
|
106
|
+
if (code === 0) {
|
|
107
|
+
await appendEvent(channelName, {
|
|
108
|
+
kind: "done",
|
|
109
|
+
by: workerName,
|
|
110
|
+
synthesized: true,
|
|
111
|
+
exit_code: code,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
await appendEvent(channelName, {
|
|
116
|
+
kind: "error",
|
|
117
|
+
by: workerName,
|
|
118
|
+
message: `worker exited without terminal event (code=${code ?? "null"}, signal=${signal ?? "null"})`,
|
|
119
|
+
synthesized: true,
|
|
120
|
+
exit_code: code,
|
|
121
|
+
exit_signal: signal,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// #2 fix: wait for any in-progress `killed` append from a concurrent
|
|
126
|
+
// shutdown request so it lands before the supervisor exits.
|
|
127
|
+
if (killedPromise)
|
|
128
|
+
await killedPromise.catch(() => undefined);
|
|
129
|
+
};
|
|
130
|
+
return {
|
|
131
|
+
request,
|
|
132
|
+
claim,
|
|
133
|
+
isShuttingDown: () => shutdownReason !== null,
|
|
134
|
+
reason: () => shutdownReason,
|
|
135
|
+
markTerminalEmitted: () => {
|
|
136
|
+
terminalEmitted = true;
|
|
137
|
+
},
|
|
138
|
+
hasTerminalEvent: () => terminalEmitted,
|
|
139
|
+
finalizeOnExit,
|
|
140
|
+
awaitFinalize: () => killedPromise ?? Promise.resolve(),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=shutdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shutdown.js","sourceRoot":"","sources":["../../../../src/commands/channel/supervisor/shutdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stdout pipeline: line-buffered reader → adapter.parseLine → append
|
|
3
|
+
* events into events.jsonl + persist session/thread IDs + write any
|
|
4
|
+
* adapter `reply` back to the worker's stdin.
|
|
5
|
+
*
|
|
6
|
+
* Step 3 of the supervisor refactor: pulled out of supervisor.ts so the
|
|
7
|
+
* orchestrator stays thin. The pump itself is pure (no fs / process), so
|
|
8
|
+
* unit testing the line-splitting logic is straightforward once we want
|
|
9
|
+
* to. `applyParseResult` still touches fs for session-id persistence —
|
|
10
|
+
* that's intentional, it's the only place that needs to.
|
|
11
|
+
*/
|
|
12
|
+
import type { ChildProcessByStdio } from "node:child_process";
|
|
13
|
+
import type { Readable, Writable } from "node:stream";
|
|
14
|
+
import type { WorkerAdapter } from "../adapters/index.js";
|
|
15
|
+
import type { ParseResult } from "../adapters/types.js";
|
|
16
|
+
import type { ShutdownController } from "./shutdown.js";
|
|
17
|
+
import type { TurnTracker } from "./turns.js";
|
|
18
|
+
type Child = ChildProcessByStdio<Writable, Readable, Readable>;
|
|
19
|
+
/**
|
|
20
|
+
* Line-buffered stdout pump. Yields each non-empty line to `onLine` as
|
|
21
|
+
* soon as a newline arrives, wraps the handler in a `.catch` so a thrown
|
|
22
|
+
* await doesn't escape as `unhandledRejection`, and reports the failure
|
|
23
|
+
* through `onError` for observability.
|
|
24
|
+
*/
|
|
25
|
+
export declare function pumpStdout(stream: Readable, onLine: (line: string) => Promise<void> | void, onError?: (err: Error) => void): void;
|
|
26
|
+
/**
|
|
27
|
+
* Translate an adapter `ParseResult` into channel events + adapter-level
|
|
28
|
+
* side-effects (session-id persistence, stdin writes). Also tells the
|
|
29
|
+
* shutdown controller when the adapter emits a `done`/`error` so the
|
|
30
|
+
* fallback synthesiser in `finalizeOnExit` doesn't duplicate.
|
|
31
|
+
*/
|
|
32
|
+
export declare function applyParseResult(channelName: string, workerName: string, result: ParseResult, child: Child, shutdown: ShutdownController, turnTracker?: TurnTracker): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Convenience wrapper: wire `pumpStdout` to `applyParseResult` with
|
|
35
|
+
* standard error-event-on-failure handling. The orchestrator just calls
|
|
36
|
+
* this and forgets about line buffering / parse plumbing.
|
|
37
|
+
*/
|
|
38
|
+
export declare function startStdoutPump(args: {
|
|
39
|
+
channelName: string;
|
|
40
|
+
workerName: string;
|
|
41
|
+
child: Child;
|
|
42
|
+
adapter: WorkerAdapter;
|
|
43
|
+
adapterCtx: unknown;
|
|
44
|
+
log: {
|
|
45
|
+
write: (data: string) => void;
|
|
46
|
+
};
|
|
47
|
+
shutdown: ShutdownController;
|
|
48
|
+
turnTracker?: TurnTracker;
|
|
49
|
+
}): void;
|
|
50
|
+
export {};
|
|
51
|
+
//# sourceMappingURL=stdout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdout.d.ts","sourceRoot":"","sources":["../../../../src/commands/channel/supervisor/stdout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,YAAY,CAAC;AAE3D,KAAK,KAAK,GAAG,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAE/D;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,EAC9C,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,GAC7B,IAAI,CAuBN;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,kBAAkB,EAC5B,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,IAAI,CAAC,CAqDf;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,GAAG,EAAE;QAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;IACvC,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B,GAAG,IAAI,CAkCP"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stdout pipeline: line-buffered reader → adapter.parseLine → append
|
|
3
|
+
* events into events.jsonl + persist session/thread IDs + write any
|
|
4
|
+
* adapter `reply` back to the worker's stdin.
|
|
5
|
+
*
|
|
6
|
+
* Step 3 of the supervisor refactor: pulled out of supervisor.ts so the
|
|
7
|
+
* orchestrator stays thin. The pump itself is pure (no fs / process), so
|
|
8
|
+
* unit testing the line-splitting logic is straightforward once we want
|
|
9
|
+
* to. `applyParseResult` still touches fs for session-id persistence —
|
|
10
|
+
* that's intentional, it's the only place that needs to.
|
|
11
|
+
*/
|
|
12
|
+
import fs from "node:fs";
|
|
13
|
+
import { appendEvent } from "../store/events.js";
|
|
14
|
+
import { workerFile } from "../store/paths.js";
|
|
15
|
+
/**
|
|
16
|
+
* Line-buffered stdout pump. Yields each non-empty line to `onLine` as
|
|
17
|
+
* soon as a newline arrives, wraps the handler in a `.catch` so a thrown
|
|
18
|
+
* await doesn't escape as `unhandledRejection`, and reports the failure
|
|
19
|
+
* through `onError` for observability.
|
|
20
|
+
*/
|
|
21
|
+
export function pumpStdout(stream, onLine, onError) {
|
|
22
|
+
let buf = "";
|
|
23
|
+
stream.on("data", (chunk) => {
|
|
24
|
+
buf += chunk.toString("utf-8");
|
|
25
|
+
let nl;
|
|
26
|
+
while ((nl = buf.indexOf("\n")) !== -1) {
|
|
27
|
+
const line = buf.slice(0, nl);
|
|
28
|
+
buf = buf.slice(nl + 1);
|
|
29
|
+
if (line.trim()) {
|
|
30
|
+
Promise.resolve()
|
|
31
|
+
.then(() => onLine(line))
|
|
32
|
+
.catch((err) => {
|
|
33
|
+
if (onError) {
|
|
34
|
+
try {
|
|
35
|
+
onError(err instanceof Error ? err : new Error(String(err)));
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// swallow handler-of-handler errors
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Translate an adapter `ParseResult` into channel events + adapter-level
|
|
48
|
+
* side-effects (session-id persistence, stdin writes). Also tells the
|
|
49
|
+
* shutdown controller when the adapter emits a `done`/`error` so the
|
|
50
|
+
* fallback synthesiser in `finalizeOnExit` doesn't duplicate.
|
|
51
|
+
*/
|
|
52
|
+
export async function applyParseResult(channelName, workerName, result, child, shutdown, turnTracker) {
|
|
53
|
+
for (const ev of result.events) {
|
|
54
|
+
// Claim the terminal slot SYNCHRONOUSLY before the await so a
|
|
55
|
+
// racing `child.on("exit") → finalizeOnExit` can't see
|
|
56
|
+
// `terminalEmitted=false` and synthesise a duplicate fallback while
|
|
57
|
+
// we're in the middle of writing the real terminal event.
|
|
58
|
+
if (ev.kind === "done" || ev.kind === "error") {
|
|
59
|
+
shutdown.markTerminalEmitted();
|
|
60
|
+
}
|
|
61
|
+
await appendEvent(channelName, {
|
|
62
|
+
kind: ev.kind,
|
|
63
|
+
by: workerName,
|
|
64
|
+
...(ev.payload ?? {}),
|
|
65
|
+
});
|
|
66
|
+
if (ev.kind === "done" || ev.kind === "error") {
|
|
67
|
+
const turn = turnTracker?.finish();
|
|
68
|
+
if (turn) {
|
|
69
|
+
const outcome = ev.kind === "done" ? "done" : "error";
|
|
70
|
+
await appendEvent(channelName, {
|
|
71
|
+
kind: "turn_finished",
|
|
72
|
+
by: workerName,
|
|
73
|
+
worker: workerName,
|
|
74
|
+
inputSeq: turn.inputSeq,
|
|
75
|
+
turnId: turn.turnId,
|
|
76
|
+
outcome,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (result.side) {
|
|
82
|
+
const { reply, persistSessionId, persistThreadId } = result.side;
|
|
83
|
+
if (persistSessionId) {
|
|
84
|
+
fs.writeFileSync(workerFile(channelName, workerName, "session-id"), persistSessionId);
|
|
85
|
+
}
|
|
86
|
+
if (persistThreadId) {
|
|
87
|
+
fs.writeFileSync(workerFile(channelName, workerName, "thread-id"), persistThreadId);
|
|
88
|
+
}
|
|
89
|
+
if (reply) {
|
|
90
|
+
for (const r of reply) {
|
|
91
|
+
try {
|
|
92
|
+
child.stdin.write(r);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// worker stdin closed — supervisor will exit soon
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Convenience wrapper: wire `pumpStdout` to `applyParseResult` with
|
|
103
|
+
* standard error-event-on-failure handling. The orchestrator just calls
|
|
104
|
+
* this and forgets about line buffering / parse plumbing.
|
|
105
|
+
*/
|
|
106
|
+
export function startStdoutPump(args) {
|
|
107
|
+
const { channelName, workerName, child, adapter, adapterCtx, log, shutdown, turnTracker, } = args;
|
|
108
|
+
pumpStdout(child.stdout, async (line) => {
|
|
109
|
+
log.write(line + "\n");
|
|
110
|
+
const result = adapter.parseLine(line, adapterCtx);
|
|
111
|
+
await applyParseResult(channelName, workerName, result, child, shutdown, turnTracker);
|
|
112
|
+
}, (err) => {
|
|
113
|
+
log.write(`[supervisor] stdout line handler failed: ${err.message}\n`);
|
|
114
|
+
void appendEvent(channelName, {
|
|
115
|
+
kind: "error",
|
|
116
|
+
by: `supervisor:${workerName}`,
|
|
117
|
+
message: `stdout pipeline error: ${err.message}`,
|
|
118
|
+
}).catch(() => undefined);
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=stdout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdout.js","sourceRoot":"","sources":["../../../../src/commands/channel/supervisor/stdout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface ActiveTurn {
|
|
2
|
+
inputSeq: number;
|
|
3
|
+
turnId: string;
|
|
4
|
+
}
|
|
5
|
+
export type TurnOutcome = "done" | "error" | "aborted";
|
|
6
|
+
/**
|
|
7
|
+
* Host-local turn tracker for one supervisor process.
|
|
8
|
+
*
|
|
9
|
+
* The durable SOT is events.jsonl. This object only remembers the input
|
|
10
|
+
* message seq long enough for the inbox watcher and stdout pump to emit
|
|
11
|
+
* matching `turn_started` / `turn_finished` events.
|
|
12
|
+
*/
|
|
13
|
+
export declare class TurnTracker {
|
|
14
|
+
#private;
|
|
15
|
+
begin(inputSeq: number): ActiveTurn;
|
|
16
|
+
finish(): ActiveTurn | undefined;
|
|
17
|
+
abortCurrent(): ActiveTurn | undefined;
|
|
18
|
+
current(): ActiveTurn | undefined;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=turns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turns.d.ts","sourceRoot":"","sources":["../../../../src/commands/channel/supervisor/turns.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;AAEvD;;;;;;GAMG;AACH,qBAAa,WAAW;;IAGtB,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU;IASnC,MAAM,IAAI,UAAU,GAAG,SAAS;IAIhC,YAAY,IAAI,UAAU,GAAG,SAAS;IAItC,OAAO,IAAI,UAAU,GAAG,SAAS;CAGlC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host-local turn tracker for one supervisor process.
|
|
3
|
+
*
|
|
4
|
+
* The durable SOT is events.jsonl. This object only remembers the input
|
|
5
|
+
* message seq long enough for the inbox watcher and stdout pump to emit
|
|
6
|
+
* matching `turn_started` / `turn_finished` events.
|
|
7
|
+
*/
|
|
8
|
+
export class TurnTracker {
|
|
9
|
+
#turns = [];
|
|
10
|
+
begin(inputSeq) {
|
|
11
|
+
const turn = {
|
|
12
|
+
inputSeq,
|
|
13
|
+
turnId: `msg:${inputSeq}`,
|
|
14
|
+
};
|
|
15
|
+
this.#turns.push(turn);
|
|
16
|
+
return turn;
|
|
17
|
+
}
|
|
18
|
+
finish() {
|
|
19
|
+
return this.#turns.pop();
|
|
20
|
+
}
|
|
21
|
+
abortCurrent() {
|
|
22
|
+
return this.#turns.pop();
|
|
23
|
+
}
|
|
24
|
+
current() {
|
|
25
|
+
return this.#turns.at(-1);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=turns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turns.js","sourceRoot":"","sources":["../../../../src/commands/channel/supervisor/turns.ts"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH,MAAM,OAAO,WAAW;IACtB,MAAM,GAAiB,EAAE,CAAC;IAE1B,KAAK,CAAC,QAAgB;QACpB,MAAM,IAAI,GAAe;YACvB,QAAQ;YACR,MAAM,EAAE,OAAO,QAAQ,EAAE;SAC1B,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;IAC3B,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;IAC3B,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;CACF"}
|