@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,4 +1,794 @@
1
- "use strict";var ie=exports&&exports.__createBinding||(Object.create?(function(e,n,t,r){r===void 0&&(r=t);var i=Object.getOwnPropertyDescriptor(n,t);(!i||("get"in i?!n.__esModule:i.writable||i.configurable))&&(i={enumerable:!0,get:function(){return n[t]}}),Object.defineProperty(e,r,i)}):(function(e,n,t,r){r===void 0&&(r=t),e[r]=n[t]})),oe=exports&&exports.__setModuleDefault||(Object.create?(function(e,n){Object.defineProperty(e,"default",{enumerable:!0,value:n})}):function(e,n){e.default=n}),T=exports&&exports.__importStar||(function(){var e=function(n){return e=Object.getOwnPropertyNames||function(t){var r=[];for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(r[r.length]=i);return r},e(n)};return function(n){if(n&&n.__esModule)return n;var t={};if(n!=null)for(var r=e(n),i=0;i<r.length;i++)r[i]!=="default"&&ie(t,n,r[i]);return oe(t,n),t}})();Object.defineProperty(exports,"__esModule",{value:!0}),exports.runRenameEntities=de,exports.readCachedRenameExecution=ge;const N=T(require("node:fs")),d=T(require("node:path")),R=require("zod"),se=require("../client/http-client"),v=require("../config/env-vars"),ae=require("../config/product-storage"),ce=require("../shared/routes"),le=require("../shared/protocol"),E=require("../shared/agent-text"),I=require("../shared/errors"),_=require("./shared"),ue=require("../selectors/parse-entities"),fe=require("./entity-resolution"),me=require("../shared/types"),$=require("./rename-preview-cache"),x=require("./rename-execution-cache"),j=require("./mutation-execution-cache"),pe=require("./inspect-symbol-query"),V=require("./rename-input"),M=require("../metrics/central-metrics"),K=R.z.object({sourceFile:R.z.string().min(1).optional(),file:R.z.string().min(1).optional(),renames:V.RenamesInputSchema,execute:R.z.boolean().optional()}).superRefine((e,n)=>{!e.sourceFile&&!e.file&&n.addIssue({code:"custom",path:["sourceFile"],message:"rename expects sourceFile or file."})}).transform(e=>({sourceFile:e.sourceFile??e.file??"",renames:(0,V.normalizeRenamesInput)(e.renames),...e.execute!==void 0?{execute:e.execute}:{}}));async function de(e,n,t={},r=[]){if(r.includes("--help"))return ot();const i=ne(r,"--preview")??ne(r,"--preview-id");if(i){const s=W();return s>0?he(e,i,t,s):ye(e,i,t)}const o=K.parse(n);return o.execute===!0&&W()>0?U(e,o,t,"execute",W()):P(e,o,t)}async function ye(e,n,t){const r=z(e,n),i=B(r),o=await P(e,i,t,{previewId:n});return H(o,r)}async function he(e,n,t,r){const i=z(e,n),o=B(i);return U(e,o,t,"apply",r,{previewId:n,record:i})}function z(e,n){const t=(0,$.readRenamePreviewRecord)(e,n);if((0,$.hashFile)(t.sourceFile)!==t.sourceHash)throw new I.CliError("RENAME_PREVIEW_SOURCE_CHANGED","Source file changed after rename preview. Rerun rename preview.",{previewId:n,sourceFile:S(e,t.sourceFile)});return t}function B(e){return K.parse({...e.normalizedPayload,execute:!0})}function H(e,n){const t=A(e.api)&&e.api.status==="preserved-via-alias",r=e.ok===!1?"Fix the rename request and rerun preview.":t||e.api!==void 0?"If public API rename is intended, update consumers explicitly.":null,i=A(n.previewResult)?n.previewResult.api:void 0,o={...e,operation:"rename.apply",...i!==void 0?{api:i}:{},...r?{next:r}:{}};return(0,E.attachAgentText)(o,G(o))}async function U(e,n,t,r,i,o){const s=(0,x.buildRenameExecutionId)(),c=`rename.${r}`,l=Fe(n),a=(0,x.createRenameExecutionStatus)(e,s,c,J(n));(0,x.writeRenameExecutionStatus)(e,a);const p=Date.now(),h=$e(),m=we(()=>(0,ae.runWithProductStorageOverride)(h[v.CLI_ENV.productStorageDir],()=>_e(h,async()=>{try{const u=o?H(await P(e,n,t,{previewId:o.previewId}),o.record):await P(e,n,t),f=Se(u);return a.status=u.ok===!1?"failed":"completed",a.phase="completed",a.completedRows=f.filter(g=>g.ok!==!1).length,a.failedRows=f.filter(g=>g.ok===!1).length,a.filesWritten=xe(u),a.result=u,u.ok===!1&&(a.error=rt(u.code)??"RENAME_FAILED"),(0,x.writeRenameExecutionStatus)(e,a),u}catch(u){throw a.status="failed",a.phase="completed",a.error=u instanceof Error?u.message:String(u),(0,x.writeRenameExecutionStatus)(e,a),u}}))),y=await(0,j.waitForMutationDeadline)(m,i);return y.status==="result"?y.result:(m.catch(()=>{}),ve(e,s,c,l,Date.now()-p))}async function P(e,n,t,r){await Ne();const i=await(0,_.resolveCompatibleTargetInstance)(e,le.CLI_COMMAND_IDS.renameEntities,t),o=await(0,_.fetchEffectiveConfig)(i.entry,t),s=Ie(e,n.sourceFile),c=n.execute===!0,l=(0,ue.parseEntitySelectors)(n.renames.map(f=>f.entity),o),a=new Map;for(const f of n.renames)a.set(f.entity.trim(),f);await(0,fe.ensureSelectorsResolvable)(i.entry,s,l,o,(0,_.extensionRequestOptions)(t));const p=[];for(const f of l){const g=a.get(f.raw);if(!g)throw new Error(`Rename operation not found for selector: ${f.raw}`);const F=(0,M.startCentralMetricSpan)({kind:"mutation.entity",operation:c?"rename.execute":"rename.preview",cwd:d.resolve(e),sourceFile:S(e,s),entity:f.raw,newName:g.newName,totalEntities:l.length});try{const b=await(0,se.postJson)(i.entry,ce.EXTENSION_ROUTES.renameSymbol,{sourceFile:s,symbolName:f.symbolName,symbolKind:f.symbolKind,...f.parentName?{parentName:f.parentName}:{},newName:g.newName,execute:c,impactMetrics:(0,M.mutationImpactMetricsEnabled)()},(0,_.extensionRequestOptions)(t)),O=Pe(e,o,f,g.newName,b);p.push(O),F.end(Re(b,O,l.length))}catch(b){p.push(Me(o,f,g.newName,b)),F.end({ok:!1,code:b instanceof I.CliError?b.code:"RENAME_FAILED",error:b instanceof Error?b.message:String(b),totalEntities:l.length})}}const h=p.every(f=>f.ok!==!1),m=nt(s,n.renames,l,c),y=await Ze(i.entry,s,l,n.renames,p,o,e,t),u=Ee(e,s,c,l,p,h,y,i.entry.workspaceFolders);if(!c&&h){const f=(0,$.buildRenamePreviewId)(m),g=(0,$.hashFile)(s),F=(0,$.buildRenamePreviewHash)(m,g,u);(0,$.writeRenamePreviewRecord)(e,{previewId:f,previewHash:F,createdAt:new Date().toISOString(),cwd:d.resolve(e),sourceFile:s,sourceHash:g,normalizedPayload:m,previewResult:u}),u.previewId=f,u.next=`aib rename apply ${f}`}return Ce(e,u),(0,E.attachAgentText)(u,G(u))}function ge(e,n){const t=(0,x.readRenameExecutionStatus)(e,n);if((t.status==="completed"||t.status==="failed")&&t.result)return t.result;const r={operation:"execution.status",executionId:t.executionId,status:t.status,phase:t.phase,summary:k(t),progress:`${t.completedRows}/${t.rowCount}`,filesWritten:t.filesWritten,updatedAt:t.updatedAt,...t.error?{error:t.error}:{}};return(0,E.attachAgentText)(r,be(t))}function ve(e,n,t,r,i){const o=(0,x.readRenameExecutionStatus)(e,n),s=Math.max(0,r-i),c={operation:"execution.status",executionId:o.executionId,status:o.status,phase:o.phase,summary:k(o),progress:`${o.completedRows}/${o.rowCount}`,filesWritten:o.filesWritten,updatedAt:o.updatedAt,estimatedRemainingMs:s};return(0,E.attachAgentText)(c,Ae(t,o,s))}function Ae(e,n,t){return[`${e} ${n.executionId}`,k(n),"applying mutation",t>0?`estimated remaining: ${it(Math.max(t,5e3))}`:"estimated remaining: check status again soon"].join(`
2
- `)}function be(e){const n=[`${e.operation} ${e.executionId}`,k(e)];return e.status==="running"&&n.push("applying mutation"),e.error&&n.push(e.error),n.join(`
3
- `)}function k(e){return e.status==="completed"?`completed, ${e.completedRows}/${e.rowCount} renames, ${e.filesWritten.length} files written`:e.status==="failed"?`failed, ${e.completedRows}/${e.rowCount} renames, ${e.failedRows} failed`:`in progress, ${e.completedRows}/${e.rowCount} renames`}function we(e){return new Promise((n,t)=>{setImmediate(()=>{e().then(n,t)})})}function W(){return(0,j.readMutationSyncWaitMs)(process.env[v.CLI_ENV.renameSyncWaitMs],12e4)}function Fe(e){return 12e3+J(e)*2e3}function J(e){return Math.max(1,e.renames.length)}function xe(e){return(Array.isArray(e.filesWritten)?e.filesWritten:Array.isArray(e.files)?e.files:[]).filter(t=>typeof t=="string"&&!t.startsWith("+"))}function Se(e){const n=Array.isArray(e.renames)?e.renames.map(r=>({ok:typeof r=="string"&&!r.includes("failed")})):e.rename?[{ok:e.ok!==!1}]:[];if(n.length>0)return n;const t=Array.isArray(e.failed)?e.failed.filter(A):[];return t.length>0?t.map(r=>({...r,ok:!1})):[{ok:e.ok!==!1}]}async function Ne(){const e=process.env[v.CLI_ENV.testRenameDelayMs];if(!e)return;const n=Number.parseInt(e,10);!Number.isFinite(n)||n<=0||await new Promise(t=>setTimeout(t,Math.min(n,12e4)))}function $e(){const e=[v.CLI_ENV.productStorageDir,v.CLI_ENV.trace,v.CLI_ENV.traceDir,v.CLI_ENV.metrics,v.CLI_ENV.metricsDir,v.CLI_ENV.metricsTag,v.CLI_ENV.mutationImpactMetrics,v.CLI_ENV.mutationImpactStream,v.CLI_ENV.testRenameDelayMs],n={};for(const t of e)n[t]=process.env[t];return n}async function _e(e,n){const t={};for(const[r,i]of Object.entries(e))t[r]=process.env[r],i===void 0?delete process.env[r]:process.env[r]=i;try{return await n()}finally{for(const[r,i]of Object.entries(t))i===void 0?delete process.env[r]:process.env[r]=i}}function Ce(e,n){(0,M.recordCentralMetric)({kind:"mutation.summary",operation:typeof n.operation=="string"?n.operation:"rename",cwd:d.resolve(e),ok:n.ok!==!1,sourceFile:typeof n.file=="string"?n.file:null,summary:typeof n.summary=="string"?n.summary:null,filesWrittenCount:Array.isArray(n.filesWritten)?n.filesWritten.filter(t=>typeof t=="string"&&!t.startsWith("+")).length:0})}function Re(e,n,t){const r=A(e.renameImpact)?e.renameImpact:{};return{ok:e.ok!==!1,totalEntities:t,editCount:typeof n.editCount=="number"?n.editCount:0,changedFileCount:Array.isArray(n.allFiles)?n.allFiles.length:0,savedFileCount:Array.isArray(n.allSavedFiles)?n.allSavedFiles.length:0,...(0,M.mutationImpactMetricsEnabled)()?{impactCollectionMs:typeof r.impactCollectionMs=="number"?r.impactCollectionMs:null,impact:{locationCount:typeof r.locationCount=="number"?r.locationCount:null,fileCount:typeof r.fileCount=="number"?r.fileCount:null,impactCollectionMs:typeof r.impactCollectionMs=="number"?r.impactCollectionMs:null},changedFiles:Array.isArray(n.allFiles)?n.allFiles:[],savedFiles:Array.isArray(n.allSavedFiles)?n.allSavedFiles:[]}:{},configFilePath:typeof e.configFilePath=="string"?e.configFilePath:null}}function Ee(e,n,t,r,i,o,s,c){const l=i.reduce((u,f)=>u+te(f.editCount),0),a=Qe(i),p=De(i),h=i.map((u,f)=>({oldName:r[f]?.symbolName??(typeof u.oldName=="string"?u.oldName:u.entity),newName:u.newName})),m=Oe(e,c,i,h,a,n)??Te(e,c,a,h);return{...o?{}:{ok:!1},operation:t?"rename.execute":"rename.preview",file:S(e,n),...r.length===1?{rename:q(i[0],!1)}:{renames:i.map(u=>q(u,!0))},summary:t?`${p.length} ${p.length===1?"file":"files"} written, ${l} edits`:r.length===1?`${a.length} ${a.length===1?"file":"files"}, ${l} edits`:`${r.length} symbols, ${a.length} ${a.length===1?"file":"files"}, ${l} edits`,...t?{}:{files:D(a,5)},...t?{filesWritten:D(p,5)}:{},...o?{}:{failed:i.filter(u=>u.ok===!1).map(u=>ke(u))},...m?{api:We(m)}:{},...o?{}:{next:"Fix failed rename rows and rerun preview."}}}function Ie(e,n){const t=n.trim();return d.normalize(d.isAbsolute(t)?t:d.resolve(e,t))}function Me(e,n,t,r){const i=r instanceof I.CliError&&A(r.details)?r.details:{},o=A(i.details)?i.details:{},s=Z(e,o.candidates),c=A(o.sourceConsistency)?Q(o.sourceConsistency):null;return{entity:n.raw,oldName:n.symbolName,acceptedSelector:C(n,e),newName:t,ok:!1,code:r instanceof I.CliError?r.code:"RENAME_FAILED",error:r instanceof Error?r.message:String(r),...c?{source:c}:{},...s.length>0?{candidates:s}:{},next:s.length>0?"Retry with one of the candidate selectors.":"Run inspect file for this source file, then retry with a canonical selector."}}function Pe(e,n,t,r,i){const o=A(i.locationPreview)?i.locationPreview:{},s=Array.isArray(o.locations)?o.locations.filter(A):[],c=tt(e,s),l=Be(s,t.symbolName,r),a=l.length>0?[]:He(e,c,t.symbolName,r,typeof i.sourceFile=="string"?i.sourceFile:null),p=A(i.sourceConsistency)?Q(i.sourceConsistency):null;return i.ok!==!1?{entity:t.raw,oldName:t.symbolName,...typeof i.sourceFile=="string"?{sourceFilePath:i.sourceFile}:{},acceptedSelector:C(t,n),newName:r,ok:!0,editCount:s.length,...typeof i.configFilePath=="string"?{projectConfig:S(e,i.configFilePath)}:{},allFiles:c.map(({file:m,count:y})=>`${m} x${y}`),files:D(c.map(({file:m,count:y})=>`${m} x${y}`),5),...l.length+a.length>0?{apiAliases:[...l,...a]}:{},...p?{source:p}:{},...i.applied!==void 0?{applied:i.applied===!0}:{},...Array.isArray(i.savedFiles)?{allSavedFiles:i.savedFiles.filter(m=>typeof m=="string").map(m=>S(e,m)),savedFiles:D(i.savedFiles.filter(m=>typeof m=="string").map(m=>S(e,m)),5)}:{}}:{entity:t.raw,acceptedSelector:C(t,n),newName:r,ok:!1,code:typeof i.code=="string"?i.code:"RENAME_FAILED",error:typeof i.error=="string"?i.error:"Rename failed.",...p?{source:p}:{},candidates:Z(n,i.candidates),next:"Use one of the candidates or rerun inspect file if the file changed."}}function q(e,n){const t=typeof e.acceptedSelector=="string"?e.acceptedSelector:e.entity,r=e.ok===!1?"failed":`${te(e.editCount)} edits`,i=n?`, ${r}`:"";return`${t} -> ${e.newName}${i}`}function ke(e){const n={rename:q(e,!1),code:typeof e.code=="string"?e.code:"RENAME_FAILED",error:typeof e.error=="string"?e.error:"Rename failed."};for(const t of["source","candidates","next"])e[t]!==void 0&&(n[t]=e[t]);return n}function De(e){const n=new Set;for(const t of e){const r=Array.isArray(t.allSavedFiles)?t.allSavedFiles:t.savedFiles;if(Array.isArray(r))for(const i of r)typeof i=="string"&&!i.startsWith("+")&&n.add(i)}return Array.from(n)}function We(e){const n=typeof e.aliases=="string"?e.aliases:"aliases",t=typeof e.consumers=="string"?e.consumers:"",r=/^(\d+)\s+/.exec(t),i=r?Number(r[1]):0,o=n.startsWith("1 ")?"name":"names";return i>0?`old ${o} preserved by ${n}; ${t} still use old names`:`old ${o} preserved by ${n}`}function G(e){if(e.ok===!1)return null;const n=typeof e.operation=="string"?e.operation:"";if(n!=="rename.preview"&&n!=="rename.execute"&&n!=="rename.apply")return null;const t=[],r=typeof e.previewId=="string"?e.previewId:"";if(t.push(r&&n==="rename.preview"?`${n} ${r}`:n),typeof e.file=="string"&&t.push(e.file),typeof e.rename=="string")t.push(e.rename);else if(Array.isArray(e.renames))for(const i of e.renames)typeof i=="string"&&t.push(qe(i));return typeof e.summary=="string"&&t.push(e.summary),Le(t,Array.isArray(e.filesWritten)?e.filesWritten:e.files),typeof e.api=="string"&&t.push(`api: ${e.api}`),typeof e.next=="string"&&t.push(`next: ${e.next}`),t.join(`
4
- `)}function qe(e){return e.replace(/,\s+\d+\s+edits$/,"")}function Le(e,n){if(Array.isArray(n))for(const t of n)typeof t=="string"&&e.push(t)}function Oe(e,n,t,r,i,o){const s=Ke(t),c=ze(e,t,r),l=Ve(e,i,o,r),a=L([...s,...c,...l]);if(a.length===0)return null;const p=Je(e,t),h=ee(e,n),m=X(h,a.map(y=>y.oldName),p);return{status:"preserved-via-alias",aliases:`${a.length} ${a.length===1?"alias":"aliases"}`,consumers:`${m.length} ${m.length===1?"file":"files"} not rewritten`,hint:"Public API names were preserved through re-export aliases. Consumers still use old names."}}function Te(e,n,t,r){if(!t.some(l=>/(^|[/\\])index\.(ts|tsx|mts|cts) x\d+$/i.test(l))||r.length===0)return null;const o=je(e,t),s=ee(e,n),c=X(s,r.map(l=>l.oldName),o);return{status:"preserved-via-alias",aliases:`${r.length} ${r.length===1?"alias":"aliases"}`,consumers:`${c.length} ${c.length===1?"file":"files"} not rewritten`,hint:"Public API names were preserved through re-export aliases. Consumers still use old names."}}function je(e,n){const t=new Set;for(const r of n){if(typeof r!="string"||r.startsWith("+"))continue;const i=/^(.*) x(\d+)$/.exec(r);i&&t.add(w(d.resolve(e,i[1])))}return t}function Ve(e,n,t,r){const i=w(t),o=[];for(const s of n){if(typeof s!="string"||s.startsWith("+"))continue;const c=/^(.*) x(\d+)$/.exec(s);if(!c)continue;const l=d.resolve(e,c[1]);if(w(l)===i)continue;if(/^index\.(ts|tsx|mts|cts)$/i.test(d.basename(l))){o.push(...r);continue}let a="";try{a=N.readFileSync(l,"utf8")}catch{continue}if(!(!a.includes("export")||!a.includes("from")))for(const p of r)a.includes(p.oldName)&&o.push(p)}return L(o)}function Ke(e){const n=[];for(const t of e)if(Array.isArray(t.apiAliases))for(const r of t.apiAliases)A(r)&&typeof r.oldName=="string"&&typeof r.newName=="string"&&n.push({oldName:r.oldName,newName:r.newName});return L(n)}function L(e){const n=new Set;return e.filter(t=>{const r=`${t.newName} as ${t.oldName}`;return n.has(r)?!1:(n.add(r),!0)})}function ze(e,n,t){const r=[];for(const o of n){const s=typeof o.sourceFilePath=="string"?w(o.sourceFilePath):null,c=Array.isArray(o.allFiles)?o.allFiles:[];for(const l of c){if(typeof l!="string"||l.startsWith("+"))continue;const a=/^(.*) x(\d+)$/.exec(l);if(!a)continue;const p=d.resolve(e,a[1]);if(s&&w(p)===s)continue;let h="";try{h=N.readFileSync(p,"utf8")}catch{continue}if(!(!h.includes("export")||!h.includes("from")))for(const m of t)h.includes(m.oldName)&&r.push(m)}}const i=new Set;return r.filter(o=>{const s=`${o.newName} as ${o.oldName}`;return i.has(s)?!1:(i.add(s),!0)})}function Be(e,n,t){const r=new RegExp(`\\b${Y(t)}\\s+as\\s+${Y(n)}\\b`);return e.filter(o=>typeof o.replacementPreview=="string"&&(r.test(o.replacementPreview)||Ue(o,n,t))).map(o=>({oldName:n,newName:t,...typeof o.fileName=="string"?{fileName:o.fileName}:{}})).slice(0,20)}function He(e,n,t,r,i){const o=i?w(i):null,s=[];for(const{file:c}of n){const l=d.resolve(e,c);if(o&&w(l)===o)continue;let a="";try{a=N.readFileSync(l,"utf8")}catch{continue}!a.includes(t)||!a.includes("export")||!a.includes("from")||s.push({oldName:t,newName:r,fileName:l})}return s.slice(0,20)}function Ue(e,n,t){if(typeof e.fileName!="string"||typeof e.replacementPreview!="string"||!e.replacementPreview.includes(t))return!1;let r="";try{r=N.readFileSync(e.fileName,"utf8")}catch{return!1}return r.includes(n)&&r.includes("export")&&r.includes("from")}function Je(e,n){const t=new Set;for(const r of n){const i=Array.isArray(r.allFiles)?r.allFiles:[];for(const o of i){if(typeof o!="string"||o.startsWith("+"))continue;const s=/^(.*) x(\d+)$/.exec(o);s&&t.add(w(d.resolve(e,s[1])))}}return t}function X(e,n,t){const r=Array.from(new Set(n.filter(s=>s.length>0)));if(r.length===0)return[];const i=[],o=new Set;for(const s of e)for(const c of Ge(s,5e3)){const l=w(c);if(t.has(l)||o.has(l))continue;o.add(l);let a="";try{a=N.readFileSync(c,"utf8")}catch{continue}r.some(p=>a.includes(p))&&i.push(c)}return i}function Ge(e,n){const t=[],r=[d.resolve(e)];for(;r.length>0&&t.length<n;){const i=r.pop();if(!i)continue;let o=[];try{o=N.readdirSync(i,{withFileTypes:!0})}catch{continue}for(const s of o){if(t.length>=n)break;if(s.isDirectory()){if(Xe(s.name))continue;r.push(d.join(i,s.name));continue}s.isFile()&&Ye(s.name)&&t.push(d.join(i,s.name))}}return t}function Xe(e){return[".git",".aib-plan-cache",".aib-preview",".aib-trace",".tmp","dist","node_modules","out"].includes(e)}function Ye(e){return/\.(ts|tsx|mts|cts)$/i.test(e)&&!/\.d\.(ts|mts|cts)$/i.test(e)}function w(e){return d.normalize(e).toLowerCase()}function Y(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Qe(e){const n=new Map;for(const t of e){const r=Array.isArray(t.allFiles)?t.allFiles:t.files;if(Array.isArray(r))for(const i of r){if(typeof i!="string"||i.startsWith("+"))continue;const o=/^(.*) x(\d+)$/.exec(i);if(!o)continue;const s=o[1],c=Number(o[2]);n.set(s,(n.get(s)??0)+c)}}return Array.from(n.entries()).sort((t,r)=>t[0].localeCompare(r[0])).map(([t,r])=>`${t} x${r}`)}function st(e,n){return Array.from(new Set(n.map(t=>t.projectConfig).filter(t=>typeof t=="string"&&t.length>0))).sort((t,r)=>t.localeCompare(r))}async function Ze(e,n,t,r,i,o,s,c){const l=new Set(t.map(y=>y.symbolName)),a=new Set(r.map(y=>y.newName.trim())),p=Array.from(l).filter(y=>y.length>0);if(p.length===0)return[];const h=et(n,i,s).slice(0,40),m=[];for(const y of h){let u;try{u=await(0,pe.queryTopLevelInspectSymbols)(e,y,(0,_.extensionRequestOptions)(c))}catch{continue}for(const f of u){if(typeof f.name!="string")continue;const g=f.name;if(!p.some(b=>g.includes(b))||l.has(g)||a.has(g))continue;const F=typeof f.kind=="string"?f.kind.toLowerCase():"";m.push(C({raw:g,symbolName:g,symbolKind:re(F)?F:null},o))}}return Array.from(new Set(m)).sort((y,u)=>y.localeCompare(u))}function et(e,n,t){const r=new Set([e]);for(const i of n){const o=Array.isArray(i.allFiles)?i.allFiles:[];for(const s of o){if(typeof s!="string"||s.startsWith("+"))continue;const c=/^(.*) x(\d+)$/.exec(s);c&&r.add(d.resolve(t,c[1]))}}return Array.from(r)}function tt(e,n){const t=new Map;for(const r of n){if(typeof r.fileName!="string")continue;const i=S(e,r.fileName);t.set(i,(t.get(i)??0)+1)}return Array.from(t.entries()).sort((r,i)=>r[0].localeCompare(i[0])).map(([r,i])=>({file:r,count:i}))}function Q(e){return e.documentMatchesDisk===!0&&e.documentIsDirty!==!0?null:{documentMatchesDisk:e.documentMatchesDisk===!0,documentIsDirty:e.documentIsDirty===!0}}function nt(e,n,t,r){return{sourceFile:e,renames:n.map((i,o)=>({entity:t[o]?.raw??i.entity.trim(),symbolName:t[o]?.symbolName??i.entity.trim(),...t[o]?.symbolKind?{symbolKind:t[o]?.symbolKind}:{},...t[o]?.parentName?{parentName:t[o]?.parentName}:{},newName:i.newName})),execute:r}}function Z(e,n){return Array.isArray(n)?n.filter(A).slice(0,8).map(t=>{const r=typeof t.name=="string"?t.name:"",i=typeof t.kind=="string"?t.kind.toLowerCase():"",o=Array.isArray(t.path)?t.path.filter(c=>typeof c=="string"):[],s=o.length>1?o[o.length-2]:void 0;return{name:r,kind:i,selector:C({raw:s?`${s}.${r}`:r,symbolName:r,symbolKind:re(i)?i:null,...s?{parentName:s}:{}},e)}}):[]}function C(e,n){const t=e.parentName?`${e.parentName}.${e.symbolName}`:e.symbolName;return e.symbolKind?`${n.entityKindAliases[e.symbolKind]}${n.selectorSeparator}${t}`:e.raw}function ee(e,n){const t=w(d.resolve(e)),r=[];for(const i of n.map(o=>d.resolve(o))){const o=w(i);if(t===o||o.startsWith(`${t}/`)){r.push(i);continue}t.startsWith(`${o}/`)&&r.push(d.resolve(e))}return r.length===0?[d.resolve(e)]:Array.from(new Set(r))}function D(e,n){const t=e.slice(0,n),r=e.length-t.length;return r>0?[...t,`+ ${r} more`]:t}function te(e){return typeof e=="number"?e:0}function rt(e){return typeof e=="string"?e:null}function it(e){const n=Math.max(1,Math.ceil(e/1e3));return n<60?`~${n} sec`:`~${Math.ceil(n/60)} min`}function S(e,n){return d.relative(e,n).replace(/\\/g,"/")}function ne(e,n){const t=e.indexOf(n);if(t<0)return null;const r=e[t+1];return r&&!r.startsWith("--")?r:null}function ot(){return{ok:!0,command:"rename",usage:"aib rename preview <sourceFile> <entity> <newName> | aib rename preview --stdin | aib rename execute --stdin | aib rename apply <previewId>",preview:{sourceFile:"src/path/to/source-file.ts",renames:[{entity:"OldSymbolName",newName:"NewSymbolName"}],execute:!1},apply:"aib rename apply rename_abc123",notes:["Use execute:false first when selector resolution is uncertain.","Preview returns previewId, file/edit summary, and candidate selectors on failure.","Apply by previewId refuses to run if the source file changed after preview."]}}function A(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function re(e){return me.ENTITY_KIND_IDS.includes(e)}
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.buildSemanticRenameResponse = buildSemanticRenameResponse;
37
+ exports.readCachedRenameExecution = readCachedRenameExecution;
38
+ const fs = __importStar(require("node:fs"));
39
+ const path = __importStar(require("node:path"));
40
+ const agent_text_1 = require("../shared/agent-text");
41
+ const types_1 = require("../shared/types");
42
+ const rename_execution_cache_1 = require("./rename-execution-cache");
43
+ const central_metrics_1 = require("../metrics/central-metrics");
44
+ function buildSemanticRenameResponse(cwd, result, builder, response, action, formatOptions) {
45
+ const builtRows = readSemanticRenameBuiltRows(builder);
46
+ const responseRows = readSemanticRenameResponseRows(response);
47
+ const rowResults = builtRows.map((builtRow) => buildSemanticRenameRowResult(cwd, builtRow, responseRows.get(builtRow.id) ?? null));
48
+ const ok = result.ok !== false && rowResults.every((row) => row.ok !== false);
49
+ const sourceFile = builtRows.find((row) => row.sourceFile)?.sourceFile ?? "";
50
+ const absoluteSourceFile = sourceFile ? resolveInputPath(cwd, sourceFile) : "";
51
+ const renamePairs = rowResults.map((row) => ({
52
+ oldName: typeof row.oldName === "string" ? row.oldName : row.entity,
53
+ newName: row.newName
54
+ }));
55
+ const files = summarizeRenameFiles(rowResults);
56
+ const savedFiles = collectSavedFiles(rowResults);
57
+ const totalEdits = rowResults.reduce((count, row) => count + readNumber(row.editCount), 0);
58
+ const workspaceFolders = [cwd];
59
+ const apiSummary = absoluteSourceFile
60
+ ? buildRenameApiSummary(cwd, workspaceFolders, rowResults, renamePairs, files, absoluteSourceFile, action !== "preview")
61
+ : null;
62
+ const operation = action === "apply" ? "rename.apply" : action === "execute" ? "rename.execute" : "rename.preview";
63
+ const formatted = {
64
+ ...result,
65
+ ...(!ok ? { ok: false } : {}),
66
+ operation,
67
+ ...(operation === "rename.preview" && typeof result.previewId === "string" ? { previewId: result.previewId } : {}),
68
+ ...(absoluteSourceFile ? { file: formatRelativePath(cwd, absoluteSourceFile) } : {}),
69
+ ...(rowResults.length === 1
70
+ ? { rename: formatRenameLine(rowResults[0], false) }
71
+ : { renames: rowResults.map((row) => formatRenameLine(row, true)) }),
72
+ ...(operation === "rename.preview" && (files.length > 0 || totalEdits > 0)
73
+ ? {
74
+ summary: rowResults.length === 1
75
+ ? `${files.length} ${files.length === 1 ? "file" : "files"}, ${totalEdits} edits`
76
+ : `${rowResults.length} symbols, ${files.length} ${files.length === 1 ? "file" : "files"}, ${totalEdits} edits`,
77
+ files: compactList(files, 5)
78
+ }
79
+ : savedFiles.length > 0
80
+ ? {
81
+ summary: `${savedFiles.length} ${savedFiles.length === 1 ? "file" : "files"} written`,
82
+ filesWritten: compactList(savedFiles, 5)
83
+ }
84
+ : {}),
85
+ ...(!ok ? { failed: rowResults.filter((row) => row.ok === false).map((row) => compactRenameFailure(row)) } : {}),
86
+ ...(apiSummary ? { api: formatApiSummary(apiSummary) } : {}),
87
+ ...(!ok ? { next: "Fix failed rename rows and rerun preview." } : {}),
88
+ ...(ok && apiSummary && operation !== "rename.preview"
89
+ ? { next: "If public API rename is intended, update consumers explicitly." }
90
+ : {}),
91
+ ...(operation === "rename.preview" && typeof formatOptions.next === "string" ? { next: formatOptions.next } : {})
92
+ };
93
+ recordSemanticRenameMetrics(cwd, operation, rowResults, formatted);
94
+ return (0, agent_text_1.attachAgentText)(formatted, formatRenameAgentText(formatted));
95
+ }
96
+ function recordSemanticRenameMetrics(cwd, operation, rowResults, response) {
97
+ for (const row of rowResults) {
98
+ (0, central_metrics_1.recordCentralMetric)({
99
+ kind: "mutation.entity",
100
+ operation,
101
+ cwd: path.resolve(cwd),
102
+ sourceFile: typeof row.sourceFilePath === "string" && row.sourceFilePath.length > 0
103
+ ? formatRelativePath(cwd, row.sourceFilePath)
104
+ : null,
105
+ entity: row.entity,
106
+ newName: row.newName,
107
+ ok: row.ok !== false,
108
+ totalEntities: rowResults.length,
109
+ editCount: typeof row.editCount === "number" ? row.editCount : 0,
110
+ changedFileCount: Array.isArray(row.allFiles) ? row.allFiles.length : 0,
111
+ savedFileCount: Array.isArray(row.allSavedFiles) ? row.allSavedFiles.length : 0,
112
+ ...((0, central_metrics_1.mutationImpactMetricsEnabled)()
113
+ ? {
114
+ impact: {
115
+ locationCount: typeof row.editCount === "number" ? row.editCount : null,
116
+ fileCount: Array.isArray(row.allFiles) ? row.allFiles.length : null,
117
+ impactCollectionMs: null
118
+ },
119
+ changedFiles: Array.isArray(row.allFiles) ? row.allFiles : [],
120
+ savedFiles: Array.isArray(row.allSavedFiles) ? row.allSavedFiles : []
121
+ }
122
+ : {})
123
+ });
124
+ }
125
+ recordRenameSummaryMetric(cwd, response);
126
+ }
127
+ function readSemanticRenameBuiltRows(builder) {
128
+ const requests = Array.isArray(builder.rows) ? builder.rows.filter(isJsonObject) : [];
129
+ const rows = [];
130
+ for (const request of requests) {
131
+ if (request.op !== "rename" || !Array.isArray(request.builtRows)) {
132
+ continue;
133
+ }
134
+ for (const rawRow of request.builtRows.filter(isJsonObject)) {
135
+ if (typeof rawRow.id === "string" &&
136
+ typeof rawRow.entity === "string" &&
137
+ typeof rawRow.newName === "string") {
138
+ rows.push({
139
+ id: rawRow.id,
140
+ sourceFile: typeof rawRow.sourceFile === "string" ? rawRow.sourceFile : "",
141
+ entity: rawRow.entity,
142
+ newName: rawRow.newName
143
+ });
144
+ }
145
+ }
146
+ }
147
+ return rows;
148
+ }
149
+ function readSemanticRenameResponseRows(response) {
150
+ const rows = new Map();
151
+ for (const rawRow of Array.isArray(response.rows) ? response.rows.filter(isJsonObject) : []) {
152
+ if (typeof rawRow.id === "string") {
153
+ rows.set(rawRow.id, rawRow);
154
+ }
155
+ }
156
+ return rows;
157
+ }
158
+ function buildSemanticRenameRowResult(cwd, builtRow, responseRow) {
159
+ const nestedResponse = isJsonObject(responseRow?.response) ? responseRow.response : {};
160
+ const locationPreview = isJsonObject(nestedResponse.locationPreview) ? nestedResponse.locationPreview : {};
161
+ const fileCounts = readStringArray(locationPreview.fileCounts);
162
+ const savedFiles = readStringArray(responseRow?.savedFiles);
163
+ const ok = responseRow?.ok !== false;
164
+ const result = {
165
+ entity: builtRow.entity,
166
+ oldName: builtRow.entity,
167
+ sourceFilePath: builtRow.sourceFile ? resolveInputPath(cwd, builtRow.sourceFile) : "",
168
+ acceptedSelector: builtRow.entity,
169
+ newName: builtRow.newName,
170
+ ok,
171
+ editCount: readNumber(locationPreview.locationCount),
172
+ allFiles: fileCounts,
173
+ files: compactList(fileCounts, 5),
174
+ applied: responseRow?.applied === true,
175
+ ...(savedFiles.length > 0
176
+ ? {
177
+ allSavedFiles: savedFiles,
178
+ savedFiles: compactList(savedFiles, 5)
179
+ }
180
+ : {})
181
+ };
182
+ if (!ok) {
183
+ result.code = typeof responseRow?.error === "string" ? responseRow.error : "RENAME_FAILED";
184
+ result.error = typeof responseRow?.error === "string" ? responseRow.error : "Rename failed.";
185
+ }
186
+ return result;
187
+ }
188
+ function readCachedRenameExecution(cwd, executionId) {
189
+ const status = (0, rename_execution_cache_1.readRenameExecutionStatus)(cwd, executionId);
190
+ if ((status.status === "completed" || status.status === "failed") && status.result) {
191
+ return status.result;
192
+ }
193
+ const response = {
194
+ operation: "execution.status",
195
+ executionId: status.executionId,
196
+ status: status.status,
197
+ phase: status.phase,
198
+ summary: buildRenameExecutionSummary(status),
199
+ progress: `${status.completedRows}/${status.rowCount}`,
200
+ filesWritten: status.filesWritten,
201
+ updatedAt: status.updatedAt,
202
+ ...(status.error ? { error: status.error } : {})
203
+ };
204
+ return (0, agent_text_1.attachAgentText)(response, formatRenameExecutionStatusText(status));
205
+ }
206
+ function formatRenameExecutionStatusText(status) {
207
+ const lines = [
208
+ `${status.operation} ${status.executionId}`,
209
+ buildRenameExecutionSummary(status)
210
+ ];
211
+ if (status.status === "running") {
212
+ lines.push("applying mutation");
213
+ }
214
+ if (status.error) {
215
+ lines.push(status.error);
216
+ }
217
+ return lines.join("\n");
218
+ }
219
+ function buildRenameExecutionSummary(status) {
220
+ if (status.status === "completed") {
221
+ return `completed, ${status.completedRows}/${status.rowCount} renames, ${status.filesWritten.length} files written`;
222
+ }
223
+ if (status.status === "failed") {
224
+ return `failed, ${status.completedRows}/${status.rowCount} renames, ${status.failedRows} failed`;
225
+ }
226
+ return `in progress, ${status.completedRows}/${status.rowCount} renames`;
227
+ }
228
+ function recordRenameSummaryMetric(cwd, response) {
229
+ (0, central_metrics_1.recordCentralMetric)({
230
+ kind: "mutation.summary",
231
+ operation: typeof response.operation === "string" ? response.operation : "rename",
232
+ cwd: path.resolve(cwd),
233
+ ok: response.ok !== false,
234
+ sourceFile: typeof response.file === "string" ? response.file : null,
235
+ summary: typeof response.summary === "string" ? response.summary : null,
236
+ filesWrittenCount: Array.isArray(response.filesWritten) ? response.filesWritten.filter((file) => typeof file === "string" && !file.startsWith("+")).length : 0
237
+ });
238
+ }
239
+ function resolveInputPath(cwd, filePath) {
240
+ const trimmed = filePath.trim();
241
+ return path.normalize(path.isAbsolute(trimmed) ? trimmed : path.resolve(cwd, trimmed));
242
+ }
243
+ function formatRenameLine(result, includeEditCount) {
244
+ const selector = typeof result.acceptedSelector === "string" ? result.acceptedSelector : result.entity;
245
+ const status = result.ok === false ? "failed" : `${readNumber(result.editCount)} edits`;
246
+ const suffix = includeEditCount ? `, ${status}` : "";
247
+ return `${selector} -> ${result.newName}${suffix}`;
248
+ }
249
+ function compactRenameFailure(result) {
250
+ const row = {
251
+ rename: formatRenameLine(result, false),
252
+ code: typeof result.code === "string" ? result.code : "RENAME_FAILED",
253
+ error: typeof result.error === "string" ? result.error : "Rename failed."
254
+ };
255
+ for (const key of ["source", "candidates", "next"]) {
256
+ if (result[key] !== undefined) {
257
+ row[key] = result[key];
258
+ }
259
+ }
260
+ return row;
261
+ }
262
+ function collectSavedFiles(results) {
263
+ const files = new Set();
264
+ for (const result of results) {
265
+ const source = Array.isArray(result.allSavedFiles) ? result.allSavedFiles : result.savedFiles;
266
+ if (!Array.isArray(source)) {
267
+ continue;
268
+ }
269
+ for (const item of source) {
270
+ if (typeof item === "string" && !item.startsWith("+")) {
271
+ files.add(item);
272
+ }
273
+ }
274
+ }
275
+ return Array.from(files);
276
+ }
277
+ function formatApiSummary(apiSummary) {
278
+ const aliases = typeof apiSummary.aliases === "string" ? apiSummary.aliases : "aliases";
279
+ const consumers = typeof apiSummary.consumers === "string" ? apiSummary.consumers : "";
280
+ const consumerMatch = /^(\d+)\s+/.exec(consumers);
281
+ const consumerCount = consumerMatch ? Number(consumerMatch[1]) : 0;
282
+ const plural = aliases.startsWith("1 ") ? "name" : "names";
283
+ return consumerCount > 0
284
+ ? `old ${plural} preserved by ${aliases}; ${consumers} still use old names`
285
+ : `old ${plural} preserved by ${aliases}`;
286
+ }
287
+ function formatRenameAgentText(response) {
288
+ if (response.ok === false) {
289
+ return null;
290
+ }
291
+ const operation = typeof response.operation === "string" ? response.operation : "";
292
+ if (operation !== "rename.preview" && operation !== "rename.execute" && operation !== "rename.apply") {
293
+ return null;
294
+ }
295
+ const lines = [];
296
+ const previewId = typeof response.previewId === "string" ? response.previewId : "";
297
+ lines.push(previewId && operation === "rename.preview" ? `${operation} ${previewId}` : operation);
298
+ if (typeof response.file === "string") {
299
+ lines.push(response.file);
300
+ }
301
+ if (typeof response.rename === "string") {
302
+ lines.push(response.rename);
303
+ }
304
+ else if (Array.isArray(response.renames)) {
305
+ for (const rename of response.renames) {
306
+ if (typeof rename === "string") {
307
+ lines.push(stripSuccessfulRenameEditSuffix(rename));
308
+ }
309
+ }
310
+ }
311
+ if (typeof response.summary === "string") {
312
+ lines.push(response.summary);
313
+ }
314
+ appendStringList(lines, Array.isArray(response.filesWritten) ? response.filesWritten : response.files);
315
+ if (typeof response.api === "string") {
316
+ lines.push(`api: ${response.api}`);
317
+ }
318
+ if (typeof response.next === "string") {
319
+ lines.push(`next: ${response.next}`);
320
+ }
321
+ return lines.join("\n");
322
+ }
323
+ function stripSuccessfulRenameEditSuffix(rename) {
324
+ return rename.replace(/,\s+\d+\s+edits$/, "");
325
+ }
326
+ function appendStringList(lines, values) {
327
+ if (!Array.isArray(values)) {
328
+ return;
329
+ }
330
+ for (const value of values) {
331
+ if (typeof value === "string") {
332
+ lines.push(value);
333
+ }
334
+ }
335
+ }
336
+ function buildRenameApiSummary(cwd, workspaceFolders, results, renamePairs, summarizedFiles, sourceFile, allowDiskInference) {
337
+ const aliases = collectApiAliases(results);
338
+ const inferredAliases = allowDiskInference ? inferApiAliasesFromChangedExports(cwd, results, renamePairs) : [];
339
+ const summaryAliases = allowDiskInference ? inferApiAliasesFromSummaryFiles(cwd, summarizedFiles, sourceFile, renamePairs) : [];
340
+ const effectiveAliases = uniqueAliases([...aliases, ...inferredAliases, ...summaryAliases]);
341
+ if (effectiveAliases.length === 0) {
342
+ return null;
343
+ }
344
+ const changedFiles = collectChangedFilePaths(cwd, results);
345
+ const scanRoots = getRenameApiScanRoots(cwd, workspaceFolders);
346
+ const consumerFiles = collectFilesContainingAnyName(scanRoots, effectiveAliases.map((alias) => alias.oldName), changedFiles);
347
+ return {
348
+ status: "preserved-via-alias",
349
+ aliases: `${effectiveAliases.length} ${effectiveAliases.length === 1 ? "alias" : "aliases"}`,
350
+ consumers: `${consumerFiles.length} ${consumerFiles.length === 1 ? "file" : "files"} not rewritten`,
351
+ hint: "Public API names were preserved through re-export aliases. Consumers still use old names."
352
+ };
353
+ }
354
+ function inferApiAliasesFromSummaryFiles(cwd, summarizedFiles, sourceFile, renamePairs) {
355
+ const sourceComparable = normalizeComparablePath(sourceFile);
356
+ const aliases = [];
357
+ for (const item of summarizedFiles) {
358
+ if (typeof item !== "string" || item.startsWith("+")) {
359
+ continue;
360
+ }
361
+ const match = /^(.*) x(\d+)$/.exec(item);
362
+ if (!match) {
363
+ continue;
364
+ }
365
+ const absoluteFile = path.resolve(cwd, match[1]);
366
+ if (normalizeComparablePath(absoluteFile) === sourceComparable) {
367
+ continue;
368
+ }
369
+ let text = "";
370
+ try {
371
+ text = fs.readFileSync(absoluteFile, "utf8");
372
+ }
373
+ catch {
374
+ continue;
375
+ }
376
+ for (const pair of renamePairs) {
377
+ if (hasResidualPublicExport(text, pair)) {
378
+ aliases.push(pair);
379
+ }
380
+ }
381
+ }
382
+ return uniqueAliases(aliases);
383
+ }
384
+ function collectApiAliases(results) {
385
+ const aliases = [];
386
+ for (const result of results) {
387
+ if (!Array.isArray(result.apiAliases)) {
388
+ continue;
389
+ }
390
+ for (const rawAlias of result.apiAliases) {
391
+ if (!isJsonObject(rawAlias)) {
392
+ continue;
393
+ }
394
+ if (typeof rawAlias.oldName === "string" && typeof rawAlias.newName === "string") {
395
+ aliases.push({
396
+ oldName: rawAlias.oldName,
397
+ newName: rawAlias.newName
398
+ });
399
+ }
400
+ }
401
+ }
402
+ return uniqueAliases(aliases);
403
+ }
404
+ function uniqueAliases(aliases) {
405
+ const seen = new Set();
406
+ return aliases.filter((alias) => {
407
+ const key = `${alias.newName} as ${alias.oldName}`;
408
+ if (seen.has(key)) {
409
+ return false;
410
+ }
411
+ seen.add(key);
412
+ return true;
413
+ });
414
+ }
415
+ function inferApiAliasesFromChangedExports(cwd, results, renamePairs) {
416
+ const aliases = [];
417
+ for (const result of results) {
418
+ const sourceComparable = typeof result.sourceFilePath === "string"
419
+ ? normalizeComparablePath(result.sourceFilePath)
420
+ : null;
421
+ const resultFiles = Array.isArray(result.allFiles) ? result.allFiles : [];
422
+ for (const item of resultFiles) {
423
+ if (typeof item !== "string" || item.startsWith("+")) {
424
+ continue;
425
+ }
426
+ const match = /^(.*) x(\d+)$/.exec(item);
427
+ if (!match) {
428
+ continue;
429
+ }
430
+ const absoluteFile = path.resolve(cwd, match[1]);
431
+ if (sourceComparable && normalizeComparablePath(absoluteFile) === sourceComparable) {
432
+ continue;
433
+ }
434
+ let text = "";
435
+ try {
436
+ text = fs.readFileSync(absoluteFile, "utf8");
437
+ }
438
+ catch {
439
+ continue;
440
+ }
441
+ for (const pair of renamePairs) {
442
+ if (hasResidualPublicExport(text, pair)) {
443
+ aliases.push(pair);
444
+ }
445
+ }
446
+ }
447
+ }
448
+ const seen = new Set();
449
+ return aliases.filter((alias) => {
450
+ const key = `${alias.newName} as ${alias.oldName}`;
451
+ if (seen.has(key)) {
452
+ return false;
453
+ }
454
+ seen.add(key);
455
+ return true;
456
+ });
457
+ }
458
+ function collectAliasPreservingRenames(locations, oldName, newName) {
459
+ const aliasPattern = new RegExp(`\\b${escapeRegExp(newName)}\\s+as\\s+${escapeRegExp(oldName)}\\b`);
460
+ const aliases = locations
461
+ .filter((location) => typeof location.replacementPreview === "string" &&
462
+ aliasPattern.test(location.replacementPreview))
463
+ .map((location) => ({
464
+ oldName,
465
+ newName,
466
+ ...(typeof location.fileName === "string" ? { fileName: location.fileName } : {})
467
+ }));
468
+ return aliases.slice(0, 20);
469
+ }
470
+ function collectPotentialAliasPreservingExports(cwd, fileCounts, oldName, newName, sourceFile) {
471
+ const sourceComparable = sourceFile ? normalizeComparablePath(sourceFile) : null;
472
+ const aliases = [];
473
+ for (const { file } of fileCounts) {
474
+ const absoluteFile = path.resolve(cwd, file);
475
+ if (sourceComparable && normalizeComparablePath(absoluteFile) === sourceComparable) {
476
+ continue;
477
+ }
478
+ let text = "";
479
+ try {
480
+ text = fs.readFileSync(absoluteFile, "utf8");
481
+ }
482
+ catch {
483
+ continue;
484
+ }
485
+ if (!hasResidualPublicExport(text, { oldName, newName })) {
486
+ continue;
487
+ }
488
+ aliases.push({
489
+ oldName,
490
+ newName,
491
+ fileName: absoluteFile
492
+ });
493
+ }
494
+ return aliases.slice(0, 20);
495
+ }
496
+ function hasResidualPublicExport(sourceText, pair) {
497
+ const oldNamePattern = new RegExp(`(?:^|[^\\p{ID_Continue}$])${escapeRegExp(pair.oldName)}(?:$|[^\\p{ID_Continue}$])`, "u");
498
+ const aliasPattern = new RegExp(`(?:^|[,\\s])(?:type\\s+)?${escapeRegExp(pair.newName)}\\s+as\\s+${escapeRegExp(pair.oldName)}(?:$|[,\\s])`, "u");
499
+ for (const match of sourceText.matchAll(/\bexport\s+(?:type\s+)?\{([\s\S]*?)\}(?:\s+from\b[^;]*)?;/gu)) {
500
+ const bindings = match[1] ?? "";
501
+ if (aliasPattern.test(bindings) || oldNamePattern.test(bindings)) {
502
+ return true;
503
+ }
504
+ }
505
+ return false;
506
+ }
507
+ function collectChangedFilePaths(cwd, results) {
508
+ const files = new Set();
509
+ for (const result of results) {
510
+ const resultFiles = Array.isArray(result.allFiles) ? result.allFiles : [];
511
+ for (const item of resultFiles) {
512
+ if (typeof item !== "string" || item.startsWith("+")) {
513
+ continue;
514
+ }
515
+ const match = /^(.*) x(\d+)$/.exec(item);
516
+ if (match) {
517
+ files.add(normalizeComparablePath(path.resolve(cwd, match[1])));
518
+ }
519
+ }
520
+ }
521
+ return files;
522
+ }
523
+ function collectFilesContainingAnyName(roots, names, excludedFiles) {
524
+ const uniqueNames = Array.from(new Set(names.filter((name) => name.length > 0)));
525
+ if (uniqueNames.length === 0) {
526
+ return [];
527
+ }
528
+ const files = [];
529
+ const seen = new Set();
530
+ for (const root of roots) {
531
+ for (const file of walkTypeScriptFiles(root, 5000)) {
532
+ const comparableFile = normalizeComparablePath(file);
533
+ if (excludedFiles.has(comparableFile) || seen.has(comparableFile)) {
534
+ continue;
535
+ }
536
+ seen.add(comparableFile);
537
+ let text = "";
538
+ try {
539
+ text = fs.readFileSync(file, "utf8");
540
+ }
541
+ catch {
542
+ continue;
543
+ }
544
+ if (uniqueNames.some((name) => text.includes(name))) {
545
+ files.push(file);
546
+ }
547
+ }
548
+ }
549
+ return files;
550
+ }
551
+ function walkTypeScriptFiles(root, maxFiles) {
552
+ const files = [];
553
+ const stack = [path.resolve(root)];
554
+ while (stack.length > 0 && files.length < maxFiles) {
555
+ const current = stack.pop();
556
+ if (!current) {
557
+ continue;
558
+ }
559
+ let entries = [];
560
+ try {
561
+ entries = fs.readdirSync(current, { withFileTypes: true });
562
+ }
563
+ catch {
564
+ continue;
565
+ }
566
+ for (const entry of entries) {
567
+ if (files.length >= maxFiles) {
568
+ break;
569
+ }
570
+ if (entry.isDirectory()) {
571
+ if (shouldSkipDirectory(entry.name)) {
572
+ continue;
573
+ }
574
+ stack.push(path.join(current, entry.name));
575
+ continue;
576
+ }
577
+ if (entry.isFile() && isTypeScriptSourceFile(entry.name)) {
578
+ files.push(path.join(current, entry.name));
579
+ }
580
+ }
581
+ }
582
+ return files;
583
+ }
584
+ function shouldSkipDirectory(name) {
585
+ return [
586
+ ".git",
587
+ ".aib-plan-cache",
588
+ ".aib-preview",
589
+ ".aib-trace",
590
+ ".tmp",
591
+ "dist",
592
+ "node_modules",
593
+ "out"
594
+ ].includes(name);
595
+ }
596
+ function isTypeScriptSourceFile(fileName) {
597
+ return /\.(ts|tsx|mts|cts)$/i.test(fileName) && !/\.d\.(ts|mts|cts)$/i.test(fileName);
598
+ }
599
+ function normalizeComparablePath(filePath) {
600
+ return path.normalize(filePath).toLowerCase();
601
+ }
602
+ function escapeRegExp(value) {
603
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
604
+ }
605
+ function summarizeRenameFiles(results) {
606
+ const counts = new Map();
607
+ for (const result of results) {
608
+ const resultFiles = Array.isArray(result.allFiles) ? result.allFiles : result.files;
609
+ if (!Array.isArray(resultFiles)) {
610
+ continue;
611
+ }
612
+ for (const item of resultFiles) {
613
+ if (typeof item !== "string" || item.startsWith("+")) {
614
+ continue;
615
+ }
616
+ const match = /^(.*) x(\d+)$/.exec(item);
617
+ if (!match) {
618
+ continue;
619
+ }
620
+ const file = match[1];
621
+ const count = Number(match[2]);
622
+ counts.set(file, (counts.get(file) ?? 0) + count);
623
+ }
624
+ }
625
+ return Array.from(counts.entries())
626
+ .sort((left, right) => left[0].localeCompare(right[0]))
627
+ .map(([file, count]) => `${file} x${count}`);
628
+ }
629
+ function collectProjectConfigs(cwd, results) {
630
+ return Array.from(new Set(results
631
+ .map((result) => result.projectConfig)
632
+ .filter((item) => typeof item === "string" && item.length > 0))).sort((left, right) => left.localeCompare(right));
633
+ }
634
+ function collectRenameResultFiles(sourceFile, results, cwd) {
635
+ const files = new Set([sourceFile]);
636
+ for (const result of results) {
637
+ const resultFiles = Array.isArray(result.allFiles) ? result.allFiles : [];
638
+ for (const item of resultFiles) {
639
+ if (typeof item !== "string" || item.startsWith("+")) {
640
+ continue;
641
+ }
642
+ const match = /^(.*) x(\d+)$/.exec(item);
643
+ if (!match) {
644
+ continue;
645
+ }
646
+ files.add(path.resolve(cwd, match[1]));
647
+ }
648
+ }
649
+ return Array.from(files);
650
+ }
651
+ function countRenameLocationsByFile(cwd, locations) {
652
+ const counts = new Map();
653
+ for (const location of locations) {
654
+ if (typeof location.fileName !== "string") {
655
+ continue;
656
+ }
657
+ const file = formatRelativePath(cwd, location.fileName);
658
+ counts.set(file, (counts.get(file) ?? 0) + 1);
659
+ }
660
+ return Array.from(counts.entries())
661
+ .sort((left, right) => left[0].localeCompare(right[0]))
662
+ .map(([file, count]) => ({ file, count }));
663
+ }
664
+ function compactSourceConsistency(raw) {
665
+ if (raw.documentMatchesDisk === true && raw.documentIsDirty !== true) {
666
+ return null;
667
+ }
668
+ return {
669
+ documentMatchesDisk: raw.documentMatchesDisk === true,
670
+ documentIsDirty: raw.documentIsDirty === true
671
+ };
672
+ }
673
+ function normalizeRenamePayload(sourceFile, renames, selectors, execute) {
674
+ return {
675
+ sourceFile,
676
+ renames: renames.map((rename, index) => ({
677
+ entity: selectors[index]?.raw ?? rename.entity.trim(),
678
+ symbolName: selectors[index]?.symbolName ?? rename.entity.trim(),
679
+ ...(selectors[index]?.symbolKind ? { symbolKind: selectors[index]?.symbolKind } : {}),
680
+ ...(selectors[index]?.parentName ? { parentName: selectors[index]?.parentName } : {}),
681
+ newName: rename.newName
682
+ })),
683
+ execute
684
+ };
685
+ }
686
+ function formatRenameCandidates(config, rawCandidates) {
687
+ if (!Array.isArray(rawCandidates)) {
688
+ return [];
689
+ }
690
+ return rawCandidates.filter(isJsonObject).slice(0, 8).map((candidate) => {
691
+ const name = typeof candidate.name === "string" ? candidate.name : "";
692
+ const kind = typeof candidate.kind === "string" ? candidate.kind.toLowerCase() : "";
693
+ const path = Array.isArray(candidate.path) ? candidate.path.filter((item) => typeof item === "string") : [];
694
+ const parentName = path.length > 1 ? path[path.length - 2] : undefined;
695
+ return {
696
+ name,
697
+ kind,
698
+ selector: formatSelector({
699
+ raw: parentName ? `${parentName}.${name}` : name,
700
+ symbolName: name,
701
+ symbolKind: isKnownKind(kind) ? kind : null,
702
+ ...(parentName ? { parentName } : {})
703
+ }, config)
704
+ };
705
+ });
706
+ }
707
+ function formatSelector(selector, config) {
708
+ const symbolName = selector.parentName ? `${selector.parentName}.${selector.symbolName}` : selector.symbolName;
709
+ if (!selector.symbolKind) {
710
+ return selector.raw;
711
+ }
712
+ const alias = config.entityKindAliases[selector.symbolKind];
713
+ return `${alias}${config.selectorSeparator}${symbolName}`;
714
+ }
715
+ function getRenameApiScanRoots(cwd, workspaceFolders) {
716
+ const resolvedCwd = normalizeComparablePath(path.resolve(cwd));
717
+ const candidates = [];
718
+ for (const folder of workspaceFolders.map((item) => path.resolve(item))) {
719
+ const comparableFolder = normalizeComparablePath(folder);
720
+ if (resolvedCwd === comparableFolder || comparableFolder.startsWith(`${resolvedCwd}/`)) {
721
+ candidates.push(folder);
722
+ continue;
723
+ }
724
+ if (resolvedCwd.startsWith(`${comparableFolder}/`)) {
725
+ candidates.push(path.resolve(cwd));
726
+ }
727
+ }
728
+ if (candidates.length === 0) {
729
+ return [path.resolve(cwd)];
730
+ }
731
+ return Array.from(new Set(candidates));
732
+ }
733
+ function compactList(items, limit) {
734
+ const visible = items.slice(0, limit);
735
+ const hidden = items.length - visible.length;
736
+ return hidden > 0 ? [...visible, `+ ${hidden} more`] : visible;
737
+ }
738
+ function readNumber(value) {
739
+ return typeof value === "number" ? value : 0;
740
+ }
741
+ function readString(value) {
742
+ return typeof value === "string" ? value : null;
743
+ }
744
+ function readStringArray(value) {
745
+ return Array.isArray(value) ? value.filter((item) => typeof item === "string") : [];
746
+ }
747
+ function formatDuration(milliseconds) {
748
+ const seconds = Math.max(1, Math.ceil(milliseconds / 1000));
749
+ if (seconds < 60) {
750
+ return `~${seconds} sec`;
751
+ }
752
+ const minutes = Math.ceil(seconds / 60);
753
+ return `~${minutes} min`;
754
+ }
755
+ function formatRelativePath(cwd, filePath) {
756
+ return path.relative(cwd, filePath).replace(/\\/g, "/");
757
+ }
758
+ function readFlagValue(args, flag) {
759
+ const index = args.indexOf(flag);
760
+ if (index < 0) {
761
+ return null;
762
+ }
763
+ const value = args[index + 1];
764
+ return value && !value.startsWith("--") ? value : null;
765
+ }
766
+ function renameEntitiesHelp() {
767
+ return {
768
+ ok: true,
769
+ command: "rename",
770
+ usage: "aib rename preview <sourceFile> <entity> <newName> | aib rename preview --stdin | aib rename execute --stdin | aib rename apply <previewId>",
771
+ preview: {
772
+ sourceFile: "src/path/to/source-file.ts",
773
+ renames: [
774
+ {
775
+ entity: "OldSymbolName",
776
+ newName: "NewSymbolName"
777
+ }
778
+ ],
779
+ execute: false
780
+ },
781
+ apply: "aib rename apply rename_abc123",
782
+ notes: [
783
+ "Use execute:false first when selector resolution is uncertain.",
784
+ "Preview returns previewId, file/edit summary, and candidate selectors on failure.",
785
+ "Apply by previewId refuses to run if the source file changed after preview."
786
+ ]
787
+ };
788
+ }
789
+ function isJsonObject(value) {
790
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
791
+ }
792
+ function isKnownKind(value) {
793
+ return types_1.ENTITY_KIND_IDS.includes(value);
794
+ }