@automaton-labs/aib 0.0.7 → 0.0.8

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 +36 -257
  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 +210 -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,461 @@
1
- "use strict";var oe=exports&&exports.__createBinding||(Object.create?(function(e,t,r,n){n===void 0&&(n=r);var o=Object.getOwnPropertyDescriptor(t,r);(!o||("get"in o?!t.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,o)}):(function(e,t,r,n){n===void 0&&(n=r),e[n]=t[r]})),ae=exports&&exports.__setModuleDefault||(Object.create?(function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}):function(e,t){e.default=t}),J=exports&&exports.__importStar||(function(){var e=function(t){return e=Object.getOwnPropertyNames||function(r){var n=[];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(n[n.length]=o);return n},e(t)};return function(t){if(t&&t.__esModule)return t;var r={};if(t!=null)for(var n=e(t),o=0;o<n.length;o++)n[o]!=="default"&&oe(r,t,n[o]);return ae(r,t),r}})();Object.defineProperty(exports,"__esModule",{value:!0}),exports.runRefactorBatch=de,exports.readCachedRefactorBatchExecution=he;const G=J(require("node:fs")),M=J(require("node:path")),A=require("zod"),ie=require("../client/http-client"),w=require("../config/env-vars"),se=require("../config/product-storage"),ce=require("../shared/routes"),ue=require("../shared/protocol"),P=require("../shared/agent-text"),le=require("../shared/errors"),fe=require("./refactor-batch-builder"),C=require("./refactor-batch-preview-cache"),x=require("./refactor-batch-execution-cache"),K=require("./mutation-execution-cache"),j=require("./shared"),q=A.z.object({operations:A.z.array(A.z.unknown()).min(1).optional(),requests:A.z.array(A.z.unknown()).min(1).optional(),continueOnError:A.z.boolean().optional(),execution:A.z.literal("sequential").optional()}).passthrough().refine(e=>Array.isArray(e.operations)||Array.isArray(e.requests),{message:"refactor batch expects operations[] or requests[]."});async function de(e,t,r={},n="preview",o={}){if(n==="apply"&&o.previewId){const u=L();if(u>0){const s=U(e,o.previewId),h=q.parse(z(s.normalizedPayload,!0));return X(e,h,r,"apply",{...o,previewId:o.previewId},u)}return pe(e,o.previewId,r,o)}const a=q.parse(t);return(n==="execute"||n==="apply")&&L()>0?X(e,a,r,n,o,L()):N(e,a,r,n,o)}async function pe(e,t,r,n){const o=U(e,t),a=q.parse(z(o.normalizedPayload,!0));return N(e,a,r,"apply",{...n,previewId:t})}function U(e,t){const r=(0,C.readRefactorBatchPreviewRecord)(e,t),n=r.files.find(o=>G.existsSync(o.file)!==o.existed||(0,C.hashFileIfExists)(o.file)!==o.hash);if(n)throw new le.CliError("REFACTOR_BATCH_PREVIEW_FILES_CHANGED","Touched files changed after refactor batch preview. Rerun preview.",{previewId:t,file:k(e,n.file)});return r}async function X(e,t,r,n,o,a){const u=(0,x.buildRefactorBatchExecutionId)(),s=`refactor.batch.${n}`,h=Ae(t),p=(0,x.createRefactorBatchExecutionStatus)(e,u,s,Q(t));(0,x.writeRefactorBatchExecutionStatus)(e,p);const f=Date.now(),y=$e(),R=be(()=>(0,se.runWithProductStorageOverride)(y[w.CLI_ENV.productStorageDir],()=>Ce(y,async()=>{try{const l=await N(e,t,r,n,o),g=Y(l);return p.status=l.ok===!1?"failed":"completed",p.phase="completed",p.completedRows=g.filter(i=>i.ok!==!1).length,p.failedRows=g.filter(i=>i.ok===!1).length,p.filesWritten=xe(l),p.result=l,l.ok===!1&&(p.error=c(l.code)??"REFACTOR_BATCH_FAILED"),(0,x.writeRefactorBatchExecutionStatus)(e,p),l}catch(l){throw p.status="failed",p.phase="completed",p.error=l instanceof Error?l.message:String(l),(0,x.writeRefactorBatchExecutionStatus)(e,p),l}}))),m=await _e(R,a);return m.status==="result"?m.result:(R.catch(()=>{}),we(e,u,s,h,Date.now()-f))}async function N(e,t,r,n,o){await Be();const a=await(0,j.resolveCompatibleTargetInstance)(e,ue.CLI_COMMAND_IDS.refactorBatch,r),u=await(0,j.fetchEffectiveConfig)(a.entry,r),s=(0,fe.buildExtensionRefactorBatchPayload)(t,u),h=await(0,ie.postJson)(a.entry,ce.EXTENSION_ROUTES.refactorBatch,s.payload,(0,j.extensionRequestOptions)(r)),p=me(e,h),f={ok:p.batchOk===!0,...p.batchOk===!0?{}:{code:"REFACTOR_BATCH_FAILED"},operation:`refactor.batch.${n}`,builder:s.summary,response:p};if(n==="preview"&&f.ok!==!1){const R=z(t,!1),m=(0,C.buildRefactorBatchPreviewId)(R),l=Ie(e,s.payload),g=(0,C.buildRefactorBatchPreviewHash)(R,l,f);(0,C.writeRefactorBatchPreviewRecord)(e,{previewId:m,previewHash:g,createdAt:new Date().toISOString(),cwd:M.resolve(e),normalizedPayload:R,files:l,builder:s.summary,previewResult:f}),f.previewId=m,f.next=`aib refactor batch apply ${m}`}const y={...o,...typeof f.previewId=="string"?{previewId:f.previewId}:{},...typeof f.next=="string"?{next:f.next}:{}};return(0,P.attachAgentText)(f,Re(e,s.summary,p,n,y))}function he(e,t){const r=(0,x.readRefactorBatchExecutionStatus)(e,t);if((r.status==="completed"||r.status==="failed")&&r.result)return r.result;const n={operation:"execution.status",executionId:r.executionId,status:r.status,phase:r.phase,summary:F(r),progress:`${r.completedRows}/${r.rowCount}`,filesWritten:r.filesWritten,updatedAt:r.updatedAt,...r.error?{error:r.error}:{}};return(0,P.attachAgentText)(n,ve(r))}function me(e,t){const r=Array.isArray(t.rows)?t.rows.map(n=>ye(e,n)):[];return{ok:t.ok===!0,operation:c(t.operation),contract:t.contract??null,execution:c(t.execution),continueOnError:t.continueOnError===!0,batchOk:t.batchOk===!0,batchStatus:c(t.batchStatus),requestedOperationCount:v(t.requestedOperationCount),plannedOperationCount:v(t.plannedOperationCount),attemptedRowCount:v(t.attemptedRowCount),rowCount:v(t.rowCount),passedRowCount:v(t.passedRowCount),failedRowCount:v(t.failedRowCount),skippedRowCount:v(t.skippedRowCount),guidance:t.guidance??null,rows:r,...t._metrics?{_metrics:t._metrics}:{}}}function ye(e,t){if(!t||typeof t!="object"||Array.isArray(t))return{ok:!1,error:"Invalid batch row shape."};const r=t;return r.skipped===!0?T({index:v(r.index),id:c(r.id),kind:c(r.kind),planned:r.planned===!0,attempted:!1,outcome:c(r.outcome),skipped:!0,skipReason:c(r.skipReason),error:c(r.error)}):T({index:v(r.index),id:c(r.id),kind:c(r.kind),planned:r.planned===!0,attempted:r.attempted===!0,outcome:c(r.outcome),ok:r.ok===!0,statusCode:v(r.statusCode),durationMs:v(r.durationMs),applied:r.applied===!0,touchedFiles:E(r.touchedFiles).map(n=>k(e,n)),savedFiles:E(r.savedFiles).map(n=>k(e,n)),error:c(r.error),response:Le(r.response)})}function Re(e,t,r,n,o={}){const a=Array.isArray(r.rows)?r.rows.filter(l=>!!l&&typeof l=="object"&&!Array.isArray(l)):[],u=a.filter(l=>l.outcome==="applied").length,s=a.filter(l=>l.outcome==="validated").length,h=typeof r.failedRowCount=="number"?r.failedRowCount:a.filter(l=>l.ok===!1).length,p=n==="execute"||n==="apply"||n==="validate"?n:u>0?"apply":"preview",f=[];o.routedFrom==="move.toFile"&&(f.push("move.toFile routed to refactor.batch"),f.push(""));const y=Me(t,e),R=Fe(t);if(f.push(Ee(p,o)),f.push(Se(p,{movePlan:y,renamePlan:R},a,u,s,h)),(y||R)&&a.length>0)ke(f,{movePlan:y,renamePlan:R},a);else for(const l of a){const g=c(l.id)??`row ${v(l.index)??"?"}`,i=c(l.kind)??"operation",b=c(l.outcome)??(l.ok===!0?"ok":"failed");f.push(`${Pe(i)} ${je(g)} ${b}`)}const m=D(a.flatMap(l=>E(l.savedFiles)));return m.length>0&&(f.push("filesWritten:"),f.push(...m)),o.next&&f.push(`next: ${o.next}`),f.join(`
2
- `)}function we(e,t,r,n,o){const a=(0,x.readRefactorBatchExecutionStatus)(e,t),u=Math.max(0,n-o),s={operation:"execution.status",executionId:a.executionId,status:a.status,phase:a.phase,summary:F(a),progress:`${a.completedRows}/${a.rowCount}`,filesWritten:a.filesWritten,updatedAt:a.updatedAt,estimatedRemainingMs:u};return(0,P.attachAgentText)(s,ge(r,a,u))}function ge(e,t,r){return[`${e} ${t.executionId}`,F(t),"applying mutation",r>0?`estimated remaining: ${Ne(Math.max(r,5e3))}`:"estimated remaining: check status again soon"].join(`
3
- `)}function ve(e){const t=[`${e.operation} ${e.executionId}`,F(e)];return e.status==="running"&&t.push("applying mutation"),e.error&&t.push(e.error),t.join(`
4
- `)}function F(e){return e.status==="completed"?`completed, ${e.completedRows}/${e.rowCount} rows, ${e.filesWritten.length} files written`:e.status==="failed"?`failed, ${e.completedRows}/${e.rowCount} rows, ${e.failedRows} failed`:`in progress, ${e.completedRows}/${e.rowCount} rows`}function be(e){return new Promise((t,r)=>{setImmediate(()=>{e().then(t,r)})})}async function _e(e,t){return(0,K.waitForMutationDeadline)(e,t)}function L(){return(0,K.readMutationSyncWaitMs)(process.env[w.CLI_ENV.refactorBatchSyncWaitMs],12e4)}function Ae(e){return 12e3+Q(e)*2e3}function Q(e){const t=Array.isArray(e.operations)?e.operations:Array.isArray(e.requests)?e.requests:[];let r=0;for(const n of t){if(!_(n)){r+=1;continue}const o=Array.isArray(n.entities)?n.entities:Array.isArray(n.symbols)?n.symbols:[],a=Array.isArray(n.renames)?n.renames:[];r+=Math.max(1,o.length,a.length)}return Math.max(1,r)}function xe(e){const t=Y(e);return D(t.flatMap(r=>E(r.savedFiles)))}function Y(e){const t=_(e.response)?e.response:null;return Array.isArray(t?.rows)?t.rows.filter(_):[]}async function Be(){const e=process.env[w.CLI_ENV.testRefactorBatchDelayMs];if(!e)return;const t=Number.parseInt(e,10);!Number.isFinite(t)||t<=0||await new Promise(r=>setTimeout(r,Math.min(t,12e4)))}function $e(){const e=[w.CLI_ENV.productStorageDir,w.CLI_ENV.trace,w.CLI_ENV.traceDir,w.CLI_ENV.metrics,w.CLI_ENV.metricsDir,w.CLI_ENV.metricsTag,w.CLI_ENV.mutationImpactMetrics,w.CLI_ENV.mutationImpactStream,w.CLI_ENV.testMoveToFileFailEntity,w.CLI_ENV.testRefactorBatchDelayMs],t={};for(const r of e)t[r]=process.env[r];return t}async function Ce(e,t){const r={};for(const[n,o]of Object.entries(e))r[n]=process.env[n],o===void 0?delete process.env[n]:process.env[n]=o;try{return await t()}finally{for(const[n,o]of Object.entries(r))o===void 0?delete process.env[n]:process.env[n]=o}}function Ie(e,t){const r=Array.isArray(t.operations)?t.operations.filter(_):[],n=new Set;for(const o of r){const a=_(o.body)?o.body:{},u=c(a.sourceFile),s=c(a.targetFile);u&&n.add(Z(e,u)),s&&n.add(Z(e,s))}return Array.from(n).sort((o,a)=>o.localeCompare(a)).map(o=>({file:o,existed:G.existsSync(o),hash:(0,C.hashFileIfExists)(o)}))}function Z(e,t){return M.normalize(M.isAbsolute(t)?t:M.resolve(e,t))}function Ee(e,t){return e==="preview"&&t.previewId?`refactor.batch.preview ${t.previewId}`:`refactor.batch.${e}`}function Se(e,t,r,n,o,a){const u=t.movePlan?.rows??[],s=t.renamePlan?.rows??[];if(u.length===0&&s.length===0)return`${r.length} rows, ${n>0?`${n} applied`:`${o} validated`}${a>0?`, ${a} failed`:""}`;const h=new Map(r.map(d=>[c(d.id),d]).filter(d=>!!d[0])),p=r.find(d=>d.ok===!1||d.outcome==="failed")??null,f=p?c(p.id):null,y=f?u.some(d=>d.id===f):!1,R=f?s.some(d=>d.id===f):!1,m=new Set(r.filter(d=>d.outcome==="applied").map(d=>c(d.id)).filter(d=>!!d)),l=new Set(r.filter(d=>d.outcome==="validated").map(d=>c(d.id)).filter(d=>!!d)),g=new Set(u.map(d=>d.targetFile)).size,i=D(r.flatMap(d=>E(d.savedFiles))).length,b=u.filter(d=>m.has(d.id)||l.has(d.id)).length,B=s.filter(d=>m.has(d.id)||l.has(d.id)).length;if(p){const d=[...s,...u],V=f?d.findIndex($=>$.id===f):-1,H=d.filter(($,ne)=>!m.has($.id)&&!l.has($.id)&&$.id!==f&&(V<0||ne>V||!h.has($.id))).length,I=[];return B>0&&I.push(`${B} ${B===1?"rename":"renames"} applied`),b>0&&I.push(`${b} ${b===1?"symbol":"symbols"} moved`),I.push(y?"1 symbol failed":R?"1 rename failed":"1 failed"),H>0&&I.push(`${H} not run`),I.join(", ")}const S=[];s.length>0&&S.push(`${s.length} ${s.length===1?"rename":"renames"}`),u.length>0&&(S.push(`${u.length} ${u.length===1?"symbol":"symbols"}`),S.push(`${g} ${g===1?"target":"targets"}`));const O=S.join(", ");if(e==="preview"||e==="validate")return`${O} ready`;const W=s.length>0?"applied":"moved";return i>0?`${O} ${W}; ${i} ${i===1?"file":"files"} written`:`${O} ${W}`}function Me(e,t){const n=(Array.isArray(e.rows)?e.rows.filter(_):[]).filter(a=>c(a.op)==="move");if(n.length===0)return null;const o=[];for(const a of n){const u=Array.isArray(a.builtRows)?a.builtRows.filter(_):[];for(const s of u){const h=c(s.id),p=c(s.entity),f=c(s.targetFile);h&&p&&f&&o.push({id:h,entity:p,targetFile:k(t,f)})}}return o.length>0?{rows:o}:null}function Fe(e){const r=(Array.isArray(e.rows)?e.rows.filter(_):[]).filter(o=>c(o.op)==="rename");if(r.length===0)return null;const n=[];for(const o of r){const a=Array.isArray(o.builtRows)?o.builtRows.filter(_):[];for(const u of a){const s=c(u.id),h=c(u.entity),p=c(u.newName);s&&h&&p&&n.push({id:s,entity:h,newName:p})}}return n.length>0?{rows:n}:null}function ke(e,t,r){const n=t.movePlan?.rows??[],o=t.renamePlan?.rows??[],a=new Map(r.map(i=>[c(i.id),i]).filter(i=>!!i[0])),u=new Set(r.filter(i=>i.outcome==="applied").map(i=>c(i.id)).filter(i=>!!i)),s=r.find(i=>i.ok===!1||i.outcome==="failed")??null,h=s?c(s.id):null,p=h?n.find(i=>i.id===h)??null:null,f=h?o.find(i=>i.id===h)??null:null,y=[...o,...n];if(s===null&&y.every(i=>u.has(i.id)||a.get(i.id)?.outcome==="validated")){ee(e,o,a,u),te(e,n,a,u);return}if(ee(e,o.filter(i=>u.has(i.id)),a,u),te(e,n.filter(i=>u.has(i.id)),a,u),s){e.push("failed:"),p?e.push(`${p.entity} -> ${p.targetFile}`):f&&e.push(`${f.entity} -> ${f.newName}`);const i=_(s.response)?s.response:null,b=c(i?.code)??c(i?.errorCode)??c(s.statusCode),B=qe(c(s.error)??(i?c(i.error):null));b&&e.push(`code: ${b}`),B&&e.push(B)}const m=h??null,l=m?y.findIndex(i=>i.id===m):-1,g=y.filter((i,b)=>!u.has(i.id)&&i.id!==h&&(l<0||b>l||!a.has(i.id)));g.length>0&&(e.push("not run:"),e.push(re(g.map(i=>i.entity),15)))}function ee(e,t,r,n){const o=t.filter(a=>n.has(a.id)||r.get(a.id)?.outcome==="validated");if(o.length!==0){e.push("renames:");for(const a of o)e.push(`${a.entity} -> ${a.newName}`)}}function te(e,t,r,n){const o=t.filter(a=>n.has(a.id)||r.get(a.id)?.outcome==="validated");o.length!==0&&(e.push("moves:"),Oe(e,o))}function Oe(e,t){const r=new Map;for(const n of t){const o=r.get(n.targetFile)??[];o.push(n.entity),r.set(n.targetFile,o)}for(const[n,o]of r)e.push(`${n}: ${re(o,15)}`)}function Pe(e){return e==="moveRefactor"?"move":e==="renameSymbol"?"rename":e}function je(e){const t=e.indexOf(":");return t>=0?e.slice(t+1):e}function D(e){return Array.from(new Set(e))}function re(e,t){const r=e.slice(0,t),n=e.length-r.length;return n>0?`${r.join(", ")}, + ${n} more`:r.join(", ")}function qe(e){return e?.replace(/^TypeScript refactor failed: Debug Failure\. False expression: /,"")??null}function Ne(e){const t=Math.max(1,Math.round(e/1e3));return t<60?`~${t} sec`:`~${Math.max(1,Math.round(t/60))} min`}function _(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function k(e,t){const r=t.replace(/\\/g,"/"),n=e.replace(/\\/g,"/").replace(/\/$/,""),o=r.toLowerCase(),a=n.toLowerCase();return o.startsWith(`${a}/`)?r.slice(n.length+1):r}function Le(e){if(!e||typeof e!="object"||Array.isArray(e))return null;const t=e;return T({ok:t.ok===!0,code:c(t.code),errorCode:c(t.errorCode),error:c(t.error),hint:c(t.hint),execute:typeof t.execute=="boolean"?t.execute:null,applied:typeof t.applied=="boolean"?t.applied:null})}function c(e){return typeof e=="string"?e:null}function v(e){return typeof e=="number"?e:null}function E(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function T(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t==null?!1:!(Array.isArray(t)&&t.length===0)))}function z(e,t){const r=Array.isArray(e.operations)?e.operations:Array.isArray(e.requests)?e.requests:null;if(!r)return{...e,execute:t};const{operations:n,...o}=e;return{...o,requests:r.map(a=>a&&typeof a=="object"&&!Array.isArray(a)?{...a,execute:t}:a),execute:t}}
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runRefactorBatch = runRefactorBatch;
4
+ exports.readCachedRefactorBatchExecution = readCachedRefactorBatchExecution;
5
+ exports.formatRefactorBatchAgentText = formatRefactorBatchAgentText;
6
+ const zod_1 = require("zod");
7
+ const env_vars_1 = require("../config/env-vars");
8
+ const agent_text_1 = require("../shared/agent-text");
9
+ const semantic_mutation_runtime_1 = require("../mutation/semantic-mutation-runtime");
10
+ const refactor_batch_execution_cache_1 = require("./refactor-batch-execution-cache");
11
+ const mutation_execution_cache_1 = require("./mutation-execution-cache");
12
+ const selector_suggestions_1 = require("./selector-suggestions");
13
+ const RefactorBatchPayloadSchema = zod_1.z.object({
14
+ operations: zod_1.z.array(zod_1.z.unknown()).min(1).optional(),
15
+ requests: zod_1.z.array(zod_1.z.unknown()).min(1).optional(),
16
+ continueOnError: zod_1.z.boolean().optional(),
17
+ execution: zod_1.z.literal("sequential").optional()
18
+ }).passthrough().refine((payload) => Array.isArray(payload.operations) || Array.isArray(payload.requests), {
19
+ message: "refactor batch expects operations[] or requests[]."
20
+ });
21
+ async function runRefactorBatch(cwd, rawPayload, options = {}, action = "preview", formatOptions = {}) {
22
+ if (action === "apply" && formatOptions.previewId) {
23
+ const runtime = await (0, semantic_mutation_runtime_1.runSemanticMutationRuntime)(cwd, undefined, options, "apply", {
24
+ operationPrefix: "refactor.batch",
25
+ previewApplyCommand: "aib refactor batch apply",
26
+ previewId: formatOptions.previewId,
27
+ syncWaitMs: readRefactorBatchSyncWaitMs(),
28
+ formatOptions: { ...formatOptions, previewId: formatOptions.previewId },
29
+ formatResult: (result, builder, response, runtimeAction, runtimeFormatOptions) => (0, agent_text_1.attachAgentText)(result, formatRefactorBatchAgentText(cwd, builder, response, runtimeAction, runtimeFormatOptions))
30
+ });
31
+ return runtime.result;
32
+ }
33
+ const payload = RefactorBatchPayloadSchema.parse(rawPayload);
34
+ const runtime = await (0, semantic_mutation_runtime_1.runSemanticMutationRuntime)(cwd, payload, options, readSemanticRuntimeAction(action), {
35
+ operationPrefix: "refactor.batch",
36
+ previewApplyCommand: "aib refactor batch apply",
37
+ syncWaitMs: readRefactorBatchSyncWaitMs(),
38
+ formatOptions,
39
+ formatResult: (result, builder, response, runtimeAction, runtimeFormatOptions) => (0, agent_text_1.attachAgentText)(result, formatRefactorBatchAgentText(cwd, builder, response, runtimeAction, runtimeFormatOptions))
40
+ });
41
+ return runtime.result;
42
+ }
43
+ function readSemanticRuntimeAction(action) {
44
+ return action === "execute" || action === "apply" || action === "validate" ? action : "preview";
45
+ }
46
+ function readCachedRefactorBatchExecution(cwd, executionId) {
47
+ const status = (0, refactor_batch_execution_cache_1.readRefactorBatchExecutionStatus)(cwd, executionId);
48
+ if ((status.status === "completed" || status.status === "failed") && status.result) {
49
+ return status.result;
50
+ }
51
+ const response = {
52
+ operation: "execution.status",
53
+ executionId: status.executionId,
54
+ status: status.status,
55
+ phase: status.phase,
56
+ summary: buildRefactorBatchExecutionSummary(status),
57
+ progress: `${status.completedRows}/${status.rowCount}`,
58
+ filesWritten: status.filesWritten,
59
+ updatedAt: status.updatedAt,
60
+ ...(status.journal ? { journal: status.journal } : {}),
61
+ ...(status.error ? { error: status.error } : {})
62
+ };
63
+ return (0, agent_text_1.attachAgentText)(response, formatRefactorBatchExecutionStatusText(status));
64
+ }
65
+ function formatRefactorBatchAgentText(cwd, builder, response, action, options = {}) {
66
+ const rows = Array.isArray(response.rows) ? response.rows.filter((row) => Boolean(row) && typeof row === "object" && !Array.isArray(row)) : [];
67
+ const applied = rows.filter((row) => row.outcome === "applied").length;
68
+ const validated = rows.filter((row) => row.outcome === "validated").length;
69
+ const failed = typeof response.failedRowCount === "number" ? response.failedRowCount : rows.filter((row) => row.ok === false).length;
70
+ const manualExtractionRows = readManualExtractionRows(rows);
71
+ const mode = action === "execute" || action === "apply" || action === "validate" ? action : applied > 0 ? "apply" : "preview";
72
+ const lines = [];
73
+ const movePlan = readMovePlan(builder, cwd);
74
+ const renamePlan = readRenamePlan(builder);
75
+ lines.push(formatRefactorBatchHeader(mode, options));
76
+ lines.push(formatRefactorBatchSummaryLine(mode, { movePlan, renamePlan }, rows, applied, validated, failed, manualExtractionRows));
77
+ if (mode === "preview" && failed === 0 && manualExtractionRows.length === 0) {
78
+ if (options.next) {
79
+ lines.push(`next: ${options.next}`);
80
+ }
81
+ return lines.join("\n");
82
+ }
83
+ if ((movePlan || renamePlan) && rows.length > 0) {
84
+ appendRefactorPlanBatchLines(lines, { movePlan, renamePlan }, rows);
85
+ }
86
+ else {
87
+ for (const row of rows) {
88
+ const id = readString(row.id) ?? `row ${readNumber(row.index) ?? "?"}`;
89
+ const kind = readString(row.kind) ?? "operation";
90
+ const outcome = readString(row.outcome) ?? (row.ok === true ? "ok" : "failed");
91
+ lines.push(`${formatRefactorBatchRowKind(kind)} ${formatRefactorBatchRowEntity(id)} ${outcome}`);
92
+ }
93
+ }
94
+ const files = uniqueStrings(rows.flatMap((row) => options.includeTouchedFiles === true && (mode === "preview" || mode === "validate")
95
+ ? readStringArray(row.touchedFiles)
96
+ : readStringArray(row.savedFiles)));
97
+ if (files.length > 0) {
98
+ lines.push(mode === "preview" || mode === "validate" ? "files:" : "filesWritten:");
99
+ lines.push(...files);
100
+ }
101
+ if (options.next) {
102
+ lines.push(`next: ${options.next}`);
103
+ }
104
+ return lines.join("\n");
105
+ }
106
+ function buildRefactorBatchStillRunningResponse(cwd, executionId, operation, estimatedDurationMs, elapsedMs) {
107
+ const status = (0, refactor_batch_execution_cache_1.readRefactorBatchExecutionStatus)(cwd, executionId);
108
+ const estimatedRemainingMs = Math.max(0, estimatedDurationMs - elapsedMs);
109
+ const response = {
110
+ operation: "execution.status",
111
+ executionId: status.executionId,
112
+ status: status.status,
113
+ phase: status.phase,
114
+ summary: buildRefactorBatchExecutionSummary(status),
115
+ progress: `${status.completedRows}/${status.rowCount}`,
116
+ filesWritten: status.filesWritten,
117
+ updatedAt: status.updatedAt,
118
+ estimatedRemainingMs
119
+ };
120
+ return (0, agent_text_1.attachAgentText)(response, formatRefactorBatchStillRunningText(operation, status, estimatedRemainingMs));
121
+ }
122
+ function formatRefactorBatchStillRunningText(operation, status, estimatedRemainingMs) {
123
+ const lines = [
124
+ `${operation} ${status.executionId}`,
125
+ buildRefactorBatchExecutionSummary(status),
126
+ "applying mutation",
127
+ estimatedRemainingMs > 0
128
+ ? `estimated remaining: ${formatDuration(Math.max(estimatedRemainingMs, 5_000))}`
129
+ : "estimated remaining: check status again soon"
130
+ ];
131
+ return lines.join("\n");
132
+ }
133
+ function formatRefactorBatchExecutionStatusText(status) {
134
+ const lines = [
135
+ `${status.operation} ${status.executionId}`,
136
+ buildRefactorBatchExecutionSummary(status)
137
+ ];
138
+ if (status.status === "running") {
139
+ lines.push("applying mutation");
140
+ }
141
+ if (status.error) {
142
+ lines.push(status.error);
143
+ }
144
+ return lines.join("\n");
145
+ }
146
+ function buildRefactorBatchExecutionSummary(status) {
147
+ if (status.status === "completed") {
148
+ return `completed, ${status.completedRows}/${status.rowCount} rows, ${status.filesWritten.length} files written`;
149
+ }
150
+ if (status.status === "failed") {
151
+ return `failed, ${status.completedRows}/${status.rowCount} rows, ${status.failedRows} failed`;
152
+ }
153
+ return `in progress, ${status.completedRows}/${status.rowCount} rows`;
154
+ }
155
+ function readRefactorBatchSyncWaitMs() {
156
+ return (0, mutation_execution_cache_1.readMutationSyncWaitMs)(process.env[env_vars_1.CLI_ENV.refactorBatchSyncWaitMs], 120_000);
157
+ }
158
+ function formatRefactorBatchHeader(mode, options) {
159
+ const operation = options.operationLabel ??
160
+ (options.routedFrom === "move.toFile" || options.routedFrom === "rename"
161
+ ? options.routedFrom
162
+ : "refactor.batch");
163
+ return mode === "preview" && options.previewId
164
+ ? `${operation}.preview ${options.previewId}`
165
+ : `${operation}.${mode}`;
166
+ }
167
+ function formatRefactorBatchSummaryLine(mode, plan, rows, applied, validated, failed, manualExtractionRows = []) {
168
+ const moveRows = plan.movePlan?.rows ?? [];
169
+ const renameRows = plan.renamePlan?.rows ?? [];
170
+ if (moveRows.length === 0 && renameRows.length === 0) {
171
+ return `${rows.length} rows, ${applied > 0 ? `${applied} applied` : `${validated} validated`}${failed > 0 ? `, ${failed} failed` : ""}`;
172
+ }
173
+ const rowById = new Map(rows.map((row) => [readString(row.id), row]).filter((entry) => Boolean(entry[0])));
174
+ const failedRow = rows.find((row) => row.ok === false || row.outcome === "failed") ?? null;
175
+ const failedId = failedRow ? readString(failedRow.id) : null;
176
+ const failedIsMove = failedId ? moveRows.some((row) => row.id === failedId) : false;
177
+ const failedIsRename = failedId ? renameRows.some((row) => row.id === failedId) : false;
178
+ const appliedIds = new Set(rows.filter((row) => row.outcome === "applied").map((row) => readString(row.id)).filter((id) => Boolean(id)));
179
+ const validatedIds = new Set(rows.filter((row) => row.outcome === "validated").map((row) => readString(row.id)).filter((id) => Boolean(id)));
180
+ const targetCount = new Set(moveRows.map((row) => row.targetFile)).size;
181
+ const filesWritten = uniqueStrings(rows.flatMap((row) => readStringArray(row.savedFiles))).length;
182
+ const completedMoveCount = moveRows.filter((row) => appliedIds.has(row.id) || validatedIds.has(row.id)).length;
183
+ const completedRenameCount = renameRows.filter((row) => appliedIds.has(row.id) || validatedIds.has(row.id)).length;
184
+ const manualExtractionCount = manualExtractionRows.length;
185
+ const manualExtractionIds = new Set(manualExtractionRows.map((row) => readString(row.id)).filter((id) => Boolean(id)));
186
+ const nonManualFailedCount = Math.max(0, failed - manualExtractionCount);
187
+ if (failedRow) {
188
+ const planRows = [...renameRows, ...moveRows];
189
+ const terminalIndex = failedId ? planRows.findIndex((row) => row.id === failedId) : -1;
190
+ const notRunCount = planRows.filter((row, index) => !appliedIds.has(row.id) &&
191
+ !validatedIds.has(row.id) &&
192
+ !manualExtractionIds.has(row.id) &&
193
+ row.id !== failedId &&
194
+ (terminalIndex < 0 || index > terminalIndex || !rowById.has(row.id))).length;
195
+ const parts = [];
196
+ if (completedRenameCount > 0) {
197
+ parts.push(`${completedRenameCount} ${completedRenameCount === 1 ? "rename" : "renames"} applied`);
198
+ }
199
+ if (completedMoveCount > 0) {
200
+ parts.push(`${completedMoveCount} ${completedMoveCount === 1 ? "symbol" : "symbols"} moved`);
201
+ }
202
+ if (manualExtractionCount > 0) {
203
+ parts.push(`${manualExtractionCount} manual extraction required`);
204
+ }
205
+ if (nonManualFailedCount > 0) {
206
+ parts.push(failedIsMove ? "1 symbol failed" : failedIsRename ? "1 rename failed" : `${nonManualFailedCount} failed`);
207
+ }
208
+ if (notRunCount > 0) {
209
+ parts.push(`${notRunCount} not run`);
210
+ }
211
+ return parts.join(", ");
212
+ }
213
+ const baseParts = [];
214
+ if (renameRows.length > 0) {
215
+ baseParts.push(`${renameRows.length} ${renameRows.length === 1 ? "rename" : "renames"}`);
216
+ }
217
+ if (moveRows.length > 0) {
218
+ baseParts.push(`${moveRows.length} ${moveRows.length === 1 ? "symbol" : "symbols"}`);
219
+ baseParts.push(`${targetCount} ${targetCount === 1 ? "target" : "targets"}`);
220
+ }
221
+ const base = baseParts.join(", ");
222
+ if (mode === "preview" || mode === "validate") {
223
+ return `${base} ready`;
224
+ }
225
+ const verb = renameRows.length > 0 ? "applied" : "moved";
226
+ return filesWritten > 0 ? `${base} ${verb}; ${filesWritten} ${filesWritten === 1 ? "file" : "files"} written` : `${base} ${verb}`;
227
+ }
228
+ function readMovePlan(builder, cwd) {
229
+ const sourceRows = Array.isArray(builder.rows) ? builder.rows.filter(isJsonObject) : [];
230
+ const moveRows = sourceRows.filter((row) => readString(row.op) === "move");
231
+ if (moveRows.length === 0) {
232
+ return null;
233
+ }
234
+ const rows = [];
235
+ for (const sourceRow of moveRows) {
236
+ const sourceFile = readString(sourceRow.sourceFile);
237
+ const builtRows = Array.isArray(sourceRow.builtRows) ? sourceRow.builtRows.filter(isJsonObject) : [];
238
+ for (const builtRow of builtRows) {
239
+ const id = readString(builtRow.id);
240
+ const entity = readString(builtRow.entity);
241
+ const targetFile = readString(builtRow.targetFile);
242
+ if (id && entity && sourceFile && targetFile) {
243
+ rows.push({
244
+ id,
245
+ entity,
246
+ sourceFile,
247
+ targetFile: compactPath(cwd, targetFile)
248
+ });
249
+ }
250
+ }
251
+ }
252
+ return rows.length > 0 ? { rows } : null;
253
+ }
254
+ function readRenamePlan(builder) {
255
+ const sourceRows = Array.isArray(builder.rows) ? builder.rows.filter(isJsonObject) : [];
256
+ const renameRows = sourceRows.filter((row) => readString(row.op) === "rename");
257
+ if (renameRows.length === 0) {
258
+ return null;
259
+ }
260
+ const rows = [];
261
+ for (const sourceRow of renameRows) {
262
+ const builtRows = Array.isArray(sourceRow.builtRows) ? sourceRow.builtRows.filter(isJsonObject) : [];
263
+ for (const builtRow of builtRows) {
264
+ const id = readString(builtRow.id);
265
+ const entity = readString(builtRow.entity);
266
+ const newName = readString(builtRow.newName);
267
+ if (id && entity && newName) {
268
+ rows.push({ id, entity, newName });
269
+ }
270
+ }
271
+ }
272
+ return rows.length > 0 ? { rows } : null;
273
+ }
274
+ function appendRefactorPlanBatchLines(lines, plan, rows) {
275
+ const moveRows = plan.movePlan?.rows ?? [];
276
+ const renameRows = plan.renamePlan?.rows ?? [];
277
+ const rowById = new Map(rows.map((row) => [readString(row.id), row]).filter((entry) => Boolean(entry[0])));
278
+ const appliedIds = new Set(rows.filter((row) => row.outcome === "applied").map((row) => readString(row.id)).filter((id) => Boolean(id)));
279
+ const manualExtractionRows = readManualExtractionRows(rows);
280
+ const manualExtractionIds = new Set(manualExtractionRows.map((row) => readString(row.id)).filter((id) => Boolean(id)));
281
+ const failedRow = rows.find((row) => (row.ok === false || row.outcome === "failed") && !isManualExtractionRow(row)) ?? null;
282
+ const failedId = failedRow ? readString(failedRow.id) : null;
283
+ const failedMoveRow = failedId ? moveRows.find((row) => row.id === failedId) ?? null : null;
284
+ const failedRenameRow = failedId ? renameRows.find((row) => row.id === failedId) ?? null : null;
285
+ const planRows = [...renameRows, ...moveRows];
286
+ const allSucceeded = failedRow === null &&
287
+ manualExtractionRows.length === 0 &&
288
+ planRows.every((row) => appliedIds.has(row.id) || rowById.get(row.id)?.outcome === "validated");
289
+ if (allSucceeded) {
290
+ appendRenameLines(lines, renameRows, rowById, appliedIds);
291
+ appendMoveLines(lines, moveRows, rowById, appliedIds);
292
+ return;
293
+ }
294
+ appendRenameLines(lines, renameRows.filter((row) => appliedIds.has(row.id)), rowById, appliedIds);
295
+ appendMoveLines(lines, moveRows.filter((row) => appliedIds.has(row.id)), rowById, appliedIds);
296
+ appendManualExtractionRequiredLines(lines, moveRows.filter((row) => manualExtractionIds.has(row.id)));
297
+ if (failedRow) {
298
+ lines.push("failed:");
299
+ const nestedResponse = isJsonObject(failedRow.response) ? failedRow.response : null;
300
+ const error = normalizeRefactorBatchError(readString(failedRow.error) ?? (nestedResponse ? readString(nestedResponse.error) : null));
301
+ if (failedMoveRow && isAmbiguousTopLevelSymbolError(error)) {
302
+ appendAmbiguousMoveSelectorLines(lines, failedMoveRow);
303
+ }
304
+ else if (failedMoveRow) {
305
+ lines.push(`${failedMoveRow.entity} -> ${failedMoveRow.targetFile}`);
306
+ }
307
+ else if (failedRenameRow) {
308
+ lines.push(`${failedRenameRow.entity} -> ${failedRenameRow.newName}`);
309
+ }
310
+ const code = readString(nestedResponse?.code) ?? readString(nestedResponse?.errorCode) ?? readString(failedRow.statusCode);
311
+ if (code) {
312
+ lines.push(`code: ${code}`);
313
+ }
314
+ if (error && !(failedMoveRow && isAmbiguousTopLevelSymbolError(error))) {
315
+ lines.push(error);
316
+ }
317
+ }
318
+ const terminalId = failedId ?? null;
319
+ const terminalIndex = terminalId ? planRows.findIndex((row) => row.id === terminalId) : -1;
320
+ const notRunRows = planRows.filter((row, index) => !appliedIds.has(row.id) &&
321
+ !manualExtractionIds.has(row.id) &&
322
+ row.id !== failedId &&
323
+ (terminalIndex < 0 || index > terminalIndex || !rowById.has(row.id)));
324
+ if (notRunRows.length > 0) {
325
+ lines.push("not run:");
326
+ lines.push(formatInlineList(notRunRows.map((row) => row.entity), 15));
327
+ }
328
+ }
329
+ function appendRenameLines(lines, rows, rowById, appliedIds) {
330
+ const visibleRows = rows.filter((row) => appliedIds.has(row.id) || rowById.get(row.id)?.outcome === "validated");
331
+ if (visibleRows.length === 0) {
332
+ return;
333
+ }
334
+ lines.push("renames:");
335
+ for (const row of visibleRows) {
336
+ lines.push(`${row.entity} -> ${row.newName}`);
337
+ }
338
+ }
339
+ function appendMoveLines(lines, rows, rowById, appliedIds) {
340
+ const visibleRows = rows.filter((row) => appliedIds.has(row.id) || rowById.get(row.id)?.outcome === "validated");
341
+ if (visibleRows.length === 0) {
342
+ return;
343
+ }
344
+ lines.push("moves:");
345
+ appendGroupedMoves(lines, visibleRows);
346
+ }
347
+ function appendGroupedMoves(lines, rows) {
348
+ const byTarget = new Map();
349
+ for (const row of rows) {
350
+ const list = byTarget.get(row.targetFile) ?? [];
351
+ list.push(row.entity);
352
+ byTarget.set(row.targetFile, list);
353
+ }
354
+ for (const [target, entities] of byTarget) {
355
+ lines.push(`${target}: ${formatInlineList(entities, 15)}`);
356
+ }
357
+ }
358
+ function appendManualExtractionRequiredLines(lines, rows) {
359
+ if (rows.length === 0) {
360
+ return;
361
+ }
362
+ lines.push("manualExtractionRequired:");
363
+ appendGroupedMoves(lines, rows);
364
+ lines.push("reason: TypeScript move-to-file provider cannot produce edits for these symbols.");
365
+ lines.push("next: use manual extraction for listed symbols");
366
+ }
367
+ function appendAmbiguousMoveSelectorLines(lines, row) {
368
+ lines.push(`ambiguous entity: ${row.entity}`);
369
+ const selectors = (0, selector_suggestions_1.readTopLevelSelectorSuggestions)(row.sourceFile, row.entity, {
370
+ entityKindAliases: {
371
+ class: "c",
372
+ interface: "i",
373
+ type: "t",
374
+ function: "f",
375
+ variable: "v",
376
+ enum: "e",
377
+ namespace: "ns",
378
+ method: "m",
379
+ property: "p"
380
+ },
381
+ selectorSeparator: "-"
382
+ });
383
+ if (selectors.length === 0) {
384
+ return;
385
+ }
386
+ lines.push("");
387
+ lines.push("Use available:");
388
+ lines.push(`- ${selectors.join(", ")}`);
389
+ }
390
+ function formatRefactorBatchRowKind(kind) {
391
+ if (kind === "moveRefactor") {
392
+ return "move";
393
+ }
394
+ if (kind === "renameSymbol") {
395
+ return "rename";
396
+ }
397
+ return kind;
398
+ }
399
+ function formatRefactorBatchRowEntity(id) {
400
+ const separator = id.indexOf(":");
401
+ return separator >= 0 ? id.slice(separator + 1) : id;
402
+ }
403
+ function uniqueStrings(values) {
404
+ return Array.from(new Set(values));
405
+ }
406
+ function formatInlineList(items, limit) {
407
+ const visible = items.slice(0, limit);
408
+ const hidden = items.length - visible.length;
409
+ return hidden > 0 ? `${visible.join(", ")}, + ${hidden} more` : visible.join(", ");
410
+ }
411
+ function normalizeRefactorBatchError(error) {
412
+ return error?.replace(/^TypeScript refactor failed: Debug Failure\. False expression: /, "") ?? null;
413
+ }
414
+ function isAmbiguousTopLevelSymbolError(error) {
415
+ return typeof error === "string" && error.startsWith("Ambiguous top-level symbol:");
416
+ }
417
+ function readManualExtractionRows(rows) {
418
+ return rows.filter(isManualExtractionRow);
419
+ }
420
+ function isManualExtractionRow(row) {
421
+ const response = isJsonObject(row.response) ? row.response : null;
422
+ const code = readString(response?.code);
423
+ const error = normalizeRefactorBatchError(readString(row.error) ?? readString(response?.error));
424
+ return code === "TS_MOVE_TO_FILE_UNSUPPORTED_BY_ENGINE" ||
425
+ (code === "TS_MOVE_TO_FILE_REFACTOR_FAILED" && /Changes overlap/i.test(error ?? ""));
426
+ }
427
+ function formatDuration(milliseconds) {
428
+ const seconds = Math.max(1, Math.round(milliseconds / 1000));
429
+ if (seconds < 60) {
430
+ return `~${seconds} sec`;
431
+ }
432
+ const minutes = Math.max(1, Math.round(seconds / 60));
433
+ return `~${minutes} min`;
434
+ }
435
+ function isJsonObject(value) {
436
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
437
+ }
438
+ function compactPath(cwd, filePath) {
439
+ const normalized = filePath.replace(/\\/g, "/");
440
+ const cwdNormalized = cwd.replace(/\\/g, "/").replace(/\/$/, "");
441
+ const lower = normalized.toLowerCase();
442
+ const cwdLower = cwdNormalized.toLowerCase();
443
+ return lower.startsWith(`${cwdLower}/`) ? normalized.slice(cwdNormalized.length + 1) : normalized;
444
+ }
445
+ function readString(value) {
446
+ return typeof value === "string" ? value : null;
447
+ }
448
+ function readNumber(value) {
449
+ return typeof value === "number" ? value : null;
450
+ }
451
+ function readStringArray(value) {
452
+ return Array.isArray(value) ? value.filter((item) => typeof item === "string") : [];
453
+ }
454
+ function compactObject(input) {
455
+ return Object.fromEntries(Object.entries(input).filter(([, value]) => {
456
+ if (value === null || value === undefined) {
457
+ return false;
458
+ }
459
+ return !(Array.isArray(value) && value.length === 0);
460
+ }));
461
+ }