@mrclrchtr/supi-code-intelligence 4.10.0 → 6.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 +4 -3
- package/node_modules/@mrclrchtr/supi-code-runtime/README.md +2 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/package.json +1 -1
- package/node_modules/@mrclrchtr/supi-code-runtime/src/api.ts +9 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/src/capability/types.ts +53 -13
- package/node_modules/@mrclrchtr/supi-code-runtime/src/request-control.ts +47 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/src/types.ts +13 -1
- package/node_modules/@mrclrchtr/supi-core/README.md +2 -0
- package/node_modules/@mrclrchtr/supi-core/package.json +2 -2
- package/node_modules/@mrclrchtr/supi-core/src/api.ts +1 -1
- package/node_modules/@mrclrchtr/supi-core/src/config/config.ts +31 -0
- package/node_modules/@mrclrchtr/supi-core/src/config.ts +2 -0
- package/node_modules/@mrclrchtr/supi-core/src/debug-registry.ts +19 -6
- package/node_modules/@mrclrchtr/supi-core/src/debug.ts +9 -0
- package/node_modules/@mrclrchtr/supi-core/src/index.ts +1 -1
- package/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +3 -0
- package/node_modules/@mrclrchtr/supi-lsp/README.md +111 -5
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/README.md +2 -0
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/package.json +1 -1
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/api.ts +9 -0
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/capability/types.ts +53 -13
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/request-control.ts +47 -0
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/types.ts +13 -1
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/README.md +2 -0
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/package.json +2 -2
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/api.ts +1 -1
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/config/config.ts +31 -0
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/config.ts +2 -0
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/debug-registry.ts +19 -6
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/debug.ts +9 -0
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/index.ts +1 -1
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +3 -0
- package/node_modules/@mrclrchtr/supi-lsp/package.json +7 -6
- package/node_modules/@mrclrchtr/supi-lsp/src/api.ts +22 -1
- package/node_modules/@mrclrchtr/supi-lsp/src/client/client-diagnostic-cache.ts +245 -0
- package/node_modules/@mrclrchtr/supi-lsp/src/client/client-diagnostic-capabilities.ts +78 -0
- package/node_modules/@mrclrchtr/supi-lsp/src/client/client-diagnostic-collection.ts +171 -0
- package/node_modules/@mrclrchtr/supi-lsp/src/client/client-diagnostic-evidence.ts +413 -0
- package/node_modules/@mrclrchtr/supi-lsp/src/client/client-diagnostic-host.ts +15 -0
- package/node_modules/@mrclrchtr/supi-lsp/src/client/client-diagnostic-publication.ts +214 -0
- package/node_modules/@mrclrchtr/supi-lsp/src/client/client-diagnostic-pull.ts +62 -0
- package/node_modules/@mrclrchtr/supi-lsp/src/client/client-diagnostic-refresh.ts +690 -0
- package/node_modules/@mrclrchtr/supi-lsp/src/client/client-diagnostic-request.ts +9 -0
- package/node_modules/@mrclrchtr/supi-lsp/src/client/client-diagnostic-timing.ts +97 -16
- package/node_modules/@mrclrchtr/supi-lsp/src/client/client-diagnostic-waiters.ts +206 -0
- package/node_modules/@mrclrchtr/supi-lsp/src/client/client-diagnostics.ts +448 -298
- package/node_modules/@mrclrchtr/supi-lsp/src/client/client-document-state.ts +70 -0
- package/node_modules/@mrclrchtr/supi-lsp/src/client/client-document-sync.ts +231 -0
- package/node_modules/@mrclrchtr/supi-lsp/src/client/client-file-state.ts +25 -0
- package/node_modules/@mrclrchtr/supi-lsp/src/client/client.ts +529 -119
- package/node_modules/@mrclrchtr/supi-lsp/src/client/transport.ts +161 -33
- package/node_modules/@mrclrchtr/supi-lsp/src/config/capabilities.ts +12 -3
- package/node_modules/@mrclrchtr/supi-lsp/src/config/config.ts +5 -5
- package/node_modules/@mrclrchtr/supi-lsp/src/config/defaults.json +1 -1
- package/node_modules/@mrclrchtr/supi-lsp/src/config/server-config.ts +3 -0
- package/node_modules/@mrclrchtr/supi-lsp/src/config/tsconfig-extends.ts +68 -0
- package/node_modules/@mrclrchtr/supi-lsp/src/config/tsconfig-path.ts +8 -0
- package/node_modules/@mrclrchtr/supi-lsp/src/config/tsconfig-scope.ts +176 -24
- package/node_modules/@mrclrchtr/supi-lsp/src/debug-telemetry.ts +45 -0
- package/node_modules/@mrclrchtr/supi-lsp/src/diagnostics/evidence.ts +42 -0
- package/node_modules/@mrclrchtr/supi-lsp/src/diagnostics/workspace-sentinels.ts +46 -10
- package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-client-state.ts +79 -9
- package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-diagnostics.ts +17 -7
- package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-workspace-recovery.ts +350 -26
- package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-workspace-symbol.ts +5 -2
- package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager.ts +586 -96
- package/node_modules/@mrclrchtr/supi-lsp/src/provider/lsp-refactor-provider.ts +130 -0
- package/node_modules/@mrclrchtr/supi-lsp/src/provider/lsp-semantic-provider.ts +45 -329
- package/node_modules/@mrclrchtr/supi-lsp/src/provider/refactor-planning.ts +57 -120
- package/node_modules/@mrclrchtr/supi-lsp/src/provider/semantic-edit-normalizer.ts +320 -0
- package/node_modules/@mrclrchtr/supi-lsp/src/provider/semantic-symbol-mapper.ts +207 -0
- package/node_modules/@mrclrchtr/supi-lsp/src/session/readiness.ts +72 -2
- package/node_modules/@mrclrchtr/supi-lsp/src/session/runtime-controller.ts +151 -26
- package/node_modules/@mrclrchtr/supi-lsp/src/session/runtime-diagnostic-surface.ts +42 -0
- package/node_modules/@mrclrchtr/supi-lsp/src/session/runtime-diagnostics.ts +92 -0
- package/node_modules/@mrclrchtr/supi-lsp/src/session/runtime-registry.ts +165 -118
- package/node_modules/@mrclrchtr/supi-lsp/src/session/runtime-transition-debug.ts +49 -0
- package/node_modules/@mrclrchtr/supi-lsp/src/session/workspace-lsp-runtime.ts +102 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/README.md +17 -7
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/README.md +2 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/package.json +1 -1
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/api.ts +9 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/capability/types.ts +53 -13
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/request-control.ts +47 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/types.ts +13 -1
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/README.md +2 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/package.json +2 -2
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/api.ts +1 -1
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/config/config.ts +31 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/config.ts +2 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/debug-registry.ts +19 -6
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/debug.ts +9 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/index.ts +1 -1
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +3 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/jiti/LICENSE +21 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/jiti/README.md +258 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/jiti/dist/babel.cjs +257 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/jiti/dist/jiti.cjs +1 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/jiti/lib/jiti-cli.mjs +34 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/jiti/lib/jiti-hooks.mjs +124 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/jiti/lib/jiti-native.mjs +121 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/jiti/lib/jiti-register.d.mts +1 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/jiti/lib/jiti-register.mjs +4 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/jiti/lib/jiti-static.mjs +23 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/jiti/lib/jiti.cjs +30 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/jiti/lib/jiti.d.cts +8 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/jiti/lib/jiti.d.mts +8 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/jiti/lib/jiti.mjs +29 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/jiti/lib/types.d.ts +420 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/jiti/package.json +146 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/package.json +6 -3
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/api.ts +0 -9
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/index.ts +0 -8
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/provider/tree-sitter-provider.ts +16 -12
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/session/runtime-controller.ts +65 -87
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/session/session.ts +47 -95
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/session/structural-timing.ts +147 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/session/structural-worker-client-lifecycle.ts +39 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/session/structural-worker-client.ts +561 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/session/structural-worker-message-size.ts +24 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/session/structural-worker-protocol.ts +452 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/call-sites.ts +4 -2
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/callees.ts +12 -4
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/exports.ts +4 -2
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/imports.ts +4 -2
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/node-at.ts +5 -3
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/types.ts +33 -12
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/worker/blocking-test-bootstrap.mjs +34 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/worker/bootstrap.mjs +8 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/worker/parsed-file-store-helpers.ts +23 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/worker/parsed-file-store.ts +400 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/worker/request-control.ts +48 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/worker/runtime-parser-helpers.ts +24 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/worker/runtime-query-helpers.ts +43 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/worker/runtime.ts +421 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/worker/service.ts +116 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/worker/worker-main.ts +201 -0
- package/package.json +5 -5
- package/src/analysis/health/diagnostics.ts +221 -77
- package/src/analysis/health/file-scope.ts +184 -0
- package/src/analysis/health/recovery.ts +14 -3
- package/src/analysis/provider.ts +58 -0
- package/src/analysis/readiness.ts +34 -9
- package/src/analysis/refactor/apply.ts +45 -1
- package/src/analysis/refactor/mutation-authority.ts +143 -0
- package/src/analysis/relations/callees.ts +9 -1
- package/src/analysis/relations/types.ts +5 -2
- package/src/analysis/search/ast-scan-timing.ts +9 -2
- package/src/analysis/search/ast-scan.ts +5 -2
- package/src/analysis/search/deadline.ts +2 -2
- package/src/analysis/search/pattern-analysis.ts +54 -33
- package/src/analysis/search/pattern.ts +18 -3
- package/src/analysis/target/anchored.ts +20 -11
- package/src/analysis/target/file.ts +18 -11
- package/src/analysis/target/identity.ts +19 -3
- package/src/analysis/target/symbol.ts +36 -15
- package/src/api.ts +4 -0
- package/src/config.ts +35 -1
- package/src/diagnostics/evidence.ts +51 -0
- package/src/extension.ts +57 -14
- package/src/overview/overview-data.ts +9 -2
- package/src/overview/overview.ts +49 -30
- package/src/overview/types.ts +2 -0
- package/src/session/capability-adapter.ts +12 -3
- package/src/session/find-types.ts +2 -2
- package/src/session/find-workflow.ts +20 -9
- package/src/session/graph/collect.ts +18 -2
- package/src/session/graph-workflow.ts +19 -12
- package/src/session/health-refresh.ts +175 -0
- package/src/session/health-types.ts +43 -15
- package/src/session/health-workflow.ts +69 -54
- package/src/session/input/workflows.ts +2 -2
- package/src/session/inspect/collect.ts +20 -3
- package/src/session/inspect-workflow.ts +12 -6
- package/src/session/orientation/collect.ts +12 -3
- package/src/session/orientation/context-facts.ts +3 -1
- package/src/session/orientation/context-sections.ts +20 -7
- package/src/session/orientation/gather.ts +17 -11
- package/src/session/orientation-types.ts +4 -1
- package/src/session/orientation-workflow.ts +23 -10
- package/src/session/refactor-plans.ts +2 -0
- package/src/session/refactor-workflow.ts +61 -15
- package/src/session/session.ts +29 -2
- package/src/session/target-workflow.ts +54 -23
- package/src/session/workflow-control.ts +7 -3
- package/src/substrate/lsp/lifecycle.ts +26 -46
- package/src/substrate/lsp/maintenance.ts +284 -28
- package/src/substrate/lsp/recovery.ts +11 -5
- package/src/substrate/lsp/state.ts +2 -2
- package/src/substrate/workspace-provider-host.ts +25 -3
- package/src/tool/{find → code_find}/execute.ts +2 -16
- package/src/tool/code_find/guidance.ts +8 -0
- package/src/tool/{find → code_find}/render.ts +21 -4
- package/src/tool/{result/find.ts → code_find/result.ts} +78 -9
- package/src/tool/code_find/spec.ts +37 -0
- package/src/tool/code_find/tui.ts +41 -0
- package/src/tool/code_graph/execute.ts +24 -0
- package/src/tool/code_graph/guidance.ts +6 -0
- package/src/tool/{graph → code_graph}/markdown.ts +1 -1
- package/src/tool/{result/graph.ts → code_graph/result.ts} +111 -3
- package/src/tool/code_graph/spec.ts +39 -0
- package/src/tool/code_graph/tui.ts +117 -0
- package/src/tool/{health → code_health}/execute.ts +2 -13
- package/src/tool/code_health/guidance.ts +8 -0
- package/src/tool/{health → code_health}/markdown.ts +119 -27
- package/src/tool/code_health/refresh-status.ts +105 -0
- package/src/tool/{result/health.ts → code_health/result.ts} +80 -3
- package/src/tool/code_health/spec.ts +41 -0
- package/src/tool/{health → code_health}/tui.ts +95 -98
- package/src/tool/{inspect → code_inspect}/execute.ts +2 -16
- package/src/tool/code_inspect/guidance.ts +6 -0
- package/src/tool/{inspect → code_inspect}/markdown.ts +1 -1
- package/src/tool/{result/inspect.ts → code_inspect/result.ts} +143 -2
- package/src/tool/code_inspect/spec.ts +25 -0
- package/src/tool/code_inspect/tui.ts +44 -0
- package/src/tool/code_orientation/execute.ts +25 -0
- package/src/tool/code_orientation/guidance.ts +9 -0
- package/src/tool/{orientation → code_orientation}/markdown.ts +1 -1
- package/src/tool/code_orientation/result.ts +248 -0
- package/src/tool/code_orientation/spec.ts +25 -0
- package/src/tool/{orientation → code_orientation}/tui.ts +51 -35
- package/src/tool/code_refactor_apply/execute.ts +17 -0
- package/src/tool/code_refactor_apply/guidance.ts +5 -0
- package/src/tool/{refactor-apply/execute.ts → code_refactor_apply/result.ts} +8 -11
- package/src/tool/code_refactor_apply/spec.ts +26 -0
- package/src/tool/code_refactor_apply/tui.ts +73 -0
- package/src/tool/code_refactor_plan/execute.ts +27 -0
- package/src/tool/code_refactor_plan/guidance.ts +8 -0
- package/src/tool/{refactor-plan/execute.ts → code_refactor_plan/result.ts} +13 -22
- package/src/tool/code_refactor_plan/spec.ts +25 -0
- package/src/tool/code_refactor_plan/tui.ts +54 -0
- package/src/tool/code_resolve/execute.ts +19 -0
- package/src/tool/code_resolve/guidance.ts +8 -0
- package/src/tool/{resolve → code_resolve}/markdown.ts +1 -1
- package/src/tool/{result/resolve.ts → code_resolve/result.ts} +79 -29
- package/src/tool/code_resolve/spec.ts +25 -0
- package/src/tool/code_resolve/tui.ts +60 -0
- package/src/tool/guidance.ts +71 -52
- package/src/tool/infra/truncate.ts +40 -0
- package/src/tool/infra/workflow-control.ts +8 -0
- package/src/tool/{refactor-plan/markdown.ts → refactor-markdown.ts} +4 -7
- package/src/tool/register.ts +105 -88
- package/src/tool/result/display.ts +107 -0
- package/src/tool/result/errors.ts +20 -17
- package/src/tool/result/refactor.ts +37 -8
- package/src/tool/result/types.ts +20 -0
- package/src/tool/schemas.ts +26 -157
- package/src/tool/specs.ts +40 -126
- package/src/types/execution.ts +18 -5
- package/src/types/index.ts +8 -1
- package/src/ui/status-command.ts +5 -3
- package/src/ui/status-overlay.ts +4 -0
- package/src/ui/tui/common.ts +108 -10
- package/src/ui/tui/display.ts +48 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/session/runtime.ts +0 -351
- package/src/tool/find/tui.ts +0 -39
- package/src/tool/graph/execute.ts +0 -62
- package/src/tool/graph/tui.ts +0 -104
- package/src/tool/inspect/tui.ts +0 -36
- package/src/tool/orientation/execute.ts +0 -62
- package/src/tool/refactor-apply/tui.ts +0 -55
- package/src/tool/refactor-plan/tui.ts +0 -41
- package/src/tool/resolve/execute.ts +0 -36
- package/src/tool/resolve/tui.ts +0 -42
- package/src/tool/result/orientation.ts +0 -132
- /package/src/tool/{find → code_find}/ast-kinds.ts +0 -0
- /package/src/tool/{find → code_find}/markdown.ts +0 -0
- /package/src/tool/{find → code_find}/modes.ts +0 -0
- /package/src/tool/{health → code_health}/semantic-state.ts +0 -0
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import type { ConfidenceMode } from "@mrclrchtr/supi-code-runtime/api";
|
|
2
|
+
import type { EvidenceListMetadata } from "../../analysis/evidence.ts";
|
|
3
|
+
import type { ReadNextItem } from "../../analysis/read-next.ts";
|
|
4
|
+
import type {
|
|
5
|
+
OrientationCandidate,
|
|
6
|
+
OrientationItem,
|
|
7
|
+
OrientationResultData,
|
|
8
|
+
OrientationSectionData,
|
|
9
|
+
} from "../../session/orientation-types.ts";
|
|
10
|
+
import type { TargetStoreEntry } from "../../session/target-store.ts";
|
|
11
|
+
import {
|
|
12
|
+
assembledNextQueries,
|
|
13
|
+
assembledReadNext,
|
|
14
|
+
assembleToolResult,
|
|
15
|
+
type ResultSection,
|
|
16
|
+
type ToolResultAssembly,
|
|
17
|
+
} from "../result/assembly.ts";
|
|
18
|
+
import { createToolDisplaySection } from "../result/display.ts";
|
|
19
|
+
import type {
|
|
20
|
+
ContextDetails,
|
|
21
|
+
OrientationSectionDetails,
|
|
22
|
+
ToolDisplaySection,
|
|
23
|
+
} from "../result/types.ts";
|
|
24
|
+
|
|
25
|
+
export interface OrientationDetailsInput {
|
|
26
|
+
readonly confidence: ConfidenceMode;
|
|
27
|
+
readonly task?: string | null;
|
|
28
|
+
readonly focusTarget?: string | null;
|
|
29
|
+
readonly requestedSections?: readonly string[];
|
|
30
|
+
readonly renderedSections?: readonly string[];
|
|
31
|
+
readonly omittedCount?: number;
|
|
32
|
+
readonly evidenceLists?: readonly EvidenceListMetadata[];
|
|
33
|
+
readonly sections?: readonly OrientationSectionData[];
|
|
34
|
+
readonly nextQueries: readonly string[];
|
|
35
|
+
readonly readNext?: readonly ReadNextItem[];
|
|
36
|
+
readonly target?: Readonly<TargetStoreEntry>;
|
|
37
|
+
readonly candidates?: readonly OrientationCandidate[];
|
|
38
|
+
readonly instructions?: OrientationResultData["instructions"];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface OrientationResultAssembly {
|
|
42
|
+
readonly assembled: ToolResultAssembly<OrientationResultData>;
|
|
43
|
+
readonly details: ContextDetails;
|
|
44
|
+
readonly displaySections: readonly ToolDisplaySection[];
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** Build structured candidate rows for an unresolved Orientation target. */
|
|
48
|
+
export function orientationCandidateDisplaySections(
|
|
49
|
+
candidates: readonly OrientationCandidate[],
|
|
50
|
+
omittedCount = 0,
|
|
51
|
+
): readonly ToolDisplaySection[] {
|
|
52
|
+
return [
|
|
53
|
+
createToolDisplaySection({
|
|
54
|
+
key: "orientation.candidates",
|
|
55
|
+
title: "Candidates",
|
|
56
|
+
items: candidates,
|
|
57
|
+
totalCount: candidates.length + omittedCount,
|
|
58
|
+
omittedCount,
|
|
59
|
+
format: (candidate) =>
|
|
60
|
+
`${candidate.rank}. ${candidate.name} (${candidate.kind ?? "unknown"}) — ${candidate.file}:${candidate.line}:${candidate.character} [${candidate.targetId}]`,
|
|
61
|
+
}),
|
|
62
|
+
];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** Assemble Orientation facts and shared result policy before rendering. */
|
|
66
|
+
export function assembleOrientationResult(data: OrientationResultData): OrientationResultAssembly {
|
|
67
|
+
const sections = data.sections.map(toResultSection);
|
|
68
|
+
const evidenceLists = data.sections.flatMap((section) => section.evidenceLists);
|
|
69
|
+
const assembled = assembleToolResult({
|
|
70
|
+
data,
|
|
71
|
+
sections,
|
|
72
|
+
evidenceLists,
|
|
73
|
+
nextQueries: data.nextQueries,
|
|
74
|
+
readNext: data.readNext,
|
|
75
|
+
confidence: data.confidence,
|
|
76
|
+
provenance: uniqueProvenance(data.sections),
|
|
77
|
+
});
|
|
78
|
+
const details = assembleOrientationDetails({
|
|
79
|
+
confidence: assembled.confidence,
|
|
80
|
+
focusTarget: assembled.data.focusTarget,
|
|
81
|
+
requestedSections: assembled.data.requestedSections,
|
|
82
|
+
renderedSections: assembled.data.renderedSections,
|
|
83
|
+
omittedCount: assembled.totals.omittedCount,
|
|
84
|
+
evidenceLists: assembled.evidenceLists,
|
|
85
|
+
sections: assembled.data.sections,
|
|
86
|
+
nextQueries: assembledNextQueries(assembled),
|
|
87
|
+
readNext: assembledReadNext(assembled),
|
|
88
|
+
target: assembled.data.target,
|
|
89
|
+
instructions: assembled.data.instructions,
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
return {
|
|
93
|
+
assembled,
|
|
94
|
+
details,
|
|
95
|
+
displaySections: assembled.data.sections.map(orientationDisplaySection),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** Project canonical Orientation facts into structured Tool details. */
|
|
100
|
+
export function assembleOrientationDetails(input: OrientationDetailsInput): ContextDetails {
|
|
101
|
+
return {
|
|
102
|
+
confidence: input.confidence,
|
|
103
|
+
task: input.task ?? null,
|
|
104
|
+
focusTarget: input.focusTarget ?? null,
|
|
105
|
+
requestedSections: [...(input.requestedSections ?? [])],
|
|
106
|
+
renderedSections: [...(input.renderedSections ?? [])],
|
|
107
|
+
omittedCount: input.omittedCount ?? 0,
|
|
108
|
+
evidenceLists: input.evidenceLists ? [...input.evidenceLists] : undefined,
|
|
109
|
+
sections: input.sections?.map(toDetailsSection),
|
|
110
|
+
nextQueries: [...input.nextQueries],
|
|
111
|
+
readNext: input.readNext ? [...input.readNext] : undefined,
|
|
112
|
+
target: input.target ? { ...input.target } : undefined,
|
|
113
|
+
instructions: input.instructions,
|
|
114
|
+
candidates: input.candidates?.map((candidate) => ({
|
|
115
|
+
targetId: candidate.targetId,
|
|
116
|
+
name: candidate.name,
|
|
117
|
+
kind: candidate.kind,
|
|
118
|
+
container: candidate.container,
|
|
119
|
+
file: candidate.file,
|
|
120
|
+
line: candidate.line,
|
|
121
|
+
character: candidate.character,
|
|
122
|
+
rank: candidate.rank,
|
|
123
|
+
})),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function orientationDisplaySection(section: OrientationSectionData): ToolDisplaySection {
|
|
128
|
+
const items = section.items.filter((item) => item.kind !== "blank");
|
|
129
|
+
return createToolDisplaySection({
|
|
130
|
+
key: `orientation.${section.key}`,
|
|
131
|
+
title: section.title,
|
|
132
|
+
items,
|
|
133
|
+
totalCount: items.length,
|
|
134
|
+
omittedCount: 0,
|
|
135
|
+
partialReason:
|
|
136
|
+
section.reason ??
|
|
137
|
+
section.evidenceLists.find((evidence) => evidence.partialReason)?.partialReason,
|
|
138
|
+
format: formatOrientationItem,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function formatOrientationItem(item: OrientationItem): string {
|
|
143
|
+
switch (item.kind) {
|
|
144
|
+
case "paragraph":
|
|
145
|
+
case "list-item":
|
|
146
|
+
case "subheading":
|
|
147
|
+
return item.text;
|
|
148
|
+
case "code":
|
|
149
|
+
return item.lines.join(" ");
|
|
150
|
+
case "blank":
|
|
151
|
+
return "";
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function toResultSection(section: OrientationSectionData): ResultSection {
|
|
156
|
+
return {
|
|
157
|
+
key: section.key,
|
|
158
|
+
title: section.title,
|
|
159
|
+
status: section.status,
|
|
160
|
+
items: [section.key],
|
|
161
|
+
confidence: section.confidence,
|
|
162
|
+
provenance: section.provenance,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function toDetailsSection(section: OrientationSectionData): OrientationSectionDetails {
|
|
167
|
+
return {
|
|
168
|
+
key: section.key,
|
|
169
|
+
title: section.title,
|
|
170
|
+
status: section.status,
|
|
171
|
+
reason: section.reason,
|
|
172
|
+
confidence: section.confidence,
|
|
173
|
+
provenance: section.provenance.map((provenance) => ({ ...provenance })),
|
|
174
|
+
evidenceLists: section.evidenceLists.map((evidence) => ({ ...evidence })),
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function uniqueProvenance(sections: readonly OrientationSectionData[]) {
|
|
179
|
+
const seen = new Set<string>();
|
|
180
|
+
return sections.flatMap((section) =>
|
|
181
|
+
section.provenance.filter((provenance) => {
|
|
182
|
+
const key = `${provenance.source}:${provenance.capability ?? ""}:${provenance.detail ?? ""}`;
|
|
183
|
+
if (seen.has(key)) return false;
|
|
184
|
+
seen.add(key);
|
|
185
|
+
return true;
|
|
186
|
+
}),
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
import type { CodeIntelResult, CodeIntelToolExecCtx } from "../../types/index.ts";
|
|
191
|
+
import { contextErrorResult } from "../result/errors.ts";
|
|
192
|
+
import { renderOrientationResult } from "./markdown.ts";
|
|
193
|
+
|
|
194
|
+
type OrientationOutcome = Awaited<ReturnType<CodeIntelToolExecCtx["session"]["orient"]>>;
|
|
195
|
+
|
|
196
|
+
/** Assemble the final model-visible code_orientation result for one workflow outcome. */
|
|
197
|
+
export function finishOrientationResult(outcome: OrientationOutcome): CodeIntelResult {
|
|
198
|
+
if (outcome.kind === "unavailable") throw new Error(outcome.reason);
|
|
199
|
+
if (outcome.kind === "invalid-input") {
|
|
200
|
+
return contextErrorResult(`**Error:** ${outcome.message}`, {
|
|
201
|
+
nextQueries: ["Choose an existing path, module, or precise target"],
|
|
202
|
+
message: outcome.message,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
if (outcome.kind === "disambiguation" || outcome.kind === "kind-mismatch") {
|
|
206
|
+
const candidates = outcome.candidates ?? [];
|
|
207
|
+
const lines = [
|
|
208
|
+
outcome.kind === "kind-mismatch"
|
|
209
|
+
? `# No Orientation target matched provider kind \`${outcome.requestedKind}\``
|
|
210
|
+
: "# Multiple Orientation targets",
|
|
211
|
+
"",
|
|
212
|
+
];
|
|
213
|
+
for (const candidate of candidates) {
|
|
214
|
+
lines.push(
|
|
215
|
+
`${candidate.rank}. **${candidate.name}** (\`${candidate.kind ?? "unknown"}\`) — \`${candidate.file}\`:${candidate.line}:${candidate.character} — \`${candidate.targetId}\``,
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
const nextQueries =
|
|
219
|
+
outcome.kind === "kind-mismatch"
|
|
220
|
+
? ["Retry without symbolKind, use an observed provider kind, or focus one handle"]
|
|
221
|
+
: ["Use one candidate handle as focus.target.handle"];
|
|
222
|
+
const details = assembleOrientationDetails({
|
|
223
|
+
confidence: "semantic",
|
|
224
|
+
omittedCount: outcome.omittedCount,
|
|
225
|
+
candidates,
|
|
226
|
+
nextQueries,
|
|
227
|
+
});
|
|
228
|
+
return {
|
|
229
|
+
content: lines.join("\n"),
|
|
230
|
+
details: {
|
|
231
|
+
type: "context",
|
|
232
|
+
data: details,
|
|
233
|
+
status: "completed",
|
|
234
|
+
displaySections: orientationCandidateDisplaySections(candidates, outcome.omittedCount),
|
|
235
|
+
},
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
const assembly = assembleOrientationResult(outcome.data);
|
|
239
|
+
return {
|
|
240
|
+
content: renderOrientationResult(assembly),
|
|
241
|
+
details: {
|
|
242
|
+
type: "context",
|
|
243
|
+
data: assembly.details,
|
|
244
|
+
status: "completed",
|
|
245
|
+
displaySections: assembly.displaySections,
|
|
246
|
+
},
|
|
247
|
+
};
|
|
248
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Type } from "typebox";
|
|
2
|
+
import type { CodeIntelToolExecCtx } from "../../types/index.ts";
|
|
3
|
+
import { MaxResultsParam, OrientationFocusParam } from "../schemas.ts";
|
|
4
|
+
import { executeOrientationTool } from "./execute.ts";
|
|
5
|
+
import { renderOrientationCall, renderOrientationResult } from "./tui.ts";
|
|
6
|
+
|
|
7
|
+
export const CODE_ORIENTATION_TOOL_NAME = "code_orientation";
|
|
8
|
+
export const CODE_ORIENTATION_TOOL_LABEL = "Code Orientation";
|
|
9
|
+
|
|
10
|
+
/** Canonical provider-facing metadata for the code_orientation tool. */
|
|
11
|
+
export const codeOrientationSpec = {
|
|
12
|
+
name: CODE_ORIENTATION_TOOL_NAME,
|
|
13
|
+
label: CODE_ORIENTATION_TOOL_LABEL,
|
|
14
|
+
parameters: Type.Object(
|
|
15
|
+
{
|
|
16
|
+
focus: Type.Optional(OrientationFocusParam),
|
|
17
|
+
maxResults: Type.Optional(MaxResultsParam),
|
|
18
|
+
},
|
|
19
|
+
{ additionalProperties: false },
|
|
20
|
+
),
|
|
21
|
+
run: (params: unknown, ctx: CodeIntelToolExecCtx) =>
|
|
22
|
+
executeOrientationTool(params as Parameters<typeof executeOrientationTool>[0], ctx),
|
|
23
|
+
renderCall: renderOrientationCall,
|
|
24
|
+
renderResult: renderOrientationResult,
|
|
25
|
+
} as const;
|
|
@@ -1,63 +1,79 @@
|
|
|
1
|
+
/** TUI renderer for code_orientation. */
|
|
1
2
|
import { getMarkdownTheme, type Theme } from "@earendil-works/pi-coding-agent";
|
|
2
3
|
import { Container, Markdown, Spacer, Text } from "@earendil-works/pi-tui";
|
|
3
4
|
import {
|
|
4
5
|
type EvidenceEntry,
|
|
6
|
+
formatCallPath,
|
|
7
|
+
formatCallValue,
|
|
5
8
|
formatEvidenceEntry,
|
|
6
9
|
type ResultOptios,
|
|
7
10
|
readEvidenceEntries,
|
|
11
|
+
renderDomainError,
|
|
12
|
+
renderDomainResult,
|
|
13
|
+
renderExecutionError,
|
|
8
14
|
renderPartial,
|
|
15
|
+
renderStructuredDetailBody,
|
|
16
|
+
renderToolDisplaySections,
|
|
17
|
+
renderTruncationDisclosure,
|
|
18
|
+
type ToolRendererContext,
|
|
9
19
|
type ToolResult,
|
|
10
20
|
} from "../../ui/tui/common.ts";
|
|
11
21
|
import type { CodeOrientationToolParams } from "./execute.ts";
|
|
12
22
|
|
|
13
|
-
/**
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
23
|
+
/** Render the compact code_orientation call header. */
|
|
24
|
+
export function renderOrientationCall(
|
|
25
|
+
args: unknown,
|
|
26
|
+
theme: Theme,
|
|
27
|
+
_context: ToolRendererContext | undefined,
|
|
28
|
+
): Text {
|
|
29
|
+
const params = (args ?? {}) as Partial<CodeOrientationToolParams>;
|
|
18
30
|
let content = theme.fg("toolTitle", "code_orientation");
|
|
31
|
+
const focus = params.focus;
|
|
19
32
|
|
|
20
|
-
if (!
|
|
33
|
+
if (!focus || typeof focus !== "object") {
|
|
21
34
|
content += ` ${theme.fg("muted", "workspace")}`;
|
|
22
|
-
} else if ("path" in
|
|
23
|
-
const
|
|
24
|
-
content += ` ${theme.fg("accent",
|
|
25
|
-
} else if ("module" in
|
|
26
|
-
content += ` ${theme.fg("accent",
|
|
27
|
-
} else {
|
|
35
|
+
} else if ("path" in focus) {
|
|
36
|
+
const path = formatCallPath(focus.path);
|
|
37
|
+
content += ` ${theme.fg("accent", path ?? "path?")}`;
|
|
38
|
+
} else if ("module" in focus) {
|
|
39
|
+
content += ` ${theme.fg("accent", formatCallValue(focus.module) ?? "module?")}`;
|
|
40
|
+
} else if ("target" in focus) {
|
|
28
41
|
content += ` ${theme.fg("accent", "target")}`;
|
|
29
42
|
}
|
|
30
43
|
|
|
31
44
|
return new Text(content, 0, 0);
|
|
32
45
|
}
|
|
33
46
|
|
|
34
|
-
/**
|
|
35
|
-
|
|
47
|
+
/** Render code_orientation progress, status, and structured result details. */
|
|
36
48
|
export function renderOrientationResult(
|
|
37
49
|
result: ToolResult,
|
|
38
50
|
options: ResultOptios,
|
|
39
51
|
theme: Theme,
|
|
40
|
-
|
|
52
|
+
context: ToolRendererContext | undefined,
|
|
41
53
|
): Container | Text {
|
|
42
|
-
if (options.isPartial)
|
|
43
|
-
return renderPartial("Orienting…", theme);
|
|
44
|
-
}
|
|
54
|
+
if (options.isPartial) return renderPartial("Orienting…", theme);
|
|
45
55
|
|
|
46
|
-
const container = new Container();
|
|
47
56
|
const data =
|
|
48
57
|
result.details?.type === "context" ? (result.details.data as Record<string, unknown>) : null;
|
|
49
58
|
const markdownText = result.content.find((c) => c.type === "text")?.text ?? "";
|
|
50
59
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
60
|
+
const executionError = renderExecutionError(context, "code_orientation failed", theme);
|
|
61
|
+
if (executionError) return executionError;
|
|
62
|
+
const domainError = renderDomainError(result, theme);
|
|
63
|
+
if (domainError) return renderDomainResult(result, options, theme, domainError);
|
|
55
64
|
|
|
56
65
|
if (!options.expanded) {
|
|
57
|
-
|
|
58
|
-
|
|
66
|
+
const compact = buildCompactSummary(data, theme);
|
|
67
|
+
const truncation = renderTruncationDisclosure(result, theme);
|
|
68
|
+
if (!truncation) return compact;
|
|
69
|
+
const compactContainer = new Container();
|
|
70
|
+
compactContainer.addChild(compact);
|
|
71
|
+
compactContainer.addChild(new Spacer(1));
|
|
72
|
+
compactContainer.addChild(truncation);
|
|
73
|
+
return compactContainer;
|
|
59
74
|
}
|
|
60
75
|
|
|
76
|
+
const container = new Container();
|
|
61
77
|
container.addChild(buildHeader(data, theme));
|
|
62
78
|
|
|
63
79
|
const target = data?.target as Record<string, unknown> | undefined;
|
|
@@ -67,7 +83,7 @@ export function renderOrientationResult(
|
|
|
67
83
|
new Text(
|
|
68
84
|
theme.fg(
|
|
69
85
|
"muted",
|
|
70
|
-
`${
|
|
86
|
+
`${formatCallValue(target.name) ?? "symbol"} — ${formatCallPath(target.file) ?? ""}:${String(target.displayLine ?? "")}`,
|
|
71
87
|
),
|
|
72
88
|
0,
|
|
73
89
|
0,
|
|
@@ -75,10 +91,13 @@ export function renderOrientationResult(
|
|
|
75
91
|
);
|
|
76
92
|
}
|
|
77
93
|
|
|
78
|
-
|
|
79
|
-
|
|
94
|
+
renderToolDisplaySections(container, result.details?.displaySections, theme);
|
|
95
|
+
renderStructuredDetailBody(container, data ?? undefined, theme);
|
|
96
|
+
|
|
97
|
+
const truncation = renderTruncationDisclosure(result, theme);
|
|
98
|
+
if (truncation) {
|
|
80
99
|
container.addChild(new Spacer(1));
|
|
81
|
-
container.addChild(
|
|
100
|
+
container.addChild(truncation);
|
|
82
101
|
}
|
|
83
102
|
|
|
84
103
|
if (markdownText) {
|
|
@@ -90,8 +109,6 @@ export function renderOrientationResult(
|
|
|
90
109
|
return container;
|
|
91
110
|
}
|
|
92
111
|
|
|
93
|
-
/** ── Helpers ───────────────────────────────────────────────────── */
|
|
94
|
-
|
|
95
112
|
function buildCompactSummary(data: Record<string, unknown> | null, theme: Theme): Text {
|
|
96
113
|
if (!data) return new Text(theme.fg("dim", "No orientation"), 0, 0);
|
|
97
114
|
|
|
@@ -112,9 +129,7 @@ function summarySegments(
|
|
|
112
129
|
): string[] {
|
|
113
130
|
const segments: string[] = [];
|
|
114
131
|
const evidence = orientationEvidence(data);
|
|
115
|
-
if (evidence)
|
|
116
|
-
segments.push(theme.fg(badgeColor, theme.bold(formatEvidenceEntry(evidence))));
|
|
117
|
-
}
|
|
132
|
+
if (evidence) segments.push(theme.fg(badgeColor, theme.bold(formatEvidenceEntry(evidence))));
|
|
118
133
|
|
|
119
134
|
const confidence = typeof data.confidence === "string" ? data.confidence : "";
|
|
120
135
|
if (confidence && confidence !== "unavailable") {
|
|
@@ -122,7 +137,8 @@ function summarySegments(
|
|
|
122
137
|
}
|
|
123
138
|
|
|
124
139
|
const target = data.target as Record<string, unknown> | undefined;
|
|
125
|
-
|
|
140
|
+
const targetName = formatCallValue(target?.name);
|
|
141
|
+
if (targetName) segments.push(theme.fg("muted", targetName));
|
|
126
142
|
|
|
127
143
|
return segments;
|
|
128
144
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Thin Pi adapter for session-owned refactor application. */
|
|
2
|
+
|
|
3
|
+
import type { CodeIntelResult, CodeIntelToolExecCtx } from "../../types/index.ts";
|
|
4
|
+
import { toWorkflowControl } from "../infra/workflow-control.ts";
|
|
5
|
+
import { finishRefactorApplyResult } from "./result.ts";
|
|
6
|
+
|
|
7
|
+
export interface CodeRefactorApplyToolParams {
|
|
8
|
+
planId: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export async function executeRefactorApplyTool(
|
|
12
|
+
params: CodeRefactorApplyToolParams,
|
|
13
|
+
ctx: CodeIntelToolExecCtx,
|
|
14
|
+
): Promise<CodeIntelResult> {
|
|
15
|
+
const outcome = await ctx.session.applyRefactor(params, toWorkflowControl(ctx));
|
|
16
|
+
return finishRefactorApplyResult(outcome);
|
|
17
|
+
}
|
|
@@ -1,24 +1,19 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/** Result assembly for code_refactor_apply. */
|
|
2
2
|
|
|
3
3
|
import type { CodeIntelResult, CodeIntelToolExecCtx } from "../../types/index.ts";
|
|
4
|
-
import {
|
|
5
|
-
import { renderRefactorApplyResult } from "../refactor-plan/markdown.ts";
|
|
4
|
+
import { renderRefactorApplyResult } from "../refactor-markdown.ts";
|
|
6
5
|
import { searchErrorResult } from "../result/errors.ts";
|
|
7
6
|
import { assembleRefactorApplyDetails } from "../result/refactor.ts";
|
|
8
7
|
|
|
9
|
-
|
|
10
|
-
planId: string;
|
|
11
|
-
}
|
|
8
|
+
type RefactorApplyOutcome = Awaited<ReturnType<CodeIntelToolExecCtx["session"]["applyRefactor"]>>;
|
|
12
9
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
ctx: CodeIntelToolExecCtx,
|
|
16
|
-
): Promise<CodeIntelResult> {
|
|
17
|
-
const outcome = await ctx.session.applyRefactor(params, toWorkflowControl(ctx));
|
|
10
|
+
/** Assemble the final model-visible code_refactor_apply result for one workflow outcome. */
|
|
11
|
+
export function finishRefactorApplyResult(outcome: RefactorApplyOutcome): CodeIntelResult {
|
|
18
12
|
if (outcome.kind === "unavailable") throw new Error(outcome.reason);
|
|
19
13
|
if (outcome.kind === "invalid-input") {
|
|
20
14
|
return searchErrorResult(`**Error:** ${outcome.message}`, {
|
|
21
15
|
nextQueries: ["Generate a fresh plan with code_refactor_plan"],
|
|
16
|
+
message: outcome.message,
|
|
22
17
|
});
|
|
23
18
|
}
|
|
24
19
|
|
|
@@ -28,6 +23,8 @@ export async function executeRefactorApplyTool(
|
|
|
28
23
|
details: {
|
|
29
24
|
type: "search",
|
|
30
25
|
data: assembly.details,
|
|
26
|
+
status: "completed",
|
|
27
|
+
displaySections: assembly.displaySections,
|
|
31
28
|
},
|
|
32
29
|
};
|
|
33
30
|
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Type } from "typebox";
|
|
2
|
+
import type { CodeIntelToolExecCtx } from "../../types/index.ts";
|
|
3
|
+
import { executeRefactorApplyTool } from "./execute.ts";
|
|
4
|
+
import { renderRefactorApplyCall, renderRefactorApplyResult } from "./tui.ts";
|
|
5
|
+
|
|
6
|
+
export const CODE_REFACTOR_APPLY_TOOL_NAME = "code_refactor_apply";
|
|
7
|
+
export const CODE_REFACTOR_APPLY_TOOL_LABEL = "Code Refactor Apply";
|
|
8
|
+
|
|
9
|
+
/** Canonical provider-facing metadata for the code_refactor_apply tool. */
|
|
10
|
+
export const codeRefactorApplySpec = {
|
|
11
|
+
name: CODE_REFACTOR_APPLY_TOOL_NAME,
|
|
12
|
+
label: CODE_REFACTOR_APPLY_TOOL_LABEL,
|
|
13
|
+
parameters: Type.Object(
|
|
14
|
+
{
|
|
15
|
+
planId: Type.String({
|
|
16
|
+
description: "planId returned by code_refactor_plan.",
|
|
17
|
+
minLength: 1,
|
|
18
|
+
}),
|
|
19
|
+
},
|
|
20
|
+
{ additionalProperties: false },
|
|
21
|
+
),
|
|
22
|
+
run: (params: unknown, ctx: CodeIntelToolExecCtx) =>
|
|
23
|
+
executeRefactorApplyTool(params as Parameters<typeof executeRefactorApplyTool>[0], ctx),
|
|
24
|
+
renderCall: renderRefactorApplyCall,
|
|
25
|
+
renderResult: renderRefactorApplyResult,
|
|
26
|
+
} as const;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/** TUI renderer for code_refactor_apply. */
|
|
2
|
+
import type { Theme } from "@earendil-works/pi-coding-agent";
|
|
3
|
+
import { Container, Spacer, Text } from "@earendil-works/pi-tui";
|
|
4
|
+
import {
|
|
5
|
+
formatCallValue,
|
|
6
|
+
type ResultOptios,
|
|
7
|
+
renderDomainError,
|
|
8
|
+
renderDomainResult,
|
|
9
|
+
renderExecutionError,
|
|
10
|
+
renderMarkdownDetail,
|
|
11
|
+
renderPartial,
|
|
12
|
+
renderToolDisplaySections,
|
|
13
|
+
renderTruncationDisclosure,
|
|
14
|
+
type ToolRendererContext,
|
|
15
|
+
type ToolResult,
|
|
16
|
+
} from "../../ui/tui/common.ts";
|
|
17
|
+
|
|
18
|
+
/** Render the compact code_refactor_apply call header. */
|
|
19
|
+
export function renderRefactorApplyCall(
|
|
20
|
+
args: unknown,
|
|
21
|
+
theme: Theme,
|
|
22
|
+
_context: ToolRendererContext | undefined,
|
|
23
|
+
): Text {
|
|
24
|
+
const params = (args ?? {}) as { planId?: unknown };
|
|
25
|
+
const planId = formatCallValue(params.planId);
|
|
26
|
+
const suffix = planId ? ` ${theme.fg("accent", planId)}` : "";
|
|
27
|
+
return new Text(`${theme.fg("toolTitle", "code_refactor_apply")}${suffix}`, 0, 0);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Render code_refactor_apply progress, status, and structured result details. */
|
|
31
|
+
export function renderRefactorApplyResult(
|
|
32
|
+
result: ToolResult,
|
|
33
|
+
options: ResultOptios,
|
|
34
|
+
theme: Theme,
|
|
35
|
+
context: ToolRendererContext | undefined,
|
|
36
|
+
): Container | Text {
|
|
37
|
+
if (options.isPartial) return renderPartial("Applying…", theme);
|
|
38
|
+
|
|
39
|
+
const executionError = renderExecutionError(context, "code_refactor_apply failed", theme);
|
|
40
|
+
if (executionError) return executionError;
|
|
41
|
+
const domainError = renderDomainError(result, theme);
|
|
42
|
+
if (domainError) return renderDomainResult(result, options, theme, domainError);
|
|
43
|
+
|
|
44
|
+
if (!options.expanded) {
|
|
45
|
+
const applied =
|
|
46
|
+
result.details?.status === "completed" ||
|
|
47
|
+
(result.details?.status === undefined && result.details?.data?.confidence === "semantic");
|
|
48
|
+
const status = new Text(
|
|
49
|
+
applied
|
|
50
|
+
? theme.fg("success", theme.bold("Plan applied"))
|
|
51
|
+
: theme.fg("error", "Refactor apply failed"),
|
|
52
|
+
0,
|
|
53
|
+
0,
|
|
54
|
+
);
|
|
55
|
+
const truncation = renderTruncationDisclosure(result, theme);
|
|
56
|
+
if (!truncation) return status;
|
|
57
|
+
const container = new Container();
|
|
58
|
+
container.addChild(status);
|
|
59
|
+
container.addChild(new Spacer(1));
|
|
60
|
+
container.addChild(truncation);
|
|
61
|
+
return container;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const container = new Container();
|
|
65
|
+
renderToolDisplaySections(container, result.details?.displaySections, theme);
|
|
66
|
+
const truncation = renderTruncationDisclosure(result, theme);
|
|
67
|
+
if (truncation) {
|
|
68
|
+
container.addChild(new Spacer(1));
|
|
69
|
+
container.addChild(truncation);
|
|
70
|
+
}
|
|
71
|
+
renderMarkdownDetail(container, result, theme);
|
|
72
|
+
return container;
|
|
73
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/** Thin Pi adapter for session-owned refactor planning. */
|
|
2
|
+
|
|
3
|
+
import type {
|
|
4
|
+
RefactorOperationInput,
|
|
5
|
+
RefactorPlanWorkflowInput,
|
|
6
|
+
} from "../../session/refactor-types.ts";
|
|
7
|
+
import type { RefactorTargetInput } from "../../session/target-input.ts";
|
|
8
|
+
import type { CodeIntelResult, CodeIntelToolExecCtx } from "../../types/index.ts";
|
|
9
|
+
import { toWorkflowControl } from "../infra/workflow-control.ts";
|
|
10
|
+
import { finishRefactorPlanResult } from "./result.ts";
|
|
11
|
+
|
|
12
|
+
export interface CodeRefactorPlanToolParams {
|
|
13
|
+
target: RefactorTargetInput;
|
|
14
|
+
operation: RefactorOperationInput;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export async function executeRefactorPlanTool(
|
|
18
|
+
params: CodeRefactorPlanToolParams,
|
|
19
|
+
ctx: CodeIntelToolExecCtx,
|
|
20
|
+
_invokedAs: "code_refactor_plan" = "code_refactor_plan",
|
|
21
|
+
): Promise<CodeIntelResult> {
|
|
22
|
+
const outcome = await ctx.session.planRefactor(
|
|
23
|
+
params as RefactorPlanWorkflowInput,
|
|
24
|
+
toWorkflowControl(ctx),
|
|
25
|
+
);
|
|
26
|
+
return finishRefactorPlanResult(outcome, ctx.cwd);
|
|
27
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export const toolDescription =
|
|
2
|
+
"Preview one semantic rename or extraction and return a planId without mutating files.";
|
|
3
|
+
|
|
4
|
+
export const promptSnippet = "preview a precise semantic refactor";
|
|
5
|
+
|
|
6
|
+
export const promptGuidelines = [
|
|
7
|
+
"Use code_refactor_plan for preview only, then call code_refactor_apply with its planId.",
|
|
8
|
+
];
|