@mindfoldhq/trellis 0.6.0-beta.2 → 0.6.0-beta.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +58 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/channel/adapters/claude.d.ts +29 -0
- package/dist/commands/channel/adapters/claude.d.ts.map +1 -0
- package/dist/commands/channel/adapters/claude.js +203 -0
- package/dist/commands/channel/adapters/claude.js.map +1 -0
- package/dist/commands/channel/adapters/codex.d.ts +85 -0
- package/dist/commands/channel/adapters/codex.d.ts.map +1 -0
- package/dist/commands/channel/adapters/codex.js +505 -0
- package/dist/commands/channel/adapters/codex.js.map +1 -0
- package/dist/commands/channel/adapters/index.d.ts +84 -0
- package/dist/commands/channel/adapters/index.d.ts.map +1 -0
- package/dist/commands/channel/adapters/index.js +115 -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/guard.d.ts +150 -0
- package/dist/commands/channel/guard.d.ts.map +1 -0
- package/dist/commands/channel/guard.js +474 -0
- package/dist/commands/channel/guard.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 +531 -0
- package/dist/commands/channel/index.js.map +1 -0
- package/dist/commands/channel/interrupt.d.ts +10 -0
- package/dist/commands/channel/interrupt.d.ts.map +1 -0
- package/dist/commands/channel/interrupt.js +22 -0
- package/dist/commands/channel/interrupt.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 +15 -0
- package/dist/commands/channel/messages.d.ts.map +1 -0
- package/dist/commands/channel/messages.js +245 -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 +30 -0
- package/dist/commands/channel/run.d.ts.map +1 -0
- package/dist/commands/channel/run.js +130 -0
- package/dist/commands/channel/run.js.map +1 -0
- package/dist/commands/channel/send.d.ts +11 -0
- package/dist/commands/channel/send.d.ts.map +1 -0
- package/dist/commands/channel/send.js +24 -0
- package/dist/commands/channel/send.js.map +1 -0
- package/dist/commands/channel/spawn.d.ts +40 -0
- package/dist/commands/channel/spawn.d.ts.map +1 -0
- package/dist/commands/channel/spawn.js +244 -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/idle.d.ts +46 -0
- package/dist/commands/channel/supervisor/idle.d.ts.map +1 -0
- package/dist/commands/channel/supervisor/idle.js +72 -0
- package/dist/commands/channel/supervisor/idle.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 +68 -0
- package/dist/commands/channel/supervisor/shutdown.d.ts.map +1 -0
- package/dist/commands/channel/supervisor/shutdown.js +146 -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 +31 -0
- package/dist/commands/channel/supervisor/turns.d.ts.map +1 -0
- package/dist/commands/channel/supervisor/turns.js +45 -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 +59 -0
- package/dist/commands/channel/supervisor.d.ts.map +1 -0
- package/dist/commands/channel/supervisor.js +344 -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 +17 -0
- package/dist/commands/channel/wait.d.ts.map +1 -0
- package/dist/commands/channel/wait.js +75 -0
- package/dist/commands/channel/wait.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +97 -42
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/mem.d.ts +13 -117
- package/dist/commands/mem.d.ts.map +1 -1
- package/dist/commands/mem.js +168 -1074
- package/dist/commands/mem.js.map +1 -1
- package/dist/commands/uninstall.d.ts.map +1 -1
- package/dist/commands/uninstall.js +28 -2
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +31 -111
- package/dist/commands/update.js.map +1 -1
- 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/claude.d.ts.map +1 -1
- package/dist/configurators/claude.js +1 -0
- package/dist/configurators/claude.js.map +1 -1
- package/dist/configurators/codex.d.ts.map +1 -1
- package/dist/configurators/codex.js +5 -3
- package/dist/configurators/codex.js.map +1 -1
- package/dist/configurators/shared.js +4 -4
- package/dist/configurators/shared.js.map +1 -1
- package/dist/configurators/workflow.d.ts +8 -0
- package/dist/configurators/workflow.d.ts.map +1 -1
- package/dist/configurators/workflow.js +3 -2
- package/dist/configurators/workflow.js.map +1 -1
- 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.16.json +9 -0
- package/dist/migrations/manifests/0.5.17.json +9 -0
- package/dist/migrations/manifests/0.5.18.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.18.json +16 -0
- package/dist/migrations/manifests/0.6.0-beta.19.json +9 -0
- package/dist/migrations/manifests/0.6.0-beta.20.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 +13 -7
- package/dist/templates/claude/agents/trellis-implement.md +8 -7
- package/dist/templates/claude/settings.json +4 -4
- package/dist/templates/codebuddy/agents/trellis-check.md +13 -7
- package/dist/templates/codebuddy/agents/trellis-implement.md +8 -7
- package/dist/templates/codebuddy/settings.json +4 -4
- package/dist/templates/codex/agents/trellis-check.toml +4 -4
- package/dist/templates/codex/agents/trellis-implement.toml +4 -4
- package/dist/templates/codex/config.toml +5 -3
- package/dist/templates/codex/hooks/session-start.py +205 -119
- package/dist/templates/codex/hooks.json +2 -2
- package/dist/templates/codex/skills/before-dev/SKILL.md +12 -6
- package/dist/templates/codex/skills/brainstorm/SKILL.md +69 -457
- package/dist/templates/codex/skills/check/SKILL.md +86 -18
- package/dist/templates/codex/skills/start/SKILL.md +33 -323
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-context-loading.md +7 -4
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-spec-structure.md +1 -1
- package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-workflow.md +3 -2
- package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/context-injection.md +5 -5
- package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/spec-system.md +1 -1
- package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/task-system.md +35 -6
- package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/agents.md +5 -4
- package/dist/templates/common/bundled-skills/trellis-spec-bootstarp/SKILL.md +41 -0
- package/dist/templates/common/bundled-skills/trellis-spec-bootstarp/references/mcp-setup.md +90 -0
- package/dist/templates/common/bundled-skills/trellis-spec-bootstarp/references/repository-analysis.md +59 -0
- package/dist/templates/common/bundled-skills/trellis-spec-bootstarp/references/spec-task-planning.md +61 -0
- package/dist/templates/common/bundled-skills/trellis-spec-bootstarp/references/spec-writing.md +70 -0
- package/dist/templates/common/commands/continue.md +6 -5
- package/dist/templates/common/commands/start.md +9 -6
- package/dist/templates/common/skills/before-dev.md +12 -6
- package/dist/templates/common/skills/brainstorm.md +68 -504
- package/dist/templates/common/skills/check.md +7 -1
- package/dist/templates/copilot/hooks/session-start.py +219 -101
- package/dist/templates/copilot/hooks.json +2 -2
- package/dist/templates/copilot/prompts/before-dev.prompt.md +12 -6
- package/dist/templates/copilot/prompts/brainstorm.prompt.md +69 -457
- package/dist/templates/copilot/prompts/check.prompt.md +86 -18
- package/dist/templates/copilot/prompts/parallel.prompt.md +16 -8
- package/dist/templates/copilot/prompts/start.prompt.md +33 -367
- package/dist/templates/cursor/agents/trellis-check.md +13 -7
- package/dist/templates/cursor/agents/trellis-implement.md +8 -7
- package/dist/templates/cursor/hooks.json +1 -7
- package/dist/templates/droid/droids/trellis-check.md +13 -7
- package/dist/templates/droid/droids/trellis-implement.md +8 -7
- package/dist/templates/droid/settings.json +4 -4
- package/dist/templates/gemini/agents/trellis-check.md +11 -5
- package/dist/templates/gemini/agents/trellis-implement.md +7 -6
- package/dist/templates/gemini/settings.json +2 -2
- package/dist/templates/kiro/agents/trellis-check.json +1 -1
- package/dist/templates/kiro/agents/trellis-implement.json +1 -1
- package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md.txt +127 -9
- package/dist/templates/markdown/spec/guides/cross-layer-thinking-guide.md.txt +171 -6
- package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md.txt +333 -43
- package/dist/templates/markdown/spec/guides/index.md.txt +18 -0
- package/dist/templates/opencode/agents/trellis-check.md +13 -7
- package/dist/templates/opencode/agents/trellis-implement.md +9 -8
- package/dist/templates/opencode/lib/session-utils.js +212 -123
- package/dist/templates/opencode/lib/trellis-context.js +73 -11
- package/dist/templates/opencode/plugins/inject-subagent-context.js +131 -29
- package/dist/templates/opencode/plugins/inject-workflow-state.js +9 -5
- package/dist/templates/opencode/plugins/session-start.js +9 -1
- package/dist/templates/pi/agents/trellis-check.md +5 -4
- package/dist/templates/pi/agents/trellis-implement.md +5 -4
- package/dist/templates/pi/extensions/trellis/index.ts.txt +1357 -754
- package/dist/templates/qoder/agents/trellis-check.md +11 -5
- package/dist/templates/qoder/agents/trellis-implement.md +7 -6
- package/dist/templates/qoder/settings.json +4 -4
- package/dist/templates/shared-hooks/index.d.ts.map +1 -1
- package/dist/templates/shared-hooks/index.js +0 -1
- package/dist/templates/shared-hooks/index.js.map +1 -1
- package/dist/templates/shared-hooks/inject-subagent-context.py +36 -14
- package/dist/templates/shared-hooks/inject-workflow-state.py +40 -42
- package/dist/templates/shared-hooks/session-start.py +222 -171
- package/dist/templates/trellis/config.yaml +38 -0
- package/dist/templates/trellis/index.d.ts +1 -0
- package/dist/templates/trellis/index.d.ts.map +1 -1
- package/dist/templates/trellis/index.js +2 -0
- package/dist/templates/trellis/index.js.map +1 -1
- package/dist/templates/trellis/scripts/add_session.py +50 -24
- package/dist/templates/trellis/scripts/common/config.py +57 -1
- package/dist/templates/trellis/scripts/common/safe_commit.py +285 -0
- package/dist/templates/trellis/scripts/common/session_context.py +384 -137
- package/dist/templates/trellis/scripts/common/task_context.py +3 -3
- package/dist/templates/trellis/scripts/common/task_store.py +161 -15
- package/dist/templates/trellis/scripts/common/workflow_phase.py +7 -10
- package/dist/templates/trellis/scripts/task.py +3 -3
- package/dist/templates/trellis/workflow.md +119 -98
- 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 +13 -0
- package/dist/utils/file-writer.d.ts.map +1 -1
- package/dist/utils/file-writer.js +59 -1
- package/dist/utils/file-writer.js.map +1 -1
- 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/task-json.d.ts +9 -42
- package/dist/utils/task-json.d.ts.map +1 -1
- package/dist/utils/task-json.js +8 -45
- package/dist/utils/task-json.js.map +1 -1
- package/dist/utils/template-hash.d.ts +32 -6
- package/dist/utils/template-hash.d.ts.map +1 -1
- package/dist/utils/template-hash.js +53 -31
- package/dist/utils/template-hash.js.map +1 -1
- package/dist/utils/uninstall-scrubbers.d.ts +1 -0
- package/dist/utils/uninstall-scrubbers.d.ts.map +1 -1
- package/dist/utils/uninstall-scrubbers.js +21 -0
- package/dist/utils/uninstall-scrubbers.js.map +1 -1
- 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 +9 -8
|
@@ -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,31 @@
|
|
|
1
|
+
export interface ActiveTurn {
|
|
2
|
+
inputSeq: number;
|
|
3
|
+
turnId: string;
|
|
4
|
+
}
|
|
5
|
+
export type TurnOutcome = "done" | "error" | "aborted";
|
|
6
|
+
export interface TurnTrackerHooks {
|
|
7
|
+
/** Called when the tracker transitions from idle to mid-turn. */
|
|
8
|
+
onIdleExit?: () => void;
|
|
9
|
+
/** Called when the tracker transitions back to idle. */
|
|
10
|
+
onIdleEnter?: () => void;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Host-local turn tracker for one supervisor process.
|
|
14
|
+
*
|
|
15
|
+
* The durable SOT is events.jsonl. This object only remembers the input
|
|
16
|
+
* message seq long enough for the inbox watcher and stdout pump to emit
|
|
17
|
+
* matching `turn_started` / `turn_finished` events.
|
|
18
|
+
*
|
|
19
|
+
* Optional hooks fire on the idle ↔ mid-turn transition so the
|
|
20
|
+
* supervisor idle-timer (OOM guard) can pause / reset without each
|
|
21
|
+
* inbox or stdout call site having to know about it.
|
|
22
|
+
*/
|
|
23
|
+
export declare class TurnTracker {
|
|
24
|
+
#private;
|
|
25
|
+
constructor(hooks?: TurnTrackerHooks);
|
|
26
|
+
begin(inputSeq: number): ActiveTurn;
|
|
27
|
+
finish(): ActiveTurn | undefined;
|
|
28
|
+
abortCurrent(): ActiveTurn | undefined;
|
|
29
|
+
current(): ActiveTurn | undefined;
|
|
30
|
+
}
|
|
31
|
+
//# 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,MAAM,WAAW,gBAAgB;IAC/B,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED;;;;;;;;;;GAUG;AACH,qBAAa,WAAW;;gBAIV,KAAK,GAAE,gBAAqB;IAIxC,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU;IAWnC,MAAM,IAAI,UAAU,GAAG,SAAS;IAMhC,YAAY,IAAI,UAAU,GAAG,SAAS;IAMtC,OAAO,IAAI,UAAU,GAAG,SAAS;CAGlC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
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
|
+
* Optional hooks fire on the idle ↔ mid-turn transition so the
|
|
9
|
+
* supervisor idle-timer (OOM guard) can pause / reset without each
|
|
10
|
+
* inbox or stdout call site having to know about it.
|
|
11
|
+
*/
|
|
12
|
+
export class TurnTracker {
|
|
13
|
+
#turns = [];
|
|
14
|
+
#hooks;
|
|
15
|
+
constructor(hooks = {}) {
|
|
16
|
+
this.#hooks = hooks;
|
|
17
|
+
}
|
|
18
|
+
begin(inputSeq) {
|
|
19
|
+
const wasIdle = this.#turns.length === 0;
|
|
20
|
+
const turn = {
|
|
21
|
+
inputSeq,
|
|
22
|
+
turnId: `msg:${inputSeq}`,
|
|
23
|
+
};
|
|
24
|
+
this.#turns.push(turn);
|
|
25
|
+
if (wasIdle)
|
|
26
|
+
this.#hooks.onIdleExit?.();
|
|
27
|
+
return turn;
|
|
28
|
+
}
|
|
29
|
+
finish() {
|
|
30
|
+
const turn = this.#turns.pop();
|
|
31
|
+
if (turn && this.#turns.length === 0)
|
|
32
|
+
this.#hooks.onIdleEnter?.();
|
|
33
|
+
return turn;
|
|
34
|
+
}
|
|
35
|
+
abortCurrent() {
|
|
36
|
+
const turn = this.#turns.pop();
|
|
37
|
+
if (turn && this.#turns.length === 0)
|
|
38
|
+
this.#hooks.onIdleEnter?.();
|
|
39
|
+
return turn;
|
|
40
|
+
}
|
|
41
|
+
current() {
|
|
42
|
+
return this.#turns.at(-1);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=turns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turns.js","sourceRoot":"","sources":["../../../../src/commands/channel/supervisor/turns.ts"],"names":[],"mappings":"AAcA;;;;;;;;;;GAUG;AACH,MAAM,OAAO,WAAW;IACtB,MAAM,GAAiB,EAAE,CAAC;IAC1B,MAAM,CAAmB;IAEzB,YAAY,QAA0B,EAAE;QACtC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,QAAgB;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;QACzC,MAAM,IAAI,GAAe;YACvB,QAAQ;YACR,MAAM,EAAE,OAAO,QAAQ,EAAE;SAC1B,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,OAAO;YAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM;QACJ,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QAC/B,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;QAClE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,YAAY;QACV,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QAC/B,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;QAClE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;CACF"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supervisor pre-timeout warning scheduler.
|
|
3
|
+
*
|
|
4
|
+
* Emits a one-shot `supervisor_warning` channel event when the worker
|
|
5
|
+
* is approaching its lifetime timeout, so observers (dispatchers /
|
|
6
|
+
* `trellis channel messages`) can see the impending kill without
|
|
7
|
+
* having to poll. The event is observability-only — it never replaces
|
|
8
|
+
* the eventual `killed` / `done` / `error` terminal event, and is
|
|
9
|
+
* not part of the meaningful-event set so plain `wait` does not wake
|
|
10
|
+
* on it unless `--kind supervisor_warning` is explicit.
|
|
11
|
+
*
|
|
12
|
+
* Scheduling lives outside `createShutdown()` because the warning is a
|
|
13
|
+
* pre-terminal observability event, not a terminal one — the shutdown
|
|
14
|
+
* funnel deliberately only owns kill ladder + `killed` append.
|
|
15
|
+
*/
|
|
16
|
+
/** Default lead time before the supervisor timeout (ms) to fire the warning. */
|
|
17
|
+
export declare const SUPERVISOR_TIMEOUT_WARNING_REMAINING_MS: number;
|
|
18
|
+
export interface SupervisorShutdownProbe {
|
|
19
|
+
isShuttingDown(): boolean;
|
|
20
|
+
hasTerminalEvent(): boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface ScheduleSupervisorTimeoutWarningArgs {
|
|
23
|
+
channelName: string;
|
|
24
|
+
workerName: string;
|
|
25
|
+
timeoutMs: number;
|
|
26
|
+
/** Warning lead time in ms. `<= 0` disables the pre-timeout warning. */
|
|
27
|
+
warnBeforeMs?: number;
|
|
28
|
+
shutdown: SupervisorShutdownProbe;
|
|
29
|
+
/** Returns true once the child process has exited (exitCode/signalCode set). */
|
|
30
|
+
isChildExited: () => boolean;
|
|
31
|
+
log: {
|
|
32
|
+
write: (data: string) => void;
|
|
33
|
+
};
|
|
34
|
+
project?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Schedule a single `supervisor_warning` append at `timeoutMs - warnBeforeMs`
|
|
38
|
+
* (clamped at 0 when the warning lead time is greater than the timeout).
|
|
39
|
+
* Guarded so the warning is emitted at most once, never after shutdown
|
|
40
|
+
* has been requested, never after a terminal event has been emitted,
|
|
41
|
+
* and never after the worker child has exited.
|
|
42
|
+
*
|
|
43
|
+
* Returns a cancel handle that callers can invoke to drop the pending
|
|
44
|
+
* timer (e.g. on supervisor teardown). Append failures are logged via
|
|
45
|
+
* `log.write` only and do not affect worker lifecycle.
|
|
46
|
+
*/
|
|
47
|
+
export declare function scheduleSupervisorTimeoutWarning(args: ScheduleSupervisorTimeoutWarningArgs): () => void;
|
|
48
|
+
//# sourceMappingURL=warning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"warning.d.ts","sourceRoot":"","sources":["../../../../src/commands/channel/supervisor/warning.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,gFAAgF;AAChF,eAAO,MAAM,uCAAuC,QAAa,CAAC;AAElE,MAAM,WAAW,uBAAuB;IACtC,cAAc,IAAI,OAAO,CAAC;IAC1B,gBAAgB,IAAI,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,oCAAoC;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,uBAAuB,CAAC;IAClC,gFAAgF;IAChF,aAAa,EAAE,MAAM,OAAO,CAAC;IAC7B,GAAG,EAAE;QAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,oCAAoC,GACzC,MAAM,IAAI,CAuDZ"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supervisor pre-timeout warning scheduler.
|
|
3
|
+
*
|
|
4
|
+
* Emits a one-shot `supervisor_warning` channel event when the worker
|
|
5
|
+
* is approaching its lifetime timeout, so observers (dispatchers /
|
|
6
|
+
* `trellis channel messages`) can see the impending kill without
|
|
7
|
+
* having to poll. The event is observability-only — it never replaces
|
|
8
|
+
* the eventual `killed` / `done` / `error` terminal event, and is
|
|
9
|
+
* not part of the meaningful-event set so plain `wait` does not wake
|
|
10
|
+
* on it unless `--kind supervisor_warning` is explicit.
|
|
11
|
+
*
|
|
12
|
+
* Scheduling lives outside `createShutdown()` because the warning is a
|
|
13
|
+
* pre-terminal observability event, not a terminal one — the shutdown
|
|
14
|
+
* funnel deliberately only owns kill ladder + `killed` append.
|
|
15
|
+
*/
|
|
16
|
+
import { appendEvent } from "../store/events.js";
|
|
17
|
+
/** Default lead time before the supervisor timeout (ms) to fire the warning. */
|
|
18
|
+
export const SUPERVISOR_TIMEOUT_WARNING_REMAINING_MS = 5 * 60_000;
|
|
19
|
+
/**
|
|
20
|
+
* Schedule a single `supervisor_warning` append at `timeoutMs - warnBeforeMs`
|
|
21
|
+
* (clamped at 0 when the warning lead time is greater than the timeout).
|
|
22
|
+
* Guarded so the warning is emitted at most once, never after shutdown
|
|
23
|
+
* has been requested, never after a terminal event has been emitted,
|
|
24
|
+
* and never after the worker child has exited.
|
|
25
|
+
*
|
|
26
|
+
* Returns a cancel handle that callers can invoke to drop the pending
|
|
27
|
+
* timer (e.g. on supervisor teardown). Append failures are logged via
|
|
28
|
+
* `log.write` only and do not affect worker lifecycle.
|
|
29
|
+
*/
|
|
30
|
+
export function scheduleSupervisorTimeoutWarning(args) {
|
|
31
|
+
const { channelName, workerName, timeoutMs, shutdown, isChildExited, log } = args;
|
|
32
|
+
if (timeoutMs <= 0)
|
|
33
|
+
return () => undefined;
|
|
34
|
+
const warnBeforeMs = args.warnBeforeMs ?? SUPERVISOR_TIMEOUT_WARNING_REMAINING_MS;
|
|
35
|
+
if (warnBeforeMs <= 0)
|
|
36
|
+
return () => undefined;
|
|
37
|
+
const remaining = Math.min(timeoutMs, warnBeforeMs);
|
|
38
|
+
const delay = Math.max(0, timeoutMs - remaining);
|
|
39
|
+
let warningEmitted = false;
|
|
40
|
+
let cancelled = false;
|
|
41
|
+
const fire = () => {
|
|
42
|
+
if (cancelled || warningEmitted)
|
|
43
|
+
return;
|
|
44
|
+
if (shutdown.isShuttingDown() ||
|
|
45
|
+
shutdown.hasTerminalEvent() ||
|
|
46
|
+
isChildExited()) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
// Claim the slot synchronously so a re-entrant fire (or future
|
|
50
|
+
// caller wiring) cannot race two appends.
|
|
51
|
+
warningEmitted = true;
|
|
52
|
+
void (async () => {
|
|
53
|
+
try {
|
|
54
|
+
await appendEvent(channelName, {
|
|
55
|
+
kind: "supervisor_warning",
|
|
56
|
+
by: `supervisor:${workerName}`,
|
|
57
|
+
worker: workerName,
|
|
58
|
+
reason: "approaching_timeout",
|
|
59
|
+
timeout_ms: timeoutMs,
|
|
60
|
+
remaining_ms: remaining,
|
|
61
|
+
}, args.project);
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
65
|
+
log.write(`[supervisor] warning append failed: ${msg}\n`);
|
|
66
|
+
}
|
|
67
|
+
})();
|
|
68
|
+
};
|
|
69
|
+
const timer = setTimeout(fire, delay);
|
|
70
|
+
// Don't keep the supervisor alive solely for the warning timer.
|
|
71
|
+
timer.unref?.();
|
|
72
|
+
return () => {
|
|
73
|
+
cancelled = true;
|
|
74
|
+
clearTimeout(timer);
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=warning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"warning.js","sourceRoot":"","sources":["../../../../src/commands/channel/supervisor/warning.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,gFAAgF;AAChF,MAAM,CAAC,MAAM,uCAAuC,GAAG,CAAC,GAAG,MAAM,CAAC;AAoBlE;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gCAAgC,CAC9C,IAA0C;IAE1C,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,EAAE,GACxE,IAAI,CAAC;IACP,IAAI,SAAS,IAAI,CAAC;QAAE,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC;IAC3C,MAAM,YAAY,GAChB,IAAI,CAAC,YAAY,IAAI,uCAAuC,CAAC;IAC/D,IAAI,YAAY,IAAI,CAAC;QAAE,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC;IAE9C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC;IAEjD,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,MAAM,IAAI,GAAG,GAAS,EAAE;QACtB,IAAI,SAAS,IAAI,cAAc;YAAE,OAAO;QACxC,IACE,QAAQ,CAAC,cAAc,EAAE;YACzB,QAAQ,CAAC,gBAAgB,EAAE;YAC3B,aAAa,EAAE,EACf,CAAC;YACD,OAAO;QACT,CAAC;QACD,+DAA+D;QAC/D,0CAA0C;QAC1C,cAAc,GAAG,IAAI,CAAC;QACtB,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,IAAI,CAAC;gBACH,MAAM,WAAW,CACf,WAAW,EACX;oBACE,IAAI,EAAE,oBAAoB;oBAC1B,EAAE,EAAE,cAAc,UAAU,EAAE;oBAC9B,MAAM,EAAE,UAAU;oBAClB,MAAM,EAAE,qBAAqB;oBAC7B,UAAU,EAAE,SAAS;oBACrB,YAAY,EAAE,SAAS;iBACxB,EACD,IAAI,CAAC,OAAO,CACb,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,GAAG,CAAC,KAAK,CAAC,uCAAuC,GAAG,IAAI,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACtC,gEAAgE;IAChE,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IAEhB,OAAO,GAAG,EAAE;QACV,SAAS,GAAG,IAAI,CAAC;QACjB,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supervisor process: owns a single worker (claude or codex) and bridges
|
|
3
|
+
* worker ↔ channel events.jsonl.
|
|
4
|
+
*
|
|
5
|
+
* Run as: `trellis channel __supervisor <channel> <worker> <config-path>`
|
|
6
|
+
*
|
|
7
|
+
* Three concurrent loops:
|
|
8
|
+
* 1. stdout reader — parse worker stdout → adapter → append events
|
|
9
|
+
* 2. inbox watcher — read events.jsonl for `to=<worker>` say events,
|
|
10
|
+
* translate via adapter.encodeUserMessage → worker stdin
|
|
11
|
+
* 3. signal handler — SIGTERM → close worker stdin → 3s → SIGTERM → 3s → SIGKILL
|
|
12
|
+
* → write `killed` event → exit
|
|
13
|
+
*/
|
|
14
|
+
import { type InboxPolicy } from "@mindfoldhq/trellis-core/channel";
|
|
15
|
+
import { type Provider } from "./adapters/index.js";
|
|
16
|
+
export interface SupervisorConfig {
|
|
17
|
+
provider: Provider;
|
|
18
|
+
cwd: string;
|
|
19
|
+
/** Combined worker system prompt: channel protocol prefix + agent body.
|
|
20
|
+
* Injected via Claude `--append-system-prompt` or Codex `developerInstructions`.
|
|
21
|
+
* No "initial user prompt" — the worker stays idle until the first
|
|
22
|
+
* inbox `send --to <worker>` arrives. */
|
|
23
|
+
systemPrompt: string;
|
|
24
|
+
/** Extra env vars (TRELLIS_HOOKS=0 etc. are added automatically). */
|
|
25
|
+
env?: Record<string, string>;
|
|
26
|
+
/** Optional model override. */
|
|
27
|
+
model?: string;
|
|
28
|
+
/** Resume an existing session/thread if id is provided. */
|
|
29
|
+
resume?: string;
|
|
30
|
+
/** Auto-kill worker after this many ms (anti-zombie). */
|
|
31
|
+
timeoutMs?: number;
|
|
32
|
+
/** Emit supervisor_warning this many ms before timeout. `<=0` disables it. */
|
|
33
|
+
warnBeforeMs?: number;
|
|
34
|
+
/**
|
|
35
|
+
* OOM-guard idle-cleanup TTL in ms. When a running worker stays idle
|
|
36
|
+
* for this long (no active turn), the supervisor self-terminates with
|
|
37
|
+
* `killed{reason:"idle-timeout"}`. `<=0` or undefined disables.
|
|
38
|
+
*/
|
|
39
|
+
idleTimeoutMs?: number;
|
|
40
|
+
/** Caller identity recorded on the `spawned` event (default "main"). */
|
|
41
|
+
spawnedBy?: string;
|
|
42
|
+
/** Agent definition name loaded for this worker, if any (recorded on `spawned`). */
|
|
43
|
+
agent?: string;
|
|
44
|
+
/** Relative paths injected via --file / --jsonl (recorded on `spawned`). */
|
|
45
|
+
contextFiles?: string[];
|
|
46
|
+
/** Relative paths of every `--jsonl` manifest processed, even if empty
|
|
47
|
+
* (recorded on `spawned` for observability — "I passed --jsonl X but
|
|
48
|
+
* X contained no real entries"). */
|
|
49
|
+
contextManifests?: string[];
|
|
50
|
+
/** Worker inbox delivery policy (recorded on `spawned`; default
|
|
51
|
+
* `explicitOnly`). */
|
|
52
|
+
inboxPolicy?: InboxPolicy;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Entry point invoked by `trellis channel __supervisor <channel> <worker> <config>`.
|
|
56
|
+
*/
|
|
57
|
+
export declare function runSupervisor(channelName: string, workerName: string, configPath: string): Promise<void>;
|
|
58
|
+
export declare function writeSupervisorConfig(channelName: string, workerName: string, config: SupervisorConfig, project?: string): string;
|
|
59
|
+
//# sourceMappingURL=supervisor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/supervisor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAUhE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ;;;8CAG0C;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB;;yCAEqC;IACrC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B;2BACuB;IACvB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAMD;;GAEG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAgTf;AAsDD,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,gBAAgB,EACxB,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAKR"}
|