@mrclrchtr/supi-code-intelligence 1.16.0 → 2.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 (348) hide show
  1. package/README.md +373 -63
  2. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +6 -1
  3. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +31 -0
  4. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/api.ts +8 -0
  5. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +10 -4
  6. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config.ts +1 -0
  7. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/footer-registry.ts +1 -1
  8. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/index.ts +6 -0
  9. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/model-selection.ts +134 -0
  10. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +9 -2
  11. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +109 -4
  12. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +5 -1
  13. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/spinner-frames.ts +11 -0
  14. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/status-spinner.ts +68 -0
  15. package/node_modules/@mrclrchtr/supi-code-runtime/package.json +3 -2
  16. package/node_modules/@mrclrchtr/supi-code-runtime/src/api.ts +7 -0
  17. package/node_modules/@mrclrchtr/supi-code-runtime/src/capability/types.ts +56 -2
  18. package/node_modules/@mrclrchtr/supi-code-runtime/src/evidence-badge.ts +40 -0
  19. package/node_modules/@mrclrchtr/supi-code-runtime/src/index.ts +5 -0
  20. package/node_modules/@mrclrchtr/supi-code-runtime/src/types.ts +76 -3
  21. package/node_modules/@mrclrchtr/supi-code-runtime/src/workspace/runtime.ts +37 -2
  22. package/node_modules/@mrclrchtr/supi-core/package.json +6 -1
  23. package/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +31 -0
  24. package/node_modules/@mrclrchtr/supi-core/src/api.ts +8 -0
  25. package/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +10 -4
  26. package/node_modules/@mrclrchtr/supi-core/src/config.ts +1 -0
  27. package/node_modules/@mrclrchtr/supi-core/src/footer-registry.ts +1 -1
  28. package/node_modules/@mrclrchtr/supi-core/src/index.ts +6 -0
  29. package/node_modules/@mrclrchtr/supi-core/src/model-selection.ts +134 -0
  30. package/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +9 -2
  31. package/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +109 -4
  32. package/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +5 -1
  33. package/node_modules/@mrclrchtr/supi-core/src/spinner-frames.ts +11 -0
  34. package/node_modules/@mrclrchtr/supi-core/src/status-spinner.ts +68 -0
  35. package/node_modules/@mrclrchtr/supi-lsp/README.md +44 -56
  36. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +6 -1
  37. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +31 -0
  38. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/api.ts +8 -0
  39. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +10 -4
  40. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config.ts +1 -0
  41. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/footer-registry.ts +1 -1
  42. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/index.ts +6 -0
  43. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/model-selection.ts +134 -0
  44. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +9 -2
  45. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +109 -4
  46. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +5 -1
  47. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/spinner-frames.ts +11 -0
  48. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/status-spinner.ts +68 -0
  49. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/package.json +3 -2
  50. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/api.ts +7 -0
  51. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/capability/types.ts +56 -2
  52. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/evidence-badge.ts +40 -0
  53. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/index.ts +5 -0
  54. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/types.ts +76 -3
  55. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/workspace/runtime.ts +37 -2
  56. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/package.json +6 -1
  57. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +31 -0
  58. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/api.ts +8 -0
  59. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +10 -4
  60. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/config.ts +1 -0
  61. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/footer-registry.ts +1 -1
  62. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/index.ts +6 -0
  63. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/model-selection.ts +134 -0
  64. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +9 -2
  65. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +109 -4
  66. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +5 -1
  67. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/spinner-frames.ts +11 -0
  68. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/status-spinner.ts +68 -0
  69. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.diagnostic.d.ts +21 -2
  70. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.diagnostic.js +1 -0
  71. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/lib/common/protocol.inlineValue.d.ts +2 -1
  72. package/node_modules/@mrclrchtr/supi-lsp/node_modules/vscode-languageserver-protocol/package.json +1 -1
  73. package/node_modules/@mrclrchtr/supi-lsp/package.json +4 -31
  74. package/node_modules/@mrclrchtr/supi-lsp/src/api.ts +27 -0
  75. package/node_modules/@mrclrchtr/supi-lsp/src/client/client-refresh.ts +5 -0
  76. package/node_modules/@mrclrchtr/supi-lsp/src/client/client.ts +246 -1
  77. package/node_modules/@mrclrchtr/supi-lsp/src/client/transport.ts +4 -0
  78. package/node_modules/@mrclrchtr/supi-lsp/src/config/capabilities.ts +3 -0
  79. package/node_modules/@mrclrchtr/supi-lsp/src/config/config.ts +4 -2
  80. package/node_modules/@mrclrchtr/supi-lsp/src/config/lsp-settings.ts +102 -0
  81. package/node_modules/@mrclrchtr/supi-lsp/src/config/server-actions.ts +59 -0
  82. package/node_modules/@mrclrchtr/supi-lsp/src/config/server-config.ts +4 -0
  83. package/node_modules/@mrclrchtr/supi-lsp/src/index.ts +11 -0
  84. package/node_modules/@mrclrchtr/supi-lsp/src/manager/capability-index.ts +1 -1
  85. package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-project-info.ts +2 -1
  86. package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager.ts +115 -26
  87. package/node_modules/@mrclrchtr/supi-lsp/src/provider/lsp-semantic-provider.ts +177 -134
  88. package/node_modules/@mrclrchtr/supi-lsp/src/provider/refactor-planning.ts +214 -0
  89. package/node_modules/@mrclrchtr/supi-lsp/src/session/runtime-controller.ts +320 -0
  90. package/node_modules/@mrclrchtr/supi-lsp/src/session/runtime-registration.ts +26 -5
  91. package/node_modules/@mrclrchtr/supi-lsp/src/session/service-registry.ts +81 -4
  92. package/node_modules/@mrclrchtr/supi-lsp/src/summary.ts +2 -0
  93. package/node_modules/@mrclrchtr/supi-tree-sitter/README.md +18 -37
  94. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +6 -1
  95. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +31 -0
  96. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/api.ts +8 -0
  97. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +10 -4
  98. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config.ts +1 -0
  99. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/footer-registry.ts +1 -1
  100. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/index.ts +6 -0
  101. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/model-selection.ts +134 -0
  102. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +9 -2
  103. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +109 -4
  104. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +5 -1
  105. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/spinner-frames.ts +11 -0
  106. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/status-spinner.ts +68 -0
  107. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/package.json +3 -2
  108. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/api.ts +7 -0
  109. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/capability/types.ts +56 -2
  110. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/evidence-badge.ts +40 -0
  111. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/index.ts +5 -0
  112. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/types.ts +76 -3
  113. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/workspace/runtime.ts +37 -2
  114. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/package.json +6 -1
  115. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +31 -0
  116. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/api.ts +8 -0
  117. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +10 -4
  118. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/config.ts +1 -0
  119. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/footer-registry.ts +1 -1
  120. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/index.ts +6 -0
  121. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/model-selection.ts +134 -0
  122. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +9 -2
  123. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +109 -4
  124. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +5 -1
  125. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/spinner-frames.ts +11 -0
  126. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/status-spinner.ts +68 -0
  127. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/LICENSE +21 -0
  128. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/README.md +265 -0
  129. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/debug/web-tree-sitter.cjs +4661 -0
  130. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/debug/web-tree-sitter.cjs.map +7 -0
  131. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/debug/web-tree-sitter.js +4605 -0
  132. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/debug/web-tree-sitter.js.map +7 -0
  133. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/debug/web-tree-sitter.wasm +0 -0
  134. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/debug/web-tree-sitter.wasm.map +57 -0
  135. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/package.json +100 -0
  136. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.cjs +4063 -0
  137. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.cjs.map +7 -0
  138. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.d.cts +1025 -0
  139. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.d.cts.map +58 -0
  140. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.d.ts +1025 -0
  141. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.d.ts.map +58 -0
  142. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.js +4007 -0
  143. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.js.map +7 -0
  144. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.wasm +0 -0
  145. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/web-tree-sitter/web-tree-sitter.wasm.map +55 -0
  146. package/node_modules/@mrclrchtr/supi-tree-sitter/package.json +6 -12
  147. package/node_modules/@mrclrchtr/supi-tree-sitter/src/api.ts +29 -0
  148. package/node_modules/@mrclrchtr/supi-tree-sitter/src/index.ts +28 -0
  149. package/node_modules/@mrclrchtr/supi-tree-sitter/src/language.ts +5 -0
  150. package/node_modules/@mrclrchtr/supi-tree-sitter/src/provider/tree-sitter-provider.ts +14 -2
  151. package/node_modules/@mrclrchtr/supi-tree-sitter/src/session/runtime-controller.ts +157 -0
  152. package/node_modules/@mrclrchtr/supi-tree-sitter/src/session/session.ts +8 -1
  153. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/call-sites.ts +86 -0
  154. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/callees.ts +35 -16
  155. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/structure.ts +1 -0
  156. package/node_modules/@mrclrchtr/supi-tree-sitter/src/types.ts +10 -0
  157. package/package.json +14 -9
  158. package/src/{model.ts → analysis/architecture/discovery.ts} +15 -72
  159. package/src/analysis/architecture/model.ts +76 -0
  160. package/src/analysis/brief/directory.ts +324 -0
  161. package/src/analysis/brief/enrich.ts +157 -0
  162. package/src/analysis/brief/file.ts +84 -0
  163. package/src/analysis/brief/inventory.ts +177 -0
  164. package/src/analysis/brief/main.ts +176 -0
  165. package/src/analysis/brief/models.ts +75 -0
  166. package/src/{brief.ts → analysis/brief/public-brief.ts} +21 -26
  167. package/src/analysis/brief/summarize.ts +208 -0
  168. package/src/analysis/brief/types.ts +27 -0
  169. package/src/{use-case/generate-brief.ts → analysis/brief/use-case.ts} +67 -144
  170. package/src/analysis/coverage/coverage-warnings.ts +224 -0
  171. package/src/analysis/evidence.ts +91 -0
  172. package/src/{semantic-action-helpers.ts → analysis/helpers.ts} +4 -4
  173. package/src/analysis/provider.ts +186 -0
  174. package/src/analysis/read-next.ts +126 -0
  175. package/src/analysis/readiness.ts +73 -0
  176. package/src/{refactor → analysis/refactor}/safety.ts +1 -1
  177. package/src/{use-case/support/semantic-references.ts → analysis/references/semantic-refs.ts} +58 -26
  178. package/src/analysis/search/pattern.ts +345 -0
  179. package/src/analysis/search/ripgrep.ts +473 -0
  180. package/src/{git-context.ts → analysis/signals/git.ts} +20 -7
  181. package/src/{prioritization-signals.ts → analysis/signals/project.ts} +33 -19
  182. package/src/analysis/target/anchored.ts +349 -0
  183. package/src/analysis/target/bridge.ts +152 -0
  184. package/src/analysis/target/file-resolution.ts +125 -0
  185. package/src/{targeting/resolve-file.ts → analysis/target/file.ts} +40 -20
  186. package/src/{planner → analysis/target}/planner.ts +30 -20
  187. package/src/{targeting → analysis/target}/query.ts +17 -3
  188. package/src/analysis/target/resolve-common.ts +115 -0
  189. package/src/analysis/target/service.ts +229 -0
  190. package/src/analysis/target/symbol.ts +196 -0
  191. package/src/{targeting → analysis/target}/types.ts +17 -1
  192. package/src/analysis/tests/likely-tests.ts +174 -0
  193. package/src/analysis/tests/test-discovery.ts +540 -0
  194. package/src/analysis/tests/vitest.ts +87 -0
  195. package/src/api.ts +34 -41
  196. package/src/app/app.ts +125 -0
  197. package/src/app/manager.ts +65 -0
  198. package/src/extension.ts +132 -1
  199. package/src/index.ts +1 -57
  200. package/src/session/refactor-plans.ts +82 -0
  201. package/src/session/session.ts +300 -0
  202. package/src/session/target-store.ts +293 -0
  203. package/src/substrate/lsp/diagnostic-injection.ts +218 -0
  204. package/src/substrate/lsp/lifecycle.ts +66 -0
  205. package/src/substrate/lsp/overrides.ts +132 -0
  206. package/src/substrate/lsp/recovery.ts +55 -0
  207. package/src/substrate/lsp/settings.ts +286 -0
  208. package/src/substrate/lsp/state.ts +46 -0
  209. package/src/substrate/lsp/utils.ts +17 -0
  210. package/src/substrate/tree-sitter/lifecycle.ts +52 -0
  211. package/src/tool/find/execute.ts +118 -0
  212. package/src/{presentation/markdown/pattern.ts → tool/find/markdown.ts} +102 -53
  213. package/src/{use-case/generate-pattern.ts → tool/find/orchestrate.ts} +67 -33
  214. package/src/tool/find/semantic-search.ts +114 -0
  215. package/src/tool/find/tui.ts +39 -0
  216. package/src/tool/graph/callees.ts +87 -0
  217. package/src/tool/graph/calls-md.ts +54 -0
  218. package/src/tool/graph/collect-relation.ts +371 -0
  219. package/src/tool/graph/execute.ts +95 -0
  220. package/src/tool/graph/implementations-md.ts +79 -0
  221. package/src/tool/graph/implementations.ts +76 -0
  222. package/src/tool/graph/markdown-base.ts +243 -0
  223. package/src/tool/graph/orchestrate.ts +285 -0
  224. package/src/tool/graph/references-md.ts +34 -0
  225. package/src/tool/graph/references.ts +81 -0
  226. package/src/tool/graph/tui.ts +120 -0
  227. package/src/tool/graph/types.ts +97 -0
  228. package/src/tool/guidance.ts +96 -49
  229. package/src/tool/health/execute.ts +76 -0
  230. package/src/tool/health/markdown.ts +280 -0
  231. package/src/tool/health/orchestrate.ts +159 -0
  232. package/src/tool/health/sections/diagnostics.ts +182 -0
  233. package/src/tool/health/sections/recovery.ts +89 -0
  234. package/src/tool/health/sections/signals.ts +89 -0
  235. package/src/tool/health/tui.ts +137 -0
  236. package/src/tool/impact/analysis.ts +247 -0
  237. package/src/tool/impact/change-set-impact.ts +151 -0
  238. package/src/tool/impact/execute.ts +98 -0
  239. package/src/tool/impact/file-level-impact.ts +81 -0
  240. package/src/tool/impact/markdown.ts +283 -0
  241. package/src/tool/impact/orchestrate.ts +97 -0
  242. package/src/tool/impact/result.ts +21 -0
  243. package/src/tool/impact/single-impact.ts +89 -0
  244. package/src/tool/impact/tui.ts +39 -0
  245. package/src/tool/impact/types.ts +34 -0
  246. package/src/tool/infra/cross-field.ts +335 -0
  247. package/src/tool/infra/error-results.ts +199 -0
  248. package/src/tool/infra/pipeline.ts +311 -0
  249. package/src/tool/infra/progress.ts +21 -0
  250. package/src/tool/infra/readiness-message.ts +5 -0
  251. package/src/tool/infra/truncate.ts +49 -0
  252. package/src/tool/inspect/execute.ts +76 -0
  253. package/src/tool/inspect/markdown.ts +169 -0
  254. package/src/tool/inspect/orchestrate.ts +156 -0
  255. package/src/tool/inspect/tui.ts +36 -0
  256. package/src/tool/orientation/deps.ts +63 -0
  257. package/src/tool/orientation/execute.ts +50 -0
  258. package/src/tool/orientation/markdown.ts +35 -0
  259. package/src/tool/orientation/mode.ts +88 -0
  260. package/src/tool/orientation/orchestrate.ts +478 -0
  261. package/src/tool/orientation/precise-target.ts +257 -0
  262. package/src/tool/orientation/tui.ts +131 -0
  263. package/src/{refactor/apply-workspace-edit.ts → tool/refactor-apply/apply.ts} +39 -16
  264. package/src/tool/refactor-apply/execute.ts +20 -0
  265. package/src/tool/refactor-apply/markdown.ts +118 -0
  266. package/src/tool/refactor-apply/orchestrate.ts +89 -0
  267. package/src/tool/refactor-apply/tui.ts +51 -0
  268. package/src/tool/refactor-plan/execute.ts +73 -0
  269. package/src/tool/refactor-plan/markdown.ts +118 -0
  270. package/src/tool/refactor-plan/orchestrate.ts +363 -0
  271. package/src/tool/refactor-plan/tui.ts +42 -0
  272. package/src/tool/register.ts +123 -0
  273. package/src/tool/resolve/execute.ts +82 -0
  274. package/src/tool/resolve/markdown.ts +150 -0
  275. package/src/tool/resolve/orchestrate.ts +134 -0
  276. package/src/tool/resolve/tui.ts +40 -0
  277. package/src/tool/schemas.ts +337 -0
  278. package/src/tool/specs.ts +257 -0
  279. package/src/types/details.ts +188 -0
  280. package/src/types/execution.ts +60 -0
  281. package/src/types/index.ts +28 -0
  282. package/src/{intent/types.ts → types/tool-names.ts} +15 -14
  283. package/src/ui/footer.ts +52 -0
  284. package/src/ui/markdown/brief.ts +218 -0
  285. package/src/ui/markdown/gather.ts +177 -0
  286. package/src/{use-case/build-overview.ts → ui/markdown/overview-data.ts} +2 -2
  287. package/src/{presentation → ui}/markdown/overview.ts +2 -2
  288. package/src/ui/markdown/types.ts +80 -0
  289. package/{node_modules/@mrclrchtr/supi-lsp/src/ui/renderer.ts → src/ui/message-renderer.ts} +11 -10
  290. package/src/ui/status-command.ts +260 -0
  291. package/src/ui/status-overlay.ts +500 -0
  292. package/src/ui/tui/common.ts +220 -0
  293. package/src/ui/tui/index.ts +37 -0
  294. package/node_modules/@mrclrchtr/supi-lsp/src/extension.ts +0 -1
  295. package/node_modules/@mrclrchtr/supi-lsp/src/format.ts +0 -373
  296. package/node_modules/@mrclrchtr/supi-lsp/src/handlers/diagnostic-injection.ts +0 -182
  297. package/node_modules/@mrclrchtr/supi-lsp/src/handlers/session-lifecycle.ts +0 -149
  298. package/node_modules/@mrclrchtr/supi-lsp/src/handlers/status-command.ts +0 -38
  299. package/node_modules/@mrclrchtr/supi-lsp/src/handlers/workspace-recovery.ts +0 -92
  300. package/node_modules/@mrclrchtr/supi-lsp/src/lsp.ts +0 -37
  301. package/node_modules/@mrclrchtr/supi-lsp/src/session/lsp-state.ts +0 -93
  302. package/node_modules/@mrclrchtr/supi-lsp/src/session/settings-registration.ts +0 -296
  303. package/node_modules/@mrclrchtr/supi-lsp/src/session/tree-persist.ts +0 -75
  304. package/node_modules/@mrclrchtr/supi-lsp/src/tool/guidance.ts +0 -69
  305. package/node_modules/@mrclrchtr/supi-lsp/src/tool/names.ts +0 -27
  306. package/node_modules/@mrclrchtr/supi-lsp/src/tool/overrides.ts +0 -204
  307. package/node_modules/@mrclrchtr/supi-lsp/src/tool/register-tools.ts +0 -69
  308. package/node_modules/@mrclrchtr/supi-lsp/src/tool/service-actions.ts +0 -399
  309. package/node_modules/@mrclrchtr/supi-lsp/src/tool/tool-specs.ts +0 -248
  310. package/node_modules/@mrclrchtr/supi-lsp/src/ui/ui.ts +0 -360
  311. package/node_modules/@mrclrchtr/supi-lsp/src/workspace-change.ts +0 -40
  312. package/node_modules/@mrclrchtr/supi-tree-sitter/src/extension.ts +0 -1
  313. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/formatting.ts +0 -104
  314. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/guidance.ts +0 -35
  315. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/handlers.ts +0 -196
  316. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/register-tools.ts +0 -107
  317. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/tool-specs.ts +0 -117
  318. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tree-sitter.ts +0 -47
  319. package/src/brief-focused.ts +0 -563
  320. package/src/code-intelligence.ts +0 -70
  321. package/src/pattern-structured.ts +0 -194
  322. package/src/presentation/markdown/affected.ts +0 -170
  323. package/src/presentation/markdown/brief.ts +0 -174
  324. package/src/presentation/markdown/map.ts +0 -54
  325. package/src/presentation/markdown/refactor.ts +0 -27
  326. package/src/presentation/markdown/relations.ts +0 -121
  327. package/src/resolve-target.ts +0 -130
  328. package/src/search-helpers.ts +0 -303
  329. package/src/substrates/types.ts +0 -30
  330. package/src/target-resolution.ts +0 -122
  331. package/src/targeting/resolve-anchored.ts +0 -80
  332. package/src/targeting/resolve-symbol.ts +0 -110
  333. package/src/tool/execute-affected.ts +0 -71
  334. package/src/tool/execute-brief.ts +0 -59
  335. package/src/tool/execute-map.ts +0 -35
  336. package/src/tool/execute-pattern.ts +0 -29
  337. package/src/tool/execute-refactor.ts +0 -101
  338. package/src/tool/execute-relations.ts +0 -79
  339. package/src/tool/register-tools.ts +0 -32
  340. package/src/tool/tool-specs.ts +0 -190
  341. package/src/tool/validation.ts +0 -43
  342. package/src/types.ts +0 -169
  343. package/src/use-case/generate-affected.ts +0 -297
  344. package/src/use-case/generate-map.ts +0 -176
  345. package/src/use-case/generate-relations.ts +0 -438
  346. package/src/use-case/types.ts +0 -43
  347. package/src/workspace/request-context.ts +0 -139
  348. /package/src/{query-params.ts → tool/params.ts} +0 -0
@@ -10,10 +10,14 @@ import {
10
10
  Input,
11
11
  Key,
12
12
  matchesKey,
13
+ type SelectItem,
14
+ SelectList,
15
+ type SelectListTheme,
13
16
  type SettingItem,
14
17
  SettingsList,
15
18
  Text,
16
19
  } from "@earendil-works/pi-tui";
20
+ import { getSelectableModels } from "../model-selection.ts";
17
21
  import {
18
22
  getRegisteredSettings,
19
23
  type SettingsScope,
@@ -84,10 +88,11 @@ function buildFlatItems(
84
88
  sections: SettingsSection[],
85
89
  scope: SettingsScope,
86
90
  cwd: string,
91
+ ctx?: ExtensionContext,
87
92
  ): SettingItem[] {
88
93
  const items: SettingItem[] = [];
89
94
  for (const section of sections) {
90
- const sectionItems = section.loadValues(scope, cwd);
95
+ const sectionItems = section.loadValues(scope, cwd, ctx);
91
96
  for (const item of sectionItems) {
92
97
  items.push({
93
98
  ...item,
@@ -115,6 +120,7 @@ function findSectionAndId(
115
120
  // ── Component ────────────────────────────────────────────────
116
121
 
117
122
  interface SettingsOverlayDeps {
123
+ ctx: ExtensionContext;
118
124
  state: OverlayState;
119
125
  container: Container;
120
126
  settingsList: SettingsList | null;
@@ -125,15 +131,21 @@ interface SettingsOverlayDeps {
125
131
 
126
132
  function createSettingsList(deps: SettingsOverlayDeps): SettingsList {
127
133
  const sections = getRegisteredSettings();
128
- const items = buildFlatItems(sections, deps.state.scope, deps.state.cwd);
134
+ const items = buildFlatItems(sections, deps.state.scope, deps.state.cwd, deps.ctx);
129
135
  const onChange = (flatId: string, newValue: string) => {
130
136
  const found = findSectionAndId(sections, flatId);
131
137
  if (found) {
132
- found.section.persistChange(deps.state.scope, deps.state.cwd, found.itemId, newValue);
138
+ found.section.persistChange(
139
+ deps.state.scope,
140
+ deps.state.cwd,
141
+ found.itemId,
142
+ newValue,
143
+ deps.ctx,
144
+ );
133
145
  }
134
146
  // Re-read all values to reflect persisted changes, but keep the list
135
147
  // instance (and its selectedIndex) intact.
136
- const updatedItems = buildFlatItems(sections, deps.state.scope, deps.state.cwd);
148
+ const updatedItems = buildFlatItems(sections, deps.state.scope, deps.state.cwd, deps.ctx);
137
149
  for (const updated of updatedItems) {
138
150
  const existing = items.find((i) => i.id === updated.id);
139
151
  if (existing && existing.currentValue !== updated.currentValue) {
@@ -182,6 +194,98 @@ function handleScopeToggle(deps: SettingsOverlayDeps): void {
182
194
  deps.tui.requestRender();
183
195
  }
184
196
 
197
+ /** Minimal SelectList theme — uses identity so the parent SettingsList provides styling context. */
198
+ const PASSTHROUGH_THEME: SelectListTheme = {
199
+ selectedPrefix: (text) => `› ${text}`,
200
+ selectedText: (text) => text,
201
+ description: (text) => text,
202
+ scrollInfo: (text) => text,
203
+ noMatch: (text) => text,
204
+ };
205
+
206
+ /**
207
+ * Create a model picker submenu for settings.
208
+ *
209
+ * Shows a scrollable list of selectable models from the scoped model set,
210
+ * with the current session model annotated `[current]`. The first entry is
211
+ * always `"disabled"`.
212
+ *
213
+ * @param currentValue - Currently configured canonical model id or `"disabled"`.
214
+ * @param done - Callback invoked with the selected value, or undefined on cancel.
215
+ * @param ctx - Extension context for model listing. When undefined, only
216
+ * `"disabled"` is offered.
217
+ */
218
+ export function createModelPickerSubmenu(
219
+ currentValue: string,
220
+ done: (selectedValue?: string) => void,
221
+ ctx?: ExtensionContext,
222
+ ): {
223
+ render: (width: number) => string[];
224
+ invalidate: () => void;
225
+ handleInput: (data: string) => boolean;
226
+ } {
227
+ const items = buildModelItems(ctx);
228
+
229
+ const initialIndex =
230
+ currentValue === "disabled"
231
+ ? 0
232
+ : Math.max(
233
+ 0,
234
+ items.findIndex((item) => item.value === currentValue),
235
+ );
236
+
237
+ const container = new Container();
238
+ container.addChild(new Text(" Select suggestion model", 1, 0));
239
+ container.addChild(new Text("", 1, 0));
240
+
241
+ const selectList = new SelectList(items, Math.min(items.length, 15), PASSTHROUGH_THEME);
242
+
243
+ if (initialIndex >= 0) {
244
+ selectList.setSelectedIndex(initialIndex);
245
+ }
246
+
247
+ selectList.onSelect = (item) => done(item.value);
248
+ selectList.onCancel = () => done();
249
+
250
+ container.addChild(selectList);
251
+ container.addChild(new Text(" ↑↓ navigate • enter select • esc cancel", 1, 0));
252
+
253
+ return {
254
+ render: (width: number) => container.render(width),
255
+ invalidate: () => container.invalidate(),
256
+ handleInput: (data: string) => {
257
+ selectList.handleInput(data);
258
+ return true;
259
+ },
260
+ };
261
+ }
262
+
263
+ /** Build selectable model items with "disabled" first. */
264
+ function buildModelItems(ctx?: ExtensionContext): SelectItem[] {
265
+ const items: SelectItem[] = [
266
+ {
267
+ value: "disabled",
268
+ label: "disabled",
269
+ description: "No prompt suggestions",
270
+ },
271
+ ];
272
+
273
+ if (!ctx) return items;
274
+
275
+ const models = getSelectableModels(ctx);
276
+
277
+ for (const model of models) {
278
+ const suffix = model.isCurrent ? " [current]" : "";
279
+ items.push({
280
+ value: model.canonicalId,
281
+ label: `${model.canonicalId}${suffix}`,
282
+ description: model.label !== model.canonicalId ? model.label : undefined,
283
+ });
284
+ }
285
+
286
+ return items;
287
+ }
288
+
185
289
  // ── Entry point ──────────────────────────────────────────────
186
290
 
187
291
  export function openSettingsOverlay(ctx: ExtensionContext): void {
@@ -196,6 +300,7 @@ export function openSettingsOverlay(ctx: ExtensionContext): void {
196
300
  const container = new Container();
197
301
 
198
302
  const deps: SettingsOverlayDeps = {
303
+ ctx,
199
304
  state,
200
305
  container,
201
306
  settingsList: null,
@@ -1,2 +1,6 @@
1
1
  // supi-core settings-ui domain — settings TUI components (imports pi-tui at runtime, heavy).
2
- export { createInputSubmenu, openSettingsOverlay } from "./settings/settings-ui.ts";
2
+ export {
3
+ createInputSubmenu,
4
+ createModelPickerSubmenu,
5
+ openSettingsOverlay,
6
+ } from "./settings/settings-ui.ts";
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Shared UI constants for SuPi extensions.
3
+ *
4
+ * @module
5
+ */
6
+
7
+ /** Braille spinner frames used across SuPi extensions for animated loaders. */
8
+ export const BRAILLE_SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
9
+
10
+ /** Tick interval (ms) shared by all braille-spinner consumers. */
11
+ export const SPINNER_INTERVAL_MS = 80;
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Lightweight status-bar spinner for SuPi extensions.
3
+ *
4
+ * Manages a setInterval-based animated spinner that writes to
5
+ * `ctx.ui.setStatus`. Each tick advances the frame and re-renders
6
+ * with the current message.
7
+ *
8
+ * @module
9
+ */
10
+
11
+ import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
12
+ import { BRAILLE_SPINNER_FRAMES, SPINNER_INTERVAL_MS } from "./spinner-frames.ts";
13
+
14
+ /**
15
+ * Manages an animated braille spinner on the status bar.
16
+ *
17
+ * Usage:
18
+ * ```ts
19
+ * const spinner = new StatusSpinner(ctx, "my-package");
20
+ * spinner.start("generating…");
21
+ * // later
22
+ * spinner.stop();
23
+ * ```
24
+ */
25
+ export class StatusSpinner {
26
+ private interval: ReturnType<typeof setInterval> | null = null;
27
+ private frame = 0;
28
+ private currentMessage = "";
29
+
30
+ constructor(
31
+ private ctx: ExtensionContext,
32
+ private source: string,
33
+ private frames: readonly string[] = BRAILLE_SPINNER_FRAMES,
34
+ ) {}
35
+
36
+ /** Start the spinner with the given message. Overwrites any active spinner. */
37
+ start(message: string): void {
38
+ this.stop();
39
+ this.currentMessage = message;
40
+ this.render();
41
+
42
+ this.interval = setInterval(() => {
43
+ this.frame++;
44
+ this.render();
45
+ }, SPINNER_INTERVAL_MS);
46
+ }
47
+
48
+ /** Update the display message without resetting the spinner. */
49
+ update(message: string): void {
50
+ this.currentMessage = message;
51
+ }
52
+
53
+ /** Stop the spinner and clear the status. */
54
+ stop(): void {
55
+ if (this.interval !== null) {
56
+ clearInterval(this.interval);
57
+ this.interval = null;
58
+ }
59
+ this.ctx.ui.setStatus(this.source, "");
60
+ }
61
+
62
+ // ── Private ──────────────────────────────────────────────────────────
63
+
64
+ private render(): void {
65
+ const icon = this.frames[this.frame % this.frames.length];
66
+ this.ctx.ui.setStatus(this.source, `${icon} ${this.currentMessage}`);
67
+ }
68
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mrclrchtr/supi-code-runtime",
3
- "version": "1.16.0",
3
+ "version": "2.0.0",
4
4
  "description": "SuPi code-runtime — shared workspace context, capability contracts, and canonical types for the code-understanding stack",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -23,12 +23,13 @@
23
23
  "workspace-context",
24
24
  "provider-api"
25
25
  ],
26
+ "type": "module",
26
27
  "files": [
27
28
  "src/**/*.ts",
28
29
  "!__tests__"
29
30
  ],
30
31
  "dependencies": {
31
- "@mrclrchtr/supi-core": "1.16.0"
32
+ "@mrclrchtr/supi-core": "2.0.0"
32
33
  },
33
34
  "bundledDependencies": [
34
35
  "@mrclrchtr/supi-core"
@@ -13,9 +13,13 @@ export type {
13
13
  StructuralProvider,
14
14
  StructuralResult,
15
15
  } from "./capability/types.ts";
16
+ // Evidence display
17
+ export { type EvidenceBadgeInput, formatEvidenceBadge } from "./evidence-badge.ts";
16
18
  // Shared canonical types
17
19
  export type {
20
+ CalleeDepth,
18
21
  CalleesData,
22
+ CallSite,
19
23
  CodeLocation,
20
24
  CodePosition,
21
25
  CodeResult,
@@ -27,10 +31,13 @@ export type {
27
31
  ImportData,
28
32
  NodeAtData,
29
33
  OutlineData,
34
+ RefactorOperation,
35
+ RefactorRequest,
30
36
  RefactorResult,
31
37
  SourceRange,
32
38
  WorkspaceEdit,
33
39
  } from "./types.ts";
40
+ export { normalizeRefactorOperation } from "./types.ts";
34
41
  export type { WorkspaceContext } from "./workspace/context.ts";
35
42
  // Workspace context
36
43
  export { createWorkspaceContext } from "./workspace/context.ts";
@@ -5,7 +5,9 @@
5
5
  */
6
6
 
7
7
  import type {
8
+ CalleeDepth,
8
9
  CalleesData,
10
+ CallSite,
9
11
  CodeLocation,
10
12
  CodePosition,
11
13
  CodeResult,
@@ -14,7 +16,9 @@ import type {
14
16
  ImportData,
15
17
  NodeAtData,
16
18
  OutlineData,
19
+ RefactorRequest,
17
20
  RefactorResult,
21
+ SourceRange,
18
22
  } from "../types.ts";
19
23
 
20
24
  // ── Availability state ─────────────────────────────────────────────────
@@ -49,17 +53,60 @@ export interface SemanticProvider {
49
53
  documentSymbols(filePath: string): Promise<CodeSymbol[] | null>;
50
54
  workspaceSymbols(query: string): Promise<CodeSymbol[] | null>;
51
55
 
56
+ /**
57
+ * Optional definition capability. Returns the definition location(s) for
58
+ * the symbol at the given position. When the provider cannot produce
59
+ * definition info, returns `null`.
60
+ */
61
+ definition?(filePath: string, position: CodePosition): Promise<CodeLocation[] | null>;
62
+
63
+ /**
64
+ * Optional hover capability. Returns a simplified type/signature info
65
+ * shape that does not depend on vscode-languageserver-types. When the
66
+ * provider cannot produce hover info (unavailable, unsupported file,
67
+ * no result at the given position), returns `null`.
68
+ */
69
+ hover?(
70
+ filePath: string,
71
+ position: CodePosition,
72
+ ): Promise<{ contents: string; range?: SourceRange } | null>;
73
+
74
+ /**
75
+ * Optional operation-aware refactor capability.
76
+ *
77
+ * This is the preferred planning entrypoint for higher-level tools because it
78
+ * lets the provider choose the honest substrate path per operation (rename,
79
+ * organize imports, dead-code cleanup, etc.) without exposing that branching
80
+ * to callers.
81
+ */
82
+ refactor?(request: RefactorRequest): Promise<RefactorResult>;
83
+
52
84
  /**
53
85
  * Optional rename capability. When present, the provider supports
54
- * precise semantic rename operations.
86
+ * precise semantic symbol-rename operations.
87
+ *
88
+ * Kept as a low-level substrate helper for compatibility while the public
89
+ * tool surface still exposes a legacy `rename` alias.
55
90
  */
56
91
  rename?(file: string, position: CodePosition, newName: string): Promise<RefactorResult>;
57
92
 
58
93
  /**
59
94
  * Optional code actions capability. When present, the provider
60
95
  * supports code-action-based refactors.
96
+ *
97
+ * Kept as a low-level substrate helper and for lightweight introspection.
61
98
  */
62
99
  codeActions?(file: string, position: CodePosition): Promise<RefactorResult[]>;
100
+
101
+ /**
102
+ * Optional lightweight code action titles for display purposes.
103
+ * Returns simplified title/kind pairs at the given position.
104
+ * When the provider cannot produce code actions, returns `null`.
105
+ */
106
+ codeActionTitles?(
107
+ file: string,
108
+ position: CodePosition,
109
+ ): Promise<Array<{ title: string; kind?: string }> | null>;
63
110
  }
64
111
 
65
112
  /**
@@ -70,11 +117,18 @@ export interface SemanticProvider {
70
117
  * and runtime error states.
71
118
  */
72
119
  export interface StructuralProvider {
73
- calleesAt(file: string, line: number, character: number): Promise<CodeResult<CalleesData>>;
120
+ calleesAt(
121
+ file: string,
122
+ line: number,
123
+ character: number,
124
+ depth?: CalleeDepth,
125
+ ): Promise<CodeResult<CalleesData>>;
74
126
  exports(file: string): Promise<CodeResult<ExportData[]>>;
75
127
  outline(file: string): Promise<CodeResult<OutlineData[]>>;
76
128
  imports(file: string): Promise<CodeResult<ImportData[]>>;
77
129
  nodeAt(file: string, line: number, character: number): Promise<CodeResult<NodeAtData>>;
130
+ /** Find all call-site identifiers in a file. Returns name + start line for each match. */
131
+ callSites(file: string): Promise<CodeResult<CallSite[]>>;
78
132
  }
79
133
 
80
134
  /** Convenience alias for `CodeResult` used in structural contexts. */
@@ -0,0 +1,40 @@
1
+ /**
2
+ * TUI-facing evidence badge string formatter.
3
+ *
4
+ * Pure string formatting — no pi-tui dependency. Consumes evidence
5
+ * completeness metadata and produces compact human-readable badges.
6
+ */
7
+
8
+ /** Metadata describing how many evidence atoms were shown vs exist. */
9
+ export interface EvidenceBadgeInput {
10
+ shownCount: number;
11
+ totalCount: number | null;
12
+ omittedCount: number | null;
13
+ partialReason: string | null;
14
+ /** Human-readable label for the badge, e.g. "references", "symbols". */
15
+ label: string;
16
+ }
17
+
18
+ /**
19
+ * Format a compact evidence completeness badge.
20
+ *
21
+ * | Input | Output |
22
+ * |------------------------------------------------------|---------------------------------------|
23
+ * | shown=12, total=12, omitted=0, label="references" | `12 references` |
24
+ * | shown=8, total=20, omitted=12, label="symbols" | `8 of 20 symbols (12 omitted)` |
25
+ * | shown=5, total=null, reason="timeout", label="matches" | `5 matches — timeout` |
26
+ */
27
+ export function formatEvidenceBadge(input: EvidenceBadgeInput): string {
28
+ const { shownCount, totalCount, omittedCount, partialReason, label } = input;
29
+
30
+ if (totalCount === null) {
31
+ const reasonSuffix = partialReason ? ` — ${partialReason}` : "";
32
+ return `${shownCount} ${label}${reasonSuffix}`;
33
+ }
34
+
35
+ if (omittedCount !== null && omittedCount > 0) {
36
+ return `${shownCount} of ${totalCount} ${label} (${omittedCount} omitted)`;
37
+ }
38
+
39
+ return `${shownCount} ${label}`;
40
+ }
@@ -6,7 +6,9 @@
6
6
  */
7
7
 
8
8
  export type {
9
+ CalleeDepth,
9
10
  CalleesData,
11
+ CallSite,
10
12
  CapabilityState,
11
13
  CodeLocation,
12
14
  CodePosition,
@@ -17,6 +19,8 @@ export type {
17
19
  ImportData,
18
20
  NodeAtData,
19
21
  OutlineData,
22
+ RefactorOperation,
23
+ RefactorRequest,
20
24
  SemanticProvider,
21
25
  SourceRange,
22
26
  StructuralProvider,
@@ -27,5 +31,6 @@ export type {
27
31
  export {
28
32
  createWorkspaceContext,
29
33
  getDefaultWorkspaceRuntime,
34
+ normalizeRefactorOperation,
30
35
  WorkspaceRuntime,
31
36
  } from "./api.ts";
@@ -28,13 +28,29 @@ export interface CodeLocation {
28
28
 
29
29
  // ── Symbol types ───────────────────────────────────────────────────────
30
30
 
31
- /** A discovered symbol / declaration. */
31
+ /** A 1-based source position used as a symbol anchor. */
32
+ export interface SymbolAnchor {
33
+ line: number;
34
+ character: number;
35
+ }
36
+
37
+ /**
38
+ * A discovered symbol / declaration.
39
+ *
40
+ * Per ADR 0003, anchors are split so position-strict substrates
41
+ * (structural callee lookup, LSP `rename`) cannot silently consume a
42
+ * declaration anchor (the `export` keyword) as if it were the identifier.
43
+ * - `declarationAnchor` is always present (the defining node start).
44
+ * - `nameAnchor` is best-effort (the identifier token), present when the
45
+ * provider can derive it (LSP `selectionRange`, or a tree-sitter snap).
46
+ * Strict consumers must prefer it and hard-fail when it is absent.
47
+ */
32
48
  export interface CodeSymbol {
33
49
  name: string;
34
50
  kind: string;
35
51
  file: string;
36
- line: number;
37
- character: number;
52
+ declarationAnchor: SymbolAnchor;
53
+ nameAnchor?: SymbolAnchor;
38
54
  container?: string | null;
39
55
  }
40
56
 
@@ -125,6 +141,44 @@ export interface WorkspaceEdit {
125
141
  edits: FileEdit[];
126
142
  }
127
143
 
144
+ /**
145
+ * Supported refactor operation names for the current semantic planning path.
146
+ *
147
+ * `rename` is kept as a legacy alias for the public rename-only surface.
148
+ */
149
+ export type RefactorOperation =
150
+ | "rename"
151
+ | "rename_symbol"
152
+ | "extract_function"
153
+ | "extract_variable"
154
+ | "rename_file"
155
+ | "move_file"
156
+ | "update_imports"
157
+ | "delete_dead_code";
158
+
159
+ /** Normalize legacy refactor aliases to their canonical operation names. */
160
+ export function normalizeRefactorOperation(
161
+ operation: RefactorOperation,
162
+ ): Exclude<RefactorOperation, "rename"> {
163
+ return operation === "rename" ? "rename_symbol" : operation;
164
+ }
165
+
166
+ /**
167
+ * Operation-aware refactor planning request.
168
+ *
169
+ * Consumers provide a target file/position plus operation-specific options.
170
+ * File/resource operations remain requestable so providers can reject them
171
+ * explicitly and honestly until shared workspace-edit resource ops exist.
172
+ */
173
+ export interface RefactorRequest {
174
+ operation: RefactorOperation;
175
+ file: string;
176
+ position: CodePosition;
177
+ range?: SourceRange;
178
+ newName?: string;
179
+ destination?: string;
180
+ }
181
+
128
182
  /**
129
183
  * A disambiguation candidate when a refactor target is ambiguous.
130
184
  */
@@ -149,7 +203,26 @@ export type RefactorResult =
149
203
 
150
204
  // ── Structural data shapes (value types, range-flattened) ──────────────
151
205
 
206
+ /** Callee collection depth. */
207
+ export type CalleeDepth = "direct" | "deep";
208
+
209
+ /**
210
+ * Structural outgoing calls from the enclosing executable scope at a
211
+ * position. Callee names are source-shape facts, not resolved symbol
212
+ * identities.
213
+ *
214
+ * In `direct` depth, nested function/callback scopes are excluded from the
215
+ * outer scope. In `deep` depth, all callees within the enclosing scope are
216
+ * included, including those inside nested scopes.
217
+ */
152
218
  export interface CalleesData {
153
219
  enclosingScope: { name: string; startLine: number; endLine: number };
154
220
  callees: Array<{ name: string; startLine: number }>;
221
+ depth: CalleeDepth;
222
+ }
223
+
224
+ /** A single call-site match with name and start line. */
225
+ export interface CallSite {
226
+ name: string;
227
+ startLine: number;
155
228
  }
@@ -48,7 +48,12 @@ function createDefaultCapabilities(): WorkspaceCapabilities {
48
48
  }
49
49
 
50
50
  function hasRefactorCapability(provider: SemanticProvider | null): boolean {
51
- return !!(provider && (provider.rename !== undefined || provider.codeActions !== undefined));
51
+ return !!(
52
+ provider &&
53
+ (provider.refactor !== undefined ||
54
+ provider.rename !== undefined ||
55
+ provider.codeActions !== undefined)
56
+ );
52
57
  }
53
58
 
54
59
  // ── Runtime ────────────────────────────────────────────────────────────
@@ -78,7 +83,27 @@ export class WorkspaceRuntime {
78
83
  }
79
84
 
80
85
  /**
81
- * Register a semantic provider for a workspace.
86
+ * Register a semantic provider for a workspace in pending state.
87
+ *
88
+ * Use this when the provider object exists and can accept calls, but the
89
+ * underlying semantic substrate is still warming (for example, an LSP server
90
+ * that has started but has not finished initial indexing yet).
91
+ */
92
+ registerSemanticPending(cwd: string, provider: SemanticProvider): void {
93
+ const refactorAvailable = hasRefactorCapability(provider);
94
+ const existing = this.#workspaces.get(cwd);
95
+ if (existing) {
96
+ existing.semantic = { state: { kind: "pending" }, provider, refactorAvailable };
97
+ } else {
98
+ this.#workspaces.set(cwd, {
99
+ semantic: { state: { kind: "pending" }, provider, refactorAvailable },
100
+ structural: createDefaultCapabilities().structural,
101
+ });
102
+ }
103
+ }
104
+
105
+ /**
106
+ * Register a semantic provider for a workspace as ready.
82
107
  * Replaces any existing semantic provider for the same cwd
83
108
  * without affecting the structural provider.
84
109
  */
@@ -95,6 +120,16 @@ export class WorkspaceRuntime {
95
120
  }
96
121
  }
97
122
 
123
+ /**
124
+ * Promote an already-registered semantic provider from pending to ready.
125
+ * If no semantic provider is registered for the workspace, this is a no-op.
126
+ */
127
+ markSemanticReady(cwd: string): void {
128
+ const ws = this.#workspaces.get(cwd);
129
+ if (!ws || ws.semantic.provider === null) return;
130
+ ws.semantic.state = { kind: "ready" };
131
+ }
132
+
98
133
  /**
99
134
  * Register a structural provider for a workspace.
100
135
  * Replaces any existing structural provider for the same cwd
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mrclrchtr/supi-core",
3
- "version": "1.16.0",
3
+ "version": "2.0.0",
4
4
  "description": "SuPi core — shared infrastructure for SuPi extensions (XML context tags, config system)",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -23,6 +23,7 @@
23
23
  "settings",
24
24
  "configuration"
25
25
  ],
26
+ "type": "module",
26
27
  "files": [
27
28
  "src/**/*.ts",
28
29
  "!__tests__"
@@ -49,12 +50,14 @@
49
50
  },
50
51
  "main": "src/api.ts",
51
52
  "exports": {
53
+ "./abort-utils": "./src/abort-utils.ts",
52
54
  "./api": "./src/api.ts",
53
55
  "./config": "./src/config.ts",
54
56
  "./context": "./src/context.ts",
55
57
  "./debug": "./src/debug-registry.ts",
56
58
  "./footer-registry": "./src/footer-registry.ts",
57
59
  "./llm": "./src/llm.ts",
60
+ "./model-selection": "./src/model-selection.ts",
58
61
  "./package.json": "./package.json",
59
62
  "./path": "./src/path.ts",
60
63
  "./report": "./src/report.ts",
@@ -63,6 +66,8 @@
63
66
  "./session": "./src/session.ts",
64
67
  "./settings": "./src/settings.ts",
65
68
  "./settings-ui": "./src/settings-ui.ts",
69
+ "./spinner-frames": "./src/spinner-frames.ts",
70
+ "./status-spinner": "./src/status-spinner.ts",
66
71
  "./terminal": "./src/terminal.ts",
67
72
  "./tool-framework": "./src/tool-framework.ts",
68
73
  "./types": "./src/types.ts"