@mrclrchtr/supi-code-intelligence 3.2.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +154 -435
- package/node_modules/@mrclrchtr/supi-code-runtime/README.md +8 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +2 -4
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/api.ts +0 -4
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/evidence-badge.ts +3 -2
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/index.ts +0 -4
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/llm.ts +0 -10
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/path-utils.ts +19 -15
- package/node_modules/@mrclrchtr/supi-code-runtime/package.json +2 -2
- package/node_modules/@mrclrchtr/supi-code-runtime/src/api.ts +10 -1
- package/node_modules/@mrclrchtr/supi-code-runtime/src/capability/types.ts +19 -29
- package/node_modules/@mrclrchtr/supi-code-runtime/src/index.ts +7 -1
- package/node_modules/@mrclrchtr/supi-code-runtime/src/query-result.ts +42 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/src/types.ts +15 -10
- package/node_modules/@mrclrchtr/supi-core/package.json +2 -4
- package/node_modules/@mrclrchtr/supi-core/src/api.ts +0 -4
- package/node_modules/@mrclrchtr/supi-core/src/evidence-badge.ts +3 -2
- package/node_modules/@mrclrchtr/supi-core/src/index.ts +0 -4
- package/node_modules/@mrclrchtr/supi-core/src/llm.ts +0 -10
- package/node_modules/@mrclrchtr/supi-core/src/path-utils.ts +19 -15
- package/node_modules/@mrclrchtr/supi-lsp/README.md +72 -62
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/README.md +8 -0
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +2 -4
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/api.ts +0 -4
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/evidence-badge.ts +3 -2
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/index.ts +0 -4
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/llm.ts +0 -10
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/path-utils.ts +19 -15
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/package.json +2 -2
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/api.ts +10 -1
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/capability/types.ts +19 -29
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/index.ts +7 -1
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/query-result.ts +42 -0
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/types.ts +15 -10
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/package.json +2 -4
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/api.ts +0 -4
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/evidence-badge.ts +3 -2
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/index.ts +0 -4
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/llm.ts +0 -10
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/path-utils.ts +19 -15
- package/node_modules/@mrclrchtr/supi-lsp/package.json +4 -5
- package/node_modules/@mrclrchtr/supi-lsp/src/api.ts +9 -9
- package/node_modules/@mrclrchtr/supi-lsp/src/client/client.ts +70 -41
- package/node_modules/@mrclrchtr/supi-lsp/src/client/transport.ts +16 -13
- package/node_modules/@mrclrchtr/supi-lsp/src/config/config.ts +2 -2
- package/node_modules/@mrclrchtr/supi-lsp/src/config/lsp-settings.ts +0 -2
- package/node_modules/@mrclrchtr/supi-lsp/src/index.ts +6 -6
- package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-diagnostics.ts +5 -95
- package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-workspace-recovery.ts +4 -3
- package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-workspace-symbol.ts +44 -6
- package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager.ts +47 -65
- package/node_modules/@mrclrchtr/supi-lsp/src/provider/lsp-semantic-provider.ts +132 -79
- package/node_modules/@mrclrchtr/supi-lsp/src/provider/refactor-planning.ts +6 -14
- package/node_modules/@mrclrchtr/supi-lsp/src/session/readiness.ts +38 -0
- package/node_modules/@mrclrchtr/supi-lsp/src/session/runtime-controller.ts +87 -75
- package/node_modules/@mrclrchtr/supi-lsp/src/session/runtime-registration.ts +5 -5
- package/node_modules/@mrclrchtr/supi-lsp/src/session/{service-registry.ts → runtime-registry.ts} +163 -71
- package/node_modules/@mrclrchtr/supi-tree-sitter/README.md +4 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/README.md +8 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +2 -4
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/api.ts +0 -4
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/evidence-badge.ts +3 -2
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/index.ts +0 -4
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/llm.ts +0 -10
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/path-utils.ts +19 -15
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/package.json +2 -2
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/api.ts +10 -1
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/capability/types.ts +19 -29
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/index.ts +7 -1
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/query-result.ts +42 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/types.ts +15 -10
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/package.json +2 -4
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/api.ts +0 -4
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/evidence-badge.ts +3 -2
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/index.ts +0 -4
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/llm.ts +0 -10
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/path-utils.ts +19 -15
- package/node_modules/@mrclrchtr/supi-tree-sitter/package.json +4 -21
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/bash/tree-sitter-bash.wasm +0 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/bash/tree-sitter-bash.wasm.json +2 -2
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/c/tree-sitter-c.wasm +0 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/c/tree-sitter-c.wasm.json +2 -2
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/go/tree-sitter-go.wasm +0 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/go/tree-sitter-go.wasm.json +2 -2
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/javascript/tree-sitter-javascript.wasm +0 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/javascript/tree-sitter-javascript.wasm.json +2 -2
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/kotlin/tree-sitter-kotlin.wasm +0 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/kotlin/tree-sitter-kotlin.wasm.json +2 -2
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/python/tree-sitter-python.wasm +0 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/python/tree-sitter-python.wasm.json +2 -2
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/r/tree-sitter-r.wasm +0 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/r/tree-sitter-r.wasm.json +2 -2
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/rust/tree-sitter-rust.wasm.json +1 -1
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/sql/tree-sitter-sql.wasm +0 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/sql/tree-sitter-sql.wasm.json +3 -3
- package/node_modules/@mrclrchtr/supi-tree-sitter/scripts/generate-kotlin-wasm.mjs +6 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/scripts/generate-sql-wasm.mjs +18 -4
- package/node_modules/@mrclrchtr/supi-tree-sitter/scripts/vendor-wasm.mjs +17 -1
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/api.ts +2 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/coordinates.ts +20 -41
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/index.ts +2 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/language.ts +7 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/operation-support.ts +40 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/session/session.ts +9 -7
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/call-sites.ts +6 -1
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/callees.ts +76 -37
- package/node_modules/yaml/LICENSE +13 -0
- package/node_modules/yaml/README.md +172 -0
- package/node_modules/yaml/bin.mjs +11 -0
- package/node_modules/yaml/browser/dist/compose/compose-collection.js +88 -0
- package/node_modules/yaml/browser/dist/compose/compose-doc.js +43 -0
- package/node_modules/yaml/browser/dist/compose/compose-node.js +109 -0
- package/node_modules/yaml/browser/dist/compose/compose-scalar.js +86 -0
- package/node_modules/yaml/browser/dist/compose/composer.js +219 -0
- package/node_modules/yaml/browser/dist/compose/resolve-block-map.js +115 -0
- package/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +198 -0
- package/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +49 -0
- package/node_modules/yaml/browser/dist/compose/resolve-end.js +37 -0
- package/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +207 -0
- package/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +225 -0
- package/node_modules/yaml/browser/dist/compose/resolve-props.js +146 -0
- package/node_modules/yaml/browser/dist/compose/util-contains-newline.js +34 -0
- package/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +26 -0
- package/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +15 -0
- package/node_modules/yaml/browser/dist/compose/util-map-includes.js +13 -0
- package/node_modules/yaml/browser/dist/doc/Document.js +335 -0
- package/node_modules/yaml/browser/dist/doc/anchors.js +71 -0
- package/node_modules/yaml/browser/dist/doc/applyReviver.js +55 -0
- package/node_modules/yaml/browser/dist/doc/createNode.js +88 -0
- package/node_modules/yaml/browser/dist/doc/directives.js +176 -0
- package/node_modules/yaml/browser/dist/errors.js +57 -0
- package/node_modules/yaml/browser/dist/index.js +17 -0
- package/node_modules/yaml/browser/dist/log.js +11 -0
- package/node_modules/yaml/browser/dist/nodes/Alias.js +116 -0
- package/node_modules/yaml/browser/dist/nodes/Collection.js +147 -0
- package/node_modules/yaml/browser/dist/nodes/Node.js +38 -0
- package/node_modules/yaml/browser/dist/nodes/Pair.js +36 -0
- package/node_modules/yaml/browser/dist/nodes/Scalar.js +24 -0
- package/node_modules/yaml/browser/dist/nodes/YAMLMap.js +144 -0
- package/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +113 -0
- package/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +63 -0
- package/node_modules/yaml/browser/dist/nodes/identity.js +36 -0
- package/node_modules/yaml/browser/dist/nodes/toJS.js +37 -0
- package/node_modules/yaml/browser/dist/parse/cst-scalar.js +214 -0
- package/node_modules/yaml/browser/dist/parse/cst-stringify.js +61 -0
- package/node_modules/yaml/browser/dist/parse/cst-visit.js +97 -0
- package/node_modules/yaml/browser/dist/parse/cst.js +98 -0
- package/node_modules/yaml/browser/dist/parse/lexer.js +721 -0
- package/node_modules/yaml/browser/dist/parse/line-counter.js +39 -0
- package/node_modules/yaml/browser/dist/parse/parser.js +975 -0
- package/node_modules/yaml/browser/dist/public-api.js +102 -0
- package/node_modules/yaml/browser/dist/schema/Schema.js +37 -0
- package/node_modules/yaml/browser/dist/schema/common/map.js +17 -0
- package/node_modules/yaml/browser/dist/schema/common/null.js +15 -0
- package/node_modules/yaml/browser/dist/schema/common/seq.js +17 -0
- package/node_modules/yaml/browser/dist/schema/common/string.js +14 -0
- package/node_modules/yaml/browser/dist/schema/core/bool.js +19 -0
- package/node_modules/yaml/browser/dist/schema/core/float.js +43 -0
- package/node_modules/yaml/browser/dist/schema/core/int.js +38 -0
- package/node_modules/yaml/browser/dist/schema/core/schema.js +23 -0
- package/node_modules/yaml/browser/dist/schema/json/schema.js +62 -0
- package/node_modules/yaml/browser/dist/schema/tags.js +96 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +58 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +26 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +46 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +71 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +67 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +74 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +78 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +39 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +93 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
- package/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +146 -0
- package/node_modules/yaml/browser/dist/stringify/stringify.js +129 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +153 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyComment.js +20 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +85 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +25 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyPair.js +150 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyString.js +336 -0
- package/node_modules/yaml/browser/dist/util.js +11 -0
- package/node_modules/yaml/browser/dist/visit.js +233 -0
- package/node_modules/yaml/browser/index.js +5 -0
- package/node_modules/yaml/browser/package.json +3 -0
- package/node_modules/yaml/dist/cli.d.ts +8 -0
- package/node_modules/yaml/dist/cli.mjs +201 -0
- package/node_modules/yaml/dist/compose/compose-collection.d.ts +11 -0
- package/node_modules/yaml/dist/compose/compose-collection.js +90 -0
- package/node_modules/yaml/dist/compose/compose-doc.d.ts +7 -0
- package/node_modules/yaml/dist/compose/compose-doc.js +45 -0
- package/node_modules/yaml/dist/compose/compose-node.d.ts +29 -0
- package/node_modules/yaml/dist/compose/compose-node.js +112 -0
- package/node_modules/yaml/dist/compose/compose-scalar.d.ts +5 -0
- package/node_modules/yaml/dist/compose/compose-scalar.js +88 -0
- package/node_modules/yaml/dist/compose/composer.d.ts +63 -0
- package/node_modules/yaml/dist/compose/composer.js +224 -0
- package/node_modules/yaml/dist/compose/resolve-block-map.d.ts +6 -0
- package/node_modules/yaml/dist/compose/resolve-block-map.js +117 -0
- package/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
- package/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
- package/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
- package/node_modules/yaml/dist/compose/resolve-block-seq.js +51 -0
- package/node_modules/yaml/dist/compose/resolve-end.d.ts +6 -0
- package/node_modules/yaml/dist/compose/resolve-end.js +39 -0
- package/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
- package/node_modules/yaml/dist/compose/resolve-flow-collection.js +209 -0
- package/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
- package/node_modules/yaml/dist/compose/resolve-flow-scalar.js +227 -0
- package/node_modules/yaml/dist/compose/resolve-props.d.ts +23 -0
- package/node_modules/yaml/dist/compose/resolve-props.js +148 -0
- package/node_modules/yaml/dist/compose/util-contains-newline.d.ts +2 -0
- package/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
- package/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
- package/node_modules/yaml/dist/compose/util-empty-scalar-position.js +28 -0
- package/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
- package/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
- package/node_modules/yaml/dist/compose/util-map-includes.d.ts +4 -0
- package/node_modules/yaml/dist/compose/util-map-includes.js +15 -0
- package/node_modules/yaml/dist/doc/Document.d.ts +141 -0
- package/node_modules/yaml/dist/doc/Document.js +337 -0
- package/node_modules/yaml/dist/doc/anchors.d.ts +24 -0
- package/node_modules/yaml/dist/doc/anchors.js +76 -0
- package/node_modules/yaml/dist/doc/applyReviver.d.ts +9 -0
- package/node_modules/yaml/dist/doc/applyReviver.js +57 -0
- package/node_modules/yaml/dist/doc/createNode.d.ts +17 -0
- package/node_modules/yaml/dist/doc/createNode.js +90 -0
- package/node_modules/yaml/dist/doc/directives.d.ts +49 -0
- package/node_modules/yaml/dist/doc/directives.js +178 -0
- package/node_modules/yaml/dist/errors.d.ts +21 -0
- package/node_modules/yaml/dist/errors.js +62 -0
- package/node_modules/yaml/dist/index.d.ts +25 -0
- package/node_modules/yaml/dist/index.js +50 -0
- package/node_modules/yaml/dist/log.d.ts +3 -0
- package/node_modules/yaml/dist/log.js +19 -0
- package/node_modules/yaml/dist/nodes/Alias.d.ts +29 -0
- package/node_modules/yaml/dist/nodes/Alias.js +118 -0
- package/node_modules/yaml/dist/nodes/Collection.d.ts +73 -0
- package/node_modules/yaml/dist/nodes/Collection.js +151 -0
- package/node_modules/yaml/dist/nodes/Node.d.ts +53 -0
- package/node_modules/yaml/dist/nodes/Node.js +40 -0
- package/node_modules/yaml/dist/nodes/Pair.d.ts +22 -0
- package/node_modules/yaml/dist/nodes/Pair.js +39 -0
- package/node_modules/yaml/dist/nodes/Scalar.d.ts +47 -0
- package/node_modules/yaml/dist/nodes/Scalar.js +27 -0
- package/node_modules/yaml/dist/nodes/YAMLMap.d.ts +53 -0
- package/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
- package/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
- package/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
- package/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
- package/node_modules/yaml/dist/nodes/addPairToJSMap.js +65 -0
- package/node_modules/yaml/dist/nodes/identity.d.ts +23 -0
- package/node_modules/yaml/dist/nodes/identity.js +53 -0
- package/node_modules/yaml/dist/nodes/toJS.d.ts +29 -0
- package/node_modules/yaml/dist/nodes/toJS.js +39 -0
- package/node_modules/yaml/dist/options.d.ts +350 -0
- package/node_modules/yaml/dist/parse/cst-scalar.d.ts +64 -0
- package/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
- package/node_modules/yaml/dist/parse/cst-stringify.d.ts +8 -0
- package/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
- package/node_modules/yaml/dist/parse/cst-visit.d.ts +39 -0
- package/node_modules/yaml/dist/parse/cst-visit.js +99 -0
- package/node_modules/yaml/dist/parse/cst.d.ts +109 -0
- package/node_modules/yaml/dist/parse/cst.js +112 -0
- package/node_modules/yaml/dist/parse/lexer.d.ts +87 -0
- package/node_modules/yaml/dist/parse/lexer.js +723 -0
- package/node_modules/yaml/dist/parse/line-counter.d.ts +22 -0
- package/node_modules/yaml/dist/parse/line-counter.js +41 -0
- package/node_modules/yaml/dist/parse/parser.d.ts +84 -0
- package/node_modules/yaml/dist/parse/parser.js +980 -0
- package/node_modules/yaml/dist/public-api.d.ts +44 -0
- package/node_modules/yaml/dist/public-api.js +107 -0
- package/node_modules/yaml/dist/schema/Schema.d.ts +17 -0
- package/node_modules/yaml/dist/schema/Schema.js +39 -0
- package/node_modules/yaml/dist/schema/common/map.d.ts +2 -0
- package/node_modules/yaml/dist/schema/common/map.js +19 -0
- package/node_modules/yaml/dist/schema/common/null.d.ts +4 -0
- package/node_modules/yaml/dist/schema/common/null.js +17 -0
- package/node_modules/yaml/dist/schema/common/seq.d.ts +2 -0
- package/node_modules/yaml/dist/schema/common/seq.js +19 -0
- package/node_modules/yaml/dist/schema/common/string.d.ts +2 -0
- package/node_modules/yaml/dist/schema/common/string.js +16 -0
- package/node_modules/yaml/dist/schema/core/bool.d.ts +4 -0
- package/node_modules/yaml/dist/schema/core/bool.js +21 -0
- package/node_modules/yaml/dist/schema/core/float.d.ts +4 -0
- package/node_modules/yaml/dist/schema/core/float.js +47 -0
- package/node_modules/yaml/dist/schema/core/int.d.ts +4 -0
- package/node_modules/yaml/dist/schema/core/int.js +42 -0
- package/node_modules/yaml/dist/schema/core/schema.d.ts +1 -0
- package/node_modules/yaml/dist/schema/core/schema.js +25 -0
- package/node_modules/yaml/dist/schema/json/schema.d.ts +2 -0
- package/node_modules/yaml/dist/schema/json/schema.js +64 -0
- package/node_modules/yaml/dist/schema/json-schema.d.ts +69 -0
- package/node_modules/yaml/dist/schema/tags.d.ts +48 -0
- package/node_modules/yaml/dist/schema/tags.js +99 -0
- package/node_modules/yaml/dist/schema/types.d.ts +92 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/binary.js +70 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/merge.js +71 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +22 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/schema.js +41 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
- package/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
- package/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
- package/node_modules/yaml/dist/stringify/stringify.d.ts +21 -0
- package/node_modules/yaml/dist/stringify/stringify.js +132 -0
- package/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
- package/node_modules/yaml/dist/stringify/stringifyCollection.js +155 -0
- package/node_modules/yaml/dist/stringify/stringifyComment.d.ts +10 -0
- package/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
- package/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
- package/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
- package/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
- package/node_modules/yaml/dist/stringify/stringifyNumber.js +27 -0
- package/node_modules/yaml/dist/stringify/stringifyPair.d.ts +3 -0
- package/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
- package/node_modules/yaml/dist/stringify/stringifyString.d.ts +9 -0
- package/node_modules/yaml/dist/stringify/stringifyString.js +338 -0
- package/node_modules/yaml/dist/test-events.d.ts +4 -0
- package/node_modules/yaml/dist/test-events.js +134 -0
- package/node_modules/yaml/dist/util.d.ts +16 -0
- package/node_modules/yaml/dist/util.js +28 -0
- package/node_modules/yaml/dist/visit.d.ts +102 -0
- package/node_modules/yaml/dist/visit.js +236 -0
- package/node_modules/yaml/package.json +97 -0
- package/node_modules/yaml/util.js +2 -0
- package/package.json +9 -8
- package/src/analysis/architecture/discovery.ts +213 -227
- package/src/analysis/architecture/manifest.ts +147 -0
- package/src/analysis/architecture/model.ts +119 -52
- package/src/analysis/architecture/workspace-config.ts +229 -0
- package/src/analysis/{coverage/coverage-warnings.ts → capability/capability-warnings.ts} +41 -78
- package/src/analysis/evidence.ts +22 -5
- package/src/analysis/health/diagnostics.ts +183 -0
- package/src/analysis/health/recovery.ts +39 -0
- package/src/analysis/health/signals.ts +20 -0
- package/src/analysis/instruction-files.ts +60 -48
- package/src/analysis/provider.ts +31 -12
- package/src/analysis/readiness.ts +29 -9
- package/src/{tool/refactor-apply → analysis/refactor}/apply.ts +120 -26
- package/src/analysis/refactor/position.ts +6 -0
- package/src/analysis/refactor/safety.ts +4 -11
- package/src/analysis/references/locations.ts +20 -0
- package/src/analysis/references/semantic-refs.ts +21 -11
- package/src/{tool/graph → analysis/relations}/implementations.ts +27 -23
- package/src/analysis/relations/provider-locations.ts +179 -0
- package/src/{tool/graph → analysis/relations}/references.ts +25 -21
- package/src/{tool/graph → analysis/relations}/types.ts +4 -19
- package/src/analysis/search/ast-scan.ts +376 -0
- package/src/analysis/search/call-name.ts +68 -0
- package/src/analysis/search/deadline.ts +84 -0
- package/src/analysis/search/paths.ts +88 -0
- package/src/analysis/search/pattern.ts +290 -246
- package/src/analysis/target/anchored.ts +72 -27
- package/src/analysis/target/file.ts +292 -132
- package/src/analysis/target/identity.ts +237 -0
- package/src/analysis/target/symbol.ts +169 -86
- package/src/analysis/target/types.ts +36 -4
- package/src/api.ts +21 -4
- package/src/app/app.ts +53 -46
- package/src/extension.ts +68 -66
- package/src/session/capability-adapter.ts +26 -118
- package/src/session/find-types.ts +38 -0
- package/src/session/find-workflow.ts +141 -0
- package/src/session/graph/collect.ts +181 -0
- package/src/session/graph-types.ts +77 -0
- package/src/session/graph-workflow.ts +152 -0
- package/src/session/health-types.ts +134 -0
- package/src/session/health-workflow.ts +341 -0
- package/src/session/input/common.ts +216 -0
- package/src/session/input/health-refactor.ts +169 -0
- package/src/session/input/workflows.ts +211 -0
- package/src/session/inspect/collect.ts +304 -0
- package/src/session/inspect/file-point.ts +69 -0
- package/src/session/inspect-types.ts +78 -0
- package/src/session/inspect-workflow.ts +157 -0
- package/src/session/orientation/collect.ts +718 -0
- package/src/session/orientation/context-facts.ts +319 -0
- package/src/session/orientation/context-sections.ts +352 -0
- package/src/session/orientation-types.ts +97 -0
- package/src/session/orientation-workflow.ts +307 -0
- package/src/session/refactor-plans.ts +1 -1
- package/src/session/refactor-types.ts +51 -0
- package/src/session/refactor-workflow.ts +263 -0
- package/src/session/session.ts +263 -234
- package/src/session/target-candidates.ts +60 -0
- package/src/session/target-input.ts +98 -0
- package/src/session/target-store.ts +132 -29
- package/src/session/target-workflow.ts +254 -302
- package/src/session/workflow-control.ts +35 -0
- package/src/substrate/lsp/lifecycle.ts +9 -22
- package/src/substrate/lsp/maintenance.ts +75 -0
- package/src/substrate/lsp/recovery.ts +41 -25
- package/src/substrate/lsp/settings.ts +1 -10
- package/src/substrate/lsp/state.ts +2 -13
- package/src/tool/find/ast-kinds.ts +35 -0
- package/src/tool/find/execute.ts +22 -113
- package/src/tool/find/markdown.ts +85 -221
- package/src/tool/find/modes.ts +5 -0
- package/src/tool/find/render.ts +57 -0
- package/src/tool/find/tui.ts +1 -1
- package/src/tool/graph/calls-md.ts +17 -30
- package/src/tool/graph/execute.ts +42 -103
- package/src/tool/graph/implementations-md.ts +32 -54
- package/src/tool/graph/markdown-base.ts +73 -196
- package/src/tool/graph/provider-location-md.ts +9 -0
- package/src/tool/graph/references-md.ts +34 -27
- package/src/tool/graph/tui.ts +8 -26
- package/src/tool/guidance.ts +31 -48
- package/src/tool/health/execute.ts +15 -56
- package/src/tool/health/markdown.ts +199 -148
- package/src/tool/health/semantic-state.ts +24 -0
- package/src/tool/health/tui.ts +262 -36
- package/src/tool/infra/error-results.ts +0 -2
- package/src/tool/infra/progress.ts +2 -2
- package/src/tool/infra/workflow-control.ts +11 -0
- package/src/tool/inspect/execute.ts +23 -63
- package/src/tool/inspect/markdown.ts +114 -95
- package/src/tool/inspect/tui.ts +7 -7
- package/src/tool/orientation/execute.ts +50 -37
- package/src/tool/orientation/markdown.ts +26 -31
- package/src/tool/orientation/tui.ts +41 -39
- package/src/tool/refactor-apply/execute.ts +23 -9
- package/src/tool/refactor-apply/tui.ts +7 -3
- package/src/tool/refactor-plan/execute.ts +44 -61
- package/src/tool/refactor-plan/markdown.ts +33 -56
- package/src/tool/refactor-plan/tui.ts +10 -11
- package/src/tool/register.ts +6 -5
- package/src/tool/resolve/execute.ts +23 -69
- package/src/tool/resolve/markdown.ts +125 -114
- package/src/tool/resolve/tui.ts +11 -9
- package/src/tool/result/assembly.ts +125 -0
- package/src/tool/result/errors.ts +20 -34
- package/src/tool/result/find.ts +107 -21
- package/src/tool/result/graph.ts +163 -64
- package/src/tool/result/health.ts +170 -73
- package/src/tool/result/inspect.ts +183 -41
- package/src/tool/result/orientation.ts +118 -16
- package/src/tool/result/refactor.ts +101 -21
- package/src/tool/result/resolve.ts +243 -80
- package/src/tool/result/types.ts +100 -56
- package/src/tool/schemas.ts +160 -231
- package/src/tool/specs.ts +57 -168
- package/src/types/details.ts +2 -4
- package/src/types/execution.ts +6 -15
- package/src/types/index.ts +2 -4
- package/src/types/tool-names.ts +1 -2
- package/src/ui/footer.ts +3 -3
- package/src/ui/markdown/gather.ts +17 -65
- package/src/ui/markdown/overview-data.ts +143 -21
- package/src/ui/markdown/overview.ts +27 -8
- package/src/ui/markdown/types.ts +12 -16
- package/src/ui/status-command.ts +39 -31
- package/src/ui/status-overlay.ts +23 -15
- package/src/ui/tui/common.ts +121 -74
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +0 -31
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +0 -11
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/types.ts +0 -2
- package/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +0 -31
- package/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +0 -11
- package/node_modules/@mrclrchtr/supi-core/src/types.ts +0 -2
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +0 -31
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +0 -11
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/types.ts +0 -2
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +0 -31
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +0 -11
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/types.ts +0 -2
- package/node_modules/@mrclrchtr/supi-lsp/src/diagnostics/diagnostic-augmentation.ts +0 -82
- package/node_modules/@mrclrchtr/supi-lsp/src/diagnostics/diagnostic-context.ts +0 -116
- package/node_modules/@mrclrchtr/supi-lsp/src/diagnostics/diagnostic-display.ts +0 -69
- package/node_modules/@mrclrchtr/supi-lsp/src/manager/capability-index.ts +0 -24
- package/node_modules/@mrclrchtr/supi-lsp/src/manager/client-pool.ts +0 -33
- package/node_modules/@mrclrchtr/supi-lsp/src/manager/diagnostic-store.ts +0 -51
- package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-stale-resync.ts +0 -47
- package/node_modules/@mrclrchtr/supi-lsp/src/manager/recovery-coordinator.ts +0 -37
- package/node_modules/@mrclrchtr/supi-lsp/src/manager/workspace-router.ts +0 -44
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +0 -31
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +0 -11
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/types.ts +0 -2
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +0 -31
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +0 -11
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/types.ts +0 -2
- package/src/analysis/brief/directory.ts +0 -324
- package/src/analysis/brief/enrich.ts +0 -157
- package/src/analysis/brief/file.ts +0 -84
- package/src/analysis/brief/inventory.ts +0 -177
- package/src/analysis/brief/main.ts +0 -176
- package/src/analysis/brief/models.ts +0 -75
- package/src/analysis/brief/public-brief.ts +0 -179
- package/src/analysis/brief/summarize.ts +0 -208
- package/src/analysis/brief/types.ts +0 -27
- package/src/analysis/brief/use-case.ts +0 -264
- package/src/analysis/search/ripgrep.ts +0 -558
- package/src/analysis/signals/git.ts +0 -89
- package/src/analysis/signals/project.ts +0 -189
- package/src/analysis/target/bridge.ts +0 -152
- package/src/analysis/target/file-resolution.ts +0 -125
- package/src/analysis/target/planner.ts +0 -92
- package/src/analysis/target/query.ts +0 -74
- package/src/analysis/target/resolve-common.ts +0 -115
- package/src/analysis/target/service.ts +0 -229
- package/src/analysis/tests/likely-tests.ts +0 -174
- package/src/analysis/tests/test-discovery.ts +0 -540
- package/src/analysis/tests/vitest.ts +0 -87
- package/src/app/manager.ts +0 -65
- package/src/substrate/lsp/diagnostic-injection.ts +0 -203
- package/src/substrate/lsp/overrides.ts +0 -132
- package/src/tool/find/orchestrate.ts +0 -317
- package/src/tool/find/semantic-search.ts +0 -128
- package/src/tool/graph/collect-relation.ts +0 -372
- package/src/tool/graph/orchestrate.ts +0 -259
- package/src/tool/health/orchestrate.ts +0 -151
- package/src/tool/health/sections/diagnostics.ts +0 -182
- package/src/tool/health/sections/recovery.ts +0 -89
- package/src/tool/health/sections/signals.ts +0 -89
- package/src/tool/impact/analysis.ts +0 -220
- package/src/tool/impact/change-set-impact.ts +0 -152
- package/src/tool/impact/execute.ts +0 -125
- package/src/tool/impact/file-level-impact.ts +0 -82
- package/src/tool/impact/markdown.ts +0 -283
- package/src/tool/impact/orchestrate.ts +0 -97
- package/src/tool/impact/result.ts +0 -2
- package/src/tool/impact/single-impact.ts +0 -90
- package/src/tool/impact/tui.ts +0 -39
- package/src/tool/impact/types.ts +0 -34
- package/src/tool/infra/cross-field.ts +0 -335
- package/src/tool/infra/pipeline.ts +0 -334
- package/src/tool/infra/readiness-message.ts +0 -5
- package/src/tool/inspect/orchestrate.ts +0 -154
- package/src/tool/orientation/deps.ts +0 -63
- package/src/tool/orientation/mode.ts +0 -139
- package/src/tool/orientation/orchestrate.ts +0 -475
- package/src/tool/orientation/precise-target.ts +0 -253
- package/src/tool/params.ts +0 -15
- package/src/tool/refactor-apply/markdown.ts +0 -118
- package/src/tool/refactor-apply/orchestrate.ts +0 -84
- package/src/tool/refactor-plan/orchestrate.ts +0 -355
- package/src/tool/resolve/orchestrate.ts +0 -38
- package/src/tool/result/impact.ts +0 -50
- package/src/ui/markdown/brief.ts +0 -218
- package/src/ui/message-renderer.ts +0 -121
- package/src/ui/tui/index.ts +0 -37
- /package/src/{tool/graph → analysis/relations}/callees.ts +0 -0
|
@@ -1,335 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cross-field validation rules for tool parameters.
|
|
3
|
-
*
|
|
4
|
-
* pi validates structural types, required fields, and enum values against
|
|
5
|
-
* the TypeBox schemas in ./schemas.ts before calling tool executors. These
|
|
6
|
-
* composable rules cover constraints that TypeBox cannot express:
|
|
7
|
-
*
|
|
8
|
-
* - Cross-field requirements (e.g. "query OR file required")
|
|
9
|
-
* - Filesystem checks (e.g. "file exists and is not a directory")
|
|
10
|
-
* - Semantic consistency (e.g. "kind only valid with mode: ast")
|
|
11
|
-
*
|
|
12
|
-
* TypeBox already enforces, and rules here must NOT duplicate:
|
|
13
|
-
* - Required vs optional fields
|
|
14
|
-
* - Enum value membership (StringEnum)
|
|
15
|
-
* - Number ranges (minimum/maximum)
|
|
16
|
-
* - additionalProperties: false
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
import { existsSync, statSync } from "node:fs";
|
|
20
|
-
import { normalizePath } from "../../analysis/search/ripgrep.ts";
|
|
21
|
-
import { inspectParam } from "./pipeline.ts";
|
|
22
|
-
|
|
23
|
-
/** A cross-field validation rule. Returns an error message string or null if valid. */
|
|
24
|
-
export type CrossFieldRule<P> = (params: P, cwd: string) => string | null;
|
|
25
|
-
|
|
26
|
-
/** Compose multiple cross-field rules — stops at the first error. */
|
|
27
|
-
export function composeRules<P>(...rules: CrossFieldRule<P>[]): CrossFieldRule<P> {
|
|
28
|
-
return (params, cwd) => {
|
|
29
|
-
for (const rule of rules) {
|
|
30
|
-
const error = rule(params, cwd);
|
|
31
|
-
if (error) return error;
|
|
32
|
-
}
|
|
33
|
-
return null;
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// ── Primitives ────────────────────────────────────────────────────────
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Require at least one of the named keys to be present and non-empty.
|
|
41
|
-
* A key is "present" when its value is not undefined, null, or empty-string.
|
|
42
|
-
*/
|
|
43
|
-
export function requireAtLeastOne<P>(...keys: (keyof P & string)[]): CrossFieldRule<P> {
|
|
44
|
-
return (params) => {
|
|
45
|
-
const present = keys.filter((k) => {
|
|
46
|
-
const v = inspectParam(params, k);
|
|
47
|
-
return v !== undefined && v !== null && (typeof v !== "string" || v.length > 0);
|
|
48
|
-
});
|
|
49
|
-
if (present.length === 0) {
|
|
50
|
-
const names = keys.map((k) => `\`${k}\``).join(" or ");
|
|
51
|
-
return `**Error:** At least one of ${names} is required.`;
|
|
52
|
-
}
|
|
53
|
-
return null;
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Require that the named keys appear together — all present or all absent.
|
|
59
|
-
* A key is "present" when its value is not undefined or null.
|
|
60
|
-
*/
|
|
61
|
-
export function requirePaired<P>(...keys: (keyof P & string)[]): CrossFieldRule<P> {
|
|
62
|
-
return (params) => {
|
|
63
|
-
const present = keys.map(
|
|
64
|
-
(k) => inspectParam(params, k) !== undefined && inspectParam(params, k) !== null,
|
|
65
|
-
);
|
|
66
|
-
const allPresent = present.every(Boolean);
|
|
67
|
-
const allAbsent = present.every((p) => !p);
|
|
68
|
-
if (!allPresent && !allAbsent) {
|
|
69
|
-
const names = keys.map((k) => `\`${k}\``).join(" and ");
|
|
70
|
-
return `**Error:** ${names} must be provided together.`;
|
|
71
|
-
}
|
|
72
|
-
return null;
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Require that when any of `dependentKeys` is present, `requiredKey` must
|
|
78
|
-
* also be present.
|
|
79
|
-
*/
|
|
80
|
-
export function requireWith<P>(
|
|
81
|
-
requiredKey: keyof P & string,
|
|
82
|
-
...dependentKeys: (keyof P & string)[]
|
|
83
|
-
): CrossFieldRule<P> {
|
|
84
|
-
return (params) => {
|
|
85
|
-
const needed = dependentKeys.some(
|
|
86
|
-
(k) => inspectParam(params, k) !== undefined && inspectParam(params, k) !== null,
|
|
87
|
-
);
|
|
88
|
-
if (
|
|
89
|
-
needed &&
|
|
90
|
-
(inspectParam(params, requiredKey) === undefined ||
|
|
91
|
-
inspectParam(params, requiredKey) === null)
|
|
92
|
-
) {
|
|
93
|
-
const depNames = dependentKeys.map((k) => `\`${k}\``).join(" or ");
|
|
94
|
-
return `**Error:** ${depNames} requires \`${requiredKey}\`.`;
|
|
95
|
-
}
|
|
96
|
-
return null;
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Reject when any of `positionKeys` are present alongside `pathKey`.
|
|
102
|
-
* Positions (line/character) only anchor into files, not scope/path params.
|
|
103
|
-
*/
|
|
104
|
-
export function noPositionOnPath<P>(
|
|
105
|
-
pathKey: keyof P & string,
|
|
106
|
-
lineKey: keyof P & string,
|
|
107
|
-
charKey: keyof P & string,
|
|
108
|
-
): CrossFieldRule<P> {
|
|
109
|
-
return (params) => {
|
|
110
|
-
const hasPath = inspectParam(params, pathKey) !== undefined;
|
|
111
|
-
const hasPos =
|
|
112
|
-
inspectParam(params, lineKey) !== undefined || inspectParam(params, charKey) !== undefined;
|
|
113
|
-
if (hasPath && hasPos) {
|
|
114
|
-
return `**Error:** \`${lineKey}\` and \`${charKey}\` require \`file\`, not \`${pathKey}\`. Use \`${pathKey}\` to scope; use \`file\` to anchor a position.`;
|
|
115
|
-
}
|
|
116
|
-
return null;
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// ── Filesystem primitives ─────────────────────────────────────────────
|
|
121
|
-
|
|
122
|
-
/** Ensure the value at `key` resolves to an existing file. */
|
|
123
|
-
export function fileMustExist<P>(key: keyof P & string): CrossFieldRule<P> {
|
|
124
|
-
return (params, cwd) => {
|
|
125
|
-
const file = inspectParam(params, key) as string | undefined;
|
|
126
|
-
if (!file) return null;
|
|
127
|
-
const resolved = normalizePath(file, cwd);
|
|
128
|
-
if (!existsSync(resolved)) {
|
|
129
|
-
return `**Error:** File not found: \`${file}\`.`;
|
|
130
|
-
}
|
|
131
|
-
return null;
|
|
132
|
-
};
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/** Ensure the value at `key` resolves to a file, not a directory. */
|
|
136
|
-
export function fileNotDirectory<P>(key: keyof P & string): CrossFieldRule<P> {
|
|
137
|
-
return (params, cwd) => {
|
|
138
|
-
const file = inspectParam(params, key) as string | undefined;
|
|
139
|
-
if (!file) return null;
|
|
140
|
-
const resolved = normalizePath(file, cwd);
|
|
141
|
-
if (existsSync(resolved) && statSync(resolved).isDirectory()) {
|
|
142
|
-
return `**Error:** \`${key}\` points to a directory. Use \`scope\` for a directory; use \`file\` to anchor a position in a file.`;
|
|
143
|
-
}
|
|
144
|
-
return null;
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
// ── Tool-specific composed rules ──────────────────────────────────────
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Standard cross-field rules for tools that accept anchored coordinates
|
|
152
|
-
* (file + line + character). Used by code_graph, code_impact, code_inspect,
|
|
153
|
-
* and any future tool that takes position params.
|
|
154
|
-
*
|
|
155
|
-
* TypeBox already enforces:
|
|
156
|
-
* - Types: file (String), line (Number >= 1), character (Number >= 1)
|
|
157
|
-
* - additionalProperties: false
|
|
158
|
-
*/
|
|
159
|
-
export function focusedToolRules<P>(
|
|
160
|
-
pathKey: keyof P & string = "scope" as keyof P & string,
|
|
161
|
-
): CrossFieldRule<P> {
|
|
162
|
-
return composeRules<P>(
|
|
163
|
-
noPositionOnPath(pathKey, "line" as keyof P & string, "character" as keyof P & string),
|
|
164
|
-
fileNotDirectory("file" as keyof P & string),
|
|
165
|
-
requireWith(
|
|
166
|
-
"file" as keyof P & string,
|
|
167
|
-
"line" as keyof P & string,
|
|
168
|
-
"character" as keyof P & string,
|
|
169
|
-
),
|
|
170
|
-
);
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Cross-field rules for code_resolve.
|
|
175
|
-
*
|
|
176
|
-
* TypeBox already enforces:
|
|
177
|
-
* - kind must be a valid StringEnum value
|
|
178
|
-
* - line/character must be numbers >= 1
|
|
179
|
-
* - additionalProperties: false
|
|
180
|
-
*/
|
|
181
|
-
export const resolveCrossFieldRules: CrossFieldRule<{
|
|
182
|
-
query?: string;
|
|
183
|
-
file?: string;
|
|
184
|
-
line?: number;
|
|
185
|
-
character?: number;
|
|
186
|
-
}> = composeRules(
|
|
187
|
-
requireAtLeastOne("query", "file"),
|
|
188
|
-
requirePaired("line", "character"),
|
|
189
|
-
requireWith("file", "line", "character"),
|
|
190
|
-
);
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* Cross-field rules for code_orientation coordinate mode
|
|
194
|
-
* (focus + line + character).
|
|
195
|
-
*
|
|
196
|
-
* TypeBox already enforces:
|
|
197
|
-
* - line/character types and min >= 1
|
|
198
|
-
* - additionalProperties: false
|
|
199
|
-
*/
|
|
200
|
-
export function orientationCoordinateRules<
|
|
201
|
-
P extends {
|
|
202
|
-
focus?: string;
|
|
203
|
-
line?: number;
|
|
204
|
-
character?: number;
|
|
205
|
-
},
|
|
206
|
-
>(): CrossFieldRule<P> {
|
|
207
|
-
return composeRules<P>(
|
|
208
|
-
requirePaired(
|
|
209
|
-
"focus" as keyof P & string,
|
|
210
|
-
"line" as keyof P & string,
|
|
211
|
-
"character" as keyof P & string,
|
|
212
|
-
),
|
|
213
|
-
fileMustExist("focus" as keyof P & string),
|
|
214
|
-
fileNotDirectory("focus" as keyof P & string),
|
|
215
|
-
);
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
/**
|
|
219
|
-
* Cross-field rules for code_find mode+kind consistency.
|
|
220
|
-
*
|
|
221
|
-
* TypeBox already enforces:
|
|
222
|
-
* - mode must be a valid StringEnum value
|
|
223
|
-
* - kind must be a valid StringEnum value
|
|
224
|
-
* - query is required (not optional)
|
|
225
|
-
*/
|
|
226
|
-
const SUPPORTED_AST_KINDS = [
|
|
227
|
-
"definition",
|
|
228
|
-
"import",
|
|
229
|
-
"export",
|
|
230
|
-
"call",
|
|
231
|
-
"type",
|
|
232
|
-
"interface",
|
|
233
|
-
"class",
|
|
234
|
-
"method",
|
|
235
|
-
"enum",
|
|
236
|
-
"test",
|
|
237
|
-
] as const;
|
|
238
|
-
|
|
239
|
-
const SUPPORTED_AST_KINDS_TEXT = SUPPORTED_AST_KINDS.map((k) => `\`${k}\``).join(", ");
|
|
240
|
-
|
|
241
|
-
export function findModeKindRules<P extends { mode?: string; kind?: string }>(): CrossFieldRule<P> {
|
|
242
|
-
return (params) => {
|
|
243
|
-
const mode = params.mode ?? "text";
|
|
244
|
-
const kind = params.kind;
|
|
245
|
-
if ((mode === "text" || mode === "regex" || mode === "semantic") && kind) {
|
|
246
|
-
return `**Error:** code_find does not accept \`kind\` with \`mode: "${mode}"\`. Use \`mode: "ast"\` with \`kind\`.`;
|
|
247
|
-
}
|
|
248
|
-
if (mode === "ast" && !kind) {
|
|
249
|
-
return `**Error:** code_find with \`mode: "ast"\` requires \`kind\`. Supported AST kinds: ${SUPPORTED_AST_KINDS_TEXT}.`;
|
|
250
|
-
}
|
|
251
|
-
return null;
|
|
252
|
-
};
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
/**
|
|
256
|
-
* Cross-field rules for code_refactor_plan.
|
|
257
|
-
*
|
|
258
|
-
* TypeBox already enforces:
|
|
259
|
-
* - operation must be a valid StringEnum value
|
|
260
|
-
* - range shape (start/end with line/character)
|
|
261
|
-
* - additionalProperties: false
|
|
262
|
-
*/
|
|
263
|
-
// ── Refactor plan sub-rules (split for complexity) ────────────────────
|
|
264
|
-
|
|
265
|
-
function checkExtractRange<
|
|
266
|
-
P extends {
|
|
267
|
-
operation: string;
|
|
268
|
-
range?: {
|
|
269
|
-
start: { line: number; character: number };
|
|
270
|
-
end: { line: number; character: number };
|
|
271
|
-
};
|
|
272
|
-
},
|
|
273
|
-
>(params: P): string | null {
|
|
274
|
-
const isExtract =
|
|
275
|
-
params.operation === "extract_function" || params.operation === "extract_variable";
|
|
276
|
-
if (!isExtract) return null;
|
|
277
|
-
if (!params.range) {
|
|
278
|
-
return "**Error:** `range` is required for `extract_function` and `extract_variable`.";
|
|
279
|
-
}
|
|
280
|
-
const { start, end } = params.range;
|
|
281
|
-
if (end.line < start.line || (end.line === start.line && end.character <= start.character)) {
|
|
282
|
-
return "**Error:** `range.end` must be after `range.start`.";
|
|
283
|
-
}
|
|
284
|
-
return null;
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
function checkNewNameRequired<P extends { operation: string; newName?: string }>(
|
|
288
|
-
params: P,
|
|
289
|
-
): string | null {
|
|
290
|
-
const needsName =
|
|
291
|
-
params.operation === "rename_symbol" ||
|
|
292
|
-
params.operation === "extract_function" ||
|
|
293
|
-
params.operation === "extract_variable";
|
|
294
|
-
if (needsName && !params.newName) {
|
|
295
|
-
return `**Error:** \`newName\` is required for \`${params.operation}\`.`;
|
|
296
|
-
}
|
|
297
|
-
return null;
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
/**
|
|
301
|
-
* Cross-field rules for code_refactor_plan.
|
|
302
|
-
*
|
|
303
|
-
* TypeBox already enforces:
|
|
304
|
-
* - operation must be a valid StringEnum value
|
|
305
|
-
* - range shape (start/end with line/character)
|
|
306
|
-
* - additionalProperties: false
|
|
307
|
-
*/
|
|
308
|
-
export function refactorPlanCrossFieldRules<
|
|
309
|
-
P extends {
|
|
310
|
-
operation: string;
|
|
311
|
-
targetId?: string;
|
|
312
|
-
file?: string;
|
|
313
|
-
line?: number;
|
|
314
|
-
character?: number;
|
|
315
|
-
range?: {
|
|
316
|
-
start: { line: number; character: number };
|
|
317
|
-
end: { line: number; character: number };
|
|
318
|
-
};
|
|
319
|
-
newName?: string;
|
|
320
|
-
},
|
|
321
|
-
>(): CrossFieldRule<P> {
|
|
322
|
-
return composeRules<P>(
|
|
323
|
-
(params) => {
|
|
324
|
-
const hasTarget =
|
|
325
|
-
Boolean(params.targetId) ||
|
|
326
|
-
(Boolean(params.file) && params.line != null && params.character != null);
|
|
327
|
-
if (!hasTarget) {
|
|
328
|
-
return "**Error:** Refactor preview requires `targetId` (from `code_resolve`) or `file` + `line` + `character`.";
|
|
329
|
-
}
|
|
330
|
-
return null;
|
|
331
|
-
},
|
|
332
|
-
checkExtractRange as CrossFieldRule<P>,
|
|
333
|
-
checkNewNameRequired as CrossFieldRule<P>,
|
|
334
|
-
);
|
|
335
|
-
}
|
|
@@ -1,334 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Lightweight tool-execution pipeline.
|
|
3
|
-
*
|
|
4
|
-
* Executors compose stages that gate before the tool-specific logic:
|
|
5
|
-
* targetId expansion, scope resolution, param validation, semantic
|
|
6
|
-
* readiness, and capability checks. Each stage returns a
|
|
7
|
-
* {@link PipeOutcome}: `{ kind: "continue" }` to proceed to the next
|
|
8
|
-
* stage, or `{ kind: "error", result }` to short-circuit the pipeline.
|
|
9
|
-
*
|
|
10
|
-
* Usage in an executor:
|
|
11
|
-
*
|
|
12
|
-
* ```ts
|
|
13
|
-
* return runPipe(params, ctx, [
|
|
14
|
-
* expandTargetId((msg) => ({ content: msg, details: ... })),
|
|
15
|
-
* resolveScopeParam((reason) => ({ content: reason, details: ... })),
|
|
16
|
-
* validateParams(myValidator, (msg) => ({ content: msg, details: ... })),
|
|
17
|
-
* gateSemanticReadiness("code_graph"),
|
|
18
|
-
* ], async (p, c) => {
|
|
19
|
-
* // tool-specific execution
|
|
20
|
-
* });
|
|
21
|
-
* ```
|
|
22
|
-
*/
|
|
23
|
-
|
|
24
|
-
import { match } from "ts-pattern";
|
|
25
|
-
import { ensureSemanticReadiness } from "../../analysis/readiness.ts";
|
|
26
|
-
import { resolveScope, resolveScopeSet } from "../../analysis/search/ripgrep.ts";
|
|
27
|
-
import { routeFor } from "../../analysis/target/planner.ts";
|
|
28
|
-
import type {
|
|
29
|
-
CodeIntelligenceToolName,
|
|
30
|
-
CodeIntelResult,
|
|
31
|
-
CodeIntelToolExecCtx,
|
|
32
|
-
} from "../../types/index.ts";
|
|
33
|
-
import { searchErrorResult } from "./error-results.ts";
|
|
34
|
-
import { renderSemanticReadinessTimeout } from "./readiness-message.ts";
|
|
35
|
-
|
|
36
|
-
// Re-export for stage consumers
|
|
37
|
-
export type { CodeIntelligenceToolName };
|
|
38
|
-
|
|
39
|
-
// ── Param accessors ──────────────────────────────────────────────────
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Read a param value for runtime inspection in generic pipeline stages
|
|
43
|
-
* and cross-field validation rules.
|
|
44
|
-
*
|
|
45
|
-
* Centralizes the {@link Record}<string, unknown> cast needed when
|
|
46
|
-
* generic code accesses params by dynamic/computed keys. Callers get
|
|
47
|
-
* `unknown` back and must narrow to the expected type.
|
|
48
|
-
*/
|
|
49
|
-
export function inspectParam<P>(params: P, key: keyof P & string): unknown {
|
|
50
|
-
return (params as Record<string, unknown>)[key];
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Set a param value in generic pipeline code.
|
|
55
|
-
*
|
|
56
|
-
* Companion to {@link inspectParam} for mutation stages like
|
|
57
|
-
* {@link expandTargetId} and {@link resolveScopeParam}.
|
|
58
|
-
*/
|
|
59
|
-
export function setParam<P>(params: P, key: keyof P & string, value: unknown): void {
|
|
60
|
-
(params as Record<string, unknown>)[key] = value;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// ── Types ─────────────────────────────────────────────────────────────
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Outcome of a single pipeline stage.
|
|
67
|
-
*
|
|
68
|
-
* `continue` — proceed to the next stage (or the execute function).
|
|
69
|
-
* `error` — short-circuit the pipeline with the given result.
|
|
70
|
-
*/
|
|
71
|
-
export type PipeOutcome = { kind: "continue" } | { kind: "error"; result: CodeIntelResult };
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* A pipeline stage: receives (possibly mutated) params and the execution
|
|
75
|
-
* context. Returns {@link PipeOutcome} — `{ kind: "continue" }` to
|
|
76
|
-
* advance to the next stage, or `{ kind: "error", result }` to
|
|
77
|
-
* short-circuit immediately.
|
|
78
|
-
*/
|
|
79
|
-
export type PipeStage<P> = (
|
|
80
|
-
params: P,
|
|
81
|
-
ctx: CodeIntelToolExecCtx,
|
|
82
|
-
) => Promise<PipeOutcome> | PipeOutcome;
|
|
83
|
-
|
|
84
|
-
// ── Orchestrator ──────────────────────────────────────────────────────
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Run a sequence of gating stages then the tool-specific execute function.
|
|
88
|
-
*
|
|
89
|
-
* Stages are executed in order. The first stage that returns
|
|
90
|
-
* `{ kind: "error" }` short-circuits the pipeline and its result is
|
|
91
|
-
* returned to the caller. If every stage returns `{ kind: "continue" }`,
|
|
92
|
-
* `execute(params, ctx)` runs.
|
|
93
|
-
*/
|
|
94
|
-
export async function runPipe<P>(
|
|
95
|
-
params: P,
|
|
96
|
-
ctx: CodeIntelToolExecCtx,
|
|
97
|
-
stages: PipeStage<P>[],
|
|
98
|
-
execute: (params: P, ctx: CodeIntelToolExecCtx) => Promise<CodeIntelResult>,
|
|
99
|
-
): Promise<CodeIntelResult> {
|
|
100
|
-
for (const stage of stages) {
|
|
101
|
-
const outcome = await stage(params, ctx);
|
|
102
|
-
if (outcome.kind === "error") return outcome.result;
|
|
103
|
-
}
|
|
104
|
-
return execute(params, ctx);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// ── Stage factories ───────────────────────────────────────────────────
|
|
108
|
-
|
|
109
|
-
/** Minimum parameter shape needed by `expandTargetId`. */
|
|
110
|
-
export interface HasTargetParams {
|
|
111
|
-
targetId?: string;
|
|
112
|
-
file?: string;
|
|
113
|
-
line?: number;
|
|
114
|
-
character?: number;
|
|
115
|
-
/** Set by expandTargetId stage — resolved name from the stored target entry. */
|
|
116
|
-
_expandedName?: string | null;
|
|
117
|
-
/** Set by expandTargetId stage — anchor kind from the stored target entry. */
|
|
118
|
-
_expandedAnchorKind?: string | null;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Expand an optional `targetId` into file/line/character params.
|
|
123
|
-
*
|
|
124
|
-
* On success the stage mutates `params.file`, `params.line`, and
|
|
125
|
-
* `params.character` from the stored entry. On error it calls
|
|
126
|
-
* `onError(message)` to build a tool-appropriate error result.
|
|
127
|
-
*
|
|
128
|
-
* A missing/null targetId is not an error — the stage passes through
|
|
129
|
-
* (no expansion, params unchanged).
|
|
130
|
-
*/
|
|
131
|
-
export function expandTargetId<P extends HasTargetParams>(
|
|
132
|
-
onError: (message: string) => CodeIntelResult,
|
|
133
|
-
): PipeStage<P> {
|
|
134
|
-
return (params, ctx) => {
|
|
135
|
-
const expansion = ctx.session.expandTargetId(params);
|
|
136
|
-
if (expansion.kind === "error") return { kind: "error", result: onError(expansion.message) };
|
|
137
|
-
if (expansion.kind === "ok") {
|
|
138
|
-
params.file = expansion.file;
|
|
139
|
-
params.line = expansion.line;
|
|
140
|
-
params.character = expansion.character;
|
|
141
|
-
params._expandedName = expansion.targetName;
|
|
142
|
-
params._expandedAnchorKind = expansion.entry.anchorKind;
|
|
143
|
-
}
|
|
144
|
-
return { kind: "continue" };
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
/** Minimum parameter shape needed by `resolveScope`. */
|
|
149
|
-
export interface HasScopeParam {
|
|
150
|
-
scope?: string;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
/** Minimum parameter shape needed by `resolveScopeSetParam`. */
|
|
154
|
-
export interface HasScopeSetParam {
|
|
155
|
-
scope?: string | string[];
|
|
156
|
-
/** Set by resolveScopeSetParam — absolute search roots for code_find. */
|
|
157
|
-
_resolvedScopePaths?: string[];
|
|
158
|
-
/** Set by resolveScopeSetParam — display label for requested search roots. */
|
|
159
|
-
_resolvedScopeDisplay?: string | null;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
* Resolve the `scope` parameter to an absolute path.
|
|
164
|
-
*
|
|
165
|
-
* Mutates `params.scope` to the resolved absolute path. An undefined
|
|
166
|
-
* scope passes through unchanged. On resolution error calls
|
|
167
|
-
* `onError(reason)`.
|
|
168
|
-
*
|
|
169
|
-
* @param paramName — defaults to `"scope"`.
|
|
170
|
-
*/
|
|
171
|
-
export function resolveScopeParam<P extends HasScopeParam>(
|
|
172
|
-
onError: (reason: string) => CodeIntelResult,
|
|
173
|
-
paramName: keyof P & string = "scope" as keyof P & string,
|
|
174
|
-
): PipeStage<P> {
|
|
175
|
-
return (params, ctx) => {
|
|
176
|
-
const raw = inspectParam(params, paramName) as string | undefined;
|
|
177
|
-
if (raw === undefined) return { kind: "continue" };
|
|
178
|
-
|
|
179
|
-
const result = resolveScope(raw, ctx.cwd);
|
|
180
|
-
if (result.kind === "error") return { kind: "error", result: onError(result.reason) };
|
|
181
|
-
|
|
182
|
-
setParam(params, paramName, result.path);
|
|
183
|
-
return { kind: "continue" };
|
|
184
|
-
};
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
/** Resolve code_find's one-or-many `scope` input to absolute search roots. */
|
|
188
|
-
export function resolveScopeSetParam<P extends HasScopeSetParam>(
|
|
189
|
-
onError: (reason: string) => CodeIntelResult,
|
|
190
|
-
): PipeStage<P> {
|
|
191
|
-
return (params, ctx) => {
|
|
192
|
-
const result = resolveScopeSet(params.scope, ctx.cwd);
|
|
193
|
-
if (result.kind === "error") return { kind: "error", result: onError(result.reason) };
|
|
194
|
-
|
|
195
|
-
params._resolvedScopePaths = [...result.paths];
|
|
196
|
-
params._resolvedScopeDisplay = result.display;
|
|
197
|
-
return { kind: "continue" };
|
|
198
|
-
};
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
/**
|
|
202
|
-
* Apply cross-field validation rules after TypeBox schema validation.
|
|
203
|
-
*
|
|
204
|
-
* pi already validates structural types, required fields, and enum
|
|
205
|
-
* values against the TypeBox schema in {@link ./schemas.ts} before
|
|
206
|
-
* calling executors. This stage handles only cross-field constraints
|
|
207
|
-
* that TypeBox cannot express (pairing, mutual exclusion, filesystem
|
|
208
|
-
* checks, semantic consistency).
|
|
209
|
-
*
|
|
210
|
-
* The validator receives `(params, cwd)` and returns `null` when
|
|
211
|
-
* valid, or an error message string. The stage calls `onError(message)`
|
|
212
|
-
* to build a tool-appropriate error result.
|
|
213
|
-
*/
|
|
214
|
-
export function validateParams<P>(
|
|
215
|
-
validator: (params: P, cwd: string) => string | null,
|
|
216
|
-
onError: (message: string) => CodeIntelResult,
|
|
217
|
-
): PipeStage<P> {
|
|
218
|
-
return (params, ctx) => {
|
|
219
|
-
const message = validator(params, ctx.cwd);
|
|
220
|
-
if (message) return { kind: "error", result: onError(message) };
|
|
221
|
-
return { kind: "continue" };
|
|
222
|
-
};
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
/** Options for {@link gateSemanticReadiness}. */
|
|
226
|
-
export interface SemanticGateOptions {
|
|
227
|
-
/**
|
|
228
|
-
* Optional param key for the file path used for file-scoped readiness.
|
|
229
|
-
* When provided, readiness waits for the specific file. Defaults to
|
|
230
|
-
* workspace-scoped readiness.
|
|
231
|
-
*/
|
|
232
|
-
fileParam?: string;
|
|
233
|
-
|
|
234
|
-
/** Build a result when readiness times out. */
|
|
235
|
-
onTimeout?: (toolName: string, timeoutMs: number) => CodeIntelResult;
|
|
236
|
-
|
|
237
|
-
/** When true, throw (whole-tool unavailable) instead of returning an error result. */
|
|
238
|
-
throwOnUnavailable?: boolean;
|
|
239
|
-
|
|
240
|
-
/**
|
|
241
|
-
* When true, let "unavailable" pass through to the execute function
|
|
242
|
-
* instead of returning an error. Use when the use-case layer handles
|
|
243
|
-
* missing providers with explicit unavailable-section notes.
|
|
244
|
-
* `throwOnUnavailable` takes precedence when both are true.
|
|
245
|
-
*/
|
|
246
|
-
passThroughOnUnavailable?: boolean;
|
|
247
|
-
|
|
248
|
-
/** Build a result when readiness is permanently unavailable. */
|
|
249
|
-
onUnavailable?: (reason: string) => CodeIntelResult;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
/**
|
|
253
|
-
* Gate execution behind semantic (LSP) readiness.
|
|
254
|
-
*
|
|
255
|
-
* Waits up to the default timeout for the LSP to be ready for the
|
|
256
|
-
* workspace (or a specific file). On timeout, calls `onTimeout` if
|
|
257
|
-
* provided, otherwise builds a default timeout result. When
|
|
258
|
-
* `throwOnUnavailable` is true and the provider is permanently
|
|
259
|
-
* unavailable, the stage throws so pi marks the call as an error.
|
|
260
|
-
*/
|
|
261
|
-
export function gateSemanticReadiness<P>(
|
|
262
|
-
toolName: CodeIntelligenceToolName,
|
|
263
|
-
opts: SemanticGateOptions = {},
|
|
264
|
-
): PipeStage<P> {
|
|
265
|
-
return async (params, ctx) => {
|
|
266
|
-
// opts.fileParam is a runtime string from an options bag, not a
|
|
267
|
-
// compile-time keyof P — keep the cast local instead of routing
|
|
268
|
-
// through inspectParam which requires keyof P & string.
|
|
269
|
-
const file = opts.fileParam
|
|
270
|
-
? ((params as Record<string, unknown>)[opts.fileParam] as string | undefined)
|
|
271
|
-
: undefined;
|
|
272
|
-
|
|
273
|
-
const scope = file ? { kind: "file" as const, file } : { kind: "workspace" as const };
|
|
274
|
-
const readiness = await ensureSemanticReadiness(ctx.cwd, scope);
|
|
275
|
-
|
|
276
|
-
if (readiness.kind === "ready") return { kind: "continue" };
|
|
277
|
-
|
|
278
|
-
return handleNonReadyReadiness(readiness, toolName, opts);
|
|
279
|
-
};
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
/** Handle timeout or unavailable readiness, applying tool-specific callbacks. */
|
|
283
|
-
function handleNonReadyReadiness(
|
|
284
|
-
readiness: { kind: "timeout" } | { kind: "unavailable"; reason: string },
|
|
285
|
-
toolName: CodeIntelligenceToolName,
|
|
286
|
-
opts: SemanticGateOptions,
|
|
287
|
-
): PipeOutcome {
|
|
288
|
-
return match(readiness)
|
|
289
|
-
.with({ kind: "timeout" }, () => {
|
|
290
|
-
if (opts.onTimeout)
|
|
291
|
-
return { kind: "error" as const, result: opts.onTimeout(toolName, 15_000) };
|
|
292
|
-
return defaultTimeoutOutcome(toolName);
|
|
293
|
-
})
|
|
294
|
-
.with({ kind: "unavailable" }, ({ reason }) => {
|
|
295
|
-
if (opts.throwOnUnavailable) throw new Error(reason);
|
|
296
|
-
if (opts.passThroughOnUnavailable) return { kind: "continue" as const };
|
|
297
|
-
if (opts.onUnavailable) return { kind: "error" as const, result: opts.onUnavailable(reason) };
|
|
298
|
-
return defaultUnavailableOutcome(reason);
|
|
299
|
-
})
|
|
300
|
-
.exhaustive() as PipeOutcome;
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
function defaultTimeoutOutcome(toolName: string): PipeOutcome {
|
|
304
|
-
return {
|
|
305
|
-
kind: "error",
|
|
306
|
-
result: searchErrorResult(renderSemanticReadinessTimeout(toolName, 15_000)),
|
|
307
|
-
};
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
function defaultUnavailableOutcome(reason: string): PipeOutcome {
|
|
311
|
-
return { kind: "error", result: searchErrorResult(`**Error:** ${reason}`) };
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
/**
|
|
315
|
-
* Gate execution behind capability availability.
|
|
316
|
-
*
|
|
317
|
-
* Calls `routeFor(cwd, toolName)`. When `preferred === "unavailable"`
|
|
318
|
-
* the stage throws (whole-tool capability-unavailable) so pi marks the
|
|
319
|
-
* call as an error. Partial per-relation unavailability is NOT gated
|
|
320
|
-
* here — executors surface that through best-effort notes.
|
|
321
|
-
*
|
|
322
|
-
* This is a sync stage — no async work.
|
|
323
|
-
*/
|
|
324
|
-
export function gateCapability<P>(toolName: CodeIntelligenceToolName): PipeStage<P> {
|
|
325
|
-
return (_params, ctx) => {
|
|
326
|
-
const route = routeFor(ctx.cwd, toolName);
|
|
327
|
-
if (route.preferred === "unavailable") {
|
|
328
|
-
throw new Error(
|
|
329
|
-
`No analysis provider is available for this workspace. Check \`code_health\` for LSP and tree-sitter status.`,
|
|
330
|
-
);
|
|
331
|
-
}
|
|
332
|
-
return { kind: "continue" };
|
|
333
|
-
};
|
|
334
|
-
}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/** Render user-facing semantic readiness messages for tool executors. */
|
|
2
|
-
export function renderSemanticReadinessTimeout(toolName: string, timeoutMs: number): string {
|
|
3
|
-
const seconds = Math.max(1, Math.round(timeoutMs / 1000));
|
|
4
|
-
return `**Error:** Semantic analysis for \`${toolName}\` is still warming for this workspace (LSP indexing/startup not finished after ${seconds}s). Try again shortly or check \`code_health\`.`;
|
|
5
|
-
}
|