@mrclrchtr/supi-code-intelligence 3.2.0 → 4.0.0

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 (556) hide show
  1. package/README.md +154 -435
  2. package/node_modules/@mrclrchtr/supi-code-runtime/README.md +8 -0
  3. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +2 -4
  4. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/api.ts +0 -4
  5. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/evidence-badge.ts +3 -2
  6. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/index.ts +0 -4
  7. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/llm.ts +0 -10
  8. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/path-utils.ts +19 -15
  9. package/node_modules/@mrclrchtr/supi-code-runtime/package.json +2 -2
  10. package/node_modules/@mrclrchtr/supi-code-runtime/src/api.ts +10 -1
  11. package/node_modules/@mrclrchtr/supi-code-runtime/src/capability/types.ts +19 -29
  12. package/node_modules/@mrclrchtr/supi-code-runtime/src/index.ts +7 -1
  13. package/node_modules/@mrclrchtr/supi-code-runtime/src/query-result.ts +42 -0
  14. package/node_modules/@mrclrchtr/supi-code-runtime/src/types.ts +15 -10
  15. package/node_modules/@mrclrchtr/supi-core/package.json +2 -4
  16. package/node_modules/@mrclrchtr/supi-core/src/api.ts +0 -4
  17. package/node_modules/@mrclrchtr/supi-core/src/evidence-badge.ts +3 -2
  18. package/node_modules/@mrclrchtr/supi-core/src/index.ts +0 -4
  19. package/node_modules/@mrclrchtr/supi-core/src/llm.ts +0 -10
  20. package/node_modules/@mrclrchtr/supi-core/src/path-utils.ts +19 -15
  21. package/node_modules/@mrclrchtr/supi-lsp/README.md +72 -62
  22. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/README.md +8 -0
  23. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +2 -4
  24. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/api.ts +0 -4
  25. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/evidence-badge.ts +3 -2
  26. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/index.ts +0 -4
  27. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/llm.ts +0 -10
  28. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/path-utils.ts +19 -15
  29. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/package.json +2 -2
  30. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/api.ts +10 -1
  31. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/capability/types.ts +19 -29
  32. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/index.ts +7 -1
  33. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/query-result.ts +42 -0
  34. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/types.ts +15 -10
  35. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/package.json +2 -4
  36. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/api.ts +0 -4
  37. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/evidence-badge.ts +3 -2
  38. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/index.ts +0 -4
  39. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/llm.ts +0 -10
  40. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/path-utils.ts +19 -15
  41. package/node_modules/@mrclrchtr/supi-lsp/package.json +4 -5
  42. package/node_modules/@mrclrchtr/supi-lsp/src/api.ts +9 -9
  43. package/node_modules/@mrclrchtr/supi-lsp/src/client/client.ts +70 -41
  44. package/node_modules/@mrclrchtr/supi-lsp/src/client/transport.ts +16 -13
  45. package/node_modules/@mrclrchtr/supi-lsp/src/config/config.ts +2 -2
  46. package/node_modules/@mrclrchtr/supi-lsp/src/config/lsp-settings.ts +0 -2
  47. package/node_modules/@mrclrchtr/supi-lsp/src/index.ts +6 -6
  48. package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-diagnostics.ts +5 -95
  49. package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-workspace-recovery.ts +4 -3
  50. package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-workspace-symbol.ts +44 -6
  51. package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager.ts +47 -65
  52. package/node_modules/@mrclrchtr/supi-lsp/src/provider/lsp-semantic-provider.ts +132 -79
  53. package/node_modules/@mrclrchtr/supi-lsp/src/provider/refactor-planning.ts +6 -14
  54. package/node_modules/@mrclrchtr/supi-lsp/src/session/readiness.ts +38 -0
  55. package/node_modules/@mrclrchtr/supi-lsp/src/session/runtime-controller.ts +87 -75
  56. package/node_modules/@mrclrchtr/supi-lsp/src/session/runtime-registration.ts +5 -5
  57. package/node_modules/@mrclrchtr/supi-lsp/src/session/{service-registry.ts → runtime-registry.ts} +163 -71
  58. package/node_modules/@mrclrchtr/supi-tree-sitter/README.md +4 -0
  59. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/README.md +8 -0
  60. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +2 -4
  61. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/api.ts +0 -4
  62. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/evidence-badge.ts +3 -2
  63. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/index.ts +0 -4
  64. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/llm.ts +0 -10
  65. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/path-utils.ts +19 -15
  66. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/package.json +2 -2
  67. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/api.ts +10 -1
  68. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/capability/types.ts +19 -29
  69. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/index.ts +7 -1
  70. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/query-result.ts +42 -0
  71. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/types.ts +15 -10
  72. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/package.json +2 -4
  73. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/api.ts +0 -4
  74. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/evidence-badge.ts +3 -2
  75. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/index.ts +0 -4
  76. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/llm.ts +0 -10
  77. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/path-utils.ts +19 -15
  78. package/node_modules/@mrclrchtr/supi-tree-sitter/package.json +4 -21
  79. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/bash/tree-sitter-bash.wasm +0 -0
  80. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/bash/tree-sitter-bash.wasm.json +2 -2
  81. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/c/tree-sitter-c.wasm +0 -0
  82. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/c/tree-sitter-c.wasm.json +2 -2
  83. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/go/tree-sitter-go.wasm +0 -0
  84. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/go/tree-sitter-go.wasm.json +2 -2
  85. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/javascript/tree-sitter-javascript.wasm +0 -0
  86. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/javascript/tree-sitter-javascript.wasm.json +2 -2
  87. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/kotlin/tree-sitter-kotlin.wasm +0 -0
  88. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/kotlin/tree-sitter-kotlin.wasm.json +2 -2
  89. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/python/tree-sitter-python.wasm +0 -0
  90. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/python/tree-sitter-python.wasm.json +2 -2
  91. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/r/tree-sitter-r.wasm +0 -0
  92. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/r/tree-sitter-r.wasm.json +2 -2
  93. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/rust/tree-sitter-rust.wasm.json +1 -1
  94. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/sql/tree-sitter-sql.wasm +0 -0
  95. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/sql/tree-sitter-sql.wasm.json +3 -3
  96. package/node_modules/@mrclrchtr/supi-tree-sitter/scripts/generate-kotlin-wasm.mjs +6 -0
  97. package/node_modules/@mrclrchtr/supi-tree-sitter/scripts/generate-sql-wasm.mjs +18 -4
  98. package/node_modules/@mrclrchtr/supi-tree-sitter/scripts/vendor-wasm.mjs +17 -1
  99. package/node_modules/@mrclrchtr/supi-tree-sitter/src/api.ts +2 -0
  100. package/node_modules/@mrclrchtr/supi-tree-sitter/src/coordinates.ts +20 -41
  101. package/node_modules/@mrclrchtr/supi-tree-sitter/src/index.ts +2 -0
  102. package/node_modules/@mrclrchtr/supi-tree-sitter/src/language.ts +7 -0
  103. package/node_modules/@mrclrchtr/supi-tree-sitter/src/operation-support.ts +40 -0
  104. package/node_modules/@mrclrchtr/supi-tree-sitter/src/session/session.ts +9 -7
  105. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/call-sites.ts +6 -1
  106. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/callees.ts +76 -37
  107. package/node_modules/yaml/LICENSE +13 -0
  108. package/node_modules/yaml/README.md +172 -0
  109. package/node_modules/yaml/bin.mjs +11 -0
  110. package/node_modules/yaml/browser/dist/compose/compose-collection.js +88 -0
  111. package/node_modules/yaml/browser/dist/compose/compose-doc.js +43 -0
  112. package/node_modules/yaml/browser/dist/compose/compose-node.js +109 -0
  113. package/node_modules/yaml/browser/dist/compose/compose-scalar.js +86 -0
  114. package/node_modules/yaml/browser/dist/compose/composer.js +219 -0
  115. package/node_modules/yaml/browser/dist/compose/resolve-block-map.js +115 -0
  116. package/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +198 -0
  117. package/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +49 -0
  118. package/node_modules/yaml/browser/dist/compose/resolve-end.js +37 -0
  119. package/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +207 -0
  120. package/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +225 -0
  121. package/node_modules/yaml/browser/dist/compose/resolve-props.js +146 -0
  122. package/node_modules/yaml/browser/dist/compose/util-contains-newline.js +34 -0
  123. package/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +26 -0
  124. package/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +15 -0
  125. package/node_modules/yaml/browser/dist/compose/util-map-includes.js +13 -0
  126. package/node_modules/yaml/browser/dist/doc/Document.js +335 -0
  127. package/node_modules/yaml/browser/dist/doc/anchors.js +71 -0
  128. package/node_modules/yaml/browser/dist/doc/applyReviver.js +55 -0
  129. package/node_modules/yaml/browser/dist/doc/createNode.js +88 -0
  130. package/node_modules/yaml/browser/dist/doc/directives.js +176 -0
  131. package/node_modules/yaml/browser/dist/errors.js +57 -0
  132. package/node_modules/yaml/browser/dist/index.js +17 -0
  133. package/node_modules/yaml/browser/dist/log.js +11 -0
  134. package/node_modules/yaml/browser/dist/nodes/Alias.js +116 -0
  135. package/node_modules/yaml/browser/dist/nodes/Collection.js +147 -0
  136. package/node_modules/yaml/browser/dist/nodes/Node.js +38 -0
  137. package/node_modules/yaml/browser/dist/nodes/Pair.js +36 -0
  138. package/node_modules/yaml/browser/dist/nodes/Scalar.js +24 -0
  139. package/node_modules/yaml/browser/dist/nodes/YAMLMap.js +144 -0
  140. package/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +113 -0
  141. package/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +63 -0
  142. package/node_modules/yaml/browser/dist/nodes/identity.js +36 -0
  143. package/node_modules/yaml/browser/dist/nodes/toJS.js +37 -0
  144. package/node_modules/yaml/browser/dist/parse/cst-scalar.js +214 -0
  145. package/node_modules/yaml/browser/dist/parse/cst-stringify.js +61 -0
  146. package/node_modules/yaml/browser/dist/parse/cst-visit.js +97 -0
  147. package/node_modules/yaml/browser/dist/parse/cst.js +98 -0
  148. package/node_modules/yaml/browser/dist/parse/lexer.js +721 -0
  149. package/node_modules/yaml/browser/dist/parse/line-counter.js +39 -0
  150. package/node_modules/yaml/browser/dist/parse/parser.js +975 -0
  151. package/node_modules/yaml/browser/dist/public-api.js +102 -0
  152. package/node_modules/yaml/browser/dist/schema/Schema.js +37 -0
  153. package/node_modules/yaml/browser/dist/schema/common/map.js +17 -0
  154. package/node_modules/yaml/browser/dist/schema/common/null.js +15 -0
  155. package/node_modules/yaml/browser/dist/schema/common/seq.js +17 -0
  156. package/node_modules/yaml/browser/dist/schema/common/string.js +14 -0
  157. package/node_modules/yaml/browser/dist/schema/core/bool.js +19 -0
  158. package/node_modules/yaml/browser/dist/schema/core/float.js +43 -0
  159. package/node_modules/yaml/browser/dist/schema/core/int.js +38 -0
  160. package/node_modules/yaml/browser/dist/schema/core/schema.js +23 -0
  161. package/node_modules/yaml/browser/dist/schema/json/schema.js +62 -0
  162. package/node_modules/yaml/browser/dist/schema/tags.js +96 -0
  163. package/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +58 -0
  164. package/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +26 -0
  165. package/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +46 -0
  166. package/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +71 -0
  167. package/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +67 -0
  168. package/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +74 -0
  169. package/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +78 -0
  170. package/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +39 -0
  171. package/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +93 -0
  172. package/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
  173. package/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +146 -0
  174. package/node_modules/yaml/browser/dist/stringify/stringify.js +129 -0
  175. package/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +153 -0
  176. package/node_modules/yaml/browser/dist/stringify/stringifyComment.js +20 -0
  177. package/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +85 -0
  178. package/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +25 -0
  179. package/node_modules/yaml/browser/dist/stringify/stringifyPair.js +150 -0
  180. package/node_modules/yaml/browser/dist/stringify/stringifyString.js +336 -0
  181. package/node_modules/yaml/browser/dist/util.js +11 -0
  182. package/node_modules/yaml/browser/dist/visit.js +233 -0
  183. package/node_modules/yaml/browser/index.js +5 -0
  184. package/node_modules/yaml/browser/package.json +3 -0
  185. package/node_modules/yaml/dist/cli.d.ts +8 -0
  186. package/node_modules/yaml/dist/cli.mjs +201 -0
  187. package/node_modules/yaml/dist/compose/compose-collection.d.ts +11 -0
  188. package/node_modules/yaml/dist/compose/compose-collection.js +90 -0
  189. package/node_modules/yaml/dist/compose/compose-doc.d.ts +7 -0
  190. package/node_modules/yaml/dist/compose/compose-doc.js +45 -0
  191. package/node_modules/yaml/dist/compose/compose-node.d.ts +29 -0
  192. package/node_modules/yaml/dist/compose/compose-node.js +112 -0
  193. package/node_modules/yaml/dist/compose/compose-scalar.d.ts +5 -0
  194. package/node_modules/yaml/dist/compose/compose-scalar.js +88 -0
  195. package/node_modules/yaml/dist/compose/composer.d.ts +63 -0
  196. package/node_modules/yaml/dist/compose/composer.js +224 -0
  197. package/node_modules/yaml/dist/compose/resolve-block-map.d.ts +6 -0
  198. package/node_modules/yaml/dist/compose/resolve-block-map.js +117 -0
  199. package/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
  200. package/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
  201. package/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
  202. package/node_modules/yaml/dist/compose/resolve-block-seq.js +51 -0
  203. package/node_modules/yaml/dist/compose/resolve-end.d.ts +6 -0
  204. package/node_modules/yaml/dist/compose/resolve-end.js +39 -0
  205. package/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
  206. package/node_modules/yaml/dist/compose/resolve-flow-collection.js +209 -0
  207. package/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
  208. package/node_modules/yaml/dist/compose/resolve-flow-scalar.js +227 -0
  209. package/node_modules/yaml/dist/compose/resolve-props.d.ts +23 -0
  210. package/node_modules/yaml/dist/compose/resolve-props.js +148 -0
  211. package/node_modules/yaml/dist/compose/util-contains-newline.d.ts +2 -0
  212. package/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
  213. package/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
  214. package/node_modules/yaml/dist/compose/util-empty-scalar-position.js +28 -0
  215. package/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
  216. package/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
  217. package/node_modules/yaml/dist/compose/util-map-includes.d.ts +4 -0
  218. package/node_modules/yaml/dist/compose/util-map-includes.js +15 -0
  219. package/node_modules/yaml/dist/doc/Document.d.ts +141 -0
  220. package/node_modules/yaml/dist/doc/Document.js +337 -0
  221. package/node_modules/yaml/dist/doc/anchors.d.ts +24 -0
  222. package/node_modules/yaml/dist/doc/anchors.js +76 -0
  223. package/node_modules/yaml/dist/doc/applyReviver.d.ts +9 -0
  224. package/node_modules/yaml/dist/doc/applyReviver.js +57 -0
  225. package/node_modules/yaml/dist/doc/createNode.d.ts +17 -0
  226. package/node_modules/yaml/dist/doc/createNode.js +90 -0
  227. package/node_modules/yaml/dist/doc/directives.d.ts +49 -0
  228. package/node_modules/yaml/dist/doc/directives.js +178 -0
  229. package/node_modules/yaml/dist/errors.d.ts +21 -0
  230. package/node_modules/yaml/dist/errors.js +62 -0
  231. package/node_modules/yaml/dist/index.d.ts +25 -0
  232. package/node_modules/yaml/dist/index.js +50 -0
  233. package/node_modules/yaml/dist/log.d.ts +3 -0
  234. package/node_modules/yaml/dist/log.js +19 -0
  235. package/node_modules/yaml/dist/nodes/Alias.d.ts +29 -0
  236. package/node_modules/yaml/dist/nodes/Alias.js +118 -0
  237. package/node_modules/yaml/dist/nodes/Collection.d.ts +73 -0
  238. package/node_modules/yaml/dist/nodes/Collection.js +151 -0
  239. package/node_modules/yaml/dist/nodes/Node.d.ts +53 -0
  240. package/node_modules/yaml/dist/nodes/Node.js +40 -0
  241. package/node_modules/yaml/dist/nodes/Pair.d.ts +22 -0
  242. package/node_modules/yaml/dist/nodes/Pair.js +39 -0
  243. package/node_modules/yaml/dist/nodes/Scalar.d.ts +47 -0
  244. package/node_modules/yaml/dist/nodes/Scalar.js +27 -0
  245. package/node_modules/yaml/dist/nodes/YAMLMap.d.ts +53 -0
  246. package/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
  247. package/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
  248. package/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
  249. package/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
  250. package/node_modules/yaml/dist/nodes/addPairToJSMap.js +65 -0
  251. package/node_modules/yaml/dist/nodes/identity.d.ts +23 -0
  252. package/node_modules/yaml/dist/nodes/identity.js +53 -0
  253. package/node_modules/yaml/dist/nodes/toJS.d.ts +29 -0
  254. package/node_modules/yaml/dist/nodes/toJS.js +39 -0
  255. package/node_modules/yaml/dist/options.d.ts +350 -0
  256. package/node_modules/yaml/dist/parse/cst-scalar.d.ts +64 -0
  257. package/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
  258. package/node_modules/yaml/dist/parse/cst-stringify.d.ts +8 -0
  259. package/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
  260. package/node_modules/yaml/dist/parse/cst-visit.d.ts +39 -0
  261. package/node_modules/yaml/dist/parse/cst-visit.js +99 -0
  262. package/node_modules/yaml/dist/parse/cst.d.ts +109 -0
  263. package/node_modules/yaml/dist/parse/cst.js +112 -0
  264. package/node_modules/yaml/dist/parse/lexer.d.ts +87 -0
  265. package/node_modules/yaml/dist/parse/lexer.js +723 -0
  266. package/node_modules/yaml/dist/parse/line-counter.d.ts +22 -0
  267. package/node_modules/yaml/dist/parse/line-counter.js +41 -0
  268. package/node_modules/yaml/dist/parse/parser.d.ts +84 -0
  269. package/node_modules/yaml/dist/parse/parser.js +980 -0
  270. package/node_modules/yaml/dist/public-api.d.ts +44 -0
  271. package/node_modules/yaml/dist/public-api.js +107 -0
  272. package/node_modules/yaml/dist/schema/Schema.d.ts +17 -0
  273. package/node_modules/yaml/dist/schema/Schema.js +39 -0
  274. package/node_modules/yaml/dist/schema/common/map.d.ts +2 -0
  275. package/node_modules/yaml/dist/schema/common/map.js +19 -0
  276. package/node_modules/yaml/dist/schema/common/null.d.ts +4 -0
  277. package/node_modules/yaml/dist/schema/common/null.js +17 -0
  278. package/node_modules/yaml/dist/schema/common/seq.d.ts +2 -0
  279. package/node_modules/yaml/dist/schema/common/seq.js +19 -0
  280. package/node_modules/yaml/dist/schema/common/string.d.ts +2 -0
  281. package/node_modules/yaml/dist/schema/common/string.js +16 -0
  282. package/node_modules/yaml/dist/schema/core/bool.d.ts +4 -0
  283. package/node_modules/yaml/dist/schema/core/bool.js +21 -0
  284. package/node_modules/yaml/dist/schema/core/float.d.ts +4 -0
  285. package/node_modules/yaml/dist/schema/core/float.js +47 -0
  286. package/node_modules/yaml/dist/schema/core/int.d.ts +4 -0
  287. package/node_modules/yaml/dist/schema/core/int.js +42 -0
  288. package/node_modules/yaml/dist/schema/core/schema.d.ts +1 -0
  289. package/node_modules/yaml/dist/schema/core/schema.js +25 -0
  290. package/node_modules/yaml/dist/schema/json/schema.d.ts +2 -0
  291. package/node_modules/yaml/dist/schema/json/schema.js +64 -0
  292. package/node_modules/yaml/dist/schema/json-schema.d.ts +69 -0
  293. package/node_modules/yaml/dist/schema/tags.d.ts +48 -0
  294. package/node_modules/yaml/dist/schema/tags.js +99 -0
  295. package/node_modules/yaml/dist/schema/types.d.ts +92 -0
  296. package/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
  297. package/node_modules/yaml/dist/schema/yaml-1.1/binary.js +70 -0
  298. package/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
  299. package/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
  300. package/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
  301. package/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
  302. package/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
  303. package/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
  304. package/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
  305. package/node_modules/yaml/dist/schema/yaml-1.1/merge.js +71 -0
  306. package/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +22 -0
  307. package/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
  308. package/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
  309. package/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
  310. package/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
  311. package/node_modules/yaml/dist/schema/yaml-1.1/schema.js +41 -0
  312. package/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
  313. package/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
  314. package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
  315. package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
  316. package/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
  317. package/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
  318. package/node_modules/yaml/dist/stringify/stringify.d.ts +21 -0
  319. package/node_modules/yaml/dist/stringify/stringify.js +132 -0
  320. package/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
  321. package/node_modules/yaml/dist/stringify/stringifyCollection.js +155 -0
  322. package/node_modules/yaml/dist/stringify/stringifyComment.d.ts +10 -0
  323. package/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
  324. package/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
  325. package/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
  326. package/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
  327. package/node_modules/yaml/dist/stringify/stringifyNumber.js +27 -0
  328. package/node_modules/yaml/dist/stringify/stringifyPair.d.ts +3 -0
  329. package/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
  330. package/node_modules/yaml/dist/stringify/stringifyString.d.ts +9 -0
  331. package/node_modules/yaml/dist/stringify/stringifyString.js +338 -0
  332. package/node_modules/yaml/dist/test-events.d.ts +4 -0
  333. package/node_modules/yaml/dist/test-events.js +134 -0
  334. package/node_modules/yaml/dist/util.d.ts +16 -0
  335. package/node_modules/yaml/dist/util.js +28 -0
  336. package/node_modules/yaml/dist/visit.d.ts +102 -0
  337. package/node_modules/yaml/dist/visit.js +236 -0
  338. package/node_modules/yaml/package.json +97 -0
  339. package/node_modules/yaml/util.js +2 -0
  340. package/package.json +9 -8
  341. package/src/analysis/architecture/discovery.ts +213 -227
  342. package/src/analysis/architecture/manifest.ts +147 -0
  343. package/src/analysis/architecture/model.ts +119 -52
  344. package/src/analysis/architecture/workspace-config.ts +229 -0
  345. package/src/analysis/{coverage/coverage-warnings.ts → capability/capability-warnings.ts} +41 -78
  346. package/src/analysis/evidence.ts +22 -5
  347. package/src/analysis/health/diagnostics.ts +183 -0
  348. package/src/analysis/health/recovery.ts +39 -0
  349. package/src/analysis/health/signals.ts +20 -0
  350. package/src/analysis/instruction-files.ts +60 -48
  351. package/src/analysis/provider.ts +31 -12
  352. package/src/analysis/readiness.ts +29 -9
  353. package/src/{tool/refactor-apply → analysis/refactor}/apply.ts +120 -26
  354. package/src/analysis/refactor/position.ts +6 -0
  355. package/src/analysis/refactor/safety.ts +4 -11
  356. package/src/analysis/references/locations.ts +20 -0
  357. package/src/analysis/references/semantic-refs.ts +21 -11
  358. package/src/{tool/graph → analysis/relations}/implementations.ts +27 -23
  359. package/src/analysis/relations/provider-locations.ts +179 -0
  360. package/src/{tool/graph → analysis/relations}/references.ts +25 -21
  361. package/src/{tool/graph → analysis/relations}/types.ts +4 -19
  362. package/src/analysis/search/ast-scan.ts +376 -0
  363. package/src/analysis/search/call-name.ts +68 -0
  364. package/src/analysis/search/deadline.ts +84 -0
  365. package/src/analysis/search/paths.ts +88 -0
  366. package/src/analysis/search/pattern.ts +290 -246
  367. package/src/analysis/target/anchored.ts +72 -27
  368. package/src/analysis/target/file.ts +292 -132
  369. package/src/analysis/target/identity.ts +237 -0
  370. package/src/analysis/target/symbol.ts +169 -86
  371. package/src/analysis/target/types.ts +36 -4
  372. package/src/api.ts +21 -4
  373. package/src/app/app.ts +53 -46
  374. package/src/extension.ts +68 -66
  375. package/src/session/capability-adapter.ts +26 -118
  376. package/src/session/find-types.ts +38 -0
  377. package/src/session/find-workflow.ts +141 -0
  378. package/src/session/graph/collect.ts +181 -0
  379. package/src/session/graph-types.ts +77 -0
  380. package/src/session/graph-workflow.ts +152 -0
  381. package/src/session/health-types.ts +134 -0
  382. package/src/session/health-workflow.ts +341 -0
  383. package/src/session/input/common.ts +216 -0
  384. package/src/session/input/health-refactor.ts +169 -0
  385. package/src/session/input/workflows.ts +211 -0
  386. package/src/session/inspect/collect.ts +304 -0
  387. package/src/session/inspect/file-point.ts +69 -0
  388. package/src/session/inspect-types.ts +78 -0
  389. package/src/session/inspect-workflow.ts +157 -0
  390. package/src/session/orientation/collect.ts +718 -0
  391. package/src/session/orientation/context-facts.ts +319 -0
  392. package/src/session/orientation/context-sections.ts +352 -0
  393. package/src/session/orientation-types.ts +97 -0
  394. package/src/session/orientation-workflow.ts +307 -0
  395. package/src/session/refactor-plans.ts +1 -1
  396. package/src/session/refactor-types.ts +51 -0
  397. package/src/session/refactor-workflow.ts +263 -0
  398. package/src/session/session.ts +263 -234
  399. package/src/session/target-candidates.ts +60 -0
  400. package/src/session/target-input.ts +98 -0
  401. package/src/session/target-store.ts +132 -29
  402. package/src/session/target-workflow.ts +254 -302
  403. package/src/session/workflow-control.ts +35 -0
  404. package/src/substrate/lsp/lifecycle.ts +9 -22
  405. package/src/substrate/lsp/maintenance.ts +75 -0
  406. package/src/substrate/lsp/recovery.ts +41 -25
  407. package/src/substrate/lsp/settings.ts +1 -10
  408. package/src/substrate/lsp/state.ts +2 -13
  409. package/src/tool/find/ast-kinds.ts +35 -0
  410. package/src/tool/find/execute.ts +22 -113
  411. package/src/tool/find/markdown.ts +85 -221
  412. package/src/tool/find/modes.ts +5 -0
  413. package/src/tool/find/render.ts +57 -0
  414. package/src/tool/find/tui.ts +1 -1
  415. package/src/tool/graph/calls-md.ts +17 -30
  416. package/src/tool/graph/execute.ts +42 -103
  417. package/src/tool/graph/implementations-md.ts +32 -54
  418. package/src/tool/graph/markdown-base.ts +73 -196
  419. package/src/tool/graph/provider-location-md.ts +9 -0
  420. package/src/tool/graph/references-md.ts +34 -27
  421. package/src/tool/graph/tui.ts +8 -26
  422. package/src/tool/guidance.ts +31 -48
  423. package/src/tool/health/execute.ts +15 -56
  424. package/src/tool/health/markdown.ts +199 -148
  425. package/src/tool/health/semantic-state.ts +24 -0
  426. package/src/tool/health/tui.ts +262 -36
  427. package/src/tool/infra/error-results.ts +0 -2
  428. package/src/tool/infra/progress.ts +2 -2
  429. package/src/tool/infra/workflow-control.ts +11 -0
  430. package/src/tool/inspect/execute.ts +23 -63
  431. package/src/tool/inspect/markdown.ts +114 -95
  432. package/src/tool/inspect/tui.ts +7 -7
  433. package/src/tool/orientation/execute.ts +50 -37
  434. package/src/tool/orientation/markdown.ts +26 -31
  435. package/src/tool/orientation/tui.ts +41 -39
  436. package/src/tool/refactor-apply/execute.ts +23 -9
  437. package/src/tool/refactor-apply/tui.ts +7 -3
  438. package/src/tool/refactor-plan/execute.ts +44 -61
  439. package/src/tool/refactor-plan/markdown.ts +33 -56
  440. package/src/tool/refactor-plan/tui.ts +10 -11
  441. package/src/tool/register.ts +6 -5
  442. package/src/tool/resolve/execute.ts +23 -69
  443. package/src/tool/resolve/markdown.ts +125 -114
  444. package/src/tool/resolve/tui.ts +11 -9
  445. package/src/tool/result/assembly.ts +125 -0
  446. package/src/tool/result/errors.ts +20 -34
  447. package/src/tool/result/find.ts +107 -21
  448. package/src/tool/result/graph.ts +163 -64
  449. package/src/tool/result/health.ts +170 -73
  450. package/src/tool/result/inspect.ts +183 -41
  451. package/src/tool/result/orientation.ts +118 -16
  452. package/src/tool/result/refactor.ts +101 -21
  453. package/src/tool/result/resolve.ts +243 -80
  454. package/src/tool/result/types.ts +100 -56
  455. package/src/tool/schemas.ts +160 -231
  456. package/src/tool/specs.ts +57 -168
  457. package/src/types/details.ts +2 -4
  458. package/src/types/execution.ts +6 -15
  459. package/src/types/index.ts +2 -4
  460. package/src/types/tool-names.ts +1 -2
  461. package/src/ui/footer.ts +3 -3
  462. package/src/ui/markdown/gather.ts +17 -65
  463. package/src/ui/markdown/overview-data.ts +143 -21
  464. package/src/ui/markdown/overview.ts +27 -8
  465. package/src/ui/markdown/types.ts +12 -16
  466. package/src/ui/status-command.ts +39 -31
  467. package/src/ui/status-overlay.ts +23 -15
  468. package/src/ui/tui/common.ts +121 -74
  469. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +0 -31
  470. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +0 -11
  471. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/types.ts +0 -2
  472. package/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +0 -31
  473. package/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +0 -11
  474. package/node_modules/@mrclrchtr/supi-core/src/types.ts +0 -2
  475. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +0 -31
  476. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +0 -11
  477. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/types.ts +0 -2
  478. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +0 -31
  479. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +0 -11
  480. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/types.ts +0 -2
  481. package/node_modules/@mrclrchtr/supi-lsp/src/diagnostics/diagnostic-augmentation.ts +0 -82
  482. package/node_modules/@mrclrchtr/supi-lsp/src/diagnostics/diagnostic-context.ts +0 -116
  483. package/node_modules/@mrclrchtr/supi-lsp/src/diagnostics/diagnostic-display.ts +0 -69
  484. package/node_modules/@mrclrchtr/supi-lsp/src/manager/capability-index.ts +0 -24
  485. package/node_modules/@mrclrchtr/supi-lsp/src/manager/client-pool.ts +0 -33
  486. package/node_modules/@mrclrchtr/supi-lsp/src/manager/diagnostic-store.ts +0 -51
  487. package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-stale-resync.ts +0 -47
  488. package/node_modules/@mrclrchtr/supi-lsp/src/manager/recovery-coordinator.ts +0 -37
  489. package/node_modules/@mrclrchtr/supi-lsp/src/manager/workspace-router.ts +0 -44
  490. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +0 -31
  491. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +0 -11
  492. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/types.ts +0 -2
  493. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +0 -31
  494. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +0 -11
  495. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/types.ts +0 -2
  496. package/src/analysis/brief/directory.ts +0 -324
  497. package/src/analysis/brief/enrich.ts +0 -157
  498. package/src/analysis/brief/file.ts +0 -84
  499. package/src/analysis/brief/inventory.ts +0 -177
  500. package/src/analysis/brief/main.ts +0 -176
  501. package/src/analysis/brief/models.ts +0 -75
  502. package/src/analysis/brief/public-brief.ts +0 -179
  503. package/src/analysis/brief/summarize.ts +0 -208
  504. package/src/analysis/brief/types.ts +0 -27
  505. package/src/analysis/brief/use-case.ts +0 -264
  506. package/src/analysis/search/ripgrep.ts +0 -558
  507. package/src/analysis/signals/git.ts +0 -89
  508. package/src/analysis/signals/project.ts +0 -189
  509. package/src/analysis/target/bridge.ts +0 -152
  510. package/src/analysis/target/file-resolution.ts +0 -125
  511. package/src/analysis/target/planner.ts +0 -92
  512. package/src/analysis/target/query.ts +0 -74
  513. package/src/analysis/target/resolve-common.ts +0 -115
  514. package/src/analysis/target/service.ts +0 -229
  515. package/src/analysis/tests/likely-tests.ts +0 -174
  516. package/src/analysis/tests/test-discovery.ts +0 -540
  517. package/src/analysis/tests/vitest.ts +0 -87
  518. package/src/app/manager.ts +0 -65
  519. package/src/substrate/lsp/diagnostic-injection.ts +0 -203
  520. package/src/substrate/lsp/overrides.ts +0 -132
  521. package/src/tool/find/orchestrate.ts +0 -317
  522. package/src/tool/find/semantic-search.ts +0 -128
  523. package/src/tool/graph/collect-relation.ts +0 -372
  524. package/src/tool/graph/orchestrate.ts +0 -259
  525. package/src/tool/health/orchestrate.ts +0 -151
  526. package/src/tool/health/sections/diagnostics.ts +0 -182
  527. package/src/tool/health/sections/recovery.ts +0 -89
  528. package/src/tool/health/sections/signals.ts +0 -89
  529. package/src/tool/impact/analysis.ts +0 -220
  530. package/src/tool/impact/change-set-impact.ts +0 -152
  531. package/src/tool/impact/execute.ts +0 -125
  532. package/src/tool/impact/file-level-impact.ts +0 -82
  533. package/src/tool/impact/markdown.ts +0 -283
  534. package/src/tool/impact/orchestrate.ts +0 -97
  535. package/src/tool/impact/result.ts +0 -2
  536. package/src/tool/impact/single-impact.ts +0 -90
  537. package/src/tool/impact/tui.ts +0 -39
  538. package/src/tool/impact/types.ts +0 -34
  539. package/src/tool/infra/cross-field.ts +0 -335
  540. package/src/tool/infra/pipeline.ts +0 -334
  541. package/src/tool/infra/readiness-message.ts +0 -5
  542. package/src/tool/inspect/orchestrate.ts +0 -154
  543. package/src/tool/orientation/deps.ts +0 -63
  544. package/src/tool/orientation/mode.ts +0 -139
  545. package/src/tool/orientation/orchestrate.ts +0 -475
  546. package/src/tool/orientation/precise-target.ts +0 -253
  547. package/src/tool/params.ts +0 -15
  548. package/src/tool/refactor-apply/markdown.ts +0 -118
  549. package/src/tool/refactor-apply/orchestrate.ts +0 -84
  550. package/src/tool/refactor-plan/orchestrate.ts +0 -355
  551. package/src/tool/resolve/orchestrate.ts +0 -38
  552. package/src/tool/result/impact.ts +0 -50
  553. package/src/ui/markdown/brief.ts +0 -218
  554. package/src/ui/message-renderer.ts +0 -121
  555. package/src/ui/tui/index.ts +0 -37
  556. /package/src/{tool/graph → analysis/relations}/callees.ts +0 -0
@@ -18,6 +18,10 @@ import type {
18
18
  } from "@mrclrchtr/supi-code-runtime/api";
19
19
  import type { AnchorKind } from "../../session/target-store.ts";
20
20
  import type { AnchoredResolutionMetadata, AnchoredResolutionSource } from "../../types/index.ts";
21
+ import {
22
+ createCodeSymbolIdentityResolver,
23
+ type DeclarationOccurrenceIdentity,
24
+ } from "./identity.ts";
21
25
  import type { DisambiguationCandidateData, ResolvedTargetData, TargetOutcome } from "./types.ts";
22
26
 
23
27
  /** 1-based symbol anchor position (mirrors the runtime `SymbolAnchor`). */
@@ -149,7 +153,12 @@ function buildResolution(
149
153
  function resolvedFromSymbol(
150
154
  file: string,
151
155
  s: CodeSymbol,
152
- opts: { snapped: boolean; requested: Anchor; source: AnchoredResolutionSource },
156
+ opts: {
157
+ snapped: boolean;
158
+ requested: Anchor;
159
+ source: AnchoredResolutionSource;
160
+ identity: DeclarationOccurrenceIdentity;
161
+ },
153
162
  ): { kind: "resolved"; target: ResolvedTargetData } {
154
163
  const a = (s.nameAnchor ?? s.declarationAnchor) as Anchor;
155
164
  return {
@@ -159,9 +168,13 @@ function resolvedFromSymbol(
159
168
  position: { line: a.line - 1, character: a.character - 1 },
160
169
  displayLine: a.line,
161
170
  displayCharacter: a.character,
171
+ declarationAnchor: { ...s.declarationAnchor },
172
+ declarationOccurrence: opts.identity.declarationOccurrence,
162
173
  name: s.name,
163
174
  kind: s.kind,
175
+ identityKind: opts.identity.identityKind,
164
176
  confidence: "semantic",
177
+ provenance: opts.identity.structuralEvidence ? ["semantic", "structural"] : ["semantic"],
165
178
  anchorKind: (s.nameAnchor ? "name" : "declaration") as AnchorKind,
166
179
  container: s.container ?? null,
167
180
  resolution: buildResolution(opts.requested, a, opts.snapped, opts.source),
@@ -169,24 +182,37 @@ function resolvedFromSymbol(
169
182
  };
170
183
  }
171
184
 
172
- function candidatesFromSymbols(
185
+ async function candidatesFromSymbols(
173
186
  file: string,
174
187
  matched: CodeSymbol[],
175
- ): { kind: "disambiguation"; candidates: DisambiguationCandidateData[]; omittedCount: number } {
176
- const candidates = matched.map((s, idx) => {
177
- const a = (s.nameAnchor ?? s.declarationAnchor) as Anchor;
178
- return {
179
- name: s.name,
180
- kind: s.kind,
181
- container: s.container ?? null,
182
- file,
183
- line: a.line,
184
- character: a.character,
185
- reason: `${a.line}:${a.character}`,
186
- rank: idx + 1,
187
- anchorKind: (s.nameAnchor ? "name" : "declaration") as AnchorKind,
188
- } satisfies DisambiguationCandidateData;
189
- });
188
+ resolveIdentity: (symbol: CodeSymbol) => Promise<DeclarationOccurrenceIdentity>,
189
+ ): Promise<{
190
+ kind: "disambiguation";
191
+ candidates: DisambiguationCandidateData[];
192
+ omittedCount: number;
193
+ }> {
194
+ const candidates = await Promise.all(
195
+ matched.map(async (s, idx) => {
196
+ const a = (s.nameAnchor ?? s.declarationAnchor) as Anchor;
197
+ const identity = await resolveIdentity(s);
198
+ return {
199
+ name: s.name,
200
+ kind: s.kind,
201
+ identityKind: identity.identityKind,
202
+ provenance: identity.structuralEvidence
203
+ ? (["semantic", "structural"] as const)
204
+ : (["semantic"] as const),
205
+ container: s.container ?? null,
206
+ file,
207
+ line: a.line,
208
+ character: a.character,
209
+ declarationAnchor: { ...s.declarationAnchor },
210
+ declarationOccurrence: identity.declarationOccurrence,
211
+ rank: idx + 1,
212
+ anchorKind: (s.nameAnchor ? "name" : "declaration") as AnchorKind,
213
+ } satisfies DisambiguationCandidateData;
214
+ }),
215
+ );
190
216
  return { kind: "disambiguation", candidates, omittedCount: 0 };
191
217
  }
192
218
 
@@ -197,13 +223,14 @@ async function resolveFromSemantic(
197
223
  provider: AnchoredResolverProvider,
198
224
  ): Promise<TargetOutcome | null> {
199
225
  if (!provider.documentSymbols) return null;
200
- let symbols: CodeSymbol[] | null = null;
226
+ let symbols: CodeSymbol[] = [];
201
227
  try {
202
- symbols = await provider.documentSymbols(file);
228
+ const result = await provider.documentSymbols(file);
229
+ if (result.kind !== "unavailable") symbols = result.data;
203
230
  } catch {
204
- symbols = null;
231
+ symbols = [];
205
232
  }
206
- if (!symbols || symbols.length === 0) return null;
233
+ if (symbols.length === 0) return null;
207
234
 
208
235
  const exact: CodeSymbol[] = [];
209
236
  const snap: CodeSymbol[] = [];
@@ -213,14 +240,26 @@ async function resolveFromSemantic(
213
240
  else if (m === "snap") snap.push(s);
214
241
  }
215
242
 
243
+ const structural = provider.nodeAt ? { nodeAt: provider.nodeAt } : undefined;
244
+ const resolveIdentity = createCodeSymbolIdentityResolver(file, symbols, structural);
216
245
  if (exact.length === 1) {
217
- return resolvedFromSymbol(file, exact[0], { snapped: false, requested, source: "semantic" });
246
+ return resolvedFromSymbol(file, exact[0], {
247
+ snapped: false,
248
+ requested,
249
+ source: "semantic",
250
+ identity: await resolveIdentity(exact[0]),
251
+ });
218
252
  }
219
- if (exact.length > 1) return candidatesFromSymbols(file, exact);
253
+ if (exact.length > 1) return candidatesFromSymbols(file, exact, resolveIdentity);
220
254
  if (snap.length === 1) {
221
- return resolvedFromSymbol(file, snap[0], { snapped: true, requested, source: "semantic" });
255
+ return resolvedFromSymbol(file, snap[0], {
256
+ snapped: true,
257
+ requested,
258
+ source: "semantic",
259
+ identity: await resolveIdentity(snap[0]),
260
+ });
222
261
  }
223
- if (snap.length > 1) return candidatesFromSymbols(file, snap);
262
+ if (snap.length > 1) return candidatesFromSymbols(file, snap, resolveIdentity);
224
263
  return null;
225
264
  }
226
265
 
@@ -277,9 +316,15 @@ async function resolveFromStructural(
277
316
  position: { line: nameAnchor.line - 1, character: nameAnchor.character - 1 },
278
317
  displayLine: nameAnchor.line,
279
318
  displayCharacter: nameAnchor.character,
319
+ declarationAnchor: {
320
+ line: declAncestor.startLine,
321
+ character: declAncestor.startCharacter,
322
+ },
323
+ declarationOccurrence: 0,
280
324
  name: node.text,
281
325
  kind: kindFromDeclarationType(declAncestor.type),
282
326
  confidence: "structural",
327
+ provenance: ["structural"],
283
328
  anchorKind: "name",
284
329
  container: null,
285
330
  resolution: buildResolution(requested, nameAnchor, snapped, "structural-identifier"),
@@ -318,7 +363,7 @@ export async function resolveAnchoredSymbolTarget(
318
363
  if (isBinaryFile(file)) {
319
364
  return {
320
365
  kind: "error",
321
- message: `File type not supported for semantic analysis: \`${file}\`. Use \`code_find\` with \`mode: "text"\` for explicit text search.`,
366
+ message: `File type not supported for semantic analysis: \`${file}\`. Use PI read or grep for explicit filesystem inspection when appropriate.`,
322
367
  };
323
368
  }
324
369
 
@@ -342,7 +387,7 @@ function coordinateNotOnSymbolMessage(
342
387
  const at = `${path.basename(file)}:${line}:${character}`;
343
388
  const reason = detail ? ` (on \`${detail}\`)` : "";
344
389
  return (
345
- `**Error:** No symbol target resolved at \`${at}\`${reason}. ` +
390
+ `No symbol target resolved at \`${at}\`${reason}. ` +
346
391
  "`code_resolve` resolves real symbol targets from provider-backed evidence; " +
347
392
  "use `code_inspect` for point-level facts at this coordinate, or pass the identifier coordinate of a declaration."
348
393
  );
@@ -1,22 +1,24 @@
1
1
  /**
2
- * File-surface target resolutiondiscovers actionable targets within a file
3
- * using injected semantic (LSP document symbols) and structural (Tree-sitter exports)
4
- * substrates with explicit fallback policy.
2
+ * File target discoverycollects every evidence-backed declaration in one
3
+ * file after the Target workflow has established semantic readiness.
5
4
  *
6
- * Policy: LSP document symbols preferred (semantic). Falls back to Tree-sitter
7
- * exports (structural) when LSP is unavailable or returns no results.
5
+ * Semantic and structural facts are merged. Semantic facts win duplicate
6
+ * members; structural outline facts may supplement declarations omitted by
7
+ * the language server.
8
8
  */
9
9
 
10
10
  import * as fs from "node:fs";
11
11
  import * as path from "node:path";
12
12
  import type {
13
+ DeclarationNesting,
14
+ DocumentCodeSymbol,
15
+ OutlineData,
13
16
  SemanticProvider as SemanticSubstrate,
14
17
  StructuralProvider as StructuralSubstrate,
15
18
  } from "@mrclrchtr/supi-code-runtime/api";
16
19
  import type { AnchorKind } from "../../session/target-store.ts";
17
- import { highestConfidence } from "../helpers.ts";
18
- import { getCodeProvider } from "../provider.ts";
19
- import { normalizePath } from "../search/ripgrep.ts";
20
+ import { normalizePath } from "../search/paths.ts";
21
+ import { canonicalDeclarationKind, refineTypeAliasIdentity } from "./identity.ts";
20
22
  import type { ResolvedTargetData, ResolvedTargetGroupData } from "./types.ts";
21
23
 
22
24
  const BINARY_EXTENSIONS = new Set([
@@ -46,18 +48,31 @@ const BINARY_EXTENSIONS = new Set([
46
48
  ".node",
47
49
  ]);
48
50
 
49
- function isBinaryFile(filePath: string): boolean {
50
- return BINARY_EXTENSIONS.has(path.extname(filePath).toLowerCase());
51
+ interface DiscoveredTargetData extends ResolvedTargetData {
52
+ /** Provider-backed hierarchy used only for file-result presentation ranking. */
53
+ readonly nesting: DeclarationNesting;
51
54
  }
52
55
 
53
- /**
54
- * Resolve a file into a group of discoverable targets.
55
- *
56
- * @param file - the file path (absolute or cwd-relative)
57
- * @param cwd - session working directory
58
- * @param deps - injected substrates (both optional)
59
- * @returns typed group outcome or error
60
- */
56
+ interface DiscoveryResult {
57
+ readonly available: boolean;
58
+ readonly targets: DiscoveredTargetData[];
59
+ }
60
+
61
+ /** Validated file-discovery input with its normalized absolute path. */
62
+ export type FileDiscoveryValidation =
63
+ | { kind: "valid"; file: string }
64
+ | { kind: "invalid-input"; message: string };
65
+
66
+ /** Validate a file selector before any semantic startup or provider call. */
67
+ export function validateFileTargetDiscovery(file: string, cwd: string): FileDiscoveryValidation {
68
+ const resolvedFile = normalizePath(file, cwd);
69
+ const validationError = validateDiscoveryFile(resolvedFile, file);
70
+ return validationError
71
+ ? { kind: "invalid-input", message: validationError }
72
+ : { kind: "valid", file: resolvedFile };
73
+ }
74
+
75
+ /** Discover a Target group for one file without rendering or registering handles. */
61
76
  export async function resolveFileTargetGroup(
62
77
  file: string,
63
78
  cwd: string,
@@ -66,149 +81,294 @@ export async function resolveFileTargetGroup(
66
81
  structural?: StructuralSubstrate;
67
82
  } = {},
68
83
  ): Promise<
69
- { kind: "resolved"; group: ResolvedTargetGroupData } | { kind: "error"; message: string }
84
+ | { kind: "resolved"; group: ResolvedTargetGroupData }
85
+ | { kind: "invalid-input"; message: string }
86
+ | { kind: "unavailable"; message: string }
70
87
  > {
71
- const resolvedFile = normalizePath(file, cwd);
72
-
73
- if (!fs.existsSync(resolvedFile)) {
74
- return { kind: "error", message: `File not found: \`${file}\`` };
75
- }
76
-
77
- if (isBinaryFile(resolvedFile)) {
78
- return {
79
- kind: "error",
80
- message: `File type not supported for semantic analysis: \`${file}\`. Use \`code_find\` with \`mode: "text"\` for explicit text search.`,
81
- };
82
- }
88
+ const validation = validateFileTargetDiscovery(file, cwd);
89
+ if (validation.kind === "invalid-input") return validation;
90
+ const resolvedFile = validation.file;
83
91
 
84
- const relPath = path.relative(cwd, resolvedFile);
85
-
86
- // Try structure-based discovery first (faster, no LSP needed)
87
- const structuralTargets = await resolveViaStructral(relPath, resolvedFile, cwd, deps.structural);
88
-
89
- // Try semantic discovery (richer), preferring it over structural
90
- const semanticTargets = await resolveViaSemantic(resolvedFile, deps.semantic, structuralTargets);
91
-
92
- const targets = semanticTargets ?? structuralTargets;
93
-
94
- if (!targets || targets.length === 0) {
92
+ const [semantic, structural] = await Promise.all([
93
+ discoverSemantic(resolvedFile, deps.semantic, deps.structural),
94
+ discoverStructural(resolvedFile, deps.structural),
95
+ ]);
96
+ if (!semantic.available && !structural.available) {
97
+ const displayFile = path.relative(cwd, resolvedFile) || file;
95
98
  return {
96
- kind: "error",
97
- message:
98
- `**Error:** File-level semantic exploration is not available for \`${file}\`. ` +
99
- "Provide `line` and `character`, or a `symbol` for discovery.",
99
+ kind: "unavailable",
100
+ message: `Declaration discovery is unavailable for \`${displayFile}\`.`,
100
101
  };
101
102
  }
102
103
 
104
+ const targets = mergeDiscoveries(structural.targets, semantic.targets);
105
+ const unknownNestingCount = targets.filter((target) => target.nesting === "unknown").length;
106
+ const discoveryProvenance = [
107
+ ...(semantic.available ? (["semantic"] as const) : []),
108
+ ...(structural.available ? (["structural"] as const) : []),
109
+ ];
103
110
  return {
104
111
  kind: "resolved",
105
112
  group: {
106
113
  file: resolvedFile,
107
- displayName: relPath,
114
+ displayName: path.relative(cwd, resolvedFile) || resolvedFile,
108
115
  targets,
109
- confidence: highestConfidence(targets.map((t) => t.confidence)),
116
+ discoveryProvenance,
117
+ confidence: targetGroupConfidence(targets, discoveryProvenance),
118
+ unknownNestingCount,
110
119
  },
111
120
  };
112
121
  }
113
122
 
114
- // ── Resolution helpers ───────────────────────────────────────────────
123
+ function targetGroupConfidence(
124
+ targets: readonly ResolvedTargetData[],
125
+ discoveryProvenance: ResolvedTargetGroupData["discoveryProvenance"],
126
+ ): ResolvedTargetGroupData["confidence"] {
127
+ if (targets.length === 0) {
128
+ return discoveryProvenance.includes("semantic") ? "semantic" : "structural";
129
+ }
130
+ if (targets.some((target) => target.confidence === "unavailable")) return "unavailable";
131
+ if (targets.some((target) => target.confidence === "heuristic")) return "heuristic";
132
+ if (targets.some((target) => target.confidence === "structural")) return "structural";
133
+ return "semantic";
134
+ }
115
135
 
116
- async function resolveViaSemantic(
117
- resolvedFile: string,
118
- semantic?: SemanticSubstrate,
119
- structuralTargets: ResolvedTargetData[] | null = null,
120
- ): Promise<ResolvedTargetData[] | null> {
121
- if (!semantic) return structuralTargets;
136
+ function validateDiscoveryFile(resolvedFile: string, requestedFile: string): string | null {
137
+ if (!fs.existsSync(resolvedFile)) return `File not found: \`${requestedFile}\``;
138
+ try {
139
+ if (!fs.statSync(resolvedFile).isFile()) return `Not a file: \`${requestedFile}\``;
140
+ } catch {
141
+ return `Cannot access file: \`${requestedFile}\``;
142
+ }
143
+ if (!BINARY_EXTENSIONS.has(path.extname(resolvedFile).toLowerCase())) return null;
144
+ return `File type not supported for code analysis: \`${requestedFile}\`. Use PI read or grep for explicit filesystem inspection when appropriate.`;
145
+ }
122
146
 
147
+ async function discoverSemantic(
148
+ file: string,
149
+ semantic: SemanticSubstrate | undefined,
150
+ structural: StructuralSubstrate | undefined,
151
+ ): Promise<DiscoveryResult> {
152
+ if (!semantic) return { available: false, targets: [] };
123
153
  try {
124
- const symbols = await semantic.documentSymbols(resolvedFile);
125
- if (!symbols || symbols.length === 0) return structuralTargets;
126
-
127
- const topLevel = symbols
128
- .filter((s) => !s.container)
129
- .map((s) => {
130
- const a = s.nameAnchor ?? s.declarationAnchor;
131
- return {
132
- file: resolvedFile,
133
- position: { line: a.line - 1, character: a.character - 1 },
134
- displayLine: a.line,
135
- displayCharacter: a.character,
136
- name: s.name,
137
- kind: s.kind,
138
- confidence: "semantic" as const,
139
- anchorKind: (s.nameAnchor ? "name" : "declaration") as AnchorKind,
140
- container: s.container ?? null,
141
- };
142
- });
143
-
144
- if (topLevel.length === 0) return structuralTargets;
145
-
146
- // Semantic symbols are available — prefer them over structural exports.
147
- // Only fall back to structural targets that have no semantic counterpart
148
- // (different position).
149
- if (!structuralTargets || structuralTargets.length === 0) return dedupeTargets(topLevel);
150
-
151
- // Build a position-based dedup: for each position, prefer the semantic entry.
152
- const byPos = new Map<string, ResolvedTargetData>();
153
- for (const t of structuralTargets) {
154
- byPos.set(`${t.position.line}:${t.position.character}`, t);
155
- }
156
- for (const t of topLevel) {
157
- byPos.set(`${t.position.line}:${t.position.character}`, t);
158
- }
159
- return [...byPos.values()];
154
+ const result = await semantic.documentSymbols(file);
155
+ if (result.kind === "unavailable") return { available: false, targets: [] };
156
+ return {
157
+ available: true,
158
+ targets: await Promise.all(
159
+ result.data.map(async (symbol) => {
160
+ const target = targetFromSymbol(file, symbol);
161
+ const refined = await refineTypeAliasIdentity(target, structural);
162
+ return { ...refined, nesting: target.nesting };
163
+ }),
164
+ ),
165
+ };
160
166
  } catch {
161
- return structuralTargets;
167
+ return { available: false, targets: [] };
162
168
  }
163
169
  }
164
170
 
165
- async function resolveViaStructral(
166
- relPath: string,
167
- resolvedFile: string,
168
- cwd: string,
169
- structural?: StructuralSubstrate,
170
- ): Promise<ResolvedTargetData[] | null> {
171
- // Resolve a substrate to use — prefer injected, fall back to auto-created
172
- const substrate = structural ?? createFallbackSubstrate(cwd);
173
- if (!substrate) return null;
171
+ function targetFromSymbol(file: string, symbol: DocumentCodeSymbol): DiscoveredTargetData {
172
+ const anchor = symbol.nameAnchor ?? symbol.declarationAnchor;
173
+ return {
174
+ file,
175
+ position: { line: anchor.line - 1, character: anchor.character - 1 },
176
+ displayLine: anchor.line,
177
+ displayCharacter: anchor.character,
178
+ declarationAnchor: { ...symbol.declarationAnchor },
179
+ declarationOccurrence: 0,
180
+ name: symbol.name,
181
+ kind: symbol.kind,
182
+ confidence: "semantic",
183
+ provenance: ["semantic"],
184
+ anchorKind: (symbol.nameAnchor ? "name" : "declaration") as AnchorKind,
185
+ container: symbol.container ?? null,
186
+ nesting: normalizeNesting(symbol.nesting),
187
+ };
188
+ }
189
+
190
+ /** Normalize process-global or legacy provider observations at the discovery seam. */
191
+ function normalizeNesting(value: unknown): DeclarationNesting {
192
+ if (value === "top-level" || value === "nested" || value === "unknown") return value;
193
+ return "unknown";
194
+ }
174
195
 
196
+ async function discoverStructural(
197
+ file: string,
198
+ structural: StructuralSubstrate | undefined,
199
+ ): Promise<DiscoveryResult> {
200
+ if (!structural) return { available: false, targets: [] };
175
201
  try {
176
- const exportsResult = await substrate.exports(relPath);
177
- if (exportsResult.kind !== "success" || exportsResult.data.length === 0) return null;
178
-
179
- return dedupeTargets(
180
- exportsResult.data.map((record) => ({
181
- file: resolvedFile,
182
- position: { line: record.startLine - 1, character: record.startCharacter - 1 },
183
- displayLine: record.startLine,
184
- displayCharacter: record.startCharacter,
185
- name: record.name,
186
- kind: record.kind,
187
- confidence: "structural" as const,
188
- // Structural exports use the node start (startLine/startCharacter) =
189
- // declaration anchor; no name anchor is derivable from exports alone.
190
- anchorKind: "declaration",
191
- container: null,
192
- })),
193
- );
202
+ const result = await structural.outline(file);
203
+ if (result.kind !== "success") return { available: false, targets: [] };
204
+ return { available: true, targets: flattenOutline(file, result.data) };
194
205
  } catch {
195
- return null;
206
+ return { available: false, targets: [] };
196
207
  }
197
208
  }
198
209
 
199
- /** Create a fallback substrate from a working directory using the unified registry. */
200
- function createFallbackSubstrate(dir: string): StructuralSubstrate | null {
201
- const state = getCodeProvider(dir);
202
- return state.kind === "ready" ? state.provider : null;
210
+ function flattenOutline(
211
+ file: string,
212
+ items: readonly OutlineData[],
213
+ container: string | null = null,
214
+ nesting: DeclarationNesting = "top-level",
215
+ ): DiscoveredTargetData[] {
216
+ return items.flatMap((item) => {
217
+ const target: DiscoveredTargetData = {
218
+ file,
219
+ position: { line: item.startLine - 1, character: item.startCharacter - 1 },
220
+ displayLine: item.startLine,
221
+ displayCharacter: item.startCharacter,
222
+ declarationAnchor: { line: item.startLine, character: item.startCharacter },
223
+ declarationOccurrence: 0,
224
+ name: item.name,
225
+ kind: item.kind,
226
+ identityKind: canonicalDeclarationKind(item.kind),
227
+ confidence: "structural",
228
+ provenance: ["structural"],
229
+ anchorKind: "declaration",
230
+ container,
231
+ nesting,
232
+ };
233
+ return [target, ...flattenOutline(file, item.children ?? [], item.name, "nested")];
234
+ });
235
+ }
236
+
237
+ /**
238
+ * Merge duplicate provider observations without collapsing repeated declarations.
239
+ * Semantic facts win a matched pair while retaining both provider sources.
240
+ */
241
+ function mergeDiscoveries(
242
+ structural: readonly DiscoveredTargetData[],
243
+ semantic: readonly DiscoveredTargetData[],
244
+ ): DiscoveredTargetData[] {
245
+ const unmatchedSemantic = new Set(semantic.map((_target, index) => index));
246
+ const mergedStructural = structural.flatMap((structuralTarget) => {
247
+ const semanticIndex = findSemanticMatch(structuralTarget, semantic, unmatchedSemantic);
248
+ if (semanticIndex === null) return [structuralTarget];
249
+ unmatchedSemantic.delete(semanticIndex);
250
+ const semanticTarget = semantic[semanticIndex];
251
+ return [
252
+ {
253
+ ...semanticTarget,
254
+ provenance: ["semantic", "structural"] as const,
255
+ container: reconcileContainer(semanticTarget, structuralTarget),
256
+ nesting: reconcileNesting(semanticTarget.nesting, structuralTarget.nesting),
257
+ },
258
+ ];
259
+ });
260
+ const semanticOnly = semantic.filter((_target, index) => unmatchedSemantic.has(index));
261
+ const sourceOrdered = [...mergedStructural, ...semanticOnly].sort(compareDeclarations);
262
+ const identified = assignDeclarationOccurrences(sourceOrdered);
263
+ return identified.sort(compareFileOrientationDeclarations);
264
+ }
265
+
266
+ /** Let provider-backed known hierarchy refine unknown without guessing through a conflict. */
267
+ function reconcileNesting(
268
+ semantic: DeclarationNesting,
269
+ structural: DeclarationNesting,
270
+ ): DeclarationNesting {
271
+ if (semantic === structural) return semantic;
272
+ if (semantic === "unknown") return structural;
273
+ if (structural === "unknown") return semantic;
274
+ return "unknown";
203
275
  }
204
276
 
205
- function dedupeTargets(targets: ResolvedTargetData[]): ResolvedTargetData[] {
206
- const deduped = new Map<string, ResolvedTargetData>();
207
- for (const target of targets) {
208
- const key = `${target.name ?? ""}:${target.displayLine}:${target.displayCharacter}`;
209
- if (!deduped.has(key)) {
210
- deduped.set(key, target);
211
- }
277
+ /** Preserve known container evidence while clearing explicit provider conflicts. */
278
+ function reconcileContainer(
279
+ semantic: DiscoveredTargetData,
280
+ structural: DiscoveredTargetData,
281
+ ): string | null {
282
+ if (semantic.container === structural.container) return semantic.container;
283
+ if (semantic.nesting === "unknown" && semantic.container === null) {
284
+ return structural.container;
285
+ }
286
+ if (structural.nesting === "unknown" && structural.container === null) {
287
+ return semantic.container;
212
288
  }
213
- return [...deduped.values()];
289
+ return null;
290
+ }
291
+
292
+ function findSemanticMatch(
293
+ structural: DiscoveredTargetData,
294
+ semantic: readonly DiscoveredTargetData[],
295
+ unmatched: ReadonlySet<number>,
296
+ ): number | null {
297
+ const matches = semantic
298
+ .map((target, index) => ({ target, index }))
299
+ .filter(({ target, index }) => unmatched.has(index) && sameDeclaration(target, structural))
300
+ .sort(
301
+ (left, right) =>
302
+ Math.abs(left.target.declarationAnchor.character - structural.declarationAnchor.character) -
303
+ Math.abs(
304
+ right.target.declarationAnchor.character - structural.declarationAnchor.character,
305
+ ) ||
306
+ left.target.declarationAnchor.character - right.target.declarationAnchor.character ||
307
+ compareDeclarations(left.target, right.target) ||
308
+ (left.target.container ?? "").localeCompare(right.target.container ?? "") ||
309
+ left.target.nesting.localeCompare(right.target.nesting) ||
310
+ left.index - right.index,
311
+ );
312
+ return matches[0]?.index ?? null;
313
+ }
314
+
315
+ function sameDeclaration(left: DiscoveredTargetData, right: DiscoveredTargetData): boolean {
316
+ return (
317
+ left.name === right.name &&
318
+ compatibleContainerEvidence(left, right) &&
319
+ left.declarationAnchor.line === right.declarationAnchor.line &&
320
+ declarationIdentityKind(left) === declarationIdentityKind(right)
321
+ );
322
+ }
323
+
324
+ /** Container conflicts match only when both providers report the exact declaration anchor. */
325
+ function compatibleContainerEvidence(
326
+ left: DiscoveredTargetData,
327
+ right: DiscoveredTargetData,
328
+ ): boolean {
329
+ return (
330
+ left.container === right.container ||
331
+ left.declarationAnchor.character === right.declarationAnchor.character
332
+ );
333
+ }
334
+
335
+ function assignDeclarationOccurrences(
336
+ targets: readonly DiscoveredTargetData[],
337
+ ): DiscoveredTargetData[] {
338
+ const occurrences = new Map<string, number>();
339
+ return targets.map((target) => {
340
+ const key = [
341
+ target.declarationAnchor.line,
342
+ target.name ?? "",
343
+ declarationIdentityKind(target),
344
+ target.container ?? "",
345
+ ].join("\0");
346
+ const occurrence = occurrences.get(key) ?? 0;
347
+ occurrences.set(key, occurrence + 1);
348
+ return { ...target, declarationOccurrence: occurrence };
349
+ });
350
+ }
351
+
352
+ function declarationIdentityKind(target: ResolvedTargetData): string {
353
+ return target.identityKind ?? canonicalDeclarationKind(target.kind);
354
+ }
355
+
356
+ function compareFileOrientationDeclarations(
357
+ left: DiscoveredTargetData,
358
+ right: DiscoveredTargetData,
359
+ ): number {
360
+ return topLevelRank(left) - topLevelRank(right) || compareDeclarations(left, right);
361
+ }
362
+
363
+ function topLevelRank(target: DiscoveredTargetData): number {
364
+ return target.nesting === "top-level" ? 0 : 1;
365
+ }
366
+
367
+ function compareDeclarations(left: ResolvedTargetData, right: ResolvedTargetData): number {
368
+ return (
369
+ left.displayLine - right.displayLine ||
370
+ left.displayCharacter - right.displayCharacter ||
371
+ (left.name ?? "").localeCompare(right.name ?? "") ||
372
+ (left.kind ?? "").localeCompare(right.kind ?? "")
373
+ );
214
374
  }