@mrclrchtr/supi-code-intelligence 2.0.6 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/README.md +71 -1
  2. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/README.md +29 -21
  3. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +2 -1
  4. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +88 -69
  5. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/config.ts +22 -8
  6. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/prompt-surface.ts +357 -0
  7. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/prompt-surface.ts +4 -0
  8. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-command.ts +1 -1
  9. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +51 -29
  10. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +64 -18
  11. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings.ts +11 -5
  12. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/tool-framework.ts +10 -0
  13. package/node_modules/@mrclrchtr/supi-code-runtime/package.json +2 -2
  14. package/node_modules/@mrclrchtr/supi-core/README.md +29 -21
  15. package/node_modules/@mrclrchtr/supi-core/package.json +2 -1
  16. package/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +88 -69
  17. package/node_modules/@mrclrchtr/supi-core/src/config/config.ts +22 -8
  18. package/node_modules/@mrclrchtr/supi-core/src/config/prompt-surface.ts +357 -0
  19. package/node_modules/@mrclrchtr/supi-core/src/prompt-surface.ts +4 -0
  20. package/node_modules/@mrclrchtr/supi-core/src/settings/settings-command.ts +1 -1
  21. package/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +51 -29
  22. package/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +64 -18
  23. package/node_modules/@mrclrchtr/supi-core/src/settings.ts +11 -5
  24. package/node_modules/@mrclrchtr/supi-core/src/tool-framework.ts +10 -0
  25. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/README.md +29 -21
  26. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +2 -1
  27. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +88 -69
  28. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/config.ts +22 -8
  29. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/prompt-surface.ts +357 -0
  30. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/prompt-surface.ts +4 -0
  31. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-command.ts +1 -1
  32. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +51 -29
  33. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +64 -18
  34. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings.ts +11 -5
  35. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/tool-framework.ts +10 -0
  36. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/package.json +2 -2
  37. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/README.md +29 -21
  38. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/package.json +2 -1
  39. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +88 -69
  40. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/config/config.ts +22 -8
  41. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/config/prompt-surface.ts +357 -0
  42. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/prompt-surface.ts +4 -0
  43. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/settings-command.ts +1 -1
  44. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +51 -29
  45. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +64 -18
  46. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings.ts +11 -5
  47. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/tool-framework.ts +10 -0
  48. package/node_modules/@mrclrchtr/supi-lsp/package.json +3 -3
  49. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/README.md +29 -21
  50. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +2 -1
  51. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +88 -69
  52. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/config.ts +22 -8
  53. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/prompt-surface.ts +357 -0
  54. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/prompt-surface.ts +4 -0
  55. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-command.ts +1 -1
  56. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +51 -29
  57. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +64 -18
  58. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings.ts +11 -5
  59. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/tool-framework.ts +10 -0
  60. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/package.json +2 -2
  61. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/README.md +29 -21
  62. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/package.json +2 -1
  63. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +88 -69
  64. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/config/config.ts +22 -8
  65. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/config/prompt-surface.ts +357 -0
  66. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/prompt-surface.ts +4 -0
  67. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/settings-command.ts +1 -1
  68. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +51 -29
  69. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +64 -18
  70. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings.ts +11 -5
  71. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/tool-framework.ts +10 -0
  72. package/node_modules/@mrclrchtr/supi-tree-sitter/package.json +3 -3
  73. package/package.json +5 -5
  74. package/src/analysis/evidence.ts +13 -0
  75. package/src/analysis/search/pattern.ts +24 -13
  76. package/src/analysis/search/ripgrep.ts +92 -7
  77. package/src/extension.ts +1 -1
  78. package/src/session/capability-adapter.ts +218 -0
  79. package/src/session/session.ts +39 -1
  80. package/src/session/target-workflow.ts +430 -0
  81. package/src/substrate/lsp/settings.ts +7 -3
  82. package/src/tool/find/execute.ts +23 -10
  83. package/src/tool/find/orchestrate.ts +67 -54
  84. package/src/tool/find/semantic-search.ts +30 -16
  85. package/src/tool/graph/collect-relation.ts +2 -1
  86. package/src/tool/graph/execute.ts +40 -12
  87. package/src/tool/graph/markdown-base.ts +5 -37
  88. package/src/tool/graph/orchestrate.ts +9 -35
  89. package/src/tool/graph/tui.ts +2 -0
  90. package/src/tool/guidance.ts +1 -1
  91. package/src/tool/health/markdown.ts +12 -70
  92. package/src/tool/health/orchestrate.ts +5 -13
  93. package/src/tool/impact/analysis.ts +0 -27
  94. package/src/tool/impact/change-set-impact.ts +3 -2
  95. package/src/tool/impact/execute.ts +27 -0
  96. package/src/tool/impact/file-level-impact.ts +3 -2
  97. package/src/tool/impact/result.ts +2 -21
  98. package/src/tool/impact/single-impact.ts +3 -2
  99. package/src/tool/infra/error-results.ts +18 -196
  100. package/src/tool/infra/pipeline.ts +24 -1
  101. package/src/tool/inspect/markdown.ts +4 -41
  102. package/src/tool/inspect/orchestrate.ts +27 -28
  103. package/src/tool/orientation/orchestrate.ts +5 -8
  104. package/src/tool/orientation/precise-target.ts +65 -69
  105. package/src/tool/refactor-apply/orchestrate.ts +2 -7
  106. package/src/tool/refactor-plan/orchestrate.ts +31 -39
  107. package/src/tool/resolve/markdown.ts +5 -6
  108. package/src/tool/resolve/orchestrate.ts +7 -103
  109. package/src/tool/result/errors.ts +199 -0
  110. package/src/tool/result/find.ts +29 -0
  111. package/src/tool/result/graph.ts +93 -0
  112. package/src/tool/result/health.ts +94 -0
  113. package/src/tool/result/impact.ts +50 -0
  114. package/src/tool/result/inspect.ts +60 -0
  115. package/src/tool/result/orientation.ts +30 -0
  116. package/src/tool/result/refactor.ts +35 -0
  117. package/src/tool/result/resolve.ts +114 -0
  118. package/src/tool/result/types.ts +188 -0
  119. package/src/tool/schemas.ts +22 -1
  120. package/src/types/details.ts +17 -185
  121. package/src/ui/tui/common.ts +45 -1
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Tool-result error assembly factories for code-intelligence tool executors.
3
+ *
4
+ * Every factory returns a complete {@link CodeIntelResult} (content + typed
5
+ * details) so executors never need to inline the `{ content, details }`
6
+ * wrapper. Returned tool errors are result assembly concerns; whole-tool
7
+ * capability failures may still throw so PI marks the tool call as failed.
8
+ */
9
+
10
+ import type {
11
+ CodeIntelResult,
12
+ ContextDetails,
13
+ HealthDetails,
14
+ ImpactDetails,
15
+ InspectDetails,
16
+ ResolveDetails,
17
+ SearchDetails,
18
+ } from "../../types/index.ts";
19
+
20
+ // ── Combined error-result factories (preferred) ──────────────────────
21
+
22
+ /** Full error result for search-family tools (code_find, code_graph, code_refactor_plan). */
23
+ export function searchErrorResult(
24
+ content: string,
25
+ opts?: { scope?: string | null; nextQueries?: string[] },
26
+ ): CodeIntelResult {
27
+ return {
28
+ content,
29
+ details: {
30
+ type: "search" as const,
31
+ data: {
32
+ confidence: "unavailable" as const,
33
+ scope: opts?.scope ?? null,
34
+ candidateCount: 0,
35
+ omittedCount: 0,
36
+ nextQueries: opts?.nextQueries ?? [],
37
+ },
38
+ },
39
+ };
40
+ }
41
+
42
+ /** Full error result for code_orientation (context-type details). */
43
+ export function contextErrorResult(
44
+ content: string,
45
+ opts?: { nextQueries?: string[] },
46
+ ): CodeIntelResult {
47
+ return {
48
+ content,
49
+ details: {
50
+ type: "context" as const,
51
+ data: {
52
+ confidence: "unavailable" as const,
53
+ task: null,
54
+ focusTarget: null,
55
+ requestedSections: [],
56
+ renderedSections: [],
57
+ omittedCount: 0,
58
+ nextQueries: opts?.nextQueries ?? [],
59
+ },
60
+ },
61
+ };
62
+ }
63
+
64
+ /** Full error result for code_resolve. */
65
+ export function resolveErrorResult(
66
+ content: string,
67
+ opts?: { nextQueries?: string[] },
68
+ ): CodeIntelResult {
69
+ return {
70
+ content,
71
+ details: {
72
+ type: "resolve" as const,
73
+ data: {
74
+ confidence: "unavailable" as const,
75
+ targetCount: 0,
76
+ omittedCount: 0,
77
+ targets: [],
78
+ nextQueries: opts?.nextQueries ?? [],
79
+ },
80
+ },
81
+ };
82
+ }
83
+
84
+ /** Full error result for code_inspect. */
85
+ export function inspectErrorResult(
86
+ content: string,
87
+ opts?: { focusTarget?: string; nextQueries?: string[] },
88
+ ): CodeIntelResult {
89
+ return {
90
+ content,
91
+ details: {
92
+ type: "inspect" as const,
93
+ data: {
94
+ confidence: "unavailable" as const,
95
+ focusTarget: opts?.focusTarget ?? "",
96
+ unavailableSections: [],
97
+ nextQueries: opts?.nextQueries ?? [],
98
+ },
99
+ },
100
+ };
101
+ }
102
+
103
+ /** Full error result for code_impact. */
104
+ export function impactErrorResult(
105
+ content: string,
106
+ opts?: { nextQueries?: string[] },
107
+ ): CodeIntelResult {
108
+ const data: ImpactDetails = {
109
+ confidence: "unavailable",
110
+ directCount: 0,
111
+ downstreamCount: 0,
112
+ riskLevel: "low",
113
+ checkNext: [],
114
+ likelyTests: [],
115
+ likelyTestCommands: [],
116
+ omittedCount: 0,
117
+ nextQueries: opts?.nextQueries ?? [],
118
+ };
119
+ return { content, details: { type: "impact" as const, data } };
120
+ }
121
+
122
+ /** Full error result for code_health. */
123
+ export function healthErrorResult(content: string, reason?: string): CodeIntelResult {
124
+ return {
125
+ content,
126
+ details: {
127
+ type: "health" as const,
128
+ data: {
129
+ lspAvailable: false,
130
+ lspStatus: reason ?? content,
131
+ recovered: false,
132
+ diagnosticFileCount: 0,
133
+ serverCount: 0,
134
+ },
135
+ },
136
+ };
137
+ }
138
+
139
+ // ── Details-only helpers (thin wrappers — prefer combined factories above) ─
140
+
141
+ export function unavailableSearchDetails(
142
+ scope: string | null,
143
+ nextQueries: string[],
144
+ ): { type: "search"; data: SearchDetails } {
145
+ return searchErrorResult("", { scope, nextQueries }).details as {
146
+ type: "search";
147
+ data: SearchDetails;
148
+ };
149
+ }
150
+
151
+ export function unavailableContextDetails(nextQueries: string[]): {
152
+ type: "context";
153
+ data: ContextDetails;
154
+ } {
155
+ return contextErrorResult("", { nextQueries }).details as {
156
+ type: "context";
157
+ data: ContextDetails;
158
+ };
159
+ }
160
+
161
+ export function unavailableResolveDetails(nextQueries: string[]): {
162
+ type: "resolve";
163
+ data: ResolveDetails;
164
+ } {
165
+ return resolveErrorResult("", { nextQueries }).details as {
166
+ type: "resolve";
167
+ data: ResolveDetails;
168
+ };
169
+ }
170
+
171
+ export function unavailableInspectDetails(
172
+ focusTarget: string,
173
+ nextQueries: string[],
174
+ ): { type: "inspect"; data: InspectDetails } {
175
+ return inspectErrorResult("", { focusTarget, nextQueries }).details as {
176
+ type: "inspect";
177
+ data: InspectDetails;
178
+ };
179
+ }
180
+
181
+ export function unavailableImpactDetails(nextQueries: string[]): {
182
+ type: "impact";
183
+ data: ImpactDetails;
184
+ } {
185
+ return impactErrorResult("", { nextQueries }).details as {
186
+ type: "impact";
187
+ data: ImpactDetails;
188
+ };
189
+ }
190
+
191
+ export function unavailableHealthDetails(reason: string): {
192
+ type: "health";
193
+ data: HealthDetails;
194
+ } {
195
+ return healthErrorResult("", reason).details as {
196
+ type: "health";
197
+ data: HealthDetails;
198
+ };
199
+ }
@@ -0,0 +1,29 @@
1
+ import type { ConfidenceMode } from "@mrclrchtr/supi-code-runtime/api";
2
+ import type { EvidenceListMetadata } from "../../analysis/evidence.ts";
3
+ import type { TestSurfaceDetails } from "../../analysis/tests/test-discovery.ts";
4
+ import type { SearchDetails } from "./types.ts";
5
+
6
+ export interface FindResultAssemblyInput {
7
+ confidence: ConfidenceMode;
8
+ scope: string | null;
9
+ candidateCount: number;
10
+ omittedCount?: number;
11
+ evidenceLists?: EvidenceListMetadata[];
12
+ nextQueries: string[];
13
+ tests?: TestSurfaceDetails;
14
+ }
15
+
16
+ /** Assemble code_find/search-family details before presentation adapters render content. */
17
+ export function assembleFindResult(input: FindResultAssemblyInput): SearchDetails {
18
+ return {
19
+ confidence: input.confidence,
20
+ scope: input.scope,
21
+ candidateCount: input.candidateCount,
22
+ omittedCount:
23
+ input.omittedCount ??
24
+ (input.evidenceLists ?? []).reduce((sum, list) => sum + (list.omittedCount ?? 0), 0),
25
+ evidenceLists: input.evidenceLists,
26
+ nextQueries: input.nextQueries,
27
+ tests: input.tests,
28
+ };
29
+ }
@@ -0,0 +1,93 @@
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 { TestSurfaceDetails } from "../../analysis/tests/test-discovery.ts";
5
+ import type { SearchDetails } from "./types.ts";
6
+
7
+ /** Relation families accepted by code_graph. */
8
+ export type GraphRelationKind =
9
+ | "all"
10
+ | "references"
11
+ | "callees"
12
+ | "imports"
13
+ | "exports"
14
+ | "implements"
15
+ | "tests";
16
+
17
+ /** A relation section in an assembled code_graph result. */
18
+ export type GraphSection =
19
+ | {
20
+ kind: "ok";
21
+ rel: GraphRelationKind;
22
+ count: number;
23
+ /** Relation body prepared for markdown/TUI presentation adapters. */
24
+ content: string;
25
+ evidenceLists?: EvidenceListMetadata[];
26
+ tests?: TestSurfaceDetails;
27
+ readNext?: ReadNextItem[];
28
+ }
29
+ | { kind: "unavailable"; rel: GraphRelationKind; message: string; tests?: TestSurfaceDetails }
30
+ | {
31
+ kind: "not-implemented";
32
+ rel: GraphRelationKind;
33
+ message: string;
34
+ tests?: TestSurfaceDetails;
35
+ };
36
+
37
+ export interface GraphResultAssembly {
38
+ displayName: string;
39
+ sections: GraphSection[];
40
+ resolvedDisplayFile: string;
41
+ scope: string | undefined;
42
+ details: SearchDetails;
43
+ }
44
+
45
+ /** Assemble code_graph evidence/details before markdown and TUI adapters render it. */
46
+ export function assembleGraphResult(input: {
47
+ displayName: string;
48
+ sections: GraphSection[];
49
+ resolvedDisplayFile: string;
50
+ scope: string | undefined;
51
+ }): GraphResultAssembly {
52
+ const evidenceLists = input.sections.flatMap((section) =>
53
+ section.kind === "ok" ? (section.evidenceLists ?? []) : [],
54
+ );
55
+ const omittedCount = evidenceLists.reduce(
56
+ (sum, evidenceList) => sum + (evidenceList.omittedCount ?? 0),
57
+ 0,
58
+ );
59
+
60
+ return {
61
+ ...input,
62
+ details: {
63
+ confidence: graphConfidence(input.sections),
64
+ scope: input.scope ?? null,
65
+ candidateCount: input.sections.reduce(
66
+ (sum, section) => sum + (section.kind === "ok" ? section.count : 0),
67
+ 0,
68
+ ),
69
+ omittedCount,
70
+ evidenceLists,
71
+ nextQueries: [
72
+ "`code_orientation` on individual results for deeper orientation",
73
+ "`code_impact` for impact analysis",
74
+ ],
75
+ tests: input.sections.find((section) => section.rel === "tests")?.tests,
76
+ },
77
+ };
78
+ }
79
+
80
+ function graphConfidence(sections: GraphSection[]): ConfidenceMode {
81
+ const hasStructural = sections.some(
82
+ (s) =>
83
+ s.kind === "ok" &&
84
+ (s.rel === "callees" ||
85
+ s.rel === "imports" ||
86
+ s.rel === "exports" ||
87
+ (s.rel === "tests" && s.count > 0)),
88
+ );
89
+ const hasSemantic = sections.some(
90
+ (s) => s.kind === "ok" && (s.rel === "references" || s.rel === "implements"),
91
+ );
92
+ return hasSemantic ? "semantic" : hasStructural ? "structural" : "unavailable";
93
+ }
@@ -0,0 +1,94 @@
1
+ import type { CoverageWarningReport } from "../../analysis/coverage/coverage-warnings.ts";
2
+ import type { EvidenceListMetadata } from "../../analysis/evidence.ts";
3
+ import type { GitContext } from "../../analysis/signals/git.ts";
4
+ import type { HealthDetails } from "./types.ts";
5
+
6
+ export type HealthSection = "diagnostics" | "servers" | "dirty" | "coverage" | "unused";
7
+
8
+ export interface HealthServerInfo {
9
+ name: string;
10
+ root: string;
11
+ fileTypes: string[];
12
+ status: string;
13
+ }
14
+
15
+ export interface HealthDiagnosticEntry {
16
+ file: string;
17
+ errors: number;
18
+ warnings: number;
19
+ }
20
+
21
+ export interface HealthCoverageEntry {
22
+ file: string;
23
+ pct: number;
24
+ }
25
+
26
+ export interface HealthCoverageData {
27
+ available: boolean;
28
+ entries: HealthCoverageEntry[];
29
+ }
30
+
31
+ export interface HealthUnusedExportEntry {
32
+ file: string;
33
+ name: string;
34
+ }
35
+
36
+ export interface HealthUnusedData {
37
+ available: boolean;
38
+ files: string[];
39
+ exports: HealthUnusedExportEntry[];
40
+ }
41
+
42
+ /** A suggested code action at a specific diagnostic location. */
43
+ export interface CodeActionSuggestion {
44
+ file: string;
45
+ line: number;
46
+ title: string;
47
+ kind?: string;
48
+ }
49
+
50
+ export interface HealthData {
51
+ includedSections: HealthSection[];
52
+ lspAvailable: boolean;
53
+ lspStatus: string;
54
+ recovered: boolean;
55
+ /** Structural (tree-sitter) substrate readiness. Undefined when not evaluated. */
56
+ structuralStatus?: string;
57
+ diagnostics: HealthDiagnosticEntry[];
58
+ servers: HealthServerInfo[];
59
+ gitContext: GitContext | null;
60
+ scopeFilter: string | null;
61
+ level: "summary" | "detailed";
62
+ /** Code action suggestions collected from LSP (only populated in detailed mode). */
63
+ codeActions: CodeActionSuggestion[] | null;
64
+ coverage: HealthCoverageData | null;
65
+ unused: HealthUnusedData | null;
66
+ /** Coverage warnings for degraded semantic/structural substrate. Undefined when fully healthy. */
67
+ degradedCoverage?: CoverageWarningReport;
68
+ /** Seconds since diagnostics were last refreshed, or undefined if never refreshed. */
69
+ diagnosticAgeSeconds?: number;
70
+ }
71
+
72
+ export interface HealthResultAssembly {
73
+ data: HealthData;
74
+ details: HealthDetails;
75
+ }
76
+
77
+ /** Assemble public code_health evidence and details before presentation adapters render it. */
78
+ export function assembleHealthResult(
79
+ data: HealthData,
80
+ evidenceLists: EvidenceListMetadata[],
81
+ ): HealthResultAssembly {
82
+ return {
83
+ data,
84
+ details: {
85
+ lspAvailable: data.lspAvailable,
86
+ lspStatus: data.lspStatus,
87
+ recovered: data.recovered,
88
+ structuralStatus: data.structuralStatus,
89
+ diagnosticFileCount: data.diagnostics.length,
90
+ serverCount: data.servers.length,
91
+ evidenceLists,
92
+ },
93
+ };
94
+ }
@@ -0,0 +1,50 @@
1
+ import type { EvidenceListMetadata } from "../../analysis/evidence.ts";
2
+ import type { PrioritySignalsSummary } from "../../analysis/signals/project.ts";
3
+ import type { CodeIntelResult } from "../../types/index.ts";
4
+ import type { ImpactAnalysis } from "../impact/types.ts";
5
+ import type { AffectedDetails, ImpactDetails } from "./types.ts";
6
+
7
+ // biome-ignore lint/complexity/useMaxParams: detail assembly keeps shared counts, queries, and signals explicit for both surfaces
8
+ export function assembleImpactDetails(
9
+ analysis: ImpactAnalysis,
10
+ directCount: number,
11
+ omittedCount: number,
12
+ nextQueries: string[],
13
+ prioritySignals: PrioritySignalsSummary | null,
14
+ evidenceLists: EvidenceListMetadata[] = [],
15
+ ): AffectedDetails | ImpactDetails {
16
+ return {
17
+ confidence: analysis.confidence,
18
+ directCount,
19
+ downstreamCount: analysis.downstreamCount,
20
+ riskLevel: analysis.riskLevel,
21
+ checkNext: analysis.checkNext,
22
+ likelyTests: analysis.likelyTests,
23
+ likelyTestCommands: analysis.likelyTestCommands,
24
+ omittedCount,
25
+ evidenceLists,
26
+ nextQueries,
27
+ prioritySignals,
28
+ tests: analysis.tests,
29
+ };
30
+ }
31
+
32
+ export function unavailableImpactResult(content: string, nextQueries: string[]): CodeIntelResult {
33
+ return {
34
+ content,
35
+ details: {
36
+ type: "impact",
37
+ data: {
38
+ confidence: "unavailable",
39
+ directCount: 0,
40
+ downstreamCount: 0,
41
+ riskLevel: "low" as const,
42
+ checkNext: [],
43
+ likelyTests: [],
44
+ likelyTestCommands: [],
45
+ omittedCount: 0,
46
+ nextQueries,
47
+ },
48
+ },
49
+ };
50
+ }
@@ -0,0 +1,60 @@
1
+ import type { ConfidenceMode } from "@mrclrchtr/supi-code-runtime/api";
2
+ import type { EvidenceListMetadata } from "../../analysis/evidence.ts";
3
+ import type { InspectDetails } from "./types.ts";
4
+
5
+ export interface InspectResultData {
6
+ relPath: string;
7
+ line: number;
8
+ character: number;
9
+ confidence: ConfidenceMode;
10
+ node: {
11
+ type: string;
12
+ text: string;
13
+ startLine: number;
14
+ startCharacter: number;
15
+ ancestry?: Array<
16
+ | string
17
+ | {
18
+ type: string;
19
+ startLine: number;
20
+ startCharacter: number;
21
+ endLine?: number;
22
+ endCharacter?: number;
23
+ }
24
+ >;
25
+ } | null;
26
+ enclosingSymbol: {
27
+ name: string;
28
+ kind: string;
29
+ startLine: number;
30
+ endLine: number;
31
+ } | null;
32
+ hover: string | null;
33
+ definitions: Array<{ file: string; line: number; character: number }>;
34
+ diagnostics: Array<{ line: number; severity: number | string; message: string }>;
35
+ codeActions: Array<{ title: string; kind?: string }>;
36
+ codeActionEvidence?: EvidenceListMetadata;
37
+ unavailableSections: string[];
38
+ }
39
+
40
+ export interface InspectResultAssembly {
41
+ data: InspectResultData;
42
+ details: InspectDetails;
43
+ }
44
+
45
+ /** Assemble code_inspect evidence/details before presentation adapters render it. */
46
+ export function assembleInspectResult(
47
+ data: InspectResultData,
48
+ nextQueries: string[],
49
+ ): InspectResultAssembly {
50
+ return {
51
+ data,
52
+ details: {
53
+ confidence: data.confidence,
54
+ focusTarget: `${data.relPath}:${data.line}:${data.character}`,
55
+ unavailableSections: data.unavailableSections,
56
+ evidenceLists: data.codeActionEvidence ? [data.codeActionEvidence] : [],
57
+ nextQueries,
58
+ },
59
+ };
60
+ }
@@ -0,0 +1,30 @@
1
+ import type { ConfidenceMode } from "@mrclrchtr/supi-code-runtime/api";
2
+ import type { TargetStoreEntry } from "../../session/target-store.ts";
3
+ import type { ContextDetails } from "./types.ts";
4
+
5
+ export interface OrientationDetailsInput {
6
+ confidence: ConfidenceMode;
7
+ task?: string | null;
8
+ focusTarget?: string | null;
9
+ requestedSections?: string[];
10
+ renderedSections?: string[];
11
+ omittedCount?: number;
12
+ nextQueries: string[];
13
+ target?: TargetStoreEntry;
14
+ candidates?: ContextDetails["candidates"];
15
+ }
16
+
17
+ /** Assemble code_orientation details before presentation adapters render content. */
18
+ export function assembleOrientationDetails(input: OrientationDetailsInput): ContextDetails {
19
+ return {
20
+ confidence: input.confidence,
21
+ task: input.task ?? null,
22
+ focusTarget: input.focusTarget ?? null,
23
+ requestedSections: input.requestedSections ?? [],
24
+ renderedSections: input.renderedSections ?? [],
25
+ omittedCount: input.omittedCount ?? 0,
26
+ nextQueries: input.nextQueries,
27
+ target: input.target,
28
+ candidates: input.candidates,
29
+ };
30
+ }
@@ -0,0 +1,35 @@
1
+ import type { WorkspaceEdit } from "@mrclrchtr/supi-code-runtime/api";
2
+ import { createEvidenceList } from "../../analysis/evidence.ts";
3
+ import type { ApplyResult } from "../refactor-apply/apply.ts";
4
+ import type { SearchDetails } from "./types.ts";
5
+
6
+ export function assembleRefactorPlanDetails(
7
+ edits: WorkspaceEdit,
8
+ planId: string,
9
+ maxResults = 5,
10
+ ): SearchDetails {
11
+ const editEvidence = createEvidenceList({
12
+ key: "refactor.edits",
13
+ items: edits.edits,
14
+ maxResults,
15
+ }).metadata;
16
+
17
+ return {
18
+ confidence: "semantic",
19
+ scope: null,
20
+ candidateCount: edits.edits.length,
21
+ omittedCount: editEvidence.omittedCount ?? 0,
22
+ evidenceLists: [editEvidence],
23
+ nextQueries: [`Use code_refactor_apply with planId: "${planId}" to apply this refactor`],
24
+ };
25
+ }
26
+
27
+ export function assembleRefactorApplyDetails(applyResult: ApplyResult): SearchDetails {
28
+ return {
29
+ confidence: "semantic",
30
+ scope: null,
31
+ candidateCount: applyResult.kind === "applied" ? applyResult.totalEdits : 0,
32
+ omittedCount: 0,
33
+ nextQueries: ["`code_health` to check for new issues after the refactor"],
34
+ };
35
+ }