@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
@@ -1,6 +1,7 @@
1
1
  export function reporter(options = {}) {
2
2
  const write = options.write ?? ((text) => process.stdout.write(text));
3
3
  let streamed = false;
4
+ let deltas = false;
4
5
  return (event) => {
5
6
  if (options.quiet)
6
7
  return;
@@ -8,13 +9,19 @@ export function reporter(options = {}) {
8
9
  switch (event.kind) {
9
10
  case "phase":
10
11
  if (event.name === "running")
11
- streamed = false;
12
+ streamed = deltas = false;
12
13
  write(`${prefix} ${event.name}${event.agent ? ` · ${event.agent}` : ""}${event.branch ? ` · ${event.branch}` : ""}${options.verbose && event.directory ? ` · ${event.directory}` : ""}\n`);
13
14
  break;
14
- case "text":
15
+ case "text-delta":
15
16
  streamed = true;
17
+ deltas = true;
16
18
  write(event.text);
17
19
  break;
20
+ case "text":
21
+ streamed = true;
22
+ if (!deltas)
23
+ write(event.text);
24
+ break;
18
25
  case "result":
19
26
  if (!streamed || options.verbose)
20
27
  write(`\n${prefix} result: ${event.text}\n`);
@@ -22,6 +29,24 @@ export function reporter(options = {}) {
22
29
  case "tool":
23
30
  write(`\n${prefix} tool: ${event.name}${options.verbose ? ` ${JSON.stringify(event.input)}` : ""}\n`);
24
31
  break;
32
+ case "tool-result":
33
+ write(`${prefix} tool ${event.isError ? "failed" : "done"}: ${event.name}${options.verbose ? ` ${event.preview}` : ""}\n`);
34
+ break;
35
+ case "tool-denied":
36
+ write(`${prefix} tool denied: ${event.name} · ${event.reason}\n`);
37
+ break;
38
+ case "stop-prevented":
39
+ write(`${prefix} stop prevented: ${event.message}\n`);
40
+ break;
41
+ case "compaction":
42
+ if (options.verbose)
43
+ write(`${prefix} context compacted by ${event.strategy} · ${event.messages} messages\n`);
44
+ break;
45
+ case "step":
46
+ deltas = false;
47
+ if (options.verbose)
48
+ write(`${prefix} step ${event.index}\n`);
49
+ break;
25
50
  case "summary":
26
51
  write(`\n${prefix} finished · ${(event.durationMs / 1000).toFixed(2)}s · status ${event.status} · input ${event.tokens.input} · cache read ${event.tokens.cached} · cache write ${event.tokens.cacheCreated ?? 0} · output ${event.tokens.output}\n`);
27
52
  break;
@@ -1 +1 @@
1
- {"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../src/infrastructure/reporter.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentEvent } from \"../domain/agent.types.ts\";\nimport type { ReporterOptions, ReportPass } from \"./reporter.types.ts\";\n\nexport type { ReporterOptions } from \"./reporter.types.ts\";\n\nexport function reporter(\n options: ReporterOptions = {},\n): (event: AgentEvent & ReportPass) => void {\n const write = options.write ?? ((text) => process.stdout.write(text));\n let streamed = false;\n return (event) => {\n if (options.quiet) return;\n const prefix = `[${options.label ?? \"outpost\"}${event.pass ? ` · pass ${event.pass}` : \"\"}]`;\n switch (event.kind) {\n case \"phase\":\n if (event.name === \"running\") streamed = false;\n write(\n `${prefix} ${event.name}${event.agent ? ` · ${event.agent}` : \"\"}${event.branch ? ` · ${event.branch}` : \"\"}${options.verbose && event.directory ? ` · ${event.directory}` : \"\"}\\n`,\n );\n break;\n case \"text\":\n streamed = true;\n write(event.text);\n break;\n case \"result\":\n if (!streamed || options.verbose)\n write(`\\n${prefix} result: ${event.text}\\n`);\n break;\n case \"tool\":\n write(\n `\\n${prefix} tool: ${event.name}${options.verbose ? ` ${JSON.stringify(event.input)}` : \"\"}\\n`,\n );\n break;\n case \"summary\":\n write(\n `\\n${prefix} finished · ${(event.durationMs / 1000).toFixed(2)}s · status ${event.status} · input ${event.tokens.input} · cache read ${event.tokens.cached} · cache write ${event.tokens.cacheCreated ?? 0} · output ${event.tokens.output}\\n`,\n );\n break;\n case \"failure\":\n case \"warning\":\n write(`\\n${prefix} ${event.kind}: ${event.message}\\n`);\n break;\n case \"conversation\":\n if (options.verbose) write(`\\n${prefix} conversation: ${event.id}\\n`);\n break;\n case \"prompt\":\n if (options.verbose) write(`${prefix} prompt:\\n${event.text}\\n`);\n break;\n case \"raw\":\n if (options.verbose)\n write(\n `${prefix} raw: ${typeof event.value === \"string\" ? event.value : JSON.stringify(event.value)}\\n`,\n );\n break;\n }\n };\n}\n"]}
1
+ {"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../src/infrastructure/reporter.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentEvent } from \"../domain/agent.types.ts\";\nimport type { ReporterOptions, ReportPass } from \"./reporter.types.ts\";\n\nexport type { ReporterOptions } from \"./reporter.types.ts\";\n\nexport function reporter(\n options: ReporterOptions = {},\n): (event: AgentEvent & ReportPass) => void {\n const write = options.write ?? ((text) => process.stdout.write(text));\n let streamed = false;\n let deltas = false;\n return (event) => {\n if (options.quiet) return;\n const prefix = `[${options.label ?? \"outpost\"}${event.pass ? ` · pass ${event.pass}` : \"\"}]`;\n switch (event.kind) {\n case \"phase\":\n if (event.name === \"running\") streamed = deltas = false;\n write(\n `${prefix} ${event.name}${event.agent ? ` · ${event.agent}` : \"\"}${event.branch ? ` · ${event.branch}` : \"\"}${options.verbose && event.directory ? ` · ${event.directory}` : \"\"}\\n`,\n );\n break;\n case \"text-delta\":\n streamed = true;\n deltas = true;\n write(event.text);\n break;\n case \"text\":\n streamed = true;\n if (!deltas) write(event.text);\n break;\n case \"result\":\n if (!streamed || options.verbose)\n write(`\\n${prefix} result: ${event.text}\\n`);\n break;\n case \"tool\":\n write(\n `\\n${prefix} tool: ${event.name}${options.verbose ? ` ${JSON.stringify(event.input)}` : \"\"}\\n`,\n );\n break;\n case \"tool-result\":\n write(\n `${prefix} tool ${event.isError ? \"failed\" : \"done\"}: ${event.name}${options.verbose ? ` ${event.preview}` : \"\"}\\n`,\n );\n break;\n case \"tool-denied\":\n write(`${prefix} tool denied: ${event.name} · ${event.reason}\\n`);\n break;\n case \"stop-prevented\":\n write(`${prefix} stop prevented: ${event.message}\\n`);\n break;\n case \"compaction\":\n if (options.verbose)\n write(\n `${prefix} context compacted by ${event.strategy} · ${event.messages} messages\\n`,\n );\n break;\n case \"step\":\n deltas = false;\n if (options.verbose) write(`${prefix} step ${event.index}\\n`);\n break;\n case \"summary\":\n write(\n `\\n${prefix} finished · ${(event.durationMs / 1000).toFixed(2)}s · status ${event.status} · input ${event.tokens.input} · cache read ${event.tokens.cached} · cache write ${event.tokens.cacheCreated ?? 0} · output ${event.tokens.output}\\n`,\n );\n break;\n case \"failure\":\n case \"warning\":\n write(`\\n${prefix} ${event.kind}: ${event.message}\\n`);\n break;\n case \"conversation\":\n if (options.verbose) write(`\\n${prefix} conversation: ${event.id}\\n`);\n break;\n case \"prompt\":\n if (options.verbose) write(`${prefix} prompt:\\n${event.text}\\n`);\n break;\n case \"raw\":\n if (options.verbose)\n write(\n `${prefix} raw: ${typeof event.value === \"string\" ? event.value : JSON.stringify(event.value)}\\n`,\n );\n break;\n }\n };\n}\n"]}
@@ -0,0 +1 @@
1
+ export declare const repositoryStorageDirectory = "storage";
@@ -0,0 +1,2 @@
1
+ export const repositoryStorageDirectory = "storage";
2
+ //# sourceMappingURL=repository-transport.constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository-transport.constants.js","sourceRoot":"","sources":["../../src/infrastructure/repository-transport.constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,0BAA0B,GAAG,SAAS,CAAC","sourcesContent":["export const repositoryStorageDirectory = \"storage\";\n"]}
@@ -0,0 +1,2 @@
1
+ import type { Transport } from "../domain/transport.types.ts";
2
+ export declare function repositoryTransport(repository: string): Transport;
@@ -0,0 +1,9 @@
1
+ import { join } from "node:path";
2
+ import { localTransport } from "./local-transport.js";
3
+ import { repositoryStorageDirectory } from "./repository-transport.constants.js";
4
+ export function repositoryTransport(repository) {
5
+ return localTransport({
6
+ directory: join(repository, ".outpost", repositoryStorageDirectory),
7
+ });
8
+ }
9
+ //# sourceMappingURL=repository-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository-transport.js","sourceRoot":"","sources":["../../src/infrastructure/repository-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AAEjF,MAAM,UAAU,mBAAmB,CAAC,UAAkB;IACpD,OAAO,cAAc,CAAC;QACpB,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,0BAA0B,CAAC;KACpE,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { join } from \"node:path\";\nimport { localTransport } from \"./local-transport.ts\";\nimport type { Transport } from \"../domain/transport.types.ts\";\nimport { repositoryStorageDirectory } from \"./repository-transport.constants.ts\";\n\nexport function repositoryTransport(repository: string): Transport {\n return localTransport({\n directory: join(repository, \".outpost\", repositoryStorageDirectory),\n });\n}\n"]}
@@ -1,8 +1,9 @@
1
- import { lstat, opendir, realpath } from "node:fs/promises";
2
1
  import { join } from "node:path";
3
2
  import { invariant, positive } from "../domain/errors.js";
4
3
  import { observeOwnership } from "./git/process-identity.js";
5
- import { readInspectionFile } from "./inspection-file.js";
4
+ import { repositoryTransport } from "./repository-transport.js";
5
+ import { repositoryStorageDirectory } from "./repository-transport.constants.js";
6
+ import { jsonObject } from "./transport-json.js";
6
7
  import { resourceActivityDefaults as defaults, resourceOperationKinds, resourcePhases, } from "./resource-activity.constants.js";
7
8
  function object(value) {
8
9
  invariant(!!value && typeof value === "object" && !Array.isArray(value), "Invalid activity object");
@@ -58,7 +59,8 @@ export function resourceRecord(value) {
58
59
  object(value);
59
60
  invariant(value.version === 1, "Unknown activity version");
60
61
  text(value.id);
61
- text(value.provider);
62
+ invariant(value.sandboxProvider !== undefined || value.provider === undefined, "Legacy activity record uses provider; sandboxProvider is required");
63
+ text(value.sandboxProvider);
62
64
  text(value.workspace);
63
65
  date(value.createdAt);
64
66
  date(value.updatedAt);
@@ -79,7 +81,7 @@ export function resourceRecord(value) {
79
81
  id: value.id,
80
82
  pid: value.pid,
81
83
  ...(owner ? { identity: owner } : {}),
82
- provider: value.provider,
84
+ sandboxProvider: value.sandboxProvider,
83
85
  placement: value.placement,
84
86
  workspace: value.workspace,
85
87
  createdAt: value.createdAt,
@@ -98,48 +100,42 @@ export async function inspectResourceActivity(repository, maxEntries = defaults.
98
100
  positive(maxEntries, "maxEntries");
99
101
  const entries = [];
100
102
  const issues = [];
101
- let path = repository;
103
+ const transporter = repositoryTransport(repository);
104
+ const root = join(repository, ".outpost", repositoryStorageDirectory);
102
105
  try {
103
- for (const part of [".outpost", "locks", defaults.directory]) {
104
- path = join(path, part);
105
- const info = await lstat(path);
106
- invariant(info.isDirectory() &&
107
- !info.isSymbolicLink() &&
108
- (await realpath(path)) === path, "Unsafe activity directory");
109
- }
110
- for await (const entry of await opendir(path)) {
111
- const file = join(path, entry.name);
106
+ for await (const entry of transporter.list("resources/")) {
107
+ const path = join(root, "objects", `${entry.key}.object`);
112
108
  if (entries.length >= Math.min(maxEntries, defaults.maxRecords)) {
113
- issues.push({ path, code: "RESOURCE_ENTRY_LIMIT" });
109
+ issues.push({ path: root, code: "RESOURCE_ENTRY_LIMIT" });
114
110
  break;
115
111
  }
116
112
  try {
117
- const value = resourceRecord(JSON.parse((await readInspectionFile(file, defaults.maxRecordBytes)).toString("utf8")));
118
- invariant(entry.name === `${value.id}.json`, "Activity identity mismatch");
113
+ const current = await transporter.read(entry.key, {
114
+ maxBytes: defaults.maxRecordBytes,
115
+ });
116
+ invariant(current?.revision === entry.revision, "Resource changed during inspection");
117
+ const value = resourceRecord(jsonObject(current));
118
+ invariant(entry.key === `resources/${value.id}.json`, "Activity identity mismatch");
119
119
  entries.push({
120
- path: file,
120
+ path,
121
121
  record: value,
122
122
  ownership: await observeOwnership(value.pid, value.identity),
123
123
  });
124
124
  }
125
125
  catch {
126
126
  entries.push({
127
- path: file,
127
+ path,
128
128
  ownership: {
129
129
  status: "unknown",
130
130
  reason: "RESOURCE_RECORD_UNREADABLE",
131
131
  },
132
132
  });
133
- issues.push({ path: file, code: "RESOURCE_RECORD_UNREADABLE" });
133
+ issues.push({ path, code: "RESOURCE_RECORD_UNREADABLE" });
134
134
  }
135
135
  }
136
136
  }
137
- catch (cause) {
138
- if (!(cause &&
139
- typeof cause === "object" &&
140
- "code" in cause &&
141
- cause.code === "ENOENT"))
142
- issues.push({ path, code: "RESOURCE_DIRECTORY_UNAVAILABLE" });
137
+ catch {
138
+ issues.push({ path: root, code: "RESOURCE_DIRECTORY_UNAVAILABLE" });
143
139
  }
144
140
  entries.sort((left, right) => left.path.localeCompare(right.path));
145
141
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"resource-activity-inspection.js","sourceRoot":"","sources":["../../src/infrastructure/resource-activity-inspection.ts"],"names":[],"mappings":"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","sourcesContent":["import { lstat, opendir, realpath } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { invariant, positive } from \"../domain/errors.ts\";\nimport { observeOwnership } from \"./git/process-identity.ts\";\nimport type { LocalProcessIdentity } from \"./git/process-identity.types.ts\";\nimport { readInspectionFile } from \"./inspection-file.ts\";\nimport {\n resourceActivityDefaults as defaults,\n resourceOperationKinds,\n resourcePhases,\n} from \"./resource-activity.constants.ts\";\nimport type {\n ResourceActivityRecord,\n ResourceInspection,\n ResourceInspectionEntry,\n ResourceOperation,\n ResourceOperationResult,\n} from \"./resource-activity.types.ts\";\nimport type { StorageIssue } from \"./storage-inventory.types.ts\";\n\nfunction object(value: unknown): asserts value is Record<string, unknown> {\n invariant(\n !!value && typeof value === \"object\" && !Array.isArray(value),\n \"Invalid activity object\",\n );\n}\nfunction text(value: unknown): asserts value is string {\n invariant(\n typeof value === \"string\" &&\n value.length > 0 &&\n value.length <= defaults.maxText,\n \"Invalid activity text\",\n );\n}\nfunction date(value: unknown): asserts value is string {\n text(value);\n invariant(Number.isFinite(Date.parse(value)), \"Invalid activity time\");\n}\nfunction operation(value: unknown): ResourceOperation {\n object(value);\n invariant(\n typeof value.count === \"number\" &&\n Number.isSafeInteger(value.count) &&\n value.count > 0,\n \"Invalid activity count\",\n );\n date(value.startedAt);\n const kind = resourceOperationKinds.find((kind) => kind === value.kind);\n invariant(kind, \"Invalid activity operation\");\n return { count: value.count, startedAt: value.startedAt, kind };\n}\nfunction result(value: unknown): ResourceOperationResult {\n const base = operation(value);\n object(value);\n text(value.id);\n date(value.finishedAt);\n invariant(\n value.outcome === \"completed\" || value.outcome === \"failed\",\n \"Invalid activity outcome\",\n );\n return {\n ...base,\n id: value.id,\n finishedAt: value.finishedAt,\n outcome: value.outcome,\n };\n}\nfunction identity(value: unknown): LocalProcessIdentity | undefined {\n if (value === undefined) return undefined;\n object(value);\n text(value.host);\n text(value.boot);\n text(value.namespace);\n text(value.started);\n return {\n host: value.host,\n boot: value.boot,\n namespace: value.namespace,\n started: value.started,\n };\n}\nexport function resourceRecord(value: unknown): ResourceActivityRecord {\n object(value);\n invariant(value.version === 1, \"Unknown activity version\");\n text(value.id);\n text(value.provider);\n text(value.workspace);\n date(value.createdAt);\n date(value.updatedAt);\n invariant(\n typeof value.pid === \"number\" &&\n Number.isSafeInteger(value.pid) &&\n value.pid > 0 &&\n value.pid <= 2_147_483_647,\n \"Invalid activity owner\",\n );\n invariant(\n value.placement === \"host\" ||\n value.placement === \"mounted\" ||\n value.placement === \"remote\",\n \"Invalid activity placement\",\n );\n const phase = resourcePhases.find((phase) => phase === value.phase);\n invariant(phase, \"Invalid activity phase\");\n invariant(\n Array.isArray(value.operations) &&\n value.operations.length <= resourceOperationKinds.length,\n \"Invalid activity operations\",\n );\n const owner = identity(value.identity);\n return {\n version: 1,\n id: value.id,\n pid: value.pid,\n ...(owner ? { identity: owner } : {}),\n provider: value.provider,\n placement: value.placement,\n workspace: value.workspace,\n createdAt: value.createdAt,\n updatedAt: value.updatedAt,\n phase,\n operations: value.operations.map(operation),\n ...(value.lastOperation === undefined\n ? {}\n : { lastOperation: result(value.lastOperation) }),\n ...(value.lastFailure === undefined\n ? {}\n : { lastFailure: result(value.lastFailure) }),\n };\n}\n\nexport async function inspectResourceActivity(\n repository: string,\n maxEntries: number = defaults.maxRecords,\n): Promise<ResourceInspection> {\n positive(maxEntries, \"maxEntries\");\n const entries: ResourceInspectionEntry[] = [];\n const issues: StorageIssue[] = [];\n let path = repository;\n try {\n for (const part of [\".outpost\", \"locks\", defaults.directory]) {\n path = join(path, part);\n const info = await lstat(path);\n invariant(\n info.isDirectory() &&\n !info.isSymbolicLink() &&\n (await realpath(path)) === path,\n \"Unsafe activity directory\",\n );\n }\n for await (const entry of await opendir(path)) {\n const file = join(path, entry.name);\n if (entries.length >= Math.min(maxEntries, defaults.maxRecords)) {\n issues.push({ path, code: \"RESOURCE_ENTRY_LIMIT\" });\n break;\n }\n try {\n const value = resourceRecord(\n JSON.parse(\n (await readInspectionFile(file, defaults.maxRecordBytes)).toString(\n \"utf8\",\n ),\n ),\n );\n invariant(\n entry.name === `${value.id}.json`,\n \"Activity identity mismatch\",\n );\n entries.push({\n path: file,\n record: value,\n ownership: await observeOwnership(value.pid, value.identity),\n });\n } catch {\n entries.push({\n path: file,\n ownership: {\n status: \"unknown\",\n reason: \"RESOURCE_RECORD_UNREADABLE\",\n },\n });\n issues.push({ path: file, code: \"RESOURCE_RECORD_UNREADABLE\" });\n }\n }\n } catch (cause) {\n if (!(\n cause &&\n typeof cause === \"object\" &&\n \"code\" in cause &&\n cause.code === \"ENOENT\"\n ))\n issues.push({ path, code: \"RESOURCE_DIRECTORY_UNAVAILABLE\" });\n }\n entries.sort((left, right) => left.path.localeCompare(right.path));\n return {\n scope: \"recorded-sandboxes\",\n complete: issues.length === 0,\n entries,\n issues,\n };\n}\n"]}
1
+ {"version":3,"file":"resource-activity-inspection.js","sourceRoot":"","sources":["../../src/infrastructure/resource-activity-inspection.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport { invariant, positive } from \"../domain/errors.ts\";\nimport { observeOwnership } from \"./git/process-identity.ts\";\nimport type { LocalProcessIdentity } from \"./git/process-identity.types.ts\";\nimport { repositoryTransport } from \"./repository-transport.ts\";\nimport { repositoryStorageDirectory } from \"./repository-transport.constants.ts\";\nimport { jsonObject } from \"./transport-json.ts\";\nimport {\n resourceActivityDefaults as defaults,\n resourceOperationKinds,\n resourcePhases,\n} from \"./resource-activity.constants.ts\";\nimport type {\n ResourceActivityRecord,\n ResourceInspection,\n ResourceInspectionEntry,\n ResourceOperation,\n ResourceOperationResult,\n} from \"./resource-activity.types.ts\";\nimport type { StorageIssue } from \"./storage-inventory.types.ts\";\n\nfunction object(value: unknown): asserts value is Record<string, unknown> {\n invariant(\n !!value && typeof value === \"object\" && !Array.isArray(value),\n \"Invalid activity object\",\n );\n}\nfunction text(value: unknown): asserts value is string {\n invariant(\n typeof value === \"string\" &&\n value.length > 0 &&\n value.length <= defaults.maxText,\n \"Invalid activity text\",\n );\n}\nfunction date(value: unknown): asserts value is string {\n text(value);\n invariant(Number.isFinite(Date.parse(value)), \"Invalid activity time\");\n}\nfunction operation(value: unknown): ResourceOperation {\n object(value);\n invariant(\n typeof value.count === \"number\" &&\n Number.isSafeInteger(value.count) &&\n value.count > 0,\n \"Invalid activity count\",\n );\n date(value.startedAt);\n const kind = resourceOperationKinds.find((kind) => kind === value.kind);\n invariant(kind, \"Invalid activity operation\");\n return { count: value.count, startedAt: value.startedAt, kind };\n}\nfunction result(value: unknown): ResourceOperationResult {\n const base = operation(value);\n object(value);\n text(value.id);\n date(value.finishedAt);\n invariant(\n value.outcome === \"completed\" || value.outcome === \"failed\",\n \"Invalid activity outcome\",\n );\n return {\n ...base,\n id: value.id,\n finishedAt: value.finishedAt,\n outcome: value.outcome,\n };\n}\nfunction identity(value: unknown): LocalProcessIdentity | undefined {\n if (value === undefined) return undefined;\n object(value);\n text(value.host);\n text(value.boot);\n text(value.namespace);\n text(value.started);\n return {\n host: value.host,\n boot: value.boot,\n namespace: value.namespace,\n started: value.started,\n };\n}\nexport function resourceRecord(value: unknown): ResourceActivityRecord {\n object(value);\n invariant(value.version === 1, \"Unknown activity version\");\n text(value.id);\n invariant(\n value.sandboxProvider !== undefined || value.provider === undefined,\n \"Legacy activity record uses provider; sandboxProvider is required\",\n );\n text(value.sandboxProvider);\n text(value.workspace);\n date(value.createdAt);\n date(value.updatedAt);\n invariant(\n typeof value.pid === \"number\" &&\n Number.isSafeInteger(value.pid) &&\n value.pid > 0 &&\n value.pid <= 2_147_483_647,\n \"Invalid activity owner\",\n );\n invariant(\n value.placement === \"host\" ||\n value.placement === \"mounted\" ||\n value.placement === \"remote\",\n \"Invalid activity placement\",\n );\n const phase = resourcePhases.find((phase) => phase === value.phase);\n invariant(phase, \"Invalid activity phase\");\n invariant(\n Array.isArray(value.operations) &&\n value.operations.length <= resourceOperationKinds.length,\n \"Invalid activity operations\",\n );\n const owner = identity(value.identity);\n return {\n version: 1,\n id: value.id,\n pid: value.pid,\n ...(owner ? { identity: owner } : {}),\n sandboxProvider: value.sandboxProvider,\n placement: value.placement,\n workspace: value.workspace,\n createdAt: value.createdAt,\n updatedAt: value.updatedAt,\n phase,\n operations: value.operations.map(operation),\n ...(value.lastOperation === undefined\n ? {}\n : { lastOperation: result(value.lastOperation) }),\n ...(value.lastFailure === undefined\n ? {}\n : { lastFailure: result(value.lastFailure) }),\n };\n}\n\nexport async function inspectResourceActivity(\n repository: string,\n maxEntries: number = defaults.maxRecords,\n): Promise<ResourceInspection> {\n positive(maxEntries, \"maxEntries\");\n const entries: ResourceInspectionEntry[] = [];\n const issues: StorageIssue[] = [];\n const transporter = repositoryTransport(repository);\n const root = join(repository, \".outpost\", repositoryStorageDirectory);\n try {\n for await (const entry of transporter.list(\"resources/\")) {\n const path = join(root, \"objects\", `${entry.key}.object`);\n if (entries.length >= Math.min(maxEntries, defaults.maxRecords)) {\n issues.push({ path: root, code: \"RESOURCE_ENTRY_LIMIT\" });\n break;\n }\n try {\n const current = await transporter.read(entry.key, {\n maxBytes: defaults.maxRecordBytes,\n });\n invariant(\n current?.revision === entry.revision,\n \"Resource changed during inspection\",\n );\n const value = resourceRecord(jsonObject(current));\n invariant(\n entry.key === `resources/${value.id}.json`,\n \"Activity identity mismatch\",\n );\n entries.push({\n path,\n record: value,\n ownership: await observeOwnership(value.pid, value.identity),\n });\n } catch {\n entries.push({\n path,\n ownership: {\n status: \"unknown\",\n reason: \"RESOURCE_RECORD_UNREADABLE\",\n },\n });\n issues.push({ path, code: \"RESOURCE_RECORD_UNREADABLE\" });\n }\n }\n } catch {\n issues.push({ path: root, code: \"RESOURCE_DIRECTORY_UNAVAILABLE\" });\n }\n entries.sort((left, right) => left.path.localeCompare(right.path));\n return {\n scope: \"recorded-sandboxes\",\n complete: issues.length === 0,\n entries,\n issues,\n };\n}\n"]}
@@ -1,5 +1,4 @@
1
1
  export declare const resourceActivityDefaults: {
2
- readonly directory: "resource-activity";
3
2
  readonly maxRecords: 10000;
4
3
  readonly maxRecordBytes: 65536;
5
4
  readonly maxText: 4096;
@@ -1,5 +1,4 @@
1
1
  export const resourceActivityDefaults = {
2
- directory: "resource-activity",
3
2
  maxRecords: 10_000,
4
3
  maxRecordBytes: 65_536,
5
4
  maxText: 4_096,
@@ -1 +1 @@
1
- {"version":3,"file":"resource-activity.constants.js","sourceRoot":"","sources":["../../src/infrastructure/resource-activity.constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,SAAS,EAAE,mBAAmB;IAC9B,UAAU,EAAE,MAAM;IAClB,cAAc,EAAE,MAAM;IACtB,OAAO,EAAE,KAAK;CACN,CAAC;AAEX,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,YAAY;IACZ,OAAO;IACP,SAAS;IACT,gBAAgB;IAChB,sBAAsB;CACd,CAAC;AACX,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,UAAU;IACV,QAAQ;IACR,UAAU;IACV,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,UAAU;IACV,gBAAgB;IAChB,cAAc;CACN,CAAC","sourcesContent":["export const resourceActivityDefaults = {\n directory: \"resource-activity\",\n maxRecords: 10_000,\n maxRecordBytes: 65_536,\n maxText: 4_096,\n} as const;\n\nexport const resourcePhases = [\n \"allocating\",\n \"ready\",\n \"closing\",\n \"cleanup-failed\",\n \"allocation-uncertain\",\n] as const;\nexport const resourceOperationKinds = [\n \"dispatch\",\n \"attach\",\n \"diagnose\",\n \"command\",\n \"invoke\",\n \"upload\",\n \"download\",\n \"manifest\",\n \"download-batch\",\n \"upload-batch\",\n] as const;\n"]}
1
+ {"version":3,"file":"resource-activity.constants.js","sourceRoot":"","sources":["../../src/infrastructure/resource-activity.constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,UAAU,EAAE,MAAM;IAClB,cAAc,EAAE,MAAM;IACtB,OAAO,EAAE,KAAK;CACN,CAAC;AAEX,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,YAAY;IACZ,OAAO;IACP,SAAS;IACT,gBAAgB;IAChB,sBAAsB;CACd,CAAC;AACX,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,UAAU;IACV,QAAQ;IACR,UAAU;IACV,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,UAAU;IACV,gBAAgB;IAChB,cAAc;CACN,CAAC","sourcesContent":["export const resourceActivityDefaults = {\n maxRecords: 10_000,\n maxRecordBytes: 65_536,\n maxText: 4_096,\n} as const;\n\nexport const resourcePhases = [\n \"allocating\",\n \"ready\",\n \"closing\",\n \"cleanup-failed\",\n \"allocation-uncertain\",\n] as const;\nexport const resourceOperationKinds = [\n \"dispatch\",\n \"attach\",\n \"diagnose\",\n \"command\",\n \"invoke\",\n \"upload\",\n \"download\",\n \"manifest\",\n \"download-batch\",\n \"upload-batch\",\n] as const;\n"]}
@@ -1,30 +1,17 @@
1
1
  import { TransportConflict } from "../domain/transport.js";
2
2
  import { jsonBytes } from "./transport-json.js";
3
3
  import { randomUUID } from "node:crypto";
4
- import { mkdir, open, realpath, rename, rm, opendir } from "node:fs/promises";
5
- import { join } from "node:path";
6
4
  import { invariant } from "../domain/errors.js";
7
5
  import { localProcessIdentity } from "./git/process-identity.js";
8
- import { readInspectionFile } from "./inspection-file.js";
9
- import { lockStorageMutation } from "./storage-mutation-lock.js";
6
+ import { repositoryTransport } from "./repository-transport.js";
10
7
  import { resourceActivityDefaults as defaults } from "./resource-activity.constants.js";
11
- async function activityDirectory(repository) {
12
- let path = repository;
13
- for (const part of [".outpost", "locks", defaults.directory]) {
14
- path = join(path, part);
15
- await mkdir(path, { recursive: true, mode: 0o700 });
16
- invariant((await realpath(path)) === path, "Resource activity directory must not use symlinks");
17
- }
18
- return path;
19
- }
20
8
  export async function registerResourceActivity(options) {
21
- for (const text of [options.workspace, options.provider])
9
+ for (const text of [options.workspace, options.sandboxProvider])
22
10
  invariant(text.length > 0 && text.length <= defaults.maxText, "Resource activity metadata exceeds its size limit");
23
- const remote = options.transporter;
24
- const directory = remote ? "" : await activityDirectory(options.repository);
11
+ const transporter = options.transporter ?? repositoryTransport(options.repository);
25
12
  let revision;
26
13
  const id = randomUUID();
27
- const path = remote ? `resources/${id}.json` : join(directory, `${id}.json`);
14
+ const path = `resources/${id}.json`;
28
15
  const createdAt = new Date().toISOString();
29
16
  const identity = await localProcessIdentity();
30
17
  let record = {
@@ -32,7 +19,7 @@ export async function registerResourceActivity(options) {
32
19
  id,
33
20
  pid: process.pid,
34
21
  ...(identity ? { identity } : {}),
35
- provider: options.provider,
22
+ sandboxProvider: options.sandboxProvider,
36
23
  placement: options.placement,
37
24
  workspace: options.workspace,
38
25
  createdAt,
@@ -40,30 +27,10 @@ export async function registerResourceActivity(options) {
40
27
  phase: "allocating",
41
28
  operations: [],
42
29
  };
43
- const unlock = remote
44
- ? async () => { }
45
- : await lockStorageMutation(options.repository);
46
- try {
47
- if (remote) {
48
- revision = (await remote.write(path, jsonBytes(record), { ifRevision: null })).revision;
49
- }
50
- if (!remote) {
51
- let count = 0;
52
- for await (const _entry of await opendir(directory))
53
- invariant(++count < defaults.maxRecords, "Too many resource activity records; inspect retained ownership before continuing");
54
- const file = await open(path, "wx", 0o600);
55
- try {
56
- await file.writeFile(JSON.stringify(record));
57
- await file.sync();
58
- }
59
- finally {
60
- await file.close();
61
- }
62
- }
63
- }
64
- finally {
65
- await unlock();
66
- }
30
+ let count = 0;
31
+ for await (const _entry of transporter.list("resources/"))
32
+ invariant(++count < defaults.maxRecords, "Too many resource activity records; inspect retained ownership before continuing");
33
+ revision = (await transporter.write(path, jsonBytes(record), { ifRevision: null })).revision;
67
34
  let pending = Promise.resolve();
68
35
  let removed = false;
69
36
  function serialize(action) {
@@ -73,15 +40,8 @@ export async function registerResourceActivity(options) {
73
40
  }
74
41
  async function verify() {
75
42
  invariant(!removed, "Resource activity is closed");
76
- if (remote) {
77
- if ((await remote.read(path))?.revision !== revision)
78
- throw new TransportConflict(path);
79
- return;
80
- }
81
- invariant(remote || (await realpath(directory)) === directory, "Resource activity directory changed");
82
- invariant(!removed, "Resource activity is closed");
83
- const current = (await readInspectionFile(path, defaults.maxRecordBytes)).toString("utf8");
84
- invariant(current === JSON.stringify(record), "Resource activity identity changed; refusing mutation");
43
+ if ((await transporter.read(path))?.revision !== revision)
44
+ throw new TransportConflict(path);
85
45
  }
86
46
  function update(next) {
87
47
  return serialize(async () => {
@@ -89,25 +49,11 @@ export async function registerResourceActivity(options) {
89
49
  const value = { ...next(), updatedAt: new Date().toISOString() };
90
50
  const data = JSON.stringify(value);
91
51
  invariant(Buffer.byteLength(data) <= defaults.maxRecordBytes, "Resource activity record exceeds its size limit");
92
- if (remote) {
93
- invariant(revision, "Resource revision unavailable");
94
- revision = (await remote.write(path, jsonBytes(value), { ifRevision: revision })).revision;
95
- record = value;
96
- return;
97
- }
98
- const temporary = `${path}.${randomUUID()}.tmp`;
99
- const file = await open(temporary, "wx", 0o600);
100
- try {
101
- await file.writeFile(data);
102
- await file.sync();
103
- await file.close();
104
- await rename(temporary, path);
105
- record = value;
106
- }
107
- finally {
108
- await file.close();
109
- await rm(temporary, { force: true });
110
- }
52
+ invariant(revision, "Resource revision unavailable");
53
+ revision = (await transporter.write(path, jsonBytes(value), {
54
+ ifRevision: revision,
55
+ })).revision;
56
+ record = value;
111
57
  });
112
58
  }
113
59
  return {
@@ -171,22 +117,13 @@ export async function registerResourceActivity(options) {
171
117
  if (removed)
172
118
  return;
173
119
  invariant(record.operations.length === 0, "Resource operations remain unsettled; activity record retained");
174
- try {
175
- await verify();
176
- if (remote) {
177
- invariant(revision, "Resource revision unavailable");
178
- await remote.remove(path, { ifRevision: revision });
179
- }
180
- else
181
- await rm(path);
182
- }
183
- catch (cause) {
184
- if (!(cause &&
185
- typeof cause === "object" &&
186
- "code" in cause &&
187
- cause.code === "ENOENT"))
188
- throw cause;
120
+ if (!(await transporter.read(path))) {
121
+ removed = true;
122
+ return;
189
123
  }
124
+ await verify();
125
+ invariant(revision, "Resource revision unavailable");
126
+ await transporter.remove(path, { ifRevision: revision });
190
127
  removed = true;
191
128
  }),
192
129
  };
@@ -1 +1 @@
1
- {"version":3,"file":"resource-activity.js","sourceRoot":"","sources":["../../src/infrastructure/resource-activity.ts"],"names":[],"mappings":"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","sourcesContent":["import { TransportConflict } from \"../domain/transport.ts\";\nimport { jsonBytes } from \"./transport-json.ts\";\nimport { randomUUID } from \"node:crypto\";\nimport { mkdir, open, realpath, rename, rm, opendir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { invariant } from \"../domain/errors.ts\";\nimport { localProcessIdentity } from \"./git/process-identity.ts\";\nimport { readInspectionFile } from \"./inspection-file.ts\";\nimport { lockStorageMutation } from \"./storage-mutation-lock.ts\";\nimport { resourceActivityDefaults as defaults } from \"./resource-activity.constants.ts\";\nimport type {\n ResourceActivity,\n ResourceActivityOptions,\n ResourceActivityRecord,\n ResourceOperationResult,\n} from \"./resource-activity.types.ts\";\n\nasync function activityDirectory(repository: string): Promise<string> {\n let path = repository;\n for (const part of [\".outpost\", \"locks\", defaults.directory]) {\n path = join(path, part);\n await mkdir(path, { recursive: true, mode: 0o700 });\n invariant(\n (await realpath(path)) === path,\n \"Resource activity directory must not use symlinks\",\n );\n }\n return path;\n}\n\nexport async function registerResourceActivity(\n options: ResourceActivityOptions,\n): Promise<ResourceActivity> {\n for (const text of [options.workspace, options.provider])\n invariant(\n text.length > 0 && text.length <= defaults.maxText,\n \"Resource activity metadata exceeds its size limit\",\n );\n const remote = options.transporter;\n const directory = remote ? \"\" : await activityDirectory(options.repository);\n let revision: string | undefined;\n const id = randomUUID();\n const path = remote ? `resources/${id}.json` : join(directory, `${id}.json`);\n const createdAt = new Date().toISOString();\n const identity = await localProcessIdentity();\n let record: ResourceActivityRecord = {\n version: 1,\n id,\n pid: process.pid,\n ...(identity ? { identity } : {}),\n provider: options.provider,\n placement: options.placement,\n workspace: options.workspace,\n createdAt,\n updatedAt: createdAt,\n phase: \"allocating\",\n operations: [],\n };\n const unlock = remote\n ? async () => {}\n : await lockStorageMutation(options.repository);\n try {\n if (remote) {\n revision = (\n await remote.write(path, jsonBytes(record), { ifRevision: null })\n ).revision;\n }\n if (!remote) {\n let count = 0;\n for await (const _entry of await opendir(directory))\n invariant(\n ++count < defaults.maxRecords,\n \"Too many resource activity records; inspect retained ownership before continuing\",\n );\n const file = await open(path, \"wx\", 0o600);\n try {\n await file.writeFile(JSON.stringify(record));\n await file.sync();\n } finally {\n await file.close();\n }\n }\n } finally {\n await unlock();\n }\n let pending = Promise.resolve();\n let removed = false;\n function serialize(action: () => Promise<void>): Promise<void> {\n const next = pending.then(action);\n pending = next.catch(() => undefined);\n return next;\n }\n async function verify(): Promise<void> {\n invariant(!removed, \"Resource activity is closed\");\n if (remote) {\n if ((await remote.read(path))?.revision !== revision)\n throw new TransportConflict(path);\n return;\n }\n invariant(\n remote || (await realpath(directory)) === directory,\n \"Resource activity directory changed\",\n );\n invariant(!removed, \"Resource activity is closed\");\n const current = (\n await readInspectionFile(path, defaults.maxRecordBytes)\n ).toString(\"utf8\");\n invariant(\n current === JSON.stringify(record),\n \"Resource activity identity changed; refusing mutation\",\n );\n }\n function update(next: () => ResourceActivityRecord): Promise<void> {\n return serialize(async () => {\n await verify();\n const value = { ...next(), updatedAt: new Date().toISOString() };\n const data = JSON.stringify(value);\n invariant(\n Buffer.byteLength(data) <= defaults.maxRecordBytes,\n \"Resource activity record exceeds its size limit\",\n );\n if (remote) {\n invariant(revision, \"Resource revision unavailable\");\n revision = (\n await remote.write(path, jsonBytes(value), { ifRevision: revision })\n ).revision;\n record = value;\n return;\n }\n const temporary = `${path}.${randomUUID()}.tmp`;\n const file = await open(temporary, \"wx\", 0o600);\n try {\n await file.writeFile(data);\n await file.sync();\n await file.close();\n await rename(temporary, path);\n record = value;\n } finally {\n await file.close();\n await rm(temporary, { force: true });\n }\n });\n }\n return {\n async idle() {\n await pending;\n return record.operations.length === 0;\n },\n phase: (phase) => update(() => ({ ...record, phase })),\n async run(kind, action) {\n const operation = {\n id: randomUUID(),\n kind,\n startedAt: new Date().toISOString(),\n };\n await update(() => {\n const active = record.operations.find((value) => value.kind === kind);\n const operations = record.operations.filter(\n (value) => value.kind !== kind,\n );\n operations.push({\n kind,\n startedAt: active?.startedAt ?? operation.startedAt,\n count: (active?.count ?? 0) + 1,\n });\n return { ...record, operations };\n });\n let outcome: ResourceOperationResult[\"outcome\"] = \"completed\";\n try {\n return await action();\n } catch (cause) {\n outcome = \"failed\";\n throw cause;\n } finally {\n const result = {\n ...operation,\n outcome,\n count: 1,\n finishedAt: new Date().toISOString(),\n };\n try {\n await update(() => ({\n ...record,\n operations: record.operations.flatMap((value) => {\n if (value.kind !== kind) return [value];\n if (value.count === 1) return [];\n return [{ ...value, count: value.count - 1 }];\n }),\n lastOperation: result,\n ...(outcome === \"failed\" ? { lastFailure: result } : {}),\n }));\n } catch (cause) {\n if (outcome !== \"failed\") throw cause;\n }\n }\n },\n remove: () =>\n serialize(async () => {\n if (removed) return;\n invariant(\n record.operations.length === 0,\n \"Resource operations remain unsettled; activity record retained\",\n );\n try {\n await verify();\n if (remote) {\n invariant(revision, \"Resource revision unavailable\");\n await remote.remove(path, { ifRevision: revision });\n } else await rm(path);\n } catch (cause) {\n if (!(\n cause &&\n typeof cause === \"object\" &&\n \"code\" in cause &&\n cause.code === \"ENOENT\"\n ))\n throw cause;\n }\n removed = true;\n }),\n };\n}\n"]}
1
+ {"version":3,"file":"resource-activity.js","sourceRoot":"","sources":["../../src/infrastructure/resource-activity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,wBAAwB,IAAI,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAQxF,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAAgC;IAEhC,KAAK,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,eAAe,CAAC;QAC7D,SAAS,CACP,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,OAAO,EAClD,mDAAmD,CACpD,CAAC;IACJ,MAAM,WAAW,GACf,OAAO,CAAC,WAAW,IAAI,mBAAmB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACjE,IAAI,QAA4B,CAAC;IACjC,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IACxB,MAAM,IAAI,GAAG,aAAa,EAAE,OAAO,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAC9C,IAAI,MAAM,GAA2B;QACnC,OAAO,EAAE,CAAC;QACV,EAAE;QACF,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjC,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS;QACT,SAAS,EAAE,SAAS;QACpB,KAAK,EAAE,YAAY;QACnB,UAAU,EAAE,EAAE;KACf,CAAC;IACF,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,EAAE,MAAM,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC;QACvD,SAAS,CACP,EAAE,KAAK,GAAG,QAAQ,CAAC,UAAU,EAC7B,kFAAkF,CACnF,CAAC;IACJ,QAAQ,GAAG,CACT,MAAM,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CACvE,CAAC,QAAQ,CAAC;IACX,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAChC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,SAAS,SAAS,CAAC,MAA2B;QAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,KAAK,UAAU,MAAM;QACnB,SAAS,CAAC,CAAC,OAAO,EAAE,6BAA6B,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,KAAK,QAAQ;YACvD,MAAM,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,SAAS,MAAM,CAAC,IAAkC;QAChD,OAAO,SAAS,CAAC,KAAK,IAAI,EAAE;YAC1B,MAAM,MAAM,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;YACjE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACnC,SAAS,CACP,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,cAAc,EAClD,iDAAiD,CAClD,CAAC;YACF,SAAS,CAAC,QAAQ,EAAE,+BAA+B,CAAC,CAAC;YACrD,QAAQ,GAAG,CACT,MAAM,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE;gBAC9C,UAAU,EAAE,QAAQ;aACrB,CAAC,CACH,CAAC,QAAQ,CAAC;YACX,MAAM,GAAG,KAAK,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO;QACL,KAAK,CAAC,IAAI;YACR,MAAM,OAAO,CAAC;YACd,OAAO,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC;QACxC,CAAC;QACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACtD,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM;YACpB,MAAM,SAAS,GAAG;gBAChB,EAAE,EAAE,UAAU,EAAE;gBAChB,IAAI;gBACJ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;YACF,MAAM,MAAM,CAAC,GAAG,EAAE;gBAChB,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;gBACtE,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CACzC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAC/B,CAAC;gBACF,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI;oBACJ,SAAS,EAAE,MAAM,EAAE,SAAS,IAAI,SAAS,CAAC,SAAS;oBACnD,KAAK,EAAE,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC;iBAChC,CAAC,CAAC;gBACH,OAAO,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,CAAC;YACnC,CAAC,CAAC,CAAC;YACH,IAAI,OAAO,GAAuC,WAAW,CAAC;YAC9D,IAAI,CAAC;gBACH,OAAO,MAAM,MAAM,EAAE,CAAC;YACxB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,GAAG,QAAQ,CAAC;gBACnB,MAAM,KAAK,CAAC;YACd,CAAC;oBAAS,CAAC;gBACT,MAAM,MAAM,GAAG;oBACb,GAAG,SAAS;oBACZ,OAAO;oBACP,KAAK,EAAE,CAAC;oBACR,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACrC,CAAC;gBACF,IAAI,CAAC;oBACH,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;wBAClB,GAAG,MAAM;wBACT,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;4BAC9C,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI;gCAAE,OAAO,CAAC,KAAK,CAAC,CAAC;4BACxC,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC;gCAAE,OAAO,EAAE,CAAC;4BACjC,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;wBAChD,CAAC,CAAC;wBACF,aAAa,EAAE,MAAM;wBACrB,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACzD,CAAC,CAAC,CAAC;gBACN,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,OAAO,KAAK,QAAQ;wBAAE,MAAM,KAAK,CAAC;gBACxC,CAAC;YACH,CAAC;QACH,CAAC;QACD,MAAM,EAAE,GAAG,EAAE,CACX,SAAS,CAAC,KAAK,IAAI,EAAE;YACnB,IAAI,OAAO;gBAAE,OAAO;YACpB,SAAS,CACP,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAC9B,gEAAgE,CACjE,CAAC;YACF,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;gBACpC,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO;YACT,CAAC;YACD,MAAM,MAAM,EAAE,CAAC;YACf,SAAS,CAAC,QAAQ,EAAE,+BAA+B,CAAC,CAAC;YACrD,MAAM,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;YACzD,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC,CAAC;KACL,CAAC;AACJ,CAAC","sourcesContent":["import { TransportConflict } from \"../domain/transport.ts\";\nimport { jsonBytes } from \"./transport-json.ts\";\nimport { randomUUID } from \"node:crypto\";\nimport { invariant } from \"../domain/errors.ts\";\nimport { localProcessIdentity } from \"./git/process-identity.ts\";\nimport { repositoryTransport } from \"./repository-transport.ts\";\nimport { resourceActivityDefaults as defaults } from \"./resource-activity.constants.ts\";\nimport type {\n ResourceActivity,\n ResourceActivityOptions,\n ResourceActivityRecord,\n ResourceOperationResult,\n} from \"./resource-activity.types.ts\";\n\nexport async function registerResourceActivity(\n options: ResourceActivityOptions,\n): Promise<ResourceActivity> {\n for (const text of [options.workspace, options.sandboxProvider])\n invariant(\n text.length > 0 && text.length <= defaults.maxText,\n \"Resource activity metadata exceeds its size limit\",\n );\n const transporter =\n options.transporter ?? repositoryTransport(options.repository);\n let revision: string | undefined;\n const id = randomUUID();\n const path = `resources/${id}.json`;\n const createdAt = new Date().toISOString();\n const identity = await localProcessIdentity();\n let record: ResourceActivityRecord = {\n version: 1,\n id,\n pid: process.pid,\n ...(identity ? { identity } : {}),\n sandboxProvider: options.sandboxProvider,\n placement: options.placement,\n workspace: options.workspace,\n createdAt,\n updatedAt: createdAt,\n phase: \"allocating\",\n operations: [],\n };\n let count = 0;\n for await (const _entry of transporter.list(\"resources/\"))\n invariant(\n ++count < defaults.maxRecords,\n \"Too many resource activity records; inspect retained ownership before continuing\",\n );\n revision = (\n await transporter.write(path, jsonBytes(record), { ifRevision: null })\n ).revision;\n let pending = Promise.resolve();\n let removed = false;\n function serialize(action: () => Promise<void>): Promise<void> {\n const next = pending.then(action);\n pending = next.catch(() => undefined);\n return next;\n }\n async function verify(): Promise<void> {\n invariant(!removed, \"Resource activity is closed\");\n if ((await transporter.read(path))?.revision !== revision)\n throw new TransportConflict(path);\n }\n\n function update(next: () => ResourceActivityRecord): Promise<void> {\n return serialize(async () => {\n await verify();\n const value = { ...next(), updatedAt: new Date().toISOString() };\n const data = JSON.stringify(value);\n invariant(\n Buffer.byteLength(data) <= defaults.maxRecordBytes,\n \"Resource activity record exceeds its size limit\",\n );\n invariant(revision, \"Resource revision unavailable\");\n revision = (\n await transporter.write(path, jsonBytes(value), {\n ifRevision: revision,\n })\n ).revision;\n record = value;\n });\n }\n return {\n async idle() {\n await pending;\n return record.operations.length === 0;\n },\n phase: (phase) => update(() => ({ ...record, phase })),\n async run(kind, action) {\n const operation = {\n id: randomUUID(),\n kind,\n startedAt: new Date().toISOString(),\n };\n await update(() => {\n const active = record.operations.find((value) => value.kind === kind);\n const operations = record.operations.filter(\n (value) => value.kind !== kind,\n );\n operations.push({\n kind,\n startedAt: active?.startedAt ?? operation.startedAt,\n count: (active?.count ?? 0) + 1,\n });\n return { ...record, operations };\n });\n let outcome: ResourceOperationResult[\"outcome\"] = \"completed\";\n try {\n return await action();\n } catch (cause) {\n outcome = \"failed\";\n throw cause;\n } finally {\n const result = {\n ...operation,\n outcome,\n count: 1,\n finishedAt: new Date().toISOString(),\n };\n try {\n await update(() => ({\n ...record,\n operations: record.operations.flatMap((value) => {\n if (value.kind !== kind) return [value];\n if (value.count === 1) return [];\n return [{ ...value, count: value.count - 1 }];\n }),\n lastOperation: result,\n ...(outcome === \"failed\" ? { lastFailure: result } : {}),\n }));\n } catch (cause) {\n if (outcome !== \"failed\") throw cause;\n }\n }\n },\n remove: () =>\n serialize(async () => {\n if (removed) return;\n invariant(\n record.operations.length === 0,\n \"Resource operations remain unsettled; activity record retained\",\n );\n if (!(await transporter.read(path))) {\n removed = true;\n return;\n }\n await verify();\n invariant(revision, \"Resource revision unavailable\");\n await transporter.remove(path, { ifRevision: revision });\n removed = true;\n }),\n };\n}\n"]}
@@ -19,7 +19,7 @@ export interface ResourceActivityRecord {
19
19
  readonly id: string;
20
20
  readonly pid: number;
21
21
  readonly identity?: LocalProcessIdentity;
22
- readonly provider: string;
22
+ readonly sandboxProvider: string;
23
23
  readonly placement: "mounted" | "remote" | "host";
24
24
  readonly workspace: string;
25
25
  readonly createdAt: string;
@@ -39,7 +39,7 @@ export interface ResourceActivityOptions {
39
39
  readonly transporter?: Transport;
40
40
  readonly repository: string;
41
41
  readonly workspace: string;
42
- readonly provider: string;
42
+ readonly sandboxProvider: string;
43
43
  readonly placement: ResourceActivityRecord["placement"];
44
44
  }
45
45
  export interface ResourceInspectionEntry {
@@ -1 +1 @@
1
- {"version":3,"file":"resource-activity.types.js","sourceRoot":"","sources":["../../src/infrastructure/resource-activity.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Transport } from \"../domain/transport.types.ts\";\nimport type {\n LocalProcessIdentity,\n LockOwnership,\n} from \"./git/process-identity.types.ts\";\nimport type { StorageIssue } from \"./storage-inventory.types.ts\";\nimport type {\n resourceOperationKinds,\n resourcePhases,\n} from \"./resource-activity.constants.ts\";\n\nexport type ResourcePhase = (typeof resourcePhases)[number];\nexport type ResourceOperationKind = (typeof resourceOperationKinds)[number];\nexport interface ResourceOperation {\n readonly count: number;\n readonly kind: ResourceOperationKind;\n readonly startedAt: string;\n}\nexport interface ResourceOperationResult extends ResourceOperation {\n readonly id: string;\n readonly finishedAt: string;\n readonly outcome: \"completed\" | \"failed\";\n}\nexport interface ResourceActivityRecord {\n readonly version: 1;\n readonly id: string;\n readonly pid: number;\n readonly identity?: LocalProcessIdentity;\n readonly provider: string;\n readonly placement: \"mounted\" | \"remote\" | \"host\";\n readonly workspace: string;\n readonly createdAt: string;\n readonly updatedAt: string;\n readonly phase: ResourcePhase;\n readonly operations: readonly ResourceOperation[];\n readonly lastOperation?: ResourceOperationResult;\n readonly lastFailure?: ResourceOperationResult;\n}\nexport interface ResourceActivity {\n idle(): Promise<boolean>;\n phase(phase: ResourcePhase): Promise<void>;\n run<T>(kind: ResourceOperationKind, action: () => Promise<T>): Promise<T>;\n remove(): Promise<void>;\n}\nexport interface ResourceActivityOptions {\n readonly transporter?: Transport;\n readonly repository: string;\n readonly workspace: string;\n readonly provider: string;\n readonly placement: ResourceActivityRecord[\"placement\"];\n}\nexport interface ResourceInspectionEntry {\n readonly path: string;\n readonly record?: ResourceActivityRecord;\n readonly ownership: LockOwnership;\n}\nexport interface ResourceInspection {\n readonly scope: \"recorded-sandboxes\";\n readonly complete: boolean;\n readonly entries: readonly ResourceInspectionEntry[];\n readonly issues: readonly StorageIssue[];\n}\n"]}
1
+ {"version":3,"file":"resource-activity.types.js","sourceRoot":"","sources":["../../src/infrastructure/resource-activity.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Transport } from \"../domain/transport.types.ts\";\nimport type {\n LocalProcessIdentity,\n LockOwnership,\n} from \"./git/process-identity.types.ts\";\nimport type { StorageIssue } from \"./storage-inventory.types.ts\";\nimport type {\n resourceOperationKinds,\n resourcePhases,\n} from \"./resource-activity.constants.ts\";\n\nexport type ResourcePhase = (typeof resourcePhases)[number];\nexport type ResourceOperationKind = (typeof resourceOperationKinds)[number];\nexport interface ResourceOperation {\n readonly count: number;\n readonly kind: ResourceOperationKind;\n readonly startedAt: string;\n}\nexport interface ResourceOperationResult extends ResourceOperation {\n readonly id: string;\n readonly finishedAt: string;\n readonly outcome: \"completed\" | \"failed\";\n}\nexport interface ResourceActivityRecord {\n readonly version: 1;\n readonly id: string;\n readonly pid: number;\n readonly identity?: LocalProcessIdentity;\n readonly sandboxProvider: string;\n readonly placement: \"mounted\" | \"remote\" | \"host\";\n readonly workspace: string;\n readonly createdAt: string;\n readonly updatedAt: string;\n readonly phase: ResourcePhase;\n readonly operations: readonly ResourceOperation[];\n readonly lastOperation?: ResourceOperationResult;\n readonly lastFailure?: ResourceOperationResult;\n}\nexport interface ResourceActivity {\n idle(): Promise<boolean>;\n phase(phase: ResourcePhase): Promise<void>;\n run<T>(kind: ResourceOperationKind, action: () => Promise<T>): Promise<T>;\n remove(): Promise<void>;\n}\nexport interface ResourceActivityOptions {\n readonly transporter?: Transport;\n readonly repository: string;\n readonly workspace: string;\n readonly sandboxProvider: string;\n readonly placement: ResourceActivityRecord[\"placement\"];\n}\nexport interface ResourceInspectionEntry {\n readonly path: string;\n readonly record?: ResourceActivityRecord;\n readonly ownership: LockOwnership;\n}\nexport interface ResourceInspection {\n readonly scope: \"recorded-sandboxes\";\n readonly complete: boolean;\n readonly entries: readonly ResourceInspectionEntry[];\n readonly issues: readonly StorageIssue[];\n}\n"]}
@@ -1,3 +1,3 @@
1
1
  import type { Variables } from "../domain/command.types.ts";
2
2
  export declare function parseEnvironment(text: string): Record<string, string>;
3
- export declare function resolveVariables(repository: string, agent?: Variables, provider?: Variables, environment?: NodeJS.ProcessEnv): Promise<Variables>;
3
+ export declare function resolveVariables(repository: string, agent?: Variables, sandboxProvider?: Variables, environment?: NodeJS.ProcessEnv): Promise<Variables>;
@@ -21,8 +21,8 @@ export function parseEnvironment(text) {
21
21
  }
22
22
  return result;
23
23
  }
24
- export async function resolveVariables(repository, agent = {}, provider = {}, environment = process.env) {
25
- const overlap = Object.keys(agent).filter((key) => Object.hasOwn(provider, key));
24
+ export async function resolveVariables(repository, agent = {}, sandboxProvider = {}, environment = process.env) {
25
+ const overlap = Object.keys(agent).filter((key) => Object.hasOwn(sandboxProvider, key));
26
26
  if (overlap.length)
27
27
  throw new OutpostError("configuration", `Agent and sandbox variables overlap: ${overlap.join(", ")}`, { overlap });
28
28
  const optional = async (path) => readFile(path, "utf8").catch((error) => {
@@ -36,6 +36,6 @@ export async function resolveVariables(repository, agent = {}, provider = {}, en
36
36
  for (const key of Object.keys(variables))
37
37
  if (!variables[key] && environment[key] !== undefined)
38
38
  variables[key] = environment[key];
39
- return Object.freeze({ ...variables, ...provider, ...agent });
39
+ return Object.freeze({ ...variables, ...sandboxProvider, ...agent });
40
40
  }
41
41
  //# sourceMappingURL=settings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/infrastructure/settings.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Variables } from \"../domain/command.types.ts\";\nimport { OutpostError } from \"../domain/errors.ts\";\n\nexport function parseEnvironment(text: string): Record<string, string> {\n const result: Record<string, string> = {};\n for (const line of text.split(/\\r?\\n/)) {\n const match = line.match(\n /^\\s*(?:export\\s+)?([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*(.*?)\\s*$/,\n );\n if (!match) continue;\n let value = match[2]!;\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n const double = value.startsWith('\"');\n value = value.slice(1, -1);\n if (double)\n value = value.replace(\n /\\\\([nrt\"\\\\])/g,\n (_, character: string) =>\n ({ n: \"\\n\", r: \"\\r\", t: \"\\t\", '\"': '\"', \"\\\\\": \"\\\\\" })[character]!,\n );\n } else value = value.replace(/\\s+#.*$/, \"\").trim();\n result[match[1]!] = value;\n }\n return result;\n}\n\nexport async function resolveVariables(\n repository: string,\n agent: Variables = {},\n provider: Variables = {},\n environment: NodeJS.ProcessEnv = process.env,\n): Promise<Variables> {\n const overlap = Object.keys(agent).filter((key) =>\n Object.hasOwn(provider, key),\n );\n if (overlap.length)\n throw new OutpostError(\n \"configuration\",\n `Agent and sandbox variables overlap: ${overlap.join(\", \")}`,\n { overlap },\n );\n const optional = async (path: string) =>\n readFile(path, \"utf8\").catch((error) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return \"\";\n throw error;\n });\n const variables = {\n ...parseEnvironment(await optional(join(repository, \".outpost\", \".env\"))),\n };\n for (const key of Object.keys(variables))\n if (!variables[key] && environment[key] !== undefined)\n variables[key] = environment[key]!;\n return Object.freeze({ ...variables, ...provider, ...agent });\n}\n"]}
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/infrastructure/settings.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Variables } from \"../domain/command.types.ts\";\nimport { OutpostError } from \"../domain/errors.ts\";\n\nexport function parseEnvironment(text: string): Record<string, string> {\n const result: Record<string, string> = {};\n for (const line of text.split(/\\r?\\n/)) {\n const match = line.match(\n /^\\s*(?:export\\s+)?([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*(.*?)\\s*$/,\n );\n if (!match) continue;\n let value = match[2]!;\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n const double = value.startsWith('\"');\n value = value.slice(1, -1);\n if (double)\n value = value.replace(\n /\\\\([nrt\"\\\\])/g,\n (_, character: string) =>\n ({ n: \"\\n\", r: \"\\r\", t: \"\\t\", '\"': '\"', \"\\\\\": \"\\\\\" })[character]!,\n );\n } else value = value.replace(/\\s+#.*$/, \"\").trim();\n result[match[1]!] = value;\n }\n return result;\n}\n\nexport async function resolveVariables(\n repository: string,\n agent: Variables = {},\n sandboxProvider: Variables = {},\n environment: NodeJS.ProcessEnv = process.env,\n): Promise<Variables> {\n const overlap = Object.keys(agent).filter((key) =>\n Object.hasOwn(sandboxProvider, key),\n );\n if (overlap.length)\n throw new OutpostError(\n \"configuration\",\n `Agent and sandbox variables overlap: ${overlap.join(\", \")}`,\n { overlap },\n );\n const optional = async (path: string) =>\n readFile(path, \"utf8\").catch((error) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return \"\";\n throw error;\n });\n const variables = {\n ...parseEnvironment(await optional(join(repository, \".outpost\", \".env\"))),\n };\n for (const key of Object.keys(variables))\n if (!variables[key] && environment[key] !== undefined)\n variables[key] = environment[key]!;\n return Object.freeze({ ...variables, ...sandboxProvider, ...agent });\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import type { ServerSentEvent } from "./sse.types.ts";
2
+ export declare function serverSentEvents(body: ReadableStream<Uint8Array>, maxBytes: number, onChunk?: () => void): AsyncGenerator<ServerSentEvent>;