@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
@@ -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
+ }