@elie-laloum/outpost 5.0.0 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (647) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/README.md +11 -11
  3. package/SECURITY.md +10 -0
  4. package/dist/adapters/agents/antigravity-adapter.d.ts +3 -0
  5. package/dist/adapters/agents/antigravity-adapter.js +41 -0
  6. package/dist/adapters/agents/antigravity-adapter.js.map +1 -0
  7. package/dist/adapters/agents/antigravity-authentication.d.ts +2 -0
  8. package/dist/adapters/agents/antigravity-authentication.js +27 -0
  9. package/dist/adapters/agents/antigravity-authentication.js.map +1 -0
  10. package/dist/adapters/agents/antigravity-diagnostics.d.ts +1 -0
  11. package/dist/adapters/agents/antigravity-diagnostics.js +6 -0
  12. package/dist/adapters/agents/antigravity-diagnostics.js.map +1 -0
  13. package/dist/adapters/agents/antigravity-events.d.ts +2 -0
  14. package/dist/adapters/agents/antigravity-events.js +75 -0
  15. package/dist/adapters/agents/antigravity-events.js.map +1 -0
  16. package/dist/adapters/agents/antigravity-request.d.ts +5 -0
  17. package/dist/adapters/agents/antigravity-request.js +37 -0
  18. package/dist/adapters/agents/antigravity-request.js.map +1 -0
  19. package/dist/adapters/agents/antigravity.constants.d.ts +3 -0
  20. package/dist/adapters/agents/antigravity.constants.js +4 -0
  21. package/dist/adapters/agents/antigravity.constants.js.map +1 -0
  22. package/dist/adapters/agents/{gemini.types.d.ts → antigravity.types.d.ts} +2 -2
  23. package/dist/adapters/agents/antigravity.types.js +2 -0
  24. package/dist/adapters/agents/antigravity.types.js.map +1 -0
  25. package/dist/adapters/agents/authentication.constants.d.ts +19 -9
  26. package/dist/adapters/agents/authentication.constants.js +12 -9
  27. package/dist/adapters/agents/authentication.constants.js.map +1 -1
  28. package/dist/adapters/agents/authentication.d.ts +11 -2
  29. package/dist/adapters/agents/authentication.js +70 -47
  30. package/dist/adapters/agents/authentication.js.map +1 -1
  31. package/dist/adapters/agents/authentication.types.d.ts +20 -0
  32. package/dist/adapters/agents/authentication.types.js +2 -0
  33. package/dist/adapters/agents/authentication.types.js.map +1 -0
  34. package/dist/adapters/agents/claude-adapter.js +4 -2
  35. package/dist/adapters/agents/claude-adapter.js.map +1 -1
  36. package/dist/adapters/agents/claude-authentication.d.ts +2 -0
  37. package/dist/adapters/agents/claude-authentication.js +34 -0
  38. package/dist/adapters/agents/claude-authentication.js.map +1 -0
  39. package/dist/adapters/agents/claude-events.js +52 -9
  40. package/dist/adapters/agents/claude-events.js.map +1 -1
  41. package/dist/adapters/agents/claude-request.js +2 -0
  42. package/dist/adapters/agents/claude-request.js.map +1 -1
  43. package/dist/adapters/agents/cli-diagnostics.constants.d.ts +6 -6
  44. package/dist/adapters/agents/cli-diagnostics.constants.js +6 -6
  45. package/dist/adapters/agents/cli-diagnostics.constants.js.map +1 -1
  46. package/dist/adapters/agents/cli-diagnostics.d.ts +1 -0
  47. package/dist/adapters/agents/cli-diagnostics.js +18 -0
  48. package/dist/adapters/agents/cli-diagnostics.js.map +1 -1
  49. package/dist/adapters/agents/codex-adapter.js +4 -2
  50. package/dist/adapters/agents/codex-adapter.js.map +1 -1
  51. package/dist/adapters/agents/codex-authentication.d.ts +3 -0
  52. package/dist/adapters/agents/codex-authentication.js +47 -0
  53. package/dist/adapters/agents/codex-authentication.js.map +1 -0
  54. package/dist/adapters/agents/codex-events.js +28 -2
  55. package/dist/adapters/agents/codex-events.js.map +1 -1
  56. package/dist/adapters/agents/copilot-adapter.d.ts +3 -0
  57. package/dist/adapters/agents/copilot-adapter.js +45 -0
  58. package/dist/adapters/agents/copilot-adapter.js.map +1 -0
  59. package/dist/adapters/agents/copilot-authentication.d.ts +2 -0
  60. package/dist/adapters/agents/copilot-authentication.js +46 -0
  61. package/dist/adapters/agents/copilot-authentication.js.map +1 -0
  62. package/dist/adapters/agents/copilot-diagnostics.d.ts +1 -0
  63. package/dist/adapters/agents/copilot-diagnostics.js +6 -0
  64. package/dist/adapters/agents/copilot-diagnostics.js.map +1 -0
  65. package/dist/adapters/agents/copilot-events.d.ts +2 -0
  66. package/dist/adapters/agents/copilot-events.js +66 -0
  67. package/dist/adapters/agents/copilot-events.js.map +1 -0
  68. package/dist/adapters/agents/copilot-request.d.ts +5 -0
  69. package/dist/adapters/agents/copilot-request.js +24 -0
  70. package/dist/adapters/agents/copilot-request.js.map +1 -0
  71. package/dist/adapters/agents/copilot-usage.d.ts +3 -0
  72. package/dist/adapters/agents/copilot-usage.js +19 -0
  73. package/dist/adapters/agents/copilot-usage.js.map +1 -0
  74. package/dist/adapters/agents/copilot.types.d.ts +6 -0
  75. package/dist/adapters/agents/copilot.types.js +2 -0
  76. package/dist/adapters/agents/copilot.types.js.map +1 -0
  77. package/dist/adapters/agents/event-decoder.d.ts +2 -2
  78. package/dist/adapters/agents/event-decoder.js +6 -5
  79. package/dist/adapters/agents/event-decoder.js.map +1 -1
  80. package/dist/adapters/agents/kimi-adapter.d.ts +3 -0
  81. package/dist/adapters/agents/kimi-adapter.js +51 -0
  82. package/dist/adapters/agents/kimi-adapter.js.map +1 -0
  83. package/dist/adapters/agents/kimi-authentication.d.ts +3 -0
  84. package/dist/adapters/agents/kimi-authentication.js +63 -0
  85. package/dist/adapters/agents/kimi-authentication.js.map +1 -0
  86. package/dist/adapters/agents/kimi-diagnostics.d.ts +2 -0
  87. package/dist/adapters/agents/kimi-diagnostics.js +14 -0
  88. package/dist/adapters/agents/kimi-diagnostics.js.map +1 -0
  89. package/dist/adapters/agents/kimi-events.d.ts +2 -0
  90. package/dist/adapters/agents/kimi-events.js +55 -0
  91. package/dist/adapters/agents/kimi-events.js.map +1 -0
  92. package/dist/adapters/agents/kimi-fork.d.ts +2 -0
  93. package/dist/adapters/agents/kimi-fork.js +11 -0
  94. package/dist/adapters/agents/kimi-fork.js.map +1 -0
  95. package/dist/adapters/agents/{gemini-request.d.ts → kimi-request.d.ts} +2 -2
  96. package/dist/adapters/agents/kimi-request.js +33 -0
  97. package/dist/adapters/agents/kimi-request.js.map +1 -0
  98. package/dist/adapters/agents/kimi-usage.d.ts +2 -0
  99. package/dist/adapters/agents/kimi-usage.js +7 -0
  100. package/dist/adapters/agents/kimi-usage.js.map +1 -0
  101. package/dist/adapters/agents/kimi.constants.d.ts +13 -0
  102. package/dist/adapters/agents/kimi.constants.js +14 -0
  103. package/dist/adapters/agents/kimi.constants.js.map +1 -0
  104. package/dist/adapters/agents/kimi.types.d.ts +7 -0
  105. package/dist/adapters/agents/kimi.types.js +2 -0
  106. package/dist/adapters/agents/kimi.types.js.map +1 -0
  107. package/dist/adapters/agents/model-support.constants.d.ts +3 -1
  108. package/dist/adapters/agents/model-support.constants.js +12 -2
  109. package/dist/adapters/agents/model-support.constants.js.map +1 -1
  110. package/dist/adapters/agents/protocol-fixtures.constants.d.ts +2 -2
  111. package/dist/adapters/agents/protocol-fixtures.constants.js +131 -9
  112. package/dist/adapters/agents/protocol-fixtures.constants.js.map +1 -1
  113. package/dist/adapters/agents/protocol-fixtures.types.d.ts +1 -0
  114. package/dist/adapters/agents/protocol-fixtures.types.js.map +1 -1
  115. package/dist/adapters/agents/protocol.d.ts +1 -0
  116. package/dist/adapters/agents/protocol.js +9 -0
  117. package/dist/adapters/agents/protocol.js.map +1 -1
  118. package/dist/adapters/agents/session-usage.constants.d.ts +10 -0
  119. package/dist/adapters/agents/session-usage.constants.js +110 -0
  120. package/dist/adapters/agents/session-usage.constants.js.map +1 -0
  121. package/dist/adapters/agents/session-usage.d.ts +5 -0
  122. package/dist/adapters/agents/session-usage.js +45 -0
  123. package/dist/adapters/agents/session-usage.js.map +1 -0
  124. package/dist/adapters/agents/settings.types.d.ts +1 -0
  125. package/dist/adapters/agents/settings.types.js.map +1 -1
  126. package/dist/adapters/agents/tool-result.d.ts +2 -0
  127. package/dist/adapters/agents/tool-result.js +17 -0
  128. package/dist/adapters/agents/tool-result.js.map +1 -0
  129. package/dist/adapters/models/anthropic-response.js +3 -0
  130. package/dist/adapters/models/anthropic-response.js.map +1 -1
  131. package/dist/adapters/models/http-provider.js +6 -1
  132. package/dist/adapters/models/http-provider.js.map +1 -1
  133. package/dist/adapters/models/openai-responses.js +10 -0
  134. package/dist/adapters/models/openai-responses.js.map +1 -1
  135. package/dist/adapters/models/retry-after.d.ts +1 -0
  136. package/dist/adapters/models/retry-after.js +16 -0
  137. package/dist/adapters/models/retry-after.js.map +1 -0
  138. package/dist/application/activity-watchdog.js +1 -2
  139. package/dist/application/activity-watchdog.js.map +1 -1
  140. package/dist/application/agent-authentication.d.ts +4 -0
  141. package/dist/application/agent-authentication.js +32 -0
  142. package/dist/application/agent-authentication.js.map +1 -0
  143. package/dist/application/agent-bootstrap.constants.d.ts +2 -5
  144. package/dist/application/agent-bootstrap.constants.js +27 -4
  145. package/dist/application/agent-bootstrap.constants.js.map +1 -1
  146. package/dist/application/agent-bootstrap.js +39 -12
  147. package/dist/application/agent-bootstrap.js.map +1 -1
  148. package/dist/application/agent-bootstrap.types.d.ts +19 -0
  149. package/dist/application/agent-bootstrap.types.js +2 -0
  150. package/dist/application/agent-bootstrap.types.js.map +1 -0
  151. package/dist/application/agent-output.js +74 -8
  152. package/dist/application/agent-output.js.map +1 -1
  153. package/dist/application/agent-request.d.ts +3 -0
  154. package/dist/application/agent-request.js +11 -0
  155. package/dist/application/agent-request.js.map +1 -0
  156. package/dist/application/agent-turn.js +74 -6
  157. package/dist/application/agent-turn.js.map +1 -1
  158. package/dist/application/agent-usage.d.ts +6 -0
  159. package/dist/application/agent-usage.js +57 -0
  160. package/dist/application/agent-usage.js.map +1 -0
  161. package/dist/application/attach.js +2 -0
  162. package/dist/application/attach.js.map +1 -1
  163. package/dist/application/credential-installer.constants.d.ts +1 -0
  164. package/dist/application/credential-installer.constants.js +22 -0
  165. package/dist/application/credential-installer.constants.js.map +1 -0
  166. package/dist/application/custom-turn.js +44 -49
  167. package/dist/application/custom-turn.js.map +1 -1
  168. package/dist/application/dispatch-observation.d.ts +1 -1
  169. package/dist/application/dispatch-observation.js +141 -21
  170. package/dist/application/dispatch-observation.js.map +1 -1
  171. package/dist/application/dispatch-observation.types.d.ts +2 -0
  172. package/dist/application/dispatch-observation.types.js.map +1 -1
  173. package/dist/application/dispatch-validation.js +2 -0
  174. package/dist/application/dispatch-validation.js.map +1 -1
  175. package/dist/application/dispatch.js +1 -1
  176. package/dist/application/dispatch.js.map +1 -1
  177. package/dist/application/doctor-agent.constants.d.ts +2 -8
  178. package/dist/application/doctor-agent.constants.js +43 -6
  179. package/dist/application/doctor-agent.constants.js.map +1 -1
  180. package/dist/application/doctor-agent.d.ts +2 -1
  181. package/dist/application/doctor-agent.js +15 -3
  182. package/dist/application/doctor-agent.js.map +1 -1
  183. package/dist/application/doctor-image.js +4 -6
  184. package/dist/application/doctor-image.js.map +1 -1
  185. package/dist/application/doctor-protocol.js +6 -11
  186. package/dist/application/doctor-protocol.js.map +1 -1
  187. package/dist/application/doctor-protocol.types.d.ts +1 -1
  188. package/dist/application/doctor-protocol.types.js.map +1 -1
  189. package/dist/application/doctor-sandbox.js +2 -5
  190. package/dist/application/doctor-sandbox.js.map +1 -1
  191. package/dist/application/doctor.js +28 -10
  192. package/dist/application/doctor.js.map +1 -1
  193. package/dist/application/doctor.types.d.ts +10 -1
  194. package/dist/application/doctor.types.js.map +1 -1
  195. package/dist/application/execution.constants.d.ts +2 -0
  196. package/dist/application/execution.constants.js +2 -0
  197. package/dist/application/execution.constants.js.map +1 -1
  198. package/dist/application/execution.types.d.ts +8 -0
  199. package/dist/application/execution.types.js.map +1 -1
  200. package/dist/application/harness-budget.d.ts +3 -0
  201. package/dist/application/harness-budget.js +42 -0
  202. package/dist/application/harness-budget.js.map +1 -0
  203. package/dist/application/harness-budget.types.d.ts +5 -0
  204. package/dist/application/harness-budget.types.js +2 -0
  205. package/dist/application/harness-budget.types.js.map +1 -0
  206. package/dist/application/harness-hooks.js +34 -3
  207. package/dist/application/harness-hooks.js.map +1 -1
  208. package/dist/application/harness-loop.js +52 -24
  209. package/dist/application/harness-loop.js.map +1 -1
  210. package/dist/application/harness-model-provider.d.ts +3 -0
  211. package/dist/application/harness-model-provider.js +49 -0
  212. package/dist/application/harness-model-provider.js.map +1 -0
  213. package/dist/application/harness-model-provider.types.d.ts +10 -0
  214. package/dist/application/harness-model-provider.types.js +2 -0
  215. package/dist/application/harness-model-provider.types.js.map +1 -0
  216. package/dist/application/harness-subagent.d.ts +4 -0
  217. package/dist/application/harness-subagent.js +110 -0
  218. package/dist/application/harness-subagent.js.map +1 -0
  219. package/dist/application/harness.types.d.ts +11 -0
  220. package/dist/application/harness.types.js.map +1 -1
  221. package/dist/application/lifecycle-hooks.d.ts +1 -1
  222. package/dist/application/lifecycle-hooks.js +5 -4
  223. package/dist/application/lifecycle-hooks.js.map +1 -1
  224. package/dist/application/observed-lease.d.ts +3 -0
  225. package/dist/application/observed-lease.js +26 -0
  226. package/dist/application/observed-lease.js.map +1 -0
  227. package/dist/application/outpost.types.d.ts +3 -1
  228. package/dist/application/outpost.types.js.map +1 -1
  229. package/dist/application/output-lines.d.ts +4 -0
  230. package/dist/application/output-lines.js +28 -0
  231. package/dist/application/output-lines.js.map +1 -0
  232. package/dist/application/queue-worker.js +1 -1
  233. package/dist/application/queue-worker.js.map +1 -1
  234. package/dist/application/queue-worker.types.d.ts +1 -0
  235. package/dist/application/queue-worker.types.js.map +1 -1
  236. package/dist/application/queued-task.js +24 -5
  237. package/dist/application/queued-task.js.map +1 -1
  238. package/dist/application/recovery-archive.d.ts +3 -2
  239. package/dist/application/recovery-archive.js +9 -2
  240. package/dist/application/recovery-archive.js.map +1 -1
  241. package/dist/application/recovery-restore.d.ts +3 -2
  242. package/dist/application/recovery-restore.js +9 -2
  243. package/dist/application/recovery-restore.js.map +1 -1
  244. package/dist/application/recovery-retention.d.ts +3 -2
  245. package/dist/application/recovery-retention.js +74 -26
  246. package/dist/application/recovery-retention.js.map +1 -1
  247. package/dist/application/remote-workspace.js +5 -4
  248. package/dist/application/remote-workspace.js.map +1 -1
  249. package/dist/application/remote-workspace.types.d.ts +1 -0
  250. package/dist/application/remote-workspace.types.js.map +1 -1
  251. package/dist/application/sandbox-agents.js +19 -19
  252. package/dist/application/sandbox-agents.js.map +1 -1
  253. package/dist/application/sandbox-attach.js +12 -3
  254. package/dist/application/sandbox-attach.js.map +1 -1
  255. package/dist/application/sandbox-dispatch.js +13 -27
  256. package/dist/application/sandbox-dispatch.js.map +1 -1
  257. package/dist/application/sandbox-provision.js +15 -9
  258. package/dist/application/sandbox-provision.js.map +1 -1
  259. package/dist/application/sandbox-session.types.d.ts +7 -2
  260. package/dist/application/sandbox-session.types.js.map +1 -1
  261. package/dist/application/sandbox.js +13 -6
  262. package/dist/application/sandbox.js.map +1 -1
  263. package/dist/application/speculation-checkpoint.d.ts +6 -0
  264. package/dist/application/speculation-checkpoint.js +206 -0
  265. package/dist/application/speculation-checkpoint.js.map +1 -0
  266. package/dist/application/speculation-checkpoint.types.d.ts +24 -0
  267. package/dist/application/speculation-checkpoint.types.js +2 -0
  268. package/dist/application/speculation-checkpoint.types.js.map +1 -0
  269. package/dist/application/speculation-integration.constants.d.ts +4 -0
  270. package/dist/application/speculation-integration.constants.js +5 -0
  271. package/dist/application/speculation-integration.constants.js.map +1 -0
  272. package/dist/application/speculation-integration.d.ts +2 -0
  273. package/dist/application/speculation-integration.js +67 -0
  274. package/dist/application/speculation-integration.js.map +1 -0
  275. package/dist/application/speculation-resume.d.ts +4 -0
  276. package/dist/application/speculation-resume.js +71 -0
  277. package/dist/application/speculation-resume.js.map +1 -0
  278. package/dist/application/speculation-run.d.ts +4 -0
  279. package/dist/application/speculation-run.js +320 -0
  280. package/dist/application/speculation-run.js.map +1 -0
  281. package/dist/application/speculation-timeout.d.ts +1 -0
  282. package/dist/application/speculation-timeout.js +15 -0
  283. package/dist/application/speculation-timeout.js.map +1 -0
  284. package/dist/application/speculation.constants.d.ts +1 -0
  285. package/dist/application/speculation.constants.js +5 -1
  286. package/dist/application/speculation.constants.js.map +1 -1
  287. package/dist/application/speculation.js +41 -149
  288. package/dist/application/speculation.js.map +1 -1
  289. package/dist/application/speculation.types.d.ts +23 -0
  290. package/dist/application/speculation.types.js.map +1 -1
  291. package/dist/application/startup-recovery.js +14 -1
  292. package/dist/application/startup-recovery.js.map +1 -1
  293. package/dist/application/startup-recovery.types.d.ts +1 -0
  294. package/dist/application/startup-recovery.types.js.map +1 -1
  295. package/dist/application/stop-reason.d.ts +2 -0
  296. package/dist/application/stop-reason.js +21 -0
  297. package/dist/application/stop-reason.js.map +1 -0
  298. package/dist/application/stop-reason.types.d.ts +4 -0
  299. package/dist/application/stop-reason.types.js +2 -0
  300. package/dist/application/stop-reason.types.js.map +1 -0
  301. package/dist/application/storage-reservation.js +9 -2
  302. package/dist/application/storage-reservation.js.map +1 -1
  303. package/dist/application/task-observation.d.ts +3 -0
  304. package/dist/application/task-observation.js +22 -0
  305. package/dist/application/task-observation.js.map +1 -0
  306. package/dist/application/task-usage.js +5 -12
  307. package/dist/application/task-usage.js.map +1 -1
  308. package/dist/application/tasks.js +41 -16
  309. package/dist/application/tasks.js.map +1 -1
  310. package/dist/application/tool-execution.js +42 -19
  311. package/dist/application/tool-execution.js.map +1 -1
  312. package/dist/application/workspace.js +6 -4
  313. package/dist/application/workspace.js.map +1 -1
  314. package/dist/cli/doctor-command.js +6 -2
  315. package/dist/cli/doctor-command.js.map +1 -1
  316. package/dist/cli/init-authentication.d.ts +4 -1
  317. package/dist/cli/init-authentication.js +28 -33
  318. package/dist/cli/init-authentication.js.map +1 -1
  319. package/dist/cli/init-command.js +3 -3
  320. package/dist/cli/init-command.js.map +1 -1
  321. package/dist/cli/main.constants.d.ts +50 -13
  322. package/dist/cli/main.constants.js +70 -8
  323. package/dist/cli/main.constants.js.map +1 -1
  324. package/dist/cli/main.js +2 -1
  325. package/dist/cli/main.js.map +1 -1
  326. package/dist/cli/scaffold-files.js +1 -1
  327. package/dist/cli/scaffold-files.js.map +1 -1
  328. package/dist/cli/scaffold-validation.js +29 -22
  329. package/dist/cli/scaffold-validation.js.map +1 -1
  330. package/dist/cli/scaffold.constants.d.ts +0 -1
  331. package/dist/cli/scaffold.constants.js +6 -2
  332. package/dist/cli/scaffold.constants.js.map +1 -1
  333. package/dist/cli/scaffold.types.d.ts +8 -2
  334. package/dist/cli/scaffold.types.js.map +1 -1
  335. package/dist/cli/starters.js +1 -3
  336. package/dist/cli/starters.js.map +1 -1
  337. package/dist/domain/agent-observation.d.ts +4 -0
  338. package/dist/domain/agent-observation.js +27 -0
  339. package/dist/domain/agent-observation.js.map +1 -0
  340. package/dist/domain/agent.types.d.ts +122 -14
  341. package/dist/domain/agent.types.js.map +1 -1
  342. package/dist/domain/authentication.constants.d.ts +3 -0
  343. package/dist/domain/authentication.constants.js +11 -0
  344. package/dist/domain/authentication.constants.js.map +1 -0
  345. package/dist/domain/authentication.d.ts +3 -0
  346. package/dist/domain/authentication.js +22 -0
  347. package/dist/domain/authentication.js.map +1 -0
  348. package/dist/domain/authentication.types.d.ts +5 -0
  349. package/dist/domain/authentication.types.js +2 -0
  350. package/dist/domain/authentication.types.js.map +1 -0
  351. package/dist/domain/harness.d.ts +2 -2
  352. package/dist/domain/harness.js +6 -0
  353. package/dist/domain/harness.js.map +1 -1
  354. package/dist/domain/harness.types.d.ts +4 -3
  355. package/dist/domain/harness.types.js.map +1 -1
  356. package/dist/domain/model.types.d.ts +8 -0
  357. package/dist/domain/model.types.js.map +1 -1
  358. package/dist/domain/observation.constants.d.ts +8 -0
  359. package/dist/domain/observation.constants.js +9 -0
  360. package/dist/domain/observation.constants.js.map +1 -0
  361. package/dist/domain/observation.d.ts +2 -0
  362. package/dist/domain/observation.js +190 -0
  363. package/dist/domain/observation.js.map +1 -0
  364. package/dist/domain/observation.types.d.ts +84 -0
  365. package/dist/domain/observation.types.js +2 -0
  366. package/dist/domain/observation.types.js.map +1 -0
  367. package/dist/domain/observed-operation.d.ts +2 -0
  368. package/dist/domain/observed-operation.js +30 -0
  369. package/dist/domain/observed-operation.js.map +1 -0
  370. package/dist/domain/sandbox.types.d.ts +2 -0
  371. package/dist/domain/sandbox.types.js.map +1 -1
  372. package/dist/domain/subagent.constants.d.ts +13 -0
  373. package/dist/domain/subagent.constants.js +9 -0
  374. package/dist/domain/subagent.constants.js.map +1 -0
  375. package/dist/domain/subagent.d.ts +4 -0
  376. package/dist/domain/subagent.js +28 -0
  377. package/dist/domain/subagent.js.map +1 -0
  378. package/dist/domain/subagent.types.d.ts +13 -0
  379. package/dist/domain/subagent.types.js +2 -0
  380. package/dist/domain/subagent.types.js.map +1 -0
  381. package/dist/domain/transcript.types.d.ts +2 -0
  382. package/dist/domain/transcript.types.js.map +1 -1
  383. package/dist/domain/usage.d.ts +1 -0
  384. package/dist/domain/usage.js +16 -0
  385. package/dist/domain/usage.js.map +1 -1
  386. package/dist/domain/workflow/budget.d.ts +7 -3
  387. package/dist/domain/workflow/budget.js +26 -0
  388. package/dist/domain/workflow/budget.js.map +1 -1
  389. package/dist/domain/workflow/budget.types.d.ts +1 -1
  390. package/dist/domain/workflow/budget.types.js.map +1 -1
  391. package/dist/domain/workflow/checkpoint-validation.js +7 -1
  392. package/dist/domain/workflow/checkpoint-validation.js.map +1 -1
  393. package/dist/domain/workflow/checkpoint.js +3 -0
  394. package/dist/domain/workflow/checkpoint.js.map +1 -1
  395. package/dist/domain/workflow/gate-validation.js +14 -1
  396. package/dist/domain/workflow/gate-validation.js.map +1 -1
  397. package/dist/domain/workflow/gates.d.ts +1 -1
  398. package/dist/domain/workflow/gates.js +52 -4
  399. package/dist/domain/workflow/gates.js.map +1 -1
  400. package/dist/domain/workflow/gates.types.d.ts +15 -1
  401. package/dist/domain/workflow/gates.types.js.map +1 -1
  402. package/dist/domain/workflow/idempotency.d.ts +1 -0
  403. package/dist/domain/workflow/idempotency.js +7 -0
  404. package/dist/domain/workflow/idempotency.js.map +1 -0
  405. package/dist/domain/workflow/retry.constants.d.ts +2 -0
  406. package/dist/domain/workflow/retry.constants.js +3 -0
  407. package/dist/domain/workflow/retry.constants.js.map +1 -0
  408. package/dist/domain/workflow/retry.d.ts +4 -0
  409. package/dist/domain/workflow/retry.js +49 -0
  410. package/dist/domain/workflow/retry.js.map +1 -0
  411. package/dist/domain/workflow/task-runner.js +9 -5
  412. package/dist/domain/workflow/task-runner.js.map +1 -1
  413. package/dist/domain/workflow/task.js +6 -6
  414. package/dist/domain/workflow/task.js.map +1 -1
  415. package/dist/domain/workflow/workflow-scheduler.js +110 -72
  416. package/dist/domain/workflow/workflow-scheduler.js.map +1 -1
  417. package/dist/domain/workflow/workflow-state.js +28 -12
  418. package/dist/domain/workflow/workflow-state.js.map +1 -1
  419. package/dist/domain/workflow.d.ts +1 -1
  420. package/dist/domain/workflow.js +1 -1
  421. package/dist/domain/workflow.js.map +1 -1
  422. package/dist/domain/workflow.types.d.ts +13 -2
  423. package/dist/domain/workflow.types.js.map +1 -1
  424. package/dist/index.d.ts +16 -11
  425. package/dist/index.js +7 -4
  426. package/dist/index.js.map +1 -1
  427. package/dist/infrastructure/conversations/capture.js +10 -0
  428. package/dist/infrastructure/conversations/capture.js.map +1 -1
  429. package/dist/infrastructure/conversations/harness-transcript.js +6 -0
  430. package/dist/infrastructure/conversations/harness-transcript.js.map +1 -1
  431. package/dist/infrastructure/conversations/harness-transcript.types.d.ts +2 -0
  432. package/dist/infrastructure/conversations/harness-transcript.types.js.map +1 -1
  433. package/dist/infrastructure/conversations/layout.js +2 -0
  434. package/dist/infrastructure/conversations/layout.js.map +1 -1
  435. package/dist/infrastructure/conversations/locate.js +7 -1
  436. package/dist/infrastructure/conversations/locate.js.map +1 -1
  437. package/dist/infrastructure/conversations/native-store.js +8 -1
  438. package/dist/infrastructure/conversations/native-store.js.map +1 -1
  439. package/dist/infrastructure/conversations/paths.js +3 -0
  440. package/dist/infrastructure/conversations/paths.js.map +1 -1
  441. package/dist/infrastructure/conversations/restore.js +7 -0
  442. package/dist/infrastructure/conversations/restore.js.map +1 -1
  443. package/dist/infrastructure/conversations/session-bundle.constants.d.ts +5 -0
  444. package/dist/infrastructure/conversations/session-bundle.constants.js +173 -0
  445. package/dist/infrastructure/conversations/session-bundle.constants.js.map +1 -0
  446. package/dist/infrastructure/conversations/session-bundle.d.ts +6 -0
  447. package/dist/infrastructure/conversations/session-bundle.js +98 -0
  448. package/dist/infrastructure/conversations/session-bundle.js.map +1 -0
  449. package/dist/infrastructure/conversations/session-bundle.types.d.ts +1 -0
  450. package/dist/infrastructure/conversations/session-bundle.types.js +2 -0
  451. package/dist/infrastructure/conversations/session-bundle.types.js.map +1 -0
  452. package/dist/infrastructure/conversations.js +4 -2
  453. package/dist/infrastructure/conversations.js.map +1 -1
  454. package/dist/infrastructure/conversations.types.d.ts +1 -1
  455. package/dist/infrastructure/conversations.types.js.map +1 -1
  456. package/dist/infrastructure/custom-reporter.js +32 -24
  457. package/dist/infrastructure/custom-reporter.js.map +1 -1
  458. package/dist/infrastructure/custom-reporter.types.d.ts +2 -0
  459. package/dist/infrastructure/custom-reporter.types.js.map +1 -1
  460. package/dist/infrastructure/git/git.constants.d.ts +1 -1
  461. package/dist/infrastructure/git/git.constants.js +1 -0
  462. package/dist/infrastructure/git/git.constants.js.map +1 -1
  463. package/dist/infrastructure/git/workspace-lease.js +4 -3
  464. package/dist/infrastructure/git/workspace-lease.js.map +1 -1
  465. package/dist/infrastructure/git/workspace.js +7 -6
  466. package/dist/infrastructure/git/workspace.js.map +1 -1
  467. package/dist/infrastructure/git/workspace.types.d.ts +1 -0
  468. package/dist/infrastructure/git/workspace.types.js.map +1 -1
  469. package/dist/infrastructure/host-credentials.constants.d.ts +1 -0
  470. package/dist/infrastructure/host-credentials.constants.js +2 -0
  471. package/dist/infrastructure/host-credentials.constants.js.map +1 -0
  472. package/dist/infrastructure/host-credentials.d.ts +4 -0
  473. package/dist/infrastructure/host-credentials.js +89 -0
  474. package/dist/infrastructure/host-credentials.js.map +1 -0
  475. package/dist/infrastructure/inspection-path.js +4 -3
  476. package/dist/infrastructure/inspection-path.js.map +1 -1
  477. package/dist/infrastructure/journal.constants.js +10 -1
  478. package/dist/infrastructure/journal.constants.js.map +1 -1
  479. package/dist/infrastructure/journal.d.ts +1 -1
  480. package/dist/infrastructure/journal.js +8 -75
  481. package/dist/infrastructure/journal.js.map +1 -1
  482. package/dist/infrastructure/journal.types.d.ts +2 -4
  483. package/dist/infrastructure/journal.types.js.map +1 -1
  484. package/dist/infrastructure/local-transport.js +9 -4
  485. package/dist/infrastructure/local-transport.js.map +1 -1
  486. package/dist/infrastructure/opentelemetry-dispatch.d.ts +3 -3
  487. package/dist/infrastructure/opentelemetry-dispatch.js +5 -4
  488. package/dist/infrastructure/opentelemetry-dispatch.js.map +1 -1
  489. package/dist/infrastructure/opentelemetry-observation.d.ts +5 -0
  490. package/dist/infrastructure/opentelemetry-observation.js +59 -0
  491. package/dist/infrastructure/opentelemetry-observation.js.map +1 -0
  492. package/dist/infrastructure/opentelemetry.js +15 -1
  493. package/dist/infrastructure/opentelemetry.js.map +1 -1
  494. package/dist/infrastructure/opentelemetry.types.d.ts +9 -1
  495. package/dist/infrastructure/opentelemetry.types.js.map +1 -1
  496. package/dist/infrastructure/reporter.d.ts +2 -2
  497. package/dist/infrastructure/reporter.js +5 -1
  498. package/dist/infrastructure/reporter.js.map +1 -1
  499. package/dist/infrastructure/repository-transport.constants.d.ts +1 -0
  500. package/dist/infrastructure/repository-transport.constants.js +2 -0
  501. package/dist/infrastructure/repository-transport.constants.js.map +1 -0
  502. package/dist/infrastructure/repository-transport.d.ts +2 -0
  503. package/dist/infrastructure/repository-transport.js +9 -0
  504. package/dist/infrastructure/repository-transport.js.map +1 -0
  505. package/dist/infrastructure/resource-activity-inspection.js +19 -24
  506. package/dist/infrastructure/resource-activity-inspection.js.map +1 -1
  507. package/dist/infrastructure/resource-activity.constants.d.ts +0 -1
  508. package/dist/infrastructure/resource-activity.constants.js +0 -1
  509. package/dist/infrastructure/resource-activity.constants.js.map +1 -1
  510. package/dist/infrastructure/resource-activity.js +20 -83
  511. package/dist/infrastructure/resource-activity.js.map +1 -1
  512. package/dist/infrastructure/s3-transport.constants.d.ts +2 -0
  513. package/dist/infrastructure/s3-transport.constants.js +3 -0
  514. package/dist/infrastructure/s3-transport.constants.js.map +1 -0
  515. package/dist/infrastructure/s3-transport.js +57 -3
  516. package/dist/infrastructure/s3-transport.js.map +1 -1
  517. package/dist/infrastructure/s3-transport.types.d.ts +1 -0
  518. package/dist/infrastructure/s3-transport.types.js.map +1 -1
  519. package/dist/infrastructure/speculation-store.constants.d.ts +3 -0
  520. package/dist/infrastructure/speculation-store.constants.js +2 -0
  521. package/dist/infrastructure/speculation-store.constants.js.map +1 -0
  522. package/dist/infrastructure/speculation-store.d.ts +4 -0
  523. package/dist/infrastructure/speculation-store.js +73 -0
  524. package/dist/infrastructure/speculation-store.js.map +1 -0
  525. package/dist/infrastructure/speculation-store.types.d.ts +12 -0
  526. package/dist/infrastructure/speculation-store.types.js +2 -0
  527. package/dist/infrastructure/speculation-store.types.js.map +1 -0
  528. package/dist/infrastructure/storage-inventory.constants.js +1 -0
  529. package/dist/infrastructure/storage-inventory.constants.js.map +1 -1
  530. package/dist/infrastructure/storage-inventory.types.d.ts +1 -1
  531. package/dist/infrastructure/storage-inventory.types.js.map +1 -1
  532. package/dist/infrastructure/storage-reservations.types.d.ts +0 -8
  533. package/dist/infrastructure/storage-reservations.types.js.map +1 -1
  534. package/dist/infrastructure/task-queue-bullmq-resources.js +3 -0
  535. package/dist/infrastructure/task-queue-bullmq-resources.js.map +1 -1
  536. package/dist/infrastructure/task-queue-http.js +29 -4
  537. package/dist/infrastructure/task-queue-http.js.map +1 -1
  538. package/dist/infrastructure/task-queue-http.types.d.ts +2 -2
  539. package/dist/infrastructure/task-queue-http.types.js.map +1 -1
  540. package/dist/infrastructure/transport-conversations.js +2 -0
  541. package/dist/infrastructure/transport-conversations.js.map +1 -1
  542. package/dist/infrastructure/transport-journal.d.ts +1 -1
  543. package/dist/infrastructure/transport-journal.js +8 -2
  544. package/dist/infrastructure/transport-journal.js.map +1 -1
  545. package/dist/infrastructure/transport-reservations.d.ts +1 -1
  546. package/dist/infrastructure/transport-reservations.js +14 -8
  547. package/dist/infrastructure/transport-reservations.js.map +1 -1
  548. package/dist/infrastructure/workflow-decision-signature.constants.d.ts +4 -0
  549. package/dist/infrastructure/workflow-decision-signature.constants.js +5 -0
  550. package/dist/infrastructure/workflow-decision-signature.constants.js.map +1 -0
  551. package/dist/infrastructure/workflow-decision-signature.d.ts +4 -0
  552. package/dist/infrastructure/workflow-decision-signature.js +83 -0
  553. package/dist/infrastructure/workflow-decision-signature.js.map +1 -0
  554. package/dist/infrastructure/workflow-decision-signature.types.d.ts +16 -0
  555. package/dist/infrastructure/workflow-decision-signature.types.js +2 -0
  556. package/dist/infrastructure/workflow-decision-signature.types.js.map +1 -0
  557. package/dist/providers/agents.d.ts +7 -2
  558. package/dist/providers/agents.js +4 -1
  559. package/dist/providers/agents.js.map +1 -1
  560. package/dist/providers/antigravity-install.constants.d.ts +2 -0
  561. package/dist/providers/antigravity-install.constants.js +28 -0
  562. package/dist/providers/antigravity-install.constants.js.map +1 -0
  563. package/dist/providers/antigravity-install.d.ts +2 -0
  564. package/dist/providers/antigravity-install.js +29 -0
  565. package/dist/providers/antigravity-install.js.map +1 -0
  566. package/dist/providers/antigravity-install.types.d.ts +4 -0
  567. package/dist/providers/antigravity-install.types.js +2 -0
  568. package/dist/providers/antigravity-install.types.js.map +1 -0
  569. package/dist/providers/container-recovery.d.ts +4 -0
  570. package/dist/providers/container-recovery.js +28 -0
  571. package/dist/providers/container-recovery.js.map +1 -0
  572. package/dist/providers/container.js +8 -0
  573. package/dist/providers/container.js.map +1 -1
  574. package/dist/providers/daytona-network.constants.d.ts +5 -0
  575. package/dist/providers/daytona-network.constants.js +8 -0
  576. package/dist/providers/daytona-network.constants.js.map +1 -0
  577. package/dist/providers/daytona-network.d.ts +4 -0
  578. package/dist/providers/daytona-network.js +33 -0
  579. package/dist/providers/daytona-network.js.map +1 -0
  580. package/dist/providers/daytona.d.ts +1 -0
  581. package/dist/providers/daytona.js +9 -3
  582. package/dist/providers/daytona.js.map +1 -1
  583. package/dist/providers/daytona.types.d.ts +2 -0
  584. package/dist/providers/daytona.types.js.map +1 -1
  585. package/dist/providers/firecracker-command.js +1 -1
  586. package/dist/providers/firecracker-command.js.map +1 -1
  587. package/dist/providers/firecracker-jailer.constants.d.ts +9 -0
  588. package/dist/providers/firecracker-jailer.constants.js +10 -0
  589. package/dist/providers/firecracker-jailer.constants.js.map +1 -0
  590. package/dist/providers/firecracker-jailer.d.ts +4 -0
  591. package/dist/providers/firecracker-jailer.js +171 -0
  592. package/dist/providers/firecracker-jailer.js.map +1 -0
  593. package/dist/providers/firecracker-machine.js +30 -8
  594. package/dist/providers/firecracker-machine.js.map +1 -1
  595. package/dist/providers/firecracker.types.d.ts +16 -0
  596. package/dist/providers/firecracker.types.js.map +1 -1
  597. package/dist/providers/vercel-network.js +1 -1
  598. package/dist/providers/vercel-network.js.map +1 -1
  599. package/dist/providers/vercel.js +6 -3
  600. package/dist/providers/vercel.js.map +1 -1
  601. package/dist/providers/versions.constants.d.ts +3 -1
  602. package/dist/providers/versions.constants.js +3 -1
  603. package/dist/providers/versions.constants.js.map +1 -1
  604. package/package.json +3 -3
  605. package/dist/adapters/agents/gemini-adapter.d.ts +0 -3
  606. package/dist/adapters/agents/gemini-adapter.js +0 -34
  607. package/dist/adapters/agents/gemini-adapter.js.map +0 -1
  608. package/dist/adapters/agents/gemini-diagnostics.d.ts +0 -2
  609. package/dist/adapters/agents/gemini-diagnostics.js +0 -15
  610. package/dist/adapters/agents/gemini-diagnostics.js.map +0 -1
  611. package/dist/adapters/agents/gemini-events.d.ts +0 -2
  612. package/dist/adapters/agents/gemini-events.js +0 -50
  613. package/dist/adapters/agents/gemini-events.js.map +0 -1
  614. package/dist/adapters/agents/gemini-request.js +0 -23
  615. package/dist/adapters/agents/gemini-request.js.map +0 -1
  616. package/dist/adapters/agents/gemini.types.js +0 -2
  617. package/dist/adapters/agents/gemini.types.js.map +0 -1
  618. package/dist/infrastructure/artifact-store.d.ts +0 -3
  619. package/dist/infrastructure/artifact-store.js +0 -110
  620. package/dist/infrastructure/artifact-store.js.map +0 -1
  621. package/dist/infrastructure/artifact-store.types.d.ts +0 -6
  622. package/dist/infrastructure/artifact-store.types.js +0 -2
  623. package/dist/infrastructure/artifact-store.types.js.map +0 -1
  624. package/dist/infrastructure/journal-retention.constants.d.ts +0 -4
  625. package/dist/infrastructure/journal-retention.constants.js +0 -5
  626. package/dist/infrastructure/journal-retention.constants.js.map +0 -1
  627. package/dist/infrastructure/journal-retention.d.ts +0 -2
  628. package/dist/infrastructure/journal-retention.js +0 -51
  629. package/dist/infrastructure/journal-retention.js.map +0 -1
  630. package/dist/infrastructure/storage-mutation-lock.constants.d.ts +0 -5
  631. package/dist/infrastructure/storage-mutation-lock.constants.js +0 -6
  632. package/dist/infrastructure/storage-mutation-lock.constants.js.map +0 -1
  633. package/dist/infrastructure/storage-mutation-lock.d.ts +0 -1
  634. package/dist/infrastructure/storage-mutation-lock.js +0 -21
  635. package/dist/infrastructure/storage-mutation-lock.js.map +0 -1
  636. package/dist/infrastructure/storage-reservations.constants.d.ts +0 -4
  637. package/dist/infrastructure/storage-reservations.constants.js +0 -5
  638. package/dist/infrastructure/storage-reservations.constants.js.map +0 -1
  639. package/dist/infrastructure/storage-reservations.d.ts +0 -2
  640. package/dist/infrastructure/storage-reservations.js +0 -150
  641. package/dist/infrastructure/storage-reservations.js.map +0 -1
  642. package/dist/infrastructure/workflow-checkpoint.d.ts +0 -3
  643. package/dist/infrastructure/workflow-checkpoint.js +0 -84
  644. package/dist/infrastructure/workflow-checkpoint.js.map +0 -1
  645. package/dist/infrastructure/workflow-checkpoint.types.d.ts +0 -6
  646. package/dist/infrastructure/workflow-checkpoint.types.js +0 -2
  647. package/dist/infrastructure/workflow-checkpoint.types.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firecracker-jailer.js","sourceRoot":"","sources":["../../src/providers/firecracker-jailer.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport {\n access,\n chmod,\n chown,\n copyFile,\n lstat,\n mkdir,\n readFile,\n rm,\n rmdir,\n statfs,\n writeFile,\n} from \"node:fs/promises\";\nimport {\n basename,\n dirname,\n isAbsolute,\n join,\n normalize,\n relative,\n} from \"node:path\";\nimport { invariant, OutpostError } from \"../domain/errors.ts\";\nimport type {\n FirecrackerOptions,\n FirecrackerLaunch,\n} from \"./firecracker.types.ts\";\nimport { firecrackerJailerLimits as limits } from \"./firecracker-jailer.constants.ts\";\nimport { firecrackerDefaults } from \"./firecracker.constants.ts\";\n\nexport function validateJailer(options: FirecrackerOptions): void {\n const jailer = options.jailer;\n if (!jailer) return;\n for (const path of [jailer.binary, jailer.directory, jailer.cgroup])\n invariant(\n path.startsWith(\"/\") &&\n !path.includes(\"\\0\") &&\n !path.split(\"/\").includes(\"..\"),\n \"Jailer paths must be absolute without traversal\",\n );\n invariant(\n jailer.cgroup.startsWith(`${limits.cgroupRoot}/`) &&\n relative(limits.cgroupRoot, jailer.cgroup) !== \"\",\n \"Jailer requires a dedicated cgroup v2 parent beneath /sys/fs/cgroup\",\n );\n for (const value of [\n jailer.uid,\n jailer.gid,\n jailer.cpuQuotaUs,\n jailer.memoryMaxMb,\n jailer.processes,\n ])\n invariant(\n Number.isSafeInteger(value) && value > 0,\n \"Jailer identities and resource limits must be positive integers\",\n );\n invariant(\n jailer.cpuQuotaUs >= limits.minimumCpuQuotaUs,\n \"Jailer CPU quota must be at least 1000 microseconds per 100000 microseconds\",\n );\n invariant(\n jailer.memoryMaxMb > (options.memoryMb ?? firecrackerDefaults.memoryMb),\n \"Jailer memory limit must exceed guest memory to allow VMM overhead\",\n );\n invariant(\n Number.isSafeInteger(jailer.memoryMaxMb * limits.bytesPerMiB),\n \"Jailer memory limit is too large\",\n );\n invariant(\n jailer.uid <= limits.maximumIdentity &&\n jailer.gid <= limits.maximumIdentity,\n \"Jailer identities must fit Linux UID/GID limits\",\n );\n invariant(\n jailer.processes >= limits.minimumProcesses,\n \"Jailer process limit must allow at least 16 threads\",\n );\n}\n\nexport async function trustedJailerPath(path: string): Promise<void> {\n invariant(\n isAbsolute(path) && normalize(path) === path,\n \"Jailer paths must be canonical absolute paths\",\n );\n let current = path;\n while (true) {\n const entry = await lstat(current);\n invariant(\n !entry.isSymbolicLink() && entry.uid === 0 && (entry.mode & 0o022) === 0,\n `Jailer path must be root-owned, without symlinks or group/world write access: ${current}`,\n );\n const parent = dirname(current);\n if (parent === current) return;\n current = parent;\n }\n}\n\nexport async function prepareJailer(\n options: FirecrackerOptions,\n directory: string,\n signal?: AbortSignal,\n): Promise<FirecrackerLaunch> {\n const jailer = options.jailer;\n invariant(jailer, \"Jailer configuration is required\");\n invariant(\n process.getuid?.() === 0,\n \"Jailer allocation requires a trusted root supervisor; Outpost never invokes sudo\",\n );\n await Promise.all(\n [\n jailer.binary,\n jailer.directory,\n jailer.cgroup,\n options.binary,\n options.kernel,\n options.rootfs,\n options.ssh.identity,\n options.ssh.knownHosts,\n options.ssh.binary ?? \"/usr/bin/ssh\",\n ].map(trustedJailerPath),\n );\n await access(jailer.binary, constants.X_OK);\n invariant(\n (await statfs(jailer.cgroup)).type === limits.cgroupFilesystem,\n \"Jailer parent must be on cgroup v2\",\n );\n const controllers = (\n await readFile(join(jailer.cgroup, \"cgroup.subtree_control\"), \"utf8\")\n ).split(/\\s+/);\n invariant(\n [\"cpu\", \"memory\", \"pids\"].every((name) => controllers.includes(name)),\n \"Enable cpu, memory and pids controllers in the dedicated jailer parent\",\n );\n const parent = join(jailer.directory, basename(options.binary));\n await mkdir(parent, { recursive: true, mode: 0o700 });\n await trustedJailerPath(parent);\n const id = randomUUID();\n const jail = join(parent, id);\n const root = join(jail, \"root\");\n const cgroup = join(jailer.cgroup, id);\n await mkdir(jail, { mode: 0o700 });\n const cleanup = async () => {\n try {\n const events = await readFile(join(cgroup, \"cgroup.events\"), \"utf8\");\n if (/^populated 1$/m.test(events))\n throw new OutpostError(\n \"provider\",\n `Jailer cgroup is still populated; recovery files retained at ${jail}`,\n );\n await rmdir(cgroup);\n } catch (cause) {\n if (!(\n cause instanceof Error &&\n \"code\" in cause &&\n cause.code === \"ENOENT\"\n ))\n throw cause;\n }\n await rm(jail, { recursive: true, force: true });\n };\n try {\n await mkdir(root, { mode: 0o700 });\n await copyFile(options.kernel, join(root, \"kernel\"));\n await copyFile(\n join(directory, \"rootfs.ext4\"),\n join(root, \"rootfs.ext4\"),\n constants.COPYFILE_FICLONE,\n );\n const config: unknown = JSON.parse(\n await readFile(join(directory, \"config.json\"), \"utf8\"),\n );\n invariant(\n config !== null &&\n typeof config === \"object\" &&\n \"boot-source\" in config &&\n \"drives\" in config,\n \"Invalid Firecracker boot configuration\",\n );\n await writeFile(\n join(root, \"config.json\"),\n JSON.stringify({\n ...config,\n \"boot-source\": {\n kernel_image_path: \"/kernel\",\n boot_args: options.bootArgs,\n },\n drives: [\n {\n drive_id: \"rootfs\",\n path_on_host: \"/rootfs.ext4\",\n is_root_device: true,\n is_read_only: false,\n },\n ],\n }),\n { mode: 0o400 },\n );\n for (const name of [\"kernel\", \"rootfs.ext4\", \"config.json\"]) {\n await chown(join(root, name), jailer.uid, jailer.gid);\n await chmod(join(root, name), name === \"rootfs.ext4\" ? 0o600 : 0o400);\n }\n signal?.throwIfAborted();\n } catch (cause) {\n try {\n await cleanup();\n } catch (cleanupFailure) {\n throw new AggregateError(\n [cause, cleanupFailure],\n `Jailer preparation and cleanup failed; inspect ${jail}`,\n );\n }\n throw cause;\n }\n return {\n binary: jailer.binary,\n arguments: [\n \"--id\",\n id,\n \"--exec-file\",\n options.binary,\n \"--uid\",\n String(jailer.uid),\n \"--gid\",\n String(jailer.gid),\n \"--chroot-base-dir\",\n jailer.directory,\n \"--cgroup-version\",\n \"2\",\n \"--parent-cgroup\",\n relative(limits.cgroupRoot, jailer.cgroup),\n \"--cgroup\",\n `cpu.max=${jailer.cpuQuotaUs} ${limits.cpuPeriodUs}`,\n \"--cgroup\",\n `memory.max=${jailer.memoryMaxMb * limits.bytesPerMiB}`,\n \"--cgroup\",\n \"memory.swap.max=0\",\n \"--cgroup\",\n `pids.max=${jailer.processes}`,\n \"--\",\n \"--api-sock\",\n \"/api.sock\",\n \"--config-file\",\n \"/config.json\",\n ],\n async stop() {\n try {\n await writeFile(join(cgroup, \"cgroup.kill\"), \"1\");\n } catch (cause) {\n if (!(\n cause instanceof Error &&\n \"code\" in cause &&\n cause.code === \"ENOENT\"\n ))\n throw cause;\n }\n },\n cleanup,\n };\n}\n"]}
@@ -7,8 +7,10 @@ import { isAbsolute, join } from "node:path";
7
7
  import { setTimeout as delay } from "node:timers/promises";
8
8
  import { invariant, OutpostError, positive } from "../domain/errors.js";
9
9
  import { registerCleanup } from "../infrastructure/shutdown.js";
10
+ import { prepareJailer, validateJailer } from "./firecracker-jailer.js";
10
11
  import { firecrackerDefaults } from "./firecracker.constants.js";
11
12
  export function validateFirecracker(options) {
13
+ validateJailer(options);
12
14
  invariant(!("egress" in options) || options.egress === undefined, "Firecracker cannot enforce Outpost egress policies; configure host networking explicitly");
13
15
  for (const path of [
14
16
  options.binary,
@@ -96,12 +98,26 @@ export async function firecrackerMachine(options, signal) {
96
98
  catch (cause) {
97
99
  return failedAllocation([directory, lock, transportLock], cause);
98
100
  }
99
- const child = spawn(options.binary, [
100
- "--api-sock",
101
- join(directory, "api.sock"),
102
- "--config-file",
103
- join(directory, "config.json"),
104
- ], { stdio: "ignore" });
101
+ let launch;
102
+ try {
103
+ launch = options.jailer
104
+ ? await prepareJailer(options, directory, signal)
105
+ : {
106
+ binary: options.binary,
107
+ arguments: [
108
+ "--api-sock",
109
+ join(directory, "api.sock"),
110
+ "--config-file",
111
+ join(directory, "config.json"),
112
+ ],
113
+ async stop() { },
114
+ async cleanup() { },
115
+ };
116
+ }
117
+ catch (cause) {
118
+ return failedAllocation([directory, lock, transportLock], cause);
119
+ }
120
+ const child = spawn(launch.binary, launch.arguments, { stdio: "ignore" });
105
121
  let exited = false;
106
122
  const exit = new Promise((resolve) => {
107
123
  child.once("error", () => {
@@ -121,14 +137,20 @@ export async function firecrackerMachine(options, signal) {
121
137
  if (!exited)
122
138
  child.kill("SIGTERM");
123
139
  await Promise.race([exit, delay(200, undefined, { ref: false })]);
124
- if (!exited)
125
- child.kill("SIGKILL");
140
+ try {
141
+ await launch.stop();
142
+ }
143
+ finally {
144
+ if (!exited)
145
+ child.kill("SIGKILL");
146
+ }
126
147
  await Promise.race([
127
148
  exit,
128
149
  delay(firecrackerDefaults.cleanupMs, undefined, { ref: false }),
129
150
  ]);
130
151
  if (!exited)
131
152
  throw new OutpostError("provider", `VM termination uncertain; private disk retained at ${directory}`);
153
+ await launch.cleanup();
132
154
  await rm(directory, { recursive: true, force: true });
133
155
  await rm(lock, { recursive: true, force: true });
134
156
  await rm(transportLock, { recursive: true, force: true });
@@ -1 +1 @@
1
- {"version":3,"file":"firecracker-machine.js","sourceRoot":"","sources":["../../src/providers/firecracker-machine.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { spawn } from \"node:child_process\";\nimport { constants } from \"node:fs\";\nimport {\n access,\n chmod,\n copyFile,\n mkdir,\n mkdtemp,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { isAbsolute, join } from \"node:path\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { invariant, OutpostError, positive } from \"../domain/errors.ts\";\nimport { registerCleanup } from \"../infrastructure/shutdown.ts\";\nimport { firecrackerDefaults } from \"./firecracker.constants.ts\";\nimport type {\n FirecrackerMachine,\n FirecrackerOptions,\n} from \"./firecracker.types.ts\";\n\nexport function validateFirecracker(options: FirecrackerOptions): void {\n invariant(\n !(\"egress\" in options) || options.egress === undefined,\n \"Firecracker cannot enforce Outpost egress policies; configure host networking explicitly\",\n );\n for (const path of [\n options.binary,\n options.kernel,\n options.rootfs,\n options.home,\n options.root ?? firecrackerDefaults.root,\n options.ssh.identity,\n options.ssh.knownHosts,\n ])\n invariant(\n isAbsolute(path) && !path.includes(\"\\0\"),\n \"Firecracker paths must be absolute\",\n );\n invariant(\n /^[a-zA-Z0-9_.-]{1,15}$/.test(options.tap),\n \"Invalid TAP interface\",\n );\n invariant(\n /^([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}$/.test(options.guestMac),\n \"Invalid guest MAC address\",\n );\n invariant(\n /^[a-zA-Z0-9_.:-]+$/.test(options.ssh.host) &&\n !options.ssh.host.startsWith(\"-\"),\n \"Invalid SSH host\",\n );\n invariant(/^[a-zA-Z0-9_-]+$/.test(options.ssh.user), \"Invalid SSH user\");\n for (const value of [\n options.cpus ?? firecrackerDefaults.cpus,\n options.memoryMb ?? firecrackerDefaults.memoryMb,\n options.ssh.port ?? 22,\n ])\n invariant(\n Number.isSafeInteger(value) && value > 0,\n \"Firecracker resource limits and SSH port must be positive integers\",\n );\n positive(\n options.bootDeadlineMs ?? firecrackerDefaults.bootDeadlineMs,\n \"bootDeadlineMs\",\n );\n}\n\nexport async function firecrackerMachine(\n options: FirecrackerOptions,\n signal?: AbortSignal,\n): Promise<FirecrackerMachine> {\n invariant(process.platform === \"linux\", \"Firecracker requires Linux and KVM\");\n signal?.throwIfAborted();\n await access(\"/dev/kvm\", constants.R_OK | constants.W_OK);\n await Promise.all([\n access(options.binary, constants.X_OK),\n access(options.kernel, constants.R_OK),\n access(options.rootfs, constants.R_OK),\n access(options.ssh.identity, constants.R_OK),\n access(options.ssh.knownHosts, constants.R_OK),\n ]);\n const lock = join(tmpdir(), `outpost-firecracker-tap-${options.tap}.lock`);\n await mkdir(lock, { mode: 0o700 });\n const endpoint = createHash(\"sha256\")\n .update(`${options.ssh.host}:${options.ssh.port ?? 22}`)\n .digest(\"hex\");\n const transportLock = join(\n tmpdir(),\n `outpost-firecracker-ssh-${endpoint}.lock`,\n );\n try {\n await mkdir(transportLock, { mode: 0o700 });\n } catch (cause) {\n return failedAllocation([lock], cause);\n }\n let directory: string;\n try {\n directory = await mkdtemp(join(tmpdir(), \"outpost-firecracker-\"));\n } catch (cause) {\n return failedAllocation([lock, transportLock], cause);\n }\n try {\n await copyFile(\n options.rootfs,\n join(directory, \"rootfs.ext4\"),\n constants.COPYFILE_FICLONE,\n );\n await chmod(join(directory, \"rootfs.ext4\"), 0o600);\n signal?.throwIfAborted();\n await writeFile(\n join(directory, \"config.json\"),\n JSON.stringify({\n \"boot-source\": {\n kernel_image_path: options.kernel,\n boot_args: options.bootArgs,\n },\n drives: [\n {\n drive_id: \"rootfs\",\n path_on_host: join(directory, \"rootfs.ext4\"),\n is_root_device: true,\n is_read_only: false,\n },\n ],\n \"machine-config\": {\n vcpu_count: options.cpus ?? firecrackerDefaults.cpus,\n mem_size_mib: options.memoryMb ?? firecrackerDefaults.memoryMb,\n },\n \"network-interfaces\": [\n {\n iface_id: \"net1\",\n guest_mac: options.guestMac,\n host_dev_name: options.tap,\n },\n ],\n }),\n { mode: 0o600 },\n );\n } catch (cause) {\n return failedAllocation([directory, lock, transportLock], cause);\n }\n const child = spawn(\n options.binary,\n [\n \"--api-sock\",\n join(directory, \"api.sock\"),\n \"--config-file\",\n join(directory, \"config.json\"),\n ],\n { stdio: \"ignore\" },\n );\n let exited = false;\n const exit = new Promise<void>((resolve) => {\n child.once(\"error\", () => {\n exited = true;\n resolve();\n });\n child.once(\"exit\", () => {\n exited = true;\n resolve();\n });\n });\n let releasing: Promise<void> | undefined;\n let closed = false;\n let unregister = () => {};\n const release = () =>\n (releasing ??= (async () => {\n closed = true;\n if (!exited) child.kill(\"SIGTERM\");\n await Promise.race([exit, delay(200, undefined, { ref: false })]);\n if (!exited) child.kill(\"SIGKILL\");\n await Promise.race([\n exit,\n delay(firecrackerDefaults.cleanupMs, undefined, { ref: false }),\n ]);\n if (!exited)\n throw new OutpostError(\n \"provider\",\n `VM termination uncertain; private disk retained at ${directory}`,\n );\n await rm(directory, { recursive: true, force: true });\n await rm(lock, { recursive: true, force: true });\n await rm(transportLock, { recursive: true, force: true });\n unregister();\n })().catch((cause) => {\n releasing = undefined;\n throw cause;\n }));\n unregister = registerCleanup(release, () => {\n if (!exited) child.kill(\"SIGKILL\");\n });\n return { directory, isClosed: () => closed || exited, release };\n}\n\nasync function failedAllocation(\n paths: readonly string[],\n cause: unknown,\n): Promise<never> {\n const results = await Promise.allSettled(\n paths.map((path) => rm(path, { recursive: true, force: true })),\n );\n const failures = results\n .filter((result) => result.status === \"rejected\")\n .map((result) => result.reason);\n if (failures.length)\n throw new AggregateError(\n [cause, ...failures],\n \"Firecracker allocation and cleanup failed; inspect retained temporary resources\",\n );\n throw cause;\n}\n"]}
1
+ {"version":3,"file":"firecracker-machine.js","sourceRoot":"","sources":["../../src/providers/firecracker-machine.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { spawn } from \"node:child_process\";\nimport { constants } from \"node:fs\";\nimport {\n access,\n chmod,\n copyFile,\n mkdir,\n mkdtemp,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { isAbsolute, join } from \"node:path\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { invariant, OutpostError, positive } from \"../domain/errors.ts\";\nimport { registerCleanup } from \"../infrastructure/shutdown.ts\";\nimport { prepareJailer, validateJailer } from \"./firecracker-jailer.ts\";\nimport { firecrackerDefaults } from \"./firecracker.constants.ts\";\nimport type {\n FirecrackerMachine,\n FirecrackerLaunch,\n FirecrackerOptions,\n} from \"./firecracker.types.ts\";\n\nexport function validateFirecracker(options: FirecrackerOptions): void {\n validateJailer(options);\n invariant(\n !(\"egress\" in options) || options.egress === undefined,\n \"Firecracker cannot enforce Outpost egress policies; configure host networking explicitly\",\n );\n for (const path of [\n options.binary,\n options.kernel,\n options.rootfs,\n options.home,\n options.root ?? firecrackerDefaults.root,\n options.ssh.identity,\n options.ssh.knownHosts,\n ])\n invariant(\n isAbsolute(path) && !path.includes(\"\\0\"),\n \"Firecracker paths must be absolute\",\n );\n invariant(\n /^[a-zA-Z0-9_.-]{1,15}$/.test(options.tap),\n \"Invalid TAP interface\",\n );\n invariant(\n /^([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}$/.test(options.guestMac),\n \"Invalid guest MAC address\",\n );\n invariant(\n /^[a-zA-Z0-9_.:-]+$/.test(options.ssh.host) &&\n !options.ssh.host.startsWith(\"-\"),\n \"Invalid SSH host\",\n );\n invariant(/^[a-zA-Z0-9_-]+$/.test(options.ssh.user), \"Invalid SSH user\");\n for (const value of [\n options.cpus ?? firecrackerDefaults.cpus,\n options.memoryMb ?? firecrackerDefaults.memoryMb,\n options.ssh.port ?? 22,\n ])\n invariant(\n Number.isSafeInteger(value) && value > 0,\n \"Firecracker resource limits and SSH port must be positive integers\",\n );\n positive(\n options.bootDeadlineMs ?? firecrackerDefaults.bootDeadlineMs,\n \"bootDeadlineMs\",\n );\n}\n\nexport async function firecrackerMachine(\n options: FirecrackerOptions,\n signal?: AbortSignal,\n): Promise<FirecrackerMachine> {\n invariant(process.platform === \"linux\", \"Firecracker requires Linux and KVM\");\n signal?.throwIfAborted();\n await access(\"/dev/kvm\", constants.R_OK | constants.W_OK);\n await Promise.all([\n access(options.binary, constants.X_OK),\n access(options.kernel, constants.R_OK),\n access(options.rootfs, constants.R_OK),\n access(options.ssh.identity, constants.R_OK),\n access(options.ssh.knownHosts, constants.R_OK),\n ]);\n const lock = join(tmpdir(), `outpost-firecracker-tap-${options.tap}.lock`);\n await mkdir(lock, { mode: 0o700 });\n const endpoint = createHash(\"sha256\")\n .update(`${options.ssh.host}:${options.ssh.port ?? 22}`)\n .digest(\"hex\");\n const transportLock = join(\n tmpdir(),\n `outpost-firecracker-ssh-${endpoint}.lock`,\n );\n try {\n await mkdir(transportLock, { mode: 0o700 });\n } catch (cause) {\n return failedAllocation([lock], cause);\n }\n let directory: string;\n try {\n directory = await mkdtemp(join(tmpdir(), \"outpost-firecracker-\"));\n } catch (cause) {\n return failedAllocation([lock, transportLock], cause);\n }\n try {\n await copyFile(\n options.rootfs,\n join(directory, \"rootfs.ext4\"),\n constants.COPYFILE_FICLONE,\n );\n await chmod(join(directory, \"rootfs.ext4\"), 0o600);\n signal?.throwIfAborted();\n await writeFile(\n join(directory, \"config.json\"),\n JSON.stringify({\n \"boot-source\": {\n kernel_image_path: options.kernel,\n boot_args: options.bootArgs,\n },\n drives: [\n {\n drive_id: \"rootfs\",\n path_on_host: join(directory, \"rootfs.ext4\"),\n is_root_device: true,\n is_read_only: false,\n },\n ],\n \"machine-config\": {\n vcpu_count: options.cpus ?? firecrackerDefaults.cpus,\n mem_size_mib: options.memoryMb ?? firecrackerDefaults.memoryMb,\n },\n \"network-interfaces\": [\n {\n iface_id: \"net1\",\n guest_mac: options.guestMac,\n host_dev_name: options.tap,\n },\n ],\n }),\n { mode: 0o600 },\n );\n } catch (cause) {\n return failedAllocation([directory, lock, transportLock], cause);\n }\n let launch: FirecrackerLaunch;\n try {\n launch = options.jailer\n ? await prepareJailer(options, directory, signal)\n : {\n binary: options.binary,\n arguments: [\n \"--api-sock\",\n join(directory, \"api.sock\"),\n \"--config-file\",\n join(directory, \"config.json\"),\n ],\n async stop() {},\n async cleanup() {},\n };\n } catch (cause) {\n return failedAllocation([directory, lock, transportLock], cause);\n }\n const child = spawn(launch.binary, launch.arguments, { stdio: \"ignore\" });\n let exited = false;\n const exit = new Promise<void>((resolve) => {\n child.once(\"error\", () => {\n exited = true;\n resolve();\n });\n child.once(\"exit\", () => {\n exited = true;\n resolve();\n });\n });\n let releasing: Promise<void> | undefined;\n let closed = false;\n let unregister = () => {};\n const release = () =>\n (releasing ??= (async () => {\n closed = true;\n if (!exited) child.kill(\"SIGTERM\");\n await Promise.race([exit, delay(200, undefined, { ref: false })]);\n try {\n await launch.stop();\n } finally {\n if (!exited) child.kill(\"SIGKILL\");\n }\n await Promise.race([\n exit,\n delay(firecrackerDefaults.cleanupMs, undefined, { ref: false }),\n ]);\n if (!exited)\n throw new OutpostError(\n \"provider\",\n `VM termination uncertain; private disk retained at ${directory}`,\n );\n await launch.cleanup();\n await rm(directory, { recursive: true, force: true });\n await rm(lock, { recursive: true, force: true });\n await rm(transportLock, { recursive: true, force: true });\n unregister();\n })().catch((cause) => {\n releasing = undefined;\n throw cause;\n }));\n unregister = registerCleanup(release, () => {\n if (!exited) child.kill(\"SIGKILL\");\n });\n return { directory, isClosed: () => closed || exited, release };\n}\n\nasync function failedAllocation(\n paths: readonly string[],\n cause: unknown,\n): Promise<never> {\n const results = await Promise.allSettled(\n paths.map((path) => rm(path, { recursive: true, force: true })),\n );\n const failures = results\n .filter((result) => result.status === \"rejected\")\n .map((result) => result.reason);\n if (failures.length)\n throw new AggregateError(\n [cause, ...failures],\n \"Firecracker allocation and cleanup failed; inspect retained temporary resources\",\n );\n throw cause;\n}\n"]}
@@ -21,6 +21,16 @@ export interface FirecrackerOptions {
21
21
  readonly memoryMb?: number;
22
22
  readonly bootDeadlineMs?: number;
23
23
  readonly variables?: Variables;
24
+ readonly jailer?: {
25
+ readonly binary: string;
26
+ readonly directory: string;
27
+ readonly cgroup: string;
28
+ readonly uid: number;
29
+ readonly gid: number;
30
+ readonly cpuQuotaUs: number;
31
+ readonly memoryMaxMb: number;
32
+ readonly processes: number;
33
+ };
24
34
  }
25
35
  export interface FirecrackerRuntime {
26
36
  readonly options: FirecrackerOptions;
@@ -34,3 +44,9 @@ export interface FirecrackerMachine {
34
44
  readonly isClosed: () => boolean;
35
45
  release(): Promise<void>;
36
46
  }
47
+ export interface FirecrackerLaunch {
48
+ readonly binary: string;
49
+ readonly arguments: readonly string[];
50
+ stop(): Promise<void>;
51
+ cleanup(): Promise<void>;
52
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"firecracker.types.js","sourceRoot":"","sources":["../../src/providers/firecracker.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Variables } from \"../domain/command.types.ts\";\nimport type { Executor } from \"../infrastructure/process.types.ts\";\n\nexport interface FirecrackerOptions {\n readonly binary: string;\n readonly kernel: string;\n readonly rootfs: string;\n readonly tap: string;\n readonly guestMac: string;\n readonly bootArgs: string;\n readonly ssh: {\n readonly host: string;\n readonly user: string;\n readonly identity: string;\n readonly knownHosts: string;\n readonly port?: number;\n readonly binary?: string;\n };\n readonly root?: string;\n readonly home: string;\n readonly cpus?: number;\n readonly memoryMb?: number;\n readonly bootDeadlineMs?: number;\n readonly variables?: Variables;\n}\n\nexport interface FirecrackerRuntime {\n readonly options: FirecrackerOptions;\n readonly root: string;\n readonly variables: Variables;\n readonly isClosed: () => boolean;\n readonly executor: Executor;\n}\n\nexport interface FirecrackerMachine {\n readonly directory: string;\n readonly isClosed: () => boolean;\n release(): Promise<void>;\n}\n"]}
1
+ {"version":3,"file":"firecracker.types.js","sourceRoot":"","sources":["../../src/providers/firecracker.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Variables } from \"../domain/command.types.ts\";\nimport type { Executor } from \"../infrastructure/process.types.ts\";\n\nexport interface FirecrackerOptions {\n readonly binary: string;\n readonly kernel: string;\n readonly rootfs: string;\n readonly tap: string;\n readonly guestMac: string;\n readonly bootArgs: string;\n readonly ssh: {\n readonly host: string;\n readonly user: string;\n readonly identity: string;\n readonly knownHosts: string;\n readonly port?: number;\n readonly binary?: string;\n };\n readonly root?: string;\n readonly home: string;\n readonly cpus?: number;\n readonly memoryMb?: number;\n readonly bootDeadlineMs?: number;\n readonly variables?: Variables;\n readonly jailer?: {\n readonly binary: string;\n readonly directory: string;\n readonly cgroup: string;\n readonly uid: number;\n readonly gid: number;\n readonly cpuQuotaUs: number;\n readonly memoryMaxMb: number;\n readonly processes: number;\n };\n}\n\nexport interface FirecrackerRuntime {\n readonly options: FirecrackerOptions;\n readonly root: string;\n readonly variables: Variables;\n readonly isClosed: () => boolean;\n readonly executor: Executor;\n}\n\nexport interface FirecrackerMachine {\n readonly directory: string;\n readonly isClosed: () => boolean;\n release(): Promise<void>;\n}\n\nexport interface FirecrackerLaunch {\n readonly binary: string;\n readonly arguments: readonly string[];\n stop(): Promise<void>;\n cleanup(): Promise<void>;\n}\n"]}
@@ -3,7 +3,7 @@ import { invariant } from "../domain/errors.js";
3
3
  export function vercelNetworkPolicy(options) {
4
4
  const policy = validateEgress(options.egress);
5
5
  if (!policy)
6
- return options.create?.networkPolicy;
6
+ return structuredClone(options.create?.networkPolicy);
7
7
  invariant(options.create?.networkPolicy === undefined, "Use egress or create.networkPolicy, not both");
8
8
  if (policy.mode === "deny-all")
9
9
  return "deny-all";
@@ -1 +1 @@
1
- {"version":3,"file":"vercel-network.js","sourceRoot":"","sources":["../../src/providers/vercel-network.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhD,MAAM,UAAU,mBAAmB,CACjC,OAAsB;IAEtB,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM;QAAE,OAAO,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC;IAClD,SAAS,CACP,OAAO,CAAC,MAAM,EAAE,aAAa,KAAK,SAAS,EAC3C,8CAA8C,CAC/C,CAAC;IACF,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC;IAClD,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAClC,OAAO,EAAE;YACP,KAAK,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;YACrC,IAAI,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;SACpC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { validateEgress } from \"../domain/egress.ts\";\nimport { invariant } from \"../domain/errors.ts\";\nimport type { VercelOptions } from \"./vercel.types.ts\";\n\nexport function vercelNetworkPolicy(\n options: VercelOptions,\n): NonNullable<VercelOptions[\"create\"]>[\"networkPolicy\"] {\n const policy = validateEgress(options.egress);\n if (!policy) return options.create?.networkPolicy;\n invariant(\n options.create?.networkPolicy === undefined,\n \"Use egress or create.networkPolicy, not both\",\n );\n if (policy.mode === \"deny-all\") return \"deny-all\";\n return {\n allow: [...(policy.domains ?? [])],\n subnets: {\n allow: [...(policy.allowCidrs ?? [])],\n deny: [...(policy.denyCidrs ?? [])],\n },\n };\n}\n"]}
1
+ {"version":3,"file":"vercel-network.js","sourceRoot":"","sources":["../../src/providers/vercel-network.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhD,MAAM,UAAU,mBAAmB,CACjC,OAAsB;IAEtB,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM;QAAE,OAAO,eAAe,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACnE,SAAS,CACP,OAAO,CAAC,MAAM,EAAE,aAAa,KAAK,SAAS,EAC3C,8CAA8C,CAC/C,CAAC;IACF,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC;IAClD,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAClC,OAAO,EAAE;YACP,KAAK,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;YACrC,IAAI,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;SACpC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { validateEgress } from \"../domain/egress.ts\";\nimport { invariant } from \"../domain/errors.ts\";\nimport type { VercelOptions } from \"./vercel.types.ts\";\n\nexport function vercelNetworkPolicy(\n options: VercelOptions,\n): NonNullable<VercelOptions[\"create\"]>[\"networkPolicy\"] {\n const policy = validateEgress(options.egress);\n if (!policy) return structuredClone(options.create?.networkPolicy);\n invariant(\n options.create?.networkPolicy === undefined,\n \"Use egress or create.networkPolicy, not both\",\n );\n if (policy.mode === \"deny-all\") return \"deny-all\";\n return {\n allow: [...(policy.domains ?? [])],\n subnets: {\n allow: [...(policy.allowCidrs ?? [])],\n deny: [...(policy.denyCidrs ?? [])],\n },\n };\n}\n"]}
@@ -8,6 +8,7 @@ import { vercelDirectory } from "./vercel-directory.js";
8
8
  import { vercelFiles } from "./vercel-files.js";
9
9
  export function vercelSandboxProvider(options = {}, connect = async (config) => (await import("@vercel/sandbox")).Sandbox.create(config)) {
10
10
  const networkPolicy = vercelNetworkPolicy(options);
11
+ const create = { ...options.create };
11
12
  return {
12
13
  name: "vercel",
13
14
  placement: "remote",
@@ -15,9 +16,11 @@ export function vercelSandboxProvider(options = {}, connect = async (config) =>
15
16
  async acquire(context) {
16
17
  context.signal?.throwIfAborted();
17
18
  const sandbox = await connect({
18
- ...options.create,
19
- ...(networkPolicy === undefined ? {} : { networkPolicy }),
20
- env: { ...options.create?.env, ...context.variables },
19
+ ...create,
20
+ ...(networkPolicy === undefined
21
+ ? {}
22
+ : { networkPolicy: structuredClone(networkPolicy) }),
23
+ env: { ...create.env, ...context.variables },
21
24
  });
22
25
  const root = options.root ?? cloudRoots.vercel;
23
26
  let closed = false;
@@ -1 +1 @@
1
- {"version":3,"file":"vercel.js","sourceRoot":"","sources":["../../src/providers/vercel.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,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,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAKhD,MAAM,UAAU,qBAAqB,CACnC,UAAyB,EAAE,EAC3B,UAAiE,KAAK,EACpE,MAAM,EACN,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;IAE7D,MAAM,aAAa,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACnD,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,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,OAAO,GAAG,MAAM,OAAO,CAAC;gBAC5B,GAAG,OAAO,CAAC,MAAM;gBACjB,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC;gBACzD,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE;aACtD,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,UAAU,CAAC,MAAM,CAAC;YAC/C,IAAI,MAAM,GAAG,KAAK,CAAC;YACnB,IAAI,SAAoC,CAAC;YACzC,IAAI,UAAU,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;YAC1B,MAAM,OAAO,GAAG,GAAG,EAAE,CACnB,CAAC,SAAS,KAAK,OAAO;iBACnB,IAAI,EAAE;iBACN,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,CAAC;gBACH,MAAM,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBACrC,IAAI,GAAG,CACL,MAAM,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAChE,CAAC,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;oBACvB,MAAM,IAAI,YAAY,CACpB,UAAU,EACV,kDAAkD,CACnD,CAAC;YACN,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,EAAE,CAAC;gBAChB,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,KAAK,GAAG;gBACZ,IAAI;gBACJ,IAAI;gBACJ,MAAM,EAAE,aAAa,CAAC;oBACpB,OAAO;oBACP,IAAI;oBACJ,OAAO;oBACP,OAAO;oBACP,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM;iBACvB,CAAC;gBACF,GAAG,WAAW,CAAC,OAAO,CAAC;gBACvB,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 { Sandbox } from \"@vercel/sandbox\";\nimport { OutpostError } from \"../domain/errors.ts\";\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 { vercelCommand } from \"./vercel-command.ts\";\nimport { vercelNetworkPolicy } from \"./vercel-network.ts\";\nimport { vercelDirectory } from \"./vercel-directory.ts\";\nimport { vercelFiles } from \"./vercel-files.ts\";\nimport type { VercelOptions } from \"./vercel.types.ts\";\n\nexport type { VercelOptions } from \"./vercel.types.ts\";\n\nexport function vercelSandboxProvider(\n options: VercelOptions = {},\n connect: (config: VercelOptions[\"create\"]) => Promise<Sandbox> = async (\n config,\n ) => (await import(\"@vercel/sandbox\")).Sandbox.create(config),\n): SandboxProvider {\n const networkPolicy = vercelNetworkPolicy(options);\n return {\n name: \"vercel\",\n placement: \"remote\",\n variables: { ...options.variables },\n async acquire(context) {\n context.signal?.throwIfAborted();\n const sandbox = await connect({\n ...options.create,\n ...(networkPolicy === undefined ? {} : { networkPolicy }),\n env: { ...options.create?.env, ...context.variables },\n });\n const root = options.root ?? cloudRoots.vercel;\n let closed = false;\n let releasing: Promise<void> | undefined;\n let unregister = () => {};\n const release = () =>\n (releasing ??= sandbox\n .stop()\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 try {\n await vercelDirectory(sandbox, root);\n home = (\n await (await sandbox.runCommand(\"printenv\", [\"HOME\"])).stdout()\n ).trim();\n if (!home.startsWith(\"/\"))\n throw new OutpostError(\n \"provider\",\n \"Cloud sandbox returned an invalid home directory\",\n );\n } catch (cause) {\n await release();\n throw cause;\n }\n const lease = {\n root,\n home,\n invoke: vercelCommand({\n sandbox,\n root,\n options,\n context,\n isClosed: () => closed,\n }),\n ...vercelFiles(sandbox),\n release,\n };\n return { ...lease, fileTransfers: fileBatches(lease) };\n },\n };\n}\n\nexport type { EgressPolicy } from \"../domain/egress.types.ts\";\n"]}
1
+ {"version":3,"file":"vercel.js","sourceRoot":"","sources":["../../src/providers/vercel.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Sandbox } from \"@vercel/sandbox\";\nimport { OutpostError } from \"../domain/errors.ts\";\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 { vercelCommand } from \"./vercel-command.ts\";\nimport { vercelNetworkPolicy } from \"./vercel-network.ts\";\nimport { vercelDirectory } from \"./vercel-directory.ts\";\nimport { vercelFiles } from \"./vercel-files.ts\";\nimport type { VercelOptions } from \"./vercel.types.ts\";\n\nexport type { VercelOptions } from \"./vercel.types.ts\";\n\nexport function vercelSandboxProvider(\n options: VercelOptions = {},\n connect: (config: VercelOptions[\"create\"]) => Promise<Sandbox> = async (\n config,\n ) => (await import(\"@vercel/sandbox\")).Sandbox.create(config),\n): SandboxProvider {\n const networkPolicy = vercelNetworkPolicy(options);\n const create: NonNullable<VercelOptions[\"create\"]> = { ...options.create };\n return {\n name: \"vercel\",\n placement: \"remote\",\n variables: { ...options.variables },\n async acquire(context) {\n context.signal?.throwIfAborted();\n const sandbox = await connect({\n ...create,\n ...(networkPolicy === undefined\n ? {}\n : { networkPolicy: structuredClone(networkPolicy) }),\n env: { ...create.env, ...context.variables },\n });\n const root = options.root ?? cloudRoots.vercel;\n let closed = false;\n let releasing: Promise<void> | undefined;\n let unregister = () => {};\n const release = () =>\n (releasing ??= sandbox\n .stop()\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 try {\n await vercelDirectory(sandbox, root);\n home = (\n await (await sandbox.runCommand(\"printenv\", [\"HOME\"])).stdout()\n ).trim();\n if (!home.startsWith(\"/\"))\n throw new OutpostError(\n \"provider\",\n \"Cloud sandbox returned an invalid home directory\",\n );\n } catch (cause) {\n await release();\n throw cause;\n }\n const lease = {\n root,\n home,\n invoke: vercelCommand({\n sandbox,\n root,\n options,\n context,\n isClosed: () => closed,\n }),\n ...vercelFiles(sandbox),\n release,\n };\n return { ...lease, fileTransfers: fileBatches(lease) };\n },\n };\n}\n\nexport type { EgressPolicy } from \"../domain/egress.types.ts\";\n"]}
@@ -1,5 +1,7 @@
1
1
  export declare const agentVersions: Readonly<{
2
- gemini: "0.61.0";
3
2
  codex: "0.156.1";
4
3
  claude: "2.1.280";
4
+ copilot: "1.0.88";
5
+ kimi: "2.1.1";
6
+ antigravity: "1.2.12";
5
7
  }>;
@@ -1,6 +1,8 @@
1
1
  export const agentVersions = Object.freeze({
2
- gemini: "0.61.0",
3
2
  codex: "0.156.1",
4
3
  claude: "2.1.280",
4
+ copilot: "1.0.88",
5
+ kimi: "2.1.1",
6
+ antigravity: "1.2.12",
5
7
  });
6
8
  //# sourceMappingURL=versions.constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"versions.constants.js","sourceRoot":"","sources":["../../src/providers/versions.constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC;IACzC,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,SAAS;CAClB,CAAC,CAAC","sourcesContent":["export const agentVersions = Object.freeze({\n gemini: \"0.61.0\",\n codex: \"0.156.1\",\n claude: \"2.1.280\",\n});\n"]}
1
+ {"version":3,"file":"versions.constants.js","sourceRoot":"","sources":["../../src/providers/versions.constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC;IACzC,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,SAAS;IACjB,OAAO,EAAE,QAAQ;IACjB,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,QAAQ;CACtB,CAAC,CAAC","sourcesContent":["export const agentVersions = Object.freeze({\n codex: \"0.156.1\",\n claude: \"2.1.280\",\n copilot: \"1.0.88\",\n kimi: \"2.1.1\",\n antigravity: \"1.2.12\",\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elie-laloum/outpost",
3
- "version": "5.0.0",
3
+ "version": "7.0.0",
4
4
  "description": "Programmable sandboxes, coding agents and typed workflows.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -74,8 +74,8 @@
74
74
  "test:package": "node scripts/package-smoke.mjs",
75
75
  "test:container": "node --test test/container.test.ts",
76
76
  "architecture": "node scripts/check-architecture.mjs",
77
- "docs:sync": "npm run build && node docs/scripts/sync-preparations.mjs && node docs/scripts/sync-reference.mjs",
78
- "docs:check": "node docs/scripts/sync-preparations.mjs --check && node docs/scripts/sync-reference.mjs --check && npm run check --prefix docs",
77
+ "docs:sync": "npm run build && node docs/scripts/sync-reference.mjs",
78
+ "docs:check": "node docs/scripts/sync-reference.mjs --check && npm run check --prefix docs",
79
79
  "docs:dev": "npm run dev --prefix docs",
80
80
  "docs:build": "npm run build --prefix docs",
81
81
  "docs:test": "npm run test:build --prefix docs && node docs/scripts/check-examples.mjs && node --test docs/scripts/release-channel.test.mjs",
@@ -1,3 +0,0 @@
1
- import type { CliHarness } from "../../domain/agent.types.ts";
2
- import type { GeminiSettings } from "./gemini.types.ts";
3
- export declare function geminiHarness(settings?: GeminiSettings): CliHarness;
@@ -1,34 +0,0 @@
1
- import { authenticationCommand } from "./authentication.js";
2
- import { geminiEvents } from "./gemini-events.js";
3
- import { geminiRequest } from "./gemini-request.js";
4
- import { geminiModelSupport } from "./model-support.constants.js";
5
- import { harnessSettings, supportModel } from "./model-support.js";
6
- function bindGemini(settings) {
7
- supportModel(geminiModelSupport, settings.model);
8
- return Object.freeze({
9
- name: "gemini",
10
- authenticate: authenticationCommand("gemini", settings.authentication),
11
- bootstrap: "gemini",
12
- resumable: false,
13
- capture: false,
14
- requiresFinishedEvent: true,
15
- variables: Object.freeze({ ...settings.variables }),
16
- request: (input) => geminiRequest(settings, input),
17
- events: geminiEvents,
18
- });
19
- }
20
- export function geminiHarness(settings = {}) {
21
- harnessSettings(settings);
22
- const configured = Object.freeze({
23
- ...settings,
24
- variables: Object.freeze({ ...settings.variables }),
25
- });
26
- return Object.freeze({
27
- kind: "cli",
28
- bind: (model) => bindGemini({
29
- ...configured,
30
- ...(model === undefined ? {} : { model }),
31
- }),
32
- });
33
- }
34
- //# sourceMappingURL=gemini-adapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gemini-adapter.js","sourceRoot":"","sources":["../../../src/adapters/agents/gemini-adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGnE,SAAS,UAAU,CAAC,QAA+B;IACjD,YAAY,CAAC,kBAAkB,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IACjD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,CAAC,cAAc,CAAC;QACtE,SAAS,EAAE,QAAQ;QACnB,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,KAAK;QACd,qBAAqB,EAAE,IAAI;QAC3B,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;QACnD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC;QAClD,MAAM,EAAE,YAAY;KACE,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,WAA2B,EAAE;IACzD,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC1B,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;QAC/B,GAAG,QAAQ;QACX,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;KACpD,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,CAAC,KAAkB,EAAE,EAAE,CAC3B,UAAU,CAAC;YACT,GAAG,UAAU;YACb,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;SAC1C,CAAC;KACL,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { AgentModel } from \"../../domain/model.types.ts\";\nimport { authenticationCommand } from \"./authentication.ts\";\nimport type { AgentAdapter, CliHarness } from \"../../domain/agent.types.ts\";\nimport { geminiEvents } from \"./gemini-events.ts\";\nimport { geminiRequest } from \"./gemini-request.ts\";\nimport type { GeminiSettings } from \"./gemini.types.ts\";\nimport { geminiModelSupport } from \"./model-support.constants.ts\";\nimport { harnessSettings, supportModel } from \"./model-support.ts\";\nimport type { Bound } from \"./settings.types.ts\";\n\nfunction bindGemini(settings: Bound<GeminiSettings>): AgentAdapter {\n supportModel(geminiModelSupport, settings.model);\n return Object.freeze({\n name: \"gemini\",\n authenticate: authenticationCommand(\"gemini\", settings.authentication),\n bootstrap: \"gemini\",\n resumable: false,\n capture: false,\n requiresFinishedEvent: true,\n variables: Object.freeze({ ...settings.variables }),\n request: (input) => geminiRequest(settings, input),\n events: geminiEvents,\n } satisfies AgentAdapter);\n}\n\nexport function geminiHarness(settings: GeminiSettings = {}): CliHarness {\n harnessSettings(settings);\n const configured = Object.freeze({\n ...settings,\n variables: Object.freeze({ ...settings.variables }),\n });\n return Object.freeze({\n kind: \"cli\",\n bind: (model?: AgentModel) =>\n bindGemini({\n ...configured,\n ...(model === undefined ? {} : { model }),\n }),\n });\n}\n"]}
@@ -1,2 +0,0 @@
1
- import type { AgentCliDiagnostic } from "./cli-diagnostics.types.ts";
2
- export declare function geminiDiagnostics(): readonly AgentCliDiagnostic[];
@@ -1,15 +0,0 @@
1
- import { geminiRequest } from "./gemini-request.js";
2
- export function geminiDiagnostics() {
3
- const command = geminiRequest({}, {});
4
- const args = command.arguments ?? [];
5
- return [
6
- {
7
- mode: "start",
8
- usage: "gemini",
9
- options: args.filter((argument) => argument.startsWith("--")),
10
- // Gemini omits supplied options from its help output.
11
- command: { ...command, arguments: ["--help"] },
12
- },
13
- ];
14
- }
15
- //# sourceMappingURL=gemini-diagnostics.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gemini-diagnostics.js","sourceRoot":"","sources":["../../../src/adapters/agents/gemini-diagnostics.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IACrC,OAAO;QACL;YACE,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC7D,sDAAsD;YACtD,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE;SAC/C;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { AgentCliDiagnostic } from \"./cli-diagnostics.types.ts\";\nimport { geminiRequest } from \"./gemini-request.ts\";\n\nexport function geminiDiagnostics(): readonly AgentCliDiagnostic[] {\n const command = geminiRequest({}, {});\n const args = command.arguments ?? [];\n return [\n {\n mode: \"start\",\n usage: \"gemini\",\n options: args.filter((argument) => argument.startsWith(\"--\")),\n // Gemini omits supplied options from its help output.\n command: { ...command, arguments: [\"--help\"] },\n },\n ];\n}\n"]}
@@ -1,2 +0,0 @@
1
- import type { AgentEvent } from "../../domain/agent.types.ts";
2
- export declare function geminiEvents(line: string): AgentEvent[];
@@ -1,50 +0,0 @@
1
- import { decodeLine } from "./event-decoder.js";
2
- import { asRecord, numberOrZero } from "./protocol.js";
3
- function message(event) {
4
- if (event.role !== "assistant" || typeof event.content !== "string")
5
- return [];
6
- return [{ kind: "text", text: event.content }];
7
- }
8
- function result(event) {
9
- const events = [];
10
- if (event.stats) {
11
- const stats = asRecord(event.stats);
12
- events.push({
13
- kind: "usage",
14
- tokens: {
15
- input: numberOrZero(stats.input_tokens),
16
- cached: numberOrZero(stats.cached),
17
- output: numberOrZero(stats.output_tokens),
18
- },
19
- });
20
- }
21
- if (event.status === "success")
22
- events.push({ kind: "finished" });
23
- if (event.status === "error")
24
- events.push({
25
- kind: "failure",
26
- message: String(asRecord(event.error).message ?? "Gemini failed"),
27
- });
28
- return events;
29
- }
30
- export function geminiEvents(line) {
31
- return decodeLine(line, {
32
- init: (event) => typeof event.session_id === "string"
33
- ? [{ kind: "conversation", id: event.session_id }]
34
- : [],
35
- message,
36
- tool_use: (event) => typeof event.tool_name === "string"
37
- ? [{ kind: "tool", name: event.tool_name, input: event.parameters }]
38
- : [],
39
- error: (event) => typeof event.message === "string"
40
- ? [
41
- {
42
- kind: event.severity === "warning" ? "warning" : "failure",
43
- message: event.message,
44
- },
45
- ]
46
- : [],
47
- result,
48
- });
49
- }
50
- //# sourceMappingURL=gemini-events.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gemini-events.js","sourceRoot":"","sources":["../../../src/adapters/agents/gemini-events.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGvD,SAAS,OAAO,CAAC,KAAqB;IACpC,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QACjE,OAAO,EAAE,CAAC;IACZ,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,MAAM,CAAC,KAAqB;IACnC,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,OAAO;YACb,MAAM,EAAE;gBACN,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC;gBACvC,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC;gBAClC,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,aAAa,CAAC;aAC1C;SACF,CAAC,CAAC;IACL,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IAClE,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO;QAC1B,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,IAAI,eAAe,CAAC;SAClE,CAAC,CAAC;IACL,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,UAAU,CAAC,IAAI,EAAE;QACtB,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CACd,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ;YAClC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC;YAClD,CAAC,CAAC,EAAE;QACR,OAAO;QACP,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAClB,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;YACjC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC;YACpE,CAAC,CAAC,EAAE;QACR,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;YAC/B,CAAC,CAAC;gBACE;oBACE,IAAI,EAAE,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;oBAC1D,OAAO,EAAE,KAAK,CAAC,OAAO;iBACvB;aACF;YACH,CAAC,CAAC,EAAE;QACR,MAAM;KACP,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { AgentEvent } from \"../../domain/agent.types.ts\";\nimport { decodeLine } from \"./event-decoder.ts\";\nimport { asRecord, numberOrZero } from \"./protocol.ts\";\nimport type { ProtocolRecord } from \"./protocol.types.ts\";\n\nfunction message(event: ProtocolRecord): AgentEvent[] {\n if (event.role !== \"assistant\" || typeof event.content !== \"string\")\n return [];\n return [{ kind: \"text\", text: event.content }];\n}\n\nfunction result(event: ProtocolRecord): AgentEvent[] {\n const events: AgentEvent[] = [];\n if (event.stats) {\n const stats = asRecord(event.stats);\n events.push({\n kind: \"usage\",\n tokens: {\n input: numberOrZero(stats.input_tokens),\n cached: numberOrZero(stats.cached),\n output: numberOrZero(stats.output_tokens),\n },\n });\n }\n if (event.status === \"success\") events.push({ kind: \"finished\" });\n if (event.status === \"error\")\n events.push({\n kind: \"failure\",\n message: String(asRecord(event.error).message ?? \"Gemini failed\"),\n });\n return events;\n}\n\nexport function geminiEvents(line: string): AgentEvent[] {\n return decodeLine(line, {\n init: (event) =>\n typeof event.session_id === \"string\"\n ? [{ kind: \"conversation\", id: event.session_id }]\n : [],\n message,\n tool_use: (event) =>\n typeof event.tool_name === \"string\"\n ? [{ kind: \"tool\", name: event.tool_name, input: event.parameters }]\n : [],\n error: (event) =>\n typeof event.message === \"string\"\n ? [\n {\n kind: event.severity === \"warning\" ? \"warning\" : \"failure\",\n message: event.message,\n },\n ]\n : [],\n result,\n });\n}\n"]}
@@ -1,23 +0,0 @@
1
- import { invariant } from "../../domain/errors.js";
2
- export function geminiRequest(settings, input) {
3
- invariant(!input.continuation, "Gemini does not support continuation or fork in Outpost");
4
- const args = [];
5
- if (settings.model)
6
- args.push("--model", settings.model.name);
7
- const approvalMode = settings.approvalMode ?? (input.interactive ? "default" : "yolo");
8
- args.push("--approval-mode", approvalMode);
9
- if (!input.interactive && approvalMode === "yolo")
10
- args.push("--skip-trust");
11
- if (!input.interactive)
12
- args.push("--output-format", "stream-json");
13
- if (input.interactive && input.text !== undefined)
14
- args.push("--prompt-interactive", input.text);
15
- return {
16
- executable: "gemini",
17
- arguments: args,
18
- ...(input.interactive
19
- ? { interactive: true }
20
- : { stdin: input.text ?? "" }),
21
- };
22
- }
23
- //# sourceMappingURL=gemini-request.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gemini-request.js","sourceRoot":"","sources":["../../../src/adapters/agents/gemini-request.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAInD,MAAM,UAAU,aAAa,CAC3B,QAA+B,EAC/B,KAAiB;IAEjB,SAAS,CACP,CAAC,KAAK,CAAC,YAAY,EACnB,yDAAyD,CAC1D,CAAC;IACF,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,QAAQ,CAAC,KAAK;QAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9D,MAAM,YAAY,GAChB,QAAQ,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACpE,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,YAAY,KAAK,MAAM;QAAE,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC7E,IAAI,CAAC,KAAK,CAAC,WAAW;QAAE,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;IACpE,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;QAC/C,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAChD,OAAO;QACL,UAAU,EAAE,QAAQ;QACpB,SAAS,EAAE,IAAI;QACf,GAAG,CAAC,KAAK,CAAC,WAAW;YACnB,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE;YACvB,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;KACjC,CAAC;AACJ,CAAC","sourcesContent":["import type { AgentInput } from \"../../domain/agent.types.ts\";\nimport type { Command } from \"../../domain/command.types.ts\";\nimport { invariant } from \"../../domain/errors.ts\";\nimport type { GeminiSettings } from \"./gemini.types.ts\";\nimport type { Bound } from \"./settings.types.ts\";\n\nexport function geminiRequest(\n settings: Bound<GeminiSettings>,\n input: AgentInput,\n): Command {\n invariant(\n !input.continuation,\n \"Gemini does not support continuation or fork in Outpost\",\n );\n const args: string[] = [];\n if (settings.model) args.push(\"--model\", settings.model.name);\n const approvalMode =\n settings.approvalMode ?? (input.interactive ? \"default\" : \"yolo\");\n args.push(\"--approval-mode\", approvalMode);\n if (!input.interactive && approvalMode === \"yolo\") args.push(\"--skip-trust\");\n if (!input.interactive) args.push(\"--output-format\", \"stream-json\");\n if (input.interactive && input.text !== undefined)\n args.push(\"--prompt-interactive\", input.text);\n return {\n executable: \"gemini\",\n arguments: args,\n ...(input.interactive\n ? { interactive: true }\n : { stdin: input.text ?? \"\" }),\n };\n}\n"]}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=gemini.types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gemini.types.js","sourceRoot":"","sources":["../../../src/adapters/agents/gemini.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { AgentAuthentication } from \"../../domain/agent.types.ts\";\nimport type { Variables } from \"../../domain/command.types.ts\";\n\nexport interface GeminiSettings {\n readonly authentication?: AgentAuthentication;\n readonly variables?: Variables;\n readonly approvalMode?: \"default\" | \"auto_edit\" | \"yolo\" | \"plan\";\n}\n"]}
@@ -1,3 +0,0 @@
1
- import type { ArtifactStore } from "../domain/artifact.types.ts";
2
- import type { FileArtifactStoreOptions } from "./artifact-store.types.ts";
3
- export declare function fileArtifactStore(options: FileArtifactStoreOptions): ArtifactStore;