@elie-laloum/outpost 4.2.0 → 6.0.1

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 (642) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +13 -11
  3. package/SECURITY.md +2 -0
  4. package/dist/adapters/agents/antigravity-adapter.d.ts +3 -0
  5. package/dist/adapters/agents/antigravity-adapter.js +39 -0
  6. package/dist/adapters/agents/antigravity-adapter.js.map +1 -0
  7. package/dist/adapters/agents/antigravity-authentication.d.ts +2 -0
  8. package/dist/adapters/agents/antigravity-authentication.js +27 -0
  9. package/dist/adapters/agents/antigravity-authentication.js.map +1 -0
  10. package/dist/adapters/agents/antigravity-diagnostics.d.ts +1 -0
  11. package/dist/adapters/agents/antigravity-diagnostics.js +6 -0
  12. package/dist/adapters/agents/antigravity-diagnostics.js.map +1 -0
  13. package/dist/adapters/agents/antigravity-events.d.ts +2 -0
  14. package/dist/adapters/agents/antigravity-events.js +66 -0
  15. package/dist/adapters/agents/antigravity-events.js.map +1 -0
  16. package/dist/adapters/agents/antigravity-request.d.ts +5 -0
  17. package/dist/adapters/agents/antigravity-request.js +29 -0
  18. package/dist/adapters/agents/antigravity-request.js.map +1 -0
  19. package/dist/adapters/agents/antigravity.types.d.ts +7 -0
  20. package/dist/adapters/agents/antigravity.types.js +2 -0
  21. package/dist/adapters/agents/antigravity.types.js.map +1 -0
  22. package/dist/adapters/agents/authentication.constants.d.ts +23 -0
  23. package/dist/adapters/agents/authentication.constants.js +13 -0
  24. package/dist/adapters/agents/authentication.constants.js.map +1 -0
  25. package/dist/adapters/agents/authentication.d.ts +11 -0
  26. package/dist/adapters/agents/authentication.js +75 -0
  27. package/dist/adapters/agents/authentication.js.map +1 -0
  28. package/dist/adapters/agents/authentication.types.d.ts +20 -0
  29. package/dist/adapters/agents/authentication.types.js +2 -0
  30. package/dist/adapters/agents/authentication.types.js.map +1 -0
  31. package/dist/adapters/agents/claude-adapter.d.ts +2 -2
  32. package/dist/adapters/agents/claude-adapter.js +32 -2
  33. package/dist/adapters/agents/claude-adapter.js.map +1 -1
  34. package/dist/adapters/agents/claude-authentication.d.ts +2 -0
  35. package/dist/adapters/agents/claude-authentication.js +34 -0
  36. package/dist/adapters/agents/claude-authentication.js.map +1 -0
  37. package/dist/adapters/agents/claude-request.d.ts +2 -2
  38. package/dist/adapters/agents/claude-request.js +3 -3
  39. package/dist/adapters/agents/claude-request.js.map +1 -1
  40. package/dist/adapters/agents/cli-diagnostics.constants.d.ts +6 -6
  41. package/dist/adapters/agents/cli-diagnostics.constants.js +6 -6
  42. package/dist/adapters/agents/cli-diagnostics.constants.js.map +1 -1
  43. package/dist/adapters/agents/cli-diagnostics.d.ts +1 -0
  44. package/dist/adapters/agents/cli-diagnostics.js +11 -0
  45. package/dist/adapters/agents/cli-diagnostics.js.map +1 -1
  46. package/dist/adapters/agents/codex-adapter.d.ts +2 -2
  47. package/dist/adapters/agents/codex-adapter.js +19 -1
  48. package/dist/adapters/agents/codex-adapter.js.map +1 -1
  49. package/dist/adapters/agents/codex-authentication.d.ts +3 -0
  50. package/dist/adapters/agents/codex-authentication.js +47 -0
  51. package/dist/adapters/agents/codex-authentication.js.map +1 -0
  52. package/dist/adapters/agents/codex-provider.d.ts +2 -2
  53. package/dist/adapters/agents/codex-provider.js +1 -1
  54. package/dist/adapters/agents/codex-provider.js.map +1 -1
  55. package/dist/adapters/agents/codex-request.d.ts +2 -2
  56. package/dist/adapters/agents/codex-request.js +3 -3
  57. package/dist/adapters/agents/codex-request.js.map +1 -1
  58. package/dist/adapters/agents/copilot-adapter.d.ts +3 -0
  59. package/dist/adapters/agents/copilot-adapter.js +39 -0
  60. package/dist/adapters/agents/copilot-adapter.js.map +1 -0
  61. package/dist/adapters/agents/copilot-authentication.d.ts +2 -0
  62. package/dist/adapters/agents/copilot-authentication.js +45 -0
  63. package/dist/adapters/agents/copilot-authentication.js.map +1 -0
  64. package/dist/adapters/agents/copilot-diagnostics.d.ts +1 -0
  65. package/dist/adapters/agents/copilot-diagnostics.js +6 -0
  66. package/dist/adapters/agents/copilot-diagnostics.js.map +1 -0
  67. package/dist/adapters/agents/copilot-events.d.ts +2 -0
  68. package/dist/adapters/agents/copilot-events.js +50 -0
  69. package/dist/adapters/agents/copilot-events.js.map +1 -0
  70. package/dist/adapters/agents/copilot-request.d.ts +5 -0
  71. package/dist/adapters/agents/copilot-request.js +19 -0
  72. package/dist/adapters/agents/copilot-request.js.map +1 -0
  73. package/dist/adapters/agents/copilot.types.d.ts +6 -0
  74. package/dist/adapters/agents/copilot.types.js +2 -0
  75. package/dist/adapters/agents/copilot.types.js.map +1 -0
  76. package/dist/adapters/agents/event-decoder.d.ts +2 -2
  77. package/dist/adapters/agents/event-decoder.js +6 -5
  78. package/dist/adapters/agents/event-decoder.js.map +1 -1
  79. package/dist/adapters/agents/kimi-adapter.d.ts +3 -0
  80. package/dist/adapters/agents/kimi-adapter.js +35 -0
  81. package/dist/adapters/agents/kimi-adapter.js.map +1 -0
  82. package/dist/adapters/agents/kimi-authentication.d.ts +2 -0
  83. package/dist/adapters/agents/kimi-authentication.js +48 -0
  84. package/dist/adapters/agents/kimi-authentication.js.map +1 -0
  85. package/dist/adapters/agents/kimi-diagnostics.d.ts +1 -0
  86. package/dist/adapters/agents/kimi-diagnostics.js +6 -0
  87. package/dist/adapters/agents/kimi-diagnostics.js.map +1 -0
  88. package/dist/adapters/agents/kimi-events.d.ts +2 -0
  89. package/dist/adapters/agents/kimi-events.js +51 -0
  90. package/dist/adapters/agents/kimi-events.js.map +1 -0
  91. package/dist/adapters/agents/kimi-request.d.ts +5 -0
  92. package/dist/adapters/agents/kimi-request.js +28 -0
  93. package/dist/adapters/agents/kimi-request.js.map +1 -0
  94. package/dist/adapters/agents/kimi.types.d.ts +6 -0
  95. package/dist/adapters/agents/kimi.types.js +2 -0
  96. package/dist/adapters/agents/kimi.types.js.map +1 -0
  97. package/dist/adapters/agents/model-support.constants.d.ts +8 -0
  98. package/dist/adapters/agents/model-support.constants.js +28 -0
  99. package/dist/adapters/agents/model-support.constants.js.map +1 -0
  100. package/dist/adapters/agents/model-support.d.ts +4 -0
  101. package/dist/adapters/agents/model-support.js +11 -0
  102. package/dist/adapters/agents/model-support.js.map +1 -0
  103. package/dist/adapters/agents/protocol-fixtures.constants.d.ts +2 -2
  104. package/dist/adapters/agents/protocol-fixtures.constants.js +135 -9
  105. package/dist/adapters/agents/protocol-fixtures.constants.js.map +1 -1
  106. package/dist/adapters/agents/protocol-fixtures.types.d.ts +1 -0
  107. package/dist/adapters/agents/protocol-fixtures.types.js.map +1 -1
  108. package/dist/adapters/agents/protocol.d.ts +1 -0
  109. package/dist/adapters/agents/protocol.js +9 -0
  110. package/dist/adapters/agents/protocol.js.map +1 -1
  111. package/dist/adapters/agents/settings.types.d.ts +11 -3
  112. package/dist/adapters/agents/settings.types.js.map +1 -1
  113. package/dist/adapters/models/anthropic-model-provider.constants.d.ts +3 -0
  114. package/dist/adapters/models/anthropic-model-provider.constants.js +17 -0
  115. package/dist/adapters/models/anthropic-model-provider.constants.js.map +1 -0
  116. package/dist/adapters/models/anthropic-model-provider.d.ts +3 -0
  117. package/dist/adapters/models/anthropic-model-provider.js +31 -0
  118. package/dist/adapters/models/anthropic-model-provider.js.map +1 -0
  119. package/dist/adapters/models/anthropic-model-provider.types.d.ts +7 -0
  120. package/dist/adapters/models/anthropic-model-provider.types.js +2 -0
  121. package/dist/adapters/models/anthropic-model-provider.types.js.map +1 -0
  122. package/dist/adapters/models/anthropic-request.d.ts +4 -0
  123. package/dist/adapters/models/anthropic-request.js +81 -0
  124. package/dist/adapters/models/anthropic-request.js.map +1 -0
  125. package/dist/adapters/models/anthropic-response.d.ts +3 -0
  126. package/dist/adapters/models/anthropic-response.js +55 -0
  127. package/dist/adapters/models/anthropic-response.js.map +1 -0
  128. package/dist/adapters/models/anthropic-stream.d.ts +2 -0
  129. package/dist/adapters/models/anthropic-stream.js +96 -0
  130. package/dist/adapters/models/anthropic-stream.js.map +1 -0
  131. package/dist/adapters/models/http-provider.d.ts +3 -0
  132. package/dist/adapters/models/http-provider.js +113 -0
  133. package/dist/adapters/models/http-provider.js.map +1 -0
  134. package/dist/adapters/models/{openai-http.js → model-http.js} +1 -1
  135. package/dist/adapters/models/model-http.js.map +1 -0
  136. package/dist/adapters/models/model-protocol.types.d.ts +41 -0
  137. package/dist/adapters/models/model-protocol.types.js +2 -0
  138. package/dist/adapters/models/model-protocol.types.js.map +1 -0
  139. package/dist/adapters/models/model-request.d.ts +2 -0
  140. package/dist/adapters/models/model-request.js +18 -0
  141. package/dist/adapters/models/model-request.js.map +1 -0
  142. package/dist/adapters/models/model-response.d.ts +7 -0
  143. package/dist/adapters/models/model-response.js +41 -0
  144. package/dist/adapters/models/model-response.js.map +1 -0
  145. package/dist/adapters/models/{openai-compatible.constants.js → model.constants.js} +6 -1
  146. package/dist/adapters/models/model.constants.js.map +1 -0
  147. package/dist/adapters/models/openai-chat-stream.d.ts +2 -0
  148. package/dist/adapters/models/openai-chat-stream.js +66 -0
  149. package/dist/adapters/models/openai-chat-stream.js.map +1 -0
  150. package/dist/adapters/models/openai-chat.d.ts +4 -0
  151. package/dist/adapters/models/openai-chat.js +108 -0
  152. package/dist/adapters/models/openai-chat.js.map +1 -0
  153. package/dist/adapters/models/openai-model-provider.d.ts +3 -0
  154. package/dist/adapters/models/openai-model-provider.js +13 -0
  155. package/dist/adapters/models/openai-model-provider.js.map +1 -0
  156. package/dist/adapters/models/openai-model-provider.types.d.ts +4 -0
  157. package/dist/adapters/models/openai-model-provider.types.js +2 -0
  158. package/dist/adapters/models/openai-model-provider.types.js.map +1 -0
  159. package/dist/adapters/models/openai-protocols.d.ts +2 -0
  160. package/dist/adapters/models/openai-protocols.js +22 -0
  161. package/dist/adapters/models/openai-protocols.js.map +1 -0
  162. package/dist/adapters/models/openai-responses-stream.d.ts +2 -0
  163. package/dist/adapters/models/openai-responses-stream.js +35 -0
  164. package/dist/adapters/models/openai-responses-stream.js.map +1 -0
  165. package/dist/adapters/models/openai-responses.d.ts +4 -0
  166. package/dist/adapters/models/openai-responses.js +107 -0
  167. package/dist/adapters/models/openai-responses.js.map +1 -0
  168. package/dist/adapters/models/openai-usage.d.ts +3 -0
  169. package/dist/adapters/models/openai-usage.js +20 -0
  170. package/dist/adapters/models/openai-usage.js.map +1 -0
  171. package/dist/adapters/models/stop-reasons.constants.d.ts +4 -0
  172. package/dist/adapters/models/stop-reasons.constants.js +19 -0
  173. package/dist/adapters/models/stop-reasons.constants.js.map +1 -0
  174. package/dist/adapters/models/stream-events.d.ts +3 -0
  175. package/dist/adapters/models/stream-events.js +22 -0
  176. package/dist/adapters/models/stream-events.js.map +1 -0
  177. package/dist/adapters/tools/edit-tools.d.ts +2 -0
  178. package/dist/adapters/tools/edit-tools.js +84 -0
  179. package/dist/adapters/tools/edit-tools.js.map +1 -0
  180. package/dist/adapters/tools/file-tools.d.ts +2 -0
  181. package/dist/adapters/tools/file-tools.js +97 -0
  182. package/dist/adapters/tools/file-tools.js.map +1 -0
  183. package/dist/adapters/tools/git-tools.d.ts +2 -0
  184. package/dist/adapters/tools/git-tools.js +54 -0
  185. package/dist/adapters/tools/git-tools.js.map +1 -0
  186. package/dist/adapters/tools/sandbox-files.d.ts +10 -0
  187. package/dist/adapters/tools/sandbox-files.js +60 -0
  188. package/dist/adapters/tools/sandbox-files.js.map +1 -0
  189. package/dist/adapters/tools/search-tools.d.ts +2 -0
  190. package/dist/adapters/tools/search-tools.js +65 -0
  191. package/dist/adapters/tools/search-tools.js.map +1 -0
  192. package/dist/adapters/tools/shell-tools.d.ts +3 -0
  193. package/dist/adapters/tools/shell-tools.js +38 -0
  194. package/dist/adapters/tools/shell-tools.js.map +1 -0
  195. package/dist/adapters/tools/tools.constants.d.ts +11 -0
  196. package/dist/adapters/tools/tools.constants.js +17 -0
  197. package/dist/adapters/tools/tools.constants.js.map +1 -0
  198. package/dist/adapters/tools/tools.types.d.ts +41 -0
  199. package/dist/adapters/tools/tools.types.js +2 -0
  200. package/dist/adapters/tools/tools.types.js.map +1 -0
  201. package/dist/application/activity-watchdog.js +15 -2
  202. package/dist/application/activity-watchdog.js.map +1 -1
  203. package/dist/application/agent-authentication.d.ts +4 -0
  204. package/dist/application/agent-authentication.js +32 -0
  205. package/dist/application/agent-authentication.js.map +1 -0
  206. package/dist/application/agent-bootstrap.constants.d.ts +2 -5
  207. package/dist/application/agent-bootstrap.constants.js +29 -4
  208. package/dist/application/agent-bootstrap.constants.js.map +1 -1
  209. package/dist/application/agent-bootstrap.d.ts +2 -2
  210. package/dist/application/agent-bootstrap.js +35 -12
  211. package/dist/application/agent-bootstrap.js.map +1 -1
  212. package/dist/application/agent-bootstrap.types.d.ts +20 -0
  213. package/dist/application/agent-bootstrap.types.js +2 -0
  214. package/dist/application/agent-bootstrap.types.js.map +1 -0
  215. package/dist/application/agent-storage.d.ts +3 -2
  216. package/dist/application/agent-storage.js +9 -2
  217. package/dist/application/agent-storage.js.map +1 -1
  218. package/dist/application/agent-turn.d.ts +3 -3
  219. package/dist/application/agent-turn.js +7 -1
  220. package/dist/application/agent-turn.js.map +1 -1
  221. package/dist/application/attach.js +1 -0
  222. package/dist/application/attach.js.map +1 -1
  223. package/dist/application/credential-installer.constants.d.ts +1 -0
  224. package/dist/application/credential-installer.constants.js +22 -0
  225. package/dist/application/credential-installer.constants.js.map +1 -0
  226. package/dist/application/custom-turn.d.ts +5 -0
  227. package/dist/application/custom-turn.js +190 -0
  228. package/dist/application/custom-turn.js.map +1 -0
  229. package/dist/application/dispatch-observation.d.ts +3 -0
  230. package/dist/application/dispatch-observation.js +51 -0
  231. package/dist/application/dispatch-observation.js.map +1 -0
  232. package/dist/application/dispatch-observation.types.d.ts +5 -0
  233. package/dist/application/dispatch-observation.types.js +2 -0
  234. package/dist/application/dispatch-observation.types.js.map +1 -0
  235. package/dist/application/dispatch-validation.d.ts +2 -2
  236. package/dist/application/dispatch-validation.js.map +1 -1
  237. package/dist/application/dispatch.js +8 -3
  238. package/dist/application/dispatch.js.map +1 -1
  239. package/dist/application/doctor-agent.constants.d.ts +2 -8
  240. package/dist/application/doctor-agent.constants.js +40 -6
  241. package/dist/application/doctor-agent.constants.js.map +1 -1
  242. package/dist/application/doctor-agent.d.ts +2 -1
  243. package/dist/application/doctor-agent.js +11 -3
  244. package/dist/application/doctor-agent.js.map +1 -1
  245. package/dist/application/doctor-image.js +7 -9
  246. package/dist/application/doctor-image.js.map +1 -1
  247. package/dist/application/doctor-protocol.js +6 -6
  248. package/dist/application/doctor-protocol.js.map +1 -1
  249. package/dist/application/doctor-protocol.types.d.ts +1 -1
  250. package/dist/application/doctor-protocol.types.js.map +1 -1
  251. package/dist/application/doctor-sandbox.js +6 -9
  252. package/dist/application/doctor-sandbox.js.map +1 -1
  253. package/dist/application/doctor-sandbox.types.d.ts +2 -2
  254. package/dist/application/doctor-sandbox.types.js.map +1 -1
  255. package/dist/application/doctor.constants.d.ts +1 -1
  256. package/dist/application/doctor.constants.js +1 -1
  257. package/dist/application/doctor.constants.js.map +1 -1
  258. package/dist/application/doctor.js +12 -13
  259. package/dist/application/doctor.js.map +1 -1
  260. package/dist/application/doctor.types.d.ts +12 -4
  261. package/dist/application/doctor.types.js.map +1 -1
  262. package/dist/application/execution.d.ts +2 -2
  263. package/dist/application/execution.js +1 -1
  264. package/dist/application/execution.js.map +1 -1
  265. package/dist/application/execution.types.d.ts +9 -2
  266. package/dist/application/execution.types.js.map +1 -1
  267. package/dist/application/harness-context.d.ts +2 -0
  268. package/dist/application/harness-context.js +54 -0
  269. package/dist/application/harness-context.js.map +1 -0
  270. package/dist/application/harness-history.d.ts +3 -0
  271. package/dist/application/harness-history.js +17 -0
  272. package/dist/application/harness-history.js.map +1 -0
  273. package/dist/application/harness-hooks.d.ts +9 -0
  274. package/dist/application/harness-hooks.js +90 -0
  275. package/dist/application/harness-hooks.js.map +1 -0
  276. package/dist/application/harness-loop.d.ts +2 -0
  277. package/dist/application/harness-loop.js +132 -0
  278. package/dist/application/harness-loop.js.map +1 -0
  279. package/dist/application/harness.types.d.ts +55 -0
  280. package/dist/application/harness.types.js +2 -0
  281. package/dist/application/harness.types.js.map +1 -0
  282. package/dist/application/lifecycle.constants.d.ts +1 -1
  283. package/dist/application/lifecycle.constants.js +1 -1
  284. package/dist/application/lifecycle.constants.js.map +1 -1
  285. package/dist/application/outpost.types.d.ts +6 -7
  286. package/dist/application/outpost.types.js.map +1 -1
  287. package/dist/application/recovery-retention.js +65 -24
  288. package/dist/application/recovery-retention.js.map +1 -1
  289. package/dist/application/remote-download.js +1 -1
  290. package/dist/application/remote-download.js.map +1 -1
  291. package/dist/application/sandbox-agents.js +14 -5
  292. package/dist/application/sandbox-agents.js.map +1 -1
  293. package/dist/application/sandbox-attach.js +5 -2
  294. package/dist/application/sandbox-attach.js.map +1 -1
  295. package/dist/application/sandbox-dispatch.js +3 -5
  296. package/dist/application/sandbox-dispatch.js.map +1 -1
  297. package/dist/application/sandbox-provision.js +13 -10
  298. package/dist/application/sandbox-provision.js.map +1 -1
  299. package/dist/application/sandbox-session.types.d.ts +13 -8
  300. package/dist/application/sandbox-session.types.js.map +1 -1
  301. package/dist/application/sandbox.js +6 -3
  302. package/dist/application/sandbox.js.map +1 -1
  303. package/dist/application/speculation.js +1 -1
  304. package/dist/application/speculation.js.map +1 -1
  305. package/dist/application/speculation.types.d.ts +3 -3
  306. package/dist/application/speculation.types.js.map +1 -1
  307. package/dist/application/startup-recovery.js +1 -1
  308. package/dist/application/startup-recovery.js.map +1 -1
  309. package/dist/application/storage-reservation.js +9 -2
  310. package/dist/application/storage-reservation.js.map +1 -1
  311. package/dist/application/tasks.types.d.ts +2 -2
  312. package/dist/application/tasks.types.js.map +1 -1
  313. package/dist/application/tool-execution.d.ts +3 -0
  314. package/dist/application/tool-execution.js +211 -0
  315. package/dist/application/tool-execution.js.map +1 -0
  316. package/dist/cli/commands.js +4 -2
  317. package/dist/cli/commands.js.map +1 -1
  318. package/dist/cli/doctor-command.js +11 -7
  319. package/dist/cli/doctor-command.js.map +1 -1
  320. package/dist/cli/init-authentication.d.ts +4 -1
  321. package/dist/cli/init-authentication.js +28 -34
  322. package/dist/cli/init-authentication.js.map +1 -1
  323. package/dist/cli/init-command.js +6 -6
  324. package/dist/cli/init-command.js.map +1 -1
  325. package/dist/cli/main.constants.d.ts +54 -17
  326. package/dist/cli/main.constants.js +74 -12
  327. package/dist/cli/main.constants.js.map +1 -1
  328. package/dist/cli/recovery-command.js +1 -1
  329. package/dist/cli/recovery-command.js.map +1 -1
  330. package/dist/cli/scaffold-files.js +6 -5
  331. package/dist/cli/scaffold-files.js.map +1 -1
  332. package/dist/cli/scaffold-validation.js +26 -16
  333. package/dist/cli/scaffold-validation.js.map +1 -1
  334. package/dist/cli/scaffold.constants.d.ts +0 -1
  335. package/dist/cli/scaffold.constants.js +5 -2
  336. package/dist/cli/scaffold.constants.js.map +1 -1
  337. package/dist/cli/scaffold.js +8 -4
  338. package/dist/cli/scaffold.js.map +1 -1
  339. package/dist/cli/scaffold.types.d.ts +9 -3
  340. package/dist/cli/scaffold.types.js.map +1 -1
  341. package/dist/cli/starters.js +8 -10
  342. package/dist/cli/starters.js.map +1 -1
  343. package/dist/domain/agent-model.d.ts +3 -0
  344. package/dist/domain/agent-model.js +22 -0
  345. package/dist/domain/agent-model.js.map +1 -0
  346. package/dist/domain/agent.d.ts +4 -0
  347. package/dist/domain/agent.js +32 -0
  348. package/dist/domain/agent.js.map +1 -0
  349. package/dist/domain/agent.types.d.ts +105 -2
  350. package/dist/domain/agent.types.js.map +1 -1
  351. package/dist/domain/authentication.constants.d.ts +3 -0
  352. package/dist/domain/authentication.constants.js +11 -0
  353. package/dist/domain/authentication.constants.js.map +1 -0
  354. package/dist/domain/authentication.d.ts +3 -0
  355. package/dist/domain/authentication.js +22 -0
  356. package/dist/domain/authentication.js.map +1 -0
  357. package/dist/domain/authentication.types.d.ts +5 -0
  358. package/dist/domain/authentication.types.js +2 -0
  359. package/dist/domain/authentication.types.js.map +1 -0
  360. package/dist/domain/context.constants.d.ts +7 -0
  361. package/dist/domain/context.constants.js +8 -0
  362. package/dist/domain/context.constants.js.map +1 -0
  363. package/dist/domain/context.d.ts +4 -0
  364. package/dist/domain/context.js +81 -0
  365. package/dist/domain/context.js.map +1 -0
  366. package/dist/domain/context.types.d.ts +26 -0
  367. package/dist/domain/context.types.js +2 -0
  368. package/dist/domain/context.types.js.map +1 -0
  369. package/dist/domain/dispatch-telemetry.types.d.ts +12 -0
  370. package/dist/domain/dispatch-telemetry.types.js +2 -0
  371. package/dist/domain/dispatch-telemetry.types.js.map +1 -0
  372. package/dist/domain/errors.types.d.ts +1 -1
  373. package/dist/domain/errors.types.js.map +1 -1
  374. package/dist/domain/glob.d.ts +2 -0
  375. package/dist/domain/glob.js +25 -0
  376. package/dist/domain/glob.js.map +1 -0
  377. package/dist/domain/glob.types.d.ts +1 -0
  378. package/dist/domain/glob.types.js +2 -0
  379. package/dist/domain/glob.types.js.map +1 -0
  380. package/dist/domain/harness.constants.d.ts +11 -0
  381. package/dist/domain/harness.constants.js +24 -0
  382. package/dist/domain/harness.constants.js.map +1 -0
  383. package/dist/domain/harness.d.ts +2 -0
  384. package/dist/domain/harness.js +89 -0
  385. package/dist/domain/harness.js.map +1 -0
  386. package/dist/domain/harness.types.d.ts +60 -0
  387. package/dist/domain/harness.types.js +2 -0
  388. package/dist/domain/harness.types.js.map +1 -0
  389. package/dist/domain/hook.constants.d.ts +3 -0
  390. package/dist/domain/hook.constants.js +10 -0
  391. package/dist/domain/hook.constants.js.map +1 -0
  392. package/dist/domain/hook.d.ts +3 -0
  393. package/dist/domain/hook.js +25 -0
  394. package/dist/domain/hook.js.map +1 -0
  395. package/dist/domain/hook.types.d.ts +66 -0
  396. package/dist/domain/hook.types.js +2 -0
  397. package/dist/domain/hook.types.js.map +1 -0
  398. package/dist/domain/instructions.d.ts +3 -0
  399. package/dist/domain/instructions.js +25 -0
  400. package/dist/domain/instructions.js.map +1 -0
  401. package/dist/domain/model-messages.d.ts +5 -0
  402. package/dist/domain/model-messages.js +81 -0
  403. package/dist/domain/model-messages.js.map +1 -0
  404. package/dist/domain/model-messages.types.d.ts +6 -0
  405. package/dist/domain/model-messages.types.js +2 -0
  406. package/dist/domain/model-messages.types.js.map +1 -0
  407. package/dist/domain/model.constants.d.ts +4 -0
  408. package/dist/domain/model.constants.js +16 -0
  409. package/dist/domain/model.constants.js.map +1 -0
  410. package/dist/domain/model.types.d.ts +59 -2
  411. package/dist/domain/model.types.js.map +1 -1
  412. package/dist/domain/permissions.d.ts +3 -0
  413. package/dist/domain/permissions.js +92 -0
  414. package/dist/domain/permissions.js.map +1 -0
  415. package/dist/domain/permissions.types.d.ts +34 -0
  416. package/dist/domain/permissions.types.js +2 -0
  417. package/dist/domain/permissions.types.js.map +1 -0
  418. package/dist/domain/response.js +3 -2
  419. package/dist/domain/response.js.map +1 -1
  420. package/dist/domain/response.types.d.ts +12 -0
  421. package/dist/domain/response.types.js.map +1 -1
  422. package/dist/domain/skill.constants.d.ts +2 -0
  423. package/dist/domain/skill.constants.js +8 -0
  424. package/dist/domain/skill.constants.js.map +1 -0
  425. package/dist/domain/skill.d.ts +8 -0
  426. package/dist/domain/skill.js +79 -0
  427. package/dist/domain/skill.js.map +1 -0
  428. package/dist/domain/skill.types.d.ts +18 -0
  429. package/dist/domain/skill.types.js +2 -0
  430. package/dist/domain/skill.types.js.map +1 -0
  431. package/dist/domain/standard-schema.d.ts +6 -0
  432. package/dist/domain/standard-schema.js +45 -0
  433. package/dist/domain/standard-schema.js.map +1 -0
  434. package/dist/domain/tool-schema.d.ts +3 -0
  435. package/dist/domain/tool-schema.js +109 -0
  436. package/dist/domain/tool-schema.js.map +1 -0
  437. package/dist/domain/tool.constants.d.ts +4 -0
  438. package/dist/domain/tool.constants.js +36 -0
  439. package/dist/domain/tool.constants.js.map +1 -0
  440. package/dist/domain/tool.d.ts +4 -0
  441. package/dist/domain/tool.js +66 -0
  442. package/dist/domain/tool.js.map +1 -0
  443. package/dist/domain/tool.types.d.ts +62 -0
  444. package/dist/domain/tool.types.js +2 -0
  445. package/dist/domain/tool.types.js.map +1 -0
  446. package/dist/domain/transcript.d.ts +4 -0
  447. package/dist/domain/transcript.js +48 -0
  448. package/dist/domain/transcript.js.map +1 -0
  449. package/dist/domain/transcript.types.d.ts +15 -0
  450. package/dist/domain/transcript.types.js +2 -0
  451. package/dist/domain/transcript.types.js.map +1 -0
  452. package/dist/domain/workflow/workflow-state.js +13 -6
  453. package/dist/domain/workflow/workflow-state.js.map +1 -1
  454. package/dist/domain/workflow.d.ts +1 -1
  455. package/dist/domain/workflow.js.map +1 -1
  456. package/dist/domain/workflow.types.d.ts +4 -0
  457. package/dist/domain/workflow.types.js.map +1 -1
  458. package/dist/index.d.ts +35 -13
  459. package/dist/index.js +19 -6
  460. package/dist/index.js.map +1 -1
  461. package/dist/infrastructure/conversations/harness-store.d.ts +3 -0
  462. package/dist/infrastructure/conversations/harness-store.js +27 -0
  463. package/dist/infrastructure/conversations/harness-store.js.map +1 -0
  464. package/dist/infrastructure/conversations/harness-transcript.d.ts +2 -0
  465. package/dist/infrastructure/conversations/harness-transcript.js +50 -0
  466. package/dist/infrastructure/conversations/harness-transcript.js.map +1 -0
  467. package/dist/infrastructure/conversations/harness-transcript.types.d.ts +18 -0
  468. package/dist/infrastructure/conversations/harness-transcript.types.js +2 -0
  469. package/dist/infrastructure/conversations/harness-transcript.types.js.map +1 -0
  470. package/dist/infrastructure/conversations.d.ts +4 -1
  471. package/dist/infrastructure/conversations.js +3 -0
  472. package/dist/infrastructure/conversations.js.map +1 -1
  473. package/dist/infrastructure/conversations.types.d.ts +1 -0
  474. package/dist/infrastructure/conversations.types.js.map +1 -1
  475. package/dist/infrastructure/custom-reporter.d.ts +2 -0
  476. package/dist/infrastructure/custom-reporter.js +33 -0
  477. package/dist/infrastructure/custom-reporter.js.map +1 -0
  478. package/dist/infrastructure/custom-reporter.types.d.ts +13 -0
  479. package/dist/infrastructure/custom-reporter.types.js +2 -0
  480. package/dist/infrastructure/custom-reporter.types.js.map +1 -0
  481. package/dist/infrastructure/git/git.constants.d.ts +1 -1
  482. package/dist/infrastructure/git/git.constants.js +2 -0
  483. package/dist/infrastructure/git/git.constants.js.map +1 -1
  484. package/dist/infrastructure/host-credentials.constants.d.ts +1 -0
  485. package/dist/infrastructure/host-credentials.constants.js +2 -0
  486. package/dist/infrastructure/host-credentials.constants.js.map +1 -0
  487. package/dist/infrastructure/host-credentials.d.ts +4 -0
  488. package/dist/infrastructure/host-credentials.js +89 -0
  489. package/dist/infrastructure/host-credentials.js.map +1 -0
  490. package/dist/infrastructure/inspection-path.js +4 -3
  491. package/dist/infrastructure/inspection-path.js.map +1 -1
  492. package/dist/infrastructure/journal.constants.d.ts +1 -0
  493. package/dist/infrastructure/journal.constants.js +2 -0
  494. package/dist/infrastructure/journal.constants.js.map +1 -0
  495. package/dist/infrastructure/journal.js +7 -71
  496. package/dist/infrastructure/journal.js.map +1 -1
  497. package/dist/infrastructure/journal.types.d.ts +0 -2
  498. package/dist/infrastructure/journal.types.js.map +1 -1
  499. package/dist/infrastructure/local-transport.js +9 -4
  500. package/dist/infrastructure/local-transport.js.map +1 -1
  501. package/dist/infrastructure/opentelemetry-dispatch.d.ts +6 -0
  502. package/dist/infrastructure/opentelemetry-dispatch.js +70 -0
  503. package/dist/infrastructure/opentelemetry-dispatch.js.map +1 -0
  504. package/dist/infrastructure/opentelemetry.constants.d.ts +3 -0
  505. package/dist/infrastructure/opentelemetry.constants.js +3 -0
  506. package/dist/infrastructure/opentelemetry.constants.js.map +1 -1
  507. package/dist/infrastructure/opentelemetry.js +4 -0
  508. package/dist/infrastructure/opentelemetry.js.map +1 -1
  509. package/dist/infrastructure/opentelemetry.types.d.ts +3 -3
  510. package/dist/infrastructure/opentelemetry.types.js.map +1 -1
  511. package/dist/infrastructure/reporter.js +27 -2
  512. package/dist/infrastructure/reporter.js.map +1 -1
  513. package/dist/infrastructure/repository-transport.constants.d.ts +1 -0
  514. package/dist/infrastructure/repository-transport.constants.js +2 -0
  515. package/dist/infrastructure/repository-transport.constants.js.map +1 -0
  516. package/dist/infrastructure/repository-transport.d.ts +2 -0
  517. package/dist/infrastructure/repository-transport.js +9 -0
  518. package/dist/infrastructure/repository-transport.js.map +1 -0
  519. package/dist/infrastructure/resource-activity-inspection.js +22 -26
  520. package/dist/infrastructure/resource-activity-inspection.js.map +1 -1
  521. package/dist/infrastructure/resource-activity.constants.d.ts +0 -1
  522. package/dist/infrastructure/resource-activity.constants.js +0 -1
  523. package/dist/infrastructure/resource-activity.constants.js.map +1 -1
  524. package/dist/infrastructure/resource-activity.js +22 -85
  525. package/dist/infrastructure/resource-activity.js.map +1 -1
  526. package/dist/infrastructure/resource-activity.types.d.ts +2 -2
  527. package/dist/infrastructure/resource-activity.types.js.map +1 -1
  528. package/dist/infrastructure/settings.d.ts +1 -1
  529. package/dist/infrastructure/settings.js +3 -3
  530. package/dist/infrastructure/settings.js.map +1 -1
  531. package/dist/infrastructure/sse.d.ts +2 -0
  532. package/dist/infrastructure/sse.js +64 -0
  533. package/dist/infrastructure/sse.js.map +1 -0
  534. package/dist/infrastructure/sse.types.d.ts +4 -0
  535. package/dist/infrastructure/sse.types.js +2 -0
  536. package/dist/infrastructure/sse.types.js.map +1 -0
  537. package/dist/infrastructure/storage-inventory.constants.js +1 -0
  538. package/dist/infrastructure/storage-inventory.constants.js.map +1 -1
  539. package/dist/infrastructure/storage-inventory.types.d.ts +1 -1
  540. package/dist/infrastructure/storage-inventory.types.js.map +1 -1
  541. package/dist/infrastructure/storage-reservations.types.d.ts +0 -8
  542. package/dist/infrastructure/storage-reservations.types.js.map +1 -1
  543. package/dist/infrastructure/transport-conversations.d.ts +2 -2
  544. package/dist/infrastructure/transport-conversations.js +8 -1
  545. package/dist/infrastructure/transport-conversations.js.map +1 -1
  546. package/dist/infrastructure/transport-journal.js +2 -1
  547. package/dist/infrastructure/transport-journal.js.map +1 -1
  548. package/dist/infrastructure/transport-reservations.d.ts +1 -1
  549. package/dist/infrastructure/transport-reservations.js +14 -8
  550. package/dist/infrastructure/transport-reservations.js.map +1 -1
  551. package/dist/providers/agents.d.ts +9 -4
  552. package/dist/providers/agents.js +6 -3
  553. package/dist/providers/agents.js.map +1 -1
  554. package/dist/providers/daytona.d.ts +1 -1
  555. package/dist/providers/daytona.js +1 -1
  556. package/dist/providers/daytona.js.map +1 -1
  557. package/dist/providers/docker.d.ts +1 -1
  558. package/dist/providers/docker.js +1 -1
  559. package/dist/providers/docker.js.map +1 -1
  560. package/dist/providers/factories.d.ts +2 -2
  561. package/dist/providers/factories.js +3 -3
  562. package/dist/providers/factories.js.map +1 -1
  563. package/dist/providers/firecracker.d.ts +1 -1
  564. package/dist/providers/firecracker.js +1 -1
  565. package/dist/providers/firecracker.js.map +1 -1
  566. package/dist/providers/local.d.ts +1 -1
  567. package/dist/providers/local.js +1 -1
  568. package/dist/providers/local.js.map +1 -1
  569. package/dist/providers/podman.d.ts +1 -1
  570. package/dist/providers/podman.js +1 -1
  571. package/dist/providers/podman.js.map +1 -1
  572. package/dist/providers/vercel.d.ts +1 -1
  573. package/dist/providers/vercel.js +1 -1
  574. package/dist/providers/vercel.js.map +1 -1
  575. package/dist/providers/versions.constants.d.ts +3 -1
  576. package/dist/providers/versions.constants.js +3 -1
  577. package/dist/providers/versions.constants.js.map +1 -1
  578. package/package.json +3 -3
  579. package/dist/adapters/agents/gemini-adapter.d.ts +0 -3
  580. package/dist/adapters/agents/gemini-adapter.js +0 -15
  581. package/dist/adapters/agents/gemini-adapter.js.map +0 -1
  582. package/dist/adapters/agents/gemini-diagnostics.d.ts +0 -2
  583. package/dist/adapters/agents/gemini-diagnostics.js +0 -15
  584. package/dist/adapters/agents/gemini-diagnostics.js.map +0 -1
  585. package/dist/adapters/agents/gemini-events.d.ts +0 -2
  586. package/dist/adapters/agents/gemini-events.js +0 -50
  587. package/dist/adapters/agents/gemini-events.js.map +0 -1
  588. package/dist/adapters/agents/gemini-request.d.ts +0 -4
  589. package/dist/adapters/agents/gemini-request.js +0 -23
  590. package/dist/adapters/agents/gemini-request.js.map +0 -1
  591. package/dist/adapters/agents/gemini.types.d.ts +0 -6
  592. package/dist/adapters/agents/gemini.types.js +0 -2
  593. package/dist/adapters/agents/gemini.types.js.map +0 -1
  594. package/dist/adapters/models/openai-compatible.constants.js.map +0 -1
  595. package/dist/adapters/models/openai-compatible.d.ts +0 -3
  596. package/dist/adapters/models/openai-compatible.js +0 -78
  597. package/dist/adapters/models/openai-compatible.js.map +0 -1
  598. package/dist/adapters/models/openai-compatible.types.d.ts +0 -14
  599. package/dist/adapters/models/openai-compatible.types.js +0 -2
  600. package/dist/adapters/models/openai-compatible.types.js.map +0 -1
  601. package/dist/adapters/models/openai-http.js.map +0 -1
  602. package/dist/adapters/models/openai-request.d.ts +0 -4
  603. package/dist/adapters/models/openai-request.js +0 -46
  604. package/dist/adapters/models/openai-request.js.map +0 -1
  605. package/dist/adapters/models/openai-response.d.ts +0 -3
  606. package/dist/adapters/models/openai-response.js +0 -65
  607. package/dist/adapters/models/openai-response.js.map +0 -1
  608. package/dist/cli/init-authentication.constants.d.ts +0 -13
  609. package/dist/cli/init-authentication.constants.js +0 -10
  610. package/dist/cli/init-authentication.constants.js.map +0 -1
  611. package/dist/infrastructure/artifact-store.d.ts +0 -3
  612. package/dist/infrastructure/artifact-store.js +0 -110
  613. package/dist/infrastructure/artifact-store.js.map +0 -1
  614. package/dist/infrastructure/artifact-store.types.d.ts +0 -6
  615. package/dist/infrastructure/artifact-store.types.js +0 -2
  616. package/dist/infrastructure/artifact-store.types.js.map +0 -1
  617. package/dist/infrastructure/journal-retention.constants.d.ts +0 -4
  618. package/dist/infrastructure/journal-retention.constants.js +0 -5
  619. package/dist/infrastructure/journal-retention.constants.js.map +0 -1
  620. package/dist/infrastructure/journal-retention.d.ts +0 -2
  621. package/dist/infrastructure/journal-retention.js +0 -51
  622. package/dist/infrastructure/journal-retention.js.map +0 -1
  623. package/dist/infrastructure/storage-mutation-lock.constants.d.ts +0 -5
  624. package/dist/infrastructure/storage-mutation-lock.constants.js +0 -6
  625. package/dist/infrastructure/storage-mutation-lock.constants.js.map +0 -1
  626. package/dist/infrastructure/storage-mutation-lock.d.ts +0 -1
  627. package/dist/infrastructure/storage-mutation-lock.js +0 -21
  628. package/dist/infrastructure/storage-mutation-lock.js.map +0 -1
  629. package/dist/infrastructure/storage-reservations.constants.d.ts +0 -4
  630. package/dist/infrastructure/storage-reservations.constants.js +0 -5
  631. package/dist/infrastructure/storage-reservations.constants.js.map +0 -1
  632. package/dist/infrastructure/storage-reservations.d.ts +0 -2
  633. package/dist/infrastructure/storage-reservations.js +0 -150
  634. package/dist/infrastructure/storage-reservations.js.map +0 -1
  635. package/dist/infrastructure/workflow-checkpoint.d.ts +0 -3
  636. package/dist/infrastructure/workflow-checkpoint.js +0 -84
  637. package/dist/infrastructure/workflow-checkpoint.js.map +0 -1
  638. package/dist/infrastructure/workflow-checkpoint.types.d.ts +0 -6
  639. package/dist/infrastructure/workflow-checkpoint.types.js +0 -2
  640. package/dist/infrastructure/workflow-checkpoint.types.js.map +0 -1
  641. /package/dist/adapters/models/{openai-http.d.ts → model-http.d.ts} +0 -0
  642. /package/dist/adapters/models/{openai-compatible.constants.d.ts → model.constants.d.ts} +0 -0
@@ -0,0 +1,64 @@
1
+ import { OutpostError } from "../domain/errors.js";
2
+ export async function* serverSentEvents(body, maxBytes, onChunk = () => undefined) {
3
+ const decoder = new TextDecoder();
4
+ const reader = body.getReader();
5
+ let buffer = "";
6
+ let size = 0;
7
+ let event;
8
+ let data = [];
9
+ const dispatch = () => {
10
+ const complete = data.length
11
+ ? { ...(event ? { event } : {}), data: data.join("\n") }
12
+ : undefined;
13
+ event = undefined;
14
+ data = [];
15
+ return complete;
16
+ };
17
+ try {
18
+ for (;;) {
19
+ const { done, value } = await reader.read();
20
+ if (!done) {
21
+ onChunk();
22
+ size += value.byteLength;
23
+ if (size > maxBytes)
24
+ throw new OutpostError("response", "Model response exceeds maxResponseBytes");
25
+ }
26
+ buffer += done
27
+ ? decoder.decode()
28
+ : decoder.decode(value, { stream: true });
29
+ // A CR at the end of a chunk may be the first half of a CRLF terminator.
30
+ const carriage = !done && buffer.endsWith("\r");
31
+ const lines = (carriage ? buffer.slice(0, -1) : buffer).split(/\r\n|\r|\n/);
32
+ buffer = done ? "" : `${lines.pop()}${carriage ? "\r" : ""}`;
33
+ for (const line of lines) {
34
+ if (line === "") {
35
+ const complete = dispatch();
36
+ if (complete)
37
+ yield complete;
38
+ continue;
39
+ }
40
+ if (line.startsWith(":"))
41
+ continue;
42
+ const colon = line.indexOf(":");
43
+ const field = colon < 0 ? line : line.slice(0, colon);
44
+ const raw = colon < 0 ? "" : line.slice(colon + 1);
45
+ const value = raw.startsWith(" ") ? raw.slice(1) : raw;
46
+ if (field === "event")
47
+ event = value;
48
+ if (field === "data")
49
+ data.push(value);
50
+ }
51
+ if (!done)
52
+ continue;
53
+ const complete = dispatch();
54
+ if (complete)
55
+ yield complete;
56
+ return;
57
+ }
58
+ }
59
+ finally {
60
+ await reader.cancel().catch(() => undefined);
61
+ reader.releaseLock();
62
+ }
63
+ }
64
+ //# sourceMappingURL=sse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/infrastructure/sse.ts"],"names":[],"mappings":"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","sourcesContent":["import { OutpostError } from \"../domain/errors.ts\";\nimport type { ServerSentEvent } from \"./sse.types.ts\";\n\nexport async function* serverSentEvents(\n body: ReadableStream<Uint8Array>,\n maxBytes: number,\n onChunk: () => void = () => undefined,\n): AsyncGenerator<ServerSentEvent> {\n const decoder = new TextDecoder();\n const reader = body.getReader();\n let buffer = \"\";\n let size = 0;\n let event: string | undefined;\n let data: string[] = [];\n const dispatch = (): ServerSentEvent | undefined => {\n const complete = data.length\n ? { ...(event ? { event } : {}), data: data.join(\"\\n\") }\n : undefined;\n event = undefined;\n data = [];\n return complete;\n };\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (!done) {\n onChunk();\n size += value.byteLength;\n if (size > maxBytes)\n throw new OutpostError(\n \"response\",\n \"Model response exceeds maxResponseBytes\",\n );\n }\n buffer += done\n ? decoder.decode()\n : decoder.decode(value, { stream: true });\n // A CR at the end of a chunk may be the first half of a CRLF terminator.\n const carriage = !done && buffer.endsWith(\"\\r\");\n const lines = (carriage ? buffer.slice(0, -1) : buffer).split(\n /\\r\\n|\\r|\\n/,\n );\n buffer = done ? \"\" : `${lines.pop()!}${carriage ? \"\\r\" : \"\"}`;\n for (const line of lines) {\n if (line === \"\") {\n const complete = dispatch();\n if (complete) yield complete;\n continue;\n }\n if (line.startsWith(\":\")) continue;\n const colon = line.indexOf(\":\");\n const field = colon < 0 ? line : line.slice(0, colon);\n const raw = colon < 0 ? \"\" : line.slice(colon + 1);\n const value = raw.startsWith(\" \") ? raw.slice(1) : raw;\n if (field === \"event\") event = value;\n if (field === \"data\") data.push(value);\n }\n if (!done) continue;\n const complete = dispatch();\n if (complete) yield complete;\n return;\n }\n } finally {\n await reader.cancel().catch(() => undefined);\n reader.releaseLock();\n }\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export interface ServerSentEvent {
2
+ readonly event?: string;
3
+ readonly data: string;
4
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sse.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.types.js","sourceRoot":"","sources":["../../src/infrastructure/sse.types.ts"],"names":[],"mappings":"","sourcesContent":["export interface ServerSentEvent {\n readonly event?: string;\n readonly data: string;\n}\n"]}
@@ -3,6 +3,7 @@ export const storageCategories = [
3
3
  "logs",
4
4
  "locks",
5
5
  "workspaces",
6
+ "storage",
6
7
  ];
7
8
  export const storageInventoryDefaults = Object.freeze({
8
9
  maxEntries: 100_000,
@@ -1 +1 @@
1
- {"version":3,"file":"storage-inventory.constants.js","sourceRoot":"","sources":["../../src/infrastructure/storage-inventory.constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,iBAAiB,GAAmC;IAC/D,UAAU;IACV,MAAM;IACN,OAAO;IACP,YAAY;CACb,CAAC;AACF,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC,MAAM,CAAC;IACpD,UAAU,EAAE,OAAO;IACnB,QAAQ,EAAE,EAAE;CACb,CAAC,CAAC","sourcesContent":["import type { StorageCategoryName } from \"./storage-inventory.types.ts\";\n\nexport const storageCategories: readonly StorageCategoryName[] = [\n \"recovery\",\n \"logs\",\n \"locks\",\n \"workspaces\",\n];\nexport const storageInventoryDefaults = Object.freeze({\n maxEntries: 100_000,\n maxDepth: 64,\n});\n"]}
1
+ {"version":3,"file":"storage-inventory.constants.js","sourceRoot":"","sources":["../../src/infrastructure/storage-inventory.constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,iBAAiB,GAAmC;IAC/D,UAAU;IACV,MAAM;IACN,OAAO;IACP,YAAY;IACZ,SAAS;CACV,CAAC;AACF,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC,MAAM,CAAC;IACpD,UAAU,EAAE,OAAO;IACnB,QAAQ,EAAE,EAAE;CACb,CAAC,CAAC","sourcesContent":["import type { StorageCategoryName } from \"./storage-inventory.types.ts\";\n\nexport const storageCategories: readonly StorageCategoryName[] = [\n \"recovery\",\n \"logs\",\n \"locks\",\n \"workspaces\",\n \"storage\",\n];\nexport const storageInventoryDefaults = Object.freeze({\n maxEntries: 100_000,\n maxDepth: 64,\n});\n"]}
@@ -1,4 +1,4 @@
1
- export type StorageCategoryName = "recovery" | "logs" | "locks" | "workspaces" | "artifacts" | "checkpoints" | "conversations" | "reservations" | "resources";
1
+ export type StorageCategoryName = "storage" | "recovery" | "logs" | "locks" | "workspaces" | "artifacts" | "checkpoints" | "conversations" | "reservations" | "resources";
2
2
  export type StorageEntryKind = "file" | "directory" | "symlink" | "other" | "unknown";
3
3
  export interface StorageIssue {
4
4
  readonly path: string;
@@ -1 +1 @@
1
- {"version":3,"file":"storage-inventory.types.js","sourceRoot":"","sources":["../../src/infrastructure/storage-inventory.types.ts"],"names":[],"mappings":"","sourcesContent":["export type StorageCategoryName =\n | \"recovery\"\n | \"logs\"\n | \"locks\"\n | \"workspaces\"\n | \"artifacts\"\n | \"checkpoints\"\n | \"conversations\"\n | \"reservations\"\n | \"resources\";\nexport type StorageEntryKind =\n \"file\" | \"directory\" | \"symlink\" | \"other\" | \"unknown\";\n\nexport interface StorageIssue {\n readonly path: string;\n readonly code: string;\n}\nexport interface StorageUsage {\n bytes: number;\n files: number;\n directories: number;\n symlinks: number;\n other: number;\n}\nexport interface StorageEntry extends StorageUsage {\n readonly revision?: string;\n readonly name: string;\n readonly path: string;\n kind: StorageEntryKind;\n modifiedAt?: string;\n complete: boolean;\n}\nexport interface StorageCategory {\n readonly name: StorageCategoryName;\n readonly path: string;\n readonly entries: readonly StorageEntry[];\n}\nexport interface StorageInventory {\n readonly root: string;\n readonly categories: readonly StorageCategory[];\n readonly usage: Readonly<StorageUsage>;\n readonly issues: readonly StorageIssue[];\n readonly complete: boolean;\n readonly scannedEntries: number;\n readonly maxEntries: number;\n}\nexport interface StorageScan {\n remaining: number;\n readonly issues: StorageIssue[];\n}\n"]}
1
+ {"version":3,"file":"storage-inventory.types.js","sourceRoot":"","sources":["../../src/infrastructure/storage-inventory.types.ts"],"names":[],"mappings":"","sourcesContent":["export type StorageCategoryName =\n | \"storage\"\n | \"recovery\"\n | \"logs\"\n | \"locks\"\n | \"workspaces\"\n | \"artifacts\"\n | \"checkpoints\"\n | \"conversations\"\n | \"reservations\"\n | \"resources\";\nexport type StorageEntryKind =\n \"file\" | \"directory\" | \"symlink\" | \"other\" | \"unknown\";\n\nexport interface StorageIssue {\n readonly path: string;\n readonly code: string;\n}\nexport interface StorageUsage {\n bytes: number;\n files: number;\n directories: number;\n symlinks: number;\n other: number;\n}\nexport interface StorageEntry extends StorageUsage {\n readonly revision?: string;\n readonly name: string;\n readonly path: string;\n kind: StorageEntryKind;\n modifiedAt?: string;\n complete: boolean;\n}\nexport interface StorageCategory {\n readonly name: StorageCategoryName;\n readonly path: string;\n readonly entries: readonly StorageEntry[];\n}\nexport interface StorageInventory {\n readonly root: string;\n readonly categories: readonly StorageCategory[];\n readonly usage: Readonly<StorageUsage>;\n readonly issues: readonly StorageIssue[];\n readonly complete: boolean;\n readonly scannedEntries: number;\n readonly maxEntries: number;\n}\nexport interface StorageScan {\n remaining: number;\n readonly issues: StorageIssue[];\n}\n"]}
@@ -13,11 +13,3 @@ export interface StorageReservation {
13
13
  release(): Promise<void>;
14
14
  [Symbol.asyncDispose](): Promise<void>;
15
15
  }
16
- export interface StorageReservationRecord {
17
- readonly version: 1;
18
- readonly id: string;
19
- readonly pid: number;
20
- readonly identity?: unknown;
21
- readonly reserveBytes: number;
22
- readonly createdAt: string;
23
- }
@@ -1 +1 @@
1
- {"version":3,"file":"storage-reservations.types.js","sourceRoot":"","sources":["../../src/infrastructure/storage-reservations.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Transport } from \"../domain/transport.types.ts\";\n\nexport interface StorageReservationOptions {\n readonly transporter?: Transport;\n readonly maxBytes: number;\n readonly reserveBytes: number;\n readonly maxEntries?: number;\n readonly signal?: AbortSignal;\n}\n\nexport interface StorageReservation {\n readonly id: string;\n readonly repository: string;\n readonly reserveBytes: number;\n release(): Promise<void>;\n [Symbol.asyncDispose](): Promise<void>;\n}\n\nexport interface StorageReservationRecord {\n readonly version: 1;\n readonly id: string;\n readonly pid: number;\n readonly identity?: unknown;\n readonly reserveBytes: number;\n readonly createdAt: string;\n}\n"]}
1
+ {"version":3,"file":"storage-reservations.types.js","sourceRoot":"","sources":["../../src/infrastructure/storage-reservations.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Transport } from \"../domain/transport.types.ts\";\n\nexport interface StorageReservationOptions {\n readonly transporter?: Transport;\n readonly maxBytes: number;\n readonly reserveBytes: number;\n readonly maxEntries?: number;\n readonly signal?: AbortSignal;\n}\n\nexport interface StorageReservation {\n readonly id: string;\n readonly repository: string;\n readonly reserveBytes: number;\n release(): Promise<void>;\n [Symbol.asyncDispose](): Promise<void>;\n}\n"]}
@@ -1,4 +1,4 @@
1
1
  import type { ConversationStore } from "../domain/conversation.types.ts";
2
- import type { ConversationFormat } from "./conversations.types.ts";
2
+ import type { StoredConversationFormat } from "./conversations.types.ts";
3
3
  import type { TransportConversationOptions } from "./transport-conversations.types.ts";
4
- export declare function transportConversations(format: ConversationFormat, options: TransportConversationOptions): ConversationStore;
4
+ export declare function transportConversations(format: StoredConversationFormat, options: TransportConversationOptions): ConversationStore;
@@ -3,14 +3,21 @@ import { mkdir, mkdtemp } from "node:fs/promises";
3
3
  import { dirname, join, relative } from "node:path";
4
4
  import { invariant } from "../domain/errors.js";
5
5
  import { transportKey } from "../domain/transport.js";
6
+ import { harnessConversations } from "./conversations/harness-store.js";
6
7
  import { nativeConversations } from "./conversations/native-store.js";
7
8
  import { files } from "./conversations/files.js";
8
9
  import { validId } from "./conversations/paths.js";
9
10
  import { jsonBytes, jsonObject, transportReference } from "./transport-json.js";
10
11
  import { archiveFiles, restoreArchiveFiles } from "./transport-archive.js";
11
12
  import { safeDestination } from "./files.js";
13
+ const baseStores = {
14
+ claude: () => nativeConversations("claude"),
15
+ codex: () => nativeConversations("codex"),
16
+ harness: harnessConversations,
17
+ };
12
18
  export function transportConversations(format, options) {
13
- const native = nativeConversations(format);
19
+ invariant(Object.hasOwn(baseStores, format), "Unsupported conversation format");
20
+ const native = baseStores[format]();
14
21
  const prefix = `conversations/${transportKey(options.namespace)}/${format}`;
15
22
  const key = (id) => {
16
23
  validId(id);
@@ -1 +1 @@
1
- {"version":3,"file":"transport-conversations.js","sourceRoot":"","sources":["../../src/infrastructure/transport-conversations.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { mkdir, mkdtemp } from \"node:fs/promises\";\nimport { dirname, join, relative } from \"node:path\";\nimport type { ConversationStore } from \"../domain/conversation.types.ts\";\nimport { invariant } from \"../domain/errors.ts\";\nimport { transportKey } from \"../domain/transport.ts\";\nimport type { ConversationFormat } from \"./conversations.types.ts\";\nimport type { TransportConversationOptions } from \"./transport-conversations.types.ts\";\nimport { nativeConversations } from \"./conversations/native-store.ts\";\nimport { files } from \"./conversations/files.ts\";\nimport { validId } from \"./conversations/paths.ts\";\nimport { jsonBytes, jsonObject, transportReference } from \"./transport-json.ts\";\nimport { archiveFiles, restoreArchiveFiles } from \"./transport-archive.ts\";\nimport { safeDestination } from \"./files.ts\";\n\nexport function transportConversations(\n format: ConversationFormat,\n options: TransportConversationOptions,\n): ConversationStore {\n const native = nativeConversations(format);\n const prefix = `conversations/${transportKey(options.namespace)}/${format}`;\n const key = (id: string) => {\n validId(id);\n return `${prefix}/${id}/index`;\n };\n return {\n name: `transport:${options.namespace}:${format}`,\n async locate(id, repository) {\n const current = await options.transporter.read(key(id));\n invariant(current, \"Conversation does not exist\");\n const value: unknown = jsonObject(current);\n invariant(\n value &&\n typeof value === \"object\" &&\n \"archive\" in value &&\n \"file\" in value &&\n typeof value.file === \"string\",\n \"Invalid conversation index\",\n );\n const staging = join(repository, \".outpost\", \"recovery\", \"conversations\");\n await mkdir(staging, { recursive: true, mode: 0o700 });\n const parent = await mkdtemp(join(staging, \"materialized-\"));\n const destination = join(parent, \"transcript\");\n await restoreArchiveFiles(\n options.transporter,\n transportReference(value.archive),\n destination,\n );\n const file = await safeDestination(destination, value.file);\n return {\n id,\n file,\n format,\n reference: { key: current.key, revision: current.revision },\n };\n },\n async capture(id, context) {\n const target = key(id);\n const previous = await options.transporter.read(target);\n await mkdir(context.staging, { recursive: true, mode: 0o700 });\n const home = await mkdtemp(join(context.staging, \"captured-\"));\n const captured = await native.capture(id, { ...context, home });\n const root = dirname(captured.file);\n const selected = [\n captured.file,\n ...(await files(join(root, id, \"subagents\"))),\n ];\n const archive = await archiveFiles(\n options.transporter,\n root,\n selected.map((file) => relative(root, file).replaceAll(\"\\\\\", \"/\")),\n `${prefix}/${id}/snapshots/${randomUUID()}`,\n );\n const reference = await options.transporter.write(\n target,\n jsonBytes({\n archive,\n file: relative(root, captured.file).replaceAll(\"\\\\\", \"/\"),\n }),\n { ifRevision: previous?.revision ?? null },\n );\n return {\n ...captured,\n reference: { key: reference.key, revision: reference.revision },\n };\n },\n restore(record, context) {\n return native.restore(record, context);\n },\n };\n}\n"]}
1
+ {"version":3,"file":"transport-conversations.js","sourceRoot":"","sources":["../../src/infrastructure/transport-conversations.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { mkdir, mkdtemp } from \"node:fs/promises\";\nimport { dirname, join, relative } from \"node:path\";\nimport type { ConversationStore } from \"../domain/conversation.types.ts\";\nimport { invariant } from \"../domain/errors.ts\";\nimport { transportKey } from \"../domain/transport.ts\";\nimport type { StoredConversationFormat } from \"./conversations.types.ts\";\nimport { harnessConversations } from \"./conversations/harness-store.ts\";\nimport type { TransportConversationOptions } from \"./transport-conversations.types.ts\";\nimport { nativeConversations } from \"./conversations/native-store.ts\";\nimport { files } from \"./conversations/files.ts\";\nimport { validId } from \"./conversations/paths.ts\";\nimport { jsonBytes, jsonObject, transportReference } from \"./transport-json.ts\";\nimport { archiveFiles, restoreArchiveFiles } from \"./transport-archive.ts\";\nimport { safeDestination } from \"./files.ts\";\n\nconst baseStores: Readonly<\n Record<StoredConversationFormat, () => ConversationStore>\n> = {\n claude: () => nativeConversations(\"claude\"),\n codex: () => nativeConversations(\"codex\"),\n harness: harnessConversations,\n};\n\nexport function transportConversations(\n format: StoredConversationFormat,\n options: TransportConversationOptions,\n): ConversationStore {\n invariant(\n Object.hasOwn(baseStores, format),\n \"Unsupported conversation format\",\n );\n const native = baseStores[format]();\n const prefix = `conversations/${transportKey(options.namespace)}/${format}`;\n const key = (id: string) => {\n validId(id);\n return `${prefix}/${id}/index`;\n };\n return {\n name: `transport:${options.namespace}:${format}`,\n async locate(id, repository) {\n const current = await options.transporter.read(key(id));\n invariant(current, \"Conversation does not exist\");\n const value: unknown = jsonObject(current);\n invariant(\n value &&\n typeof value === \"object\" &&\n \"archive\" in value &&\n \"file\" in value &&\n typeof value.file === \"string\",\n \"Invalid conversation index\",\n );\n const staging = join(repository, \".outpost\", \"recovery\", \"conversations\");\n await mkdir(staging, { recursive: true, mode: 0o700 });\n const parent = await mkdtemp(join(staging, \"materialized-\"));\n const destination = join(parent, \"transcript\");\n await restoreArchiveFiles(\n options.transporter,\n transportReference(value.archive),\n destination,\n );\n const file = await safeDestination(destination, value.file);\n return {\n id,\n file,\n format,\n reference: { key: current.key, revision: current.revision },\n };\n },\n async capture(id, context) {\n const target = key(id);\n const previous = await options.transporter.read(target);\n await mkdir(context.staging, { recursive: true, mode: 0o700 });\n const home = await mkdtemp(join(context.staging, \"captured-\"));\n const captured = await native.capture(id, { ...context, home });\n const root = dirname(captured.file);\n const selected = [\n captured.file,\n ...(await files(join(root, id, \"subagents\"))),\n ];\n const archive = await archiveFiles(\n options.transporter,\n root,\n selected.map((file) => relative(root, file).replaceAll(\"\\\\\", \"/\")),\n `${prefix}/${id}/snapshots/${randomUUID()}`,\n );\n const reference = await options.transporter.write(\n target,\n jsonBytes({\n archive,\n file: relative(root, captured.file).replaceAll(\"\\\\\", \"/\"),\n }),\n { ifRevision: previous?.revision ?? null },\n );\n return {\n ...captured,\n reference: { key: reference.key, revision: reference.revision },\n };\n },\n restore(record, context) {\n return native.restore(record, context);\n },\n };\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import { verboseOnly } from "./journal.constants.js";
1
2
  import { transportDefaults } from "./transport.constants.js";
2
3
  import { readLimit } from "./transport-envelope.js";
3
4
  import { randomUUID } from "node:crypto";
@@ -33,7 +34,7 @@ export async function transportJournal(transporter, verbose, label) {
33
34
  return { key: current.key, revision: current.revision };
34
35
  },
35
36
  record(event) {
36
- if (closing || (event.kind === "raw" && !verbose))
37
+ if (closing || (verboseOnly.has(event.kind) && !verbose))
37
38
  return;
38
39
  try {
39
40
  const value = structuredClone({
@@ -1 +1 @@
1
- {"version":3,"file":"transport-journal.js","sourceRoot":"","sources":["../../src/infrastructure/transport-journal.ts"],"names":[],"mappings":"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","sourcesContent":["import { transportDefaults } from \"./transport.constants.ts\";\nimport { readLimit } from \"./transport-envelope.ts\";\nimport { randomUUID } from \"node:crypto\";\nimport type {\n Transport,\n TransportReference,\n} from \"../domain/transport.types.ts\";\nimport type { Journal } from \"./journal.types.ts\";\nimport type {\n JournalSnapshot,\n ReadJournalOptions,\n} from \"./transport-journal.types.ts\";\nimport {\n jsonBytes,\n jsonObject,\n readReference,\n transportReference,\n} from \"./transport-json.ts\";\nimport { positive } from \"../domain/errors.ts\";\n\nexport function journalSnapshot(value: unknown): JournalSnapshot {\n if (\n !value ||\n typeof value !== \"object\" ||\n !(\"closed\" in value) ||\n typeof value.closed !== \"boolean\" ||\n !(\"head\" in value)\n )\n throw new Error(\"Invalid journal snapshot\");\n return {\n closed: value.closed,\n head: value.head === null ? null : transportReference(value.head),\n };\n}\n\nexport async function transportJournal(\n transporter: Transport,\n verbose: boolean,\n label?: string,\n): Promise<Journal> {\n const prefix = `logs/${randomUUID()}`;\n let head: TransportReference | null = null;\n let current = await transporter.write(\n `${prefix}/index`,\n jsonBytes({ closed: false, head }),\n { ifRevision: null },\n );\n let closing: Promise<void> | undefined;\n let pending = Promise.resolve();\n let failure: unknown;\n const append = async (event: unknown) => {\n const segment = await transporter.write(\n `${prefix}/${randomUUID()}`,\n jsonBytes({ previous: head, event }),\n { ifRevision: null },\n );\n current = await transporter.write(\n current.key,\n jsonBytes({ closed: false, head: segment }),\n { ifRevision: current.revision },\n );\n head = segment;\n };\n await append({ kind: \"dispatch-start\", at: new Date().toISOString(), label });\n return {\n get reference() {\n return { key: current.key, revision: current.revision };\n },\n record(event) {\n if (closing || (event.kind === \"raw\" && !verbose)) return;\n try {\n const value = structuredClone({\n at: new Date().toISOString(),\n ...(label ? { label } : {}),\n ...event,\n });\n pending = pending\n .then(async () => {\n if (!failure) await append(value);\n })\n .catch((error) => {\n failure = error;\n });\n } catch (error) {\n failure = error;\n }\n },\n close() {\n closing ??= (async () => {\n await pending;\n if (failure) throw failure;\n current = await transporter.write(\n current.key,\n jsonBytes({ closed: true, head }),\n { ifRevision: current.revision },\n );\n })();\n return closing;\n },\n };\n}\n\nexport async function readJournal(\n options: ReadJournalOptions,\n): Promise<readonly unknown[]> {\n const maxEntries = positive(\n options.maxEntries ?? transportDefaults.maxEntries,\n \"maxEntries\",\n );\n const snapshot = journalSnapshot(\n jsonObject(await readReference(options.transporter, options.reference)),\n );\n let next = snapshot.head;\n let remaining = readLimit(options.maxBytes);\n const events: unknown[] = [];\n const seen = new Set<string>();\n while (next) {\n if (events.length >= maxEntries || seen.has(next.key))\n throw new Error(\"Journal entry limit or cycle\");\n seen.add(next.key);\n const object = await readReference(options.transporter, next, remaining);\n remaining -= object.bytes.length;\n const segment: unknown = jsonObject(object);\n if (\n !segment ||\n typeof segment !== \"object\" ||\n !(\"event\" in segment) ||\n !(\"previous\" in segment)\n )\n throw new Error(\"Invalid journal segment\");\n events.push(segment.event);\n next =\n segment.previous === null ? null : transportReference(segment.previous);\n }\n return events.reverse();\n}\n"]}
1
+ {"version":3,"file":"transport-journal.js","sourceRoot":"","sources":["../../src/infrastructure/transport-journal.ts"],"names":[],"mappings":"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","sourcesContent":["import { verboseOnly } from \"./journal.constants.ts\";\nimport { transportDefaults } from \"./transport.constants.ts\";\nimport { readLimit } from \"./transport-envelope.ts\";\nimport { randomUUID } from \"node:crypto\";\nimport type {\n Transport,\n TransportReference,\n} from \"../domain/transport.types.ts\";\nimport type { Journal } from \"./journal.types.ts\";\nimport type {\n JournalSnapshot,\n ReadJournalOptions,\n} from \"./transport-journal.types.ts\";\nimport {\n jsonBytes,\n jsonObject,\n readReference,\n transportReference,\n} from \"./transport-json.ts\";\nimport { positive } from \"../domain/errors.ts\";\n\nexport function journalSnapshot(value: unknown): JournalSnapshot {\n if (\n !value ||\n typeof value !== \"object\" ||\n !(\"closed\" in value) ||\n typeof value.closed !== \"boolean\" ||\n !(\"head\" in value)\n )\n throw new Error(\"Invalid journal snapshot\");\n return {\n closed: value.closed,\n head: value.head === null ? null : transportReference(value.head),\n };\n}\n\nexport async function transportJournal(\n transporter: Transport,\n verbose: boolean,\n label?: string,\n): Promise<Journal> {\n const prefix = `logs/${randomUUID()}`;\n let head: TransportReference | null = null;\n let current = await transporter.write(\n `${prefix}/index`,\n jsonBytes({ closed: false, head }),\n { ifRevision: null },\n );\n let closing: Promise<void> | undefined;\n let pending = Promise.resolve();\n let failure: unknown;\n const append = async (event: unknown) => {\n const segment = await transporter.write(\n `${prefix}/${randomUUID()}`,\n jsonBytes({ previous: head, event }),\n { ifRevision: null },\n );\n current = await transporter.write(\n current.key,\n jsonBytes({ closed: false, head: segment }),\n { ifRevision: current.revision },\n );\n head = segment;\n };\n await append({ kind: \"dispatch-start\", at: new Date().toISOString(), label });\n return {\n get reference() {\n return { key: current.key, revision: current.revision };\n },\n record(event) {\n if (closing || (verboseOnly.has(event.kind) && !verbose)) return;\n try {\n const value = structuredClone({\n at: new Date().toISOString(),\n ...(label ? { label } : {}),\n ...event,\n });\n pending = pending\n .then(async () => {\n if (!failure) await append(value);\n })\n .catch((error) => {\n failure = error;\n });\n } catch (error) {\n failure = error;\n }\n },\n close() {\n closing ??= (async () => {\n await pending;\n if (failure) throw failure;\n current = await transporter.write(\n current.key,\n jsonBytes({ closed: true, head }),\n { ifRevision: current.revision },\n );\n })();\n return closing;\n },\n };\n}\n\nexport async function readJournal(\n options: ReadJournalOptions,\n): Promise<readonly unknown[]> {\n const maxEntries = positive(\n options.maxEntries ?? transportDefaults.maxEntries,\n \"maxEntries\",\n );\n const snapshot = journalSnapshot(\n jsonObject(await readReference(options.transporter, options.reference)),\n );\n let next = snapshot.head;\n let remaining = readLimit(options.maxBytes);\n const events: unknown[] = [];\n const seen = new Set<string>();\n while (next) {\n if (events.length >= maxEntries || seen.has(next.key))\n throw new Error(\"Journal entry limit or cycle\");\n seen.add(next.key);\n const object = await readReference(options.transporter, next, remaining);\n remaining -= object.bytes.length;\n const segment: unknown = jsonObject(object);\n if (\n !segment ||\n typeof segment !== \"object\" ||\n !(\"event\" in segment) ||\n !(\"previous\" in segment)\n )\n throw new Error(\"Invalid journal segment\");\n events.push(segment.event);\n next =\n segment.previous === null ? null : transportReference(segment.previous);\n }\n return events.reverse();\n}\n"]}
@@ -2,4 +2,4 @@ import type { Transport } from "../domain/transport.types.ts";
2
2
  import type { StorageReservation, StorageReservationOptions } from "./storage-reservations.types.ts";
3
3
  import type { ReservationLedger } from "./transport-reservations.types.ts";
4
4
  export declare function reservationLedger(value: unknown): ReservationLedger;
5
- export declare function reserveTransportStorage(transporter: Transport, repository: string, options: StorageReservationOptions): Promise<StorageReservation>;
5
+ export declare function reserveTransportStorage(transporter: Transport, repository: string, options: StorageReservationOptions, measureUsage?: () => Promise<number>): Promise<StorageReservation>;
@@ -22,7 +22,16 @@ export function reservationLedger(value) {
22
22
  bytes >= 0), "Invalid reservation entry");
23
23
  return { format: 1, reservations: Object.fromEntries(entries) };
24
24
  }
25
- export async function reserveTransportStorage(transporter, repository, options) {
25
+ async function payloadUsage(transporter, maxEntries, signal) {
26
+ let usage = 0, count = 0;
27
+ for await (const entry of transporter.list("", signal ? { signal } : {})) {
28
+ invariant(++count <= maxEntries, "Reservation inventory is incomplete");
29
+ if (entry.key !== key)
30
+ usage += entry.size;
31
+ }
32
+ return usage;
33
+ }
34
+ export async function reserveTransportStorage(transporter, repository, options, measureUsage) {
26
35
  invariant(Number.isSafeInteger(options.maxBytes) &&
27
36
  options.maxBytes >= 0 &&
28
37
  Number.isSafeInteger(options.reserveBytes) &&
@@ -40,14 +49,11 @@ export async function reserveTransportStorage(transporter, repository, options)
40
49
  if (release)
41
50
  delete reservations[id];
42
51
  if (!release) {
43
- let usage = 0, count = 0;
44
- for await (const entry of transporter.list("", options.signal ? { signal: options.signal } : {})) {
45
- invariant(++count <= maxEntries, "Reservation inventory is incomplete");
46
- if (entry.key !== key)
47
- usage += entry.size;
48
- }
52
+ const usage = measureUsage
53
+ ? await measureUsage()
54
+ : await payloadUsage(transporter, maxEntries, options.signal);
49
55
  const reserved = Object.values(reservations).reduce((sum, value) => sum + value, 0);
50
- invariant(usage + reserved + options.reserveBytes <= options.maxBytes, "Outpost storage quota admission refused");
56
+ invariant(usage + reserved + options.reserveBytes <= options.maxBytes, "Outpost storage reservation admission refused");
51
57
  reservations[id] = options.reserveBytes;
52
58
  }
53
59
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"transport-reservations.js","sourceRoot":"","sources":["../../src/infrastructure/transport-reservations.ts"],"names":[],"mappings":"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","sourcesContent":["import { transportDefaults } from \"./transport.constants.ts\";\nimport { randomUUID } from \"node:crypto\";\nimport type { Transport } from \"../domain/transport.types.ts\";\nimport { TransportConflict } from \"../domain/transport.ts\";\nimport { invariant, recordRecovery } from \"../domain/errors.ts\";\nimport { jsonBytes, jsonObject } from \"./transport-json.ts\";\nimport type {\n StorageReservation,\n StorageReservationOptions,\n} from \"./storage-reservations.types.ts\";\nimport type { ReservationLedger } from \"./transport-reservations.types.ts\";\n\nconst key = \"reservations/ledger\";\n\nexport function reservationLedger(value: unknown): ReservationLedger {\n if (value === undefined) return { format: 1, reservations: {} };\n invariant(\n value &&\n typeof value === \"object\" &&\n \"format\" in value &&\n value.format === 1 &&\n \"reservations\" in value &&\n value.reservations &&\n typeof value.reservations === \"object\" &&\n !Array.isArray(value.reservations),\n \"Invalid reservation ledger\",\n );\n const entries = Object.entries(value.reservations);\n invariant(\n entries.every(\n ([id, bytes]) =>\n /^[a-f0-9-]{36}$/.test(id) &&\n typeof bytes === \"number\" &&\n Number.isSafeInteger(bytes) &&\n bytes >= 0,\n ),\n \"Invalid reservation entry\",\n );\n return { format: 1, reservations: Object.fromEntries(entries) };\n}\n\nexport async function reserveTransportStorage(\n transporter: Transport,\n repository: string,\n options: StorageReservationOptions,\n): Promise<StorageReservation> {\n invariant(\n Number.isSafeInteger(options.maxBytes) &&\n options.maxBytes >= 0 &&\n Number.isSafeInteger(options.reserveBytes) &&\n options.reserveBytes >= 0,\n \"Invalid reservation byte limit\",\n );\n const id = randomUUID();\n const maxEntries = options.maxEntries ?? transportDefaults.maxEntries;\n invariant(\n Number.isSafeInteger(maxEntries) && maxEntries > 0,\n \"Invalid reservation entry limit\",\n );\n async function update(release: boolean): Promise<void> {\n for (\n let attempt = 0;\n attempt < transportDefaults.mutationAttempts;\n attempt++\n ) {\n if (!release) options.signal?.throwIfAborted();\n const current = await transporter.read(key);\n const ledger = reservationLedger(jsonObject(current));\n const reservations = { ...ledger.reservations };\n if (release) delete reservations[id];\n if (!release) {\n let usage = 0,\n count = 0;\n for await (const entry of transporter.list(\n \"\",\n options.signal ? { signal: options.signal } : {},\n )) {\n invariant(\n ++count <= maxEntries,\n \"Reservation inventory is incomplete\",\n );\n if (entry.key !== key) usage += entry.size;\n }\n const reserved = Object.values(reservations).reduce(\n (sum, value) => sum + value,\n 0,\n );\n invariant(\n usage + reserved + options.reserveBytes <= options.maxBytes,\n \"Outpost storage quota admission refused\",\n );\n reservations[id] = options.reserveBytes;\n }\n try {\n await transporter.write(key, jsonBytes({ format: 1, reservations }), {\n ifRevision: current?.revision ?? null,\n ...(!release && options.signal ? { signal: options.signal } : {}),\n });\n return;\n } catch (error) {\n if (!(error instanceof TransportConflict)) throw error;\n }\n }\n throw new Error(\"Storage reservation contention limit exceeded\");\n }\n try {\n await update(false);\n } catch (error) {\n recordRecovery(error, { reservation: id });\n throw error;\n }\n let released = false;\n const release = async () => {\n if (released) return;\n await update(true);\n released = true;\n };\n return {\n id,\n repository,\n reserveBytes: options.reserveBytes,\n release,\n [Symbol.asyncDispose]: release,\n };\n}\n"]}
1
+ {"version":3,"file":"transport-reservations.js","sourceRoot":"","sources":["../../src/infrastructure/transport-reservations.ts"],"names":[],"mappings":"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","sourcesContent":["import { transportDefaults } from \"./transport.constants.ts\";\nimport { randomUUID } from \"node:crypto\";\nimport type { Transport } from \"../domain/transport.types.ts\";\nimport { TransportConflict } from \"../domain/transport.ts\";\nimport { invariant, recordRecovery } from \"../domain/errors.ts\";\nimport { jsonBytes, jsonObject } from \"./transport-json.ts\";\nimport type {\n StorageReservation,\n StorageReservationOptions,\n} from \"./storage-reservations.types.ts\";\nimport type { ReservationLedger } from \"./transport-reservations.types.ts\";\n\nconst key = \"reservations/ledger\";\n\nexport function reservationLedger(value: unknown): ReservationLedger {\n if (value === undefined) return { format: 1, reservations: {} };\n invariant(\n value &&\n typeof value === \"object\" &&\n \"format\" in value &&\n value.format === 1 &&\n \"reservations\" in value &&\n value.reservations &&\n typeof value.reservations === \"object\" &&\n !Array.isArray(value.reservations),\n \"Invalid reservation ledger\",\n );\n const entries = Object.entries(value.reservations);\n invariant(\n entries.every(\n ([id, bytes]) =>\n /^[a-f0-9-]{36}$/.test(id) &&\n typeof bytes === \"number\" &&\n Number.isSafeInteger(bytes) &&\n bytes >= 0,\n ),\n \"Invalid reservation entry\",\n );\n return { format: 1, reservations: Object.fromEntries(entries) };\n}\n\nasync function payloadUsage(\n transporter: Transport,\n maxEntries: number,\n signal?: AbortSignal,\n): Promise<number> {\n let usage = 0,\n count = 0;\n for await (const entry of transporter.list(\"\", signal ? { signal } : {})) {\n invariant(++count <= maxEntries, \"Reservation inventory is incomplete\");\n if (entry.key !== key) usage += entry.size;\n }\n return usage;\n}\n\nexport async function reserveTransportStorage(\n transporter: Transport,\n repository: string,\n options: StorageReservationOptions,\n measureUsage?: () => Promise<number>,\n): Promise<StorageReservation> {\n invariant(\n Number.isSafeInteger(options.maxBytes) &&\n options.maxBytes >= 0 &&\n Number.isSafeInteger(options.reserveBytes) &&\n options.reserveBytes >= 0,\n \"Invalid reservation byte limit\",\n );\n const id = randomUUID();\n const maxEntries = options.maxEntries ?? transportDefaults.maxEntries;\n invariant(\n Number.isSafeInteger(maxEntries) && maxEntries > 0,\n \"Invalid reservation entry limit\",\n );\n async function update(release: boolean): Promise<void> {\n for (\n let attempt = 0;\n attempt < transportDefaults.mutationAttempts;\n attempt++\n ) {\n if (!release) options.signal?.throwIfAborted();\n const current = await transporter.read(key);\n const ledger = reservationLedger(jsonObject(current));\n const reservations = { ...ledger.reservations };\n if (release) delete reservations[id];\n if (!release) {\n const usage = measureUsage\n ? await measureUsage()\n : await payloadUsage(transporter, maxEntries, options.signal);\n const reserved = Object.values(reservations).reduce(\n (sum, value) => sum + value,\n 0,\n );\n invariant(\n usage + reserved + options.reserveBytes <= options.maxBytes,\n \"Outpost storage reservation admission refused\",\n );\n reservations[id] = options.reserveBytes;\n }\n try {\n await transporter.write(key, jsonBytes({ format: 1, reservations }), {\n ifRevision: current?.revision ?? null,\n ...(!release && options.signal ? { signal: options.signal } : {}),\n });\n return;\n } catch (error) {\n if (!(error instanceof TransportConflict)) throw error;\n }\n }\n throw new Error(\"Storage reservation contention limit exceeded\");\n }\n try {\n await update(false);\n } catch (error) {\n recordRecovery(error, { reservation: id });\n throw error;\n }\n let released = false;\n const release = async () => {\n if (released) return;\n await update(true);\n released = true;\n };\n return {\n id,\n repository,\n reserveBytes: options.reserveBytes,\n release,\n [Symbol.asyncDispose]: release,\n };\n}\n"]}
@@ -1,5 +1,10 @@
1
- export { claude } from "../adapters/agents/claude-adapter.ts";
2
- export { codex } from "../adapters/agents/codex-adapter.ts";
3
- export { gemini } from "../adapters/agents/gemini-adapter.ts";
4
- export type { GeminiSettings } from "../adapters/agents/gemini.types.ts";
1
+ export { agentVersions } from "./versions.constants.ts";
2
+ export { antigravityHarness } from "../adapters/agents/antigravity-adapter.ts";
3
+ export { claudeHarness } from "../adapters/agents/claude-adapter.ts";
4
+ export { codexHarness } from "../adapters/agents/codex-adapter.ts";
5
+ export { copilotHarness } from "../adapters/agents/copilot-adapter.ts";
6
+ export { kimiHarness } from "../adapters/agents/kimi-adapter.ts";
7
+ export type { AntigravitySettings } from "../adapters/agents/antigravity.types.ts";
5
8
  export type { ClaudeSettings, CodexSettings, CodexModelProvider, } from "../adapters/agents/settings.types.ts";
9
+ export type { CopilotSettings } from "../adapters/agents/copilot.types.ts";
10
+ export type { KimiSettings } from "../adapters/agents/kimi.types.ts";
@@ -1,4 +1,7 @@
1
- export { claude } from "../adapters/agents/claude-adapter.js";
2
- export { codex } from "../adapters/agents/codex-adapter.js";
3
- export { gemini } from "../adapters/agents/gemini-adapter.js";
1
+ export { agentVersions } from "./versions.constants.js";
2
+ export { antigravityHarness } from "../adapters/agents/antigravity-adapter.js";
3
+ export { claudeHarness } from "../adapters/agents/claude-adapter.js";
4
+ export { codexHarness } from "../adapters/agents/codex-adapter.js";
5
+ export { copilotHarness } from "../adapters/agents/copilot-adapter.js";
6
+ export { kimiHarness } from "../adapters/agents/kimi-adapter.js";
4
7
  //# sourceMappingURL=agents.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/providers/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sCAAsC,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,qCAAqC,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,sCAAsC,CAAC","sourcesContent":["export { claude } from \"../adapters/agents/claude-adapter.ts\";\nexport { codex } from \"../adapters/agents/codex-adapter.ts\";\nexport { gemini } from \"../adapters/agents/gemini-adapter.ts\";\nexport type { GeminiSettings } from \"../adapters/agents/gemini.types.ts\";\nexport type {\n ClaudeSettings,\n CodexSettings,\n CodexModelProvider,\n} from \"../adapters/agents/settings.types.ts\";\n"]}
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/providers/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC","sourcesContent":["export { agentVersions } from \"./versions.constants.ts\";\nexport { antigravityHarness } from \"../adapters/agents/antigravity-adapter.ts\";\nexport { claudeHarness } from \"../adapters/agents/claude-adapter.ts\";\nexport { codexHarness } from \"../adapters/agents/codex-adapter.ts\";\nexport { copilotHarness } from \"../adapters/agents/copilot-adapter.ts\";\nexport { kimiHarness } from \"../adapters/agents/kimi-adapter.ts\";\nexport type { AntigravitySettings } from \"../adapters/agents/antigravity.types.ts\";\nexport type {\n ClaudeSettings,\n CodexSettings,\n CodexModelProvider,\n} from \"../adapters/agents/settings.types.ts\";\nexport type { CopilotSettings } from \"../adapters/agents/copilot.types.ts\";\nexport type { KimiSettings } from \"../adapters/agents/kimi.types.ts\";\n"]}
@@ -2,4 +2,4 @@ import type { Daytona, DaytonaConfig } from "@daytona/sdk";
2
2
  import type { SandboxProvider } from "../domain/sandbox.types.ts";
3
3
  import type { DaytonaOptions } from "./daytona.types.ts";
4
4
  export type { DaytonaOptions } from "./daytona.types.ts";
5
- export declare function daytona(options?: DaytonaOptions, connect?: (config?: DaytonaConfig) => Promise<Pick<Daytona, "create" | "delete">>): SandboxProvider;
5
+ export declare function daytonaSandboxProvider(options?: DaytonaOptions, connect?: (config?: DaytonaConfig) => Promise<Pick<Daytona, "create" | "delete">>): SandboxProvider;
@@ -5,7 +5,7 @@ import { registerCleanup } from "../infrastructure/shutdown.js";
5
5
  import { cloudRoots } from "./cloud.constants.js";
6
6
  import { daytonaCommand } from "./daytona-command.js";
7
7
  import { daytonaFiles } from "./daytona-files.js";
8
- export function daytona(options = {}, connect = async (config) => new (await import("@daytona/sdk")).Daytona(config)) {
8
+ export function daytonaSandboxProvider(options = {}, connect = async (config) => new (await import("@daytona/sdk")).Daytona(config)) {
9
9
  invariant(!("egress" in options) || options.egress === undefined, "Daytona does not support Outpost egress policies; configure provider-native networking explicitly");
10
10
  return {
11
11
  name: "daytona",
@@ -1 +1 @@
1
- {"version":3,"file":"daytona.js","sourceRoot":"","sources":["../../src/providers/daytona.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKlD,MAAM,UAAU,OAAO,CACrB,UAA0B,EAAE,EAC5B,UAEmD,KAAK,EAAE,MAAM,EAAE,EAAE,CAClE,IAAI,CAAC,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IAEpD,SAAS,CACP,CAAC,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EACtD,mGAAmG,CACpG,CAAC;IACF,OAAO;QACL,IAAI,EAAE,SAAS;QACf,SAAS,EAAE,QAAQ;QACnB,SAAS,EAAE,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE;QACnC,KAAK,CAAC,OAAO,CAAC,OAAO;YACnB,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;YAC1D,IAAI,MAAM,GAAG,KAAK,EAChB,SAAoC,CAAC;YACvC,IAAI,UAAU,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;YAC1B,MAAM,OAAO,GAAG,GAAG,EAAE,CACnB,CAAC,SAAS,KAAK,MAAM;iBAClB,MAAM,CAAC,OAAO,CAAC;iBACf,IAAI,CAAC,GAAG,EAAE;gBACT,MAAM,GAAG,IAAI,CAAC;gBACd,UAAU,EAAE,CAAC;YACf,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACf,SAAS,GAAG,SAAS,CAAC;gBACtB,MAAM,KAAK,CAAC;YACd,CAAC,CAAC,CAAC,CAAC;YACR,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;YACtC,IAAI,IAAY,CAAC;YACjB,IAAI,IAAY,CAAC;YACjB,IAAI,CAAC;gBACH,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC,IAAI,UAAU,CAAC,WAAW,CAAC;gBAClE,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBACnD,MAAM,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC7C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC;oBACH,MAAM,OAAO,EAAE,CAAC;gBAClB,CAAC;gBAAC,OAAO,OAAO,EAAE,CAAC;oBACjB,MAAM,IAAI,cAAc,CACtB,CAAC,KAAK,EAAE,OAAO,CAAC,EAChB,gCAAgC,CACjC,CAAC;gBACJ,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,KAAK,GAAG;gBACZ,IAAI;gBACJ,IAAI;gBACJ,MAAM,EAAE,cAAc,CAAC;oBACrB,OAAO;oBACP,IAAI;oBACJ,OAAO;oBACP,OAAO;oBACP,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM;iBACvB,CAAC;gBACF,GAAG,YAAY,CAAC,OAAO,CAAC;gBACxB,OAAO;aACR,CAAC;YACF,OAAO,EAAE,GAAG,KAAK,EAAE,aAAa,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { Daytona, DaytonaConfig } from \"@daytona/sdk\";\nimport { invariant } from \"../domain/errors.ts\";\nimport { posix } from \"node:path\";\nimport type { SandboxProvider } from \"../domain/sandbox.types.ts\";\nimport { fileBatches } from \"./file-batches.ts\";\nimport { registerCleanup } from \"../infrastructure/shutdown.ts\";\nimport { cloudRoots } from \"./cloud.constants.ts\";\nimport { daytonaCommand } from \"./daytona-command.ts\";\nimport { daytonaFiles } from \"./daytona-files.ts\";\nimport type { DaytonaOptions } from \"./daytona.types.ts\";\n\nexport type { DaytonaOptions } from \"./daytona.types.ts\";\n\nexport function daytona(\n options: DaytonaOptions = {},\n connect: (\n config?: DaytonaConfig,\n ) => Promise<Pick<Daytona, \"create\" | \"delete\">> = async (config) =>\n new (await import(\"@daytona/sdk\")).Daytona(config),\n): SandboxProvider {\n invariant(\n !(\"egress\" in options) || options.egress === undefined,\n \"Daytona does not support Outpost egress policies; configure provider-native networking explicitly\",\n );\n return {\n name: \"daytona\",\n placement: \"remote\",\n variables: { ...options.variables },\n async acquire(context) {\n context.signal?.throwIfAborted();\n const client = await connect(options.connection);\n const sandbox = await client.create(options.create ?? {});\n let closed = false,\n releasing: Promise<void> | undefined;\n let unregister = () => {};\n const release = () =>\n (releasing ??= client\n .delete(sandbox)\n .then(() => {\n closed = true;\n unregister();\n })\n .catch((error) => {\n releasing = undefined;\n throw error;\n }));\n unregister = registerCleanup(release);\n let home: string;\n let root: string;\n try {\n home = (await sandbox.getUserHomeDir()) ?? cloudRoots.daytonaHome;\n root = options.root ?? posix.join(home, \"outpost\");\n await sandbox.fs.createFolder(root, \"755\");\n } catch (cause) {\n try {\n await release();\n } catch (cleanup) {\n throw new AggregateError(\n [cause, cleanup],\n \"Cloud setup and cleanup failed\",\n );\n }\n throw cause;\n }\n const lease = {\n root,\n home,\n invoke: daytonaCommand({\n sandbox,\n root,\n options,\n context,\n isClosed: () => closed,\n }),\n ...daytonaFiles(sandbox),\n release,\n };\n return { ...lease, fileTransfers: fileBatches(lease) };\n },\n };\n}\n"]}
1
+ {"version":3,"file":"daytona.js","sourceRoot":"","sources":["../../src/providers/daytona.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKlD,MAAM,UAAU,sBAAsB,CACpC,UAA0B,EAAE,EAC5B,UAEmD,KAAK,EAAE,MAAM,EAAE,EAAE,CAClE,IAAI,CAAC,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IAEpD,SAAS,CACP,CAAC,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EACtD,mGAAmG,CACpG,CAAC;IACF,OAAO;QACL,IAAI,EAAE,SAAS;QACf,SAAS,EAAE,QAAQ;QACnB,SAAS,EAAE,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE;QACnC,KAAK,CAAC,OAAO,CAAC,OAAO;YACnB,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;YAC1D,IAAI,MAAM,GAAG,KAAK,EAChB,SAAoC,CAAC;YACvC,IAAI,UAAU,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;YAC1B,MAAM,OAAO,GAAG,GAAG,EAAE,CACnB,CAAC,SAAS,KAAK,MAAM;iBAClB,MAAM,CAAC,OAAO,CAAC;iBACf,IAAI,CAAC,GAAG,EAAE;gBACT,MAAM,GAAG,IAAI,CAAC;gBACd,UAAU,EAAE,CAAC;YACf,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACf,SAAS,GAAG,SAAS,CAAC;gBACtB,MAAM,KAAK,CAAC;YACd,CAAC,CAAC,CAAC,CAAC;YACR,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;YACtC,IAAI,IAAY,CAAC;YACjB,IAAI,IAAY,CAAC;YACjB,IAAI,CAAC;gBACH,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC,IAAI,UAAU,CAAC,WAAW,CAAC;gBAClE,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBACnD,MAAM,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC7C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC;oBACH,MAAM,OAAO,EAAE,CAAC;gBAClB,CAAC;gBAAC,OAAO,OAAO,EAAE,CAAC;oBACjB,MAAM,IAAI,cAAc,CACtB,CAAC,KAAK,EAAE,OAAO,CAAC,EAChB,gCAAgC,CACjC,CAAC;gBACJ,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,KAAK,GAAG;gBACZ,IAAI;gBACJ,IAAI;gBACJ,MAAM,EAAE,cAAc,CAAC;oBACrB,OAAO;oBACP,IAAI;oBACJ,OAAO;oBACP,OAAO;oBACP,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM;iBACvB,CAAC;gBACF,GAAG,YAAY,CAAC,OAAO,CAAC;gBACxB,OAAO;aACR,CAAC;YACF,OAAO,EAAE,GAAG,KAAK,EAAE,aAAa,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { Daytona, DaytonaConfig } from \"@daytona/sdk\";\nimport { invariant } from \"../domain/errors.ts\";\nimport { posix } from \"node:path\";\nimport type { SandboxProvider } from \"../domain/sandbox.types.ts\";\nimport { fileBatches } from \"./file-batches.ts\";\nimport { registerCleanup } from \"../infrastructure/shutdown.ts\";\nimport { cloudRoots } from \"./cloud.constants.ts\";\nimport { daytonaCommand } from \"./daytona-command.ts\";\nimport { daytonaFiles } from \"./daytona-files.ts\";\nimport type { DaytonaOptions } from \"./daytona.types.ts\";\n\nexport type { DaytonaOptions } from \"./daytona.types.ts\";\n\nexport function daytonaSandboxProvider(\n options: DaytonaOptions = {},\n connect: (\n config?: DaytonaConfig,\n ) => Promise<Pick<Daytona, \"create\" | \"delete\">> = async (config) =>\n new (await import(\"@daytona/sdk\")).Daytona(config),\n): SandboxProvider {\n invariant(\n !(\"egress\" in options) || options.egress === undefined,\n \"Daytona does not support Outpost egress policies; configure provider-native networking explicitly\",\n );\n return {\n name: \"daytona\",\n placement: \"remote\",\n variables: { ...options.variables },\n async acquire(context) {\n context.signal?.throwIfAborted();\n const client = await connect(options.connection);\n const sandbox = await client.create(options.create ?? {});\n let closed = false,\n releasing: Promise<void> | undefined;\n let unregister = () => {};\n const release = () =>\n (releasing ??= client\n .delete(sandbox)\n .then(() => {\n closed = true;\n unregister();\n })\n .catch((error) => {\n releasing = undefined;\n throw error;\n }));\n unregister = registerCleanup(release);\n let home: string;\n let root: string;\n try {\n home = (await sandbox.getUserHomeDir()) ?? cloudRoots.daytonaHome;\n root = options.root ?? posix.join(home, \"outpost\");\n await sandbox.fs.createFolder(root, \"755\");\n } catch (cause) {\n try {\n await release();\n } catch (cleanup) {\n throw new AggregateError(\n [cause, cleanup],\n \"Cloud setup and cleanup failed\",\n );\n }\n throw cause;\n }\n const lease = {\n root,\n home,\n invoke: daytonaCommand({\n sandbox,\n root,\n options,\n context,\n isClosed: () => closed,\n }),\n ...daytonaFiles(sandbox),\n release,\n };\n return { ...lease, fileTransfers: fileBatches(lease) };\n },\n };\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { ContainerOptions } from "./container.types.ts";
2
2
  export type { ContainerOptions } from "./container.ts";
3
- export declare const docker: (options?: ContainerOptions) => import("../index.ts").SandboxProvider;
3
+ export declare const dockerSandboxProvider: (options?: ContainerOptions) => import("../index.ts").SandboxProvider;
4
4
  export type { DependencyCache } from "./container-cache.types.ts";
5
5
  export type { EgressPolicy } from "../domain/egress.types.ts";
@@ -1,3 +1,3 @@
1
1
  import { containerProvider } from "./container.js";
2
- export const docker = (options = {}) => containerProvider("docker", options);
2
+ export const dockerSandboxProvider = (options = {}) => containerProvider("docker", options);
3
3
  //# sourceMappingURL=docker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/providers/docker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAKnD,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,UAA4B,EAAE,EAAE,EAAE,CACvD,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC","sourcesContent":["import { containerProvider } from \"./container.ts\";\nimport type { ContainerOptions } from \"./container.types.ts\";\n\nexport type { ContainerOptions } from \"./container.ts\";\n\nexport const docker = (options: ContainerOptions = {}) =>\n containerProvider(\"docker\", options);\n\nexport type { DependencyCache } from \"./container-cache.types.ts\";\n\nexport type { EgressPolicy } from \"../domain/egress.types.ts\";\n"]}
1
+ {"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/providers/docker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAKnD,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,UAA4B,EAAE,EAAE,EAAE,CACtE,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC","sourcesContent":["import { containerProvider } from \"./container.ts\";\nimport type { ContainerOptions } from \"./container.types.ts\";\n\nexport type { ContainerOptions } from \"./container.ts\";\n\nexport const dockerSandboxProvider = (options: ContainerOptions = {}) =>\n containerProvider(\"docker\", options);\n\nexport type { DependencyCache } from \"./container-cache.types.ts\";\n\nexport type { EgressPolicy } from \"../domain/egress.types.ts\";\n"]}
@@ -1,4 +1,4 @@
1
1
  import type { SandboxProvider } from "../domain/sandbox.types.ts";
2
2
  import type { ProviderDefinition } from "./factories.types.ts";
3
- export declare const mountedProvider: (definition: ProviderDefinition) => SandboxProvider;
4
- export declare const remoteProvider: (definition: ProviderDefinition) => SandboxProvider;
3
+ export declare const mountedSandboxProvider: (definition: ProviderDefinition) => SandboxProvider;
4
+ export declare const remoteSandboxProvider: (definition: ProviderDefinition) => SandboxProvider;
@@ -1,5 +1,5 @@
1
1
  import { invariant } from "../domain/errors.js";
2
- function provider(placement, definition) {
2
+ function sandboxProvider(placement, definition) {
3
3
  invariant(definition.name.trim(), "A provider needs a name");
4
4
  return Object.freeze({
5
5
  ...definition,
@@ -7,6 +7,6 @@ function provider(placement, definition) {
7
7
  variables: Object.freeze({ ...definition.variables }),
8
8
  });
9
9
  }
10
- export const mountedProvider = (definition) => provider("mounted", definition);
11
- export const remoteProvider = (definition) => provider("remote", definition);
10
+ export const mountedSandboxProvider = (definition) => sandboxProvider("mounted", definition);
11
+ export const remoteSandboxProvider = (definition) => sandboxProvider("remote", definition);
12
12
  //# sourceMappingURL=factories.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"factories.js","sourceRoot":"","sources":["../../src/providers/factories.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAIhD,SAAS,QAAQ,CACf,SAA+B,EAC/B,UAA8B;IAE9B,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,yBAAyB,CAAC,CAAC;IAC7D,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG,UAAU;QACb,SAAS;QACT,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,UAAU,CAAC,SAAS,EAAE,CAAC;KACtD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,UAA8B,EACb,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AAEtD,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,UAA8B,EACb,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC","sourcesContent":["import { invariant } from \"../domain/errors.ts\";\nimport type { SandboxProvider } from \"../domain/sandbox.types.ts\";\nimport type { ProviderDefinition } from \"./factories.types.ts\";\n\nfunction provider(\n placement: \"mounted\" | \"remote\",\n definition: ProviderDefinition,\n): SandboxProvider {\n invariant(definition.name.trim(), \"A provider needs a name\");\n return Object.freeze({\n ...definition,\n placement,\n variables: Object.freeze({ ...definition.variables }),\n });\n}\n\nexport const mountedProvider = (\n definition: ProviderDefinition,\n): SandboxProvider => provider(\"mounted\", definition);\n\nexport const remoteProvider = (\n definition: ProviderDefinition,\n): SandboxProvider => provider(\"remote\", definition);\n"]}
1
+ {"version":3,"file":"factories.js","sourceRoot":"","sources":["../../src/providers/factories.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAIhD,SAAS,eAAe,CACtB,SAA+B,EAC/B,UAA8B;IAE9B,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,yBAAyB,CAAC,CAAC;IAC7D,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG,UAAU;QACb,SAAS;QACT,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,UAAU,CAAC,SAAS,EAAE,CAAC;KACtD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,UAA8B,EACb,EAAE,CAAC,eAAe,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AAE7D,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,UAA8B,EACb,EAAE,CAAC,eAAe,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC","sourcesContent":["import { invariant } from \"../domain/errors.ts\";\nimport type { SandboxProvider } from \"../domain/sandbox.types.ts\";\nimport type { ProviderDefinition } from \"./factories.types.ts\";\n\nfunction sandboxProvider(\n placement: \"mounted\" | \"remote\",\n definition: ProviderDefinition,\n): SandboxProvider {\n invariant(definition.name.trim(), \"A provider needs a name\");\n return Object.freeze({\n ...definition,\n placement,\n variables: Object.freeze({ ...definition.variables }),\n });\n}\n\nexport const mountedSandboxProvider = (\n definition: ProviderDefinition,\n): SandboxProvider => sandboxProvider(\"mounted\", definition);\n\nexport const remoteSandboxProvider = (\n definition: ProviderDefinition,\n): SandboxProvider => sandboxProvider(\"remote\", definition);\n"]}
@@ -1,4 +1,4 @@
1
1
  import type { SandboxProvider } from "../domain/sandbox.types.ts";
2
2
  import type { FirecrackerOptions } from "./firecracker.types.ts";
3
3
  export type { FirecrackerOptions } from "./firecracker.types.ts";
4
- export declare function firecracker(options: FirecrackerOptions): SandboxProvider;
4
+ export declare function firecrackerSandboxProvider(options: FirecrackerOptions): SandboxProvider;
@@ -5,7 +5,7 @@ import { firecrackerCommand, firecrackerSsh } from "./firecracker-command.js";
5
5
  import { firecrackerDefaults } from "./firecracker.constants.js";
6
6
  import { firecrackerFiles } from "./firecracker-files.js";
7
7
  import { firecrackerMachine, validateFirecracker, } from "./firecracker-machine.js";
8
- export function firecracker(options) {
8
+ export function firecrackerSandboxProvider(options) {
9
9
  validateFirecracker(options);
10
10
  let allocated = false;
11
11
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"firecracker.js","sourceRoot":"","sources":["../../src/providers/firecracker.ts"],"names":[],"mappings":"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","sourcesContent":["import { setTimeout as delay } from \"node:timers/promises\";\nimport { OutpostError } from \"../domain/errors.ts\";\nimport type { SandboxProvider } from \"../domain/sandbox.types.ts\";\nimport { executeProcess, quote } from \"../infrastructure/process.ts\";\nimport { firecrackerCommand, firecrackerSsh } from \"./firecracker-command.ts\";\nimport { firecrackerDefaults } from \"./firecracker.constants.ts\";\nimport { firecrackerFiles } from \"./firecracker-files.ts\";\nimport {\n firecrackerMachine,\n validateFirecracker,\n} from \"./firecracker-machine.ts\";\nimport type { FirecrackerOptions } from \"./firecracker.types.ts\";\n\nexport type { FirecrackerOptions } from \"./firecracker.types.ts\";\n\nexport function firecracker(options: FirecrackerOptions): SandboxProvider {\n validateFirecracker(options);\n let allocated = false;\n return {\n name: \"firecracker\",\n placement: \"remote\",\n variables: { ...options.variables },\n async acquire(context) {\n if (allocated)\n throw new OutpostError(\n \"provider\",\n \"This Firecracker provider already owns its TAP; create separate configurations for concurrent VMs\",\n );\n allocated = true;\n let machine;\n try {\n machine = await firecrackerMachine(options, context.signal);\n } catch (cause) {\n allocated = false;\n throw cause;\n }\n const root = options.root ?? firecrackerDefaults.root;\n let closed = false;\n const active = new Set<Promise<unknown>>();\n const stop = new AbortController();\n const runtime = {\n options,\n root,\n variables: context.variables,\n executor: executeProcess,\n isClosed: () => closed || machine.isClosed(),\n };\n let releasing: Promise<void> | undefined;\n const release = () =>\n (releasing ??= (async () => {\n closed = true;\n stop.abort(\n new OutpostError(\"aborted\", \"Firecracker sandbox disposed\"),\n );\n await Promise.allSettled([...active]);\n await machine.release();\n allocated = false;\n })().catch((cause) => {\n releasing = undefined;\n throw cause;\n }));\n try {\n const deadline =\n Date.now() +\n (options.bootDeadlineMs ?? firecrackerDefaults.bootDeadlineMs);\n while (true) {\n context.signal?.throwIfAborted();\n if (machine.isClosed())\n throw new OutpostError(\n \"provider\",\n \"Firecracker exited before guest readiness\",\n );\n const result = await executeProcess({\n ...firecrackerSsh(\n options,\n `test \"$HOME\" = ${quote(options.home)} && node -e 'if(Number(process.versions.node.split(\".\")[0])<24)process.exit(1)' && command -v git setsid tar >/dev/null && mkdir -p ${quote(root)}`,\n ),\n deadlineMs: Math.max(\n 1,\n Math.min(firecrackerDefaults.probeMs, deadline - Date.now()),\n ),\n ...(context.signal ? { signal: context.signal } : {}),\n }).catch((cause) => {\n context.signal?.throwIfAborted();\n return { status: 1, stdout: \"\", stderr: String(cause) };\n });\n if (machine.isClosed())\n throw new OutpostError(\n \"provider\",\n \"Firecracker exited during guest readiness\",\n );\n if (result.status === 0) break;\n if (Date.now() >= deadline)\n throw new OutpostError(\n \"timeout\",\n \"Firecracker guest SSH/prerequisites did not become ready\",\n { stderr: result.stderr },\n );\n await delay(100, undefined, { signal: context.signal });\n }\n } catch (cause) {\n try {\n await release();\n } catch (cleanup) {\n throw new AggregateError(\n [cause, cleanup],\n \"Firecracker acquisition and cleanup failed\",\n );\n }\n throw cause;\n }\n const invoke = firecrackerCommand(runtime);\n const files = firecrackerFiles(runtime);\n const track = <T>(\n operation: (signal: AbortSignal) => Promise<T>,\n signal?: AbortSignal,\n ): Promise<T> => {\n if (closed)\n return Promise.reject(\n new OutpostError(\"provider\", \"Firecracker sandbox is closed\"),\n );\n const pending = operation(\n signal ? AbortSignal.any([signal, stop.signal]) : stop.signal,\n );\n active.add(pending);\n void pending.then(\n () => active.delete(pending),\n () => active.delete(pending),\n );\n return pending;\n };\n return {\n root,\n home: options.home,\n invoke: (command) =>\n track((signal) => invoke({ ...command, signal }), command.signal),\n upload: (source, destination, options = {}) =>\n track(\n (signal) =>\n files.upload(source, destination, { ...options, signal }),\n options.signal,\n ),\n download: (source, destination, options = {}) =>\n track(\n (signal) =>\n files.download(source, destination, { ...options, signal }),\n options.signal,\n ),\n release,\n };\n },\n };\n}\n"]}
1
+ {"version":3,"file":"firecracker.js","sourceRoot":"","sources":["../../src/providers/firecracker.ts"],"names":[],"mappings":"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","sourcesContent":["import { setTimeout as delay } from \"node:timers/promises\";\nimport { OutpostError } from \"../domain/errors.ts\";\nimport type { SandboxProvider } from \"../domain/sandbox.types.ts\";\nimport { executeProcess, quote } from \"../infrastructure/process.ts\";\nimport { firecrackerCommand, firecrackerSsh } from \"./firecracker-command.ts\";\nimport { firecrackerDefaults } from \"./firecracker.constants.ts\";\nimport { firecrackerFiles } from \"./firecracker-files.ts\";\nimport {\n firecrackerMachine,\n validateFirecracker,\n} from \"./firecracker-machine.ts\";\nimport type { FirecrackerOptions } from \"./firecracker.types.ts\";\n\nexport type { FirecrackerOptions } from \"./firecracker.types.ts\";\n\nexport function firecrackerSandboxProvider(\n options: FirecrackerOptions,\n): SandboxProvider {\n validateFirecracker(options);\n let allocated = false;\n return {\n name: \"firecracker\",\n placement: \"remote\",\n variables: { ...options.variables },\n async acquire(context) {\n if (allocated)\n throw new OutpostError(\n \"provider\",\n \"This Firecracker provider already owns its TAP; create separate configurations for concurrent VMs\",\n );\n allocated = true;\n let machine;\n try {\n machine = await firecrackerMachine(options, context.signal);\n } catch (cause) {\n allocated = false;\n throw cause;\n }\n const root = options.root ?? firecrackerDefaults.root;\n let closed = false;\n const active = new Set<Promise<unknown>>();\n const stop = new AbortController();\n const runtime = {\n options,\n root,\n variables: context.variables,\n executor: executeProcess,\n isClosed: () => closed || machine.isClosed(),\n };\n let releasing: Promise<void> | undefined;\n const release = () =>\n (releasing ??= (async () => {\n closed = true;\n stop.abort(\n new OutpostError(\"aborted\", \"Firecracker sandbox disposed\"),\n );\n await Promise.allSettled([...active]);\n await machine.release();\n allocated = false;\n })().catch((cause) => {\n releasing = undefined;\n throw cause;\n }));\n try {\n const deadline =\n Date.now() +\n (options.bootDeadlineMs ?? firecrackerDefaults.bootDeadlineMs);\n while (true) {\n context.signal?.throwIfAborted();\n if (machine.isClosed())\n throw new OutpostError(\n \"provider\",\n \"Firecracker exited before guest readiness\",\n );\n const result = await executeProcess({\n ...firecrackerSsh(\n options,\n `test \"$HOME\" = ${quote(options.home)} && node -e 'if(Number(process.versions.node.split(\".\")[0])<24)process.exit(1)' && command -v git setsid tar >/dev/null && mkdir -p ${quote(root)}`,\n ),\n deadlineMs: Math.max(\n 1,\n Math.min(firecrackerDefaults.probeMs, deadline - Date.now()),\n ),\n ...(context.signal ? { signal: context.signal } : {}),\n }).catch((cause) => {\n context.signal?.throwIfAborted();\n return { status: 1, stdout: \"\", stderr: String(cause) };\n });\n if (machine.isClosed())\n throw new OutpostError(\n \"provider\",\n \"Firecracker exited during guest readiness\",\n );\n if (result.status === 0) break;\n if (Date.now() >= deadline)\n throw new OutpostError(\n \"timeout\",\n \"Firecracker guest SSH/prerequisites did not become ready\",\n { stderr: result.stderr },\n );\n await delay(100, undefined, { signal: context.signal });\n }\n } catch (cause) {\n try {\n await release();\n } catch (cleanup) {\n throw new AggregateError(\n [cause, cleanup],\n \"Firecracker acquisition and cleanup failed\",\n );\n }\n throw cause;\n }\n const invoke = firecrackerCommand(runtime);\n const files = firecrackerFiles(runtime);\n const track = <T>(\n operation: (signal: AbortSignal) => Promise<T>,\n signal?: AbortSignal,\n ): Promise<T> => {\n if (closed)\n return Promise.reject(\n new OutpostError(\"provider\", \"Firecracker sandbox is closed\"),\n );\n const pending = operation(\n signal ? AbortSignal.any([signal, stop.signal]) : stop.signal,\n );\n active.add(pending);\n void pending.then(\n () => active.delete(pending),\n () => active.delete(pending),\n );\n return pending;\n };\n return {\n root,\n home: options.home,\n invoke: (command) =>\n track((signal) => invoke({ ...command, signal }), command.signal),\n upload: (source, destination, options = {}) =>\n track(\n (signal) =>\n files.upload(source, destination, { ...options, signal }),\n options.signal,\n ),\n download: (source, destination, options = {}) =>\n track(\n (signal) =>\n files.download(source, destination, { ...options, signal }),\n options.signal,\n ),\n release,\n };\n },\n };\n}\n"]}
@@ -1,3 +1,3 @@
1
1
  import type { SandboxProvider } from "../domain/sandbox.types.ts";
2
2
  import type { LocalOptions } from "./local.types.ts";
3
- export declare function local(options?: LocalOptions): SandboxProvider;
3
+ export declare function localSandboxProvider(options?: LocalOptions): SandboxProvider;