@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
@@ -0,0 +1,190 @@
1
+ import { observationDefaults } from "./observation.constants.js";
2
+ export function createObservationHub(options = {}) {
3
+ const capacity = options.capacity ?? observationDefaults.capacity;
4
+ const timeout = options.deliveryTimeoutMs ?? observationDefaults.deliveryTimeoutMs;
5
+ for (const value of [capacity, timeout])
6
+ if (!Number.isSafeInteger(value) || value <= 0)
7
+ throw new Error("Observation capacity and timeout must be positive integers");
8
+ let seq = 0, dropped = 0, emitting = false;
9
+ const errors = [];
10
+ const deliveries = new Set();
11
+ const emissions = [];
12
+ function fail(error) {
13
+ if (errors.length < observationDefaults.errorLimit)
14
+ errors.push(error);
15
+ }
16
+ async function bounded(action, expired) {
17
+ let timer;
18
+ try {
19
+ await Promise.race([
20
+ action,
21
+ new Promise((_, reject) => {
22
+ timer = setTimeout(() => {
23
+ expired();
24
+ reject(new Error("Observation sink delivery timed out; sink disabled"));
25
+ }, timeout);
26
+ }),
27
+ ]);
28
+ }
29
+ finally {
30
+ clearTimeout(timer);
31
+ }
32
+ }
33
+ function disable(delivery) {
34
+ delivery.disabled = true;
35
+ dropped += delivery.queue.length;
36
+ delivery.queue.length = 0;
37
+ }
38
+ function deliver(delivery, observation) {
39
+ if (delivery.disabled) {
40
+ dropped++;
41
+ return;
42
+ }
43
+ if (delivery.pending) {
44
+ if (delivery.queue.length >= capacity) {
45
+ dropped++;
46
+ delivery.dropped++;
47
+ if (delivery.dropped === 1)
48
+ fail(new Error("Observation sink queue overflow; newest events dropped"));
49
+ return;
50
+ }
51
+ delivery.queue.push(observation);
52
+ return;
53
+ }
54
+ try {
55
+ const result = delivery.sink.observe(structuredClone(observation));
56
+ if (!result) {
57
+ delivery.completedSeq = observation.seq;
58
+ return;
59
+ }
60
+ delivery.pendingSeq = observation.seq;
61
+ delivery.pending = bounded(result, () => disable(delivery))
62
+ .catch(fail)
63
+ .then(() => {
64
+ delivery.completedSeq = observation.seq;
65
+ delete delivery.pendingSeq;
66
+ delete delivery.pending;
67
+ while (!delivery.pending && delivery.queue.length)
68
+ deliver(delivery, delivery.queue.shift());
69
+ });
70
+ }
71
+ catch (error) {
72
+ delivery.completedSeq = observation.seq;
73
+ fail(error);
74
+ }
75
+ }
76
+ async function flush(targets) {
77
+ const snapshots = [...targets].map((delivery) => ({
78
+ delivery,
79
+ seq: delivery.queue.at(-1)?.seq ?? delivery.pendingSeq ?? 0,
80
+ }));
81
+ for (const { delivery, seq } of snapshots) {
82
+ while (delivery.pending && (delivery.completedSeq ?? 0) < seq)
83
+ await delivery.pending;
84
+ if (delivery.disabled)
85
+ continue;
86
+ try {
87
+ await bounded(Promise.resolve(delivery.sink.flush?.()), () => disable(delivery));
88
+ }
89
+ catch (error) {
90
+ fail(error);
91
+ }
92
+ }
93
+ }
94
+ function hub(scope, inherited, sinks, parentActive, parentTrack) {
95
+ const local = sinks.map((sink) => ({
96
+ sink,
97
+ queue: [],
98
+ dropped: 0,
99
+ }));
100
+ const owned = new Set();
101
+ const track = (delivery, add) => {
102
+ if (add)
103
+ owned.add(delivery);
104
+ if (!add)
105
+ owned.delete(delivery);
106
+ parentTrack(delivery, add);
107
+ };
108
+ for (const delivery of local) {
109
+ deliveries.add(delivery);
110
+ track(delivery, true);
111
+ }
112
+ const targets = [...inherited, ...local];
113
+ const frozen = Object.freeze({ ...scope });
114
+ let closed = false;
115
+ let closing;
116
+ const active = () => !closed && parentActive();
117
+ return {
118
+ scope: frozen,
119
+ errors,
120
+ get dropped() {
121
+ return dropped;
122
+ },
123
+ verbose: options.verbose ?? false,
124
+ emit(source, event) {
125
+ if (!active())
126
+ return;
127
+ if (emissions.length >= capacity) {
128
+ dropped++;
129
+ fail(new Error("Reentrant observation queue overflow"));
130
+ return;
131
+ }
132
+ const draining = !emitting;
133
+ try {
134
+ emissions.push({
135
+ targets,
136
+ observation: {
137
+ seq: ++seq,
138
+ at: new Date().toISOString(),
139
+ source,
140
+ scope: frozen,
141
+ event: structuredClone(event),
142
+ },
143
+ });
144
+ if (!draining)
145
+ return;
146
+ emitting = true;
147
+ let processed = 0;
148
+ for (let item = emissions.shift(); item; item = emissions.shift()) {
149
+ if (++processed > capacity) {
150
+ dropped +=
151
+ item.targets.length +
152
+ emissions.reduce((sum, value) => sum + value.targets.length, 0);
153
+ emissions.length = 0;
154
+ fail(new Error("Reentrant observation delivery limit exceeded"));
155
+ break;
156
+ }
157
+ for (const target of item.targets)
158
+ deliver(target, item.observation);
159
+ }
160
+ }
161
+ catch (error) {
162
+ fail(error);
163
+ }
164
+ finally {
165
+ if (draining)
166
+ emitting = false;
167
+ }
168
+ },
169
+ child(addition, sinks = []) {
170
+ return hub({ ...scope, ...addition }, targets, sinks, active, track);
171
+ },
172
+ flush: () => flush(deliveries),
173
+ close() {
174
+ if (closing)
175
+ return closing;
176
+ closed = true;
177
+ closing = (async () => {
178
+ await flush([...inherited, ...owned]);
179
+ for (const delivery of [...owned]) {
180
+ deliveries.delete(delivery);
181
+ track(delivery, false);
182
+ }
183
+ })();
184
+ return closing;
185
+ },
186
+ };
187
+ }
188
+ return hub(options.scope ?? {}, [], options.sinks ?? [], () => true, () => { });
189
+ }
190
+ //# sourceMappingURL=observation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observation.js","sourceRoot":"","sources":["../../src/domain/observation.ts"],"names":[],"mappings":"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","sourcesContent":["import { observationDefaults } from \"./observation.constants.ts\";\nimport type {\n Observation,\n ObservationHub,\n ObservationHubOptions,\n ObservationScope,\n ObservationSink,\n SinkDelivery,\n PendingObservation,\n} from \"./observation.types.ts\";\n\nexport function createObservationHub(\n options: ObservationHubOptions = {},\n): ObservationHub {\n const capacity = options.capacity ?? observationDefaults.capacity;\n const timeout =\n options.deliveryTimeoutMs ?? observationDefaults.deliveryTimeoutMs;\n for (const value of [capacity, timeout])\n if (!Number.isSafeInteger(value) || value <= 0)\n throw new Error(\n \"Observation capacity and timeout must be positive integers\",\n );\n let seq = 0,\n dropped = 0,\n emitting = false;\n const errors: unknown[] = [];\n const deliveries = new Set<SinkDelivery>();\n const emissions: PendingObservation[] = [];\n function fail(error: unknown): void {\n if (errors.length < observationDefaults.errorLimit) errors.push(error);\n }\n async function bounded(\n action: Promise<void>,\n expired: () => void,\n ): Promise<void> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n await Promise.race([\n action,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n expired();\n reject(\n new Error(\"Observation sink delivery timed out; sink disabled\"),\n );\n }, timeout);\n }),\n ]);\n } finally {\n clearTimeout(timer);\n }\n }\n function disable(delivery: SinkDelivery): void {\n delivery.disabled = true;\n dropped += delivery.queue.length;\n delivery.queue.length = 0;\n }\n function deliver(delivery: SinkDelivery, observation: Observation): void {\n if (delivery.disabled) {\n dropped++;\n return;\n }\n if (delivery.pending) {\n if (delivery.queue.length >= capacity) {\n dropped++;\n delivery.dropped++;\n if (delivery.dropped === 1)\n fail(\n new Error(\"Observation sink queue overflow; newest events dropped\"),\n );\n return;\n }\n delivery.queue.push(observation);\n return;\n }\n try {\n const result = delivery.sink.observe(structuredClone(observation));\n if (!result) {\n delivery.completedSeq = observation.seq;\n return;\n }\n delivery.pendingSeq = observation.seq;\n delivery.pending = bounded(result, () => disable(delivery))\n .catch(fail)\n .then(() => {\n delivery.completedSeq = observation.seq;\n delete delivery.pendingSeq;\n delete delivery.pending;\n while (!delivery.pending && delivery.queue.length)\n deliver(delivery, delivery.queue.shift()!);\n });\n } catch (error) {\n delivery.completedSeq = observation.seq;\n fail(error);\n }\n }\n async function flush(targets: Iterable<SinkDelivery>): Promise<void> {\n const snapshots = [...targets].map((delivery) => ({\n delivery,\n seq: delivery.queue.at(-1)?.seq ?? delivery.pendingSeq ?? 0,\n }));\n for (const { delivery, seq } of snapshots) {\n while (delivery.pending && (delivery.completedSeq ?? 0) < seq)\n await delivery.pending;\n if (delivery.disabled) continue;\n try {\n await bounded(Promise.resolve(delivery.sink.flush?.()), () =>\n disable(delivery),\n );\n } catch (error) {\n fail(error);\n }\n }\n }\n function hub(\n scope: ObservationScope,\n inherited: readonly SinkDelivery[],\n sinks: readonly ObservationSink[],\n parentActive: () => boolean,\n parentTrack: (delivery: SinkDelivery, add: boolean) => void,\n ): ObservationHub {\n const local: SinkDelivery[] = sinks.map((sink) => ({\n sink,\n queue: [],\n dropped: 0,\n }));\n const owned = new Set<SinkDelivery>();\n const track = (delivery: SinkDelivery, add: boolean) => {\n if (add) owned.add(delivery);\n if (!add) owned.delete(delivery);\n parentTrack(delivery, add);\n };\n for (const delivery of local) {\n deliveries.add(delivery);\n track(delivery, true);\n }\n const targets = [...inherited, ...local];\n const frozen = Object.freeze({ ...scope });\n let closed = false;\n let closing: Promise<void> | undefined;\n const active = () => !closed && parentActive();\n return {\n scope: frozen,\n errors,\n get dropped() {\n return dropped;\n },\n verbose: options.verbose ?? false,\n emit(source, event) {\n if (!active()) return;\n if (emissions.length >= capacity) {\n dropped++;\n fail(new Error(\"Reentrant observation queue overflow\"));\n return;\n }\n const draining = !emitting;\n try {\n emissions.push({\n targets,\n observation: {\n seq: ++seq,\n at: new Date().toISOString(),\n source,\n scope: frozen,\n event: structuredClone(event),\n },\n });\n if (!draining) return;\n emitting = true;\n let processed = 0;\n for (let item = emissions.shift(); item; item = emissions.shift()) {\n if (++processed > capacity) {\n dropped +=\n item.targets.length +\n emissions.reduce((sum, value) => sum + value.targets.length, 0);\n emissions.length = 0;\n fail(new Error(\"Reentrant observation delivery limit exceeded\"));\n break;\n }\n for (const target of item.targets)\n deliver(target, item.observation);\n }\n } catch (error) {\n fail(error);\n } finally {\n if (draining) emitting = false;\n }\n },\n child(addition, sinks = []) {\n return hub({ ...scope, ...addition }, targets, sinks, active, track);\n },\n flush: () => flush(deliveries),\n close() {\n if (closing) return closing;\n closed = true;\n closing = (async () => {\n await flush([...inherited, ...owned]);\n for (const delivery of [...owned]) {\n deliveries.delete(delivery);\n track(delivery, false);\n }\n })();\n return closing;\n },\n };\n }\n return hub(\n options.scope ?? {},\n [],\n options.sinks ?? [],\n () => true,\n () => {},\n );\n}\n"]}
@@ -0,0 +1,84 @@
1
+ import type { AgentEvent } from "./agent.types.ts";
2
+ import type { WorkflowEvent } from "./workflow.types.ts";
3
+ export interface ObservationScope {
4
+ readonly executionId?: string;
5
+ readonly taskKey?: string;
6
+ readonly attempt?: number;
7
+ readonly dispatchId?: string;
8
+ readonly pass?: number;
9
+ readonly subagentId?: string;
10
+ readonly candidate?: string;
11
+ }
12
+ export type ObservationSource = "agent" | "harness" | "workflow" | "sandbox" | "git" | "hooks" | "transfer" | "conversation" | "recovery";
13
+ export interface OperationEvent {
14
+ readonly kind: "operation";
15
+ readonly id: string;
16
+ readonly name: string;
17
+ readonly status: "started" | "finished" | "failed";
18
+ readonly durationMs?: number;
19
+ }
20
+ export type ObservationEvent = AgentEvent | OperationEvent | {
21
+ readonly kind: "dispatch-start";
22
+ } | {
23
+ readonly kind: "workflow";
24
+ readonly event: WorkflowEvent;
25
+ } | {
26
+ readonly kind: "dispatch-finished";
27
+ readonly status: "done" | "failed" | "cancelled";
28
+ readonly completed: boolean;
29
+ readonly branch?: string;
30
+ readonly commits?: readonly import("./workspace.types.ts").Commit[];
31
+ readonly usage: import("./agent.types.ts").Usage;
32
+ } | {
33
+ readonly kind: "command-output";
34
+ readonly channel: "stdout" | "stderr";
35
+ readonly text: string;
36
+ } | {
37
+ readonly kind: "candidate";
38
+ readonly status: "validated" | "accepted" | "rejected" | "cleanup";
39
+ } | {
40
+ readonly kind: "queue";
41
+ readonly id: string;
42
+ readonly status: "enqueued" | "polled" | "completed" | "failed";
43
+ };
44
+ export interface Observation {
45
+ readonly seq: number;
46
+ readonly at: string;
47
+ readonly source: ObservationSource;
48
+ readonly scope: ObservationScope;
49
+ readonly event: ObservationEvent;
50
+ }
51
+ export interface ObservationSink {
52
+ observe(observation: Observation): void | Promise<void>;
53
+ flush?(): void | Promise<void>;
54
+ }
55
+ export interface ObservationHubOptions {
56
+ readonly sinks?: readonly ObservationSink[];
57
+ readonly scope?: ObservationScope;
58
+ readonly capacity?: number;
59
+ readonly deliveryTimeoutMs?: number;
60
+ readonly verbose?: boolean;
61
+ }
62
+ export interface ObservationHub {
63
+ readonly scope: ObservationScope;
64
+ readonly errors: readonly unknown[];
65
+ readonly dropped: number;
66
+ readonly verbose: boolean;
67
+ emit(source: ObservationSource, event: ObservationEvent): void;
68
+ child(scope: ObservationScope, sinks?: readonly ObservationSink[]): ObservationHub;
69
+ flush(): Promise<void>;
70
+ close(): Promise<void>;
71
+ }
72
+ export interface SinkDelivery {
73
+ readonly sink: ObservationSink;
74
+ readonly queue: Observation[];
75
+ completedSeq?: number;
76
+ pendingSeq?: number;
77
+ disabled?: boolean;
78
+ pending?: Promise<void>;
79
+ dropped: number;
80
+ }
81
+ export interface PendingObservation {
82
+ readonly targets: readonly SinkDelivery[];
83
+ readonly observation: Observation;
84
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=observation.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observation.types.js","sourceRoot":"","sources":["../../src/domain/observation.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { AgentEvent } from \"./agent.types.ts\";\nimport type { WorkflowEvent } from \"./workflow.types.ts\";\n\nexport interface ObservationScope {\n readonly executionId?: string;\n readonly taskKey?: string;\n readonly attempt?: number;\n readonly dispatchId?: string;\n readonly pass?: number;\n readonly subagentId?: string;\n readonly candidate?: string;\n}\n\nexport type ObservationSource =\n | \"agent\"\n | \"harness\"\n | \"workflow\"\n | \"sandbox\"\n | \"git\"\n | \"hooks\"\n | \"transfer\"\n | \"conversation\"\n | \"recovery\";\n\nexport interface OperationEvent {\n readonly kind: \"operation\";\n readonly id: string;\n readonly name: string;\n readonly status: \"started\" | \"finished\" | \"failed\";\n readonly durationMs?: number;\n}\n\nexport type ObservationEvent =\n | AgentEvent\n | OperationEvent\n | { readonly kind: \"dispatch-start\" }\n | {\n readonly kind: \"workflow\";\n readonly event: WorkflowEvent;\n }\n | {\n readonly kind: \"dispatch-finished\";\n readonly status: \"done\" | \"failed\" | \"cancelled\";\n readonly completed: boolean;\n readonly branch?: string;\n readonly commits?: readonly import(\"./workspace.types.ts\").Commit[];\n readonly usage: import(\"./agent.types.ts\").Usage;\n }\n | {\n readonly kind: \"command-output\";\n readonly channel: \"stdout\" | \"stderr\";\n readonly text: string;\n }\n | {\n readonly kind: \"candidate\";\n readonly status: \"validated\" | \"accepted\" | \"rejected\" | \"cleanup\";\n }\n | {\n readonly kind: \"queue\";\n readonly id: string;\n readonly status: \"enqueued\" | \"polled\" | \"completed\" | \"failed\";\n };\n\nexport interface Observation {\n readonly seq: number;\n readonly at: string;\n readonly source: ObservationSource;\n readonly scope: ObservationScope;\n readonly event: ObservationEvent;\n}\n\nexport interface ObservationSink {\n observe(observation: Observation): void | Promise<void>;\n flush?(): void | Promise<void>;\n}\n\nexport interface ObservationHubOptions {\n readonly sinks?: readonly ObservationSink[];\n readonly scope?: ObservationScope;\n readonly capacity?: number;\n readonly deliveryTimeoutMs?: number;\n readonly verbose?: boolean;\n}\n\nexport interface ObservationHub {\n readonly scope: ObservationScope;\n readonly errors: readonly unknown[];\n readonly dropped: number;\n readonly verbose: boolean;\n emit(source: ObservationSource, event: ObservationEvent): void;\n child(\n scope: ObservationScope,\n sinks?: readonly ObservationSink[],\n ): ObservationHub;\n flush(): Promise<void>;\n close(): Promise<void>;\n}\n\nexport interface SinkDelivery {\n readonly sink: ObservationSink;\n readonly queue: Observation[];\n completedSeq?: number;\n pendingSeq?: number;\n disabled?: boolean;\n pending?: Promise<void>;\n dropped: number;\n}\n\nexport interface PendingObservation {\n readonly targets: readonly SinkDelivery[];\n readonly observation: Observation;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import type { ObservationHub, ObservationSource } from "./observation.types.ts";
2
+ export declare function observedOperation<T>(hub: ObservationHub | undefined, source: ObservationSource, name: string, action: () => Promise<T>): Promise<T>;
@@ -0,0 +1,30 @@
1
+ import { randomUUID } from "node:crypto";
2
+ export async function observedOperation(hub, source, name, action) {
3
+ if (!hub)
4
+ return action();
5
+ const id = randomUUID();
6
+ const started = performance.now();
7
+ hub.emit(source, { kind: "operation", id, name, status: "started" });
8
+ try {
9
+ const result = await action();
10
+ hub.emit(source, {
11
+ kind: "operation",
12
+ id,
13
+ name,
14
+ status: "finished",
15
+ durationMs: performance.now() - started,
16
+ });
17
+ return result;
18
+ }
19
+ catch (error) {
20
+ hub.emit(source, {
21
+ kind: "operation",
22
+ id,
23
+ name,
24
+ status: "failed",
25
+ durationMs: performance.now() - started,
26
+ });
27
+ throw error;
28
+ }
29
+ }
30
+ //# sourceMappingURL=observed-operation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observed-operation.js","sourceRoot":"","sources":["../../src/domain/observed-operation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAA+B,EAC/B,MAAyB,EACzB,IAAY,EACZ,MAAwB;IAExB,IAAI,CAAC,GAAG;QAAE,OAAO,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IACxB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAClC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACrE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,EAAE,CAAC;QAC9B,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,EAAE,WAAW;YACjB,EAAE;YACF,IAAI;YACJ,MAAM,EAAE,UAAU;YAClB,UAAU,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO;SACxC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,EAAE,WAAW;YACjB,EAAE;YACF,IAAI;YACJ,MAAM,EAAE,QAAQ;YAChB,UAAU,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO;SACxC,CAAC,CAAC;QACH,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport type { ObservationHub, ObservationSource } from \"./observation.types.ts\";\n\nexport async function observedOperation<T>(\n hub: ObservationHub | undefined,\n source: ObservationSource,\n name: string,\n action: () => Promise<T>,\n): Promise<T> {\n if (!hub) return action();\n const id = randomUUID();\n const started = performance.now();\n hub.emit(source, { kind: \"operation\", id, name, status: \"started\" });\n try {\n const result = await action();\n hub.emit(source, {\n kind: \"operation\",\n id,\n name,\n status: \"finished\",\n durationMs: performance.now() - started,\n });\n return result;\n } catch (error) {\n hub.emit(source, {\n kind: \"operation\",\n id,\n name,\n status: \"failed\",\n durationMs: performance.now() - started,\n });\n throw error;\n }\n}\n"]}
@@ -5,6 +5,7 @@ export interface Volume {
5
5
  readonly readOnly?: boolean;
6
6
  }
7
7
  export interface SandboxContext {
8
+ readonly registerRecovery?: (resourceId: string) => Promise<void>;
8
9
  readonly repository: string;
9
10
  readonly directory: string;
10
11
  readonly gitDirectories: readonly string[];
@@ -37,6 +38,7 @@ export interface SandboxLease {
37
38
  release(): Promise<void>;
38
39
  }
39
40
  export interface SandboxProvider {
41
+ readonly recover?: (resourceId: string, options?: TransferOptions) => Promise<void>;
40
42
  readonly name: string;
41
43
  readonly placement: "mounted" | "remote" | "host";
42
44
  readonly variables?: Variables;
@@ -1 +1 @@
1
- {"version":3,"file":"sandbox.types.js","sourceRoot":"","sources":["../../src/domain/sandbox.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Command, CommandResult, Variables } from \"./command.types.ts\";\n\nexport interface Volume {\n readonly source: string;\n readonly target: string;\n readonly readOnly?: boolean;\n}\n\nexport interface SandboxContext {\n readonly repository: string;\n readonly directory: string;\n readonly gitDirectories: readonly string[];\n readonly variables: Variables;\n readonly signal?: AbortSignal;\n}\n\nexport interface TransferOptions {\n readonly signal?: AbortSignal;\n readonly deadlineMs?: number;\n}\n\nexport interface FileManifestEntry {\n readonly path: string;\n readonly kind: \"file\" | \"link\";\n readonly mode: number;\n readonly size: number;\n readonly sha256: string;\n}\n\nexport interface FileTransfers {\n uploadBatch?(\n source: string,\n entries: readonly FileManifestEntry[],\n destination: string,\n options?: TransferOptions,\n ): Promise<void>;\n manifest(\n source: string,\n paths: readonly string[],\n options?: TransferOptions,\n ): Promise<readonly FileManifestEntry[]>;\n downloadBatch(\n source: string,\n entries: readonly FileManifestEntry[],\n destination: string,\n options?: TransferOptions,\n ): Promise<void>;\n}\n\nexport interface SandboxLease {\n readonly fileTransfers?: FileTransfers;\n readonly root: string;\n readonly home: string;\n invoke(command: Command): Promise<CommandResult>;\n upload(\n source: string,\n destination: string,\n options?: TransferOptions,\n ): Promise<void>;\n download(\n source: string,\n destination: string,\n options?: TransferOptions,\n ): Promise<void>;\n release(): Promise<void>;\n}\n\nexport interface SandboxProvider {\n readonly name: string;\n readonly placement: \"mounted\" | \"remote\" | \"host\";\n readonly variables?: Variables;\n acquire(context: SandboxContext): Promise<SandboxLease>;\n}\n"]}
1
+ {"version":3,"file":"sandbox.types.js","sourceRoot":"","sources":["../../src/domain/sandbox.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Command, CommandResult, Variables } from \"./command.types.ts\";\n\nexport interface Volume {\n readonly source: string;\n readonly target: string;\n readonly readOnly?: boolean;\n}\n\nexport interface SandboxContext {\n readonly registerRecovery?: (resourceId: string) => Promise<void>;\n readonly repository: string;\n readonly directory: string;\n readonly gitDirectories: readonly string[];\n readonly variables: Variables;\n readonly signal?: AbortSignal;\n}\n\nexport interface TransferOptions {\n readonly signal?: AbortSignal;\n readonly deadlineMs?: number;\n}\n\nexport interface FileManifestEntry {\n readonly path: string;\n readonly kind: \"file\" | \"link\";\n readonly mode: number;\n readonly size: number;\n readonly sha256: string;\n}\n\nexport interface FileTransfers {\n uploadBatch?(\n source: string,\n entries: readonly FileManifestEntry[],\n destination: string,\n options?: TransferOptions,\n ): Promise<void>;\n manifest(\n source: string,\n paths: readonly string[],\n options?: TransferOptions,\n ): Promise<readonly FileManifestEntry[]>;\n downloadBatch(\n source: string,\n entries: readonly FileManifestEntry[],\n destination: string,\n options?: TransferOptions,\n ): Promise<void>;\n}\n\nexport interface SandboxLease {\n readonly fileTransfers?: FileTransfers;\n readonly root: string;\n readonly home: string;\n invoke(command: Command): Promise<CommandResult>;\n upload(\n source: string,\n destination: string,\n options?: TransferOptions,\n ): Promise<void>;\n download(\n source: string,\n destination: string,\n options?: TransferOptions,\n ): Promise<void>;\n release(): Promise<void>;\n}\n\nexport interface SandboxProvider {\n readonly recover?: (\n resourceId: string,\n options?: TransferOptions,\n ) => Promise<void>;\n readonly name: string;\n readonly placement: \"mounted\" | \"remote\" | \"host\";\n readonly variables?: Variables;\n acquire(context: SandboxContext): Promise<SandboxLease>;\n}\n"]}
@@ -0,0 +1,13 @@
1
+ export declare const SUBAGENT_FIELDS: Set<string>;
2
+ export declare const SUBAGENT_INPUT: {
3
+ readonly type: "object";
4
+ readonly properties: {
5
+ readonly prompt: {
6
+ readonly type: "string";
7
+ readonly minLength: 1;
8
+ };
9
+ };
10
+ readonly required: readonly ["prompt"];
11
+ readonly additionalProperties: false;
12
+ };
13
+ export declare const MAX_DELEGATION_DEPTH = 3;
@@ -0,0 +1,9 @@
1
+ export const SUBAGENT_FIELDS = new Set(["name", "description", "agent"]);
2
+ export const SUBAGENT_INPUT = {
3
+ type: "object",
4
+ properties: { prompt: { type: "string", minLength: 1 } },
5
+ required: ["prompt"],
6
+ additionalProperties: false,
7
+ };
8
+ export const MAX_DELEGATION_DEPTH = 3;
9
+ //# sourceMappingURL=subagent.constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent.constants.js","sourceRoot":"","sources":["../../src/domain/subagent.constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;AACzE,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE;IACxD,QAAQ,EAAE,CAAC,QAAQ,CAAC;IACpB,oBAAoB,EAAE,KAAK;CACnB,CAAC;AACX,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC","sourcesContent":["export const SUBAGENT_FIELDS = new Set([\"name\", \"description\", \"agent\"]);\nexport const SUBAGENT_INPUT = {\n type: \"object\",\n properties: { prompt: { type: \"string\", minLength: 1 } },\n required: [\"prompt\"],\n additionalProperties: false,\n} as const;\nexport const MAX_DELEGATION_DEPTH = 3;\n"]}
@@ -0,0 +1,4 @@
1
+ import type { HarnessSubagent, HarnessSubagentOptions } from "./subagent.types.ts";
2
+ import type { HarnessTool } from "./tool.types.ts";
3
+ export declare function defineHarnessSubagent(options: HarnessSubagentOptions): HarnessSubagent;
4
+ export declare function isHarnessSubagent(tool: HarnessTool): tool is HarnessSubagent;
@@ -0,0 +1,28 @@
1
+ import { agent } from "./agent.js";
2
+ import { invariant, OutpostError } from "./errors.js";
3
+ import { SUBAGENT_FIELDS, SUBAGENT_INPUT } from "./subagent.constants.js";
4
+ import { defineHarnessTool } from "./tool.js";
5
+ export function defineHarnessSubagent(options) {
6
+ invariant(options !== null && typeof options === "object", "Subagent options must be an object");
7
+ invariant(Object.keys(options).every((key) => SUBAGENT_FIELDS.has(key)), "Unsupported subagent option");
8
+ invariant(options.agent?.kind === "custom", "Subagents require a built-in harness agent");
9
+ const child = agent({
10
+ harness: options.agent.harness,
11
+ model: options.agent.model,
12
+ });
13
+ return Object.freeze({
14
+ ...defineHarnessTool({
15
+ name: options.name,
16
+ description: options.description,
17
+ input: SUBAGENT_INPUT,
18
+ execute() {
19
+ throw new OutpostError("configuration", "Subagents must be invoked by the harness runtime");
20
+ },
21
+ }),
22
+ subagent: child,
23
+ });
24
+ }
25
+ export function isHarnessSubagent(tool) {
26
+ return "subagent" in tool;
27
+ }
28
+ //# sourceMappingURL=subagent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent.js","sourceRoot":"","sources":["../../src/domain/subagent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAM1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAG9C,MAAM,UAAU,qBAAqB,CACnC,OAA+B;IAE/B,SAAS,CACP,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,EAC/C,oCAAoC,CACrC,CAAC;IACF,SAAS,CACP,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAC7D,6BAA6B,CAC9B,CAAC;IACF,SAAS,CACP,OAAO,CAAC,KAAK,EAAE,IAAI,KAAK,QAAQ,EAChC,4CAA4C,CAC7C,CAAC;IACF,MAAM,KAAK,GAAG,KAAK,CAAC;QAClB,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO;QAC9B,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK;KAC3B,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG,iBAAiB,CAAuB;YACzC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,KAAK,EAAE,cAAc;YACrB,OAAO;gBACL,MAAM,IAAI,YAAY,CACpB,eAAe,EACf,kDAAkD,CACnD,CAAC;YACJ,CAAC;SACF,CAAC;QACF,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAiB;IACjD,OAAO,UAAU,IAAI,IAAI,CAAC;AAC5B,CAAC","sourcesContent":["import { agent } from \"./agent.ts\";\nimport { invariant, OutpostError } from \"./errors.ts\";\nimport { SUBAGENT_FIELDS, SUBAGENT_INPUT } from \"./subagent.constants.ts\";\nimport type {\n HarnessSubagent,\n HarnessSubagentInput,\n HarnessSubagentOptions,\n} from \"./subagent.types.ts\";\nimport { defineHarnessTool } from \"./tool.ts\";\nimport type { HarnessTool } from \"./tool.types.ts\";\n\nexport function defineHarnessSubagent(\n options: HarnessSubagentOptions,\n): HarnessSubagent {\n invariant(\n options !== null && typeof options === \"object\",\n \"Subagent options must be an object\",\n );\n invariant(\n Object.keys(options).every((key) => SUBAGENT_FIELDS.has(key)),\n \"Unsupported subagent option\",\n );\n invariant(\n options.agent?.kind === \"custom\",\n \"Subagents require a built-in harness agent\",\n );\n const child = agent({\n harness: options.agent.harness,\n model: options.agent.model,\n });\n return Object.freeze({\n ...defineHarnessTool<HarnessSubagentInput>({\n name: options.name,\n description: options.description,\n input: SUBAGENT_INPUT,\n execute() {\n throw new OutpostError(\n \"configuration\",\n \"Subagents must be invoked by the harness runtime\",\n );\n },\n }),\n subagent: child,\n });\n}\n\nexport function isHarnessSubagent(tool: HarnessTool): tool is HarnessSubagent {\n return \"subagent\" in tool;\n}\n"]}
@@ -0,0 +1,13 @@
1
+ import type { CustomAgent } from "./agent.types.ts";
2
+ import type { HarnessTool } from "./tool.types.ts";
3
+ export interface HarnessSubagentInput {
4
+ readonly prompt: string;
5
+ }
6
+ export interface HarnessSubagentOptions {
7
+ readonly name: string;
8
+ readonly description: string;
9
+ readonly agent: CustomAgent;
10
+ }
11
+ export interface HarnessSubagent extends HarnessTool<HarnessSubagentInput> {
12
+ readonly subagent: CustomAgent;
13
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=subagent.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent.types.js","sourceRoot":"","sources":["../../src/domain/subagent.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { CustomAgent } from \"./agent.types.ts\";\nimport type { HarnessTool } from \"./tool.types.ts\";\n\nexport interface HarnessSubagentInput {\n readonly prompt: string;\n}\n\nexport interface HarnessSubagentOptions {\n readonly name: string;\n readonly description: string;\n readonly agent: CustomAgent;\n}\n\nexport interface HarnessSubagent extends HarnessTool<HarnessSubagentInput> {\n readonly subagent: CustomAgent;\n}\n"]}
@@ -5,6 +5,8 @@ export type TranscriptRecord = {
5
5
  readonly id: string;
6
6
  readonly model: string;
7
7
  readonly parent?: string;
8
+ readonly parentConversation?: string;
9
+ readonly parentCallId?: string;
8
10
  readonly createdAt: string;
9
11
  } | {
10
12
  readonly type: "message";
@@ -1 +1 @@
1
- {"version":3,"file":"transcript.types.js","sourceRoot":"","sources":["../../src/domain/transcript.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ModelMessage } from \"./model.types.ts\";\n\nexport type TranscriptRecord =\n | {\n readonly type: \"session\";\n readonly version: 1;\n readonly id: string;\n readonly model: string;\n readonly parent?: string;\n readonly createdAt: string;\n }\n | { readonly type: \"message\"; readonly message: ModelMessage }\n | { readonly type: \"compaction\"; readonly messages: readonly ModelMessage[] };\n"]}
1
+ {"version":3,"file":"transcript.types.js","sourceRoot":"","sources":["../../src/domain/transcript.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ModelMessage } from \"./model.types.ts\";\n\nexport type TranscriptRecord =\n | {\n readonly type: \"session\";\n readonly version: 1;\n readonly id: string;\n readonly model: string;\n readonly parent?: string;\n readonly parentConversation?: string;\n readonly parentCallId?: string;\n readonly createdAt: string;\n }\n | { readonly type: \"message\"; readonly message: ModelMessage }\n | { readonly type: \"compaction\"; readonly messages: readonly ModelMessage[] };\n"]}
@@ -1,2 +1,3 @@
1
1
  import type { Usage } from "./agent.types.ts";
2
2
  export declare function addUsage(left: Usage, right: Usage): Usage;
3
+ export declare function usageDifference(next: Usage, previous: Usage): Usage;
@@ -3,9 +3,25 @@ export function addUsage(left, right) {
3
3
  input: left.input + right.input,
4
4
  cached: left.cached + right.cached,
5
5
  output: left.output + right.output,
6
+ ...(left.complete === false || right.complete === false
7
+ ? { complete: false }
8
+ : {}),
6
9
  ...(left.cacheCreated !== undefined || right.cacheCreated !== undefined
7
10
  ? { cacheCreated: (left.cacheCreated ?? 0) + (right.cacheCreated ?? 0) }
8
11
  : {}),
9
12
  };
10
13
  }
14
+ export function usageDifference(next, previous) {
15
+ return {
16
+ input: Math.max(0, next.input - previous.input),
17
+ cached: Math.max(0, next.cached - previous.cached),
18
+ output: Math.max(0, next.output - previous.output),
19
+ ...(next.cacheCreated !== undefined || previous.cacheCreated !== undefined
20
+ ? {
21
+ cacheCreated: Math.max(0, (next.cacheCreated ?? 0) - (previous.cacheCreated ?? 0)),
22
+ }
23
+ : {}),
24
+ ...(next.complete === false ? { complete: false } : {}),
25
+ };
26
+ }
11
27
  //# sourceMappingURL=usage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/domain/usage.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,QAAQ,CAAC,IAAW,EAAE,KAAY;IAChD,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK;QAC/B,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;QAClC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;QAClC,GAAG,CAAC,IAAI,CAAC,YAAY,KAAK,SAAS,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS;YACrE,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC,EAAE;YACxE,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC","sourcesContent":["import type { Usage } from \"./agent.types.ts\";\n\nexport function addUsage(left: Usage, right: Usage): Usage {\n return {\n input: left.input + right.input,\n cached: left.cached + right.cached,\n output: left.output + right.output,\n ...(left.cacheCreated !== undefined || right.cacheCreated !== undefined\n ? { cacheCreated: (left.cacheCreated ?? 0) + (right.cacheCreated ?? 0) }\n : {}),\n };\n}\n"]}
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/domain/usage.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,QAAQ,CAAC,IAAW,EAAE,KAAY;IAChD,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK;QAC/B,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;QAClC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;QAClC,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,KAAK,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK;YACrD,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE;YACrB,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,IAAI,CAAC,YAAY,KAAK,SAAS,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS;YACrE,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC,EAAE;YACxE,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAW,EAAE,QAAe;IAC1D,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC/C,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAClD,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAClD,GAAG,CAAC,IAAI,CAAC,YAAY,KAAK,SAAS,IAAI,QAAQ,CAAC,YAAY,KAAK,SAAS;YACxE,CAAC,CAAC;gBACE,YAAY,EAAE,IAAI,CAAC,GAAG,CACpB,CAAC,EACD,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,IAAI,CAAC,CAAC,CACxD;aACF;YACH,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxD,CAAC;AACJ,CAAC","sourcesContent":["import type { Usage } from \"./agent.types.ts\";\n\nexport function addUsage(left: Usage, right: Usage): Usage {\n return {\n input: left.input + right.input,\n cached: left.cached + right.cached,\n output: left.output + right.output,\n ...(left.complete === false || right.complete === false\n ? { complete: false }\n : {}),\n ...(left.cacheCreated !== undefined || right.cacheCreated !== undefined\n ? { cacheCreated: (left.cacheCreated ?? 0) + (right.cacheCreated ?? 0) }\n : {}),\n };\n}\n\nexport function usageDifference(next: Usage, previous: Usage): Usage {\n return {\n input: Math.max(0, next.input - previous.input),\n cached: Math.max(0, next.cached - previous.cached),\n output: Math.max(0, next.output - previous.output),\n ...(next.cacheCreated !== undefined || previous.cacheCreated !== undefined\n ? {\n cacheCreated: Math.max(\n 0,\n (next.cacheCreated ?? 0) - (previous.cacheCreated ?? 0),\n ),\n }\n : {}),\n ...(next.complete === false ? { complete: false } : {}),\n };\n}\n"]}
@@ -1,9 +1,13 @@
1
1
  import type { Usage } from "../agent.types.ts";
2
2
  import type { WorkflowAccounting, WorkflowBudget, WorkflowUsage } from "./budget.types.ts";
3
3
  export declare class WorkflowBudgetExceeded extends Error {
4
- readonly dimension: "attempts" | keyof Usage;
4
+ readonly dimension: "attempts" | Exclude<keyof Usage, "complete">;
5
5
  readonly limit: number;
6
6
  readonly observed: number;
7
- constructor(dimension: "attempts" | keyof Usage, limit: number, observed: number);
7
+ constructor(dimension: "attempts" | Exclude<keyof Usage, "complete">, limit: number, observed: number);
8
8
  }
9
- export declare function workflowAccounting(budget: WorkflowBudget | undefined, exhaust: (error: WorkflowBudgetExceeded) => void, initial?: WorkflowUsage): WorkflowAccounting;
9
+ export declare class WorkflowUsageUnavailable extends Error {
10
+ readonly dimension = "usage";
11
+ constructor();
12
+ }
13
+ export declare function workflowAccounting(budget: WorkflowBudget | undefined, exhaust: (error: WorkflowBudgetExceeded | WorkflowUsageUnavailable) => void, initial?: WorkflowUsage): WorkflowAccounting;
@@ -12,6 +12,13 @@ export class WorkflowBudgetExceeded extends Error {
12
12
  this.observed = observed;
13
13
  }
14
14
  }
15
+ export class WorkflowUsageUnavailable extends Error {
16
+ dimension = "usage";
17
+ constructor() {
18
+ super("Token usage is incomplete; configure budget.attempts and task timeouts or dispatch deadlines before continuing");
19
+ this.name = "WorkflowUsageUnavailable";
20
+ }
21
+ }
15
22
  export function workflowAccounting(budget, exhaust, initial) {
16
23
  for (const [key, value] of Object.entries({
17
24
  attempts: budget?.attempts,
@@ -36,11 +43,27 @@ export function workflowAccounting(budget, exhaust, initial) {
36
43
  }
37
44
  return error;
38
45
  }
46
+ function checkCompleteness() {
47
+ if (tokens.complete !== false ||
48
+ budget?.attempts !== undefined ||
49
+ !usageDimensions.some((dimension) => budget?.usage?.[dimension] !== undefined))
50
+ return;
51
+ const error = new WorkflowUsageUnavailable();
52
+ if (!usageExhausted) {
53
+ exhausted = true;
54
+ usageExhausted = true;
55
+ exhaust(error);
56
+ }
57
+ return error;
58
+ }
39
59
  return {
40
60
  get exhausted() {
41
61
  return exhausted;
42
62
  },
43
63
  admit() {
64
+ const unavailable = checkCompleteness();
65
+ if (unavailable)
66
+ throw unavailable;
44
67
  if (budget?.attempts !== undefined && attempts >= budget.attempts)
45
68
  throw fail("attempts", budget.attempts, attempts);
46
69
  for (const dimension of usageDimensions) {
@@ -51,12 +74,15 @@ export function workflowAccounting(budget, exhaust, initial) {
51
74
  attempts++;
52
75
  },
53
76
  report(usage) {
77
+ if (usage.complete !== undefined && typeof usage.complete !== "boolean")
78
+ throw new Error("Reported usage complete must be a boolean");
54
79
  for (const dimension of usageDimensions) {
55
80
  const value = usage[dimension] ?? 0;
56
81
  if (!Number.isSafeInteger(value) || value < 0)
57
82
  throw new Error(`Reported usage ${dimension} must be a nonnegative safe integer`);
58
83
  }
59
84
  tokens = addUsage(tokens, usage);
85
+ checkCompleteness();
60
86
  for (const dimension of usageDimensions) {
61
87
  const limit = budget?.usage?.[dimension];
62
88
  if (limit !== undefined && (tokens[dimension] ?? 0) >= limit)