@automaton-labs/aib 0.0.7 → 0.0.9

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 (477) hide show
  1. package/README.md +21 -578
  2. package/config/agent-dx-policy.default.json +31 -0
  3. package/config/control-plane-client.default.json +3 -0
  4. package/dist/agent-dx/agent-dx.js +805 -0
  5. package/dist/agent-dx/presentation.js +32 -0
  6. package/dist/alias-advisor/analyze.js +982 -0
  7. package/dist/alias-advisor/exact-text-cost.js +74 -0
  8. package/dist/alias-advisor/lexical.js +240 -0
  9. package/dist/alias-advisor/model.js +2 -0
  10. package/dist/alias-advisor/path-identity.js +49 -0
  11. package/dist/alias-advisor/ranking.js +171 -0
  12. package/dist/alias-advisor/token-estimator.js +85 -0
  13. package/dist/bin/aib.js +5 -1
  14. package/dist/bin/cli.js +811 -4
  15. package/dist/commands/add-missing-imports-preview-cache.js +99 -2
  16. package/dist/commands/add-missing-imports.js +241 -2
  17. package/dist/commands/apply-module-plan.js +1319 -3
  18. package/dist/commands/background-command.js +378 -2
  19. package/dist/commands/captured-input.js +74 -1
  20. package/dist/commands/config-command.js +314 -2
  21. package/dist/commands/config-output.js +357 -10
  22. package/dist/commands/control-plane-command.js +183 -1
  23. package/dist/commands/declaration-command.js +1209 -7
  24. package/dist/commands/declaration-execution-cache.js +79 -1
  25. package/dist/commands/declaration-format.js +221 -1
  26. package/dist/commands/declaration-preview-cache.js +114 -2
  27. package/dist/commands/diagnostics-command.js +70 -3
  28. package/dist/commands/doctor.js +137 -3
  29. package/dist/commands/execution-command.js +117 -1
  30. package/dist/commands/exports-star-collapse-command.js +178 -0
  31. package/dist/commands/exports-star-command.js +252 -0
  32. package/dist/commands/exports-star-preview-cache.js +84 -0
  33. package/dist/commands/feedback-command.js +176 -3
  34. package/dist/commands/file-move-to-dir-execution-cache.js +92 -1
  35. package/dist/commands/file-move-to-dir-preview-cache.js +125 -2
  36. package/dist/commands/file-move-to-dir-worker.js +54 -0
  37. package/dist/commands/file-move-to-dir.js +1073 -5
  38. package/dist/commands/file-mutation-runtime.js +102 -1
  39. package/dist/commands/file-mutation-worker-apply.js +180 -0
  40. package/dist/commands/file-refactor-batch-execution-cache.js +90 -1
  41. package/dist/commands/file-refactor-batch-preview-cache.js +125 -2
  42. package/dist/commands/file-refactor-batch-worker.js +54 -0
  43. package/dist/commands/file-refactor-batch.js +1154 -5
  44. package/dist/commands/file-rename-execution-cache.js +92 -1
  45. package/dist/commands/file-rename-preview-cache.js +125 -2
  46. package/dist/commands/file-rename-worker.js +54 -0
  47. package/dist/commands/file-rename.js +1053 -5
  48. package/dist/commands/file-text-edit-executor.js +205 -0
  49. package/dist/commands/find-importers.js +52 -1
  50. package/dist/commands/find-unused-imports.js +55 -1
  51. package/dist/commands/generate-docs-command.js +244 -6
  52. package/dist/commands/help-command.js +460 -7
  53. package/dist/commands/import-specifier-policy.js +391 -0
  54. package/dist/commands/imports-command.js +68 -1
  55. package/dist/commands/imports-rebase.js +1138 -0
  56. package/dist/commands/init-skill-usage.js +92 -3
  57. package/dist/commands/init-workspace.js +30 -1
  58. package/dist/commands/inspect-alias-candidates.js +413 -0
  59. package/dist/commands/inspect-cycles.js +811 -5
  60. package/dist/commands/inspect-direct-usages.js +98 -0
  61. package/dist/commands/inspect-duplicates-format.js +229 -0
  62. package/dist/commands/inspect-format-primitives.js +127 -0
  63. package/dist/commands/inspect-format.js +1590 -18
  64. package/dist/commands/inspect-graph.js +1553 -9
  65. package/dist/commands/inspect-imports.js +339 -2
  66. package/dist/commands/inspect-mixed-format.js +524 -0
  67. package/dist/commands/inspect-module-plan-format.js +216 -0
  68. package/dist/commands/inspect-module-plan-serialization.js +402 -0
  69. package/dist/commands/inspect-reference-path-format.js +157 -0
  70. package/dist/commands/inspect-request-values.js +599 -0
  71. package/dist/commands/inspect-selector-kind.js +21 -0
  72. package/dist/commands/inspect-selector.js +50 -0
  73. package/dist/commands/inspect-symbol-format.js +90 -0
  74. package/dist/commands/inspect-topology.js +435 -0
  75. package/dist/commands/inspect-tree.js +827 -5
  76. package/dist/commands/inspect-usages-detail.js +793 -0
  77. package/dist/commands/inspect-usages-evidence.js +31 -0
  78. package/dist/commands/inspect-usages-format.js +367 -0
  79. package/dist/commands/inspect.js +1450 -16
  80. package/dist/commands/internal-command.js +64 -0
  81. package/dist/commands/json-file-input.js +60 -1
  82. package/dist/commands/module-plan-cache.js +156 -2
  83. package/dist/commands/module-plan-standalone.js +208 -0
  84. package/dist/commands/module-plan-timeout.js +77 -1
  85. package/dist/commands/move-preview-cache.js +101 -2
  86. package/dist/commands/mutate-aggregate-output.js +996 -0
  87. package/dist/commands/mutate-child-execution.js +374 -0
  88. package/dist/commands/mutate-command.js +1394 -0
  89. package/dist/commands/mutate-declaration-output.js +313 -0
  90. package/dist/commands/mutate-domain-adapters.js +638 -0
  91. package/dist/commands/mutate-execution-cache.js +114 -0
  92. package/dist/commands/mutate-execution-status.js +598 -0
  93. package/dist/commands/mutate-failure-output.js +531 -0
  94. package/dist/commands/mutate-file-view.js +151 -0
  95. package/dist/commands/mutate-object-output.js +91 -0
  96. package/dist/commands/mutate-output-values.js +97 -0
  97. package/dist/commands/mutate-preview-cache.js +86 -0
  98. package/dist/commands/mutate-response-replay.js +153 -0
  99. package/dist/commands/mutate-result-projection.js +818 -0
  100. package/dist/commands/mutation-eta.js +28 -0
  101. package/dist/commands/mutation-execution-cache.js +140 -3
  102. package/dist/commands/mutation-recovery-journal.js +195 -0
  103. package/dist/commands/normalize-imports.js +1120 -4
  104. package/dist/commands/object-pack-command.js +546 -0
  105. package/dist/commands/object-pack-preview-cache.js +88 -0
  106. package/dist/commands/observability-command.js +47 -3
  107. package/dist/commands/ota-command.js +403 -2
  108. package/dist/commands/print-config.js +10 -1
  109. package/dist/commands/quick-read.js +1113 -11
  110. package/dist/commands/refactor-batch-builder.js +265 -1
  111. package/dist/commands/refactor-batch-execution-cache.js +85 -1
  112. package/dist/commands/refactor-batch-preview-cache.js +96 -2
  113. package/dist/commands/refactor-batch.js +461 -4
  114. package/dist/commands/rename-entities.js +794 -4
  115. package/dist/commands/rename-execution-cache.js +49 -1
  116. package/dist/commands/rename-input.js +22 -1
  117. package/dist/commands/rename-polling-policy.js +68 -0
  118. package/dist/commands/rename-preview-cache.js +96 -2
  119. package/dist/commands/result-view.js +993 -7
  120. package/dist/commands/reveal-command.js +445 -5
  121. package/dist/commands/selector-suggestions.js +93 -0
  122. package/dist/commands/session-workspace.js +1836 -31
  123. package/dist/commands/shared.js +2 -1
  124. package/dist/commands/skills-command.js +315 -0
  125. package/dist/commands/sync-command.js +59 -2
  126. package/dist/commands/worker-command.js +173 -1
  127. package/dist/commands/workspace-cache.js +55 -1
  128. package/dist/config/defaults.js +26 -1
  129. package/dist/config/env-vars.js +77 -1
  130. package/dist/config/glob-match.js +44 -1
  131. package/dist/config/import-rules.js +165 -1
  132. package/dist/config/local-config.js +293 -3
  133. package/dist/config/mutation-comments.js +51 -1
  134. package/dist/config/path-aliases.js +165 -1
  135. package/dist/config/path-display.js +84 -1
  136. package/dist/config/product-storage.js +37 -1
  137. package/dist/config/request-env.js +21 -0
  138. package/dist/config/request-routing-context.js +23 -0
  139. package/dist/config/resolve-command-alias.js +74 -1
  140. package/dist/config/resolve.js +24 -1
  141. package/dist/config/tsconfig-discovery.js +113 -1
  142. package/dist/config/typescript-preferences.js +131 -0
  143. package/dist/config/workspace-root.js +310 -3
  144. package/dist/config/workspace-state.js +254 -1
  145. package/dist/content/content-bundle.js +88 -1
  146. package/dist/diagnostics/module-plan-timeline.js +75 -2
  147. package/dist/diagnostics/readiness-text.js +45 -8
  148. package/dist/dsl/aib-dsl.js +838 -1
  149. package/dist/dsl/declaration-dsl.js +264 -1
  150. package/dist/dsl/file-move-to-dir-dsl.js +123 -1
  151. package/dist/dsl/file-refactor-batch-dsl.js +203 -1
  152. package/dist/dsl/file-rename-dsl.js +135 -1
  153. package/dist/dsl/mutate-dsl.js +746 -0
  154. package/dist/help/bootstrap.bash.md +176 -341
  155. package/dist/help/bootstrap.md +175 -340
  156. package/dist/help/bootstrap.pwsh.md +176 -341
  157. package/dist/help/docs/basics.md +1 -1
  158. package/dist/help/docs/config-setup.import-normalize.md +65 -65
  159. package/dist/help/docs/config-setup.import-rules.md +6 -5
  160. package/dist/help/docs/first-setup.md +6 -5
  161. package/dist/help/docs/help-protocol.md +4 -3
  162. package/dist/help/docs/import.base.md +38 -0
  163. package/dist/help/docs/import.rebase.md +85 -0
  164. package/dist/help/docs/inspect.aliasCandidates.md +39 -0
  165. package/dist/help/docs/inspect.code.md +1 -7
  166. package/dist/help/docs/inspect.file.md +10 -19
  167. package/dist/help/docs/inspect.graph.md +3 -17
  168. package/dist/help/{dsl/docs/inspect.md → docs/inspect.shared.md} +13 -12
  169. package/dist/help/docs/modulePlan.md +24 -28
  170. package/dist/help/docs/move.md +19 -22
  171. package/dist/help/{dsl/topics/file.move.md → docs/moveToDir.md} +36 -34
  172. package/dist/help/docs/mutate.mixed.md +34 -0
  173. package/dist/help/docs/mutation.shared.md +55 -0
  174. package/dist/help/docs/patterns.md +3 -12
  175. package/dist/help/docs/qr.md +12 -6
  176. package/dist/help/docs/quick-map.md +36 -24
  177. package/dist/help/docs/recipe.file-layout.md +10 -10
  178. package/dist/help/docs/recipe.import-boundary.md +92 -0
  179. package/dist/help/docs/recipe.safe-artifact-probing.md +68 -0
  180. package/dist/help/docs/recipe.unfamiliar-area.md +64 -0
  181. package/dist/help/docs/recipes.md +20 -0
  182. package/dist/help/docs/rename.md +19 -27
  183. package/dist/help/docs/renameFile.md +36 -0
  184. package/dist/help/docs/rules.md +26 -0
  185. package/dist/help/dsl/bootstrap.bash.md +176 -341
  186. package/dist/help/dsl/bootstrap.md +175 -340
  187. package/dist/help/dsl/bootstrap.pwsh.md +176 -341
  188. package/dist/help/dsl/docs/basics.md +1 -1
  189. package/dist/help/dsl/docs/config-setup.import-normalize.md +65 -65
  190. package/dist/help/dsl/docs/config-setup.import-rules.md +6 -5
  191. package/dist/help/dsl/docs/first-setup.md +6 -5
  192. package/dist/help/dsl/docs/help-protocol.md +4 -3
  193. package/dist/help/dsl/docs/import.base.md +38 -0
  194. package/dist/help/dsl/docs/import.rebase.md +85 -0
  195. package/dist/help/dsl/docs/inspect.aliasCandidates.md +39 -0
  196. package/dist/help/dsl/docs/inspect.code.md +1 -7
  197. package/dist/help/dsl/docs/inspect.file.md +10 -19
  198. package/dist/help/dsl/docs/inspect.graph.md +3 -17
  199. package/dist/help/{docs/inspect.md → dsl/docs/inspect.shared.md} +13 -12
  200. package/dist/help/dsl/docs/modulePlan.md +24 -28
  201. package/dist/help/dsl/docs/move.md +19 -22
  202. package/dist/help/{topics/file.move.md → dsl/docs/moveToDir.md} +36 -34
  203. package/dist/help/dsl/docs/mutate.mixed.md +34 -0
  204. package/dist/help/dsl/docs/mutation.shared.md +55 -0
  205. package/dist/help/dsl/docs/patterns.md +3 -12
  206. package/dist/help/dsl/docs/qr.md +12 -6
  207. package/dist/help/dsl/docs/quick-map.md +36 -24
  208. package/dist/help/dsl/docs/recipe.file-layout.md +10 -10
  209. package/dist/help/dsl/docs/recipe.import-boundary.md +92 -0
  210. package/dist/help/dsl/docs/recipe.safe-artifact-probing.md +68 -0
  211. package/dist/help/dsl/docs/recipe.unfamiliar-area.md +64 -0
  212. package/dist/help/dsl/docs/recipes.md +20 -0
  213. package/dist/help/dsl/docs/rename.md +19 -27
  214. package/dist/help/dsl/docs/renameFile.md +36 -0
  215. package/dist/help/dsl/docs/rules.md +26 -0
  216. package/dist/help/dsl/full.md +175 -340
  217. package/dist/help/dsl/help-index.md +48 -43
  218. package/dist/help/dsl/snippets/agents.md +2 -2
  219. package/dist/help/dsl/tokens/qr.inline.examples.md +1 -1
  220. package/dist/help/dsl/topics/basics.md +1 -1
  221. package/dist/help/dsl/topics/config-setup.import-normalize.md +65 -65
  222. package/dist/help/dsl/topics/config-setup.import-rules.md +6 -5
  223. package/dist/help/dsl/topics/first-setup.md +6 -5
  224. package/dist/help/dsl/topics/help-protocol.md +4 -3
  225. package/dist/help/dsl/topics/import.base.md +36 -0
  226. package/dist/help/dsl/topics/import.rebase.md +83 -0
  227. package/dist/help/dsl/topics/inspect.aliasCandidates.md +37 -0
  228. package/dist/help/dsl/topics/inspect.code.md +1 -7
  229. package/dist/help/dsl/topics/inspect.file.md +10 -19
  230. package/dist/help/dsl/topics/inspect.graph.md +3 -17
  231. package/dist/help/dsl/topics/{inspect.md → inspect.shared.md} +13 -12
  232. package/dist/help/dsl/topics/modulePlan.md +21 -26
  233. package/dist/help/dsl/topics/move.md +17 -18
  234. package/dist/help/{docs/file.move.md → dsl/topics/moveToDir.md} +33 -35
  235. package/dist/help/dsl/topics/mutate.mixed.md +32 -0
  236. package/dist/help/dsl/topics/mutation.shared.md +53 -0
  237. package/dist/help/dsl/topics/patterns.md +3 -12
  238. package/dist/help/dsl/topics/qr.md +12 -6
  239. package/dist/help/dsl/topics/quick-map.md +36 -24
  240. package/dist/help/dsl/topics/recipe.file-layout.md +10 -10
  241. package/dist/help/dsl/topics/recipe.import-boundary.md +90 -0
  242. package/dist/help/dsl/topics/recipe.safe-artifact-probing.md +66 -0
  243. package/dist/help/dsl/topics/recipe.unfamiliar-area.md +62 -0
  244. package/dist/help/dsl/topics/recipes.md +18 -0
  245. package/dist/help/dsl/topics/rename.md +15 -15
  246. package/dist/help/dsl/topics/renameFile.md +34 -0
  247. package/dist/help/dsl/topics/rules.md +24 -0
  248. package/dist/help/full.md +175 -340
  249. package/dist/help/help-index.md +48 -43
  250. package/dist/help/help-meta.json +98 -48
  251. package/dist/help/index.md +52 -20
  252. package/dist/help/snippets/agents.md +2 -2
  253. package/dist/help/tokens/qr.inline.examples.md +1 -1
  254. package/dist/help/topics/basics.md +1 -1
  255. package/dist/help/topics/config-setup.import-normalize.md +65 -65
  256. package/dist/help/topics/config-setup.import-rules.md +6 -5
  257. package/dist/help/topics/first-setup.md +6 -5
  258. package/dist/help/topics/help-protocol.md +4 -3
  259. package/dist/help/topics/import.base.md +36 -0
  260. package/dist/help/topics/import.rebase.md +83 -0
  261. package/dist/help/topics/inspect.aliasCandidates.md +37 -0
  262. package/dist/help/topics/inspect.code.md +1 -7
  263. package/dist/help/topics/inspect.file.md +10 -19
  264. package/dist/help/topics/inspect.graph.md +3 -17
  265. package/dist/help/topics/{inspect.md → inspect.shared.md} +13 -12
  266. package/dist/help/topics/modulePlan.md +21 -26
  267. package/dist/help/topics/move.md +17 -18
  268. package/dist/help/{dsl/docs/file.move.md → topics/moveToDir.md} +33 -35
  269. package/dist/help/topics/mutate.mixed.md +32 -0
  270. package/dist/help/topics/mutation.shared.md +53 -0
  271. package/dist/help/topics/patterns.md +3 -12
  272. package/dist/help/topics/qr.md +12 -6
  273. package/dist/help/topics/quick-map.md +36 -24
  274. package/dist/help/topics/recipe.file-layout.md +10 -10
  275. package/dist/help/topics/recipe.import-boundary.md +90 -0
  276. package/dist/help/topics/recipe.safe-artifact-probing.md +66 -0
  277. package/dist/help/topics/recipe.unfamiliar-area.md +62 -0
  278. package/dist/help/topics/recipes.md +18 -0
  279. package/dist/help/topics/rename.md +15 -15
  280. package/dist/help/topics/renameFile.md +34 -0
  281. package/dist/help/topics/rules.md +24 -0
  282. package/dist/host/capabilities.js +56 -1
  283. package/dist/imports/standalone-import-analysis.js +602 -0
  284. package/dist/imports/standalone-import-model.js +2 -0
  285. package/dist/imports/standalone-import-process.js +66 -0
  286. package/dist/imports/standalone-import-worker.js +27 -0
  287. package/dist/imports/standalone-ts-project.js +147 -0
  288. package/dist/inspect/inspect-duplicates-service.js +526 -0
  289. package/dist/inspect/inspect-reverse-module-closure.js +338 -0
  290. package/dist/inspect/inspect-source-ranges.js +82 -0
  291. package/dist/inspect/inspect-source-shape.js +649 -0
  292. package/dist/inspect/standalone-inspect-analysis.js +319 -0
  293. package/dist/inspect/standalone-inspect-model.js +9 -0
  294. package/dist/inspect/standalone-inspect-process.js +55 -0
  295. package/dist/inspect/standalone-inspect-usages.js +274 -0
  296. package/dist/inspect/standalone-inspect-worker.js +13 -0
  297. package/dist/metrics/central-metrics.js +101 -2
  298. package/dist/mutation/concrete-edit-plan.js +157 -0
  299. package/dist/mutation/exports-star-collapse-preview.js +361 -0
  300. package/dist/mutation/exports-star-expand-apply.js +373 -0
  301. package/dist/mutation/exports-star-expand-preview.js +807 -0
  302. package/dist/mutation/file-impact-scan.js +182 -0
  303. package/dist/mutation/file-mutation-discovery.js +674 -0
  304. package/dist/mutation/file-mutation-eta.js +99 -0
  305. package/dist/mutation/file-mutation-standalone-apply.js +584 -0
  306. package/dist/mutation/file-mutation-standalone-planner.js +500 -0
  307. package/dist/mutation/file-mutation-tsserver-session.js +473 -0
  308. package/dist/mutation/mutation-estimate.js +45 -0
  309. package/dist/mutation/mutation-plan.js +467 -0
  310. package/dist/mutation/object-mutation-foundation.js +2 -0
  311. package/dist/mutation/object-mutation-partition.js +148 -0
  312. package/dist/mutation/object-pack-semantic-apply.js +507 -0
  313. package/dist/mutation/object-pack-semantic-preview.js +984 -0
  314. package/dist/mutation/object-unpack-semantic-preview.js +993 -0
  315. package/dist/mutation/package-manifest-impact.js +176 -0
  316. package/dist/mutation/rename-owner-worker-child.js +37 -0
  317. package/dist/mutation/rename-owner-worker.js +122 -0
  318. package/dist/mutation/runtime-cycle-query.js +66 -0
  319. package/dist/mutation/semantic-execution-progress.js +63 -0
  320. package/dist/mutation/semantic-export-index.js +474 -0
  321. package/dist/mutation/semantic-impact-scan.js +434 -0
  322. package/dist/mutation/semantic-model.js +2 -0
  323. package/dist/mutation/semantic-move-best-effort-planner.js +209 -0
  324. package/dist/mutation/semantic-move-config-worker-child.js +61 -0
  325. package/dist/mutation/semantic-move-config-worker.js +449 -0
  326. package/dist/mutation/semantic-move-declarations.js +94 -0
  327. package/dist/mutation/semantic-move-metrics.js +119 -0
  328. package/dist/mutation/semantic-move-model.js +2 -0
  329. package/dist/mutation/semantic-move-owner-authority.js +122 -0
  330. package/dist/mutation/semantic-move-owner-candidates.js +300 -0
  331. package/dist/mutation/semantic-move-owner-divergence-harness.js +474 -0
  332. package/dist/mutation/semantic-move-owner-divergence-runner.js +162 -0
  333. package/dist/mutation/semantic-move-plan-hash.js +56 -0
  334. package/dist/mutation/semantic-move-policy.js +360 -0
  335. package/dist/mutation/semantic-move-process.js +218 -0
  336. package/dist/mutation/semantic-move-provider-diagnostics.js +27 -0
  337. package/dist/mutation/semantic-move-standalone-engine.js +919 -0
  338. package/dist/mutation/semantic-move-standalone-planner.js +1553 -0
  339. package/dist/mutation/semantic-move-transaction.js +639 -0
  340. package/dist/mutation/semantic-mutation-engine.js +478 -0
  341. package/dist/mutation/semantic-mutation-runtime.js +521 -0
  342. package/dist/mutation/semantic-planner-retry.js +26 -0
  343. package/dist/mutation/semantic-program-roots.js +69 -0
  344. package/dist/mutation/semantic-rename-commonjs.js +229 -0
  345. package/dist/mutation/semantic-rename-config-worker-child.js +46 -0
  346. package/dist/mutation/semantic-rename-config-worker.js +498 -0
  347. package/dist/mutation/semantic-rename-locations.js +192 -0
  348. package/dist/mutation/semantic-rename-model.js +2 -0
  349. package/dist/mutation/semantic-rename-process.js +217 -0
  350. package/dist/mutation/semantic-rename-standalone-engine.js +302 -0
  351. package/dist/mutation/semantic-rename-standalone-planner.js +567 -0
  352. package/dist/mutation/semantic-rename-transaction.js +333 -0
  353. package/dist/mutation/semantic-unused-import-cleanup.js +248 -0
  354. package/dist/mutation/semantic-worker-retry.js +40 -0
  355. package/dist/mutation/semantic-workspace.js +804 -0
  356. package/dist/mutation/targeted-import-canonicalizer.js +359 -0
  357. package/dist/observability/config.js +206 -1
  358. package/dist/observability/context.js +59 -1
  359. package/dist/observability/failure-snapshot.js +124 -2
  360. package/dist/observability/recent.js +63 -2
  361. package/dist/payloads/read-stdin-json.js +212 -1
  362. package/dist/rg-wrapper/core.js +714 -6
  363. package/dist/rg-wrapper/options.js +125 -1
  364. package/dist/rtk-wrapper/core.js +144 -2
  365. package/dist/rtk-wrapper/git-safety.js +203 -0
  366. package/dist/rtk-wrapper/output-adapter.js +106 -0
  367. package/dist/runtime/buffered-process.js +114 -0
  368. package/dist/runtime/bundled-node.js +97 -1
  369. package/dist/runtime/command-lifecycle.js +2 -0
  370. package/dist/runtime/input-source.js +238 -1
  371. package/dist/runtime/node-cli-identity.js +37 -0
  372. package/dist/runtime/run-command.js +191 -1
  373. package/dist/selectors/parse-entities.js +84 -1
  374. package/dist/semantic/semantic-context-pool.js +830 -0
  375. package/dist/semantic/semantic-context-provider.js +416 -0
  376. package/dist/semantic/semantic-resident-admission.js +38 -0
  377. package/dist/semantic/semantic-worker-child.js +40 -0
  378. package/dist/semantic/semantic-worker-manager.js +460 -0
  379. package/dist/semantic/semantic-worker-protocol.js +2 -0
  380. package/dist/semantic/semantic-worker-runtime.js +38 -0
  381. package/dist/semantic/workspace-semantic-context-pools.js +136 -0
  382. package/dist/session/client.js +359 -1
  383. package/dist/session/daemon-state.js +185 -2
  384. package/dist/session/external-tool-coordinator.js +88 -0
  385. package/dist/session/external-tool-request.js +52 -0
  386. package/dist/session/lane-owner.js +116 -0
  387. package/dist/session/paths.js +71 -1
  388. package/dist/session/runtime-lifecycle.js +225 -0
  389. package/dist/session/runtime-shutdown.js +95 -0
  390. package/dist/session/server.js +1194 -7
  391. package/dist/session/session-health.js +27 -0
  392. package/dist/shared/agent-text.js +29 -1
  393. package/dist/shared/errors.js +496 -30
  394. package/dist/shared/event-loop.js +6 -1
  395. package/dist/shared/hints.js +37 -1
  396. package/dist/shared/metrics.js +43 -1
  397. package/dist/shared/presentation.js +69 -4
  398. package/dist/shared/stdin-examples.js +77 -1
  399. package/dist/shared/stdout.js +6 -2
  400. package/dist/shared/types.js +23 -1
  401. package/dist/tool-runtime/runtime-tools.js +120 -1
  402. package/dist/topology/availability.js +663 -0
  403. package/dist/topology/cache.js +130 -0
  404. package/dist/topology/candidates.js +372 -0
  405. package/dist/topology/core.js +903 -0
  406. package/dist/topology/dependency-snapshot.js +189 -0
  407. package/dist/topology/model.js +2 -0
  408. package/dist/topology/scope.js +100 -0
  409. package/dist/topology/ts-oracle-batch.js +529 -0
  410. package/dist/topology/ts-oracle-host.js +69 -0
  411. package/dist/topology/ts-oracle-model.js +2 -0
  412. package/dist/topology/ts-oracle.js +224 -0
  413. package/dist/topology/tsconfig-loader.js +105 -0
  414. package/dist/topology/workspace-project-index.js +542 -0
  415. package/dist/tracing/config.js +192 -2
  416. package/dist/tracing/failure-summary.js +100 -0
  417. package/dist/tracing/trace.js +318 -5
  418. package/dist/tsc-wrapper/core.js +697 -0
  419. package/dist/workers/control-plane/aib-control-plane-worker.cjs +32 -32
  420. package/dist/workers/control-plane/client-config.default.json +3 -3
  421. package/dist/workers/lexical-worker-child.js +27 -0
  422. package/dist/workers/lexical-worker-manager.js +394 -0
  423. package/dist/workers/lexical-worker-protocol.js +2 -0
  424. package/dist/workers/lexical-worker-runtime.js +25 -0
  425. package/dist/workers/owned-one-shot-process.js +115 -0
  426. package/dist/workers/product-storage.js +23 -1
  427. package/dist/workers/registry.js +241 -1
  428. package/package.json +8 -13
  429. package/scripts/postinstall.cjs +29 -29
  430. package/scripts/provision-runtime.cjs +411 -459
  431. package/dist/client/http-client.js +0 -1
  432. package/dist/client/transport-options.js +0 -1
  433. package/dist/client/websocket-client.js +0 -1
  434. package/dist/commands/entity-resolution.js +0 -1
  435. package/dist/commands/file-command.js +0 -1
  436. package/dist/commands/host-command.js +0 -1
  437. package/dist/commands/inspect-symbol-query.js +0 -1
  438. package/dist/commands/list-instances.js +0 -1
  439. package/dist/commands/module-plan-command.js +0 -1
  440. package/dist/commands/move-command.js +0 -1
  441. package/dist/commands/move-to-file.js +0 -2
  442. package/dist/commands/ping.js +0 -1
  443. package/dist/commands/refactor-command.js +0 -1
  444. package/dist/commands/rename-command.js +0 -1
  445. package/dist/commands/runtime-command.js +0 -4
  446. package/dist/commands/runtime-info.js +0 -1
  447. package/dist/commands/validate-module-plan.js +0 -2
  448. package/dist/compatibility/policy.js +0 -1
  449. package/dist/config/auto-start-ide.js +0 -1
  450. package/dist/discovery/registry.js +0 -1
  451. package/dist/discovery/select-instance.js +0 -1
  452. package/dist/help/docs/file.rename.md +0 -35
  453. package/dist/help/docs/mutation.md +0 -60
  454. package/dist/help/docs/refactor.batch.md +0 -44
  455. package/dist/help/dsl/docs/file.rename.md +0 -35
  456. package/dist/help/dsl/docs/mutation.md +0 -60
  457. package/dist/help/dsl/docs/refactor.batch.md +0 -44
  458. package/dist/help/dsl/topics/file.rename.md +0 -33
  459. package/dist/help/dsl/topics/mutation.md +0 -58
  460. package/dist/help/dsl/topics/refactor.batch.md +0 -33
  461. package/dist/help/topics/file.rename.md +0 -33
  462. package/dist/help/topics/mutation.md +0 -58
  463. package/dist/help/topics/refactor.batch.md +0 -33
  464. package/dist/ide-launch/common.cjs +0 -162
  465. package/dist/managed-host/extension-vsix-resolver.js +0 -1
  466. package/dist/managed-host/manage-serve-web-host.cjs +0 -141
  467. package/dist/managed-host/serve-web-autostart.js +0 -1
  468. package/dist/managed-host/serve-web-host.cjs +0 -2115
  469. package/dist/runtime/managed-runtime-provisioning.js +0 -1
  470. package/dist/shared/diagnostic-catalog.js +0 -1
  471. package/dist/shared/diagnostics.js +0 -1
  472. package/dist/shared/operations.js +0 -1
  473. package/dist/shared/protocol.js +0 -1
  474. package/dist/shared/routes.js +0 -1
  475. package/extension/vscode-refactor-bridge-extension.vsix +0 -0
  476. package/runtimes/launcher/linux-x64/aib +0 -0
  477. package/runtimes/launcher/win-x64/aib.exe +0 -0
@@ -1,459 +1,411 @@
1
- #!/usr/bin/env node
2
-
3
- const fs = require("node:fs");
4
- const os = require("node:os");
5
- const path = require("node:path");
6
- const crypto = require("node:crypto");
7
- const http = require("node:http");
8
- const https = require("node:https");
9
- const { spawnSync } = require("node:child_process");
10
-
11
- const packageRoot = path.resolve(__dirname, "..");
12
- const runtimesDir = path.join(packageRoot, "runtimes");
13
- const packageJson = JSON.parse(fs.readFileSync(path.join(packageRoot, "package.json"), "utf8"));
14
- const platformKey = `${process.platform}-${process.arch}`;
15
-
16
- const options = parseArgs(process.argv.slice(2));
17
- const reporter = createReporter(!options.quiet);
18
-
19
- main().catch((error) => {
20
- if (!options.quiet) {
21
- process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
22
- }
23
- process.exitCode = 1;
24
- });
25
-
26
- async function main() {
27
- cleanupOldTempDownloads();
28
-
29
- if (runtimeComplete()) {
30
- if (!options.quiet) {
31
- reporter.info(`aib runtime ready: ${path.relative(process.cwd(), runtimesDir) || runtimesDir}`);
32
- }
33
- return;
34
- }
35
-
36
- const source = options.archive
37
- ?? process.env.AIB_RUNTIME_ARCHIVE
38
- ?? process.env.npm_config_aib_runtime_archive
39
- ?? null;
40
- const url = options.url
41
- ?? process.env.AIB_RUNTIME_URL
42
- ?? process.env.npm_config_aib_runtime_url
43
- ?? null;
44
- const manifestSource = options.manifest
45
- ?? process.env.AIB_RUNTIME_MANIFEST
46
- ?? process.env.npm_config_aib_runtime_manifest
47
- ?? null;
48
- const manifestUrl = options.manifestUrl
49
- ?? process.env.AIB_RUNTIME_MANIFEST_URL
50
- ?? process.env.npm_config_aib_runtime_manifest_url
51
- ?? defaultManifestUrl();
52
-
53
- if (!source && !url && !manifestSource && !manifestUrl) {
54
- if (!options.quiet) {
55
- reporter.info("aib runtime not provisioned: set AIB_RUNTIME_ARCHIVE, AIB_RUNTIME_URL, AIB_RUNTIME_MANIFEST, or AIB_RUNTIME_MANIFEST_URL");
56
- }
57
- return;
58
- }
59
-
60
- reporter.info(`aib runtime: provisioning ${platformKey}`);
61
- const resolution = source || url
62
- ? { ...(source ? { archivePath: path.resolve(source), tempDir: null } : await downloadRuntimeArchive(url, "runtime archive")), expectedSha256: options.sha256 ?? process.env.AIB_RUNTIME_SHA256 ?? null }
63
- : await resolveFromManifest(manifestSource, manifestUrl);
64
- const archivePath = resolution.archivePath;
65
- try {
66
- if (!fs.existsSync(archivePath)) {
67
- throw new Error(`Runtime archive not found: ${archivePath}`);
68
- }
69
- if (resolution.expectedSha256) {
70
- reporter.info("aib runtime: verifying checksum");
71
- assertSha256(archivePath, resolution.expectedSha256);
72
- }
73
-
74
- fs.mkdirSync(runtimesDir, { recursive: true });
75
- reporter.info("aib runtime: extracting archive");
76
- extractRuntimeArchive(archivePath);
77
-
78
- if (!runtimeComplete()) {
79
- throw new Error(`Runtime archive did not provision a complete runtime under ${runtimesDir}`);
80
- }
81
- } finally {
82
- cleanupOwnedTempDownload(resolution.tempDir);
83
- }
84
-
85
- if (!options.quiet) {
86
- reporter.info("aib runtime: ready");
87
- }
88
- }
89
-
90
- function parseArgs(argv) {
91
- const parsed = {
92
- archive: null,
93
- url: null,
94
- manifest: null,
95
- manifestUrl: null,
96
- sha256: null,
97
- quiet: false
98
- };
99
- for (let index = 0; index < argv.length; index += 1) {
100
- const current = argv[index];
101
- const next = argv[index + 1];
102
- if (current === "--archive" && next) {
103
- parsed.archive = next;
104
- index += 1;
105
- continue;
106
- }
107
- if (current === "--url" && next) {
108
- parsed.url = next;
109
- index += 1;
110
- continue;
111
- }
112
- if (current === "--manifest" && next) {
113
- parsed.manifest = next;
114
- index += 1;
115
- continue;
116
- }
117
- if (current === "--manifest-url" && next) {
118
- parsed.manifestUrl = next;
119
- index += 1;
120
- continue;
121
- }
122
- if (current === "--sha256" && next) {
123
- parsed.sha256 = next;
124
- index += 1;
125
- continue;
126
- }
127
- if (current === "--quiet") {
128
- parsed.quiet = true;
129
- continue;
130
- }
131
- throw new Error(`Unknown argument: ${current}`);
132
- }
133
- return parsed;
134
- }
135
-
136
- async function resolveFromManifest(manifestSource, manifestUrl) {
137
- reporter.info("aib runtime: resolving manifest");
138
- const manifest = manifestSource
139
- ? JSON.parse(fs.readFileSync(path.resolve(manifestSource), "utf8"))
140
- : await downloadJson(manifestUrl);
141
- const artifact = manifest?.artifacts?.[platformKey];
142
- if (!artifact || typeof artifact !== "object") {
143
- throw new Error(`Runtime manifest does not contain an artifact for ${platformKey}`);
144
- }
145
- const archivePath = artifact.file && manifestSource
146
- ? path.resolve(path.dirname(path.resolve(manifestSource)), String(artifact.file))
147
- : null;
148
- const downloaded = !archivePath && artifact.url
149
- ? await downloadRuntimeArchive(String(artifact.url))
150
- : null;
151
- const resolvedArchivePath = archivePath ?? downloaded?.archivePath ?? null;
152
- const tempDir = downloaded?.tempDir ?? null;
153
- if (!resolvedArchivePath) {
154
- throw new Error(`Runtime manifest artifact for ${platformKey} has no url or local file.`);
155
- }
156
- return {
157
- archivePath: resolvedArchivePath,
158
- tempDir,
159
- expectedSha256: typeof artifact.sha256 === "string" ? artifact.sha256 : null
160
- };
161
- }
162
-
163
- async function downloadJson(url) {
164
- const download = await downloadRuntimeArchive(url, "runtime manifest");
165
- try {
166
- return JSON.parse(fs.readFileSync(download.archivePath, "utf8"));
167
- } finally {
168
- cleanupOwnedTempDownload(download.tempDir);
169
- }
170
- }
171
-
172
- function cleanupOldTempDownloads() {
173
- const cutoffMs = Date.now() - 24 * 60 * 60 * 1000;
174
- let entries = [];
175
- try {
176
- entries = fs.readdirSync(os.tmpdir(), { withFileTypes: true });
177
- } catch {
178
- return;
179
- }
180
- for (const entry of entries) {
181
- if (!entry.isDirectory() || !entry.name.startsWith("aib-runtime-")) {
182
- continue;
183
- }
184
- const tempDir = path.join(os.tmpdir(), entry.name);
185
- try {
186
- const stat = fs.statSync(tempDir);
187
- if (stat.mtimeMs < cutoffMs) {
188
- fs.rmSync(tempDir, { recursive: true, force: true });
189
- }
190
- } catch {
191
- // Best-effort cleanup only.
192
- }
193
- }
194
- }
195
-
196
- function cleanupOwnedTempDownload(tempDir) {
197
- if (!tempDir) {
198
- return;
199
- }
200
- try {
201
- const resolvedTemp = path.resolve(tempDir);
202
- const resolvedOsTemp = path.resolve(os.tmpdir());
203
- const relative = path.relative(resolvedOsTemp, resolvedTemp);
204
- if (path.basename(resolvedTemp).startsWith("aib-runtime-")
205
- && relative
206
- && !relative.startsWith("..")
207
- && !path.isAbsolute(relative)) {
208
- fs.rmSync(resolvedTemp, { recursive: true, force: true });
209
- }
210
- } catch {
211
- // Best-effort cleanup only.
212
- }
213
- }
214
-
215
- function defaultManifestUrl() {
216
- const version = packageJson.version;
217
- if (!version) {
218
- return null;
219
- }
220
- return `https://github.com/ratiomark/aib-runtime/releases/download/v${version}/aib-runtime-manifest.json`;
221
- }
222
-
223
- function runtimeComplete() {
224
- return fs.existsSync(path.join(runtimesDir, "code-server", "node_modules", "code-server", "out", "node", "entry.js"))
225
- && Boolean(findPackagedBrowserRuntime())
226
- && Boolean(findPackagedNodeRuntime())
227
- && runtimePlatformStatus().ok;
228
- }
229
-
230
- function runtimePlatformStatus() {
231
- const markerPath = path.join(runtimesDir, ".aib-runtime-platform.json");
232
- if (!fs.existsSync(markerPath)) {
233
- return { ok: true, reason: "missing", expectedPlatformKey: platformKey, actualPlatformKey: null };
234
- }
235
- try {
236
- const marker = JSON.parse(fs.readFileSync(markerPath, "utf8"));
237
- const actualPlatformKey = typeof marker.platformKey === "string"
238
- ? marker.platformKey
239
- : typeof marker.platform === "string" && typeof marker.arch === "string"
240
- ? `${marker.platform}-${marker.arch}`
241
- : null;
242
- return {
243
- ok: actualPlatformKey === platformKey,
244
- reason: actualPlatformKey === platformKey ? "ok" : "mismatch",
245
- expectedPlatformKey: platformKey,
246
- actualPlatformKey
247
- };
248
- } catch {
249
- return { ok: false, reason: "invalid", expectedPlatformKey: platformKey, actualPlatformKey: null };
250
- }
251
- }
252
-
253
- function findPackagedNodeRuntime() {
254
- const platformDir = nodeRuntimePlatformDir();
255
- if (!platformDir) {
256
- return null;
257
- }
258
- const candidate = process.platform === "win32"
259
- ? path.join(runtimesDir, "node", platformDir, "node.exe")
260
- : path.join(runtimesDir, "node", platformDir, "bin", "node");
261
- return fs.existsSync(candidate) ? candidate : null;
262
- }
263
-
264
- function nodeRuntimePlatformDir() {
265
- if (process.platform === "win32" && process.arch === "x64") {
266
- return "win-x64";
267
- }
268
- if (process.platform === "linux" && process.arch === "x64") {
269
- return "linux-x64";
270
- }
271
- if (process.platform === "linux" && process.arch === "arm64") {
272
- return "linux-arm64";
273
- }
274
- if (process.platform === "darwin" && process.arch === "x64") {
275
- return "darwin-x64";
276
- }
277
- if (process.platform === "darwin" && process.arch === "arm64") {
278
- return "darwin-arm64";
279
- }
280
- return null;
281
- }
282
-
283
- function findPackagedBrowserRuntime() {
284
- const roots = [
285
- path.join(runtimesDir, "browser"),
286
- path.join(runtimesDir, "chrome"),
287
- path.join(runtimesDir, "chromium")
288
- ];
289
- const executableNames = process.platform === "win32"
290
- ? new Set(["chrome.exe", "chromium.exe", "msedge.exe"])
291
- : new Set(["chrome", "chromium"]);
292
- for (const root of roots) {
293
- const found = findFirstExecutable(root, executableNames, 5);
294
- if (found) {
295
- return found;
296
- }
297
- }
298
- return null;
299
- }
300
-
301
- function findFirstExecutable(root, executableNames, maxDepth) {
302
- if (!fs.existsSync(root) || maxDepth < 0) {
303
- return null;
304
- }
305
- let entries;
306
- try {
307
- entries = fs.readdirSync(root, { withFileTypes: true });
308
- } catch {
309
- return null;
310
- }
311
- for (const entry of entries) {
312
- const entryPath = path.join(root, entry.name);
313
- if (entry.isFile() && executableNames.has(entry.name)) {
314
- return entryPath;
315
- }
316
- }
317
- for (const entry of entries) {
318
- if (!entry.isDirectory()) {
319
- continue;
320
- }
321
- const found = findFirstExecutable(path.join(root, entry.name), executableNames, maxDepth - 1);
322
- if (found) {
323
- return found;
324
- }
325
- }
326
- return null;
327
- }
328
-
329
- function extractRuntimeArchive(archivePath) {
330
- const result = spawnSync("tar", ["-xzf", archivePath, "-C", packageRoot], {
331
- cwd: packageRoot,
332
- encoding: "utf8",
333
- stdio: ["ignore", "pipe", "pipe"],
334
- windowsHide: true,
335
- timeout: 600_000
336
- });
337
- if (result.status !== 0) {
338
- throw new Error(`Failed to extract runtime archive: ${result.stderr || result.stdout || result.error?.message || `status ${result.status}`}`);
339
- }
340
- }
341
-
342
- function assertSha256(filePath, expectedSha256) {
343
- const hash = crypto.createHash("sha256");
344
- hash.update(fs.readFileSync(filePath));
345
- const actual = hash.digest("hex");
346
- if (actual.toLowerCase() !== String(expectedSha256).toLowerCase()) {
347
- throw new Error(`Runtime archive checksum mismatch: expected ${expectedSha256}, got ${actual}`);
348
- }
349
- }
350
-
351
- function downloadRuntimeArchive(url, label = "runtime archive") {
352
- return new Promise((resolve, reject) => {
353
- if (!url) {
354
- reject(new Error("Runtime URL is empty."));
355
- return;
356
- }
357
- const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "aib-runtime-"));
358
- const targetPath = path.join(tempDir, path.basename(new URL(url).pathname) || "runtime.tgz");
359
- const file = fs.createWriteStream(targetPath);
360
- const client = url.startsWith("https:") ? https : http;
361
- const request = client.get(url, (response) => {
362
- if (response.statusCode && response.statusCode >= 300 && response.statusCode < 400 && response.headers.location) {
363
- file.close();
364
- fs.rmSync(targetPath, { force: true });
365
- cleanupOwnedTempDownload(tempDir);
366
- downloadRuntimeArchive(new URL(response.headers.location, url).toString(), label).then(resolve, reject);
367
- return;
368
- }
369
- if (response.statusCode !== 200) {
370
- file.close();
371
- fs.rmSync(targetPath, { force: true });
372
- cleanupOwnedTempDownload(tempDir);
373
- reject(new Error(`Runtime download failed with HTTP ${response.statusCode}: ${url}`));
374
- return;
375
- }
376
- const totalBytes = Number.parseInt(String(response.headers["content-length"] ?? ""), 10);
377
- const progress = reporter.startProgress(`aib runtime: downloading ${label}`, Number.isFinite(totalBytes) ? totalBytes : null);
378
- response.on("data", (chunk) => progress.add(chunk.length));
379
- response.pipe(file);
380
- file.on("finish", () => {
381
- file.close(() => {
382
- progress.done();
383
- resolve({ archivePath: targetPath, tempDir });
384
- });
385
- });
386
- });
387
- request.on("error", (error) => {
388
- file.close();
389
- fs.rmSync(targetPath, { force: true });
390
- cleanupOwnedTempDownload(tempDir);
391
- reject(error);
392
- });
393
- });
394
- }
395
-
396
- function createReporter(enabled) {
397
- const stream = process.stderr;
398
- return {
399
- info(message) {
400
- if (!enabled) {
401
- return;
402
- }
403
- stream.write(`${message}\n`);
404
- },
405
- startProgress(label, totalBytes) {
406
- if (!enabled) {
407
- return { add() {}, done() {} };
408
- }
409
- let downloadedBytes = 0;
410
- let ended = false;
411
- let nextPercent = 10;
412
- const totalKnown = Number.isFinite(totalBytes) && totalBytes > 0;
413
- const showPercentProgress = totalKnown && totalBytes >= 1024 * 1024;
414
- stream.write(totalKnown
415
- ? `${label} ${formatBytes(totalBytes)}\n`
416
- : `${label}\n`);
417
- const writeProgress = () => {
418
- if (!showPercentProgress) {
419
- return;
420
- }
421
- const percent = Math.floor(Math.min(100, (downloadedBytes / totalBytes) * 100));
422
- while (percent >= nextPercent && nextPercent <= 100) {
423
- const thresholdBytes = Math.min(totalBytes, Math.round((totalBytes * nextPercent) / 100));
424
- stream.write(`aib runtime: ${nextPercent}% ${formatBytes(thresholdBytes)} / ${formatBytes(totalBytes)}\n`);
425
- nextPercent += 10;
426
- }
427
- };
428
- return {
429
- add(byteCount) {
430
- downloadedBytes += byteCount;
431
- writeProgress();
432
- },
433
- done() {
434
- if (ended) {
435
- return;
436
- }
437
- ended = true;
438
- downloadedBytes = Math.max(downloadedBytes, totalBytes ?? downloadedBytes);
439
- writeProgress();
440
- }
441
- };
442
- }
443
- };
444
- }
445
-
446
- function formatBytes(bytes) {
447
- if (!Number.isFinite(bytes) || bytes < 0) {
448
- return "0 B";
449
- }
450
- const units = ["B", "KB", "MB", "GB"];
451
- let value = bytes;
452
- let unitIndex = 0;
453
- while (value >= 1024 && unitIndex < units.length - 1) {
454
- value /= 1024;
455
- unitIndex += 1;
456
- }
457
- const digits = value >= 100 || unitIndex === 0 ? 0 : value >= 10 ? 1 : 2;
458
- return `${value.toFixed(digits)} ${units[unitIndex]}`;
459
- }
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require("node:fs");
4
+ const os = require("node:os");
5
+ const path = require("node:path");
6
+ const crypto = require("node:crypto");
7
+ const http = require("node:http");
8
+ const https = require("node:https");
9
+ const { spawnSync } = require("node:child_process");
10
+
11
+ const packageRoot = path.resolve(__dirname, "..");
12
+ const runtimesDir = path.join(packageRoot, "runtimes");
13
+ const packageJson = JSON.parse(fs.readFileSync(path.join(packageRoot, "package.json"), "utf8"));
14
+ const platformKey = `${process.platform}-${process.arch}`;
15
+
16
+ const options = parseArgs(process.argv.slice(2));
17
+ const reporter = createReporter(!options.quiet);
18
+
19
+ main().catch((error) => {
20
+ if (!options.quiet) {
21
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
22
+ }
23
+ process.exitCode = 1;
24
+ });
25
+
26
+ async function main() {
27
+ cleanupOldTempDownloads();
28
+
29
+ if (runtimeComplete()) {
30
+ if (!options.quiet) {
31
+ reporter.info(`aib runtime ready: ${path.relative(process.cwd(), runtimesDir) || runtimesDir}`);
32
+ }
33
+ return;
34
+ }
35
+
36
+ const source = options.archive
37
+ ?? process.env.AIB_RUNTIME_ARCHIVE
38
+ ?? process.env.npm_config_aib_runtime_archive
39
+ ?? null;
40
+ const url = options.url
41
+ ?? process.env.AIB_RUNTIME_URL
42
+ ?? process.env.npm_config_aib_runtime_url
43
+ ?? null;
44
+ const manifestSource = options.manifest
45
+ ?? process.env.AIB_RUNTIME_MANIFEST
46
+ ?? process.env.npm_config_aib_runtime_manifest
47
+ ?? null;
48
+ const manifestUrl = options.manifestUrl
49
+ ?? process.env.AIB_RUNTIME_MANIFEST_URL
50
+ ?? process.env.npm_config_aib_runtime_manifest_url
51
+ ?? defaultManifestUrl();
52
+
53
+ if (!source && !url && !manifestSource && !manifestUrl) {
54
+ if (!options.quiet) {
55
+ reporter.info("aib runtime not provisioned: set AIB_RUNTIME_ARCHIVE, AIB_RUNTIME_URL, AIB_RUNTIME_MANIFEST, or AIB_RUNTIME_MANIFEST_URL");
56
+ }
57
+ return;
58
+ }
59
+
60
+ reporter.info(`aib runtime: provisioning ${platformKey}`);
61
+ const resolution = source || url
62
+ ? { ...(source ? { archivePath: path.resolve(source), tempDir: null } : await downloadRuntimeArchive(url, "runtime archive")), expectedSha256: options.sha256 ?? process.env.AIB_RUNTIME_SHA256 ?? null }
63
+ : await resolveFromManifest(manifestSource, manifestUrl);
64
+ const archivePath = resolution.archivePath;
65
+ try {
66
+ if (!fs.existsSync(archivePath)) {
67
+ throw new Error(`Runtime archive not found: ${archivePath}`);
68
+ }
69
+ if (resolution.expectedSha256) {
70
+ reporter.info("aib runtime: verifying checksum");
71
+ assertSha256(archivePath, resolution.expectedSha256);
72
+ }
73
+
74
+ fs.mkdirSync(runtimesDir, { recursive: true });
75
+ reporter.info("aib runtime: extracting archive");
76
+ extractRuntimeArchive(archivePath);
77
+
78
+ if (!runtimeComplete()) {
79
+ throw new Error(`Runtime archive did not provision a complete runtime under ${runtimesDir}`);
80
+ }
81
+ } finally {
82
+ cleanupOwnedTempDownload(resolution.tempDir);
83
+ }
84
+
85
+ if (!options.quiet) {
86
+ reporter.info("aib runtime: ready");
87
+ }
88
+ }
89
+
90
+ function parseArgs(argv) {
91
+ const parsed = {
92
+ archive: null,
93
+ url: null,
94
+ manifest: null,
95
+ manifestUrl: null,
96
+ sha256: null,
97
+ quiet: false
98
+ };
99
+ for (let index = 0; index < argv.length; index += 1) {
100
+ const current = argv[index];
101
+ const next = argv[index + 1];
102
+ if (current === "--archive" && next) {
103
+ parsed.archive = next;
104
+ index += 1;
105
+ continue;
106
+ }
107
+ if (current === "--url" && next) {
108
+ parsed.url = next;
109
+ index += 1;
110
+ continue;
111
+ }
112
+ if (current === "--manifest" && next) {
113
+ parsed.manifest = next;
114
+ index += 1;
115
+ continue;
116
+ }
117
+ if (current === "--manifest-url" && next) {
118
+ parsed.manifestUrl = next;
119
+ index += 1;
120
+ continue;
121
+ }
122
+ if (current === "--sha256" && next) {
123
+ parsed.sha256 = next;
124
+ index += 1;
125
+ continue;
126
+ }
127
+ if (current === "--quiet") {
128
+ parsed.quiet = true;
129
+ continue;
130
+ }
131
+ throw new Error(`Unknown argument: ${current}`);
132
+ }
133
+ return parsed;
134
+ }
135
+
136
+ async function resolveFromManifest(manifestSource, manifestUrl) {
137
+ reporter.info("aib runtime: resolving manifest");
138
+ const manifest = manifestSource
139
+ ? JSON.parse(fs.readFileSync(path.resolve(manifestSource), "utf8"))
140
+ : await downloadJson(manifestUrl);
141
+ const artifact = manifest?.artifacts?.[platformKey];
142
+ if (!artifact || typeof artifact !== "object") {
143
+ throw new Error(`Runtime manifest does not contain an artifact for ${platformKey}`);
144
+ }
145
+ const archivePath = artifact.file && manifestSource
146
+ ? path.resolve(path.dirname(path.resolve(manifestSource)), String(artifact.file))
147
+ : null;
148
+ const downloaded = !archivePath && artifact.url
149
+ ? await downloadRuntimeArchive(String(artifact.url))
150
+ : null;
151
+ const resolvedArchivePath = archivePath ?? downloaded?.archivePath ?? null;
152
+ const tempDir = downloaded?.tempDir ?? null;
153
+ if (!resolvedArchivePath) {
154
+ throw new Error(`Runtime manifest artifact for ${platformKey} has no url or local file.`);
155
+ }
156
+ return {
157
+ archivePath: resolvedArchivePath,
158
+ tempDir,
159
+ expectedSha256: typeof artifact.sha256 === "string" ? artifact.sha256 : null
160
+ };
161
+ }
162
+
163
+ async function downloadJson(url) {
164
+ const download = await downloadRuntimeArchive(url, "runtime manifest");
165
+ try {
166
+ return JSON.parse(fs.readFileSync(download.archivePath, "utf8"));
167
+ } finally {
168
+ cleanupOwnedTempDownload(download.tempDir);
169
+ }
170
+ }
171
+
172
+ function cleanupOldTempDownloads() {
173
+ const cutoffMs = Date.now() - 24 * 60 * 60 * 1000;
174
+ let entries = [];
175
+ try {
176
+ entries = fs.readdirSync(os.tmpdir(), { withFileTypes: true });
177
+ } catch {
178
+ return;
179
+ }
180
+ for (const entry of entries) {
181
+ if (!entry.isDirectory() || !entry.name.startsWith("aib-runtime-")) {
182
+ continue;
183
+ }
184
+ const tempDir = path.join(os.tmpdir(), entry.name);
185
+ try {
186
+ const stat = fs.statSync(tempDir);
187
+ if (stat.mtimeMs < cutoffMs) {
188
+ fs.rmSync(tempDir, { recursive: true, force: true });
189
+ }
190
+ } catch {
191
+ // Best-effort cleanup only.
192
+ }
193
+ }
194
+ }
195
+
196
+ function cleanupOwnedTempDownload(tempDir) {
197
+ if (!tempDir) {
198
+ return;
199
+ }
200
+ try {
201
+ const resolvedTemp = path.resolve(tempDir);
202
+ const resolvedOsTemp = path.resolve(os.tmpdir());
203
+ const relative = path.relative(resolvedOsTemp, resolvedTemp);
204
+ if (path.basename(resolvedTemp).startsWith("aib-runtime-")
205
+ && relative
206
+ && !relative.startsWith("..")
207
+ && !path.isAbsolute(relative)) {
208
+ fs.rmSync(resolvedTemp, { recursive: true, force: true });
209
+ }
210
+ } catch {
211
+ // Best-effort cleanup only.
212
+ }
213
+ }
214
+
215
+ function defaultManifestUrl() {
216
+ const version = packageJson.version;
217
+ if (!version) {
218
+ return null;
219
+ }
220
+ return `https://github.com/ratiomark/aib-runtime/releases/download/v${version}/aib-runtime-manifest.json`;
221
+ }
222
+
223
+ function runtimeComplete() {
224
+ return Boolean(findPackagedNodeRuntime())
225
+ && runtimePlatformStatus().ok;
226
+ }
227
+
228
+ function runtimePlatformStatus() {
229
+ const markerPath = path.join(runtimesDir, ".aib-runtime-platform.json");
230
+ if (!fs.existsSync(markerPath)) {
231
+ return { ok: true, reason: "missing", expectedPlatformKey: platformKey, actualPlatformKey: null };
232
+ }
233
+ try {
234
+ const marker = JSON.parse(fs.readFileSync(markerPath, "utf8"));
235
+ const actualPlatformKey = typeof marker.platformKey === "string"
236
+ ? marker.platformKey
237
+ : typeof marker.platform === "string" && typeof marker.arch === "string"
238
+ ? `${marker.platform}-${marker.arch}`
239
+ : null;
240
+ return {
241
+ ok: actualPlatformKey === platformKey,
242
+ reason: actualPlatformKey === platformKey ? "ok" : "mismatch",
243
+ expectedPlatformKey: platformKey,
244
+ actualPlatformKey
245
+ };
246
+ } catch {
247
+ return { ok: false, reason: "invalid", expectedPlatformKey: platformKey, actualPlatformKey: null };
248
+ }
249
+ }
250
+
251
+ function findPackagedNodeRuntime() {
252
+ const platformDir = nodeRuntimePlatformDir();
253
+ if (!platformDir) {
254
+ return null;
255
+ }
256
+ const candidate = process.platform === "win32"
257
+ ? path.join(runtimesDir, "node", platformDir, "node.exe")
258
+ : path.join(runtimesDir, "node", platformDir, "bin", "node");
259
+ return fs.existsSync(candidate) ? candidate : null;
260
+ }
261
+
262
+ function nodeRuntimePlatformDir() {
263
+ if (process.platform === "win32" && process.arch === "x64") {
264
+ return "win-x64";
265
+ }
266
+ if (process.platform === "linux" && process.arch === "x64") {
267
+ return "linux-x64";
268
+ }
269
+ if (process.platform === "linux" && process.arch === "arm64") {
270
+ return "linux-arm64";
271
+ }
272
+ if (process.platform === "darwin" && process.arch === "x64") {
273
+ return "darwin-x64";
274
+ }
275
+ if (process.platform === "darwin" && process.arch === "arm64") {
276
+ return "darwin-arm64";
277
+ }
278
+ return null;
279
+ }
280
+
281
+ function extractRuntimeArchive(archivePath) {
282
+ const result = spawnSync("tar", ["-xzf", archivePath, "-C", packageRoot], {
283
+ cwd: packageRoot,
284
+ encoding: "utf8",
285
+ stdio: ["ignore", "pipe", "pipe"],
286
+ windowsHide: true,
287
+ timeout: 600_000
288
+ });
289
+ if (result.status !== 0) {
290
+ throw new Error(`Failed to extract runtime archive: ${result.stderr || result.stdout || result.error?.message || `status ${result.status}`}`);
291
+ }
292
+ }
293
+
294
+ function assertSha256(filePath, expectedSha256) {
295
+ const hash = crypto.createHash("sha256");
296
+ hash.update(fs.readFileSync(filePath));
297
+ const actual = hash.digest("hex");
298
+ if (actual.toLowerCase() !== String(expectedSha256).toLowerCase()) {
299
+ throw new Error(`Runtime archive checksum mismatch: expected ${expectedSha256}, got ${actual}`);
300
+ }
301
+ }
302
+
303
+ function downloadRuntimeArchive(url, label = "runtime archive") {
304
+ return new Promise((resolve, reject) => {
305
+ if (!url) {
306
+ reject(new Error("Runtime URL is empty."));
307
+ return;
308
+ }
309
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "aib-runtime-"));
310
+ const targetPath = path.join(tempDir, path.basename(new URL(url).pathname) || "runtime.tgz");
311
+ const file = fs.createWriteStream(targetPath);
312
+ const client = url.startsWith("https:") ? https : http;
313
+ const request = client.get(url, (response) => {
314
+ if (response.statusCode && response.statusCode >= 300 && response.statusCode < 400 && response.headers.location) {
315
+ file.close();
316
+ fs.rmSync(targetPath, { force: true });
317
+ cleanupOwnedTempDownload(tempDir);
318
+ downloadRuntimeArchive(new URL(response.headers.location, url).toString(), label).then(resolve, reject);
319
+ return;
320
+ }
321
+ if (response.statusCode !== 200) {
322
+ file.close();
323
+ fs.rmSync(targetPath, { force: true });
324
+ cleanupOwnedTempDownload(tempDir);
325
+ reject(new Error(`Runtime download failed with HTTP ${response.statusCode}: ${url}`));
326
+ return;
327
+ }
328
+ const totalBytes = Number.parseInt(String(response.headers["content-length"] ?? ""), 10);
329
+ const progress = reporter.startProgress(`aib runtime: downloading ${label}`, Number.isFinite(totalBytes) ? totalBytes : null);
330
+ response.on("data", (chunk) => progress.add(chunk.length));
331
+ response.pipe(file);
332
+ file.on("finish", () => {
333
+ file.close(() => {
334
+ progress.done();
335
+ resolve({ archivePath: targetPath, tempDir });
336
+ });
337
+ });
338
+ });
339
+ request.on("error", (error) => {
340
+ file.close();
341
+ fs.rmSync(targetPath, { force: true });
342
+ cleanupOwnedTempDownload(tempDir);
343
+ reject(error);
344
+ });
345
+ });
346
+ }
347
+
348
+ function createReporter(enabled) {
349
+ const stream = process.stderr;
350
+ return {
351
+ info(message) {
352
+ if (!enabled) {
353
+ return;
354
+ }
355
+ stream.write(`${message}\n`);
356
+ },
357
+ startProgress(label, totalBytes) {
358
+ if (!enabled) {
359
+ return { add() {}, done() {} };
360
+ }
361
+ let downloadedBytes = 0;
362
+ let ended = false;
363
+ let nextPercent = 10;
364
+ const totalKnown = Number.isFinite(totalBytes) && totalBytes > 0;
365
+ const showPercentProgress = totalKnown && totalBytes >= 1024 * 1024;
366
+ stream.write(totalKnown
367
+ ? `${label} ${formatBytes(totalBytes)}\n`
368
+ : `${label}\n`);
369
+ const writeProgress = () => {
370
+ if (!showPercentProgress) {
371
+ return;
372
+ }
373
+ const percent = Math.floor(Math.min(100, (downloadedBytes / totalBytes) * 100));
374
+ while (percent >= nextPercent && nextPercent <= 100) {
375
+ const thresholdBytes = Math.min(totalBytes, Math.round((totalBytes * nextPercent) / 100));
376
+ stream.write(`aib runtime: ${nextPercent}% ${formatBytes(thresholdBytes)} / ${formatBytes(totalBytes)}\n`);
377
+ nextPercent += 10;
378
+ }
379
+ };
380
+ return {
381
+ add(byteCount) {
382
+ downloadedBytes += byteCount;
383
+ writeProgress();
384
+ },
385
+ done() {
386
+ if (ended) {
387
+ return;
388
+ }
389
+ ended = true;
390
+ downloadedBytes = Math.max(downloadedBytes, totalBytes ?? downloadedBytes);
391
+ writeProgress();
392
+ }
393
+ };
394
+ }
395
+ };
396
+ }
397
+
398
+ function formatBytes(bytes) {
399
+ if (!Number.isFinite(bytes) || bytes < 0) {
400
+ return "0 B";
401
+ }
402
+ const units = ["B", "KB", "MB", "GB"];
403
+ let value = bytes;
404
+ let unitIndex = 0;
405
+ while (value >= 1024 && unitIndex < units.length - 1) {
406
+ value /= 1024;
407
+ unitIndex += 1;
408
+ }
409
+ const digits = value >= 100 || unitIndex === 0 ? 0 : value >= 10 ? 1 : 2;
410
+ return `${value.toFixed(digits)} ${units[unitIndex]}`;
411
+ }