@elie-laloum/outpost 5.0.0 → 7.0.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 (647) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/README.md +11 -11
  3. package/SECURITY.md +10 -0
  4. package/dist/adapters/agents/antigravity-adapter.d.ts +3 -0
  5. package/dist/adapters/agents/antigravity-adapter.js +41 -0
  6. package/dist/adapters/agents/antigravity-adapter.js.map +1 -0
  7. package/dist/adapters/agents/antigravity-authentication.d.ts +2 -0
  8. package/dist/adapters/agents/antigravity-authentication.js +27 -0
  9. package/dist/adapters/agents/antigravity-authentication.js.map +1 -0
  10. package/dist/adapters/agents/antigravity-diagnostics.d.ts +1 -0
  11. package/dist/adapters/agents/antigravity-diagnostics.js +6 -0
  12. package/dist/adapters/agents/antigravity-diagnostics.js.map +1 -0
  13. package/dist/adapters/agents/antigravity-events.d.ts +2 -0
  14. package/dist/adapters/agents/antigravity-events.js +75 -0
  15. package/dist/adapters/agents/antigravity-events.js.map +1 -0
  16. package/dist/adapters/agents/antigravity-request.d.ts +5 -0
  17. package/dist/adapters/agents/antigravity-request.js +37 -0
  18. package/dist/adapters/agents/antigravity-request.js.map +1 -0
  19. package/dist/adapters/agents/antigravity.constants.d.ts +3 -0
  20. package/dist/adapters/agents/antigravity.constants.js +4 -0
  21. package/dist/adapters/agents/antigravity.constants.js.map +1 -0
  22. package/dist/adapters/agents/{gemini.types.d.ts → antigravity.types.d.ts} +2 -2
  23. package/dist/adapters/agents/antigravity.types.js +2 -0
  24. package/dist/adapters/agents/antigravity.types.js.map +1 -0
  25. package/dist/adapters/agents/authentication.constants.d.ts +19 -9
  26. package/dist/adapters/agents/authentication.constants.js +12 -9
  27. package/dist/adapters/agents/authentication.constants.js.map +1 -1
  28. package/dist/adapters/agents/authentication.d.ts +11 -2
  29. package/dist/adapters/agents/authentication.js +70 -47
  30. package/dist/adapters/agents/authentication.js.map +1 -1
  31. package/dist/adapters/agents/authentication.types.d.ts +20 -0
  32. package/dist/adapters/agents/authentication.types.js +2 -0
  33. package/dist/adapters/agents/authentication.types.js.map +1 -0
  34. package/dist/adapters/agents/claude-adapter.js +4 -2
  35. package/dist/adapters/agents/claude-adapter.js.map +1 -1
  36. package/dist/adapters/agents/claude-authentication.d.ts +2 -0
  37. package/dist/adapters/agents/claude-authentication.js +34 -0
  38. package/dist/adapters/agents/claude-authentication.js.map +1 -0
  39. package/dist/adapters/agents/claude-events.js +52 -9
  40. package/dist/adapters/agents/claude-events.js.map +1 -1
  41. package/dist/adapters/agents/claude-request.js +2 -0
  42. package/dist/adapters/agents/claude-request.js.map +1 -1
  43. package/dist/adapters/agents/cli-diagnostics.constants.d.ts +6 -6
  44. package/dist/adapters/agents/cli-diagnostics.constants.js +6 -6
  45. package/dist/adapters/agents/cli-diagnostics.constants.js.map +1 -1
  46. package/dist/adapters/agents/cli-diagnostics.d.ts +1 -0
  47. package/dist/adapters/agents/cli-diagnostics.js +18 -0
  48. package/dist/adapters/agents/cli-diagnostics.js.map +1 -1
  49. package/dist/adapters/agents/codex-adapter.js +4 -2
  50. package/dist/adapters/agents/codex-adapter.js.map +1 -1
  51. package/dist/adapters/agents/codex-authentication.d.ts +3 -0
  52. package/dist/adapters/agents/codex-authentication.js +47 -0
  53. package/dist/adapters/agents/codex-authentication.js.map +1 -0
  54. package/dist/adapters/agents/codex-events.js +28 -2
  55. package/dist/adapters/agents/codex-events.js.map +1 -1
  56. package/dist/adapters/agents/copilot-adapter.d.ts +3 -0
  57. package/dist/adapters/agents/copilot-adapter.js +45 -0
  58. package/dist/adapters/agents/copilot-adapter.js.map +1 -0
  59. package/dist/adapters/agents/copilot-authentication.d.ts +2 -0
  60. package/dist/adapters/agents/copilot-authentication.js +46 -0
  61. package/dist/adapters/agents/copilot-authentication.js.map +1 -0
  62. package/dist/adapters/agents/copilot-diagnostics.d.ts +1 -0
  63. package/dist/adapters/agents/copilot-diagnostics.js +6 -0
  64. package/dist/adapters/agents/copilot-diagnostics.js.map +1 -0
  65. package/dist/adapters/agents/copilot-events.d.ts +2 -0
  66. package/dist/adapters/agents/copilot-events.js +66 -0
  67. package/dist/adapters/agents/copilot-events.js.map +1 -0
  68. package/dist/adapters/agents/copilot-request.d.ts +5 -0
  69. package/dist/adapters/agents/copilot-request.js +24 -0
  70. package/dist/adapters/agents/copilot-request.js.map +1 -0
  71. package/dist/adapters/agents/copilot-usage.d.ts +3 -0
  72. package/dist/adapters/agents/copilot-usage.js +19 -0
  73. package/dist/adapters/agents/copilot-usage.js.map +1 -0
  74. package/dist/adapters/agents/copilot.types.d.ts +6 -0
  75. package/dist/adapters/agents/copilot.types.js +2 -0
  76. package/dist/adapters/agents/copilot.types.js.map +1 -0
  77. package/dist/adapters/agents/event-decoder.d.ts +2 -2
  78. package/dist/adapters/agents/event-decoder.js +6 -5
  79. package/dist/adapters/agents/event-decoder.js.map +1 -1
  80. package/dist/adapters/agents/kimi-adapter.d.ts +3 -0
  81. package/dist/adapters/agents/kimi-adapter.js +51 -0
  82. package/dist/adapters/agents/kimi-adapter.js.map +1 -0
  83. package/dist/adapters/agents/kimi-authentication.d.ts +3 -0
  84. package/dist/adapters/agents/kimi-authentication.js +63 -0
  85. package/dist/adapters/agents/kimi-authentication.js.map +1 -0
  86. package/dist/adapters/agents/kimi-diagnostics.d.ts +2 -0
  87. package/dist/adapters/agents/kimi-diagnostics.js +14 -0
  88. package/dist/adapters/agents/kimi-diagnostics.js.map +1 -0
  89. package/dist/adapters/agents/kimi-events.d.ts +2 -0
  90. package/dist/adapters/agents/kimi-events.js +55 -0
  91. package/dist/adapters/agents/kimi-events.js.map +1 -0
  92. package/dist/adapters/agents/kimi-fork.d.ts +2 -0
  93. package/dist/adapters/agents/kimi-fork.js +11 -0
  94. package/dist/adapters/agents/kimi-fork.js.map +1 -0
  95. package/dist/adapters/agents/{gemini-request.d.ts → kimi-request.d.ts} +2 -2
  96. package/dist/adapters/agents/kimi-request.js +33 -0
  97. package/dist/adapters/agents/kimi-request.js.map +1 -0
  98. package/dist/adapters/agents/kimi-usage.d.ts +2 -0
  99. package/dist/adapters/agents/kimi-usage.js +7 -0
  100. package/dist/adapters/agents/kimi-usage.js.map +1 -0
  101. package/dist/adapters/agents/kimi.constants.d.ts +13 -0
  102. package/dist/adapters/agents/kimi.constants.js +14 -0
  103. package/dist/adapters/agents/kimi.constants.js.map +1 -0
  104. package/dist/adapters/agents/kimi.types.d.ts +7 -0
  105. package/dist/adapters/agents/kimi.types.js +2 -0
  106. package/dist/adapters/agents/kimi.types.js.map +1 -0
  107. package/dist/adapters/agents/model-support.constants.d.ts +3 -1
  108. package/dist/adapters/agents/model-support.constants.js +12 -2
  109. package/dist/adapters/agents/model-support.constants.js.map +1 -1
  110. package/dist/adapters/agents/protocol-fixtures.constants.d.ts +2 -2
  111. package/dist/adapters/agents/protocol-fixtures.constants.js +131 -9
  112. package/dist/adapters/agents/protocol-fixtures.constants.js.map +1 -1
  113. package/dist/adapters/agents/protocol-fixtures.types.d.ts +1 -0
  114. package/dist/adapters/agents/protocol-fixtures.types.js.map +1 -1
  115. package/dist/adapters/agents/protocol.d.ts +1 -0
  116. package/dist/adapters/agents/protocol.js +9 -0
  117. package/dist/adapters/agents/protocol.js.map +1 -1
  118. package/dist/adapters/agents/session-usage.constants.d.ts +10 -0
  119. package/dist/adapters/agents/session-usage.constants.js +110 -0
  120. package/dist/adapters/agents/session-usage.constants.js.map +1 -0
  121. package/dist/adapters/agents/session-usage.d.ts +5 -0
  122. package/dist/adapters/agents/session-usage.js +45 -0
  123. package/dist/adapters/agents/session-usage.js.map +1 -0
  124. package/dist/adapters/agents/settings.types.d.ts +1 -0
  125. package/dist/adapters/agents/settings.types.js.map +1 -1
  126. package/dist/adapters/agents/tool-result.d.ts +2 -0
  127. package/dist/adapters/agents/tool-result.js +17 -0
  128. package/dist/adapters/agents/tool-result.js.map +1 -0
  129. package/dist/adapters/models/anthropic-response.js +3 -0
  130. package/dist/adapters/models/anthropic-response.js.map +1 -1
  131. package/dist/adapters/models/http-provider.js +6 -1
  132. package/dist/adapters/models/http-provider.js.map +1 -1
  133. package/dist/adapters/models/openai-responses.js +10 -0
  134. package/dist/adapters/models/openai-responses.js.map +1 -1
  135. package/dist/adapters/models/retry-after.d.ts +1 -0
  136. package/dist/adapters/models/retry-after.js +16 -0
  137. package/dist/adapters/models/retry-after.js.map +1 -0
  138. package/dist/application/activity-watchdog.js +1 -2
  139. package/dist/application/activity-watchdog.js.map +1 -1
  140. package/dist/application/agent-authentication.d.ts +4 -0
  141. package/dist/application/agent-authentication.js +32 -0
  142. package/dist/application/agent-authentication.js.map +1 -0
  143. package/dist/application/agent-bootstrap.constants.d.ts +2 -5
  144. package/dist/application/agent-bootstrap.constants.js +27 -4
  145. package/dist/application/agent-bootstrap.constants.js.map +1 -1
  146. package/dist/application/agent-bootstrap.js +39 -12
  147. package/dist/application/agent-bootstrap.js.map +1 -1
  148. package/dist/application/agent-bootstrap.types.d.ts +19 -0
  149. package/dist/application/agent-bootstrap.types.js +2 -0
  150. package/dist/application/agent-bootstrap.types.js.map +1 -0
  151. package/dist/application/agent-output.js +74 -8
  152. package/dist/application/agent-output.js.map +1 -1
  153. package/dist/application/agent-request.d.ts +3 -0
  154. package/dist/application/agent-request.js +11 -0
  155. package/dist/application/agent-request.js.map +1 -0
  156. package/dist/application/agent-turn.js +74 -6
  157. package/dist/application/agent-turn.js.map +1 -1
  158. package/dist/application/agent-usage.d.ts +6 -0
  159. package/dist/application/agent-usage.js +57 -0
  160. package/dist/application/agent-usage.js.map +1 -0
  161. package/dist/application/attach.js +2 -0
  162. package/dist/application/attach.js.map +1 -1
  163. package/dist/application/credential-installer.constants.d.ts +1 -0
  164. package/dist/application/credential-installer.constants.js +22 -0
  165. package/dist/application/credential-installer.constants.js.map +1 -0
  166. package/dist/application/custom-turn.js +44 -49
  167. package/dist/application/custom-turn.js.map +1 -1
  168. package/dist/application/dispatch-observation.d.ts +1 -1
  169. package/dist/application/dispatch-observation.js +141 -21
  170. package/dist/application/dispatch-observation.js.map +1 -1
  171. package/dist/application/dispatch-observation.types.d.ts +2 -0
  172. package/dist/application/dispatch-observation.types.js.map +1 -1
  173. package/dist/application/dispatch-validation.js +2 -0
  174. package/dist/application/dispatch-validation.js.map +1 -1
  175. package/dist/application/dispatch.js +1 -1
  176. package/dist/application/dispatch.js.map +1 -1
  177. package/dist/application/doctor-agent.constants.d.ts +2 -8
  178. package/dist/application/doctor-agent.constants.js +43 -6
  179. package/dist/application/doctor-agent.constants.js.map +1 -1
  180. package/dist/application/doctor-agent.d.ts +2 -1
  181. package/dist/application/doctor-agent.js +15 -3
  182. package/dist/application/doctor-agent.js.map +1 -1
  183. package/dist/application/doctor-image.js +4 -6
  184. package/dist/application/doctor-image.js.map +1 -1
  185. package/dist/application/doctor-protocol.js +6 -11
  186. package/dist/application/doctor-protocol.js.map +1 -1
  187. package/dist/application/doctor-protocol.types.d.ts +1 -1
  188. package/dist/application/doctor-protocol.types.js.map +1 -1
  189. package/dist/application/doctor-sandbox.js +2 -5
  190. package/dist/application/doctor-sandbox.js.map +1 -1
  191. package/dist/application/doctor.js +28 -10
  192. package/dist/application/doctor.js.map +1 -1
  193. package/dist/application/doctor.types.d.ts +10 -1
  194. package/dist/application/doctor.types.js.map +1 -1
  195. package/dist/application/execution.constants.d.ts +2 -0
  196. package/dist/application/execution.constants.js +2 -0
  197. package/dist/application/execution.constants.js.map +1 -1
  198. package/dist/application/execution.types.d.ts +8 -0
  199. package/dist/application/execution.types.js.map +1 -1
  200. package/dist/application/harness-budget.d.ts +3 -0
  201. package/dist/application/harness-budget.js +42 -0
  202. package/dist/application/harness-budget.js.map +1 -0
  203. package/dist/application/harness-budget.types.d.ts +5 -0
  204. package/dist/application/harness-budget.types.js +2 -0
  205. package/dist/application/harness-budget.types.js.map +1 -0
  206. package/dist/application/harness-hooks.js +34 -3
  207. package/dist/application/harness-hooks.js.map +1 -1
  208. package/dist/application/harness-loop.js +52 -24
  209. package/dist/application/harness-loop.js.map +1 -1
  210. package/dist/application/harness-model-provider.d.ts +3 -0
  211. package/dist/application/harness-model-provider.js +49 -0
  212. package/dist/application/harness-model-provider.js.map +1 -0
  213. package/dist/application/harness-model-provider.types.d.ts +10 -0
  214. package/dist/application/harness-model-provider.types.js +2 -0
  215. package/dist/application/harness-model-provider.types.js.map +1 -0
  216. package/dist/application/harness-subagent.d.ts +4 -0
  217. package/dist/application/harness-subagent.js +110 -0
  218. package/dist/application/harness-subagent.js.map +1 -0
  219. package/dist/application/harness.types.d.ts +11 -0
  220. package/dist/application/harness.types.js.map +1 -1
  221. package/dist/application/lifecycle-hooks.d.ts +1 -1
  222. package/dist/application/lifecycle-hooks.js +5 -4
  223. package/dist/application/lifecycle-hooks.js.map +1 -1
  224. package/dist/application/observed-lease.d.ts +3 -0
  225. package/dist/application/observed-lease.js +26 -0
  226. package/dist/application/observed-lease.js.map +1 -0
  227. package/dist/application/outpost.types.d.ts +3 -1
  228. package/dist/application/outpost.types.js.map +1 -1
  229. package/dist/application/output-lines.d.ts +4 -0
  230. package/dist/application/output-lines.js +28 -0
  231. package/dist/application/output-lines.js.map +1 -0
  232. package/dist/application/queue-worker.js +1 -1
  233. package/dist/application/queue-worker.js.map +1 -1
  234. package/dist/application/queue-worker.types.d.ts +1 -0
  235. package/dist/application/queue-worker.types.js.map +1 -1
  236. package/dist/application/queued-task.js +24 -5
  237. package/dist/application/queued-task.js.map +1 -1
  238. package/dist/application/recovery-archive.d.ts +3 -2
  239. package/dist/application/recovery-archive.js +9 -2
  240. package/dist/application/recovery-archive.js.map +1 -1
  241. package/dist/application/recovery-restore.d.ts +3 -2
  242. package/dist/application/recovery-restore.js +9 -2
  243. package/dist/application/recovery-restore.js.map +1 -1
  244. package/dist/application/recovery-retention.d.ts +3 -2
  245. package/dist/application/recovery-retention.js +74 -26
  246. package/dist/application/recovery-retention.js.map +1 -1
  247. package/dist/application/remote-workspace.js +5 -4
  248. package/dist/application/remote-workspace.js.map +1 -1
  249. package/dist/application/remote-workspace.types.d.ts +1 -0
  250. package/dist/application/remote-workspace.types.js.map +1 -1
  251. package/dist/application/sandbox-agents.js +19 -19
  252. package/dist/application/sandbox-agents.js.map +1 -1
  253. package/dist/application/sandbox-attach.js +12 -3
  254. package/dist/application/sandbox-attach.js.map +1 -1
  255. package/dist/application/sandbox-dispatch.js +13 -27
  256. package/dist/application/sandbox-dispatch.js.map +1 -1
  257. package/dist/application/sandbox-provision.js +15 -9
  258. package/dist/application/sandbox-provision.js.map +1 -1
  259. package/dist/application/sandbox-session.types.d.ts +7 -2
  260. package/dist/application/sandbox-session.types.js.map +1 -1
  261. package/dist/application/sandbox.js +13 -6
  262. package/dist/application/sandbox.js.map +1 -1
  263. package/dist/application/speculation-checkpoint.d.ts +6 -0
  264. package/dist/application/speculation-checkpoint.js +206 -0
  265. package/dist/application/speculation-checkpoint.js.map +1 -0
  266. package/dist/application/speculation-checkpoint.types.d.ts +24 -0
  267. package/dist/application/speculation-checkpoint.types.js +2 -0
  268. package/dist/application/speculation-checkpoint.types.js.map +1 -0
  269. package/dist/application/speculation-integration.constants.d.ts +4 -0
  270. package/dist/application/speculation-integration.constants.js +5 -0
  271. package/dist/application/speculation-integration.constants.js.map +1 -0
  272. package/dist/application/speculation-integration.d.ts +2 -0
  273. package/dist/application/speculation-integration.js +67 -0
  274. package/dist/application/speculation-integration.js.map +1 -0
  275. package/dist/application/speculation-resume.d.ts +4 -0
  276. package/dist/application/speculation-resume.js +71 -0
  277. package/dist/application/speculation-resume.js.map +1 -0
  278. package/dist/application/speculation-run.d.ts +4 -0
  279. package/dist/application/speculation-run.js +320 -0
  280. package/dist/application/speculation-run.js.map +1 -0
  281. package/dist/application/speculation-timeout.d.ts +1 -0
  282. package/dist/application/speculation-timeout.js +15 -0
  283. package/dist/application/speculation-timeout.js.map +1 -0
  284. package/dist/application/speculation.constants.d.ts +1 -0
  285. package/dist/application/speculation.constants.js +5 -1
  286. package/dist/application/speculation.constants.js.map +1 -1
  287. package/dist/application/speculation.js +41 -149
  288. package/dist/application/speculation.js.map +1 -1
  289. package/dist/application/speculation.types.d.ts +23 -0
  290. package/dist/application/speculation.types.js.map +1 -1
  291. package/dist/application/startup-recovery.js +14 -1
  292. package/dist/application/startup-recovery.js.map +1 -1
  293. package/dist/application/startup-recovery.types.d.ts +1 -0
  294. package/dist/application/startup-recovery.types.js.map +1 -1
  295. package/dist/application/stop-reason.d.ts +2 -0
  296. package/dist/application/stop-reason.js +21 -0
  297. package/dist/application/stop-reason.js.map +1 -0
  298. package/dist/application/stop-reason.types.d.ts +4 -0
  299. package/dist/application/stop-reason.types.js +2 -0
  300. package/dist/application/stop-reason.types.js.map +1 -0
  301. package/dist/application/storage-reservation.js +9 -2
  302. package/dist/application/storage-reservation.js.map +1 -1
  303. package/dist/application/task-observation.d.ts +3 -0
  304. package/dist/application/task-observation.js +22 -0
  305. package/dist/application/task-observation.js.map +1 -0
  306. package/dist/application/task-usage.js +5 -12
  307. package/dist/application/task-usage.js.map +1 -1
  308. package/dist/application/tasks.js +41 -16
  309. package/dist/application/tasks.js.map +1 -1
  310. package/dist/application/tool-execution.js +42 -19
  311. package/dist/application/tool-execution.js.map +1 -1
  312. package/dist/application/workspace.js +6 -4
  313. package/dist/application/workspace.js.map +1 -1
  314. package/dist/cli/doctor-command.js +6 -2
  315. package/dist/cli/doctor-command.js.map +1 -1
  316. package/dist/cli/init-authentication.d.ts +4 -1
  317. package/dist/cli/init-authentication.js +28 -33
  318. package/dist/cli/init-authentication.js.map +1 -1
  319. package/dist/cli/init-command.js +3 -3
  320. package/dist/cli/init-command.js.map +1 -1
  321. package/dist/cli/main.constants.d.ts +50 -13
  322. package/dist/cli/main.constants.js +70 -8
  323. package/dist/cli/main.constants.js.map +1 -1
  324. package/dist/cli/main.js +2 -1
  325. package/dist/cli/main.js.map +1 -1
  326. package/dist/cli/scaffold-files.js +1 -1
  327. package/dist/cli/scaffold-files.js.map +1 -1
  328. package/dist/cli/scaffold-validation.js +29 -22
  329. package/dist/cli/scaffold-validation.js.map +1 -1
  330. package/dist/cli/scaffold.constants.d.ts +0 -1
  331. package/dist/cli/scaffold.constants.js +6 -2
  332. package/dist/cli/scaffold.constants.js.map +1 -1
  333. package/dist/cli/scaffold.types.d.ts +8 -2
  334. package/dist/cli/scaffold.types.js.map +1 -1
  335. package/dist/cli/starters.js +1 -3
  336. package/dist/cli/starters.js.map +1 -1
  337. package/dist/domain/agent-observation.d.ts +4 -0
  338. package/dist/domain/agent-observation.js +27 -0
  339. package/dist/domain/agent-observation.js.map +1 -0
  340. package/dist/domain/agent.types.d.ts +122 -14
  341. package/dist/domain/agent.types.js.map +1 -1
  342. package/dist/domain/authentication.constants.d.ts +3 -0
  343. package/dist/domain/authentication.constants.js +11 -0
  344. package/dist/domain/authentication.constants.js.map +1 -0
  345. package/dist/domain/authentication.d.ts +3 -0
  346. package/dist/domain/authentication.js +22 -0
  347. package/dist/domain/authentication.js.map +1 -0
  348. package/dist/domain/authentication.types.d.ts +5 -0
  349. package/dist/domain/authentication.types.js +2 -0
  350. package/dist/domain/authentication.types.js.map +1 -0
  351. package/dist/domain/harness.d.ts +2 -2
  352. package/dist/domain/harness.js +6 -0
  353. package/dist/domain/harness.js.map +1 -1
  354. package/dist/domain/harness.types.d.ts +4 -3
  355. package/dist/domain/harness.types.js.map +1 -1
  356. package/dist/domain/model.types.d.ts +8 -0
  357. package/dist/domain/model.types.js.map +1 -1
  358. package/dist/domain/observation.constants.d.ts +8 -0
  359. package/dist/domain/observation.constants.js +9 -0
  360. package/dist/domain/observation.constants.js.map +1 -0
  361. package/dist/domain/observation.d.ts +2 -0
  362. package/dist/domain/observation.js +190 -0
  363. package/dist/domain/observation.js.map +1 -0
  364. package/dist/domain/observation.types.d.ts +84 -0
  365. package/dist/domain/observation.types.js +2 -0
  366. package/dist/domain/observation.types.js.map +1 -0
  367. package/dist/domain/observed-operation.d.ts +2 -0
  368. package/dist/domain/observed-operation.js +30 -0
  369. package/dist/domain/observed-operation.js.map +1 -0
  370. package/dist/domain/sandbox.types.d.ts +2 -0
  371. package/dist/domain/sandbox.types.js.map +1 -1
  372. package/dist/domain/subagent.constants.d.ts +13 -0
  373. package/dist/domain/subagent.constants.js +9 -0
  374. package/dist/domain/subagent.constants.js.map +1 -0
  375. package/dist/domain/subagent.d.ts +4 -0
  376. package/dist/domain/subagent.js +28 -0
  377. package/dist/domain/subagent.js.map +1 -0
  378. package/dist/domain/subagent.types.d.ts +13 -0
  379. package/dist/domain/subagent.types.js +2 -0
  380. package/dist/domain/subagent.types.js.map +1 -0
  381. package/dist/domain/transcript.types.d.ts +2 -0
  382. package/dist/domain/transcript.types.js.map +1 -1
  383. package/dist/domain/usage.d.ts +1 -0
  384. package/dist/domain/usage.js +16 -0
  385. package/dist/domain/usage.js.map +1 -1
  386. package/dist/domain/workflow/budget.d.ts +7 -3
  387. package/dist/domain/workflow/budget.js +26 -0
  388. package/dist/domain/workflow/budget.js.map +1 -1
  389. package/dist/domain/workflow/budget.types.d.ts +1 -1
  390. package/dist/domain/workflow/budget.types.js.map +1 -1
  391. package/dist/domain/workflow/checkpoint-validation.js +7 -1
  392. package/dist/domain/workflow/checkpoint-validation.js.map +1 -1
  393. package/dist/domain/workflow/checkpoint.js +3 -0
  394. package/dist/domain/workflow/checkpoint.js.map +1 -1
  395. package/dist/domain/workflow/gate-validation.js +14 -1
  396. package/dist/domain/workflow/gate-validation.js.map +1 -1
  397. package/dist/domain/workflow/gates.d.ts +1 -1
  398. package/dist/domain/workflow/gates.js +52 -4
  399. package/dist/domain/workflow/gates.js.map +1 -1
  400. package/dist/domain/workflow/gates.types.d.ts +15 -1
  401. package/dist/domain/workflow/gates.types.js.map +1 -1
  402. package/dist/domain/workflow/idempotency.d.ts +1 -0
  403. package/dist/domain/workflow/idempotency.js +7 -0
  404. package/dist/domain/workflow/idempotency.js.map +1 -0
  405. package/dist/domain/workflow/retry.constants.d.ts +2 -0
  406. package/dist/domain/workflow/retry.constants.js +3 -0
  407. package/dist/domain/workflow/retry.constants.js.map +1 -0
  408. package/dist/domain/workflow/retry.d.ts +4 -0
  409. package/dist/domain/workflow/retry.js +49 -0
  410. package/dist/domain/workflow/retry.js.map +1 -0
  411. package/dist/domain/workflow/task-runner.js +9 -5
  412. package/dist/domain/workflow/task-runner.js.map +1 -1
  413. package/dist/domain/workflow/task.js +6 -6
  414. package/dist/domain/workflow/task.js.map +1 -1
  415. package/dist/domain/workflow/workflow-scheduler.js +110 -72
  416. package/dist/domain/workflow/workflow-scheduler.js.map +1 -1
  417. package/dist/domain/workflow/workflow-state.js +28 -12
  418. package/dist/domain/workflow/workflow-state.js.map +1 -1
  419. package/dist/domain/workflow.d.ts +1 -1
  420. package/dist/domain/workflow.js +1 -1
  421. package/dist/domain/workflow.js.map +1 -1
  422. package/dist/domain/workflow.types.d.ts +13 -2
  423. package/dist/domain/workflow.types.js.map +1 -1
  424. package/dist/index.d.ts +16 -11
  425. package/dist/index.js +7 -4
  426. package/dist/index.js.map +1 -1
  427. package/dist/infrastructure/conversations/capture.js +10 -0
  428. package/dist/infrastructure/conversations/capture.js.map +1 -1
  429. package/dist/infrastructure/conversations/harness-transcript.js +6 -0
  430. package/dist/infrastructure/conversations/harness-transcript.js.map +1 -1
  431. package/dist/infrastructure/conversations/harness-transcript.types.d.ts +2 -0
  432. package/dist/infrastructure/conversations/harness-transcript.types.js.map +1 -1
  433. package/dist/infrastructure/conversations/layout.js +2 -0
  434. package/dist/infrastructure/conversations/layout.js.map +1 -1
  435. package/dist/infrastructure/conversations/locate.js +7 -1
  436. package/dist/infrastructure/conversations/locate.js.map +1 -1
  437. package/dist/infrastructure/conversations/native-store.js +8 -1
  438. package/dist/infrastructure/conversations/native-store.js.map +1 -1
  439. package/dist/infrastructure/conversations/paths.js +3 -0
  440. package/dist/infrastructure/conversations/paths.js.map +1 -1
  441. package/dist/infrastructure/conversations/restore.js +7 -0
  442. package/dist/infrastructure/conversations/restore.js.map +1 -1
  443. package/dist/infrastructure/conversations/session-bundle.constants.d.ts +5 -0
  444. package/dist/infrastructure/conversations/session-bundle.constants.js +173 -0
  445. package/dist/infrastructure/conversations/session-bundle.constants.js.map +1 -0
  446. package/dist/infrastructure/conversations/session-bundle.d.ts +6 -0
  447. package/dist/infrastructure/conversations/session-bundle.js +98 -0
  448. package/dist/infrastructure/conversations/session-bundle.js.map +1 -0
  449. package/dist/infrastructure/conversations/session-bundle.types.d.ts +1 -0
  450. package/dist/infrastructure/conversations/session-bundle.types.js +2 -0
  451. package/dist/infrastructure/conversations/session-bundle.types.js.map +1 -0
  452. package/dist/infrastructure/conversations.js +4 -2
  453. package/dist/infrastructure/conversations.js.map +1 -1
  454. package/dist/infrastructure/conversations.types.d.ts +1 -1
  455. package/dist/infrastructure/conversations.types.js.map +1 -1
  456. package/dist/infrastructure/custom-reporter.js +32 -24
  457. package/dist/infrastructure/custom-reporter.js.map +1 -1
  458. package/dist/infrastructure/custom-reporter.types.d.ts +2 -0
  459. package/dist/infrastructure/custom-reporter.types.js.map +1 -1
  460. package/dist/infrastructure/git/git.constants.d.ts +1 -1
  461. package/dist/infrastructure/git/git.constants.js +1 -0
  462. package/dist/infrastructure/git/git.constants.js.map +1 -1
  463. package/dist/infrastructure/git/workspace-lease.js +4 -3
  464. package/dist/infrastructure/git/workspace-lease.js.map +1 -1
  465. package/dist/infrastructure/git/workspace.js +7 -6
  466. package/dist/infrastructure/git/workspace.js.map +1 -1
  467. package/dist/infrastructure/git/workspace.types.d.ts +1 -0
  468. package/dist/infrastructure/git/workspace.types.js.map +1 -1
  469. package/dist/infrastructure/host-credentials.constants.d.ts +1 -0
  470. package/dist/infrastructure/host-credentials.constants.js +2 -0
  471. package/dist/infrastructure/host-credentials.constants.js.map +1 -0
  472. package/dist/infrastructure/host-credentials.d.ts +4 -0
  473. package/dist/infrastructure/host-credentials.js +89 -0
  474. package/dist/infrastructure/host-credentials.js.map +1 -0
  475. package/dist/infrastructure/inspection-path.js +4 -3
  476. package/dist/infrastructure/inspection-path.js.map +1 -1
  477. package/dist/infrastructure/journal.constants.js +10 -1
  478. package/dist/infrastructure/journal.constants.js.map +1 -1
  479. package/dist/infrastructure/journal.d.ts +1 -1
  480. package/dist/infrastructure/journal.js +8 -75
  481. package/dist/infrastructure/journal.js.map +1 -1
  482. package/dist/infrastructure/journal.types.d.ts +2 -4
  483. package/dist/infrastructure/journal.types.js.map +1 -1
  484. package/dist/infrastructure/local-transport.js +9 -4
  485. package/dist/infrastructure/local-transport.js.map +1 -1
  486. package/dist/infrastructure/opentelemetry-dispatch.d.ts +3 -3
  487. package/dist/infrastructure/opentelemetry-dispatch.js +5 -4
  488. package/dist/infrastructure/opentelemetry-dispatch.js.map +1 -1
  489. package/dist/infrastructure/opentelemetry-observation.d.ts +5 -0
  490. package/dist/infrastructure/opentelemetry-observation.js +59 -0
  491. package/dist/infrastructure/opentelemetry-observation.js.map +1 -0
  492. package/dist/infrastructure/opentelemetry.js +15 -1
  493. package/dist/infrastructure/opentelemetry.js.map +1 -1
  494. package/dist/infrastructure/opentelemetry.types.d.ts +9 -1
  495. package/dist/infrastructure/opentelemetry.types.js.map +1 -1
  496. package/dist/infrastructure/reporter.d.ts +2 -2
  497. package/dist/infrastructure/reporter.js +5 -1
  498. package/dist/infrastructure/reporter.js.map +1 -1
  499. package/dist/infrastructure/repository-transport.constants.d.ts +1 -0
  500. package/dist/infrastructure/repository-transport.constants.js +2 -0
  501. package/dist/infrastructure/repository-transport.constants.js.map +1 -0
  502. package/dist/infrastructure/repository-transport.d.ts +2 -0
  503. package/dist/infrastructure/repository-transport.js +9 -0
  504. package/dist/infrastructure/repository-transport.js.map +1 -0
  505. package/dist/infrastructure/resource-activity-inspection.js +19 -24
  506. package/dist/infrastructure/resource-activity-inspection.js.map +1 -1
  507. package/dist/infrastructure/resource-activity.constants.d.ts +0 -1
  508. package/dist/infrastructure/resource-activity.constants.js +0 -1
  509. package/dist/infrastructure/resource-activity.constants.js.map +1 -1
  510. package/dist/infrastructure/resource-activity.js +20 -83
  511. package/dist/infrastructure/resource-activity.js.map +1 -1
  512. package/dist/infrastructure/s3-transport.constants.d.ts +2 -0
  513. package/dist/infrastructure/s3-transport.constants.js +3 -0
  514. package/dist/infrastructure/s3-transport.constants.js.map +1 -0
  515. package/dist/infrastructure/s3-transport.js +57 -3
  516. package/dist/infrastructure/s3-transport.js.map +1 -1
  517. package/dist/infrastructure/s3-transport.types.d.ts +1 -0
  518. package/dist/infrastructure/s3-transport.types.js.map +1 -1
  519. package/dist/infrastructure/speculation-store.constants.d.ts +3 -0
  520. package/dist/infrastructure/speculation-store.constants.js +2 -0
  521. package/dist/infrastructure/speculation-store.constants.js.map +1 -0
  522. package/dist/infrastructure/speculation-store.d.ts +4 -0
  523. package/dist/infrastructure/speculation-store.js +73 -0
  524. package/dist/infrastructure/speculation-store.js.map +1 -0
  525. package/dist/infrastructure/speculation-store.types.d.ts +12 -0
  526. package/dist/infrastructure/speculation-store.types.js +2 -0
  527. package/dist/infrastructure/speculation-store.types.js.map +1 -0
  528. package/dist/infrastructure/storage-inventory.constants.js +1 -0
  529. package/dist/infrastructure/storage-inventory.constants.js.map +1 -1
  530. package/dist/infrastructure/storage-inventory.types.d.ts +1 -1
  531. package/dist/infrastructure/storage-inventory.types.js.map +1 -1
  532. package/dist/infrastructure/storage-reservations.types.d.ts +0 -8
  533. package/dist/infrastructure/storage-reservations.types.js.map +1 -1
  534. package/dist/infrastructure/task-queue-bullmq-resources.js +3 -0
  535. package/dist/infrastructure/task-queue-bullmq-resources.js.map +1 -1
  536. package/dist/infrastructure/task-queue-http.js +29 -4
  537. package/dist/infrastructure/task-queue-http.js.map +1 -1
  538. package/dist/infrastructure/task-queue-http.types.d.ts +2 -2
  539. package/dist/infrastructure/task-queue-http.types.js.map +1 -1
  540. package/dist/infrastructure/transport-conversations.js +2 -0
  541. package/dist/infrastructure/transport-conversations.js.map +1 -1
  542. package/dist/infrastructure/transport-journal.d.ts +1 -1
  543. package/dist/infrastructure/transport-journal.js +8 -2
  544. package/dist/infrastructure/transport-journal.js.map +1 -1
  545. package/dist/infrastructure/transport-reservations.d.ts +1 -1
  546. package/dist/infrastructure/transport-reservations.js +14 -8
  547. package/dist/infrastructure/transport-reservations.js.map +1 -1
  548. package/dist/infrastructure/workflow-decision-signature.constants.d.ts +4 -0
  549. package/dist/infrastructure/workflow-decision-signature.constants.js +5 -0
  550. package/dist/infrastructure/workflow-decision-signature.constants.js.map +1 -0
  551. package/dist/infrastructure/workflow-decision-signature.d.ts +4 -0
  552. package/dist/infrastructure/workflow-decision-signature.js +83 -0
  553. package/dist/infrastructure/workflow-decision-signature.js.map +1 -0
  554. package/dist/infrastructure/workflow-decision-signature.types.d.ts +16 -0
  555. package/dist/infrastructure/workflow-decision-signature.types.js +2 -0
  556. package/dist/infrastructure/workflow-decision-signature.types.js.map +1 -0
  557. package/dist/providers/agents.d.ts +7 -2
  558. package/dist/providers/agents.js +4 -1
  559. package/dist/providers/agents.js.map +1 -1
  560. package/dist/providers/antigravity-install.constants.d.ts +2 -0
  561. package/dist/providers/antigravity-install.constants.js +28 -0
  562. package/dist/providers/antigravity-install.constants.js.map +1 -0
  563. package/dist/providers/antigravity-install.d.ts +2 -0
  564. package/dist/providers/antigravity-install.js +29 -0
  565. package/dist/providers/antigravity-install.js.map +1 -0
  566. package/dist/providers/antigravity-install.types.d.ts +4 -0
  567. package/dist/providers/antigravity-install.types.js +2 -0
  568. package/dist/providers/antigravity-install.types.js.map +1 -0
  569. package/dist/providers/container-recovery.d.ts +4 -0
  570. package/dist/providers/container-recovery.js +28 -0
  571. package/dist/providers/container-recovery.js.map +1 -0
  572. package/dist/providers/container.js +8 -0
  573. package/dist/providers/container.js.map +1 -1
  574. package/dist/providers/daytona-network.constants.d.ts +5 -0
  575. package/dist/providers/daytona-network.constants.js +8 -0
  576. package/dist/providers/daytona-network.constants.js.map +1 -0
  577. package/dist/providers/daytona-network.d.ts +4 -0
  578. package/dist/providers/daytona-network.js +33 -0
  579. package/dist/providers/daytona-network.js.map +1 -0
  580. package/dist/providers/daytona.d.ts +1 -0
  581. package/dist/providers/daytona.js +9 -3
  582. package/dist/providers/daytona.js.map +1 -1
  583. package/dist/providers/daytona.types.d.ts +2 -0
  584. package/dist/providers/daytona.types.js.map +1 -1
  585. package/dist/providers/firecracker-command.js +1 -1
  586. package/dist/providers/firecracker-command.js.map +1 -1
  587. package/dist/providers/firecracker-jailer.constants.d.ts +9 -0
  588. package/dist/providers/firecracker-jailer.constants.js +10 -0
  589. package/dist/providers/firecracker-jailer.constants.js.map +1 -0
  590. package/dist/providers/firecracker-jailer.d.ts +4 -0
  591. package/dist/providers/firecracker-jailer.js +171 -0
  592. package/dist/providers/firecracker-jailer.js.map +1 -0
  593. package/dist/providers/firecracker-machine.js +30 -8
  594. package/dist/providers/firecracker-machine.js.map +1 -1
  595. package/dist/providers/firecracker.types.d.ts +16 -0
  596. package/dist/providers/firecracker.types.js.map +1 -1
  597. package/dist/providers/vercel-network.js +1 -1
  598. package/dist/providers/vercel-network.js.map +1 -1
  599. package/dist/providers/vercel.js +6 -3
  600. package/dist/providers/vercel.js.map +1 -1
  601. package/dist/providers/versions.constants.d.ts +3 -1
  602. package/dist/providers/versions.constants.js +3 -1
  603. package/dist/providers/versions.constants.js.map +1 -1
  604. package/package.json +3 -3
  605. package/dist/adapters/agents/gemini-adapter.d.ts +0 -3
  606. package/dist/adapters/agents/gemini-adapter.js +0 -34
  607. package/dist/adapters/agents/gemini-adapter.js.map +0 -1
  608. package/dist/adapters/agents/gemini-diagnostics.d.ts +0 -2
  609. package/dist/adapters/agents/gemini-diagnostics.js +0 -15
  610. package/dist/adapters/agents/gemini-diagnostics.js.map +0 -1
  611. package/dist/adapters/agents/gemini-events.d.ts +0 -2
  612. package/dist/adapters/agents/gemini-events.js +0 -50
  613. package/dist/adapters/agents/gemini-events.js.map +0 -1
  614. package/dist/adapters/agents/gemini-request.js +0 -23
  615. package/dist/adapters/agents/gemini-request.js.map +0 -1
  616. package/dist/adapters/agents/gemini.types.js +0 -2
  617. package/dist/adapters/agents/gemini.types.js.map +0 -1
  618. package/dist/infrastructure/artifact-store.d.ts +0 -3
  619. package/dist/infrastructure/artifact-store.js +0 -110
  620. package/dist/infrastructure/artifact-store.js.map +0 -1
  621. package/dist/infrastructure/artifact-store.types.d.ts +0 -6
  622. package/dist/infrastructure/artifact-store.types.js +0 -2
  623. package/dist/infrastructure/artifact-store.types.js.map +0 -1
  624. package/dist/infrastructure/journal-retention.constants.d.ts +0 -4
  625. package/dist/infrastructure/journal-retention.constants.js +0 -5
  626. package/dist/infrastructure/journal-retention.constants.js.map +0 -1
  627. package/dist/infrastructure/journal-retention.d.ts +0 -2
  628. package/dist/infrastructure/journal-retention.js +0 -51
  629. package/dist/infrastructure/journal-retention.js.map +0 -1
  630. package/dist/infrastructure/storage-mutation-lock.constants.d.ts +0 -5
  631. package/dist/infrastructure/storage-mutation-lock.constants.js +0 -6
  632. package/dist/infrastructure/storage-mutation-lock.constants.js.map +0 -1
  633. package/dist/infrastructure/storage-mutation-lock.d.ts +0 -1
  634. package/dist/infrastructure/storage-mutation-lock.js +0 -21
  635. package/dist/infrastructure/storage-mutation-lock.js.map +0 -1
  636. package/dist/infrastructure/storage-reservations.constants.d.ts +0 -4
  637. package/dist/infrastructure/storage-reservations.constants.js +0 -5
  638. package/dist/infrastructure/storage-reservations.constants.js.map +0 -1
  639. package/dist/infrastructure/storage-reservations.d.ts +0 -2
  640. package/dist/infrastructure/storage-reservations.js +0 -150
  641. package/dist/infrastructure/storage-reservations.js.map +0 -1
  642. package/dist/infrastructure/workflow-checkpoint.d.ts +0 -3
  643. package/dist/infrastructure/workflow-checkpoint.js +0 -84
  644. package/dist/infrastructure/workflow-checkpoint.js.map +0 -1
  645. package/dist/infrastructure/workflow-checkpoint.types.d.ts +0 -6
  646. package/dist/infrastructure/workflow-checkpoint.types.js +0 -2
  647. package/dist/infrastructure/workflow-checkpoint.types.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"attach.js","sourceRoot":"","sources":["../../src/application/attach.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,kCAAkC,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAMvD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,OAAuD;IAEvD,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;IACjC,SAAS,CACP,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,EAC5B,sDAAsD,CACvD,CAAC;IACF,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9E,IAAI,KAAK;QAAE,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC;IAC3C,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC1C,SAAS,CAAC,OAAO,EAAE,oDAAoD,CAAC,CAAC;QACzE,MAAM,OAAO,CAAC,MAAM,CAClB,OAAO,CAAC,YAAY,CAAC,EAAE,EACvB,OAAO,CAAC,SAAS,EAAE,UAAU,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,EACpE,OAAO,CAAC,gBAAgB,CACzB,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,CACf,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAC9D,CAAC,IAAI,EAAE,CAAC;QACT,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,MAAM,OAAO,CAC3B,OAAO,CAAC,SAAS,CAAC,SAAS,EAC3B,QAAQ,EACR,OAAO,CAAC,MAAM,EAAE,SAAS,CAC1B,CAAC;QACF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;QAC7D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;QACxE,UAAU,GAAG,IAAI,CAAC;QAClB,OAAO;YACL,GAAG,MAAM;YACT,GAAG,QAAQ;YACX,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,MAAM;YAChC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,SAAS;YACtC,OAAO,EAAE,OAAO;SACjB,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,UAAU;YAAE,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC","sourcesContent":["import type { RequiredAgent } from \"../domain/agent.types.ts\";\nimport { invariant } from \"../domain/errors.ts\";\nimport { validateBrief } from \"../domain/prompts.ts\";\nimport { git } from \"../infrastructure/git/command.ts\";\nimport { commits } from \"../infrastructure/git/history.ts\";\nimport { storageFor } from \"./agent-storage.ts\";\nimport { completeBrief } from \"./interactive-brief.ts\";\nimport type {\n AttachOptions,\n AttachResult,\n SandboxOptions,\n} from \"./outpost.types.ts\";\nimport { createSandbox } from \"./sandbox.ts\";\n\nexport async function attach(\n options: SandboxOptions & AttachOptions & RequiredAgent,\n): Promise<AttachResult> {\n options.signal?.throwIfAborted();\n invariant(\n options.agent.kind === \"cli\",\n \"This harness does not support interactive attachment\",\n );\n validateBrief(options.brief, true);\n const brief = await completeBrief(options.brief, options.signal, options.ask);\n if (brief) options = { ...options, brief };\n if (options.continuation) {\n const storage = storageFor(options.agent);\n invariant(storage, \"This adapter does not support native conversations\");\n await storage.locate(\n options.continuation.id,\n options.workspace?.repository ?? options.repository ?? process.cwd(),\n options.conversationHome,\n );\n }\n const sandbox = await createSandbox(options);\n let successful = false;\n try {\n const baseline = (\n await git(sandbox.workspace.directory, [\"rev-parse\", \"HEAD\"])\n ).trim();\n const result = await sandbox.attach(options);\n const changes = await commits(\n sandbox.workspace.directory,\n baseline,\n options.limits?.collectMs,\n );\n if (result.status === 0) await sandbox.workspace.integrate();\n const disposal = await sandbox.close({ preserve: result.status !== 0 });\n successful = true;\n return {\n ...result,\n ...disposal,\n branch: sandbox.workspace.branch,\n directory: sandbox.workspace.directory,\n commits: changes,\n };\n } finally {\n if (!successful) await sandbox.close({ preserve: true });\n }\n}\n"]}
1
+ {"version":3,"file":"attach.js","sourceRoot":"","sources":["../../src/application/attach.ts"],"names":[],"mappings":"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","sourcesContent":["import type { RequiredAgent } from \"../domain/agent.types.ts\";\nimport { invariant } from \"../domain/errors.ts\";\nimport { validateBrief } from \"../domain/prompts.ts\";\nimport { git } from \"../infrastructure/git/command.ts\";\nimport { commits } from \"../infrastructure/git/history.ts\";\nimport { storageFor } from \"./agent-storage.ts\";\nimport { completeBrief } from \"./interactive-brief.ts\";\nimport type {\n AttachOptions,\n AttachResult,\n SandboxOptions,\n} from \"./outpost.types.ts\";\nimport { createSandbox } from \"./sandbox.ts\";\n\nexport async function attach(\n options: SandboxOptions & AttachOptions & RequiredAgent,\n): Promise<AttachResult> {\n options.signal?.throwIfAborted();\n invariant(\n options.agent.kind === \"cli\",\n \"This harness does not support interactive attachment\",\n );\n invariant(\n !options.continuation || options.agent.resumable !== false,\n \"This adapter does not support continuation\",\n );\n invariant(\n !options.continuation?.fork || options.agent.forkable !== false,\n \"This adapter does not support automated fork\",\n );\n validateBrief(options.brief, true);\n const brief = await completeBrief(options.brief, options.signal, options.ask);\n if (brief) options = { ...options, brief };\n if (options.continuation) {\n const storage = storageFor(options.agent);\n invariant(storage, \"This adapter does not support native conversations\");\n await storage.locate(\n options.continuation.id,\n options.workspace?.repository ?? options.repository ?? process.cwd(),\n options.conversationHome,\n );\n }\n const sandbox = await createSandbox(options);\n let successful = false;\n try {\n const baseline = (\n await git(sandbox.workspace.directory, [\"rev-parse\", \"HEAD\"])\n ).trim();\n const result = await sandbox.attach(options);\n const changes = await commits(\n sandbox.workspace.directory,\n baseline,\n options.limits?.collectMs,\n );\n if (result.status === 0) await sandbox.workspace.integrate();\n const disposal = await sandbox.close({ preserve: result.status !== 0 });\n successful = true;\n return {\n ...result,\n ...disposal,\n branch: sandbox.workspace.branch,\n directory: sandbox.workspace.directory,\n commits: changes,\n };\n } finally {\n if (!successful) await sandbox.close({ preserve: true });\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export declare const credentialInstaller = "\nconst fs = require(\"node:fs\");\nconst path = require(\"node:path\");\nconst { randomUUID } = require(\"node:crypto\");\nconst input = JSON.parse(fs.readFileSync(0, \"utf8\"));\nfor (const file of input.files) {\n const parts = String(file.path).split(/[\\\\/]/);\n if (!path.isAbsolute(input.home) || path.isAbsolute(file.path) || parts.some((part) => part === \"\" || part === \".\" || part === \"..\"))\n throw new Error(\"Unsafe credential path: \" + file.path);\n const target = path.join(input.home, ...parts);\n fs.mkdirSync(path.dirname(target), { recursive: true, mode: 0o700 });\n const temporary = path.join(path.dirname(target), \".outpost-\" + randomUUID());\n try {\n fs.writeFileSync(temporary, file.content, { mode: 0o600, flag: \"wx\" });\n fs.chmodSync(temporary, 0o600);\n fs.renameSync(temporary, target);\n } finally {\n fs.rmSync(temporary, { force: true });\n }\n}\n";
@@ -0,0 +1,22 @@
1
+ export const credentialInstaller = `
2
+ const fs = require("node:fs");
3
+ const path = require("node:path");
4
+ const { randomUUID } = require("node:crypto");
5
+ const input = JSON.parse(fs.readFileSync(0, "utf8"));
6
+ for (const file of input.files) {
7
+ const parts = String(file.path).split(/[\\\\/]/);
8
+ if (!path.isAbsolute(input.home) || path.isAbsolute(file.path) || parts.some((part) => part === "" || part === "." || part === ".."))
9
+ throw new Error("Unsafe credential path: " + file.path);
10
+ const target = path.join(input.home, ...parts);
11
+ fs.mkdirSync(path.dirname(target), { recursive: true, mode: 0o700 });
12
+ const temporary = path.join(path.dirname(target), ".outpost-" + randomUUID());
13
+ try {
14
+ fs.writeFileSync(temporary, file.content, { mode: 0o600, flag: "wx" });
15
+ fs.chmodSync(temporary, 0o600);
16
+ fs.renameSync(temporary, target);
17
+ } finally {
18
+ fs.rmSync(temporary, { force: true });
19
+ }
20
+ }
21
+ `;
22
+ //# sourceMappingURL=credential-installer.constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-installer.constants.js","sourceRoot":"","sources":["../../src/application/credential-installer.constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;CAoBlC,CAAC","sourcesContent":["export const credentialInstaller = `\nconst fs = require(\"node:fs\");\nconst path = require(\"node:path\");\nconst { randomUUID } = require(\"node:crypto\");\nconst input = JSON.parse(fs.readFileSync(0, \"utf8\"));\nfor (const file of input.files) {\n const parts = String(file.path).split(/[\\\\\\\\/]/);\n if (!path.isAbsolute(input.home) || path.isAbsolute(file.path) || parts.some((part) => part === \"\" || part === \".\" || part === \"..\"))\n throw new Error(\"Unsafe credential path: \" + file.path);\n const target = path.join(input.home, ...parts);\n fs.mkdirSync(path.dirname(target), { recursive: true, mode: 0o700 });\n const temporary = path.join(path.dirname(target), \".outpost-\" + randomUUID());\n try {\n fs.writeFileSync(temporary, file.content, { mode: 0o600, flag: \"wx\" });\n fs.chmodSync(temporary, 0o600);\n fs.renameSync(temporary, target);\n } finally {\n fs.rmSync(temporary, { force: true });\n }\n}\n`;\n"]}
@@ -1,4 +1,7 @@
1
1
  import { invariant, OutpostError } from "../domain/errors.js";
2
+ import { harnessBudget } from "./harness-budget.js";
3
+ import { harnessModelProvider } from "./harness-model-provider.js";
4
+ import { MAX_DELEGATION_DEPTH } from "../domain/subagent.constants.js";
2
5
  import { addUsage } from "../domain/usage.js";
3
6
  import { activityWatchdog } from "./activity-watchdog.js";
4
7
  import { executionDefaults } from "./execution.constants.js";
@@ -6,6 +9,7 @@ import { openTranscript } from "../infrastructure/conversations/harness-transcri
6
9
  import { storageFor } from "./agent-storage.js";
7
10
  import { harnessHistory } from "./harness-history.js";
8
11
  import { harnessLoop } from "./harness-loop.js";
12
+ import { stopReason } from "./stop-reason.js";
9
13
  import { notify } from "./observation.js";
10
14
  export async function customTurn(lease, agent, prompt, options, pass, context) {
11
15
  const start = Date.now();
@@ -29,58 +33,31 @@ export async function customTurn(lease, agent, prompt, options, pass, context) {
29
33
  watchdog.refresh(false);
30
34
  notify(options.observe, { ...event, pass, at: new Date().toISOString() });
31
35
  };
32
- const provider = agent.harness.modelProvider;
33
- const scoped = (request) => {
34
- const { reasoning, maxOutputTokens } = agent.model;
35
- return {
36
- ...(reasoning === undefined ? {} : { reasoning }),
37
- ...(maxOutputTokens === undefined ? {} : { maxOutputTokens }),
38
- ...request,
39
- signal,
36
+ const budget = harnessBudget(agent.harness.limits);
37
+ const account = (result, subagentId) => {
38
+ const tokens = result.usage ?? {
39
+ input: 0,
40
+ cached: 0,
41
+ output: 0,
42
+ complete: false,
40
43
  };
41
- };
42
- const account = (result) => {
43
- signal.throwIfAborted();
44
- invariant(result && typeof result.text === "string", "Model provider must return text");
45
- if (result.usage) {
46
- usage = addUsage(usage, result.usage);
47
- notify(options.observe, {
48
- kind: "usage",
49
- tokens: result.usage,
50
- pass,
51
- at: new Date().toISOString(),
52
- });
53
- }
44
+ usage = addUsage(usage, tokens);
45
+ notify(options.observe, {
46
+ kind: "usage",
47
+ tokens,
48
+ ...(subagentId ? { subagentId } : {}),
49
+ pass,
50
+ at: new Date().toISOString(),
51
+ });
54
52
  watchdog.refresh(false);
55
- return result;
56
- };
57
- async function* stream(request) {
58
- signal.throwIfAborted();
59
- let finish;
60
- track(new Promise((resolve) => (finish = resolve)));
61
- try {
62
- for await (const event of provider.stream(scoped(request))) {
63
- signal.throwIfAborted();
64
- watchdog.refresh(false);
65
- yield event.type === "result"
66
- ? { type: "result", result: account(event.result) }
67
- : event;
68
- }
69
- }
70
- finally {
71
- finish();
72
- }
73
- }
74
- const modelProvider = {
75
- name: provider.name,
76
- ...(provider.stream ? { stream } : {}),
77
- request(request) {
78
- return track((async () => {
79
- signal.throwIfAborted();
80
- return account(await provider.request(scoped(request)));
81
- })());
82
- },
83
53
  };
54
+ const modelScope = { track, account };
55
+ const modelProvider = harnessModelProvider({
56
+ agent,
57
+ signal,
58
+ budget,
59
+ ...modelScope,
60
+ });
84
61
  const sandbox = {
85
62
  root: lease.root,
86
63
  home: lease.home,
@@ -138,6 +115,16 @@ export async function customTurn(lease, agent, prompt, options, pass, context) {
138
115
  emit({ kind: "conversation", id: transcript.id });
139
116
  const text = await harnessLoop({
140
117
  agent,
118
+ repository: context.repository,
119
+ ...(transcript ? { conversation: transcript.id } : {}),
120
+ budget,
121
+ modelScope,
122
+ permissions: agent.harness.permissions
123
+ ? [agent.harness.permissions]
124
+ : [],
125
+ depth: 0,
126
+ maxDepth: agent.harness.limits.maxDelegationDepth ?? MAX_DELEGATION_DEPTH,
127
+ verbose: options.observation?.verbose ?? false,
141
128
  tools: context.repair
142
129
  ? agent.harness.tools.filter((tool) => tool.readOnly)
143
130
  : agent.harness.tools,
@@ -176,6 +163,14 @@ export async function customTurn(lease, agent, prompt, options, pass, context) {
176
163
  };
177
164
  }
178
165
  catch (error) {
166
+ const reason = stopReason(options.signal, controller.signal.reason, error);
167
+ if (reason)
168
+ notify(options.observe, {
169
+ kind: "stopped",
170
+ reason,
171
+ pass,
172
+ at: new Date().toISOString(),
173
+ });
179
174
  signal.throwIfAborted();
180
175
  throw error;
181
176
  }
@@ -1 +1 @@
1
- {"version":3,"file":"custom-turn.js","sourceRoot":"","sources":["../../src/application/custom-turn.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentEvent, CustomAgent, Usage } from \"../domain/agent.types.ts\";\nimport type {\n ModelProvider,\n ModelRequest,\n ModelResult,\n ModelStreamEvent,\n} from \"../domain/model.types.ts\";\nimport type { SandboxLease } from \"../domain/sandbox.types.ts\";\nimport { invariant, OutpostError } from \"../domain/errors.ts\";\nimport { addUsage } from \"../domain/usage.ts\";\nimport { activityWatchdog } from \"./activity-watchdog.ts\";\nimport { executionDefaults } from \"./execution.constants.ts\";\nimport type { DispatchOptions, Turn } from \"./execution.types.ts\";\nimport { openTranscript } from \"../infrastructure/conversations/harness-transcript.ts\";\nimport type { TranscriptHandle } from \"../infrastructure/conversations/harness-transcript.types.ts\";\nimport { storageFor } from \"./agent-storage.ts\";\nimport { harnessHistory } from \"./harness-history.ts\";\nimport { harnessLoop } from \"./harness-loop.ts\";\nimport type { CustomTurnContext } from \"./harness.types.ts\";\nimport { notify } from \"./observation.ts\";\n\nexport async function customTurn(\n lease: SandboxLease,\n agent: CustomAgent,\n prompt: string,\n options: DispatchOptions<unknown>,\n pass: number,\n context: CustomTurnContext,\n): Promise<Turn> {\n const start = Date.now();\n const controller = new AbortController();\n const signal = options.signal\n ? AbortSignal.any([options.signal, controller.signal])\n : controller.signal;\n const watchdog = activityWatchdog(controller, options, pass);\n const timer = setTimeout(\n () =>\n controller.abort(\n new OutpostError(\"timeout\", \"Harness execution timed out\"),\n ),\n options.deadlineMs ?? executionDefaults.deadlineMs,\n );\n let usage: Usage = { input: 0, cached: 0, output: 0 };\n const pending = new Set<Promise<unknown>>();\n const track = <T>(operation: Promise<T>): Promise<T> => {\n pending.add(operation);\n void operation\n .finally(() => pending.delete(operation))\n .catch(() => undefined);\n return operation;\n };\n const emit = (event: AgentEvent) => {\n signal.throwIfAborted();\n watchdog.refresh(false);\n notify(options.observe, { ...event, pass, at: new Date().toISOString() });\n };\n const provider = agent.harness.modelProvider;\n const scoped = (request: ModelRequest): ModelRequest => {\n const { reasoning, maxOutputTokens } = agent.model;\n return {\n ...(reasoning === undefined ? {} : { reasoning }),\n ...(maxOutputTokens === undefined ? {} : { maxOutputTokens }),\n ...request,\n signal,\n };\n };\n const account = (result: ModelResult): ModelResult => {\n signal.throwIfAborted();\n invariant(\n result && typeof result.text === \"string\",\n \"Model provider must return text\",\n );\n if (result.usage) {\n usage = addUsage(usage, result.usage);\n notify(options.observe, {\n kind: \"usage\",\n tokens: result.usage,\n pass,\n at: new Date().toISOString(),\n });\n }\n watchdog.refresh(false);\n return result;\n };\n async function* stream(\n request: ModelRequest,\n ): AsyncGenerator<ModelStreamEvent> {\n signal.throwIfAborted();\n let finish!: () => void;\n track(new Promise<void>((resolve) => (finish = resolve)));\n try {\n for await (const event of provider.stream!(scoped(request))) {\n signal.throwIfAborted();\n watchdog.refresh(false);\n yield event.type === \"result\"\n ? { type: \"result\", result: account(event.result) }\n : event;\n }\n } finally {\n finish();\n }\n }\n const modelProvider: ModelProvider = {\n name: provider.name,\n ...(provider.stream ? { stream } : {}),\n request(request) {\n return track(\n (async () => {\n signal.throwIfAborted();\n return account(await provider.request(scoped(request)));\n })(),\n );\n },\n };\n const sandbox: SandboxLease = {\n root: lease.root,\n home: lease.home,\n invoke: (command) => {\n signal.throwIfAborted();\n return track(\n lease.invoke({\n ...command,\n observe(channel, chunk) {\n watchdog.refresh(false);\n notify((value) => command.observe?.(channel, value), chunk);\n },\n signal: command.signal\n ? AbortSignal.any([command.signal, signal])\n : signal,\n }),\n );\n },\n upload: (source, destination, settings = {}) => {\n signal.throwIfAborted();\n return track(\n lease.upload(source, destination, {\n ...settings,\n signal: settings.signal\n ? AbortSignal.any([settings.signal, signal])\n : signal,\n }),\n );\n },\n download: (source, destination, settings = {}) => {\n signal.throwIfAborted();\n return track(\n lease.download(source, destination, {\n ...settings,\n signal: settings.signal\n ? AbortSignal.any([settings.signal, signal])\n : signal,\n }),\n );\n },\n release: async () => {\n throw new OutpostError(\n \"configuration\",\n \"The harness does not own its sandbox lease\",\n );\n },\n };\n let transcript: TranscriptHandle | undefined;\n try {\n signal.throwIfAborted();\n watchdog.refresh(false);\n const storage = storageFor(agent);\n transcript = storage\n ? await openTranscript({\n repository: context.repository,\n store: storage,\n model: agent.model.name,\n ...(context.continuation\n ? { continuation: context.continuation }\n : {}),\n })\n : undefined;\n if (transcript) emit({ kind: \"conversation\", id: transcript.id });\n const text = await harnessLoop(\n {\n agent,\n tools: context.repair\n ? agent.harness.tools.filter((tool) => tool.readOnly)\n : agent.harness.tools,\n modelProvider,\n sandbox,\n signal,\n emit,\n hold: () => watchdog.hold(),\n },\n prompt,\n harnessHistory(transcript),\n );\n signal.throwIfAborted();\n for (const value of [\n usage.input,\n usage.cached,\n usage.output,\n usage.cacheCreated ?? 0,\n ])\n invariant(\n Number.isSafeInteger(value) && value >= 0,\n \"Harness usage must contain nonnegative token counts\",\n );\n invariant(\n usage.cached + (usage.cacheCreated ?? 0) <= usage.input,\n \"Cached tokens must be included in input usage\",\n );\n notify(options.observe, {\n kind: \"result\",\n text,\n pass,\n at: new Date().toISOString(),\n });\n notify(options.observe, {\n kind: \"finished\",\n pass,\n at: new Date().toISOString(),\n });\n return {\n text,\n usage,\n status: 0,\n durationMs: Date.now() - start,\n ...(transcript ? { conversation: transcript.id } : {}),\n };\n } catch (error) {\n signal.throwIfAborted();\n throw error;\n } finally {\n await transcript?.close();\n controller.abort(new OutpostError(\"aborted\", \"Harness turn ended\"));\n clearTimeout(timer);\n watchdog.close();\n await Promise.allSettled([...pending]);\n }\n}\n"]}
1
+ {"version":3,"file":"custom-turn.js","sourceRoot":"","sources":["../../src/application/custom-turn.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentEvent, CustomAgent, Usage } from \"../domain/agent.types.ts\";\nimport type { ModelResult } from \"../domain/model.types.ts\";\nimport type { SandboxLease } from \"../domain/sandbox.types.ts\";\nimport { invariant, OutpostError } from \"../domain/errors.ts\";\nimport { harnessBudget } from \"./harness-budget.ts\";\nimport { harnessModelProvider } from \"./harness-model-provider.ts\";\nimport { MAX_DELEGATION_DEPTH } from \"../domain/subagent.constants.ts\";\nimport { addUsage } from \"../domain/usage.ts\";\nimport { activityWatchdog } from \"./activity-watchdog.ts\";\nimport { executionDefaults } from \"./execution.constants.ts\";\nimport type { DispatchOptions, Turn } from \"./execution.types.ts\";\nimport { openTranscript } from \"../infrastructure/conversations/harness-transcript.ts\";\nimport type { TranscriptHandle } from \"../infrastructure/conversations/harness-transcript.types.ts\";\nimport { storageFor } from \"./agent-storage.ts\";\nimport { harnessHistory } from \"./harness-history.ts\";\nimport { harnessLoop } from \"./harness-loop.ts\";\nimport type { CustomTurnContext } from \"./harness.types.ts\";\nimport { stopReason } from \"./stop-reason.ts\";\nimport { notify } from \"./observation.ts\";\n\nexport async function customTurn(\n lease: SandboxLease,\n agent: CustomAgent,\n prompt: string,\n options: DispatchOptions<unknown>,\n pass: number,\n context: CustomTurnContext,\n): Promise<Turn> {\n const start = Date.now();\n const controller = new AbortController();\n const signal = options.signal\n ? AbortSignal.any([options.signal, controller.signal])\n : controller.signal;\n const watchdog = activityWatchdog(controller, options, pass);\n const timer = setTimeout(\n () =>\n controller.abort(\n new OutpostError(\"timeout\", \"Harness execution timed out\"),\n ),\n options.deadlineMs ?? executionDefaults.deadlineMs,\n );\n let usage: Usage = { input: 0, cached: 0, output: 0 };\n const pending = new Set<Promise<unknown>>();\n const track = <T>(operation: Promise<T>): Promise<T> => {\n pending.add(operation);\n void operation\n .finally(() => pending.delete(operation))\n .catch(() => undefined);\n return operation;\n };\n const emit = (event: AgentEvent) => {\n signal.throwIfAborted();\n watchdog.refresh(false);\n notify(options.observe, { ...event, pass, at: new Date().toISOString() });\n };\n const budget = harnessBudget(agent.harness.limits);\n const account = (result: ModelResult, subagentId?: string): void => {\n const tokens = result.usage ?? {\n input: 0,\n cached: 0,\n output: 0,\n complete: false,\n };\n usage = addUsage(usage, tokens);\n notify(options.observe, {\n kind: \"usage\",\n tokens,\n ...(subagentId ? { subagentId } : {}),\n pass,\n at: new Date().toISOString(),\n });\n watchdog.refresh(false);\n };\n const modelScope = { track, account };\n const modelProvider = harnessModelProvider({\n agent,\n signal,\n budget,\n ...modelScope,\n });\n const sandbox: SandboxLease = {\n root: lease.root,\n home: lease.home,\n invoke: (command) => {\n signal.throwIfAborted();\n return track(\n lease.invoke({\n ...command,\n observe(channel, chunk) {\n watchdog.refresh(false);\n notify((value) => command.observe?.(channel, value), chunk);\n },\n signal: command.signal\n ? AbortSignal.any([command.signal, signal])\n : signal,\n }),\n );\n },\n upload: (source, destination, settings = {}) => {\n signal.throwIfAborted();\n return track(\n lease.upload(source, destination, {\n ...settings,\n signal: settings.signal\n ? AbortSignal.any([settings.signal, signal])\n : signal,\n }),\n );\n },\n download: (source, destination, settings = {}) => {\n signal.throwIfAborted();\n return track(\n lease.download(source, destination, {\n ...settings,\n signal: settings.signal\n ? AbortSignal.any([settings.signal, signal])\n : signal,\n }),\n );\n },\n release: async () => {\n throw new OutpostError(\n \"configuration\",\n \"The harness does not own its sandbox lease\",\n );\n },\n };\n let transcript: TranscriptHandle | undefined;\n try {\n signal.throwIfAborted();\n watchdog.refresh(false);\n const storage = storageFor(agent);\n transcript = storage\n ? await openTranscript({\n repository: context.repository,\n store: storage,\n model: agent.model.name,\n ...(context.continuation\n ? { continuation: context.continuation }\n : {}),\n })\n : undefined;\n if (transcript) emit({ kind: \"conversation\", id: transcript.id });\n const text = await harnessLoop(\n {\n agent,\n repository: context.repository,\n ...(transcript ? { conversation: transcript.id } : {}),\n budget,\n modelScope,\n permissions: agent.harness.permissions\n ? [agent.harness.permissions]\n : [],\n depth: 0,\n maxDepth:\n agent.harness.limits.maxDelegationDepth ?? MAX_DELEGATION_DEPTH,\n verbose: options.observation?.verbose ?? false,\n tools: context.repair\n ? agent.harness.tools.filter((tool) => tool.readOnly)\n : agent.harness.tools,\n modelProvider,\n sandbox,\n signal,\n emit,\n hold: () => watchdog.hold(),\n },\n prompt,\n harnessHistory(transcript),\n );\n signal.throwIfAborted();\n for (const value of [\n usage.input,\n usage.cached,\n usage.output,\n usage.cacheCreated ?? 0,\n ])\n invariant(\n Number.isSafeInteger(value) && value >= 0,\n \"Harness usage must contain nonnegative token counts\",\n );\n invariant(\n usage.cached + (usage.cacheCreated ?? 0) <= usage.input,\n \"Cached tokens must be included in input usage\",\n );\n notify(options.observe, {\n kind: \"result\",\n text,\n pass,\n at: new Date().toISOString(),\n });\n notify(options.observe, {\n kind: \"finished\",\n pass,\n at: new Date().toISOString(),\n });\n return {\n text,\n usage,\n status: 0,\n durationMs: Date.now() - start,\n ...(transcript ? { conversation: transcript.id } : {}),\n };\n } catch (error) {\n const reason = stopReason(options.signal, controller.signal.reason, error);\n if (reason)\n notify(options.observe, {\n kind: \"stopped\",\n reason,\n pass,\n at: new Date().toISOString(),\n });\n signal.throwIfAborted();\n throw error;\n } finally {\n await transcript?.close();\n controller.abort(new OutpostError(\"aborted\", \"Harness turn ended\"));\n clearTimeout(timer);\n watchdog.close();\n await Promise.allSettled([...pending]);\n }\n}\n"]}
@@ -1,3 +1,3 @@
1
1
  import type { ObservedDispatchResult } from "./dispatch-observation.types.ts";
2
2
  import type { DispatchOptions } from "./execution.types.ts";
3
- export declare function observeDispatch<T, R extends ObservedDispatchResult>(options: DispatchOptions<T>, action: (options: DispatchOptions<T>) => Promise<R>): Promise<R>;
3
+ export declare function observeDispatch<T, R extends ObservedDispatchResult>(options: DispatchOptions<T>, action: (options: DispatchOptions<T>) => Promise<R>, repository?: string): Promise<R>;
@@ -1,18 +1,84 @@
1
- import { OutpostError } from "../domain/errors.js";
1
+ import { access } from "node:fs/promises";
2
+ import { randomUUID } from "node:crypto";
3
+ import { agentObservation } from "../domain/agent-observation.js";
4
+ import { createObservationHub } from "../domain/observation.js";
5
+ import { recordRecovery, recoveryDetails, OutpostError, } from "../domain/errors.js";
2
6
  import { addUsage } from "../domain/usage.js";
3
- import { notify } from "./observation.js";
4
- export function observeDispatch(options, action) {
5
- if (!options.telemetry)
7
+ import { journal } from "../infrastructure/journal.js";
8
+ const active = new WeakSet();
9
+ export async function observeDispatch(options, action, repository = process.cwd()) {
10
+ if (options.observation && active.has(options.observation))
6
11
  return action(options);
12
+ const root = options.observation ?? createObservationHub();
13
+ const failures = [];
14
+ let log;
7
15
  let session;
8
- notify(() => {
16
+ const initialized = (async () => {
17
+ try {
18
+ await access(repository);
19
+ log = await journal(repository, options.logging, options.label, false);
20
+ }
21
+ catch (error) {
22
+ failures.push(error);
23
+ }
24
+ })();
25
+ try {
9
26
  session = options.telemetry?.startDispatch();
10
- }, undefined);
27
+ }
28
+ catch (error) {
29
+ failures.push(error);
30
+ }
31
+ const observation = root.child({ dispatchId: randomUUID() }, [
32
+ {
33
+ async observe(value) {
34
+ await initialized;
35
+ await log?.record({
36
+ ...value.event,
37
+ seq: value.seq,
38
+ at: value.at,
39
+ source: value.source,
40
+ scope: value.scope,
41
+ });
42
+ },
43
+ async flush() {
44
+ await initialized;
45
+ await log?.close();
46
+ },
47
+ },
48
+ {
49
+ observe(value) {
50
+ if (value.event.kind === "warning")
51
+ return options.warn?.(value.event.message);
52
+ },
53
+ },
54
+ {
55
+ observe(value) {
56
+ if (value.source !== "agent" && value.source !== "harness")
57
+ return;
58
+ const event = agentObservation(value);
59
+ if (event)
60
+ return options.observe?.(event);
61
+ },
62
+ async flush() {
63
+ const observer = options.observe;
64
+ if (observer &&
65
+ "flush" in observer &&
66
+ typeof observer.flush === "function")
67
+ await observer.flush();
68
+ },
69
+ },
70
+ ]);
71
+ active.add(observation);
72
+ observation.emit("sandbox", { kind: "dispatch-start" });
11
73
  const empty = () => ({ input: 0, cached: 0, output: 0 });
12
74
  let previous = empty(), current = empty();
13
75
  const { telemetry: _telemetry, ...settings } = options;
14
76
  const observed = {
15
77
  ...settings,
78
+ observation,
79
+ warn(message) {
80
+ observation.emit("agent", { kind: "warning", message });
81
+ },
16
82
  observe(event) {
17
83
  if (event.kind === "phase" && event.name === "preparing prompt") {
18
84
  previous = addUsage(previous, current);
@@ -22,30 +88,84 @@ export function observeDispatch(options, action) {
22
88
  current = addUsage(current, event.tokens);
23
89
  if (event.kind === "summary")
24
90
  current = event.tokens;
25
- notify(options.observe, event);
91
+ observation
92
+ .child({
93
+ pass: event.pass,
94
+ ...(event.subagentId ? { subagentId: event.subagentId } : {}),
95
+ })
96
+ .emit(options.agent?.kind === "custom" ? "harness" : "agent", event);
26
97
  },
27
98
  };
28
- return settle();
29
- async function settle() {
99
+ try {
100
+ const result = await action(observed);
101
+ observation.emit("sandbox", {
102
+ kind: "dispatch-finished",
103
+ status: "done",
104
+ completed: result.completed,
105
+ usage: result.usage,
106
+ ...(result.branch ? { branch: result.branch } : {}),
107
+ ...(result.commits ? { commits: result.commits } : {}),
108
+ });
30
109
  try {
31
- const result = await action(observed);
32
- notify(() => session?.finish({
110
+ session?.finish({
33
111
  status: "done",
34
112
  usage: result.usage,
35
113
  completed: result.completed,
36
- }), undefined);
37
- return result;
114
+ });
38
115
  }
39
116
  catch (error) {
40
- const cancelled = (options.signal?.aborted && error === options.signal.reason) ||
41
- (error instanceof OutpostError && error.code === "aborted") ||
42
- (error instanceof Error && error.name === "AbortError");
43
- notify(() => session?.finish({
44
- status: cancelled ? "cancelled" : "failed",
45
- usage: addUsage(previous, current),
46
- }), undefined);
47
- throw error;
117
+ failures.push(error);
118
+ }
119
+ await finish();
120
+ return {
121
+ ...result,
122
+ ...(log?.reference ? { logReference: log.reference } : {}),
123
+ observerErrors: [...failures, ...observation.errors],
124
+ };
125
+ }
126
+ catch (error) {
127
+ const cancelled = options.signal?.aborted ||
128
+ (error instanceof OutpostError && error.code === "aborted") ||
129
+ (error instanceof Error && error.name === "AbortError");
130
+ const status = cancelled ? "cancelled" : "failed";
131
+ const usage = addUsage(previous, current);
132
+ const recovery = recoveryDetails(error);
133
+ observation.emit("sandbox", {
134
+ kind: "dispatch-finished",
135
+ status,
136
+ completed: false,
137
+ ...(typeof recovery?.branch === "string"
138
+ ? { branch: recovery.branch }
139
+ : {}),
140
+ ...(Array.isArray(recovery?.commits) && recovery.commits.every(isCommit)
141
+ ? { commits: recovery.commits }
142
+ : {}),
143
+ usage,
144
+ });
145
+ try {
146
+ session?.finish({ status, usage });
147
+ }
148
+ catch (failure) {
149
+ failures.push(failure);
48
150
  }
151
+ await finish();
152
+ recordRecovery(error, {
153
+ observerErrors: [...failures, ...observation.errors],
154
+ ...(log?.reference ? { logReference: log.reference } : {}),
155
+ });
156
+ throw error;
49
157
  }
158
+ async function finish() {
159
+ await observation.close();
160
+ active.delete(observation);
161
+ }
162
+ }
163
+ function isCommit(value) {
164
+ return (typeof value === "object" &&
165
+ value !== null &&
166
+ "oid" in value &&
167
+ typeof value.oid === "string" &&
168
+ "subject" in value &&
169
+ typeof value.subject === "string");
50
170
  }
51
171
  //# sourceMappingURL=dispatch-observation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch-observation.js","sourceRoot":"","sources":["../../src/application/dispatch-observation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,MAAM,UAAU,eAAe,CAC7B,OAA2B,EAC3B,MAAmD;IAEnD,IAAI,CAAC,OAAO,CAAC,SAAS;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,OAA6C,CAAC;IAClD,MAAM,CAAC,GAAG,EAAE;QACV,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,aAAa,EAAE,CAAC;IAC/C,CAAC,EAAE,SAAS,CAAC,CAAC;IACd,MAAM,KAAK,GAAG,GAAU,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IAChE,IAAI,QAAQ,GAAG,KAAK,EAAE,EACpB,OAAO,GAAG,KAAK,EAAE,CAAC;IACpB,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,QAAQ,EAAE,GAAG,OAAO,CAAC;IACvD,MAAM,QAAQ,GAAuB;QACnC,GAAG,QAAQ;QACX,OAAO,CAAC,KAAK;YACX,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBAChE,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACvC,OAAO,GAAG,KAAK,EAAE,CAAC;YACpB,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;gBAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YACtE,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;gBAAE,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;YACrD,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;KACF,CAAC;IACF,OAAO,MAAM,EAAE,CAAC;IAEhB,KAAK,UAAU,MAAM;QACnB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;YACtC,MAAM,CACJ,GAAG,EAAE,CACH,OAAO,EAAE,MAAM,CAAC;gBACd,MAAM,EAAE,MAAM;gBACd,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B,CAAC,EACJ,SAAS,CACV,CAAC;YACF,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,SAAS,GACb,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,IAAI,KAAK,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;gBAC5D,CAAC,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC;gBAC3D,CAAC,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;YAC1D,MAAM,CACJ,GAAG,EAAE,CACH,OAAO,EAAE,MAAM,CAAC;gBACd,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ;gBAC1C,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;aACnC,CAAC,EACJ,SAAS,CACV,CAAC;YACF,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import type { Usage } from \"../domain/agent.types.ts\";\nimport type { DispatchTelemetrySession } from \"../domain/dispatch-telemetry.types.ts\";\nimport { OutpostError } from \"../domain/errors.ts\";\nimport { addUsage } from \"../domain/usage.ts\";\nimport type { ObservedDispatchResult } from \"./dispatch-observation.types.ts\";\nimport type { DispatchOptions } from \"./execution.types.ts\";\nimport { notify } from \"./observation.ts\";\n\nexport function observeDispatch<T, R extends ObservedDispatchResult>(\n options: DispatchOptions<T>,\n action: (options: DispatchOptions<T>) => Promise<R>,\n): Promise<R> {\n if (!options.telemetry) return action(options);\n let session: DispatchTelemetrySession | undefined;\n notify(() => {\n session = options.telemetry?.startDispatch();\n }, undefined);\n const empty = (): Usage => ({ input: 0, cached: 0, output: 0 });\n let previous = empty(),\n current = empty();\n const { telemetry: _telemetry, ...settings } = options;\n const observed: DispatchOptions<T> = {\n ...settings,\n observe(event) {\n if (event.kind === \"phase\" && event.name === \"preparing prompt\") {\n previous = addUsage(previous, current);\n current = empty();\n }\n if (event.kind === \"usage\") current = addUsage(current, event.tokens);\n if (event.kind === \"summary\") current = event.tokens;\n notify(options.observe, event);\n },\n };\n return settle();\n\n async function settle(): Promise<R> {\n try {\n const result = await action(observed);\n notify(\n () =>\n session?.finish({\n status: \"done\",\n usage: result.usage,\n completed: result.completed,\n }),\n undefined,\n );\n return result;\n } catch (error) {\n const cancelled =\n (options.signal?.aborted && error === options.signal.reason) ||\n (error instanceof OutpostError && error.code === \"aborted\") ||\n (error instanceof Error && error.name === \"AbortError\");\n notify(\n () =>\n session?.finish({\n status: cancelled ? \"cancelled\" : \"failed\",\n usage: addUsage(previous, current),\n }),\n undefined,\n );\n throw error;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"dispatch-observation.js","sourceRoot":"","sources":["../../src/application/dispatch-observation.ts"],"names":[],"mappings":"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","sourcesContent":["import { access } from \"node:fs/promises\";\nimport { randomUUID } from \"node:crypto\";\nimport { agentObservation } from \"../domain/agent-observation.ts\";\nimport type { Usage } from \"../domain/agent.types.ts\";\nimport type { DispatchTelemetrySession } from \"../domain/dispatch-telemetry.types.ts\";\nimport type { ObservationHub } from \"../domain/observation.types.ts\";\nimport { createObservationHub } from \"../domain/observation.ts\";\nimport {\n recordRecovery,\n recoveryDetails,\n OutpostError,\n} from \"../domain/errors.ts\";\nimport { addUsage } from \"../domain/usage.ts\";\nimport { journal } from \"../infrastructure/journal.ts\";\nimport type { Journal } from \"../infrastructure/journal.types.ts\";\nimport type { ObservedDispatchResult } from \"./dispatch-observation.types.ts\";\nimport type { DispatchOptions } from \"./execution.types.ts\";\n\nconst active = new WeakSet<ObservationHub>();\n\nexport async function observeDispatch<T, R extends ObservedDispatchResult>(\n options: DispatchOptions<T>,\n action: (options: DispatchOptions<T>) => Promise<R>,\n repository = process.cwd(),\n): Promise<R> {\n if (options.observation && active.has(options.observation))\n return action(options);\n const root = options.observation ?? createObservationHub();\n const failures: unknown[] = [];\n let log: Journal | undefined;\n let session: DispatchTelemetrySession | undefined;\n const initialized = (async () => {\n try {\n await access(repository);\n log = await journal(repository, options.logging, options.label, false);\n } catch (error) {\n failures.push(error);\n }\n })();\n try {\n session = options.telemetry?.startDispatch();\n } catch (error) {\n failures.push(error);\n }\n const observation = root.child({ dispatchId: randomUUID() }, [\n {\n async observe(value) {\n await initialized;\n await log?.record({\n ...value.event,\n seq: value.seq,\n at: value.at,\n source: value.source,\n scope: value.scope,\n });\n },\n async flush() {\n await initialized;\n await log?.close();\n },\n },\n {\n observe(value) {\n if (value.event.kind === \"warning\")\n return options.warn?.(value.event.message);\n },\n },\n {\n observe(value) {\n if (value.source !== \"agent\" && value.source !== \"harness\") return;\n const event = agentObservation(value);\n if (event) return options.observe?.(event);\n },\n async flush() {\n const observer = options.observe;\n if (\n observer &&\n \"flush\" in observer &&\n typeof observer.flush === \"function\"\n )\n await observer.flush();\n },\n },\n ]);\n active.add(observation);\n observation.emit(\"sandbox\", { kind: \"dispatch-start\" });\n const empty = (): Usage => ({ input: 0, cached: 0, output: 0 });\n let previous = empty(),\n current = empty();\n const { telemetry: _telemetry, ...settings } = options;\n const observed: DispatchOptions<T> = {\n ...settings,\n observation,\n warn(message) {\n observation.emit(\"agent\", { kind: \"warning\", message });\n },\n observe(event) {\n if (event.kind === \"phase\" && event.name === \"preparing prompt\") {\n previous = addUsage(previous, current);\n current = empty();\n }\n if (event.kind === \"usage\") current = addUsage(current, event.tokens);\n if (event.kind === \"summary\") current = event.tokens;\n observation\n .child({\n pass: event.pass,\n ...(event.subagentId ? { subagentId: event.subagentId } : {}),\n })\n .emit(options.agent?.kind === \"custom\" ? \"harness\" : \"agent\", event);\n },\n };\n try {\n const result = await action(observed);\n observation.emit(\"sandbox\", {\n kind: \"dispatch-finished\",\n status: \"done\",\n completed: result.completed,\n usage: result.usage,\n ...(result.branch ? { branch: result.branch } : {}),\n ...(result.commits ? { commits: result.commits } : {}),\n });\n try {\n session?.finish({\n status: \"done\",\n usage: result.usage,\n completed: result.completed,\n });\n } catch (error) {\n failures.push(error);\n }\n await finish();\n return {\n ...result,\n ...(log?.reference ? { logReference: log.reference } : {}),\n observerErrors: [...failures, ...observation.errors],\n };\n } catch (error) {\n const cancelled =\n options.signal?.aborted ||\n (error instanceof OutpostError && error.code === \"aborted\") ||\n (error instanceof Error && error.name === \"AbortError\");\n const status = cancelled ? \"cancelled\" : \"failed\";\n const usage = addUsage(previous, current);\n const recovery = recoveryDetails(error);\n observation.emit(\"sandbox\", {\n kind: \"dispatch-finished\",\n status,\n completed: false,\n ...(typeof recovery?.branch === \"string\"\n ? { branch: recovery.branch }\n : {}),\n ...(Array.isArray(recovery?.commits) && recovery.commits.every(isCommit)\n ? { commits: recovery.commits }\n : {}),\n usage,\n });\n try {\n session?.finish({ status, usage });\n } catch (failure) {\n failures.push(failure);\n }\n await finish();\n recordRecovery(error, {\n observerErrors: [...failures, ...observation.errors],\n ...(log?.reference ? { logReference: log.reference } : {}),\n });\n throw error;\n }\n async function finish(): Promise<void> {\n await observation.close();\n active.delete(observation);\n }\n}\n\nfunction isCommit(\n value: unknown,\n): value is import(\"../domain/workspace.types.ts\").Commit {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"oid\" in value &&\n typeof value.oid === \"string\" &&\n \"subject\" in value &&\n typeof value.subject === \"string\"\n );\n}\n"]}
@@ -1,5 +1,7 @@
1
1
  import type { Usage } from "../domain/agent.types.ts";
2
2
  export interface ObservedDispatchResult {
3
+ readonly branch?: string;
4
+ readonly commits?: readonly import("../domain/workspace.types.ts").Commit[];
3
5
  readonly usage: Usage;
4
6
  readonly completed: boolean;
5
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch-observation.types.js","sourceRoot":"","sources":["../../src/application/dispatch-observation.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Usage } from \"../domain/agent.types.ts\";\n\nexport interface ObservedDispatchResult {\n readonly usage: Usage;\n readonly completed: boolean;\n}\n"]}
1
+ {"version":3,"file":"dispatch-observation.types.js","sourceRoot":"","sources":["../../src/application/dispatch-observation.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Usage } from \"../domain/agent.types.ts\";\n\nexport interface ObservedDispatchResult {\n readonly branch?: string;\n readonly commits?: readonly import(\"../domain/workspace.types.ts\").Commit[];\n readonly usage: Usage;\n readonly completed: boolean;\n}\n"]}
@@ -24,6 +24,8 @@ export async function preflightDispatch(options, _repository, agent) {
24
24
  validateDispatch(options);
25
25
  if (options.continuation)
26
26
  invariant(agent?.resumable !== false, `${agent?.name} does not support continuation or fork in Outpost`);
27
+ if (options.continuation?.fork)
28
+ invariant(agent?.forkable !== false, `${agent?.name} does not support automated fork in Outpost`);
27
29
  if (!options.response)
28
30
  return;
29
31
  if (options.response.repairs > 0)
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch-validation.js","sourceRoot":"","sources":["../../src/application/dispatch-validation.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { Agent } from \"../domain/agent.types.ts\";\nimport { invariant, positive } from \"../domain/errors.ts\";\nimport { validateBrief } from \"../domain/prompts.ts\";\nimport { dispatchDeadlines, executionDefaults } from \"./execution.constants.ts\";\nimport type { DispatchOptions } from \"./execution.types.ts\";\n\nexport function validateDispatch(options: DispatchOptions<unknown>): void {\n options.signal?.throwIfAborted();\n validateBrief(options.brief);\n positive(options.passes ?? executionDefaults.passes, \"passes\");\n invariant(\n Number.isSafeInteger(options.passes ?? executionDefaults.passes),\n \"passes must be an integer\",\n );\n for (const key of dispatchDeadlines)\n if (options[key] !== undefined) positive(options[key], key);\n if (options.response || options.continuation)\n invariant(\n (options.passes ?? executionDefaults.passes) === 1,\n \"Structured responses and continuations require one pass\",\n );\n const markers =\n options.until === undefined\n ? []\n : typeof options.until === \"string\"\n ? [options.until]\n : options.until;\n invariant(\n markers.every((marker) => marker.length > 0),\n \"Completion markers cannot be empty\",\n );\n}\n\nexport async function preflightDispatch(\n options: DispatchOptions<unknown>,\n _repository: string,\n agent?: Agent,\n): Promise<void> {\n validateDispatch(options);\n if (options.continuation)\n invariant(\n agent?.resumable !== false,\n `${agent?.name} does not support continuation or fork in Outpost`,\n );\n if (!options.response) return;\n if (options.response.repairs > 0)\n invariant(\n agent?.resumable ?? !!(agent?.conversations || agent?.storage),\n \"Response repair requires an adapter that supports continuation\",\n );\n const brief = options.brief;\n const text = brief.text ?? (await readFile(resolve(brief.file!), \"utf8\"));\n const resolved = text.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (token, key: string) =>\n brief.values?.[key] === undefined ? token : String(brief.values[key]),\n );\n invariant(\n resolved.includes(`<${options.response.tag}>`),\n `Brief must request an opening <${options.response.tag}> tag`,\n );\n}\n"]}
1
+ {"version":3,"file":"dispatch-validation.js","sourceRoot":"","sources":["../../src/application/dispatch-validation.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { Agent } from \"../domain/agent.types.ts\";\nimport { invariant, positive } from \"../domain/errors.ts\";\nimport { validateBrief } from \"../domain/prompts.ts\";\nimport { dispatchDeadlines, executionDefaults } from \"./execution.constants.ts\";\nimport type { DispatchOptions } from \"./execution.types.ts\";\n\nexport function validateDispatch(options: DispatchOptions<unknown>): void {\n options.signal?.throwIfAborted();\n validateBrief(options.brief);\n positive(options.passes ?? executionDefaults.passes, \"passes\");\n invariant(\n Number.isSafeInteger(options.passes ?? executionDefaults.passes),\n \"passes must be an integer\",\n );\n for (const key of dispatchDeadlines)\n if (options[key] !== undefined) positive(options[key], key);\n if (options.response || options.continuation)\n invariant(\n (options.passes ?? executionDefaults.passes) === 1,\n \"Structured responses and continuations require one pass\",\n );\n const markers =\n options.until === undefined\n ? []\n : typeof options.until === \"string\"\n ? [options.until]\n : options.until;\n invariant(\n markers.every((marker) => marker.length > 0),\n \"Completion markers cannot be empty\",\n );\n}\n\nexport async function preflightDispatch(\n options: DispatchOptions<unknown>,\n _repository: string,\n agent?: Agent,\n): Promise<void> {\n validateDispatch(options);\n if (options.continuation)\n invariant(\n agent?.resumable !== false,\n `${agent?.name} does not support continuation or fork in Outpost`,\n );\n if (options.continuation?.fork)\n invariant(\n agent?.forkable !== false,\n `${agent?.name} does not support automated fork in Outpost`,\n );\n if (!options.response) return;\n if (options.response.repairs > 0)\n invariant(\n agent?.resumable ?? !!(agent?.conversations || agent?.storage),\n \"Response repair requires an adapter that supports continuation\",\n );\n const brief = options.brief;\n const text = brief.text ?? (await readFile(resolve(brief.file!), \"utf8\"));\n const resolved = text.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (token, key: string) =>\n brief.values?.[key] === undefined ? token : String(brief.values[key]),\n );\n invariant(\n resolved.includes(`<${options.response.tag}>`),\n `Brief must request an opening <${options.response.tag}> tag`,\n );\n}\n"]}
@@ -9,7 +9,7 @@ import { observeDispatch } from "./dispatch-observation.js";
9
9
  import { createSandbox } from "./sandbox.js";
10
10
  export async function dispatch(options) {
11
11
  const { telemetry: _telemetry, ...configuration } = options;
12
- return observeDispatch(options, (observed) => dispatchOperation({ ...configuration, ...observed }, options));
12
+ return observeDispatch(options, (observed) => dispatchOperation({ ...configuration, ...observed }, options), options.workspace?.repository ?? options.repository ?? process.cwd());
13
13
  }
14
14
  async function dispatchOperation(options, original) {
15
15
  options.signal?.throwIfAborted();
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/application/dispatch.ts"],"names":[],"mappings":"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","sourcesContent":["import type { RequiredAgent, Usage } from \"../domain/agent.types.ts\";\nimport { invariant, recordRecovery } from \"../domain/errors.ts\";\nimport { addUsage } from \"../domain/usage.ts\";\nimport { storageFor } from \"./agent-storage.ts\";\nimport { continuationConfiguration } from \"./continuation.ts\";\nimport { preflightDispatch } from \"./dispatch-validation.ts\";\nimport { executionDefaults } from \"./execution.constants.ts\";\nimport type { DispatchOptions } from \"./execution.types.ts\";\nimport { notify } from \"./observation.ts\";\nimport type {\n ContinuationOptions,\n DispatchResult,\n SandboxOptions,\n} from \"./outpost.types.ts\";\nimport { observeDispatch } from \"./dispatch-observation.ts\";\nimport { createSandbox } from \"./sandbox.ts\";\n\nexport async function dispatch<T = undefined>(\n options: SandboxOptions & DispatchOptions<T> & RequiredAgent,\n): Promise<DispatchResult<T>> {\n const { telemetry: _telemetry, ...configuration } = options;\n return observeDispatch(options, (observed) =>\n dispatchOperation({ ...configuration, ...observed }, options),\n );\n}\n\nasync function dispatchOperation<T>(\n options: SandboxOptions & DispatchOptions<T> & RequiredAgent,\n original: SandboxOptions & DispatchOptions<T> & RequiredAgent,\n): Promise<DispatchResult<T>> {\n options.signal?.throwIfAborted();\n await preflightDispatch(\n options,\n options.workspace?.repository ?? options.repository ?? process.cwd(),\n options.agent,\n );\n if ((options.passes ?? executionDefaults.passes) > 1) {\n const outputs: DispatchResult<T>[] = [];\n for (let index = 0; index < options.passes!; index++) {\n options.signal?.throwIfAborted();\n const output = await dispatchOperation(\n {\n ...options,\n passes: 1,\n observe: (event) =>\n notify(options.observe, { ...event, pass: index + 1 }),\n },\n original,\n );\n outputs.push(output);\n if (output.completed) break;\n }\n const last = outputs.at(-1)!;\n return {\n ...last,\n text: outputs.map((output) => output.text).join(\"\\n\"),\n turns: outputs.flatMap((output) => output.turns),\n commits: outputs.flatMap((output) => output.commits),\n usage: outputs.reduce((sum, output) => addUsage(sum, output.usage), {\n input: 0,\n cached: 0,\n output: 0,\n } as Usage),\n };\n }\n if (options.continuation) {\n const storage = storageFor(options.agent);\n invariant(storage, \"This adapter does not support native conversations\");\n await storage.locate(\n options.continuation.id,\n options.workspace?.repository ?? options.repository ?? process.cwd(),\n options.conversationHome,\n );\n }\n const sandbox = await createSandbox(options);\n const {\n brief: _brief,\n response: _response,\n continuation: _continuation,\n passes: _passes,\n ...configuration\n } = original;\n let successful = false;\n try {\n const output = await sandbox.dispatch(options);\n await sandbox.workspace.integrate();\n successful = true;\n const disposed = await sandbox.close();\n const continuation = output.conversation;\n return {\n ...output,\n ...disposed,\n resume<U>(next: ContinuationOptions<U>) {\n invariant(continuation, \"No conversation was emitted\");\n return dispatch({\n ...continuationConfiguration(configuration, next),\n ...next,\n continuation: { id: continuation },\n });\n },\n fork<U>(next: ContinuationOptions<U>) {\n invariant(continuation, \"No conversation was emitted\");\n return dispatch({\n ...continuationConfiguration(configuration, next),\n ...next,\n continuation: { id: continuation, fork: true },\n });\n },\n };\n } catch (cause) {\n recordRecovery(cause, {\n branch: sandbox.workspace.branch,\n directory: sandbox.workspace.directory,\n });\n throw cause;\n } finally {\n if (!successful) await sandbox.close({ preserve: true });\n }\n}\n"]}
1
+ {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/application/dispatch.ts"],"names":[],"mappings":"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","sourcesContent":["import type { RequiredAgent, Usage } from \"../domain/agent.types.ts\";\nimport { invariant, recordRecovery } from \"../domain/errors.ts\";\nimport { addUsage } from \"../domain/usage.ts\";\nimport { storageFor } from \"./agent-storage.ts\";\nimport { continuationConfiguration } from \"./continuation.ts\";\nimport { preflightDispatch } from \"./dispatch-validation.ts\";\nimport { executionDefaults } from \"./execution.constants.ts\";\nimport type { DispatchOptions } from \"./execution.types.ts\";\nimport { notify } from \"./observation.ts\";\nimport type {\n ContinuationOptions,\n DispatchResult,\n SandboxOptions,\n} from \"./outpost.types.ts\";\nimport { observeDispatch } from \"./dispatch-observation.ts\";\nimport { createSandbox } from \"./sandbox.ts\";\n\nexport async function dispatch<T = undefined>(\n options: SandboxOptions & DispatchOptions<T> & RequiredAgent,\n): Promise<DispatchResult<T>> {\n const { telemetry: _telemetry, ...configuration } = options;\n return observeDispatch(\n options,\n (observed) => dispatchOperation({ ...configuration, ...observed }, options),\n options.workspace?.repository ?? options.repository ?? process.cwd(),\n );\n}\n\nasync function dispatchOperation<T>(\n options: SandboxOptions & DispatchOptions<T> & RequiredAgent,\n original: SandboxOptions & DispatchOptions<T> & RequiredAgent,\n): Promise<DispatchResult<T>> {\n options.signal?.throwIfAborted();\n await preflightDispatch(\n options,\n options.workspace?.repository ?? options.repository ?? process.cwd(),\n options.agent,\n );\n if ((options.passes ?? executionDefaults.passes) > 1) {\n const outputs: DispatchResult<T>[] = [];\n for (let index = 0; index < options.passes!; index++) {\n options.signal?.throwIfAborted();\n const output = await dispatchOperation(\n {\n ...options,\n passes: 1,\n observe: (event) =>\n notify(options.observe, { ...event, pass: index + 1 }),\n },\n original,\n );\n outputs.push(output);\n if (output.completed) break;\n }\n const last = outputs.at(-1)!;\n return {\n ...last,\n text: outputs.map((output) => output.text).join(\"\\n\"),\n turns: outputs.flatMap((output) => output.turns),\n commits: outputs.flatMap((output) => output.commits),\n usage: outputs.reduce((sum, output) => addUsage(sum, output.usage), {\n input: 0,\n cached: 0,\n output: 0,\n } as Usage),\n };\n }\n if (options.continuation) {\n const storage = storageFor(options.agent);\n invariant(storage, \"This adapter does not support native conversations\");\n await storage.locate(\n options.continuation.id,\n options.workspace?.repository ?? options.repository ?? process.cwd(),\n options.conversationHome,\n );\n }\n const sandbox = await createSandbox(options);\n const {\n brief: _brief,\n response: _response,\n continuation: _continuation,\n passes: _passes,\n ...configuration\n } = original;\n let successful = false;\n try {\n const output = await sandbox.dispatch(options);\n await sandbox.workspace.integrate();\n successful = true;\n const disposed = await sandbox.close();\n const continuation = output.conversation;\n return {\n ...output,\n ...disposed,\n resume<U>(next: ContinuationOptions<U>) {\n invariant(continuation, \"No conversation was emitted\");\n return dispatch({\n ...continuationConfiguration(configuration, next),\n ...next,\n continuation: { id: continuation },\n });\n },\n fork<U>(next: ContinuationOptions<U>) {\n invariant(continuation, \"No conversation was emitted\");\n return dispatch({\n ...continuationConfiguration(configuration, next),\n ...next,\n continuation: { id: continuation, fork: true },\n });\n },\n };\n } catch (cause) {\n recordRecovery(cause, {\n branch: sandbox.workspace.branch,\n directory: sandbox.workspace.directory,\n });\n throw cause;\n } finally {\n if (!successful) await sandbox.close({ preserve: true });\n }\n}\n"]}
@@ -1,11 +1,5 @@
1
- import { claudeDiagnostics } from "../adapters/agents/claude-diagnostics.ts";
2
- import { codexDiagnostics } from "../adapters/agents/codex-diagnostics.ts";
3
- import { geminiDiagnostics } from "../adapters/agents/gemini-diagnostics.ts";
4
- export declare const agentDiagnosticPlans: {
5
- readonly gemini: typeof geminiDiagnostics;
6
- readonly claude: typeof claudeDiagnostics;
7
- readonly codex: typeof codexDiagnostics;
8
- };
1
+ import type { DoctorAgent, DoctorAgentProfile } from "./doctor.types.ts";
2
+ export declare const doctorAgents: Readonly<Record<DoctorAgent, DoctorAgentProfile>>;
9
3
  export declare const agentDiagnosticDefaults: Readonly<{
10
4
  retain: 65536;
11
5
  }>;