@mindfoldhq/trellis 0.6.0-beta.2 → 0.6.0-beta.21

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.
Files changed (331) hide show
  1. package/README.md +1 -1
  2. package/dist/cli/index.d.ts +1 -1
  3. package/dist/cli/index.d.ts.map +1 -1
  4. package/dist/cli/index.js +58 -2
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/commands/channel/adapters/claude.d.ts +29 -0
  7. package/dist/commands/channel/adapters/claude.d.ts.map +1 -0
  8. package/dist/commands/channel/adapters/claude.js +203 -0
  9. package/dist/commands/channel/adapters/claude.js.map +1 -0
  10. package/dist/commands/channel/adapters/codex.d.ts +85 -0
  11. package/dist/commands/channel/adapters/codex.d.ts.map +1 -0
  12. package/dist/commands/channel/adapters/codex.js +505 -0
  13. package/dist/commands/channel/adapters/codex.js.map +1 -0
  14. package/dist/commands/channel/adapters/index.d.ts +84 -0
  15. package/dist/commands/channel/adapters/index.d.ts.map +1 -0
  16. package/dist/commands/channel/adapters/index.js +115 -0
  17. package/dist/commands/channel/adapters/index.js.map +1 -0
  18. package/dist/commands/channel/adapters/types.d.ts +33 -0
  19. package/dist/commands/channel/adapters/types.d.ts.map +1 -0
  20. package/dist/commands/channel/adapters/types.js +2 -0
  21. package/dist/commands/channel/adapters/types.js.map +1 -0
  22. package/dist/commands/channel/agent-loader.d.ts +32 -0
  23. package/dist/commands/channel/agent-loader.d.ts.map +1 -0
  24. package/dist/commands/channel/agent-loader.js +154 -0
  25. package/dist/commands/channel/agent-loader.js.map +1 -0
  26. package/dist/commands/channel/context-loader.d.ts +26 -0
  27. package/dist/commands/channel/context-loader.d.ts.map +1 -0
  28. package/dist/commands/channel/context-loader.js +290 -0
  29. package/dist/commands/channel/context-loader.js.map +1 -0
  30. package/dist/commands/channel/context.d.ts +16 -0
  31. package/dist/commands/channel/context.d.ts.map +1 -0
  32. package/dist/commands/channel/context.js +83 -0
  33. package/dist/commands/channel/context.js.map +1 -0
  34. package/dist/commands/channel/create.d.ts +27 -0
  35. package/dist/commands/channel/create.d.ts.map +1 -0
  36. package/dist/commands/channel/create.js +39 -0
  37. package/dist/commands/channel/create.js.map +1 -0
  38. package/dist/commands/channel/dev-parse-trace.d.ts +14 -0
  39. package/dist/commands/channel/dev-parse-trace.d.ts.map +1 -0
  40. package/dist/commands/channel/dev-parse-trace.js +70 -0
  41. package/dist/commands/channel/dev-parse-trace.js.map +1 -0
  42. package/dist/commands/channel/guard.d.ts +150 -0
  43. package/dist/commands/channel/guard.d.ts.map +1 -0
  44. package/dist/commands/channel/guard.js +474 -0
  45. package/dist/commands/channel/guard.js.map +1 -0
  46. package/dist/commands/channel/index.d.ts +3 -0
  47. package/dist/commands/channel/index.d.ts.map +1 -0
  48. package/dist/commands/channel/index.js +531 -0
  49. package/dist/commands/channel/index.js.map +1 -0
  50. package/dist/commands/channel/interrupt.d.ts +10 -0
  51. package/dist/commands/channel/interrupt.d.ts.map +1 -0
  52. package/dist/commands/channel/interrupt.js +22 -0
  53. package/dist/commands/channel/interrupt.js.map +1 -0
  54. package/dist/commands/channel/kill.d.ts +7 -0
  55. package/dist/commands/channel/kill.d.ts.map +1 -0
  56. package/dist/commands/channel/kill.js +121 -0
  57. package/dist/commands/channel/kill.js.map +1 -0
  58. package/dist/commands/channel/list.d.ts +17 -0
  59. package/dist/commands/channel/list.d.ts.map +1 -0
  60. package/dist/commands/channel/list.js +233 -0
  61. package/dist/commands/channel/list.js.map +1 -0
  62. package/dist/commands/channel/messages.d.ts +15 -0
  63. package/dist/commands/channel/messages.d.ts.map +1 -0
  64. package/dist/commands/channel/messages.js +245 -0
  65. package/dist/commands/channel/messages.js.map +1 -0
  66. package/dist/commands/channel/rm.d.ts +27 -0
  67. package/dist/commands/channel/rm.d.ts.map +1 -0
  68. package/dist/commands/channel/rm.js +216 -0
  69. package/dist/commands/channel/rm.js.map +1 -0
  70. package/dist/commands/channel/run.d.ts +30 -0
  71. package/dist/commands/channel/run.d.ts.map +1 -0
  72. package/dist/commands/channel/run.js +130 -0
  73. package/dist/commands/channel/run.js.map +1 -0
  74. package/dist/commands/channel/send.d.ts +11 -0
  75. package/dist/commands/channel/send.d.ts.map +1 -0
  76. package/dist/commands/channel/send.js +24 -0
  77. package/dist/commands/channel/send.js.map +1 -0
  78. package/dist/commands/channel/spawn.d.ts +40 -0
  79. package/dist/commands/channel/spawn.d.ts.map +1 -0
  80. package/dist/commands/channel/spawn.js +244 -0
  81. package/dist/commands/channel/spawn.js.map +1 -0
  82. package/dist/commands/channel/store/events.d.ts +39 -0
  83. package/dist/commands/channel/store/events.d.ts.map +1 -0
  84. package/dist/commands/channel/store/events.js +87 -0
  85. package/dist/commands/channel/store/events.js.map +1 -0
  86. package/dist/commands/channel/store/filter.d.ts +3 -0
  87. package/dist/commands/channel/store/filter.d.ts.map +1 -0
  88. package/dist/commands/channel/store/filter.js +2 -0
  89. package/dist/commands/channel/store/filter.js.map +1 -0
  90. package/dist/commands/channel/store/lock.d.ts +23 -0
  91. package/dist/commands/channel/store/lock.d.ts.map +1 -0
  92. package/dist/commands/channel/store/lock.js +99 -0
  93. package/dist/commands/channel/store/lock.js.map +1 -0
  94. package/dist/commands/channel/store/paths.d.ts +63 -0
  95. package/dist/commands/channel/store/paths.d.ts.map +1 -0
  96. package/dist/commands/channel/store/paths.js +246 -0
  97. package/dist/commands/channel/store/paths.js.map +1 -0
  98. package/dist/commands/channel/store/schema.d.ts +27 -0
  99. package/dist/commands/channel/store/schema.d.ts.map +1 -0
  100. package/dist/commands/channel/store/schema.js +34 -0
  101. package/dist/commands/channel/store/schema.js.map +1 -0
  102. package/dist/commands/channel/store/thread-state.d.ts +5 -0
  103. package/dist/commands/channel/store/thread-state.d.ts.map +1 -0
  104. package/dist/commands/channel/store/thread-state.js +16 -0
  105. package/dist/commands/channel/store/thread-state.js.map +1 -0
  106. package/dist/commands/channel/store/watch.d.ts +19 -0
  107. package/dist/commands/channel/store/watch.d.ts.map +1 -0
  108. package/dist/commands/channel/store/watch.js +146 -0
  109. package/dist/commands/channel/store/watch.js.map +1 -0
  110. package/dist/commands/channel/supervisor/idle.d.ts +46 -0
  111. package/dist/commands/channel/supervisor/idle.d.ts.map +1 -0
  112. package/dist/commands/channel/supervisor/idle.js +72 -0
  113. package/dist/commands/channel/supervisor/idle.js.map +1 -0
  114. package/dist/commands/channel/supervisor/inbox.d.ts +30 -0
  115. package/dist/commands/channel/supervisor/inbox.d.ts.map +1 -0
  116. package/dist/commands/channel/supervisor/inbox.js +160 -0
  117. package/dist/commands/channel/supervisor/inbox.js.map +1 -0
  118. package/dist/commands/channel/supervisor/shutdown.d.ts +68 -0
  119. package/dist/commands/channel/supervisor/shutdown.d.ts.map +1 -0
  120. package/dist/commands/channel/supervisor/shutdown.js +146 -0
  121. package/dist/commands/channel/supervisor/shutdown.js.map +1 -0
  122. package/dist/commands/channel/supervisor/stdout.d.ts +51 -0
  123. package/dist/commands/channel/supervisor/stdout.d.ts.map +1 -0
  124. package/dist/commands/channel/supervisor/stdout.js +121 -0
  125. package/dist/commands/channel/supervisor/stdout.js.map +1 -0
  126. package/dist/commands/channel/supervisor/turns.d.ts +31 -0
  127. package/dist/commands/channel/supervisor/turns.d.ts.map +1 -0
  128. package/dist/commands/channel/supervisor/turns.js +45 -0
  129. package/dist/commands/channel/supervisor/turns.js.map +1 -0
  130. package/dist/commands/channel/supervisor/warning.d.ts +48 -0
  131. package/dist/commands/channel/supervisor/warning.d.ts.map +1 -0
  132. package/dist/commands/channel/supervisor/warning.js +77 -0
  133. package/dist/commands/channel/supervisor/warning.js.map +1 -0
  134. package/dist/commands/channel/supervisor.d.ts +59 -0
  135. package/dist/commands/channel/supervisor.d.ts.map +1 -0
  136. package/dist/commands/channel/supervisor.js +344 -0
  137. package/dist/commands/channel/supervisor.js.map +1 -0
  138. package/dist/commands/channel/text-body.d.ts +13 -0
  139. package/dist/commands/channel/text-body.d.ts.map +1 -0
  140. package/dist/commands/channel/text-body.js +47 -0
  141. package/dist/commands/channel/text-body.js.map +1 -0
  142. package/dist/commands/channel/threads.d.ts +39 -0
  143. package/dist/commands/channel/threads.d.ts.map +1 -0
  144. package/dist/commands/channel/threads.js +106 -0
  145. package/dist/commands/channel/threads.js.map +1 -0
  146. package/dist/commands/channel/title.d.ts +12 -0
  147. package/dist/commands/channel/title.d.ts.map +1 -0
  148. package/dist/commands/channel/title.js +24 -0
  149. package/dist/commands/channel/title.js.map +1 -0
  150. package/dist/commands/channel/wait.d.ts +17 -0
  151. package/dist/commands/channel/wait.d.ts.map +1 -0
  152. package/dist/commands/channel/wait.js +75 -0
  153. package/dist/commands/channel/wait.js.map +1 -0
  154. package/dist/commands/init.d.ts +2 -0
  155. package/dist/commands/init.d.ts.map +1 -1
  156. package/dist/commands/init.js +97 -42
  157. package/dist/commands/init.js.map +1 -1
  158. package/dist/commands/mem.d.ts +13 -117
  159. package/dist/commands/mem.d.ts.map +1 -1
  160. package/dist/commands/mem.js +168 -1074
  161. package/dist/commands/mem.js.map +1 -1
  162. package/dist/commands/uninstall.d.ts.map +1 -1
  163. package/dist/commands/uninstall.js +28 -2
  164. package/dist/commands/uninstall.js.map +1 -1
  165. package/dist/commands/update.d.ts.map +1 -1
  166. package/dist/commands/update.js +31 -111
  167. package/dist/commands/update.js.map +1 -1
  168. package/dist/commands/upgrade.d.ts +28 -0
  169. package/dist/commands/upgrade.d.ts.map +1 -0
  170. package/dist/commands/upgrade.js +84 -0
  171. package/dist/commands/upgrade.js.map +1 -0
  172. package/dist/commands/workflow.d.ts +35 -0
  173. package/dist/commands/workflow.d.ts.map +1 -0
  174. package/dist/commands/workflow.js +219 -0
  175. package/dist/commands/workflow.js.map +1 -0
  176. package/dist/configurators/claude.d.ts.map +1 -1
  177. package/dist/configurators/claude.js +1 -0
  178. package/dist/configurators/claude.js.map +1 -1
  179. package/dist/configurators/codex.d.ts.map +1 -1
  180. package/dist/configurators/codex.js +5 -3
  181. package/dist/configurators/codex.js.map +1 -1
  182. package/dist/configurators/shared.js +4 -4
  183. package/dist/configurators/shared.js.map +1 -1
  184. package/dist/configurators/workflow.d.ts +8 -0
  185. package/dist/configurators/workflow.d.ts.map +1 -1
  186. package/dist/configurators/workflow.js +3 -2
  187. package/dist/configurators/workflow.js.map +1 -1
  188. package/dist/migrations/manifests/0.5.10.json +9 -0
  189. package/dist/migrations/manifests/0.5.11.json +16 -0
  190. package/dist/migrations/manifests/0.5.12.json +9 -0
  191. package/dist/migrations/manifests/0.5.13.json +9 -0
  192. package/dist/migrations/manifests/0.5.14.json +9 -0
  193. package/dist/migrations/manifests/0.5.15.json +9 -0
  194. package/dist/migrations/manifests/0.5.16.json +9 -0
  195. package/dist/migrations/manifests/0.5.17.json +9 -0
  196. package/dist/migrations/manifests/0.5.18.json +9 -0
  197. package/dist/migrations/manifests/0.6.0-beta.10.json +9 -0
  198. package/dist/migrations/manifests/0.6.0-beta.11.json +9 -0
  199. package/dist/migrations/manifests/0.6.0-beta.12.json +9 -0
  200. package/dist/migrations/manifests/0.6.0-beta.13.json +9 -0
  201. package/dist/migrations/manifests/0.6.0-beta.14.json +9 -0
  202. package/dist/migrations/manifests/0.6.0-beta.15.json +9 -0
  203. package/dist/migrations/manifests/0.6.0-beta.16.json +9 -0
  204. package/dist/migrations/manifests/0.6.0-beta.17.json +9 -0
  205. package/dist/migrations/manifests/0.6.0-beta.18.json +16 -0
  206. package/dist/migrations/manifests/0.6.0-beta.19.json +9 -0
  207. package/dist/migrations/manifests/0.6.0-beta.20.json +9 -0
  208. package/dist/migrations/manifests/0.6.0-beta.21.json +9 -0
  209. package/dist/migrations/manifests/0.6.0-beta.3.json +9 -0
  210. package/dist/migrations/manifests/0.6.0-beta.4.json +9 -0
  211. package/dist/migrations/manifests/0.6.0-beta.5.json +9 -0
  212. package/dist/migrations/manifests/0.6.0-beta.6.json +16 -0
  213. package/dist/migrations/manifests/0.6.0-beta.7.json +9 -0
  214. package/dist/migrations/manifests/0.6.0-beta.8.json +9 -0
  215. package/dist/migrations/manifests/0.6.0-beta.9.json +9 -0
  216. package/dist/templates/claude/agents/trellis-check.md +13 -7
  217. package/dist/templates/claude/agents/trellis-implement.md +8 -7
  218. package/dist/templates/claude/settings.json +4 -4
  219. package/dist/templates/codebuddy/agents/trellis-check.md +13 -7
  220. package/dist/templates/codebuddy/agents/trellis-implement.md +8 -7
  221. package/dist/templates/codebuddy/settings.json +4 -4
  222. package/dist/templates/codex/agents/trellis-check.toml +4 -4
  223. package/dist/templates/codex/agents/trellis-implement.toml +4 -4
  224. package/dist/templates/codex/config.toml +9 -16
  225. package/dist/templates/codex/hooks/session-start.py +205 -119
  226. package/dist/templates/codex/hooks.json +2 -2
  227. package/dist/templates/codex/skills/before-dev/SKILL.md +12 -6
  228. package/dist/templates/codex/skills/brainstorm/SKILL.md +69 -457
  229. package/dist/templates/codex/skills/check/SKILL.md +86 -18
  230. package/dist/templates/codex/skills/start/SKILL.md +33 -323
  231. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-context-loading.md +7 -4
  232. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-spec-structure.md +1 -1
  233. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-workflow.md +3 -2
  234. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/context-injection.md +5 -5
  235. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/spec-system.md +1 -1
  236. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/task-system.md +35 -6
  237. package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/agents.md +5 -4
  238. package/dist/templates/common/bundled-skills/trellis-spec-bootstarp/SKILL.md +41 -0
  239. package/dist/templates/common/bundled-skills/trellis-spec-bootstarp/references/mcp-setup.md +90 -0
  240. package/dist/templates/common/bundled-skills/trellis-spec-bootstarp/references/repository-analysis.md +59 -0
  241. package/dist/templates/common/bundled-skills/trellis-spec-bootstarp/references/spec-task-planning.md +61 -0
  242. package/dist/templates/common/bundled-skills/trellis-spec-bootstarp/references/spec-writing.md +70 -0
  243. package/dist/templates/common/commands/continue.md +6 -5
  244. package/dist/templates/common/commands/start.md +9 -6
  245. package/dist/templates/common/skills/before-dev.md +12 -6
  246. package/dist/templates/common/skills/brainstorm.md +68 -504
  247. package/dist/templates/common/skills/check.md +7 -1
  248. package/dist/templates/copilot/hooks/session-start.py +219 -101
  249. package/dist/templates/copilot/hooks.json +2 -2
  250. package/dist/templates/copilot/prompts/before-dev.prompt.md +12 -6
  251. package/dist/templates/copilot/prompts/brainstorm.prompt.md +69 -457
  252. package/dist/templates/copilot/prompts/check.prompt.md +86 -18
  253. package/dist/templates/copilot/prompts/parallel.prompt.md +16 -8
  254. package/dist/templates/copilot/prompts/start.prompt.md +33 -367
  255. package/dist/templates/cursor/agents/trellis-check.md +13 -7
  256. package/dist/templates/cursor/agents/trellis-implement.md +8 -7
  257. package/dist/templates/cursor/hooks.json +1 -7
  258. package/dist/templates/droid/droids/trellis-check.md +13 -7
  259. package/dist/templates/droid/droids/trellis-implement.md +8 -7
  260. package/dist/templates/droid/settings.json +4 -4
  261. package/dist/templates/gemini/agents/trellis-check.md +11 -5
  262. package/dist/templates/gemini/agents/trellis-implement.md +7 -6
  263. package/dist/templates/gemini/settings.json +2 -2
  264. package/dist/templates/kiro/agents/trellis-check.json +1 -1
  265. package/dist/templates/kiro/agents/trellis-implement.json +1 -1
  266. package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md.txt +127 -9
  267. package/dist/templates/markdown/spec/guides/cross-layer-thinking-guide.md.txt +171 -6
  268. package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md.txt +333 -43
  269. package/dist/templates/markdown/spec/guides/index.md.txt +18 -0
  270. package/dist/templates/opencode/agents/trellis-check.md +13 -7
  271. package/dist/templates/opencode/agents/trellis-implement.md +9 -8
  272. package/dist/templates/opencode/lib/session-utils.js +212 -123
  273. package/dist/templates/opencode/lib/trellis-context.js +73 -11
  274. package/dist/templates/opencode/plugins/inject-subagent-context.js +131 -29
  275. package/dist/templates/opencode/plugins/inject-workflow-state.js +9 -5
  276. package/dist/templates/opencode/plugins/session-start.js +9 -1
  277. package/dist/templates/pi/agents/trellis-check.md +5 -4
  278. package/dist/templates/pi/agents/trellis-implement.md +5 -4
  279. package/dist/templates/pi/extensions/trellis/index.ts.txt +1357 -754
  280. package/dist/templates/qoder/agents/trellis-check.md +11 -5
  281. package/dist/templates/qoder/agents/trellis-implement.md +7 -6
  282. package/dist/templates/qoder/settings.json +4 -4
  283. package/dist/templates/shared-hooks/index.d.ts.map +1 -1
  284. package/dist/templates/shared-hooks/index.js +0 -1
  285. package/dist/templates/shared-hooks/index.js.map +1 -1
  286. package/dist/templates/shared-hooks/inject-subagent-context.py +36 -14
  287. package/dist/templates/shared-hooks/inject-workflow-state.py +40 -42
  288. package/dist/templates/shared-hooks/session-start.py +222 -171
  289. package/dist/templates/trellis/config.yaml +38 -0
  290. package/dist/templates/trellis/index.d.ts +1 -0
  291. package/dist/templates/trellis/index.d.ts.map +1 -1
  292. package/dist/templates/trellis/index.js +2 -0
  293. package/dist/templates/trellis/index.js.map +1 -1
  294. package/dist/templates/trellis/scripts/add_session.py +50 -24
  295. package/dist/templates/trellis/scripts/common/config.py +57 -1
  296. package/dist/templates/trellis/scripts/common/safe_commit.py +285 -0
  297. package/dist/templates/trellis/scripts/common/session_context.py +384 -137
  298. package/dist/templates/trellis/scripts/common/task_context.py +3 -3
  299. package/dist/templates/trellis/scripts/common/task_store.py +161 -15
  300. package/dist/templates/trellis/scripts/common/workflow_phase.py +7 -10
  301. package/dist/templates/trellis/scripts/task.py +3 -3
  302. package/dist/templates/trellis/workflow.md +119 -98
  303. package/dist/utils/cwd-guard.d.ts +38 -0
  304. package/dist/utils/cwd-guard.d.ts.map +1 -0
  305. package/dist/utils/cwd-guard.js +62 -0
  306. package/dist/utils/cwd-guard.js.map +1 -0
  307. package/dist/utils/file-writer.d.ts +13 -0
  308. package/dist/utils/file-writer.d.ts.map +1 -1
  309. package/dist/utils/file-writer.js +59 -1
  310. package/dist/utils/file-writer.js.map +1 -1
  311. package/dist/utils/manifest-prune.d.ts +61 -0
  312. package/dist/utils/manifest-prune.d.ts.map +1 -0
  313. package/dist/utils/manifest-prune.js +136 -0
  314. package/dist/utils/manifest-prune.js.map +1 -0
  315. package/dist/utils/task-json.d.ts +9 -42
  316. package/dist/utils/task-json.d.ts.map +1 -1
  317. package/dist/utils/task-json.js +8 -45
  318. package/dist/utils/task-json.js.map +1 -1
  319. package/dist/utils/template-hash.d.ts +32 -6
  320. package/dist/utils/template-hash.d.ts.map +1 -1
  321. package/dist/utils/template-hash.js +53 -31
  322. package/dist/utils/template-hash.js.map +1 -1
  323. package/dist/utils/uninstall-scrubbers.d.ts +1 -0
  324. package/dist/utils/uninstall-scrubbers.d.ts.map +1 -1
  325. package/dist/utils/uninstall-scrubbers.js +21 -0
  326. package/dist/utils/uninstall-scrubbers.js.map +1 -1
  327. package/dist/utils/workflow-resolver.d.ts +86 -0
  328. package/dist/utils/workflow-resolver.d.ts.map +1 -0
  329. package/dist/utils/workflow-resolver.js +265 -0
  330. package/dist/utils/workflow-resolver.js.map +1 -0
  331. 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"}