@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
@@ -0,0 +1,984 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.planObjectPackSemanticPreview = planObjectPackSemanticPreview;
40
+ exports.validateVirtualProjectDiagnostics = validateVirtualProjectDiagnostics;
41
+ const crypto = __importStar(require("node:crypto"));
42
+ const fs = __importStar(require("node:fs"));
43
+ const path = __importStar(require("node:path"));
44
+ const typescript_1 = __importDefault(require("typescript"));
45
+ const targeted_import_canonicalizer_1 = require("./targeted-import-canonicalizer");
46
+ const concrete_edit_plan_1 = require("./concrete-edit-plan");
47
+ const object_mutation_partition_1 = require("./object-mutation-partition");
48
+ const semantic_workspace_1 = require("./semantic-workspace");
49
+ const runtime_cycle_query_1 = require("./runtime-cycle-query");
50
+ function planObjectPackSemanticPreview(cwd, input) {
51
+ return (0, object_mutation_partition_1.planBestEffortObjectMutation)(input.rows, (rows) => planObjectPackSemanticPreviewStrict(cwd, { sourceFile: input.sourceFile, rows }), { blocksWholeGroup: (issue) => !issue.selector });
52
+ }
53
+ function planObjectPackSemanticPreviewStrict(cwd, input) {
54
+ const root = path.resolve(cwd);
55
+ const sourceFile = path.resolve(root, input.sourceFile);
56
+ const displaySource = toRepoPath(root, sourceFile);
57
+ const rows = input.rows.map((row) => ({
58
+ objectName: row.objectName,
59
+ selectors: [...new Set(row.selectors)].sort()
60
+ })).sort((left, right) => left.objectName.localeCompare(right.objectName));
61
+ const unsupported = [];
62
+ if (!isSupportedSourceExtension(sourceFile)) {
63
+ unsupported.push({
64
+ code: "OBJECT_PACK_SOURCE_KIND_UNSUPPORTED",
65
+ message: "object.pack semantic preview supports TS/TSX/MTS ESM sources only",
66
+ file: displaySource
67
+ });
68
+ return failure(displaySource, rows, unsupported);
69
+ }
70
+ const workspace = (0, semantic_workspace_1.createSemanticWorkspace)({ workspaceRoot: root, focusFiles: [sourceFile] });
71
+ const moduleCollection = (0, semantic_workspace_1.collectSemanticModuleEdges)(workspace);
72
+ let moduleScope = (0, semantic_workspace_1.scopeRelevantSemanticModuleEdges)(workspace, moduleCollection, {
73
+ sourceFiles: [displaySource]
74
+ });
75
+ if (!moduleScope.coverage.complete) {
76
+ unsupported.push(...moduleScope.coverage.incompleteReasons.map(toCoverageEvidence));
77
+ unsupported.push({
78
+ code: "OBJECT_PACK_CYCLE_EVIDENCE_UNAVAILABLE",
79
+ message: "runtime cycle evidence is unavailable because semantic coverage is incomplete",
80
+ file: displaySource
81
+ });
82
+ return failure(displaySource, rows, unsupported, moduleScope.coverage);
83
+ }
84
+ const sourceProjects = (0, semantic_workspace_1.ownersForSemanticFile)(workspace, sourceFile);
85
+ if (sourceProjects.length > 1) {
86
+ unsupported.push({
87
+ code: "OBJECT_PACK_MULTIPLE_OWNERS_UNSUPPORTED",
88
+ message: "object.pack semantic preview requires exactly one owning project in M2",
89
+ file: displaySource,
90
+ details: sourceProjects.map((project) => toRepoPath(root, project.config.file))
91
+ });
92
+ return failure(displaySource, rows, unsupported, moduleScope.coverage);
93
+ }
94
+ if (sourceProjects.length === 0 || sourceProjects.some((project) => {
95
+ const source = project.program.getSourceFile(sourceFile);
96
+ return !source || !isEsmSourceFile(project, source);
97
+ })) {
98
+ unsupported.push({
99
+ code: "OBJECT_PACK_ESM_REQUIRED",
100
+ message: "object.pack semantic preview requires an ESM source in its owning project",
101
+ file: displaySource
102
+ });
103
+ return failure(displaySource, rows, unsupported, moduleScope.coverage);
104
+ }
105
+ const sourceProject = sourceProjects[0];
106
+ const source = sourceProject.program.getSourceFile(sourceFile);
107
+ const selected = resolveSelectedMembers(workspace, sourceProject, source, rows, unsupported);
108
+ validateVariableStatements(selected, unsupported, displaySource);
109
+ if (unsupported.length > 0) {
110
+ return failure(displaySource, rows, unsupported, moduleScope.coverage);
111
+ }
112
+ const selectedByKey = new Map(selected.map((member) => [member.symbol.key, member]));
113
+ const usageReplacements = new Map();
114
+ const externalReferenceCounts = new Map();
115
+ for (const member of selected) {
116
+ member.usages = (0, semantic_workspace_1.findSemanticReferences)(workspace, member.symbol);
117
+ }
118
+ moduleScope = (0, semantic_workspace_1.scopeRelevantSemanticModuleEdges)(workspace, moduleCollection, {
119
+ sourceFiles: [displaySource],
120
+ affectedFiles: selected.flatMap((member) => member.usages.map((usage) => usage.file))
121
+ });
122
+ if (!moduleScope.coverage.complete) {
123
+ unsupported.push(...moduleScope.coverage.incompleteReasons.map(toCoverageEvidence));
124
+ unsupported.push({
125
+ code: "OBJECT_PACK_CYCLE_EVIDENCE_UNAVAILABLE",
126
+ message: "runtime cycle evidence is unavailable because relevant module resolution is incomplete",
127
+ file: displaySource
128
+ });
129
+ return failure(displaySource, rows, unsupported, moduleScope.coverage);
130
+ }
131
+ if (moduleScope.edges.some((edge) => edge.kind === "dynamic" && edge.toFile === displaySource)) {
132
+ unsupported.push({
133
+ code: "OBJECT_PACK_DYNAMIC_IMPORT_UNSUPPORTED",
134
+ message: "dynamic imports of the packed source are not supported",
135
+ file: displaySource
136
+ });
137
+ }
138
+ if (moduleScope.edges.some((edge) => edge.kind === "require" && edge.toFile === displaySource)) {
139
+ unsupported.push({
140
+ code: "OBJECT_PACK_REQUIRE_UNSUPPORTED",
141
+ message: "CommonJS require of the packed source is not supported",
142
+ file: displaySource
143
+ });
144
+ }
145
+ validateRequireConsumers(workspace, sourceFile, unsupported);
146
+ const cycleEvidence = (0, runtime_cycle_query_1.queryRuntimeCycleEvidence)(moduleScope.edges, [displaySource]);
147
+ if (cycleEvidence.cycles.length > 0) {
148
+ unsupported.push({
149
+ code: "OBJECT_PACK_RUNTIME_CYCLE_UNSUPPORTED",
150
+ message: "packed source participates in a runtime import cycle; initialization order cannot be preserved safely",
151
+ file: displaySource,
152
+ details: cycleEvidence.cycles
153
+ });
154
+ }
155
+ validateAffectedFileOwnership(workspace, sourceFile, selected, moduleScope.edges, unsupported);
156
+ if (unsupported.length > 0) {
157
+ return failure(displaySource, rows, unsupported, moduleScope.coverage);
158
+ }
159
+ for (const member of selected) {
160
+ validateAndPlanUsages(workspace, sourceFile, member, usageReplacements, externalReferenceCounts, unsupported);
161
+ }
162
+ const importTransforms = planConsumerImports(workspace, sourceFile, selectedByKey, unsupported);
163
+ validateReExports(workspace, sourceFile, selectedByKey, unsupported);
164
+ if (unsupported.length > 0) {
165
+ return failure(displaySource, rows, unsupported, moduleScope.coverage);
166
+ }
167
+ const sourceText = fs.readFileSync(sourceFile, "utf8");
168
+ const sourceNext = buildSourceText(source, sourceText, selected, rows);
169
+ const virtualTexts = new Map([[displaySource, sourceNext]]);
170
+ const consumerSummaries = [];
171
+ const consumerFiles = new Set([
172
+ ...usageReplacements.keys(),
173
+ ...importTransforms.keys()
174
+ ]);
175
+ for (const file of [...consumerFiles].sort()) {
176
+ if ((0, semantic_workspace_1.canonicalPathIdentity)(path.resolve(root, file)) === (0, semantic_workspace_1.canonicalPathIdentity)(sourceFile)) {
177
+ continue;
178
+ }
179
+ const absolute = path.resolve(root, file);
180
+ const original = fs.readFileSync(absolute, "utf8");
181
+ const replacements = [
182
+ ...(usageReplacements.get(file) ?? []),
183
+ ...(importTransforms.get(file)?.replacements ?? [])
184
+ ];
185
+ const rewritten = applyReplacements(original, replacements);
186
+ const canonicalized = (0, targeted_import_canonicalizer_1.formatChangedNamedImports)(original, rewritten, absolute).text;
187
+ if (canonicalized !== original) {
188
+ virtualTexts.set(file, canonicalized);
189
+ consumerSummaries.push({
190
+ file,
191
+ text: canonicalized,
192
+ objectNames: importTransforms.get(file)?.objectNames ?? [],
193
+ selectors: importTransforms.get(file)?.selectors ?? [],
194
+ referenceCount: externalReferenceCounts.get(file) ?? 0
195
+ });
196
+ }
197
+ }
198
+ if (!moduleShapesUnchanged(root, virtualTexts)) {
199
+ unsupported.push({
200
+ code: "OBJECT_PACK_MODULE_EDGE_CHANGE_UNSUPPORTED",
201
+ message: "planned edits change module edge shape; cycle evidence is no longer sufficient",
202
+ file: displaySource
203
+ });
204
+ return failure(displaySource, rows, unsupported, moduleScope.coverage);
205
+ }
206
+ const diagnostics = validateVirtualProjectDiagnostics(workspace, virtualTexts);
207
+ if (diagnostics.added.length > 0) {
208
+ unsupported.push({
209
+ code: "OBJECT_PACK_NEW_DIAGNOSTICS",
210
+ message: "virtual object.pack edits introduce new project diagnostics",
211
+ file: displaySource,
212
+ details: diagnostics.added
213
+ });
214
+ return failure(displaySource, rows, unsupported, moduleScope.coverage);
215
+ }
216
+ const edits = [...virtualTexts.entries()].map(([file, text]) => ({
217
+ file,
218
+ start: 0,
219
+ end: fs.readFileSync(path.resolve(root, file), "utf8").length,
220
+ text,
221
+ reason: file === displaySource ? "object.pack source preview" : "object.pack consumer preview"
222
+ })).sort((left, right) => left.file.localeCompare(right.file));
223
+ const beforeHashes = (0, concrete_edit_plan_1.createConcretePreconditions)(root, edits);
224
+ const symbols = selected.map((member) => member.symbol).sort((left, right) => left.key.localeCompare(right.key));
225
+ const usages = selected.flatMap((member) => member.usages).sort(compareUsages);
226
+ const fingerprintModuleEdges = collectFingerprintModuleEdges(moduleScope.edges, displaySource);
227
+ const rowFingerprints = rows.map((row) => {
228
+ const rowMembers = selected.filter((member) => member.objectName === row.objectName);
229
+ const rowKeys = new Set(rowMembers.map((member) => member.symbol.key));
230
+ return (0, concrete_edit_plan_1.createSemanticFingerprint)({
231
+ intent: {
232
+ operation: "object.pack",
233
+ sourceFile: displaySource,
234
+ objectName: row.objectName,
235
+ members: row.selectors,
236
+ exportMode: "named"
237
+ },
238
+ projects: moduleScope.coverage.projects,
239
+ symbols: rowMembers.map((member) => member.symbol),
240
+ references: usages.filter((usage) => rowKeys.has(usage.symbol.key)),
241
+ moduleEdges: fingerprintModuleEdges
242
+ });
243
+ });
244
+ const semanticFingerprint = sha256(rowFingerprints.join("\0"));
245
+ return {
246
+ ok: true,
247
+ operation: "exports.object.pack.preview",
248
+ sourceFile: displaySource,
249
+ objectCount: rows.length,
250
+ memberCount: selected.length,
251
+ importerCount: consumerSummaries.length,
252
+ referenceCount: consumerSummaries.reduce((sum, item) => sum + item.referenceCount, 0),
253
+ objects: rows,
254
+ importers: consumerSummaries.map((item) => ({
255
+ file: item.file,
256
+ objectNames: item.objectNames,
257
+ selectors: item.selectors,
258
+ referenceCount: item.referenceCount
259
+ })),
260
+ filesTouched: edits.map((edit) => edit.file),
261
+ filesWritten: [],
262
+ semanticFingerprint,
263
+ rowFingerprints,
264
+ edits,
265
+ beforeHashes,
266
+ coverage: moduleScope.coverage,
267
+ symbols,
268
+ usages,
269
+ moduleEdges: fingerprintModuleEdges,
270
+ cycleEvidence,
271
+ diagnostics,
272
+ unsupported: []
273
+ };
274
+ }
275
+ function validateVirtualProjectDiagnostics(workspace, virtualTexts) {
276
+ const overrides = new Map([...virtualTexts.entries()].map(([file, text]) => [
277
+ (0, semantic_workspace_1.canonicalPathIdentity)(path.resolve(workspace.root, file)),
278
+ text
279
+ ]));
280
+ const baseline = new Map();
281
+ const next = new Map();
282
+ for (const project of workspace.projects) {
283
+ for (const diagnostic of typescript_1.default.getPreEmitDiagnostics(project.program)) {
284
+ baseline.set(diagnosticKey(workspace.root, diagnostic), diagnostic);
285
+ }
286
+ const options = project.config.parsed.options;
287
+ const host = typescript_1.default.createCompilerHost(options);
288
+ const originalReadFile = host.readFile.bind(host);
289
+ host.readFile = (file) => overrides.get((0, semantic_workspace_1.canonicalPathIdentity)(file)) ?? originalReadFile(file);
290
+ host.getSourceFile = (file, languageVersion, onError) => {
291
+ const text = host.readFile(file);
292
+ if (text === undefined) {
293
+ onError?.(`Unable to read ${file}`);
294
+ return undefined;
295
+ }
296
+ return typescript_1.default.createSourceFile(file, text, languageVersion, true, scriptKindForFile(file));
297
+ };
298
+ const program = typescript_1.default.createProgram({
299
+ rootNames: project.program.getRootFileNames(),
300
+ options,
301
+ host
302
+ });
303
+ for (const diagnostic of typescript_1.default.getPreEmitDiagnostics(program)) {
304
+ next.set(diagnosticKey(workspace.root, diagnostic), diagnostic);
305
+ }
306
+ }
307
+ const added = [...next.entries()]
308
+ .filter(([key]) => !baseline.has(key))
309
+ .map(([, diagnostic]) => toObjectDiagnostic(workspace.root, diagnostic))
310
+ .sort((left, right) => (left.file ?? "").localeCompare(right.file ?? "") || left.code.localeCompare(right.code));
311
+ return { baselineCount: baseline.size, nextCount: next.size, added };
312
+ }
313
+ function resolveSelectedMembers(workspace, sourceProject, source, rows, unsupported) {
314
+ const selected = [];
315
+ const selectorOwners = new Map();
316
+ const objectNames = new Set();
317
+ for (const row of rows) {
318
+ if (!/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(row.objectName)) {
319
+ unsupported.push({ code: "OBJECT_PACK_OBJECT_NAME_INVALID", message: "object name must be a valid identifier", objectName: row.objectName });
320
+ continue;
321
+ }
322
+ if (objectNames.has(row.objectName)) {
323
+ unsupported.push({ code: "OBJECT_PACK_DUPLICATE_OBJECT", message: "object name is used by more than one row", objectName: row.objectName });
324
+ continue;
325
+ }
326
+ objectNames.add(row.objectName);
327
+ if (sourceProject.checker.resolveName(row.objectName, source, typescript_1.default.SymbolFlags.Value | typescript_1.default.SymbolFlags.Type | typescript_1.default.SymbolFlags.Namespace, false)) {
328
+ unsupported.push({
329
+ code: "OBJECT_PACK_OBJECT_COLLISION",
330
+ message: "object name already resolves in source scope",
331
+ objectName: row.objectName,
332
+ file: toRepoPath(workspace.root, source.fileName)
333
+ });
334
+ }
335
+ for (const selector of row.selectors) {
336
+ if (selectorOwners.has(selector)) {
337
+ unsupported.push({
338
+ code: "OBJECT_PACK_SELECTOR_OVERLAP",
339
+ message: `selector is already assigned to ${selectorOwners.get(selector)}`,
340
+ selector,
341
+ objectName: row.objectName
342
+ });
343
+ continue;
344
+ }
345
+ selectorOwners.set(selector, row.objectName);
346
+ const resolution = (0, semantic_workspace_1.resolveExportedSemanticSymbol)(workspace, source.fileName, selector);
347
+ if (resolution.status !== "resolved" || !resolution.symbol) {
348
+ unsupported.push({
349
+ code: resolution.status === "ambiguous" ? "OBJECT_PACK_SELECTOR_AMBIGUOUS" : "OBJECT_PACK_SELECTOR_NOT_FOUND",
350
+ message: resolution.status === "ambiguous" ? "exported selector resolves differently across owning projects" : "exported selector was not found",
351
+ selector,
352
+ objectName: row.objectName,
353
+ details: resolution.reason
354
+ });
355
+ continue;
356
+ }
357
+ if ((resolution.symbol.flags & (typescript_1.default.SymbolFlags.Class | typescript_1.default.SymbolFlags.Enum | typescript_1.default.SymbolFlags.NamespaceModule |
358
+ typescript_1.default.SymbolFlags.ValueModule | typescript_1.default.SymbolFlags.TypeAlias | typescript_1.default.SymbolFlags.Interface)) !== 0) {
359
+ unsupported.push({
360
+ code: "OBJECT_PACK_DUAL_NAMESPACE_UNSUPPORTED",
361
+ message: "selected export participates in a type, class, enum, or namespace merge",
362
+ selector,
363
+ objectName: row.objectName
364
+ });
365
+ continue;
366
+ }
367
+ const declaration = findDeclarationByIdentity(source, resolution.symbol);
368
+ if (declaration && typescript_1.default.isFunctionDeclaration(declaration) && source.statements.filter((statement) => typescript_1.default.isFunctionDeclaration(statement) && statement.name?.text === selector).length > 1) {
369
+ unsupported.push({
370
+ code: "OBJECT_PACK_OVERLOAD_UNSUPPORTED",
371
+ message: "overload declaration sets are not supported",
372
+ selector,
373
+ objectName: row.objectName
374
+ });
375
+ continue;
376
+ }
377
+ const validated = validateSelectedDeclaration(declaration, selector, row.objectName, unsupported, source);
378
+ if (validated) {
379
+ selected.push({
380
+ objectName: row.objectName,
381
+ selector,
382
+ symbol: resolution.symbol,
383
+ declaration: validated.declaration,
384
+ statement: validated.statement,
385
+ usages: []
386
+ });
387
+ }
388
+ }
389
+ }
390
+ return selected;
391
+ }
392
+ function validateSelectedDeclaration(declaration, selector, objectName, unsupported, source) {
393
+ if (declaration && typescript_1.default.isFunctionDeclaration(declaration) && declaration.name) {
394
+ if (!hasExportModifier(declaration) || hasDefaultModifier(declaration)) {
395
+ unsupported.push({ code: "OBJECT_PACK_NAMED_EXPORT_REQUIRED", message: "selected function must be a named export declaration", selector, objectName });
396
+ return null;
397
+ }
398
+ if (containsThisSensitiveSyntax(declaration)) {
399
+ unsupported.push({ code: "OBJECT_PACK_THIS_SENSITIVE", message: "selected function contains this/super-sensitive semantics", selector, objectName, file: source.fileName });
400
+ return null;
401
+ }
402
+ return { declaration, statement: declaration };
403
+ }
404
+ if (declaration && typescript_1.default.isVariableDeclaration(declaration) && typescript_1.default.isIdentifier(declaration.name)) {
405
+ const list = declaration.parent;
406
+ const statement = list.parent;
407
+ if (!typescript_1.default.isVariableDeclarationList(list) || !typescript_1.default.isVariableStatement(statement) ||
408
+ (list.flags & typescript_1.default.NodeFlags.Const) === 0 || !declaration.initializer || !hasExportModifier(statement) || hasDefaultModifier(statement)) {
409
+ unsupported.push({ code: "OBJECT_PACK_CONST_EXPORT_REQUIRED", message: "selected value must be an initialized exported const", selector, objectName });
410
+ return null;
411
+ }
412
+ if (containsThisSensitiveSyntax(declaration.initializer)) {
413
+ unsupported.push({ code: "OBJECT_PACK_THIS_SENSITIVE", message: "selected const initializer contains this/super-sensitive semantics", selector, objectName });
414
+ return null;
415
+ }
416
+ return { declaration, statement };
417
+ }
418
+ unsupported.push({
419
+ code: "OBJECT_PACK_DECLARATION_KIND_UNSUPPORTED",
420
+ message: "object.pack supports named function declarations and initialized const values only",
421
+ selector,
422
+ objectName
423
+ });
424
+ return null;
425
+ }
426
+ function validateVariableStatements(selected, unsupported, sourceFile) {
427
+ const selectedDeclarations = new Set(selected.map((member) => `${member.declaration.getStart()}\0${member.declaration.end}`));
428
+ const seen = new Set();
429
+ for (const member of selected) {
430
+ if (!typescript_1.default.isVariableStatement(member.statement) || seen.has(member.statement)) {
431
+ continue;
432
+ }
433
+ seen.add(member.statement);
434
+ const missing = member.statement.declarationList.declarations.filter((declaration) => !selectedDeclarations.has(`${declaration.getStart()}\0${declaration.end}`));
435
+ if (missing.length > 0) {
436
+ unsupported.push({
437
+ code: "OBJECT_PACK_PARTIAL_VARIABLE_STATEMENT_UNSUPPORTED",
438
+ message: "all declarations in an exported const statement must be selected",
439
+ file: sourceFile,
440
+ details: missing.map((declaration) => declaration.name.getText())
441
+ });
442
+ }
443
+ }
444
+ }
445
+ function validateAndPlanUsages(workspace, sourceFile, member, replacements, externalReferenceCounts, unsupported) {
446
+ for (const usage of member.usages) {
447
+ const project = workspace.projects.find((candidate) => toRepoPath(workspace.root, candidate.config.file) === usage.project);
448
+ const source = project?.program.getSourceFile(path.resolve(workspace.root, usage.file));
449
+ const node = source ? findIdentifierAt(source, usage.start, usage.end) : null;
450
+ if (!project || !source || !node) {
451
+ unsupported.push({ code: "OBJECT_PACK_REFERENCE_NODE_UNRESOLVED", message: "checker reference could not be mapped back to syntax", selector: member.selector, file: usage.file });
452
+ continue;
453
+ }
454
+ if (isDeclarationName(node) || findAncestor(node, typescript_1.default.isImportSpecifier)) {
455
+ continue;
456
+ }
457
+ if (findAncestor(node, typescript_1.default.isExportSpecifier)) {
458
+ unsupported.push({ code: "OBJECT_PACK_REEXPORT_UNSUPPORTED", message: "re-export of a selected symbol is unsupported", selector: member.selector, file: usage.file });
459
+ continue;
460
+ }
461
+ const sourceLocal = (0, semantic_workspace_1.canonicalPathIdentity)(source.fileName) === (0, semantic_workspace_1.canonicalPathIdentity)(sourceFile);
462
+ const rejectedKinds = usage.kinds.filter((kind) => [
463
+ "property-write",
464
+ "update/delete",
465
+ "destructure",
466
+ "namespace",
467
+ "re-export",
468
+ "type-position/type-query",
469
+ "escape/identity",
470
+ "dynamic/require"
471
+ ].includes(kind));
472
+ if (isNamespaceQualifiedReference(node, project.checker)) {
473
+ rejectedKinds.push("namespace");
474
+ }
475
+ if (rejectedKinds.length > 0) {
476
+ unsupported.push({
477
+ code: "OBJECT_PACK_USAGE_UNSUPPORTED",
478
+ message: "selected symbol has an unsupported reference flow",
479
+ selector: member.selector,
480
+ file: usage.file,
481
+ usageKinds: [...new Set(rejectedKinds)].sort()
482
+ });
483
+ continue;
484
+ }
485
+ if (usage.kinds.includes("direct-call") && !supportsPropertyCall(member)) {
486
+ unsupported.push({
487
+ code: "OBJECT_PACK_CALL_BINDING_UNPROVEN",
488
+ message: "callable const initializer is not proven safe when invoked as an object property",
489
+ selector: member.selector,
490
+ file: usage.file,
491
+ usageKinds: usage.kinds
492
+ });
493
+ continue;
494
+ }
495
+ if (sourceLocal) {
496
+ continue;
497
+ }
498
+ if (project.checker.resolveName(member.objectName, node, typescript_1.default.SymbolFlags.Value, false)) {
499
+ unsupported.push({
500
+ code: "OBJECT_PACK_SCOPED_OBJECT_COLLISION",
501
+ message: "object import name is shadowed at a selected reference site",
502
+ selector: member.selector,
503
+ objectName: member.objectName,
504
+ file: usage.file
505
+ });
506
+ continue;
507
+ }
508
+ const replacement = `${member.objectName}.${member.selector}`;
509
+ const shorthand = findAncestor(node, typescript_1.default.isShorthandPropertyAssignment);
510
+ if (shorthand) {
511
+ addReplacement(replacements, usage.file, {
512
+ start: shorthand.getStart(source),
513
+ end: shorthand.end,
514
+ text: `${node.text}: ${replacement}`,
515
+ reason: `object.pack shorthand ${member.selector}`
516
+ });
517
+ }
518
+ else if (usage.kinds.every((kind) => kind === "direct-call" || kind === "value-pass")) {
519
+ addReplacement(replacements, usage.file, {
520
+ start: node.getStart(source),
521
+ end: node.end,
522
+ text: replacement,
523
+ reason: `object.pack reference ${member.selector}`
524
+ });
525
+ }
526
+ else {
527
+ unsupported.push({
528
+ code: "OBJECT_PACK_USAGE_UNCLASSIFIED",
529
+ message: "reference flow was not classified as a supported concrete rewrite",
530
+ selector: member.selector,
531
+ file: usage.file,
532
+ usageKinds: usage.kinds
533
+ });
534
+ continue;
535
+ }
536
+ externalReferenceCounts.set(usage.file, (externalReferenceCounts.get(usage.file) ?? 0) + 1);
537
+ }
538
+ }
539
+ function validateRequireConsumers(workspace, sourceFile, unsupported) {
540
+ const seenFiles = new Set();
541
+ for (const project of workspace.projects) {
542
+ for (const file of project.config.parsed.fileNames) {
543
+ const fileKey = (0, semantic_workspace_1.canonicalPathIdentity)(file);
544
+ if (seenFiles.has(fileKey)) {
545
+ continue;
546
+ }
547
+ seenFiles.add(fileKey);
548
+ const source = project.program.getSourceFile(file);
549
+ if (!source) {
550
+ continue;
551
+ }
552
+ const visit = (node) => {
553
+ if (typescript_1.default.isCallExpression(node) && typescript_1.default.isIdentifier(node.expression) && node.expression.text === "require" &&
554
+ node.arguments.length === 1 && typescript_1.default.isStringLiteralLike(node.arguments[0]) &&
555
+ resolvesToFile(project, source.fileName, node.arguments[0].text, sourceFile)) {
556
+ const symbol = project.checker.getSymbolAtLocation(node.expression);
557
+ const declarations = symbol?.getDeclarations() ?? [];
558
+ const provenModuleRequire = declarations.some((declaration) => declaration.getSourceFile().isDeclarationFile || modifiersOf(declaration).some((modifier) => modifier.kind === typescript_1.default.SyntaxKind.DeclareKeyword));
559
+ if (!symbol) {
560
+ unsupported.push({
561
+ code: "OBJECT_PACK_REQUIRE_EVIDENCE_UNAVAILABLE",
562
+ message: "require-like call resolves to packed source but global require identity is unavailable",
563
+ file: toRepoPath(workspace.root, file)
564
+ });
565
+ }
566
+ else if (provenModuleRequire) {
567
+ unsupported.push({
568
+ code: "OBJECT_PACK_REQUIRE_UNSUPPORTED",
569
+ message: "CommonJS require of packed source is unsupported",
570
+ file: toRepoPath(workspace.root, file)
571
+ });
572
+ }
573
+ }
574
+ typescript_1.default.forEachChild(node, visit);
575
+ };
576
+ visit(source);
577
+ }
578
+ }
579
+ }
580
+ function collectFingerprintModuleEdges(edges, sourceFile) {
581
+ return edges.filter((edge) => edge.fromFile === sourceFile || edge.toFile === sourceFile);
582
+ }
583
+ function validateAffectedFileOwnership(workspace, sourceFile, selected, moduleEdges, unsupported) {
584
+ const sourceDisplay = toRepoPath(workspace.root, sourceFile);
585
+ const affected = new Set();
586
+ for (const usage of selected.flatMap((member) => member.usages)) {
587
+ affected.add(usage.file);
588
+ }
589
+ for (const edge of moduleEdges) {
590
+ if (edge.toFile === sourceDisplay) {
591
+ affected.add(edge.fromFile);
592
+ }
593
+ }
594
+ affected.delete(sourceDisplay);
595
+ for (const file of [...affected].sort()) {
596
+ const owners = (0, semantic_workspace_1.ownersForSemanticFile)(workspace, file);
597
+ if (owners.length <= 1) {
598
+ continue;
599
+ }
600
+ unsupported.push({
601
+ code: "OBJECT_PACK_MULTIPLE_OWNERS_UNSUPPORTED",
602
+ message: "affected object.pack file belongs to multiple owning projects in M2",
603
+ file,
604
+ details: owners.map((project) => toRepoPath(workspace.root, project.config.file))
605
+ });
606
+ }
607
+ }
608
+ function supportsPropertyCall(member) {
609
+ if (typescript_1.default.isFunctionDeclaration(member.declaration)) {
610
+ return true;
611
+ }
612
+ const initializer = member.declaration.initializer;
613
+ return Boolean(initializer && (typescript_1.default.isArrowFunction(initializer) || typescript_1.default.isFunctionExpression(initializer)));
614
+ }
615
+ function planConsumerImports(workspace, sourceFile, selectedByKey, unsupported) {
616
+ const result = new Map();
617
+ const seenFiles = new Set();
618
+ for (const project of workspace.projects) {
619
+ for (const file of project.config.parsed.fileNames) {
620
+ if ((0, semantic_workspace_1.canonicalPathIdentity)(file) === (0, semantic_workspace_1.canonicalPathIdentity)(sourceFile) || seenFiles.has((0, semantic_workspace_1.canonicalPathIdentity)(file))) {
621
+ continue;
622
+ }
623
+ seenFiles.add((0, semantic_workspace_1.canonicalPathIdentity)(file));
624
+ const source = project.program.getSourceFile(file);
625
+ if (!source) {
626
+ continue;
627
+ }
628
+ const selectedImports = [];
629
+ for (const statement of source.statements) {
630
+ if (!typescript_1.default.isImportDeclaration(statement) || !typescript_1.default.isStringLiteralLike(statement.moduleSpecifier) ||
631
+ !resolvesToFile(project, source.fileName, statement.moduleSpecifier.text, sourceFile)) {
632
+ continue;
633
+ }
634
+ const clause = statement.importClause;
635
+ const bindings = clause?.namedBindings;
636
+ if (!clause || !bindings || !typescript_1.default.isNamedImports(bindings)) {
637
+ continue;
638
+ }
639
+ const selected = [];
640
+ for (const element of bindings.elements) {
641
+ const identity = (0, semantic_workspace_1.resolveSemanticNodeIdentity)(workspace, project, element.name);
642
+ const member = identity ? selectedByKey.get(identity.key) : undefined;
643
+ if (member) {
644
+ selected.push({ element, member });
645
+ }
646
+ }
647
+ if (selected.length === 0) {
648
+ continue;
649
+ }
650
+ if (clause.isTypeOnly || selected.some((item) => item.element.isTypeOnly)) {
651
+ for (const item of selected) {
652
+ unsupported.push({ code: "OBJECT_PACK_TYPE_IMPORT_UNSUPPORTED", message: "selected symbol is imported as type-only", selector: item.member.selector, file: toRepoPath(workspace.root, file) });
653
+ }
654
+ continue;
655
+ }
656
+ if (statement.attributes) {
657
+ unsupported.push({ code: "OBJECT_PACK_IMPORT_ATTRIBUTES_UNSUPPORTED", message: "selected import uses import attributes", file: toRepoPath(workspace.root, file) });
658
+ continue;
659
+ }
660
+ selectedImports.push({ statement, selected });
661
+ }
662
+ if (selectedImports.length === 0) {
663
+ continue;
664
+ }
665
+ const fileDisplay = toRepoPath(workspace.root, file);
666
+ const objectNames = [...new Set(selectedImports.flatMap((entry) => entry.selected.map((item) => item.member.objectName)))].sort();
667
+ for (const objectName of objectNames) {
668
+ if (project.checker.resolveName(objectName, source, typescript_1.default.SymbolFlags.Value, false)) {
669
+ unsupported.push({ code: "OBJECT_PACK_CONSUMER_OBJECT_COLLISION", message: "object import name already resolves in consumer scope", objectName, file: fileDisplay });
670
+ }
671
+ }
672
+ const firstStatementByObject = new Map();
673
+ for (const objectName of objectNames) {
674
+ firstStatementByObject.set(objectName, selectedImports.find((entry) => entry.selected.some((item) => item.member.objectName === objectName)).statement);
675
+ }
676
+ const replacements = [];
677
+ for (const entry of selectedImports) {
678
+ const selectedElements = new Set(entry.selected.map((item) => item.element));
679
+ const remaining = entry.statement.importClause.namedBindings && typescript_1.default.isNamedImports(entry.statement.importClause.namedBindings)
680
+ ? entry.statement.importClause.namedBindings.elements.filter((element) => !selectedElements.has(element)).map((element) => element.getText(source))
681
+ : [];
682
+ const added = objectNames.filter((objectName) => firstStatementByObject.get(objectName) === entry.statement);
683
+ const replacementText = renderImportDeclaration(source, entry.statement, [...remaining, ...added].sort());
684
+ replacements.push({
685
+ start: entry.statement.getStart(source),
686
+ end: replacementText ? entry.statement.end : statementEndWithTrailingNewline(source.text, entry.statement.end),
687
+ text: replacementText,
688
+ reason: "object.pack import rewrite"
689
+ });
690
+ }
691
+ result.set(fileDisplay, {
692
+ replacements,
693
+ objectNames,
694
+ selectors: [...new Set(selectedImports.flatMap((entry) => entry.selected.map((item) => item.member.selector)))].sort()
695
+ });
696
+ }
697
+ }
698
+ return result;
699
+ }
700
+ function validateReExports(workspace, sourceFile, selectedByKey, unsupported) {
701
+ const seenFiles = new Set();
702
+ for (const project of workspace.projects) {
703
+ for (const file of project.config.parsed.fileNames) {
704
+ if (seenFiles.has((0, semantic_workspace_1.canonicalPathIdentity)(file))) {
705
+ continue;
706
+ }
707
+ seenFiles.add((0, semantic_workspace_1.canonicalPathIdentity)(file));
708
+ const source = project.program.getSourceFile(file);
709
+ if (!source) {
710
+ continue;
711
+ }
712
+ for (const statement of source.statements) {
713
+ if (!typescript_1.default.isExportDeclaration(statement) || !statement.moduleSpecifier || !typescript_1.default.isStringLiteralLike(statement.moduleSpecifier) ||
714
+ !resolvesToFile(project, source.fileName, statement.moduleSpecifier.text, sourceFile)) {
715
+ continue;
716
+ }
717
+ if (!statement.exportClause) {
718
+ unsupported.push({ code: "OBJECT_PACK_EXPORT_STAR_UNSUPPORTED", message: "export-star from packed source is unsupported", file: toRepoPath(workspace.root, file) });
719
+ continue;
720
+ }
721
+ if (typescript_1.default.isNamespaceExport(statement.exportClause)) {
722
+ unsupported.push({ code: "OBJECT_PACK_NAMESPACE_REEXPORT_UNSUPPORTED", message: "namespace re-export from packed source is unsupported", file: toRepoPath(workspace.root, file) });
723
+ continue;
724
+ }
725
+ if (typescript_1.default.isNamedExports(statement.exportClause)) {
726
+ for (const element of statement.exportClause.elements) {
727
+ const identity = (0, semantic_workspace_1.resolveSemanticNodeIdentity)(workspace, project, element.propertyName ?? element.name);
728
+ const member = identity ? selectedByKey.get(identity.key) : undefined;
729
+ if (member) {
730
+ unsupported.push({ code: "OBJECT_PACK_REEXPORT_UNSUPPORTED", message: "re-export of selected symbol is unsupported", selector: member.selector, file: toRepoPath(workspace.root, file) });
731
+ }
732
+ }
733
+ }
734
+ }
735
+ }
736
+ }
737
+ }
738
+ function buildSourceText(source, text, selected, rows) {
739
+ const replacements = [];
740
+ const seenStatements = new Set();
741
+ for (const member of selected) {
742
+ if (seenStatements.has(member.statement)) {
743
+ continue;
744
+ }
745
+ seenStatements.add(member.statement);
746
+ const exportModifier = modifiersOf(member.statement).find((modifier) => modifier.kind === typescript_1.default.SyntaxKind.ExportKeyword);
747
+ let end = exportModifier.end;
748
+ while (end < text.length && (text[end] === " " || text[end] === "\t")) {
749
+ end += 1;
750
+ }
751
+ replacements.push({ start: exportModifier.getStart(source), end, text: "", reason: "object.pack localize export" });
752
+ }
753
+ let next = applyReplacements(text, replacements);
754
+ const objectStatements = rows.map((row) => `export const ${row.objectName} = { ${row.selectors.join(", ")} };`).join("\n");
755
+ next = `${next}${next.endsWith("\n") ? "" : "\n"}${next.trim().length > 0 ? "\n" : ""}${objectStatements}\n`;
756
+ return next;
757
+ }
758
+ function renderImportDeclaration(source, statement, elements) {
759
+ const clause = statement.importClause;
760
+ const defaultName = clause.name?.getText(source);
761
+ if (elements.length === 0) {
762
+ return defaultName ? `import ${defaultName} from ${statement.moduleSpecifier.getText(source)};` : "";
763
+ }
764
+ return `import ${defaultName ? `${defaultName}, ` : ""}{ ${elements.join(", ")} } from ${statement.moduleSpecifier.getText(source)};`;
765
+ }
766
+ function moduleShapesUnchanged(root, virtualTexts) {
767
+ for (const [file, nextText] of virtualTexts) {
768
+ const absolute = path.resolve(root, file);
769
+ const before = moduleShape(fs.readFileSync(absolute, "utf8"), absolute);
770
+ const after = moduleShape(nextText, absolute);
771
+ if (before.join("\0") !== after.join("\0")) {
772
+ return false;
773
+ }
774
+ }
775
+ return true;
776
+ }
777
+ function moduleShape(text, file) {
778
+ const source = typescript_1.default.createSourceFile(file, text, typescript_1.default.ScriptTarget.Latest, true, scriptKindForFile(file));
779
+ const shape = [];
780
+ const visit = (node) => {
781
+ if (typescript_1.default.isImportDeclaration(node) && typescript_1.default.isStringLiteralLike(node.moduleSpecifier)) {
782
+ const clause = node.importClause;
783
+ shape.push(`import:${clause?.isTypeOnly ? "type" : "runtime"}:${node.moduleSpecifier.text}`);
784
+ }
785
+ else if (typescript_1.default.isExportDeclaration(node) && node.moduleSpecifier && typescript_1.default.isStringLiteralLike(node.moduleSpecifier)) {
786
+ shape.push(`export:${node.isTypeOnly ? "type" : "runtime"}:${node.moduleSpecifier.text}`);
787
+ }
788
+ else if (typescript_1.default.isCallExpression(node) && node.expression.kind === typescript_1.default.SyntaxKind.ImportKeyword &&
789
+ node.arguments.length === 1 && typescript_1.default.isStringLiteralLike(node.arguments[0])) {
790
+ shape.push(`dynamic:${node.arguments[0].text}`);
791
+ }
792
+ typescript_1.default.forEachChild(node, visit);
793
+ };
794
+ visit(source);
795
+ return [...new Set(shape)].sort();
796
+ }
797
+ function failure(sourceFile, rows, unsupported, coverage) {
798
+ return {
799
+ ok: false,
800
+ operation: "exports.object.pack.preview",
801
+ code: "OBJECT_PACK_SEMANTIC_PREVIEW_REJECTED",
802
+ sourceFile,
803
+ objectCount: rows.length,
804
+ memberCount: rows.reduce((sum, row) => sum + row.selectors.length, 0),
805
+ filesTouched: [],
806
+ filesWritten: [],
807
+ ...(coverage ? { coverage } : {}),
808
+ unsupportedCount: unsupported.length,
809
+ unsupported: unsupported.sort(compareUnsupported)
810
+ };
811
+ }
812
+ function findDeclarationByIdentity(source, identity) {
813
+ let found = null;
814
+ const visit = (node) => {
815
+ if (found) {
816
+ return;
817
+ }
818
+ if (node.getStart(source) === identity.declarationStart && node.end === identity.declarationEnd) {
819
+ found = node;
820
+ return;
821
+ }
822
+ typescript_1.default.forEachChild(node, visit);
823
+ };
824
+ visit(source);
825
+ return found;
826
+ }
827
+ function findIdentifierAt(source, start, end) {
828
+ let found = null;
829
+ const visit = (node) => {
830
+ if (found || node.end < start || node.getStart(source) > end) {
831
+ return;
832
+ }
833
+ if (typescript_1.default.isIdentifier(node) && node.getStart(source) === start && node.end === end) {
834
+ found = node;
835
+ return;
836
+ }
837
+ typescript_1.default.forEachChild(node, visit);
838
+ };
839
+ visit(source);
840
+ return found;
841
+ }
842
+ function isDeclarationName(node) {
843
+ const parent = node.parent;
844
+ return typescript_1.default.isFunctionDeclaration(parent) && parent.name === node ||
845
+ typescript_1.default.isVariableDeclaration(parent) && parent.name === node;
846
+ }
847
+ function isNamespaceQualifiedReference(node, checker) {
848
+ const parent = node.parent;
849
+ if (!typescript_1.default.isPropertyAccessExpression(parent) || parent.name !== node) {
850
+ return false;
851
+ }
852
+ const receiver = checker.getSymbolAtLocation(parent.expression);
853
+ return Boolean(receiver?.getDeclarations()?.some(typescript_1.default.isNamespaceImport));
854
+ }
855
+ function resolvesToFile(project, fromFile, specifier, targetFile) {
856
+ const resolved = typescript_1.default.resolveModuleName(specifier, fromFile, project.config.parsed.options, typescript_1.default.sys).resolvedModule?.resolvedFileName;
857
+ return Boolean(resolved && (0, semantic_workspace_1.canonicalPathIdentity)(resolved) === (0, semantic_workspace_1.canonicalPathIdentity)(targetFile));
858
+ }
859
+ function containsThisSensitiveSyntax(node) {
860
+ let sensitive = false;
861
+ const visit = (current) => {
862
+ if (current.kind === typescript_1.default.SyntaxKind.ThisKeyword || current.kind === typescript_1.default.SyntaxKind.SuperKeyword) {
863
+ sensitive = true;
864
+ return;
865
+ }
866
+ typescript_1.default.forEachChild(current, visit);
867
+ };
868
+ visit(node);
869
+ return sensitive;
870
+ }
871
+ function hasExportModifier(node) {
872
+ return modifiersOf(node).some((modifier) => modifier.kind === typescript_1.default.SyntaxKind.ExportKeyword);
873
+ }
874
+ function hasDefaultModifier(node) {
875
+ return modifiersOf(node).some((modifier) => modifier.kind === typescript_1.default.SyntaxKind.DefaultKeyword);
876
+ }
877
+ function modifiersOf(node) {
878
+ return typescript_1.default.canHaveModifiers(node) ? typescript_1.default.getModifiers(node) ?? [] : [];
879
+ }
880
+ function applyReplacements(text, replacements) {
881
+ const sorted = [...replacements].sort((left, right) => right.start - left.start || right.end - left.end || left.text.localeCompare(right.text));
882
+ for (let index = 1; index < sorted.length; index += 1) {
883
+ const right = sorted[index - 1];
884
+ const left = sorted[index];
885
+ if (left.end > right.start) {
886
+ throw new Error(`Overlapping object.pack replacements: ${left.start}-${left.end} and ${right.start}-${right.end}.`);
887
+ }
888
+ }
889
+ let next = text;
890
+ for (const replacement of sorted) {
891
+ next = `${next.slice(0, replacement.start)}${replacement.text}${next.slice(replacement.end)}`;
892
+ }
893
+ return next;
894
+ }
895
+ function addReplacement(target, file, replacement) {
896
+ const values = target.get(file) ?? [];
897
+ if (!values.some((item) => item.start === replacement.start && item.end === replacement.end && item.text === replacement.text)) {
898
+ values.push(replacement);
899
+ }
900
+ target.set(file, values);
901
+ }
902
+ function diagnosticKey(root, diagnostic) {
903
+ return [
904
+ diagnostic.code,
905
+ diagnostic.file ? toRepoPath(root, diagnostic.file.fileName) : "",
906
+ diagnostic.start ?? -1,
907
+ diagnostic.length ?? -1,
908
+ typescript_1.default.flattenDiagnosticMessageText(diagnostic.messageText, "\n")
909
+ ].join("\0");
910
+ }
911
+ function toObjectDiagnostic(root, diagnostic) {
912
+ return {
913
+ code: `TS${diagnostic.code}`,
914
+ severity: diagnostic.category === typescript_1.default.DiagnosticCategory.Error ? "error" : "warning",
915
+ message: typescript_1.default.flattenDiagnosticMessageText(diagnostic.messageText, "\n"),
916
+ ...(diagnostic.file ? { file: toRepoPath(root, diagnostic.file.fileName) } : {})
917
+ };
918
+ }
919
+ function toCoverageEvidence(reason) {
920
+ const record = reason;
921
+ return {
922
+ code: `OBJECT_PACK_COVERAGE_${reason.code}`,
923
+ message: "semantic reference coverage is incomplete",
924
+ ...(typeof record.file === "string" ? { file: record.file } : {}),
925
+ details: reason
926
+ };
927
+ }
928
+ function isSupportedSourceExtension(file) {
929
+ return [".ts", ".tsx", ".mts"].includes(path.extname(file).toLowerCase());
930
+ }
931
+ function isEsmSourceFile(project, source) {
932
+ const kind = project.config.parsed.options.module;
933
+ if (kind === undefined || [
934
+ typescript_1.default.ModuleKind.None,
935
+ typescript_1.default.ModuleKind.CommonJS,
936
+ typescript_1.default.ModuleKind.AMD,
937
+ typescript_1.default.ModuleKind.UMD,
938
+ typescript_1.default.ModuleKind.System
939
+ ].includes(kind)) {
940
+ return false;
941
+ }
942
+ if ([typescript_1.default.ModuleKind.Node16, typescript_1.default.ModuleKind.NodeNext].includes(kind)) {
943
+ return source.impliedNodeFormat === typescript_1.default.ModuleKind.ESNext;
944
+ }
945
+ return true;
946
+ }
947
+ function statementEndWithTrailingNewline(text, end) {
948
+ if (text[end] === "\r" && text[end + 1] === "\n") {
949
+ return end + 2;
950
+ }
951
+ return text[end] === "\n" ? end + 1 : end;
952
+ }
953
+ function scriptKindForFile(file) {
954
+ const extension = path.extname(file).toLowerCase();
955
+ return extension === ".tsx" ? typescript_1.default.ScriptKind.TSX : extension === ".jsx" ? typescript_1.default.ScriptKind.JSX :
956
+ [".js", ".mjs", ".cjs"].includes(extension) ? typescript_1.default.ScriptKind.JS : typescript_1.default.ScriptKind.TS;
957
+ }
958
+ function findAncestor(node, predicate) {
959
+ let current = node.parent;
960
+ while (current) {
961
+ if (predicate(current)) {
962
+ return current;
963
+ }
964
+ if (typescript_1.default.isStatement(current)) {
965
+ break;
966
+ }
967
+ current = current.parent;
968
+ }
969
+ return undefined;
970
+ }
971
+ function toRepoPath(root, file) {
972
+ return path.relative(root, path.resolve(file)).replace(/\\/g, "/") || ".";
973
+ }
974
+ function compareUsages(left, right) {
975
+ return left.file.localeCompare(right.file) || left.start - right.start || left.end - right.end ||
976
+ left.symbol.key.localeCompare(right.symbol.key) || left.project.localeCompare(right.project);
977
+ }
978
+ function compareUnsupported(left, right) {
979
+ return (left.file ?? "").localeCompare(right.file ?? "") || (left.selector ?? "").localeCompare(right.selector ?? "") ||
980
+ (left.objectName ?? "").localeCompare(right.objectName ?? "") || left.code.localeCompare(right.code);
981
+ }
982
+ function sha256(value) {
983
+ return crypto.createHash("sha256").update(value).digest("hex");
984
+ }