@mrclrchtr/supi-code-intelligence 4.6.0 → 4.8.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 (215) hide show
  1. package/node_modules/@mrclrchtr/supi-code-runtime/README.md +1 -1
  2. package/node_modules/@mrclrchtr/supi-code-runtime/package.json +1 -15
  3. package/node_modules/@mrclrchtr/supi-code-runtime/src/api.ts +1 -6
  4. package/node_modules/@mrclrchtr/supi-core/README.md +26 -34
  5. package/node_modules/@mrclrchtr/supi-core/package.json +4 -7
  6. package/node_modules/@mrclrchtr/supi-core/src/api.ts +4 -6
  7. package/node_modules/@mrclrchtr/supi-core/src/config/config.ts +0 -20
  8. package/node_modules/@mrclrchtr/supi-core/src/config/prompt-surface.ts +7 -1
  9. package/node_modules/@mrclrchtr/supi-core/src/config.ts +0 -1
  10. package/node_modules/@mrclrchtr/supi-core/src/context.ts +1 -9
  11. package/node_modules/@mrclrchtr/supi-core/src/index.ts +4 -6
  12. package/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +54 -28
  13. package/node_modules/@mrclrchtr/supi-core/src/settings/settings-schema.ts +91 -125
  14. package/node_modules/@mrclrchtr/supi-core/src/settings.ts +10 -7
  15. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/README.md +1 -1
  16. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/package.json +1 -15
  17. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/api.ts +1 -6
  18. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/README.md +26 -34
  19. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/package.json +4 -7
  20. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/api.ts +4 -6
  21. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/config/config.ts +0 -20
  22. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/config/prompt-surface.ts +7 -1
  23. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/config.ts +0 -1
  24. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/context.ts +1 -9
  25. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/index.ts +4 -6
  26. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +54 -28
  27. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/settings-schema.ts +91 -125
  28. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings.ts +10 -7
  29. package/node_modules/@mrclrchtr/supi-lsp/package.json +3 -3
  30. package/node_modules/@mrclrchtr/supi-lsp/src/client/client-diagnostics.ts +361 -0
  31. package/node_modules/@mrclrchtr/supi-lsp/src/client/client.ts +46 -238
  32. package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager.ts +25 -33
  33. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/README.md +1 -1
  34. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/package.json +1 -15
  35. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/api.ts +1 -6
  36. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/README.md +26 -34
  37. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/package.json +4 -7
  38. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/api.ts +4 -6
  39. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/config/config.ts +0 -20
  40. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/config/prompt-surface.ts +7 -1
  41. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/config.ts +0 -1
  42. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/context.ts +1 -9
  43. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/index.ts +4 -6
  44. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +54 -28
  45. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/settings-schema.ts +91 -125
  46. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings.ts +10 -7
  47. package/node_modules/@mrclrchtr/supi-tree-sitter/package.json +3 -3
  48. package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/outline-html-sql.ts +1 -1
  49. package/package.json +5 -5
  50. package/src/config.ts +19 -16
  51. package/src/substrate/lsp/settings.ts +90 -91
  52. package/src/tool/find/execute.ts +5 -8
  53. package/src/tool/graph/execute.ts +1 -1
  54. package/src/tool/health/execute.ts +2 -5
  55. package/src/tool/inspect/execute.ts +5 -7
  56. package/src/tool/orientation/execute.ts +4 -5
  57. package/src/tool/refactor-apply/execute.ts +4 -5
  58. package/src/tool/refactor-plan/execute.ts +7 -9
  59. package/src/tool/result/errors.ts +2 -82
  60. package/src/ui/tui/common.ts +1 -1
  61. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/README.md +0 -120
  62. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +0 -75
  63. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/api.ts +0 -42
  64. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/config.ts +0 -221
  65. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/prompt-surface.ts +0 -357
  66. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config.ts +0 -11
  67. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/context/context-messages.ts +0 -119
  68. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/context/context-provider-registry.ts +0 -36
  69. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/context/context-tag.ts +0 -31
  70. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/context.ts +0 -16
  71. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/debug-registry.ts +0 -287
  72. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/evidence-badge.ts +0 -41
  73. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/footer-registry.ts +0 -57
  74. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/index.ts +0 -36
  75. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/llm.ts +0 -201
  76. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/model-selection.ts +0 -134
  77. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/path-utils.ts +0 -44
  78. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/path.ts +0 -2
  79. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/progress-widget.ts +0 -189
  80. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/project-roots.ts +0 -170
  81. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/project.ts +0 -15
  82. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/prompt-surface.ts +0 -4
  83. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/registry-utils.ts +0 -93
  84. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/report.ts +0 -121
  85. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/session-utils.ts +0 -71
  86. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/session.ts +0 -8
  87. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/scoped-settings-list.ts +0 -373
  88. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-action-menu.ts +0 -102
  89. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-command.ts +0 -15
  90. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +0 -76
  91. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-schema.ts +0 -487
  92. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-submenus.ts +0 -141
  93. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +0 -118
  94. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +0 -3
  95. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings.ts +0 -33
  96. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/spinner-frames.ts +0 -11
  97. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/status-spinner.ts +0 -68
  98. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/terminal.ts +0 -60
  99. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/tool-framework.ts +0 -192
  100. package/node_modules/@mrclrchtr/supi-code-runtime/src/index.ts +0 -42
  101. package/node_modules/@mrclrchtr/supi-code-runtime/src/workspace/context.ts +0 -45
  102. package/node_modules/@mrclrchtr/supi-core/src/context/context-messages.ts +0 -119
  103. package/node_modules/@mrclrchtr/supi-core/src/progress-widget.ts +0 -189
  104. package/node_modules/@mrclrchtr/supi-core/src/settings/scoped-settings-list.ts +0 -373
  105. package/node_modules/@mrclrchtr/supi-core/src/settings/settings-action-menu.ts +0 -102
  106. package/node_modules/@mrclrchtr/supi-core/src/settings/settings-command.ts +0 -15
  107. package/node_modules/@mrclrchtr/supi-core/src/settings/settings-submenus.ts +0 -141
  108. package/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +0 -118
  109. package/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +0 -3
  110. package/node_modules/@mrclrchtr/supi-core/src/tool-framework.ts +0 -192
  111. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/README.md +0 -120
  112. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +0 -75
  113. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/api.ts +0 -42
  114. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/config.ts +0 -221
  115. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/prompt-surface.ts +0 -357
  116. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config.ts +0 -11
  117. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/context/context-messages.ts +0 -119
  118. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/context/context-provider-registry.ts +0 -36
  119. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/context/context-tag.ts +0 -31
  120. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/context.ts +0 -16
  121. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/debug-registry.ts +0 -287
  122. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/evidence-badge.ts +0 -41
  123. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/footer-registry.ts +0 -57
  124. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/index.ts +0 -36
  125. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/llm.ts +0 -201
  126. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/model-selection.ts +0 -134
  127. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/path-utils.ts +0 -44
  128. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/path.ts +0 -2
  129. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/progress-widget.ts +0 -189
  130. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/project-roots.ts +0 -170
  131. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/project.ts +0 -15
  132. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/prompt-surface.ts +0 -4
  133. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/registry-utils.ts +0 -93
  134. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/report.ts +0 -121
  135. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/session-utils.ts +0 -71
  136. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/session.ts +0 -8
  137. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/scoped-settings-list.ts +0 -373
  138. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-action-menu.ts +0 -102
  139. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-command.ts +0 -15
  140. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +0 -76
  141. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-schema.ts +0 -487
  142. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-submenus.ts +0 -141
  143. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +0 -118
  144. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +0 -3
  145. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings.ts +0 -33
  146. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/spinner-frames.ts +0 -11
  147. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/status-spinner.ts +0 -68
  148. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/terminal.ts +0 -60
  149. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/tool-framework.ts +0 -192
  150. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/index.ts +0 -42
  151. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/workspace/context.ts +0 -45
  152. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/context/context-messages.ts +0 -119
  153. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/progress-widget.ts +0 -189
  154. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/scoped-settings-list.ts +0 -373
  155. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/settings-action-menu.ts +0 -102
  156. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/settings-command.ts +0 -15
  157. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/settings-submenus.ts +0 -141
  158. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +0 -118
  159. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +0 -3
  160. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/tool-framework.ts +0 -192
  161. package/node_modules/@mrclrchtr/supi-lsp/src/client/client-refresh.ts +0 -234
  162. package/node_modules/@mrclrchtr/supi-lsp/src/diagnostics/diagnostics.ts +0 -99
  163. package/node_modules/@mrclrchtr/supi-lsp/src/diagnostics/suppression-diagnostics.ts +0 -60
  164. package/node_modules/@mrclrchtr/supi-lsp/src/index.ts +0 -41
  165. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/README.md +0 -120
  166. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +0 -75
  167. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/api.ts +0 -42
  168. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/config.ts +0 -221
  169. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/prompt-surface.ts +0 -357
  170. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config.ts +0 -11
  171. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/context/context-messages.ts +0 -119
  172. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/context/context-provider-registry.ts +0 -36
  173. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/context/context-tag.ts +0 -31
  174. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/context.ts +0 -16
  175. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/debug-registry.ts +0 -287
  176. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/evidence-badge.ts +0 -41
  177. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/footer-registry.ts +0 -57
  178. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/index.ts +0 -36
  179. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/llm.ts +0 -201
  180. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/model-selection.ts +0 -134
  181. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/path-utils.ts +0 -44
  182. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/path.ts +0 -2
  183. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/progress-widget.ts +0 -189
  184. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/project-roots.ts +0 -170
  185. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/project.ts +0 -15
  186. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/prompt-surface.ts +0 -4
  187. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/registry-utils.ts +0 -93
  188. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/report.ts +0 -121
  189. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/session-utils.ts +0 -71
  190. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/session.ts +0 -8
  191. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/scoped-settings-list.ts +0 -373
  192. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-action-menu.ts +0 -102
  193. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-command.ts +0 -15
  194. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +0 -76
  195. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-schema.ts +0 -487
  196. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-submenus.ts +0 -141
  197. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +0 -118
  198. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +0 -3
  199. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings.ts +0 -33
  200. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/spinner-frames.ts +0 -11
  201. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/status-spinner.ts +0 -68
  202. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/terminal.ts +0 -60
  203. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/tool-framework.ts +0 -192
  204. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/index.ts +0 -42
  205. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/workspace/context.ts +0 -45
  206. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/context/context-messages.ts +0 -119
  207. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/progress-widget.ts +0 -189
  208. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/scoped-settings-list.ts +0 -373
  209. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/settings-action-menu.ts +0 -102
  210. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/settings-command.ts +0 -15
  211. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/settings-submenus.ts +0 -141
  212. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +0 -118
  213. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +0 -3
  214. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/tool-framework.ts +0 -192
  215. package/src/tool/infra/error-results.ts +0 -19
@@ -1,487 +0,0 @@
1
- // Declarative settings schema for SuPi extensions.
2
- //
3
- // Replaces the imperative config-backed buildItems/persistChange contribution
4
- // with a declarative field descriptor model. The shared settings module owns
5
- // scope inheritance, source-state resolution, value rendering, persistence,
6
- // and Inherit/Reset-to-default actions.
7
- //
8
- // Custom fields remain for nested or unusual config; they report the same
9
- // source state as declarative flat fields.
10
-
11
- import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
12
- import type { Component } from "@earendil-works/pi-tui";
13
- import {
14
- loadSupiConfigSectionForScope,
15
- removeSupiConfigKey,
16
- writeSupiConfig,
17
- } from "../config/config.ts";
18
- import {
19
- isSettingsContributionCollector,
20
- type SettingsScope,
21
- type SettingsSection,
22
- SUPI_SETTINGS_COLLECT_EVENT,
23
- } from "./settings-registry.ts";
24
-
25
- // ── Types ──────────────────────────────────────────────────────────────────
26
-
27
- /** Where the current effective value comes from. */
28
- export type ValueSource = "project" | "global" | "default";
29
-
30
- /** Structured notification fired to afterPersist. */
31
- export interface SettingsPersistedChange {
32
- scope: SettingsScope;
33
- cwd: string;
34
- /** The config key that was mutated. */
35
- fieldKey: string;
36
- /** What happened: set an explicit value or deleted the scoped key. */
37
- action: "set" | "delete";
38
- /** The value written (only present for "set"). */
39
- storedValue?: unknown;
40
- /** The effective value after the save (merging defaults ← global ← project). */
41
- effectiveValue: unknown;
42
- /** Where the effective value now comes from. */
43
- effectiveSource: ValueSource;
44
- }
45
-
46
- /** Helpers passed to custom-field persist handlers. */
47
- export interface ConfigHelpers {
48
- set(key: string, value: unknown): void;
49
- unset(key: string): void;
50
- }
51
-
52
- // ── Field actions ─────────────────────────────────────────────────────────
53
-
54
- /** A user-initiated action on a settings row. */
55
- export type SettingsFieldAction =
56
- | { kind: "set"; value: string }
57
- | { kind: "inherit" }
58
- | { kind: "resetToDefault" };
59
-
60
- // ── Field descriptors ─────────────────────────────────────────────────────
61
-
62
- interface BaseField {
63
- /** Config key in the section (e.g. "enabled", "severity"). */
64
- key: string;
65
- /** Display label. */
66
- label: string;
67
- /** Optional description shown when the row is selected. */
68
- description?: string;
69
- }
70
-
71
- /** Boolean on/off toggle. */
72
- export interface BoolField extends BaseField {
73
- kind: "boolean";
74
- }
75
-
76
- /** Enumeration of string choices (cycle via Space). */
77
- export interface EnumField extends BaseField {
78
- kind: "enum";
79
- values: string[];
80
- }
81
-
82
- /** Integer field; with discrete values for cycling or absent for free input. */
83
- export interface NumberField extends BaseField {
84
- kind: "number";
85
- /** Discrete choices for Space cycling; absent = free text input. */
86
- values?: string[];
87
- }
88
-
89
- /** One free-form string. */
90
- export interface StringField extends BaseField {
91
- kind: "string";
92
- }
93
-
94
- /** Comma-separated string list. */
95
- export interface StringListField extends BaseField {
96
- kind: "stringList";
97
- }
98
-
99
- /** One non-model choice shown before the scoped models in a model picker. */
100
- export interface ModelPickerStaticOption {
101
- /** Persisted value for the choice. */
102
- value: string;
103
- /** Human-readable picker label. */
104
- label: string;
105
- /** Optional explanation shown alongside the label. */
106
- description?: string;
107
- }
108
-
109
- /** Model picker backed by the scoped model set. */
110
- export interface ModelPickerField extends BaseField {
111
- kind: "modelPicker";
112
- /** Additional host-owned choices shown before scoped models. */
113
- staticOptions?: ModelPickerStaticOption[];
114
- /** Whether to include the built-in `disabled` choice. Defaults to true. */
115
- includeDisabled?: boolean;
116
- }
117
-
118
- /**
119
- * Custom / escape-hatch field for nested config or unusual controls.
120
- *
121
- * The field must report its display value and source so the settings UI
122
- * can render consistent source badges and action menus.
123
- */
124
- export interface CustomField extends BaseField {
125
- kind: "custom";
126
- /**
127
- * Return the display value and its source for the given scope.
128
- * Called on every scope toggle and after persistence.
129
- */
130
- resolve: (
131
- scope: SettingsScope,
132
- cwd: string,
133
- ctx?: ExtensionContext,
134
- ) => {
135
- /** Human-readable value text, without the source badge. */
136
- displayValue: string;
137
- /** Value used to prefill editors/pickers; defaults to displayValue when omitted. */
138
- editValue?: string;
139
- source: ValueSource;
140
- /** When scope is "project" and source is "project", the source after deletion. */
141
- inheritanceSource?: "global" | "default";
142
- };
143
- /**
144
- * Submenu component factory for editing (Enter).
145
- * Receives the resolved display value and a done callback; return a pi-tui
146
- * Component-like object. Undefined means Enter opens the action menu only.
147
- */
148
- submenu?: (
149
- currentValue: string,
150
- done: (selectedValue?: string) => void,
151
- scope: SettingsScope,
152
- cwd: string,
153
- ctx?: ExtensionContext,
154
- ) => Component;
155
- /**
156
- * Persist handler called on set/inherit/resetToDefault actions.
157
- * Required for custom fields so they can write their nested config.
158
- */
159
- persist: (
160
- scope: SettingsScope,
161
- cwd: string,
162
- action: SettingsFieldAction,
163
- helpers: ConfigHelpers,
164
- ) => void;
165
- }
166
-
167
- /** Union of all supported field kinds. */
168
- export type SettingsField =
169
- | BoolField
170
- | EnumField
171
- | NumberField
172
- | StringField
173
- | StringListField
174
- | ModelPickerField
175
- | CustomField;
176
-
177
- // ── Contribution options ──────────────────────────────────────────────────
178
-
179
- /** Options for registerDeclarativeSettings. */
180
- export interface DeclarativeSettingsOptions {
181
- /** Stable contribution identifier — e.g. "lsp", "claude-md". */
182
- id: string;
183
- /** Human-readable label shown in the UI. */
184
- label: string;
185
- /** SuPi config section name — e.g. "lsp", "claude-md". */
186
- section: string;
187
- /** Package-default config values (indexable by field key). */
188
- defaults: Record<string, unknown>;
189
- /** Declarative field descriptors. */
190
- fields: SettingsField[];
191
- /** Optional live runtime sync after successful persistence. */
192
- afterPersist?: (change: SettingsPersistedChange) => void;
193
- /** Optional home directory for config resolution (testing). */
194
- homeDir?: string;
195
- }
196
-
197
- // ── Scoped section interface ─────────────────────────────────────────────
198
-
199
- /** Resolved value for one field in one scope. */
200
- export interface ScopedFieldValue {
201
- /** The field descriptor. */
202
- field: SettingsField;
203
- /** Display value string shown in the row (with source badge). */
204
- displayValue: string;
205
- /** Value used to prefill editors/pickers, without the source badge. */
206
- editValue: string;
207
- /** Where the value comes from. */
208
- source: ValueSource;
209
- /**
210
- * When scope is "project" and source is "project", the source that would
211
- * apply after deleting the project override ("global" or "default").
212
- * Undefined otherwise.
213
- */
214
- inheritanceSource?: "global" | "default";
215
- }
216
-
217
- // ── Source resolution ─────────────────────────────────────────────────────
218
-
219
- /**
220
- * Resolve the effective value and source for a flat key.
221
- *
222
- * For project scope: checks project → global → defaults.
223
- * For global scope: checks global → defaults.
224
- */
225
- // biome-ignore lint/complexity/useMaxParams: resolveValue needs all scope/source parameters for honest multi-tier resolution
226
- export function resolveValue<T extends Record<string, unknown>>(
227
- key: string,
228
- defaults: T,
229
- projectRaw: Record<string, unknown> | null,
230
- globalRaw: Record<string, unknown> | null,
231
- scope: SettingsScope,
232
- ): { value: unknown; source: ValueSource } {
233
- // Check direct scope first
234
- const directRaw = scope === "project" ? projectRaw : globalRaw;
235
- if (directRaw && key in directRaw) {
236
- return { value: directRaw[key], source: scope };
237
- }
238
-
239
- // For project scope, check global
240
- if (scope === "project" && globalRaw && key in globalRaw) {
241
- return { value: globalRaw[key], source: "global" };
242
- }
243
-
244
- // Fall back to defaults
245
- return { value: defaults[key], source: "default" };
246
- }
247
-
248
- // ── Value formatting ──────────────────────────────────────────────────────
249
-
250
- /** Format a value for display. */
251
- export function formatValue(value: unknown, field: SettingsField): string {
252
- switch (field.kind) {
253
- case "boolean":
254
- return value ? "on" : "off";
255
- case "number":
256
- return String(value ?? "");
257
- case "string":
258
- return typeof value === "string" && value ? value : "none";
259
- case "stringList": {
260
- const arr = Array.isArray(value) ? value : [];
261
- return arr.length > 0 ? arr.map(String).join(", ") : "none";
262
- }
263
- default:
264
- return String(value ?? "");
265
- }
266
- }
267
-
268
- /** Build source-badged display text. */
269
- export function sourceBadge(displayValue: string, source: ValueSource): string {
270
- switch (source) {
271
- case "project":
272
- return `${displayValue} (project)`;
273
- case "global":
274
- return `${displayValue} (global)`;
275
- case "default":
276
- return `${displayValue} (default)`;
277
- }
278
- }
279
-
280
- /** Format the value used to prefill editors and compare concrete choices. */
281
- export function formatEditValue(value: unknown, field: SettingsField): string {
282
- if (field.kind === "string") return typeof value === "string" ? value : "";
283
- if (field.kind === "stringList") {
284
- const arr = Array.isArray(value) ? value : [];
285
- return arr.map(String).join(", ");
286
- }
287
- return formatValue(value, field);
288
- }
289
-
290
- // ── Persistence helpers ───────────────────────────────────────────────────
291
-
292
- function createConfigHelpers(
293
- section: string,
294
- scope: SettingsScope,
295
- cwd: string,
296
- homeDir?: string,
297
- ): ConfigHelpers {
298
- return {
299
- set: (key: string, val: unknown) => {
300
- writeSupiConfig({ section, scope, cwd }, { [key]: val }, { homeDir });
301
- },
302
- unset: (key: string) => {
303
- removeSupiConfigKey({ section, scope, cwd }, key, { homeDir });
304
- },
305
- };
306
- }
307
-
308
- // ── Scoped section factory ────────────────────────────────────────────────
309
-
310
- interface NotifyAfterPersistInput {
311
- options: DeclarativeSettingsOptions;
312
- field: SettingsField;
313
- scope: SettingsScope;
314
- cwd: string;
315
- action: SettingsFieldAction;
316
- storedValue: unknown;
317
- ctx?: ExtensionContext;
318
- }
319
-
320
- function notifyAfterPersist(input: NotifyAfterPersistInput): void {
321
- const { options, field, scope, cwd, action, storedValue, ctx } = input;
322
- if (!options.afterPersist) return;
323
-
324
- let effectiveValue: unknown;
325
- let effectiveSource: ValueSource;
326
-
327
- if (field.kind === "custom") {
328
- const resolved = field.resolve(scope, cwd, ctx);
329
- effectiveValue = resolved.editValue ?? resolved.displayValue;
330
- effectiveSource = resolved.source;
331
- } else {
332
- const projectRaw = loadSupiConfigSectionForScope(options.section, cwd, {
333
- scope: "project",
334
- homeDir: options.homeDir,
335
- });
336
- const globalRaw = loadSupiConfigSectionForScope(options.section, cwd, {
337
- scope: "global",
338
- homeDir: options.homeDir,
339
- });
340
- const resolved = resolveValue(field.key, options.defaults, projectRaw, globalRaw, scope);
341
- effectiveValue = resolved.value;
342
- effectiveSource = resolved.source;
343
- }
344
-
345
- const change: SettingsPersistedChange = {
346
- scope,
347
- cwd,
348
- fieldKey: field.key,
349
- action: action.kind === "set" ? "set" : "delete",
350
- effectiveValue,
351
- effectiveSource,
352
- };
353
- if (action.kind === "set") change.storedValue = storedValue;
354
- options.afterPersist(change);
355
- }
356
-
357
- function toDeclarativeSection(options: DeclarativeSettingsOptions): SettingsSection {
358
- const defaults = options.defaults as Record<string, unknown>;
359
- return {
360
- id: options.id,
361
- label: options.label,
362
- loadValues: (scope, cwd, ctx) => {
363
- // Load raw section data for both scopes (no defaults)
364
- const projectRaw = loadSupiConfigSectionForScope(options.section, cwd, {
365
- scope: "project",
366
- homeDir: options.homeDir,
367
- });
368
- const globalRaw = loadSupiConfigSectionForScope(options.section, cwd, {
369
- scope: "global",
370
- homeDir: options.homeDir,
371
- });
372
-
373
- // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: natural discriminator on field kind and source
374
- return options.fields.map((field) => {
375
- if (field.kind === "custom") {
376
- const resolved = field.resolve(scope, cwd, ctx);
377
- return {
378
- field,
379
- displayValue: resolved.displayValue
380
- ? sourceBadge(resolved.displayValue, resolved.source)
381
- : "",
382
- editValue: resolved.editValue ?? resolved.displayValue,
383
- source: resolved.source,
384
- inheritanceSource: resolved.inheritanceSource,
385
- };
386
- }
387
-
388
- const { value, source } = resolveValue(field.key, defaults, projectRaw, globalRaw, scope);
389
- const displayValue = formatValue(value, field);
390
-
391
- // Compute inheritanceSource for project-scope overrides
392
- let inheritanceSource: "global" | "default" | undefined;
393
- if (scope === "project" && source === "project") {
394
- inheritanceSource = globalRaw && field.key in globalRaw ? "global" : "default";
395
- }
396
-
397
- return {
398
- field,
399
- displayValue: sourceBadge(displayValue, source),
400
- editValue: formatEditValue(value, field),
401
- source,
402
- inheritanceSource,
403
- };
404
- });
405
- },
406
- // biome-ignore lint/complexity/useMaxParams: SettingsSection action handlers receive scope, cwd, field, action, and optional context
407
- handleAction: (scope, cwd, fieldKey, action, ctx) => {
408
- const field = options.fields.find((f) => f.key === fieldKey);
409
- if (!field) return;
410
-
411
- const section = options.section;
412
- const helpers = createConfigHelpers(section, scope, cwd, options.homeDir);
413
- let storedValue: unknown;
414
-
415
- if (field.kind === "custom") {
416
- field.persist(scope, cwd, action, helpers);
417
- storedValue = action.kind === "set" ? action.value : undefined;
418
- notifyAfterPersist({ options, field, scope, cwd, action, storedValue, ctx });
419
- return;
420
- }
421
-
422
- switch (action.kind) {
423
- case "set": {
424
- storedValue = parseTypedValue(action.value, field);
425
- helpers.set(field.key, storedValue);
426
- break;
427
- }
428
- case "inherit":
429
- case "resetToDefault": {
430
- helpers.unset(field.key);
431
- break;
432
- }
433
- }
434
-
435
- notifyAfterPersist({ options, field, scope, cwd, action, storedValue, ctx });
436
- },
437
- };
438
- }
439
-
440
- // ── Typed value parsing ───────────────────────────────────────────────────
441
-
442
- /** Parse a user-supplied string value into the typed config value for the field. */
443
- export function parseTypedValue(value: string, field: SettingsField): unknown {
444
- switch (field.kind) {
445
- case "boolean":
446
- return value === "on";
447
- case "number": {
448
- if (!/^[1-9]\d*$/.test(value.trim())) {
449
- throw new Error(
450
- `Invalid value for "${field.label}": "${value}". Enter a positive integer.`,
451
- );
452
- }
453
- return Number.parseInt(value, 10);
454
- }
455
- case "stringList":
456
- return value
457
- .split(",")
458
- .map((s) => s.trim())
459
- .filter((s) => s.length > 0);
460
- default:
461
- return value;
462
- }
463
- }
464
-
465
- // ── Registration ──────────────────────────────────────────────────────────
466
-
467
- /**
468
- * Register a declarative settings contribution for `/supi-settings`.
469
- *
470
- * Contributions are collected through PI's process-local event bus. Call this
471
- * during the extension factory function, not in async session handlers.
472
- */
473
- export function registerDeclarativeSettings(
474
- pi: ExtensionAPI,
475
- options: DeclarativeSettingsOptions,
476
- ): void {
477
- const section = toDeclarativeSection(options);
478
- const dispose = pi.events.on(SUPI_SETTINGS_COLLECT_EVENT, (collector) => {
479
- if (isSettingsContributionCollector(collector)) {
480
- collector.add(section);
481
- }
482
- });
483
-
484
- pi.on("session_shutdown", () => {
485
- dispose();
486
- });
487
- }
@@ -1,141 +0,0 @@
1
- // Submenu helpers for SuPi settings.
2
- //
3
- // Reusable pi-tui submenu components shared across the settings overlay
4
- // and available to extensions for custom settings controls.
5
-
6
- import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
7
- import {
8
- Container,
9
- Input,
10
- Key,
11
- matchesKey,
12
- type SelectItem,
13
- SelectList,
14
- Text,
15
- } from "@earendil-works/pi-tui";
16
- import { getSelectableModels } from "../model-selection.ts";
17
- import type { ModelPickerField } from "./settings-schema.ts";
18
-
19
- /**
20
- * Creates a pi-tui Input-backed submenu component with enter-to-confirm
21
- * and escape-to-cancel handling.
22
- */
23
- export function createInputSubmenu(
24
- currentValue: string,
25
- label: string,
26
- done: (selectedValue?: string) => void,
27
- ): {
28
- render: (width: number) => string[];
29
- invalidate: () => void;
30
- handleInput: (data: string) => boolean;
31
- } {
32
- const input = new Input();
33
- input.setValue(currentValue);
34
-
35
- return {
36
- render: (_width: number) => {
37
- const lines = [` ${label}`];
38
- lines.push(...input.render(_width));
39
- lines.push(" enter confirm • esc cancel");
40
- return lines;
41
- },
42
- invalidate: () => {
43
- input.invalidate();
44
- },
45
- handleInput: (data: string) => {
46
- if (matchesKey(data, Key.escape)) {
47
- done();
48
- return true;
49
- }
50
- if (matchesKey(data, Key.enter)) {
51
- done(input.getValue());
52
- return true;
53
- }
54
- input.handleInput(data);
55
- return true;
56
- },
57
- };
58
- }
59
-
60
- /**
61
- * Creates a model picker submenu backed by the scoped model set.
62
- *
63
- * The built-in `disabled` choice remains enabled by default. Callers can add
64
- * host-owned static choices or omit `disabled` through the field options.
65
- */
66
- export function createModelPickerSubmenu(
67
- currentValue: string,
68
- done: (selectedValue?: string) => void,
69
- ctx?: ExtensionContext,
70
- options: Pick<ModelPickerField, "includeDisabled" | "staticOptions"> = {},
71
- ): {
72
- render: (width: number) => string[];
73
- invalidate: () => void;
74
- handleInput: (data: string) => boolean;
75
- } {
76
- const items = buildModelItems(ctx, options);
77
- const initialIndex = Math.max(
78
- 0,
79
- items.findIndex((item) => item.value === currentValue),
80
- );
81
-
82
- const container = new Container();
83
- container.addChild(new Text(" Select model", 1, 0));
84
- container.addChild(new Text("", 1, 0));
85
-
86
- const selectList = new SelectList(items, Math.min(items.length, 15), {
87
- selectedPrefix: (t) => `› ${t}`,
88
- selectedText: (t) => t,
89
- description: (t) => t,
90
- scrollInfo: (t) => t,
91
- noMatch: (t) => t,
92
- });
93
- if (initialIndex >= 0) selectList.setSelectedIndex(initialIndex);
94
- selectList.onSelect = (item) => done(item.value);
95
- selectList.onCancel = () => done();
96
-
97
- container.addChild(selectList);
98
- container.addChild(new Text(" ↑↓ navigate • enter select • esc cancel", 1, 0));
99
-
100
- return {
101
- render: (width: number) => container.render(width),
102
- invalidate: () => container.invalidate(),
103
- handleInput: (data: string) => {
104
- selectList.handleInput(data);
105
- return true;
106
- },
107
- };
108
- }
109
-
110
- /** Build static choices followed by the selectable scoped models. */
111
- function buildModelItems(
112
- ctx: ExtensionContext | undefined,
113
- options: Pick<ModelPickerField, "includeDisabled" | "staticOptions">,
114
- ): SelectItem[] {
115
- const items: SelectItem[] = [];
116
- const seen = new Set<string>();
117
- for (const option of options.staticOptions ?? []) {
118
- if (seen.has(option.value)) continue;
119
- items.push({ ...option });
120
- seen.add(option.value);
121
- }
122
-
123
- if (options.includeDisabled !== false && !seen.has("disabled")) {
124
- items.push({ value: "disabled", label: "disabled", description: "No model selected" });
125
- seen.add("disabled");
126
- }
127
-
128
- if (!ctx) return items;
129
- const models = getSelectableModels(ctx);
130
- for (const model of models) {
131
- if (seen.has(model.canonicalId)) continue;
132
- const suffix = model.isCurrent ? " [current]" : "";
133
- items.push({
134
- value: model.canonicalId,
135
- label: `${model.canonicalId}${suffix}`,
136
- description: model.label !== model.canonicalId ? model.label : undefined,
137
- });
138
- seen.add(model.canonicalId);
139
- }
140
- return items;
141
- }