@elie-laloum/outpost 11.1.2 → 11.2.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 (596) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +2 -1
  3. package/SECURITY.md +5 -1
  4. package/dist/adapters/agents/antigravity/antigravity-adapter.js +9 -0
  5. package/dist/adapters/agents/antigravity/antigravity-adapter.js.map +1 -1
  6. package/dist/adapters/agents/antigravity/antigravity-hook-plan.d.ts +3 -0
  7. package/dist/adapters/agents/antigravity/antigravity-hook-plan.js +39 -0
  8. package/dist/adapters/agents/antigravity/antigravity-hook-plan.js.map +1 -0
  9. package/dist/adapters/agents/antigravity/antigravity-hooks.constants.d.ts +3 -0
  10. package/dist/adapters/agents/antigravity/antigravity-hooks.constants.js +394 -0
  11. package/dist/adapters/agents/antigravity/antigravity-hooks.constants.js.map +1 -0
  12. package/dist/adapters/agents/antigravity/antigravity-hooks.d.ts +2 -0
  13. package/dist/adapters/agents/antigravity/antigravity-hooks.js +6 -0
  14. package/dist/adapters/agents/antigravity/antigravity-hooks.js.map +1 -0
  15. package/dist/adapters/agents/antigravity/antigravity-hooks.types.d.ts +114 -0
  16. package/dist/adapters/agents/antigravity/antigravity-hooks.types.js +2 -0
  17. package/dist/adapters/agents/antigravity/antigravity-hooks.types.js.map +1 -0
  18. package/dist/adapters/agents/antigravity/antigravity.types.d.ts +1 -0
  19. package/dist/adapters/agents/antigravity/antigravity.types.js.map +1 -1
  20. package/dist/adapters/agents/authentication.js +1 -0
  21. package/dist/adapters/agents/authentication.js.map +1 -1
  22. package/dist/adapters/agents/claude/claude-adapter.js +15 -0
  23. package/dist/adapters/agents/claude/claude-adapter.js.map +1 -1
  24. package/dist/adapters/agents/claude/claude-hook-plan.constants.d.ts +1 -0
  25. package/dist/adapters/agents/claude/claude-hook-plan.constants.js +20 -0
  26. package/dist/adapters/agents/claude/claude-hook-plan.constants.js.map +1 -0
  27. package/dist/adapters/agents/claude/claude-hook-plan.d.ts +4 -0
  28. package/dist/adapters/agents/claude/claude-hook-plan.js +60 -0
  29. package/dist/adapters/agents/claude/claude-hook-plan.js.map +1 -0
  30. package/dist/adapters/agents/claude/claude-hooks.constants.d.ts +3 -0
  31. package/dist/adapters/agents/claude/claude-hooks.constants.js +2968 -0
  32. package/dist/adapters/agents/claude/claude-hooks.constants.js.map +1 -0
  33. package/dist/adapters/agents/claude/claude-hooks.d.ts +2 -0
  34. package/dist/adapters/agents/claude/claude-hooks.js +6 -0
  35. package/dist/adapters/agents/claude/claude-hooks.js.map +1 -0
  36. package/dist/adapters/agents/claude/claude-hooks.types.d.ts +900 -0
  37. package/dist/adapters/agents/claude/claude-hooks.types.js +2 -0
  38. package/dist/adapters/agents/claude/claude-hooks.types.js.map +1 -0
  39. package/dist/adapters/agents/claude/claude-profile.d.ts +1 -0
  40. package/dist/adapters/agents/claude/claude-profile.js +23 -11
  41. package/dist/adapters/agents/claude/claude-profile.js.map +1 -1
  42. package/dist/adapters/agents/codex/codex-adapter.js +17 -1
  43. package/dist/adapters/agents/codex/codex-adapter.js.map +1 -1
  44. package/dist/adapters/agents/codex/codex-authentication.js +1 -0
  45. package/dist/adapters/agents/codex/codex-authentication.js.map +1 -1
  46. package/dist/adapters/agents/codex/codex-conversations.constants.d.ts +1 -0
  47. package/dist/adapters/agents/codex/codex-conversations.constants.js +2 -0
  48. package/dist/adapters/agents/codex/codex-conversations.constants.js.map +1 -0
  49. package/dist/adapters/agents/codex/codex-conversations.js +8 -5
  50. package/dist/adapters/agents/codex/codex-conversations.js.map +1 -1
  51. package/dist/adapters/agents/codex/codex-hook-plan.d.ts +3 -0
  52. package/dist/adapters/agents/codex/codex-hook-plan.js +72 -0
  53. package/dist/adapters/agents/codex/codex-hook-plan.js.map +1 -0
  54. package/dist/adapters/agents/codex/codex-hooks.constants.d.ts +3 -0
  55. package/dist/adapters/agents/codex/codex-hooks.constants.js +942 -0
  56. package/dist/adapters/agents/codex/codex-hooks.constants.js.map +1 -0
  57. package/dist/adapters/agents/codex/codex-hooks.d.ts +2 -0
  58. package/dist/adapters/agents/codex/codex-hooks.js +6 -0
  59. package/dist/adapters/agents/codex/codex-hooks.js.map +1 -0
  60. package/dist/adapters/agents/codex/codex-hooks.types.d.ts +255 -0
  61. package/dist/adapters/agents/codex/codex-hooks.types.js +2 -0
  62. package/dist/adapters/agents/codex/codex-hooks.types.js.map +1 -0
  63. package/dist/adapters/agents/codex/codex-provider.js +2 -2
  64. package/dist/adapters/agents/codex/codex-provider.js.map +1 -1
  65. package/dist/adapters/agents/copilot/copilot-adapter.js +14 -0
  66. package/dist/adapters/agents/copilot/copilot-adapter.js.map +1 -1
  67. package/dist/adapters/agents/copilot/copilot-hook-plan.d.ts +3 -0
  68. package/dist/adapters/agents/copilot/copilot-hook-plan.js +26 -0
  69. package/dist/adapters/agents/copilot/copilot-hook-plan.js.map +1 -0
  70. package/dist/adapters/agents/copilot/copilot-hooks.constants.d.ts +3 -0
  71. package/dist/adapters/agents/copilot/copilot-hooks.constants.js +528 -0
  72. package/dist/adapters/agents/copilot/copilot-hooks.constants.js.map +1 -0
  73. package/dist/adapters/agents/copilot/copilot-hooks.d.ts +2 -0
  74. package/dist/adapters/agents/copilot/copilot-hooks.js +6 -0
  75. package/dist/adapters/agents/copilot/copilot-hooks.js.map +1 -0
  76. package/dist/adapters/agents/copilot/copilot-hooks.types.d.ts +166 -0
  77. package/dist/adapters/agents/copilot/copilot-hooks.types.js +2 -0
  78. package/dist/adapters/agents/copilot/copilot-hooks.types.js.map +1 -0
  79. package/dist/adapters/agents/copilot/copilot.types.d.ts +1 -0
  80. package/dist/adapters/agents/copilot/copilot.types.js.map +1 -1
  81. package/dist/adapters/agents/hook-groups.d.ts +2 -0
  82. package/dist/adapters/agents/hook-groups.js +17 -0
  83. package/dist/adapters/agents/hook-groups.js.map +1 -0
  84. package/dist/adapters/agents/kimi/kimi-adapter.js +16 -1
  85. package/dist/adapters/agents/kimi/kimi-adapter.js.map +1 -1
  86. package/dist/adapters/agents/kimi/kimi-hook-plan.d.ts +3 -0
  87. package/dist/adapters/agents/kimi/kimi-hook-plan.js +33 -0
  88. package/dist/adapters/agents/kimi/kimi-hook-plan.js.map +1 -0
  89. package/dist/adapters/agents/kimi/kimi-hooks.constants.d.ts +3 -0
  90. package/dist/adapters/agents/kimi/kimi-hooks.constants.js +747 -0
  91. package/dist/adapters/agents/kimi/kimi-hooks.constants.js.map +1 -0
  92. package/dist/adapters/agents/kimi/kimi-hooks.d.ts +2 -0
  93. package/dist/adapters/agents/kimi/kimi-hooks.js +6 -0
  94. package/dist/adapters/agents/kimi/kimi-hooks.js.map +1 -0
  95. package/dist/adapters/agents/kimi/kimi-hooks.types.d.ts +226 -0
  96. package/dist/adapters/agents/kimi/kimi-hooks.types.js +2 -0
  97. package/dist/adapters/agents/kimi/kimi-hooks.types.js.map +1 -0
  98. package/dist/adapters/agents/kimi/kimi-request.js +2 -0
  99. package/dist/adapters/agents/kimi/kimi-request.js.map +1 -1
  100. package/dist/adapters/agents/kimi/kimi.constants.d.ts +1 -0
  101. package/dist/adapters/agents/kimi/kimi.constants.js +1 -0
  102. package/dist/adapters/agents/kimi/kimi.constants.js.map +1 -1
  103. package/dist/adapters/agents/kimi/kimi.types.d.ts +1 -0
  104. package/dist/adapters/agents/kimi/kimi.types.js.map +1 -1
  105. package/dist/adapters/agents/native-hooks.d.ts +4 -0
  106. package/dist/adapters/agents/native-hooks.js +63 -0
  107. package/dist/adapters/agents/native-hooks.js.map +1 -0
  108. package/dist/adapters/agents/native-hooks.types.d.ts +22 -0
  109. package/dist/adapters/agents/native-hooks.types.js +2 -0
  110. package/dist/adapters/agents/native-hooks.types.js.map +1 -0
  111. package/dist/adapters/agents/settings.types.d.ts +2 -0
  112. package/dist/adapters/agents/settings.types.js.map +1 -1
  113. package/dist/adapters/decisions/system-one-provider.constants.d.ts +1 -1
  114. package/dist/adapters/decisions/system-one-provider.constants.js +1 -1
  115. package/dist/adapters/decisions/system-one-provider.constants.js.map +1 -1
  116. package/dist/adapters/decisions/system-one-provider.js +8 -21
  117. package/dist/adapters/decisions/system-one-provider.js.map +1 -1
  118. package/dist/adapters/models/anthropic-model-provider.constants.d.ts +1 -0
  119. package/dist/adapters/models/anthropic-model-provider.constants.js +4 -0
  120. package/dist/adapters/models/anthropic-model-provider.constants.js.map +1 -1
  121. package/dist/adapters/models/anthropic-model-provider.js +7 -1
  122. package/dist/adapters/models/anthropic-model-provider.js.map +1 -1
  123. package/dist/adapters/models/http-failure.d.ts +3 -0
  124. package/dist/adapters/models/http-failure.js +43 -0
  125. package/dist/adapters/models/http-failure.js.map +1 -0
  126. package/dist/adapters/models/http-provider.js +14 -20
  127. package/dist/adapters/models/http-provider.js.map +1 -1
  128. package/dist/adapters/models/model-protocol.types.d.ts +1 -0
  129. package/dist/adapters/models/model-protocol.types.js.map +1 -1
  130. package/dist/adapters/models/model.constants.d.ts +2 -0
  131. package/dist/adapters/models/model.constants.js +17 -0
  132. package/dist/adapters/models/model.constants.js.map +1 -1
  133. package/dist/adapters/models/openai-chat-stream.js +3 -1
  134. package/dist/adapters/models/openai-chat-stream.js.map +1 -1
  135. package/dist/adapters/models/openai-responses.js +4 -0
  136. package/dist/adapters/models/openai-responses.js.map +1 -1
  137. package/dist/adapters/secrets/aws.js +5 -4
  138. package/dist/adapters/secrets/aws.js.map +1 -1
  139. package/dist/adapters/secrets/azure.constants.d.ts +1 -0
  140. package/dist/adapters/secrets/azure.constants.js +2 -0
  141. package/dist/adapters/secrets/azure.constants.js.map +1 -0
  142. package/dist/adapters/secrets/azure.js +2 -1
  143. package/dist/adapters/secrets/azure.js.map +1 -1
  144. package/dist/adapters/secrets/gcp.constants.d.ts +1 -0
  145. package/dist/adapters/secrets/gcp.constants.js +2 -0
  146. package/dist/adapters/secrets/gcp.constants.js.map +1 -0
  147. package/dist/adapters/secrets/gcp.js +11 -9
  148. package/dist/adapters/secrets/gcp.js.map +1 -1
  149. package/dist/adapters/secrets/infisical.js +3 -2
  150. package/dist/adapters/secrets/infisical.js.map +1 -1
  151. package/dist/adapters/secrets/onepassword.constants.d.ts +1 -0
  152. package/dist/adapters/secrets/onepassword.constants.js +2 -0
  153. package/dist/adapters/secrets/onepassword.constants.js.map +1 -0
  154. package/dist/adapters/secrets/onepassword.js +2 -1
  155. package/dist/adapters/secrets/onepassword.js.map +1 -1
  156. package/dist/adapters/secrets/secret-source.js +3 -1
  157. package/dist/adapters/secrets/secret-source.js.map +1 -1
  158. package/dist/adapters/secrets/vault-response.js +5 -5
  159. package/dist/adapters/secrets/vault-response.js.map +1 -1
  160. package/dist/adapters/secrets/vault.js +4 -3
  161. package/dist/adapters/secrets/vault.js.map +1 -1
  162. package/dist/adapters/testing/scripted-agent.d.ts +3 -1
  163. package/dist/adapters/testing/scripted-agent.js +3 -1
  164. package/dist/adapters/testing/scripted-agent.js.map +1 -1
  165. package/dist/adapters/tools/edit-tools.js +3 -3
  166. package/dist/adapters/tools/edit-tools.js.map +1 -1
  167. package/dist/adapters/tools/git-tools.js +16 -1
  168. package/dist/adapters/tools/git-tools.js.map +1 -1
  169. package/dist/adapters/tools/mcp-launcher.constants.d.ts +1 -1
  170. package/dist/adapters/tools/mcp-launcher.constants.js +29 -7
  171. package/dist/adapters/tools/mcp-launcher.constants.js.map +1 -1
  172. package/dist/adapters/tools/mcp-resources.js +5 -1
  173. package/dist/adapters/tools/mcp-resources.js.map +1 -1
  174. package/dist/adapters/tools/mcp.constants.d.ts +0 -6
  175. package/dist/adapters/tools/mcp.constants.js +0 -6
  176. package/dist/adapters/tools/mcp.constants.js.map +1 -1
  177. package/dist/adapters/tools/mcp.js +1 -0
  178. package/dist/adapters/tools/mcp.js.map +1 -1
  179. package/dist/adapters/tools/sandbox-files.constants.d.ts +1 -0
  180. package/dist/adapters/tools/sandbox-files.constants.js +17 -0
  181. package/dist/adapters/tools/sandbox-files.constants.js.map +1 -0
  182. package/dist/adapters/tools/sandbox-files.d.ts +1 -0
  183. package/dist/adapters/tools/sandbox-files.js +14 -1
  184. package/dist/adapters/tools/sandbox-files.js.map +1 -1
  185. package/dist/adapters/tools/tools.constants.js +1 -0
  186. package/dist/adapters/tools/tools.constants.js.map +1 -1
  187. package/dist/adapters/triggers/github-webhook.js +14 -11
  188. package/dist/adapters/triggers/github-webhook.js.map +1 -1
  189. package/dist/adapters/triggers/gitlab-webhook.js +16 -13
  190. package/dist/adapters/triggers/gitlab-webhook.js.map +1 -1
  191. package/dist/adapters/triggers/slack-request.js +10 -7
  192. package/dist/adapters/triggers/slack-request.js.map +1 -1
  193. package/dist/adapters/triggers/standard-webhook.js +10 -7
  194. package/dist/adapters/triggers/standard-webhook.js.map +1 -1
  195. package/dist/application/agent-authentication.js +4 -1
  196. package/dist/application/agent-authentication.js.map +1 -1
  197. package/dist/application/agent-turn.js +20 -5
  198. package/dist/application/agent-turn.js.map +1 -1
  199. package/dist/application/cli-hooks.constants.d.ts +2 -0
  200. package/dist/application/cli-hooks.constants.js +69 -0
  201. package/dist/application/cli-hooks.constants.js.map +1 -0
  202. package/dist/application/cli-hooks.d.ts +3 -0
  203. package/dist/application/cli-hooks.js +168 -0
  204. package/dist/application/cli-hooks.js.map +1 -0
  205. package/dist/application/cli-steering.js +33 -2
  206. package/dist/application/cli-steering.js.map +1 -1
  207. package/dist/application/custom-turn.js +10 -1
  208. package/dist/application/custom-turn.js.map +1 -1
  209. package/dist/application/diagnostic-probe.d.ts +1 -1
  210. package/dist/application/diagnostic-probe.js +7 -3
  211. package/dist/application/diagnostic-probe.js.map +1 -1
  212. package/dist/application/dispatch-observation.js +4 -0
  213. package/dist/application/dispatch-observation.js.map +1 -1
  214. package/dist/application/doctor-agent.d.ts +1 -1
  215. package/dist/application/doctor-agent.js +2 -2
  216. package/dist/application/doctor-agent.js.map +1 -1
  217. package/dist/application/doctor-deadline.d.ts +1 -0
  218. package/dist/application/doctor-deadline.js +10 -0
  219. package/dist/application/doctor-deadline.js.map +1 -0
  220. package/dist/application/doctor-image.js +9 -7
  221. package/dist/application/doctor-image.js.map +1 -1
  222. package/dist/application/doctor-sandbox.js +4 -4
  223. package/dist/application/doctor-sandbox.js.map +1 -1
  224. package/dist/application/doctor.constants.d.ts +2 -0
  225. package/dist/application/doctor.constants.js +2 -0
  226. package/dist/application/doctor.constants.js.map +1 -1
  227. package/dist/application/doctor.js +12 -8
  228. package/dist/application/doctor.js.map +1 -1
  229. package/dist/application/doctor.types.d.ts +2 -0
  230. package/dist/application/doctor.types.js.map +1 -1
  231. package/dist/application/file-sandbox.js +49 -11
  232. package/dist/application/file-sandbox.js.map +1 -1
  233. package/dist/application/harness-context.js +4 -2
  234. package/dist/application/harness-context.js.map +1 -1
  235. package/dist/application/harness-hook-transforms.d.ts +8 -0
  236. package/dist/application/harness-hook-transforms.js +115 -0
  237. package/dist/application/harness-hook-transforms.js.map +1 -0
  238. package/dist/application/harness-hooks.d.ts +5 -3
  239. package/dist/application/harness-hooks.js +37 -50
  240. package/dist/application/harness-hooks.js.map +1 -1
  241. package/dist/application/harness-loop.d.ts +2 -1
  242. package/dist/application/harness-loop.js +95 -21
  243. package/dist/application/harness-loop.js.map +1 -1
  244. package/dist/application/harness-subagent.d.ts +1 -1
  245. package/dist/application/harness-subagent.js +63 -12
  246. package/dist/application/harness-subagent.js.map +1 -1
  247. package/dist/application/harness.types.d.ts +3 -0
  248. package/dist/application/harness.types.js.map +1 -1
  249. package/dist/application/hook-invocation.d.ts +4 -0
  250. package/dist/application/hook-invocation.js +59 -0
  251. package/dist/application/hook-invocation.js.map +1 -0
  252. package/dist/application/queue-worker.js +51 -9
  253. package/dist/application/queue-worker.js.map +1 -1
  254. package/dist/application/queue-worker.types.d.ts +1 -0
  255. package/dist/application/queue-worker.types.js.map +1 -1
  256. package/dist/application/recipes/native-schemas.constants.js +1439 -218
  257. package/dist/application/recipes/native-schemas.constants.js.map +1 -1
  258. package/dist/application/recovery-inspection.js +4 -1
  259. package/dist/application/recovery-inspection.js.map +1 -1
  260. package/dist/application/remote-download.js +15 -5
  261. package/dist/application/remote-download.js.map +1 -1
  262. package/dist/application/remote-paths.d.ts +1 -0
  263. package/dist/application/remote-paths.js +7 -0
  264. package/dist/application/remote-paths.js.map +1 -0
  265. package/dist/application/remote-validation.js +40 -9
  266. package/dist/application/remote-validation.js.map +1 -1
  267. package/dist/application/remote-workspace.js +17 -2
  268. package/dist/application/remote-workspace.js.map +1 -1
  269. package/dist/application/repetition-watchdog.js +3 -1
  270. package/dist/application/repetition-watchdog.js.map +1 -1
  271. package/dist/application/sandbox-attach.js +38 -9
  272. package/dist/application/sandbox-attach.js.map +1 -1
  273. package/dist/application/sandbox-dispatch.js +7 -1
  274. package/dist/application/sandbox-dispatch.js.map +1 -1
  275. package/dist/application/schedules.js +2 -0
  276. package/dist/application/schedules.js.map +1 -1
  277. package/dist/application/secrets.js +4 -0
  278. package/dist/application/secrets.js.map +1 -1
  279. package/dist/application/tool-execution.js +28 -8
  280. package/dist/application/tool-execution.js.map +1 -1
  281. package/dist/application/transport-retention.js +3 -3
  282. package/dist/application/transport-retention.js.map +1 -1
  283. package/dist/application/workspace-fingerprint.d.ts +1 -0
  284. package/dist/application/workspace-fingerprint.js +19 -4
  285. package/dist/application/workspace-fingerprint.js.map +1 -1
  286. package/dist/cli/doctor-command.js +12 -2
  287. package/dist/cli/doctor-command.js.map +1 -1
  288. package/dist/cli/image.js +2 -0
  289. package/dist/cli/image.js.map +1 -1
  290. package/dist/cli/main.constants.d.ts +14 -2
  291. package/dist/cli/main.constants.js +27 -1
  292. package/dist/cli/main.constants.js.map +1 -1
  293. package/dist/cli/project-settings.js +7 -1
  294. package/dist/cli/project-settings.js.map +1 -1
  295. package/dist/cli/recipe-yaml.js +8 -0
  296. package/dist/cli/recipe-yaml.js.map +1 -1
  297. package/dist/cli/recovery-command.js +3 -0
  298. package/dist/cli/recovery-command.js.map +1 -1
  299. package/dist/cli/recovery-unlock-command.d.ts +2 -0
  300. package/dist/cli/recovery-unlock-command.js +19 -0
  301. package/dist/cli/recovery-unlock-command.js.map +1 -0
  302. package/dist/cli/scaffold-files.js +4 -1
  303. package/dist/cli/scaffold-files.js.map +1 -1
  304. package/dist/cli/scaffold-validation.js +3 -0
  305. package/dist/cli/scaffold-validation.js.map +1 -1
  306. package/dist/cli/scaffold.js +2 -0
  307. package/dist/cli/scaffold.js.map +1 -1
  308. package/dist/domain/agent-hook.types.d.ts +28 -0
  309. package/dist/domain/agent-hook.types.js +2 -0
  310. package/dist/domain/agent-hook.types.js.map +1 -0
  311. package/dist/domain/agent-profile-hooks.d.ts +2 -0
  312. package/dist/domain/agent-profile-hooks.js +52 -0
  313. package/dist/domain/agent-profile-hooks.js.map +1 -0
  314. package/dist/domain/agent-profile-permissions.js +11 -1
  315. package/dist/domain/agent-profile-permissions.js.map +1 -1
  316. package/dist/domain/agent-profile.constants.d.ts +1 -0
  317. package/dist/domain/agent-profile.constants.js +9 -0
  318. package/dist/domain/agent-profile.constants.js.map +1 -1
  319. package/dist/domain/agent-profile.js +6 -1
  320. package/dist/domain/agent-profile.js.map +1 -1
  321. package/dist/domain/agent-profile.types.d.ts +11 -0
  322. package/dist/domain/agent-profile.types.js.map +1 -1
  323. package/dist/domain/agent.types.d.ts +2 -0
  324. package/dist/domain/agent.types.js.map +1 -1
  325. package/dist/domain/container-image.d.ts +1 -0
  326. package/dist/domain/container-image.js +8 -0
  327. package/dist/domain/container-image.js.map +1 -0
  328. package/dist/domain/context.constants.d.ts +1 -0
  329. package/dist/domain/context.constants.js +1 -0
  330. package/dist/domain/context.constants.js.map +1 -1
  331. package/dist/domain/context.js +6 -1
  332. package/dist/domain/context.js.map +1 -1
  333. package/dist/domain/egress.js +6 -1
  334. package/dist/domain/egress.js.map +1 -1
  335. package/dist/domain/glob.js +1 -1
  336. package/dist/domain/glob.js.map +1 -1
  337. package/dist/domain/harness.js +4 -1
  338. package/dist/domain/harness.js.map +1 -1
  339. package/dist/domain/hook-command.d.ts +2 -0
  340. package/dist/domain/hook-command.js +26 -0
  341. package/dist/domain/hook-command.js.map +1 -0
  342. package/dist/domain/hook-command.types.d.ts +7 -0
  343. package/dist/domain/hook-command.types.js +2 -0
  344. package/dist/domain/hook-command.types.js.map +1 -0
  345. package/dist/domain/hook-decision.d.ts +2 -0
  346. package/dist/domain/hook-decision.js +38 -0
  347. package/dist/domain/hook-decision.js.map +1 -0
  348. package/dist/domain/hook.constants.d.ts +3 -0
  349. package/dist/domain/hook.constants.js +31 -1
  350. package/dist/domain/hook.constants.js.map +1 -1
  351. package/dist/domain/hook.js +49 -5
  352. package/dist/domain/hook.js.map +1 -1
  353. package/dist/domain/hook.types.d.ts +82 -5
  354. package/dist/domain/hook.types.js.map +1 -1
  355. package/dist/domain/mcp-server.constants.d.ts +6 -0
  356. package/dist/domain/mcp-server.constants.js +6 -0
  357. package/dist/domain/mcp-server.constants.js.map +1 -1
  358. package/dist/domain/mcp-server.js +1 -0
  359. package/dist/domain/mcp-server.js.map +1 -1
  360. package/dist/domain/permissions.types.d.ts +1 -0
  361. package/dist/domain/permissions.types.js.map +1 -1
  362. package/dist/domain/pricing.js +4 -2
  363. package/dist/domain/pricing.js.map +1 -1
  364. package/dist/domain/redaction.js +6 -3
  365. package/dist/domain/redaction.js.map +1 -1
  366. package/dist/domain/secret-fault.d.ts +4 -0
  367. package/dist/domain/secret-fault.js +11 -0
  368. package/dist/domain/secret-fault.js.map +1 -0
  369. package/dist/domain/secrets.js +3 -2
  370. package/dist/domain/secrets.js.map +1 -1
  371. package/dist/domain/steering.js +2 -0
  372. package/dist/domain/steering.js.map +1 -1
  373. package/dist/domain/steering.types.d.ts +1 -1
  374. package/dist/domain/steering.types.js.map +1 -1
  375. package/dist/domain/transport.js +5 -1
  376. package/dist/domain/transport.js.map +1 -1
  377. package/dist/domain/trigger-payload.d.ts +4 -0
  378. package/dist/domain/trigger-payload.js +15 -0
  379. package/dist/domain/trigger-payload.js.map +1 -0
  380. package/dist/domain/workflow/checkpoint.js +19 -2
  381. package/dist/domain/workflow/checkpoint.js.map +1 -1
  382. package/dist/domain/workflow/retry.constants.d.ts +1 -0
  383. package/dist/domain/workflow/retry.constants.js +1 -0
  384. package/dist/domain/workflow/retry.constants.js.map +1 -1
  385. package/dist/domain/workflow/retry.js +6 -2
  386. package/dist/domain/workflow/retry.js.map +1 -1
  387. package/dist/domain/workflow/task-runner.js +5 -3
  388. package/dist/domain/workflow/task-runner.js.map +1 -1
  389. package/dist/domain/workflow/workflow-state.js +2 -1
  390. package/dist/domain/workflow/workflow-state.js.map +1 -1
  391. package/dist/domain/workflow.types.d.ts +1 -0
  392. package/dist/domain/workflow.types.js.map +1 -1
  393. package/dist/index.d.ts +15 -1
  394. package/dist/index.js +6 -0
  395. package/dist/index.js.map +1 -1
  396. package/dist/infrastructure/conversations/transcript-store.js +32 -5
  397. package/dist/infrastructure/conversations/transcript-store.js.map +1 -1
  398. package/dist/infrastructure/files.d.ts +1 -0
  399. package/dist/infrastructure/files.js +8 -4
  400. package/dist/infrastructure/files.js.map +1 -1
  401. package/dist/infrastructure/git/integration-candidate.js +3 -2
  402. package/dist/infrastructure/git/integration-candidate.js.map +1 -1
  403. package/dist/infrastructure/git/lock-recovery.d.ts +3 -0
  404. package/dist/infrastructure/git/lock-recovery.js +58 -0
  405. package/dist/infrastructure/git/lock-recovery.js.map +1 -0
  406. package/dist/infrastructure/git/lock-recovery.types.d.ts +11 -0
  407. package/dist/infrastructure/git/lock-recovery.types.js +2 -0
  408. package/dist/infrastructure/git/lock-recovery.types.js.map +1 -0
  409. package/dist/infrastructure/git/managed-worktree.js +5 -8
  410. package/dist/infrastructure/git/managed-worktree.js.map +1 -1
  411. package/dist/infrastructure/git/verification-command.js +35 -30
  412. package/dist/infrastructure/git/verification-command.js.map +1 -1
  413. package/dist/infrastructure/git/workspace-lease.js +12 -5
  414. package/dist/infrastructure/git/workspace-lease.js.map +1 -1
  415. package/dist/infrastructure/hook-configuration.constants.d.ts +1 -0
  416. package/dist/infrastructure/hook-configuration.constants.js +59 -0
  417. package/dist/infrastructure/hook-configuration.constants.js.map +1 -0
  418. package/dist/infrastructure/hook-configuration.d.ts +3 -0
  419. package/dist/infrastructure/hook-configuration.js +16 -0
  420. package/dist/infrastructure/hook-configuration.js.map +1 -0
  421. package/dist/infrastructure/hook-configuration.types.d.ts +14 -0
  422. package/dist/infrastructure/hook-configuration.types.js +2 -0
  423. package/dist/infrastructure/hook-configuration.types.js.map +1 -0
  424. package/dist/infrastructure/http-transport.constants.d.ts +1 -0
  425. package/dist/infrastructure/http-transport.constants.js +14 -0
  426. package/dist/infrastructure/http-transport.constants.js.map +1 -0
  427. package/dist/infrastructure/http-transport.d.ts +7 -0
  428. package/dist/infrastructure/http-transport.js +19 -0
  429. package/dist/infrastructure/http-transport.js.map +1 -0
  430. package/dist/infrastructure/input-failure.d.ts +4 -0
  431. package/dist/infrastructure/input-failure.js +14 -0
  432. package/dist/infrastructure/input-failure.js.map +1 -0
  433. package/dist/infrastructure/inspection-file.d.ts +1 -0
  434. package/dist/infrastructure/inspection-file.js +8 -2
  435. package/dist/infrastructure/inspection-file.js.map +1 -1
  436. package/dist/infrastructure/local-transport.js +16 -11
  437. package/dist/infrastructure/local-transport.js.map +1 -1
  438. package/dist/infrastructure/process.constants.d.ts +1 -0
  439. package/dist/infrastructure/process.constants.js +1 -0
  440. package/dist/infrastructure/process.constants.js.map +1 -1
  441. package/dist/infrastructure/process.d.ts +1 -0
  442. package/dist/infrastructure/process.js +48 -8
  443. package/dist/infrastructure/process.js.map +1 -1
  444. package/dist/infrastructure/reservation-ledger.d.ts +2 -0
  445. package/dist/infrastructure/reservation-ledger.js +84 -0
  446. package/dist/infrastructure/reservation-ledger.js.map +1 -0
  447. package/dist/infrastructure/reservation-recovery.d.ts +4 -0
  448. package/dist/infrastructure/reservation-recovery.js +28 -0
  449. package/dist/infrastructure/reservation-recovery.js.map +1 -0
  450. package/dist/infrastructure/s3-tombstones.d.ts +3 -0
  451. package/dist/infrastructure/s3-tombstones.js +46 -0
  452. package/dist/infrastructure/s3-tombstones.js.map +1 -0
  453. package/dist/infrastructure/s3-tombstones.types.d.ts +6 -0
  454. package/dist/infrastructure/s3-tombstones.types.js +2 -0
  455. package/dist/infrastructure/s3-tombstones.types.js.map +1 -0
  456. package/dist/infrastructure/s3-transport.d.ts +2 -0
  457. package/dist/infrastructure/s3-transport.js +4 -2
  458. package/dist/infrastructure/s3-transport.js.map +1 -1
  459. package/dist/infrastructure/sse.js +6 -3
  460. package/dist/infrastructure/sse.js.map +1 -1
  461. package/dist/infrastructure/task-queue-bullmq-connection.d.ts +3 -0
  462. package/dist/infrastructure/task-queue-bullmq-connection.js +32 -0
  463. package/dist/infrastructure/task-queue-bullmq-connection.js.map +1 -0
  464. package/dist/infrastructure/task-queue-bullmq-connection.types.d.ts +8 -0
  465. package/dist/infrastructure/task-queue-bullmq-connection.types.js +2 -0
  466. package/dist/infrastructure/task-queue-bullmq-connection.types.js.map +1 -0
  467. package/dist/infrastructure/task-queue-bullmq-resources.js +21 -15
  468. package/dist/infrastructure/task-queue-bullmq-resources.js.map +1 -1
  469. package/dist/infrastructure/task-queue-bullmq-state.d.ts +1 -0
  470. package/dist/infrastructure/task-queue-bullmq-state.js +1 -0
  471. package/dist/infrastructure/task-queue-bullmq-state.js.map +1 -1
  472. package/dist/infrastructure/task-queue-bullmq.constants.d.ts +2 -1
  473. package/dist/infrastructure/task-queue-bullmq.constants.js +2 -1
  474. package/dist/infrastructure/task-queue-bullmq.constants.js.map +1 -1
  475. package/dist/infrastructure/task-queue-bullmq.js +10 -1
  476. package/dist/infrastructure/task-queue-bullmq.js.map +1 -1
  477. package/dist/infrastructure/task-queue.js +13 -4
  478. package/dist/infrastructure/task-queue.js.map +1 -1
  479. package/dist/infrastructure/transfer-copy.d.ts +1 -0
  480. package/dist/infrastructure/transfer-copy.js +16 -1
  481. package/dist/infrastructure/transfer-copy.js.map +1 -1
  482. package/dist/infrastructure/transport-archive.d.ts +3 -3
  483. package/dist/infrastructure/transport-archive.js +71 -48
  484. package/dist/infrastructure/transport-archive.js.map +1 -1
  485. package/dist/infrastructure/transport-archive.types.d.ts +3 -0
  486. package/dist/infrastructure/transport-archive.types.js.map +1 -1
  487. package/dist/infrastructure/transport-checkpoint.js +14 -4
  488. package/dist/infrastructure/transport-checkpoint.js.map +1 -1
  489. package/dist/infrastructure/transport-envelope.d.ts +1 -0
  490. package/dist/infrastructure/transport-envelope.js +22 -5
  491. package/dist/infrastructure/transport-envelope.js.map +1 -1
  492. package/dist/infrastructure/transport-reservations.constants.d.ts +2 -0
  493. package/dist/infrastructure/transport-reservations.constants.js +3 -0
  494. package/dist/infrastructure/transport-reservations.constants.js.map +1 -0
  495. package/dist/infrastructure/transport-reservations.d.ts +1 -2
  496. package/dist/infrastructure/transport-reservations.js +18 -22
  497. package/dist/infrastructure/transport-reservations.js.map +1 -1
  498. package/dist/infrastructure/transport-reservations.types.d.ts +23 -2
  499. package/dist/infrastructure/transport-reservations.types.js.map +1 -1
  500. package/dist/infrastructure/trigger-server.js +12 -9
  501. package/dist/infrastructure/trigger-server.js.map +1 -1
  502. package/dist/infrastructure/trigger-server.types.d.ts +1 -1
  503. package/dist/infrastructure/trigger-server.types.js.map +1 -1
  504. package/dist/infrastructure/workflow-checkpoint.constants.d.ts +1 -0
  505. package/dist/infrastructure/workflow-checkpoint.constants.js +1 -0
  506. package/dist/infrastructure/workflow-checkpoint.constants.js.map +1 -1
  507. package/dist/infrastructure/workspace-lock.constants.d.ts +2 -1
  508. package/dist/infrastructure/workspace-lock.constants.js +2 -1
  509. package/dist/infrastructure/workspace-lock.constants.js.map +1 -1
  510. package/dist/infrastructure/workspace-lock.js +48 -10
  511. package/dist/infrastructure/workspace-lock.js.map +1 -1
  512. package/dist/providers/cloud-cache.js +14 -9
  513. package/dist/providers/cloud-cache.js.map +1 -1
  514. package/dist/providers/cloud-cache.types.d.ts +1 -0
  515. package/dist/providers/cloud-cache.types.js.map +1 -1
  516. package/dist/providers/cloud-files.js +3 -4
  517. package/dist/providers/cloud-files.js.map +1 -1
  518. package/dist/providers/cloud-input.constants.d.ts +2 -2
  519. package/dist/providers/cloud-input.constants.js +2 -1
  520. package/dist/providers/cloud-input.constants.js.map +1 -1
  521. package/dist/providers/cloud-input.d.ts +2 -2
  522. package/dist/providers/cloud-input.js +14 -3
  523. package/dist/providers/cloud-input.js.map +1 -1
  524. package/dist/providers/container-command.js +30 -5
  525. package/dist/providers/container-command.js.map +1 -1
  526. package/dist/providers/container-egress.constants.d.ts +7 -0
  527. package/dist/providers/container-egress.constants.js +8 -0
  528. package/dist/providers/container-egress.constants.js.map +1 -0
  529. package/dist/providers/container-egress.d.ts +7 -0
  530. package/dist/providers/container-egress.js +101 -0
  531. package/dist/providers/container-egress.js.map +1 -0
  532. package/dist/providers/container-files.js +10 -11
  533. package/dist/providers/container-files.js.map +1 -1
  534. package/dist/providers/container-mounts.js +3 -0
  535. package/dist/providers/container-mounts.js.map +1 -1
  536. package/dist/providers/container-network.js +16 -1
  537. package/dist/providers/container-network.js.map +1 -1
  538. package/dist/providers/container-plan.js +7 -10
  539. package/dist/providers/container-plan.js.map +1 -1
  540. package/dist/providers/container-recovery.js +8 -3
  541. package/dist/providers/container-recovery.js.map +1 -1
  542. package/dist/providers/container.js +36 -5
  543. package/dist/providers/container.js.map +1 -1
  544. package/dist/providers/container.types.d.ts +1 -0
  545. package/dist/providers/container.types.js.map +1 -1
  546. package/dist/providers/daytona-command.constants.js +4 -1
  547. package/dist/providers/daytona-command.constants.js.map +1 -1
  548. package/dist/providers/daytona-command.js +39 -16
  549. package/dist/providers/daytona-command.js.map +1 -1
  550. package/dist/providers/daytona-files.js +5 -5
  551. package/dist/providers/daytona-files.js.map +1 -1
  552. package/dist/providers/daytona-output.js +11 -3
  553. package/dist/providers/daytona-output.js.map +1 -1
  554. package/dist/providers/daytona.js +11 -9
  555. package/dist/providers/daytona.js.map +1 -1
  556. package/dist/providers/egress/address.d.ts +3 -0
  557. package/dist/providers/egress/address.js +26 -0
  558. package/dist/providers/egress/address.js.map +1 -0
  559. package/dist/providers/egress/egress.constants.d.ts +22 -0
  560. package/dist/providers/egress/egress.constants.js +23 -0
  561. package/dist/providers/egress/egress.constants.js.map +1 -0
  562. package/dist/providers/egress/egress.types.d.ts +11 -0
  563. package/dist/providers/egress/egress.types.js +2 -0
  564. package/dist/providers/egress/egress.types.js.map +1 -0
  565. package/dist/providers/egress/firewall.d.ts +3 -0
  566. package/dist/providers/egress/firewall.js +29 -0
  567. package/dist/providers/egress/firewall.js.map +1 -0
  568. package/dist/providers/egress/main.d.ts +1 -0
  569. package/dist/providers/egress/main.js +90 -0
  570. package/dist/providers/egress/main.js.map +1 -0
  571. package/dist/providers/egress/policy.d.ts +5 -0
  572. package/dist/providers/egress/policy.js +54 -0
  573. package/dist/providers/egress/policy.js.map +1 -0
  574. package/dist/providers/egress/proxy.d.ts +2 -0
  575. package/dist/providers/egress/proxy.js +129 -0
  576. package/dist/providers/egress/proxy.js.map +1 -0
  577. package/dist/providers/egress/tls-hello.d.ts +1 -0
  578. package/dist/providers/egress/tls-hello.js +75 -0
  579. package/dist/providers/egress/tls-hello.js.map +1 -0
  580. package/dist/providers/firecracker-command.js +12 -6
  581. package/dist/providers/firecracker-command.js.map +1 -1
  582. package/dist/providers/local-files.d.ts +2 -0
  583. package/dist/providers/local-files.js +24 -0
  584. package/dist/providers/local-files.js.map +1 -0
  585. package/dist/providers/local.js +2 -20
  586. package/dist/providers/local.js.map +1 -1
  587. package/dist/providers/vercel-command.js +33 -9
  588. package/dist/providers/vercel-command.js.map +1 -1
  589. package/dist/providers/vercel.js +11 -9
  590. package/dist/providers/vercel.js.map +1 -1
  591. package/dist/testing.d.ts +1 -1
  592. package/dist/testing.js +1 -1
  593. package/dist/testing.js.map +1 -1
  594. package/package.json +2 -2
  595. package/recipe-configuration.schema.json +2164 -35
  596. package/recipe.schema.json +2512 -404
@@ -27,7 +27,7 @@ export async function runTask(item, runtime) {
27
27
  finish(item, "skipped");
28
28
  return;
29
29
  }
30
- const cache = item.cache
30
+ const cache = item.cache && state.attempts === 0 && state.rounds === undefined
31
31
  ? await lookupTaskCache(item, item.cache, runtime)
32
32
  : undefined;
33
33
  if (cache?.hit) {
@@ -73,6 +73,10 @@ export async function runTask(item, runtime) {
73
73
  }
74
74
  }
75
75
  async function complete(item, runtime, cache, value) {
76
+ if (runtime.options.checkpoint) {
77
+ checkpointValue(value);
78
+ value = structuredClone(value);
79
+ }
76
80
  if (item.cache && cache && !cache.hit)
77
81
  await storeTaskCache(item, item.cache, runtime, cache.fingerprint, value);
78
82
  runtime.values.set(item, value);
@@ -112,8 +116,6 @@ async function perform(item, runtime, cache) {
112
116
  taskSignal.throwIfAborted();
113
117
  value = await item.perform(context(item, attempt, taskSignal));
114
118
  taskSignal.throwIfAborted();
115
- if (options.checkpoint)
116
- checkpointValue(value);
117
119
  completed = true;
118
120
  }
119
121
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"task-runner.js","sourceRoot":"","sources":["../../../src/domain/workflow/task-runner.ts"],"names":[],"mappings":"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","sourcesContent":["import { InputSuspension } from \"./input.ts\";\nimport { loopDefinition } from \"./loop-task.ts\";\nimport { runLoopTask } from \"./loop-runner.ts\";\nimport { checkpointValue } from \"./checkpoint-value.ts\";\nimport {\n WorkflowBudgetExceeded,\n WorkflowUsageUnavailable,\n WorkflowCostUnavailable,\n} from \"./budget.ts\";\nimport { awaitQuotaReset, pauseForQuota } from \"./quota-pause.ts\";\nimport { retryDelay, waitForRetry } from \"./retry.ts\";\nimport { lookupTaskCache, storeTaskCache } from \"./task-cache.ts\";\nimport { quotaFault } from \"../quota.ts\";\nimport { OutpostError } from \"../errors.ts\";\nimport type { Task, WorkflowExecutionState } from \"../workflow.types.ts\";\nimport type { TaskCacheLookup } from \"./task-cache.types.ts\";\n\nexport async function runTask(\n item: Task,\n runtime: WorkflowExecutionState,\n): Promise<void> {\n const {\n record,\n signal,\n context,\n emit,\n finish,\n errors,\n options,\n stop,\n values,\n } = runtime;\n const state = record(item);\n if (state.quota && !(await awaitQuotaReset(item, runtime, true))) return;\n state.status = \"active\";\n delete state.error;\n delete state.finishedAt;\n delete state.cacheHit;\n state.startedAt = new Date().toISOString();\n emit({ type: \"task\", key: item.key, status: \"active\", attempt: 0 });\n try {\n await runtime.persist();\n signal.throwIfAborted();\n if (item.condition && !(await item.condition(context(item, 0, signal)))) {\n signal.throwIfAborted();\n finish(item, \"skipped\");\n return;\n }\n const cache = item.cache\n ? await lookupTaskCache(item, item.cache, runtime)\n : undefined;\n if (cache?.hit) {\n values.set(item, cache.value);\n state.cacheHit = true;\n finish(item, \"done\");\n return;\n }\n while (true) {\n try {\n await perform(item, runtime, cache);\n return;\n } catch (error) {\n if (!(await pauseForQuota(item, runtime, error))) throw error;\n if (!(await awaitQuotaReset(item, runtime, false))) return;\n state.status = \"active\";\n delete state.finishedAt;\n emit({ type: \"task\", key: item.key, status: \"active\", attempt: 0 });\n await runtime.persist();\n }\n }\n } catch (error) {\n state.error = error instanceof Error ? error.message : String(error);\n if (\n signal.aborted ||\n ((error instanceof WorkflowBudgetExceeded ||\n error instanceof WorkflowUsageUnavailable ||\n error instanceof WorkflowCostUnavailable) &&\n runtime.accounting.exhausted)\n )\n finish(item, \"cancelled\");\n else {\n errors.push(error);\n finish(item, \"failed\");\n if (options.stopOnError !== false) stop.abort(error);\n }\n } finally {\n await runtime.persist();\n }\n}\n\nasync function complete(\n item: Task,\n runtime: WorkflowExecutionState,\n cache: TaskCacheLookup | undefined,\n value: unknown,\n): Promise<void> {\n if (item.cache && cache && !cache.hit)\n await storeTaskCache(item, item.cache, runtime, cache.fingerprint, value);\n runtime.values.set(item, value);\n runtime.finish(item, \"done\");\n}\n\nasync function perform(\n item: Task,\n runtime: WorkflowExecutionState,\n cache: TaskCacheLookup | undefined,\n): Promise<void> {\n const { record, signal, context, emit, finish, options } = runtime;\n const state = record(item);\n const loop = loopDefinition(item);\n if (loop) {\n const value = await runLoopTask(item, loop, runtime);\n signal.throwIfAborted();\n await complete(item, runtime, cache, value);\n return;\n }\n const limit = item.retry?.attempts ?? 1;\n const priorAttempts = state.attempts;\n for (let cycle = 1; cycle <= limit; cycle++) {\n const attempt = priorAttempts + cycle;\n signal.throwIfAborted();\n runtime.accounting.admit();\n state.attempts = attempt;\n emit({ type: \"attempt\", key: item.key, attempt });\n await runtime.persist();\n let delayMs = 0;\n let completed = false;\n let value: unknown;\n const deadline = new AbortController();\n const timer =\n item.timeoutMs === undefined\n ? undefined\n : setTimeout(\n () =>\n deadline.abort(\n new OutpostError(\"timeout\", `${item.key} timed out`, {\n key: item.key,\n timeoutMs: item.timeoutMs,\n }),\n ),\n item.timeoutMs,\n );\n const taskSignal = AbortSignal.any([signal, deadline.signal]);\n try {\n taskSignal.throwIfAborted();\n value = await item.perform(context(item, attempt, taskSignal));\n taskSignal.throwIfAborted();\n if (options.checkpoint) checkpointValue(value);\n completed = true;\n } catch (error) {\n runtime.closeAttempt(item);\n if (error instanceof InputSuspension && item.interaction) {\n state.interaction = error.interaction;\n finish(item, \"waiting-input\");\n emit({\n type: \"input-request\",\n key: item.key,\n status: \"waiting-input\",\n });\n return;\n }\n if (\n signal.aborted ||\n cycle === limit ||\n (options.onQuota && quotaFault(error)) ||\n item.retry?.accepts?.(error, attempt) === false\n )\n throw deadline.signal.aborted ? deadline.signal.reason : error;\n delayMs = retryDelay(item.retry, cycle, error);\n emit({ type: \"retry\", key: item.key, attempt, delayMs });\n } finally {\n runtime.closeAttempt(item);\n clearTimeout(timer);\n }\n if (completed) {\n await complete(item, runtime, cache, value);\n return;\n }\n await waitForRetry(delayMs, signal);\n }\n}\n"]}
1
+ {"version":3,"file":"task-runner.js","sourceRoot":"","sources":["../../../src/domain/workflow/task-runner.ts"],"names":[],"mappings":"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","sourcesContent":["import { InputSuspension } from \"./input.ts\";\nimport { loopDefinition } from \"./loop-task.ts\";\nimport { runLoopTask } from \"./loop-runner.ts\";\nimport { checkpointValue } from \"./checkpoint-value.ts\";\nimport {\n WorkflowBudgetExceeded,\n WorkflowUsageUnavailable,\n WorkflowCostUnavailable,\n} from \"./budget.ts\";\nimport { awaitQuotaReset, pauseForQuota } from \"./quota-pause.ts\";\nimport { retryDelay, waitForRetry } from \"./retry.ts\";\nimport { lookupTaskCache, storeTaskCache } from \"./task-cache.ts\";\nimport { quotaFault } from \"../quota.ts\";\nimport { OutpostError } from \"../errors.ts\";\nimport type { Task, WorkflowExecutionState } from \"../workflow.types.ts\";\nimport type { TaskCacheLookup } from \"./task-cache.types.ts\";\n\nexport async function runTask(\n item: Task,\n runtime: WorkflowExecutionState,\n): Promise<void> {\n const {\n record,\n signal,\n context,\n emit,\n finish,\n errors,\n options,\n stop,\n values,\n } = runtime;\n const state = record(item);\n if (state.quota && !(await awaitQuotaReset(item, runtime, true))) return;\n state.status = \"active\";\n delete state.error;\n delete state.finishedAt;\n delete state.cacheHit;\n state.startedAt = new Date().toISOString();\n emit({ type: \"task\", key: item.key, status: \"active\", attempt: 0 });\n try {\n await runtime.persist();\n signal.throwIfAborted();\n if (item.condition && !(await item.condition(context(item, 0, signal)))) {\n signal.throwIfAborted();\n finish(item, \"skipped\");\n return;\n }\n const cache =\n item.cache && state.attempts === 0 && state.rounds === undefined\n ? await lookupTaskCache(item, item.cache, runtime)\n : undefined;\n if (cache?.hit) {\n values.set(item, cache.value);\n state.cacheHit = true;\n finish(item, \"done\");\n return;\n }\n while (true) {\n try {\n await perform(item, runtime, cache);\n return;\n } catch (error) {\n if (!(await pauseForQuota(item, runtime, error))) throw error;\n if (!(await awaitQuotaReset(item, runtime, false))) return;\n state.status = \"active\";\n delete state.finishedAt;\n emit({ type: \"task\", key: item.key, status: \"active\", attempt: 0 });\n await runtime.persist();\n }\n }\n } catch (error) {\n state.error = error instanceof Error ? error.message : String(error);\n if (\n signal.aborted ||\n ((error instanceof WorkflowBudgetExceeded ||\n error instanceof WorkflowUsageUnavailable ||\n error instanceof WorkflowCostUnavailable) &&\n runtime.accounting.exhausted)\n )\n finish(item, \"cancelled\");\n else {\n errors.push(error);\n finish(item, \"failed\");\n if (options.stopOnError !== false) stop.abort(error);\n }\n } finally {\n await runtime.persist();\n }\n}\n\nasync function complete(\n item: Task,\n runtime: WorkflowExecutionState,\n cache: TaskCacheLookup | undefined,\n value: unknown,\n): Promise<void> {\n if (runtime.options.checkpoint) {\n checkpointValue(value);\n value = structuredClone(value);\n }\n if (item.cache && cache && !cache.hit)\n await storeTaskCache(item, item.cache, runtime, cache.fingerprint, value);\n runtime.values.set(item, value);\n runtime.finish(item, \"done\");\n}\n\nasync function perform(\n item: Task,\n runtime: WorkflowExecutionState,\n cache: TaskCacheLookup | undefined,\n): Promise<void> {\n const { record, signal, context, emit, finish, options } = runtime;\n const state = record(item);\n const loop = loopDefinition(item);\n if (loop) {\n const value = await runLoopTask(item, loop, runtime);\n signal.throwIfAborted();\n await complete(item, runtime, cache, value);\n return;\n }\n const limit = item.retry?.attempts ?? 1;\n const priorAttempts = state.attempts;\n for (let cycle = 1; cycle <= limit; cycle++) {\n const attempt = priorAttempts + cycle;\n signal.throwIfAborted();\n runtime.accounting.admit();\n state.attempts = attempt;\n emit({ type: \"attempt\", key: item.key, attempt });\n await runtime.persist();\n let delayMs = 0;\n let completed = false;\n let value: unknown;\n const deadline = new AbortController();\n const timer =\n item.timeoutMs === undefined\n ? undefined\n : setTimeout(\n () =>\n deadline.abort(\n new OutpostError(\"timeout\", `${item.key} timed out`, {\n key: item.key,\n timeoutMs: item.timeoutMs,\n }),\n ),\n item.timeoutMs,\n );\n const taskSignal = AbortSignal.any([signal, deadline.signal]);\n try {\n taskSignal.throwIfAborted();\n value = await item.perform(context(item, attempt, taskSignal));\n taskSignal.throwIfAborted();\n completed = true;\n } catch (error) {\n runtime.closeAttempt(item);\n if (error instanceof InputSuspension && item.interaction) {\n state.interaction = error.interaction;\n finish(item, \"waiting-input\");\n emit({\n type: \"input-request\",\n key: item.key,\n status: \"waiting-input\",\n });\n return;\n }\n if (\n signal.aborted ||\n cycle === limit ||\n (options.onQuota && quotaFault(error)) ||\n item.retry?.accepts?.(error, attempt) === false\n )\n throw deadline.signal.aborted ? deadline.signal.reason : error;\n delayMs = retryDelay(item.retry, cycle, error);\n emit({ type: \"retry\", key: item.key, attempt, delayMs });\n } finally {\n runtime.closeAttempt(item);\n clearTimeout(timer);\n }\n if (completed) {\n await complete(item, runtime, cache, value);\n return;\n }\n await waitForRetry(delayMs, signal);\n }\n}\n"]}
@@ -203,7 +203,8 @@ export function workflowState(name, tasks, options, checkpoint) {
203
203
  throw new Error(`${item.key}: undeclared dependency ${dependency.key}`);
204
204
  if (!values.has(dependency))
205
205
  throw new Error(`${dependency.key} has no successful value`);
206
- return values.get(dependency);
206
+ const value = values.get(dependency);
207
+ return checkpoint ? structuredClone(value) : value;
207
208
  },
208
209
  };
209
210
  }
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-state.js","sourceRoot":"","sources":["../../../src/domain/workflow/workflow-state.ts"],"names":[],"mappings":"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","sourcesContent":["import { interactionContext, immutableInput } from \"./input.ts\";\nimport { checkpointValue } from \"./checkpoint-value.ts\";\nimport { taskIdempotencyKey } from \"./idempotency.ts\";\nimport { createObservationHub } from \"../observation.ts\";\nimport { maxUsageReceiptsPerTask } from \"./usage-receipt.constants.ts\";\nimport { validateUsageReceipt } from \"./usage-receipt.ts\";\nimport type { Usage } from \"../agent.types.ts\";\nimport type { WorkflowCheckpointSession } from \"./checkpoint.types.ts\";\nimport type { WorkflowQuotaPause } from \"./quota-pause.types.ts\";\nimport { workflowAccounting } from \"./budget.ts\";\nimport { randomUUID } from \"node:crypto\";\nimport { OutpostError } from \"../errors.ts\";\nimport type {\n Task,\n TaskContext,\n TaskRecord,\n TaskStatus,\n WorkflowEvent,\n WorkflowExecutionState,\n WorkflowOptions,\n} from \"../workflow.types.ts\";\n\nexport function workflowState(\n name: string,\n tasks: readonly Task[],\n options: WorkflowOptions,\n checkpoint?: WorkflowCheckpointSession,\n): WorkflowExecutionState {\n const executionId = checkpoint?.initial?.executionId ?? randomUUID();\n const observation = (options.observation ?? createObservationHub()).child(\n { executionId },\n [\n {\n observe(value) {\n if (value.event.kind === \"workflow\")\n return options.telemetry?.observe(value.event.event);\n },\n },\n {\n observe(value) {\n if (value.event.kind === \"workflow\")\n return options.observe?.(value.event.event);\n },\n },\n ],\n options.redact,\n );\n const stop = new AbortController();\n const signal = options.signal\n ? AbortSignal.any([options.signal, stop.signal])\n : stop.signal;\n const values = new Map<Task, unknown>();\n const activeAttempts = new Map<Task, number>();\n const quotaResumes = new Map<Task, WorkflowQuotaPause>();\n const records = new Map<Task, TaskRecord>(\n tasks.map((item) => [\n item,\n { key: item.key, status: \"waiting\", attempts: 0 },\n ]),\n );\n const saved = checkpoint?.initial;\n if (saved) {\n const complete = saved.records.every((entry) =>\n [\"done\", \"skipped\"].includes(entry.status),\n );\n const settledPause =\n saved.records.some((entry) =>\n [\"paused\", \"rejected\", \"waiting-input\"].includes(entry.status),\n ) &&\n saved.records.every(\n (entry) =>\n [\"done\", \"skipped\", \"paused\", \"rejected\", \"waiting-input\"].includes(\n entry.status,\n ) ||\n (entry.status === \"waiting\" && entry.attempts === 0),\n );\n for (const item of tasks) {\n const entry = saved.records.find((entry) => entry.key === item.key)!;\n records.set(item, {\n ...entry,\n ...(entry.interaction\n ? { interaction: immutableInput(entry.interaction) }\n : {}),\n ...(entry.usageReceipts\n ? { usageReceipts: Object.freeze([...entry.usageReceipts]) }\n : {}),\n ...(entry.pause\n ? {\n pause: Object.freeze({\n ...entry.pause,\n actors: Object.freeze([...entry.pause.actors]),\n }),\n }\n : {}),\n ...(entry.decision\n ? { decision: Object.freeze({ ...entry.decision }) }\n : {}),\n ...(entry.quota ? { quota: Object.freeze({ ...entry.quota }) } : {}),\n status:\n [\"done\", \"paused\", \"rejected\", \"waiting-input\"].includes(\n entry.status,\n ) ||\n complete ||\n (settledPause && entry.status === \"skipped\")\n ? entry.status\n : \"waiting\",\n });\n if (entry.status === \"done\") {\n const output = saved.values[item.key]!;\n values.set(item, output.kind === \"json\" ? output.value : undefined);\n }\n }\n }\n const errors: unknown[] = [],\n observerErrors: unknown[] = [];\n for (const entry of records.values())\n if (entry.status === \"rejected\")\n errors.push(\n new OutpostError(\"rejected\", entry.error!, {\n key: entry.key,\n actor: entry.decision!.actor,\n reason: entry.decision!.reason,\n }),\n );\n const accounting = workflowAccounting(\n options.budget,\n (error) => {\n errors.push(error);\n emit({ type: \"budget-exceeded\" });\n if (error.dimension !== \"attempts\") stop.abort(error);\n },\n saved?.usage,\n );\n const record = (item: Task) => records.get(item)!;\n function emit(\n event: Omit<WorkflowEvent, \"executionId\" | \"workflow\" | \"timestamp\">,\n ): void {\n const notification: WorkflowEvent = {\n ...event,\n accounting: accounting.snapshot(),\n ...([\"start\", \"finish\"].includes(event.type)\n ? { tasks: [...records.values()].map((record) => ({ ...record })) }\n : {}),\n executionId,\n workflow: name,\n timestamp: new Date().toISOString(),\n };\n observation\n .child({\n ...(event.key ? { taskKey: event.key } : {}),\n ...(event.attempt === undefined ? {} : { attempt: event.attempt }),\n })\n .emit(\"workflow\", { kind: \"workflow\", event: notification });\n }\n function finish(item: Task, status: TaskStatus): void {\n Object.assign(record(item), {\n status,\n finishedAt: new Date().toISOString(),\n });\n emit({\n type: \"task\",\n key: item.key,\n status,\n attempt: record(item).attempts,\n ...(record(item).error ? { error: record(item).error } : {}),\n ...(record(item).startedAt\n ? { durationMs: Date.now() - Date.parse(record(item).startedAt!) }\n : {}),\n });\n }\n function context(\n item: Task,\n attempt: number,\n taskSignal: AbortSignal,\n ): TaskContext {\n if (attempt > 0) activeAttempts.set(item, attempt);\n function report(usage: Usage, receipt?: string): void {\n const current = record(item);\n if (\n attempt === 0 ||\n current.status !== \"active\" ||\n activeAttempts.get(item) !== attempt\n )\n throw new Error(\n \"Usage must be reported during its active task attempt\",\n );\n if (receipt !== undefined) {\n validateUsageReceipt(receipt);\n if (current.usageReceipts?.includes(receipt)) return;\n if ((current.usageReceipts?.length ?? 0) >= maxUsageReceiptsPerTask)\n throw new Error(\"Workflow usage receipt limit exceeded\");\n }\n const previousReceipts = current.usageReceipts;\n if (receipt !== undefined)\n current.usageReceipts = Object.freeze([\n ...(previousReceipts ?? []),\n receipt,\n ]);\n try {\n accounting.report(usage);\n } catch (error) {\n if (previousReceipts) current.usageReceipts = previousReceipts;\n else delete current.usageReceipts;\n throw error;\n }\n void runtime.persist().catch((error: unknown) => stop.abort(error));\n emit({\n type: \"usage\",\n key: item.key,\n attempt,\n usage: Object.freeze({ ...usage }),\n });\n }\n\n return {\n ...(item.interaction\n ? {\n interaction: interactionContext(\n item,\n runtime,\n attempt,\n taskSignal,\n () => activeAttempts.get(item) === attempt,\n ),\n }\n : {}),\n ...(attempt > 0 && quotaResumes.has(item)\n ? { quota: quotaResumes.get(item)! }\n : {}),\n ...(options.budget?.prices ? { prices: options.budget.prices } : {}),\n observation: observation.child({ taskKey: item.key, attempt }),\n signal: taskSignal,\n attempt,\n executionId,\n idempotencyKey: taskIdempotencyKey(executionId, item.key),\n checkpoint: () => runtime.persist(),\n ...(checkpoint?.workspaceResources\n ? {\n workspaceCheckpoint: {\n read: (key: string) => checkpoint.workspaceResources?.get(key),\n async write(\n key: string,\n description: import(\"./checkpoint.types.ts\").WorkflowJson,\n ) {\n if (!key.trim())\n throw new Error(\n \"Workspace checkpoint resource key must not be empty\",\n );\n checkpointValue(description);\n checkpoint.workspaceResources?.set(key, description);\n await runtime.persist();\n },\n },\n }\n : {}),\n reportUsage: (usage) => report(usage),\n reportUsageOnce: (receipt, usage) => {\n validateUsageReceipt(receipt);\n report(usage, receipt);\n },\n value<T>(dependency: Task<T>): T {\n if (!item.after.includes(dependency))\n throw new Error(\n `${item.key}: undeclared dependency ${dependency.key}`,\n );\n if (!values.has(dependency))\n throw new Error(`${dependency.key} has no successful value`);\n return values.get(dependency) as T;\n },\n };\n }\n\n const runtime: WorkflowExecutionState = {\n workflow: name,\n observation,\n async persist() {\n await checkpoint?.save(runtime);\n if (checkpoint) emit({ type: \"checkpoint\" });\n },\n executionId,\n accounting,\n closeAttempt(item) {\n activeAttempts.delete(item);\n quotaResumes.delete(item);\n },\n quotaResumes,\n stop,\n signal,\n values,\n records,\n errors,\n observerErrors,\n record,\n emit,\n finish,\n context,\n options,\n };\n return runtime;\n}\n"]}
1
+ {"version":3,"file":"workflow-state.js","sourceRoot":"","sources":["../../../src/domain/workflow/workflow-state.ts"],"names":[],"mappings":"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","sourcesContent":["import { interactionContext, immutableInput } from \"./input.ts\";\nimport { checkpointValue } from \"./checkpoint-value.ts\";\nimport { taskIdempotencyKey } from \"./idempotency.ts\";\nimport { createObservationHub } from \"../observation.ts\";\nimport { maxUsageReceiptsPerTask } from \"./usage-receipt.constants.ts\";\nimport { validateUsageReceipt } from \"./usage-receipt.ts\";\nimport type { Usage } from \"../agent.types.ts\";\nimport type { WorkflowCheckpointSession } from \"./checkpoint.types.ts\";\nimport type { WorkflowQuotaPause } from \"./quota-pause.types.ts\";\nimport { workflowAccounting } from \"./budget.ts\";\nimport { randomUUID } from \"node:crypto\";\nimport { OutpostError } from \"../errors.ts\";\nimport type {\n Task,\n TaskContext,\n TaskRecord,\n TaskStatus,\n WorkflowEvent,\n WorkflowExecutionState,\n WorkflowOptions,\n} from \"../workflow.types.ts\";\n\nexport function workflowState(\n name: string,\n tasks: readonly Task[],\n options: WorkflowOptions,\n checkpoint?: WorkflowCheckpointSession,\n): WorkflowExecutionState {\n const executionId = checkpoint?.initial?.executionId ?? randomUUID();\n const observation = (options.observation ?? createObservationHub()).child(\n { executionId },\n [\n {\n observe(value) {\n if (value.event.kind === \"workflow\")\n return options.telemetry?.observe(value.event.event);\n },\n },\n {\n observe(value) {\n if (value.event.kind === \"workflow\")\n return options.observe?.(value.event.event);\n },\n },\n ],\n options.redact,\n );\n const stop = new AbortController();\n const signal = options.signal\n ? AbortSignal.any([options.signal, stop.signal])\n : stop.signal;\n const values = new Map<Task, unknown>();\n const activeAttempts = new Map<Task, number>();\n const quotaResumes = new Map<Task, WorkflowQuotaPause>();\n const records = new Map<Task, TaskRecord>(\n tasks.map((item) => [\n item,\n { key: item.key, status: \"waiting\", attempts: 0 },\n ]),\n );\n const saved = checkpoint?.initial;\n if (saved) {\n const complete = saved.records.every((entry) =>\n [\"done\", \"skipped\"].includes(entry.status),\n );\n const settledPause =\n saved.records.some((entry) =>\n [\"paused\", \"rejected\", \"waiting-input\"].includes(entry.status),\n ) &&\n saved.records.every(\n (entry) =>\n [\"done\", \"skipped\", \"paused\", \"rejected\", \"waiting-input\"].includes(\n entry.status,\n ) ||\n (entry.status === \"waiting\" && entry.attempts === 0),\n );\n for (const item of tasks) {\n const entry = saved.records.find((entry) => entry.key === item.key)!;\n records.set(item, {\n ...entry,\n ...(entry.interaction\n ? { interaction: immutableInput(entry.interaction) }\n : {}),\n ...(entry.usageReceipts\n ? { usageReceipts: Object.freeze([...entry.usageReceipts]) }\n : {}),\n ...(entry.pause\n ? {\n pause: Object.freeze({\n ...entry.pause,\n actors: Object.freeze([...entry.pause.actors]),\n }),\n }\n : {}),\n ...(entry.decision\n ? { decision: Object.freeze({ ...entry.decision }) }\n : {}),\n ...(entry.quota ? { quota: Object.freeze({ ...entry.quota }) } : {}),\n status:\n [\"done\", \"paused\", \"rejected\", \"waiting-input\"].includes(\n entry.status,\n ) ||\n complete ||\n (settledPause && entry.status === \"skipped\")\n ? entry.status\n : \"waiting\",\n });\n if (entry.status === \"done\") {\n const output = saved.values[item.key]!;\n values.set(item, output.kind === \"json\" ? output.value : undefined);\n }\n }\n }\n const errors: unknown[] = [],\n observerErrors: unknown[] = [];\n for (const entry of records.values())\n if (entry.status === \"rejected\")\n errors.push(\n new OutpostError(\"rejected\", entry.error!, {\n key: entry.key,\n actor: entry.decision!.actor,\n reason: entry.decision!.reason,\n }),\n );\n const accounting = workflowAccounting(\n options.budget,\n (error) => {\n errors.push(error);\n emit({ type: \"budget-exceeded\" });\n if (error.dimension !== \"attempts\") stop.abort(error);\n },\n saved?.usage,\n );\n const record = (item: Task) => records.get(item)!;\n function emit(\n event: Omit<WorkflowEvent, \"executionId\" | \"workflow\" | \"timestamp\">,\n ): void {\n const notification: WorkflowEvent = {\n ...event,\n accounting: accounting.snapshot(),\n ...([\"start\", \"finish\"].includes(event.type)\n ? { tasks: [...records.values()].map((record) => ({ ...record })) }\n : {}),\n executionId,\n workflow: name,\n timestamp: new Date().toISOString(),\n };\n observation\n .child({\n ...(event.key ? { taskKey: event.key } : {}),\n ...(event.attempt === undefined ? {} : { attempt: event.attempt }),\n })\n .emit(\"workflow\", { kind: \"workflow\", event: notification });\n }\n function finish(item: Task, status: TaskStatus): void {\n Object.assign(record(item), {\n status,\n finishedAt: new Date().toISOString(),\n });\n emit({\n type: \"task\",\n key: item.key,\n status,\n attempt: record(item).attempts,\n ...(record(item).error ? { error: record(item).error } : {}),\n ...(record(item).startedAt\n ? { durationMs: Date.now() - Date.parse(record(item).startedAt!) }\n : {}),\n });\n }\n function context(\n item: Task,\n attempt: number,\n taskSignal: AbortSignal,\n ): TaskContext {\n if (attempt > 0) activeAttempts.set(item, attempt);\n function report(usage: Usage, receipt?: string): void {\n const current = record(item);\n if (\n attempt === 0 ||\n current.status !== \"active\" ||\n activeAttempts.get(item) !== attempt\n )\n throw new Error(\n \"Usage must be reported during its active task attempt\",\n );\n if (receipt !== undefined) {\n validateUsageReceipt(receipt);\n if (current.usageReceipts?.includes(receipt)) return;\n if ((current.usageReceipts?.length ?? 0) >= maxUsageReceiptsPerTask)\n throw new Error(\"Workflow usage receipt limit exceeded\");\n }\n const previousReceipts = current.usageReceipts;\n if (receipt !== undefined)\n current.usageReceipts = Object.freeze([\n ...(previousReceipts ?? []),\n receipt,\n ]);\n try {\n accounting.report(usage);\n } catch (error) {\n if (previousReceipts) current.usageReceipts = previousReceipts;\n else delete current.usageReceipts;\n throw error;\n }\n void runtime.persist().catch((error: unknown) => stop.abort(error));\n emit({\n type: \"usage\",\n key: item.key,\n attempt,\n usage: Object.freeze({ ...usage }),\n });\n }\n\n return {\n ...(item.interaction\n ? {\n interaction: interactionContext(\n item,\n runtime,\n attempt,\n taskSignal,\n () => activeAttempts.get(item) === attempt,\n ),\n }\n : {}),\n ...(attempt > 0 && quotaResumes.has(item)\n ? { quota: quotaResumes.get(item)! }\n : {}),\n ...(options.budget?.prices ? { prices: options.budget.prices } : {}),\n observation: observation.child({ taskKey: item.key, attempt }),\n signal: taskSignal,\n attempt,\n executionId,\n idempotencyKey: taskIdempotencyKey(executionId, item.key),\n checkpoint: () => runtime.persist(),\n ...(checkpoint?.workspaceResources\n ? {\n workspaceCheckpoint: {\n read: (key: string) => checkpoint.workspaceResources?.get(key),\n async write(\n key: string,\n description: import(\"./checkpoint.types.ts\").WorkflowJson,\n ) {\n if (!key.trim())\n throw new Error(\n \"Workspace checkpoint resource key must not be empty\",\n );\n checkpointValue(description);\n checkpoint.workspaceResources?.set(key, description);\n await runtime.persist();\n },\n },\n }\n : {}),\n reportUsage: (usage) => report(usage),\n reportUsageOnce: (receipt, usage) => {\n validateUsageReceipt(receipt);\n report(usage, receipt);\n },\n value<T>(dependency: Task<T>): T {\n if (!item.after.includes(dependency))\n throw new Error(\n `${item.key}: undeclared dependency ${dependency.key}`,\n );\n if (!values.has(dependency))\n throw new Error(`${dependency.key} has no successful value`);\n const value = values.get(dependency) as T;\n return checkpoint ? structuredClone(value) : value;\n },\n };\n }\n\n const runtime: WorkflowExecutionState = {\n workflow: name,\n observation,\n async persist() {\n await checkpoint?.save(runtime);\n if (checkpoint) emit({ type: \"checkpoint\" });\n },\n executionId,\n accounting,\n closeAttempt(item) {\n activeAttempts.delete(item);\n quotaResumes.delete(item);\n },\n quotaResumes,\n stop,\n signal,\n values,\n records,\n errors,\n observerErrors,\n record,\n emit,\n finish,\n context,\n options,\n };\n return runtime;\n}\n"]}
@@ -30,6 +30,7 @@ export interface Retry {
30
30
  readonly delayMs?: number;
31
31
  readonly backoff?: "fixed" | "exponential";
32
32
  readonly maxDelayMs?: number;
33
+ readonly maxRetryAfterMs?: number;
33
34
  readonly jitter?: "none" | "full";
34
35
  readonly accepts?: (error: unknown, attempt: number) => boolean;
35
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"workflow.types.js","sourceRoot":"","sources":["../../src/domain/workflow.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ModelPriceTable } from \"./pricing.types.ts\";\nimport type {\n TaskInteraction,\n TaskInteractionContext,\n TaskInteractionRecord,\n WorkflowAnswer,\n WorkflowInputRequest,\n} from \"./workflow/input.types.ts\";\nimport type { LoopRoundRecord } from \"./workflow/loop-task.types.ts\";\nimport type {\n WorkflowQuotaPause,\n WorkflowQuotaPolicy,\n} from \"./workflow/quota-pause.types.ts\";\nimport type { ObservationHub } from \"./observation.types.ts\";\nimport type {\n WorkflowDecision,\n WorkflowDecisionVerifier,\n WorkflowDecisionRecord,\n WorkflowGate,\n WorkflowPauseRequest,\n} from \"./workflow/gates.types.ts\";\nimport type { WorkflowCheckpointOptions } from \"./workflow/checkpoint.types.ts\";\nimport type {\n TaskCacheOptions,\n TaskCacheOutcome,\n} from \"./workflow/task-cache.types.ts\";\nimport type { Usage } from \"./agent.types.ts\";\nimport type { FaultCode } from \"./errors.types.ts\";\nimport type {\n WorkflowAccounting,\n WorkflowBudget,\n WorkflowUsage,\n} from \"./workflow/budget.types.ts\";\n\nexport interface TaskContext {\n readonly workspaceCheckpoint?: import(\"./workflow/checkpoint.types.ts\").TaskWorkspaceCheckpoint;\n readonly prices?: ModelPriceTable;\n /** Quota pause resumed by this attempt; present only on the first attempt after it. */\n readonly quota?: WorkflowQuotaPause;\n readonly interaction?: TaskInteractionContext;\n readonly idempotencyKey: string;\n readonly observation?: ObservationHub;\n readonly signal: AbortSignal;\n readonly attempt: number;\n readonly executionId: string;\n reportUsage(usage: Usage): void;\n reportUsageOnce?(receipt: string, usage: Usage): void;\n checkpoint?(): Promise<void>;\n value<T>(dependency: Task<T>): T;\n}\n\nexport interface Retry {\n readonly attempts: number;\n readonly delayMs?: number;\n readonly backoff?: \"fixed\" | \"exponential\";\n readonly maxDelayMs?: number;\n readonly jitter?: \"none\" | \"full\";\n readonly accepts?: (error: unknown, attempt: number) => boolean;\n}\n\nexport interface Task<T = unknown> {\n readonly interaction?: TaskInteraction;\n readonly key: string;\n readonly gate?: WorkflowGate;\n readonly after: readonly Task[];\n readonly perform: (context: TaskContext) => T | Promise<T>;\n readonly condition?: (context: TaskContext) => boolean | Promise<boolean>;\n readonly retry?: Retry;\n readonly timeoutMs?: number;\n readonly cache?: TaskCacheOptions;\n}\n\nexport type TaskOptions<T> = Omit<Task<T>, \"after\"> & {\n readonly after?: readonly Task[];\n};\n\nexport type TaskStatus =\n | \"waiting-input\"\n | \"waiting\"\n | \"active\"\n | \"done\"\n | \"failed\"\n | \"skipped\"\n | \"cancelled\"\n | \"paused\"\n | \"rejected\";\n\nexport interface TaskRecord {\n cacheHit?: true;\n quota?: WorkflowQuotaPause;\n interaction?: TaskInteractionRecord;\n rounds?: readonly LoopRoundRecord[];\n usageReceipts?: readonly string[];\n pause?: WorkflowPauseRequest;\n decision?: WorkflowDecisionRecord;\n readonly key: string;\n status: TaskStatus;\n attempts: number;\n startedAt?: string;\n finishedAt?: string;\n error?: string;\n}\n\nexport interface WorkflowEvent {\n readonly tasks?: readonly Readonly<TaskRecord>[];\n readonly accounting?: WorkflowUsage;\n readonly terminationCode?: WorkflowTerminationCode;\n readonly executionId: string;\n readonly workflow: string;\n readonly timestamp: string;\n readonly type:\n | \"cache\"\n | \"quota\"\n | \"input-request\"\n | \"input-answer\"\n | \"loop\"\n | \"start\"\n | \"task\"\n | \"attempt\"\n | \"retry\"\n | \"usage\"\n | \"finish\"\n | \"gate\"\n | \"decision\"\n | \"checkpoint\"\n | \"resume\"\n | \"budget-exceeded\";\n readonly cache?: TaskCacheOutcome;\n readonly error?: string;\n readonly resetAt?: string;\n readonly round?: number;\n readonly phase?: \"attempt\" | \"check\" | \"complete\";\n readonly key?: string;\n readonly status?: TaskStatus;\n readonly attempt?: number;\n readonly usage?: Usage;\n readonly durationMs?: number;\n readonly delayMs?: number;\n}\n\nexport interface WorkflowTelemetry {\n observe(event: WorkflowEvent): void;\n}\n\nexport interface WorkflowOptions {\n readonly redact?: readonly RegExp[];\n readonly onQuota?: WorkflowQuotaPolicy;\n readonly answers?: readonly WorkflowAnswer[];\n readonly timeoutMs?: number;\n readonly observation?: ObservationHub;\n readonly decisionVerifier?: WorkflowDecisionVerifier;\n readonly decisions?: readonly WorkflowDecision[];\n readonly checkpoint?: WorkflowCheckpointOptions;\n readonly signal?: AbortSignal;\n readonly concurrency?: number;\n readonly budget?: WorkflowBudget;\n readonly stopOnError?: boolean;\n readonly telemetry?: WorkflowTelemetry;\n readonly observe?: (event: WorkflowEvent) => void;\n}\n\nexport type WorkflowTerminationCode =\n FaultCode | \"failed\" | \"usage-unavailable\";\n\nexport interface WorkflowResult {\n readonly terminationCode?: WorkflowTerminationCode;\n readonly inputRequests: readonly WorkflowInputRequest[];\n readonly executionId: string;\n readonly name: string;\n readonly status:\n \"done\" | \"failed\" | \"cancelled\" | \"paused\" | \"waiting-input\" | \"rejected\";\n readonly tasks: readonly Readonly<TaskRecord>[];\n readonly errors: readonly unknown[];\n readonly observerErrors: readonly unknown[];\n readonly usage: WorkflowUsage;\n value<T>(task: Task<T>): T;\n unwrap(): void;\n}\n\nexport interface Workflow {\n readonly name: string;\n readonly tasks: readonly Task[];\n start(options?: WorkflowOptions): Promise<WorkflowResult>;\n diagram(): string;\n}\n\nexport type WorkflowNotification = Omit<\n WorkflowEvent,\n \"executionId\" | \"workflow\" | \"timestamp\"\n>;\nexport interface WorkflowExecutionState {\n readonly workflow: string;\n readonly observation: ObservationHub;\n readonly executionId: string;\n readonly stop: AbortController;\n readonly signal: AbortSignal;\n readonly values: Map<Task, unknown>;\n readonly records: Map<Task, TaskRecord>;\n readonly errors: unknown[];\n readonly observerErrors: unknown[];\n readonly options: WorkflowOptions;\n readonly accounting: WorkflowAccounting;\n readonly quotaResumes: Map<Task, WorkflowQuotaPause>;\n persist(): Promise<void>;\n closeAttempt(task: Task): void;\n record(task: Task): TaskRecord;\n emit(event: WorkflowNotification): void;\n finish(task: Task, status: TaskStatus): void;\n context(task: Task, attempt: number, signal: AbortSignal): TaskContext;\n}\n"]}
1
+ {"version":3,"file":"workflow.types.js","sourceRoot":"","sources":["../../src/domain/workflow.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ModelPriceTable } from \"./pricing.types.ts\";\nimport type {\n TaskInteraction,\n TaskInteractionContext,\n TaskInteractionRecord,\n WorkflowAnswer,\n WorkflowInputRequest,\n} from \"./workflow/input.types.ts\";\nimport type { LoopRoundRecord } from \"./workflow/loop-task.types.ts\";\nimport type {\n WorkflowQuotaPause,\n WorkflowQuotaPolicy,\n} from \"./workflow/quota-pause.types.ts\";\nimport type { ObservationHub } from \"./observation.types.ts\";\nimport type {\n WorkflowDecision,\n WorkflowDecisionVerifier,\n WorkflowDecisionRecord,\n WorkflowGate,\n WorkflowPauseRequest,\n} from \"./workflow/gates.types.ts\";\nimport type { WorkflowCheckpointOptions } from \"./workflow/checkpoint.types.ts\";\nimport type {\n TaskCacheOptions,\n TaskCacheOutcome,\n} from \"./workflow/task-cache.types.ts\";\nimport type { Usage } from \"./agent.types.ts\";\nimport type { FaultCode } from \"./errors.types.ts\";\nimport type {\n WorkflowAccounting,\n WorkflowBudget,\n WorkflowUsage,\n} from \"./workflow/budget.types.ts\";\n\nexport interface TaskContext {\n readonly workspaceCheckpoint?: import(\"./workflow/checkpoint.types.ts\").TaskWorkspaceCheckpoint;\n readonly prices?: ModelPriceTable;\n /** Quota pause resumed by this attempt; present only on the first attempt after it. */\n readonly quota?: WorkflowQuotaPause;\n readonly interaction?: TaskInteractionContext;\n readonly idempotencyKey: string;\n readonly observation?: ObservationHub;\n readonly signal: AbortSignal;\n readonly attempt: number;\n readonly executionId: string;\n reportUsage(usage: Usage): void;\n reportUsageOnce?(receipt: string, usage: Usage): void;\n checkpoint?(): Promise<void>;\n value<T>(dependency: Task<T>): T;\n}\n\nexport interface Retry {\n readonly attempts: number;\n readonly delayMs?: number;\n readonly backoff?: \"fixed\" | \"exponential\";\n readonly maxDelayMs?: number;\n readonly maxRetryAfterMs?: number;\n readonly jitter?: \"none\" | \"full\";\n readonly accepts?: (error: unknown, attempt: number) => boolean;\n}\n\nexport interface Task<T = unknown> {\n readonly interaction?: TaskInteraction;\n readonly key: string;\n readonly gate?: WorkflowGate;\n readonly after: readonly Task[];\n readonly perform: (context: TaskContext) => T | Promise<T>;\n readonly condition?: (context: TaskContext) => boolean | Promise<boolean>;\n readonly retry?: Retry;\n readonly timeoutMs?: number;\n readonly cache?: TaskCacheOptions;\n}\n\nexport type TaskOptions<T> = Omit<Task<T>, \"after\"> & {\n readonly after?: readonly Task[];\n};\n\nexport type TaskStatus =\n | \"waiting-input\"\n | \"waiting\"\n | \"active\"\n | \"done\"\n | \"failed\"\n | \"skipped\"\n | \"cancelled\"\n | \"paused\"\n | \"rejected\";\n\nexport interface TaskRecord {\n cacheHit?: true;\n quota?: WorkflowQuotaPause;\n interaction?: TaskInteractionRecord;\n rounds?: readonly LoopRoundRecord[];\n usageReceipts?: readonly string[];\n pause?: WorkflowPauseRequest;\n decision?: WorkflowDecisionRecord;\n readonly key: string;\n status: TaskStatus;\n attempts: number;\n startedAt?: string;\n finishedAt?: string;\n error?: string;\n}\n\nexport interface WorkflowEvent {\n readonly tasks?: readonly Readonly<TaskRecord>[];\n readonly accounting?: WorkflowUsage;\n readonly terminationCode?: WorkflowTerminationCode;\n readonly executionId: string;\n readonly workflow: string;\n readonly timestamp: string;\n readonly type:\n | \"cache\"\n | \"quota\"\n | \"input-request\"\n | \"input-answer\"\n | \"loop\"\n | \"start\"\n | \"task\"\n | \"attempt\"\n | \"retry\"\n | \"usage\"\n | \"finish\"\n | \"gate\"\n | \"decision\"\n | \"checkpoint\"\n | \"resume\"\n | \"budget-exceeded\";\n readonly cache?: TaskCacheOutcome;\n readonly error?: string;\n readonly resetAt?: string;\n readonly round?: number;\n readonly phase?: \"attempt\" | \"check\" | \"complete\";\n readonly key?: string;\n readonly status?: TaskStatus;\n readonly attempt?: number;\n readonly usage?: Usage;\n readonly durationMs?: number;\n readonly delayMs?: number;\n}\n\nexport interface WorkflowTelemetry {\n observe(event: WorkflowEvent): void;\n}\n\nexport interface WorkflowOptions {\n readonly redact?: readonly RegExp[];\n readonly onQuota?: WorkflowQuotaPolicy;\n readonly answers?: readonly WorkflowAnswer[];\n readonly timeoutMs?: number;\n readonly observation?: ObservationHub;\n readonly decisionVerifier?: WorkflowDecisionVerifier;\n readonly decisions?: readonly WorkflowDecision[];\n readonly checkpoint?: WorkflowCheckpointOptions;\n readonly signal?: AbortSignal;\n readonly concurrency?: number;\n readonly budget?: WorkflowBudget;\n readonly stopOnError?: boolean;\n readonly telemetry?: WorkflowTelemetry;\n readonly observe?: (event: WorkflowEvent) => void;\n}\n\nexport type WorkflowTerminationCode =\n FaultCode | \"failed\" | \"usage-unavailable\";\n\nexport interface WorkflowResult {\n readonly terminationCode?: WorkflowTerminationCode;\n readonly inputRequests: readonly WorkflowInputRequest[];\n readonly executionId: string;\n readonly name: string;\n readonly status:\n \"done\" | \"failed\" | \"cancelled\" | \"paused\" | \"waiting-input\" | \"rejected\";\n readonly tasks: readonly Readonly<TaskRecord>[];\n readonly errors: readonly unknown[];\n readonly observerErrors: readonly unknown[];\n readonly usage: WorkflowUsage;\n value<T>(task: Task<T>): T;\n unwrap(): void;\n}\n\nexport interface Workflow {\n readonly name: string;\n readonly tasks: readonly Task[];\n start(options?: WorkflowOptions): Promise<WorkflowResult>;\n diagram(): string;\n}\n\nexport type WorkflowNotification = Omit<\n WorkflowEvent,\n \"executionId\" | \"workflow\" | \"timestamp\"\n>;\nexport interface WorkflowExecutionState {\n readonly workflow: string;\n readonly observation: ObservationHub;\n readonly executionId: string;\n readonly stop: AbortController;\n readonly signal: AbortSignal;\n readonly values: Map<Task, unknown>;\n readonly records: Map<Task, TaskRecord>;\n readonly errors: unknown[];\n readonly observerErrors: unknown[];\n readonly options: WorkflowOptions;\n readonly accounting: WorkflowAccounting;\n readonly quotaResumes: Map<Task, WorkflowQuotaPause>;\n persist(): Promise<void>;\n closeAttempt(task: Task): void;\n record(task: Task): TaskRecord;\n emit(event: WorkflowNotification): void;\n finish(task: Task, status: TaskStatus): void;\n context(task: Task, attempt: number, signal: AbortSignal): TaskContext;\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export type { WatchdogOptions, RepetitionPolicy, StuckInstruction, StuckEvent, } from "./domain/watchdog.types.ts";
2
2
  export { defineAgentProfile } from "./domain/agent-profile.ts";
3
- export type { AgentProfile, AgentProfileOptions, AgentProfileTool, } from "./domain/agent-profile.types.ts";
3
+ export type { AgentProfile, AgentProfileOptions, AgentProfileHooks, AgentProfileTool, } from "./domain/agent-profile.types.ts";
4
4
  export { createAgent } from "./domain/agent.ts";
5
5
  export { defineHarnessSubagent } from "./domain/subagent.ts";
6
6
  export type { HarnessSubagent, HarnessSubagentInput, HarnessSubagentOptions, } from "./domain/subagent.types.ts";
@@ -202,3 +202,17 @@ export type { GitWorkspaceSandboxOptions, GitDispatchRequest, } from "./applicat
202
202
  export type { FileRunReport } from "./domain/run-report.types.ts";
203
203
  export { inspectFileWorkspace, recoverFileWorkspace, } from "./application/file-workspace-recovery.ts";
204
204
  export type { FileWorkspaceInspection, FileWorkspaceInspectionOptions, FileWorkspaceRecoveryOptions, } from "./application/file-workspace-recovery.types.ts";
205
+ export type { HookCommand } from "./domain/hook-command.types.ts";
206
+ export type { AgentHookContext } from "./domain/agent-hook.types.ts";
207
+ export { defineClaudeHook } from "./adapters/agents/claude/claude-hooks.ts";
208
+ export type { ClaudeHook, ClaudeHookOptions, ClaudeHookPhase, ClaudeHookEvents, ClaudeHookDecisions, } from "./adapters/agents/claude/claude-hooks.types.ts";
209
+ export { defineCodexHook } from "./adapters/agents/codex/codex-hooks.ts";
210
+ export type { CodexHook, CodexHookOptions, CodexHookPhase, CodexHookEvents, CodexHookDecisions, } from "./adapters/agents/codex/codex-hooks.types.ts";
211
+ export { defineCopilotHook } from "./adapters/agents/copilot/copilot-hooks.ts";
212
+ export type { CopilotHook, CopilotHookOptions, CopilotHookPhase, CopilotHookEvents, CopilotHookDecisions, } from "./adapters/agents/copilot/copilot-hooks.types.ts";
213
+ export { defineKimiHook } from "./adapters/agents/kimi/kimi-hooks.ts";
214
+ export type { KimiHook, KimiHookOptions, KimiHookPhase, KimiHookEvents, KimiHookDecisions, } from "./adapters/agents/kimi/kimi-hooks.types.ts";
215
+ export { defineAntigravityHook } from "./adapters/agents/antigravity/antigravity-hooks.ts";
216
+ export type { AntigravityHook, AntigravityHookOptions, AntigravityHookPhase, AntigravityHookEvents, AntigravityHookDecisions, } from "./adapters/agents/antigravity/antigravity-hooks.types.ts";
217
+ export { inspectStorageReservations, recoverStorageReservation, } from "./infrastructure/reservation-recovery.ts";
218
+ export type { StorageReservationRecord, StorageReservationInspection, StorageReservationRecoveryOptions, } from "./infrastructure/transport-reservations.types.ts";
package/dist/index.js CHANGED
@@ -95,4 +95,10 @@ export { publishWorkspaceOutputs, inspectWorkspacePublication, recoverWorkspaceP
95
95
  export { snapshotWorkspaceFiles, restoreWorkspaceFiles, } from "./infrastructure/workspace-snapshot.js";
96
96
  export { inspectWorkspacePathLocks, recoverWorkspacePathLock, } from "./infrastructure/workspace-lock.js";
97
97
  export { inspectFileWorkspace, recoverFileWorkspace, } from "./application/file-workspace-recovery.js";
98
+ export { defineClaudeHook } from "./adapters/agents/claude/claude-hooks.js";
99
+ export { defineCodexHook } from "./adapters/agents/codex/codex-hooks.js";
100
+ export { defineCopilotHook } from "./adapters/agents/copilot/copilot-hooks.js";
101
+ export { defineKimiHook } from "./adapters/agents/kimi/kimi-hooks.js";
102
+ export { defineAntigravityHook } from "./adapters/agents/antigravity/antigravity-hooks.js";
103
+ export { inspectStorageReservations, recoverStorageReservation, } from "./infrastructure/reservation-recovery.js";
98
104
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["export type {\n WatchdogOptions,\n RepetitionPolicy,\n StuckInstruction,\n StuckEvent,\n} from \"./domain/watchdog.types.ts\";\nexport { defineAgentProfile } from \"./domain/agent-profile.ts\";\nexport type {\n AgentProfile,\n AgentProfileOptions,\n AgentProfileTool,\n} from \"./domain/agent-profile.types.ts\";\nexport { createAgent } from \"./domain/agent.ts\";\nexport { defineHarnessSubagent } from \"./domain/subagent.ts\";\nexport type {\n HarnessSubagent,\n HarnessSubagentInput,\n HarnessSubagentOptions,\n} from \"./domain/subagent.types.ts\";\nexport { createHarness } from \"./domain/harness.ts\";\nexport { defineMcpPrompt } from \"./domain/mcp-prompt.ts\";\nexport {\n defineHarnessContextStrategy,\n summarizeHistory,\n truncateToolResults,\n} from \"./domain/context.ts\";\nexport type {\n HarnessContextInput,\n HarnessContextResult,\n HarnessContextStrategy,\n HarnessContextStrategyOptions,\n SummarizeHistoryOptions,\n TruncateToolResultsOptions,\n} from \"./domain/context.types.ts\";\nexport { defineHarnessHook } from \"./domain/hook.ts\";\nexport { defineHarnessSkill } from \"./domain/skill.ts\";\nexport type {\n HarnessSkill,\n HarnessSkillOptions,\n} from \"./domain/skill.types.ts\";\nexport { defineHarnessInstructions } from \"./domain/instructions.ts\";\nexport { defineHarnessPermissions } from \"./domain/permissions.ts\";\nexport type {\n HarnessHook,\n HarnessHookContext,\n HarnessHookDecisions,\n HarnessHookEvents,\n HarnessHookInput,\n HarnessHookOptions,\n HarnessHookPhase,\n HarnessHookResult,\n HarnessToolResultView,\n} from \"./domain/hook.types.ts\";\nexport type {\n HarnessPermissionRule,\n HarnessPermissions,\n HarnessPermissionsOptions,\n PermissionDecision,\n PermissionEffect,\n ToolResources,\n} from \"./domain/permissions.types.ts\";\nexport { defineHarnessTool, defineHarnessToolset } from \"./domain/tool.ts\";\nexport { createHarnessEditTools } from \"./adapters/tools/edit-tools.ts\";\nexport { createHarnessFileTools } from \"./adapters/tools/file-tools.ts\";\nexport { createHarnessGitTools } from \"./adapters/tools/git-tools.ts\";\nexport { createHarnessSearchTools } from \"./adapters/tools/search-tools.ts\";\nexport { createHarnessShellTools } from \"./adapters/tools/shell-tools.ts\";\nexport type { ShellToolsOptions } from \"./adapters/tools/tools.types.ts\";\nexport type {\n AccountCredential,\n AgentAuthentication,\n Agent,\n AgentOptions,\n AgentHarness,\n CliHarness,\n CliAgent,\n CustomAgent,\n UsageCredential,\n} from \"./domain/agent.types.ts\";\nexport type {\n Harness,\n HarnessOptions,\n HarnessInstructionContext,\n HarnessMcpContext,\n HarnessInstructions,\n HarnessInstructionSource,\n HarnessInstructionsOption,\n HarnessLimits,\n HarnessToolExecution,\n} from \"./domain/harness.types.ts\";\nexport type {\n McpClientCredentials,\n McpHttpServer,\n McpServer,\n McpServers,\n McpStdioServer,\n McpToolFilter,\n} from \"./domain/mcp-server.types.ts\";\nexport type { McpPromptOptions } from \"./domain/mcp-prompt.types.ts\";\nexport type {\n HarnessTool,\n HarnessToolContext,\n HarnessToolEvent,\n HarnessToolOptions,\n HarnessToolset,\n HarnessToolsetOptions,\n JsonSchema,\n StandardJsonSchema,\n ToolOutput,\n ToolValidation,\n} from \"./domain/tool.types.ts\";\nexport { TransportConflict } from \"./domain/transport.ts\";\nexport type {\n Transport,\n TransportEntry,\n TransportObject,\n TransportReadOptions,\n TransportWriteOptions,\n TransportReference,\n TransportStoreOptions,\n} from \"./domain/transport.types.ts\";\nexport { createLocalTransport } from \"./infrastructure/local-transport.ts\";\nexport type { LocalTransportOptions } from \"./infrastructure/local-transport.types.ts\";\nexport { createArtifactStore } from \"./infrastructure/transport-artifact-store.ts\";\nexport type { ArtifactStoreOptions } from \"./infrastructure/transport-artifact-store.types.ts\";\nexport {\n createWorkflowCheckpointStore,\n recoverWorkflowCheckpoint,\n} from \"./infrastructure/transport-checkpoint.ts\";\nexport type { CheckpointRecoveryOptions } from \"./infrastructure/transport-checkpoint.types.ts\";\nexport { createTaskCacheStore } from \"./infrastructure/transport-task-cache.ts\";\nexport { repositoryFingerprint } from \"./application/repository-fingerprint.ts\";\nexport type { TaskCacheStoreOptions } from \"./infrastructure/transport-task-cache.types.ts\";\nexport { readJournal } from \"./infrastructure/transport-journal.ts\";\nexport type { ReadJournalOptions } from \"./infrastructure/transport-journal.types.ts\";\nexport { createReplayAgent, ReplayDivergence } from \"./domain/replay.ts\";\nexport type {\n RecordedCommit,\n RecordedIdentity,\n RecordedRevision,\n ReplayAgent,\n ReplayAgentOptions,\n ReplayDivergenceDetails,\n ReplayDivergenceKind,\n ReplayDivergencePolicy,\n ReplayFailure,\n ReplayTurn,\n ReplayDecisionEvent,\n WorkspaceCommitsEvent,\n} from \"./domain/replay.types.ts\";\nexport {\n conversations,\n createTransportConversations,\n} from \"./application/conversation-stores.ts\";\nexport type { TransportConversationOptions } from \"./infrastructure/transport-conversations.types.ts\";\nexport {\n archiveRecovery,\n materializeRecoveryArchive,\n} from \"./application/recovery-archive.ts\";\nexport type {\n RecoveryArchiveOptions,\n RecoveryArchiveRestoreOptions,\n} from \"./application/recovery-archive.types.ts\";\n\nexport {\n attach,\n createSandbox,\n dispatch,\n openWorkspace,\n} from \"./application/outpost.ts\";\n\nexport type {\n AttachOptions,\n AttachResult,\n ContinuationOptions,\n DispatchResult,\n Sandbox,\n SandboxOptions,\n WarmDispatchResult,\n Workspace,\n WorkspaceOptions,\n} from \"./application/outpost.ts\";\n\nexport type {\n DispatchOptions,\n Execution,\n Turn,\n} from \"./application/execution.ts\";\n\nexport {\n WorkflowFailure,\n WorkflowBudgetExceeded,\n WorkflowUsageUnavailable,\n defineTask,\n defineWorkflow,\n} from \"./domain/workflow.ts\";\n\nexport type {\n Retry,\n Task,\n TaskContext,\n TaskOptions,\n TaskRecord,\n TaskStatus,\n Workflow,\n WorkflowEvent,\n WorkflowOptions,\n WorkflowBudget,\n WorkflowUsage,\n WorkflowResult,\n WorkflowTerminationCode,\n WorkflowTelemetry,\n} from \"./domain/workflow.ts\";\n\nexport {\n defineAgentTask,\n defineCommandTask,\n defineIsolatedTask,\n defineIsolatedCommandTask,\n} from \"./application/tasks.ts\";\nexport type { QuotaResumePolicy } from \"./application/quota-resume.types.ts\";\nexport { defineRecipe } from \"./application/recipe.ts\";\nexport type {\n RecipeBindings,\n RecipeConfiguration,\n} from \"./application/recipe.types.ts\";\n\nexport {\n createAntigravityHarness,\n createClaudeHarness,\n createCodexHarness,\n createCopilotHarness,\n createKimiHarness,\n} from \"./providers/agents.ts\";\n\nexport { agentVersions } from \"./providers/versions.ts\";\n\nexport {\n createHarnessConversations,\n createSessionBundleConversations,\n createTranscriptConversations,\n} from \"./infrastructure/conversations.ts\";\nexport { createClaudeConversations } from \"./adapters/agents/claude/claude-conversations.ts\";\nexport { createCodexConversations } from \"./adapters/agents/codex/codex-conversations.ts\";\nexport { createCopilotConversations } from \"./adapters/agents/copilot/copilot-conversations.ts\";\nexport { createKimiConversations } from \"./adapters/agents/kimi/kimi-conversations.ts\";\nexport type { TranscriptConversationLayout } from \"./infrastructure/conversations/layout.types.ts\";\nexport type {\n SessionBundleFiles,\n SessionBundleHelpers,\n SessionBundleProfile,\n SessionBundleRelocation,\n} from \"./infrastructure/conversations/session-bundle.types.ts\";\n\nexport type {\n ConversationFormat,\n ConversationLocation,\n} from \"./infrastructure/conversations.ts\";\n\nexport type {\n AntigravitySettings,\n ClaudeSettings,\n CodexSettings,\n CodexModelProvider,\n CopilotSettings,\n KimiSettings,\n} from \"./providers/agents.ts\";\n\nexport {\n createMountedSandboxProvider,\n createRemoteSandboxProvider,\n} from \"./providers/factories.ts\";\n\nexport {\n ResponseError,\n defineJsonResponse,\n defineTextResponse,\n} from \"./domain/response.ts\";\n\nexport type { ResponseSpec, StandardValidator } from \"./domain/response.ts\";\n\nexport { OutpostError, recoveryDetails } from \"./domain/errors.ts\";\nexport type { DiffGuard } from \"./domain/diff-guard.types.ts\";\n\nexport type { FaultCode } from \"./domain/errors.ts\";\n\nexport { quotaFault } from \"./domain/quota.ts\";\nexport type { QuotaFault } from \"./domain/quota.types.ts\";\nexport { unavailableFault } from \"./domain/unavailable.ts\";\nexport { createFallbackAgent } from \"./domain/fallback-agent.ts\";\nexport type {\n DispatchAgent,\n FallbackAgent,\n FallbackAgentOptions,\n FallbackAttempt,\n FallbackCandidate,\n FallbackRecord,\n FallbackTrigger,\n} from \"./domain/fallback-agent.types.ts\";\nexport type { UnavailableFault } from \"./domain/unavailable.types.ts\";\nexport { createSteering } from \"./domain/steering.ts\";\nexport type {\n Steering,\n SteeringDelivery,\n SteeringMode,\n SteeringSendOptions,\n SteeringState,\n} from \"./domain/steering.types.ts\";\n\nexport type {\n AgentAdapter,\n AgentConfiguration,\n ConfigurationFile,\n HostConfiguration,\n AgentEvent,\n AgentInput,\n AgentLiveInput,\n AgentLiveRead,\n AgentLiveSession,\n AgentObservation,\n BranchPolicy,\n Channel,\n Command,\n CommandResult,\n Commit,\n ConversationContext,\n ConversationRecord,\n ConversationStore,\n NativeConversationStore,\n Disposal,\n LifecycleHooks,\n FileManifestEntry,\n FileTransfers,\n SandboxContext,\n SandboxLease,\n SandboxProvider,\n StageLimits,\n TransferOptions,\n Usage,\n Variables,\n Volume,\n WorkspaceRecord,\n} from \"./domain/ports.ts\";\n\nexport type { Brief, PromptVariables } from \"./domain/prompts.ts\";\n\nexport type { Logging } from \"./infrastructure/journal.ts\";\n\nexport { createCustomReporter } from \"./infrastructure/custom-reporter.ts\";\nexport type {\n CustomReporter,\n CustomReporterOptions,\n ReporterHandlers,\n} from \"./infrastructure/custom-reporter.types.ts\";\nexport type {\n DispatchTelemetry,\n DispatchTelemetrySession,\n DispatchTelemetryOutcome,\n} from \"./domain/dispatch-telemetry.types.ts\";\nexport { createReporter } from \"./infrastructure/reporter.ts\";\n\nexport type { ReporterOptions } from \"./infrastructure/reporter.ts\";\n\nexport type { VariableQuestion } from \"./application/interactive-brief.ts\";\n\nexport {\n planRecoveryRetention,\n pruneRecoveryRetention,\n assertRecoveryQuota,\n} from \"./application/recovery-retention.ts\";\nexport type {\n RecoveryRetentionPolicy,\n RecoveryRetentionOptions,\n RecoveryRetentionPlan,\n RecoveryRetentionEntry,\n RecoveryPruneResult,\n RecoveryQuotaOptions,\n} from \"./application/recovery-retention.types.ts\";\nexport { verifyRecoveryTransfer } from \"./application/recovery-verification.ts\";\nexport type {\n RecoveryVerification,\n RecoveryVerificationOptions,\n} from \"./application/recovery-verification.types.ts\";\n\nexport { diagnoseSandbox } from \"./application/doctor-sandbox.ts\";\nexport type {\n SandboxDiagnosticOptions,\n SandboxDiagnosticReport,\n DiagnosticCapability,\n} from \"./application/doctor-sandbox.types.ts\";\nexport type {\n DiagnosticCheck,\n DiagnosticStatus,\n DoctorAgent,\n} from \"./application/doctor.types.ts\";\nexport { diagnoseAgentProtocol } from \"./application/doctor-protocol.ts\";\nexport type { AgentProtocolReport } from \"./application/doctor-protocol.types.ts\";\n\nexport { reserveRecoveryStorage } from \"./application/storage-reservation.ts\";\nexport type { RecoveryStorageReservationOptions } from \"./application/storage-reservation.types.ts\";\nexport type {\n StorageReservation,\n StorageReservationOptions,\n} from \"./infrastructure/storage-reservations.types.ts\";\n\nexport {\n planRecoveryRestore,\n restoreRecoveryTransfer,\n} from \"./application/recovery-restore.ts\";\nexport type {\n RecoveryRestoreOptions,\n RecoveryRestorePlan,\n RecoveryRestoreResult,\n} from \"./application/recovery-restore.types.ts\";\n\nexport type {\n WorkflowCheckpoint,\n WorkflowCheckpointOptions,\n WorkflowCheckpointStore,\n WorkflowCheckpointLease,\n WorkflowCheckpointValue,\n WorkspaceCheckpointMetadata,\n TaskWorkspaceCheckpoint,\n WorkflowJson,\n} from \"./domain/workflow/checkpoint.types.ts\";\n\nexport {\n defineApprovalTask,\n definePauseTask,\n} from \"./domain/workflow/gates.ts\";\nexport type {\n WorkflowGate,\n WorkflowGateOptions,\n WorkflowPauseRequest,\n WorkflowDecision,\n WorkflowDecisionRecord,\n WorkflowDecisionProof,\n WorkflowDecisionVerification,\n WorkflowDecisionVerifier,\n} from \"./domain/workflow/gates.types.ts\";\nexport type {\n WorkflowQuotaPause,\n WorkflowQuotaPolicy,\n} from \"./domain/workflow/quota-pause.types.ts\";\n\nexport { inspectRecovery } from \"./application/recovery-inspection.ts\";\nexport type {\n RecoveryInspection,\n RecoveryInspectionOptions,\n} from \"./application/recovery-inspection.types.ts\";\nexport type {\n ResourceActivityRecord,\n ResourceInspection,\n ResourceInspectionEntry,\n ResourceOperation,\n ResourceOperationKind,\n ResourceOperationResult,\n ResourcePhase,\n} from \"./infrastructure/resource-activity.types.ts\";\n\nexport {\n defineBinaryArtifact,\n defineJsonArtifact,\n publishArtifact,\n readStoredArtifact,\n} from \"./domain/artifact.ts\";\nexport {\n defineArtifactTask,\n readArtifact,\n} from \"./application/artifact-tasks.ts\";\nexport type {\n ArtifactContract,\n ArtifactContractOptions,\n ArtifactIdentity,\n ArtifactProducer,\n ArtifactReference,\n ArtifactStore,\n JsonArtifactOptions,\n PublishArtifactOptions,\n ReadArtifactOptions,\n} from \"./domain/artifact.types.ts\";\nexport type { ArtifactTaskOptions } from \"./application/artifact-tasks.types.ts\";\n\nexport { createSqliteTaskQueue } from \"./infrastructure/task-queue.ts\";\nexport {\n serveTaskQueue,\n createHttpTaskQueue,\n} from \"./infrastructure/task-queue-http.ts\";\nexport { runQueueWorker } from \"./application/queue-worker.ts\";\nexport { defineQueuedTask } from \"./application/queued-task.ts\";\nexport type {\n QueueRequest,\n QueueResult,\n QueueQuota,\n QueueJob,\n QueueClaim,\n QueueLease,\n TaskQueue,\n DurableTaskQueue,\n} from \"./domain/task-queue.types.ts\";\nexport type {\n QueueServerOptions,\n QueueServer,\n QueueClientOptions,\n} from \"./infrastructure/task-queue-http.types.ts\";\nexport type {\n QueueHandlerContext,\n QueueHandler,\n QueueWorkerOptions,\n} from \"./application/queue-worker.types.ts\";\nexport type { QueuedTaskOptions } from \"./application/queued-task.types.ts\";\nexport { createCronSchedule } from \"./domain/cron.ts\";\nexport type { CronOptions, CronSchedule } from \"./domain/cron.types.ts\";\nexport type {\n TriggerJob,\n TriggerJobInput,\n} from \"./domain/trigger-job.types.ts\";\nexport { runSchedules } from \"./application/schedules.ts\";\nexport { serveTriggers } from \"./infrastructure/trigger-server.ts\";\nexport type {\n TriggerFailure,\n TriggerRoute,\n TriggerServer,\n TriggerServerOptions,\n} from \"./infrastructure/trigger-server.types.ts\";\nexport type {\n TriggerEvent,\n TriggerHttpRequest,\n TriggerOutcome,\n TriggerReply,\n TriggerSecret,\n TriggerSource,\n} from \"./domain/trigger.types.ts\";\nexport { createGithubWebhook } from \"./adapters/triggers/github-webhook.ts\";\nexport { createGitlabWebhook } from \"./adapters/triggers/gitlab-webhook.ts\";\nexport { createSlackSource } from \"./adapters/triggers/slack-request.ts\";\nexport { createStandardWebhook } from \"./adapters/triggers/standard-webhook.ts\";\nexport {\n commandIssued,\n labelAdded,\n} from \"./adapters/triggers/trigger-events.ts\";\nexport type {\n GithubWebhookOptions,\n GitlabSigningOptions,\n GitlabTokenOptions,\n GitlabWebhookOptions,\n SlackRequestOptions,\n StandardWebhookOptions,\n TriggerCommand,\n TriggerLabel,\n} from \"./adapters/triggers/triggers.types.ts\";\nexport { defineWorkflowJob } from \"./application/workflow-job.ts\";\nexport type {\n WorkflowJobCheckpoint,\n WorkflowJobContext,\n WorkflowJobOptions,\n WorkflowJobStartOptions,\n} from \"./application/workflow-job.types.ts\";\nexport type {\n RunSchedulesOptions,\n ScheduleFailure,\n TriggerSchedule,\n} from \"./application/schedules.types.ts\";\n\nexport type { EgressPolicy } from \"./domain/egress.types.ts\";\n\nexport { recoverSpeculation } from \"./infrastructure/speculation-store.ts\";\nexport type { SpeculationRecoveryOptions } from \"./infrastructure/speculation-store.types.ts\";\nexport { checkSpeculationIntegration } from \"./application/speculation-integration.ts\";\nexport { speculate } from \"./application/speculation.ts\";\nexport type {\n SpeculationDurability,\n SpeculationIntegration,\n SpeculationOptions,\n SpeculationResult,\n SpeculativeCandidate,\n SpeculativeCandidateResult,\n SpeculativeOutput,\n SpeculativeHostSnapshot,\n SpeculativeValidation,\n} from \"./application/speculation.types.ts\";\n\nexport { createOpenAIModelProvider } from \"./adapters/models/openai-model-provider.ts\";\nexport type { OpenAIModelProviderOptions } from \"./adapters/models/openai-model-provider.types.ts\";\nexport type {\n AgentModel,\n ModelContentBlock,\n ModelMessage,\n ModelProvider,\n ModelReasoning,\n ModelReasoningBlock,\n ModelRequest,\n ModelResult,\n ModelSpec,\n ModelStopReason,\n ModelStreamEvent,\n ModelTextBlock,\n ModelToolCallBlock,\n ModelToolResultBlock,\n ModelToolSpec,\n} from \"./domain/model.types.ts\";\nexport { createAnthropicModelProvider } from \"./adapters/models/anthropic-model-provider.ts\";\nexport type { AnthropicModelProviderOptions } from \"./adapters/models/anthropic-model-provider.types.ts\";\n\nexport { createObservationHub } from \"./domain/observation.ts\";\nexport type {\n Observation,\n ObservationScope,\n ObservationSource,\n ObservationEvent,\n OperationEvent,\n ObservationHub,\n ObservationHubOptions,\n ObservationSink,\n} from \"./domain/observation.types.ts\";\n\nexport {\n signWorkflowDecision,\n createEd25519DecisionVerifier,\n} from \"./infrastructure/workflow-decision-signature.ts\";\nexport type {\n WorkflowDecisionSigningOptions,\n WorkflowApproverKey,\n WorkflowDecisionVerifierOptions,\n} from \"./infrastructure/workflow-decision-signature.types.ts\";\n\nexport { defineInteractiveAgentTask } from \"./application/interactive-task.ts\";\nexport type {\n InteractiveAgentTaskOptions,\n InteractiveAgentResult,\n FileInteractiveAgentTaskOptions,\n FileInteractiveAgentResult,\n} from \"./application/interactive-task.types.ts\";\nexport type {\n WorkflowInputQuestion,\n WorkflowInputRequest,\n WorkflowAnswer,\n WorkflowAnswerRecord,\n TaskInteraction,\n TaskInteractionRecord,\n TaskInteractionContext,\n} from \"./domain/workflow/input.types.ts\";\nexport {\n defineLoopTask,\n LoopTaskExhausted,\n} from \"./domain/workflow/loop-task.ts\";\nexport type {\n TaskCacheAccessOptions,\n TaskCacheEntry,\n TaskCacheMode,\n TaskCacheOptions,\n TaskCacheOutcome,\n TaskCacheStore,\n} from \"./domain/workflow/task-cache.types.ts\";\nexport type {\n LoopCheckResult,\n LoopTaskContext,\n LoopTaskOptions,\n LoopRoundRecord,\n} from \"./domain/workflow/loop-task.types.ts\";\nexport { defineDecision } from \"./domain/decision.ts\";\nexport { decide } from \"./application/decision.ts\";\nexport { defineDecisionTask } from \"./application/decision-task.ts\";\nexport { createSystemOneDecisionProvider } from \"./adapters/decisions/system-one-provider.ts\";\nexport { defineHarnessModelRouting } from \"./domain/harness-routing.ts\";\nexport type {\n DecisionState,\n ChoiceQuestion,\n ScoreQuestion,\n NoulQuestion,\n DecisionQuestion,\n DecisionQuestions,\n DecisionOptions,\n Decision,\n ChoiceAnswer,\n ScoreAnswer,\n NoulAnswer,\n DecisionAnswer,\n DecisionAnswers,\n DecisionProviderResult,\n DecisionRequest,\n DecisionProvider,\n DecisionResult,\n DecideOptions,\n DecisionEvent,\n} from \"./domain/decision.types.ts\";\nexport type { DecisionTaskOptions } from \"./application/decision.types.ts\";\nexport type { SystemOneDecisionProviderOptions } from \"./adapters/decisions/system-one-provider.types.ts\";\nexport type {\n HarnessModelRoutingContext,\n HarnessModelRoutingOptions,\n HarnessModelRouting,\n RoutingQuestion,\n RoutingChoices,\n ModelRouteEvent,\n} from \"./domain/harness-routing.types.ts\";\nexport { createAgentConflictResolver } from \"./application/agent-conflict-resolver.ts\";\nexport type {\n AgentConflictResolverOptions,\n ConflictContext,\n ConflictResolution,\n ConflictResolver,\n IntegrationOptions,\n} from \"./application/conflict-resolution.types.ts\";\n\nexport { calculateUsageCost } from \"./domain/pricing.ts\";\nexport type {\n ModelPrice,\n ModelPriceTable,\n ModelUsage,\n UsageCost,\n} from \"./domain/pricing.types.ts\";\nexport { WorkflowCostUnavailable } from \"./domain/workflow/budget.ts\";\nexport { loadModelPrices } from \"./adapters/models/model-prices.ts\";\nexport type { ModelPricesOptions } from \"./adapters/models/model-prices.types.ts\";\n\nexport type {\n RunReport,\n RunReportOptions,\n RunReportDiff,\n RunReportFile,\n RunReportFailure,\n} from \"./domain/run-report.types.ts\";\nexport { createRunObserver } from \"./infrastructure/run-observer.ts\";\nexport { readRun, watchRun } from \"./infrastructure/run-reader.ts\";\nexport type {\n RunStatus,\n RunTask,\n RunPass,\n RunDispatch,\n RunError,\n RunSnapshot,\n RunEvent,\n RunObserverOptions,\n RunObserver,\n ReadRunOptions,\n WatchRunOptions,\n} from \"./domain/run.types.ts\";\nexport { changed } from \"./domain/lifecycle.ts\";\nexport { fromSecrets } from \"./application/secrets.ts\";\nexport type {\n SecretSource,\n SecretResolveOptions,\n FromSecretsOptions,\n} from \"./domain/secrets.types.ts\";\nexport type {\n ChangedCondition,\n LifecycleCommand,\n} from \"./domain/lifecycle.types.ts\";\nexport {\n createWorkspace,\n restoreFileWorkspace,\n workspaceFingerprint,\n} from \"./application/file-workspace.ts\";\nexport { prepareWorkspaceOutputs } from \"./application/workspace-output-baseline.ts\";\nexport {\n publishWorkspaceOutputs,\n inspectWorkspacePublication,\n recoverWorkspacePublication,\n} from \"./application/workspace-publication.ts\";\nexport {\n snapshotWorkspaceFiles,\n restoreWorkspaceFiles,\n} from \"./infrastructure/workspace-snapshot.ts\";\nexport type {\n FileWorkspace,\n FileWorkspaceOptions,\n GitWorkspace,\n GitWorkspaceOptions,\n CreatedWorkspace,\n FileWorkspaceRecoveryAuthorization,\n} from \"./application/file-workspace.types.ts\";\nexport type {\n FileSandbox,\n FileSandboxOptions,\n FileSandboxSettings,\n FileDispatchRequest,\n FileDispatchResult,\n FileAttachResult,\n} from \"./application/file-sandbox.types.ts\";\nexport type {\n WorkspaceSource,\n FileWorkspaceSource,\n GitWorkspaceSource,\n WorkspaceSession,\n FileWorkspaceRecord,\n WorkspaceRuntime,\n WorkspaceRuntimeOptions,\n WorkspaceRetention,\n WorkspaceInput,\n WorkspaceOutputOptions,\n WorkspacePublication,\n WorkspaceFileEntry,\n WorkspaceAllocationRecord,\n WorkspaceConversationArchive,\n WorkspaceOutputBaseline,\n} from \"./domain/file-workspace.types.ts\";\nexport type {\n FileSandboxContext,\n SandboxWorkspaces,\n} from \"./domain/sandbox.types.ts\";\nexport {\n inspectWorkspacePathLocks,\n recoverWorkspacePathLock,\n} from \"./infrastructure/workspace-lock.ts\";\nexport type { RestoreFileWorkspaceOptions } from \"./application/file-workspace.types.ts\";\nexport type {\n WorkspacePathLock,\n WorkspacePathRecoveryOptions,\n} from \"./infrastructure/workspace-lock.types.ts\";\nexport type {\n PublicationJournal,\n PublicationOperation,\n PublicationDirectory,\n PublicationRecoveryOptions,\n} from \"./application/workspace-publication.types.ts\";\nexport type {\n FileAgentTaskOptions,\n FileIsolatedTaskOptions,\n MixedIsolatedTaskOptions,\n MixedAgentTaskOptions,\n IsolatedCommandTaskOptions,\n FileIsolatedCommandRequest,\n} from \"./application/tasks.types.ts\";\nexport type { FileSelectionOptions } from \"./adapters/tools/tools.types.ts\";\nexport type {\n FileRecipeBindings,\n MixedRecipeBindings,\n FileRecipeConfiguration,\n} from \"./application/recipe.types.ts\";\nexport type {\n GitWorkspaceSandboxOptions,\n GitDispatchRequest,\n} from \"./application/file-workspace.types.ts\";\nexport type { FileRunReport } from \"./domain/run-report.types.ts\";\nexport {\n inspectFileWorkspace,\n recoverFileWorkspace,\n} from \"./application/file-workspace-recovery.ts\";\nexport type {\n FileWorkspaceInspection,\n FileWorkspaceInspectionOptions,\n FileWorkspaceRecoveryOptions,\n} from \"./application/file-workspace-recovery.types.ts\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["export type {\n WatchdogOptions,\n RepetitionPolicy,\n StuckInstruction,\n StuckEvent,\n} from \"./domain/watchdog.types.ts\";\nexport { defineAgentProfile } from \"./domain/agent-profile.ts\";\nexport type {\n AgentProfile,\n AgentProfileOptions,\n AgentProfileHooks,\n AgentProfileTool,\n} from \"./domain/agent-profile.types.ts\";\nexport { createAgent } from \"./domain/agent.ts\";\nexport { defineHarnessSubagent } from \"./domain/subagent.ts\";\nexport type {\n HarnessSubagent,\n HarnessSubagentInput,\n HarnessSubagentOptions,\n} from \"./domain/subagent.types.ts\";\nexport { createHarness } from \"./domain/harness.ts\";\nexport { defineMcpPrompt } from \"./domain/mcp-prompt.ts\";\nexport {\n defineHarnessContextStrategy,\n summarizeHistory,\n truncateToolResults,\n} from \"./domain/context.ts\";\nexport type {\n HarnessContextInput,\n HarnessContextResult,\n HarnessContextStrategy,\n HarnessContextStrategyOptions,\n SummarizeHistoryOptions,\n TruncateToolResultsOptions,\n} from \"./domain/context.types.ts\";\nexport { defineHarnessHook } from \"./domain/hook.ts\";\nexport { defineHarnessSkill } from \"./domain/skill.ts\";\nexport type {\n HarnessSkill,\n HarnessSkillOptions,\n} from \"./domain/skill.types.ts\";\nexport { defineHarnessInstructions } from \"./domain/instructions.ts\";\nexport { defineHarnessPermissions } from \"./domain/permissions.ts\";\nexport type {\n HarnessHook,\n HarnessHookContext,\n HarnessHookDecisions,\n HarnessHookEvents,\n HarnessHookInput,\n HarnessHookOptions,\n HarnessHookPhase,\n HarnessHookResult,\n HarnessToolResultView,\n} from \"./domain/hook.types.ts\";\nexport type {\n HarnessPermissionRule,\n HarnessPermissions,\n HarnessPermissionsOptions,\n PermissionDecision,\n PermissionEffect,\n ToolResources,\n} from \"./domain/permissions.types.ts\";\nexport { defineHarnessTool, defineHarnessToolset } from \"./domain/tool.ts\";\nexport { createHarnessEditTools } from \"./adapters/tools/edit-tools.ts\";\nexport { createHarnessFileTools } from \"./adapters/tools/file-tools.ts\";\nexport { createHarnessGitTools } from \"./adapters/tools/git-tools.ts\";\nexport { createHarnessSearchTools } from \"./adapters/tools/search-tools.ts\";\nexport { createHarnessShellTools } from \"./adapters/tools/shell-tools.ts\";\nexport type { ShellToolsOptions } from \"./adapters/tools/tools.types.ts\";\nexport type {\n AccountCredential,\n AgentAuthentication,\n Agent,\n AgentOptions,\n AgentHarness,\n CliHarness,\n CliAgent,\n CustomAgent,\n UsageCredential,\n} from \"./domain/agent.types.ts\";\nexport type {\n Harness,\n HarnessOptions,\n HarnessInstructionContext,\n HarnessMcpContext,\n HarnessInstructions,\n HarnessInstructionSource,\n HarnessInstructionsOption,\n HarnessLimits,\n HarnessToolExecution,\n} from \"./domain/harness.types.ts\";\nexport type {\n McpClientCredentials,\n McpHttpServer,\n McpServer,\n McpServers,\n McpStdioServer,\n McpToolFilter,\n} from \"./domain/mcp-server.types.ts\";\nexport type { McpPromptOptions } from \"./domain/mcp-prompt.types.ts\";\nexport type {\n HarnessTool,\n HarnessToolContext,\n HarnessToolEvent,\n HarnessToolOptions,\n HarnessToolset,\n HarnessToolsetOptions,\n JsonSchema,\n StandardJsonSchema,\n ToolOutput,\n ToolValidation,\n} from \"./domain/tool.types.ts\";\nexport { TransportConflict } from \"./domain/transport.ts\";\nexport type {\n Transport,\n TransportEntry,\n TransportObject,\n TransportReadOptions,\n TransportWriteOptions,\n TransportReference,\n TransportStoreOptions,\n} from \"./domain/transport.types.ts\";\nexport { createLocalTransport } from \"./infrastructure/local-transport.ts\";\nexport type { LocalTransportOptions } from \"./infrastructure/local-transport.types.ts\";\nexport { createArtifactStore } from \"./infrastructure/transport-artifact-store.ts\";\nexport type { ArtifactStoreOptions } from \"./infrastructure/transport-artifact-store.types.ts\";\nexport {\n createWorkflowCheckpointStore,\n recoverWorkflowCheckpoint,\n} from \"./infrastructure/transport-checkpoint.ts\";\nexport type { CheckpointRecoveryOptions } from \"./infrastructure/transport-checkpoint.types.ts\";\nexport { createTaskCacheStore } from \"./infrastructure/transport-task-cache.ts\";\nexport { repositoryFingerprint } from \"./application/repository-fingerprint.ts\";\nexport type { TaskCacheStoreOptions } from \"./infrastructure/transport-task-cache.types.ts\";\nexport { readJournal } from \"./infrastructure/transport-journal.ts\";\nexport type { ReadJournalOptions } from \"./infrastructure/transport-journal.types.ts\";\nexport { createReplayAgent, ReplayDivergence } from \"./domain/replay.ts\";\nexport type {\n RecordedCommit,\n RecordedIdentity,\n RecordedRevision,\n ReplayAgent,\n ReplayAgentOptions,\n ReplayDivergenceDetails,\n ReplayDivergenceKind,\n ReplayDivergencePolicy,\n ReplayFailure,\n ReplayTurn,\n ReplayDecisionEvent,\n WorkspaceCommitsEvent,\n} from \"./domain/replay.types.ts\";\nexport {\n conversations,\n createTransportConversations,\n} from \"./application/conversation-stores.ts\";\nexport type { TransportConversationOptions } from \"./infrastructure/transport-conversations.types.ts\";\nexport {\n archiveRecovery,\n materializeRecoveryArchive,\n} from \"./application/recovery-archive.ts\";\nexport type {\n RecoveryArchiveOptions,\n RecoveryArchiveRestoreOptions,\n} from \"./application/recovery-archive.types.ts\";\n\nexport {\n attach,\n createSandbox,\n dispatch,\n openWorkspace,\n} from \"./application/outpost.ts\";\n\nexport type {\n AttachOptions,\n AttachResult,\n ContinuationOptions,\n DispatchResult,\n Sandbox,\n SandboxOptions,\n WarmDispatchResult,\n Workspace,\n WorkspaceOptions,\n} from \"./application/outpost.ts\";\n\nexport type {\n DispatchOptions,\n Execution,\n Turn,\n} from \"./application/execution.ts\";\n\nexport {\n WorkflowFailure,\n WorkflowBudgetExceeded,\n WorkflowUsageUnavailable,\n defineTask,\n defineWorkflow,\n} from \"./domain/workflow.ts\";\n\nexport type {\n Retry,\n Task,\n TaskContext,\n TaskOptions,\n TaskRecord,\n TaskStatus,\n Workflow,\n WorkflowEvent,\n WorkflowOptions,\n WorkflowBudget,\n WorkflowUsage,\n WorkflowResult,\n WorkflowTerminationCode,\n WorkflowTelemetry,\n} from \"./domain/workflow.ts\";\n\nexport {\n defineAgentTask,\n defineCommandTask,\n defineIsolatedTask,\n defineIsolatedCommandTask,\n} from \"./application/tasks.ts\";\nexport type { QuotaResumePolicy } from \"./application/quota-resume.types.ts\";\nexport { defineRecipe } from \"./application/recipe.ts\";\nexport type {\n RecipeBindings,\n RecipeConfiguration,\n} from \"./application/recipe.types.ts\";\n\nexport {\n createAntigravityHarness,\n createClaudeHarness,\n createCodexHarness,\n createCopilotHarness,\n createKimiHarness,\n} from \"./providers/agents.ts\";\n\nexport { agentVersions } from \"./providers/versions.ts\";\n\nexport {\n createHarnessConversations,\n createSessionBundleConversations,\n createTranscriptConversations,\n} from \"./infrastructure/conversations.ts\";\nexport { createClaudeConversations } from \"./adapters/agents/claude/claude-conversations.ts\";\nexport { createCodexConversations } from \"./adapters/agents/codex/codex-conversations.ts\";\nexport { createCopilotConversations } from \"./adapters/agents/copilot/copilot-conversations.ts\";\nexport { createKimiConversations } from \"./adapters/agents/kimi/kimi-conversations.ts\";\nexport type { TranscriptConversationLayout } from \"./infrastructure/conversations/layout.types.ts\";\nexport type {\n SessionBundleFiles,\n SessionBundleHelpers,\n SessionBundleProfile,\n SessionBundleRelocation,\n} from \"./infrastructure/conversations/session-bundle.types.ts\";\n\nexport type {\n ConversationFormat,\n ConversationLocation,\n} from \"./infrastructure/conversations.ts\";\n\nexport type {\n AntigravitySettings,\n ClaudeSettings,\n CodexSettings,\n CodexModelProvider,\n CopilotSettings,\n KimiSettings,\n} from \"./providers/agents.ts\";\n\nexport {\n createMountedSandboxProvider,\n createRemoteSandboxProvider,\n} from \"./providers/factories.ts\";\n\nexport {\n ResponseError,\n defineJsonResponse,\n defineTextResponse,\n} from \"./domain/response.ts\";\n\nexport type { ResponseSpec, StandardValidator } from \"./domain/response.ts\";\n\nexport { OutpostError, recoveryDetails } from \"./domain/errors.ts\";\nexport type { DiffGuard } from \"./domain/diff-guard.types.ts\";\n\nexport type { FaultCode } from \"./domain/errors.ts\";\n\nexport { quotaFault } from \"./domain/quota.ts\";\nexport type { QuotaFault } from \"./domain/quota.types.ts\";\nexport { unavailableFault } from \"./domain/unavailable.ts\";\nexport { createFallbackAgent } from \"./domain/fallback-agent.ts\";\nexport type {\n DispatchAgent,\n FallbackAgent,\n FallbackAgentOptions,\n FallbackAttempt,\n FallbackCandidate,\n FallbackRecord,\n FallbackTrigger,\n} from \"./domain/fallback-agent.types.ts\";\nexport type { UnavailableFault } from \"./domain/unavailable.types.ts\";\nexport { createSteering } from \"./domain/steering.ts\";\nexport type {\n Steering,\n SteeringDelivery,\n SteeringMode,\n SteeringSendOptions,\n SteeringState,\n} from \"./domain/steering.types.ts\";\n\nexport type {\n AgentAdapter,\n AgentConfiguration,\n ConfigurationFile,\n HostConfiguration,\n AgentEvent,\n AgentInput,\n AgentLiveInput,\n AgentLiveRead,\n AgentLiveSession,\n AgentObservation,\n BranchPolicy,\n Channel,\n Command,\n CommandResult,\n Commit,\n ConversationContext,\n ConversationRecord,\n ConversationStore,\n NativeConversationStore,\n Disposal,\n LifecycleHooks,\n FileManifestEntry,\n FileTransfers,\n SandboxContext,\n SandboxLease,\n SandboxProvider,\n StageLimits,\n TransferOptions,\n Usage,\n Variables,\n Volume,\n WorkspaceRecord,\n} from \"./domain/ports.ts\";\n\nexport type { Brief, PromptVariables } from \"./domain/prompts.ts\";\n\nexport type { Logging } from \"./infrastructure/journal.ts\";\n\nexport { createCustomReporter } from \"./infrastructure/custom-reporter.ts\";\nexport type {\n CustomReporter,\n CustomReporterOptions,\n ReporterHandlers,\n} from \"./infrastructure/custom-reporter.types.ts\";\nexport type {\n DispatchTelemetry,\n DispatchTelemetrySession,\n DispatchTelemetryOutcome,\n} from \"./domain/dispatch-telemetry.types.ts\";\nexport { createReporter } from \"./infrastructure/reporter.ts\";\n\nexport type { ReporterOptions } from \"./infrastructure/reporter.ts\";\n\nexport type { VariableQuestion } from \"./application/interactive-brief.ts\";\n\nexport {\n planRecoveryRetention,\n pruneRecoveryRetention,\n assertRecoveryQuota,\n} from \"./application/recovery-retention.ts\";\nexport type {\n RecoveryRetentionPolicy,\n RecoveryRetentionOptions,\n RecoveryRetentionPlan,\n RecoveryRetentionEntry,\n RecoveryPruneResult,\n RecoveryQuotaOptions,\n} from \"./application/recovery-retention.types.ts\";\nexport { verifyRecoveryTransfer } from \"./application/recovery-verification.ts\";\nexport type {\n RecoveryVerification,\n RecoveryVerificationOptions,\n} from \"./application/recovery-verification.types.ts\";\n\nexport { diagnoseSandbox } from \"./application/doctor-sandbox.ts\";\nexport type {\n SandboxDiagnosticOptions,\n SandboxDiagnosticReport,\n DiagnosticCapability,\n} from \"./application/doctor-sandbox.types.ts\";\nexport type {\n DiagnosticCheck,\n DiagnosticStatus,\n DoctorAgent,\n} from \"./application/doctor.types.ts\";\nexport { diagnoseAgentProtocol } from \"./application/doctor-protocol.ts\";\nexport type { AgentProtocolReport } from \"./application/doctor-protocol.types.ts\";\n\nexport { reserveRecoveryStorage } from \"./application/storage-reservation.ts\";\nexport type { RecoveryStorageReservationOptions } from \"./application/storage-reservation.types.ts\";\nexport type {\n StorageReservation,\n StorageReservationOptions,\n} from \"./infrastructure/storage-reservations.types.ts\";\n\nexport {\n planRecoveryRestore,\n restoreRecoveryTransfer,\n} from \"./application/recovery-restore.ts\";\nexport type {\n RecoveryRestoreOptions,\n RecoveryRestorePlan,\n RecoveryRestoreResult,\n} from \"./application/recovery-restore.types.ts\";\n\nexport type {\n WorkflowCheckpoint,\n WorkflowCheckpointOptions,\n WorkflowCheckpointStore,\n WorkflowCheckpointLease,\n WorkflowCheckpointValue,\n WorkspaceCheckpointMetadata,\n TaskWorkspaceCheckpoint,\n WorkflowJson,\n} from \"./domain/workflow/checkpoint.types.ts\";\n\nexport {\n defineApprovalTask,\n definePauseTask,\n} from \"./domain/workflow/gates.ts\";\nexport type {\n WorkflowGate,\n WorkflowGateOptions,\n WorkflowPauseRequest,\n WorkflowDecision,\n WorkflowDecisionRecord,\n WorkflowDecisionProof,\n WorkflowDecisionVerification,\n WorkflowDecisionVerifier,\n} from \"./domain/workflow/gates.types.ts\";\nexport type {\n WorkflowQuotaPause,\n WorkflowQuotaPolicy,\n} from \"./domain/workflow/quota-pause.types.ts\";\n\nexport { inspectRecovery } from \"./application/recovery-inspection.ts\";\nexport type {\n RecoveryInspection,\n RecoveryInspectionOptions,\n} from \"./application/recovery-inspection.types.ts\";\nexport type {\n ResourceActivityRecord,\n ResourceInspection,\n ResourceInspectionEntry,\n ResourceOperation,\n ResourceOperationKind,\n ResourceOperationResult,\n ResourcePhase,\n} from \"./infrastructure/resource-activity.types.ts\";\n\nexport {\n defineBinaryArtifact,\n defineJsonArtifact,\n publishArtifact,\n readStoredArtifact,\n} from \"./domain/artifact.ts\";\nexport {\n defineArtifactTask,\n readArtifact,\n} from \"./application/artifact-tasks.ts\";\nexport type {\n ArtifactContract,\n ArtifactContractOptions,\n ArtifactIdentity,\n ArtifactProducer,\n ArtifactReference,\n ArtifactStore,\n JsonArtifactOptions,\n PublishArtifactOptions,\n ReadArtifactOptions,\n} from \"./domain/artifact.types.ts\";\nexport type { ArtifactTaskOptions } from \"./application/artifact-tasks.types.ts\";\n\nexport { createSqliteTaskQueue } from \"./infrastructure/task-queue.ts\";\nexport {\n serveTaskQueue,\n createHttpTaskQueue,\n} from \"./infrastructure/task-queue-http.ts\";\nexport { runQueueWorker } from \"./application/queue-worker.ts\";\nexport { defineQueuedTask } from \"./application/queued-task.ts\";\nexport type {\n QueueRequest,\n QueueResult,\n QueueQuota,\n QueueJob,\n QueueClaim,\n QueueLease,\n TaskQueue,\n DurableTaskQueue,\n} from \"./domain/task-queue.types.ts\";\nexport type {\n QueueServerOptions,\n QueueServer,\n QueueClientOptions,\n} from \"./infrastructure/task-queue-http.types.ts\";\nexport type {\n QueueHandlerContext,\n QueueHandler,\n QueueWorkerOptions,\n} from \"./application/queue-worker.types.ts\";\nexport type { QueuedTaskOptions } from \"./application/queued-task.types.ts\";\nexport { createCronSchedule } from \"./domain/cron.ts\";\nexport type { CronOptions, CronSchedule } from \"./domain/cron.types.ts\";\nexport type {\n TriggerJob,\n TriggerJobInput,\n} from \"./domain/trigger-job.types.ts\";\nexport { runSchedules } from \"./application/schedules.ts\";\nexport { serveTriggers } from \"./infrastructure/trigger-server.ts\";\nexport type {\n TriggerFailure,\n TriggerRoute,\n TriggerServer,\n TriggerServerOptions,\n} from \"./infrastructure/trigger-server.types.ts\";\nexport type {\n TriggerEvent,\n TriggerHttpRequest,\n TriggerOutcome,\n TriggerReply,\n TriggerSecret,\n TriggerSource,\n} from \"./domain/trigger.types.ts\";\nexport { createGithubWebhook } from \"./adapters/triggers/github-webhook.ts\";\nexport { createGitlabWebhook } from \"./adapters/triggers/gitlab-webhook.ts\";\nexport { createSlackSource } from \"./adapters/triggers/slack-request.ts\";\nexport { createStandardWebhook } from \"./adapters/triggers/standard-webhook.ts\";\nexport {\n commandIssued,\n labelAdded,\n} from \"./adapters/triggers/trigger-events.ts\";\nexport type {\n GithubWebhookOptions,\n GitlabSigningOptions,\n GitlabTokenOptions,\n GitlabWebhookOptions,\n SlackRequestOptions,\n StandardWebhookOptions,\n TriggerCommand,\n TriggerLabel,\n} from \"./adapters/triggers/triggers.types.ts\";\nexport { defineWorkflowJob } from \"./application/workflow-job.ts\";\nexport type {\n WorkflowJobCheckpoint,\n WorkflowJobContext,\n WorkflowJobOptions,\n WorkflowJobStartOptions,\n} from \"./application/workflow-job.types.ts\";\nexport type {\n RunSchedulesOptions,\n ScheduleFailure,\n TriggerSchedule,\n} from \"./application/schedules.types.ts\";\n\nexport type { EgressPolicy } from \"./domain/egress.types.ts\";\n\nexport { recoverSpeculation } from \"./infrastructure/speculation-store.ts\";\nexport type { SpeculationRecoveryOptions } from \"./infrastructure/speculation-store.types.ts\";\nexport { checkSpeculationIntegration } from \"./application/speculation-integration.ts\";\nexport { speculate } from \"./application/speculation.ts\";\nexport type {\n SpeculationDurability,\n SpeculationIntegration,\n SpeculationOptions,\n SpeculationResult,\n SpeculativeCandidate,\n SpeculativeCandidateResult,\n SpeculativeOutput,\n SpeculativeHostSnapshot,\n SpeculativeValidation,\n} from \"./application/speculation.types.ts\";\n\nexport { createOpenAIModelProvider } from \"./adapters/models/openai-model-provider.ts\";\nexport type { OpenAIModelProviderOptions } from \"./adapters/models/openai-model-provider.types.ts\";\nexport type {\n AgentModel,\n ModelContentBlock,\n ModelMessage,\n ModelProvider,\n ModelReasoning,\n ModelReasoningBlock,\n ModelRequest,\n ModelResult,\n ModelSpec,\n ModelStopReason,\n ModelStreamEvent,\n ModelTextBlock,\n ModelToolCallBlock,\n ModelToolResultBlock,\n ModelToolSpec,\n} from \"./domain/model.types.ts\";\nexport { createAnthropicModelProvider } from \"./adapters/models/anthropic-model-provider.ts\";\nexport type { AnthropicModelProviderOptions } from \"./adapters/models/anthropic-model-provider.types.ts\";\n\nexport { createObservationHub } from \"./domain/observation.ts\";\nexport type {\n Observation,\n ObservationScope,\n ObservationSource,\n ObservationEvent,\n OperationEvent,\n ObservationHub,\n ObservationHubOptions,\n ObservationSink,\n} from \"./domain/observation.types.ts\";\n\nexport {\n signWorkflowDecision,\n createEd25519DecisionVerifier,\n} from \"./infrastructure/workflow-decision-signature.ts\";\nexport type {\n WorkflowDecisionSigningOptions,\n WorkflowApproverKey,\n WorkflowDecisionVerifierOptions,\n} from \"./infrastructure/workflow-decision-signature.types.ts\";\n\nexport { defineInteractiveAgentTask } from \"./application/interactive-task.ts\";\nexport type {\n InteractiveAgentTaskOptions,\n InteractiveAgentResult,\n FileInteractiveAgentTaskOptions,\n FileInteractiveAgentResult,\n} from \"./application/interactive-task.types.ts\";\nexport type {\n WorkflowInputQuestion,\n WorkflowInputRequest,\n WorkflowAnswer,\n WorkflowAnswerRecord,\n TaskInteraction,\n TaskInteractionRecord,\n TaskInteractionContext,\n} from \"./domain/workflow/input.types.ts\";\nexport {\n defineLoopTask,\n LoopTaskExhausted,\n} from \"./domain/workflow/loop-task.ts\";\nexport type {\n TaskCacheAccessOptions,\n TaskCacheEntry,\n TaskCacheMode,\n TaskCacheOptions,\n TaskCacheOutcome,\n TaskCacheStore,\n} from \"./domain/workflow/task-cache.types.ts\";\nexport type {\n LoopCheckResult,\n LoopTaskContext,\n LoopTaskOptions,\n LoopRoundRecord,\n} from \"./domain/workflow/loop-task.types.ts\";\nexport { defineDecision } from \"./domain/decision.ts\";\nexport { decide } from \"./application/decision.ts\";\nexport { defineDecisionTask } from \"./application/decision-task.ts\";\nexport { createSystemOneDecisionProvider } from \"./adapters/decisions/system-one-provider.ts\";\nexport { defineHarnessModelRouting } from \"./domain/harness-routing.ts\";\nexport type {\n DecisionState,\n ChoiceQuestion,\n ScoreQuestion,\n NoulQuestion,\n DecisionQuestion,\n DecisionQuestions,\n DecisionOptions,\n Decision,\n ChoiceAnswer,\n ScoreAnswer,\n NoulAnswer,\n DecisionAnswer,\n DecisionAnswers,\n DecisionProviderResult,\n DecisionRequest,\n DecisionProvider,\n DecisionResult,\n DecideOptions,\n DecisionEvent,\n} from \"./domain/decision.types.ts\";\nexport type { DecisionTaskOptions } from \"./application/decision.types.ts\";\nexport type { SystemOneDecisionProviderOptions } from \"./adapters/decisions/system-one-provider.types.ts\";\nexport type {\n HarnessModelRoutingContext,\n HarnessModelRoutingOptions,\n HarnessModelRouting,\n RoutingQuestion,\n RoutingChoices,\n ModelRouteEvent,\n} from \"./domain/harness-routing.types.ts\";\nexport { createAgentConflictResolver } from \"./application/agent-conflict-resolver.ts\";\nexport type {\n AgentConflictResolverOptions,\n ConflictContext,\n ConflictResolution,\n ConflictResolver,\n IntegrationOptions,\n} from \"./application/conflict-resolution.types.ts\";\n\nexport { calculateUsageCost } from \"./domain/pricing.ts\";\nexport type {\n ModelPrice,\n ModelPriceTable,\n ModelUsage,\n UsageCost,\n} from \"./domain/pricing.types.ts\";\nexport { WorkflowCostUnavailable } from \"./domain/workflow/budget.ts\";\nexport { loadModelPrices } from \"./adapters/models/model-prices.ts\";\nexport type { ModelPricesOptions } from \"./adapters/models/model-prices.types.ts\";\n\nexport type {\n RunReport,\n RunReportOptions,\n RunReportDiff,\n RunReportFile,\n RunReportFailure,\n} from \"./domain/run-report.types.ts\";\nexport { createRunObserver } from \"./infrastructure/run-observer.ts\";\nexport { readRun, watchRun } from \"./infrastructure/run-reader.ts\";\nexport type {\n RunStatus,\n RunTask,\n RunPass,\n RunDispatch,\n RunError,\n RunSnapshot,\n RunEvent,\n RunObserverOptions,\n RunObserver,\n ReadRunOptions,\n WatchRunOptions,\n} from \"./domain/run.types.ts\";\nexport { changed } from \"./domain/lifecycle.ts\";\nexport { fromSecrets } from \"./application/secrets.ts\";\nexport type {\n SecretSource,\n SecretResolveOptions,\n FromSecretsOptions,\n} from \"./domain/secrets.types.ts\";\nexport type {\n ChangedCondition,\n LifecycleCommand,\n} from \"./domain/lifecycle.types.ts\";\nexport {\n createWorkspace,\n restoreFileWorkspace,\n workspaceFingerprint,\n} from \"./application/file-workspace.ts\";\nexport { prepareWorkspaceOutputs } from \"./application/workspace-output-baseline.ts\";\nexport {\n publishWorkspaceOutputs,\n inspectWorkspacePublication,\n recoverWorkspacePublication,\n} from \"./application/workspace-publication.ts\";\nexport {\n snapshotWorkspaceFiles,\n restoreWorkspaceFiles,\n} from \"./infrastructure/workspace-snapshot.ts\";\nexport type {\n FileWorkspace,\n FileWorkspaceOptions,\n GitWorkspace,\n GitWorkspaceOptions,\n CreatedWorkspace,\n FileWorkspaceRecoveryAuthorization,\n} from \"./application/file-workspace.types.ts\";\nexport type {\n FileSandbox,\n FileSandboxOptions,\n FileSandboxSettings,\n FileDispatchRequest,\n FileDispatchResult,\n FileAttachResult,\n} from \"./application/file-sandbox.types.ts\";\nexport type {\n WorkspaceSource,\n FileWorkspaceSource,\n GitWorkspaceSource,\n WorkspaceSession,\n FileWorkspaceRecord,\n WorkspaceRuntime,\n WorkspaceRuntimeOptions,\n WorkspaceRetention,\n WorkspaceInput,\n WorkspaceOutputOptions,\n WorkspacePublication,\n WorkspaceFileEntry,\n WorkspaceAllocationRecord,\n WorkspaceConversationArchive,\n WorkspaceOutputBaseline,\n} from \"./domain/file-workspace.types.ts\";\nexport type {\n FileSandboxContext,\n SandboxWorkspaces,\n} from \"./domain/sandbox.types.ts\";\nexport {\n inspectWorkspacePathLocks,\n recoverWorkspacePathLock,\n} from \"./infrastructure/workspace-lock.ts\";\nexport type { RestoreFileWorkspaceOptions } from \"./application/file-workspace.types.ts\";\nexport type {\n WorkspacePathLock,\n WorkspacePathRecoveryOptions,\n} from \"./infrastructure/workspace-lock.types.ts\";\nexport type {\n PublicationJournal,\n PublicationOperation,\n PublicationDirectory,\n PublicationRecoveryOptions,\n} from \"./application/workspace-publication.types.ts\";\nexport type {\n FileAgentTaskOptions,\n FileIsolatedTaskOptions,\n MixedIsolatedTaskOptions,\n MixedAgentTaskOptions,\n IsolatedCommandTaskOptions,\n FileIsolatedCommandRequest,\n} from \"./application/tasks.types.ts\";\nexport type { FileSelectionOptions } from \"./adapters/tools/tools.types.ts\";\nexport type {\n FileRecipeBindings,\n MixedRecipeBindings,\n FileRecipeConfiguration,\n} from \"./application/recipe.types.ts\";\nexport type {\n GitWorkspaceSandboxOptions,\n GitDispatchRequest,\n} from \"./application/file-workspace.types.ts\";\nexport type { FileRunReport } from \"./domain/run-report.types.ts\";\nexport {\n inspectFileWorkspace,\n recoverFileWorkspace,\n} from \"./application/file-workspace-recovery.ts\";\nexport type {\n FileWorkspaceInspection,\n FileWorkspaceInspectionOptions,\n FileWorkspaceRecoveryOptions,\n} from \"./application/file-workspace-recovery.types.ts\";\n\nexport type { HookCommand } from \"./domain/hook-command.types.ts\";\nexport type { AgentHookContext } from \"./domain/agent-hook.types.ts\";\nexport { defineClaudeHook } from \"./adapters/agents/claude/claude-hooks.ts\";\nexport type {\n ClaudeHook,\n ClaudeHookOptions,\n ClaudeHookPhase,\n ClaudeHookEvents,\n ClaudeHookDecisions,\n} from \"./adapters/agents/claude/claude-hooks.types.ts\";\nexport { defineCodexHook } from \"./adapters/agents/codex/codex-hooks.ts\";\nexport type {\n CodexHook,\n CodexHookOptions,\n CodexHookPhase,\n CodexHookEvents,\n CodexHookDecisions,\n} from \"./adapters/agents/codex/codex-hooks.types.ts\";\nexport { defineCopilotHook } from \"./adapters/agents/copilot/copilot-hooks.ts\";\nexport type {\n CopilotHook,\n CopilotHookOptions,\n CopilotHookPhase,\n CopilotHookEvents,\n CopilotHookDecisions,\n} from \"./adapters/agents/copilot/copilot-hooks.types.ts\";\nexport { defineKimiHook } from \"./adapters/agents/kimi/kimi-hooks.ts\";\nexport type {\n KimiHook,\n KimiHookOptions,\n KimiHookPhase,\n KimiHookEvents,\n KimiHookDecisions,\n} from \"./adapters/agents/kimi/kimi-hooks.types.ts\";\nexport { defineAntigravityHook } from \"./adapters/agents/antigravity/antigravity-hooks.ts\";\nexport type {\n AntigravityHook,\n AntigravityHookOptions,\n AntigravityHookPhase,\n AntigravityHookEvents,\n AntigravityHookDecisions,\n} from \"./adapters/agents/antigravity/antigravity-hooks.types.ts\";\n\nexport {\n inspectStorageReservations,\n recoverStorageReservation,\n} from \"./infrastructure/reservation-recovery.ts\";\nexport type {\n StorageReservationRecord,\n StorageReservationInspection,\n StorageReservationRecoveryOptions,\n} from \"./infrastructure/transport-reservations.types.ts\";\n"]}
@@ -2,9 +2,9 @@ import { redactTranscript } from "./redaction.js";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { mkdir, readFile, rm, stat, writeFile } from "node:fs/promises";
4
4
  import { homedir } from "node:os";
5
- import { dirname, join, posix, relative, resolve } from "node:path";
5
+ import { basename, dirname, join, posix, relative, resolve } from "node:path";
6
6
  import { invariant, OutpostError } from "../../domain/errors.js";
7
- import { safeDestination } from "../files.js";
7
+ import { inside, safeDestination } from "../files.js";
8
8
  import { transcriptSearchBytes } from "./conversation.constants.js";
9
9
  import { files } from "./files.js";
10
10
  import { validId } from "./identity.js";
@@ -15,11 +15,17 @@ async function locateTranscript(layout, id, repository, home = homedir()) {
15
15
  const expected = layout.preferredPath?.(id, repository, home);
16
16
  if (expected && (await stat(expected).catch(() => undefined))?.isFile())
17
17
  return { id, file: expected, format };
18
- const found = (await files(layout.searchRoot(home))).find((file) => layout.matches(file, id));
18
+ const matches = (await files(layout.searchRoot(home))).filter((file) => layout.matches(file, id));
19
+ const found = uniqueTranscript(matches, id);
19
20
  if (found)
20
21
  return { id, file: found, format };
21
22
  throw new OutpostError("session", `Conversation ${id} was not found in native ${format} storage`, { id, repository });
22
23
  }
24
+ function uniqueTranscript(matches, id) {
25
+ if (matches.length > 1)
26
+ throw new OutpostError("session", `Conversation ${id} has multiple native transcripts; select or reconcile the copies explicitly`, { id, files: matches });
27
+ return matches[0];
28
+ }
23
29
  async function captureSidecars(id, remote, file, context) {
24
30
  const { sandbox, staging, repository } = context;
25
31
  const remoteSidecars = posix.join(posix.dirname(remote.replaceAll("\\", "/")), id, "subagents");
@@ -69,10 +75,31 @@ async function captureTranscript(layout, id, context) {
69
75
  arguments: [search, "-type", "f", "-name", layout.pattern(id)],
70
76
  retain: transcriptSearchBytes,
71
77
  });
72
- const remote = result.stdout.trim().split("\n").filter(Boolean)[0];
78
+ const matches = result.stdout.trim().split("\n").filter(Boolean);
79
+ const preferred = layout
80
+ .preferredPath?.(id, sandbox.root, sandbox.home)
81
+ ?.replaceAll("\\", "/");
82
+ const remote = matches.find((file) => file.replaceAll("\\", "/") === preferred) ??
83
+ uniqueTranscript(matches, id);
73
84
  if (result.status !== 0 || !remote)
74
85
  throw new OutpostError("session", `Agent emitted conversation ${id} but its transcript is unavailable`, { id, search });
75
- const file = layout.capturePath(id, repository, home, remote);
86
+ let file = layout.capturePath(id, repository, home, remote);
87
+ if (context.local) {
88
+ if (inside(layout.directory(repository, home), remote))
89
+ file = remote;
90
+ const [source, destination] = await Promise.all([
91
+ stat(remote),
92
+ stat(file).catch(() => undefined),
93
+ ]);
94
+ if (resolve(file) === resolve(remote) ||
95
+ (destination &&
96
+ source.dev === destination.dev &&
97
+ source.ino === destination.ino)) {
98
+ if (!context.observation?.redacting)
99
+ return { id, file: remote, format: layout.format };
100
+ file = join(context.runtimeDirectory ?? join(repository, ".outpost"), "conversations", "native", encodeURIComponent(layout.format), id, basename(remote));
101
+ }
102
+ }
76
103
  await mkdir(staging, { recursive: true });
77
104
  const temporary = join(staging, `${randomUUID()}.jsonl`);
78
105
  await sandbox.download(remote, temporary);
@@ -1 +1 @@
1
- {"version":3,"file":"transcript-store.js","sourceRoot":"","sources":["../../../src/infrastructure/conversations/transcript-store.ts"],"names":[],"mappings":"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","sourcesContent":["import { redactTranscript } from \"./redaction.ts\";\nimport { randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, rm, stat, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, posix, relative, resolve } from \"node:path\";\nimport type {\n ConversationContext,\n ConversationRecord,\n NativeConversationStore,\n} from \"../../domain/conversation.types.ts\";\nimport { invariant, OutpostError } from \"../../domain/errors.ts\";\nimport type { SandboxLease } from \"../../domain/sandbox.types.ts\";\nimport { safeDestination } from \"../files.ts\";\nimport { transcriptSearchBytes } from \"./conversation.constants.ts\";\nimport { files } from \"./files.ts\";\nimport { validId } from \"./identity.ts\";\nimport type { TranscriptConversationLayout } from \"./layout.types.ts\";\nimport { relocateTranscript } from \"./relocate.ts\";\n\nasync function locateTranscript(\n layout: TranscriptConversationLayout,\n id: string,\n repository: string,\n home = homedir(),\n): Promise<ConversationRecord> {\n validId(id);\n const { format } = layout;\n const expected = layout.preferredPath?.(id, repository, home);\n if (expected && (await stat(expected).catch(() => undefined))?.isFile())\n return { id, file: expected, format };\n const found = (await files(layout.searchRoot(home))).find((file) =>\n layout.matches(file, id),\n );\n if (found) return { id, file: found, format };\n throw new OutpostError(\n \"session\",\n `Conversation ${id} was not found in native ${format} storage`,\n { id, repository },\n );\n}\n\nasync function captureSidecars(\n id: string,\n remote: string,\n file: string,\n context: ConversationContext,\n): Promise<void> {\n const { sandbox, staging, repository } = context;\n const remoteSidecars = posix.join(\n posix.dirname(remote.replaceAll(\"\\\\\", \"/\")),\n id,\n \"subagents\",\n );\n const listed = context.local\n ? {\n status: 0,\n stdout: (await files(join(dirname(remote), id, \"subagents\"))).join(\n \"\\n\",\n ),\n }\n : await sandbox.invoke({\n executable: \"find\",\n arguments: [remoteSidecars, \"-type\", \"f\", \"-name\", \"*.jsonl\"],\n retain: transcriptSearchBytes,\n });\n if (listed.status !== 0) return;\n for (const child of listed.stdout.split(\"\\n\").filter(Boolean)) {\n try {\n const scratch = join(staging, `${randomUUID()}.jsonl`);\n await sandbox.download(child, scratch);\n const destination = await safeDestination(\n join(dirname(file), id, \"subagents\"),\n posix.relative(\n remoteSidecars.replaceAll(\"\\\\\", \"/\"),\n child.replaceAll(\"\\\\\", \"/\"),\n ),\n );\n await mkdir(dirname(destination), { recursive: true });\n try {\n await writeFile(\n destination,\n relocateTranscript(\n redactTranscript(\n await readFile(scratch, \"utf8\"),\n context.observation,\n ),\n resolve(repository),\n ),\n { mode: 0o600 },\n );\n } finally {\n await rm(scratch, { force: true });\n }\n } catch (cause) {\n context.warn?.(`Could not capture child transcript: ${String(cause)}`);\n }\n }\n}\n\nasync function captureTranscript(\n layout: TranscriptConversationLayout,\n id: string,\n context: ConversationContext,\n): Promise<ConversationRecord> {\n validId(id);\n const { sandbox, staging, repository } = context;\n const home = context.home ?? homedir();\n const search = layout.remoteSearchRoot(sandbox.home);\n const result = context.local\n ? {\n status: 0,\n stdout: (await locateTranscript(layout, id, sandbox.root, sandbox.home))\n .file,\n }\n : await sandbox.invoke({\n executable: \"find\",\n arguments: [search, \"-type\", \"f\", \"-name\", layout.pattern(id)],\n retain: transcriptSearchBytes,\n });\n const remote = result.stdout.trim().split(\"\\n\").filter(Boolean)[0];\n if (result.status !== 0 || !remote)\n throw new OutpostError(\n \"session\",\n `Agent emitted conversation ${id} but its transcript is unavailable`,\n { id, search },\n );\n const file = layout.capturePath(id, repository, home, remote);\n await mkdir(staging, { recursive: true });\n const temporary = join(staging, `${randomUUID()}.jsonl`);\n await sandbox.download(remote, temporary);\n await mkdir(dirname(file), { recursive: true });\n try {\n await writeFile(\n file,\n relocateTranscript(\n redactTranscript(\n await readFile(temporary, \"utf8\"),\n context.observation,\n ),\n resolve(repository),\n ),\n { mode: 0o600 },\n );\n } finally {\n await rm(temporary, { force: true });\n }\n if (layout.sidecars) await captureSidecars(id, remote, file, context);\n return { id, file, format: layout.format };\n}\n\nasync function uploadRelocated(\n file: string,\n target: string,\n sandbox: SandboxLease,\n staging: string,\n): Promise<void> {\n const temporary = join(staging, `${randomUUID()}.jsonl`);\n await mkdir(staging, { recursive: true });\n await writeFile(\n temporary,\n relocateTranscript(await readFile(file, \"utf8\"), sandbox.root),\n { mode: 0o600 },\n );\n try {\n await sandbox.upload(temporary, target);\n } finally {\n await rm(temporary, { force: true });\n }\n}\n\nasync function restoreTranscript(\n layout: TranscriptConversationLayout,\n record: ConversationRecord,\n { sandbox, staging }: ConversationContext,\n): Promise<void> {\n validId(record.id);\n const target = layout.remotePath(record.id, sandbox, record.file);\n await uploadRelocated(record.file, target, sandbox, staging);\n if (!layout.sidecars) return;\n const sidecars = join(dirname(record.file), record.id, \"subagents\");\n for (const file of await files(sidecars))\n await uploadRelocated(\n file,\n posix.join(\n posix.dirname(target),\n record.id,\n \"subagents\",\n relative(sidecars, file).replaceAll(\"\\\\\", \"/\"),\n ),\n sandbox,\n staging,\n );\n}\n\n/** Creates a native store for CLIs that keep one JSONL transcript per conversation. */\nexport function createTranscriptConversations(\n layout: TranscriptConversationLayout,\n): NativeConversationStore {\n const { format } = layout;\n invariant(\n typeof format === \"string\" && format.length > 0,\n \"Transcript layouts require a format name\",\n );\n return {\n name: format,\n format,\n locate: (id, repository, home) =>\n locateTranscript(layout, id, repository, home),\n capture: (id, context) => captureTranscript(layout, id, context),\n async restore(record, context) {\n invariant(\n record.format === format,\n \"Conversation format does not match its storage\",\n );\n if (\n context.local &&\n context.sandbox.root === context.repository &&\n record.reference === undefined\n )\n return;\n return restoreTranscript(layout, record, context);\n },\n directory: (repository, home) =>\n layout.directory(repository, home ?? homedir()),\n destination(id, sandbox, original) {\n validId(id);\n return layout.remotePath(id, sandbox, original);\n },\n };\n}\n"]}
1
+ {"version":3,"file":"transcript-store.js","sourceRoot":"","sources":["../../../src/infrastructure/conversations/transcript-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAM9E,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEjE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,KAAK,UAAU,gBAAgB,CAC7B,MAAoC,EACpC,EAAU,EACV,UAAkB,EAClB,IAAI,GAAG,OAAO,EAAE;IAEhB,OAAO,CAAC,EAAE,CAAC,CAAC;IACZ,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IAC9D,IAAI,QAAQ,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE;QACrE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CACrE,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CACzB,CAAC;IACF,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC5C,IAAI,KAAK;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC9C,MAAM,IAAI,YAAY,CACpB,SAAS,EACT,gBAAgB,EAAE,4BAA4B,MAAM,UAAU,EAC9D,EAAE,EAAE,EAAE,UAAU,EAAE,CACnB,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,OAA0B,EAC1B,EAAU;IAEV,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QACpB,MAAM,IAAI,YAAY,CACpB,SAAS,EACT,gBAAgB,EAAE,6EAA6E,EAC/F,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CACvB,CAAC;IACJ,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,EAAU,EACV,MAAc,EACd,IAAY,EACZ,OAA4B;IAE5B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IACjD,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAC/B,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,EAC3C,EAAE,EACF,WAAW,CACZ,CAAC;IACF,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK;QAC1B,CAAC,CAAC;YACE,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAChE,IAAI,CACL;SACF;QACH,CAAC,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC;YACnB,UAAU,EAAE,MAAM;YAClB,SAAS,EAAE,CAAC,cAAc,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,CAAC;YAC7D,MAAM,EAAE,qBAAqB;SAC9B,CAAC,CAAC;IACP,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAChC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9D,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,UAAU,EAAE,QAAQ,CAAC,CAAC;YACvD,MAAM,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACvC,MAAM,WAAW,GAAG,MAAM,eAAe,CACvC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,WAAW,CAAC,EACpC,KAAK,CAAC,QAAQ,CACZ,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,EACpC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAC5B,CACF,CAAC;YACF,MAAM,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACvD,IAAI,CAAC;gBACH,MAAM,SAAS,CACb,WAAW,EACX,kBAAkB,CAChB,gBAAgB,CACd,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,EAC/B,OAAO,CAAC,WAAW,CACpB,EACD,OAAO,CAAC,UAAU,CAAC,CACpB,EACD,EAAE,IAAI,EAAE,KAAK,EAAE,CAChB,CAAC;YACJ,CAAC;oBAAS,CAAC;gBACT,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,EAAE,CAAC,uCAAuC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,MAAoC,EACpC,EAAU,EACV,OAA4B;IAE5B,OAAO,CAAC,EAAE,CAAC,CAAC;IACZ,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IACjD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK;QAC1B,CAAC,CAAC;YACE,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,CAAC,MAAM,gBAAgB,CAAC,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;iBACrE,IAAI;SACR;QACH,CAAC,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC;YACnB,UAAU,EAAE,MAAM;YAClB,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC9D,MAAM,EAAE,qBAAqB;SAC9B,CAAC,CAAC;IACP,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,MAAM;SACrB,aAAa,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC;QAChD,EAAE,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC1B,MAAM,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,SAAS,CAAC;QAChE,gBAAgB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAChC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM;QAChC,MAAM,IAAI,YAAY,CACpB,SAAS,EACT,8BAA8B,EAAE,oCAAoC,EACpE,EAAE,EAAE,EAAE,MAAM,EAAE,CACf,CAAC;IACJ,IAAI,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5D,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAE,IAAI,GAAG,MAAM,CAAC;QACtE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC9C,IAAI,CAAC,MAAM,CAAC;YACZ,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;SAClC,CAAC,CAAC;QACH,IACE,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC;YACjC,CAAC,WAAW;gBACV,MAAM,CAAC,GAAG,KAAK,WAAW,CAAC,GAAG;gBAC9B,MAAM,CAAC,GAAG,KAAK,WAAW,CAAC,GAAG,CAAC,EACjC,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS;gBACjC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;YACrD,IAAI,GAAG,IAAI,CACT,OAAO,CAAC,gBAAgB,IAAI,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,EACxD,eAAe,EACf,QAAQ,EACR,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,EACjC,EAAE,EACF,QAAQ,CAAC,MAAM,CAAC,CACjB,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,UAAU,EAAE,QAAQ,CAAC,CAAC;IACzD,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC1C,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,SAAS,CACb,IAAI,EACJ,kBAAkB,CAChB,gBAAgB,CACd,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,EACjC,OAAO,CAAC,WAAW,CACpB,EACD,OAAO,CAAC,UAAU,CAAC,CACpB,EACD,EAAE,IAAI,EAAE,KAAK,EAAE,CAChB,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ;QAAE,MAAM,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACtE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AAC7C,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,IAAY,EACZ,MAAc,EACd,OAAqB,EACrB,OAAe;IAEf,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,UAAU,EAAE,QAAQ,CAAC,CAAC;IACzD,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,MAAM,SAAS,CACb,SAAS,EACT,kBAAkB,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,EAC9D,EAAE,IAAI,EAAE,KAAK,EAAE,CAChB,CAAC;IACF,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,MAAoC,EACpC,MAA0B,EAC1B,EAAE,OAAO,EAAE,OAAO,EAAuB;IAEzC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnB,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAClE,MAAM,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7D,IAAI,CAAC,MAAM,CAAC,QAAQ;QAAE,OAAO;IAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IACpE,KAAK,MAAM,IAAI,IAAI,MAAM,KAAK,CAAC,QAAQ,CAAC;QACtC,MAAM,eAAe,CACnB,IAAI,EACJ,KAAK,CAAC,IAAI,CACR,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EACrB,MAAM,CAAC,EAAE,EACT,WAAW,EACX,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAC/C,EACD,OAAO,EACP,OAAO,CACR,CAAC;AACN,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,6BAA6B,CAC3C,MAAoC;IAEpC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAC1B,SAAS,CACP,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAC/C,0CAA0C,CAC3C,CAAC;IACF,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,MAAM;QACN,MAAM,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,CAC/B,gBAAgB,CAAC,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC;QAChD,OAAO,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC;QAChE,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO;YAC3B,SAAS,CACP,MAAM,CAAC,MAAM,KAAK,MAAM,EACxB,gDAAgD,CACjD,CAAC;YACF,IACE,OAAO,CAAC,KAAK;gBACb,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,UAAU;gBAC3C,MAAM,CAAC,SAAS,KAAK,SAAS;gBAE9B,OAAO;YACT,OAAO,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACpD,CAAC;QACD,SAAS,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,CAC9B,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,IAAI,OAAO,EAAE,CAAC;QACjD,WAAW,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ;YAC/B,OAAO,CAAC,EAAE,CAAC,CAAC;YACZ,OAAO,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAClD,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { redactTranscript } from \"./redaction.ts\";\nimport { randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, rm, stat, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { basename, dirname, join, posix, relative, resolve } from \"node:path\";\nimport type {\n ConversationContext,\n ConversationRecord,\n NativeConversationStore,\n} from \"../../domain/conversation.types.ts\";\nimport { invariant, OutpostError } from \"../../domain/errors.ts\";\nimport type { SandboxLease } from \"../../domain/sandbox.types.ts\";\nimport { inside, safeDestination } from \"../files.ts\";\nimport { transcriptSearchBytes } from \"./conversation.constants.ts\";\nimport { files } from \"./files.ts\";\nimport { validId } from \"./identity.ts\";\nimport type { TranscriptConversationLayout } from \"./layout.types.ts\";\nimport { relocateTranscript } from \"./relocate.ts\";\n\nasync function locateTranscript(\n layout: TranscriptConversationLayout,\n id: string,\n repository: string,\n home = homedir(),\n): Promise<ConversationRecord> {\n validId(id);\n const { format } = layout;\n const expected = layout.preferredPath?.(id, repository, home);\n if (expected && (await stat(expected).catch(() => undefined))?.isFile())\n return { id, file: expected, format };\n const matches = (await files(layout.searchRoot(home))).filter((file) =>\n layout.matches(file, id),\n );\n const found = uniqueTranscript(matches, id);\n if (found) return { id, file: found, format };\n throw new OutpostError(\n \"session\",\n `Conversation ${id} was not found in native ${format} storage`,\n { id, repository },\n );\n}\n\nfunction uniqueTranscript(\n matches: readonly string[],\n id: string,\n): string | undefined {\n if (matches.length > 1)\n throw new OutpostError(\n \"session\",\n `Conversation ${id} has multiple native transcripts; select or reconcile the copies explicitly`,\n { id, files: matches },\n );\n return matches[0];\n}\n\nasync function captureSidecars(\n id: string,\n remote: string,\n file: string,\n context: ConversationContext,\n): Promise<void> {\n const { sandbox, staging, repository } = context;\n const remoteSidecars = posix.join(\n posix.dirname(remote.replaceAll(\"\\\\\", \"/\")),\n id,\n \"subagents\",\n );\n const listed = context.local\n ? {\n status: 0,\n stdout: (await files(join(dirname(remote), id, \"subagents\"))).join(\n \"\\n\",\n ),\n }\n : await sandbox.invoke({\n executable: \"find\",\n arguments: [remoteSidecars, \"-type\", \"f\", \"-name\", \"*.jsonl\"],\n retain: transcriptSearchBytes,\n });\n if (listed.status !== 0) return;\n for (const child of listed.stdout.split(\"\\n\").filter(Boolean)) {\n try {\n const scratch = join(staging, `${randomUUID()}.jsonl`);\n await sandbox.download(child, scratch);\n const destination = await safeDestination(\n join(dirname(file), id, \"subagents\"),\n posix.relative(\n remoteSidecars.replaceAll(\"\\\\\", \"/\"),\n child.replaceAll(\"\\\\\", \"/\"),\n ),\n );\n await mkdir(dirname(destination), { recursive: true });\n try {\n await writeFile(\n destination,\n relocateTranscript(\n redactTranscript(\n await readFile(scratch, \"utf8\"),\n context.observation,\n ),\n resolve(repository),\n ),\n { mode: 0o600 },\n );\n } finally {\n await rm(scratch, { force: true });\n }\n } catch (cause) {\n context.warn?.(`Could not capture child transcript: ${String(cause)}`);\n }\n }\n}\n\nasync function captureTranscript(\n layout: TranscriptConversationLayout,\n id: string,\n context: ConversationContext,\n): Promise<ConversationRecord> {\n validId(id);\n const { sandbox, staging, repository } = context;\n const home = context.home ?? homedir();\n const search = layout.remoteSearchRoot(sandbox.home);\n const result = context.local\n ? {\n status: 0,\n stdout: (await locateTranscript(layout, id, sandbox.root, sandbox.home))\n .file,\n }\n : await sandbox.invoke({\n executable: \"find\",\n arguments: [search, \"-type\", \"f\", \"-name\", layout.pattern(id)],\n retain: transcriptSearchBytes,\n });\n const matches = result.stdout.trim().split(\"\\n\").filter(Boolean);\n const preferred = layout\n .preferredPath?.(id, sandbox.root, sandbox.home)\n ?.replaceAll(\"\\\\\", \"/\");\n const remote =\n matches.find((file) => file.replaceAll(\"\\\\\", \"/\") === preferred) ??\n uniqueTranscript(matches, id);\n if (result.status !== 0 || !remote)\n throw new OutpostError(\n \"session\",\n `Agent emitted conversation ${id} but its transcript is unavailable`,\n { id, search },\n );\n let file = layout.capturePath(id, repository, home, remote);\n if (context.local) {\n if (inside(layout.directory(repository, home), remote)) file = remote;\n const [source, destination] = await Promise.all([\n stat(remote),\n stat(file).catch(() => undefined),\n ]);\n if (\n resolve(file) === resolve(remote) ||\n (destination &&\n source.dev === destination.dev &&\n source.ino === destination.ino)\n ) {\n if (!context.observation?.redacting)\n return { id, file: remote, format: layout.format };\n file = join(\n context.runtimeDirectory ?? join(repository, \".outpost\"),\n \"conversations\",\n \"native\",\n encodeURIComponent(layout.format),\n id,\n basename(remote),\n );\n }\n }\n await mkdir(staging, { recursive: true });\n const temporary = join(staging, `${randomUUID()}.jsonl`);\n await sandbox.download(remote, temporary);\n await mkdir(dirname(file), { recursive: true });\n try {\n await writeFile(\n file,\n relocateTranscript(\n redactTranscript(\n await readFile(temporary, \"utf8\"),\n context.observation,\n ),\n resolve(repository),\n ),\n { mode: 0o600 },\n );\n } finally {\n await rm(temporary, { force: true });\n }\n if (layout.sidecars) await captureSidecars(id, remote, file, context);\n return { id, file, format: layout.format };\n}\n\nasync function uploadRelocated(\n file: string,\n target: string,\n sandbox: SandboxLease,\n staging: string,\n): Promise<void> {\n const temporary = join(staging, `${randomUUID()}.jsonl`);\n await mkdir(staging, { recursive: true });\n await writeFile(\n temporary,\n relocateTranscript(await readFile(file, \"utf8\"), sandbox.root),\n { mode: 0o600 },\n );\n try {\n await sandbox.upload(temporary, target);\n } finally {\n await rm(temporary, { force: true });\n }\n}\n\nasync function restoreTranscript(\n layout: TranscriptConversationLayout,\n record: ConversationRecord,\n { sandbox, staging }: ConversationContext,\n): Promise<void> {\n validId(record.id);\n const target = layout.remotePath(record.id, sandbox, record.file);\n await uploadRelocated(record.file, target, sandbox, staging);\n if (!layout.sidecars) return;\n const sidecars = join(dirname(record.file), record.id, \"subagents\");\n for (const file of await files(sidecars))\n await uploadRelocated(\n file,\n posix.join(\n posix.dirname(target),\n record.id,\n \"subagents\",\n relative(sidecars, file).replaceAll(\"\\\\\", \"/\"),\n ),\n sandbox,\n staging,\n );\n}\n\n/** Creates a native store for CLIs that keep one JSONL transcript per conversation. */\nexport function createTranscriptConversations(\n layout: TranscriptConversationLayout,\n): NativeConversationStore {\n const { format } = layout;\n invariant(\n typeof format === \"string\" && format.length > 0,\n \"Transcript layouts require a format name\",\n );\n return {\n name: format,\n format,\n locate: (id, repository, home) =>\n locateTranscript(layout, id, repository, home),\n capture: (id, context) => captureTranscript(layout, id, context),\n async restore(record, context) {\n invariant(\n record.format === format,\n \"Conversation format does not match its storage\",\n );\n if (\n context.local &&\n context.sandbox.root === context.repository &&\n record.reference === undefined\n )\n return;\n return restoreTranscript(layout, record, context);\n },\n directory: (repository, home) =>\n layout.directory(repository, home ?? homedir()),\n destination(id, sandbox, original) {\n validId(id);\n return layout.remotePath(id, sandbox, original);\n },\n };\n}\n"]}