@elie-laloum/outpost 3.0.0 → 4.1.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 (411) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +5 -3
  3. package/SECURITY.md +3 -1
  4. package/dist/adapters/agents/codex-adapter.js +2 -0
  5. package/dist/adapters/agents/codex-adapter.js.map +1 -1
  6. package/dist/adapters/agents/codex-provider.d.ts +2 -0
  7. package/dist/adapters/agents/codex-provider.js +32 -0
  8. package/dist/adapters/agents/codex-provider.js.map +1 -0
  9. package/dist/adapters/agents/codex-request.js +2 -1
  10. package/dist/adapters/agents/codex-request.js.map +1 -1
  11. package/dist/adapters/agents/gemini-adapter.d.ts +3 -0
  12. package/dist/adapters/agents/gemini-adapter.js +15 -0
  13. package/dist/adapters/agents/gemini-adapter.js.map +1 -0
  14. package/dist/adapters/agents/gemini-diagnostics.d.ts +2 -0
  15. package/dist/adapters/agents/gemini-diagnostics.js +15 -0
  16. package/dist/adapters/agents/gemini-diagnostics.js.map +1 -0
  17. package/dist/adapters/agents/gemini-events.d.ts +2 -0
  18. package/dist/adapters/agents/gemini-events.js +50 -0
  19. package/dist/adapters/agents/gemini-events.js.map +1 -0
  20. package/dist/adapters/agents/gemini-request.d.ts +4 -0
  21. package/dist/adapters/agents/gemini-request.js +23 -0
  22. package/dist/adapters/agents/gemini-request.js.map +1 -0
  23. package/dist/adapters/agents/gemini.types.d.ts +6 -0
  24. package/dist/adapters/agents/gemini.types.js +2 -0
  25. package/dist/adapters/agents/gemini.types.js.map +1 -0
  26. package/dist/adapters/agents/protocol-fixtures.constants.d.ts +1 -1
  27. package/dist/adapters/agents/protocol-fixtures.constants.js +37 -0
  28. package/dist/adapters/agents/protocol-fixtures.constants.js.map +1 -1
  29. package/dist/adapters/agents/settings.types.d.ts +5 -0
  30. package/dist/adapters/agents/settings.types.js.map +1 -1
  31. package/dist/application/agent-bootstrap.constants.d.ts +1 -0
  32. package/dist/application/agent-bootstrap.constants.js +1 -0
  33. package/dist/application/agent-bootstrap.constants.js.map +1 -1
  34. package/dist/application/agent-bootstrap.js +6 -2
  35. package/dist/application/agent-bootstrap.js.map +1 -1
  36. package/dist/application/agent-output.js +9 -2
  37. package/dist/application/agent-output.js.map +1 -1
  38. package/dist/application/artifact-tasks.d.ts +5 -0
  39. package/dist/application/artifact-tasks.js +31 -0
  40. package/dist/application/artifact-tasks.js.map +1 -0
  41. package/dist/application/artifact-tasks.types.d.ts +8 -0
  42. package/dist/application/artifact-tasks.types.js +2 -0
  43. package/dist/application/artifact-tasks.types.js.map +1 -0
  44. package/dist/application/dispatch-validation.js +2 -0
  45. package/dist/application/dispatch-validation.js.map +1 -1
  46. package/dist/application/doctor-agent.constants.d.ts +2 -0
  47. package/dist/application/doctor-agent.constants.js +2 -0
  48. package/dist/application/doctor-agent.constants.js.map +1 -1
  49. package/dist/application/doctor-agent.js +1 -1
  50. package/dist/application/doctor-agent.js.map +1 -1
  51. package/dist/application/doctor-protocol.js +2 -1
  52. package/dist/application/doctor-protocol.js.map +1 -1
  53. package/dist/application/doctor.constants.js +1 -1
  54. package/dist/application/doctor.constants.js.map +1 -1
  55. package/dist/application/doctor.types.d.ts +1 -1
  56. package/dist/application/doctor.types.js.map +1 -1
  57. package/dist/application/outpost.types.d.ts +2 -0
  58. package/dist/application/outpost.types.js.map +1 -1
  59. package/dist/application/queue-worker.d.ts +2 -0
  60. package/dist/application/queue-worker.js +75 -0
  61. package/dist/application/queue-worker.js.map +1 -0
  62. package/dist/application/queue-worker.types.d.ts +15 -0
  63. package/dist/application/queue-worker.types.js +2 -0
  64. package/dist/application/queue-worker.types.js.map +1 -0
  65. package/dist/application/queued-task.d.ts +3 -0
  66. package/dist/application/queued-task.js +56 -0
  67. package/dist/application/queued-task.js.map +1 -0
  68. package/dist/application/queued-task.types.d.ts +11 -0
  69. package/dist/application/queued-task.types.js +2 -0
  70. package/dist/application/queued-task.types.js.map +1 -0
  71. package/dist/application/recovery-inspection.js +5 -0
  72. package/dist/application/recovery-inspection.js.map +1 -1
  73. package/dist/application/recovery-inspection.types.d.ts +3 -0
  74. package/dist/application/recovery-inspection.types.js.map +1 -1
  75. package/dist/application/recovery-restore-snapshot.d.ts +2 -0
  76. package/dist/application/recovery-restore-snapshot.js +57 -0
  77. package/dist/application/recovery-restore-snapshot.js.map +1 -0
  78. package/dist/application/recovery-restore.d.ts +3 -0
  79. package/dist/application/recovery-restore.js +161 -0
  80. package/dist/application/recovery-restore.js.map +1 -0
  81. package/dist/application/recovery-restore.types.d.ts +28 -0
  82. package/dist/application/recovery-restore.types.js +2 -0
  83. package/dist/application/recovery-restore.types.js.map +1 -0
  84. package/dist/application/recovery-retention.js +5 -0
  85. package/dist/application/recovery-retention.js.map +1 -1
  86. package/dist/application/recovery-verification.d.ts +2 -1
  87. package/dist/application/recovery-verification.js +1 -1
  88. package/dist/application/recovery-verification.js.map +1 -1
  89. package/dist/application/remote-apply.js +6 -0
  90. package/dist/application/remote-apply.js.map +1 -1
  91. package/dist/application/remote-download.js +2 -2
  92. package/dist/application/remote-download.js.map +1 -1
  93. package/dist/application/remote-history.d.ts +6 -0
  94. package/dist/application/remote-history.js +114 -0
  95. package/dist/application/remote-history.js.map +1 -0
  96. package/dist/application/remote-upload.d.ts +2 -0
  97. package/dist/application/remote-upload.js +17 -0
  98. package/dist/application/remote-upload.js.map +1 -0
  99. package/dist/application/remote-validation.js +20 -28
  100. package/dist/application/remote-validation.js.map +1 -1
  101. package/dist/application/remote-workspace.js +4 -10
  102. package/dist/application/remote-workspace.js.map +1 -1
  103. package/dist/application/sandbox-activity.d.ts +3 -0
  104. package/dist/application/sandbox-activity.js +25 -0
  105. package/dist/application/sandbox-activity.js.map +1 -0
  106. package/dist/application/sandbox-provision.js +55 -10
  107. package/dist/application/sandbox-provision.js.map +1 -1
  108. package/dist/application/sandbox-session.types.d.ts +2 -0
  109. package/dist/application/sandbox-session.types.js.map +1 -1
  110. package/dist/application/sandbox.js +23 -11
  111. package/dist/application/sandbox.js.map +1 -1
  112. package/dist/application/speculation-host.d.ts +2 -0
  113. package/dist/application/speculation-host.js +30 -0
  114. package/dist/application/speculation-host.js.map +1 -0
  115. package/dist/application/speculation.constants.d.ts +4 -0
  116. package/dist/application/speculation.constants.js +2 -0
  117. package/dist/application/speculation.constants.js.map +1 -0
  118. package/dist/application/speculation.d.ts +2 -0
  119. package/dist/application/speculation.js +166 -0
  120. package/dist/application/speculation.js.map +1 -0
  121. package/dist/application/speculation.types.d.ts +56 -0
  122. package/dist/application/speculation.types.js +2 -0
  123. package/dist/application/speculation.types.js.map +1 -0
  124. package/dist/application/storage-reservation.d.ts +3 -0
  125. package/dist/application/storage-reservation.js +10 -0
  126. package/dist/application/storage-reservation.js.map +1 -0
  127. package/dist/application/storage-reservation.types.d.ts +4 -0
  128. package/dist/application/storage-reservation.types.js +2 -0
  129. package/dist/application/storage-reservation.types.js.map +1 -0
  130. package/dist/application/task-usage.d.ts +1 -1
  131. package/dist/application/task-usage.js.map +1 -1
  132. package/dist/application/tasks.js +1 -1
  133. package/dist/application/tasks.js.map +1 -1
  134. package/dist/application/tasks.types.d.ts +4 -3
  135. package/dist/application/tasks.types.js.map +1 -1
  136. package/dist/application/workspace-allocation.d.ts +3 -0
  137. package/dist/application/workspace-allocation.js +34 -0
  138. package/dist/application/workspace-allocation.js.map +1 -0
  139. package/dist/application/workspace.js +2 -2
  140. package/dist/application/workspace.js.map +1 -1
  141. package/dist/cli/commands.js +55 -18
  142. package/dist/cli/commands.js.map +1 -1
  143. package/dist/cli/doctor-command.js +1 -1
  144. package/dist/cli/doctor-command.js.map +1 -1
  145. package/dist/cli/init-authentication.constants.d.ts +13 -0
  146. package/dist/cli/init-authentication.constants.js +10 -0
  147. package/dist/cli/init-authentication.constants.js.map +1 -0
  148. package/dist/cli/init-authentication.d.ts +4 -0
  149. package/dist/cli/init-authentication.js +43 -0
  150. package/dist/cli/init-authentication.js.map +1 -0
  151. package/dist/cli/init-command.js +74 -15
  152. package/dist/cli/init-command.js.map +1 -1
  153. package/dist/cli/main.constants.d.ts +111 -2
  154. package/dist/cli/main.constants.js +148 -42
  155. package/dist/cli/main.constants.js.map +1 -1
  156. package/dist/cli/recovery-command.js +28 -4
  157. package/dist/cli/recovery-command.js.map +1 -1
  158. package/dist/cli/recovery-restore-command.d.ts +2 -0
  159. package/dist/cli/recovery-restore-command.js +34 -0
  160. package/dist/cli/recovery-restore-command.js.map +1 -0
  161. package/dist/cli/scaffold-files.js +3 -2
  162. package/dist/cli/scaffold-files.js.map +1 -1
  163. package/dist/cli/scaffold-validation.js +20 -1
  164. package/dist/cli/scaffold-validation.js.map +1 -1
  165. package/dist/cli/scaffold.constants.js +2 -2
  166. package/dist/cli/scaffold.constants.js.map +1 -1
  167. package/dist/cli/scaffold.js +13 -0
  168. package/dist/cli/scaffold.js.map +1 -1
  169. package/dist/cli/scaffold.types.d.ts +4 -1
  170. package/dist/cli/scaffold.types.js.map +1 -1
  171. package/dist/cli/starters.js +9 -2
  172. package/dist/cli/starters.js.map +1 -1
  173. package/dist/domain/agent.types.d.ts +2 -0
  174. package/dist/domain/agent.types.js.map +1 -1
  175. package/dist/domain/artifact-reference.d.ts +4 -0
  176. package/dist/domain/artifact-reference.js +90 -0
  177. package/dist/domain/artifact-reference.js.map +1 -0
  178. package/dist/domain/artifact.constants.d.ts +2 -0
  179. package/dist/domain/artifact.constants.js +3 -0
  180. package/dist/domain/artifact.constants.js.map +1 -0
  181. package/dist/domain/artifact.d.ts +7 -0
  182. package/dist/domain/artifact.js +104 -0
  183. package/dist/domain/artifact.js.map +1 -0
  184. package/dist/domain/artifact.types.d.ts +44 -0
  185. package/dist/domain/artifact.types.js +2 -0
  186. package/dist/domain/artifact.types.js.map +1 -0
  187. package/dist/domain/egress.constants.d.ts +1 -0
  188. package/dist/domain/egress.constants.js +7 -0
  189. package/dist/domain/egress.constants.js.map +1 -0
  190. package/dist/domain/egress.d.ts +2 -0
  191. package/dist/domain/egress.js +48 -0
  192. package/dist/domain/egress.js.map +1 -0
  193. package/dist/domain/egress.types.d.ts +8 -0
  194. package/dist/domain/egress.types.js +2 -0
  195. package/dist/domain/egress.types.js.map +1 -0
  196. package/dist/domain/sandbox.types.d.ts +1 -0
  197. package/dist/domain/sandbox.types.js.map +1 -1
  198. package/dist/domain/task-queue.constants.d.ts +8 -0
  199. package/dist/domain/task-queue.constants.js +9 -0
  200. package/dist/domain/task-queue.constants.js.map +1 -0
  201. package/dist/domain/task-queue.d.ts +11 -0
  202. package/dist/domain/task-queue.js +105 -0
  203. package/dist/domain/task-queue.js.map +1 -0
  204. package/dist/domain/task-queue.types.d.ts +41 -0
  205. package/dist/domain/task-queue.types.js +2 -0
  206. package/dist/domain/task-queue.types.js.map +1 -0
  207. package/dist/domain/workflow/budget.d.ts +2 -2
  208. package/dist/domain/workflow/budget.js +5 -3
  209. package/dist/domain/workflow/budget.js.map +1 -1
  210. package/dist/domain/workflow/checkpoint-validation.d.ts +3 -0
  211. package/dist/domain/workflow/checkpoint-validation.js +81 -0
  212. package/dist/domain/workflow/checkpoint-validation.js.map +1 -0
  213. package/dist/domain/workflow/checkpoint-value.d.ts +2 -0
  214. package/dist/domain/workflow/checkpoint-value.js +49 -0
  215. package/dist/domain/workflow/checkpoint-value.js.map +1 -0
  216. package/dist/domain/workflow/checkpoint.d.ts +3 -0
  217. package/dist/domain/workflow/checkpoint.js +70 -0
  218. package/dist/domain/workflow/checkpoint.js.map +1 -0
  219. package/dist/domain/workflow/checkpoint.types.d.ts +40 -0
  220. package/dist/domain/workflow/checkpoint.types.js +2 -0
  221. package/dist/domain/workflow/checkpoint.types.js.map +1 -0
  222. package/dist/domain/workflow/gate-validation.d.ts +4 -0
  223. package/dist/domain/workflow/gate-validation.js +71 -0
  224. package/dist/domain/workflow/gate-validation.js.map +1 -0
  225. package/dist/domain/workflow/gates.constants.d.ts +4 -0
  226. package/dist/domain/workflow/gates.constants.js +5 -0
  227. package/dist/domain/workflow/gates.constants.js.map +1 -0
  228. package/dist/domain/workflow/gates.d.ts +7 -0
  229. package/dist/domain/workflow/gates.js +85 -0
  230. package/dist/domain/workflow/gates.js.map +1 -0
  231. package/dist/domain/workflow/gates.types.d.ts +27 -0
  232. package/dist/domain/workflow/gates.types.js +2 -0
  233. package/dist/domain/workflow/gates.types.js.map +1 -0
  234. package/dist/domain/workflow/task-runner.js +14 -2
  235. package/dist/domain/workflow/task-runner.js.map +1 -1
  236. package/dist/domain/workflow/usage-receipt.constants.d.ts +2 -0
  237. package/dist/domain/workflow/usage-receipt.constants.js +3 -0
  238. package/dist/domain/workflow/usage-receipt.constants.js.map +1 -0
  239. package/dist/domain/workflow/usage-receipt.d.ts +2 -0
  240. package/dist/domain/workflow/usage-receipt.js +18 -0
  241. package/dist/domain/workflow/usage-receipt.js.map +1 -0
  242. package/dist/domain/workflow/validation.js +6 -0
  243. package/dist/domain/workflow/validation.js.map +1 -1
  244. package/dist/domain/workflow/workflow-scheduler.js +65 -32
  245. package/dist/domain/workflow/workflow-scheduler.js.map +1 -1
  246. package/dist/domain/workflow/workflow-state.d.ts +2 -1
  247. package/dist/domain/workflow/workflow-state.js +91 -16
  248. package/dist/domain/workflow/workflow-state.js.map +1 -1
  249. package/dist/domain/workflow.types.d.ts +13 -2
  250. package/dist/domain/workflow.types.js.map +1 -1
  251. package/dist/index.d.ts +32 -2
  252. package/dist/index.js +14 -1
  253. package/dist/index.js.map +1 -1
  254. package/dist/infrastructure/artifact-store.constants.d.ts +1 -0
  255. package/dist/infrastructure/artifact-store.constants.js +2 -0
  256. package/dist/infrastructure/artifact-store.constants.js.map +1 -0
  257. package/dist/infrastructure/artifact-store.d.ts +3 -0
  258. package/dist/infrastructure/artifact-store.js +100 -0
  259. package/dist/infrastructure/artifact-store.js.map +1 -0
  260. package/dist/infrastructure/artifact-store.types.d.ts +4 -0
  261. package/dist/infrastructure/artifact-store.types.js +2 -0
  262. package/dist/infrastructure/artifact-store.types.js.map +1 -0
  263. package/dist/infrastructure/file-manifest.d.ts +1 -1
  264. package/dist/infrastructure/file-manifest.js +3 -2
  265. package/dist/infrastructure/file-manifest.js.map +1 -1
  266. package/dist/infrastructure/git/verification-command.d.ts +1 -1
  267. package/dist/infrastructure/git/verification-command.js +3 -2
  268. package/dist/infrastructure/git/verification-command.js.map +1 -1
  269. package/dist/infrastructure/opentelemetry.js +1 -1
  270. package/dist/infrastructure/opentelemetry.js.map +1 -1
  271. package/dist/infrastructure/resource-activity-inspection.d.ts +2 -0
  272. package/dist/infrastructure/resource-activity-inspection.js +152 -0
  273. package/dist/infrastructure/resource-activity-inspection.js.map +1 -0
  274. package/dist/infrastructure/resource-activity.constants.d.ts +8 -0
  275. package/dist/infrastructure/resource-activity.constants.js +26 -0
  276. package/dist/infrastructure/resource-activity.constants.js.map +1 -0
  277. package/dist/infrastructure/resource-activity.d.ts +2 -0
  278. package/dist/infrastructure/resource-activity.js +166 -0
  279. package/dist/infrastructure/resource-activity.js.map +1 -0
  280. package/dist/infrastructure/resource-activity.types.d.ts +53 -0
  281. package/dist/infrastructure/resource-activity.types.js +2 -0
  282. package/dist/infrastructure/resource-activity.types.js.map +1 -0
  283. package/dist/infrastructure/storage-mutation-lock.constants.d.ts +5 -0
  284. package/dist/infrastructure/storage-mutation-lock.constants.js +6 -0
  285. package/dist/infrastructure/storage-mutation-lock.constants.js.map +1 -0
  286. package/dist/infrastructure/storage-mutation-lock.d.ts +1 -0
  287. package/dist/infrastructure/storage-mutation-lock.js +21 -0
  288. package/dist/infrastructure/storage-mutation-lock.js.map +1 -0
  289. package/dist/infrastructure/storage-reservations.constants.d.ts +4 -0
  290. package/dist/infrastructure/storage-reservations.constants.js +5 -0
  291. package/dist/infrastructure/storage-reservations.constants.js.map +1 -0
  292. package/dist/infrastructure/storage-reservations.d.ts +2 -0
  293. package/dist/infrastructure/storage-reservations.js +150 -0
  294. package/dist/infrastructure/storage-reservations.js.map +1 -0
  295. package/dist/infrastructure/storage-reservations.types.d.ts +21 -0
  296. package/dist/infrastructure/storage-reservations.types.js +2 -0
  297. package/dist/infrastructure/storage-reservations.types.js.map +1 -0
  298. package/dist/infrastructure/task-queue-http.constants.d.ts +2 -0
  299. package/dist/infrastructure/task-queue-http.constants.js +3 -0
  300. package/dist/infrastructure/task-queue-http.constants.js.map +1 -0
  301. package/dist/infrastructure/task-queue-http.d.ts +4 -0
  302. package/dist/infrastructure/task-queue-http.js +158 -0
  303. package/dist/infrastructure/task-queue-http.js.map +1 -0
  304. package/dist/infrastructure/task-queue-http.types.d.ts +16 -0
  305. package/dist/infrastructure/task-queue-http.types.js +2 -0
  306. package/dist/infrastructure/task-queue-http.types.js.map +1 -0
  307. package/dist/infrastructure/task-queue.d.ts +2 -0
  308. package/dist/infrastructure/task-queue.js +134 -0
  309. package/dist/infrastructure/task-queue.js.map +1 -0
  310. package/dist/infrastructure/transfer.js +5 -0
  311. package/dist/infrastructure/transfer.js.map +1 -1
  312. package/dist/infrastructure/workflow-checkpoint.constants.d.ts +1 -0
  313. package/dist/infrastructure/workflow-checkpoint.constants.js +2 -0
  314. package/dist/infrastructure/workflow-checkpoint.constants.js.map +1 -0
  315. package/dist/infrastructure/workflow-checkpoint.d.ts +3 -0
  316. package/dist/infrastructure/workflow-checkpoint.js +77 -0
  317. package/dist/infrastructure/workflow-checkpoint.js.map +1 -0
  318. package/dist/infrastructure/workflow-checkpoint.types.d.ts +4 -0
  319. package/dist/infrastructure/workflow-checkpoint.types.js +2 -0
  320. package/dist/infrastructure/workflow-checkpoint.types.js.map +1 -0
  321. package/dist/providers/agents.d.ts +3 -1
  322. package/dist/providers/agents.js +1 -0
  323. package/dist/providers/agents.js.map +1 -1
  324. package/dist/providers/container-isolation.d.ts +2 -0
  325. package/dist/providers/container-isolation.js +29 -0
  326. package/dist/providers/container-isolation.js.map +1 -0
  327. package/dist/providers/container-mounts.js +7 -2
  328. package/dist/providers/container-mounts.js.map +1 -1
  329. package/dist/providers/container-network.d.ts +2 -0
  330. package/dist/providers/container-network.js +14 -0
  331. package/dist/providers/container-network.js.map +1 -0
  332. package/dist/providers/container-plan.js +4 -2
  333. package/dist/providers/container-plan.js.map +1 -1
  334. package/dist/providers/container.constants.d.ts +1 -0
  335. package/dist/providers/container.constants.js +1 -0
  336. package/dist/providers/container.constants.js.map +1 -1
  337. package/dist/providers/container.js +19 -2
  338. package/dist/providers/container.js.map +1 -1
  339. package/dist/providers/container.types.d.ts +3 -0
  340. package/dist/providers/container.types.js.map +1 -1
  341. package/dist/providers/daytona-command.constants.d.ts +2 -0
  342. package/dist/providers/daytona-command.constants.js +13 -0
  343. package/dist/providers/daytona-command.constants.js.map +1 -0
  344. package/dist/providers/daytona-command.js +12 -5
  345. package/dist/providers/daytona-command.js.map +1 -1
  346. package/dist/providers/daytona-output.d.ts +4 -0
  347. package/dist/providers/daytona-output.js +37 -0
  348. package/dist/providers/daytona-output.js.map +1 -0
  349. package/dist/providers/daytona-terminal.d.ts +3 -0
  350. package/dist/providers/daytona-terminal.js +130 -0
  351. package/dist/providers/daytona-terminal.js.map +1 -0
  352. package/dist/providers/daytona.js +2 -0
  353. package/dist/providers/daytona.js.map +1 -1
  354. package/dist/providers/docker.d.ts +1 -0
  355. package/dist/providers/docker.js.map +1 -1
  356. package/dist/providers/file-batches.d.ts +1 -1
  357. package/dist/providers/file-batches.js +9 -0
  358. package/dist/providers/file-batches.js.map +1 -1
  359. package/dist/providers/file-upload.constants.d.ts +1 -0
  360. package/dist/providers/file-upload.constants.js +68 -0
  361. package/dist/providers/file-upload.constants.js.map +1 -0
  362. package/dist/providers/file-upload.d.ts +2 -0
  363. package/dist/providers/file-upload.js +146 -0
  364. package/dist/providers/file-upload.js.map +1 -0
  365. package/dist/providers/firecracker-command.d.ts +5 -0
  366. package/dist/providers/firecracker-command.js +114 -0
  367. package/dist/providers/firecracker-command.js.map +1 -0
  368. package/dist/providers/firecracker-files.constants.d.ts +1 -0
  369. package/dist/providers/firecracker-files.constants.js +21 -0
  370. package/dist/providers/firecracker-files.constants.js.map +1 -0
  371. package/dist/providers/firecracker-files.d.ts +3 -0
  372. package/dist/providers/firecracker-files.js +110 -0
  373. package/dist/providers/firecracker-files.js.map +1 -0
  374. package/dist/providers/firecracker-machine.d.ts +3 -0
  375. package/dist/providers/firecracker-machine.js +155 -0
  376. package/dist/providers/firecracker-machine.js.map +1 -0
  377. package/dist/providers/firecracker.constants.d.ts +10 -0
  378. package/dist/providers/firecracker.constants.js +11 -0
  379. package/dist/providers/firecracker.constants.js.map +1 -0
  380. package/dist/providers/firecracker.d.ts +4 -0
  381. package/dist/providers/firecracker.js +103 -0
  382. package/dist/providers/firecracker.js.map +1 -0
  383. package/dist/providers/firecracker.types.d.ts +36 -0
  384. package/dist/providers/firecracker.types.js +2 -0
  385. package/dist/providers/firecracker.types.js.map +1 -0
  386. package/dist/providers/local.js +2 -1
  387. package/dist/providers/local.js.map +1 -1
  388. package/dist/providers/podman.d.ts +1 -0
  389. package/dist/providers/podman.js.map +1 -1
  390. package/dist/providers/terminal-bridge.d.ts +14 -0
  391. package/dist/providers/terminal-bridge.js +100 -0
  392. package/dist/providers/terminal-bridge.js.map +1 -0
  393. package/dist/providers/vercel-command.js +2 -2
  394. package/dist/providers/vercel-command.js.map +1 -1
  395. package/dist/providers/vercel-directory.d.ts +2 -0
  396. package/dist/providers/vercel-directory.js +7 -0
  397. package/dist/providers/vercel-directory.js.map +1 -0
  398. package/dist/providers/vercel-files.js +3 -2
  399. package/dist/providers/vercel-files.js.map +1 -1
  400. package/dist/providers/vercel-network.d.ts +2 -0
  401. package/dist/providers/vercel-network.js +18 -0
  402. package/dist/providers/vercel-network.js.map +1 -0
  403. package/dist/providers/vercel.d.ts +1 -0
  404. package/dist/providers/vercel.js +5 -1
  405. package/dist/providers/vercel.js.map +1 -1
  406. package/dist/providers/vercel.types.d.ts +2 -0
  407. package/dist/providers/vercel.types.js.map +1 -1
  408. package/dist/providers/versions.constants.d.ts +1 -0
  409. package/dist/providers/versions.constants.js +1 -0
  410. package/dist/providers/versions.constants.js.map +1 -1
  411. package/package.json +10 -2
@@ -1 +1 @@
1
- {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/application/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,IAAI,EAA+B,MAAM,uBAAuB,CAAC;AAE1E,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAOxC,MAAM,UAAU,SAAS,CACvB,OACqB;IAErB,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,GAAG,OAAO,CAAC;IACpD,OAAO,IAAI,CAAC;QACV,GAAG,UAAU;QACb,KAAK,CAAC,OAAO,CAAC,OAAO;YACnB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC;gBACpC,GAAG,OAAO;gBACV,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;YACH,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9B,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,OACwB;IAExB,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,GAAG,OAAO,CAAC;IAC3C,OAAO,IAAI,CAAC;QACV,GAAG,UAAU;QACb,KAAK,CAAC,OAAO,CAAC,OAAO;YACnB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC;gBAC5B,GAAG,OAAO;gBACV,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;YACH,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9B,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,OAAyE;IAEzE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,GAAG,OAAO,CAAC;IACpD,OAAO,IAAI,CAAC;QACV,GAAG,UAAU;QACb,KAAK,CAAC,OAAO,CAAC,OAAO;YACnB,MAAM,UAAU,GACd,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC7D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC;gBACnC,GAAG,UAAU;gBACb,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;gBACrB,MAAM,IAAI,YAAY,CAAC,SAAS,EAAE,yBAAyB,EAAE;oBAC3D,GAAG,MAAM;iBACV,CAAC,CAAC;YACL,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { taskUsage } from \"./task-usage.ts\";\nimport { OutpostError } from \"../domain/errors.ts\";\nimport type { CommandResult } from \"../domain/ports.ts\";\nimport { task, type Task, type TaskOptions } from \"../domain/workflow.ts\";\nimport type { DispatchResult } from \"./outpost.ts\";\nimport { dispatch } from \"./outpost.ts\";\nimport type {\n AgentTaskOptions,\n CommandTaskOptions,\n IsolatedTaskOptions,\n} from \"./tasks.types.ts\";\n\nexport function agentTask<T>(\n options: Omit<TaskOptions<DispatchResult<T>>, \"perform\"> &\n AgentTaskOptions<T>,\n): Task<DispatchResult<T>> {\n const { sandbox, request, ...definition } = options;\n return task({\n ...definition,\n async perform(context) {\n const options = request(context);\n const usage = taskUsage(context, options.observe);\n const result = await sandbox.dispatch({\n ...options,\n signal: context.signal,\n observe: usage.observe,\n });\n usage.reconcile(result.usage);\n return result;\n },\n });\n}\n\nexport function isolatedTask<T>(\n options: Omit<TaskOptions<DispatchResult<T>>, \"perform\"> &\n IsolatedTaskOptions<T>,\n): Task<DispatchResult<T>> {\n const { request, ...definition } = options;\n return task({\n ...definition,\n async perform(context) {\n const options = request(context);\n const usage = taskUsage(context, options.observe);\n const result = await dispatch({\n ...options,\n signal: context.signal,\n observe: usage.observe,\n });\n usage.reconcile(result.usage);\n return result;\n },\n });\n}\n\nexport function commandTask(\n options: Omit<TaskOptions<CommandResult>, \"perform\"> & CommandTaskOptions,\n): Task<CommandResult> {\n const { sandbox, command, ...definition } = options;\n return task({\n ...definition,\n async perform(context) {\n const invocation =\n typeof command === \"function\" ? command(context) : command;\n const result = await sandbox.command({\n ...invocation,\n signal: context.signal,\n });\n if (result.status !== 0)\n throw new OutpostError(\"process\", \"Workflow command failed\", {\n ...result,\n });\n return result;\n },\n });\n}\n"]}
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/application/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,IAAI,EAA+B,MAAM,uBAAuB,CAAC;AAE1E,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAOxC,MAAM,UAAU,SAAS,CACvB,OACqB;IAErB,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,GAAG,OAAO,CAAC;IACpD,OAAO,IAAI,CAAC;QACV,GAAG,UAAU;QACb,KAAK,CAAC,OAAO,CAAC,OAAO;YACnB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC;gBACpC,GAAG,OAAO;gBACV,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;YACH,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9B,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,OACwB;IAExB,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,GAAG,OAAO,CAAC;IAC3C,OAAO,IAAI,CAAC;QACV,GAAG,UAAU;QACb,KAAK,CAAC,OAAO,CAAC,OAAO;YACnB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;YACvC,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC;gBAC5B,GAAG,OAAO;gBACV,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;YACH,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9B,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,OAAyE;IAEzE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,GAAG,OAAO,CAAC;IACpD,OAAO,IAAI,CAAC;QACV,GAAG,UAAU;QACb,KAAK,CAAC,OAAO,CAAC,OAAO;YACnB,MAAM,UAAU,GACd,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC7D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC;gBACnC,GAAG,UAAU;gBACb,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;gBACrB,MAAM,IAAI,YAAY,CAAC,SAAS,EAAE,yBAAyB,EAAE;oBAC3D,GAAG,MAAM;iBACV,CAAC,CAAC;YACL,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { taskUsage } from \"./task-usage.ts\";\nimport { OutpostError } from \"../domain/errors.ts\";\nimport type { CommandResult } from \"../domain/ports.ts\";\nimport { task, type Task, type TaskOptions } from \"../domain/workflow.ts\";\nimport type { DispatchResult } from \"./outpost.ts\";\nimport { dispatch } from \"./outpost.ts\";\nimport type {\n AgentTaskOptions,\n CommandTaskOptions,\n IsolatedTaskOptions,\n} from \"./tasks.types.ts\";\n\nexport function agentTask<T>(\n options: Omit<TaskOptions<DispatchResult<T>>, \"perform\"> &\n AgentTaskOptions<T>,\n): Task<DispatchResult<T>> {\n const { sandbox, request, ...definition } = options;\n return task({\n ...definition,\n async perform(context) {\n const options = request(context);\n const usage = taskUsage(context, options.observe);\n const result = await sandbox.dispatch({\n ...options,\n signal: context.signal,\n observe: usage.observe,\n });\n usage.reconcile(result.usage);\n return result;\n },\n });\n}\n\nexport function isolatedTask<T>(\n options: Omit<TaskOptions<DispatchResult<T>>, \"perform\"> &\n IsolatedTaskOptions<T>,\n): Task<DispatchResult<T>> {\n const { request, ...definition } = options;\n return task({\n ...definition,\n async perform(context) {\n const options = await request(context);\n const usage = taskUsage(context, options.observe);\n const result = await dispatch({\n ...options,\n signal: context.signal,\n observe: usage.observe,\n });\n usage.reconcile(result.usage);\n return result;\n },\n });\n}\n\nexport function commandTask(\n options: Omit<TaskOptions<CommandResult>, \"perform\"> & CommandTaskOptions,\n): Task<CommandResult> {\n const { sandbox, command, ...definition } = options;\n return task({\n ...definition,\n async perform(context) {\n const invocation =\n typeof command === \"function\" ? command(context) : command;\n const result = await sandbox.command({\n ...invocation,\n signal: context.signal,\n });\n if (result.status !== 0)\n throw new OutpostError(\"process\", \"Workflow command failed\", {\n ...result,\n });\n return result;\n },\n });\n}\n"]}
@@ -8,11 +8,12 @@ export type CommandTaskOptions = {
8
8
  command: Command | ((context: TaskContext) => Command);
9
9
  };
10
10
  export type IsolatedTaskOptions<T> = {
11
- request: (context: TaskContext) => SandboxOptions & DispatchOptions<T> & {
12
- readonly agent: AgentAdapter;
13
- };
11
+ request: (context: TaskContext) => IsolatedTaskRequest<T> | Promise<IsolatedTaskRequest<T>>;
14
12
  };
15
13
  export type AgentTaskOptions<T> = {
16
14
  sandbox: Sandbox;
17
15
  request: (context: TaskContext) => DispatchOptions<T>;
18
16
  };
17
+ export type IsolatedTaskRequest<T> = SandboxOptions & DispatchOptions<T> & {
18
+ readonly agent: AgentAdapter;
19
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"tasks.types.js","sourceRoot":"","sources":["../../src/application/tasks.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { AgentAdapter } from \"../domain/agent.types.ts\";\nimport type { Command } from \"../domain/command.types.ts\";\nimport type { TaskContext } from \"../domain/workflow.types.ts\";\nimport type { DispatchOptions } from \"./execution.types.ts\";\nimport type { Sandbox, SandboxOptions } from \"./outpost.types.ts\";\n\nexport type CommandTaskOptions = {\n sandbox: Sandbox;\n command: Command | ((context: TaskContext) => Command);\n};\n\nexport type IsolatedTaskOptions<T> = {\n request: (\n context: TaskContext,\n ) => SandboxOptions & DispatchOptions<T> & { readonly agent: AgentAdapter };\n};\n\nexport type AgentTaskOptions<T> = {\n sandbox: Sandbox;\n request: (context: TaskContext) => DispatchOptions<T>;\n};\n"]}
1
+ {"version":3,"file":"tasks.types.js","sourceRoot":"","sources":["../../src/application/tasks.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { AgentAdapter } from \"../domain/agent.types.ts\";\nimport type { Command } from \"../domain/command.types.ts\";\nimport type { TaskContext } from \"../domain/workflow.types.ts\";\nimport type { DispatchOptions } from \"./execution.types.ts\";\nimport type { Sandbox, SandboxOptions } from \"./outpost.types.ts\";\n\nexport type CommandTaskOptions = {\n sandbox: Sandbox;\n command: Command | ((context: TaskContext) => Command);\n};\n\nexport type IsolatedTaskOptions<T> = {\n request: (\n context: TaskContext,\n ) => IsolatedTaskRequest<T> | Promise<IsolatedTaskRequest<T>>;\n};\n\nexport type AgentTaskOptions<T> = {\n sandbox: Sandbox;\n request: (context: TaskContext) => DispatchOptions<T>;\n};\n\nexport type IsolatedTaskRequest<T> = SandboxOptions &\n DispatchOptions<T> & { readonly agent: AgentAdapter };\n"]}
@@ -0,0 +1,3 @@
1
+ import type { WorkspaceLease } from "../infrastructure/git/workspace.types.ts";
2
+ import type { WorkspaceOptions } from "./outpost.types.ts";
3
+ export declare function allocateWorkspace(options: WorkspaceOptions): Promise<WorkspaceLease>;
@@ -0,0 +1,34 @@
1
+ import { acquireWorkspace } from "../infrastructure/git/workspace.js";
2
+ import { reserveRecoveryStorage } from "./storage-reservation.js";
3
+ export async function allocateWorkspace(options) {
4
+ if (!options.storageQuota)
5
+ return acquireWorkspace(options);
6
+ const reservation = await reserveRecoveryStorage({
7
+ ...options.storageQuota,
8
+ ...(options.repository ? { repository: options.repository } : {}),
9
+ ...(options.signal ? { signal: options.signal } : {}),
10
+ });
11
+ try {
12
+ options.signal?.throwIfAborted();
13
+ const lease = await acquireWorkspace({
14
+ ...options,
15
+ repository: reservation.repository,
16
+ });
17
+ return {
18
+ ...lease,
19
+ async dispose(preserve) {
20
+ try {
21
+ return await lease.dispose(preserve);
22
+ }
23
+ finally {
24
+ await reservation.release();
25
+ }
26
+ },
27
+ };
28
+ }
29
+ catch (error) {
30
+ await reservation.release();
31
+ throw error;
32
+ }
33
+ }
34
+ //# sourceMappingURL=workspace-allocation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-allocation.js","sourceRoot":"","sources":["../../src/application/workspace-allocation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAGtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAyB;IAEzB,IAAI,CAAC,OAAO,CAAC,YAAY;QAAE,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,MAAM,sBAAsB,CAAC;QAC/C,GAAG,OAAO,CAAC,YAAY;QACvB,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtD,CAAC,CAAC;IACH,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC;YACnC,GAAG,OAAO;YACV,UAAU,EAAE,WAAW,CAAC,UAAU;SACnC,CAAC,CAAC;QACH,OAAO;YACL,GAAG,KAAK;YACR,KAAK,CAAC,OAAO,CAAC,QAAQ;gBACpB,IAAI,CAAC;oBACH,OAAO,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACvC,CAAC;wBAAS,CAAC;oBACT,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;gBAC9B,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;QAC5B,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC","sourcesContent":["import { acquireWorkspace } from \"../infrastructure/git/workspace.ts\";\nimport type { WorkspaceLease } from \"../infrastructure/git/workspace.types.ts\";\nimport type { WorkspaceOptions } from \"./outpost.types.ts\";\nimport { reserveRecoveryStorage } from \"./storage-reservation.ts\";\n\nexport async function allocateWorkspace(\n options: WorkspaceOptions,\n): Promise<WorkspaceLease> {\n if (!options.storageQuota) return acquireWorkspace(options);\n const reservation = await reserveRecoveryStorage({\n ...options.storageQuota,\n ...(options.repository ? { repository: options.repository } : {}),\n ...(options.signal ? { signal: options.signal } : {}),\n });\n try {\n options.signal?.throwIfAborted();\n const lease = await acquireWorkspace({\n ...options,\n repository: reservation.repository,\n });\n return {\n ...lease,\n async dispose(preserve) {\n try {\n return await lease.dispose(preserve);\n } finally {\n await reservation.release();\n }\n },\n };\n } catch (error) {\n await reservation.release();\n throw error;\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { invariant } from "../domain/errors.js";
2
- import { acquireWorkspace } from "../infrastructure/git/workspace.js";
2
+ import { allocateWorkspace } from "./workspace-allocation.js";
3
3
  import { executeProcess } from "../infrastructure/process.js";
4
4
  import { attach } from "./attach.js";
5
5
  import { dispatch } from "./dispatch.js";
@@ -9,7 +9,7 @@ import { startupFailure } from "./startup-recovery.js";
9
9
  import { workspaces } from "./workspace-registry.js";
10
10
  export async function openWorkspace(options = {}) {
11
11
  options.signal?.throwIfAborted();
12
- const lease = await acquireWorkspace(options);
12
+ const lease = await allocateWorkspace(options);
13
13
  try {
14
14
  await hooks(options.hooks?.workspaceReady ?? [], lease.directory, executeProcess, options.signal);
15
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/application/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAA4B,EAAE;IAE9B,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,KAAK,CACT,OAAO,CAAC,KAAK,EAAE,cAAc,IAAI,EAAE,EACnC,KAAK,CAAC,SAAS,EACf,cAAc,EACd,OAAO,CAAC,MAAM,CACf,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;QACtB,MAAM,KAAK,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG;QACZ,KAAK;QACL,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,KAAK;QACb,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnD,CAAC;IACF,MAAM,MAAM,GAAc;QACxB,GAAG,KAAK;QACR,QAAQ,CAAC,OAAO;YACd,OAAO,QAAQ,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,CAAC,OAAO,GAAG,EAAE;YAClB,OAAO,aAAa,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,MAAM,CAAC,OAAO;YACZ,OAAO,MAAM,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE;YACvB,SAAS,CACP,CAAC,KAAK,CAAC,MAAM,EACb,gDAAgD,CACjD,CAAC;YACF,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;YACpB,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QACD,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;YACzB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;KACF,CAAC;IACF,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC9B,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { invariant } from \"../domain/errors.ts\";\nimport { acquireWorkspace } from \"../infrastructure/git/workspace.ts\";\nimport { executeProcess } from \"../infrastructure/process.ts\";\nimport { attach } from \"./attach.ts\";\nimport { dispatch } from \"./dispatch.ts\";\nimport { hooks } from \"./lifecycle-hooks.ts\";\nimport type { Workspace, WorkspaceOptions } from \"./outpost.types.ts\";\nimport { createSandbox } from \"./sandbox.ts\";\nimport { startupFailure } from \"./startup-recovery.ts\";\nimport { workspaces } from \"./workspace-registry.ts\";\n\nexport async function openWorkspace(\n options: WorkspaceOptions = {},\n): Promise<Workspace> {\n options.signal?.throwIfAborted();\n const lease = await acquireWorkspace(options);\n try {\n await hooks(\n options.hooks?.workspaceReady ?? [],\n lease.directory,\n executeProcess,\n options.signal,\n );\n } catch (cause) {\n await startupFailure(lease, cause, options);\n await lease.dispose();\n throw cause;\n }\n const state = {\n lease,\n active: false,\n closed: false,\n ...(options.hooks ? { hooks: options.hooks } : {}),\n };\n const result: Workspace = {\n ...lease,\n dispatch(options) {\n return dispatch({ ...options, workspace: result });\n },\n sandbox(options = {}) {\n return createSandbox({ ...options, workspace: result });\n },\n attach(options) {\n return attach({ ...options, workspace: result });\n },\n async close(settings = {}) {\n invariant(\n !state.active,\n \"Close the sandbox before closing its workspace\",\n );\n state.closed = true;\n return lease.dispose(settings.preserve);\n },\n async [Symbol.asyncDispose]() {\n await result.close();\n },\n };\n workspaces.set(result, state);\n return result;\n}\n"]}
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/application/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAA4B,EAAE;IAE9B,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,KAAK,CACT,OAAO,CAAC,KAAK,EAAE,cAAc,IAAI,EAAE,EACnC,KAAK,CAAC,SAAS,EACf,cAAc,EACd,OAAO,CAAC,MAAM,CACf,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;QACtB,MAAM,KAAK,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG;QACZ,KAAK;QACL,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,KAAK;QACb,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnD,CAAC;IACF,MAAM,MAAM,GAAc;QACxB,GAAG,KAAK;QACR,QAAQ,CAAC,OAAO;YACd,OAAO,QAAQ,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,CAAC,OAAO,GAAG,EAAE;YAClB,OAAO,aAAa,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,MAAM,CAAC,OAAO;YACZ,OAAO,MAAM,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE;YACvB,SAAS,CACP,CAAC,KAAK,CAAC,MAAM,EACb,gDAAgD,CACjD,CAAC;YACF,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;YACpB,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QACD,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;YACzB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;KACF,CAAC;IACF,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC9B,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { invariant } from \"../domain/errors.ts\";\nimport { allocateWorkspace } from \"./workspace-allocation.ts\";\nimport { executeProcess } from \"../infrastructure/process.ts\";\nimport { attach } from \"./attach.ts\";\nimport { dispatch } from \"./dispatch.ts\";\nimport { hooks } from \"./lifecycle-hooks.ts\";\nimport type { Workspace, WorkspaceOptions } from \"./outpost.types.ts\";\nimport { createSandbox } from \"./sandbox.ts\";\nimport { startupFailure } from \"./startup-recovery.ts\";\nimport { workspaces } from \"./workspace-registry.ts\";\n\nexport async function openWorkspace(\n options: WorkspaceOptions = {},\n): Promise<Workspace> {\n options.signal?.throwIfAborted();\n const lease = await allocateWorkspace(options);\n try {\n await hooks(\n options.hooks?.workspaceReady ?? [],\n lease.directory,\n executeProcess,\n options.signal,\n );\n } catch (cause) {\n await startupFailure(lease, cause, options);\n await lease.dispose();\n throw cause;\n }\n const state = {\n lease,\n active: false,\n closed: false,\n ...(options.hooks ? { hooks: options.hooks } : {}),\n };\n const result: Workspace = {\n ...lease,\n dispatch(options) {\n return dispatch({ ...options, workspace: result });\n },\n sandbox(options = {}) {\n return createSandbox({ ...options, workspace: result });\n },\n attach(options) {\n return attach({ ...options, workspace: result });\n },\n async close(settings = {}) {\n invariant(\n !state.active,\n \"Close the sandbox before closing its workspace\",\n );\n state.closed = true;\n return lease.dispose(settings.preserve);\n },\n async [Symbol.asyncDispose]() {\n await result.close();\n },\n };\n workspaces.set(result, state);\n return result;\n}\n"]}
@@ -1,28 +1,65 @@
1
- import { parseArgs } from "node:util";
1
+ import { Command, CommanderError, Option } from "commander";
2
2
  import { recoveryCommand } from "./recovery-command.js";
3
3
  import { doctorCommand } from "./doctor-command.js";
4
4
  import { imageCommand } from "./image-command.js";
5
5
  import { initializeCommand } from "./init-command.js";
6
- import { cliOptions, help } from "./main.constants.js";
6
+ import { cliOptions, commandOptions } from "./main.constants.js";
7
7
  export async function runCli(args = process.argv.slice(2)) {
8
- const invocation = parseArgs({
9
- args,
10
- allowPositionals: true,
11
- options: cliOptions,
12
- });
13
- if (invocation.values.help || !invocation.positionals.length) {
14
- process.stdout.write(help);
15
- return;
16
- }
17
- const commands = {
18
- doctor: doctorCommand,
19
- recovery: recoveryCommand,
8
+ const program = new Command()
9
+ .name("outpost")
10
+ .description("Outpost — sandboxed coding agents and workflows")
11
+ .exitOverride()
12
+ .configureOutput({ writeErr: () => { } });
13
+ const handlers = {
20
14
  init: initializeCommand,
15
+ doctor: doctorCommand,
21
16
  image: imageCommand,
17
+ recovery: recoveryCommand,
22
18
  };
23
- const name = invocation.positionals[0];
24
- if (!Object.hasOwn(commands, name))
25
- throw new Error("Unknown command. Run outpost --help.");
26
- await commands[name](invocation);
19
+ for (const [name, definition] of Object.entries(commandOptions)) {
20
+ const path = name.split(" ");
21
+ let command = program;
22
+ for (const part of path) {
23
+ command =
24
+ command.commands.find((item) => item.name() === part) ??
25
+ command.command(part);
26
+ }
27
+ command.description(definition.description);
28
+ for (const key of definition.options) {
29
+ const configuration = cliOptions[key];
30
+ const short = "short" in configuration ? `-${configuration.short}, ` : "";
31
+ command.addOption(new Option(`${short}--${key}${configuration.type === "string" ? " <value>" : ""}`, configuration.description));
32
+ }
33
+ if (name === "init")
34
+ command.addOption(new Option("--no-build", "Skip automatic container image build").default(undefined));
35
+ command.action(async () => {
36
+ const values = {};
37
+ const parsed = command.opts();
38
+ for (const option of command.options) {
39
+ const value = parsed[option.attributeName()];
40
+ if (typeof value === "string" || typeof value === "boolean")
41
+ values[option.long.replace(/^--(?:no-)?/, "")] = value;
42
+ }
43
+ await handlers[path[0]]({
44
+ values: values,
45
+ positionals: path,
46
+ });
47
+ });
48
+ }
49
+ for (const command of program.commands.filter((item) => item.commands.length)) {
50
+ command.allowExcessArguments().action(() => {
51
+ throw new Error(`Unknown command. Run outpost ${command.name()} --help.`);
52
+ });
53
+ }
54
+ try {
55
+ await program.parseAsync(args.length ? [...args] : ["--help"], {
56
+ from: "user",
57
+ });
58
+ }
59
+ catch (error) {
60
+ if (error instanceof CommanderError && error.exitCode === 0)
61
+ return;
62
+ throw error;
63
+ }
27
64
  }
28
65
  //# sourceMappingURL=commands.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAGvD,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,OAA0B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAE/C,MAAM,UAAU,GAAG,SAAS,CAAC;QAC3B,IAAI;QACJ,gBAAgB,EAAE,IAAI;QACtB,OAAO,EAAE,UAAU;KACpB,CAAC,CAAC;IACH,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO;IACT,CAAC;IACD,MAAM,QAAQ,GAAyC;QACrD,MAAM,EAAE,aAAa;QACrB,QAAQ,EAAE,eAAe;QACzB,IAAI,EAAE,iBAAiB;QACvB,KAAK,EAAE,YAAY;KACpB,CAAC;IACF,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,MAAM,QAAQ,CAAC,IAAI,CAAE,CAAC,UAAU,CAAC,CAAC;AACpC,CAAC","sourcesContent":["import { parseArgs } from \"node:util\";\nimport { recoveryCommand } from \"./recovery-command.ts\";\nimport { doctorCommand } from \"./doctor-command.ts\";\nimport { imageCommand } from \"./image-command.ts\";\nimport { initializeCommand } from \"./init-command.ts\";\nimport { cliOptions, help } from \"./main.constants.ts\";\nimport type { CliCommand } from \"./main.types.ts\";\n\nexport async function runCli(\n args: readonly string[] = process.argv.slice(2),\n): Promise<void> {\n const invocation = parseArgs({\n args,\n allowPositionals: true,\n options: cliOptions,\n });\n if (invocation.values.help || !invocation.positionals.length) {\n process.stdout.write(help);\n return;\n }\n const commands: Readonly<Record<string, CliCommand>> = {\n doctor: doctorCommand,\n recovery: recoveryCommand,\n init: initializeCommand,\n image: imageCommand,\n };\n const name = invocation.positionals[0]!;\n if (!Object.hasOwn(commands, name))\n throw new Error(\"Unknown command. Run outpost --help.\");\n await commands[name]!(invocation);\n}\n"]}
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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","sourcesContent":["import { Command, CommanderError, Option } from \"commander\";\nimport { recoveryCommand } from \"./recovery-command.ts\";\nimport { doctorCommand } from \"./doctor-command.ts\";\nimport { imageCommand } from \"./image-command.ts\";\nimport { initializeCommand } from \"./init-command.ts\";\nimport { cliOptions, commandOptions } from \"./main.constants.ts\";\nimport type { CliCommand, CliValues } from \"./main.types.ts\";\n\nexport async function runCli(\n args: readonly string[] = process.argv.slice(2),\n): Promise<void> {\n const program = new Command()\n .name(\"outpost\")\n .description(\"Outpost — sandboxed coding agents and workflows\")\n .exitOverride()\n .configureOutput({ writeErr: () => {} });\n const handlers: Readonly<Record<string, CliCommand>> = {\n init: initializeCommand,\n doctor: doctorCommand,\n image: imageCommand,\n recovery: recoveryCommand,\n };\n for (const [name, definition] of Object.entries(commandOptions)) {\n const path = name.split(\" \");\n let command = program;\n for (const part of path) {\n command =\n command.commands.find((item) => item.name() === part) ??\n command.command(part);\n }\n command.description(definition.description);\n for (const key of definition.options) {\n const configuration = cliOptions[key];\n const short = \"short\" in configuration ? `-${configuration.short}, ` : \"\";\n command.addOption(\n new Option(\n `${short}--${key}${configuration.type === \"string\" ? \" <value>\" : \"\"}`,\n configuration.description,\n ),\n );\n }\n if (name === \"init\")\n command.addOption(\n new Option(\n \"--no-build\",\n \"Skip automatic container image build\",\n ).default(undefined),\n );\n command.action(async () => {\n const values: Record<string, string | boolean> = {};\n const parsed = command.opts<Record<string, unknown>>();\n for (const option of command.options) {\n const value = parsed[option.attributeName()];\n if (typeof value === \"string\" || typeof value === \"boolean\")\n values[option.long!.replace(/^--(?:no-)?/, \"\")] = value;\n }\n await handlers[path[0]!]!({\n values: values as CliValues,\n positionals: path,\n });\n });\n }\n for (const command of program.commands.filter(\n (item) => item.commands.length,\n )) {\n command.allowExcessArguments().action(() => {\n throw new Error(`Unknown command. Run outpost ${command.name()} --help.`);\n });\n }\n try {\n await program.parseAsync(args.length ? [...args] : [\"--help\"], {\n from: \"user\",\n });\n } catch (error) {\n if (error instanceof CommanderError && error.exitCode === 0) return;\n throw error;\n }\n}\n"]}
@@ -13,7 +13,7 @@ export async function doctorCommand({ values, positionals }, execute, write = (t
13
13
  const provider = values.provider ?? doctorDefaults.provider;
14
14
  const agent = values.agent ?? doctorDefaults.agent;
15
15
  invariant(isProvider(provider), "Unknown provider. Choose docker, podman, local, vercel or daytona.");
16
- invariant(agent === "codex" || agent === "claude", "Unknown agent. Choose codex or claude.");
16
+ invariant(agent === "codex" || agent === "claude" || agent === "gemini", "Unknown agent. Choose codex, claude or gemini.");
17
17
  const report = await diagnose({
18
18
  provider,
19
19
  agent,
@@ -1 +1 @@
1
- {"version":3,"file":"doctor-command.js","sourceRoot":"","sources":["../../src/cli/doctor-command.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n doctorDefaults,\n providerDiagnostics,\n} from \"../application/doctor.constants.ts\";\nimport { diagnose } from \"../application/doctor.ts\";\nimport type { DoctorProvider } from \"../application/doctor.types.ts\";\nimport { invariant } from \"../domain/errors.ts\";\nimport type { Executor } from \"../infrastructure/process.types.ts\";\nimport type { CliInvocation } from \"./main.types.ts\";\n\nfunction isProvider(value: string): value is DoctorProvider {\n return Object.hasOwn(providerDiagnostics, value);\n}\nexport async function doctorCommand(\n { values, positionals }: CliInvocation,\n execute?: Executor,\n write: (text: string) => void = (text) => {\n process.stdout.write(text);\n },\n): Promise<void> {\n invariant(\n positionals.length === 1,\n \"Usage: outpost doctor [--provider NAME] [--agent NAME] [--image NAME] [--json]\",\n );\n for (const key of Object.keys(values))\n invariant(\n [\"provider\", \"agent\", \"image\", \"json\"].includes(key),\n `Unsupported doctor option: --${key}`,\n );\n const provider = values.provider ?? doctorDefaults.provider;\n const agent = values.agent ?? doctorDefaults.agent;\n invariant(\n isProvider(provider),\n \"Unknown provider. Choose docker, podman, local, vercel or daytona.\",\n );\n invariant(\n agent === \"codex\" || agent === \"claude\",\n \"Unknown agent. Choose codex or claude.\",\n );\n const report = await diagnose(\n {\n provider,\n agent,\n ...(values.image !== undefined ? { image: values.image } : {}),\n },\n execute,\n );\n if (values.json) write(`${JSON.stringify(report, null, 2)}\\n`);\n else {\n write(\n `Outpost doctor — ${report.scope === \"host\" ? \"host checks\" : \"host and image checks\"} (${provider}, ${agent})\\n`,\n );\n write(\n `Provider contract: ${report.placement}; interactive terminal: ${report.interactiveTerminal ? \"supported\" : \"unsupported\"}. Workflow execution is not tested.\\n`,\n );\n if (report.image) write(`Image: ${report.image}\\n`);\n for (const check of report.checks)\n write(\n `[${check.status.toUpperCase()}] ${check.id}${check.version ? ` ${check.version}` : \"\"}${check.referenceVersion ? ` (pinned: ${check.referenceVersion})` : \"\"}: ${check.message}\\n`,\n );\n write(\n report.hasFailures\n ? \"Diagnostic checks found failures.\\n\"\n : \"No blocking check failed; warnings and skipped checks still need review.\\n\",\n );\n }\n if (report.hasFailures) process.exitCode = 1;\n}\n"]}
1
+ {"version":3,"file":"doctor-command.js","sourceRoot":"","sources":["../../src/cli/doctor-command.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n doctorDefaults,\n providerDiagnostics,\n} from \"../application/doctor.constants.ts\";\nimport { diagnose } from \"../application/doctor.ts\";\nimport type { DoctorProvider } from \"../application/doctor.types.ts\";\nimport { invariant } from \"../domain/errors.ts\";\nimport type { Executor } from \"../infrastructure/process.types.ts\";\nimport type { CliInvocation } from \"./main.types.ts\";\n\nfunction isProvider(value: string): value is DoctorProvider {\n return Object.hasOwn(providerDiagnostics, value);\n}\nexport async function doctorCommand(\n { values, positionals }: CliInvocation,\n execute?: Executor,\n write: (text: string) => void = (text) => {\n process.stdout.write(text);\n },\n): Promise<void> {\n invariant(\n positionals.length === 1,\n \"Usage: outpost doctor [--provider NAME] [--agent NAME] [--image NAME] [--json]\",\n );\n for (const key of Object.keys(values))\n invariant(\n [\"provider\", \"agent\", \"image\", \"json\"].includes(key),\n `Unsupported doctor option: --${key}`,\n );\n const provider = values.provider ?? doctorDefaults.provider;\n const agent = values.agent ?? doctorDefaults.agent;\n invariant(\n isProvider(provider),\n \"Unknown provider. Choose docker, podman, local, vercel or daytona.\",\n );\n invariant(\n agent === \"codex\" || agent === \"claude\" || agent === \"gemini\",\n \"Unknown agent. Choose codex, claude or gemini.\",\n );\n const report = await diagnose(\n {\n provider,\n agent,\n ...(values.image !== undefined ? { image: values.image } : {}),\n },\n execute,\n );\n if (values.json) write(`${JSON.stringify(report, null, 2)}\\n`);\n else {\n write(\n `Outpost doctor — ${report.scope === \"host\" ? \"host checks\" : \"host and image checks\"} (${provider}, ${agent})\\n`,\n );\n write(\n `Provider contract: ${report.placement}; interactive terminal: ${report.interactiveTerminal ? \"supported\" : \"unsupported\"}. Workflow execution is not tested.\\n`,\n );\n if (report.image) write(`Image: ${report.image}\\n`);\n for (const check of report.checks)\n write(\n `[${check.status.toUpperCase()}] ${check.id}${check.version ? ` ${check.version}` : \"\"}${check.referenceVersion ? ` (pinned: ${check.referenceVersion})` : \"\"}: ${check.message}\\n`,\n );\n write(\n report.hasFailures\n ? \"Diagnostic checks found failures.\\n\"\n : \"No blocking check failed; warnings and skipped checks still need review.\\n\",\n );\n }\n if (report.hasFailures) process.exitCode = 1;\n}\n"]}
@@ -0,0 +1,13 @@
1
+ export declare const authenticationRecipes: {
2
+ readonly codex: {
3
+ readonly environment: "OPENAI_API_KEY=\n";
4
+ readonly login: "const {spawnSync}=require(\"node:child_process\"); const {existsSync}=require(\"node:fs\"); const {join}=require(\"node:path\"); const {homedir}=require(\"node:os\"); const installed=join(homedir(),\".outpost-tools\",\"bin\",\"codex\"); const result=spawnSync(existsSync(installed)?installed:\"codex\",[\"login\",\"--with-api-key\"],{stdio:\"inherit\",shell:process.platform===\"win32\"}); process.exit(result.status ?? 1);";
5
+ readonly seed: "const {mkdirSync,writeFileSync,readFileSync,chmodSync}=require(\"node:fs\"); const {join}=require(\"node:path\"); const {homedir}=require(\"node:os\"); const directory=join(homedir(),\".codex\"); mkdirSync(directory,{recursive:true,mode:0o700}); const target=join(directory,\"auth.json\"); writeFileSync(target,readFileSync(0),{mode:0o600}); chmodSync(target,0o600);";
6
+ };
7
+ readonly claude: {
8
+ readonly environment: "ANTHROPIC_API_KEY=\n";
9
+ };
10
+ readonly gemini: {
11
+ readonly environment: "GEMINI_API_KEY=\n";
12
+ };
13
+ };
@@ -0,0 +1,10 @@
1
+ export const authenticationRecipes = {
2
+ codex: {
3
+ environment: "OPENAI_API_KEY=\n",
4
+ login: 'const {spawnSync}=require("node:child_process"); const {existsSync}=require("node:fs"); const {join}=require("node:path"); const {homedir}=require("node:os"); const installed=join(homedir(),".outpost-tools","bin","codex"); const result=spawnSync(existsSync(installed)?installed:"codex",["login","--with-api-key"],{stdio:"inherit",shell:process.platform==="win32"}); process.exit(result.status ?? 1);',
5
+ seed: 'const {mkdirSync,writeFileSync,readFileSync,chmodSync}=require("node:fs"); const {join}=require("node:path"); const {homedir}=require("node:os"); const directory=join(homedir(),".codex"); mkdirSync(directory,{recursive:true,mode:0o700}); const target=join(directory,"auth.json"); writeFileSync(target,readFileSync(0),{mode:0o600}); chmodSync(target,0o600);',
6
+ },
7
+ claude: { environment: "ANTHROPIC_API_KEY=\n" },
8
+ gemini: { environment: "GEMINI_API_KEY=\n" },
9
+ };
10
+ //# sourceMappingURL=init-authentication.constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-authentication.constants.js","sourceRoot":"","sources":["../../src/cli/init-authentication.constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,KAAK,EAAE;QACL,WAAW,EAAE,mBAAmB;QAChC,KAAK,EACH,iZAAiZ;QACnZ,IAAI,EAAE,sWAAsW;KAC7W;IACD,MAAM,EAAE,EAAE,WAAW,EAAE,sBAAsB,EAAE;IAC/C,MAAM,EAAE,EAAE,WAAW,EAAE,mBAAmB,EAAE;CACpC,CAAC","sourcesContent":["export const authenticationRecipes = {\n codex: {\n environment: \"OPENAI_API_KEY=\\n\",\n login:\n 'const {spawnSync}=require(\"node:child_process\"); const {existsSync}=require(\"node:fs\"); const {join}=require(\"node:path\"); const {homedir}=require(\"node:os\"); const installed=join(homedir(),\".outpost-tools\",\"bin\",\"codex\"); const result=spawnSync(existsSync(installed)?installed:\"codex\",[\"login\",\"--with-api-key\"],{stdio:\"inherit\",shell:process.platform===\"win32\"}); process.exit(result.status ?? 1);',\n seed: 'const {mkdirSync,writeFileSync,readFileSync,chmodSync}=require(\"node:fs\"); const {join}=require(\"node:path\"); const {homedir}=require(\"node:os\"); const directory=join(homedir(),\".codex\"); mkdirSync(directory,{recursive:true,mode:0o700}); const target=join(directory,\"auth.json\"); writeFileSync(target,readFileSync(0),{mode:0o600}); chmodSync(target,0o600);',\n },\n claude: { environment: \"ANTHROPIC_API_KEY=\\n\" },\n gemini: { environment: \"GEMINI_API_KEY=\\n\" },\n} as const;\n"]}
@@ -0,0 +1,4 @@
1
+ import type { InitOptions } from "./scaffold.types.ts";
2
+ export declare function authenticationEnvironment(options: InitOptions): string;
3
+ export declare function authenticationInstructions(options: InitOptions): string;
4
+ export declare function authenticationSource(options: InitOptions): string;
@@ -0,0 +1,43 @@
1
+ import { authenticationRecipes } from "./init-authentication.constants.js";
2
+ export function authenticationEnvironment(options) {
3
+ if (options.baseUrl)
4
+ return `${options.apiKeyEnvironment ?? "OPENAI_API_KEY"}=\n`;
5
+ if (options.authentication === "login")
6
+ return "";
7
+ if (options.authentication === "oauth-token")
8
+ return "CLAUDE_CODE_OAUTH_TOKEN=\n";
9
+ return authenticationRecipes[options.agent ?? "codex"].environment;
10
+ }
11
+ export function authenticationInstructions(options) {
12
+ if (options.authentication === "login")
13
+ return "Run codex login on the host. For isolated providers, use file credential storage; the generated script copies auth.json into the private sandbox home.";
14
+ if (options.authentication === "oauth-token")
15
+ return "Run claude setup-token on the host, then set CLAUDE_CODE_OAUTH_TOKEN in the workflow .env or parent environment. This uses your Claude subscription.";
16
+ return ("Set " +
17
+ authenticationEnvironment(options).trim().replace("=", "") +
18
+ " in the workflow .env or parent environment. API usage is billed separately from subscriptions.");
19
+ }
20
+ export function authenticationSource(options) {
21
+ const agent = options.agent ?? "codex";
22
+ if (options.authentication === "login") {
23
+ if (options.provider === "local")
24
+ return "const authentication = {};";
25
+ return `const seed = await readFile(resolve(process.env.CODEX_HOME || resolve(homedir(), ".codex"), "auth.json"), "utf8");
26
+ try { JSON.parse(seed); } catch { throw new Error("Invalid Codex authentication file. Run codex login again with file credential storage."); }
27
+ const authentication = { sandboxReady: [{ executable: "node", arguments: ["-e", ${JSON.stringify(authenticationRecipes.codex.seed)}], stdin: seed }] };`;
28
+ }
29
+ const key = authenticationEnvironment(options).trim().replace("=", "");
30
+ const conflict = agent === "claude"
31
+ ? key === "ANTHROPIC_API_KEY"
32
+ ? "CLAUDE_CODE_OAUTH_TOKEN"
33
+ : "ANTHROPIC_API_KEY"
34
+ : undefined;
35
+ const check = `if (!variables[${JSON.stringify(key)}]) throw new Error(${JSON.stringify(`Missing ${key}. Configure the workflow .env or parent environment before starting a sandbox.`)});`;
36
+ const guard = conflict
37
+ ? `\nif (variables[${JSON.stringify(conflict)}]) throw new Error("Conflicting Claude authentication methods. Keep only the selected credential in the workflow environment.");`
38
+ : "";
39
+ if (agent !== "codex" || options.baseUrl)
40
+ return `${check}${guard}\nconst authentication = {};`;
41
+ return `${check}\nconst authentication = { sandboxReady: [{ executable: "node", arguments: ["-e", ${JSON.stringify(authenticationRecipes.codex.login)}], stdin: variables.OPENAI_API_KEY }] };`;
42
+ }
43
+ //# sourceMappingURL=init-authentication.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-authentication.js","sourceRoot":"","sources":["../../src/cli/init-authentication.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAE3E,MAAM,UAAU,yBAAyB,CAAC,OAAoB;IAC5D,IAAI,OAAO,CAAC,OAAO;QACjB,OAAO,GAAG,OAAO,CAAC,iBAAiB,IAAI,gBAAgB,KAAK,CAAC;IAC/D,IAAI,OAAO,CAAC,cAAc,KAAK,OAAO;QAAE,OAAO,EAAE,CAAC;IAClD,IAAI,OAAO,CAAC,cAAc,KAAK,aAAa;QAC1C,OAAO,4BAA4B,CAAC;IACtC,OAAO,qBAAqB,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC,WAAW,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,OAAoB;IAC7D,IAAI,OAAO,CAAC,cAAc,KAAK,OAAO;QACpC,OAAO,wJAAwJ,CAAC;IAClK,IAAI,OAAO,CAAC,cAAc,KAAK,aAAa;QAC1C,OAAO,sJAAsJ,CAAC;IAChK,OAAO,CACL,MAAM;QACN,yBAAyB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;QAC1D,iGAAiG,CAClG,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAoB;IACvD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC;IACvC,IAAI,OAAO,CAAC,cAAc,KAAK,OAAO,EAAE,CAAC;QACvC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAAE,OAAO,4BAA4B,CAAC;QACtE,OAAO;;kFAEuE,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC;IACvJ,CAAC;IACD,MAAM,GAAG,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACvE,MAAM,QAAQ,GACZ,KAAK,KAAK,QAAQ;QAChB,CAAC,CAAC,GAAG,KAAK,mBAAmB;YAC3B,CAAC,CAAC,yBAAyB;YAC3B,CAAC,CAAC,mBAAmB;QACvB,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,KAAK,GAAG,kBAAkB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,SAAS,CAAC,WAAW,GAAG,gFAAgF,CAAC,IAAI,CAAC;IAC5L,MAAM,KAAK,GAAG,QAAQ;QACpB,CAAC,CAAC,mBAAmB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,kIAAkI;QAC/K,CAAC,CAAC,EAAE,CAAC;IACP,IAAI,KAAK,KAAK,OAAO,IAAI,OAAO,CAAC,OAAO;QACtC,OAAO,GAAG,KAAK,GAAG,KAAK,8BAA8B,CAAC;IACxD,OAAO,GAAG,KAAK,qFAAqF,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC,0CAA0C,CAAC;AAClM,CAAC","sourcesContent":["import type { InitOptions } from \"./scaffold.types.ts\";\nimport { authenticationRecipes } from \"./init-authentication.constants.ts\";\n\nexport function authenticationEnvironment(options: InitOptions): string {\n if (options.baseUrl)\n return `${options.apiKeyEnvironment ?? \"OPENAI_API_KEY\"}=\\n`;\n if (options.authentication === \"login\") return \"\";\n if (options.authentication === \"oauth-token\")\n return \"CLAUDE_CODE_OAUTH_TOKEN=\\n\";\n return authenticationRecipes[options.agent ?? \"codex\"].environment;\n}\n\nexport function authenticationInstructions(options: InitOptions): string {\n if (options.authentication === \"login\")\n return \"Run codex login on the host. For isolated providers, use file credential storage; the generated script copies auth.json into the private sandbox home.\";\n if (options.authentication === \"oauth-token\")\n return \"Run claude setup-token on the host, then set CLAUDE_CODE_OAUTH_TOKEN in the workflow .env or parent environment. This uses your Claude subscription.\";\n return (\n \"Set \" +\n authenticationEnvironment(options).trim().replace(\"=\", \"\") +\n \" in the workflow .env or parent environment. API usage is billed separately from subscriptions.\"\n );\n}\n\nexport function authenticationSource(options: InitOptions): string {\n const agent = options.agent ?? \"codex\";\n if (options.authentication === \"login\") {\n if (options.provider === \"local\") return \"const authentication = {};\";\n return `const seed = await readFile(resolve(process.env.CODEX_HOME || resolve(homedir(), \".codex\"), \"auth.json\"), \"utf8\");\ntry { JSON.parse(seed); } catch { throw new Error(\"Invalid Codex authentication file. Run codex login again with file credential storage.\"); }\nconst authentication = { sandboxReady: [{ executable: \"node\", arguments: [\"-e\", ${JSON.stringify(authenticationRecipes.codex.seed)}], stdin: seed }] };`;\n }\n const key = authenticationEnvironment(options).trim().replace(\"=\", \"\");\n const conflict =\n agent === \"claude\"\n ? key === \"ANTHROPIC_API_KEY\"\n ? \"CLAUDE_CODE_OAUTH_TOKEN\"\n : \"ANTHROPIC_API_KEY\"\n : undefined;\n const check = `if (!variables[${JSON.stringify(key)}]) throw new Error(${JSON.stringify(`Missing ${key}. Configure the workflow .env or parent environment before starting a sandbox.`)});`;\n const guard = conflict\n ? `\\nif (variables[${JSON.stringify(conflict)}]) throw new Error(\"Conflicting Claude authentication methods. Keep only the selected credential in the workflow environment.\");`\n : \"\";\n if (agent !== \"codex\" || options.baseUrl)\n return `${check}${guard}\\nconst authentication = {};`;\n return `${check}\\nconst authentication = { sandboxReady: [{ executable: \"node\", arguments: [\"-e\", ${JSON.stringify(authenticationRecipes.codex.login)}], stdin: variables.OPENAI_API_KEY }] };`;\n}\n"]}
@@ -1,30 +1,89 @@
1
+ import { invariant } from "../domain/errors.js";
1
2
  import { resolve } from "node:path";
2
- import { createInterface } from "node:readline/promises";
3
- import { initializationQuestions } from "./main.constants.js";
3
+ import { cancel, intro, isCancel, outro, select, spinner, } from "@clack/prompts";
4
+ import { projectSettings } from "./project-settings.js";
5
+ import { authenticationInstructions } from "./init-authentication.js";
6
+ import { supportedManagers } from "./scaffold.constants.js";
7
+ import { initializationQuestions, authenticationChoices, } from "./main.constants.js";
4
8
  import { initialize } from "./scaffold.js";
5
9
  export async function initializeCommand({ values, }) {
6
10
  const options = Object.fromEntries(Object.entries(values).filter(([key]) => !["help", "yes"].includes(key)));
11
+ if (values["base-url"] !== undefined)
12
+ options.baseUrl = values["base-url"];
13
+ if (values["api-key-env"] !== undefined)
14
+ options.apiKeyEnvironment = values["api-key-env"];
15
+ delete options["base-url"];
16
+ delete options["api-key-env"];
7
17
  if (!values.yes &&
8
18
  !process.stdin.isTTY &&
9
19
  (!values.agent || !values.provider))
10
20
  throw new Error("Headless initialization requires --yes for defaults, or --agent and --provider.");
11
21
  if (!values.yes && process.stdin.isTTY) {
12
- const terminal = createInterface({
13
- input: process.stdin,
14
- output: process.stdout,
15
- });
16
- try {
17
- for (const [key, label, fallback] of initializationQuestions) {
18
- options[key] ??=
19
- (await terminal.question(`${label} [${fallback}]: `)).trim() ||
20
- fallback;
22
+ intro("Create an Outpost workflow");
23
+ for (const question of initializationQuestions) {
24
+ if (options[question.key] !== undefined)
25
+ continue;
26
+ const value = await select({
27
+ message: question.message,
28
+ options: question.choices.map((value) => ({ value, label: value })),
29
+ });
30
+ if (isCancel(value)) {
31
+ cancel("Initialization cancelled.");
32
+ process.exitCode = 130;
33
+ return;
21
34
  }
35
+ options[question.key] = value;
22
36
  }
23
- finally {
24
- terminal.close();
37
+ const settings = await projectSettings(resolve(values.directory ?? process.cwd()), options);
38
+ const choices = Object.entries(authenticationChoices).find(([name]) => name === options.agent)?.[1];
39
+ invariant(choices, "Choose codex, claude or gemini");
40
+ const questions = [
41
+ {
42
+ key: "manager",
43
+ message: "Package manager",
44
+ options: supportedManagers.map((value) => ({ value, label: value })),
45
+ initialValue: settings.manager,
46
+ },
47
+ {
48
+ key: "authentication",
49
+ message: "Agent authentication",
50
+ options: [...choices],
51
+ initialValue: "api-key",
52
+ },
53
+ ];
54
+ for (const question of questions) {
55
+ if (options[question.key] !== undefined)
56
+ continue;
57
+ const value = await select(question);
58
+ if (isCancel(value)) {
59
+ cancel("Initialization cancelled.");
60
+ process.exitCode = 130;
61
+ return;
62
+ }
63
+ options[question.key] = value;
25
64
  }
26
65
  }
27
- const result = await initialize(options);
28
- process.stdout.write(`Initialized ${result.files.length} files in ${resolve(values.directory ?? process.cwd())}.\nRun: ${result.run}\n`);
66
+ options.build ??= ["docker", "podman"].includes(String(options.provider ?? "docker"));
67
+ const progress = !values.yes && process.stdin.isTTY ? spinner() : undefined;
68
+ progress?.start(options.build
69
+ ? "Creating project and building its container image"
70
+ : "Creating project");
71
+ let result;
72
+ try {
73
+ result = await initialize(options);
74
+ }
75
+ catch (error) {
76
+ progress?.stop("Initialization failed");
77
+ throw error;
78
+ }
79
+ progress?.stop("Project ready");
80
+ const installation = options.install
81
+ ? ""
82
+ : "Install project dependencies with your selected package manager before running.\n";
83
+ const message = `Initialized ${result.files.length} files in ${resolve(values.directory ?? process.cwd())}.\n${authenticationInstructions(options)}\n${installation}Run: ${result.run}`;
84
+ if (!values.yes && process.stdin.isTTY)
85
+ outro(message);
86
+ else
87
+ process.stdout.write(`${message}\n`);
29
88
  }
30
89
  //# sourceMappingURL=init-command.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init-command.js","sourceRoot":"","sources":["../../src/cli/init-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EACtC,MAAM,GACQ;IACd,MAAM,OAAO,GAA4B,MAAM,CAAC,WAAW,CACzD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CACzE,CAAC;IACF,IACE,CAAC,MAAM,CAAC,GAAG;QACX,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK;QACpB,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QAEnC,MAAM,IAAI,KAAK,CACb,iFAAiF,CAClF,CAAC;IACJ,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,eAAe,CAAC;YAC/B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QACH,IAAI,CAAC;YACH,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,uBAAuB,EAAE,CAAC;gBAC7D,OAAO,CAAC,GAAG,CAAC;oBACV,CAAC,MAAM,QAAQ,CAAC,QAAQ,CAAC,GAAG,KAAK,KAAK,QAAQ,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;wBAC5D,QAAQ,CAAC;YACb,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAsB,CAAC,CAAC;IACxD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,eAAe,MAAM,CAAC,KAAK,CAAC,MAAM,aAAa,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,WAAW,MAAM,CAAC,GAAG,IAAI,CACnH,CAAC;AACJ,CAAC","sourcesContent":["import { resolve } from \"node:path\";\nimport { createInterface } from \"node:readline/promises\";\nimport { initializationQuestions } from \"./main.constants.ts\";\nimport type { CliInvocation } from \"./main.types.ts\";\nimport { initialize } from \"./scaffold.ts\";\nimport type { InitOptions } from \"./scaffold.types.ts\";\n\nexport async function initializeCommand({\n values,\n}: CliInvocation): Promise<void> {\n const options: Record<string, unknown> = Object.fromEntries(\n Object.entries(values).filter(([key]) => ![\"help\", \"yes\"].includes(key)),\n );\n if (\n !values.yes &&\n !process.stdin.isTTY &&\n (!values.agent || !values.provider)\n )\n throw new Error(\n \"Headless initialization requires --yes for defaults, or --agent and --provider.\",\n );\n if (!values.yes && process.stdin.isTTY) {\n const terminal = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n try {\n for (const [key, label, fallback] of initializationQuestions) {\n options[key] ??=\n (await terminal.question(`${label} [${fallback}]: `)).trim() ||\n fallback;\n }\n } finally {\n terminal.close();\n }\n }\n const result = await initialize(options as InitOptions);\n process.stdout.write(\n `Initialized ${result.files.length} files in ${resolve(values.directory ?? process.cwd())}.\\nRun: ${result.run}\\n`,\n );\n}\n"]}
1
+ {"version":3,"file":"init-command.js","sourceRoot":"","sources":["../../src/cli/init-command.ts"],"names":[],"mappings":"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","sourcesContent":["import { invariant } from \"../domain/errors.ts\";\nimport { resolve } from \"node:path\";\nimport {\n cancel,\n intro,\n isCancel,\n outro,\n select,\n spinner,\n} from \"@clack/prompts\";\nimport { projectSettings } from \"./project-settings.ts\";\nimport { authenticationInstructions } from \"./init-authentication.ts\";\nimport { supportedManagers } from \"./scaffold.constants.ts\";\nimport {\n initializationQuestions,\n authenticationChoices,\n} from \"./main.constants.ts\";\nimport type { CliInvocation } from \"./main.types.ts\";\nimport { initialize } from \"./scaffold.ts\";\nimport type { InitOptions } from \"./scaffold.types.ts\";\n\nexport async function initializeCommand({\n values,\n}: CliInvocation): Promise<void> {\n const options: Record<string, unknown> = Object.fromEntries(\n Object.entries(values).filter(([key]) => ![\"help\", \"yes\"].includes(key)),\n );\n if (values[\"base-url\"] !== undefined) options.baseUrl = values[\"base-url\"];\n if (values[\"api-key-env\"] !== undefined)\n options.apiKeyEnvironment = values[\"api-key-env\"];\n delete options[\"base-url\"];\n delete options[\"api-key-env\"];\n if (\n !values.yes &&\n !process.stdin.isTTY &&\n (!values.agent || !values.provider)\n )\n throw new Error(\n \"Headless initialization requires --yes for defaults, or --agent and --provider.\",\n );\n if (!values.yes && process.stdin.isTTY) {\n intro(\"Create an Outpost workflow\");\n for (const question of initializationQuestions) {\n if (options[question.key] !== undefined) continue;\n const value = await select({\n message: question.message,\n options: question.choices.map((value) => ({ value, label: value })),\n });\n if (isCancel(value)) {\n cancel(\"Initialization cancelled.\");\n process.exitCode = 130;\n return;\n }\n options[question.key] = value;\n }\n const settings = await projectSettings(\n resolve(values.directory ?? process.cwd()),\n options as InitOptions,\n );\n const choices = Object.entries(authenticationChoices).find(\n ([name]) => name === options.agent,\n )?.[1];\n invariant(choices, \"Choose codex, claude or gemini\");\n const questions = [\n {\n key: \"manager\",\n message: \"Package manager\",\n options: supportedManagers.map((value) => ({ value, label: value })),\n initialValue: settings.manager,\n },\n {\n key: \"authentication\",\n message: \"Agent authentication\",\n options: [...choices],\n initialValue: \"api-key\",\n },\n ];\n for (const question of questions) {\n if (options[question.key] !== undefined) continue;\n const value = await select(question);\n if (isCancel(value)) {\n cancel(\"Initialization cancelled.\");\n process.exitCode = 130;\n return;\n }\n options[question.key] = value;\n }\n }\n options.build ??= [\"docker\", \"podman\"].includes(\n String(options.provider ?? \"docker\"),\n );\n const progress = !values.yes && process.stdin.isTTY ? spinner() : undefined;\n progress?.start(\n options.build\n ? \"Creating project and building its container image\"\n : \"Creating project\",\n );\n let result;\n try {\n result = await initialize(options as InitOptions);\n } catch (error) {\n progress?.stop(\"Initialization failed\");\n throw error;\n }\n progress?.stop(\"Project ready\");\n const installation = options.install\n ? \"\"\n : \"Install project dependencies with your selected package manager before running.\\n\";\n const message = `Initialized ${result.files.length} files in ${resolve(values.directory ?? process.cwd())}.\\n${authenticationInstructions(options as InitOptions)}\\n${installation}Run: ${result.run}`;\n if (!values.yes && process.stdin.isTTY) outro(message);\n else process.stdout.write(`${message}\\n`);\n}\n"]}