@elie-laloum/outpost 4.2.0 → 6.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (642) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +13 -11
  3. package/SECURITY.md +2 -0
  4. package/dist/adapters/agents/antigravity-adapter.d.ts +3 -0
  5. package/dist/adapters/agents/antigravity-adapter.js +39 -0
  6. package/dist/adapters/agents/antigravity-adapter.js.map +1 -0
  7. package/dist/adapters/agents/antigravity-authentication.d.ts +2 -0
  8. package/dist/adapters/agents/antigravity-authentication.js +27 -0
  9. package/dist/adapters/agents/antigravity-authentication.js.map +1 -0
  10. package/dist/adapters/agents/antigravity-diagnostics.d.ts +1 -0
  11. package/dist/adapters/agents/antigravity-diagnostics.js +6 -0
  12. package/dist/adapters/agents/antigravity-diagnostics.js.map +1 -0
  13. package/dist/adapters/agents/antigravity-events.d.ts +2 -0
  14. package/dist/adapters/agents/antigravity-events.js +66 -0
  15. package/dist/adapters/agents/antigravity-events.js.map +1 -0
  16. package/dist/adapters/agents/antigravity-request.d.ts +5 -0
  17. package/dist/adapters/agents/antigravity-request.js +29 -0
  18. package/dist/adapters/agents/antigravity-request.js.map +1 -0
  19. package/dist/adapters/agents/antigravity.types.d.ts +7 -0
  20. package/dist/adapters/agents/antigravity.types.js +2 -0
  21. package/dist/adapters/agents/antigravity.types.js.map +1 -0
  22. package/dist/adapters/agents/authentication.constants.d.ts +23 -0
  23. package/dist/adapters/agents/authentication.constants.js +13 -0
  24. package/dist/adapters/agents/authentication.constants.js.map +1 -0
  25. package/dist/adapters/agents/authentication.d.ts +11 -0
  26. package/dist/adapters/agents/authentication.js +75 -0
  27. package/dist/adapters/agents/authentication.js.map +1 -0
  28. package/dist/adapters/agents/authentication.types.d.ts +20 -0
  29. package/dist/adapters/agents/authentication.types.js +2 -0
  30. package/dist/adapters/agents/authentication.types.js.map +1 -0
  31. package/dist/adapters/agents/claude-adapter.d.ts +2 -2
  32. package/dist/adapters/agents/claude-adapter.js +32 -2
  33. package/dist/adapters/agents/claude-adapter.js.map +1 -1
  34. package/dist/adapters/agents/claude-authentication.d.ts +2 -0
  35. package/dist/adapters/agents/claude-authentication.js +34 -0
  36. package/dist/adapters/agents/claude-authentication.js.map +1 -0
  37. package/dist/adapters/agents/claude-request.d.ts +2 -2
  38. package/dist/adapters/agents/claude-request.js +3 -3
  39. package/dist/adapters/agents/claude-request.js.map +1 -1
  40. package/dist/adapters/agents/cli-diagnostics.constants.d.ts +6 -6
  41. package/dist/adapters/agents/cli-diagnostics.constants.js +6 -6
  42. package/dist/adapters/agents/cli-diagnostics.constants.js.map +1 -1
  43. package/dist/adapters/agents/cli-diagnostics.d.ts +1 -0
  44. package/dist/adapters/agents/cli-diagnostics.js +11 -0
  45. package/dist/adapters/agents/cli-diagnostics.js.map +1 -1
  46. package/dist/adapters/agents/codex-adapter.d.ts +2 -2
  47. package/dist/adapters/agents/codex-adapter.js +19 -1
  48. package/dist/adapters/agents/codex-adapter.js.map +1 -1
  49. package/dist/adapters/agents/codex-authentication.d.ts +3 -0
  50. package/dist/adapters/agents/codex-authentication.js +47 -0
  51. package/dist/adapters/agents/codex-authentication.js.map +1 -0
  52. package/dist/adapters/agents/codex-provider.d.ts +2 -2
  53. package/dist/adapters/agents/codex-provider.js +1 -1
  54. package/dist/adapters/agents/codex-provider.js.map +1 -1
  55. package/dist/adapters/agents/codex-request.d.ts +2 -2
  56. package/dist/adapters/agents/codex-request.js +3 -3
  57. package/dist/adapters/agents/codex-request.js.map +1 -1
  58. package/dist/adapters/agents/copilot-adapter.d.ts +3 -0
  59. package/dist/adapters/agents/copilot-adapter.js +39 -0
  60. package/dist/adapters/agents/copilot-adapter.js.map +1 -0
  61. package/dist/adapters/agents/copilot-authentication.d.ts +2 -0
  62. package/dist/adapters/agents/copilot-authentication.js +45 -0
  63. package/dist/adapters/agents/copilot-authentication.js.map +1 -0
  64. package/dist/adapters/agents/copilot-diagnostics.d.ts +1 -0
  65. package/dist/adapters/agents/copilot-diagnostics.js +6 -0
  66. package/dist/adapters/agents/copilot-diagnostics.js.map +1 -0
  67. package/dist/adapters/agents/copilot-events.d.ts +2 -0
  68. package/dist/adapters/agents/copilot-events.js +50 -0
  69. package/dist/adapters/agents/copilot-events.js.map +1 -0
  70. package/dist/adapters/agents/copilot-request.d.ts +5 -0
  71. package/dist/adapters/agents/copilot-request.js +19 -0
  72. package/dist/adapters/agents/copilot-request.js.map +1 -0
  73. package/dist/adapters/agents/copilot.types.d.ts +6 -0
  74. package/dist/adapters/agents/copilot.types.js +2 -0
  75. package/dist/adapters/agents/copilot.types.js.map +1 -0
  76. package/dist/adapters/agents/event-decoder.d.ts +2 -2
  77. package/dist/adapters/agents/event-decoder.js +6 -5
  78. package/dist/adapters/agents/event-decoder.js.map +1 -1
  79. package/dist/adapters/agents/kimi-adapter.d.ts +3 -0
  80. package/dist/adapters/agents/kimi-adapter.js +35 -0
  81. package/dist/adapters/agents/kimi-adapter.js.map +1 -0
  82. package/dist/adapters/agents/kimi-authentication.d.ts +2 -0
  83. package/dist/adapters/agents/kimi-authentication.js +48 -0
  84. package/dist/adapters/agents/kimi-authentication.js.map +1 -0
  85. package/dist/adapters/agents/kimi-diagnostics.d.ts +1 -0
  86. package/dist/adapters/agents/kimi-diagnostics.js +6 -0
  87. package/dist/adapters/agents/kimi-diagnostics.js.map +1 -0
  88. package/dist/adapters/agents/kimi-events.d.ts +2 -0
  89. package/dist/adapters/agents/kimi-events.js +51 -0
  90. package/dist/adapters/agents/kimi-events.js.map +1 -0
  91. package/dist/adapters/agents/kimi-request.d.ts +5 -0
  92. package/dist/adapters/agents/kimi-request.js +28 -0
  93. package/dist/adapters/agents/kimi-request.js.map +1 -0
  94. package/dist/adapters/agents/kimi.types.d.ts +6 -0
  95. package/dist/adapters/agents/kimi.types.js +2 -0
  96. package/dist/adapters/agents/kimi.types.js.map +1 -0
  97. package/dist/adapters/agents/model-support.constants.d.ts +8 -0
  98. package/dist/adapters/agents/model-support.constants.js +28 -0
  99. package/dist/adapters/agents/model-support.constants.js.map +1 -0
  100. package/dist/adapters/agents/model-support.d.ts +4 -0
  101. package/dist/adapters/agents/model-support.js +11 -0
  102. package/dist/adapters/agents/model-support.js.map +1 -0
  103. package/dist/adapters/agents/protocol-fixtures.constants.d.ts +2 -2
  104. package/dist/adapters/agents/protocol-fixtures.constants.js +135 -9
  105. package/dist/adapters/agents/protocol-fixtures.constants.js.map +1 -1
  106. package/dist/adapters/agents/protocol-fixtures.types.d.ts +1 -0
  107. package/dist/adapters/agents/protocol-fixtures.types.js.map +1 -1
  108. package/dist/adapters/agents/protocol.d.ts +1 -0
  109. package/dist/adapters/agents/protocol.js +9 -0
  110. package/dist/adapters/agents/protocol.js.map +1 -1
  111. package/dist/adapters/agents/settings.types.d.ts +11 -3
  112. package/dist/adapters/agents/settings.types.js.map +1 -1
  113. package/dist/adapters/models/anthropic-model-provider.constants.d.ts +3 -0
  114. package/dist/adapters/models/anthropic-model-provider.constants.js +17 -0
  115. package/dist/adapters/models/anthropic-model-provider.constants.js.map +1 -0
  116. package/dist/adapters/models/anthropic-model-provider.d.ts +3 -0
  117. package/dist/adapters/models/anthropic-model-provider.js +31 -0
  118. package/dist/adapters/models/anthropic-model-provider.js.map +1 -0
  119. package/dist/adapters/models/anthropic-model-provider.types.d.ts +7 -0
  120. package/dist/adapters/models/anthropic-model-provider.types.js +2 -0
  121. package/dist/adapters/models/anthropic-model-provider.types.js.map +1 -0
  122. package/dist/adapters/models/anthropic-request.d.ts +4 -0
  123. package/dist/adapters/models/anthropic-request.js +81 -0
  124. package/dist/adapters/models/anthropic-request.js.map +1 -0
  125. package/dist/adapters/models/anthropic-response.d.ts +3 -0
  126. package/dist/adapters/models/anthropic-response.js +55 -0
  127. package/dist/adapters/models/anthropic-response.js.map +1 -0
  128. package/dist/adapters/models/anthropic-stream.d.ts +2 -0
  129. package/dist/adapters/models/anthropic-stream.js +96 -0
  130. package/dist/adapters/models/anthropic-stream.js.map +1 -0
  131. package/dist/adapters/models/http-provider.d.ts +3 -0
  132. package/dist/adapters/models/http-provider.js +113 -0
  133. package/dist/adapters/models/http-provider.js.map +1 -0
  134. package/dist/adapters/models/{openai-http.js → model-http.js} +1 -1
  135. package/dist/adapters/models/model-http.js.map +1 -0
  136. package/dist/adapters/models/model-protocol.types.d.ts +41 -0
  137. package/dist/adapters/models/model-protocol.types.js +2 -0
  138. package/dist/adapters/models/model-protocol.types.js.map +1 -0
  139. package/dist/adapters/models/model-request.d.ts +2 -0
  140. package/dist/adapters/models/model-request.js +18 -0
  141. package/dist/adapters/models/model-request.js.map +1 -0
  142. package/dist/adapters/models/model-response.d.ts +7 -0
  143. package/dist/adapters/models/model-response.js +41 -0
  144. package/dist/adapters/models/model-response.js.map +1 -0
  145. package/dist/adapters/models/{openai-compatible.constants.js → model.constants.js} +6 -1
  146. package/dist/adapters/models/model.constants.js.map +1 -0
  147. package/dist/adapters/models/openai-chat-stream.d.ts +2 -0
  148. package/dist/adapters/models/openai-chat-stream.js +66 -0
  149. package/dist/adapters/models/openai-chat-stream.js.map +1 -0
  150. package/dist/adapters/models/openai-chat.d.ts +4 -0
  151. package/dist/adapters/models/openai-chat.js +108 -0
  152. package/dist/adapters/models/openai-chat.js.map +1 -0
  153. package/dist/adapters/models/openai-model-provider.d.ts +3 -0
  154. package/dist/adapters/models/openai-model-provider.js +13 -0
  155. package/dist/adapters/models/openai-model-provider.js.map +1 -0
  156. package/dist/adapters/models/openai-model-provider.types.d.ts +4 -0
  157. package/dist/adapters/models/openai-model-provider.types.js +2 -0
  158. package/dist/adapters/models/openai-model-provider.types.js.map +1 -0
  159. package/dist/adapters/models/openai-protocols.d.ts +2 -0
  160. package/dist/adapters/models/openai-protocols.js +22 -0
  161. package/dist/adapters/models/openai-protocols.js.map +1 -0
  162. package/dist/adapters/models/openai-responses-stream.d.ts +2 -0
  163. package/dist/adapters/models/openai-responses-stream.js +35 -0
  164. package/dist/adapters/models/openai-responses-stream.js.map +1 -0
  165. package/dist/adapters/models/openai-responses.d.ts +4 -0
  166. package/dist/adapters/models/openai-responses.js +107 -0
  167. package/dist/adapters/models/openai-responses.js.map +1 -0
  168. package/dist/adapters/models/openai-usage.d.ts +3 -0
  169. package/dist/adapters/models/openai-usage.js +20 -0
  170. package/dist/adapters/models/openai-usage.js.map +1 -0
  171. package/dist/adapters/models/stop-reasons.constants.d.ts +4 -0
  172. package/dist/adapters/models/stop-reasons.constants.js +19 -0
  173. package/dist/adapters/models/stop-reasons.constants.js.map +1 -0
  174. package/dist/adapters/models/stream-events.d.ts +3 -0
  175. package/dist/adapters/models/stream-events.js +22 -0
  176. package/dist/adapters/models/stream-events.js.map +1 -0
  177. package/dist/adapters/tools/edit-tools.d.ts +2 -0
  178. package/dist/adapters/tools/edit-tools.js +84 -0
  179. package/dist/adapters/tools/edit-tools.js.map +1 -0
  180. package/dist/adapters/tools/file-tools.d.ts +2 -0
  181. package/dist/adapters/tools/file-tools.js +97 -0
  182. package/dist/adapters/tools/file-tools.js.map +1 -0
  183. package/dist/adapters/tools/git-tools.d.ts +2 -0
  184. package/dist/adapters/tools/git-tools.js +54 -0
  185. package/dist/adapters/tools/git-tools.js.map +1 -0
  186. package/dist/adapters/tools/sandbox-files.d.ts +10 -0
  187. package/dist/adapters/tools/sandbox-files.js +60 -0
  188. package/dist/adapters/tools/sandbox-files.js.map +1 -0
  189. package/dist/adapters/tools/search-tools.d.ts +2 -0
  190. package/dist/adapters/tools/search-tools.js +65 -0
  191. package/dist/adapters/tools/search-tools.js.map +1 -0
  192. package/dist/adapters/tools/shell-tools.d.ts +3 -0
  193. package/dist/adapters/tools/shell-tools.js +38 -0
  194. package/dist/adapters/tools/shell-tools.js.map +1 -0
  195. package/dist/adapters/tools/tools.constants.d.ts +11 -0
  196. package/dist/adapters/tools/tools.constants.js +17 -0
  197. package/dist/adapters/tools/tools.constants.js.map +1 -0
  198. package/dist/adapters/tools/tools.types.d.ts +41 -0
  199. package/dist/adapters/tools/tools.types.js +2 -0
  200. package/dist/adapters/tools/tools.types.js.map +1 -0
  201. package/dist/application/activity-watchdog.js +15 -2
  202. package/dist/application/activity-watchdog.js.map +1 -1
  203. package/dist/application/agent-authentication.d.ts +4 -0
  204. package/dist/application/agent-authentication.js +32 -0
  205. package/dist/application/agent-authentication.js.map +1 -0
  206. package/dist/application/agent-bootstrap.constants.d.ts +2 -5
  207. package/dist/application/agent-bootstrap.constants.js +29 -4
  208. package/dist/application/agent-bootstrap.constants.js.map +1 -1
  209. package/dist/application/agent-bootstrap.d.ts +2 -2
  210. package/dist/application/agent-bootstrap.js +35 -12
  211. package/dist/application/agent-bootstrap.js.map +1 -1
  212. package/dist/application/agent-bootstrap.types.d.ts +20 -0
  213. package/dist/application/agent-bootstrap.types.js +2 -0
  214. package/dist/application/agent-bootstrap.types.js.map +1 -0
  215. package/dist/application/agent-storage.d.ts +3 -2
  216. package/dist/application/agent-storage.js +9 -2
  217. package/dist/application/agent-storage.js.map +1 -1
  218. package/dist/application/agent-turn.d.ts +3 -3
  219. package/dist/application/agent-turn.js +7 -1
  220. package/dist/application/agent-turn.js.map +1 -1
  221. package/dist/application/attach.js +1 -0
  222. package/dist/application/attach.js.map +1 -1
  223. package/dist/application/credential-installer.constants.d.ts +1 -0
  224. package/dist/application/credential-installer.constants.js +22 -0
  225. package/dist/application/credential-installer.constants.js.map +1 -0
  226. package/dist/application/custom-turn.d.ts +5 -0
  227. package/dist/application/custom-turn.js +190 -0
  228. package/dist/application/custom-turn.js.map +1 -0
  229. package/dist/application/dispatch-observation.d.ts +3 -0
  230. package/dist/application/dispatch-observation.js +51 -0
  231. package/dist/application/dispatch-observation.js.map +1 -0
  232. package/dist/application/dispatch-observation.types.d.ts +5 -0
  233. package/dist/application/dispatch-observation.types.js +2 -0
  234. package/dist/application/dispatch-observation.types.js.map +1 -0
  235. package/dist/application/dispatch-validation.d.ts +2 -2
  236. package/dist/application/dispatch-validation.js.map +1 -1
  237. package/dist/application/dispatch.js +8 -3
  238. package/dist/application/dispatch.js.map +1 -1
  239. package/dist/application/doctor-agent.constants.d.ts +2 -8
  240. package/dist/application/doctor-agent.constants.js +40 -6
  241. package/dist/application/doctor-agent.constants.js.map +1 -1
  242. package/dist/application/doctor-agent.d.ts +2 -1
  243. package/dist/application/doctor-agent.js +11 -3
  244. package/dist/application/doctor-agent.js.map +1 -1
  245. package/dist/application/doctor-image.js +7 -9
  246. package/dist/application/doctor-image.js.map +1 -1
  247. package/dist/application/doctor-protocol.js +6 -6
  248. package/dist/application/doctor-protocol.js.map +1 -1
  249. package/dist/application/doctor-protocol.types.d.ts +1 -1
  250. package/dist/application/doctor-protocol.types.js.map +1 -1
  251. package/dist/application/doctor-sandbox.js +6 -9
  252. package/dist/application/doctor-sandbox.js.map +1 -1
  253. package/dist/application/doctor-sandbox.types.d.ts +2 -2
  254. package/dist/application/doctor-sandbox.types.js.map +1 -1
  255. package/dist/application/doctor.constants.d.ts +1 -1
  256. package/dist/application/doctor.constants.js +1 -1
  257. package/dist/application/doctor.constants.js.map +1 -1
  258. package/dist/application/doctor.js +12 -13
  259. package/dist/application/doctor.js.map +1 -1
  260. package/dist/application/doctor.types.d.ts +12 -4
  261. package/dist/application/doctor.types.js.map +1 -1
  262. package/dist/application/execution.d.ts +2 -2
  263. package/dist/application/execution.js +1 -1
  264. package/dist/application/execution.js.map +1 -1
  265. package/dist/application/execution.types.d.ts +9 -2
  266. package/dist/application/execution.types.js.map +1 -1
  267. package/dist/application/harness-context.d.ts +2 -0
  268. package/dist/application/harness-context.js +54 -0
  269. package/dist/application/harness-context.js.map +1 -0
  270. package/dist/application/harness-history.d.ts +3 -0
  271. package/dist/application/harness-history.js +17 -0
  272. package/dist/application/harness-history.js.map +1 -0
  273. package/dist/application/harness-hooks.d.ts +9 -0
  274. package/dist/application/harness-hooks.js +90 -0
  275. package/dist/application/harness-hooks.js.map +1 -0
  276. package/dist/application/harness-loop.d.ts +2 -0
  277. package/dist/application/harness-loop.js +132 -0
  278. package/dist/application/harness-loop.js.map +1 -0
  279. package/dist/application/harness.types.d.ts +55 -0
  280. package/dist/application/harness.types.js +2 -0
  281. package/dist/application/harness.types.js.map +1 -0
  282. package/dist/application/lifecycle.constants.d.ts +1 -1
  283. package/dist/application/lifecycle.constants.js +1 -1
  284. package/dist/application/lifecycle.constants.js.map +1 -1
  285. package/dist/application/outpost.types.d.ts +6 -7
  286. package/dist/application/outpost.types.js.map +1 -1
  287. package/dist/application/recovery-retention.js +65 -24
  288. package/dist/application/recovery-retention.js.map +1 -1
  289. package/dist/application/remote-download.js +1 -1
  290. package/dist/application/remote-download.js.map +1 -1
  291. package/dist/application/sandbox-agents.js +14 -5
  292. package/dist/application/sandbox-agents.js.map +1 -1
  293. package/dist/application/sandbox-attach.js +5 -2
  294. package/dist/application/sandbox-attach.js.map +1 -1
  295. package/dist/application/sandbox-dispatch.js +3 -5
  296. package/dist/application/sandbox-dispatch.js.map +1 -1
  297. package/dist/application/sandbox-provision.js +13 -10
  298. package/dist/application/sandbox-provision.js.map +1 -1
  299. package/dist/application/sandbox-session.types.d.ts +13 -8
  300. package/dist/application/sandbox-session.types.js.map +1 -1
  301. package/dist/application/sandbox.js +6 -3
  302. package/dist/application/sandbox.js.map +1 -1
  303. package/dist/application/speculation.js +1 -1
  304. package/dist/application/speculation.js.map +1 -1
  305. package/dist/application/speculation.types.d.ts +3 -3
  306. package/dist/application/speculation.types.js.map +1 -1
  307. package/dist/application/startup-recovery.js +1 -1
  308. package/dist/application/startup-recovery.js.map +1 -1
  309. package/dist/application/storage-reservation.js +9 -2
  310. package/dist/application/storage-reservation.js.map +1 -1
  311. package/dist/application/tasks.types.d.ts +2 -2
  312. package/dist/application/tasks.types.js.map +1 -1
  313. package/dist/application/tool-execution.d.ts +3 -0
  314. package/dist/application/tool-execution.js +211 -0
  315. package/dist/application/tool-execution.js.map +1 -0
  316. package/dist/cli/commands.js +4 -2
  317. package/dist/cli/commands.js.map +1 -1
  318. package/dist/cli/doctor-command.js +11 -7
  319. package/dist/cli/doctor-command.js.map +1 -1
  320. package/dist/cli/init-authentication.d.ts +4 -1
  321. package/dist/cli/init-authentication.js +28 -34
  322. package/dist/cli/init-authentication.js.map +1 -1
  323. package/dist/cli/init-command.js +6 -6
  324. package/dist/cli/init-command.js.map +1 -1
  325. package/dist/cli/main.constants.d.ts +54 -17
  326. package/dist/cli/main.constants.js +74 -12
  327. package/dist/cli/main.constants.js.map +1 -1
  328. package/dist/cli/recovery-command.js +1 -1
  329. package/dist/cli/recovery-command.js.map +1 -1
  330. package/dist/cli/scaffold-files.js +6 -5
  331. package/dist/cli/scaffold-files.js.map +1 -1
  332. package/dist/cli/scaffold-validation.js +26 -16
  333. package/dist/cli/scaffold-validation.js.map +1 -1
  334. package/dist/cli/scaffold.constants.d.ts +0 -1
  335. package/dist/cli/scaffold.constants.js +5 -2
  336. package/dist/cli/scaffold.constants.js.map +1 -1
  337. package/dist/cli/scaffold.js +8 -4
  338. package/dist/cli/scaffold.js.map +1 -1
  339. package/dist/cli/scaffold.types.d.ts +9 -3
  340. package/dist/cli/scaffold.types.js.map +1 -1
  341. package/dist/cli/starters.js +8 -10
  342. package/dist/cli/starters.js.map +1 -1
  343. package/dist/domain/agent-model.d.ts +3 -0
  344. package/dist/domain/agent-model.js +22 -0
  345. package/dist/domain/agent-model.js.map +1 -0
  346. package/dist/domain/agent.d.ts +4 -0
  347. package/dist/domain/agent.js +32 -0
  348. package/dist/domain/agent.js.map +1 -0
  349. package/dist/domain/agent.types.d.ts +105 -2
  350. package/dist/domain/agent.types.js.map +1 -1
  351. package/dist/domain/authentication.constants.d.ts +3 -0
  352. package/dist/domain/authentication.constants.js +11 -0
  353. package/dist/domain/authentication.constants.js.map +1 -0
  354. package/dist/domain/authentication.d.ts +3 -0
  355. package/dist/domain/authentication.js +22 -0
  356. package/dist/domain/authentication.js.map +1 -0
  357. package/dist/domain/authentication.types.d.ts +5 -0
  358. package/dist/domain/authentication.types.js +2 -0
  359. package/dist/domain/authentication.types.js.map +1 -0
  360. package/dist/domain/context.constants.d.ts +7 -0
  361. package/dist/domain/context.constants.js +8 -0
  362. package/dist/domain/context.constants.js.map +1 -0
  363. package/dist/domain/context.d.ts +4 -0
  364. package/dist/domain/context.js +81 -0
  365. package/dist/domain/context.js.map +1 -0
  366. package/dist/domain/context.types.d.ts +26 -0
  367. package/dist/domain/context.types.js +2 -0
  368. package/dist/domain/context.types.js.map +1 -0
  369. package/dist/domain/dispatch-telemetry.types.d.ts +12 -0
  370. package/dist/domain/dispatch-telemetry.types.js +2 -0
  371. package/dist/domain/dispatch-telemetry.types.js.map +1 -0
  372. package/dist/domain/errors.types.d.ts +1 -1
  373. package/dist/domain/errors.types.js.map +1 -1
  374. package/dist/domain/glob.d.ts +2 -0
  375. package/dist/domain/glob.js +25 -0
  376. package/dist/domain/glob.js.map +1 -0
  377. package/dist/domain/glob.types.d.ts +1 -0
  378. package/dist/domain/glob.types.js +2 -0
  379. package/dist/domain/glob.types.js.map +1 -0
  380. package/dist/domain/harness.constants.d.ts +11 -0
  381. package/dist/domain/harness.constants.js +24 -0
  382. package/dist/domain/harness.constants.js.map +1 -0
  383. package/dist/domain/harness.d.ts +2 -0
  384. package/dist/domain/harness.js +89 -0
  385. package/dist/domain/harness.js.map +1 -0
  386. package/dist/domain/harness.types.d.ts +60 -0
  387. package/dist/domain/harness.types.js +2 -0
  388. package/dist/domain/harness.types.js.map +1 -0
  389. package/dist/domain/hook.constants.d.ts +3 -0
  390. package/dist/domain/hook.constants.js +10 -0
  391. package/dist/domain/hook.constants.js.map +1 -0
  392. package/dist/domain/hook.d.ts +3 -0
  393. package/dist/domain/hook.js +25 -0
  394. package/dist/domain/hook.js.map +1 -0
  395. package/dist/domain/hook.types.d.ts +66 -0
  396. package/dist/domain/hook.types.js +2 -0
  397. package/dist/domain/hook.types.js.map +1 -0
  398. package/dist/domain/instructions.d.ts +3 -0
  399. package/dist/domain/instructions.js +25 -0
  400. package/dist/domain/instructions.js.map +1 -0
  401. package/dist/domain/model-messages.d.ts +5 -0
  402. package/dist/domain/model-messages.js +81 -0
  403. package/dist/domain/model-messages.js.map +1 -0
  404. package/dist/domain/model-messages.types.d.ts +6 -0
  405. package/dist/domain/model-messages.types.js +2 -0
  406. package/dist/domain/model-messages.types.js.map +1 -0
  407. package/dist/domain/model.constants.d.ts +4 -0
  408. package/dist/domain/model.constants.js +16 -0
  409. package/dist/domain/model.constants.js.map +1 -0
  410. package/dist/domain/model.types.d.ts +59 -2
  411. package/dist/domain/model.types.js.map +1 -1
  412. package/dist/domain/permissions.d.ts +3 -0
  413. package/dist/domain/permissions.js +92 -0
  414. package/dist/domain/permissions.js.map +1 -0
  415. package/dist/domain/permissions.types.d.ts +34 -0
  416. package/dist/domain/permissions.types.js +2 -0
  417. package/dist/domain/permissions.types.js.map +1 -0
  418. package/dist/domain/response.js +3 -2
  419. package/dist/domain/response.js.map +1 -1
  420. package/dist/domain/response.types.d.ts +12 -0
  421. package/dist/domain/response.types.js.map +1 -1
  422. package/dist/domain/skill.constants.d.ts +2 -0
  423. package/dist/domain/skill.constants.js +8 -0
  424. package/dist/domain/skill.constants.js.map +1 -0
  425. package/dist/domain/skill.d.ts +8 -0
  426. package/dist/domain/skill.js +79 -0
  427. package/dist/domain/skill.js.map +1 -0
  428. package/dist/domain/skill.types.d.ts +18 -0
  429. package/dist/domain/skill.types.js +2 -0
  430. package/dist/domain/skill.types.js.map +1 -0
  431. package/dist/domain/standard-schema.d.ts +6 -0
  432. package/dist/domain/standard-schema.js +45 -0
  433. package/dist/domain/standard-schema.js.map +1 -0
  434. package/dist/domain/tool-schema.d.ts +3 -0
  435. package/dist/domain/tool-schema.js +109 -0
  436. package/dist/domain/tool-schema.js.map +1 -0
  437. package/dist/domain/tool.constants.d.ts +4 -0
  438. package/dist/domain/tool.constants.js +36 -0
  439. package/dist/domain/tool.constants.js.map +1 -0
  440. package/dist/domain/tool.d.ts +4 -0
  441. package/dist/domain/tool.js +66 -0
  442. package/dist/domain/tool.js.map +1 -0
  443. package/dist/domain/tool.types.d.ts +62 -0
  444. package/dist/domain/tool.types.js +2 -0
  445. package/dist/domain/tool.types.js.map +1 -0
  446. package/dist/domain/transcript.d.ts +4 -0
  447. package/dist/domain/transcript.js +48 -0
  448. package/dist/domain/transcript.js.map +1 -0
  449. package/dist/domain/transcript.types.d.ts +15 -0
  450. package/dist/domain/transcript.types.js +2 -0
  451. package/dist/domain/transcript.types.js.map +1 -0
  452. package/dist/domain/workflow/workflow-state.js +13 -6
  453. package/dist/domain/workflow/workflow-state.js.map +1 -1
  454. package/dist/domain/workflow.d.ts +1 -1
  455. package/dist/domain/workflow.js.map +1 -1
  456. package/dist/domain/workflow.types.d.ts +4 -0
  457. package/dist/domain/workflow.types.js.map +1 -1
  458. package/dist/index.d.ts +35 -13
  459. package/dist/index.js +19 -6
  460. package/dist/index.js.map +1 -1
  461. package/dist/infrastructure/conversations/harness-store.d.ts +3 -0
  462. package/dist/infrastructure/conversations/harness-store.js +27 -0
  463. package/dist/infrastructure/conversations/harness-store.js.map +1 -0
  464. package/dist/infrastructure/conversations/harness-transcript.d.ts +2 -0
  465. package/dist/infrastructure/conversations/harness-transcript.js +50 -0
  466. package/dist/infrastructure/conversations/harness-transcript.js.map +1 -0
  467. package/dist/infrastructure/conversations/harness-transcript.types.d.ts +18 -0
  468. package/dist/infrastructure/conversations/harness-transcript.types.js +2 -0
  469. package/dist/infrastructure/conversations/harness-transcript.types.js.map +1 -0
  470. package/dist/infrastructure/conversations.d.ts +4 -1
  471. package/dist/infrastructure/conversations.js +3 -0
  472. package/dist/infrastructure/conversations.js.map +1 -1
  473. package/dist/infrastructure/conversations.types.d.ts +1 -0
  474. package/dist/infrastructure/conversations.types.js.map +1 -1
  475. package/dist/infrastructure/custom-reporter.d.ts +2 -0
  476. package/dist/infrastructure/custom-reporter.js +33 -0
  477. package/dist/infrastructure/custom-reporter.js.map +1 -0
  478. package/dist/infrastructure/custom-reporter.types.d.ts +13 -0
  479. package/dist/infrastructure/custom-reporter.types.js +2 -0
  480. package/dist/infrastructure/custom-reporter.types.js.map +1 -0
  481. package/dist/infrastructure/git/git.constants.d.ts +1 -1
  482. package/dist/infrastructure/git/git.constants.js +2 -0
  483. package/dist/infrastructure/git/git.constants.js.map +1 -1
  484. package/dist/infrastructure/host-credentials.constants.d.ts +1 -0
  485. package/dist/infrastructure/host-credentials.constants.js +2 -0
  486. package/dist/infrastructure/host-credentials.constants.js.map +1 -0
  487. package/dist/infrastructure/host-credentials.d.ts +4 -0
  488. package/dist/infrastructure/host-credentials.js +89 -0
  489. package/dist/infrastructure/host-credentials.js.map +1 -0
  490. package/dist/infrastructure/inspection-path.js +4 -3
  491. package/dist/infrastructure/inspection-path.js.map +1 -1
  492. package/dist/infrastructure/journal.constants.d.ts +1 -0
  493. package/dist/infrastructure/journal.constants.js +2 -0
  494. package/dist/infrastructure/journal.constants.js.map +1 -0
  495. package/dist/infrastructure/journal.js +7 -71
  496. package/dist/infrastructure/journal.js.map +1 -1
  497. package/dist/infrastructure/journal.types.d.ts +0 -2
  498. package/dist/infrastructure/journal.types.js.map +1 -1
  499. package/dist/infrastructure/local-transport.js +9 -4
  500. package/dist/infrastructure/local-transport.js.map +1 -1
  501. package/dist/infrastructure/opentelemetry-dispatch.d.ts +6 -0
  502. package/dist/infrastructure/opentelemetry-dispatch.js +70 -0
  503. package/dist/infrastructure/opentelemetry-dispatch.js.map +1 -0
  504. package/dist/infrastructure/opentelemetry.constants.d.ts +3 -0
  505. package/dist/infrastructure/opentelemetry.constants.js +3 -0
  506. package/dist/infrastructure/opentelemetry.constants.js.map +1 -1
  507. package/dist/infrastructure/opentelemetry.js +4 -0
  508. package/dist/infrastructure/opentelemetry.js.map +1 -1
  509. package/dist/infrastructure/opentelemetry.types.d.ts +3 -3
  510. package/dist/infrastructure/opentelemetry.types.js.map +1 -1
  511. package/dist/infrastructure/reporter.js +27 -2
  512. package/dist/infrastructure/reporter.js.map +1 -1
  513. package/dist/infrastructure/repository-transport.constants.d.ts +1 -0
  514. package/dist/infrastructure/repository-transport.constants.js +2 -0
  515. package/dist/infrastructure/repository-transport.constants.js.map +1 -0
  516. package/dist/infrastructure/repository-transport.d.ts +2 -0
  517. package/dist/infrastructure/repository-transport.js +9 -0
  518. package/dist/infrastructure/repository-transport.js.map +1 -0
  519. package/dist/infrastructure/resource-activity-inspection.js +22 -26
  520. package/dist/infrastructure/resource-activity-inspection.js.map +1 -1
  521. package/dist/infrastructure/resource-activity.constants.d.ts +0 -1
  522. package/dist/infrastructure/resource-activity.constants.js +0 -1
  523. package/dist/infrastructure/resource-activity.constants.js.map +1 -1
  524. package/dist/infrastructure/resource-activity.js +22 -85
  525. package/dist/infrastructure/resource-activity.js.map +1 -1
  526. package/dist/infrastructure/resource-activity.types.d.ts +2 -2
  527. package/dist/infrastructure/resource-activity.types.js.map +1 -1
  528. package/dist/infrastructure/settings.d.ts +1 -1
  529. package/dist/infrastructure/settings.js +3 -3
  530. package/dist/infrastructure/settings.js.map +1 -1
  531. package/dist/infrastructure/sse.d.ts +2 -0
  532. package/dist/infrastructure/sse.js +64 -0
  533. package/dist/infrastructure/sse.js.map +1 -0
  534. package/dist/infrastructure/sse.types.d.ts +4 -0
  535. package/dist/infrastructure/sse.types.js +2 -0
  536. package/dist/infrastructure/sse.types.js.map +1 -0
  537. package/dist/infrastructure/storage-inventory.constants.js +1 -0
  538. package/dist/infrastructure/storage-inventory.constants.js.map +1 -1
  539. package/dist/infrastructure/storage-inventory.types.d.ts +1 -1
  540. package/dist/infrastructure/storage-inventory.types.js.map +1 -1
  541. package/dist/infrastructure/storage-reservations.types.d.ts +0 -8
  542. package/dist/infrastructure/storage-reservations.types.js.map +1 -1
  543. package/dist/infrastructure/transport-conversations.d.ts +2 -2
  544. package/dist/infrastructure/transport-conversations.js +8 -1
  545. package/dist/infrastructure/transport-conversations.js.map +1 -1
  546. package/dist/infrastructure/transport-journal.js +2 -1
  547. package/dist/infrastructure/transport-journal.js.map +1 -1
  548. package/dist/infrastructure/transport-reservations.d.ts +1 -1
  549. package/dist/infrastructure/transport-reservations.js +14 -8
  550. package/dist/infrastructure/transport-reservations.js.map +1 -1
  551. package/dist/providers/agents.d.ts +9 -4
  552. package/dist/providers/agents.js +6 -3
  553. package/dist/providers/agents.js.map +1 -1
  554. package/dist/providers/daytona.d.ts +1 -1
  555. package/dist/providers/daytona.js +1 -1
  556. package/dist/providers/daytona.js.map +1 -1
  557. package/dist/providers/docker.d.ts +1 -1
  558. package/dist/providers/docker.js +1 -1
  559. package/dist/providers/docker.js.map +1 -1
  560. package/dist/providers/factories.d.ts +2 -2
  561. package/dist/providers/factories.js +3 -3
  562. package/dist/providers/factories.js.map +1 -1
  563. package/dist/providers/firecracker.d.ts +1 -1
  564. package/dist/providers/firecracker.js +1 -1
  565. package/dist/providers/firecracker.js.map +1 -1
  566. package/dist/providers/local.d.ts +1 -1
  567. package/dist/providers/local.js +1 -1
  568. package/dist/providers/local.js.map +1 -1
  569. package/dist/providers/podman.d.ts +1 -1
  570. package/dist/providers/podman.js +1 -1
  571. package/dist/providers/podman.js.map +1 -1
  572. package/dist/providers/vercel.d.ts +1 -1
  573. package/dist/providers/vercel.js +1 -1
  574. package/dist/providers/vercel.js.map +1 -1
  575. package/dist/providers/versions.constants.d.ts +3 -1
  576. package/dist/providers/versions.constants.js +3 -1
  577. package/dist/providers/versions.constants.js.map +1 -1
  578. package/package.json +3 -3
  579. package/dist/adapters/agents/gemini-adapter.d.ts +0 -3
  580. package/dist/adapters/agents/gemini-adapter.js +0 -15
  581. package/dist/adapters/agents/gemini-adapter.js.map +0 -1
  582. package/dist/adapters/agents/gemini-diagnostics.d.ts +0 -2
  583. package/dist/adapters/agents/gemini-diagnostics.js +0 -15
  584. package/dist/adapters/agents/gemini-diagnostics.js.map +0 -1
  585. package/dist/adapters/agents/gemini-events.d.ts +0 -2
  586. package/dist/adapters/agents/gemini-events.js +0 -50
  587. package/dist/adapters/agents/gemini-events.js.map +0 -1
  588. package/dist/adapters/agents/gemini-request.d.ts +0 -4
  589. package/dist/adapters/agents/gemini-request.js +0 -23
  590. package/dist/adapters/agents/gemini-request.js.map +0 -1
  591. package/dist/adapters/agents/gemini.types.d.ts +0 -6
  592. package/dist/adapters/agents/gemini.types.js +0 -2
  593. package/dist/adapters/agents/gemini.types.js.map +0 -1
  594. package/dist/adapters/models/openai-compatible.constants.js.map +0 -1
  595. package/dist/adapters/models/openai-compatible.d.ts +0 -3
  596. package/dist/adapters/models/openai-compatible.js +0 -78
  597. package/dist/adapters/models/openai-compatible.js.map +0 -1
  598. package/dist/adapters/models/openai-compatible.types.d.ts +0 -14
  599. package/dist/adapters/models/openai-compatible.types.js +0 -2
  600. package/dist/adapters/models/openai-compatible.types.js.map +0 -1
  601. package/dist/adapters/models/openai-http.js.map +0 -1
  602. package/dist/adapters/models/openai-request.d.ts +0 -4
  603. package/dist/adapters/models/openai-request.js +0 -46
  604. package/dist/adapters/models/openai-request.js.map +0 -1
  605. package/dist/adapters/models/openai-response.d.ts +0 -3
  606. package/dist/adapters/models/openai-response.js +0 -65
  607. package/dist/adapters/models/openai-response.js.map +0 -1
  608. package/dist/cli/init-authentication.constants.d.ts +0 -13
  609. package/dist/cli/init-authentication.constants.js +0 -10
  610. package/dist/cli/init-authentication.constants.js.map +0 -1
  611. package/dist/infrastructure/artifact-store.d.ts +0 -3
  612. package/dist/infrastructure/artifact-store.js +0 -110
  613. package/dist/infrastructure/artifact-store.js.map +0 -1
  614. package/dist/infrastructure/artifact-store.types.d.ts +0 -6
  615. package/dist/infrastructure/artifact-store.types.js +0 -2
  616. package/dist/infrastructure/artifact-store.types.js.map +0 -1
  617. package/dist/infrastructure/journal-retention.constants.d.ts +0 -4
  618. package/dist/infrastructure/journal-retention.constants.js +0 -5
  619. package/dist/infrastructure/journal-retention.constants.js.map +0 -1
  620. package/dist/infrastructure/journal-retention.d.ts +0 -2
  621. package/dist/infrastructure/journal-retention.js +0 -51
  622. package/dist/infrastructure/journal-retention.js.map +0 -1
  623. package/dist/infrastructure/storage-mutation-lock.constants.d.ts +0 -5
  624. package/dist/infrastructure/storage-mutation-lock.constants.js +0 -6
  625. package/dist/infrastructure/storage-mutation-lock.constants.js.map +0 -1
  626. package/dist/infrastructure/storage-mutation-lock.d.ts +0 -1
  627. package/dist/infrastructure/storage-mutation-lock.js +0 -21
  628. package/dist/infrastructure/storage-mutation-lock.js.map +0 -1
  629. package/dist/infrastructure/storage-reservations.constants.d.ts +0 -4
  630. package/dist/infrastructure/storage-reservations.constants.js +0 -5
  631. package/dist/infrastructure/storage-reservations.constants.js.map +0 -1
  632. package/dist/infrastructure/storage-reservations.d.ts +0 -2
  633. package/dist/infrastructure/storage-reservations.js +0 -150
  634. package/dist/infrastructure/storage-reservations.js.map +0 -1
  635. package/dist/infrastructure/workflow-checkpoint.d.ts +0 -3
  636. package/dist/infrastructure/workflow-checkpoint.js +0 -84
  637. package/dist/infrastructure/workflow-checkpoint.js.map +0 -1
  638. package/dist/infrastructure/workflow-checkpoint.types.d.ts +0 -6
  639. package/dist/infrastructure/workflow-checkpoint.types.js +0 -2
  640. package/dist/infrastructure/workflow-checkpoint.types.js.map +0 -1
  641. /package/dist/adapters/models/{openai-http.d.ts → model-http.d.ts} +0 -0
  642. /package/dist/adapters/models/{openai-compatible.constants.d.ts → model.constants.d.ts} +0 -0
@@ -0,0 +1,211 @@
1
+ import { OutpostError } from "../domain/errors.js";
2
+ import { TOOL_PREVIEW_CHARACTERS, TOOL_RESULT_CHARACTERS, } from "../domain/harness.constants.js";
3
+ import { afterTool, beforeTool } from "./harness-hooks.js";
4
+ const toolEvents = new Set(["text", "warning", "raw"]);
5
+ export async function executeToolCalls(runtime, calls, step, loaded) {
6
+ const tools = new Map(runtime.tools.map((tool) => [tool.name, tool]));
7
+ const owners = new Map(runtime.agent.harness.skills.flatMap((skill) => skill.tools.map((tool) => [tool.name, skill.name])));
8
+ const locked = (name) => {
9
+ const skill = owners.get(name);
10
+ return skill === undefined || loaded.has(skill) ? undefined : skill;
11
+ };
12
+ const prepared = [];
13
+ for (const call of calls)
14
+ prepared.push(await prepareCall(runtime, tools, call, step, locked));
15
+ const outcomes = new Map();
16
+ for (const batch of batches(prepared)) {
17
+ const pending = [...batch.calls];
18
+ const limit = batch.concurrent
19
+ ? runtime.agent.harness.toolExecution.concurrency
20
+ : 1;
21
+ await Promise.all(Array.from({ length: Math.min(limit, pending.length) }, async () => {
22
+ for (let next = pending.shift(); next; next = pending.shift())
23
+ outcomes.set(next.call.id, await executeCall(runtime, next));
24
+ }));
25
+ }
26
+ const results = [];
27
+ for (const { call, outcome } of prepared)
28
+ results.push(await finish(runtime, call, outcome ?? outcomes.get(call.id), step));
29
+ return results;
30
+ }
31
+ async function prepareCall(runtime, tools, call, step, locked) {
32
+ runtime.signal.throwIfAborted();
33
+ runtime.emit({
34
+ kind: "tool",
35
+ name: call.name,
36
+ input: call.input,
37
+ callId: call.id,
38
+ });
39
+ const tool = tools.get(call.name);
40
+ if (!tool)
41
+ return { call, outcome: failed(`Unknown tool: ${call.name}`) };
42
+ const validated = await validate(tool, call.input, "Invalid input");
43
+ if ("outcome" in validated)
44
+ return { call, outcome: validated.outcome };
45
+ const skill = locked(tool.name);
46
+ if (skill)
47
+ return denied(runtime, call, `Load the ${skill} skill with load_skill before using ${tool.name}`);
48
+ const permitted = permission(runtime, tool, validated.value);
49
+ if (permitted)
50
+ return denied(runtime, call, permitted);
51
+ const decision = await beforeTool(runtime, { ...call, input: validated.value }, step);
52
+ if ("deny" in decision)
53
+ return denied(runtime, call, decision.deny);
54
+ if (decision.input === validated.value)
55
+ return { call, tool, input: validated.value };
56
+ const revised = await validate(tool, decision.input, "Hook produced invalid input");
57
+ if ("outcome" in revised)
58
+ return { call, outcome: revised.outcome };
59
+ const revisedPermission = permission(runtime, tool, revised.value);
60
+ if (revisedPermission)
61
+ return denied(runtime, call, revisedPermission);
62
+ return { call, tool, input: revised.value };
63
+ }
64
+ async function validate(tool, input, label) {
65
+ const validation = await tool.validate(input);
66
+ if ("issues" in validation)
67
+ return {
68
+ outcome: failed(`${label} for ${tool.name}: ${validation.issues}`),
69
+ };
70
+ return { value: validation.value };
71
+ }
72
+ function permission(runtime, tool, input) {
73
+ const permissions = runtime.agent.harness.permissions;
74
+ if (!permissions)
75
+ return undefined;
76
+ const decision = permissions.evaluate(tool.name, tool.resources(input));
77
+ return decision.allowed ? undefined : decision.reason;
78
+ }
79
+ function denied(runtime, call, reason) {
80
+ runtime.emit({
81
+ kind: "tool-denied",
82
+ callId: call.id,
83
+ name: call.name,
84
+ reason,
85
+ });
86
+ return { call, outcome: failed(`Denied: ${reason}`) };
87
+ }
88
+ async function finish(runtime, call, outcome, step) {
89
+ const final = await afterTool(runtime, call, outcome, step, normalized);
90
+ const content = final.content.length > TOOL_RESULT_CHARACTERS
91
+ ? `${final.content.slice(0, TOOL_RESULT_CHARACTERS)}\n[truncated ${final.content.length - TOOL_RESULT_CHARACTERS} characters]`
92
+ : final.content;
93
+ runtime.emit({
94
+ kind: "tool-result",
95
+ callId: call.id,
96
+ name: call.name,
97
+ isError: final.isError,
98
+ preview: content.slice(0, TOOL_PREVIEW_CHARACTERS),
99
+ characters: final.content.length,
100
+ });
101
+ return {
102
+ type: "tool-result",
103
+ callId: call.id,
104
+ content,
105
+ ...(final.isError ? { isError: true } : {}),
106
+ };
107
+ }
108
+ function batches(calls) {
109
+ const grouped = [];
110
+ for (const prepared of calls) {
111
+ if (prepared.outcome)
112
+ continue;
113
+ const concurrent = prepared.tool.readOnly;
114
+ const last = grouped.at(-1);
115
+ if (last?.concurrent && concurrent) {
116
+ grouped[grouped.length - 1] = {
117
+ concurrent,
118
+ calls: [...last.calls, prepared],
119
+ };
120
+ continue;
121
+ }
122
+ grouped.push({ concurrent, calls: [prepared] });
123
+ }
124
+ return grouped;
125
+ }
126
+ async function executeCall(runtime, prepared) {
127
+ try {
128
+ return normalized(await runTool(runtime, prepared));
129
+ }
130
+ catch (error) {
131
+ runtime.signal.throwIfAborted();
132
+ if (runtime.agent.harness.toolExecution.onError === "fail")
133
+ throw error;
134
+ return failed(error instanceof Error ? error.message : String(error));
135
+ }
136
+ }
137
+ async function runTool(runtime, { call, tool, input }) {
138
+ const { deadlineMs } = runtime.agent.harness.toolExecution;
139
+ const controller = new AbortController();
140
+ const signal = AbortSignal.any([runtime.signal, controller.signal]);
141
+ const timer = setTimeout(() => controller.abort(new OutpostError("timeout", `Tool ${call.name} timed out after ${deadlineMs} ms`)), deadlineMs);
142
+ const release = runtime.hold();
143
+ const aborted = new Promise((_, reject) => {
144
+ const fail = () => reject(signal.reason);
145
+ if (signal.aborted)
146
+ fail();
147
+ signal.addEventListener("abort", fail, { once: true });
148
+ });
149
+ const execution = Promise.resolve().then(() => tool.execute(input, {
150
+ sandbox: scopedLease(runtime.sandbox, signal),
151
+ signal,
152
+ callId: call.id,
153
+ model: runtime.agent.model,
154
+ observe(event) {
155
+ signal.throwIfAborted();
156
+ if (!toolEvents.has(event?.kind))
157
+ throw new OutpostError("configuration", "Tools may only report text, warning or raw events");
158
+ runtime.emit(event);
159
+ },
160
+ }));
161
+ execution.catch(() => undefined);
162
+ aborted.catch(() => undefined);
163
+ try {
164
+ return await Promise.race([execution, aborted]);
165
+ }
166
+ finally {
167
+ clearTimeout(timer);
168
+ controller.abort(new OutpostError("aborted", "Tool call ended"));
169
+ release();
170
+ }
171
+ }
172
+ function scopedLease(lease, signal) {
173
+ const combine = (own) => own ? AbortSignal.any([own, signal]) : signal;
174
+ return {
175
+ root: lease.root,
176
+ home: lease.home,
177
+ invoke: (command) => {
178
+ signal.throwIfAborted();
179
+ return lease.invoke({ ...command, signal: combine(command.signal) });
180
+ },
181
+ upload: (source, destination, settings = {}) => {
182
+ signal.throwIfAborted();
183
+ return lease.upload(source, destination, {
184
+ ...settings,
185
+ signal: combine(settings.signal),
186
+ });
187
+ },
188
+ download: (source, destination, settings = {}) => {
189
+ signal.throwIfAborted();
190
+ return lease.download(source, destination, {
191
+ ...settings,
192
+ signal: combine(settings.signal),
193
+ });
194
+ },
195
+ release: () => lease.release(),
196
+ };
197
+ }
198
+ function normalized(output) {
199
+ if (typeof output === "string")
200
+ return { content: output, isError: false };
201
+ if (output === null ||
202
+ typeof output !== "object" ||
203
+ typeof output.content !== "string" ||
204
+ (output.isError !== undefined && typeof output.isError !== "boolean"))
205
+ throw new OutpostError("configuration", "Tools must return text or { content, isError }");
206
+ return { content: output.content, isError: output.isError ?? false };
207
+ }
208
+ function failed(message) {
209
+ return { content: message, isError: true };
210
+ }
211
+ //# sourceMappingURL=tool-execution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-execution.js","sourceRoot":"","sources":["../../src/application/tool-execution.ts"],"names":[],"mappings":"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","sourcesContent":["import { OutpostError } from \"../domain/errors.ts\";\nimport {\n TOOL_PREVIEW_CHARACTERS,\n TOOL_RESULT_CHARACTERS,\n} from \"../domain/harness.constants.ts\";\nimport type {\n ModelToolCallBlock,\n ModelToolResultBlock,\n} from \"../domain/model.types.ts\";\nimport type { SandboxLease } from \"../domain/sandbox.types.ts\";\nimport type {\n HarnessTool,\n HarnessToolEvent,\n ToolOutput,\n} from \"../domain/tool.types.ts\";\nimport { afterTool, beforeTool } from \"./harness-hooks.ts\";\nimport type {\n HarnessRuntime,\n PreparedCall,\n ToolCallBatch,\n ToolOutcome,\n ValidatedInput,\n} from \"./harness.types.ts\";\n\nconst toolEvents: ReadonlySet<string> = new Set([\"text\", \"warning\", \"raw\"]);\n\nexport async function executeToolCalls(\n runtime: HarnessRuntime,\n calls: readonly ModelToolCallBlock[],\n step: number,\n loaded: ReadonlySet<string>,\n): Promise<readonly ModelToolResultBlock[]> {\n const tools = new Map(runtime.tools.map((tool) => [tool.name, tool]));\n const owners = new Map(\n runtime.agent.harness.skills.flatMap((skill) =>\n skill.tools.map((tool) => [tool.name, skill.name] as const),\n ),\n );\n const locked = (name: string) => {\n const skill = owners.get(name);\n return skill === undefined || loaded.has(skill) ? undefined : skill;\n };\n const prepared: PreparedCall[] = [];\n for (const call of calls)\n prepared.push(await prepareCall(runtime, tools, call, step, locked));\n const outcomes = new Map<string, ToolOutcome>();\n for (const batch of batches(prepared)) {\n const pending = [...batch.calls];\n const limit = batch.concurrent\n ? runtime.agent.harness.toolExecution.concurrency\n : 1;\n await Promise.all(\n Array.from({ length: Math.min(limit, pending.length) }, async () => {\n for (let next = pending.shift(); next; next = pending.shift())\n outcomes.set(next.call.id, await executeCall(runtime, next));\n }),\n );\n }\n const results: ModelToolResultBlock[] = [];\n for (const { call, outcome } of prepared)\n results.push(\n await finish(runtime, call, outcome ?? outcomes.get(call.id)!, step),\n );\n return results;\n}\n\nasync function prepareCall(\n runtime: HarnessRuntime,\n tools: ReadonlyMap<string, HarnessTool>,\n call: ModelToolCallBlock,\n step: number,\n locked: (name: string) => string | undefined,\n): Promise<PreparedCall> {\n runtime.signal.throwIfAborted();\n runtime.emit({\n kind: \"tool\",\n name: call.name,\n input: call.input,\n callId: call.id,\n });\n const tool = tools.get(call.name);\n if (!tool) return { call, outcome: failed(`Unknown tool: ${call.name}`) };\n const validated = await validate(tool, call.input, \"Invalid input\");\n if (\"outcome\" in validated) return { call, outcome: validated.outcome };\n const skill = locked(tool.name);\n if (skill)\n return denied(\n runtime,\n call,\n `Load the ${skill} skill with load_skill before using ${tool.name}`,\n );\n const permitted = permission(runtime, tool, validated.value);\n if (permitted) return denied(runtime, call, permitted);\n const decision = await beforeTool(\n runtime,\n { ...call, input: validated.value },\n step,\n );\n if (\"deny\" in decision) return denied(runtime, call, decision.deny);\n if (decision.input === validated.value)\n return { call, tool, input: validated.value };\n const revised = await validate(\n tool,\n decision.input,\n \"Hook produced invalid input\",\n );\n if (\"outcome\" in revised) return { call, outcome: revised.outcome };\n const revisedPermission = permission(runtime, tool, revised.value);\n if (revisedPermission) return denied(runtime, call, revisedPermission);\n return { call, tool, input: revised.value };\n}\n\nasync function validate(\n tool: HarnessTool,\n input: unknown,\n label: string,\n): Promise<ValidatedInput> {\n const validation = await tool.validate(input);\n if (\"issues\" in validation)\n return {\n outcome: failed(`${label} for ${tool.name}: ${validation.issues}`),\n };\n return { value: validation.value };\n}\n\nfunction permission(\n runtime: HarnessRuntime,\n tool: HarnessTool,\n input: unknown,\n): string | undefined {\n const permissions = runtime.agent.harness.permissions;\n if (!permissions) return undefined;\n const decision = permissions.evaluate(tool.name, tool.resources(input));\n return decision.allowed ? undefined : decision.reason;\n}\n\nfunction denied(\n runtime: HarnessRuntime,\n call: ModelToolCallBlock,\n reason: string,\n): PreparedCall {\n runtime.emit({\n kind: \"tool-denied\",\n callId: call.id,\n name: call.name,\n reason,\n });\n return { call, outcome: failed(`Denied: ${reason}`) };\n}\n\nasync function finish(\n runtime: HarnessRuntime,\n call: ModelToolCallBlock,\n outcome: ToolOutcome,\n step: number,\n): Promise<ModelToolResultBlock> {\n const final = await afterTool(runtime, call, outcome, step, normalized);\n const content =\n final.content.length > TOOL_RESULT_CHARACTERS\n ? `${final.content.slice(0, TOOL_RESULT_CHARACTERS)}\\n[truncated ${final.content.length - TOOL_RESULT_CHARACTERS} characters]`\n : final.content;\n runtime.emit({\n kind: \"tool-result\",\n callId: call.id,\n name: call.name,\n isError: final.isError,\n preview: content.slice(0, TOOL_PREVIEW_CHARACTERS),\n characters: final.content.length,\n });\n return {\n type: \"tool-result\",\n callId: call.id,\n content,\n ...(final.isError ? { isError: true } : {}),\n };\n}\n\nfunction batches(calls: readonly PreparedCall[]): readonly ToolCallBatch[] {\n const grouped: ToolCallBatch[] = [];\n for (const prepared of calls) {\n if (prepared.outcome) continue;\n const concurrent = prepared.tool!.readOnly;\n const last = grouped.at(-1);\n if (last?.concurrent && concurrent) {\n grouped[grouped.length - 1] = {\n concurrent,\n calls: [...last.calls, prepared],\n };\n continue;\n }\n grouped.push({ concurrent, calls: [prepared] });\n }\n return grouped;\n}\n\nasync function executeCall(\n runtime: HarnessRuntime,\n prepared: PreparedCall,\n): Promise<ToolOutcome> {\n try {\n return normalized(await runTool(runtime, prepared));\n } catch (error) {\n runtime.signal.throwIfAborted();\n if (runtime.agent.harness.toolExecution.onError === \"fail\") throw error;\n return failed(error instanceof Error ? error.message : String(error));\n }\n}\n\nasync function runTool(\n runtime: HarnessRuntime,\n { call, tool, input }: PreparedCall,\n): Promise<ToolOutput> {\n const { deadlineMs } = runtime.agent.harness.toolExecution;\n const controller = new AbortController();\n const signal = AbortSignal.any([runtime.signal, controller.signal]);\n const timer = setTimeout(\n () =>\n controller.abort(\n new OutpostError(\n \"timeout\",\n `Tool ${call.name} timed out after ${deadlineMs} ms`,\n ),\n ),\n deadlineMs,\n );\n const release = runtime.hold();\n const aborted = new Promise<never>((_, reject) => {\n const fail = () => reject(signal.reason);\n if (signal.aborted) fail();\n signal.addEventListener(\"abort\", fail, { once: true });\n });\n const execution = Promise.resolve().then(() =>\n tool!.execute(input, {\n sandbox: scopedLease(runtime.sandbox, signal),\n signal,\n callId: call.id,\n model: runtime.agent.model,\n observe(event: HarnessToolEvent) {\n signal.throwIfAborted();\n if (!toolEvents.has(event?.kind))\n throw new OutpostError(\n \"configuration\",\n \"Tools may only report text, warning or raw events\",\n );\n runtime.emit(event);\n },\n }),\n );\n execution.catch(() => undefined);\n aborted.catch(() => undefined);\n try {\n return await Promise.race([execution, aborted]);\n } finally {\n clearTimeout(timer);\n controller.abort(new OutpostError(\"aborted\", \"Tool call ended\"));\n release();\n }\n}\n\nfunction scopedLease(lease: SandboxLease, signal: AbortSignal): SandboxLease {\n const combine = (own?: AbortSignal) =>\n own ? AbortSignal.any([own, signal]) : signal;\n return {\n root: lease.root,\n home: lease.home,\n invoke: (command) => {\n signal.throwIfAborted();\n return lease.invoke({ ...command, signal: combine(command.signal) });\n },\n upload: (source, destination, settings = {}) => {\n signal.throwIfAborted();\n return lease.upload(source, destination, {\n ...settings,\n signal: combine(settings.signal),\n });\n },\n download: (source, destination, settings = {}) => {\n signal.throwIfAborted();\n return lease.download(source, destination, {\n ...settings,\n signal: combine(settings.signal),\n });\n },\n release: () => lease.release(),\n };\n}\n\nfunction normalized(output: ToolOutput): ToolOutcome {\n if (typeof output === \"string\") return { content: output, isError: false };\n if (\n output === null ||\n typeof output !== \"object\" ||\n typeof output.content !== \"string\" ||\n (output.isError !== undefined && typeof output.isError !== \"boolean\")\n )\n throw new OutpostError(\n \"configuration\",\n \"Tools must return text or { content, isError }\",\n );\n return { content: output.content, isError: output.isError ?? false };\n}\n\nfunction failed(message: string): ToolOutcome {\n return { content: message, isError: true };\n}\n"]}
@@ -28,7 +28,7 @@ export async function runCli(args = process.argv.slice(2)) {
28
28
  for (const key of definition.options) {
29
29
  const configuration = cliOptions[key];
30
30
  const short = "short" in configuration ? `-${configuration.short}, ` : "";
31
- command.addOption(new Option(`${short}--${key}${configuration.type === "string" ? " <value>" : ""}`, configuration.description));
31
+ command.addOption(new Option(`${short}--${key === "sandboxProvider" ? "sandbox-provider" : key}${configuration.type === "string" ? " <value>" : ""}`, configuration.description));
32
32
  }
33
33
  if (name === "init")
34
34
  command.addOption(new Option("--no-build", "Skip automatic container image build").default(undefined));
@@ -38,7 +38,9 @@ export async function runCli(args = process.argv.slice(2)) {
38
38
  for (const option of command.options) {
39
39
  const value = parsed[option.attributeName()];
40
40
  if (typeof value === "string" || typeof value === "boolean")
41
- values[option.long.replace(/^--(?:no-)?/, "")] = value;
41
+ values[option.long === "--sandbox-provider"
42
+ ? "sandboxProvider"
43
+ : option.long.replace(/^--(?:no-)?/, "")] = value;
42
44
  }
43
45
  await handlers[path[0]]({
44
46
  values: values,
@@ -1 +1 @@
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"]}
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 === \"sandboxProvider\" ? \"sandbox-provider\" : 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[\n option.long === \"--sandbox-provider\"\n ? \"sandboxProvider\"\n : option.long!.replace(/^--(?:no-)?/, \"\")\n ] = 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"]}
@@ -1,28 +1,32 @@
1
+ import { doctorAgents } from "../application/doctor-agent.constants.js";
1
2
  import { doctorDefaults, providerDiagnostics, } from "../application/doctor.constants.js";
2
3
  import { diagnose } from "../application/doctor.js";
3
4
  import { invariant } from "../domain/errors.js";
4
5
  function isProvider(value) {
5
6
  return Object.hasOwn(providerDiagnostics, value);
6
7
  }
8
+ function isAgent(value) {
9
+ return Object.hasOwn(doctorAgents, value);
10
+ }
7
11
  export async function doctorCommand({ values, positionals }, execute, write = (text) => {
8
12
  process.stdout.write(text);
9
13
  }) {
10
- invariant(positionals.length === 1, "Usage: outpost doctor [--provider NAME] [--agent NAME] [--image NAME] [--json]");
14
+ invariant(positionals.length === 1, "Usage: outpost doctor [--sandbox-provider NAME] [--agent NAME] [--image NAME] [--json]");
11
15
  for (const key of Object.keys(values))
12
- invariant(["provider", "agent", "image", "json"].includes(key), `Unsupported doctor option: --${key}`);
13
- const provider = values.provider ?? doctorDefaults.provider;
16
+ invariant(["sandboxProvider", "agent", "image", "json"].includes(key), `Unsupported doctor option: --${key}`);
17
+ const sandboxProvider = values.sandboxProvider ?? doctorDefaults.sandboxProvider;
14
18
  const agent = values.agent ?? doctorDefaults.agent;
15
- invariant(isProvider(provider), "Unknown provider. Choose docker, podman, local, vercel or daytona.");
16
- invariant(agent === "codex" || agent === "claude" || agent === "gemini", "Unknown agent. Choose codex, claude or gemini.");
19
+ invariant(isProvider(sandboxProvider), "Unknown provider. Choose docker, podman, local, vercel or daytona.");
20
+ invariant(isAgent(agent), `Unknown agent. Choose ${Object.keys(doctorAgents).join(", ")}.`);
17
21
  const report = await diagnose({
18
- provider,
22
+ sandboxProvider,
19
23
  agent,
20
24
  ...(values.image !== undefined ? { image: values.image } : {}),
21
25
  }, execute);
22
26
  if (values.json)
23
27
  write(`${JSON.stringify(report, null, 2)}\n`);
24
28
  else {
25
- write(`Outpost doctor — ${report.scope === "host" ? "host checks" : "host and image checks"} (${provider}, ${agent})\n`);
29
+ write(`Outpost doctor — ${report.scope === "host" ? "host checks" : "host and image checks"} (${sandboxProvider}, ${agent})\n`);
26
30
  write(`Provider contract: ${report.placement}; interactive terminal: ${report.interactiveTerminal ? "supported" : "unsupported"}. Workflow execution is not tested.\n`);
27
31
  if (report.image)
28
32
  write(`Image: ${report.image}\n`);
@@ -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\" || 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"]}
1
+ {"version":3,"file":"doctor-command.js","sourceRoot":"","sources":["../../src/cli/doctor-command.ts"],"names":[],"mappings":"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","sourcesContent":["import { doctorAgents } from \"../application/doctor-agent.constants.ts\";\nimport {\n doctorDefaults,\n providerDiagnostics,\n} from \"../application/doctor.constants.ts\";\nimport { diagnose } from \"../application/doctor.ts\";\nimport type {\n DoctorAgent,\n DoctorProvider,\n} 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}\nfunction isAgent(value: string): value is DoctorAgent {\n return Object.hasOwn(doctorAgents, 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 [--sandbox-provider NAME] [--agent NAME] [--image NAME] [--json]\",\n );\n for (const key of Object.keys(values))\n invariant(\n [\"sandboxProvider\", \"agent\", \"image\", \"json\"].includes(key),\n `Unsupported doctor option: --${key}`,\n );\n const sandboxProvider =\n values.sandboxProvider ?? doctorDefaults.sandboxProvider;\n const agent = values.agent ?? doctorDefaults.agent;\n invariant(\n isProvider(sandboxProvider),\n \"Unknown provider. Choose docker, podman, local, vercel or daytona.\",\n );\n invariant(\n isAgent(agent),\n `Unknown agent. Choose ${Object.keys(doctorAgents).join(\", \")}.`,\n );\n const report = await diagnose(\n {\n sandboxProvider,\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\"} (${sandboxProvider}, ${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,4 +1,7 @@
1
- import type { InitOptions } from "./scaffold.types.ts";
1
+ import type { AgentAuthentication } from "../domain/agent.types.ts";
2
+ import type { AuthenticationChoice, InitOptions } from "./scaffold.types.ts";
3
+ export declare function authenticationChoice(options: InitOptions): AuthenticationChoice;
2
4
  export declare function authenticationEnvironment(options: InitOptions): string;
3
5
  export declare function authenticationInstructions(options: InitOptions): string;
6
+ export declare function authenticationSetting(options: InitOptions): AgentAuthentication;
4
7
  export declare function authenticationSource(options: InitOptions): string;
@@ -1,43 +1,37 @@
1
- import { authenticationRecipes } from "./init-authentication.constants.js";
1
+ import { invariant } from "../domain/errors.js";
2
+ import { authenticationChoices } from "./main.constants.js";
3
+ export function authenticationChoice(options) {
4
+ const agent = options.agent ?? "codex";
5
+ const value = options.authentication ?? (options.baseUrl ? "usage" : "account");
6
+ const choices = Object.hasOwn(authenticationChoices, agent)
7
+ ? authenticationChoices[agent]
8
+ : [];
9
+ const choice = choices.find((candidate) => candidate.value === value);
10
+ invariant(choice, `Authentication for ${agent} must be ${choices.map((candidate) => candidate.value).join(", ") || "one of its supported forms"}`);
11
+ return choice;
12
+ }
2
13
  export function authenticationEnvironment(options) {
3
14
  if (options.baseUrl)
4
15
  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;
16
+ const { variable } = authenticationChoice(options);
17
+ return variable ? `${variable}=\n` : "";
10
18
  }
11
19
  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.");
20
+ if (options.baseUrl)
21
+ return `Set ${options.apiKeyEnvironment ?? "OPENAI_API_KEY"} in the workflow .env or parent environment for the custom Responses provider.`;
22
+ return authenticationChoice(options).instructions;
23
+ }
24
+ export function authenticationSetting(options) {
25
+ const { value, variable } = authenticationChoice(options);
26
+ if (value !== "account-token")
27
+ return value;
28
+ invariant(variable, "Account tokens require a declared variable");
29
+ return { account: { variable } };
19
30
  }
20
31
  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 }] };`;
32
+ const setting = authenticationSetting(options);
33
+ if (typeof setting === "string")
34
+ return JSON.stringify(setting);
35
+ return `{ account: { variable: ${JSON.stringify(authenticationChoice(options).variable)} } }`;
42
36
  }
43
37
  //# sourceMappingURL=init-authentication.js.map
@@ -1 +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
+ {"version":3,"file":"init-authentication.js","sourceRoot":"","sources":["../../src/cli/init-authentication.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAG5D,MAAM,UAAU,oBAAoB,CAClC,OAAoB;IAEpB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC;IACvC,MAAM,KAAK,GACT,OAAO,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACpE,MAAM,OAAO,GAAoC,MAAM,CAAC,MAAM,CAC5D,qBAAqB,EACrB,KAAK,CACN;QACC,CAAC,CAAC,qBAAqB,CAAC,KAAK,CAAC;QAC9B,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;IACtE,SAAS,CACP,MAAM,EACN,sBAAsB,KAAK,YAAY,OAAO,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,4BAA4B,EAAE,CAChI,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAAoB;IAC5D,IAAI,OAAO,CAAC,OAAO;QACjB,OAAO,GAAG,OAAO,CAAC,iBAAiB,IAAI,gBAAgB,KAAK,CAAC;IAC/D,MAAM,EAAE,QAAQ,EAAE,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACnD,OAAO,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,OAAoB;IAC7D,IAAI,OAAO,CAAC,OAAO;QACjB,OAAO,OAAO,OAAO,CAAC,iBAAiB,IAAI,gBAAgB,gFAAgF,CAAC;IAC9I,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,OAAoB;IAEpB,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC1D,IAAI,KAAK,KAAK,eAAe;QAAE,OAAO,KAAK,CAAC;IAC5C,SAAS,CAAC,QAAQ,EAAE,4CAA4C,CAAC,CAAC;IAClE,OAAO,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAoB;IACvD,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAChE,OAAO,0BAA0B,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;AAChG,CAAC","sourcesContent":["import type { AgentAuthentication } from \"../domain/agent.types.ts\";\nimport { invariant } from \"../domain/errors.ts\";\nimport { authenticationChoices } from \"./main.constants.ts\";\nimport type { AuthenticationChoice, InitOptions } from \"./scaffold.types.ts\";\n\nexport function authenticationChoice(\n options: InitOptions,\n): AuthenticationChoice {\n const agent = options.agent ?? \"codex\";\n const value =\n options.authentication ?? (options.baseUrl ? \"usage\" : \"account\");\n const choices: readonly AuthenticationChoice[] = Object.hasOwn(\n authenticationChoices,\n agent,\n )\n ? authenticationChoices[agent]\n : [];\n const choice = choices.find((candidate) => candidate.value === value);\n invariant(\n choice,\n `Authentication for ${agent} must be ${choices.map((candidate) => candidate.value).join(\", \") || \"one of its supported forms\"}`,\n );\n return choice;\n}\n\nexport function authenticationEnvironment(options: InitOptions): string {\n if (options.baseUrl)\n return `${options.apiKeyEnvironment ?? \"OPENAI_API_KEY\"}=\\n`;\n const { variable } = authenticationChoice(options);\n return variable ? `${variable}=\\n` : \"\";\n}\n\nexport function authenticationInstructions(options: InitOptions): string {\n if (options.baseUrl)\n return `Set ${options.apiKeyEnvironment ?? \"OPENAI_API_KEY\"} in the workflow .env or parent environment for the custom Responses provider.`;\n return authenticationChoice(options).instructions;\n}\n\nexport function authenticationSetting(\n options: InitOptions,\n): AgentAuthentication {\n const { value, variable } = authenticationChoice(options);\n if (value !== \"account-token\") return value;\n invariant(variable, \"Account tokens require a declared variable\");\n return { account: { variable } };\n}\n\nexport function authenticationSource(options: InitOptions): string {\n const setting = authenticationSetting(options);\n if (typeof setting === \"string\") return JSON.stringify(setting);\n return `{ account: { variable: ${JSON.stringify(authenticationChoice(options).variable)} } }`;\n}\n"]}
@@ -16,8 +16,8 @@ export async function initializeCommand({ values, }) {
16
16
  delete options["api-key-env"];
17
17
  if (!values.yes &&
18
18
  !process.stdin.isTTY &&
19
- (!values.agent || !values.provider))
20
- throw new Error("Headless initialization requires --yes for defaults, or --agent and --provider.");
19
+ (!values.agent || !values.sandboxProvider))
20
+ throw new Error("Headless initialization requires --yes for defaults, or --agent and --sandbox-provider.");
21
21
  if (!values.yes && process.stdin.isTTY) {
22
22
  intro("Create an Outpost workflow");
23
23
  for (const question of initializationQuestions) {
@@ -36,7 +36,7 @@ export async function initializeCommand({ values, }) {
36
36
  }
37
37
  const settings = await projectSettings(resolve(values.directory ?? process.cwd()), options);
38
38
  const choices = Object.entries(authenticationChoices).find(([name]) => name === options.agent)?.[1];
39
- invariant(choices, "Choose codex, claude or gemini");
39
+ invariant(choices, "Choose codex, claude, antigravity, copilot or kimi");
40
40
  const questions = [
41
41
  {
42
42
  key: "manager",
@@ -47,8 +47,8 @@ export async function initializeCommand({ values, }) {
47
47
  {
48
48
  key: "authentication",
49
49
  message: "Agent authentication",
50
- options: [...choices],
51
- initialValue: "api-key",
50
+ options: choices.map(({ value, label }) => ({ value, label })),
51
+ initialValue: options.baseUrl === undefined ? "account" : "usage",
52
52
  },
53
53
  ];
54
54
  for (const question of questions) {
@@ -63,7 +63,7 @@ export async function initializeCommand({ values, }) {
63
63
  options[question.key] = value;
64
64
  }
65
65
  }
66
- options.build ??= ["docker", "podman"].includes(String(options.provider ?? "docker"));
66
+ options.build ??= ["docker", "podman"].includes(String(options.sandboxProvider ?? "docker"));
67
67
  const progress = !values.yes && process.stdin.isTTY ? spinner() : undefined;
68
68
  progress?.start(options.build
69
69
  ? "Creating project and building its container image"
@@ -1 +1 @@
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"]}
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.sandboxProvider)\n )\n throw new Error(\n \"Headless initialization requires --yes for defaults, or --agent and --sandbox-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, antigravity, copilot or kimi\");\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.map(({ value, label }) => ({ value, label })),\n initialValue: options.baseUrl === undefined ? \"account\" : \"usage\",\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.sandboxProvider ?? \"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"]}