@mrclrchtr/supi-code-intelligence 2.0.6 → 2.2.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 (169) hide show
  1. package/README.md +88 -4
  2. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/README.md +32 -23
  3. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +2 -1
  4. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/config.ts +22 -8
  5. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/prompt-surface.ts +357 -0
  6. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config.ts +2 -3
  7. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/debug-registry.ts +0 -5
  8. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/prompt-surface.ts +4 -0
  9. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/scoped-settings-list.ts +372 -0
  10. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-action-menu.ts +101 -0
  11. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-command.ts +1 -1
  12. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +55 -27
  13. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-schema.ts +464 -0
  14. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-submenus.ts +124 -0
  15. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +72 -285
  16. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +2 -5
  17. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings.ts +27 -5
  18. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/tool-framework.ts +10 -0
  19. package/node_modules/@mrclrchtr/supi-code-runtime/package.json +2 -2
  20. package/node_modules/@mrclrchtr/supi-core/README.md +32 -23
  21. package/node_modules/@mrclrchtr/supi-core/package.json +2 -1
  22. package/node_modules/@mrclrchtr/supi-core/src/config/config.ts +22 -8
  23. package/node_modules/@mrclrchtr/supi-core/src/config/prompt-surface.ts +357 -0
  24. package/node_modules/@mrclrchtr/supi-core/src/config.ts +2 -3
  25. package/node_modules/@mrclrchtr/supi-core/src/debug-registry.ts +0 -5
  26. package/node_modules/@mrclrchtr/supi-core/src/prompt-surface.ts +4 -0
  27. package/node_modules/@mrclrchtr/supi-core/src/settings/scoped-settings-list.ts +372 -0
  28. package/node_modules/@mrclrchtr/supi-core/src/settings/settings-action-menu.ts +101 -0
  29. package/node_modules/@mrclrchtr/supi-core/src/settings/settings-command.ts +1 -1
  30. package/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +55 -27
  31. package/node_modules/@mrclrchtr/supi-core/src/settings/settings-schema.ts +464 -0
  32. package/node_modules/@mrclrchtr/supi-core/src/settings/settings-submenus.ts +124 -0
  33. package/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +72 -285
  34. package/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +2 -5
  35. package/node_modules/@mrclrchtr/supi-core/src/settings.ts +27 -5
  36. package/node_modules/@mrclrchtr/supi-core/src/tool-framework.ts +10 -0
  37. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/README.md +32 -23
  38. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +2 -1
  39. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/config.ts +22 -8
  40. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/prompt-surface.ts +357 -0
  41. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config.ts +2 -3
  42. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/debug-registry.ts +0 -5
  43. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/prompt-surface.ts +4 -0
  44. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/scoped-settings-list.ts +372 -0
  45. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-action-menu.ts +101 -0
  46. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-command.ts +1 -1
  47. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +55 -27
  48. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-schema.ts +464 -0
  49. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-submenus.ts +124 -0
  50. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +72 -285
  51. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +2 -5
  52. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings.ts +27 -5
  53. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/tool-framework.ts +10 -0
  54. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/package.json +2 -2
  55. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/README.md +32 -23
  56. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/package.json +2 -1
  57. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/config/config.ts +22 -8
  58. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/config/prompt-surface.ts +357 -0
  59. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/config.ts +2 -3
  60. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/debug-registry.ts +0 -5
  61. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/prompt-surface.ts +4 -0
  62. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/scoped-settings-list.ts +372 -0
  63. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/settings-action-menu.ts +101 -0
  64. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/settings-command.ts +1 -1
  65. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +55 -27
  66. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/settings-schema.ts +464 -0
  67. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/settings-submenus.ts +124 -0
  68. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +72 -285
  69. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +2 -5
  70. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings.ts +27 -5
  71. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/tool-framework.ts +10 -0
  72. package/node_modules/@mrclrchtr/supi-lsp/package.json +3 -3
  73. package/node_modules/@mrclrchtr/supi-lsp/src/config/lsp-settings.ts +1 -1
  74. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/README.md +32 -23
  75. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +2 -1
  76. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/config.ts +22 -8
  77. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/prompt-surface.ts +357 -0
  78. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config.ts +2 -3
  79. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/debug-registry.ts +0 -5
  80. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/prompt-surface.ts +4 -0
  81. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/scoped-settings-list.ts +372 -0
  82. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-action-menu.ts +101 -0
  83. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-command.ts +1 -1
  84. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +55 -27
  85. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-schema.ts +464 -0
  86. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-submenus.ts +124 -0
  87. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +72 -285
  88. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +2 -5
  89. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings.ts +27 -5
  90. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/tool-framework.ts +10 -0
  91. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/package.json +2 -2
  92. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/README.md +32 -23
  93. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/package.json +2 -1
  94. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/config/config.ts +22 -8
  95. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/config/prompt-surface.ts +357 -0
  96. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/config.ts +2 -3
  97. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/debug-registry.ts +0 -5
  98. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/prompt-surface.ts +4 -0
  99. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/scoped-settings-list.ts +372 -0
  100. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/settings-action-menu.ts +101 -0
  101. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/settings-command.ts +1 -1
  102. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +55 -27
  103. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/settings-schema.ts +464 -0
  104. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/settings-submenus.ts +124 -0
  105. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +72 -285
  106. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +2 -5
  107. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings.ts +27 -5
  108. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/tool-framework.ts +10 -0
  109. package/node_modules/@mrclrchtr/supi-tree-sitter/package.json +3 -3
  110. package/package.json +5 -5
  111. package/src/analysis/evidence.ts +13 -0
  112. package/src/analysis/instruction-files.ts +194 -0
  113. package/src/analysis/search/pattern.ts +24 -13
  114. package/src/analysis/search/ripgrep.ts +92 -7
  115. package/src/app/app.ts +6 -1
  116. package/src/config.ts +42 -0
  117. package/src/extension.ts +9 -1
  118. package/src/session/capability-adapter.ts +218 -0
  119. package/src/session/session.ts +106 -1
  120. package/src/session/target-workflow.ts +430 -0
  121. package/src/substrate/lsp/diagnostic-injection.ts +0 -15
  122. package/src/substrate/lsp/settings.ts +101 -175
  123. package/src/tool/find/execute.ts +23 -10
  124. package/src/tool/find/orchestrate.ts +67 -54
  125. package/src/tool/find/semantic-search.ts +30 -16
  126. package/src/tool/graph/collect-relation.ts +2 -1
  127. package/src/tool/graph/execute.ts +40 -12
  128. package/src/tool/graph/markdown-base.ts +5 -37
  129. package/src/tool/graph/orchestrate.ts +9 -35
  130. package/src/tool/graph/tui.ts +2 -0
  131. package/src/tool/guidance.ts +27 -38
  132. package/src/tool/health/markdown.ts +12 -70
  133. package/src/tool/health/orchestrate.ts +5 -13
  134. package/src/tool/impact/analysis.ts +0 -27
  135. package/src/tool/impact/change-set-impact.ts +3 -2
  136. package/src/tool/impact/execute.ts +27 -0
  137. package/src/tool/impact/file-level-impact.ts +3 -2
  138. package/src/tool/impact/result.ts +2 -21
  139. package/src/tool/impact/single-impact.ts +3 -2
  140. package/src/tool/infra/error-results.ts +18 -196
  141. package/src/tool/infra/pipeline.ts +24 -1
  142. package/src/tool/inspect/markdown.ts +4 -41
  143. package/src/tool/inspect/orchestrate.ts +27 -28
  144. package/src/tool/orientation/mode.ts +53 -2
  145. package/src/tool/orientation/orchestrate.ts +5 -8
  146. package/src/tool/orientation/precise-target.ts +65 -69
  147. package/src/tool/refactor-apply/orchestrate.ts +2 -7
  148. package/src/tool/refactor-plan/orchestrate.ts +31 -39
  149. package/src/tool/resolve/markdown.ts +5 -6
  150. package/src/tool/resolve/orchestrate.ts +7 -103
  151. package/src/tool/result/errors.ts +199 -0
  152. package/src/tool/result/find.ts +29 -0
  153. package/src/tool/result/graph.ts +93 -0
  154. package/src/tool/result/health.ts +94 -0
  155. package/src/tool/result/impact.ts +50 -0
  156. package/src/tool/result/inspect.ts +60 -0
  157. package/src/tool/result/orientation.ts +30 -0
  158. package/src/tool/result/refactor.ts +35 -0
  159. package/src/tool/result/resolve.ts +114 -0
  160. package/src/tool/result/types.ts +191 -0
  161. package/src/tool/schemas.ts +39 -28
  162. package/src/types/details.ts +17 -185
  163. package/src/ui/tui/common.ts +45 -1
  164. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +0 -188
  165. package/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +0 -188
  166. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +0 -188
  167. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +0 -188
  168. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +0 -188
  169. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +0 -188
@@ -4,22 +4,21 @@
4
4
  // are deprecated and ignored. Per-language disable via
5
5
  // `lsp.servers.<language>.enabled: false` is the only supported opt-out.
6
6
  //
7
- // This settings section provides:
8
- // - severity control
9
- // - excluded patterns
10
- // - a "Disabled Servers" submenu that writes per-language disable config
7
+ // Uses the declarative settings schema with:
8
+ // - severity: number with labeled values
9
+ // - exclude: stringList
10
+ // - disabled_servers: custom submenu that writes per-language disable config
11
11
 
12
- import { CONFIG_DIR_NAME, getSettingsListTheme } from "@earendil-works/pi-coding-agent";
13
- import type { SettingItem } from "@earendil-works/pi-tui";
12
+ import { type ExtensionAPI, getSettingsListTheme } from "@earendil-works/pi-coding-agent";
13
+ import type { Component, SettingItem } from "@earendil-works/pi-tui";
14
14
  import { Container, Key, matchesKey, SettingsList, Text } from "@earendil-works/pi-tui";
15
15
 
16
- type SettingsScope = "project" | "global";
17
-
16
+ import { loadSupiConfigSectionForScope, writeSupiConfig } from "@mrclrchtr/supi-core/config";
18
17
  import {
19
- loadSupiConfigForScope,
20
- registerConfigSettings,
21
- writeSupiConfig,
22
- } from "@mrclrchtr/supi-core/config";
18
+ registerDeclarativeSettings,
19
+ type SettingsScope,
20
+ type ValueSource,
21
+ } from "@mrclrchtr/supi-core/settings";
23
22
  import { type LspSettings, loadConfig } from "@mrclrchtr/supi-lsp/api";
24
23
 
25
24
  const LSP_DEFAULTS: LspSettings = {
@@ -29,21 +28,6 @@ const LSP_DEFAULTS: LspSettings = {
29
28
  exclude: [],
30
29
  };
31
30
 
32
- function severityLabel(severity: number): string {
33
- switch (severity) {
34
- case 1:
35
- return "errors";
36
- case 2:
37
- return "warnings";
38
- case 3:
39
- return "info";
40
- case 4:
41
- return "hints";
42
- default:
43
- return "errors";
44
- }
45
- }
46
-
47
31
  /** Discover configured servers from the defaults + effective LSP config. */
48
32
  function getConfiguredServers(cwd: string): string[] {
49
33
  try {
@@ -59,12 +43,10 @@ function getConfiguredServers(cwd: string): string[] {
59
43
  * configured disabled servers from the persisted config.
60
44
  */
61
45
  function getDisabledServersFromConfig(scope: SettingsScope, cwd: string): Set<string> {
62
- const section = loadSupiConfigForScope(
63
- "lsp",
64
- cwd,
65
- { servers: {} as Record<string, { enabled?: boolean }> },
66
- { scope },
67
- );
46
+ const section = loadSupiConfigSectionForScope("lsp", cwd, {
47
+ scope,
48
+ });
49
+ if (!section) return new Set();
68
50
  const servers = section.servers as Record<string, { enabled?: boolean }> | undefined;
69
51
  const disabled = new Set<string>();
70
52
  if (servers) {
@@ -75,75 +57,11 @@ function getDisabledServersFromConfig(scope: SettingsScope, cwd: string): Set<st
75
57
  return disabled;
76
58
  }
77
59
 
78
- export function registerLspSettings(): void {
79
- registerConfigSettings({
80
- id: "lsp",
81
- label: "LSP",
82
- section: "lsp",
83
- defaults: LSP_DEFAULTS,
84
- buildItems: (settings, scope, cwd) => buildLspSettingItems(settings, scope, cwd),
85
- // biome-ignore lint/complexity/useMaxParams: registerConfigSettings callback signature
86
- persistChange: (_scope, _cwd, settingId, value, helpers) => {
87
- switch (settingId) {
88
- case "severity": {
89
- const num = Number.parseInt(value.split(" ")[0] ?? "1", 10);
90
- helpers.set("severity", Number.isNaN(num) ? 1 : num);
91
- break;
92
- }
93
- case "exclude": {
94
- const patterns = value
95
- .split(",")
96
- .map((s) => s.trim())
97
- .filter(Boolean);
98
- if (patterns.length > 0) helpers.set("exclude", patterns);
99
- else helpers.unset("exclude");
100
- break;
101
- }
102
- }
103
- },
104
- });
105
- }
106
-
107
- function buildLspSettingItems(
108
- settings: LspSettings,
109
- scope: "project" | "global",
110
- cwd: string,
111
- ): SettingItem[] {
112
- return [
113
- {
114
- id: "severity",
115
- label: "Inline Severity",
116
- description: "Minimum diagnostic severity to show inline (1=errors, 4=hints)",
117
- currentValue: `${settings.severity} (${severityLabel(settings.severity)})`,
118
- values: ["1 (errors)", "2 (warnings)", "3 (info)", "4 (hints)"],
119
- },
120
- {
121
- id: "disabled_servers",
122
- label: "Disabled Servers",
123
- description: "Press Enter to choose which language servers to disable",
124
- currentValue: renderDisabledServersLabel(scope, cwd),
125
- submenu: (_currentValue, done) => createDisabledServersSubmenu(scope, cwd, done),
126
- },
127
- {
128
- id: "exclude",
129
- label: "Exclude Patterns",
130
- description: "Gitignore patterns to suppress LSP diagnostics",
131
- currentValue: settings.exclude.length > 0 ? settings.exclude.join(", ") : "none",
132
- submenu: (_currentValue, done) => createExcludeSubmenu(scope, cwd, settings, done),
133
- },
134
- ];
135
- }
136
-
137
- function renderDisabledServersLabel(scope: SettingsScope, cwd: string): string {
138
- const disabled = getDisabledServersFromConfig(scope, cwd);
139
- return disabled.size > 0 ? [...disabled].sort().join(", ") : "none disabled";
140
- }
141
-
142
60
  function createDisabledServersSubmenu(
143
61
  scope: SettingsScope,
144
62
  cwd: string,
145
- done: (value?: string) => void,
146
- ) {
63
+ done: (selectedValue?: string) => void,
64
+ ): Component {
147
65
  const allServers = getConfiguredServers(cwd);
148
66
  const disabledServers = getDisabledServersFromConfig(scope, cwd);
149
67
 
@@ -156,14 +74,7 @@ function createDisabledServersSubmenu(
156
74
 
157
75
  let dirty = false;
158
76
  const container = new Container();
159
- const header = new Text("Disabled Servers — per-language opt-out", 0, 0);
160
- container.addChild(header);
161
- const footer = new Text(
162
- "Marking a server as disabled writes lsp.servers.<lang>.enabled: false for this scope",
163
- 0,
164
- 0,
165
- );
166
- container.addChild(footer);
77
+ container.addChild(new Text(" Disabled Servers — per-language opt-out", 1, 0));
167
78
 
168
79
  const settingsList = new SettingsList(
169
80
  items,
@@ -180,26 +91,22 @@ function createDisabledServersSubmenu(
180
91
  { enableSearch: true },
181
92
  );
182
93
  container.addChild(settingsList);
94
+ container.addChild(new Text(" esc save and close", 1, 0));
183
95
 
184
96
  return {
185
97
  render: (width: number) => container.render(width),
186
98
  invalidate: () => container.invalidate(),
187
- // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: single event handler dispatching keyboard shortcuts for the Disabled Servers submenu
99
+ // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: single event handler for the submenu
188
100
  handleInput: (data: string) => {
189
101
  if (matchesKey(data, Key.escape)) {
190
102
  if (!dirty) {
191
103
  done();
192
- return true;
104
+ return;
193
105
  }
194
106
  // Write per-language enabled/disabled into lsp.servers
195
- const currentSection = loadSupiConfigForScope(
196
- "lsp",
197
- cwd,
198
- { servers: {} as Record<string, { enabled?: boolean }> },
199
- { scope },
200
- );
107
+ const currentSection = loadSupiConfigSectionForScope("lsp", cwd, { scope });
201
108
  const servers =
202
- (currentSection.servers as Record<string, Record<string, unknown>> | undefined) ?? {};
109
+ (currentSection?.servers as Record<string, Record<string, unknown>> | undefined) ?? {};
203
110
 
204
111
  for (const item of items) {
205
112
  if (item.currentValue === "disabled") {
@@ -208,7 +115,6 @@ function createDisabledServersSubmenu(
208
115
  const srv = servers[item.id];
209
116
  if (srv) {
210
117
  delete srv.enabled;
211
- // If only `enabled` was the property, remove the whole entry
212
118
  if (Object.keys(srv).length === 0) {
213
119
  delete servers[item.id];
214
120
  }
@@ -217,70 +123,90 @@ function createDisabledServersSubmenu(
217
123
  }
218
124
 
219
125
  writeSupiConfig({ section: "lsp", scope, cwd }, { servers });
220
- done();
221
- return true;
126
+ done("saved");
127
+ return;
222
128
  }
223
129
  settingsList.handleInput?.(data);
224
- return true;
225
130
  },
226
131
  };
227
132
  }
228
133
 
229
- function createExcludeSubmenu(
230
- _scope: "project" | "global",
231
- _cwd: string,
232
- settings: LspSettings,
233
- done: (value?: string) => void,
234
- ) {
235
- const items: SettingItem[] = settings.exclude.map((pattern) => ({
236
- id: pattern,
237
- label: pattern,
238
- currentValue: "enabled",
239
- values: ["enabled", "disabled"],
240
- }));
241
-
242
- let dirty = false;
243
- const container = new Container();
244
- const header = new Text("Exclude Patterns — toggle off to remove", 0, 0);
245
- container.addChild(header);
246
-
247
- const footer = new Text(
248
- `Add new patterns in ${CONFIG_DIR_NAME}/supi/config.json under lsp.exclude`,
249
- 0,
250
- 0,
251
- );
252
- container.addChild(footer);
134
+ export function registerLspSettings(pi: ExtensionAPI): void {
135
+ registerDeclarativeSettings(pi, {
136
+ id: "lsp",
137
+ label: "LSP",
138
+ section: "lsp",
139
+ defaults: LSP_DEFAULTS,
140
+ fields: [
141
+ {
142
+ kind: "number" as const,
143
+ key: "severity",
144
+ label: "Inline Severity",
145
+ description: "Minimum diagnostic severity to show inline (1=errors, 4=hints)",
146
+ values: ["1", "2", "3", "4"],
147
+ },
148
+ {
149
+ kind: "stringList" as const,
150
+ key: "exclude",
151
+ label: "Exclude Patterns",
152
+ description: "Gitignore patterns to suppress LSP diagnostics (comma-separated)",
153
+ },
154
+ {
155
+ kind: "custom" as const,
156
+ key: "disabled_servers",
157
+ label: "Disabled Servers",
158
+ description: "Press Enter to choose which language servers to disable",
159
+ resolve: (scope, cwd) => {
160
+ const scopedDisabled = getDisabledServersFromConfig(scope, cwd);
161
+ const otherScope = scope === "project" ? "global" : "project";
162
+ const otherDisabled =
163
+ scope === "project" ? getDisabledServersFromConfig("global", cwd) : new Set<string>();
164
+
165
+ // Effective disabled servers = union of both scopes (since either disables)
166
+ const effectiveDisabled = new Set([...scopedDisabled, ...otherDisabled]);
167
+ const label =
168
+ effectiveDisabled.size > 0 ? [...effectiveDisabled].sort().join(", ") : "none disabled";
169
+
170
+ // Source: where the override comes from
171
+ let source: ValueSource;
172
+ if (scopedDisabled.size > 0) {
173
+ source = scope;
174
+ } else if (otherDisabled.size > 0) {
175
+ source = otherScope as ValueSource;
176
+ } else {
177
+ source = "default";
178
+ }
253
179
 
254
- const settingsList = new SettingsList(
255
- items,
256
- Math.min(items.length + 3, 15),
257
- getSettingsListTheme(),
258
- (id, newValue) => {
259
- const idx = items.findIndex((i) => i.id === id);
260
- if (idx >= 0 && items[idx].currentValue !== newValue) {
261
- dirty = true;
262
- items[idx].currentValue = newValue;
263
- }
264
- },
265
- () => {},
266
- );
267
- container.addChild(settingsList);
180
+ let inheritanceSource: "global" | "default" | undefined;
181
+ if (scope === "project" && source === "project") {
182
+ inheritanceSource =
183
+ getDisabledServersFromConfig("global", cwd).size > 0 ? "global" : "default";
184
+ }
268
185
 
269
- return {
270
- render: (width: number) => container.render(width),
271
- invalidate: () => container.invalidate(),
272
- handleInput: (data: string) => {
273
- if (matchesKey(data, Key.escape)) {
274
- if (!dirty) {
275
- done();
276
- return true;
277
- }
278
- const enabled = items.filter((i) => i.currentValue === "enabled").map((i) => i.id);
279
- done(enabled.join(", ") || undefined);
280
- return true;
281
- }
282
- settingsList.handleInput?.(data);
283
- return true;
284
- },
285
- };
186
+ return { displayValue: label, source, inheritanceSource };
187
+ },
188
+ submenu: (_currentValue, done, scope, cwd) =>
189
+ createDisabledServersSubmenu(scope, cwd, done),
190
+ // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: custom field persist handler orchestrates nested config writes
191
+ persist: (scope, cwd, action, _helpers) => {
192
+ if (action.kind === "inherit" || action.kind === "resetToDefault") {
193
+ // Clear all per-server enable/disable entries for this scope
194
+ const currentSection = loadSupiConfigSectionForScope("lsp", cwd, { scope });
195
+ const servers =
196
+ (currentSection?.servers as Record<string, Record<string, unknown>> | undefined) ??
197
+ {};
198
+ for (const name of Object.keys(servers)) {
199
+ const srv = servers[name];
200
+ if (srv) {
201
+ delete srv.enabled;
202
+ if (Object.keys(srv).length === 0) delete servers[name];
203
+ }
204
+ }
205
+ writeSupiConfig({ section: "lsp", scope, cwd }, { servers });
206
+ }
207
+ // Explicit set actions are handled entirely inside the submenu
208
+ },
209
+ },
210
+ ],
211
+ });
286
212
  }
@@ -16,7 +16,7 @@ import { findModeKindRules } from "../infra/cross-field.ts";
16
16
  import { unavailableSearchDetails } from "../infra/error-results.ts";
17
17
  import {
18
18
  gateSemanticReadiness,
19
- resolveScopeParam,
19
+ resolveScopeSetParam,
20
20
  runPipe,
21
21
  validateParams,
22
22
  } from "../infra/pipeline.ts";
@@ -26,7 +26,7 @@ import { executePattern } from "./orchestrate.ts";
26
26
 
27
27
  export interface CodeFindToolParams {
28
28
  query: string;
29
- scope?: string;
29
+ scope?: string | string[];
30
30
  mode?: "text" | "regex" | "ast" | "semantic";
31
31
  kind?:
32
32
  | "definition"
@@ -43,6 +43,16 @@ export interface CodeFindToolParams {
43
43
  maxResults?: number;
44
44
  }
45
45
 
46
+ interface CodeFindPipelineParams extends CodeFindToolParams {
47
+ _resolvedScopePaths?: string[];
48
+ _resolvedScopeDisplay?: string | null;
49
+ }
50
+
51
+ function scopeForDetails(scope: CodeFindToolParams["scope"]): string | null {
52
+ if (Array.isArray(scope)) return scope.join(", ");
53
+ return scope ?? null;
54
+ }
55
+
46
56
  export async function executeFindTool(
47
57
  params: CodeFindToolParams,
48
58
  ctx: CodeIntelToolExecCtx,
@@ -50,7 +60,7 @@ export async function executeFindTool(
50
60
  if (!params.query || params.query.trim().length === 0) {
51
61
  return {
52
62
  content: "**Error:** `code_find` requires a non-empty `query` parameter.",
53
- details: unavailableSearchDetails(params.scope ?? null, [
63
+ details: unavailableSearchDetails(scopeForDetails(params.scope), [
54
64
  "Provide a non-empty `query` parameter",
55
65
  ]),
56
66
  };
@@ -61,20 +71,22 @@ export async function executeFindTool(
61
71
  const mode = params.mode ?? "text";
62
72
  const needsSemanticReadiness = mode === "semantic";
63
73
 
74
+ const pipelineParams = params as CodeFindPipelineParams;
75
+
64
76
  return runPipe(
65
- params,
77
+ pipelineParams,
66
78
  ctx,
67
79
  [
68
80
  validateParams(findModeKindRules(), (msg) => ({
69
81
  content: msg,
70
- details: unavailableSearchDetails(params.scope ?? null, [
82
+ details: unavailableSearchDetails(scopeForDetails(params.scope), [
71
83
  'Use `mode: "ast"` with `kind`, or remove `kind` for text/regex/semantic search',
72
84
  ]),
73
85
  })),
74
- resolveScopeParam((reason) => ({
86
+ resolveScopeSetParam((reason) => ({
75
87
  content: `**Error:** ${reason}`,
76
- details: unavailableSearchDetails(params.scope ?? null, [
77
- "Verify the `scope` path exists and is within the workspace",
88
+ details: unavailableSearchDetails(scopeForDetails(params.scope), [
89
+ "Verify each `scope` path exists and is within the workspace",
78
90
  ]),
79
91
  })),
80
92
  ...(needsSemanticReadiness
@@ -82,7 +94,7 @@ export async function executeFindTool(
82
94
  gateSemanticReadiness("code_find", {
83
95
  onTimeout: () => ({
84
96
  content: renderSemanticReadinessTimeout("code_find", 15_000),
85
- details: unavailableSearchDetails(params.scope ?? null, [
97
+ details: unavailableSearchDetails(scopeForDetails(params.scope), [
86
98
  "Retry shortly or check `code_health`",
87
99
  ]),
88
100
  }),
@@ -104,7 +116,8 @@ export async function executeFindTool(
104
116
  return executePattern(
105
117
  {
106
118
  pattern: p.query,
107
- path: p.scope ?? c.cwd,
119
+ paths: p._resolvedScopePaths ?? [c.cwd],
120
+ scopeLabel: p._resolvedScopeDisplay ?? null,
108
121
  regex: mode === "regex",
109
122
  kind: p.kind,
110
123
  mode,