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,1012 +0,0 @@
1
- import { spawnSync } from "node:child_process";
2
- import { createHash, randomUUID } from "node:crypto";
3
- import * as fs from "node:fs";
4
- import * as path from "node:path";
5
- import type { AgentToolResult } from "@earendil-works/pi-agent-core";
6
- import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
7
- import { getProjectSubagentsDir } from "../../shared/artifacts.ts";
8
- import { writePrivateAtomicJson } from "../../shared/atomic-json.ts";
9
- import { shortenPath } from "../../shared/formatters.ts";
10
- import type { AsyncStatus, Details, ExtensionConfig } from "../../shared/types.ts";
11
- import type { SubagentParamsLike } from "../foreground/subagent-executor.ts";
12
- import { validateExecutionAcceptance } from "../shared/acceptance.ts";
13
- import type { ResolvedSubagentCapabilityCeiling } from "../shared/capability-ceiling.ts";
14
- import { previewSimpleWorkflowRun } from "../../workflows/scripted-workflow.ts";
15
- import { resolveGitRepositoryIdentity } from "../../workflows/chat-progress.ts";
16
- import { getConfigDirName } from "../../shared/utils.ts";
17
- import { normalizeWorktreeBaseRef } from "../shared/worktree.ts";
18
- import { deepFreezeWorkflowArgs, normalizeWorkflowArgs } from "../../workflows/workflow-resources.ts";
19
-
20
- export const SCHEDULED_RUN_ACTIONS = [
21
- "schedule.create",
22
- "schedule.list",
23
- "schedule.show",
24
- "schedule.history",
25
- "schedule.pause",
26
- "schedule.resume",
27
- "schedule.run",
28
- "schedule.run-due",
29
- "schedule.delete",
30
- ] as const;
31
-
32
- const MAX_TIMER_DELAY_MS = 2_147_483_647;
33
- const DEFAULT_MAX_PENDING = 20;
34
- const MAX_HISTORY = 100;
35
- const STALE_LAUNCH_CLAIM_MS = 5 * 60_000;
36
- const SCHEDULE_ID = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;
37
-
38
- type ScheduledRunTimers = Pick<typeof globalThis, "setTimeout" | "clearTimeout">;
39
- export type ScheduledRunAction = typeof SCHEDULED_RUN_ACTIONS[number];
40
- export type ScheduleRunState = "running" | "skipped" | "missed" | "completed" | "failed_launch" | "failed_run";
41
- export type ScheduleTrigger =
42
- | { kind: "once"; at: string; nextRunAt?: string }
43
- | { kind: "interval"; every: string; everyMs: number; anchorAt: string; nextRunAt: string };
44
- export type ScheduleTarget = { workflowScript: string; args: Record<string, unknown>; baseRef?: string };
45
-
46
- export interface ScheduleRecord {
47
- schemaVersion: 1;
48
- id: string;
49
- name: string;
50
- cwd: string;
51
- trigger: ScheduleTrigger;
52
- target: ScheduleTarget;
53
- overlap: "skip";
54
- catchUp: "none" | "latest";
55
- timeoutMs?: number;
56
- paused: boolean;
57
- sessionOnly?: boolean;
58
- quiet?: boolean;
59
- ownerSessionFile?: string;
60
- createdAt: string;
61
- updatedAt: string;
62
- activeRunId?: string;
63
- lastRunId?: string;
64
- }
65
-
66
- export interface ScheduleRunRecord {
67
- schemaVersion: 1;
68
- id: string;
69
- scheduleId: string;
70
- plannedAt: string;
71
- dueReason: "timer" | "run-due" | "manual";
72
- state: ScheduleRunState;
73
- startedAt?: string;
74
- completedAt?: string;
75
- asyncId?: string;
76
- asyncDir?: string;
77
- error?: string;
78
- }
79
-
80
- type PublicScheduleRecord = Omit<ScheduleRecord, "ownerSessionFile">;
81
-
82
- type ScheduledRunManagerDeps = {
83
- config: ExtensionConfig;
84
- launch(params: SubagentParamsLike, ctx: ExtensionContext, signal: AbortSignal): Promise<AgentToolResult<Details>>;
85
- storeRoot?: string;
86
- now?: () => number;
87
- randomId?: () => string;
88
- resolveCapabilityCeiling?: (sessionId: string) => ResolvedSubagentCapabilityCeiling | undefined;
89
- timers?: ScheduledRunTimers;
90
- };
91
-
92
- export function isScheduledRunAction(action: unknown): action is ScheduledRunAction {
93
- return typeof action === "string" && (SCHEDULED_RUN_ACTIONS as readonly string[]).includes(action);
94
- }
95
-
96
- export function scheduledRunsEnabled(config: ExtensionConfig): boolean {
97
- return config.scheduledRuns?.enabled !== false;
98
- }
99
-
100
- export function scheduledRunStorePath(cwd: string, _sessionId?: string, root?: string): string {
101
- if (!root) return path.join(getProjectSubagentsDir(path.resolve(cwd)), "schedules");
102
- const projectKey = createHash("sha256").update(path.resolve(cwd)).digest("hex").slice(0, 20);
103
- return path.join(root, projectKey);
104
- }
105
-
106
- export function parseScheduledRunTime(at: string, now = Date.now()): number {
107
- const trimmed = at.trim();
108
- const relative = trimmed.match(/^\+(\d+)(s|m|h|d)$/);
109
- if (relative) {
110
- const amount = Number(relative[1]);
111
- if (!Number.isSafeInteger(amount) || amount < 1) throw new Error(`Invalid at value "${at}". Relative delays must be positive, such as "+10m".`);
112
- const unitMs = { s: 1_000, m: 60_000, h: 3_600_000, d: 86_400_000 }[relative[2] as "s" | "m" | "h" | "d"];
113
- const result = now + amount * unitMs;
114
- if (!Number.isSafeInteger(result)) throw new Error(`Invalid at value "${at}". Relative delay is too large.`);
115
- return result;
116
- }
117
- const iso = trimmed.match(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(?::(\d{2})(?:\.\d{1,3})?)?(Z|[+-]\d{2}:\d{2})$/);
118
- if (!iso) throw new Error(`Invalid at value "${at}". Use a one-shot delay such as "+10m" or an ISO timestamp with timezone.`);
119
- const year = Number(iso[1]);
120
- const month = Number(iso[2]);
121
- const day = Number(iso[3]);
122
- const hour = Number(iso[4]);
123
- const minute = Number(iso[5]);
124
- const second = iso[6] === undefined ? 0 : Number(iso[6]);
125
- const zone = iso[7]!;
126
- const offsetHour = zone === "Z" ? 0 : Number(zone.slice(1, 3));
127
- const offsetMinute = zone === "Z" ? 0 : Number(zone.slice(4, 6));
128
- const daysInMonth = month >= 1 && month <= 12 ? new Date(Date.UTC(year, month, 0)).getUTCDate() : 0;
129
- const parsed = Date.parse(trimmed);
130
- if (month < 1 || month > 12 || day < 1 || day > daysInMonth || hour > 23 || minute > 59 || second > 59 || offsetHour > 23 || offsetMinute > 59 || !Number.isFinite(parsed)) throw new Error(`Invalid at value "${at}". Use a valid ISO timestamp.`);
131
- if (parsed <= now) throw new Error(`Scheduled time ${new Date(parsed).toISOString()} is in the past.`);
132
- return parsed;
133
- }
134
-
135
- export function parseScheduleInterval(every: string): number {
136
- const match = every.trim().match(/^(\d+)(m|h|d|w)$/);
137
- if (!match) throw new Error(`Invalid every value "${every}". This first recurring slice supports fixed intervals such as "30m", "6h", "2d", or "2w".`);
138
- const amount = Number(match[1]);
139
- if (!Number.isSafeInteger(amount) || amount < 1) throw new Error(`Invalid every value "${every}". Interval must be positive.`);
140
- const unitMs = { m: 60_000, h: 3_600_000, d: 86_400_000, w: 604_800_000 }[match[2] as "m" | "h" | "d" | "w"];
141
- const result = amount * unitMs;
142
- if (!Number.isSafeInteger(result)) throw new Error(`Invalid every value "${every}". Interval is too large.`);
143
- return result;
144
- }
145
-
146
- function timestamp(value: number): string {
147
- return new Date(value).toISOString();
148
- }
149
-
150
- function validateScheduleId(id: string): string {
151
- if (!SCHEDULE_ID.test(id)) throw new Error("Schedule id must be 1-64 characters and contain only letters, numbers, '.', '_', or '-'.");
152
- return id;
153
- }
154
-
155
- function normalizedComparisonPath(value: string): string {
156
- const absolute = path.resolve(value);
157
- if (process.platform !== "win32") return absolute;
158
- let normalized = absolute;
159
- try { normalized = fs.realpathSync.native(absolute); } catch {}
160
- normalized = normalized.replaceAll("/", "\\");
161
- if (normalized.startsWith("\\\\?\\UNC\\")) normalized = `\\\\${normalized.slice(8)}`;
162
- else if (normalized.startsWith("\\\\?\\")) normalized = normalized.slice(4);
163
- normalized = path.win32.normalize(normalized).toLowerCase();
164
- if (normalized.length > 3) normalized = normalized.replace(/[\\]+$/, "");
165
- return normalized;
166
- }
167
-
168
- function pathWithin(root: string, candidate: string): boolean {
169
- const relative = path.relative(normalizedComparisonPath(root), normalizedComparisonPath(candidate));
170
- return relative === "" || (relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative));
171
- }
172
-
173
- function resolveGitCommonDirForCheckout(checkoutRoot: string): string | undefined {
174
- const gitPath = path.join(checkoutRoot, ".git");
175
- try {
176
- const stat = fs.statSync(gitPath);
177
- if (stat.isDirectory()) return fs.realpathSync.native(gitPath);
178
- if (!stat.isFile()) return undefined;
179
- const match = /^gitdir:[ \t]*([^\r\n]+)$/i.exec(fs.readFileSync(gitPath, "utf-8").trim());
180
- return match?.[1] ? fs.realpathSync.native(path.resolve(checkoutRoot, match[1])) : undefined;
181
- } catch {
182
- return undefined;
183
- }
184
- }
185
-
186
- function samePath(left: string, right: string): boolean {
187
- return normalizedComparisonPath(left) === normalizedComparisonPath(right);
188
- }
189
-
190
- function resolveTrustedGitConfigRoot(checkoutRoot: string, commonDir: string): string | undefined {
191
- const resolvedCommonDir = resolveGitCommonDirForCheckout(checkoutRoot);
192
- if (!resolvedCommonDir || !samePath(resolvedCommonDir, commonDir)) return undefined;
193
- const configRoot = path.join(checkoutRoot, getConfigDirName());
194
- try {
195
- const resolved = fs.realpathSync.native(configRoot);
196
- return fs.statSync(resolved).isDirectory() && pathWithin(checkoutRoot, resolved) ? resolved : undefined;
197
- } catch {
198
- return undefined;
199
- }
200
- }
201
-
202
- function registeredGitWorktreeRoots(projectCwd: string): string[] {
203
- const result = spawnSync("git", ["-C", projectCwd, "worktree", "list", "--porcelain"], { encoding: "utf-8", windowsHide: true });
204
- if (result.status !== 0 || typeof result.stdout !== "string") return [];
205
- const roots: string[] = [];
206
- for (const line of result.stdout.split(/\r?\n/)) {
207
- if (!line.startsWith("worktree ")) continue;
208
- try { roots.push(fs.realpathSync.native(line.slice("worktree ".length).trim())); } catch {}
209
- }
210
- return roots;
211
- }
212
-
213
- function resolveSharedGitConfigRoot(projectCwd: string): string | undefined {
214
- const repository = resolveGitRepositoryIdentity(projectCwd);
215
- if (!repository) return undefined;
216
- let projectConfigRoot: string;
217
- try {
218
- projectConfigRoot = fs.realpathSync.native(path.join(projectCwd, getConfigDirName()));
219
- } catch {
220
- return undefined;
221
- }
222
- // Git may report a separate-git-dir primary checkout as its common git
223
- // directory, not as the checkout root. Without a registered checkout root,
224
- // do not infer a shared config path from that unprovable layout.
225
- for (const checkoutRoot of new Set(registeredGitWorktreeRoots(projectCwd))) {
226
- const resolved = resolveTrustedGitConfigRoot(checkoutRoot, repository.commonDir);
227
- if (resolved && samePath(resolved, projectConfigRoot)) return resolved;
228
- }
229
- return undefined;
230
- }
231
-
232
- function assertScheduleRoot(root: string, projectCwd: string | undefined, create: boolean): void {
233
- if (!projectCwd) {
234
- if (create) fs.mkdirSync(root, { recursive: true, mode: 0o700 });
235
- return;
236
- }
237
- let projectPath: string;
238
- try {
239
- projectPath = fs.realpathSync.native(projectCwd);
240
- } catch (error) {
241
- if (!create && (error as NodeJS.ErrnoException).code === "ENOENT") return;
242
- throw error;
243
- }
244
- let existing = root;
245
- while (!fs.existsSync(existing)) {
246
- const parent = path.dirname(existing);
247
- if (parent === existing) break;
248
- existing = parent;
249
- }
250
- const existingPath = fs.realpathSync.native(existing);
251
- const sharedGitConfigRoot = pathWithin(projectPath, existingPath) ? undefined : resolveSharedGitConfigRoot(projectCwd);
252
- const isTrustedPath = (candidate: string): boolean => pathWithin(projectPath, candidate)
253
- || (sharedGitConfigRoot !== undefined && pathWithin(sharedGitConfigRoot, candidate));
254
- if (!isTrustedPath(existingPath)) throw new Error(`Project schedule root '${root}' resolves outside the real project.`);
255
- if (!create) return;
256
- fs.mkdirSync(root, { recursive: true, mode: 0o700 });
257
- if (!isTrustedPath(fs.realpathSync.native(root))) throw new Error(`Project schedule root '${root}' resolves outside the real project.`);
258
- }
259
-
260
- function scheduleDir(root: string, id: string, create = false, projectCwd?: string): string {
261
- assertScheduleRoot(root, projectCwd, create);
262
- const dir = path.join(root, validateScheduleId(id));
263
- try {
264
- const stat = fs.lstatSync(dir);
265
- if (stat.isSymbolicLink() || !stat.isDirectory()) throw new Error(`Schedule path '${dir}' must be a real directory.`);
266
- } catch (error) {
267
- if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error;
268
- if (!create) return dir;
269
- fs.mkdirSync(dir, { mode: 0o700 });
270
- }
271
- const rootPath = fs.realpathSync.native(root);
272
- const dirPath = fs.realpathSync.native(dir);
273
- if (!samePath(dirPath, path.join(rootPath, id))) throw new Error(`Schedule path '${dir}' escapes the project schedule root.`);
274
- return dir;
275
- }
276
-
277
- function readJson(file: string, label: string): unknown {
278
- try {
279
- return JSON.parse(fs.readFileSync(file, "utf-8"));
280
- } catch (error) {
281
- throw new Error(`Failed to read ${label} '${file}': ${error instanceof Error ? error.message : String(error)}`, { cause: error instanceof Error ? error : undefined });
282
- }
283
- }
284
-
285
- function parseScheduleTarget(value: unknown, file: string): ScheduleTarget {
286
- if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error(`Schedule record '${file}' has invalid trigger or target.`);
287
- const target = value as { workflowScript?: unknown; args?: unknown; baseRef?: unknown; agent?: unknown; task?: unknown };
288
- if (typeof target.workflowScript === "string" && target.workflowScript.trim()) {
289
- let baseRef: string | undefined;
290
- try {
291
- baseRef = normalizeWorktreeBaseRef(target.baseRef);
292
- } catch (error) {
293
- throw new Error(`Schedule record '${file}' has an invalid baseRef: ${error instanceof Error ? error.message : String(error)}`);
294
- }
295
- const normalizedArgs = normalizeWorkflowArgs(target.args);
296
- if ("error" in normalizedArgs) throw new Error(`Schedule record '${file}' has invalid args: ${normalizedArgs.error}`);
297
- return { workflowScript: target.workflowScript.trim(), args: deepFreezeWorkflowArgs(normalizedArgs.args), ...(baseRef === undefined ? {} : { baseRef }) };
298
- }
299
- if (target.agent !== undefined || target.task !== undefined) throw new Error(`Schedule record '${file}' uses a removed legacy agent target; recreate it with target.workflowScript.`);
300
- throw new Error(`Schedule record '${file}' requires a workflowScript target.`);
301
- }
302
-
303
- function parseSchedule(value: unknown, file: string): ScheduleRecord {
304
- if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error(`Schedule record '${file}' must be a JSON object.`);
305
- const record = value as Partial<ScheduleRecord>;
306
- if (record.schemaVersion !== 1 || typeof record.id !== "string" || typeof record.name !== "string" || typeof record.cwd !== "string" || typeof record.createdAt !== "string" || typeof record.updatedAt !== "string" || typeof record.paused !== "boolean") throw new Error(`Schedule record '${file}' has invalid required fields.`);
307
- validateScheduleId(record.id);
308
- if (!record.trigger || typeof record.trigger !== "object" || !record.target || typeof record.target !== "object") throw new Error(`Schedule record '${file}' has invalid trigger or target.`);
309
- if (record.overlap !== "skip" || (record.catchUp !== "none" && record.catchUp !== "latest")) throw new Error(`Schedule record '${file}' has unsupported policy fields.`);
310
- if (record.trigger.kind === "once") {
311
- if (typeof record.trigger.at !== "string" || (record.trigger.nextRunAt !== undefined && typeof record.trigger.nextRunAt !== "string")) throw new Error(`Schedule record '${file}' has an invalid one-shot trigger.`);
312
- } else if (record.trigger.kind === "interval") {
313
- if (typeof record.trigger.every !== "string" || typeof record.trigger.everyMs !== "number" || typeof record.trigger.anchorAt !== "string" || typeof record.trigger.nextRunAt !== "string") throw new Error(`Schedule record '${file}' has an invalid interval trigger.`);
314
- } else throw new Error(`Schedule record '${file}' has an unsupported trigger.`);
315
- if (record.sessionOnly !== undefined && typeof record.sessionOnly !== "boolean") throw new Error(`Schedule record '${file}' has invalid sessionOnly.`);
316
- if (record.quiet !== undefined && typeof record.quiet !== "boolean") throw new Error(`Schedule record '${file}' has invalid quiet.`);
317
- if (record.sessionOnly === true && (typeof record.ownerSessionFile !== "string" || !record.ownerSessionFile.trim())) throw new Error(`Schedule record '${file}' is session-only but has no owner session file.`);
318
- return { ...record, target: parseScheduleTarget(record.target, file) } as ScheduleRecord;
319
- }
320
-
321
- class ScheduleStore {
322
- readonly root: string;
323
- private readonly projectCwd?: string;
324
-
325
- constructor(root: string, projectCwd?: string) {
326
- this.root = root;
327
- this.projectCwd = projectCwd;
328
- }
329
-
330
- directory(id: string, create = false): string {
331
- return scheduleDir(this.root, id, create, this.projectCwd);
332
- }
333
-
334
- ids(): string[] {
335
- assertScheduleRoot(this.root, this.projectCwd, false);
336
- if (!fs.existsSync(this.root)) return [];
337
- return fs.readdirSync(this.root, { withFileTypes: true })
338
- .filter((entry) => entry.isDirectory() && SCHEDULE_ID.test(entry.name))
339
- .map((entry) => entry.name);
340
- }
341
-
342
- list(): ScheduleRecord[] {
343
- return this.ids().map((id) => this.find(id)).filter((record): record is ScheduleRecord => record !== undefined);
344
- }
345
-
346
- get(id: string): ScheduleRecord {
347
- const record = this.find(id);
348
- if (!record) throw new Error(`Schedule '${id}' not found.`);
349
- return record;
350
- }
351
-
352
- /** Like {@link get}, but returns undefined when the schedule no longer exists. */
353
- find(id: string): ScheduleRecord | undefined {
354
- const file = path.join(scheduleDir(this.root, id, false, this.projectCwd), "schedule.json");
355
- if (!fs.existsSync(file)) return undefined;
356
- return parseSchedule(readJson(file, "schedule record"), file);
357
- }
358
-
359
- write(record: ScheduleRecord): void {
360
- writePrivateAtomicJson(path.join(scheduleDir(this.root, record.id, true, this.projectCwd), "schedule.json"), record);
361
- }
362
-
363
- delete(id: string): void {
364
- fs.rmSync(scheduleDir(this.root, id, false, this.projectCwd), { recursive: true, force: true });
365
- }
366
-
367
- history(id: string): ScheduleRunRecord[] {
368
- const file = path.join(scheduleDir(this.root, id, false, this.projectCwd), "history.json");
369
- if (!fs.existsSync(file)) return [];
370
- const value = readJson(file, "schedule history") as { schemaVersion?: unknown; runs?: unknown };
371
- if (value?.schemaVersion !== 1 || !Array.isArray(value.runs)) throw new Error(`Schedule history '${file}' has invalid fields.`);
372
- return value.runs as ScheduleRunRecord[];
373
- }
374
-
375
- writeRun(schedule: ScheduleRecord, run: ScheduleRunRecord, event: string): void {
376
- const dir = scheduleDir(this.root, schedule.id, true, this.projectCwd);
377
- writePrivateAtomicJson(path.join(dir, "runs", `${run.id}.json`), run);
378
- const runs = [run, ...this.history(schedule.id).filter((item) => item.id !== run.id)].slice(0, MAX_HISTORY);
379
- writePrivateAtomicJson(path.join(dir, "history.json"), { schemaVersion: 1, runs });
380
- fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
381
- fs.appendFileSync(path.join(dir, "events.jsonl"), `${JSON.stringify({ schemaVersion: 1, timestamp: new Date().toISOString(), event, scheduleId: schedule.id, runId: run.id, state: run.state })}\n`, { encoding: "utf-8", mode: 0o600 });
382
- }
383
-
384
- appendEvent(schedule: ScheduleRecord, event: string): void {
385
- const dir = scheduleDir(this.root, schedule.id, true, this.projectCwd);
386
- fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
387
- fs.appendFileSync(path.join(dir, "events.jsonl"), `${JSON.stringify({ schemaVersion: 1, timestamp: new Date().toISOString(), event, scheduleId: schedule.id })}\n`, { encoding: "utf-8", mode: 0o600 });
388
- }
389
- }
390
-
391
- function resolveMaxPending(config: ExtensionConfig): number {
392
- const value = config.scheduledRuns?.maxPending;
393
- return typeof value === "number" && Number.isInteger(value) && value >= 1 ? value : DEFAULT_MAX_PENDING;
394
- }
395
-
396
- function hasPendingScheduleWork(schedule: ScheduleRecord): boolean {
397
- return schedule.activeRunId !== undefined || schedule.trigger.nextRunAt !== undefined;
398
- }
399
-
400
- function nextAfter(trigger: ScheduleTrigger, plannedAt: number, now: number): string | undefined {
401
- if (trigger.kind === "once") return undefined;
402
- let next = plannedAt + trigger.everyMs;
403
- while (next <= now) next += trigger.everyMs;
404
- return timestamp(next);
405
- }
406
-
407
- function nextRunAt(schedule: ScheduleRecord): number | undefined {
408
- const value = schedule.trigger.nextRunAt;
409
- if (!value) return undefined;
410
- const parsed = Date.parse(value);
411
- if (!Number.isFinite(parsed)) throw new Error(`Schedule '${schedule.id}' has invalid nextRunAt.`);
412
- return parsed;
413
- }
414
-
415
- function duePlannedAt(schedule: ScheduleRecord, now: number): number | undefined {
416
- const next = nextRunAt(schedule);
417
- if (next === undefined || next > now || schedule.catchUp !== "latest" || schedule.trigger.kind !== "interval") return next;
418
- return next + Math.floor((now - next) / schedule.trigger.everyMs) * schedule.trigger.everyMs;
419
- }
420
-
421
- function textResult(text: string, schedules?: ScheduleRecord[], runs?: ScheduleRunRecord[], isError = false): AgentToolResult<Details> {
422
- const publicSchedules = schedules?.map(publicScheduleRecord);
423
- return {
424
- content: [{ type: "text", text }],
425
- ...(isError ? { isError: true } : {}),
426
- details: { mode: "management", results: [], schedules: { ...(publicSchedules ? { records: publicSchedules } : {}), ...(runs ? { runs } : {}) } },
427
- };
428
- }
429
-
430
- function publicScheduleRecord(schedule: ScheduleRecord): PublicScheduleRecord {
431
- const { ownerSessionFile: _ownerSessionFile, ...rest } = schedule;
432
- return rest;
433
- }
434
-
435
- function targetLabel(target: ScheduleTarget): string {
436
- const preview = previewSimpleWorkflowRun(target.workflowScript);
437
- return preview?.agent ? `workflowScript -> agent ${preview.agent}` : "workflowScript (dynamic)";
438
- }
439
-
440
- function sanitizeTarget(params: SubagentParamsLike): { target?: ScheduleTarget; error?: string } {
441
- if (params.tasks || params.chain) return { error: "Recurring schedules require workflowScript; legacy tasks and chain inputs are unsupported." };
442
- if (params.agent !== undefined || params.task !== undefined) return { error: "schedule.create requires workflowScript. Use workflowScript: \"return runs.run('main', { agent, task })\"." };
443
- if (typeof params.workflowScript !== "string" || !params.workflowScript.trim()) return { error: "schedule.create requires a non-empty workflowScript." };
444
- if (params.context === "fork") return { error: "Scheduled runs require fresh context." };
445
- if (params.async === false) return { error: "Scheduled runs are always async." };
446
- let baseRef: string | undefined;
447
- try {
448
- baseRef = normalizeWorktreeBaseRef(params.baseRef);
449
- } catch (error) {
450
- return { error: error instanceof Error ? error.message : String(error) };
451
- }
452
- const acceptanceErrors = validateExecutionAcceptance(params as Parameters<typeof validateExecutionAcceptance>[0]);
453
- if (acceptanceErrors.length) return { error: acceptanceErrors.join(" ") };
454
- const normalizedArgs = normalizeWorkflowArgs(params.args);
455
- if ("error" in normalizedArgs) return { error: normalizedArgs.error };
456
- return { target: { workflowScript: params.workflowScript.trim(), args: deepFreezeWorkflowArgs(normalizedArgs.args), ...(baseRef === undefined ? {} : { baseRef }) } };
457
- }
458
-
459
- function executionParams(schedule: ScheduleRecord, quiet = false): SubagentParamsLike {
460
- return {
461
- ...schedule.target,
462
- async: true,
463
- context: "fresh",
464
- cwd: schedule.cwd,
465
- mission: false,
466
- // Scheduled fires have no operator watching, so completions must name the origin.
467
- scheduleOrigin: { id: schedule.id, ...(schedule.name ? { name: schedule.name } : {}), ...(quiet ? { quiet: true } : {}) },
468
- ...(schedule.timeoutMs === undefined ? {} : { timeoutMs: schedule.timeoutMs }),
469
- };
470
- }
471
-
472
- function snapshotContext(ctx: ExtensionContext, cwd: string): ExtensionContext {
473
- const source = ctx.sessionManager;
474
- const sessionId = source.getSessionId();
475
- const sessionFile = source.getSessionFile();
476
- const sessionManager = new Proxy(source, {
477
- get(target, property) {
478
- if (property === "getSessionId") return () => sessionId;
479
- if (property === "getSessionFile") return () => sessionFile;
480
- const value = Reflect.get(target, property, target) as unknown;
481
- return typeof value === "function" ? value.bind(target) : value;
482
- },
483
- });
484
- return { ...ctx, cwd, sessionManager };
485
- }
486
-
487
- /**
488
- * 规范化会话文件路径, 兼容 Windows 路径大小写差异.
489
- *
490
- * @param value 会话文件路径
491
- * @returns 规范化后的路径, 空值时返回 undefined
492
- */
493
- function normalizedSessionFile(value: string | undefined): string | undefined {
494
- if (!value || !value.trim()) return undefined;
495
- const normalized = path.normalize(path.resolve(value));
496
- return process.platform === "win32" ? normalized.toLowerCase() : normalized;
497
- }
498
-
499
- /**
500
- * 判断 Schedule 是否属于当前 Pi 会话.
501
- *
502
- * @param schedule Schedule 记录
503
- * @param ctx 当前 Pi 会话上下文
504
- * @returns 是否允许当前会话执行该 Schedule
505
- */
506
- function scheduleBelongsToSession(schedule: ScheduleRecord, ctx: ExtensionContext): boolean {
507
- if (schedule.sessionOnly !== true) return true;
508
- const ownerSessionFile = normalizedSessionFile(schedule.ownerSessionFile);
509
- const currentSessionFile = normalizedSessionFile(ctx.sessionManager.getSessionFile());
510
- return ownerSessionFile !== undefined && ownerSessionFile === currentSessionFile;
511
- }
512
-
513
- export function listScheduledRunSummaries(cwd: string, root?: string): ScheduleRecord[] {
514
- return new ScheduleStore(scheduledRunStorePath(cwd, undefined, root), root === undefined ? path.resolve(cwd) : undefined).list();
515
- }
516
-
517
- export class ScheduledRunManager {
518
- private store?: ScheduleStore;
519
- private readonly stores = new Map<string, ScheduleStore>();
520
- private readonly contexts = new Map<string, ExtensionContext>();
521
- private readonly timers = new Map<string, ReturnType<typeof setTimeout>>();
522
- private readonly observedAsyncIds = new Set<string>();
523
- private readonly now: () => number;
524
- private readonly randomId: () => string;
525
- private readonly timersApi: ScheduledRunTimers;
526
- private readonly deps: ScheduledRunManagerDeps;
527
-
528
- constructor(deps: ScheduledRunManagerDeps) {
529
- this.deps = deps;
530
- this.now = deps.now ?? Date.now;
531
- this.randomId = deps.randomId ?? (() => randomUUID().slice(0, 8));
532
- this.timersApi = deps.timers ?? globalThis;
533
- }
534
-
535
- bindSession(ctx: ExtensionContext): void {
536
- if (!scheduledRunsEnabled(this.deps.config)) return;
537
- this.selectProject(ctx.cwd, ctx);
538
- }
539
-
540
- stop(): void {
541
- this.stopTimers();
542
- this.store = undefined;
543
- this.stores.clear();
544
- this.contexts.clear();
545
- this.observedAsyncIds.clear();
546
- }
547
-
548
- async handleToolCall(params: SubagentParamsLike, ctx: ExtensionContext): Promise<AgentToolResult<Details>> {
549
- try {
550
- if (!scheduledRunsEnabled(this.deps.config)) return textResult("Scheduled runs are disabled by scheduledRuns.enabled=false.", undefined, undefined, true);
551
- this.selectProject(params.cwd ?? ctx.cwd, ctx);
552
- switch (params.action) {
553
- case "schedule.create": return this.create(params, ctx);
554
- case "schedule.list": return this.list();
555
- case "schedule.show": return this.show(params);
556
- case "schedule.history": return this.history(params);
557
- case "schedule.pause": return this.pause(params, true);
558
- case "schedule.resume": return this.pause(params, false);
559
- case "schedule.run": return await this.runManual(params);
560
- case "schedule.run-due": return await this.runDue();
561
- case "schedule.delete": return this.remove(params);
562
- default: return textResult(`Unknown schedule action: ${params.action}`, undefined, undefined, true);
563
- }
564
- } catch (error) {
565
- return textResult(error instanceof Error ? error.message : String(error), undefined, undefined, true);
566
- }
567
- }
568
-
569
- observedCompletionRunIds(): Set<string> {
570
- return new Set(this.observedAsyncIds);
571
- }
572
-
573
- referencedAsyncRunIds(): Set<string> {
574
- const runIds = new Set(this.observedAsyncIds);
575
- for (const store of this.stores.values()) {
576
- for (const scheduleId of store.ids()) {
577
- for (const run of store.history(scheduleId)) {
578
- if (run.asyncId) runIds.add(run.asyncId);
579
- }
580
- }
581
- }
582
- return runIds;
583
- }
584
-
585
- handleAsyncCompletion(payload: unknown): void {
586
- if (!payload || typeof payload !== "object") return;
587
- const data = payload as { id?: unknown; runId?: unknown; success?: unknown; state?: unknown; summary?: unknown };
588
- const asyncId = typeof data.runId === "string" ? data.runId : typeof data.id === "string" ? data.id : undefined;
589
- if (!asyncId) return;
590
- for (const store of this.stores.values()) {
591
- let ids: string[];
592
- try {
593
- ids = store.ids();
594
- } catch (error) {
595
- console.error(`Failed to inspect schedule store '${store.root}' during async completion:`, error);
596
- continue;
597
- }
598
- for (const id of ids) {
599
- try {
600
- const schedule = store.get(id);
601
- const run = store.history(id).find((item) => item.asyncId === asyncId && item.state === "running");
602
- if (!run) continue;
603
- this.finishRun(store, schedule, run, data.success === true, typeof data.summary === "string" ? data.summary : undefined);
604
- return;
605
- } catch (error) {
606
- console.error(`Failed to inspect schedule '${id}' in '${store.root}' during async completion:`, error);
607
- }
608
- }
609
- }
610
- }
611
-
612
- private create(params: SubagentParamsLike, ctx: ExtensionContext): AgentToolResult<Details> {
613
- const store = this.requireStore();
614
- const target = sanitizeTarget(params);
615
- if (target.error) return textResult(target.error, undefined, undefined, true);
616
- const at = params.at?.trim();
617
- const every = params.every?.trim();
618
- if (Boolean(at) === Boolean(every)) return textResult("schedule.create requires exactly one trigger: at or every.", undefined, undefined, true);
619
- if (params.overlap !== undefined && params.overlap !== "skip") return textResult("This first recurring slice supports overlap='skip' only.", undefined, undefined, true);
620
- if (params.catchUp !== undefined && params.catchUp !== "none" && params.catchUp !== "latest") return textResult("catchUp must be 'none' or 'latest'.", undefined, undefined, true);
621
- if (params.missionId !== undefined || params.mission !== undefined || params.missionUpdate !== undefined || params.missionStatus !== undefined || params.missionScope !== undefined) return textResult("Mission attachment is deferred from this first schedule slice.", undefined, undefined, true);
622
- if (params.on !== undefined || params.timezone !== undefined || every === "day" || every === "week" || every === "month" || every === "year") return textResult("Calendar schedules are deferred from this first safe slice. Use a fixed interval such as every:'24h' or every:'7d'.", undefined, undefined, true);
623
- if (params.quiet !== undefined && typeof params.quiet !== "boolean") return textResult("quiet must be a boolean.", undefined, undefined, true);
624
- if (at && params.quiet === true) return textResult("quiet is only supported for recurring schedules.", undefined, undefined, true);
625
- const sessionOnly = params.sessionOnly === true;
626
- if (sessionOnly && params.cwd !== undefined && !samePath(params.cwd, ctx.cwd)) return textResult("sessionOnly schedules cannot use an explicit cross-project cwd.", undefined, undefined, true);
627
- const ownerSessionFile = sessionOnly ? ctx.sessionManager.getSessionFile() : undefined;
628
- if (sessionOnly && !ownerSessionFile) return textResult("sessionOnly schedules require a persisted current session.", undefined, undefined, true);
629
- const sessionId = ctx.sessionManager.getSessionId() ?? "unknown";
630
- if (this.deps.resolveCapabilityCeiling?.(sessionId)) return textResult("Cannot persist a schedule while a capability ceiling is active.", undefined, undefined, true);
631
- const pendingCount = store.list().filter(hasPendingScheduleWork).length;
632
- const maxPending = resolveMaxPending(this.deps.config);
633
- if (pendingCount >= maxPending) return textResult(`Schedule limit reached (${maxPending}).`, undefined, undefined, true);
634
- const id = validateScheduleId((params.id?.trim() || this.randomId()));
635
- if (store.ids().includes(id)) return textResult(`Schedule '${id}' already exists.`, undefined, undefined, true);
636
- const now = this.now();
637
- let trigger: ScheduleTrigger;
638
- if (at) {
639
- const planned = parseScheduledRunTime(at, now);
640
- trigger = { kind: "once", at, nextRunAt: timestamp(planned) };
641
- } else {
642
- const everyMs = parseScheduleInterval(every!);
643
- trigger = { kind: "interval", every: every!, everyMs, anchorAt: timestamp(now), nextRunAt: timestamp(now + everyMs) };
644
- }
645
- const schedule: ScheduleRecord = {
646
- schemaVersion: 1,
647
- id,
648
- name: params.name?.trim() || targetLabel(target.target!),
649
- cwd: path.resolve(params.cwd ?? ctx.cwd),
650
- trigger,
651
- target: target.target!,
652
- overlap: "skip",
653
- catchUp: params.catchUp ?? "latest",
654
- ...(params.timeoutMs === undefined ? {} : { timeoutMs: params.timeoutMs }),
655
- paused: false,
656
- ...(sessionOnly ? { sessionOnly: true, ownerSessionFile: path.resolve(ownerSessionFile!) } : {}),
657
- ...(trigger.kind === "interval" && params.quiet === true ? { quiet: true } : {}),
658
- createdAt: timestamp(now),
659
- updatedAt: timestamp(now),
660
- };
661
- store.write(schedule);
662
- store.appendEvent(schedule, "schedule.created");
663
- this.arm(schedule, store);
664
- return textResult(`Created schedule ${id}.\nName: ${schedule.name}\nTrigger: ${at ? `at ${at}` : `every ${every}`}\nSession only: ${schedule.sessionOnly === true ? "yes" : "no"}\nQuiet: ${schedule.quiet === true ? "yes" : "no"}\nNext: ${schedule.trigger.nextRunAt}\nTarget: ${targetLabel(schedule.target)}`, [schedule]);
665
- }
666
-
667
- private list(): AgentToolResult<Details> {
668
- const schedules = this.requireStore().list().sort((a, b) => (a.trigger.nextRunAt ?? "").localeCompare(b.trigger.nextRunAt ?? ""));
669
- if (!schedules.length) return textResult("No project schedules.", []);
670
- return textResult([`Project schedules: ${schedules.length}`, ...schedules.map((item) => `- ${item.id} | ${item.paused ? "paused" : item.activeRunId ? "running" : "scheduled"} | ${item.trigger.nextRunAt ?? "no next run"} | ${item.sessionOnly === true ? "session-only" : "project"} | ${item.name}`)].join("\n"), schedules);
671
- }
672
-
673
- private show(params: SubagentParamsLike): AgentToolResult<Details> {
674
- const schedule = this.resolve(params);
675
- return textResult([`Schedule: ${schedule.id}`, `Name: ${schedule.name}`, `State: ${schedule.paused ? "paused" : schedule.activeRunId ? "running" : "scheduled"}`, `Session only: ${schedule.sessionOnly === true ? "yes" : "no"}`, `Quiet: ${schedule.quiet === true ? "yes" : "no"}`, `Target: ${targetLabel(schedule.target)}`, `CWD: ${shortenPath(schedule.cwd)}`, `Next: ${schedule.trigger.nextRunAt ?? "none"}`, `Catch up: ${schedule.catchUp}`, schedule.activeRunId ? `Active run: ${schedule.activeRunId}` : undefined].filter(Boolean).join("\n"), [schedule]);
676
- }
677
-
678
- private history(params: SubagentParamsLike): AgentToolResult<Details> {
679
- const schedule = this.resolve(params);
680
- const runs = this.requireStore().history(schedule.id);
681
- return textResult(runs.length ? [`Schedule history: ${schedule.id}`, ...runs.map((run) => `- ${run.id} | ${run.state} | ${run.plannedAt}${run.asyncId ? ` | async ${run.asyncId}` : ""}`)].join("\n") : `No runs recorded for schedule ${schedule.id}.`, [schedule], runs);
682
- }
683
-
684
- private pause(params: SubagentParamsLike, paused: boolean): AgentToolResult<Details> {
685
- const schedule = this.resolve(params);
686
- if (schedule.paused === paused) return textResult(`Schedule ${schedule.id} is already ${paused ? "paused" : "active"}.`, [schedule]);
687
- schedule.paused = paused;
688
- schedule.updatedAt = timestamp(this.now());
689
- this.requireStore().write(schedule);
690
- this.requireStore().appendEvent(schedule, paused ? "schedule.paused" : "schedule.resumed");
691
- const store = this.requireStore();
692
- if (paused) this.clearTimer(store, schedule.id); else this.restoreOne(store, schedule);
693
- return textResult(`${paused ? "Paused" : "Resumed"} schedule ${schedule.id}.`, [schedule]);
694
- }
695
-
696
- private async runManual(params: SubagentParamsLike): Promise<AgentToolResult<Details>> {
697
- const store = this.requireStore();
698
- const schedule = this.resolve(params);
699
- const context = this.requireContext(store);
700
- if (!scheduleBelongsToSession(schedule, context)) {
701
- return textResult(`Skipped schedule ${schedule.id}: current session is not its owner.`, [schedule]);
702
- }
703
- if (params.quiet !== undefined && typeof params.quiet !== "boolean") return textResult("quiet must be a boolean.", undefined, undefined, true);
704
- const run = await this.launch(store, schedule, this.now(), "manual", false, params.quiet === true);
705
- const updated = store.get(schedule.id);
706
- if (run.state === "running") {
707
- const now = this.now();
708
- if (updated.trigger.kind === "interval") updated.trigger.nextRunAt = timestamp(now + updated.trigger.everyMs);
709
- else updated.trigger.nextRunAt = undefined;
710
- updated.updatedAt = timestamp(now);
711
- store.write(updated);
712
- store.appendEvent(updated, "schedule.manual_satisfied");
713
- this.arm(updated, store);
714
- }
715
- return textResult(`Manual schedule run ${run.id}: ${run.state}${run.asyncId ? ` (async ${run.asyncId})` : ""}.`, [store.get(schedule.id)], [run], run.state === "failed_launch");
716
- }
717
-
718
- private async runDue(): Promise<AgentToolResult<Details>> {
719
- const store = this.requireStore();
720
- const context = this.requireContext(store);
721
- const due = store.list().filter((schedule) => scheduleBelongsToSession(schedule, context) && !schedule.paused && nextRunAt(schedule) !== undefined && nextRunAt(schedule)! <= this.now());
722
- const runs: ScheduleRunRecord[] = [];
723
- for (const schedule of due) {
724
- const planned = duePlannedAt(schedule, this.now())!;
725
- if (!schedule.activeRunId && schedule.catchUp === "none" && planned < this.now()) runs.push(this.recordMissed(store, schedule, planned, "run-due"));
726
- else runs.push(await this.launch(store, schedule, planned, "run-due", true));
727
- }
728
- return textResult(runs.length ? `Processed ${runs.length} due schedule(s).` : "No schedules are due.", store.list(), runs);
729
- }
730
-
731
- private remove(params: SubagentParamsLike): AgentToolResult<Details> {
732
- const schedule = this.resolve(params);
733
- const store = this.requireStore();
734
- if (schedule.activeRunId) {
735
- const run = store.history(schedule.id).find((item) => item.id === schedule.activeRunId);
736
- let terminal = false;
737
- if (run?.scheduleId === schedule.id && run.state === "running" && run.asyncId && run.asyncDir) {
738
- const status = readJson(path.join(run.asyncDir, "status.json"), "async status") as Partial<AsyncStatus>;
739
- terminal = status.runId === run.asyncId && typeof status.state === "string" && ["complete", "failed", "stopped", "rejected"].includes(status.state);
740
- }
741
- if (!terminal) return textResult(`Schedule ${schedule.id} has active run ${schedule.activeRunId}; stop that run before deleting the schedule.`, [schedule], undefined, true);
742
- }
743
- this.clearTimer(store, schedule.id);
744
- store.appendEvent(schedule, "schedule.deleted");
745
- store.delete(schedule.id);
746
- return textResult(`Deleted schedule ${schedule.id}.`);
747
- }
748
-
749
- private restore(store: ScheduleStore): void {
750
- for (const schedule of store.list()) this.restoreOne(store, schedule);
751
- }
752
-
753
- private restoreOne(store: ScheduleStore, schedule: ScheduleRecord, notBefore?: number, rearm = true): void {
754
- if (!scheduleBelongsToSession(schedule, this.requireContext(store))) return;
755
- if (schedule.activeRunId) {
756
- const run = store.history(schedule.id).find((item) => item.id === schedule.activeRunId);
757
- if (run?.state === "running" && run.asyncId) this.observedAsyncIds.add(run.asyncId);
758
- const startedAt = run?.startedAt ? Date.parse(run.startedAt) : Number.NaN;
759
- if (run?.state === "running" && run.asyncDir) {
760
- try {
761
- const status = readJson(path.join(run.asyncDir, "status.json"), "async status") as Partial<AsyncStatus>;
762
- if (["complete", "failed", "stopped", "rejected"].includes(String(status.state))) this.finishRun(store, schedule, run, status.state === "complete", typeof status.error === "string" ? status.error : undefined);
763
- } catch (error) {
764
- if ((error as NodeJS.ErrnoException).code !== "ENOENT" && !(error instanceof Error && /ENOENT/.test(error.message))) throw error;
765
- }
766
- }
767
- if (schedule.activeRunId && (!run || run.state !== "running" || (!run.asyncId && Number.isFinite(startedAt) && startedAt + STALE_LAUNCH_CLAIM_MS <= this.now()))) {
768
- if (run?.state === "running") {
769
- run.state = "failed_launch";
770
- run.completedAt = timestamp(this.now());
771
- run.error = "Recovered a stale launch claim before an async run was attached.";
772
- store.writeRun(schedule, run, "schedule.run.failed");
773
- }
774
- schedule.activeRunId = undefined;
775
- schedule.updatedAt = timestamp(this.now());
776
- store.write(schedule);
777
- fs.rmSync(path.join(store.directory(schedule.id), "active.lock"), { force: true });
778
- }
779
- }
780
- if (!rearm || schedule.paused) return;
781
- const next = nextRunAt(schedule);
782
- if (next === undefined) return;
783
- if (!schedule.activeRunId && next < this.now() && schedule.catchUp === "none") {
784
- try {
785
- this.recordMissed(store, schedule, next, "timer");
786
- } catch (error) {
787
- if (notBefore !== undefined) this.arm(schedule, store, notBefore);
788
- throw error;
789
- }
790
- }
791
- this.arm(schedule, store, notBefore);
792
- }
793
-
794
- private arm(schedule: ScheduleRecord, store: ScheduleStore, notBefore?: number): void {
795
- this.clearTimer(store, schedule.id);
796
- if (schedule.paused) return;
797
- const next = nextRunAt(schedule);
798
- if (next === undefined) return;
799
- const timer = this.timersApi.setTimeout(() => {
800
- // A timer callback is outside every caller's try/catch, so an escaping
801
- // rejection here reaches the process as an uncaught exception and exits
802
- // Pi. Contain every failure to this one schedule.
803
- void this.fire(store, schedule.id).catch((error) => {
804
- console.warn(`[pi-subagents] Scheduled run '${schedule.id}' failed to fire: ${error instanceof Error ? error.message : String(error)}`);
805
- this.restoreAfterFireError(store, schedule.id);
806
- });
807
- }, Math.min(Math.max(0, next - this.now(), (notBefore ?? 0) - this.now()), MAX_TIMER_DELAY_MS));
808
- timer.unref?.();
809
- this.timers.set(this.timerKey(store, schedule.id), timer);
810
- }
811
-
812
- private restoreAfterFireError(store: ScheduleStore, id: string): void {
813
- try {
814
- const schedule = store.find(id);
815
- if (!schedule) return;
816
- const now = this.now();
817
- const planned = schedule.trigger.kind === "interval" ? duePlannedAt(schedule, now) : undefined;
818
- const notBefore = planned !== undefined && planned <= now ? Date.parse(nextAfter(schedule.trigger, planned, now)!) : undefined;
819
- this.restoreOne(store, schedule, notBefore, schedule.trigger.kind === "interval");
820
- } catch (error) {
821
- console.warn(`[pi-subagents] Scheduled run '${id}' could not be restored after fire failure: ${error instanceof Error ? error.message : String(error)}`);
822
- }
823
- }
824
-
825
- private async fire(store: ScheduleStore, id: string): Promise<void> {
826
- this.clearTimer(store, id);
827
- // Schedules are project-scoped and shared, and `delete` only clears the
828
- // timer inside the deleting process. Another session can therefore remove
829
- // a schedule while this process still holds an armed timer for it; there
830
- // is then nothing to run and nothing to re-arm.
831
- const schedule = store.find(id);
832
- if (!schedule) return;
833
- if (!scheduleBelongsToSession(schedule, this.requireContext(store))) return;
834
- const planned = duePlannedAt(schedule, this.now());
835
- if (planned === undefined || schedule.paused) return;
836
- if (planned > this.now()) return this.arm(schedule, store);
837
- await this.launch(store, schedule, planned, "timer", true);
838
- }
839
-
840
- private async launch(store: ScheduleStore, schedule: ScheduleRecord, planned: number, dueReason: ScheduleRunRecord["dueReason"], advance: boolean, quiet?: boolean): Promise<ScheduleRunRecord> {
841
- const now = this.now();
842
- const nextRunAtBeforeClaim = schedule.trigger.nextRunAt;
843
- const run: ScheduleRunRecord = { schemaVersion: 1, id: this.randomId(), scheduleId: schedule.id, plannedAt: timestamp(planned), dueReason, state: "running", startedAt: timestamp(now) };
844
- if (schedule.activeRunId) {
845
- run.state = "skipped";
846
- run.completedAt = timestamp(now);
847
- if (advance) {
848
- schedule.trigger.nextRunAt = nextAfter(schedule.trigger, planned, now);
849
- schedule.updatedAt = timestamp(now);
850
- store.write(schedule);
851
- }
852
- store.writeRun(schedule, run, "schedule.skipped_overlap");
853
- this.arm(schedule, store);
854
- return run;
855
- }
856
- const lockPath = path.join(store.directory(schedule.id, true), "active.lock");
857
- fs.mkdirSync(path.dirname(lockPath), { recursive: true, mode: 0o700 });
858
- let lock: number;
859
- try {
860
- lock = fs.openSync(lockPath, "wx", 0o600);
861
- fs.writeFileSync(lock, run.id, "utf-8");
862
- fs.closeSync(lock);
863
- } catch (error) {
864
- if ((error as NodeJS.ErrnoException).code !== "EEXIST") throw error;
865
- run.state = "skipped";
866
- run.completedAt = timestamp(now);
867
- if (advance) {
868
- schedule.trigger.nextRunAt = nextAfter(schedule.trigger, planned, now);
869
- schedule.updatedAt = timestamp(now);
870
- store.write(schedule);
871
- }
872
- store.writeRun(schedule, run, "schedule.skipped_overlap");
873
- this.arm(schedule, store);
874
- return run;
875
- }
876
- schedule.activeRunId = run.id;
877
- schedule.lastRunId = run.id;
878
- if (advance) schedule.trigger.nextRunAt = nextAfter(schedule.trigger, planned, now);
879
- schedule.updatedAt = timestamp(now);
880
- store.write(schedule);
881
- store.writeRun(schedule, run, "schedule.run.started");
882
- try {
883
- const result = await this.deps.launch(executionParams(schedule, dueReason === "manual" ? quiet === true : schedule.quiet === true), this.requireContext(store), new AbortController().signal);
884
- const asyncId = result.details?.asyncId ?? result.details?.runId;
885
- if (result.isError || !asyncId) throw new Error(result.content.find((item) => item.type === "text")?.text ?? "Scheduled launch failed.");
886
- run.asyncId = asyncId;
887
- run.asyncDir = result.details?.asyncDir;
888
- this.observedAsyncIds.add(asyncId);
889
- store.writeRun(schedule, run, "schedule.run.attached_async");
890
- this.arm(schedule, store);
891
- return run;
892
- } catch (error) {
893
- run.state = "failed_launch";
894
- run.completedAt = timestamp(this.now());
895
- run.error = error instanceof Error ? error.message : String(error);
896
- const latest = store.get(schedule.id);
897
- latest.activeRunId = undefined;
898
- if (!advance && nextRunAtBeforeClaim) latest.trigger.nextRunAt = nextRunAtBeforeClaim;
899
- latest.updatedAt = timestamp(this.now());
900
- store.write(latest);
901
- store.writeRun(latest, run, "schedule.run.failed");
902
- fs.rmSync(lockPath, { force: true });
903
- this.arm(latest, store);
904
- return run;
905
- }
906
- }
907
-
908
- private finishRun(store: ScheduleStore, schedule: ScheduleRecord, run: ScheduleRunRecord, success: boolean, error?: string): void {
909
- const now = this.now();
910
- const next = nextRunAt(schedule);
911
- if (next !== undefined && next <= now) {
912
- const planned = duePlannedAt(schedule, now)!;
913
- const skipped: ScheduleRunRecord = {
914
- schemaVersion: 1,
915
- id: this.randomId(),
916
- scheduleId: schedule.id,
917
- plannedAt: timestamp(planned),
918
- dueReason: "timer",
919
- state: "skipped",
920
- completedAt: timestamp(now),
921
- };
922
- schedule.trigger.nextRunAt = nextAfter(schedule.trigger, planned, now);
923
- store.writeRun(schedule, skipped, "schedule.skipped_overlap");
924
- }
925
- if (run.asyncId) this.observedAsyncIds.delete(run.asyncId);
926
- run.state = success ? "completed" : "failed_run";
927
- run.completedAt = timestamp(now);
928
- if (!success && error) run.error = error;
929
- schedule.activeRunId = undefined;
930
- schedule.updatedAt = timestamp(now);
931
- store.write(schedule);
932
- fs.rmSync(path.join(store.directory(schedule.id), "active.lock"), { force: true });
933
- store.writeRun(schedule, run, success ? "schedule.run.completed" : "schedule.run.failed");
934
- this.arm(schedule, store);
935
- }
936
-
937
- private recordMissed(store: ScheduleStore, schedule: ScheduleRecord, planned: number, dueReason: ScheduleRunRecord["dueReason"]): ScheduleRunRecord {
938
- const run: ScheduleRunRecord = {
939
- schemaVersion: 1,
940
- id: this.randomId(),
941
- scheduleId: schedule.id,
942
- plannedAt: timestamp(planned),
943
- dueReason,
944
- state: "missed",
945
- completedAt: timestamp(this.now()),
946
- };
947
- schedule.trigger.nextRunAt = nextAfter(schedule.trigger, planned, this.now());
948
- schedule.updatedAt = timestamp(this.now());
949
- store.write(schedule);
950
- store.writeRun(schedule, run, "schedule.missed");
951
- return run;
952
- }
953
-
954
- private selectProject(cwd: string, ctx: ExtensionContext): void {
955
- const projectCwd = path.resolve(cwd);
956
- const root = scheduledRunStorePath(projectCwd, undefined, this.deps.storeRoot);
957
- const isBoundContext = path.resolve(ctx.cwd) === projectCwd;
958
- const previousContext = this.contexts.get(root);
959
- const contextChanged = isBoundContext
960
- && previousContext !== undefined
961
- && normalizedSessionFile(previousContext.sessionManager.getSessionFile()) !== normalizedSessionFile(ctx.sessionManager.getSessionFile());
962
- if (isBoundContext) this.contexts.set(root, snapshotContext(ctx, projectCwd));
963
- else if (!this.contexts.has(root)) throw new Error(`Cannot use project '${projectCwd}' until that project has been opened in this runtime.`);
964
- let store = this.stores.get(root);
965
- if (!store) {
966
- store = new ScheduleStore(root, this.deps.storeRoot === undefined ? projectCwd : undefined);
967
- this.stores.set(root, store);
968
- this.restore(store);
969
- } else if (contextChanged) {
970
- this.restore(store);
971
- }
972
- this.store = store;
973
- }
974
-
975
- private resolve(params: SubagentParamsLike): ScheduleRecord {
976
- const id = params.id?.trim();
977
- if (!id) throw new Error(`${params.action} requires id.`);
978
- return this.requireStore().get(id);
979
- }
980
-
981
- private requireStore(): ScheduleStore {
982
- if (!this.store) throw new Error("Schedule store is unavailable.");
983
- return this.store;
984
- }
985
-
986
- private requireContext(store: ScheduleStore): ExtensionContext {
987
- const ctx = this.contexts.get(store.root);
988
- if (!ctx) throw new Error("Schedule runtime context is unavailable.");
989
- return ctx;
990
- }
991
-
992
- private timerKey(store: ScheduleStore, id: string): string {
993
- return `${store.root}\0${id}`;
994
- }
995
-
996
- private clearTimer(store: ScheduleStore, id: string): void {
997
- const key = this.timerKey(store, id);
998
- const timer = this.timers.get(key);
999
- if (!timer) return;
1000
- this.timersApi.clearTimeout(timer);
1001
- this.timers.delete(key);
1002
- }
1003
-
1004
- private stopTimers(): void {
1005
- for (const timer of this.timers.values()) this.timersApi.clearTimeout(timer);
1006
- this.timers.clear();
1007
- }
1008
- }
1009
-
1010
- export function createScheduledRunManager(deps: ScheduledRunManagerDeps): ScheduledRunManager {
1011
- return new ScheduledRunManager(deps);
1012
- }