@mrclrchtr/supi-code-intelligence 3.2.0 → 4.1.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 (577) hide show
  1. package/README.md +157 -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/node_modules/@mrclrchtr/supi-core/src/settings/settings-action-menu.ts +1 -0
  10. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-schema.ts +9 -0
  11. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings.ts +1 -0
  12. package/node_modules/@mrclrchtr/supi-code-runtime/package.json +2 -2
  13. package/node_modules/@mrclrchtr/supi-code-runtime/src/api.ts +10 -1
  14. package/node_modules/@mrclrchtr/supi-code-runtime/src/capability/types.ts +19 -29
  15. package/node_modules/@mrclrchtr/supi-code-runtime/src/index.ts +7 -1
  16. package/node_modules/@mrclrchtr/supi-code-runtime/src/query-result.ts +42 -0
  17. package/node_modules/@mrclrchtr/supi-code-runtime/src/types.ts +15 -10
  18. package/node_modules/@mrclrchtr/supi-core/package.json +2 -4
  19. package/node_modules/@mrclrchtr/supi-core/src/api.ts +0 -4
  20. package/node_modules/@mrclrchtr/supi-core/src/evidence-badge.ts +3 -2
  21. package/node_modules/@mrclrchtr/supi-core/src/index.ts +0 -4
  22. package/node_modules/@mrclrchtr/supi-core/src/llm.ts +0 -10
  23. package/node_modules/@mrclrchtr/supi-core/src/path-utils.ts +19 -15
  24. package/node_modules/@mrclrchtr/supi-core/src/settings/settings-action-menu.ts +1 -0
  25. package/node_modules/@mrclrchtr/supi-core/src/settings/settings-schema.ts +9 -0
  26. package/node_modules/@mrclrchtr/supi-core/src/settings.ts +1 -0
  27. package/node_modules/@mrclrchtr/supi-lsp/README.md +72 -62
  28. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/README.md +8 -0
  29. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +2 -8
  30. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/api.ts +0 -4
  31. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/evidence-badge.ts +3 -2
  32. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/index.ts +0 -4
  33. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/llm.ts +0 -10
  34. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/path-utils.ts +19 -15
  35. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-action-menu.ts +1 -0
  36. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-schema.ts +9 -0
  37. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings.ts +1 -0
  38. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/package.json +2 -2
  39. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/api.ts +10 -1
  40. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/capability/types.ts +19 -29
  41. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/index.ts +7 -1
  42. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/query-result.ts +42 -0
  43. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/types.ts +15 -10
  44. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/package.json +2 -4
  45. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/api.ts +0 -4
  46. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/evidence-badge.ts +3 -2
  47. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/index.ts +0 -4
  48. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/llm.ts +0 -10
  49. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/path-utils.ts +19 -15
  50. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/settings-action-menu.ts +1 -0
  51. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/settings-schema.ts +9 -0
  52. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings.ts +1 -0
  53. package/node_modules/@mrclrchtr/supi-lsp/package.json +4 -5
  54. package/node_modules/@mrclrchtr/supi-lsp/src/api.ts +9 -9
  55. package/node_modules/@mrclrchtr/supi-lsp/src/client/client.ts +70 -41
  56. package/node_modules/@mrclrchtr/supi-lsp/src/client/transport.ts +16 -13
  57. package/node_modules/@mrclrchtr/supi-lsp/src/config/config.ts +2 -2
  58. package/node_modules/@mrclrchtr/supi-lsp/src/config/lsp-settings.ts +0 -2
  59. package/node_modules/@mrclrchtr/supi-lsp/src/index.ts +6 -6
  60. package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-diagnostics.ts +5 -95
  61. package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-workspace-recovery.ts +4 -3
  62. package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-workspace-symbol.ts +44 -6
  63. package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager.ts +47 -65
  64. package/node_modules/@mrclrchtr/supi-lsp/src/provider/lsp-semantic-provider.ts +132 -79
  65. package/node_modules/@mrclrchtr/supi-lsp/src/provider/refactor-planning.ts +6 -14
  66. package/node_modules/@mrclrchtr/supi-lsp/src/session/readiness.ts +38 -0
  67. package/node_modules/@mrclrchtr/supi-lsp/src/session/runtime-controller.ts +87 -75
  68. package/node_modules/@mrclrchtr/supi-lsp/src/session/runtime-registration.ts +5 -5
  69. package/node_modules/@mrclrchtr/supi-lsp/src/session/{service-registry.ts → runtime-registry.ts} +163 -71
  70. package/node_modules/@mrclrchtr/supi-tree-sitter/README.md +4 -0
  71. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/README.md +8 -0
  72. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +2 -8
  73. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/api.ts +0 -4
  74. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/evidence-badge.ts +3 -2
  75. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/index.ts +0 -4
  76. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/llm.ts +0 -10
  77. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/path-utils.ts +19 -15
  78. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-action-menu.ts +1 -0
  79. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-schema.ts +9 -0
  80. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings.ts +1 -0
  81. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/package.json +2 -2
  82. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/api.ts +10 -1
  83. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/capability/types.ts +19 -29
  84. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/index.ts +7 -1
  85. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/query-result.ts +42 -0
  86. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/types.ts +15 -10
  87. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/package.json +2 -4
  88. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/api.ts +0 -4
  89. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/evidence-badge.ts +3 -2
  90. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/index.ts +0 -4
  91. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/llm.ts +0 -10
  92. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/path-utils.ts +19 -15
  93. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/settings-action-menu.ts +1 -0
  94. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/settings-schema.ts +9 -0
  95. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings.ts +1 -0
  96. package/node_modules/@mrclrchtr/supi-tree-sitter/package.json +4 -21
  97. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/bash/tree-sitter-bash.wasm +0 -0
  98. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/bash/tree-sitter-bash.wasm.json +2 -2
  99. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/c/tree-sitter-c.wasm +0 -0
  100. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/c/tree-sitter-c.wasm.json +2 -2
  101. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/go/tree-sitter-go.wasm +0 -0
  102. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/go/tree-sitter-go.wasm.json +2 -2
  103. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/javascript/tree-sitter-javascript.wasm +0 -0
  104. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/javascript/tree-sitter-javascript.wasm.json +2 -2
  105. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/kotlin/tree-sitter-kotlin.wasm +0 -0
  106. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/kotlin/tree-sitter-kotlin.wasm.json +2 -2
  107. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/python/tree-sitter-python.wasm +0 -0
  108. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/python/tree-sitter-python.wasm.json +2 -2
  109. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/r/tree-sitter-r.wasm +0 -0
  110. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/r/tree-sitter-r.wasm.json +2 -2
  111. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/rust/tree-sitter-rust.wasm.json +1 -1
  112. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/sql/tree-sitter-sql.wasm +0 -0
  113. package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/sql/tree-sitter-sql.wasm.json +3 -3
  114. package/node_modules/@mrclrchtr/supi-tree-sitter/scripts/generate-kotlin-wasm.mjs +6 -0
  115. package/node_modules/@mrclrchtr/supi-tree-sitter/scripts/generate-sql-wasm.mjs +18 -4
  116. package/node_modules/@mrclrchtr/supi-tree-sitter/scripts/vendor-wasm.mjs +17 -1
  117. package/node_modules/@mrclrchtr/supi-tree-sitter/src/api.ts +2 -0
  118. package/node_modules/@mrclrchtr/supi-tree-sitter/src/coordinates.ts +20 -41
  119. package/node_modules/@mrclrchtr/supi-tree-sitter/src/index.ts +2 -0
  120. package/node_modules/@mrclrchtr/supi-tree-sitter/src/language.ts +7 -0
  121. package/node_modules/@mrclrchtr/supi-tree-sitter/src/operation-support.ts +40 -0
  122. package/node_modules/@mrclrchtr/supi-tree-sitter/src/session/session.ts +9 -7
  123. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/call-sites.ts +6 -1
  124. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/callees.ts +76 -37
  125. package/node_modules/yaml/LICENSE +13 -0
  126. package/node_modules/yaml/README.md +172 -0
  127. package/node_modules/yaml/bin.mjs +11 -0
  128. package/node_modules/yaml/browser/dist/compose/compose-collection.js +88 -0
  129. package/node_modules/yaml/browser/dist/compose/compose-doc.js +43 -0
  130. package/node_modules/yaml/browser/dist/compose/compose-node.js +109 -0
  131. package/node_modules/yaml/browser/dist/compose/compose-scalar.js +86 -0
  132. package/node_modules/yaml/browser/dist/compose/composer.js +219 -0
  133. package/node_modules/yaml/browser/dist/compose/resolve-block-map.js +115 -0
  134. package/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +198 -0
  135. package/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +49 -0
  136. package/node_modules/yaml/browser/dist/compose/resolve-end.js +37 -0
  137. package/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +207 -0
  138. package/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +225 -0
  139. package/node_modules/yaml/browser/dist/compose/resolve-props.js +146 -0
  140. package/node_modules/yaml/browser/dist/compose/util-contains-newline.js +34 -0
  141. package/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +26 -0
  142. package/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +15 -0
  143. package/node_modules/yaml/browser/dist/compose/util-map-includes.js +13 -0
  144. package/node_modules/yaml/browser/dist/doc/Document.js +335 -0
  145. package/node_modules/yaml/browser/dist/doc/anchors.js +71 -0
  146. package/node_modules/yaml/browser/dist/doc/applyReviver.js +55 -0
  147. package/node_modules/yaml/browser/dist/doc/createNode.js +88 -0
  148. package/node_modules/yaml/browser/dist/doc/directives.js +176 -0
  149. package/node_modules/yaml/browser/dist/errors.js +57 -0
  150. package/node_modules/yaml/browser/dist/index.js +17 -0
  151. package/node_modules/yaml/browser/dist/log.js +11 -0
  152. package/node_modules/yaml/browser/dist/nodes/Alias.js +116 -0
  153. package/node_modules/yaml/browser/dist/nodes/Collection.js +147 -0
  154. package/node_modules/yaml/browser/dist/nodes/Node.js +38 -0
  155. package/node_modules/yaml/browser/dist/nodes/Pair.js +36 -0
  156. package/node_modules/yaml/browser/dist/nodes/Scalar.js +24 -0
  157. package/node_modules/yaml/browser/dist/nodes/YAMLMap.js +144 -0
  158. package/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +113 -0
  159. package/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +63 -0
  160. package/node_modules/yaml/browser/dist/nodes/identity.js +36 -0
  161. package/node_modules/yaml/browser/dist/nodes/toJS.js +37 -0
  162. package/node_modules/yaml/browser/dist/parse/cst-scalar.js +214 -0
  163. package/node_modules/yaml/browser/dist/parse/cst-stringify.js +61 -0
  164. package/node_modules/yaml/browser/dist/parse/cst-visit.js +97 -0
  165. package/node_modules/yaml/browser/dist/parse/cst.js +98 -0
  166. package/node_modules/yaml/browser/dist/parse/lexer.js +721 -0
  167. package/node_modules/yaml/browser/dist/parse/line-counter.js +39 -0
  168. package/node_modules/yaml/browser/dist/parse/parser.js +975 -0
  169. package/node_modules/yaml/browser/dist/public-api.js +102 -0
  170. package/node_modules/yaml/browser/dist/schema/Schema.js +37 -0
  171. package/node_modules/yaml/browser/dist/schema/common/map.js +17 -0
  172. package/node_modules/yaml/browser/dist/schema/common/null.js +15 -0
  173. package/node_modules/yaml/browser/dist/schema/common/seq.js +17 -0
  174. package/node_modules/yaml/browser/dist/schema/common/string.js +14 -0
  175. package/node_modules/yaml/browser/dist/schema/core/bool.js +19 -0
  176. package/node_modules/yaml/browser/dist/schema/core/float.js +43 -0
  177. package/node_modules/yaml/browser/dist/schema/core/int.js +38 -0
  178. package/node_modules/yaml/browser/dist/schema/core/schema.js +23 -0
  179. package/node_modules/yaml/browser/dist/schema/json/schema.js +62 -0
  180. package/node_modules/yaml/browser/dist/schema/tags.js +96 -0
  181. package/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +58 -0
  182. package/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +26 -0
  183. package/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +46 -0
  184. package/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +71 -0
  185. package/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +67 -0
  186. package/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +74 -0
  187. package/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +78 -0
  188. package/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +39 -0
  189. package/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +93 -0
  190. package/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
  191. package/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +146 -0
  192. package/node_modules/yaml/browser/dist/stringify/stringify.js +129 -0
  193. package/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +153 -0
  194. package/node_modules/yaml/browser/dist/stringify/stringifyComment.js +20 -0
  195. package/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +85 -0
  196. package/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +25 -0
  197. package/node_modules/yaml/browser/dist/stringify/stringifyPair.js +150 -0
  198. package/node_modules/yaml/browser/dist/stringify/stringifyString.js +336 -0
  199. package/node_modules/yaml/browser/dist/util.js +11 -0
  200. package/node_modules/yaml/browser/dist/visit.js +233 -0
  201. package/node_modules/yaml/browser/index.js +5 -0
  202. package/node_modules/yaml/browser/package.json +3 -0
  203. package/node_modules/yaml/dist/cli.d.ts +8 -0
  204. package/node_modules/yaml/dist/cli.mjs +201 -0
  205. package/node_modules/yaml/dist/compose/compose-collection.d.ts +11 -0
  206. package/node_modules/yaml/dist/compose/compose-collection.js +90 -0
  207. package/node_modules/yaml/dist/compose/compose-doc.d.ts +7 -0
  208. package/node_modules/yaml/dist/compose/compose-doc.js +45 -0
  209. package/node_modules/yaml/dist/compose/compose-node.d.ts +29 -0
  210. package/node_modules/yaml/dist/compose/compose-node.js +112 -0
  211. package/node_modules/yaml/dist/compose/compose-scalar.d.ts +5 -0
  212. package/node_modules/yaml/dist/compose/compose-scalar.js +88 -0
  213. package/node_modules/yaml/dist/compose/composer.d.ts +63 -0
  214. package/node_modules/yaml/dist/compose/composer.js +224 -0
  215. package/node_modules/yaml/dist/compose/resolve-block-map.d.ts +6 -0
  216. package/node_modules/yaml/dist/compose/resolve-block-map.js +117 -0
  217. package/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
  218. package/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
  219. package/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
  220. package/node_modules/yaml/dist/compose/resolve-block-seq.js +51 -0
  221. package/node_modules/yaml/dist/compose/resolve-end.d.ts +6 -0
  222. package/node_modules/yaml/dist/compose/resolve-end.js +39 -0
  223. package/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
  224. package/node_modules/yaml/dist/compose/resolve-flow-collection.js +209 -0
  225. package/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
  226. package/node_modules/yaml/dist/compose/resolve-flow-scalar.js +227 -0
  227. package/node_modules/yaml/dist/compose/resolve-props.d.ts +23 -0
  228. package/node_modules/yaml/dist/compose/resolve-props.js +148 -0
  229. package/node_modules/yaml/dist/compose/util-contains-newline.d.ts +2 -0
  230. package/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
  231. package/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
  232. package/node_modules/yaml/dist/compose/util-empty-scalar-position.js +28 -0
  233. package/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
  234. package/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
  235. package/node_modules/yaml/dist/compose/util-map-includes.d.ts +4 -0
  236. package/node_modules/yaml/dist/compose/util-map-includes.js +15 -0
  237. package/node_modules/yaml/dist/doc/Document.d.ts +141 -0
  238. package/node_modules/yaml/dist/doc/Document.js +337 -0
  239. package/node_modules/yaml/dist/doc/anchors.d.ts +24 -0
  240. package/node_modules/yaml/dist/doc/anchors.js +76 -0
  241. package/node_modules/yaml/dist/doc/applyReviver.d.ts +9 -0
  242. package/node_modules/yaml/dist/doc/applyReviver.js +57 -0
  243. package/node_modules/yaml/dist/doc/createNode.d.ts +17 -0
  244. package/node_modules/yaml/dist/doc/createNode.js +90 -0
  245. package/node_modules/yaml/dist/doc/directives.d.ts +49 -0
  246. package/node_modules/yaml/dist/doc/directives.js +178 -0
  247. package/node_modules/yaml/dist/errors.d.ts +21 -0
  248. package/node_modules/yaml/dist/errors.js +62 -0
  249. package/node_modules/yaml/dist/index.d.ts +25 -0
  250. package/node_modules/yaml/dist/index.js +50 -0
  251. package/node_modules/yaml/dist/log.d.ts +3 -0
  252. package/node_modules/yaml/dist/log.js +19 -0
  253. package/node_modules/yaml/dist/nodes/Alias.d.ts +29 -0
  254. package/node_modules/yaml/dist/nodes/Alias.js +118 -0
  255. package/node_modules/yaml/dist/nodes/Collection.d.ts +73 -0
  256. package/node_modules/yaml/dist/nodes/Collection.js +151 -0
  257. package/node_modules/yaml/dist/nodes/Node.d.ts +53 -0
  258. package/node_modules/yaml/dist/nodes/Node.js +40 -0
  259. package/node_modules/yaml/dist/nodes/Pair.d.ts +22 -0
  260. package/node_modules/yaml/dist/nodes/Pair.js +39 -0
  261. package/node_modules/yaml/dist/nodes/Scalar.d.ts +47 -0
  262. package/node_modules/yaml/dist/nodes/Scalar.js +27 -0
  263. package/node_modules/yaml/dist/nodes/YAMLMap.d.ts +53 -0
  264. package/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
  265. package/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
  266. package/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
  267. package/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
  268. package/node_modules/yaml/dist/nodes/addPairToJSMap.js +65 -0
  269. package/node_modules/yaml/dist/nodes/identity.d.ts +23 -0
  270. package/node_modules/yaml/dist/nodes/identity.js +53 -0
  271. package/node_modules/yaml/dist/nodes/toJS.d.ts +29 -0
  272. package/node_modules/yaml/dist/nodes/toJS.js +39 -0
  273. package/node_modules/yaml/dist/options.d.ts +350 -0
  274. package/node_modules/yaml/dist/parse/cst-scalar.d.ts +64 -0
  275. package/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
  276. package/node_modules/yaml/dist/parse/cst-stringify.d.ts +8 -0
  277. package/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
  278. package/node_modules/yaml/dist/parse/cst-visit.d.ts +39 -0
  279. package/node_modules/yaml/dist/parse/cst-visit.js +99 -0
  280. package/node_modules/yaml/dist/parse/cst.d.ts +109 -0
  281. package/node_modules/yaml/dist/parse/cst.js +112 -0
  282. package/node_modules/yaml/dist/parse/lexer.d.ts +87 -0
  283. package/node_modules/yaml/dist/parse/lexer.js +723 -0
  284. package/node_modules/yaml/dist/parse/line-counter.d.ts +22 -0
  285. package/node_modules/yaml/dist/parse/line-counter.js +41 -0
  286. package/node_modules/yaml/dist/parse/parser.d.ts +84 -0
  287. package/node_modules/yaml/dist/parse/parser.js +980 -0
  288. package/node_modules/yaml/dist/public-api.d.ts +44 -0
  289. package/node_modules/yaml/dist/public-api.js +107 -0
  290. package/node_modules/yaml/dist/schema/Schema.d.ts +17 -0
  291. package/node_modules/yaml/dist/schema/Schema.js +39 -0
  292. package/node_modules/yaml/dist/schema/common/map.d.ts +2 -0
  293. package/node_modules/yaml/dist/schema/common/map.js +19 -0
  294. package/node_modules/yaml/dist/schema/common/null.d.ts +4 -0
  295. package/node_modules/yaml/dist/schema/common/null.js +17 -0
  296. package/node_modules/yaml/dist/schema/common/seq.d.ts +2 -0
  297. package/node_modules/yaml/dist/schema/common/seq.js +19 -0
  298. package/node_modules/yaml/dist/schema/common/string.d.ts +2 -0
  299. package/node_modules/yaml/dist/schema/common/string.js +16 -0
  300. package/node_modules/yaml/dist/schema/core/bool.d.ts +4 -0
  301. package/node_modules/yaml/dist/schema/core/bool.js +21 -0
  302. package/node_modules/yaml/dist/schema/core/float.d.ts +4 -0
  303. package/node_modules/yaml/dist/schema/core/float.js +47 -0
  304. package/node_modules/yaml/dist/schema/core/int.d.ts +4 -0
  305. package/node_modules/yaml/dist/schema/core/int.js +42 -0
  306. package/node_modules/yaml/dist/schema/core/schema.d.ts +1 -0
  307. package/node_modules/yaml/dist/schema/core/schema.js +25 -0
  308. package/node_modules/yaml/dist/schema/json/schema.d.ts +2 -0
  309. package/node_modules/yaml/dist/schema/json/schema.js +64 -0
  310. package/node_modules/yaml/dist/schema/json-schema.d.ts +69 -0
  311. package/node_modules/yaml/dist/schema/tags.d.ts +48 -0
  312. package/node_modules/yaml/dist/schema/tags.js +99 -0
  313. package/node_modules/yaml/dist/schema/types.d.ts +92 -0
  314. package/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
  315. package/node_modules/yaml/dist/schema/yaml-1.1/binary.js +70 -0
  316. package/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
  317. package/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
  318. package/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
  319. package/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
  320. package/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
  321. package/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
  322. package/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
  323. package/node_modules/yaml/dist/schema/yaml-1.1/merge.js +71 -0
  324. package/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +22 -0
  325. package/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
  326. package/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
  327. package/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
  328. package/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
  329. package/node_modules/yaml/dist/schema/yaml-1.1/schema.js +41 -0
  330. package/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
  331. package/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
  332. package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
  333. package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
  334. package/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
  335. package/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
  336. package/node_modules/yaml/dist/stringify/stringify.d.ts +21 -0
  337. package/node_modules/yaml/dist/stringify/stringify.js +132 -0
  338. package/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
  339. package/node_modules/yaml/dist/stringify/stringifyCollection.js +155 -0
  340. package/node_modules/yaml/dist/stringify/stringifyComment.d.ts +10 -0
  341. package/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
  342. package/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
  343. package/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
  344. package/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
  345. package/node_modules/yaml/dist/stringify/stringifyNumber.js +27 -0
  346. package/node_modules/yaml/dist/stringify/stringifyPair.d.ts +3 -0
  347. package/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
  348. package/node_modules/yaml/dist/stringify/stringifyString.d.ts +9 -0
  349. package/node_modules/yaml/dist/stringify/stringifyString.js +338 -0
  350. package/node_modules/yaml/dist/test-events.d.ts +4 -0
  351. package/node_modules/yaml/dist/test-events.js +134 -0
  352. package/node_modules/yaml/dist/util.d.ts +16 -0
  353. package/node_modules/yaml/dist/util.js +28 -0
  354. package/node_modules/yaml/dist/visit.d.ts +102 -0
  355. package/node_modules/yaml/dist/visit.js +236 -0
  356. package/node_modules/yaml/package.json +97 -0
  357. package/node_modules/yaml/util.js +2 -0
  358. package/package.json +10 -8
  359. package/src/analysis/architecture/discovery.ts +213 -227
  360. package/src/analysis/architecture/manifest.ts +147 -0
  361. package/src/analysis/architecture/model.ts +119 -52
  362. package/src/analysis/architecture/workspace-config.ts +229 -0
  363. package/src/analysis/{coverage/coverage-warnings.ts → capability/capability-warnings.ts} +41 -78
  364. package/src/analysis/evidence.ts +22 -5
  365. package/src/analysis/health/diagnostics.ts +183 -0
  366. package/src/analysis/health/recovery.ts +39 -0
  367. package/src/analysis/health/signals.ts +20 -0
  368. package/src/analysis/instruction-files.ts +60 -48
  369. package/src/analysis/provider.ts +31 -12
  370. package/src/analysis/readiness.ts +29 -9
  371. package/src/{tool/refactor-apply → analysis/refactor}/apply.ts +120 -26
  372. package/src/analysis/refactor/position.ts +6 -0
  373. package/src/analysis/refactor/safety.ts +4 -11
  374. package/src/analysis/references/locations.ts +20 -0
  375. package/src/analysis/references/semantic-refs.ts +21 -11
  376. package/src/{tool/graph → analysis/relations}/implementations.ts +27 -23
  377. package/src/analysis/relations/provider-locations.ts +179 -0
  378. package/src/{tool/graph → analysis/relations}/references.ts +25 -21
  379. package/src/{tool/graph → analysis/relations}/types.ts +4 -19
  380. package/src/analysis/search/ast-scan.ts +376 -0
  381. package/src/analysis/search/call-name.ts +68 -0
  382. package/src/analysis/search/deadline.ts +84 -0
  383. package/src/analysis/search/paths.ts +88 -0
  384. package/src/analysis/search/pattern.ts +290 -246
  385. package/src/analysis/target/anchored.ts +72 -27
  386. package/src/analysis/target/file.ts +292 -132
  387. package/src/analysis/target/identity.ts +237 -0
  388. package/src/analysis/target/symbol.ts +169 -86
  389. package/src/analysis/target/types.ts +36 -4
  390. package/src/api.ts +21 -4
  391. package/src/app/app.ts +54 -44
  392. package/src/extension.ts +21 -97
  393. package/src/headless.ts +41 -0
  394. package/src/session/capability-adapter.ts +26 -118
  395. package/src/session/find-types.ts +38 -0
  396. package/src/session/find-workflow.ts +141 -0
  397. package/src/session/graph/collect.ts +181 -0
  398. package/src/session/graph-types.ts +77 -0
  399. package/src/session/graph-workflow.ts +152 -0
  400. package/src/session/health-types.ts +134 -0
  401. package/src/session/health-workflow.ts +341 -0
  402. package/src/session/input/common.ts +216 -0
  403. package/src/session/input/health-refactor.ts +169 -0
  404. package/src/session/input/workflows.ts +211 -0
  405. package/src/session/inspect/collect.ts +304 -0
  406. package/src/session/inspect/file-point.ts +69 -0
  407. package/src/session/inspect-types.ts +78 -0
  408. package/src/session/inspect-workflow.ts +157 -0
  409. package/src/session/orientation/collect.ts +718 -0
  410. package/src/session/orientation/context-facts.ts +319 -0
  411. package/src/session/orientation/context-sections.ts +352 -0
  412. package/src/session/orientation-types.ts +97 -0
  413. package/src/session/orientation-workflow.ts +307 -0
  414. package/src/session/refactor-plans.ts +1 -1
  415. package/src/session/refactor-types.ts +51 -0
  416. package/src/session/refactor-workflow.ts +263 -0
  417. package/src/session/session.ts +263 -234
  418. package/src/session/target-candidates.ts +60 -0
  419. package/src/session/target-input.ts +98 -0
  420. package/src/session/target-store.ts +132 -29
  421. package/src/session/target-workflow.ts +254 -302
  422. package/src/session/workflow-control.ts +35 -0
  423. package/src/substrate/lsp/lifecycle.ts +26 -53
  424. package/src/substrate/lsp/maintenance.ts +75 -0
  425. package/src/substrate/lsp/recovery.ts +41 -25
  426. package/src/substrate/lsp/settings.ts +1 -10
  427. package/src/substrate/lsp/state.ts +5 -13
  428. package/src/substrate/workspace-provider-host.ts +129 -0
  429. package/src/tool/find/ast-kinds.ts +35 -0
  430. package/src/tool/find/execute.ts +22 -113
  431. package/src/tool/find/markdown.ts +85 -221
  432. package/src/tool/find/modes.ts +5 -0
  433. package/src/tool/find/render.ts +57 -0
  434. package/src/tool/find/tui.ts +1 -1
  435. package/src/tool/graph/calls-md.ts +17 -30
  436. package/src/tool/graph/execute.ts +42 -103
  437. package/src/tool/graph/implementations-md.ts +32 -54
  438. package/src/tool/graph/markdown-base.ts +73 -196
  439. package/src/tool/graph/provider-location-md.ts +9 -0
  440. package/src/tool/graph/references-md.ts +34 -27
  441. package/src/tool/graph/tui.ts +8 -26
  442. package/src/tool/guidance.ts +31 -48
  443. package/src/tool/health/execute.ts +15 -56
  444. package/src/tool/health/markdown.ts +199 -148
  445. package/src/tool/health/semantic-state.ts +24 -0
  446. package/src/tool/health/tui.ts +262 -36
  447. package/src/tool/infra/error-results.ts +0 -2
  448. package/src/tool/infra/progress.ts +2 -2
  449. package/src/tool/infra/workflow-control.ts +11 -0
  450. package/src/tool/inspect/execute.ts +23 -63
  451. package/src/tool/inspect/markdown.ts +114 -95
  452. package/src/tool/inspect/tui.ts +7 -7
  453. package/src/tool/orientation/execute.ts +50 -37
  454. package/src/tool/orientation/markdown.ts +26 -31
  455. package/src/tool/orientation/tui.ts +41 -39
  456. package/src/tool/refactor-apply/execute.ts +23 -9
  457. package/src/tool/refactor-apply/tui.ts +7 -3
  458. package/src/tool/refactor-plan/execute.ts +44 -61
  459. package/src/tool/refactor-plan/markdown.ts +33 -56
  460. package/src/tool/refactor-plan/tui.ts +10 -11
  461. package/src/tool/register.ts +6 -5
  462. package/src/tool/resolve/execute.ts +23 -69
  463. package/src/tool/resolve/markdown.ts +125 -114
  464. package/src/tool/resolve/tui.ts +11 -9
  465. package/src/tool/result/assembly.ts +125 -0
  466. package/src/tool/result/errors.ts +20 -34
  467. package/src/tool/result/find.ts +107 -21
  468. package/src/tool/result/graph.ts +163 -64
  469. package/src/tool/result/health.ts +170 -73
  470. package/src/tool/result/inspect.ts +183 -41
  471. package/src/tool/result/orientation.ts +118 -16
  472. package/src/tool/result/refactor.ts +101 -21
  473. package/src/tool/result/resolve.ts +243 -80
  474. package/src/tool/result/types.ts +100 -56
  475. package/src/tool/schemas.ts +160 -231
  476. package/src/tool/specs.ts +57 -168
  477. package/src/types/details.ts +2 -4
  478. package/src/types/execution.ts +6 -15
  479. package/src/types/index.ts +2 -4
  480. package/src/types/tool-names.ts +1 -2
  481. package/src/ui/footer.ts +3 -3
  482. package/src/ui/markdown/gather.ts +17 -65
  483. package/src/ui/markdown/overview-data.ts +143 -21
  484. package/src/ui/markdown/overview.ts +27 -8
  485. package/src/ui/markdown/types.ts +12 -16
  486. package/src/ui/status-command.ts +39 -31
  487. package/src/ui/status-overlay.ts +23 -15
  488. package/src/ui/tui/common.ts +121 -74
  489. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +0 -31
  490. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +0 -11
  491. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/types.ts +0 -2
  492. package/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +0 -31
  493. package/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +0 -11
  494. package/node_modules/@mrclrchtr/supi-core/src/types.ts +0 -2
  495. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +0 -31
  496. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +0 -11
  497. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/types.ts +0 -2
  498. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +0 -31
  499. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +0 -11
  500. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/types.ts +0 -2
  501. package/node_modules/@mrclrchtr/supi-lsp/src/diagnostics/diagnostic-augmentation.ts +0 -82
  502. package/node_modules/@mrclrchtr/supi-lsp/src/diagnostics/diagnostic-context.ts +0 -116
  503. package/node_modules/@mrclrchtr/supi-lsp/src/diagnostics/diagnostic-display.ts +0 -69
  504. package/node_modules/@mrclrchtr/supi-lsp/src/manager/capability-index.ts +0 -24
  505. package/node_modules/@mrclrchtr/supi-lsp/src/manager/client-pool.ts +0 -33
  506. package/node_modules/@mrclrchtr/supi-lsp/src/manager/diagnostic-store.ts +0 -51
  507. package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-stale-resync.ts +0 -47
  508. package/node_modules/@mrclrchtr/supi-lsp/src/manager/recovery-coordinator.ts +0 -37
  509. package/node_modules/@mrclrchtr/supi-lsp/src/manager/workspace-router.ts +0 -44
  510. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +0 -31
  511. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +0 -11
  512. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/types.ts +0 -2
  513. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +0 -31
  514. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +0 -11
  515. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/types.ts +0 -2
  516. package/src/analysis/brief/directory.ts +0 -324
  517. package/src/analysis/brief/enrich.ts +0 -157
  518. package/src/analysis/brief/file.ts +0 -84
  519. package/src/analysis/brief/inventory.ts +0 -177
  520. package/src/analysis/brief/main.ts +0 -176
  521. package/src/analysis/brief/models.ts +0 -75
  522. package/src/analysis/brief/public-brief.ts +0 -179
  523. package/src/analysis/brief/summarize.ts +0 -208
  524. package/src/analysis/brief/types.ts +0 -27
  525. package/src/analysis/brief/use-case.ts +0 -264
  526. package/src/analysis/search/ripgrep.ts +0 -558
  527. package/src/analysis/signals/git.ts +0 -89
  528. package/src/analysis/signals/project.ts +0 -189
  529. package/src/analysis/target/bridge.ts +0 -152
  530. package/src/analysis/target/file-resolution.ts +0 -125
  531. package/src/analysis/target/planner.ts +0 -92
  532. package/src/analysis/target/query.ts +0 -74
  533. package/src/analysis/target/resolve-common.ts +0 -115
  534. package/src/analysis/target/service.ts +0 -229
  535. package/src/analysis/tests/likely-tests.ts +0 -174
  536. package/src/analysis/tests/test-discovery.ts +0 -540
  537. package/src/analysis/tests/vitest.ts +0 -87
  538. package/src/app/manager.ts +0 -65
  539. package/src/substrate/lsp/diagnostic-injection.ts +0 -203
  540. package/src/substrate/lsp/overrides.ts +0 -132
  541. package/src/substrate/tree-sitter/lifecycle.ts +0 -52
  542. package/src/tool/find/orchestrate.ts +0 -317
  543. package/src/tool/find/semantic-search.ts +0 -128
  544. package/src/tool/graph/collect-relation.ts +0 -372
  545. package/src/tool/graph/orchestrate.ts +0 -259
  546. package/src/tool/health/orchestrate.ts +0 -151
  547. package/src/tool/health/sections/diagnostics.ts +0 -182
  548. package/src/tool/health/sections/recovery.ts +0 -89
  549. package/src/tool/health/sections/signals.ts +0 -89
  550. package/src/tool/impact/analysis.ts +0 -220
  551. package/src/tool/impact/change-set-impact.ts +0 -152
  552. package/src/tool/impact/execute.ts +0 -125
  553. package/src/tool/impact/file-level-impact.ts +0 -82
  554. package/src/tool/impact/markdown.ts +0 -283
  555. package/src/tool/impact/orchestrate.ts +0 -97
  556. package/src/tool/impact/result.ts +0 -2
  557. package/src/tool/impact/single-impact.ts +0 -90
  558. package/src/tool/impact/tui.ts +0 -39
  559. package/src/tool/impact/types.ts +0 -34
  560. package/src/tool/infra/cross-field.ts +0 -335
  561. package/src/tool/infra/pipeline.ts +0 -334
  562. package/src/tool/infra/readiness-message.ts +0 -5
  563. package/src/tool/inspect/orchestrate.ts +0 -154
  564. package/src/tool/orientation/deps.ts +0 -63
  565. package/src/tool/orientation/mode.ts +0 -139
  566. package/src/tool/orientation/orchestrate.ts +0 -475
  567. package/src/tool/orientation/precise-target.ts +0 -253
  568. package/src/tool/params.ts +0 -15
  569. package/src/tool/refactor-apply/markdown.ts +0 -118
  570. package/src/tool/refactor-apply/orchestrate.ts +0 -84
  571. package/src/tool/refactor-plan/orchestrate.ts +0 -355
  572. package/src/tool/resolve/orchestrate.ts +0 -38
  573. package/src/tool/result/impact.ts +0 -50
  574. package/src/ui/markdown/brief.ts +0 -218
  575. package/src/ui/message-renderer.ts +0 -121
  576. package/src/ui/tui/index.ts +0 -37
  577. /package/src/{tool/graph → analysis/relations}/callees.ts +0 -0
@@ -1,43 +1,64 @@
1
1
  /**
2
2
  * Direct-apply file mutation path for precise workspace edits.
3
3
  *
4
- * Writes edits atomically per-file: all transformed content is precomputed
5
- * in memory before any file is written, so a mid-apply failure never
6
- * leaves the workspace half-renamed.
4
+ * Stages transformed content beside each source file before atomically
5
+ * replacing that file. A failed stage cannot truncate a source file, and a
6
+ * failed later replacement attempts to roll back files already replaced.
7
7
  *
8
- * Edits are sorted by descending absolute offset (line + character)
9
- * so same-line edits are applied right-to-left regardless of order.
8
+ * Edits are sorted by descending source position
9
+ * so edits are applied from bottom-right to top-left regardless of order.
10
10
  *
11
11
  * Only called after safety validation has passed.
12
12
  */
13
13
 
14
- import { readFileSync, writeFileSync } from "node:fs";
14
+ import { createHash, randomUUID } from "node:crypto";
15
+ import { readFileSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
16
+ import { basename, dirname, join } from "node:path";
15
17
  import { withFileMutationQueue } from "@earendil-works/pi-coding-agent";
16
18
  import type { FileEdit, WorkspaceEdit } from "@mrclrchtr/supi-code-runtime/api";
17
- import { validateEditAgainstFiles } from "../../analysis/refactor/safety.ts";
19
+ import { compareCodePositions } from "./position.ts";
20
+ import { validateEditAgainstFiles } from "./safety.ts";
18
21
 
19
22
  export type ApplyResult =
20
23
  | { kind: "applied"; filesChanged: number; totalEdits: number }
21
24
  | { kind: "error"; reason: string };
22
25
 
26
+ export interface ApplyOptions {
27
+ /** Expected SHA-256 fingerprints per file, validated after queue acquisition. */
28
+ expectedFingerprints?: ReadonlyMap<string, string>;
29
+ }
30
+
23
31
  /**
24
32
  * Apply a validated WorkspaceEdit to the filesystem.
25
33
  *
26
34
  * Precomputes every file's new content in memory first, then commits
27
- * all writes. If a commit fails after some files were already written,
28
- * the function rolls those files back to their original contents.
35
+ * all writes. If a commit fails after some files were already replaced,
36
+ * the function attempts to roll those files back to their original contents.
37
+ *
38
+ * When `expectedFingerprints` is supplied, fingerprints are compared
39
+ * **after** all mutation queues are acquired, so a sibling write cannot
40
+ * change the file between fingerprint check and queue entry.
29
41
  *
30
42
  * The whole precompute-then-commit (including range/safety re-checks) runs
31
43
  * inside pi's per-file mutation queue, acquired for every involved file in
32
44
  * sorted path order before reading. This serializes against sibling
33
45
  * `edit`/`write` tools on the same file and prevents lock-ordering deadlock
34
- * across concurrent applies, while preserving all-or-nothing across files
35
- * (ADR 0006).
46
+ * across concurrent applies, while attempting to roll back ordinary commit
47
+ * failures across files (ADR 0006). It does not provide durable crash recovery
48
+ * across sequential replacements.
36
49
  */
37
- export async function applyWorkspaceEdit(edit: WorkspaceEdit): Promise<ApplyResult> {
50
+ export async function applyWorkspaceEdit(
51
+ edit: WorkspaceEdit,
52
+ options: ApplyOptions = {},
53
+ ): Promise<ApplyResult> {
38
54
  const grouped = groupEditsByFile(edit.edits);
39
55
  const files = [...grouped.keys()].sort();
40
56
  return withAllMutationQueues(files, async () => {
57
+ if (options.expectedFingerprints) {
58
+ const freshness = validateFingerprints(files, options.expectedFingerprints);
59
+ if (!freshness.ok) return { kind: "error", reason: freshness.reason };
60
+ }
61
+
41
62
  const validation = validateEditAgainstFiles(edit);
42
63
  if (!validation.safe) {
43
64
  return { kind: "error", reason: validation.reason };
@@ -55,6 +76,35 @@ export async function applyWorkspaceEdit(edit: WorkspaceEdit): Promise<ApplyResu
55
76
  });
56
77
  }
57
78
 
79
+ function validateFingerprints(
80
+ files: string[],
81
+ expected: ReadonlyMap<string, string>,
82
+ ): { ok: true } | { ok: false; reason: string } {
83
+ for (const file of files) {
84
+ const expectedFingerprint = expected.get(file);
85
+ if (expectedFingerprint === undefined) continue;
86
+ let actual: string;
87
+ try {
88
+ actual = sha256File(file);
89
+ } catch {
90
+ return stalePlanError(file);
91
+ }
92
+ if (actual !== expectedFingerprint) return stalePlanError(file);
93
+ }
94
+ return { ok: true };
95
+ }
96
+
97
+ function sha256File(file: string): string {
98
+ return createHash("sha256").update(readFileSync(file, "utf-8")).digest("hex");
99
+ }
100
+
101
+ function stalePlanError(file: string): { ok: false; reason: string } {
102
+ return {
103
+ ok: false,
104
+ reason: `File ${file} has changed since the plan was generated. Regenerate with code_refactor_plan.`,
105
+ };
106
+ }
107
+
58
108
  /**
59
109
  * Acquire pi's per-file mutation queue for every involved file in sorted path
60
110
  * order before running `fn`, holding all locks for the duration. Sorted order
@@ -111,8 +161,9 @@ function applyEditsToContent(content: string, edits: FileEdit[]): string {
111
161
  const lines = content.split("\n");
112
162
  const sortedEdits = [...edits].sort(
113
163
  (left, right) =>
114
- absoluteOffset(right.range.start.line, right.range.start.character) -
115
- absoluteOffset(left.range.start.line, left.range.start.character),
164
+ // Descending by start position so later edits don't shift earlier ones.
165
+ compareCodePositions(right.range.start, left.range.start) ||
166
+ compareCodePositions(right.range.end, left.range.end),
116
167
  );
117
168
 
118
169
  let updated = content;
@@ -125,26 +176,40 @@ function applyEditsToContent(content: string, edits: FileEdit[]): string {
125
176
  return updated;
126
177
  }
127
178
 
179
+ interface StagedContents {
180
+ kind: "staged";
181
+ files: Map<string, string>;
182
+ }
183
+
184
+ type StageResult = StagedContents | { kind: "error"; reason: string };
185
+
128
186
  function commitTransformedContents(
129
187
  transformedContents: Map<string, string>,
130
188
  originalContents: Map<string, string>,
131
189
  totalEdits: number,
132
190
  ): ApplyResult {
133
- const writtenFiles: string[] = [];
191
+ const staged = stageTransformedContents(transformedContents);
192
+ if (staged.kind === "error") return staged;
134
193
 
194
+ const committedFiles: string[] = [];
135
195
  try {
136
- for (const file of [...transformedContents.keys()].sort()) {
137
- writeFileSync(file, transformedContents.get(file) ?? "", "utf-8");
138
- writtenFiles.push(file);
196
+ // ponytail: no durable journal; add one only if cross-file crash recovery is required.
197
+ for (const [file, stagedFile] of [...staged.files].sort(([left], [right]) =>
198
+ left.localeCompare(right),
199
+ )) {
200
+ renameSync(stagedFile, file);
201
+ committedFiles.push(file);
139
202
  }
140
203
  } catch (error) {
141
- const rollbackError = rollbackWrittenFiles(writtenFiles, originalContents);
204
+ const rollbackError = rollbackCommittedFiles(committedFiles, originalContents);
142
205
  return {
143
206
  kind: "error",
144
207
  reason: rollbackError
145
208
  ? `${toErrorMessage(error)} (rollback failed: ${rollbackError})`
146
209
  : toErrorMessage(error),
147
210
  };
211
+ } finally {
212
+ cleanupStagedFiles(staged.files);
148
213
  }
149
214
 
150
215
  return {
@@ -154,12 +219,45 @@ function commitTransformedContents(
154
219
  };
155
220
  }
156
221
 
157
- function rollbackWrittenFiles(
158
- writtenFiles: string[],
222
+ function stageTransformedContents(transformedContents: Map<string, string>): StageResult {
223
+ const stagedFiles = new Map<string, string>();
224
+ try {
225
+ for (const [file, content] of transformedContents) {
226
+ const stagedFile = stagedFilePath(file);
227
+ stagedFiles.set(file, stagedFile);
228
+ writeFileSync(stagedFile, content, {
229
+ encoding: "utf-8",
230
+ flag: "wx",
231
+ mode: statSync(file).mode & 0o777,
232
+ });
233
+ }
234
+ return { kind: "staged", files: stagedFiles };
235
+ } catch (error) {
236
+ cleanupStagedFiles(stagedFiles);
237
+ return { kind: "error", reason: toErrorMessage(error) };
238
+ }
239
+ }
240
+
241
+ function stagedFilePath(file: string): string {
242
+ return join(dirname(file), `.${basename(file)}.supi-refactor-${randomUUID()}.tmp`);
243
+ }
244
+
245
+ function cleanupStagedFiles(stagedFiles: ReadonlyMap<string, string>): void {
246
+ for (const stagedFile of stagedFiles.values()) {
247
+ try {
248
+ rmSync(stagedFile, { force: true });
249
+ } catch {
250
+ // Staging cleanup is best-effort; source files have already been preserved or restored.
251
+ }
252
+ }
253
+ }
254
+
255
+ function rollbackCommittedFiles(
256
+ committedFiles: string[],
159
257
  originalContents: Map<string, string>,
160
258
  ): string | null {
161
259
  try {
162
- for (const file of writtenFiles.reverse()) {
260
+ for (const file of committedFiles.reverse()) {
163
261
  writeFileSync(file, originalContents.get(file) ?? "", "utf-8");
164
262
  }
165
263
  return null;
@@ -168,10 +266,6 @@ function rollbackWrittenFiles(
168
266
  }
169
267
  }
170
268
 
171
- function absoluteOffset(line: number, character: number): number {
172
- return line * 1_000_000 + character;
173
- }
174
-
175
269
  function toOffset(lines: string[], line: number, character: number): number {
176
270
  let offset = 0;
177
271
  for (let index = 0; index < line && index < lines.length; index++) {
@@ -0,0 +1,6 @@
1
+ import type { CodePosition } from "@mrclrchtr/supi-code-runtime/api";
2
+
3
+ /** Compare zero-based source positions lexicographically by line, then character. */
4
+ export function compareCodePositions(left: CodePosition, right: CodePosition): number {
5
+ return left.line - right.line || left.character - right.character;
6
+ }
@@ -7,6 +7,7 @@
7
7
 
8
8
  import { readFileSync } from "node:fs";
9
9
  import type { FileEdit, WorkspaceEdit } from "@mrclrchtr/supi-code-runtime/api";
10
+ import { compareCodePositions } from "./position.ts";
10
11
 
11
12
  export type ValidationResult = { safe: true } | { safe: false; reason: string };
12
13
 
@@ -122,27 +123,19 @@ function validateCharacterBounds(file: string, edit: FileEdit, lines: string[]):
122
123
  function hasOverlappingEdits(edits: FileEdit[]): boolean {
123
124
  const fileGroups = groupByFile(edits);
124
125
  for (const [, fileEdits] of fileGroups) {
125
- const sorted = [...fileEdits].sort(
126
- (a, b) =>
127
- absoluteOffset(a.range.start.line, a.range.start.character) -
128
- absoluteOffset(b.range.start.line, b.range.start.character),
126
+ const sorted = [...fileEdits].sort((left, right) =>
127
+ compareCodePositions(left.range.start, right.range.start),
129
128
  );
130
129
 
131
130
  for (let index = 1; index < sorted.length; index++) {
132
131
  const previous = sorted[index - 1];
133
132
  const current = sorted[index];
134
- const previousEnd = absoluteOffset(previous.range.end.line, previous.range.end.character);
135
- const currentStart = absoluteOffset(current.range.start.line, current.range.start.character);
136
- if (currentStart < previousEnd) return true;
133
+ if (compareCodePositions(current.range.start, previous.range.end) < 0) return true;
137
134
  }
138
135
  }
139
136
  return false;
140
137
  }
141
138
 
142
- function absoluteOffset(line: number, character: number): number {
143
- return line * 1_000_000 + character;
144
- }
145
-
146
139
  function groupByFile(edits: FileEdit[]): Map<string, FileEdit[]> {
147
140
  const groups = new Map<string, FileEdit[]>();
148
141
  for (const fileEdit of edits) {
@@ -0,0 +1,20 @@
1
+ import { uriToFile } from "@mrclrchtr/supi-core/path";
2
+
3
+ /** Minimal semantic location shape used to remove a declaration from references. */
4
+ export interface HasLspPosition {
5
+ uri: string;
6
+ range: { start: { line: number; character: number } };
7
+ }
8
+
9
+ /** Exclude the target declaration from provider references. */
10
+ export function filterOutDeclaration<T extends HasLspPosition>(
11
+ references: T[],
12
+ targetFile: string,
13
+ targetPosition: { line: number; character: number },
14
+ ): T[] {
15
+ return references.filter((reference) => {
16
+ if (uriToFile(reference.uri) !== targetFile) return true;
17
+ const start = reference.range.start;
18
+ return start.line !== targetPosition.line || start.character !== targetPosition.character;
19
+ });
20
+ }
@@ -6,14 +6,17 @@ import type {
6
6
  ConfidenceMode,
7
7
  SemanticProvider as SemanticSubstrate,
8
8
  } from "@mrclrchtr/supi-code-runtime/api";
9
+ import { uriToFile } from "@mrclrchtr/supi-core/path";
9
10
  import {
10
11
  createEvidenceList,
12
+ type EvidenceList,
11
13
  type EvidenceListMetadata,
12
14
  renderEvidenceListDisclosure,
13
15
  } from "../evidence.ts";
14
16
  import { dedupeFileLineRefs, highestConfidence } from "../helpers.ts";
15
- import { filterOutDeclaration, isInProjectPath, uriToFile } from "../search/ripgrep.ts";
17
+ import { isInProjectPath } from "../search/paths.ts";
16
18
  import type { ResolvedTargetData } from "../target/types.ts";
19
+ import { filterOutDeclaration } from "./locations.ts";
17
20
 
18
21
  export interface FileLineRef {
19
22
  file: string;
@@ -35,20 +38,21 @@ export async function collectReferences(
35
38
  cwd: string,
36
39
  semantic: SemanticSubstrate,
37
40
  ): Promise<ReferenceCollection> {
38
- const locs = await semantic.references(target.file, target.position);
39
- if (!locs) {
41
+ const result = await semantic.references(target.file, target.position);
42
+ if (result.kind === "unavailable") {
40
43
  return { refs: [], confidence: "unavailable", externalCount: 0 };
41
44
  }
45
+ const locations = result.data;
42
46
 
43
47
  let externalCount = 0;
44
- for (const ref of locs) {
48
+ for (const ref of locations) {
45
49
  const filePath = uriToFile(ref.uri);
46
50
  if (!isInProjectPath(filePath, cwd)) {
47
51
  externalCount++;
48
52
  }
49
53
  }
50
54
 
51
- const filtered = filterOutDeclaration(locs, target.file, target.position);
55
+ const filtered = filterOutDeclaration(locations, target.file, target.position);
52
56
  const projectRefs: FileLineRef[] = [];
53
57
  for (const ref of filtered) {
54
58
  const filePath = uriToFile(ref.uri);
@@ -123,6 +127,16 @@ export function formatReferenceList(
123
127
  maxResults,
124
128
  });
125
129
 
130
+ return formatAssembledReferenceList(lines, evidence);
131
+ }
132
+
133
+ /** Render a reference list whose items and completeness were already assembled. */
134
+ export function formatAssembledReferenceList(
135
+ lines: string[],
136
+ evidence: EvidenceList<FileLineRef>,
137
+ ): EvidenceListMetadata | null {
138
+ if (evidence.metadata.totalCount === 0 && evidence.items.length === 0) return null;
139
+
126
140
  const byFile = new Map<string, number[]>();
127
141
  for (const ref of evidence.items) {
128
142
  const group = byFile.get(ref.file) ?? [];
@@ -132,15 +146,11 @@ export function formatReferenceList(
132
146
 
133
147
  for (const [file, locations] of byFile) {
134
148
  lines.push(`### ${file}`);
135
- const label = compactLineRanges(locations);
136
- lines.push(`- ${label}`);
149
+ lines.push(`- ${compactLineRanges(locations)}`);
137
150
  lines.push("");
138
151
  }
139
152
 
140
153
  const disclosure = renderEvidenceListDisclosure(evidence);
141
- if (disclosure) {
142
- lines.push(disclosure);
143
- }
144
-
154
+ if (disclosure) lines.push(disclosure);
145
155
  return evidence.metadata;
146
156
  }
@@ -2,6 +2,12 @@
2
2
  * Semantic implementation lookup — finds implementations of a target.
3
3
  */
4
4
 
5
+ import {
6
+ isTargetLocation,
7
+ normalizeProviderLocations,
8
+ normalizeTargetFile,
9
+ type RelationLocationPartialReason,
10
+ } from "./provider-locations.ts";
5
11
  import type { ImplementationEntry, RelationsServiceDeps } from "./types.ts";
6
12
 
7
13
  export interface ImplementationsResult {
@@ -9,6 +15,9 @@ export interface ImplementationsResult {
9
15
  targetName: string;
10
16
  implementations: ImplementationEntry[];
11
17
  externalCount: number;
18
+ /** Provider locations omitted because their URI or position was unusable. */
19
+ invalidLocationCount: number;
20
+ partialReason: RelationLocationPartialReason | null;
12
21
  confidence: "semantic" | "unavailable";
13
22
  }
14
23
 
@@ -29,40 +38,32 @@ export async function collectImplementations(
29
38
  targetName: targetName ?? "symbol",
30
39
  implementations: [],
31
40
  externalCount: 0,
41
+ invalidLocationCount: 0,
42
+ partialReason: null,
32
43
  confidence: "unavailable",
33
44
  };
34
45
  }
35
46
 
36
- const impls = await deps.provider.implementation(targetFile, targetPosition);
37
- if (!impls) {
47
+ const result = await deps.provider.implementation(targetFile, targetPosition);
48
+ if (result.kind === "unavailable") {
38
49
  return {
39
50
  kind: "implementations",
40
51
  targetName: targetName ?? "symbol",
41
52
  implementations: [],
42
53
  externalCount: 0,
43
- confidence: "semantic",
54
+ invalidLocationCount: 0,
55
+ partialReason: null,
56
+ confidence: "unavailable",
44
57
  };
45
58
  }
46
59
 
47
- const project: ImplementationEntry[] = [];
48
- let externalCount = 0;
49
-
50
- for (const loc of impls) {
51
- const uri = loc.uri ?? loc.targetUri ?? "";
52
- const filePath = uri.startsWith("file://") ? uri.slice(7) : uri;
53
- const line = (loc.range?.start?.line ?? loc.targetRange?.start?.line ?? 0) + 1;
54
-
55
- if (filePath?.startsWith(deps.cwd)) {
56
- project.push({
57
- file: filePath,
58
- line,
59
- character: 0,
60
- name: targetName,
61
- });
62
- } else {
63
- externalCount++;
64
- }
65
- }
60
+ const normalized = normalizeProviderLocations(result.data, deps.cwd);
61
+ const normalizedTargetFile = normalizeTargetFile(targetFile, deps.cwd);
62
+ const project: ImplementationEntry[] = normalized.project
63
+ .filter(
64
+ (implementation) => !isTargetLocation(implementation, normalizedTargetFile, targetPosition),
65
+ )
66
+ .map((implementation) => ({ ...implementation, name: targetName }));
66
67
 
67
68
  void maxResults;
68
69
 
@@ -70,7 +71,10 @@ export async function collectImplementations(
70
71
  kind: "implementations",
71
72
  targetName: targetName ?? "symbol",
72
73
  implementations: project,
73
- externalCount,
74
+ externalCount: normalized.external.length,
75
+ invalidLocationCount: normalized.invalidLocationCount,
76
+ partialReason:
77
+ normalized.partialReason ?? (result.kind === "partial" ? "provider-limited" : null),
74
78
  confidence: "semantic",
75
79
  };
76
80
  }
@@ -0,0 +1,179 @@
1
+ import * as path from "node:path";
2
+ import { uriToFile } from "@mrclrchtr/supi-core/path";
3
+
4
+ /** Why a provider-backed relation location could not be included as evidence. */
5
+ export type RelationLocationPartialReason = "invalid-provider-location" | "provider-limited";
6
+
7
+ interface ProviderPositionLike {
8
+ readonly line?: number;
9
+ readonly character?: number;
10
+ }
11
+
12
+ interface ProviderRangeLike {
13
+ readonly start?: ProviderPositionLike;
14
+ }
15
+
16
+ /** Location shapes accepted from semantic providers, including LSP LocationLink fields. */
17
+ export interface ProviderLocationLike {
18
+ readonly uri?: string;
19
+ readonly targetUri?: string;
20
+ readonly range?: ProviderRangeLike;
21
+ readonly targetSelectionRange?: ProviderRangeLike;
22
+ readonly targetRange?: ProviderRangeLike;
23
+ }
24
+
25
+ /** One canonical absolute provider location with a 1-based display position. */
26
+ export interface NormalizedProviderLocation {
27
+ readonly file: string;
28
+ readonly line: number;
29
+ readonly character: number;
30
+ }
31
+
32
+ /** Canonical provider locations partitioned without treating invalid data as external evidence. */
33
+ export interface NormalizedProviderLocations {
34
+ readonly project: readonly NormalizedProviderLocation[];
35
+ readonly external: readonly NormalizedProviderLocation[];
36
+ readonly invalidLocationCount: number;
37
+ readonly partialReason: RelationLocationPartialReason | null;
38
+ }
39
+
40
+ /**
41
+ * Normalize, validate, deduplicate, order, and classify semantic-provider locations.
42
+ * Invalid locations are counted separately because they establish neither project nor external facts.
43
+ */
44
+ export function normalizeProviderLocations(
45
+ locations: readonly ProviderLocationLike[],
46
+ cwd: string,
47
+ ): NormalizedProviderLocations {
48
+ const flavor = pathFlavor(cwd);
49
+ const projectRoot = normalizeAbsolutePath(cwd, flavor);
50
+ const unique = new Map<string, NormalizedProviderLocation>();
51
+ let invalidLocationCount = 0;
52
+
53
+ for (const location of locations) {
54
+ const normalized = normalizeProviderLocation(location, flavor);
55
+ if (!normalized) {
56
+ invalidLocationCount++;
57
+ continue;
58
+ }
59
+ const key = locationKey(normalized);
60
+ const existing = unique.get(key);
61
+ if (!existing || compareLocations(normalized, existing) < 0) {
62
+ unique.set(key, normalized);
63
+ }
64
+ }
65
+
66
+ const project: NormalizedProviderLocation[] = [];
67
+ const external: NormalizedProviderLocation[] = [];
68
+ for (const location of [...unique.values()].sort(compareLocations)) {
69
+ (isProjectLocation(projectRoot, location.file, flavor) ? project : external).push(location);
70
+ }
71
+
72
+ return {
73
+ project,
74
+ external,
75
+ invalidLocationCount,
76
+ partialReason: invalidLocationCount > 0 ? "invalid-provider-location" : null,
77
+ };
78
+ }
79
+
80
+ /** Normalize a target path for exact declaration-location comparisons. */
81
+ export function normalizeTargetFile(file: string, cwd: string): string {
82
+ const flavor = pathFlavor(cwd);
83
+ const pathApi = flavor === "windows" ? path.win32 : path.posix;
84
+ return pathApi.normalize(pathApi.isAbsolute(file) ? file : pathApi.resolve(cwd, file));
85
+ }
86
+
87
+ /** Compare a normalized provider location with a zero-based target anchor. */
88
+ export function isTargetLocation(
89
+ location: NormalizedProviderLocation,
90
+ targetFile: string,
91
+ targetPosition: { readonly line: number; readonly character: number },
92
+ ): boolean {
93
+ return (
94
+ pathsEqual(location.file, targetFile) &&
95
+ location.line === targetPosition.line + 1 &&
96
+ location.character === targetPosition.character + 1
97
+ );
98
+ }
99
+
100
+ type PathFlavor = "posix" | "windows";
101
+
102
+ function normalizeProviderLocation(
103
+ location: ProviderLocationLike,
104
+ flavor: PathFlavor,
105
+ ): NormalizedProviderLocation | null {
106
+ const uri = location.uri ?? location.targetUri;
107
+ const start =
108
+ location.targetSelectionRange?.start ?? location.targetRange?.start ?? location.range?.start;
109
+ if (!uri || !isProviderPosition(start)) return null;
110
+
111
+ let file: string;
112
+ try {
113
+ file = uriToFile(uri);
114
+ } catch {
115
+ return null;
116
+ }
117
+ if (flavor === "windows" && /^\/[A-Za-z]:[\\/]/.test(file)) {
118
+ file = file.slice(1);
119
+ }
120
+ const pathApi = flavor === "windows" ? path.win32 : path.posix;
121
+ if (!file || !pathApi.isAbsolute(file)) return null;
122
+
123
+ return {
124
+ file: pathApi.normalize(file),
125
+ line: start.line + 1,
126
+ character: start.character + 1,
127
+ };
128
+ }
129
+
130
+ function isProviderPosition(value: ProviderPositionLike | undefined): value is {
131
+ line: number;
132
+ character: number;
133
+ } {
134
+ return (
135
+ value !== undefined &&
136
+ typeof value.line === "number" &&
137
+ Number.isInteger(value.line) &&
138
+ value.line >= 0 &&
139
+ typeof value.character === "number" &&
140
+ Number.isInteger(value.character) &&
141
+ value.character >= 0
142
+ );
143
+ }
144
+
145
+ function pathFlavor(file: string): PathFlavor {
146
+ return /^[A-Za-z]:[\\/]/.test(file) || file.startsWith("\\\\") ? "windows" : "posix";
147
+ }
148
+
149
+ function normalizeAbsolutePath(file: string, flavor: PathFlavor): string {
150
+ const pathApi = flavor === "windows" ? path.win32 : path.posix;
151
+ return pathApi.normalize(pathApi.resolve(file));
152
+ }
153
+
154
+ function isProjectLocation(root: string, file: string, flavor: PathFlavor): boolean {
155
+ const pathApi = flavor === "windows" ? path.win32 : path.posix;
156
+ const relative = pathApi.relative(root, file);
157
+ return (
158
+ relative === "" ||
159
+ (relative !== ".." && !relative.startsWith(`..${pathApi.sep}`) && !pathApi.isAbsolute(relative))
160
+ );
161
+ }
162
+
163
+ function pathsEqual(left: string, right: string): boolean {
164
+ if (pathFlavor(left) === "windows" || pathFlavor(right) === "windows") {
165
+ return path.win32.relative(left, right) === "";
166
+ }
167
+ return left === right;
168
+ }
169
+
170
+ function locationKey(location: NormalizedProviderLocation): string {
171
+ const fileKey =
172
+ pathFlavor(location.file) === "windows" ? location.file.toLowerCase() : location.file;
173
+ return `${fileKey}\0${location.line}\0${location.character}`;
174
+ }
175
+
176
+ function compareLocations(a: NormalizedProviderLocation, b: NormalizedProviderLocation): number {
177
+ if (a.file !== b.file) return a.file < b.file ? -1 : 1;
178
+ return a.line - b.line || a.character - b.character;
179
+ }