pi-subagents 0.68.0 → 0.70.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1450) hide show
  1. package/CHANGELOG.md +62 -1
  2. package/agents/reviewer.md +3 -2
  3. package/docs/agents.md +10 -2
  4. package/docs/configuration.md +1 -1
  5. package/docs/extension-api.md +1 -1
  6. package/docs/models.md +3 -1
  7. package/docs/observability.md +6 -0
  8. package/docs/tool-reference.md +23 -2
  9. package/docs/watchdog.md +2 -0
  10. package/docs/workflows.md +54 -2
  11. package/index.d.ts +3 -0
  12. package/index.d.ts.map +1 -0
  13. package/index.js +10 -0
  14. package/index.js.map +1 -0
  15. package/package.json +89 -73
  16. package/runner-peer-loader.mjs +4 -7
  17. package/runner-peer-preload.mjs +5 -7
  18. package/skills/pi-subagents/references/execution-controls.md +3 -1
  19. package/skills/pi-subagents/references/prompting-and-roles.md +2 -2
  20. package/src/agents/advertised-agent-prompt.d.ts +8 -0
  21. package/src/agents/advertised-agent-prompt.d.ts.map +1 -0
  22. package/src/agents/advertised-agent-prompt.js +77 -0
  23. package/src/agents/advertised-agent-prompt.js.map +1 -0
  24. package/src/agents/agent-management.d.ts +27 -0
  25. package/src/agents/agent-management.d.ts.map +1 -0
  26. package/src/agents/agent-management.js +1528 -0
  27. package/src/agents/agent-management.js.map +1 -0
  28. package/src/agents/agent-memory.d.ts +49 -0
  29. package/src/agents/agent-memory.d.ts.map +1 -0
  30. package/src/agents/agent-memory.js +349 -0
  31. package/src/agents/agent-memory.js.map +1 -0
  32. package/src/agents/agent-refinements.d.ts +100 -0
  33. package/src/agents/agent-refinements.d.ts.map +1 -0
  34. package/src/agents/agent-refinements.js +569 -0
  35. package/src/agents/agent-refinements.js.map +1 -0
  36. package/src/agents/agent-scope.d.ts +3 -0
  37. package/src/agents/agent-scope.d.ts.map +1 -0
  38. package/src/agents/agent-scope.js +6 -0
  39. package/src/agents/agent-scope.js.map +1 -0
  40. package/src/agents/agent-selection.d.ts +3 -0
  41. package/src/agents/agent-selection.d.ts.map +1 -0
  42. package/src/agents/agent-selection.js +23 -0
  43. package/src/agents/agent-selection.js.map +1 -0
  44. package/src/agents/agent-serializer.d.ts +8 -0
  45. package/src/agents/agent-serializer.d.ts.map +1 -0
  46. package/src/agents/agent-serializer.js +200 -0
  47. package/src/agents/agent-serializer.js.map +1 -0
  48. package/src/agents/agents.d.ts +313 -0
  49. package/src/agents/agents.d.ts.map +1 -0
  50. package/src/agents/agents.js +2622 -0
  51. package/src/agents/agents.js.map +1 -0
  52. package/src/agents/builtin-names.d.ts +2 -0
  53. package/src/agents/builtin-names.d.ts.map +1 -0
  54. package/src/agents/builtin-names.js +17 -0
  55. package/src/agents/builtin-names.js.map +1 -0
  56. package/src/agents/chain-serializer.d.ts +7 -0
  57. package/src/agents/chain-serializer.d.ts.map +1 -0
  58. package/src/agents/chain-serializer.js +319 -0
  59. package/src/agents/chain-serializer.js.map +1 -0
  60. package/src/agents/frontmatter.d.ts +16 -0
  61. package/src/agents/frontmatter.d.ts.map +1 -0
  62. package/src/agents/frontmatter.js +142 -0
  63. package/src/agents/frontmatter.js.map +1 -0
  64. package/src/agents/identity.d.ts +8 -0
  65. package/src/agents/identity.d.ts.map +1 -0
  66. package/src/agents/identity.js +30 -0
  67. package/src/agents/identity.js.map +1 -0
  68. package/src/agents/proactive-skills.d.ts +35 -0
  69. package/src/agents/proactive-skills.d.ts.map +1 -0
  70. package/src/agents/proactive-skills.js +154 -0
  71. package/src/agents/proactive-skills.js.map +1 -0
  72. package/src/agents/runtime-agent-events.d.ts +27 -0
  73. package/src/agents/runtime-agent-events.d.ts.map +1 -0
  74. package/src/agents/runtime-agent-events.js +53 -0
  75. package/src/agents/runtime-agent-events.js.map +1 -0
  76. package/src/agents/runtime-agent-registry.d.ts +59 -0
  77. package/src/agents/runtime-agent-registry.d.ts.map +1 -0
  78. package/src/agents/runtime-agent-registry.js +390 -0
  79. package/src/agents/runtime-agent-registry.js.map +1 -0
  80. package/src/agents/skills.d.ts +33 -0
  81. package/src/agents/skills.d.ts.map +1 -0
  82. package/src/agents/skills.js +685 -0
  83. package/src/agents/skills.js.map +1 -0
  84. package/src/api/agents.d.ts +5 -0
  85. package/src/api/agents.d.ts.map +1 -0
  86. package/src/api/agents.js +3 -0
  87. package/src/api/agents.js.map +1 -0
  88. package/src/api/background-work.d.ts +39 -0
  89. package/src/api/background-work.d.ts.map +1 -0
  90. package/src/api/background-work.js +165 -0
  91. package/src/api/background-work.js.map +1 -0
  92. package/src/api/capability-ceiling.d.ts +2 -0
  93. package/src/api/capability-ceiling.d.ts.map +1 -0
  94. package/src/api/capability-ceiling.js +2 -0
  95. package/src/api/capability-ceiling.js.map +1 -0
  96. package/src/api/child-tool-plan.d.ts +2 -0
  97. package/src/api/child-tool-plan.d.ts.map +1 -0
  98. package/src/api/child-tool-plan.js +2 -0
  99. package/src/api/child-tool-plan.js.map +1 -0
  100. package/src/api/control-channel.d.ts +2 -0
  101. package/src/api/control-channel.d.ts.map +1 -0
  102. package/src/api/control-channel.js +2 -0
  103. package/src/api/control-channel.js.map +1 -0
  104. package/src/api/delegation.d.ts +99 -0
  105. package/src/api/delegation.d.ts.map +1 -0
  106. package/src/api/delegation.js +9 -0
  107. package/src/api/delegation.js.map +1 -0
  108. package/src/api/external-job-provider.d.ts +58 -0
  109. package/src/api/external-job-provider.d.ts.map +1 -0
  110. package/src/api/external-job-provider.js +140 -0
  111. package/src/api/external-job-provider.js.map +1 -0
  112. package/src/api/external-runs.d.ts +48 -0
  113. package/src/api/external-runs.d.ts.map +1 -0
  114. package/src/api/external-runs.js +245 -0
  115. package/src/api/external-runs.js.map +1 -0
  116. package/src/api/intercom-bridge.d.ts +2 -0
  117. package/src/api/intercom-bridge.d.ts.map +1 -0
  118. package/src/api/intercom-bridge.js +2 -0
  119. package/src/api/intercom-bridge.js.map +1 -0
  120. package/src/api/preflight.d.ts +173 -0
  121. package/src/api/preflight.d.ts.map +1 -0
  122. package/src/api/preflight.js +362 -0
  123. package/src/api/preflight.js.map +1 -0
  124. package/src/api/project-panes.d.ts +8 -0
  125. package/src/api/project-panes.d.ts.map +1 -0
  126. package/src/api/project-panes.js +8 -0
  127. package/src/api/project-panes.js.map +1 -0
  128. package/src/api/required-child-extensions.d.ts +2 -0
  129. package/src/api/required-child-extensions.d.ts.map +1 -0
  130. package/src/api/required-child-extensions.js +2 -0
  131. package/src/api/required-child-extensions.js.map +1 -0
  132. package/src/api/shared-types.d.ts +2 -0
  133. package/src/api/shared-types.d.ts.map +1 -0
  134. package/src/api/shared-types.js +2 -0
  135. package/src/api/shared-types.js.map +1 -0
  136. package/src/api/workflow-resources.d.ts +3 -0
  137. package/src/api/workflow-resources.d.ts.map +1 -0
  138. package/src/api/workflow-resources.js +2 -0
  139. package/src/api/workflow-resources.js.map +1 -0
  140. package/src/extension/config.d.ts +8 -0
  141. package/src/extension/config.d.ts.map +1 -0
  142. package/src/extension/config.js +245 -0
  143. package/src/extension/config.js.map +1 -0
  144. package/src/extension/control-notices.d.ts +19 -0
  145. package/src/extension/control-notices.d.ts.map +1 -0
  146. package/src/extension/control-notices.js +34 -0
  147. package/src/extension/control-notices.js.map +1 -0
  148. package/src/extension/doctor.d.ts +33 -0
  149. package/src/extension/doctor.d.ts.map +1 -0
  150. package/src/extension/doctor.js +231 -0
  151. package/src/extension/doctor.js.map +1 -0
  152. package/src/extension/fanout-child.d.ts +7 -0
  153. package/src/extension/fanout-child.d.ts.map +1 -0
  154. package/src/extension/fanout-child.js +261 -0
  155. package/src/extension/fanout-child.js.map +1 -0
  156. package/src/extension/herdr-pi-bridge.d.ts +17 -0
  157. package/src/extension/herdr-pi-bridge.d.ts.map +1 -0
  158. package/src/extension/herdr-pi-bridge.js +243 -0
  159. package/src/extension/herdr-pi-bridge.js.map +1 -0
  160. package/src/extension/index.d.ts +20 -0
  161. package/src/extension/index.d.ts.map +1 -0
  162. package/src/extension/index.js +1108 -0
  163. package/src/extension/index.js.map +1 -0
  164. package/src/extension/public-execution.d.ts +62 -0
  165. package/src/extension/public-execution.d.ts.map +1 -0
  166. package/src/extension/public-execution.js +174 -0
  167. package/src/extension/public-execution.js.map +1 -0
  168. package/src/extension/rpc.d.ts +83 -0
  169. package/src/extension/rpc.d.ts.map +1 -0
  170. package/src/extension/rpc.js +687 -0
  171. package/src/extension/rpc.js.map +1 -0
  172. package/src/extension/schemas.d.ts +252 -0
  173. package/src/extension/schemas.d.ts.map +1 -0
  174. package/src/extension/schemas.js +396 -0
  175. package/src/extension/schemas.js.map +1 -0
  176. package/src/extension/steering-notices.d.ts +15 -0
  177. package/src/extension/steering-notices.d.ts.map +1 -0
  178. package/src/extension/steering-notices.js +23 -0
  179. package/src/extension/steering-notices.js.map +1 -0
  180. package/src/extension/subagent-guide.d.ts +4 -0
  181. package/src/extension/subagent-guide.d.ts.map +1 -0
  182. package/src/extension/subagent-guide.js +35 -0
  183. package/src/extension/subagent-guide.js.map +1 -0
  184. package/src/extension/tool-description.d.ts +20 -0
  185. package/src/extension/tool-description.d.ts.map +1 -0
  186. package/src/extension/tool-description.js +160 -0
  187. package/src/extension/tool-description.js.map +1 -0
  188. package/src/extension/tool-result.d.ts +10 -0
  189. package/src/extension/tool-result.d.ts.map +1 -0
  190. package/src/extension/tool-result.js +17 -0
  191. package/src/extension/tool-result.js.map +1 -0
  192. package/src/inspectors/actions.d.ts +23 -0
  193. package/src/inspectors/actions.d.ts.map +1 -0
  194. package/src/inspectors/actions.js +155 -0
  195. package/src/inspectors/actions.js.map +1 -0
  196. package/src/inspectors/ghostty/actions.d.ts +12 -0
  197. package/src/inspectors/ghostty/actions.d.ts.map +1 -0
  198. package/src/inspectors/ghostty/actions.js +63 -0
  199. package/src/inspectors/ghostty/actions.js.map +1 -0
  200. package/src/inspectors/ghostty/plugin.d.ts +8 -0
  201. package/src/inspectors/ghostty/plugin.d.ts.map +1 -0
  202. package/src/inspectors/ghostty/plugin.js +24 -0
  203. package/src/inspectors/ghostty/plugin.js.map +1 -0
  204. package/src/inspectors/herdr/actions.d.ts +26 -0
  205. package/src/inspectors/herdr/actions.d.ts.map +1 -0
  206. package/src/inspectors/herdr/actions.js +134 -0
  207. package/src/inspectors/herdr/actions.js.map +1 -0
  208. package/src/inspectors/herdr/client.d.ts +42 -0
  209. package/src/inspectors/herdr/client.d.ts.map +1 -0
  210. package/src/inspectors/herdr/client.js +130 -0
  211. package/src/inspectors/herdr/client.js.map +1 -0
  212. package/src/inspectors/herdr/focus.d.ts +25 -0
  213. package/src/inspectors/herdr/focus.d.ts.map +1 -0
  214. package/src/inspectors/herdr/focus.js +50 -0
  215. package/src/inspectors/herdr/focus.js.map +1 -0
  216. package/src/inspectors/herdr/plugin.d.ts +7 -0
  217. package/src/inspectors/herdr/plugin.d.ts.map +1 -0
  218. package/src/inspectors/herdr/plugin.js +15 -0
  219. package/src/inspectors/herdr/plugin.js.map +1 -0
  220. package/src/inspectors/herdr/project-panes.d.ts +137 -0
  221. package/src/inspectors/herdr/project-panes.d.ts.map +1 -0
  222. package/src/inspectors/herdr/project-panes.js +608 -0
  223. package/src/inspectors/herdr/project-panes.js.map +1 -0
  224. package/src/inspectors/inspector-runner.d.ts +24 -0
  225. package/src/inspectors/inspector-runner.d.ts.map +1 -0
  226. package/src/inspectors/inspector-runner.js +162 -0
  227. package/src/inspectors/inspector-runner.js.map +1 -0
  228. package/src/inspectors/plugins.d.ts +4 -0
  229. package/src/inspectors/plugins.d.ts.map +1 -0
  230. package/src/inspectors/plugins.js +7 -0
  231. package/src/inspectors/plugins.js.map +1 -0
  232. package/src/inspectors/session-roots-codec.d.ts +16 -0
  233. package/src/inspectors/session-roots-codec.d.ts.map +1 -0
  234. package/src/inspectors/session-roots-codec.js +33 -0
  235. package/src/inspectors/session-roots-codec.js.map +1 -0
  236. package/src/inspectors/shell-command.d.ts +2 -0
  237. package/src/inspectors/shell-command.d.ts.map +1 -0
  238. package/src/inspectors/shell-command.js +17 -0
  239. package/src/inspectors/shell-command.js.map +1 -0
  240. package/src/inspectors/types.d.ts +49 -0
  241. package/src/inspectors/types.d.ts.map +1 -0
  242. package/src/inspectors/types.js +2 -0
  243. package/src/inspectors/types.js.map +1 -0
  244. package/src/integrations/herdr-status.d.ts +46 -0
  245. package/src/integrations/herdr-status.d.ts.map +1 -0
  246. package/src/integrations/herdr-status.js +371 -0
  247. package/src/integrations/herdr-status.js.map +1 -0
  248. package/src/integrations/pi-web-session-liveness.d.ts +20 -0
  249. package/src/integrations/pi-web-session-liveness.d.ts.map +1 -0
  250. package/src/integrations/pi-web-session-liveness.js +54 -0
  251. package/src/integrations/pi-web-session-liveness.js.map +1 -0
  252. package/src/intercom/intercom-bridge.d.ts +59 -0
  253. package/src/intercom/intercom-bridge.d.ts.map +1 -0
  254. package/src/intercom/intercom-bridge.js +192 -0
  255. package/src/intercom/intercom-bridge.js.map +1 -0
  256. package/src/intercom/native-supervisor-channel.d.ts +64 -0
  257. package/src/intercom/native-supervisor-channel.d.ts.map +1 -0
  258. package/src/intercom/native-supervisor-channel.js +894 -0
  259. package/src/intercom/native-supervisor-channel.js.map +1 -0
  260. package/src/intercom/result-intercom.d.ts +36 -0
  261. package/src/intercom/result-intercom.d.ts.map +1 -0
  262. package/src/intercom/result-intercom.js +372 -0
  263. package/src/intercom/result-intercom.js.map +1 -0
  264. package/src/intercom/supervisor-ui.d.ts +40 -0
  265. package/src/intercom/supervisor-ui.d.ts.map +1 -0
  266. package/src/intercom/supervisor-ui.js +202 -0
  267. package/src/intercom/supervisor-ui.js.map +1 -0
  268. package/src/missions/actions.d.ts +55 -0
  269. package/src/missions/actions.d.ts.map +1 -0
  270. package/src/missions/actions.js +396 -0
  271. package/src/missions/actions.js.map +1 -0
  272. package/src/missions/goal-driver.d.ts +16 -0
  273. package/src/missions/goal-driver.d.ts.map +1 -0
  274. package/src/missions/goal-driver.js +157 -0
  275. package/src/missions/goal-driver.js.map +1 -0
  276. package/src/missions/lifecycle.d.ts +40 -0
  277. package/src/missions/lifecycle.d.ts.map +1 -0
  278. package/src/missions/lifecycle.js +352 -0
  279. package/src/missions/lifecycle.js.map +1 -0
  280. package/src/missions/store.d.ts +22 -0
  281. package/src/missions/store.d.ts.map +1 -0
  282. package/src/missions/store.js +573 -0
  283. package/src/missions/store.js.map +1 -0
  284. package/src/missions/types.d.ts +168 -0
  285. package/src/missions/types.d.ts.map +1 -0
  286. package/src/missions/types.js +10 -0
  287. package/src/missions/types.js.map +1 -0
  288. package/src/missions/workflow-state.d.ts +15 -0
  289. package/src/missions/workflow-state.d.ts.map +1 -0
  290. package/src/missions/workflow-state.js +274 -0
  291. package/src/missions/workflow-state.js.map +1 -0
  292. package/src/policy/authority.d.ts +10 -0
  293. package/src/policy/authority.d.ts.map +1 -0
  294. package/src/policy/authority.js +42 -0
  295. package/src/policy/authority.js.map +1 -0
  296. package/src/profiles/profiles.d.ts +135 -0
  297. package/src/profiles/profiles.d.ts.map +1 -0
  298. package/src/profiles/profiles.js +520 -0
  299. package/src/profiles/profiles.js.map +1 -0
  300. package/src/runs/background/active-async-capacity.d.ts +100 -0
  301. package/src/runs/background/active-async-capacity.d.ts.map +1 -0
  302. package/src/runs/background/active-async-capacity.js +492 -0
  303. package/src/runs/background/active-async-capacity.js.map +1 -0
  304. package/src/runs/background/active-run-index.d.ts +13 -0
  305. package/src/runs/background/active-run-index.d.ts.map +1 -0
  306. package/src/runs/background/active-run-index.js +158 -0
  307. package/src/runs/background/active-run-index.js.map +1 -0
  308. package/src/runs/background/async-execution.d.ts +274 -0
  309. package/src/runs/background/async-execution.d.ts.map +1 -0
  310. package/src/runs/background/async-execution.js +1989 -0
  311. package/src/runs/background/async-execution.js.map +1 -0
  312. package/src/runs/background/async-job-tracker.d.ts +28 -0
  313. package/src/runs/background/async-job-tracker.d.ts.map +1 -0
  314. package/src/runs/background/async-job-tracker.js +876 -0
  315. package/src/runs/background/async-job-tracker.js.map +1 -0
  316. package/src/runs/background/async-resume.d.ts +59 -0
  317. package/src/runs/background/async-resume.d.ts.map +1 -0
  318. package/src/runs/background/async-resume.js +670 -0
  319. package/src/runs/background/async-resume.js.map +1 -0
  320. package/src/runs/background/async-retention.d.ts +45 -0
  321. package/src/runs/background/async-retention.d.ts.map +1 -0
  322. package/src/runs/background/async-retention.js +884 -0
  323. package/src/runs/background/async-retention.js.map +1 -0
  324. package/src/runs/background/async-status-snapshot.d.ts +10 -0
  325. package/src/runs/background/async-status-snapshot.d.ts.map +1 -0
  326. package/src/runs/background/async-status-snapshot.js +25 -0
  327. package/src/runs/background/async-status-snapshot.js.map +1 -0
  328. package/src/runs/background/async-status.d.ts +169 -0
  329. package/src/runs/background/async-status.d.ts.map +1 -0
  330. package/src/runs/background/async-status.js +673 -0
  331. package/src/runs/background/async-status.js.map +1 -0
  332. package/src/runs/background/auto-drain.d.ts +17 -0
  333. package/src/runs/background/auto-drain.d.ts.map +1 -0
  334. package/src/runs/background/auto-drain.js +73 -0
  335. package/src/runs/background/auto-drain.js.map +1 -0
  336. package/src/runs/background/binary-bootstrap.d.ts +9 -0
  337. package/src/runs/background/binary-bootstrap.d.ts.map +1 -0
  338. package/src/runs/background/binary-bootstrap.js +41 -0
  339. package/src/runs/background/binary-bootstrap.js.map +1 -0
  340. package/src/runs/background/chain-append.d.ts +35 -0
  341. package/src/runs/background/chain-append.d.ts.map +1 -0
  342. package/src/runs/background/chain-append.js +300 -0
  343. package/src/runs/background/chain-append.js.map +1 -0
  344. package/src/runs/background/chain-root-attachment.d.ts +49 -0
  345. package/src/runs/background/chain-root-attachment.d.ts.map +1 -0
  346. package/src/runs/background/chain-root-attachment.js +184 -0
  347. package/src/runs/background/chain-root-attachment.js.map +1 -0
  348. package/src/runs/background/completion-batcher.d.ts +52 -0
  349. package/src/runs/background/completion-batcher.d.ts.map +1 -0
  350. package/src/runs/background/completion-batcher.js +120 -0
  351. package/src/runs/background/completion-batcher.js.map +1 -0
  352. package/src/runs/background/completion-dedupe.d.ts +14 -0
  353. package/src/runs/background/completion-dedupe.d.ts.map +1 -0
  354. package/src/runs/background/completion-dedupe.js +49 -0
  355. package/src/runs/background/completion-dedupe.js.map +1 -0
  356. package/src/runs/background/completion-replay.d.ts +48 -0
  357. package/src/runs/background/completion-replay.d.ts.map +1 -0
  358. package/src/runs/background/completion-replay.js +267 -0
  359. package/src/runs/background/completion-replay.js.map +1 -0
  360. package/src/runs/background/control-channel.d.ts +156 -0
  361. package/src/runs/background/control-channel.d.ts.map +1 -0
  362. package/src/runs/background/control-channel.js +521 -0
  363. package/src/runs/background/control-channel.js.map +1 -0
  364. package/src/runs/background/fleet-view.d.ts +64 -0
  365. package/src/runs/background/fleet-view.d.ts.map +1 -0
  366. package/src/runs/background/fleet-view.js +648 -0
  367. package/src/runs/background/fleet-view.js.map +1 -0
  368. package/src/runs/background/index-segment.d.ts +16 -0
  369. package/src/runs/background/index-segment.d.ts.map +1 -0
  370. package/src/runs/background/index-segment.js +59 -0
  371. package/src/runs/background/index-segment.js.map +1 -0
  372. package/src/runs/background/inspect-rpc.d.ts +60 -0
  373. package/src/runs/background/inspect-rpc.d.ts.map +1 -0
  374. package/src/runs/background/inspect-rpc.js +406 -0
  375. package/src/runs/background/inspect-rpc.js.map +1 -0
  376. package/src/runs/background/notify.d.ts +162 -0
  377. package/src/runs/background/notify.d.ts.map +1 -0
  378. package/src/runs/background/notify.js +665 -0
  379. package/src/runs/background/notify.js.map +1 -0
  380. package/src/runs/background/owned-process-tree.d.ts +11 -0
  381. package/src/runs/background/owned-process-tree.d.ts.map +1 -0
  382. package/src/runs/background/owned-process-tree.js +117 -0
  383. package/src/runs/background/owned-process-tree.js.map +1 -0
  384. package/src/runs/background/parallel-groups.d.ts +4 -0
  385. package/src/runs/background/parallel-groups.d.ts.map +1 -0
  386. package/src/runs/background/parallel-groups.js +47 -0
  387. package/src/runs/background/parallel-groups.js.map +1 -0
  388. package/src/runs/background/process-terminal.d.ts +34 -0
  389. package/src/runs/background/process-terminal.d.ts.map +1 -0
  390. package/src/runs/background/process-terminal.js +305 -0
  391. package/src/runs/background/process-terminal.js.map +1 -0
  392. package/src/runs/background/result-delivery-ownership.d.ts +11 -0
  393. package/src/runs/background/result-delivery-ownership.d.ts.map +1 -0
  394. package/src/runs/background/result-delivery-ownership.js +37 -0
  395. package/src/runs/background/result-delivery-ownership.js.map +1 -0
  396. package/src/runs/background/result-files.d.ts +33 -0
  397. package/src/runs/background/result-files.d.ts.map +1 -0
  398. package/src/runs/background/result-files.js +528 -0
  399. package/src/runs/background/result-files.js.map +1 -0
  400. package/src/runs/background/result-watcher.d.ts +87 -0
  401. package/src/runs/background/result-watcher.d.ts.map +1 -0
  402. package/src/runs/background/result-watcher.js +764 -0
  403. package/src/runs/background/result-watcher.js.map +1 -0
  404. package/src/runs/background/resume-guidance.d.ts +5 -0
  405. package/src/runs/background/resume-guidance.d.ts.map +1 -0
  406. package/src/runs/background/resume-guidance.js +57 -0
  407. package/src/runs/background/resume-guidance.js.map +1 -0
  408. package/src/runs/background/retained-children.d.ts +25 -0
  409. package/src/runs/background/retained-children.d.ts.map +1 -0
  410. package/src/runs/background/retained-children.js +128 -0
  411. package/src/runs/background/retained-children.js.map +1 -0
  412. package/src/runs/background/retained-nested-route-tracker.d.ts +13 -0
  413. package/src/runs/background/retained-nested-route-tracker.d.ts.map +1 -0
  414. package/src/runs/background/retained-nested-route-tracker.js +91 -0
  415. package/src/runs/background/retained-nested-route-tracker.js.map +1 -0
  416. package/src/runs/background/run-child-session.d.ts +123 -0
  417. package/src/runs/background/run-child-session.d.ts.map +1 -0
  418. package/src/runs/background/run-child-session.js +602 -0
  419. package/src/runs/background/run-child-session.js.map +1 -0
  420. package/src/runs/background/run-id-query.d.ts +4 -0
  421. package/src/runs/background/run-id-query.d.ts.map +1 -0
  422. package/src/runs/background/run-id-query.js +7 -0
  423. package/src/runs/background/run-id-query.js.map +1 -0
  424. package/src/runs/background/run-id-resolver.d.ts +23 -0
  425. package/src/runs/background/run-id-resolver.d.ts.map +1 -0
  426. package/src/runs/background/run-id-resolver.js +170 -0
  427. package/src/runs/background/run-id-resolver.js.map +1 -0
  428. package/src/runs/background/run-status.d.ts +26 -0
  429. package/src/runs/background/run-status.d.ts.map +1 -0
  430. package/src/runs/background/run-status.js +826 -0
  431. package/src/runs/background/run-status.js.map +1 -0
  432. package/src/runs/background/runner-aliases.d.ts +17 -0
  433. package/src/runs/background/runner-aliases.d.ts.map +1 -0
  434. package/src/runs/background/runner-aliases.js +141 -0
  435. package/src/runs/background/runner-aliases.js.map +1 -0
  436. package/src/runs/background/runner-child-launch.d.ts +24 -0
  437. package/src/runs/background/runner-child-launch.d.ts.map +1 -0
  438. package/src/runs/background/runner-child-launch.js +68 -0
  439. package/src/runs/background/runner-child-launch.js.map +1 -0
  440. package/src/runs/background/runner-child-sessions.d.ts +7 -0
  441. package/src/runs/background/runner-child-sessions.d.ts.map +1 -0
  442. package/src/runs/background/runner-child-sessions.js +35 -0
  443. package/src/runs/background/runner-child-sessions.js.map +1 -0
  444. package/src/runs/background/runner-http-dispatcher.d.ts +43 -0
  445. package/src/runs/background/runner-http-dispatcher.d.ts.map +1 -0
  446. package/src/runs/background/runner-http-dispatcher.js +114 -0
  447. package/src/runs/background/runner-http-dispatcher.js.map +1 -0
  448. package/src/runs/background/scheduled-runs.d.ts +116 -0
  449. package/src/runs/background/scheduled-runs.d.ts.map +1 -0
  450. package/src/runs/background/scheduled-runs.js +1024 -0
  451. package/src/runs/background/scheduled-runs.js.map +1 -0
  452. package/src/runs/background/stale-run-reconciler.d.ts +37 -0
  453. package/src/runs/background/stale-run-reconciler.d.ts.map +1 -0
  454. package/src/runs/background/stale-run-reconciler.js +393 -0
  455. package/src/runs/background/stale-run-reconciler.js.map +1 -0
  456. package/src/runs/background/steering.d.ts +52 -0
  457. package/src/runs/background/steering.d.ts.map +1 -0
  458. package/src/runs/background/steering.js +247 -0
  459. package/src/runs/background/steering.js.map +1 -0
  460. package/src/runs/background/subagent-runner.d.ts +201 -0
  461. package/src/runs/background/subagent-runner.d.ts.map +1 -0
  462. package/src/runs/background/subagent-runner.js +5134 -0
  463. package/src/runs/background/subagent-runner.js.map +1 -0
  464. package/src/runs/background/subagent-wait.d.ts +122 -0
  465. package/src/runs/background/subagent-wait.d.ts.map +1 -0
  466. package/src/runs/background/subagent-wait.js +735 -0
  467. package/src/runs/background/subagent-wait.js.map +1 -0
  468. package/src/runs/background/terminal-run-index.d.ts +8 -0
  469. package/src/runs/background/terminal-run-index.d.ts.map +1 -0
  470. package/src/runs/background/terminal-run-index.js +123 -0
  471. package/src/runs/background/terminal-run-index.js.map +1 -0
  472. package/src/runs/background/top-level-async.d.ts +8 -0
  473. package/src/runs/background/top-level-async.d.ts.map +1 -0
  474. package/src/runs/background/top-level-async.js +6 -0
  475. package/src/runs/background/top-level-async.js.map +1 -0
  476. package/src/runs/background/wait-completions.d.ts +29 -0
  477. package/src/runs/background/wait-completions.d.ts.map +1 -0
  478. package/src/runs/background/wait-completions.js +264 -0
  479. package/src/runs/background/wait-completions.js.map +1 -0
  480. package/src/runs/background/wait-config.d.ts +9 -0
  481. package/src/runs/background/wait-config.d.ts.map +1 -0
  482. package/src/runs/background/wait-config.js +47 -0
  483. package/src/runs/background/wait-config.js.map +1 -0
  484. package/src/runs/background/wait-subscriptions.d.ts +27 -0
  485. package/src/runs/background/wait-subscriptions.d.ts.map +1 -0
  486. package/src/runs/background/wait-subscriptions.js +337 -0
  487. package/src/runs/background/wait-subscriptions.js.map +1 -0
  488. package/src/runs/background/wait-tool.d.ts +7 -0
  489. package/src/runs/background/wait-tool.d.ts.map +1 -0
  490. package/src/runs/background/wait-tool.js +36 -0
  491. package/src/runs/background/wait-tool.js.map +1 -0
  492. package/src/runs/foreground/async-dismiss-action.d.ts +7 -0
  493. package/src/runs/foreground/async-dismiss-action.d.ts.map +1 -0
  494. package/src/runs/foreground/async-dismiss-action.js +82 -0
  495. package/src/runs/foreground/async-dismiss-action.js.map +1 -0
  496. package/src/runs/foreground/async-steering-action.d.ts +32 -0
  497. package/src/runs/foreground/async-steering-action.d.ts.map +1 -0
  498. package/src/runs/foreground/async-steering-action.js +270 -0
  499. package/src/runs/foreground/async-steering-action.js.map +1 -0
  500. package/src/runs/foreground/async-stop-action.d.ts +7 -0
  501. package/src/runs/foreground/async-stop-action.d.ts.map +1 -0
  502. package/src/runs/foreground/async-stop-action.js +171 -0
  503. package/src/runs/foreground/async-stop-action.js.map +1 -0
  504. package/src/runs/foreground/execution.d.ts +11 -0
  505. package/src/runs/foreground/execution.d.ts.map +1 -0
  506. package/src/runs/foreground/execution.js +2186 -0
  507. package/src/runs/foreground/execution.js.map +1 -0
  508. package/src/runs/foreground/foreground-control.d.ts +25 -0
  509. package/src/runs/foreground/foreground-control.d.ts.map +1 -0
  510. package/src/runs/foreground/foreground-control.js +139 -0
  511. package/src/runs/foreground/foreground-control.js.map +1 -0
  512. package/src/runs/foreground/foreground-history.d.ts +12 -0
  513. package/src/runs/foreground/foreground-history.d.ts.map +1 -0
  514. package/src/runs/foreground/foreground-history.js +165 -0
  515. package/src/runs/foreground/foreground-history.js.map +1 -0
  516. package/src/runs/foreground/prompt-audit.d.ts +33 -0
  517. package/src/runs/foreground/prompt-audit.d.ts.map +1 -0
  518. package/src/runs/foreground/prompt-audit.js +143 -0
  519. package/src/runs/foreground/prompt-audit.js.map +1 -0
  520. package/src/runs/foreground/subagent-executor.d.ts +296 -0
  521. package/src/runs/foreground/subagent-executor.d.ts.map +1 -0
  522. package/src/runs/foreground/subagent-executor.js +7047 -0
  523. package/src/runs/foreground/subagent-executor.js.map +1 -0
  524. package/src/runs/foreground/workflow-detach-reconcile.d.ts +16 -0
  525. package/src/runs/foreground/workflow-detach-reconcile.d.ts.map +1 -0
  526. package/src/runs/foreground/workflow-detach-reconcile.js +284 -0
  527. package/src/runs/foreground/workflow-detach-reconcile.js.map +1 -0
  528. package/src/runs/foreground/workflow-foreground-steering.d.ts +44 -0
  529. package/src/runs/foreground/workflow-foreground-steering.d.ts.map +1 -0
  530. package/src/runs/foreground/workflow-foreground-steering.js +149 -0
  531. package/src/runs/foreground/workflow-foreground-steering.js.map +1 -0
  532. package/src/runs/shared/abort-recovery.d.ts +27 -0
  533. package/src/runs/shared/abort-recovery.d.ts.map +1 -0
  534. package/src/runs/shared/abort-recovery.js +109 -0
  535. package/src/runs/shared/abort-recovery.js.map +1 -0
  536. package/src/runs/shared/acceptance.d.ts +145 -0
  537. package/src/runs/shared/acceptance.d.ts.map +1 -0
  538. package/src/runs/shared/acceptance.js +1650 -0
  539. package/src/runs/shared/acceptance.js.map +1 -0
  540. package/src/runs/shared/agent-contract.d.ts +6 -0
  541. package/src/runs/shared/agent-contract.d.ts.map +1 -0
  542. package/src/runs/shared/agent-contract.js +36 -0
  543. package/src/runs/shared/agent-contract.js.map +1 -0
  544. package/src/runs/shared/async-status-projection.d.ts +94 -0
  545. package/src/runs/shared/async-status-projection.d.ts.map +1 -0
  546. package/src/runs/shared/async-status-projection.js +542 -0
  547. package/src/runs/shared/async-status-projection.js.map +1 -0
  548. package/src/runs/shared/background-process-options.d.ts +5 -0
  549. package/src/runs/shared/background-process-options.d.ts.map +1 -0
  550. package/src/runs/shared/background-process-options.js +7 -0
  551. package/src/runs/shared/background-process-options.js.map +1 -0
  552. package/src/runs/shared/capability-ceiling.d.ts +58 -0
  553. package/src/runs/shared/capability-ceiling.d.ts.map +1 -0
  554. package/src/runs/shared/capability-ceiling.js +179 -0
  555. package/src/runs/shared/capability-ceiling.js.map +1 -0
  556. package/src/runs/shared/chain-outputs.d.ts +19 -0
  557. package/src/runs/shared/chain-outputs.d.ts.map +1 -0
  558. package/src/runs/shared/chain-outputs.js +105 -0
  559. package/src/runs/shared/chain-outputs.js.map +1 -0
  560. package/src/runs/shared/child-hooks.d.ts +34 -0
  561. package/src/runs/shared/child-hooks.d.ts.map +1 -0
  562. package/src/runs/shared/child-hooks.js +188 -0
  563. package/src/runs/shared/child-hooks.js.map +1 -0
  564. package/src/runs/shared/child-identity.d.ts +24 -0
  565. package/src/runs/shared/child-identity.d.ts.map +1 -0
  566. package/src/runs/shared/child-identity.js +41 -0
  567. package/src/runs/shared/child-identity.js.map +1 -0
  568. package/src/runs/shared/child-launch-plan.d.ts +71 -0
  569. package/src/runs/shared/child-launch-plan.d.ts.map +1 -0
  570. package/src/runs/shared/child-launch-plan.js +89 -0
  571. package/src/runs/shared/child-launch-plan.js.map +1 -0
  572. package/src/runs/shared/child-launch.d.ts +114 -0
  573. package/src/runs/shared/child-launch.d.ts.map +1 -0
  574. package/src/runs/shared/child-launch.js +231 -0
  575. package/src/runs/shared/child-launch.js.map +1 -0
  576. package/src/runs/shared/child-lifecycle.d.ts +14 -0
  577. package/src/runs/shared/child-lifecycle.d.ts.map +1 -0
  578. package/src/runs/shared/child-lifecycle.js +23 -0
  579. package/src/runs/shared/child-lifecycle.js.map +1 -0
  580. package/src/runs/shared/child-runtime-config.d.ts +102 -0
  581. package/src/runs/shared/child-runtime-config.d.ts.map +1 -0
  582. package/src/runs/shared/child-runtime-config.js +39 -0
  583. package/src/runs/shared/child-runtime-config.js.map +1 -0
  584. package/src/runs/shared/child-session.d.ts +155 -0
  585. package/src/runs/shared/child-session.d.ts.map +1 -0
  586. package/src/runs/shared/child-session.js +347 -0
  587. package/src/runs/shared/child-session.js.map +1 -0
  588. package/src/runs/shared/child-tool-plan.d.ts +73 -0
  589. package/src/runs/shared/child-tool-plan.d.ts.map +1 -0
  590. package/src/runs/shared/child-tool-plan.js +380 -0
  591. package/src/runs/shared/child-tool-plan.js.map +1 -0
  592. package/src/runs/shared/claude-code-adapter.d.ts +25 -0
  593. package/src/runs/shared/claude-code-adapter.d.ts.map +1 -0
  594. package/src/runs/shared/claude-code-adapter.js +120 -0
  595. package/src/runs/shared/claude-code-adapter.js.map +1 -0
  596. package/src/runs/shared/codex-exec-adapter.d.ts +26 -0
  597. package/src/runs/shared/codex-exec-adapter.d.ts.map +1 -0
  598. package/src/runs/shared/codex-exec-adapter.js +128 -0
  599. package/src/runs/shared/codex-exec-adapter.js.map +1 -0
  600. package/src/runs/shared/completion-evidence.d.ts +31 -0
  601. package/src/runs/shared/completion-evidence.d.ts.map +1 -0
  602. package/src/runs/shared/completion-evidence.js +54 -0
  603. package/src/runs/shared/completion-evidence.js.map +1 -0
  604. package/src/runs/shared/completion-guard.d.ts +35 -0
  605. package/src/runs/shared/completion-guard.d.ts.map +1 -0
  606. package/src/runs/shared/completion-guard.js +214 -0
  607. package/src/runs/shared/completion-guard.js.map +1 -0
  608. package/src/runs/shared/context-mode.d.ts +13 -0
  609. package/src/runs/shared/context-mode.d.ts.map +1 -0
  610. package/src/runs/shared/context-mode.js +39 -0
  611. package/src/runs/shared/context-mode.js.map +1 -0
  612. package/src/runs/shared/cursor-agent-adapter.d.ts +27 -0
  613. package/src/runs/shared/cursor-agent-adapter.d.ts.map +1 -0
  614. package/src/runs/shared/cursor-agent-adapter.js +100 -0
  615. package/src/runs/shared/cursor-agent-adapter.js.map +1 -0
  616. package/src/runs/shared/dynamic-fanout.d.ts +50 -0
  617. package/src/runs/shared/dynamic-fanout.d.ts.map +1 -0
  618. package/src/runs/shared/dynamic-fanout.js +274 -0
  619. package/src/runs/shared/dynamic-fanout.js.map +1 -0
  620. package/src/runs/shared/effective-system-prompt.d.ts +18 -0
  621. package/src/runs/shared/effective-system-prompt.d.ts.map +1 -0
  622. package/src/runs/shared/effective-system-prompt.js +23 -0
  623. package/src/runs/shared/effective-system-prompt.js.map +1 -0
  624. package/src/runs/shared/extension-bindings.d.ts +17 -0
  625. package/src/runs/shared/extension-bindings.d.ts.map +1 -0
  626. package/src/runs/shared/extension-bindings.js +83 -0
  627. package/src/runs/shared/extension-bindings.js.map +1 -0
  628. package/src/runs/shared/external-cli-contract.d.ts +30 -0
  629. package/src/runs/shared/external-cli-contract.d.ts.map +1 -0
  630. package/src/runs/shared/external-cli-contract.js +146 -0
  631. package/src/runs/shared/external-cli-contract.js.map +1 -0
  632. package/src/runs/shared/external-cli-preflight.d.ts +32 -0
  633. package/src/runs/shared/external-cli-preflight.d.ts.map +1 -0
  634. package/src/runs/shared/external-cli-preflight.js +116 -0
  635. package/src/runs/shared/external-cli-preflight.js.map +1 -0
  636. package/src/runs/shared/external-cli-runner.d.ts +66 -0
  637. package/src/runs/shared/external-cli-runner.d.ts.map +1 -0
  638. package/src/runs/shared/external-cli-runner.js +421 -0
  639. package/src/runs/shared/external-cli-runner.js.map +1 -0
  640. package/src/runs/shared/external-job-bridge.d.ts +18 -0
  641. package/src/runs/shared/external-job-bridge.d.ts.map +1 -0
  642. package/src/runs/shared/external-job-bridge.js +424 -0
  643. package/src/runs/shared/external-job-bridge.js.map +1 -0
  644. package/src/runs/shared/external-job-runner.d.ts +45 -0
  645. package/src/runs/shared/external-job-runner.d.ts.map +1 -0
  646. package/src/runs/shared/external-job-runner.js +353 -0
  647. package/src/runs/shared/external-job-runner.js.map +1 -0
  648. package/src/runs/shared/fast-mode-extension.d.ts +4 -0
  649. package/src/runs/shared/fast-mode-extension.d.ts.map +1 -0
  650. package/src/runs/shared/fast-mode-extension.js +9 -0
  651. package/src/runs/shared/fast-mode-extension.js.map +1 -0
  652. package/src/runs/shared/herdr-connection.d.ts +71 -0
  653. package/src/runs/shared/herdr-connection.d.ts.map +1 -0
  654. package/src/runs/shared/herdr-connection.js +258 -0
  655. package/src/runs/shared/herdr-connection.js.map +1 -0
  656. package/src/runs/shared/herdr-external-adapters.d.ts +148 -0
  657. package/src/runs/shared/herdr-external-adapters.d.ts.map +1 -0
  658. package/src/runs/shared/herdr-external-adapters.js +405 -0
  659. package/src/runs/shared/herdr-external-adapters.js.map +1 -0
  660. package/src/runs/shared/herdr-machine.d.ts +48 -0
  661. package/src/runs/shared/herdr-machine.d.ts.map +1 -0
  662. package/src/runs/shared/herdr-machine.js +247 -0
  663. package/src/runs/shared/herdr-machine.js.map +1 -0
  664. package/src/runs/shared/herdr-pi-protocol.d.ts +22 -0
  665. package/src/runs/shared/herdr-pi-protocol.d.ts.map +1 -0
  666. package/src/runs/shared/herdr-pi-protocol.js +58 -0
  667. package/src/runs/shared/herdr-pi-protocol.js.map +1 -0
  668. package/src/runs/shared/herdr-placed-run.d.ts +267 -0
  669. package/src/runs/shared/herdr-placed-run.d.ts.map +1 -0
  670. package/src/runs/shared/herdr-placed-run.js +716 -0
  671. package/src/runs/shared/herdr-placed-run.js.map +1 -0
  672. package/src/runs/shared/host-step-status.d.ts +34 -0
  673. package/src/runs/shared/host-step-status.d.ts.map +1 -0
  674. package/src/runs/shared/host-step-status.js +245 -0
  675. package/src/runs/shared/host-step-status.js.map +1 -0
  676. package/src/runs/shared/lane-metadata.d.ts +24 -0
  677. package/src/runs/shared/lane-metadata.d.ts.map +1 -0
  678. package/src/runs/shared/lane-metadata.js +127 -0
  679. package/src/runs/shared/lane-metadata.js.map +1 -0
  680. package/src/runs/shared/launch-cwd.d.ts +2 -0
  681. package/src/runs/shared/launch-cwd.d.ts.map +1 -0
  682. package/src/runs/shared/launch-cwd.js +17 -0
  683. package/src/runs/shared/launch-cwd.js.map +1 -0
  684. package/src/runs/shared/llm-intent-arbiter.d.ts +48 -0
  685. package/src/runs/shared/llm-intent-arbiter.d.ts.map +1 -0
  686. package/src/runs/shared/llm-intent-arbiter.js +235 -0
  687. package/src/runs/shared/llm-intent-arbiter.js.map +1 -0
  688. package/src/runs/shared/long-running-guard.d.ts +33 -0
  689. package/src/runs/shared/long-running-guard.d.ts.map +1 -0
  690. package/src/runs/shared/long-running-guard.js +199 -0
  691. package/src/runs/shared/long-running-guard.js.map +1 -0
  692. package/src/runs/shared/mcp-config-sources.d.ts +30 -0
  693. package/src/runs/shared/mcp-config-sources.d.ts.map +1 -0
  694. package/src/runs/shared/mcp-config-sources.js +419 -0
  695. package/src/runs/shared/mcp-config-sources.js.map +1 -0
  696. package/src/runs/shared/mcp-direct-tool-allowlist.d.ts +59 -0
  697. package/src/runs/shared/mcp-direct-tool-allowlist.d.ts.map +1 -0
  698. package/src/runs/shared/mcp-direct-tool-allowlist.js +400 -0
  699. package/src/runs/shared/mcp-direct-tool-allowlist.js.map +1 -0
  700. package/src/runs/shared/mcp-direct-tool-grant.d.ts +41 -0
  701. package/src/runs/shared/mcp-direct-tool-grant.d.ts.map +1 -0
  702. package/src/runs/shared/mcp-direct-tool-grant.js +146 -0
  703. package/src/runs/shared/mcp-direct-tool-grant.js.map +1 -0
  704. package/src/runs/shared/model-resolution-diagnostic.d.ts +22 -0
  705. package/src/runs/shared/model-resolution-diagnostic.d.ts.map +1 -0
  706. package/src/runs/shared/model-resolution-diagnostic.js +65 -0
  707. package/src/runs/shared/model-resolution-diagnostic.js.map +1 -0
  708. package/src/runs/shared/model-resolution.d.ts +92 -0
  709. package/src/runs/shared/model-resolution.d.ts.map +1 -0
  710. package/src/runs/shared/model-resolution.js +343 -0
  711. package/src/runs/shared/model-resolution.js.map +1 -0
  712. package/src/runs/shared/model-scope.d.ts +68 -0
  713. package/src/runs/shared/model-scope.d.ts.map +1 -0
  714. package/src/runs/shared/model-scope.js +156 -0
  715. package/src/runs/shared/model-scope.js.map +1 -0
  716. package/src/runs/shared/mutation-evidence.d.ts +19 -0
  717. package/src/runs/shared/mutation-evidence.d.ts.map +1 -0
  718. package/src/runs/shared/mutation-evidence.js +199 -0
  719. package/src/runs/shared/mutation-evidence.js.map +1 -0
  720. package/src/runs/shared/nested-events.d.ts +134 -0
  721. package/src/runs/shared/nested-events.d.ts.map +1 -0
  722. package/src/runs/shared/nested-events.js +1056 -0
  723. package/src/runs/shared/nested-events.js.map +1 -0
  724. package/src/runs/shared/nested-path.d.ts +9 -0
  725. package/src/runs/shared/nested-path.d.ts.map +1 -0
  726. package/src/runs/shared/nested-path.js +35 -0
  727. package/src/runs/shared/nested-path.js.map +1 -0
  728. package/src/runs/shared/nested-render.d.ts +21 -0
  729. package/src/runs/shared/nested-render.d.ts.map +1 -0
  730. package/src/runs/shared/nested-render.js +116 -0
  731. package/src/runs/shared/nested-render.js.map +1 -0
  732. package/src/runs/shared/orca-progress-tabs.d.ts +33 -0
  733. package/src/runs/shared/orca-progress-tabs.d.ts.map +1 -0
  734. package/src/runs/shared/orca-progress-tabs.js +527 -0
  735. package/src/runs/shared/orca-progress-tabs.js.map +1 -0
  736. package/src/runs/shared/parallel-handoff.d.ts +73 -0
  737. package/src/runs/shared/parallel-handoff.d.ts.map +1 -0
  738. package/src/runs/shared/parallel-handoff.js +733 -0
  739. package/src/runs/shared/parallel-handoff.js.map +1 -0
  740. package/src/runs/shared/parallel-utils.d.ts +165 -0
  741. package/src/runs/shared/parallel-utils.d.ts.map +1 -0
  742. package/src/runs/shared/parallel-utils.js +126 -0
  743. package/src/runs/shared/parallel-utils.js.map +1 -0
  744. package/src/runs/shared/permissions.d.ts +13 -0
  745. package/src/runs/shared/permissions.d.ts.map +1 -0
  746. package/src/runs/shared/permissions.js +93 -0
  747. package/src/runs/shared/permissions.js.map +1 -0
  748. package/src/runs/shared/pi-spawn.d.ts +28 -0
  749. package/src/runs/shared/pi-spawn.d.ts.map +1 -0
  750. package/src/runs/shared/pi-spawn.js +156 -0
  751. package/src/runs/shared/pi-spawn.js.map +1 -0
  752. package/src/runs/shared/process-signal.d.ts +16 -0
  753. package/src/runs/shared/process-signal.d.ts.map +1 -0
  754. package/src/runs/shared/process-signal.js +22 -0
  755. package/src/runs/shared/process-signal.js.map +1 -0
  756. package/src/runs/shared/readonly-drain-observation.d.ts +26 -0
  757. package/src/runs/shared/readonly-drain-observation.d.ts.map +1 -0
  758. package/src/runs/shared/readonly-drain-observation.js +51 -0
  759. package/src/runs/shared/readonly-drain-observation.js.map +1 -0
  760. package/src/runs/shared/run-fanout-budget.d.ts +15 -0
  761. package/src/runs/shared/run-fanout-budget.d.ts.map +1 -0
  762. package/src/runs/shared/run-fanout-budget.js +259 -0
  763. package/src/runs/shared/run-fanout-budget.js.map +1 -0
  764. package/src/runs/shared/run-history.d.ts +20 -0
  765. package/src/runs/shared/run-history.d.ts.map +1 -0
  766. package/src/runs/shared/run-history.js +200 -0
  767. package/src/runs/shared/run-history.js.map +1 -0
  768. package/src/runs/shared/runtime-acknowledged-extensions.d.ts +8 -0
  769. package/src/runs/shared/runtime-acknowledged-extensions.d.ts.map +1 -0
  770. package/src/runs/shared/runtime-acknowledged-extensions.js +45 -0
  771. package/src/runs/shared/runtime-acknowledged-extensions.js.map +1 -0
  772. package/src/runs/shared/session-lease.d.ts +70 -0
  773. package/src/runs/shared/session-lease.d.ts.map +1 -0
  774. package/src/runs/shared/session-lease.js +251 -0
  775. package/src/runs/shared/session-lease.js.map +1 -0
  776. package/src/runs/shared/single-output.d.ts +61 -0
  777. package/src/runs/shared/single-output.d.ts.map +1 -0
  778. package/src/runs/shared/single-output.js +263 -0
  779. package/src/runs/shared/single-output.js.map +1 -0
  780. package/src/runs/shared/spawn-budget.d.ts +21 -0
  781. package/src/runs/shared/spawn-budget.d.ts.map +1 -0
  782. package/src/runs/shared/spawn-budget.js +94 -0
  783. package/src/runs/shared/spawn-budget.js.map +1 -0
  784. package/src/runs/shared/structured-output.d.ts +57 -0
  785. package/src/runs/shared/structured-output.d.ts.map +1 -0
  786. package/src/runs/shared/structured-output.js +391 -0
  787. package/src/runs/shared/structured-output.js.map +1 -0
  788. package/src/runs/shared/subagent-control.d.ts +50 -0
  789. package/src/runs/shared/subagent-control.d.ts.map +1 -0
  790. package/src/runs/shared/subagent-control.js +247 -0
  791. package/src/runs/shared/subagent-control.js.map +1 -0
  792. package/src/runs/shared/subagent-prompt-runtime.d.ts +28 -0
  793. package/src/runs/shared/subagent-prompt-runtime.d.ts.map +1 -0
  794. package/src/runs/shared/subagent-prompt-runtime.js +548 -0
  795. package/src/runs/shared/subagent-prompt-runtime.js.map +1 -0
  796. package/src/runs/shared/task-intent.d.ts +38 -0
  797. package/src/runs/shared/task-intent.d.ts.map +1 -0
  798. package/src/runs/shared/task-intent.js +213 -0
  799. package/src/runs/shared/task-intent.js.map +1 -0
  800. package/src/runs/shared/tool-availability.d.ts +17 -0
  801. package/src/runs/shared/tool-availability.d.ts.map +1 -0
  802. package/src/runs/shared/tool-availability.js +30 -0
  803. package/src/runs/shared/tool-availability.js.map +1 -0
  804. package/src/runs/shared/tool-budget.d.ts +22 -0
  805. package/src/runs/shared/tool-budget.d.ts.map +1 -0
  806. package/src/runs/shared/tool-budget.js +79 -0
  807. package/src/runs/shared/tool-budget.js.map +1 -0
  808. package/src/runs/shared/tool-timeout.d.ts +32 -0
  809. package/src/runs/shared/tool-timeout.d.ts.map +1 -0
  810. package/src/runs/shared/tool-timeout.js +74 -0
  811. package/src/runs/shared/tool-timeout.js.map +1 -0
  812. package/src/runs/shared/usage-budget.d.ts +8 -0
  813. package/src/runs/shared/usage-budget.d.ts.map +1 -0
  814. package/src/runs/shared/usage-budget.js +75 -0
  815. package/src/runs/shared/usage-budget.js.map +1 -0
  816. package/src/runs/shared/usage-reconciliation.d.ts +9 -0
  817. package/src/runs/shared/usage-reconciliation.d.ts.map +1 -0
  818. package/src/runs/shared/usage-reconciliation.js +72 -0
  819. package/src/runs/shared/usage-reconciliation.js.map +1 -0
  820. package/src/runs/shared/workflow-async-child-guidance.d.ts +4 -0
  821. package/src/runs/shared/workflow-async-child-guidance.d.ts.map +1 -0
  822. package/src/runs/shared/workflow-async-child-guidance.js +18 -0
  823. package/src/runs/shared/workflow-async-child-guidance.js.map +1 -0
  824. package/src/runs/shared/workflow-graph.d.ts +32 -0
  825. package/src/runs/shared/workflow-graph.d.ts.map +1 -0
  826. package/src/runs/shared/workflow-graph.js +222 -0
  827. package/src/runs/shared/workflow-graph.js.map +1 -0
  828. package/src/runs/shared/worktree-cleanup-plan.d.ts +78 -0
  829. package/src/runs/shared/worktree-cleanup-plan.d.ts.map +1 -0
  830. package/src/runs/shared/worktree-cleanup-plan.js +782 -0
  831. package/src/runs/shared/worktree-cleanup-plan.js.map +1 -0
  832. package/src/runs/shared/worktree-setup-command.d.ts +39 -0
  833. package/src/runs/shared/worktree-setup-command.d.ts.map +1 -0
  834. package/src/runs/shared/worktree-setup-command.js +201 -0
  835. package/src/runs/shared/worktree-setup-command.js.map +1 -0
  836. package/src/runs/shared/worktree.d.ts +179 -0
  837. package/src/runs/shared/worktree.d.ts.map +1 -0
  838. package/src/runs/shared/worktree.js +1333 -0
  839. package/src/runs/shared/worktree.js.map +1 -0
  840. package/src/shared/accessible-dir.d.ts +12 -0
  841. package/src/shared/accessible-dir.d.ts.map +1 -0
  842. package/src/shared/accessible-dir.js +37 -0
  843. package/src/shared/accessible-dir.js.map +1 -0
  844. package/src/shared/agent-stream-options.d.ts +6 -0
  845. package/src/shared/agent-stream-options.d.ts.map +1 -0
  846. package/src/shared/agent-stream-options.js +4 -0
  847. package/src/shared/agent-stream-options.js.map +1 -0
  848. package/src/shared/artifacts.d.ts +23 -0
  849. package/src/shared/artifacts.d.ts.map +1 -0
  850. package/src/shared/artifacts.js +273 -0
  851. package/src/shared/artifacts.js.map +1 -0
  852. package/src/shared/atomic-json.d.ts +19 -0
  853. package/src/shared/atomic-json.d.ts.map +1 -0
  854. package/src/shared/atomic-json.js +60 -0
  855. package/src/shared/atomic-json.js.map +1 -0
  856. package/src/shared/capacity-resilient-json.d.ts +27 -0
  857. package/src/shared/capacity-resilient-json.d.ts.map +1 -0
  858. package/src/shared/capacity-resilient-json.js +87 -0
  859. package/src/shared/capacity-resilient-json.js.map +1 -0
  860. package/src/shared/child-cache-retention.d.ts +30 -0
  861. package/src/shared/child-cache-retention.d.ts.map +1 -0
  862. package/src/shared/child-cache-retention.js +41 -0
  863. package/src/shared/child-cache-retention.js.map +1 -0
  864. package/src/shared/child-session-name.d.ts +9 -0
  865. package/src/shared/child-session-name.d.ts.map +1 -0
  866. package/src/shared/child-session-name.js +39 -0
  867. package/src/shared/child-session-name.js.map +1 -0
  868. package/src/shared/child-transcript.d.ts +38 -0
  869. package/src/shared/child-transcript.d.ts.map +1 -0
  870. package/src/shared/child-transcript.js +226 -0
  871. package/src/shared/child-transcript.js.map +1 -0
  872. package/src/shared/completion-owner.d.ts +3 -0
  873. package/src/shared/completion-owner.d.ts.map +1 -0
  874. package/src/shared/completion-owner.js +9 -0
  875. package/src/shared/completion-owner.js.map +1 -0
  876. package/src/shared/display-text.d.ts +6 -0
  877. package/src/shared/display-text.d.ts.map +1 -0
  878. package/src/shared/display-text.js +155 -0
  879. package/src/shared/display-text.js.map +1 -0
  880. package/src/shared/extension-context.d.ts +6 -0
  881. package/src/shared/extension-context.d.ts.map +1 -0
  882. package/src/shared/extension-context.js +22 -0
  883. package/src/shared/extension-context.js.map +1 -0
  884. package/src/shared/file-coalescer.d.ts +12 -0
  885. package/src/shared/file-coalescer.d.ts.map +1 -0
  886. package/src/shared/file-coalescer.js +35 -0
  887. package/src/shared/file-coalescer.js.map +1 -0
  888. package/src/shared/file-system-retry.d.ts +32 -0
  889. package/src/shared/file-system-retry.d.ts.map +1 -0
  890. package/src/shared/file-system-retry.js +85 -0
  891. package/src/shared/file-system-retry.js.map +1 -0
  892. package/src/shared/fork-context.d.ts +59 -0
  893. package/src/shared/fork-context.d.ts.map +1 -0
  894. package/src/shared/fork-context.js +171 -0
  895. package/src/shared/fork-context.js.map +1 -0
  896. package/src/shared/fork-session-cwd.d.ts +3 -0
  897. package/src/shared/fork-session-cwd.d.ts.map +1 -0
  898. package/src/shared/fork-session-cwd.js +24 -0
  899. package/src/shared/fork-session-cwd.js.map +1 -0
  900. package/src/shared/formatters.d.ts +36 -0
  901. package/src/shared/formatters.d.ts.map +1 -0
  902. package/src/shared/formatters.js +143 -0
  903. package/src/shared/formatters.js.map +1 -0
  904. package/src/shared/jsonl-writer.d.ts +21 -0
  905. package/src/shared/jsonl-writer.d.ts.map +1 -0
  906. package/src/shared/jsonl-writer.js +68 -0
  907. package/src/shared/jsonl-writer.js.map +1 -0
  908. package/src/shared/launch-contract.d.ts +64 -0
  909. package/src/shared/launch-contract.d.ts.map +1 -0
  910. package/src/shared/launch-contract.js +141 -0
  911. package/src/shared/launch-contract.js.map +1 -0
  912. package/src/shared/model-info.d.ts +44 -0
  913. package/src/shared/model-info.d.ts.map +1 -0
  914. package/src/shared/model-info.js +73 -0
  915. package/src/shared/model-info.js.map +1 -0
  916. package/src/shared/model-response-aliases.d.ts +2 -0
  917. package/src/shared/model-response-aliases.d.ts.map +1 -0
  918. package/src/shared/model-response-aliases.js +16 -0
  919. package/src/shared/model-response-aliases.js.map +1 -0
  920. package/src/shared/node-executable.d.ts +2 -0
  921. package/src/shared/node-executable.d.ts.map +1 -0
  922. package/src/shared/node-executable.js +21 -0
  923. package/src/shared/node-executable.js.map +1 -0
  924. package/src/shared/opencode-session-headers.d.ts +13 -0
  925. package/src/shared/opencode-session-headers.d.ts.map +1 -0
  926. package/src/shared/opencode-session-headers.js +27 -0
  927. package/src/shared/opencode-session-headers.js.map +1 -0
  928. package/src/shared/prompt-resources.d.ts +6 -0
  929. package/src/shared/prompt-resources.d.ts.map +1 -0
  930. package/src/shared/prompt-resources.js +11 -0
  931. package/src/shared/prompt-resources.js.map +1 -0
  932. package/src/shared/pruned-fork.d.ts +35 -0
  933. package/src/shared/pruned-fork.d.ts.map +1 -0
  934. package/src/shared/pruned-fork.js +424 -0
  935. package/src/shared/pruned-fork.js.map +1 -0
  936. package/src/shared/required-child-extensions.d.ts +20 -0
  937. package/src/shared/required-child-extensions.d.ts.map +1 -0
  938. package/src/shared/required-child-extensions.js +74 -0
  939. package/src/shared/required-child-extensions.js.map +1 -0
  940. package/src/shared/session-file-trust.d.ts +2 -0
  941. package/src/shared/session-file-trust.d.ts.map +1 -0
  942. package/src/shared/session-file-trust.js +21 -0
  943. package/src/shared/session-file-trust.js.map +1 -0
  944. package/src/shared/session-identity.d.ts +7 -0
  945. package/src/shared/session-identity.d.ts.map +1 -0
  946. package/src/shared/session-identity.js +7 -0
  947. package/src/shared/session-identity.js.map +1 -0
  948. package/src/shared/session-tokens.d.ts +3 -0
  949. package/src/shared/session-tokens.d.ts.map +1 -0
  950. package/src/shared/session-tokens.js +59 -0
  951. package/src/shared/session-tokens.js.map +1 -0
  952. package/src/shared/settings.d.ts +147 -0
  953. package/src/shared/settings.d.ts.map +1 -0
  954. package/src/shared/settings.js +248 -0
  955. package/src/shared/settings.js.map +1 -0
  956. package/src/shared/shortcuts.d.ts +2 -0
  957. package/src/shared/shortcuts.d.ts.map +1 -0
  958. package/src/shared/shortcuts.js +18 -0
  959. package/src/shared/shortcuts.js.map +1 -0
  960. package/src/shared/status-format.d.ts +10 -0
  961. package/src/shared/status-format.d.ts.map +1 -0
  962. package/src/shared/status-format.js +61 -0
  963. package/src/shared/status-format.js.map +1 -0
  964. package/src/shared/thinking-ceiling.d.ts +14 -0
  965. package/src/shared/thinking-ceiling.d.ts.map +1 -0
  966. package/src/shared/thinking-ceiling.js +38 -0
  967. package/src/shared/thinking-ceiling.js.map +1 -0
  968. package/src/shared/types.d.ts +2667 -0
  969. package/src/shared/types.d.ts.map +1 -0
  970. package/src/shared/types.js +265 -0
  971. package/src/shared/types.js.map +1 -0
  972. package/src/shared/utf8.d.ts +6 -0
  973. package/src/shared/utf8.d.ts.map +1 -0
  974. package/src/shared/utf8.js +13 -0
  975. package/src/shared/utf8.js.map +1 -0
  976. package/src/shared/utils.d.ts +71 -0
  977. package/src/shared/utils.d.ts.map +1 -0
  978. package/src/shared/utils.js +593 -0
  979. package/src/shared/utils.js.map +1 -0
  980. package/src/shared/watch-strategy.d.ts +3 -0
  981. package/src/shared/watch-strategy.d.ts.map +1 -0
  982. package/src/shared/watch-strategy.js +6 -0
  983. package/src/shared/watch-strategy.js.map +1 -0
  984. package/src/shared/workflow-child-permit.d.ts +59 -0
  985. package/src/shared/workflow-child-permit.d.ts.map +1 -0
  986. package/src/shared/workflow-child-permit.js +160 -0
  987. package/src/shared/workflow-child-permit.js.map +1 -0
  988. package/src/slash/delegation-adapters.d.ts +147 -0
  989. package/src/slash/delegation-adapters.d.ts.map +1 -0
  990. package/src/slash/delegation-adapters.js +293 -0
  991. package/src/slash/delegation-adapters.js.map +1 -0
  992. package/src/slash/delegation-json.d.ts +11 -0
  993. package/src/slash/delegation-json.d.ts.map +1 -0
  994. package/src/slash/delegation-json.js +118 -0
  995. package/src/slash/delegation-json.js.map +1 -0
  996. package/src/slash/delegation-request.d.ts +13 -0
  997. package/src/slash/delegation-request.d.ts.map +1 -0
  998. package/src/slash/delegation-request.js +175 -0
  999. package/src/slash/delegation-request.js.map +1 -0
  1000. package/src/slash/prompt-template-bridge.d.ts +27 -0
  1001. package/src/slash/prompt-template-bridge.d.ts.map +1 -0
  1002. package/src/slash/prompt-template-bridge.js +380 -0
  1003. package/src/slash/prompt-template-bridge.js.map +1 -0
  1004. package/src/slash/prompt-workflows.d.ts +22 -0
  1005. package/src/slash/prompt-workflows.d.ts.map +1 -0
  1006. package/src/slash/prompt-workflows.js +261 -0
  1007. package/src/slash/prompt-workflows.js.map +1 -0
  1008. package/src/slash/selector.d.ts +48 -0
  1009. package/src/slash/selector.d.ts.map +1 -0
  1010. package/src/slash/selector.js +118 -0
  1011. package/src/slash/selector.js.map +1 -0
  1012. package/src/slash/slash-bridge.d.ts +31 -0
  1013. package/src/slash/slash-bridge.d.ts.map +1 -0
  1014. package/src/slash/slash-bridge.js +133 -0
  1015. package/src/slash/slash-bridge.js.map +1 -0
  1016. package/src/slash/slash-commands.d.ts +9 -0
  1017. package/src/slash/slash-commands.d.ts.map +1 -0
  1018. package/src/slash/slash-commands.js +1295 -0
  1019. package/src/slash/slash-commands.js.map +1 -0
  1020. package/src/slash/slash-live-state.d.ts +22 -0
  1021. package/src/slash/slash-live-state.d.ts.map +1 -0
  1022. package/src/slash/slash-live-state.js +264 -0
  1023. package/src/slash/slash-live-state.js.map +1 -0
  1024. package/src/slash/subagents-admin.d.ts +3 -0
  1025. package/src/slash/subagents-admin.d.ts.map +1 -0
  1026. package/src/slash/subagents-admin.js +454 -0
  1027. package/src/slash/subagents-admin.js.map +1 -0
  1028. package/src/tui/fleet-status.d.ts +86 -0
  1029. package/src/tui/fleet-status.d.ts.map +1 -0
  1030. package/src/tui/fleet-status.js +1083 -0
  1031. package/src/tui/fleet-status.js.map +1 -0
  1032. package/src/tui/fleet-transcript.d.ts +50 -0
  1033. package/src/tui/fleet-transcript.d.ts.map +1 -0
  1034. package/src/tui/fleet-transcript.js +497 -0
  1035. package/src/tui/fleet-transcript.js.map +1 -0
  1036. package/src/tui/fleet.d.ts +169 -0
  1037. package/src/tui/fleet.d.ts.map +1 -0
  1038. package/src/tui/fleet.js +1412 -0
  1039. package/src/tui/fleet.js.map +1 -0
  1040. package/src/tui/render-helpers.d.ts +24 -0
  1041. package/src/tui/render-helpers.d.ts.map +1 -0
  1042. package/src/tui/render-helpers.js +101 -0
  1043. package/src/tui/render-helpers.js.map +1 -0
  1044. package/src/tui/render.d.ts +61 -0
  1045. package/src/tui/render.d.ts.map +1 -0
  1046. package/src/tui/render.js +3607 -0
  1047. package/src/tui/render.js.map +1 -0
  1048. package/src/watchdog/change-signature.d.ts +8 -0
  1049. package/src/watchdog/change-signature.d.ts.map +1 -0
  1050. package/src/watchdog/change-signature.js +246 -0
  1051. package/src/watchdog/change-signature.js.map +1 -0
  1052. package/src/watchdog/child-status.d.ts +54 -0
  1053. package/src/watchdog/child-status.d.ts.map +1 -0
  1054. package/src/watchdog/child-status.js +188 -0
  1055. package/src/watchdog/child-status.js.map +1 -0
  1056. package/src/watchdog/diff-tool.d.ts +23 -0
  1057. package/src/watchdog/diff-tool.d.ts.map +1 -0
  1058. package/src/watchdog/diff-tool.js +84 -0
  1059. package/src/watchdog/diff-tool.js.map +1 -0
  1060. package/src/watchdog/emission-guard.d.ts +37 -0
  1061. package/src/watchdog/emission-guard.d.ts.map +1 -0
  1062. package/src/watchdog/emission-guard.js +98 -0
  1063. package/src/watchdog/emission-guard.js.map +1 -0
  1064. package/src/watchdog/guidance.d.ts +4 -0
  1065. package/src/watchdog/guidance.d.ts.map +1 -0
  1066. package/src/watchdog/guidance.js +20 -0
  1067. package/src/watchdog/guidance.js.map +1 -0
  1068. package/src/watchdog/lsp-diagnostics.d.ts +18 -0
  1069. package/src/watchdog/lsp-diagnostics.d.ts.map +1 -0
  1070. package/src/watchdog/lsp-diagnostics.js +490 -0
  1071. package/src/watchdog/lsp-diagnostics.js.map +1 -0
  1072. package/src/watchdog/model-selection.d.ts +25 -0
  1073. package/src/watchdog/model-selection.d.ts.map +1 -0
  1074. package/src/watchdog/model-selection.js +168 -0
  1075. package/src/watchdog/model-selection.js.map +1 -0
  1076. package/src/watchdog/permission-arbiter.d.ts +21 -0
  1077. package/src/watchdog/permission-arbiter.d.ts.map +1 -0
  1078. package/src/watchdog/permission-arbiter.js +136 -0
  1079. package/src/watchdog/permission-arbiter.js.map +1 -0
  1080. package/src/watchdog/register-child.d.ts +12 -0
  1081. package/src/watchdog/register-child.d.ts.map +1 -0
  1082. package/src/watchdog/register-child.js +120 -0
  1083. package/src/watchdog/register-child.js.map +1 -0
  1084. package/src/watchdog/register-main.d.ts +10 -0
  1085. package/src/watchdog/register-main.d.ts.map +1 -0
  1086. package/src/watchdog/register-main.js +419 -0
  1087. package/src/watchdog/register-main.js.map +1 -0
  1088. package/src/watchdog/render.d.ts +12 -0
  1089. package/src/watchdog/render.d.ts.map +1 -0
  1090. package/src/watchdog/render.js +52 -0
  1091. package/src/watchdog/render.js.map +1 -0
  1092. package/src/watchdog/review.d.ts +36 -0
  1093. package/src/watchdog/review.d.ts.map +1 -0
  1094. package/src/watchdog/review.js +318 -0
  1095. package/src/watchdog/review.js.map +1 -0
  1096. package/src/watchdog/rules.d.ts +22 -0
  1097. package/src/watchdog/rules.d.ts.map +1 -0
  1098. package/src/watchdog/rules.js +59 -0
  1099. package/src/watchdog/rules.js.map +1 -0
  1100. package/src/watchdog/runtime.d.ts +196 -0
  1101. package/src/watchdog/runtime.d.ts.map +1 -0
  1102. package/src/watchdog/runtime.js +862 -0
  1103. package/src/watchdog/runtime.js.map +1 -0
  1104. package/src/watchdog/scope.d.ts +15 -0
  1105. package/src/watchdog/scope.d.ts.map +1 -0
  1106. package/src/watchdog/scope.js +45 -0
  1107. package/src/watchdog/scope.js.map +1 -0
  1108. package/src/watchdog/settings.d.ts +30 -0
  1109. package/src/watchdog/settings.d.ts.map +1 -0
  1110. package/src/watchdog/settings.js +476 -0
  1111. package/src/watchdog/settings.js.map +1 -0
  1112. package/src/watchdog/tool-actions.d.ts +18 -0
  1113. package/src/watchdog/tool-actions.d.ts.map +1 -0
  1114. package/src/watchdog/tool-actions.js +151 -0
  1115. package/src/watchdog/tool-actions.js.map +1 -0
  1116. package/src/watchdog/turn-delta.d.ts +12 -0
  1117. package/src/watchdog/turn-delta.d.ts.map +1 -0
  1118. package/src/watchdog/turn-delta.js +185 -0
  1119. package/src/watchdog/turn-delta.js.map +1 -0
  1120. package/src/watchdog/types.d.ts +142 -0
  1121. package/src/watchdog/types.d.ts.map +1 -0
  1122. package/src/watchdog/types.js +28 -0
  1123. package/src/watchdog/types.js.map +1 -0
  1124. package/src/watchdog/warning-format.d.ts +8 -0
  1125. package/src/watchdog/warning-format.d.ts.map +1 -0
  1126. package/src/watchdog/warning-format.js +60 -0
  1127. package/src/watchdog/warning-format.js.map +1 -0
  1128. package/src/workflows/chat-progress.d.ts +38 -0
  1129. package/src/workflows/chat-progress.d.ts.map +1 -0
  1130. package/src/workflows/chat-progress.js +130 -0
  1131. package/src/workflows/chat-progress.js.map +1 -0
  1132. package/src/workflows/host-command.d.ts +31 -0
  1133. package/src/workflows/host-command.d.ts.map +1 -0
  1134. package/src/workflows/host-command.js +228 -0
  1135. package/src/workflows/host-command.js.map +1 -0
  1136. package/src/workflows/scripted-workflow.d.ts +195 -0
  1137. package/src/workflows/scripted-workflow.d.ts.map +1 -0
  1138. package/src/workflows/scripted-workflow.js +2636 -0
  1139. package/src/workflows/scripted-workflow.js.map +1 -0
  1140. package/src/workflows/workflow-checklist.d.ts +124 -0
  1141. package/src/workflows/workflow-checklist.d.ts.map +1 -0
  1142. package/src/workflows/workflow-checklist.js +312 -0
  1143. package/src/workflows/workflow-checklist.js.map +1 -0
  1144. package/src/workflows/workflow-child-summary.d.ts +20 -0
  1145. package/src/workflows/workflow-child-summary.d.ts.map +1 -0
  1146. package/src/workflows/workflow-child-summary.js +179 -0
  1147. package/src/workflows/workflow-child-summary.js.map +1 -0
  1148. package/src/workflows/workflow-preflight.d.ts +59 -0
  1149. package/src/workflows/workflow-preflight.d.ts.map +1 -0
  1150. package/src/workflows/workflow-preflight.js +289 -0
  1151. package/src/workflows/workflow-preflight.js.map +1 -0
  1152. package/src/workflows/workflow-receipt.d.ts +35 -0
  1153. package/src/workflows/workflow-receipt.d.ts.map +1 -0
  1154. package/src/workflows/workflow-receipt.js +449 -0
  1155. package/src/workflows/workflow-receipt.js.map +1 -0
  1156. package/src/workflows/workflow-resources.d.ts +43 -0
  1157. package/src/workflows/workflow-resources.d.ts.map +1 -0
  1158. package/src/workflows/workflow-resources.js +230 -0
  1159. package/src/workflows/workflow-resources.js.map +1 -0
  1160. package/src/workflows/workflow-settlement.d.ts +85 -0
  1161. package/src/workflows/workflow-settlement.d.ts.map +1 -0
  1162. package/src/workflows/workflow-settlement.js +204 -0
  1163. package/src/workflows/workflow-settlement.js.map +1 -0
  1164. package/index.ts +0 -13
  1165. package/src/agents/advertised-agent-prompt.ts +0 -94
  1166. package/src/agents/agent-management.ts +0 -1417
  1167. package/src/agents/agent-memory.ts +0 -254
  1168. package/src/agents/agent-refinements.ts +0 -624
  1169. package/src/agents/agent-scope.ts +0 -6
  1170. package/src/agents/agent-selection.ts +0 -25
  1171. package/src/agents/agent-serializer.ts +0 -182
  1172. package/src/agents/agents.ts +0 -2917
  1173. package/src/agents/builtin-names.ts +0 -16
  1174. package/src/agents/chain-serializer.ts +0 -285
  1175. package/src/agents/frontmatter.ts +0 -153
  1176. package/src/agents/identity.ts +0 -30
  1177. package/src/agents/proactive-skills.ts +0 -194
  1178. package/src/agents/runtime-agent-events.ts +0 -70
  1179. package/src/agents/runtime-agent-registry.ts +0 -430
  1180. package/src/agents/skills.ts +0 -754
  1181. package/src/api/agents.ts +0 -12
  1182. package/src/api/background-work.ts +0 -206
  1183. package/src/api/capability-ceiling.ts +0 -16
  1184. package/src/api/child-tool-plan.ts +0 -5
  1185. package/src/api/control-channel.ts +0 -4
  1186. package/src/api/delegation.ts +0 -116
  1187. package/src/api/external-job-provider.ts +0 -195
  1188. package/src/api/external-runs.ts +0 -282
  1189. package/src/api/intercom-bridge.ts +0 -3
  1190. package/src/api/preflight.ts +0 -539
  1191. package/src/api/project-panes.ts +0 -32
  1192. package/src/api/required-child-extensions.ts +0 -6
  1193. package/src/api/shared-types.ts +0 -29
  1194. package/src/api/workflow-resources.ts +0 -6
  1195. package/src/extension/config.ts +0 -230
  1196. package/src/extension/control-notices.ts +0 -58
  1197. package/src/extension/doctor.ts +0 -270
  1198. package/src/extension/fanout-child.ts +0 -265
  1199. package/src/extension/herdr-pi-bridge.ts +0 -160
  1200. package/src/extension/index.ts +0 -1205
  1201. package/src/extension/public-execution.ts +0 -225
  1202. package/src/extension/rpc.ts +0 -848
  1203. package/src/extension/schemas.ts +0 -422
  1204. package/src/extension/steering-notices.ts +0 -35
  1205. package/src/extension/subagent-guide.ts +0 -39
  1206. package/src/extension/tool-description.ts +0 -175
  1207. package/src/extension/tool-result.ts +0 -19
  1208. package/src/inspectors/actions.ts +0 -148
  1209. package/src/inspectors/ghostty/actions.ts +0 -74
  1210. package/src/inspectors/ghostty/plugin.ts +0 -17
  1211. package/src/inspectors/herdr/actions.ts +0 -155
  1212. package/src/inspectors/herdr/client.ts +0 -130
  1213. package/src/inspectors/herdr/focus.ts +0 -55
  1214. package/src/inspectors/herdr/plugin.ts +0 -20
  1215. package/src/inspectors/herdr/project-panes.ts +0 -730
  1216. package/src/inspectors/inspector-runner.ts +0 -153
  1217. package/src/inspectors/plugins.ts +0 -8
  1218. package/src/inspectors/session-roots-codec.ts +0 -31
  1219. package/src/inspectors/shell-command.ts +0 -16
  1220. package/src/inspectors/types.ts +0 -51
  1221. package/src/integrations/herdr-status.ts +0 -400
  1222. package/src/integrations/pi-web-session-liveness.ts +0 -73
  1223. package/src/intercom/intercom-bridge.ts +0 -233
  1224. package/src/intercom/native-supervisor-channel.ts +0 -917
  1225. package/src/intercom/result-intercom.ts +0 -423
  1226. package/src/intercom/supervisor-ui.ts +0 -244
  1227. package/src/missions/actions.ts +0 -433
  1228. package/src/missions/goal-driver.ts +0 -164
  1229. package/src/missions/lifecycle.ts +0 -367
  1230. package/src/missions/store.ts +0 -584
  1231. package/src/missions/types.ts +0 -190
  1232. package/src/missions/workflow-state.ts +0 -281
  1233. package/src/policy/authority.ts +0 -50
  1234. package/src/profiles/profiles.ts +0 -668
  1235. package/src/runs/background/active-async-capacity.ts +0 -520
  1236. package/src/runs/background/active-run-index.ts +0 -155
  1237. package/src/runs/background/async-execution.ts +0 -2278
  1238. package/src/runs/background/async-job-tracker.ts +0 -826
  1239. package/src/runs/background/async-resume.ts +0 -647
  1240. package/src/runs/background/async-retention.ts +0 -912
  1241. package/src/runs/background/async-status-snapshot.ts +0 -46
  1242. package/src/runs/background/async-status.ts +0 -771
  1243. package/src/runs/background/auto-drain.ts +0 -92
  1244. package/src/runs/background/binary-bootstrap.ts +0 -38
  1245. package/src/runs/background/chain-append.ts +0 -321
  1246. package/src/runs/background/chain-root-attachment.ts +0 -259
  1247. package/src/runs/background/completion-batcher.ts +0 -168
  1248. package/src/runs/background/completion-dedupe.ts +0 -58
  1249. package/src/runs/background/completion-replay.ts +0 -287
  1250. package/src/runs/background/control-channel.ts +0 -600
  1251. package/src/runs/background/fleet-view.ts +0 -648
  1252. package/src/runs/background/index-segment.ts +0 -59
  1253. package/src/runs/background/inspect-rpc.ts +0 -443
  1254. package/src/runs/background/notify.ts +0 -819
  1255. package/src/runs/background/owned-process-tree.ts +0 -131
  1256. package/src/runs/background/parallel-groups.ts +0 -45
  1257. package/src/runs/background/process-terminal.ts +0 -310
  1258. package/src/runs/background/result-delivery-ownership.ts +0 -45
  1259. package/src/runs/background/result-files.ts +0 -523
  1260. package/src/runs/background/result-watcher.ts +0 -809
  1261. package/src/runs/background/resume-guidance.ts +0 -56
  1262. package/src/runs/background/retained-children.ts +0 -135
  1263. package/src/runs/background/retained-nested-route-tracker.ts +0 -96
  1264. package/src/runs/background/run-child-session.ts +0 -690
  1265. package/src/runs/background/run-id-query.ts +0 -7
  1266. package/src/runs/background/run-id-resolver.ts +0 -175
  1267. package/src/runs/background/run-status.ts +0 -786
  1268. package/src/runs/background/runner-aliases.ts +0 -142
  1269. package/src/runs/background/runner-child-launch.ts +0 -91
  1270. package/src/runs/background/runner-child-sessions.ts +0 -32
  1271. package/src/runs/background/runner-http-dispatcher.ts +0 -119
  1272. package/src/runs/background/scheduled-runs.ts +0 -1012
  1273. package/src/runs/background/stale-run-reconciler.ts +0 -436
  1274. package/src/runs/background/steering.ts +0 -260
  1275. package/src/runs/background/subagent-runner.ts +0 -5341
  1276. package/src/runs/background/subagent-wait.ts +0 -876
  1277. package/src/runs/background/terminal-run-index.ts +0 -138
  1278. package/src/runs/background/top-level-async.ts +0 -14
  1279. package/src/runs/background/wait-completions.ts +0 -261
  1280. package/src/runs/background/wait-config.ts +0 -50
  1281. package/src/runs/background/wait-subscriptions.ts +0 -354
  1282. package/src/runs/background/wait-tool.ts +0 -45
  1283. package/src/runs/foreground/async-dismiss-action.ts +0 -86
  1284. package/src/runs/foreground/async-steering-action.ts +0 -276
  1285. package/src/runs/foreground/async-stop-action.ts +0 -176
  1286. package/src/runs/foreground/execution.ts +0 -2231
  1287. package/src/runs/foreground/foreground-control.ts +0 -157
  1288. package/src/runs/foreground/foreground-history.ts +0 -163
  1289. package/src/runs/foreground/prompt-audit.ts +0 -178
  1290. package/src/runs/foreground/subagent-executor.ts +0 -7511
  1291. package/src/runs/foreground/workflow-detach-reconcile.ts +0 -304
  1292. package/src/runs/foreground/workflow-foreground-steering.ts +0 -169
  1293. package/src/runs/shared/abort-recovery.ts +0 -119
  1294. package/src/runs/shared/acceptance.ts +0 -1565
  1295. package/src/runs/shared/agent-contract.ts +0 -38
  1296. package/src/runs/shared/async-status-projection.ts +0 -659
  1297. package/src/runs/shared/background-process-options.ts +0 -9
  1298. package/src/runs/shared/capability-ceiling.ts +0 -211
  1299. package/src/runs/shared/chain-outputs.ts +0 -116
  1300. package/src/runs/shared/child-hooks.ts +0 -189
  1301. package/src/runs/shared/child-identity.ts +0 -62
  1302. package/src/runs/shared/child-launch-plan.ts +0 -163
  1303. package/src/runs/shared/child-launch.ts +0 -342
  1304. package/src/runs/shared/child-lifecycle.ts +0 -28
  1305. package/src/runs/shared/child-runtime-config.ts +0 -133
  1306. package/src/runs/shared/child-session.ts +0 -448
  1307. package/src/runs/shared/child-tool-plan.ts +0 -661
  1308. package/src/runs/shared/claude-code-adapter.ts +0 -133
  1309. package/src/runs/shared/codex-exec-adapter.ts +0 -129
  1310. package/src/runs/shared/completion-evidence.ts +0 -89
  1311. package/src/runs/shared/completion-guard.ts +0 -255
  1312. package/src/runs/shared/context-mode.ts +0 -44
  1313. package/src/runs/shared/cursor-agent-adapter.ts +0 -114
  1314. package/src/runs/shared/dynamic-fanout.ts +0 -297
  1315. package/src/runs/shared/effective-system-prompt.ts +0 -33
  1316. package/src/runs/shared/extension-bindings.ts +0 -78
  1317. package/src/runs/shared/external-cli-contract.ts +0 -177
  1318. package/src/runs/shared/external-cli-preflight.ts +0 -142
  1319. package/src/runs/shared/external-cli-runner.ts +0 -431
  1320. package/src/runs/shared/external-job-bridge.ts +0 -460
  1321. package/src/runs/shared/external-job-runner.ts +0 -389
  1322. package/src/runs/shared/fast-mode-extension.ts +0 -10
  1323. package/src/runs/shared/herdr-connection.ts +0 -134
  1324. package/src/runs/shared/herdr-external-adapters.ts +0 -169
  1325. package/src/runs/shared/herdr-machine.ts +0 -279
  1326. package/src/runs/shared/herdr-pi-protocol.ts +0 -59
  1327. package/src/runs/shared/herdr-placed-run.ts +0 -263
  1328. package/src/runs/shared/host-step-status.ts +0 -231
  1329. package/src/runs/shared/lane-metadata.ts +0 -126
  1330. package/src/runs/shared/launch-cwd.ts +0 -16
  1331. package/src/runs/shared/llm-intent-arbiter.ts +0 -321
  1332. package/src/runs/shared/long-running-guard.ts +0 -221
  1333. package/src/runs/shared/mcp-config-sources.ts +0 -422
  1334. package/src/runs/shared/mcp-direct-tool-allowlist.ts +0 -484
  1335. package/src/runs/shared/mcp-direct-tool-grant.ts +0 -194
  1336. package/src/runs/shared/model-resolution-diagnostic.ts +0 -76
  1337. package/src/runs/shared/model-resolution.ts +0 -441
  1338. package/src/runs/shared/model-scope.ts +0 -205
  1339. package/src/runs/shared/mutation-evidence.ts +0 -199
  1340. package/src/runs/shared/nested-events.ts +0 -1079
  1341. package/src/runs/shared/nested-path.ts +0 -38
  1342. package/src/runs/shared/nested-render.ts +0 -127
  1343. package/src/runs/shared/orca-progress-tabs.ts +0 -510
  1344. package/src/runs/shared/parallel-handoff.ts +0 -741
  1345. package/src/runs/shared/parallel-utils.ts +0 -279
  1346. package/src/runs/shared/permissions.ts +0 -86
  1347. package/src/runs/shared/pi-spawn.ts +0 -207
  1348. package/src/runs/shared/process-signal.ts +0 -35
  1349. package/src/runs/shared/readonly-drain-observation.ts +0 -42
  1350. package/src/runs/shared/run-fanout-budget.ts +0 -267
  1351. package/src/runs/shared/run-history.ts +0 -201
  1352. package/src/runs/shared/runtime-acknowledged-extensions.ts +0 -44
  1353. package/src/runs/shared/session-lease.ts +0 -293
  1354. package/src/runs/shared/single-output.ts +0 -304
  1355. package/src/runs/shared/spawn-budget.ts +0 -128
  1356. package/src/runs/shared/structured-output.ts +0 -236
  1357. package/src/runs/shared/subagent-control.ts +0 -294
  1358. package/src/runs/shared/subagent-prompt-runtime.ts +0 -545
  1359. package/src/runs/shared/task-intent.ts +0 -244
  1360. package/src/runs/shared/tool-availability.ts +0 -37
  1361. package/src/runs/shared/tool-budget.ts +0 -66
  1362. package/src/runs/shared/tool-timeout.ts +0 -93
  1363. package/src/runs/shared/usage-budget.ts +0 -65
  1364. package/src/runs/shared/workflow-async-child-guidance.ts +0 -18
  1365. package/src/runs/shared/workflow-graph.ts +0 -225
  1366. package/src/runs/shared/worktree-cleanup-plan.ts +0 -869
  1367. package/src/runs/shared/worktree-setup-command.ts +0 -213
  1368. package/src/runs/shared/worktree.ts +0 -1516
  1369. package/src/shared/accessible-dir.ts +0 -47
  1370. package/src/shared/agent-stream-options.ts +0 -5
  1371. package/src/shared/artifacts.ts +0 -281
  1372. package/src/shared/atomic-json.ts +0 -83
  1373. package/src/shared/capacity-resilient-json.ts +0 -102
  1374. package/src/shared/child-cache-retention.ts +0 -43
  1375. package/src/shared/child-session-name.ts +0 -46
  1376. package/src/shared/child-transcript.ts +0 -264
  1377. package/src/shared/completion-owner.ts +0 -14
  1378. package/src/shared/display-text.ts +0 -150
  1379. package/src/shared/extension-context.ts +0 -24
  1380. package/src/shared/file-coalescer.ts +0 -49
  1381. package/src/shared/file-system-retry.ts +0 -95
  1382. package/src/shared/fork-context.ts +0 -236
  1383. package/src/shared/fork-session-cwd.ts +0 -27
  1384. package/src/shared/formatters.ts +0 -146
  1385. package/src/shared/jsonl-writer.ts +0 -92
  1386. package/src/shared/launch-contract.ts +0 -198
  1387. package/src/shared/model-info.ts +0 -101
  1388. package/src/shared/model-response-aliases.ts +0 -13
  1389. package/src/shared/node-executable.ts +0 -21
  1390. package/src/shared/opencode-session-headers.ts +0 -30
  1391. package/src/shared/prompt-resources.ts +0 -11
  1392. package/src/shared/pruned-fork.ts +0 -450
  1393. package/src/shared/required-child-extensions.ts +0 -81
  1394. package/src/shared/session-file-trust.ts +0 -19
  1395. package/src/shared/session-identity.ts +0 -10
  1396. package/src/shared/session-tokens.ts +0 -55
  1397. package/src/shared/settings.ts +0 -412
  1398. package/src/shared/shortcuts.ts +0 -13
  1399. package/src/shared/status-format.ts +0 -55
  1400. package/src/shared/thinking-ceiling.ts +0 -46
  1401. package/src/shared/types.ts +0 -2972
  1402. package/src/shared/utf8.ts +0 -11
  1403. package/src/shared/utils.ts +0 -608
  1404. package/src/shared/watch-strategy.ts +0 -12
  1405. package/src/shared/workflow-child-permit.ts +0 -212
  1406. package/src/slash/delegation-adapters.ts +0 -428
  1407. package/src/slash/delegation-json.ts +0 -108
  1408. package/src/slash/delegation-request.ts +0 -176
  1409. package/src/slash/prompt-template-bridge.ts +0 -419
  1410. package/src/slash/prompt-workflows.ts +0 -287
  1411. package/src/slash/selector.ts +0 -147
  1412. package/src/slash/slash-bridge.ts +0 -192
  1413. package/src/slash/slash-commands.ts +0 -1325
  1414. package/src/slash/slash-live-state.ts +0 -310
  1415. package/src/slash/subagents-admin.ts +0 -460
  1416. package/src/tui/fleet-status.ts +0 -1109
  1417. package/src/tui/fleet-transcript.ts +0 -536
  1418. package/src/tui/fleet.ts +0 -1448
  1419. package/src/tui/render-helpers.ts +0 -111
  1420. package/src/tui/render.ts +0 -3721
  1421. package/src/types/pi-runtime-compat.d.ts +0 -8
  1422. package/src/watchdog/change-signature.ts +0 -260
  1423. package/src/watchdog/child-status.ts +0 -225
  1424. package/src/watchdog/diff-tool.ts +0 -77
  1425. package/src/watchdog/emission-guard.ts +0 -125
  1426. package/src/watchdog/guidance.ts +0 -20
  1427. package/src/watchdog/lsp-diagnostics.ts +0 -538
  1428. package/src/watchdog/model-selection.ts +0 -187
  1429. package/src/watchdog/permission-arbiter.ts +0 -156
  1430. package/src/watchdog/register-child.ts +0 -128
  1431. package/src/watchdog/register-main.ts +0 -445
  1432. package/src/watchdog/render.ts +0 -53
  1433. package/src/watchdog/review.ts +0 -363
  1434. package/src/watchdog/rules.ts +0 -70
  1435. package/src/watchdog/runtime.ts +0 -924
  1436. package/src/watchdog/scope.ts +0 -51
  1437. package/src/watchdog/settings.ts +0 -515
  1438. package/src/watchdog/tool-actions.ts +0 -156
  1439. package/src/watchdog/turn-delta.ts +0 -184
  1440. package/src/watchdog/types.ts +0 -186
  1441. package/src/watchdog/warning-format.ts +0 -72
  1442. package/src/workflows/chat-progress.ts +0 -152
  1443. package/src/workflows/host-command.ts +0 -235
  1444. package/src/workflows/scripted-workflow.ts +0 -2553
  1445. package/src/workflows/workflow-checklist.ts +0 -436
  1446. package/src/workflows/workflow-child-summary.ts +0 -170
  1447. package/src/workflows/workflow-preflight.ts +0 -297
  1448. package/src/workflows/workflow-receipt.ts +0 -384
  1449. package/src/workflows/workflow-resources.ts +0 -236
  1450. package/src/workflows/workflow-settlement.ts +0 -249
@@ -1,263 +0,0 @@
1
- import { createHash, randomBytes } from "node:crypto";
2
- import * as fs from "node:fs";
3
- import * as net from "node:net";
4
- import * as path from "node:path";
5
- import type { AgentMessage } from "@earendil-works/pi-agent-core";
6
- import packageJson from "../../../package.json" with { type: "json" };
7
- import type { HerdrMachineReference, HerdrRemoteGitStatus } from "../../shared/types.ts";
8
- import type { ChildSession, ChildSessionEvent, ChildSessionFactory, ChildSessionLaunch } from "./child-session.ts";
9
- import type { ChildRuntimeConfig } from "./child-runtime-config.ts";
10
- import { connectHerdrMachine, remoteShellCommand, runHerdrRemoteCommand, runHerdrRemoteCommandAsync, type HerdrForwardedConnection, type HerdrRpcClient } from "./herdr-connection.ts";
11
- import { encodeHerdrPiFrame, HERDR_PI_MODE_ENV, HERDR_PI_PROTOCOL, HERDR_PI_RUN_ENV, HERDR_PI_RUNTIME_DIR_ENV, HerdrPiFrameDecoder, validateHerdrPiRunId, type HerdrPiFrame } from "./herdr-pi-protocol.ts";
12
- import { getAgentDir } from "../../shared/utils.ts";
13
-
14
- export interface HerdrRunIdentity { runId: string; machineId: string; target: string; session: string | null; workspaceId: string; tabId: string; paneId: string; terminalId: string; agentName: string; nativeSessionId: string; cwd: string; runtimeDir: string }
15
- export interface HerdrRunSnapshot { connection: "connected" | "unknown" | "closed"; state: "ready" | "working" | "blocked" | "settled" | "unknown"; identity?: HerdrRunIdentity; revision: number }
16
- export interface HerdrReconnectCandidate { endpoint: { session: string | null; protocol: number; version: string }; agents: Array<{ terminal_id?: string; pane_id?: string; agent_status?: string }>; bridge: { runId?: string; nativeSessionId?: string; packageVersion?: string; protocol?: number; evidenceCursor?: number; evidenceFloor?: number } }
17
-
18
- function herdrRunState(status: unknown, fallback: HerdrRunSnapshot["state"] = "unknown"): HerdrRunSnapshot["state"] {
19
- return status === "working" ? "working" : status === "blocked" ? "blocked" : status === "idle" || status === "done" ? "settled" : status === "unknown" ? "unknown" : fallback;
20
- }
21
-
22
- export function herdrStatusSubscriptions(paneId: string): unknown[] {
23
- return [{ type: "pane.agent_status_changed", pane_id: paneId }, { type: "pane.closed" }, { type: "pane.moved" }];
24
- }
25
-
26
- export function reconcileHerdrPlacedRun(identity: HerdrRunIdentity, candidate: HerdrReconnectCandidate, proveEvidence: () => { ok: true; cursor: number } | { ok: false; reason: string }): { ok: true; state: HerdrRunSnapshot["state"]; paneId: string; cursor: number } | { ok: false; reason: string } {
27
- if (candidate.endpoint.session !== identity.session) return { ok: false, reason: "Herdr session changed during reconnect." }; const matches = candidate.agents.filter((agent) => agent.terminal_id === identity.terminalId); if (matches.length !== 1 || typeof matches[0]!.pane_id !== "string") return { ok: false, reason: matches.length ? "Terminal identity is ambiguous." : "Owned terminal is missing." }; const proof = proveEvidence(); if (!proof.ok) return proof; return { ok: true, state: herdrRunState(matches[0]!.agent_status), paneId: matches[0]!.pane_id!, cursor: proof.cursor };
28
- }
29
-
30
- export function reconcileHerdrReconnect(identity: HerdrRunIdentity, candidate: HerdrReconnectCandidate, lastEvidenceCursor: number): { ok: true; state: HerdrRunSnapshot["state"]; paneId: string; cursor: number } | { ok: false; reason: string } {
31
- return reconcileHerdrPlacedRun(identity, candidate, () => { const bridge = candidate.bridge; if (bridge.runId !== identity.runId || bridge.nativeSessionId !== identity.nativeSessionId || bridge.packageVersion !== packageJson.version || bridge.protocol !== HERDR_PI_PROTOCOL) return { ok: false, reason: "Bridge run, package, protocol, or native session identity changed." }; if (typeof bridge.evidenceCursor !== "number" || typeof bridge.evidenceFloor !== "number" || bridge.evidenceCursor < lastEvidenceCursor || bridge.evidenceFloor > lastEvidenceCursor + 1) return { ok: false, reason: "Bridge evidence has a gap after reconnect." }; return { ok: true, cursor: bridge.evidenceCursor }; });
32
- }
33
-
34
- export async function boundedHerdrReconnect(identity: HerdrRunIdentity, lastEvidenceCursor: number, attempt: (number: number) => Promise<HerdrReconnectCandidate>, options: { attempts?: number; deadlineMs?: number; disposed?: () => boolean } = {}) {
35
- const deadline = Date.now() + (options.deadlineMs ?? 15_000); let last = "Reconnect did not run.";
36
- for (let number = 1; number <= (options.attempts ?? 3) && Date.now() < deadline; number++) {
37
- if (options.disposed?.()) return { ok: false as const, reason: "Reconnect was disposed." };
38
- try { const result = reconcileHerdrReconnect(identity, await attempt(number), lastEvidenceCursor); if (result.ok) return result; last = result.reason; } catch (error) { last = error instanceof Error ? error.message : String(error); }
39
- await new Promise((resolve) => setTimeout(resolve, Math.min(number * 100, Math.max(0, deadline - Date.now()))));
40
- }
41
- return { ok: false as const, reason: last };
42
- }
43
-
44
- function safeRunId(value: string | undefined): string { const prefix = value?.replace(/[^A-Za-z0-9_-]/gu, "_").slice(0, 48) ?? "run"; return validateHerdrPiRunId(`${prefix}_${randomBytes(8).toString("hex")}`); }
45
- function idOf(value: unknown, key: string): string { const found = value && typeof value === "object" ? (value as Record<string, unknown>)[key] : undefined; if (typeof found !== "string" || !found) throw new Error(`Herdr did not return ${key}.`); return found; }
46
- function list(value: unknown, key: string): unknown[] { if (Array.isArray(value)) return value; const found = value && typeof value === "object" ? (value as Record<string, unknown>)[key] : undefined; return Array.isArray(found) ? found : []; }
47
- function tagged(value: unknown, type: string, key: string): Record<string, unknown> { if (!value || typeof value !== "object" || (value as Record<string, unknown>).type !== type || !(key in (value as Record<string, unknown>)) || typeof (value as Record<string, unknown>)[key] !== "object") throw new Error(`Herdr returned an invalid ${type} envelope.`); return (value as Record<string, Record<string, unknown>>)[key]!; }
48
- export function parseHerdrCreated(value: unknown, type: "workspace_created" | "tab_created"): { workspaceId?: string; tabId: string; paneId: string } { const envelope = value as Record<string, unknown>; if (envelope?.type !== type) throw new Error(`Herdr returned an invalid ${type} envelope.`); const tab = envelope.tab as Record<string, unknown>; const pane = envelope.root_pane as Record<string, unknown>; return { ...(type === "workspace_created" ? { workspaceId: idOf(envelope.workspace, "workspace_id") } : {}), tabId: idOf(tab, "tab_id"), paneId: idOf(pane, "pane_id") }; }
49
- export function parseHerdrAgent(value: unknown, type: "agent_started" | "agent_info" | "agent_prompted") { return tagged(value, type, "agent"); }
50
- export function parseHerdrSessionSnapshot(value: unknown): Record<string, unknown> { return tagged(value, "session_snapshot", "snapshot"); }
51
- export function ownsHerdrPane(agent: Record<string, unknown>, terminalId: string, paneId: string): boolean { return agent.terminal_id === terminalId && agent.pane_id === paneId; }
52
- function snapshotAgents(snapshot: Record<string, unknown>): Array<{ terminal_id?: string; pane_id?: string; agent_status?: string }> { return list(snapshot, "agents").filter((agent): agent is Record<string, unknown> => Boolean(agent && typeof agent === "object")).map((agent) => ({ terminal_id: typeof agent.terminal_id === "string" ? agent.terminal_id : undefined, pane_id: typeof agent.pane_id === "string" ? agent.pane_id : undefined, agent_status: typeof agent.agent_status === "string" ? agent.agent_status : undefined })); }
53
-
54
- export const HERDR_MAX_OWNED_PANES = 20;
55
- const HERDR_ALLOCATION_LOCK_TIMEOUT_MS = 10_000, HERDR_ALLOCATION_LOCK_POLL_MS = 25;
56
- export function herdrPaneAllocationKey(target: string, session: string | null, cwd: string): string { return JSON.stringify([target, session, cwd]); }
57
- function assertPrivateDir(directory: string): void { const stat = fs.lstatSync(directory); if (!stat.isDirectory() || stat.isSymbolicLink() || (stat.mode & 0o777) !== 0o700 || (typeof process.getuid === "function" && stat.uid !== process.getuid())) throw new Error("Herdr allocation path is not a mode-0700 agent-private owned directory."); }
58
- function ensurePrivateChild(parent: string, name: string): string { const directory = path.join(parent, name); try { fs.mkdirSync(directory, { mode: 0o700 }); } catch (error) { if ((error as NodeJS.ErrnoException).code !== "EEXIST") throw error; } assertPrivateDir(directory); return directory; }
59
- function allocationLockRoot(): string { const agentDir = getAgentDir(); fs.mkdirSync(agentDir, { recursive: true, mode: 0o700 }); assertPrivateDir(agentDir); const packageDir = ensurePrivateChild(agentDir, "pi-subagents"); return ensurePrivateChild(packageDir, "herdr-allocation-locks"); }
60
- function livePid(pid: number): boolean { try { process.kill(pid, 0); return true; } catch (error) { return (error as NodeJS.ErrnoException).code === "EPERM"; } }
61
- interface AllocationOwner { pid: number; token: string; dev: number; ino: number }
62
- function readAllocationOwner(ownerPath: string): AllocationOwner { const descriptor = fs.openSync(ownerPath, fs.constants.O_RDONLY | (fs.constants.O_NOFOLLOW ?? 0)); try { const stat = fs.fstatSync(descriptor); if (!stat.isFile() || (stat.mode & 0o777) !== 0o600 || (typeof process.getuid === "function" && stat.uid !== process.getuid())) throw new Error("Herdr allocation lock owner record is unsafe."); const value = JSON.parse(fs.readFileSync(descriptor, "utf8")) as { pid?: unknown; token?: unknown }; if (typeof value.pid !== "number" || !Number.isSafeInteger(value.pid) || value.pid <= 0 || typeof value.token !== "string" || !/^[a-f0-9]{32}$/u.test(value.token)) throw new Error("Herdr allocation lock owner record is malformed."); return { pid: value.pid, token: value.token, dev: stat.dev, ino: stat.ino }; } finally { fs.closeSync(descriptor); } }
63
- function sameOwner(left: AllocationOwner, right: AllocationOwner): boolean { return left.token === right.token && left.dev === right.dev && left.ino === right.ino; }
64
- export async function withHerdrPaneAllocationLock<T>(key: string, action: () => Promise<T>, options: { timeoutMs?: number; pollMs?: number } = {}): Promise<T> {
65
- const root = allocationLockRoot(), digest = createHash("sha256").update(key).digest("hex"), lockPath = path.join(root, `${digest}.lock`), recoveryPath = path.join(root, `${digest}.recovery`), token = randomBytes(16).toString("hex"), tempPath = path.join(root, `.${digest}.${token}.tmp`), deadline = Date.now() + (options.timeoutMs ?? HERDR_ALLOCATION_LOCK_TIMEOUT_MS); let published: AllocationOwner | undefined;
66
- try {
67
- fs.writeFileSync(tempPath, JSON.stringify({ pid: process.pid, token, createdAt: Date.now() }), { mode: 0o600, flag: "wx" }); const tempOwner = readAllocationOwner(tempPath);
68
- for (;;) {
69
- let recovering = false; try { readAllocationOwner(recoveryPath); recovering = true; } catch (error) { if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error; }
70
- if (!recovering) {
71
- let linked = false;
72
- try {
73
- fs.linkSync(tempPath, lockPath); linked = true;
74
- try { readAllocationOwner(recoveryPath); const current = readAllocationOwner(lockPath); if (!sameOwner(current, tempOwner)) throw new Error("Herdr allocation lock changed during publication."); fs.unlinkSync(lockPath); }
75
- catch (recoveryError) { if ((recoveryError as NodeJS.ErrnoException).code !== "ENOENT") throw recoveryError; published = readAllocationOwner(lockPath); if (!sameOwner(published, tempOwner)) throw new Error("Herdr allocation lock publication identity changed."); break; }
76
- } catch (publishError) { if (linked) { try { const current = readAllocationOwner(lockPath); if (sameOwner(current, tempOwner)) fs.unlinkSync(lockPath); } catch {} } if ((publishError as NodeJS.ErrnoException).code !== "EEXIST" && (publishError as NodeJS.ErrnoException).code !== "ENOENT") throw publishError; }
77
- }
78
- if (published) break;
79
- try { const current = readAllocationOwner(lockPath); if (!livePid(current.pid)) { let claimed = false; try { fs.linkSync(lockPath, recoveryPath); claimed = true; const recovery = readAllocationOwner(recoveryPath), latest = readAllocationOwner(lockPath); if (!sameOwner(recovery, current) || !sameOwner(latest, current)) throw new Error("Herdr stale lock identity changed during recovery."); fs.unlinkSync(lockPath); } catch (error) { if ((error as NodeJS.ErrnoException).code !== "EEXIST" && (error as NodeJS.ErrnoException).code !== "ENOENT") throw error; } finally { if (claimed) fs.unlinkSync(recoveryPath); } if (claimed) continue; } } catch (error) { if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error; }
80
- if (Date.now() >= deadline) throw new Error("Timed out waiting for the Herdr pane allocation lock."); await new Promise((resolve) => setTimeout(resolve, options.pollMs ?? HERDR_ALLOCATION_LOCK_POLL_MS));
81
- }
82
- fs.unlinkSync(tempPath);
83
- let value: T | undefined, actionError: unknown, releaseError: unknown, actionFailed = false, releaseFailed = false; try { value = await action(); } catch (error) { actionFailed = true; actionError = error; }
84
- try { const current = readAllocationOwner(lockPath); if (!published || !sameOwner(current, published)) throw new Error("Herdr pane allocation lock ownership changed before release."); fs.unlinkSync(lockPath); } catch (error) { releaseFailed = true; releaseError = error; }
85
- if (actionFailed && releaseFailed) throw new AggregateError([actionError, releaseError], "Herdr pane allocation action and release both failed.", { cause: actionError }); if (actionFailed) throw actionError; if (releaseFailed) throw releaseError; return value as T;
86
- } finally { try { fs.unlinkSync(tempPath); } catch (error) { if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error; } }
87
- }
88
-
89
- export function serializeHerdrPiLaunch(launch: ChildSessionLaunch): { args: string[]; resources: { agent: string; skills?: string[]; toolCeiling?: string[]; reads?: string[] | false } } {
90
- if (launch.storage.kind === "file") throw new Error("Pane-native remote Pi does not support fork, resume, or revival; use fresh context.");
91
- if (launch.extensionPaths.length || launch.requiredExtensions?.length) throw new Error("Pane-native remote Pi cannot transfer local extension paths; install/configure pi-subagents on the remote machine.");
92
- if (launch.processEnv && Object.values(launch.processEnv).some((value) => value !== undefined && value !== "__none__")) throw new Error("Pane-native remote Pi cannot transfer local bindings, MCP selections, or process environment.");
93
- if (launch.runtime.nestedRoute || launch.runtime.fanoutChild || launch.runtime.depth > 1) throw new Error("Nested delegation from a pane-native remote Pi is not supported.");
94
- if (launch.excludeTools?.length || launch.runtime.permissions || launch.runtime.toolBudget || launch.runtime.requiredExtensions || launch.runtime.requiredTools?.length || launch.runtime.mcpDirectTools?.length) throw new Error("Pane-native remote Pi cannot yet represent exclusions, permission rules, tool budgets, MCP direct tools, or required-tool/extension contracts; remove machine placement.");
95
- const resources = launch.remoteResources;
96
- if (!resources || !/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u.test(resources.agent) || resources.skills?.some((name) => !/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u.test(name)) || resources.toolCeiling?.some((name) => !/^[A-Za-z0-9_-]{1,64}$/u.test(name)) || (resources.reads !== undefined && resources.reads !== false && resources.reads.some((read) => typeof read !== "string" || Buffer.byteLength(read) > 4096))) throw new Error("Pane-native remote resources require bounded logical agent, skill, tool, and read names.");
97
- const args: string[] = [];
98
- if (launch.noSkills) args.push("--no-skills", "--no-prompt-templates");
99
- if (launch.noContextFiles) args.push("--no-context-files");
100
- if (launch.model) args.push("--model", launch.model);
101
- return { args, resources: { agent: resources.agent, ...(resources.skills ? { skills: [...resources.skills] } : {}), ...(resources.toolCeiling ? { toolCeiling: [...resources.toolCeiling] } : {}), ...(resources.reads !== undefined ? { reads: resources.reads === false ? false : [...resources.reads] } : {}) } };
102
- }
103
-
104
- export async function provisionHerdrPane(client: HerdrRpcClient, cwd: string, runId: string, runtimeDir: string, environment?: Record<string, string>, allocationKey = cwd): Promise<{ workspaceId: string; tabId: string; paneId: string }> {
105
- return withHerdrPaneAllocationLock(allocationKey, async () => {
106
- const snapshot = parseHerdrSessionSnapshot(await client.call("session.snapshot")); const panes = list(snapshot, "panes").filter((item): item is Record<string, unknown> => Boolean(item && typeof item === "object")), workspaces = list(snapshot, "workspaces").filter((item): item is Record<string, unknown> => Boolean(item && typeof item === "object"));
107
- const ownedLabel = `pi-subagents-${createHash("sha256").update(cwd).digest("hex").slice(0, 10)}`, owned = workspaces.filter((item) => item.label === ownedLabel); if (owned.length > 1) throw new Error("Herdr deterministic owned workspace identity is ambiguous.");
108
- const cwdWorkspaceIds = new Set(panes.filter((item) => item.cwd === cwd || item.foreground_cwd === cwd).map((item) => item.workspace_id).filter((id): id is string => typeof id === "string")), cwdWorkspaces = workspaces.filter((item) => typeof item.workspace_id === "string" && cwdWorkspaceIds.has(item.workspace_id));
109
- const selected = owned[0] ?? (cwdWorkspaces.length === 1 ? cwdWorkspaces[0] : undefined), selectedId = selected ? idOf(selected, "workspace_id") : undefined, actual = selectedId ? panes.filter((pane) => pane.workspace_id === selectedId).length : 0;
110
- if (actual >= HERDR_MAX_OWNED_PANES) throw new Error(`Herdr workspace pane limit of ${HERDR_MAX_OWNED_PANES} is reached; close an existing pane before launching another placed run.`);
111
- const env = environment ?? { [HERDR_PI_MODE_ENV]: "1", [HERDR_PI_RUN_ENV]: runId, [HERDR_PI_RUNTIME_DIR_ENV]: runtimeDir };
112
- if (selectedId) { const tab = parseHerdrCreated(await client.call("tab.create", { workspace_id: selectedId, cwd, label: `subagent-${runId.slice(-8)}`, env, focus: false }), "tab_created"); return { workspaceId: selectedId, tabId: tab.tabId, paneId: tab.paneId }; }
113
- const workspace = parseHerdrCreated(await client.call("workspace.create", { cwd, label: ownedLabel, env, focus: false }), "workspace_created"); return { workspaceId: workspace.workspaceId!, tabId: workspace.tabId, paneId: workspace.paneId };
114
- });
115
- }
116
-
117
-
118
- export async function discoverBridgeManifest(machine: HerdrMachineReference, runId: string, runtimeDir: string, options: { sshBin?: string; env?: NodeJS.ProcessEnv } = {}): Promise<{ socketPath: string; nativeSessionId: string; packageVersion: string; protocol: number }> {
119
- const script = `p="$1/manifest.json"; test -f "$p" && test ! -L "$p" && cat "$p"`;
120
- for (let attempt = 0; attempt < 100; attempt++) {
121
- const result = await runHerdrRemoteCommandAsync(machine, remoteShellCommand(script, [runtimeDir]), { ...options, timeout: 5_000, maxBuffer: 64 * 1024 });
122
- if (result.error) throw new Error(`Remote bridge manifest discovery failed: ${result.error.message}`, { cause: result.error });
123
- if (result.status === 0 && result.stdout.trim()) {
124
- let value: unknown; try { value = JSON.parse(result.stdout) as unknown; } catch { throw new Error("Remote bridge manifest is malformed."); }
125
- const p = value as Record<string, unknown>;
126
- if (p.runId !== runId || typeof p.socketPath !== "string" || path.posix.dirname(p.socketPath) !== runtimeDir || typeof p.nativeSessionId !== "string" || typeof p.packageVersion !== "string" || typeof p.protocol !== "number") throw new Error("Remote bridge manifest identity is incomplete or outside its owned runtime directory.");
127
- return p as unknown as { socketPath: string; nativeSessionId: string; packageVersion: string; protocol: number };
128
- }
129
- await new Promise((resolve) => setTimeout(resolve, 50));
130
- }
131
- throw new Error("The remote Pi did not expose the packaged pi-subagents bridge. Install/configure the same package version as an ambient Pi extension on the saved machine.");
132
- }
133
-
134
- export async function createRemoteRuntimeDir(machine: HerdrMachineReference, runId: string, options: { sshBin?: string; env?: NodeJS.ProcessEnv } = {}): Promise<string> { const result = await runHerdrRemoteCommandAsync(machine, remoteShellCommand("umask 077; mktemp -d \"${TMPDIR:-/tmp}/pi-subagents-herdr-$1-XXXXXXXX\"", [runId]), { ...options, timeout: 10_000, maxBuffer: 4096 }); if (result.error) throw new Error(`Could not provision a run-private remote bridge runtime directory: ${result.error.message}`, { cause: result.error }); const value = result.stdout.trim(); if (result.status !== 0 || !path.posix.isAbsolute(value) || value.includes("\n")) throw new Error("Could not provision a run-private remote bridge runtime directory."); return value; }
135
- export function removeRemoteRuntimeDir(machine: HerdrMachineReference, runtimeDir: string, options: { sshBin?: string; env?: NodeJS.ProcessEnv } = {}): void { const result = runHerdrRemoteCommand(machine, remoteShellCommand("p=$1; case \"${p##*/}\" in pi-subagents-herdr-*) test -d \"$p\" && test ! -L \"$p\" && rm -rf -- \"$p\";; *) exit 64;; esac", [runtimeDir]), { ...options, timeout: 10_000, maxBuffer: 4096 }); if (result.status !== 0 || result.stdout) throw new Error(`Could not remove the exact owned remote runtime directory: ${String(result.stderr).slice(0, 512)}`); }
136
-
137
- /** The single private owner for allocation shared by every pane-native backend projection. */
138
- export class HerdrPlacedRunOwner {
139
- readonly machine: HerdrMachineReference; readonly runId: string; readonly runtimeDir: string; connection: HerdrForwardedConnection;
140
- owned?: { workspaceId: string; tabId: string; paneId: string }; terminalId?: string; agentName?: string; startedArgv?: string[]; identity?: HerdrRunIdentity; #unsubscribe = () => {}; #snapshot: HerdrRunSnapshot = { connection: "connected", state: "ready", revision: 0 }; #cleanupPromise?: Promise<void>; readonly #removeRuntime: () => void;
141
- private constructor(machine: HerdrMachineReference, runId: string, runtimeDir: string, connection: HerdrForwardedConnection, removeRuntime: () => void = () => removeRemoteRuntimeDir(machine, runtimeDir)) { this.machine = machine; this.runId = runId; this.runtimeDir = runtimeDir; this.connection = connection; this.#removeRuntime = removeRuntime; }
142
- static async create(machine: HerdrMachineReference, runId: string, beforePane?: (owner: HerdrPlacedRunOwner) => void | Promise<void>): Promise<HerdrPlacedRunOwner> { const runtimeDir = await createRemoteRuntimeDir(machine, runId); let connection: HerdrForwardedConnection | undefined; try { connection = await connectHerdrMachine(machine); const owner = new HerdrPlacedRunOwner(machine, runId, runtimeDir, connection); await beforePane?.(owner); return owner; } catch (error) { const cleanupErrors: unknown[] = []; try { await connection?.close(); } catch (cleanupError) { cleanupErrors.push(cleanupError); } try { removeRemoteRuntimeDir(machine, runtimeDir); } catch (cleanupError) { cleanupErrors.push(cleanupError); } if (cleanupErrors.length) throw new AggregateError([error, ...cleanupErrors], "Herdr owner creation failed and cleanup also failed.", { cause: error }); throw error; } }
143
- observeEvent(event: unknown): void { const data = event && typeof event === "object" ? (event as { data?: Record<string, unknown> }).data : undefined; if (data && (!this.terminalId || data.terminal_id === this.terminalId || data.pane_id === this.owned?.paneId)) this.#snapshot = { ...this.#snapshot, revision: this.#snapshot.revision + 1, state: herdrRunState(data.agent_status, this.#snapshot.state) }; }
144
- markConnectionUnknown(observed: HerdrForwardedConnection): boolean { if (this.connection !== observed) return false; this.#snapshot = { ...this.#snapshot, connection: "unknown", state: "unknown", revision: this.#snapshot.revision + 1 }; return true; }
145
- statusSubscriptions(paneId = this.owned?.paneId): unknown[] { if (!paneId) throw new Error("Herdr status subscription requires a provisioned pane."); return herdrStatusSubscriptions(paneId); }
146
- async subscribe(listener: (event: unknown) => void, disconnected: (error: Error) => void): Promise<void> { const observed = this.connection; let adopted = false, candidateLost: Error | undefined; const unsubscribe = await observed.client.subscribe(this.statusSubscriptions(), (event) => { this.observeEvent(event); listener(event); }, (error) => { if (!adopted) { candidateLost ??= error; return; } if (!this.markConnectionUnknown(observed)) return; disconnected(error); }); if (candidateLost) { unsubscribe(); throw candidateLost; } this.#unsubscribe = unsubscribe; adopted = true; }
147
- async provision(environment?: Record<string, string>): Promise<{ workspaceId: string; tabId: string; paneId: string }> { this.owned = await provisionHerdrPane(this.connection.client, this.machine.cwd, this.runId, this.runtimeDir, environment, herdrPaneAllocationKey(this.machine.target, this.connection.endpoint.session, this.machine.cwd)); return this.owned; }
148
- async start(kind: "pi" | "claude" | "cursor" | "codex", name: string, args: string[], options: { timeoutMs?: number; pollMs?: number; clock?: { now(): number; wait(ms: number): Promise<void> } } = {}): Promise<{ terminalId: string; paneId: string; argv: string[] }> {
149
- if (!this.owned) throw new Error("Herdr placement owner has not provisioned its pane."); const clock = options.clock ?? { now: () => Date.now(), wait: (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms)) }, deadline = clock.now() + (options.timeoutMs ?? 5_000), pollMs = options.pollMs ?? 50;
150
- let response: unknown;
151
- for (;;) {
152
- try { response = await this.connection.client.call("agent.start", { name, kind, pane_id: this.owned.paneId, args, timeout_ms: 45_000 }, 60_000); break; }
153
- catch (error) {
154
- if (!(error instanceof Error) || !error.message.includes("is not an available shell")) throw error;
155
- const pane = tagged(await this.connection.client.call("pane.get", { pane_id: this.owned.paneId }), "pane_info", "pane"); if (pane.pane_id !== this.owned.paneId || pane.workspace_id !== this.owned.workspaceId || pane.tab_id !== this.owned.tabId) throw new Error("Herdr startup pane identity changed after a transient start rejection.", { cause: error }); if (pane.agent != null || pane.agent_session != null) throw new Error("Herdr startup pane became occupied after a transient start rejection.", { cause: error }); if (clock.now() >= deadline) throw new Error("Herdr owned pane remained unavailable until the startup deadline.", { cause: error }); await clock.wait(Math.min(pollMs, deadline - clock.now()));
156
- }
157
- }
158
- const started = parseHerdrAgent(response, "agent_started"), argv = [kind, ...args], terminalId = idOf(started, "terminal_id"), paneId = idOf(started, "pane_id"); if (paneId !== this.owned.paneId) throw new Error("Herdr started the native agent in an unexpected pane."); this.agentName = name; this.terminalId = terminalId; this.startedArgv = argv; return { terminalId, paneId, argv };
159
- }
160
- journal(identity: HerdrRunIdentity): void { this.identity = identity; this.#snapshot = { ...this.#snapshot, identity }; const journalDir = path.join(getAgentDir(), "pi-subagents", "herdr-run-journal"); fs.mkdirSync(journalDir, { recursive: true, mode: 0o700 }); fs.writeFileSync(path.join(journalDir, `${this.runId}.json`), JSON.stringify({ version: 1, identity, state: "ready", updatedAt: Date.now() }), { mode: 0o600, flag: "wx" }); }
161
- get snapshot(): HerdrRunSnapshot { return this.#snapshot; }
162
- runRemote(command: string, options: { timeout?: number; maxBuffer?: number } = {}) { return runHerdrRemoteCommand(this.machine, command, options); }
163
- async replaceConnection(input: { connection: HerdrForwardedConnection; unsubscribe: () => void; paneId: string; state: HerdrRunSnapshot["state"] }): Promise<void> { const oldConnection = this.connection, oldUnsubscribe = this.#unsubscribe; this.connection = input.connection; this.#unsubscribe = input.unsubscribe; if (this.identity) this.identity = { ...this.identity, paneId: input.paneId }; this.#snapshot = { connection: "connected", state: input.state, identity: this.identity, revision: this.#snapshot.revision + 1 }; oldUnsubscribe(); await oldConnection.close(); }
164
- cleanup(closeStartedPane = true): Promise<void> { return this.#cleanupPromise ??= this.#performCleanup(closeStartedPane); }
165
- async #performCleanup(closeStartedPane: boolean): Promise<void> { let failure: unknown; try { if (closeStartedPane && this.owned) { let closed = false; if (this.terminalId && this.agentName) { const current = parseHerdrAgent(await this.connection.client.call<Record<string, unknown>>("agent.get", { target: this.agentName }), "agent_info"); if (ownsHerdrPane(current, this.terminalId, this.owned.paneId)) { await this.connection.client.call("pane.close", { pane_id: this.owned.paneId }); closed = true; } } if (!closed) { const snapshot = parseHerdrSessionSnapshot(await this.connection.client.call<Record<string, unknown>>("session.snapshot")); const occupants = snapshotAgents(snapshot).filter((agent) => agent.pane_id === this.owned!.paneId); if (occupants.length !== 0) throw new Error("Refusing cleanup because startup pane ownership is uncertain."); await this.connection.client.call("pane.close", { pane_id: this.owned.paneId }); } } } catch (error) { failure = error; } try { this.#unsubscribe(); await this.connection.close(); this.#removeRuntime(); } catch (error) { failure ??= error; } this.#snapshot = { ...this.#snapshot, connection: "closed", revision: this.#snapshot.revision + 1 }; if (failure) throw failure; }
166
- }
167
-
168
- export class BridgeChannel {
169
- readonly socket: net.Socket; readonly decoder = new HerdrPiFrameDecoder(); readonly listeners = new Set<(frame: HerdrPiFrame) => void>(); readonly waiters = new Map<string, { resolve(frame: HerdrPiFrame): void; reject(error: Error): void }>(); readonly runId: string; readonly frames: HerdrPiFrame[] = [];
170
- readonly failure: Promise<never>; #rejectFailure!: (error: Error) => void; #failed = false;
171
- constructor(socketPath: string, runId: string) { this.runId = runId; this.failure = new Promise<never>((_resolve, reject) => { this.#rejectFailure = reject; }); this.failure.catch(() => {}); this.socket = net.createConnection(socketPath); this.socket.on("data", (chunk: Buffer) => { try { for (const frame of this.decoder.push(chunk)) { if (frame.runId !== runId) throw new Error("Bridge run identity mismatch."); this.frames.push(frame); if (this.frames.length > 1024) throw new Error("Bridge replay queue exceeded its bound."); const key = typeof frame.requestId === "string" ? `${frame.type}:${frame.requestId}` : ""; const waiter = this.waiters.get(key); if (waiter) { this.waiters.delete(key); waiter.resolve(frame); } for (const listener of this.listeners) listener(frame); } } catch (error) { this.fail(error as Error); } }); this.socket.on("error", (error) => this.fail(error)); this.socket.on("close", () => { if (!this.#failed) this.fail(new Error("Remote Pi bridge connection was lost; task state is unknown.")); }); }
172
- fail(error: Error) { if (this.#failed) return; this.#failed = true; this.#rejectFailure(error); for (const waiter of this.waiters.values()) waiter.reject(error); this.waiters.clear(); }
173
- get failed() { return this.#failed; }
174
- wait(type: string, requestId: string): Promise<HerdrPiFrame> { return new Promise((resolve, reject) => this.waiters.set(`${type}:${requestId}`, { resolve, reject })); }
175
- configure(resources: { agent: string; skills?: string[]; toolCeiling?: string[]; reads?: string[] | false }) { const requestId = `cfg_${randomBytes(6).toString("hex")}`; const waiting = this.wait("configured", requestId); this.socket.write(encodeHerdrPiFrame({ protocol: HERDR_PI_PROTOCOL, runId: this.runId, type: "configure", requestId, resources })); return waiting; }
176
- supervisorDelivered(requestId: string) { this.socket.write(encodeHerdrPiFrame({ protocol: HERDR_PI_PROTOCOL, runId: this.runId, type: "supervisor-delivered", requestId })); }
177
- prepare(requestId: string, operation: string, text?: string, supervisorId?: string) { const waiting = this.wait("prepared", requestId); this.socket.write(encodeHerdrPiFrame({ protocol: HERDR_PI_PROTOCOL, runId: this.runId, type: "prepare", requestId, operation, ...(text !== undefined ? { text } : {}), ...(supervisorId ? { supervisorId } : {}) })); return waiting; }
178
- close() { this.socket.destroy(); }
179
- }
180
-
181
- function waitForReadyBridgeFrame(bridge: BridgeChannel, timeoutMs: number, timeoutMessage: string, configured = false): Promise<HerdrPiFrame> {
182
- return new Promise((resolve, reject) => {
183
- const timer = setTimeout(() => reject(new Error(timeoutMessage)), timeoutMs);
184
- const listener = (frame: HerdrPiFrame) => {
185
- if (frame.type !== "ready" || configured && frame.configured !== true) return;
186
- clearTimeout(timer);
187
- bridge.listeners.delete(listener);
188
- resolve(frame);
189
- };
190
- bridge.listeners.add(listener);
191
- });
192
- }
193
-
194
- export class HerdrPiSession implements ChildSession {
195
- readonly #listeners = new Set<(event: ChildSessionEvent) => void>(); #messages: AgentMessage[] = []; #sequence = 0; #disposed = false; #aborted = false; #initialGit?: HerdrRemoteGitStatus; #finalGit?: HerdrRemoteGitStatus;
196
- readonly #operations = new Map<string, { resolve(): void; reject(error: Error): void; accepted: boolean; settled: boolean }>();
197
- #snapshot: HerdrRunSnapshot; bridgeForward: { close(): Promise<void> }; bridge: BridgeChannel; readonly requestedTools: string[] | undefined; readonly model: string | undefined; #evidenceCursor = 0; #reconnecting?: Promise<void>; #reconnectFactory?: () => Promise<void>; #reconnectFailure?: Error;
198
- #replyTimer?: NodeJS.Timeout; readonly supervisorDir: string | undefined; readonly runtime: ChildRuntimeConfig; readonly owner: HerdrPlacedRunOwner;
199
- constructor(owner: HerdrPlacedRunOwner, bridgeForward: { close(): Promise<void> }, bridge: BridgeChannel, requestedTools: string[] | undefined, model: string | undefined, runtime: ChildRuntimeConfig, initialGit?: HerdrRemoteGitStatus) { this.owner = owner; this.bridgeForward = bridgeForward; this.bridge = bridge; this.requestedTools = requestedTools; this.model = model; this.runtime = runtime; this.supervisorDir = runtime.supervisorChannelDir; this.#snapshot = { connection: "connected", state: "ready", identity: owner.identity, revision: 0 }; this.#initialGit = initialGit; bridge.listeners.add((frame) => this.#frame(frame)); if (this.supervisorDir) { this.#replyTimer = setInterval(() => { const replies = path.join(this.supervisorDir!, "replies"); for (const name of fs.existsSync(replies) ? fs.readdirSync(replies) : []) { const file = path.join(replies, name); try { const value = JSON.parse(fs.readFileSync(file, "utf8")) as { message?: unknown; requestId?: unknown }; if (typeof value.message === "string" && typeof value.requestId === "string") void this.#operation("supervisor-reply", value.message, value.requestId).then(() => fs.rmSync(file, { force: true })); } catch {} } }, 50); this.#replyTimer.unref?.(); } }
200
- get identity(): HerdrRunIdentity { return this.owner.identity!; } set identity(value: HerdrRunIdentity) { this.owner.identity = value; }
201
- get connection(): HerdrForwardedConnection { return this.owner.connection; } set connection(value: HerdrForwardedConnection) { this.owner.connection = value; }
202
- armReconnect(factory: () => Promise<void>) { this.#reconnectFactory = factory; const observed = this.bridge; observed.failure.catch(() => { if (this.bridge === observed) void this.reconnect(); }); }
203
- get evidenceCursor() { return this.#evidenceCursor; }
204
- async reconnect() { if (this.#disposed || !this.#reconnectFactory || this.#reconnectFailure) return; this.#snapshot = { ...this.#snapshot, connection: "unknown", state: "unknown", revision: this.#snapshot.revision + 1 }; this.#reconnecting ??= this.#reconnectFactory().catch((error) => { const unknown = this.#reconnectFailure = new Error(`Remote Pi reconciliation failed; task state is unknown: ${error instanceof Error ? error.message : String(error)}`); for (const operation of this.#operations.values()) if (!operation.settled) { operation.settled = true; operation.reject(unknown); } }).finally(() => { this.#reconnecting = undefined; }); await this.#reconnecting; }
205
- async replaceTransport(input: { connection: HerdrForwardedConnection; bridgeForward: { close(): Promise<void> }; bridge: BridgeChannel; unsubscribe: () => void; paneId: string; cursor: number; state: HerdrRunSnapshot["state"] }) { if (this.#disposed) { input.unsubscribe(); input.bridge.close(); await input.bridgeForward.close(); await input.connection.close(); return; } const old = { bridgeForward: this.bridgeForward, bridge: this.bridge }; this.bridgeForward = input.bridgeForward; this.bridge = input.bridge; this.identity = { ...this.identity, paneId: input.paneId }; this.#reconnectFailure = undefined; for (const frame of input.bridge.frames) if (typeof frame.cursor === "number" && frame.cursor > this.#evidenceCursor) this.#frame(frame); input.bridge.listeners.add((frame) => this.#frame(frame)); for (const operation of this.#operations.values()) if (!operation.accepted && !operation.settled) { operation.settled = true; operation.reject(new Error("Remote operation was not accepted before transport loss; task state is unknown.")); } this.#evidenceCursor = Math.max(this.#evidenceCursor, input.cursor); this.#snapshot = { connection: "connected", state: input.state, identity: this.identity, revision: this.#snapshot.revision + 1 }; const ownerReplacement = this.owner.replaceConnection({ connection: input.connection, unsubscribe: input.unsubscribe, paneId: input.paneId, state: input.state }); old.bridge.close(); await old.bridgeForward.close(); await ownerReplacement; if (this.#disposed) { await this.owner.cleanup(this.#aborted); return; } this.armReconnect(this.#reconnectFactory!); }
206
- observeHerdr(value: unknown) { const data = value && typeof value === "object" ? (value as { data?: Record<string, unknown> }).data : undefined; if (!data || (data.terminal_id !== this.identity.terminalId && data.pane_id !== this.identity.paneId)) return; this.#snapshot = { ...this.#snapshot, revision: this.#snapshot.revision + 1, state: herdrRunState(data.agent_status, this.#snapshot.state) }; }
207
- #frame(frame: HerdrPiFrame) { if (typeof frame.cursor === "number") { if (frame.cursor <= this.#evidenceCursor) return; this.#evidenceCursor = frame.cursor; } if (frame.nativeSessionId !== this.identity.nativeSessionId) { this.bridge.fail(new Error("Remote Pi native session identity changed.")); void this.connection.close(); return; } if (frame.type === "accepted" && typeof frame.requestId === "string") { const operation = this.#operations.get(frame.requestId); if (operation) operation.accepted = true; } if (frame.type === "supervisor-request" && this.supervisorDir && typeof frame.requestId === "string") this.#relaySupervisor(frame); if (frame.type === "event" && frame.event && typeof frame.event === "object") { const event = frame.event as ChildSessionEvent; const message = event.message as AgentMessage | undefined; if (event.type === "message_end" && message) this.#messages.push(message); for (const listener of this.#listeners) listener(event); } if (frame.type === "settled" && typeof frame.requestId === "string") { if (frame.finalAssistant && typeof frame.finalAssistant === "object") { const message = frame.finalAssistant as AgentMessage; if (!this.#messages.includes(message)) this.#messages.push(message); } if (frame.finalGit && typeof frame.finalGit === "object") this.#finalGit = frame.finalGit as HerdrRemoteGitStatus; const operation = this.#operations.get(frame.requestId); if (operation && !operation.settled) { operation.accepted = true; operation.settled = true; frame.idle === true && frame.pending === false ? operation.resolve() : operation.reject(new Error("Remote Pi did not settle with an empty native queue.")); } for (const listener of this.#listeners) listener({ type: "agent_settled" }); } }
208
- #relaySupervisor(frame: HerdrPiFrame) { if (!this.supervisorDir || typeof frame.requestId !== "string") return; const reason = frame.reason; if (reason !== "need_decision" && reason !== "interview_request" && reason !== "progress_update") return; const createdAt = Date.now(); const file = path.join(this.supervisorDir, "requests", `${path.basename(frame.requestId)}.json`); const request = { type: "subagent.supervisor.request", id: frame.requestId, createdAt, ...(reason !== "progress_update" ? { expiresAt: createdAt + 10 * 60_000 } : {}), reason, message: typeof frame.message === "string" ? frame.message : "", ...(frame.interview && typeof frame.interview === "object" ? { interview: frame.interview } : {}), expectsReply: reason !== "progress_update", runId: this.runtime.runId ?? this.identity.runId, agent: this.runtime.agent ?? "remote", childIndex: this.runtime.childIndex ?? 0, orchestratorSessionId: this.runtime.orchestratorSessionId }; try { fs.writeFileSync(file, JSON.stringify(request), { mode: 0o600, flag: "wx" }); } catch (error) { if ((error as NodeJS.ErrnoException).code !== "EEXIST") throw error; const existing = JSON.parse(fs.readFileSync(file, "utf8")) as { id?: unknown; reason?: unknown }; if (existing.id !== frame.requestId || existing.reason !== reason) throw new Error("Supervisor relay identity changed during replay."); } if (reason === "progress_update") this.bridge.supervisorDelivered(frame.requestId); }
209
- async #operation(operation: string, text?: string, supervisorId?: string): Promise<void> { const requestId = `${++this.#sequence}_${randomBytes(5).toString("hex")}`; let completion: Promise<void> = Promise.resolve(); if (operation === "prompt") completion = new Promise<void>((resolve, reject) => this.#operations.set(requestId, { resolve, reject, accepted: false, settled: false })); try { await Promise.race([this.bridge.prepare(requestId, operation, text, supervisorId), this.bridge.failure]); await this.connection.client.call("agent.prompt", { target: this.identity.agentName, text: `/pi-subagents-bridge ${requestId}` }); await completion; } catch (error) { if (operation === "prompt" && this.bridge.failed) { await this.reconnect(); await completion; return; } const pending = this.#operations.get(requestId); if (pending) pending.settled = true; throw error; } finally { if (operation === "prompt") this.#operations.delete(requestId); } }
210
- subscribe(listener: (event: ChildSessionEvent) => void) { this.#listeners.add(listener); return () => this.#listeners.delete(listener); }
211
- prompt(text: string) { return this.#operation("prompt", text); } steer(text: string) { return this.#operation("steer", text); } followUp(text: string) { return this.#operation("follow-up", text); } async abort() { this.#aborted = true; await this.#operation("abort"); }
212
- async dispose() { if (this.#disposed) return; this.#disposed = true; if (this.#replyTimer) clearInterval(this.#replyTimer); this.bridge.close(); await this.bridgeForward.close(); await this.owner.cleanup(this.#aborted); this.#snapshot = { ...this.#snapshot, connection: "closed" }; }
213
- get messages() { return this.#messages; } get sessionFile() { return undefined; } get sessionId() { return this.identity.nativeSessionId; } get modelId() { return this.model; }
214
- get machineEvidence() { return { machineId: this.identity.machineId, ...(this.#initialGit ? { initial: this.#initialGit } : {}), ...(this.#finalGit ? { final: this.#finalGit } : {}) }; }
215
- get placementSnapshot() { return this.owner.snapshot; }
216
- }
217
-
218
- export async function reconnectHerdrPiSession(session: HerdrPiSession, launch: ChildSessionLaunch, dependencies: { connect?: typeof connectHerdrMachine; discoverManifest?: typeof discoverBridgeManifest; createBridge?: (socketPath: string, runId: string) => BridgeChannel } = {}): Promise<void> {
219
- const connect = dependencies.connect ?? connectHerdrMachine, discoverManifest = dependencies.discoverManifest ?? discoverBridgeManifest, createBridge = dependencies.createBridge ?? ((socketPath: string, runId: string) => new BridgeChannel(socketPath, runId));
220
- let validated: { connection: HerdrForwardedConnection; unsubscribe: () => void; bridgeForward: { socketPath: string; close(): Promise<void> }; bridge: BridgeChannel; candidate: { adopted: boolean; lost?: Error } } | undefined;
221
- const result = await boundedHerdrReconnect(session.identity, session.evidenceCursor, async () => {
222
- const connection = await connect(launch.machine!); let unsubscribe = () => {}; let bridgeForward: { socketPath: string; close(): Promise<void> } | undefined; let bridge: BridgeChannel | undefined; const generation: { adopted: boolean; lost?: Error } = { adopted: false };
223
- try {
224
- const snapshot = parseHerdrSessionSnapshot(await connection.client.call<Record<string, unknown>>("session.snapshot"));
225
- const agents = snapshotAgents(snapshot);
226
- const manifest = await discoverManifest(launch.machine!, session.identity.runId, session.identity.runtimeDir); bridgeForward = await connection.forwardRemoteSocket(manifest.socketPath, "bridge-reconnect"); bridge = createBridge(bridgeForward.socketPath, session.identity.runId);
227
- const ready = await waitForReadyBridgeFrame(bridge, 8_000, "Reconnected bridge handshake timed out.", true);
228
- const candidate: HerdrReconnectCandidate = { endpoint: connection.endpoint, agents, bridge: { runId: ready.runId, nativeSessionId: ready.nativeSessionId as string | undefined, packageVersion: ready.packageVersion as string | undefined, protocol: ready.protocol, evidenceCursor: ready.evidenceCursor as number | undefined, evidenceFloor: ready.evidenceFloor as number | undefined } };
229
- const check = reconcileHerdrReconnect(session.identity, candidate, session.evidenceCursor); if (!check.ok) throw new Error(check.reason);
230
- unsubscribe = await connection.client.subscribe(herdrStatusSubscriptions(check.paneId), (event) => { session.owner.observeEvent(event); session.observeHerdr(event); }, (error) => { if (!generation.adopted) { generation.lost ??= error; return; } session.owner.markConnectionUnknown(connection); void session.reconnect(); });
231
- if (generation.lost) throw generation.lost; validated = { connection, unsubscribe, bridgeForward, bridge, candidate: generation }; return candidate;
232
- } catch (error) { unsubscribe(); bridge?.close(); await bridgeForward?.close(); await connection.close(); throw error; }
233
- }, { attempts: 3, deadlineMs: 15_000, disposed: () => (session.placementSnapshot as HerdrRunSnapshot).connection === "closed" });
234
- if (!result.ok) throw new Error(`Pane-native reconnect remains unknown: ${result.reason}`);
235
- if (!validated) throw new Error("Pane-native reconnect produced no validated transport.");
236
- if (validated.candidate.lost) { validated.unsubscribe(); validated.bridge.close(); await validated.bridgeForward.close(); await validated.connection.close(); throw validated.candidate.lost; }
237
- validated.candidate.adopted = true;
238
- await session.replaceTransport({ ...validated, paneId: result.paneId, cursor: result.cursor, state: result.state });
239
- }
240
-
241
- export async function createHerdrPiSession(launch: ChildSessionLaunch): Promise<ChildSession> {
242
- if (!launch.machine) throw new Error("Pane-native Pi launch requires a saved machine.");
243
- const policy = serializeHerdrPiLaunch(launch); const runId = safeRunId(launch.runtime.runId); const owner = await HerdrPlacedRunOwner.create(launch.machine, runId); const runtimeDir = owner.runtimeDir, connection = owner.connection; let owned: { workspaceId: string; tabId: string; paneId: string } | undefined; let agentName: string | undefined; let observeHerdr: ((event: unknown) => void) | undefined;
244
- try {
245
- let reconnectSession: HerdrPiSession | undefined; owned = await owner.provision(); await owner.subscribe((event) => observeHerdr?.(event), () => void reconnectSession?.reconnect());
246
- agentName = `pi-${runId.slice(-20)}`; const { terminalId } = await owner.start("pi", agentName, policy.args);
247
- const manifest = await discoverBridgeManifest(launch.machine, runId, runtimeDir); if (manifest.protocol !== HERDR_PI_PROTOCOL || manifest.packageVersion !== packageJson.version) throw new Error(`Remote pi-subagents bridge version mismatch (remote ${manifest.packageVersion}, local ${packageJson.version}).`);
248
- const bridgeForward = await connection.forwardRemoteSocket(manifest.socketPath, "bridge"); const bridge = new BridgeChannel(bridgeForward.socketPath, runId);
249
- const ready = await waitForReadyBridgeFrame(bridge, 15_000, "Remote Pi bridge handshake timed out.");
250
- if (ready.packageVersion !== packageJson.version || ready.nativeSessionId !== manifest.nativeSessionId || ready.cwd !== launch.machine.cwd) throw new Error("Remote Pi bridge handshake identity mismatch.");
251
- const configured = await Promise.race([bridge.configure(policy.resources), bridge.failure]);
252
- if (configured.nativeSessionId !== manifest.nativeSessionId || configured.agent !== policy.resources.agent) throw new Error("Remote Pi resource resolution identity mismatch.");
253
- if (!Array.isArray(configured.tools) || (policy.resources.toolCeiling && (configured.tools as unknown[]).some((tool) => !policy.resources.toolCeiling!.includes(String(tool))))) throw new Error("Remote Pi active-tool ceiling acknowledgement mismatch.");
254
- if (launch.model && configured.model !== launch.model.split(":")[0]) throw new Error(`Remote Pi model '${launch.model}' did not resolve to the requested provider/model.`);
255
- const identity: HerdrRunIdentity = { runId, machineId: launch.machine.id, target: launch.machine.target, session: connection.endpoint.session, workspaceId: owned.workspaceId, tabId: owned.tabId, paneId: owned.paneId, terminalId, agentName, nativeSessionId: manifest.nativeSessionId, cwd: launch.machine.cwd, runtimeDir };
256
- owner.journal(identity);
257
- const session = new HerdrPiSession(owner, bridgeForward, bridge, (configured.tools as string[] | undefined), typeof ready.model === "string" ? ready.model : undefined, launch.runtime, ready.initialGit as HerdrRemoteGitStatus | undefined); reconnectSession = session; observeHerdr = (event) => session.observeHerdr(event); session.armReconnect(() => reconnectHerdrPiSession(session, launch)); return session;
258
- } catch (error) { await owner.cleanup(); throw error; }
259
- }
260
-
261
- export function createPlacementAwareChildSessionFactory(local: ChildSessionFactory, createRemote: (launch: ChildSessionLaunch) => Promise<ChildSession> = createHerdrPiSession): ChildSessionFactory {
262
- const remote = new Set<ChildSession>(); return { async create(launch) { if (!launch.machine) return local.create(launch); serializeHerdrPiLaunch(launch); const child = await createRemote(launch); remote.add(child); return child; }, async dispose() { await Promise.allSettled([...remote].map((child) => child.dispose())); remote.clear(); await local.dispose(); } };
263
- }
@@ -1,231 +0,0 @@
1
- import type {
2
- AsyncStatus,
3
- HostStepNode,
4
- HostStepState,
5
- HostStepVerdict,
6
- WorkflowGraphNode,
7
- WorkflowGraphSnapshot,
8
- WorkflowNodeStatus,
9
- } from "../../shared/types.ts";
10
-
11
- export const HOST_STEP_MAX_ID_CHARS = 128;
12
- export const HOST_STEP_MAX_LABEL_CHARS = 80;
13
- export const HOST_STEP_MAX_ROLE_CHARS = 32;
14
- export const HOST_STEP_MAX_PROVIDER_CHARS = 64;
15
- export const HOST_STEP_MAX_REASON_CHARS = 64;
16
- export const HOST_STEP_MAX_DETAIL_CHARS = 200;
17
- export const HOST_STEP_MAX_TARGET_CHARS = 128;
18
- export const HOST_STEP_MAX_REF_CHARS = 128;
19
- export const HOST_STEP_MAX_REPORT_PATH_CHARS = 240;
20
- export const HOST_STEP_MAX_COUNT = 32;
21
-
22
- const HOST_STEP_FIELDS = new Set([
23
- "version",
24
- "kind",
25
- "monitorKind",
26
- "id",
27
- "label",
28
- "role",
29
- "provider",
30
- "state",
31
- "verdict",
32
- "reasonCode",
33
- "detail",
34
- "target",
35
- "freshness",
36
- "reportPath",
37
- "exitCode",
38
- "updatedAt",
39
- "deadlineAt",
40
- ]);
41
-
42
- const FRESHNESS_FIELDS = new Set(["expectedRef", "observedRef", "stale"]);
43
-
44
- function isRecord(value: unknown): value is Record<string, unknown> {
45
- return typeof value === "object" && value !== null && !Array.isArray(value);
46
- }
47
-
48
- function assertBoundedString(value: unknown, field: string, maxChars: number, source: string, required = false): asserts value is string {
49
- if (value === undefined && !required) return;
50
- if (typeof value !== "string" || !value.trim()) throw new Error(`Invalid host step '${source}': ${field} must be a non-empty string.`);
51
- if (value.length > maxChars) throw new Error(`Invalid host step '${source}': ${field} exceeds ${maxChars} characters.`);
52
- if (/\r|\n/.test(value)) throw new Error(`Invalid host step '${source}': ${field} must be single-line.`);
53
- }
54
-
55
- function assertTimestamp(value: unknown, field: string, source: string, required = false): asserts value is number {
56
- if (value === undefined && !required) return;
57
- if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 0) throw new Error(`Invalid host step '${source}': ${field} must be a non-negative safe integer.`);
58
- }
59
-
60
- function assertFreshness(value: unknown, source: string): asserts value is HostStepNode["freshness"] {
61
- if (!isRecord(value)) throw new Error(`Invalid host step '${source}': freshness must be an object.`);
62
- const unknownFields = Object.keys(value).filter((field) => !FRESHNESS_FIELDS.has(field));
63
- if (unknownFields.length > 0) throw new Error(`Invalid host step '${source}': freshness has unsupported fields: ${unknownFields.join(", ")}.`);
64
- assertBoundedString(value.expectedRef, "freshness.expectedRef", HOST_STEP_MAX_REF_CHARS, source, true);
65
- assertBoundedString(value.observedRef, "freshness.observedRef", HOST_STEP_MAX_REF_CHARS, source);
66
- if (value.stale !== undefined && typeof value.stale !== "boolean") throw new Error(`Invalid host step '${source}': freshness.stale must be a boolean.`);
67
- }
68
-
69
- /**
70
- * Validate the persisted host-step contract. This deliberately rejects unknown
71
- * fields and unbounded values so status and receipt loaders fail closed.
72
- */
73
- export function assertHostStepNode(value: unknown, source = "status"): asserts value is HostStepNode {
74
- if (!isRecord(value)) throw new Error(`Invalid host step '${source}': expected an object.`);
75
- const unknownFields = Object.keys(value).filter((field) => !HOST_STEP_FIELDS.has(field));
76
- if (unknownFields.length > 0) throw new Error(`Invalid host step '${source}': unsupported fields: ${unknownFields.join(", ")}.`);
77
- if (value.version !== 1) throw new Error(`Invalid host step '${source}': version must be 1.`);
78
- if (value.kind !== "host-step") throw new Error(`Invalid host step '${source}': kind must be 'host-step'.`);
79
- if (value.monitorKind !== "command" && value.monitorKind !== "ci" && value.monitorKind !== "gate") throw new Error(`Invalid host step '${source}': monitorKind must be 'command', 'ci', or 'gate'.`);
80
- assertBoundedString(value.id, "id", HOST_STEP_MAX_ID_CHARS, source, true);
81
- assertBoundedString(value.label, "label", HOST_STEP_MAX_LABEL_CHARS, source, true);
82
- assertBoundedString(value.role, "role", HOST_STEP_MAX_ROLE_CHARS, source);
83
- assertBoundedString(value.provider, "provider", HOST_STEP_MAX_PROVIDER_CHARS, source);
84
- if (value.state !== "pending" && value.state !== "running" && value.state !== "done" && value.state !== "cancelled" && value.state !== "error") {
85
- throw new Error(`Invalid host step '${source}': state is invalid.`);
86
- }
87
- if (value.verdict !== undefined && value.verdict !== "pass" && value.verdict !== "fail" && value.verdict !== "inconclusive") {
88
- throw new Error(`Invalid host step '${source}': verdict is invalid.`);
89
- }
90
- if (value.state !== "done" && value.verdict !== undefined) throw new Error(`Invalid host step '${source}': verdict is only valid for done state.`);
91
- assertBoundedString(value.reasonCode, "reasonCode", HOST_STEP_MAX_REASON_CHARS, source);
92
- assertBoundedString(value.detail, "detail", HOST_STEP_MAX_DETAIL_CHARS, source);
93
- assertBoundedString(value.target, "target", HOST_STEP_MAX_TARGET_CHARS, source);
94
- if (value.freshness !== undefined) assertFreshness(value.freshness, source);
95
- if (value.freshness && value.freshness.stale === true && (value.state !== "done" || value.verdict !== "inconclusive")) {
96
- throw new Error(`Invalid host step '${source}': stale freshness requires done/inconclusive state.`);
97
- }
98
- assertBoundedString(value.reportPath, "reportPath", HOST_STEP_MAX_REPORT_PATH_CHARS, source);
99
- const reportName = hostStepReportName(value.reportPath);
100
- if (value.reportPath !== undefined && (!reportName || reportName === "." || reportName === "..")) throw new Error(`Invalid host step '${source}': reportPath must name a report.`);
101
- if (value.exitCode !== undefined && value.exitCode !== null && (typeof value.exitCode !== "number" || !Number.isSafeInteger(value.exitCode) || value.exitCode < 0)) throw new Error(`Invalid host step '${source}': exitCode must be a non-negative safe integer or null.`);
102
- if (value.monitorKind !== "command" && value.exitCode !== undefined) throw new Error(`Invalid host step '${source}': exitCode is only valid for command steps.`);
103
- if ((value.state === "pending" || value.state === "running") && value.exitCode !== undefined) throw new Error(`Invalid host step '${source}': exitCode is only valid after command settlement.`);
104
- assertTimestamp(value.updatedAt, "updatedAt", source, true);
105
- assertTimestamp(value.deadlineAt, "deadlineAt", source);
106
- }
107
-
108
- export function parseHostStepNode(value: unknown, source = "status"): HostStepNode {
109
- assertHostStepNode(value, source);
110
- return {
111
- ...value,
112
- ...(value.freshness ? { freshness: { ...value.freshness } } : {}),
113
- };
114
- }
115
-
116
- export function assertUniqueHostStepIds(hostSteps: readonly HostStepNode[], source = "status"): void {
117
- const ids = new Set<string>();
118
- for (const hostStep of hostSteps) {
119
- if (ids.has(hostStep.id)) throw new Error(`Invalid host step '${source}': duplicate host step id '${hostStep.id}'.`);
120
- ids.add(hostStep.id);
121
- }
122
- }
123
-
124
- /** Return only valid host nodes so an untrusted in-memory projection fails closed. */
125
- export function validHostStepNodes(graph: WorkflowGraphSnapshot | undefined): HostStepNode[] {
126
- const nodes = graph?.nodes ?? [];
127
- const nodeIdCounts = new Map<string, number>();
128
- for (const node of nodes) nodeIdCounts.set(node.id, (nodeIdCounts.get(node.id) ?? 0) + 1);
129
- const hostSteps: HostStepNode[] = [];
130
- for (const [index, node] of nodes.entries()) {
131
- if (node.kind !== "host-step") continue;
132
- try {
133
- const hostStep = parseHostStepNode(node.hostStep, `workflowGraph.nodes[${index}].hostStep`);
134
- if (node.id !== hostStep.id || node.label !== hostStep.label) continue;
135
- if (nodeIdCounts.get(hostStep.id) !== 1) continue;
136
- hostSteps.push(hostStep);
137
- } catch {
138
- // Renderers must not turn malformed host data into a fake child row.
139
- }
140
- }
141
- return hostSteps.slice(0, HOST_STEP_MAX_COUNT);
142
- }
143
-
144
- export function assertWorkflowGraphHostSteps(graph: WorkflowGraphSnapshot | undefined, source = "status", expectedRunId?: string): void {
145
- if (!graph) return;
146
- if (expectedRunId !== undefined && graph.runId !== expectedRunId) throw new Error(`Invalid host step '${source}': workflowGraph.runId does not match the status run id.`);
147
- if (!Array.isArray(graph.nodes)) throw new Error(`Invalid host step '${source}.workflowGraph': nodes must be an array.`);
148
- const hostStepCount = graph.nodes.filter((node) => node.kind === "host-step").length;
149
- if (hostStepCount > HOST_STEP_MAX_COUNT) throw new Error(`Invalid host step '${source}': workflowGraph contains more than ${HOST_STEP_MAX_COUNT} host steps.`);
150
- const hostSteps: HostStepNode[] = [];
151
- for (const [index, node] of graph.nodes.entries()) {
152
- if (node.kind !== "host-step") continue;
153
- const hostStep = parseHostStepNode(node.hostStep, `${source}.workflowGraph.nodes[${index}].hostStep`);
154
- if (node.id !== hostStep.id) throw new Error(`Invalid host step '${source}': workflowGraph.nodes[${index}].id does not match hostStep.id.`);
155
- if (node.label !== hostStep.label) throw new Error(`Invalid host step '${source}': workflowGraph.nodes[${index}].label does not match hostStep.label.`);
156
- hostSteps.push(hostStep);
157
- }
158
- assertUniqueHostStepIds(hostSteps, source);
159
- for (const hostStep of hostSteps) {
160
- if (graph.nodes.filter((node) => node.id === hostStep.id).length !== 1) throw new Error(`Invalid host step '${source}': workflowGraph id '${hostStep.id}' is not unique.`);
161
- }
162
- }
163
-
164
- export function hostStepWorkflowNode(hostStep: HostStepNode): WorkflowGraphNode {
165
- assertHostStepNode(hostStep, hostStep.id);
166
- return {
167
- id: hostStep.id,
168
- kind: "host-step",
169
- label: hostStep.label,
170
- status: workflowNodeStatus(hostStep),
171
- hostStep: { ...hostStep, ...(hostStep.freshness ? { freshness: { ...hostStep.freshness } } : {}) },
172
- };
173
- }
174
-
175
- function workflowNodeStatus(hostStep: HostStepNode): WorkflowNodeStatus {
176
- if (hostStep.state === "pending") return "pending";
177
- if (hostStep.state === "running") return "running";
178
- if (hostStep.state === "cancelled") return "stopped";
179
- if (hostStep.state === "error") return "failed";
180
- if (hostStep.verdict === undefined || hostStep.verdict === "inconclusive") return "partial";
181
- return hostStep.verdict === "fail" ? "failed" : "completed";
182
- }
183
-
184
- /**
185
- * Host-only registration/update boundary. The caller supplies the existing
186
- * status writer; monitor providers never receive a path or write status.json.
187
- */
188
- export function upsertHostStep(input: {
189
- status: AsyncStatus;
190
- hostStep: HostStepNode;
191
- persist: (status: AsyncStatus) => void;
192
- }): AsyncStatus {
193
- const hostStep = parseHostStepNode(input.hostStep, input.hostStep.id);
194
- assertWorkflowGraphHostSteps(input.status.workflowGraph, "host-step", input.status.runId);
195
- const graph: WorkflowGraphSnapshot = input.status.workflowGraph
196
- ? {
197
- ...input.status.workflowGraph,
198
- nodes: [...input.status.workflowGraph.nodes],
199
- }
200
- : {
201
- runId: input.status.runId,
202
- mode: input.status.mode,
203
- phases: [],
204
- nodes: [],
205
- };
206
- const existingIndex = graph.nodes.findIndex((node) => node.id === hostStep.id);
207
- const existing = existingIndex >= 0 ? graph.nodes[existingIndex] : undefined;
208
- if (existing && existing.kind !== "host-step") throw new Error(`Host step '${hostStep.id}' conflicts with an existing workflow node.`);
209
- if (existingIndex < 0 && graph.nodes.filter((candidate) => candidate.kind === "host-step").length >= HOST_STEP_MAX_COUNT) {
210
- throw new Error(`Host step limit of ${HOST_STEP_MAX_COUNT} has been reached.`);
211
- }
212
- const node = hostStepWorkflowNode(hostStep);
213
- if (existingIndex >= 0) graph.nodes[existingIndex] = node;
214
- else graph.nodes.push(node);
215
- const nextStatus: AsyncStatus = {
216
- ...input.status,
217
- workflowGraph: graph,
218
- lastUpdate: Math.max(input.status.lastUpdate ?? 0, hostStep.updatedAt),
219
- };
220
- input.persist(nextStatus);
221
- return nextStatus;
222
- }
223
-
224
- export function hostStepVerdictLabel(state: HostStepState, verdict: HostStepVerdict | undefined): string {
225
- return state === "done" ? verdict ?? "inconclusive" : state;
226
- }
227
-
228
- export function hostStepReportName(reportPath: string | undefined): string | undefined {
229
- if (!reportPath) return undefined;
230
- return reportPath.split(/[\\/]/).filter(Boolean).at(-1);
231
- }