apex-code 0.0.1-alpha.0 → 0.0.1-alpha.10

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 (739) hide show
  1. package/CHANGELOG.md +471 -0
  2. package/README.md +74 -680
  3. package/dist/cli/args.d.ts +21 -1
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +119 -15
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/cli/auth-command.d.ts.map +1 -1
  8. package/dist/cli/auth-command.js +3 -3
  9. package/dist/cli/auth-command.js.map +1 -1
  10. package/dist/cli/concurrent-session.d.ts +3 -0
  11. package/dist/cli/concurrent-session.d.ts.map +1 -0
  12. package/dist/cli/concurrent-session.js +13 -0
  13. package/dist/cli/concurrent-session.js.map +1 -0
  14. package/dist/cli/cost-command.d.ts +19 -0
  15. package/dist/cli/cost-command.d.ts.map +1 -0
  16. package/dist/cli/cost-command.js +107 -0
  17. package/dist/cli/cost-command.js.map +1 -0
  18. package/dist/cli/file-processor.d.ts.map +1 -1
  19. package/dist/cli/file-processor.js +2 -1
  20. package/dist/cli/file-processor.js.map +1 -1
  21. package/dist/cli/startup-ui.d.ts +1 -1
  22. package/dist/cli/startup-ui.d.ts.map +1 -1
  23. package/dist/cli/startup-ui.js +1 -2
  24. package/dist/cli/startup-ui.js.map +1 -1
  25. package/dist/cli.d.ts.map +1 -1
  26. package/dist/cli.js +99 -16
  27. package/dist/cli.js.map +1 -1
  28. package/dist/config.d.ts +5 -4
  29. package/dist/config.d.ts.map +1 -1
  30. package/dist/config.js +35 -20
  31. package/dist/config.js.map +1 -1
  32. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  33. package/dist/core/agent-session-runtime.js +2 -0
  34. package/dist/core/agent-session-runtime.js.map +1 -1
  35. package/dist/core/agent-session-services.d.ts +28 -0
  36. package/dist/core/agent-session-services.d.ts.map +1 -1
  37. package/dist/core/agent-session-services.js +140 -4
  38. package/dist/core/agent-session-services.js.map +1 -1
  39. package/dist/core/agent-session.d.ts +121 -9
  40. package/dist/core/agent-session.d.ts.map +1 -1
  41. package/dist/core/agent-session.js +364 -123
  42. package/dist/core/agent-session.js.map +1 -1
  43. package/dist/core/auth-storage.d.ts +4 -1
  44. package/dist/core/auth-storage.d.ts.map +1 -1
  45. package/dist/core/auth-storage.js +17 -14
  46. package/dist/core/auth-storage.js.map +1 -1
  47. package/dist/core/bash-executor.d.ts.map +1 -1
  48. package/dist/core/bash-executor.js +11 -10
  49. package/dist/core/bash-executor.js.map +1 -1
  50. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  51. package/dist/core/compaction/branch-summarization.js +3 -0
  52. package/dist/core/compaction/branch-summarization.js.map +1 -1
  53. package/dist/core/compaction/compaction.d.ts +4 -3
  54. package/dist/core/compaction/compaction.d.ts.map +1 -1
  55. package/dist/core/compaction/compaction.js +41 -32
  56. package/dist/core/compaction/compaction.js.map +1 -1
  57. package/dist/core/context/deferred-schemas.d.ts +92 -0
  58. package/dist/core/context/deferred-schemas.d.ts.map +1 -0
  59. package/dist/core/context/deferred-schemas.js +74 -0
  60. package/dist/core/context/deferred-schemas.js.map +1 -0
  61. package/dist/core/context/eviction.d.ts +47 -0
  62. package/dist/core/context/eviction.d.ts.map +1 -0
  63. package/dist/core/context/eviction.js +83 -0
  64. package/dist/core/context/eviction.js.map +1 -0
  65. package/dist/core/context/pipeline.d.ts +90 -0
  66. package/dist/core/context/pipeline.d.ts.map +1 -0
  67. package/dist/core/context/pipeline.js +109 -0
  68. package/dist/core/context/pipeline.js.map +1 -0
  69. package/dist/core/credential-failover.d.ts +30 -0
  70. package/dist/core/credential-failover.d.ts.map +1 -0
  71. package/dist/core/credential-failover.js +46 -0
  72. package/dist/core/credential-failover.js.map +1 -0
  73. package/dist/core/credential-pool.d.ts +60 -0
  74. package/dist/core/credential-pool.d.ts.map +1 -0
  75. package/dist/core/credential-pool.js +84 -0
  76. package/dist/core/credential-pool.js.map +1 -0
  77. package/dist/core/defaults.d.ts +1 -0
  78. package/dist/core/defaults.d.ts.map +1 -1
  79. package/dist/core/defaults.js +9 -0
  80. package/dist/core/defaults.js.map +1 -1
  81. package/dist/core/delegation/agents.d.ts +15 -0
  82. package/dist/core/delegation/agents.d.ts.map +1 -0
  83. package/dist/core/delegation/agents.js +55 -0
  84. package/dist/core/delegation/agents.js.map +1 -0
  85. package/dist/core/delegation/ceiling.d.ts +29 -0
  86. package/dist/core/delegation/ceiling.d.ts.map +1 -0
  87. package/dist/core/delegation/ceiling.js +34 -0
  88. package/dist/core/delegation/ceiling.js.map +1 -0
  89. package/dist/core/delegation/runtime.d.ts +94 -0
  90. package/dist/core/delegation/runtime.d.ts.map +1 -0
  91. package/dist/core/delegation/runtime.js +117 -0
  92. package/dist/core/delegation/runtime.js.map +1 -0
  93. package/dist/core/durable-state/daemon.d.ts +37 -0
  94. package/dist/core/durable-state/daemon.d.ts.map +1 -0
  95. package/dist/core/durable-state/daemon.js +62 -0
  96. package/dist/core/durable-state/daemon.js.map +1 -0
  97. package/dist/core/durable-state/provenance.d.ts +7 -0
  98. package/dist/core/durable-state/provenance.d.ts.map +1 -0
  99. package/dist/core/durable-state/provenance.js +24 -0
  100. package/dist/core/durable-state/provenance.js.map +1 -0
  101. package/dist/core/durable-state/sqlite.d.ts +84 -0
  102. package/dist/core/durable-state/sqlite.d.ts.map +1 -0
  103. package/dist/core/durable-state/sqlite.js +355 -0
  104. package/dist/core/durable-state/sqlite.js.map +1 -0
  105. package/dist/core/environment.d.ts +12 -0
  106. package/dist/core/environment.d.ts.map +1 -0
  107. package/dist/core/environment.js +69 -0
  108. package/dist/core/environment.js.map +1 -0
  109. package/dist/core/evidence-policy.d.ts +17 -0
  110. package/dist/core/evidence-policy.d.ts.map +1 -0
  111. package/dist/core/evidence-policy.js +25 -0
  112. package/dist/core/evidence-policy.js.map +1 -0
  113. package/dist/core/evidence.d.ts +16 -0
  114. package/dist/core/evidence.d.ts.map +1 -0
  115. package/dist/core/evidence.js +51 -0
  116. package/dist/core/evidence.js.map +1 -0
  117. package/dist/core/experimental.d.ts +4 -0
  118. package/dist/core/experimental.d.ts.map +1 -1
  119. package/dist/core/experimental.js +6 -1
  120. package/dist/core/experimental.js.map +1 -1
  121. package/dist/core/extensions/index.d.ts +2 -2
  122. package/dist/core/extensions/index.d.ts.map +1 -1
  123. package/dist/core/extensions/index.js +1 -1
  124. package/dist/core/extensions/index.js.map +1 -1
  125. package/dist/core/extensions/loader.d.ts.map +1 -1
  126. package/dist/core/extensions/loader.js +115 -48
  127. package/dist/core/extensions/loader.js.map +1 -1
  128. package/dist/core/extensions/types.d.ts +44 -9
  129. package/dist/core/extensions/types.d.ts.map +1 -1
  130. package/dist/core/extensions/types.js +3 -0
  131. package/dist/core/extensions/types.js.map +1 -1
  132. package/dist/core/footer-data-provider.d.ts +1 -1
  133. package/dist/core/footer-data-provider.d.ts.map +1 -1
  134. package/dist/core/footer-data-provider.js +1 -1
  135. package/dist/core/footer-data-provider.js.map +1 -1
  136. package/dist/core/http-dispatcher.d.ts +1 -2
  137. package/dist/core/http-dispatcher.d.ts.map +1 -1
  138. package/dist/core/http-dispatcher.js +2 -17
  139. package/dist/core/http-dispatcher.js.map +1 -1
  140. package/dist/core/http-idle-timeout.d.ts +12 -0
  141. package/dist/core/http-idle-timeout.d.ts.map +1 -0
  142. package/dist/core/http-idle-timeout.js +27 -0
  143. package/dist/core/http-idle-timeout.js.map +1 -0
  144. package/dist/core/index.d.ts +1 -0
  145. package/dist/core/index.d.ts.map +1 -1
  146. package/dist/core/index.js +1 -0
  147. package/dist/core/index.js.map +1 -1
  148. package/dist/core/keybindings.d.ts +38 -13
  149. package/dist/core/keybindings.d.ts.map +1 -1
  150. package/dist/core/keybindings.js +26 -5
  151. package/dist/core/keybindings.js.map +1 -1
  152. package/dist/core/lsp/client.d.ts +78 -0
  153. package/dist/core/lsp/client.d.ts.map +1 -0
  154. package/dist/core/lsp/client.js +494 -0
  155. package/dist/core/lsp/client.js.map +1 -0
  156. package/dist/core/lsp/diagnostics.d.ts +47 -0
  157. package/dist/core/lsp/diagnostics.d.ts.map +1 -0
  158. package/dist/core/lsp/diagnostics.js +224 -0
  159. package/dist/core/lsp/diagnostics.js.map +1 -0
  160. package/dist/core/lsp/pool.d.ts +48 -0
  161. package/dist/core/lsp/pool.d.ts.map +1 -0
  162. package/dist/core/lsp/pool.js +150 -0
  163. package/dist/core/lsp/pool.js.map +1 -0
  164. package/dist/core/lsp/registry.d.ts +49 -0
  165. package/dist/core/lsp/registry.d.ts.map +1 -0
  166. package/dist/core/lsp/registry.js +215 -0
  167. package/dist/core/lsp/registry.js.map +1 -0
  168. package/dist/core/lsp/status.d.ts +23 -0
  169. package/dist/core/lsp/status.d.ts.map +1 -0
  170. package/dist/core/lsp/status.js +35 -0
  171. package/dist/core/lsp/status.js.map +1 -0
  172. package/dist/core/lsp/sync.d.ts +13 -0
  173. package/dist/core/lsp/sync.d.ts.map +1 -0
  174. package/dist/core/lsp/sync.js +71 -0
  175. package/dist/core/lsp/sync.js.map +1 -0
  176. package/dist/core/model-config.d.ts +18 -0
  177. package/dist/core/model-config.d.ts.map +1 -1
  178. package/dist/core/model-config.js +25 -6
  179. package/dist/core/model-config.js.map +1 -1
  180. package/dist/core/model-resolver.d.ts +21 -0
  181. package/dist/core/model-resolver.d.ts.map +1 -1
  182. package/dist/core/model-resolver.js +73 -8
  183. package/dist/core/model-resolver.js.map +1 -1
  184. package/dist/core/model-runtime.d.ts +73 -0
  185. package/dist/core/model-runtime.d.ts.map +1 -1
  186. package/dist/core/model-runtime.js +225 -8
  187. package/dist/core/model-runtime.js.map +1 -1
  188. package/dist/core/models-store.d.ts.map +1 -1
  189. package/dist/core/models-store.js +2 -1
  190. package/dist/core/models-store.js.map +1 -1
  191. package/dist/core/observability/aggregate.d.ts +21 -0
  192. package/dist/core/observability/aggregate.d.ts.map +1 -0
  193. package/dist/core/observability/aggregate.js +36 -0
  194. package/dist/core/observability/aggregate.js.map +1 -0
  195. package/dist/core/observability/otlp.d.ts +66 -0
  196. package/dist/core/observability/otlp.d.ts.map +1 -0
  197. package/dist/core/observability/otlp.js +95 -0
  198. package/dist/core/observability/otlp.js.map +1 -0
  199. package/dist/core/package-manager.d.ts.map +1 -1
  200. package/dist/core/package-manager.js +40 -16
  201. package/dist/core/package-manager.js.map +1 -1
  202. package/dist/core/permissions/gate.d.ts +42 -0
  203. package/dist/core/permissions/gate.d.ts.map +1 -0
  204. package/dist/core/permissions/gate.js +72 -0
  205. package/dist/core/permissions/gate.js.map +1 -0
  206. package/dist/core/permissions/modes.d.ts +18 -0
  207. package/dist/core/permissions/modes.d.ts.map +1 -0
  208. package/dist/core/permissions/modes.js +57 -0
  209. package/dist/core/permissions/modes.js.map +1 -0
  210. package/dist/core/permissions/responder.d.ts +30 -0
  211. package/dist/core/permissions/responder.d.ts.map +1 -0
  212. package/dist/core/permissions/responder.js +32 -0
  213. package/dist/core/permissions/responder.js.map +1 -0
  214. package/dist/core/permissions/rules.d.ts +34 -0
  215. package/dist/core/permissions/rules.d.ts.map +1 -0
  216. package/dist/core/permissions/rules.js +74 -0
  217. package/dist/core/permissions/rules.js.map +1 -0
  218. package/dist/core/permissions/startup.d.ts +45 -0
  219. package/dist/core/permissions/startup.d.ts.map +1 -0
  220. package/dist/core/permissions/startup.js +63 -0
  221. package/dist/core/permissions/startup.js.map +1 -0
  222. package/dist/core/permissions/store.d.ts +114 -0
  223. package/dist/core/permissions/store.d.ts.map +1 -0
  224. package/dist/core/permissions/store.js +229 -0
  225. package/dist/core/permissions/store.js.map +1 -0
  226. package/dist/core/pi-manifest.d.ts.map +1 -1
  227. package/dist/core/pi-manifest.js +2 -1
  228. package/dist/core/pi-manifest.js.map +1 -1
  229. package/dist/core/project-trust.d.ts.map +1 -1
  230. package/dist/core/project-trust.js +1 -1
  231. package/dist/core/project-trust.js.map +1 -1
  232. package/dist/core/provider-attribution.d.ts.map +1 -1
  233. package/dist/core/provider-attribution.js +6 -7
  234. package/dist/core/provider-attribution.js.map +1 -1
  235. package/dist/core/remote-catalog-provider.d.ts +2 -2
  236. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  237. package/dist/core/remote-catalog-provider.js +22 -17
  238. package/dist/core/remote-catalog-provider.js.map +1 -1
  239. package/dist/core/resource-loader.d.ts.map +1 -1
  240. package/dist/core/resource-loader.js +3 -2
  241. package/dist/core/resource-loader.js.map +1 -1
  242. package/dist/core/sandbox/bwrap-arguments.d.ts +52 -0
  243. package/dist/core/sandbox/bwrap-arguments.d.ts.map +1 -0
  244. package/dist/core/sandbox/bwrap-arguments.js +86 -0
  245. package/dist/core/sandbox/bwrap-arguments.js.map +1 -0
  246. package/dist/core/sandbox/child-entry.d.ts +2 -0
  247. package/dist/core/sandbox/child-entry.d.ts.map +1 -0
  248. package/dist/core/sandbox/child-entry.js +22 -0
  249. package/dist/core/sandbox/child-entry.js.map +1 -0
  250. package/dist/core/sandbox/cli-launch.d.ts +88 -0
  251. package/dist/core/sandbox/cli-launch.d.ts.map +1 -0
  252. package/dist/core/sandbox/cli-launch.js +272 -0
  253. package/dist/core/sandbox/cli-launch.js.map +1 -0
  254. package/dist/core/sandbox/cli-supervisor.d.ts +30 -0
  255. package/dist/core/sandbox/cli-supervisor.d.ts.map +1 -0
  256. package/dist/core/sandbox/cli-supervisor.js +123 -0
  257. package/dist/core/sandbox/cli-supervisor.js.map +1 -0
  258. package/dist/core/sandbox/default-hosts.d.ts +28 -0
  259. package/dist/core/sandbox/default-hosts.d.ts.map +1 -0
  260. package/dist/core/sandbox/default-hosts.js +69 -0
  261. package/dist/core/sandbox/default-hosts.js.map +1 -0
  262. package/dist/core/sandbox/full-access.d.ts +28 -0
  263. package/dist/core/sandbox/full-access.d.ts.map +1 -0
  264. package/dist/core/sandbox/full-access.js +63 -0
  265. package/dist/core/sandbox/full-access.js.map +1 -0
  266. package/dist/core/sandbox/git-identity.d.ts +57 -0
  267. package/dist/core/sandbox/git-identity.d.ts.map +1 -0
  268. package/dist/core/sandbox/git-identity.js +78 -0
  269. package/dist/core/sandbox/git-identity.js.map +1 -0
  270. package/dist/core/sandbox/host-approval.d.ts +42 -0
  271. package/dist/core/sandbox/host-approval.d.ts.map +1 -0
  272. package/dist/core/sandbox/host-approval.js +99 -0
  273. package/dist/core/sandbox/host-approval.js.map +1 -0
  274. package/dist/core/sandbox/linux-backend.d.ts +46 -0
  275. package/dist/core/sandbox/linux-backend.d.ts.map +1 -0
  276. package/dist/core/sandbox/linux-backend.js +304 -0
  277. package/dist/core/sandbox/linux-backend.js.map +1 -0
  278. package/dist/core/sandbox/macos-backend.d.ts +28 -0
  279. package/dist/core/sandbox/macos-backend.d.ts.map +1 -0
  280. package/dist/core/sandbox/macos-backend.js +313 -0
  281. package/dist/core/sandbox/macos-backend.js.map +1 -0
  282. package/dist/core/sandbox/network-proxy.d.ts +38 -0
  283. package/dist/core/sandbox/network-proxy.d.ts.map +1 -0
  284. package/dist/core/sandbox/network-proxy.js +153 -0
  285. package/dist/core/sandbox/network-proxy.js.map +1 -0
  286. package/dist/core/sandbox/network-refusal.d.ts +24 -0
  287. package/dist/core/sandbox/network-refusal.d.ts.map +1 -0
  288. package/dist/core/sandbox/network-refusal.js +72 -0
  289. package/dist/core/sandbox/network-refusal.js.map +1 -0
  290. package/dist/core/sandbox/policy.d.ts +40 -0
  291. package/dist/core/sandbox/policy.d.ts.map +1 -0
  292. package/dist/core/sandbox/policy.js +55 -0
  293. package/dist/core/sandbox/policy.js.map +1 -0
  294. package/dist/core/sandbox/profiles.d.ts +25 -0
  295. package/dist/core/sandbox/profiles.d.ts.map +1 -0
  296. package/dist/core/sandbox/profiles.js +23 -0
  297. package/dist/core/sandbox/profiles.js.map +1 -0
  298. package/dist/core/sandbox/rpc/command-client.d.ts +28 -0
  299. package/dist/core/sandbox/rpc/command-client.d.ts.map +1 -0
  300. package/dist/core/sandbox/rpc/command-client.js +86 -0
  301. package/dist/core/sandbox/rpc/command-client.js.map +1 -0
  302. package/dist/core/sandbox/rpc/command-proxy.d.ts +48 -0
  303. package/dist/core/sandbox/rpc/command-proxy.d.ts.map +1 -0
  304. package/dist/core/sandbox/rpc/command-proxy.js +120 -0
  305. package/dist/core/sandbox/rpc/command-proxy.js.map +1 -0
  306. package/dist/core/sandbox/rpc/credential-client.d.ts +20 -0
  307. package/dist/core/sandbox/rpc/credential-client.d.ts.map +1 -0
  308. package/dist/core/sandbox/rpc/credential-client.js +170 -0
  309. package/dist/core/sandbox/rpc/credential-client.js.map +1 -0
  310. package/dist/core/sandbox/rpc/credential-proxy.d.ts +44 -0
  311. package/dist/core/sandbox/rpc/credential-proxy.d.ts.map +1 -0
  312. package/dist/core/sandbox/rpc/credential-proxy.js +287 -0
  313. package/dist/core/sandbox/rpc/credential-proxy.js.map +1 -0
  314. package/dist/core/sandbox/rpc/framing.d.ts +35 -0
  315. package/dist/core/sandbox/rpc/framing.d.ts.map +1 -0
  316. package/dist/core/sandbox/rpc/framing.js +114 -0
  317. package/dist/core/sandbox/rpc/framing.js.map +1 -0
  318. package/dist/core/sandbox/rpc/git-credential-helper.d.ts +40 -0
  319. package/dist/core/sandbox/rpc/git-credential-helper.d.ts.map +1 -0
  320. package/dist/core/sandbox/rpc/git-credential-helper.js +152 -0
  321. package/dist/core/sandbox/rpc/git-credential-helper.js.map +1 -0
  322. package/dist/core/sandbox/rpc/git-credential-proxy.d.ts +48 -0
  323. package/dist/core/sandbox/rpc/git-credential-proxy.d.ts.map +1 -0
  324. package/dist/core/sandbox/rpc/git-credential-proxy.js +142 -0
  325. package/dist/core/sandbox/rpc/git-credential-proxy.js.map +1 -0
  326. package/dist/core/sandbox/supervisor-temp.d.ts +18 -0
  327. package/dist/core/sandbox/supervisor-temp.d.ts.map +1 -0
  328. package/dist/core/sandbox/supervisor-temp.js +21 -0
  329. package/dist/core/sandbox/supervisor-temp.js.map +1 -0
  330. package/dist/core/sandbox/supervisor.d.ts +51 -0
  331. package/dist/core/sandbox/supervisor.d.ts.map +1 -0
  332. package/dist/core/sandbox/supervisor.js +18 -0
  333. package/dist/core/sandbox/supervisor.js.map +1 -0
  334. package/dist/core/sandbox/terminal-handoff.d.ts +45 -0
  335. package/dist/core/sandbox/terminal-handoff.d.ts.map +1 -0
  336. package/dist/core/sandbox/terminal-handoff.js +176 -0
  337. package/dist/core/sandbox/terminal-handoff.js.map +1 -0
  338. package/dist/core/sandbox/terminal-size.d.ts +40 -0
  339. package/dist/core/sandbox/terminal-size.d.ts.map +1 -0
  340. package/dist/core/sandbox/terminal-size.js +105 -0
  341. package/dist/core/sandbox/terminal-size.js.map +1 -0
  342. package/dist/core/sandbox/violations.d.ts +23 -0
  343. package/dist/core/sandbox/violations.d.ts.map +1 -0
  344. package/dist/core/sandbox/violations.js +30 -0
  345. package/dist/core/sandbox/violations.js.map +1 -0
  346. package/dist/core/sdk.d.ts +32 -41
  347. package/dist/core/sdk.d.ts.map +1 -1
  348. package/dist/core/sdk.js +161 -6
  349. package/dist/core/sdk.js.map +1 -1
  350. package/dist/core/session-export.d.ts +4 -0
  351. package/dist/core/session-export.d.ts.map +1 -0
  352. package/dist/core/session-export.js +32 -0
  353. package/dist/core/session-export.js.map +1 -0
  354. package/dist/core/session-lease.d.ts +31 -0
  355. package/dist/core/session-lease.d.ts.map +1 -0
  356. package/dist/core/session-lease.js +138 -0
  357. package/dist/core/session-lease.js.map +1 -0
  358. package/dist/core/session-manager.d.ts +46 -2
  359. package/dist/core/session-manager.d.ts.map +1 -1
  360. package/dist/core/session-manager.js +62 -4
  361. package/dist/core/session-manager.js.map +1 -1
  362. package/dist/core/session-share.d.ts +31 -0
  363. package/dist/core/session-share.d.ts.map +1 -0
  364. package/dist/core/session-share.js +45 -0
  365. package/dist/core/session-share.js.map +1 -0
  366. package/dist/core/settings-diagnostics.d.ts +9 -0
  367. package/dist/core/settings-diagnostics.d.ts.map +1 -0
  368. package/dist/core/settings-diagnostics.js +21 -0
  369. package/dist/core/settings-diagnostics.js.map +1 -0
  370. package/dist/core/settings-manager.d.ts +92 -9
  371. package/dist/core/settings-manager.d.ts.map +1 -1
  372. package/dist/core/settings-manager.js +138 -36
  373. package/dist/core/settings-manager.js.map +1 -1
  374. package/dist/core/skills.d.ts +19 -7
  375. package/dist/core/skills.d.ts.map +1 -1
  376. package/dist/core/skills.js +128 -52
  377. package/dist/core/skills.js.map +1 -1
  378. package/dist/core/slash-commands.d.ts.map +1 -1
  379. package/dist/core/slash-commands.js +5 -2
  380. package/dist/core/slash-commands.js.map +1 -1
  381. package/dist/core/system-prompt.d.ts +2 -2
  382. package/dist/core/system-prompt.d.ts.map +1 -1
  383. package/dist/core/system-prompt.js +59 -68
  384. package/dist/core/system-prompt.js.map +1 -1
  385. package/dist/core/timings.d.ts +1 -1
  386. package/dist/core/timings.d.ts.map +1 -1
  387. package/dist/core/timings.js +3 -2
  388. package/dist/core/timings.js.map +1 -1
  389. package/dist/core/tools/ask-user.d.ts +25 -0
  390. package/dist/core/tools/ask-user.d.ts.map +1 -0
  391. package/dist/core/tools/ask-user.js +49 -0
  392. package/dist/core/tools/ask-user.js.map +1 -0
  393. package/dist/core/tools/bash-command-segments.d.ts +22 -0
  394. package/dist/core/tools/bash-command-segments.d.ts.map +1 -0
  395. package/dist/core/tools/bash-command-segments.js +128 -0
  396. package/dist/core/tools/bash-command-segments.js.map +1 -0
  397. package/dist/core/tools/bash.d.ts +40 -4
  398. package/dist/core/tools/bash.d.ts.map +1 -1
  399. package/dist/core/tools/bash.js +183 -32
  400. package/dist/core/tools/bash.js.map +1 -1
  401. package/dist/core/tools/contract.d.ts +183 -0
  402. package/dist/core/tools/contract.d.ts.map +1 -0
  403. package/dist/core/tools/contract.js +48 -0
  404. package/dist/core/tools/contract.js.map +1 -0
  405. package/dist/core/tools/delegate.d.ts +38 -0
  406. package/dist/core/tools/delegate.d.ts.map +1 -0
  407. package/dist/core/tools/delegate.js +90 -0
  408. package/dist/core/tools/delegate.js.map +1 -0
  409. package/dist/core/tools/diagnostics.d.ts +39 -0
  410. package/dist/core/tools/diagnostics.d.ts.map +1 -0
  411. package/dist/core/tools/diagnostics.js +62 -0
  412. package/dist/core/tools/diagnostics.js.map +1 -0
  413. package/dist/core/tools/edit-diff.d.ts +0 -5
  414. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  415. package/dist/core/tools/edit-diff.js +2 -5
  416. package/dist/core/tools/edit-diff.js.map +1 -1
  417. package/dist/core/tools/edit.d.ts +12 -2
  418. package/dist/core/tools/edit.d.ts.map +1 -1
  419. package/dist/core/tools/edit.js +61 -10
  420. package/dist/core/tools/edit.js.map +1 -1
  421. package/dist/core/tools/find.d.ts +2 -2
  422. package/dist/core/tools/find.d.ts.map +1 -1
  423. package/dist/core/tools/find.js +13 -1
  424. package/dist/core/tools/find.js.map +1 -1
  425. package/dist/core/tools/grep.d.ts +4 -2
  426. package/dist/core/tools/grep.d.ts.map +1 -1
  427. package/dist/core/tools/grep.js +47 -10
  428. package/dist/core/tools/grep.js.map +1 -1
  429. package/dist/core/tools/index.d.ts +51 -6
  430. package/dist/core/tools/index.d.ts.map +1 -1
  431. package/dist/core/tools/index.js +145 -2
  432. package/dist/core/tools/index.js.map +1 -1
  433. package/dist/core/tools/ls.d.ts +4 -2
  434. package/dist/core/tools/ls.d.ts.map +1 -1
  435. package/dist/core/tools/ls.js +17 -1
  436. package/dist/core/tools/ls.js.map +1 -1
  437. package/dist/core/tools/lsp.d.ts +62 -0
  438. package/dist/core/tools/lsp.d.ts.map +1 -0
  439. package/dist/core/tools/lsp.js +216 -0
  440. package/dist/core/tools/lsp.js.map +1 -0
  441. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  442. package/dist/core/tools/output-accumulator.js +1 -1
  443. package/dist/core/tools/output-accumulator.js.map +1 -1
  444. package/dist/core/tools/path-permission.d.ts +18 -0
  445. package/dist/core/tools/path-permission.d.ts.map +1 -0
  446. package/dist/core/tools/path-permission.js +28 -0
  447. package/dist/core/tools/path-permission.js.map +1 -0
  448. package/dist/core/tools/plan-present.d.ts +27 -0
  449. package/dist/core/tools/plan-present.d.ts.map +1 -0
  450. package/dist/core/tools/plan-present.js +55 -0
  451. package/dist/core/tools/plan-present.js.map +1 -0
  452. package/dist/core/tools/powershell.d.ts +16 -0
  453. package/dist/core/tools/powershell.d.ts.map +1 -0
  454. package/dist/core/tools/powershell.js +39 -0
  455. package/dist/core/tools/powershell.js.map +1 -0
  456. package/dist/core/tools/read.d.ts +2 -2
  457. package/dist/core/tools/read.d.ts.map +1 -1
  458. package/dist/core/tools/read.js +14 -0
  459. package/dist/core/tools/read.js.map +1 -1
  460. package/dist/core/tools/skill-search.d.ts +32 -0
  461. package/dist/core/tools/skill-search.d.ts.map +1 -0
  462. package/dist/core/tools/skill-search.js +56 -0
  463. package/dist/core/tools/skill-search.js.map +1 -0
  464. package/dist/core/tools/test.d.ts +34 -0
  465. package/dist/core/tools/test.d.ts.map +1 -0
  466. package/dist/core/tools/test.js +75 -0
  467. package/dist/core/tools/test.js.map +1 -0
  468. package/dist/core/tools/todo-write.d.ts +31 -0
  469. package/dist/core/tools/todo-write.d.ts.map +1 -0
  470. package/dist/core/tools/todo-write.js +51 -0
  471. package/dist/core/tools/todo-write.js.map +1 -0
  472. package/dist/core/tools/tool-definition-wrapper.d.ts +13 -2
  473. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  474. package/dist/core/tools/tool-definition-wrapper.js +11 -1
  475. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  476. package/dist/core/tools/tool-schema.d.ts +22 -0
  477. package/dist/core/tools/tool-schema.d.ts.map +1 -0
  478. package/dist/core/tools/tool-schema.js +45 -0
  479. package/dist/core/tools/tool-schema.js.map +1 -0
  480. package/dist/core/tools/web-fetch.d.ts +26 -0
  481. package/dist/core/tools/web-fetch.d.ts.map +1 -0
  482. package/dist/core/tools/web-fetch.js +62 -0
  483. package/dist/core/tools/web-fetch.js.map +1 -0
  484. package/dist/core/tools/web-search-exa.d.ts +33 -0
  485. package/dist/core/tools/web-search-exa.d.ts.map +1 -0
  486. package/dist/core/tools/web-search-exa.js +128 -0
  487. package/dist/core/tools/web-search-exa.js.map +1 -0
  488. package/dist/core/tools/web-search.d.ts +26 -0
  489. package/dist/core/tools/web-search.d.ts.map +1 -0
  490. package/dist/core/tools/web-search.js +53 -0
  491. package/dist/core/tools/web-search.js.map +1 -0
  492. package/dist/core/tools/write.d.ts +16 -2
  493. package/dist/core/tools/write.d.ts.map +1 -1
  494. package/dist/core/tools/write.js +48 -2
  495. package/dist/core/tools/write.js.map +1 -1
  496. package/dist/core/trust-manager.d.ts.map +1 -1
  497. package/dist/core/trust-manager.js +2 -1
  498. package/dist/core/trust-manager.js.map +1 -1
  499. package/dist/core/usage-performance-store.d.ts +56 -0
  500. package/dist/core/usage-performance-store.d.ts.map +1 -0
  501. package/dist/core/usage-performance-store.js +85 -0
  502. package/dist/core/usage-performance-store.js.map +1 -0
  503. package/dist/core/web-search-provider.d.ts +64 -0
  504. package/dist/core/web-search-provider.d.ts.map +1 -0
  505. package/dist/core/web-search-provider.js +149 -0
  506. package/dist/core/web-search-provider.js.map +1 -0
  507. package/dist/extensions/llama/index.d.ts.map +1 -1
  508. package/dist/extensions/llama/index.js +2 -0
  509. package/dist/extensions/llama/index.js.map +1 -1
  510. package/dist/extensions/llama/provider.d.ts.map +1 -1
  511. package/dist/extensions/llama/provider.js +6 -2
  512. package/dist/extensions/llama/provider.js.map +1 -1
  513. package/dist/index.d.ts +7 -6
  514. package/dist/index.d.ts.map +1 -1
  515. package/dist/index.js +5 -4
  516. package/dist/index.js.map +1 -1
  517. package/dist/main.d.ts +5 -0
  518. package/dist/main.d.ts.map +1 -1
  519. package/dist/main.js +87 -22
  520. package/dist/main.js.map +1 -1
  521. package/dist/migrations.d.ts.map +1 -1
  522. package/dist/migrations.js +6 -5
  523. package/dist/migrations.js.map +1 -1
  524. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  525. package/dist/modes/interactive/components/config-selector.js +9 -6
  526. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  527. package/dist/modes/interactive/components/custom-editor.d.ts +72 -1
  528. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  529. package/dist/modes/interactive/components/custom-editor.js +338 -1
  530. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  531. package/dist/modes/interactive/components/dynamic-border.d.ts +7 -1
  532. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  533. package/dist/modes/interactive/components/dynamic-border.js +11 -2
  534. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  535. package/dist/modes/interactive/components/extension-selector.d.ts +4 -0
  536. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  537. package/dist/modes/interactive/components/extension-selector.js +24 -6
  538. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  539. package/dist/modes/interactive/components/first-time-setup.d.ts +1 -4
  540. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
  541. package/dist/modes/interactive/components/first-time-setup.js +17 -41
  542. package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
  543. package/dist/modes/interactive/components/first-use-hints.d.ts +8 -0
  544. package/dist/modes/interactive/components/first-use-hints.d.ts.map +1 -0
  545. package/dist/modes/interactive/components/first-use-hints.js +22 -0
  546. package/dist/modes/interactive/components/first-use-hints.js.map +1 -0
  547. package/dist/modes/interactive/components/footer.d.ts +23 -1
  548. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  549. package/dist/modes/interactive/components/footer.js +182 -21
  550. package/dist/modes/interactive/components/footer.js.map +1 -1
  551. package/dist/modes/interactive/components/index.d.ts +2 -0
  552. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  553. package/dist/modes/interactive/components/index.js +2 -0
  554. package/dist/modes/interactive/components/index.js.map +1 -1
  555. package/dist/modes/interactive/components/model-selector.d.ts +31 -9
  556. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  557. package/dist/modes/interactive/components/model-selector.js +236 -96
  558. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  559. package/dist/modes/interactive/components/settings-selector.d.ts +25 -5
  560. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  561. package/dist/modes/interactive/components/settings-selector.js +226 -58
  562. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  563. package/dist/modes/interactive/components/settings-submenu.d.ts +72 -0
  564. package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -0
  565. package/dist/modes/interactive/components/settings-submenu.js +165 -0
  566. package/dist/modes/interactive/components/settings-submenu.js.map +1 -0
  567. package/dist/modes/interactive/components/splash-header.d.ts +66 -0
  568. package/dist/modes/interactive/components/splash-header.d.ts.map +1 -0
  569. package/dist/modes/interactive/components/splash-header.js +180 -0
  570. package/dist/modes/interactive/components/splash-header.js.map +1 -0
  571. package/dist/modes/interactive/components/thinking-selector.d.ts +15 -3
  572. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  573. package/dist/modes/interactive/components/thinking-selector.js +74 -17
  574. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  575. package/dist/modes/interactive/components/tool-execution.d.ts +16 -1
  576. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  577. package/dist/modes/interactive/components/tool-execution.js +113 -35
  578. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  579. package/dist/modes/interactive/components/tool-panel.d.ts +30 -0
  580. package/dist/modes/interactive/components/tool-panel.d.ts.map +1 -0
  581. package/dist/modes/interactive/components/tool-panel.js +130 -0
  582. package/dist/modes/interactive/components/tool-panel.js.map +1 -0
  583. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  584. package/dist/modes/interactive/external-editor.js +60 -10
  585. package/dist/modes/interactive/external-editor.js.map +1 -1
  586. package/dist/modes/interactive/interactive-mode.d.ts +61 -5
  587. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  588. package/dist/modes/interactive/interactive-mode.js +642 -203
  589. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  590. package/dist/modes/interactive/model-catalog-refresh.d.ts +7 -0
  591. package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -0
  592. package/dist/modes/interactive/model-catalog-refresh.js +34 -0
  593. package/dist/modes/interactive/model-catalog-refresh.js.map +1 -0
  594. package/dist/modes/interactive/theme/apex.json +93 -0
  595. package/dist/modes/interactive/theme/dark.json +2 -0
  596. package/dist/modes/interactive/theme/light.json +3 -1
  597. package/dist/modes/interactive/theme/theme-controller.d.ts +10 -2
  598. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  599. package/dist/modes/interactive/theme/theme-controller.js +25 -11
  600. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  601. package/dist/modes/interactive/theme/theme-schema.json +11 -3
  602. package/dist/modes/interactive/theme/theme.d.ts +14 -3
  603. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  604. package/dist/modes/interactive/theme/theme.js +65 -10
  605. package/dist/modes/interactive/theme/theme.js.map +1 -1
  606. package/dist/modes/json-event.d.ts +18 -12
  607. package/dist/modes/json-event.d.ts.map +1 -1
  608. package/dist/modes/json-event.js +22 -5
  609. package/dist/modes/json-event.js.map +1 -1
  610. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  611. package/dist/modes/rpc/rpc-mode.js +2 -1
  612. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  613. package/dist/package-manager-cli.d.ts +1 -0
  614. package/dist/package-manager-cli.d.ts.map +1 -1
  615. package/dist/package-manager-cli.js +211 -14
  616. package/dist/package-manager-cli.js.map +1 -1
  617. package/dist/rpc-entry.d.ts.map +1 -1
  618. package/dist/rpc-entry.js +2 -1
  619. package/dist/rpc-entry.js.map +1 -1
  620. package/dist/server/create-harness.d.ts +1 -1
  621. package/dist/server/create-harness.d.ts.map +1 -1
  622. package/dist/server/create-harness.js +8 -5
  623. package/dist/server/create-harness.js.map +1 -1
  624. package/dist/testing/replay/metrics.d.ts +24 -0
  625. package/dist/testing/replay/metrics.d.ts.map +1 -0
  626. package/dist/testing/replay/metrics.js +35 -0
  627. package/dist/testing/replay/metrics.js.map +1 -0
  628. package/dist/testing/replay/recorded-provider.d.ts +10 -0
  629. package/dist/testing/replay/recorded-provider.d.ts.map +1 -0
  630. package/dist/testing/replay/recorded-provider.js +108 -0
  631. package/dist/testing/replay/recorded-provider.js.map +1 -0
  632. package/dist/testing/replay/runner.d.ts +56 -0
  633. package/dist/testing/replay/runner.d.ts.map +1 -0
  634. package/dist/testing/replay/runner.js +406 -0
  635. package/dist/testing/replay/runner.js.map +1 -0
  636. package/dist/themes/apex-logo.d.ts +41 -0
  637. package/dist/themes/apex-logo.d.ts.map +1 -0
  638. package/dist/themes/apex-logo.js +35 -0
  639. package/dist/themes/apex-logo.js.map +1 -0
  640. package/dist/utils/apex-code-user-agent.d.ts +2 -0
  641. package/dist/utils/apex-code-user-agent.d.ts.map +1 -0
  642. package/dist/utils/apex-code-user-agent.js +5 -0
  643. package/dist/utils/apex-code-user-agent.js.map +1 -0
  644. package/dist/utils/changelog.d.ts +7 -2
  645. package/dist/utils/changelog.d.ts.map +1 -1
  646. package/dist/utils/changelog.js +82 -13
  647. package/dist/utils/changelog.js.map +1 -1
  648. package/dist/utils/clipboard-image.d.ts.map +1 -1
  649. package/dist/utils/clipboard-image.js +1 -1
  650. package/dist/utils/clipboard-image.js.map +1 -1
  651. package/dist/utils/frontmatter.d.ts.map +1 -1
  652. package/dist/utils/frontmatter.js +2 -1
  653. package/dist/utils/frontmatter.js.map +1 -1
  654. package/dist/utils/management-http.d.ts +5 -3
  655. package/dist/utils/management-http.d.ts.map +1 -1
  656. package/dist/utils/management-http.js +14 -10
  657. package/dist/utils/management-http.js.map +1 -1
  658. package/dist/utils/shell.d.ts +3 -0
  659. package/dist/utils/shell.d.ts.map +1 -1
  660. package/dist/utils/shell.js +17 -5
  661. package/dist/utils/shell.js.map +1 -1
  662. package/dist/utils/syntax-highlight.d.ts +1 -0
  663. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  664. package/dist/utils/syntax-highlight.js +60 -1
  665. package/dist/utils/syntax-highlight.js.map +1 -1
  666. package/dist/utils/text.d.ts +8 -0
  667. package/dist/utils/text.d.ts.map +1 -0
  668. package/dist/utils/text.js +9 -0
  669. package/dist/utils/text.js.map +1 -0
  670. package/dist/utils/tools-manager.d.ts +70 -2
  671. package/dist/utils/tools-manager.d.ts.map +1 -1
  672. package/dist/utils/tools-manager.js +280 -124
  673. package/dist/utils/tools-manager.js.map +1 -1
  674. package/dist/utils/version-check.d.ts +7 -5
  675. package/dist/utils/version-check.d.ts.map +1 -1
  676. package/dist/utils/version-check.js +25 -14
  677. package/dist/utils/version-check.js.map +1 -1
  678. package/dist/utils/windows-self-update.d.ts.map +1 -1
  679. package/dist/utils/windows-self-update.js +1 -1
  680. package/dist/utils/windows-self-update.js.map +1 -1
  681. package/docs/compaction.md +39 -24
  682. package/docs/containerization.md +24 -21
  683. package/docs/custom-provider.md +15 -12
  684. package/docs/development.md +11 -11
  685. package/docs/environment-variables.md +37 -77
  686. package/docs/extensions.md +68 -54
  687. package/docs/index.md +12 -24
  688. package/docs/json.md +18 -11
  689. package/docs/keybindings.md +18 -12
  690. package/docs/llama-cpp.md +9 -7
  691. package/docs/models.md +17 -11
  692. package/docs/packages.md +47 -43
  693. package/docs/prompt-templates.md +3 -3
  694. package/docs/providers.md +10 -10
  695. package/docs/quickstart.md +49 -32
  696. package/docs/rpc.md +35 -18
  697. package/docs/sdk.md +20 -6
  698. package/docs/security.md +18 -18
  699. package/docs/session-format.md +9 -9
  700. package/docs/sessions.md +13 -13
  701. package/docs/settings.md +83 -16
  702. package/docs/shell-aliases.md +1 -1
  703. package/docs/skills.md +66 -15
  704. package/docs/terminal-setup.md +44 -19
  705. package/docs/termux.md +4 -4
  706. package/docs/themes.md +32 -11
  707. package/docs/tmux.md +4 -4
  708. package/docs/tui.md +5 -5
  709. package/docs/usage.md +61 -53
  710. package/docs/windows.md +24 -2
  711. package/examples/extensions/border-status-editor.ts +1 -1
  712. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  713. package/examples/extensions/custom-provider-anthropic/package.json +2 -2
  714. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  715. package/examples/extensions/git-checkpoint.ts +2 -2
  716. package/examples/extensions/gondolin/package-lock.json +2 -2
  717. package/examples/extensions/gondolin/package.json +1 -1
  718. package/examples/extensions/notify.ts +3 -1
  719. package/examples/extensions/sandbox/package-lock.json +2 -2
  720. package/examples/extensions/sandbox/package.json +1 -1
  721. package/examples/extensions/subagent/README.md +3 -1
  722. package/examples/extensions/subagent/agents.ts +40 -9
  723. package/examples/extensions/subagent/index.ts +27 -4
  724. package/examples/extensions/titlebar-spinner.ts +1 -1
  725. package/examples/extensions/with-deps/package-lock.json +2 -2
  726. package/examples/extensions/with-deps/package.json +1 -1
  727. package/examples/rpc-extension-ui.ts +1 -1
  728. package/examples/sdk/06-extensions.ts +1 -1
  729. package/examples/sdk/README.md +1 -1
  730. package/npm-shrinkwrap.json +280 -445
  731. package/package.json +9 -12
  732. package/dist/core/telemetry.d.ts +0 -3
  733. package/dist/core/telemetry.d.ts.map +0 -1
  734. package/dist/core/telemetry.js +0 -9
  735. package/dist/core/telemetry.js.map +0 -1
  736. package/dist/utils/pi-user-agent.d.ts +0 -2
  737. package/dist/utils/pi-user-agent.d.ts.map +0 -1
  738. package/dist/utils/pi-user-agent.js +0 -5
  739. package/dist/utils/pi-user-agent.js.map +0 -1
@@ -1,21 +1,23 @@
1
- import chalk from "chalk";
2
1
  import { spawnSync } from "child_process";
3
- import { chmodSync, createWriteStream, existsSync, mkdirSync, readdirSync, renameSync, rmSync } from "fs";
2
+ import { createHash } from "crypto";
3
+ import { chmodSync, createReadStream, createWriteStream, existsSync, mkdirSync, readdirSync, renameSync, rmSync, statSync, } from "fs";
4
4
  import { arch, platform } from "os";
5
- import { join } from "path";
5
+ import { basename, join, relative, resolve as resolvePath } from "path";
6
6
  import { Readable } from "stream";
7
7
  import { pipeline } from "stream/promises";
8
- import { APP_NAME, getBinDir } from "../config.js";
8
+ import { getBinDir } from "../config.js";
9
+ import { getApexEnvironment } from "../core/environment.js";
9
10
  import { fetchWithRetry } from "./management-http.js";
10
11
  const TOOLS_DIR = getBinDir();
11
- const NETWORK_TIMEOUT_MS = 10_000;
12
12
  const DOWNLOAD_TIMEOUT_MS = 120_000;
13
13
  function isOfflineModeEnabled() {
14
- const value = process.env.PI_OFFLINE;
14
+ const value = getApexEnvironment("APEX_CODE_OFFLINE");
15
15
  if (!value)
16
16
  return false;
17
17
  return value === "1" || value.toLowerCase() === "true" || value.toLowerCase() === "yes";
18
18
  }
19
+ // Per-platform/architecture asset names live in MANAGED_TOOL_PINS (ADR 0017) as the
20
+ // single reviewed source of truth, not derived here.
19
21
  const TOOLS = {
20
22
  fd: {
21
23
  name: "fd",
@@ -23,44 +25,12 @@ const TOOLS = {
23
25
  binaryName: "fd",
24
26
  systemBinaryNames: ["fd", "fdfind"],
25
27
  tagPrefix: "v",
26
- getAssetName: (version, plat, architecture) => {
27
- if (plat === "darwin") {
28
- const archStr = architecture === "arm64" ? "aarch64" : "x86_64";
29
- return `fd-v${version}-${archStr}-apple-darwin.tar.gz`;
30
- }
31
- else if (plat === "linux") {
32
- const archStr = architecture === "arm64" ? "aarch64" : "x86_64";
33
- return `fd-v${version}-${archStr}-unknown-linux-gnu.tar.gz`;
34
- }
35
- else if (plat === "win32") {
36
- const archStr = architecture === "arm64" ? "aarch64" : "x86_64";
37
- return `fd-v${version}-${archStr}-pc-windows-msvc.zip`;
38
- }
39
- return null;
40
- },
41
28
  },
42
29
  rg: {
43
30
  name: "ripgrep",
44
31
  repo: "BurntSushi/ripgrep",
45
32
  binaryName: "rg",
46
33
  tagPrefix: "",
47
- getAssetName: (version, plat, architecture) => {
48
- if (plat === "darwin") {
49
- const archStr = architecture === "arm64" ? "aarch64" : "x86_64";
50
- return `ripgrep-${version}-${archStr}-apple-darwin.tar.gz`;
51
- }
52
- else if (plat === "linux") {
53
- if (architecture === "arm64") {
54
- return `ripgrep-${version}-aarch64-unknown-linux-gnu.tar.gz`;
55
- }
56
- return `ripgrep-${version}-x86_64-unknown-linux-musl.tar.gz`;
57
- }
58
- else if (plat === "win32") {
59
- const archStr = architecture === "arm64" ? "aarch64" : "x86_64";
60
- return `ripgrep-${version}-${archStr}-pc-windows-msvc.zip`;
61
- }
62
- return null;
63
- },
64
34
  },
65
35
  };
66
36
  // Check if a command exists in PATH by trying to run it
@@ -75,14 +45,16 @@ function commandExists(cmd) {
75
45
  }
76
46
  }
77
47
  // Get the path to a tool (system-wide or in our tools dir)
78
- export function getToolPath(tool) {
48
+ export function getToolPath(tool, options = {}) {
79
49
  const config = TOOLS[tool];
80
50
  if (!config)
81
51
  return null;
82
- // Check our tools directory first
83
- const localPath = join(TOOLS_DIR, config.binaryName + (platform() === "win32" ? ".exe" : ""));
84
- if (existsSync(localPath)) {
85
- return localPath;
52
+ // Check our tools directory first. Existence alone is not enough: the sandbox
53
+ // projects host tools by bind-mounting over a file here, and bwrap leaves that
54
+ // mountpoint behind as an empty, non-executable stub once the namespace is gone.
55
+ const managedPath = join(options.toolsDirectory ?? TOOLS_DIR, config.binaryName + (platform() === "win32" ? ".exe" : ""));
56
+ if (isExecutableFile(managedPath, platform())) {
57
+ return managedPath;
86
58
  }
87
59
  // Check system PATH - if found, just return the command name (it's in PATH)
88
60
  const systemBinaryNames = config.systemBinaryNames ?? [config.binaryName];
@@ -93,19 +65,113 @@ export function getToolPath(tool) {
93
65
  }
94
66
  return null;
95
67
  }
96
- // Fetch latest release version from GitHub
97
- async function getLatestVersion(repo) {
98
- const response = await fetchWithRetry(`https://api.github.com/repos/${repo}/releases/latest`, {
99
- headers: { "User-Agent": `${APP_NAME}-coding-agent` },
100
- }, { timeoutMs: NETWORK_TIMEOUT_MS });
101
- if (!response.ok) {
102
- throw new Error(`GitHub API error: ${response.status}`);
68
+ const MANAGED_TOOL_PINS = {
69
+ rg: {
70
+ "linux:x64": {
71
+ version: "14.1.1",
72
+ assetName: "ripgrep-14.1.1-x86_64-unknown-linux-musl.tar.gz",
73
+ sha256: "4cf9f2741e6c465ffdb7c26f38056a59e2a2544b51f7cc128ef28337eeae4d8e",
74
+ expectedBytes: 2566310,
75
+ archiveKind: "tar.gz",
76
+ },
77
+ "linux:arm64": {
78
+ version: "14.1.1",
79
+ assetName: "ripgrep-14.1.1-aarch64-unknown-linux-gnu.tar.gz",
80
+ sha256: "c827481c4ff4ea10c9dc7a4022c8de5db34a5737cb74484d62eb94a95841ab2f",
81
+ expectedBytes: 2047405,
82
+ archiveKind: "tar.gz",
83
+ },
84
+ "darwin:x64": {
85
+ version: "14.1.1",
86
+ assetName: "ripgrep-14.1.1-x86_64-apple-darwin.tar.gz",
87
+ sha256: "fc87e78f7cb3fea12d69072e7ef3b21509754717b746368fd40d88963630e2b3",
88
+ expectedBytes: 2082672,
89
+ archiveKind: "tar.gz",
90
+ },
91
+ "darwin:arm64": {
92
+ version: "14.1.1",
93
+ assetName: "ripgrep-14.1.1-aarch64-apple-darwin.tar.gz",
94
+ sha256: "24ad76777745fbff131c8fbc466742b011f925bfa4fffa2ded6def23b5b937be",
95
+ expectedBytes: 1787248,
96
+ archiveKind: "tar.gz",
97
+ },
98
+ "win32:x64": {
99
+ version: "14.1.1",
100
+ assetName: "ripgrep-14.1.1-x86_64-pc-windows-msvc.zip",
101
+ sha256: "d0f534024c42afd6cb4d38907c25cd2b249b79bbe6cc1dbee8e3e37c2b6e25a1",
102
+ expectedBytes: 2058893,
103
+ archiveKind: "zip",
104
+ },
105
+ // No upstream win32/arm64 ripgrep release asset exists at 14.1.1; resolution
106
+ // fails closed for that combination rather than constructing a URL that 404s.
107
+ },
108
+ fd: {
109
+ "linux:x64": {
110
+ version: "10.4.2",
111
+ assetName: "fd-v10.4.2-x86_64-unknown-linux-gnu.tar.gz",
112
+ sha256: "def59805cd14b5651b68990855f426ad087f3b96881296d963910431ba3143c8",
113
+ expectedBytes: 1700779,
114
+ archiveKind: "tar.gz",
115
+ },
116
+ "linux:arm64": {
117
+ version: "10.4.2",
118
+ assetName: "fd-v10.4.2-aarch64-unknown-linux-gnu.tar.gz",
119
+ sha256: "6c51f7c5446b3338b1e401ff15dc194c590bb2fa64fd43ff3278300f073adec5",
120
+ expectedBytes: 1559490,
121
+ archiveKind: "tar.gz",
122
+ },
123
+ // Upstream stopped shipping an Intel macOS fd binary after 10.3.0 (see
124
+ // 7afd80d78, "pin fd for macos x64"); preserved here rather than special-cased.
125
+ "darwin:x64": {
126
+ version: "10.3.0",
127
+ assetName: "fd-v10.3.0-x86_64-apple-darwin.tar.gz",
128
+ sha256: "50d30f13fe3d5914b14c4fff5abcbd4d0cdab4b855970a6956f4f006c17117a3",
129
+ expectedBytes: 1430203,
130
+ archiveKind: "tar.gz",
131
+ },
132
+ "darwin:arm64": {
133
+ version: "10.4.2",
134
+ assetName: "fd-v10.4.2-aarch64-apple-darwin.tar.gz",
135
+ sha256: "623dc0afc81b92e4d4606b380d7bc91916ba7b97814263e554d50923a39e480a",
136
+ expectedBytes: 1328933,
137
+ archiveKind: "tar.gz",
138
+ },
139
+ "win32:x64": {
140
+ version: "10.4.2",
141
+ assetName: "fd-v10.4.2-x86_64-pc-windows-msvc.zip",
142
+ sha256: "b2816e506390a89941c63c9187d58a3cc10e9a55f2ef0685f9ea0eccaf7c98c8",
143
+ expectedBytes: 1525898,
144
+ archiveKind: "zip",
145
+ },
146
+ "win32:arm64": {
147
+ version: "10.4.2",
148
+ assetName: "fd-v10.4.2-aarch64-pc-windows-msvc.zip",
149
+ sha256: "4f9110c2d5b33a7f760bfa5510f4c113d828109f7277d421b1053a9943c0fc92",
150
+ expectedBytes: 1370473,
151
+ archiveKind: "zip",
152
+ },
153
+ },
154
+ };
155
+ /** Resolve reviewed, pinned metadata for a managed tool. Never queries "latest". */
156
+ export function resolveManagedToolArtifact(options) {
157
+ const config = TOOLS[options.tool];
158
+ const pin = MANAGED_TOOL_PINS[options.tool]?.[`${options.platform}:${options.architecture}`];
159
+ if (!config || !pin) {
160
+ throw new Error(`No reviewed pinned artifact for ${options.tool} on ${options.platform}/${options.architecture}`);
103
161
  }
104
- const data = (await response.json());
105
- return data.tag_name.replace(/^v/, "");
162
+ return {
163
+ version: pin.version,
164
+ url: `https://github.com/${config.repo}/releases/download/${config.tagPrefix}${pin.version}/${pin.assetName}`,
165
+ sha256: pin.sha256,
166
+ expectedBytes: pin.expectedBytes,
167
+ maxBytes: pin.expectedBytes * 4,
168
+ binaryName: config.binaryName,
169
+ archiveKind: pin.archiveKind,
170
+ };
106
171
  }
107
- // Download a file from URL
108
- async function downloadFile(url, dest) {
172
+ // Download a file from URL, aborting if the declared or received size exceeds the
173
+ // bounded ceiling (ADR 0017) rather than writing an unbounded stream to disk.
174
+ async function downloadFile(url, dest, maxBytes) {
109
175
  const response = await fetchWithRetry(url, undefined, { timeoutMs: DOWNLOAD_TIMEOUT_MS });
110
176
  if (!response.ok) {
111
177
  throw new Error(`Failed to download: ${response.status}`);
@@ -113,8 +179,26 @@ async function downloadFile(url, dest) {
113
179
  if (!response.body) {
114
180
  throw new Error("No response body");
115
181
  }
182
+ const declaredLength = Number(response.headers.get("content-length") ?? Number.NaN);
183
+ if (Number.isFinite(declaredLength) && declaredLength > maxBytes) {
184
+ throw new Error(`Refusing download: declared size ${declaredLength} exceeds bounded limit ${maxBytes}`);
185
+ }
186
+ let received = 0;
187
+ const source = Readable.fromWeb(response.body);
188
+ source.on("data", (chunk) => {
189
+ received += chunk.length;
190
+ if (received > maxBytes) {
191
+ source.destroy(new Error(`Refusing download: exceeded bounded limit ${maxBytes} bytes`));
192
+ }
193
+ });
116
194
  const fileStream = createWriteStream(dest);
117
- await pipeline(Readable.fromWeb(response.body), fileStream);
195
+ try {
196
+ await pipeline(source, fileStream);
197
+ }
198
+ catch (error) {
199
+ rmSync(dest, { force: true });
200
+ throw error;
201
+ }
118
202
  }
119
203
  function findBinaryRecursively(rootDir, binaryFileName) {
120
204
  const stack = [rootDir];
@@ -209,80 +293,159 @@ function extractZipArchive(archivePath, extractDir, assetName) {
209
293
  }
210
294
  throw new Error(`Failed to extract ${assetName}: ${failures.join("; ")}`);
211
295
  }
212
- // Download and install a tool
213
- async function downloadTool(tool) {
214
- const config = TOOLS[tool];
215
- if (!config)
216
- throw new Error(`Unknown tool: ${tool}`);
217
- const plat = platform();
218
- const architecture = arch();
219
- // Get latest version
220
- let version = await getLatestVersion(config.repo);
221
- if (tool === "fd" && plat === "darwin" && architecture === "x64") {
222
- version = "10.3.0";
296
+ async function sha256File(path) {
297
+ const hash = createHash("sha256");
298
+ for await (const chunk of createReadStream(path)) {
299
+ hash.update(chunk);
223
300
  }
224
- // Get asset name for this platform
225
- const assetName = config.getAssetName(version, plat, architecture);
226
- if (!assetName) {
227
- throw new Error(`Unsupported platform: ${plat}/${architecture}`);
301
+ return hash.digest("hex");
302
+ }
303
+ /**
304
+ * Verify a downloaded tool archive against its pinned digest, extract it into a
305
+ * per-install quarantine directory, confirm the located binary did not escape that
306
+ * quarantine, and only then atomically promote it into the live tools directory
307
+ * (ADR 0017). Rejects a digest mismatch or an out-of-bounds archive before anything
308
+ * is written to `destination`.
309
+ */
310
+ export async function installManagedToolArchive(options) {
311
+ const { archivePath, destination, binaryName, archiveKind, expectedSha256, maxBytes } = options;
312
+ const { size } = statSync(archivePath);
313
+ if (size > maxBytes) {
314
+ throw new Error(`Refusing install: archive size ${size} exceeds bounded limit ${maxBytes}`);
228
315
  }
229
- // Create tools directory
230
- mkdirSync(TOOLS_DIR, { recursive: true });
231
- const downloadUrl = `https://github.com/${config.repo}/releases/download/${config.tagPrefix}${version}/${assetName}`;
232
- const archivePath = join(TOOLS_DIR, assetName);
233
- const binaryExt = plat === "win32" ? ".exe" : "";
234
- const binaryPath = join(TOOLS_DIR, config.binaryName + binaryExt);
235
- // Download
236
- await downloadFile(downloadUrl, archivePath);
237
- // Extract into a unique temp directory. fd and rg downloads can run concurrently
238
- // during startup, so sharing a fixed directory causes races.
239
- const extractDir = join(TOOLS_DIR, `extract_tmp_${config.binaryName}_${process.pid}_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`);
240
- mkdirSync(extractDir, { recursive: true });
316
+ const actualSha256 = await sha256File(archivePath);
317
+ if (actualSha256.toLowerCase() !== expectedSha256.toLowerCase()) {
318
+ throw new Error(`Refusing install: digest mismatch for ${basename(archivePath)}`);
319
+ }
320
+ mkdirSync(destination, { recursive: true });
321
+ const quarantineDirectory = join(destination, `.quarantine_${process.pid}_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`);
322
+ mkdirSync(quarantineDirectory, { recursive: true });
241
323
  try {
242
- if (assetName.endsWith(".tar.gz")) {
243
- extractTarGzArchive(archivePath, extractDir, assetName);
244
- }
245
- else if (assetName.endsWith(".zip")) {
246
- extractZipArchive(archivePath, extractDir, assetName);
324
+ const assetName = basename(archivePath);
325
+ if (archiveKind === "tar.gz") {
326
+ extractTarGzArchive(archivePath, quarantineDirectory, assetName);
247
327
  }
248
328
  else {
249
- throw new Error(`Unsupported archive format: ${assetName}`);
329
+ extractZipArchive(archivePath, quarantineDirectory, assetName);
250
330
  }
251
- // Find the binary in extracted files. Some archives contain files directly
252
- // at root, others nest under a versioned subdirectory.
253
- const binaryFileName = config.binaryName + binaryExt;
254
- const extractedDir = join(extractDir, assetName.replace(/\.(tar\.gz|zip)$/, ""));
255
- const extractedBinaryCandidates = [join(extractedDir, binaryFileName), join(extractDir, binaryFileName)];
256
- let extractedBinary = extractedBinaryCandidates.find((candidate) => existsSync(candidate));
331
+ const binaryFileName = binaryName + (platform() === "win32" ? ".exe" : "");
332
+ const extractedBinary = findBinaryRecursively(quarantineDirectory, binaryFileName);
257
333
  if (!extractedBinary) {
258
- extractedBinary = findBinaryRecursively(extractDir, binaryFileName) ?? undefined;
334
+ throw new Error(`Binary not found in verified archive: expected ${binaryFileName}`);
259
335
  }
260
- if (extractedBinary) {
261
- renameSync(extractedBinary, binaryPath);
336
+ const resolvedBinary = resolvePath(extractedBinary);
337
+ const containmentPath = relative(resolvePath(quarantineDirectory), resolvedBinary);
338
+ if (containmentPath.startsWith("..") || resolvePath(containmentPath) === containmentPath) {
339
+ throw new Error(`Refusing install: archive entry escaped its quarantine directory: ${extractedBinary}`);
262
340
  }
263
- else {
264
- throw new Error(`Binary not found in archive: expected ${binaryFileName} under ${extractDir}`);
265
- }
266
- // Make executable (Unix only)
267
- if (plat !== "win32") {
268
- chmodSync(binaryPath, 0o755);
341
+ const finalPath = join(destination, binaryFileName);
342
+ renameSync(resolvedBinary, finalPath);
343
+ if (platform() !== "win32") {
344
+ chmodSync(finalPath, 0o755);
269
345
  }
346
+ return finalPath;
347
+ }
348
+ finally {
349
+ rmSync(quarantineDirectory, { recursive: true, force: true });
350
+ }
351
+ }
352
+ // Download and install a tool from reviewed, pinned metadata (ADR 0017): bounded
353
+ // download, digest verification, quarantine extraction, then atomic promotion.
354
+ async function downloadTool(tool) {
355
+ const plat = platform();
356
+ const architecture = arch();
357
+ const artifact = resolveManagedToolArtifact({ tool, platform: plat, architecture });
358
+ mkdirSync(TOOLS_DIR, { recursive: true });
359
+ // Unique download filename: fd and rg downloads can run concurrently during
360
+ // startup, so sharing a fixed path causes races.
361
+ const archivePath = join(TOOLS_DIR, `download_${artifact.binaryName}_${process.pid}_${Date.now()}_${Math.random().toString(36).slice(2, 10)}${artifact.archiveKind === "zip" ? ".zip" : ".tar.gz"}`);
362
+ try {
363
+ await downloadFile(artifact.url, archivePath, artifact.maxBytes);
364
+ return await installManagedToolArchive({
365
+ archivePath,
366
+ destination: TOOLS_DIR,
367
+ binaryName: artifact.binaryName,
368
+ archiveKind: artifact.archiveKind,
369
+ expectedSha256: artifact.sha256,
370
+ maxBytes: artifact.maxBytes,
371
+ });
270
372
  }
271
373
  finally {
272
- // Cleanup
273
374
  rmSync(archivePath, { force: true });
274
- rmSync(extractDir, { recursive: true, force: true });
275
375
  }
276
- return binaryPath;
376
+ }
377
+ function isExecutableFile(candidate, targetPlatform) {
378
+ try {
379
+ const stats = statSync(candidate);
380
+ if (!stats.isFile())
381
+ return false;
382
+ // Windows has no POSIX execute bit; presence of the file is the only signal.
383
+ return targetPlatform === "win32" || (stats.mode & 0o111) !== 0;
384
+ }
385
+ catch {
386
+ return false;
387
+ }
388
+ }
389
+ /**
390
+ * Absolute host path for a managed tool, or undefined when it is installed nowhere.
391
+ *
392
+ * `getToolPath` may return a bare command name because its caller spawns through PATH.
393
+ * A sandboxed child has no such luxury: its PATH still lists host directories that the
394
+ * OS boundary has already replaced, so the supervisor must resolve a real path here and
395
+ * project it in (ADR 0017, and the sandbox spec's tool-projection amendment).
396
+ */
397
+ export function resolveHostToolBinary(tool, options = {}) {
398
+ const config = TOOLS[tool];
399
+ if (!config)
400
+ return undefined;
401
+ const targetPlatform = options.platform ?? platform();
402
+ const executableSuffix = targetPlatform === "win32" ? ".exe" : "";
403
+ const managedPath = join(options.toolsDirectory ?? TOOLS_DIR, config.binaryName + executableSuffix);
404
+ if (isExecutableFile(managedPath, targetPlatform)) {
405
+ return managedPath;
406
+ }
407
+ const pathEntries = (options.pathValue ?? process.env.PATH ?? "")
408
+ .split(targetPlatform === "win32" ? ";" : ":")
409
+ .filter((entry) => entry.length > 0);
410
+ // Preference runs by name first, matching getToolPath: a real `fd` anywhere on PATH
411
+ // beats a `fdfind` alias, rather than whichever directory happens to come first.
412
+ for (const systemBinaryName of config.systemBinaryNames ?? [config.binaryName]) {
413
+ for (const entry of pathEntries) {
414
+ const candidate = join(entry, systemBinaryName + executableSuffix);
415
+ if (isExecutableFile(candidate, targetPlatform)) {
416
+ return candidate;
417
+ }
418
+ }
419
+ }
420
+ return undefined;
421
+ }
422
+ /**
423
+ * Install any missing managed tool on the host, then report absolute paths for the ones
424
+ * that exist. Downloading here rather than inside the child means one install serves every
425
+ * workspace, and it happens on the side of the boundary that still has network access.
426
+ */
427
+ export async function prepareHostToolBinaries(silent = false) {
428
+ const binaries = [];
429
+ for (const tool of ["fd", "rg"]) {
430
+ await ensureTool(tool, silent ? undefined : ({ message }) => console.error(message));
431
+ const hostPath = resolveHostToolBinary(tool);
432
+ if (hostPath) {
433
+ binaries.push({ name: TOOLS[tool].binaryName + (platform() === "win32" ? ".exe" : ""), path: hostPath });
434
+ }
435
+ }
436
+ return binaries;
277
437
  }
278
438
  // Termux package names for tools
279
439
  const TERMUX_PACKAGES = {
280
440
  fd: "fd",
281
441
  rg: "ripgrep",
282
442
  };
283
- // Ensure a tool is available, downloading if necessary
284
- // Returns the path to the tool, or null if unavailable
285
- export async function ensureTool(tool, silent = false) {
443
+ /**
444
+ * Ensure a tool is available, downloading if necessary.
445
+ * Reports progress through `onStatus`; status messages are otherwise silent.
446
+ * Returns the tool path, or undefined if unavailable.
447
+ */
448
+ export async function ensureTool(tool, onStatus) {
286
449
  const existingPath = getToolPath(tool);
287
450
  if (existingPath) {
288
451
  return existingPath;
@@ -291,35 +454,28 @@ export async function ensureTool(tool, silent = false) {
291
454
  if (!config)
292
455
  return undefined;
293
456
  if (isOfflineModeEnabled()) {
294
- if (!silent) {
295
- console.log(chalk.yellow(`${config.name} not found. Offline mode enabled, skipping download.`));
296
- }
457
+ onStatus?.({ type: "warning", message: `${config.name} not found. Offline mode enabled, skipping download.` });
297
458
  return undefined;
298
459
  }
299
460
  // On Android/Termux, Linux binaries don't work due to Bionic libc incompatibility.
300
461
  // Users must install via pkg.
301
462
  if (platform() === "android") {
302
463
  const pkgName = TERMUX_PACKAGES[tool] ?? tool;
303
- if (!silent) {
304
- console.log(chalk.yellow(`${config.name} not found. Install with: pkg install ${pkgName}`));
305
- }
464
+ onStatus?.({ type: "warning", message: `${config.name} not found. Install with: pkg install ${pkgName}` });
306
465
  return undefined;
307
466
  }
308
467
  // Tool not found - download it
309
- if (!silent) {
310
- console.log(chalk.dim(`${config.name} not found. Downloading...`));
311
- }
468
+ onStatus?.({ type: "info", message: `${config.name} not found. Downloading...` });
312
469
  try {
313
470
  const path = await downloadTool(tool);
314
- if (!silent) {
315
- console.log(chalk.dim(`${config.name} installed to ${path}`));
316
- }
471
+ onStatus?.({ type: "info", message: `${config.name} installed to ${path}` });
317
472
  return path;
318
473
  }
319
474
  catch (e) {
320
- if (!silent) {
321
- console.log(chalk.yellow(`Failed to download ${config.name}: ${e instanceof Error ? e.message : e}`));
322
- }
475
+ onStatus?.({
476
+ type: "warning",
477
+ message: `Failed to download ${config.name}: ${e instanceof Error ? e.message : e}`,
478
+ });
323
479
  return undefined;
324
480
  }
325
481
  }