@osovv/vv-opencode 1.1.2 → 1.1.5

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/CHANGELOG.md CHANGED
@@ -1,3 +1,29 @@
1
+ ## <small>1.1.5 (2026-07-16)</small>
2
+
3
+ ### Summary
4
+
5
+ Release automation was hardened to require explicit GitHub Actions dispatch with an exact version and commit SHA, replacing the previous tag-push trigger so that all CI gates—typecheck, lint, format, tests, build, pack validation, and release consistency checks—complete successfully before npm publication, remote tag creation, and GitHub Release creation, preventing accidental or premature publishing and enabling safe reruns for tag recovery.
6
+
7
+ * fix(release): gate publishing and tags behind CI ([55908c5](https://github.com/osovv/vv-opencode/commit/55908c5))
8
+
9
+ ## <small>1.1.4 (2026-07-16)</small>
10
+
11
+ ### Summary
12
+
13
+ This release delivers a major upgrade to the `/context` TUI dialog, transforming it from a single aggregate view into a detailed three-tabbed inspector with Overview, Tools, and MCP panels that show per-tool schema and active-history estimates, context-window percentages derived only from the model's positive context limit, and deterministic MCP server attribution through longest-prefix naming. Connected MCP schema catalogs unavailable through OpenCode's public APIs are now explicitly marked as such rather than incorrectly shown as zero, and the dialog content is vertically centered within the host window. A new `tui:local` script enables pre-release smoke testing by building and launching the local TUI export through an isolated temporary config without modifying the user's selected OpenCode, TUI, or vvoc configuration files.
14
+
15
+ * fix(tui): mark unavailable MCP schemas ([b5b7dd6](https://github.com/osovv/vv-opencode/commit/b5b7dd6))
16
+ * feat(tui): add detailed context attribution ([c7bc1c8](https://github.com/osovv/vv-opencode/commit/c7bc1c8))
17
+ * feat(tui): add local testing and center context dialog ([0d9f587](https://github.com/osovv/vv-opencode/commit/0d9f587))
18
+
19
+ ## <small>1.1.3 (2026-07-16)</small>
20
+
21
+ ### Summary
22
+
23
+ Release 1.1.3 fixes a layout issue in the `/context` dialog where a duplicate dialog wrapper caused incorrect rendering. The fix moves dialog container ownership to the host and applies "xlarge" sizing after the content is replaced, ensuring the context breakdown displays with the intended dimensions and no nested modals. This improves the reliability of the context inspection interface for all users.
24
+
25
+ * fix(tui): correct context dialog layout ([0e22c00](https://github.com/osovv/vv-opencode/commit/0e22c00))
26
+
1
27
  ## <small>1.1.2 (2026-07-16)</small>
2
28
 
3
29
  ### Summary
package/README.md CHANGED
@@ -164,7 +164,7 @@ OpenCode is a strong, flexible base for agentic coding, but it intentionally lea
164
164
  | **Model Roles** | Put roles like `vv-role:smart` or `vv-role:fast` in shared agents and skills instead of hardcoded model IDs, then choose provider/model mappings per environment |
165
165
  | **Orchestration Profiles** | Select a concrete work policy — single-session, balanced, or orchestrated — to control how vv-controller delegates. Built-in presets pick a sensible default and status reports the effective profile. |
166
166
  | **Workflow Tracking** | Replace free-form multi-agent chaos with explicit work items, bounded review rounds, reviewer result collection, and hard stops when more context is needed |
167
- | **Context Inspector** | Run `/context` in an active OpenCode TUI session to see provider-reported usage, remaining capacity, approximate observable categories, compaction state, and MCP statuses |
167
+ | **Context Inspector** | Run `/context` in an active OpenCode TUI session for Overview, Tools, and MCP tabs with provider-reported usage, approximate context-window percentages, active post-compaction tool history, and deterministic source attribution |
168
168
 
169
169
  ---
170
170
 
@@ -178,7 +178,7 @@ OpenCode is a strong, flexible base for agentic coding, but it intentionally lea
178
178
  | **HashlineEditPlugin** | Make agent edits safer by tying changes to fresh `read` output, reducing wrong-line and stale-context edits. |
179
179
  | **SystemContextInjectionPlugin** | Inject universal primary guidance plus one startup-resolved orchestration policy into vv-controller, with skill discovery and subagent-only explore worker prompts. |
180
180
  | **SecretsRedactionPlugin** | Reduce accidental secret leakage by redacting tokens, keys, emails, and other sensitive values before messages are sent to the model. |
181
- | **ContextTuiPlugin** | Add a native `/context` dialog that reports measured provider usage and a clearly labeled approximate breakdown of observable context contributors. |
181
+ | **ContextTuiPlugin** | Add a native scrollable `/context` dialog with measured usage plus detailed observable per-tool and per-MCP schema/history estimates, explicitly marking data that OpenCode does not expose. |
182
182
 
183
183
  Workflow work items are opened with explicit intent. For implementation loops, controllers use:
184
184
 
@@ -199,9 +199,15 @@ For review-only reports, use `"mode": "review_only"`. In review-only mode, revie
199
199
 
200
200
  ### `/context` accuracy
201
201
 
202
- Run `/context` inside an active session. The top-line used/remaining values come from the latest assistant turn's provider-reported input, cache-read, and output token counts when OpenCode exposes them. Category rows are estimates derived from observable TUI/SDK state: system instructions, skill catalog, loaded skills, tool schemas, user and assistant messages, tool results, files, and the latest compaction summary.
202
+ Run `/context` inside an active session. Its bounded host-owned dialog has three tabs: **Overview**, **Tools**, and **MCP**. Use left/right arrows or `1`, `2`, and `3` to switch tabs and up/down to scroll long detail. The measured header remains visible on every tab. Top-line used/remaining values come from the latest assistant turn's provider-reported input, cache-read, and output token counts when OpenCode exposes them.
203
203
 
204
- The plugin does **not** claim to reconstruct the exact final provider request. Hidden provider transformations, plugin-added data, or otherwise unattributable content appears as `Unknown/provider-only`; when visible estimates exceed provider usage, the dialog reports estimation drift instead of forcing the totals to match. MCP servers are shown by name and status, while schemas without source metadata are grouped as external/plugin/MCP rather than guessed per server.
204
+ Overview category rows remain provider-neutral estimates derived from observable TUI/SDK state: system instructions, skill catalog, loaded skills, tool schemas, user and assistant messages, tool calls and results, files, and the latest compaction summary. Percentages are always `estimated tokens / current model contextLimit`; if OpenCode does not expose a positive current limit, the percentage is shown as an em dash rather than using another denominator. Numeric percentages may exceed 100% when estimates drift, while visual bars clamp only their fill at 100%.
205
+
206
+ The Tools tab separates each observable current tool's persistent **schema** estimate from its active **history** estimate, call count, combined total, source, and percentages. When a schema catalog is unavailable, the row says `schema unavailable` and labels the history-only subtotal as `known total` rather than presenting a false zero. History includes only tool parts in the active context: the latest compaction summary and subsequent turns. Pending and running calls include observable input; completed calls include output and failed calls include errors. The `skill` tool remains visible in detail, but its history continues to belong to Overview's `Loaded skill results` category so it is not double-counted as `Tool calls and results`.
207
+
208
+ The MCP tab aggregates observable current schema and retained active history by server and nests the attributed tools. OpenCode 1.18.x does not expose connected MCP tool definitions through its public TUI/SDK tool catalog, so connected servers show `current tools unavailable` and `schema unavailable`; their `known total` includes retained history only, while the unexposed schema overhead remains in `Unknown/provider-only`. `disabled`, `failed`, `needs_auth`, and `needs_client_registration` servers have a known zero current schema, while matching call history can remain visible until compaction removes it. Attribution follows OpenCode's sanitized `<server>_<tool>` naming contract with unique longest-prefix matching. Sanitized collisions or other ambiguous ownership fail closed under **Other external/plugin** with a bounded warning instead of being guessed.
209
+
210
+ The plugin does **not** claim to reconstruct the exact final provider request or provide provider-exact tokenization. Hidden provider transformations, plugin-added data, or otherwise unattributable content appears as `Unknown/provider-only`; when visible estimates exceed provider usage, the dialog reports estimation drift instead of forcing totals to match. Collection reuses OpenCode's existing tool catalog, active parts, model metadata, and MCP status snapshot without issuing extra MCP requests.
205
211
 
206
212
  The `context` vvoc plugin toggle defaults to enabled. Disable it with `vvoc plugin disable context`, then restart OpenCode.
207
213
 
@@ -357,7 +363,9 @@ Session handoff notes → ./.vvoc/handoff/YYYY-MM-DD-<session-slug>/handoff.xm
357
363
 
358
364
  Schema is versioned and published with the package — source of truth at `schemas/vvoc/v3.json`. The current config contract is strict: `vvoc.json` must be canonical version 3 and include required sections such as `plugins`. Existing v1/v2/pre-role, incomplete, malformed, or otherwise invalid config files fail instead of being migrated or repaired. `vvoc install` and `vvoc sync` may create a fresh canonical config when no config exists, but they refuse to rewrite an invalid existing `vvoc.json`; fix the file manually and rerun `vvoc sync`.
359
365
 
360
- `vvoc install`, `vvoc init`, and `vvoc sync` conservatively add the pinned base package specifier (for example `@osovv/vv-opencode@1.1.2`) to dedicated `tui.json(c)`; OpenCode then selects the package's public `./tui` export. Sync migrates the broken legacy `@osovv/vv-opencode/tui` form and older managed pins. Existing comments, unrelated settings, unrelated plugin entries, and `[specifier, options]` tuples are preserved; malformed plugin entries fail without rewrite.
366
+ OpenCode intentionally keeps server/runtime plugins and native terminal UI plugins in separate configuration surfaces. `opencode.json(c)` is loaded by the core/server plugin runtime and activates vvoc features such as model roles, Guardian, workflow, hashline edit, and redaction. `tui.json(c)` is loaded by the terminal UI process and activates the package's `./tui` module, currently the `/context` inspector. The same pinned package version appears in both files, but OpenCode selects a different public export for each process; headless/server launches therefore do not need to load the Solid/OpenTUI UI module.
367
+
368
+ `vvoc install`, `vvoc init`, and `vvoc sync` conservatively add the pinned base package specifier (for example `@osovv/vv-opencode@X.Y.Z`) to dedicated `tui.json(c)`; OpenCode then selects the package's public `./tui` export. Sync migrates the broken legacy `@osovv/vv-opencode/tui` form and older managed pins. Existing comments, unrelated settings, unrelated plugin entries, and `[specifier, options]` tuples are preserved; malformed plugin entries fail without rewrite.
361
369
 
362
370
  `vvoc status` and `vvoc doctor` are diagnostic exceptions: they report the installed OpenCode version, the `1.18.2` TUI minimum, selected runtime/TUI/vvoc config paths, and validation problems without normalizing or rewriting the files. `vvoc upgrade` can still finish the package installation when the follow-up `vvoc sync` fails; in that case it reports a partial upgrade, leaves config unchanged, and tells you to fix the invalid config manually before rerunning `vvoc sync`.
363
371
 
@@ -376,6 +384,18 @@ vvoc launch --scope project -- run "hello"
376
384
 
377
385
  `vvoc launch --scope project` is strict and non-mutating: if `.opencode/opencode.json` or `.vvoc/vvoc.json` is missing, it fails with a hint to run `vvoc install --scope project`. When the selected `.opencode/tui.json(c)` exists, launch also sets `OPENCODE_TUI_CONFIG`; a missing TUI file is not synthesized during launch. `--scope effective` follows the layered lookup order, and `--scope global` uses the global config paths.
378
386
 
387
+ ### Test the local TUI before release
388
+
389
+ From this repository, launch OpenCode against the freshly built local `dist/tui.js` without publishing or rewriting your selected configs:
390
+
391
+ ```bash
392
+ bun run tui:local
393
+ bun run tui:local -- -s <session-id>
394
+ bun run tui:local -- --scope project
395
+ ```
396
+
397
+ The command defaults to `effective` config resolution. It builds the package, copies the selected `tui.json(c)` into a temporary isolated config home, replaces only the managed vv-opencode TUI entry with a local `file://` URL, preserves unrelated TUI settings and tuple options, and forwards remaining arguments to OpenCode. The original OpenCode, TUI, and vvoc config files are not modified, and the temporary config is removed after OpenCode exits. Restart the command after source changes because runtime plugins do not live reload.
398
+
379
399
  ---
380
400
 
381
401
  ## Managed Agents
@@ -448,7 +468,7 @@ bun run pack:check
448
468
  ---
449
469
  ## Publishing
450
470
 
451
- The release flow is automated via a local wrapper and a tag-gated GitHub Actions workflow.
471
+ The release flow is automated via a local wrapper and an exact-commit, CI-gated GitHub Actions workflow.
452
472
 
453
473
  ### Local bump
454
474
 
@@ -463,19 +483,25 @@ This will:
463
483
  4. Prepend a `### Summary` section plus conventional commit details to `CHANGELOG.md`
464
484
  5. Update `schemas/vvoc/v3.json` `$id` to the new version
465
485
  6. Run `release:check` for consistency
466
- 7. Create a release commit and annotated tag `vX.Y.Z`
467
- 8. Push the current branch and the created tag to `origin`
486
+ 7. Create a release commit without creating a tag
487
+ 8. Push only the current branch to `origin`
488
+ 9. Dispatch `publish.yml` through `gh` with the exact package version and release commit SHA
468
489
 
469
490
  Required local release prerequisite:
470
491
  - `opencode` must be available from `PATH`.
492
+ - `gh` must be installed and authenticated with permission to dispatch workflows in the repository.
471
493
  - The summary model defaults to `deepseek/deepseek-v4-flash`.
472
494
  - Override with `VVOC_RELEASE_SUMMARY_MODEL=provider/model`.
473
495
  - Override the per-attempt timeout with `VVOC_RELEASE_SUMMARY_TIMEOUT_MS=120000`.
474
- Run `release:bump` from a checked-out branch with push access to `origin`. The tag push is what triggers the publish workflow.
496
+ Run `release:bump` from a checked-out branch with push access to `origin`. A normal branch push never publishes by itself; the wrapper explicitly dispatches the workflow for the exact pushed commit.
475
497
 
476
- The GitHub Actions workflow triggers on `v*` tag pushes, verifies the tag matches
477
- `package.json`, runs full validation (typecheck, lint, fmt check, tests, build, pack
478
- check, `release:check`), and publishes to npm with `--provenance`.
498
+ The GitHub Actions workflow checks out the requested commit SHA, verifies that its
499
+ `package.json` version matches the dispatch input, and runs full validation
500
+ (typecheck, lint, fmt check, tests, build, pack check, and `release:check`). Only
501
+ after every gate passes does it publish to npm with provenance, create and push the
502
+ annotated `vX.Y.Z` tag, and create the GitHub Release. A safe rerun accepts an
503
+ already-published version only when its npm `gitHead` matches the exact requested
504
+ commit, allowing tag or GitHub Release recovery without publishing different bytes.
479
505
 
480
506
  ### Checking consistency manually
481
507
 
@@ -488,7 +514,7 @@ config format version are all consistent. Run it independently anytime.
488
514
 
489
515
  ### CI publish workflow
490
516
 
491
- The workflow uses npm provenance/trusted publishing (`id-token: write`) and does not publish on normal branch pushes. Configure npm trusted publishing for this GitHub repository/package, or adapt the publish step to use an `NPM_TOKEN` secret if token-based publishing is required.
517
+ The workflow uses npm provenance/trusted publishing (`id-token: write`) and can only publish through an explicit `workflow_dispatch` request. Normal branch and tag pushes do not publish. Configure npm trusted publishing for this GitHub repository/package, or adapt the publish step to use an `NPM_TOKEN` secret if token-based publishing is required.
492
518
 
493
519
  ---
494
520
 
@@ -1,4 +1,12 @@
1
1
  import type { Message } from "@opencode-ai/sdk/v2";
2
- import type { ContextAnalysis, ContextAnalysisInput } from "./types.js";
2
+ import type { ContextAnalysis, ContextAnalysisInput, ContextMcpServer, ContextTokenMetric, ContextToolSource, ContextToolUsage } from "./types.js";
3
+ export type ContextToolClassification = {
4
+ source: ContextToolSource;
5
+ ambiguousServers?: string[];
6
+ };
3
7
  export declare function analyzeContext(input: ContextAnalysisInput): ContextAnalysis;
4
8
  export declare function selectActiveMessages(messages: readonly Message[]): readonly Message[];
9
+ export declare function createTokenMetric(estimatedTokens: number, contextLimit: number | undefined): ContextTokenMetric;
10
+ export declare function sanitizeMcpName(value: string): string;
11
+ export declare function classifyToolSource(toolID: string, mcpServers: readonly ContextMcpServer[]): ContextToolClassification;
12
+ export declare function compareToolUsage(left: ContextToolUsage, right: ContextToolUsage): number;
@@ -1,8 +1,8 @@
1
1
  // FILE: src/tui/context/analyze.ts
2
2
  // VERSION: 1.0.0
3
3
  // START_MODULE_CONTRACT
4
- // PURPOSE: Derive a measured-versus-estimated active context breakdown from observable OpenCode session data.
5
- // SCOPE: Compaction cutoff, provider usage baseline, model capacity, skill/tool/message categorization, residual unknown context, and MCP summary preservation.
4
+ // PURPOSE: Derive measured usage plus reconciled category, per-tool, and per-MCP active context attribution from observable OpenCode session data.
5
+ // SCOPE: Compaction cutoff, provider usage baseline, context-limit percentages, skill/tool/message categorization, deterministic MCP ownership, explicit schema observability, residual unknown context, and sorted detail aggregates.
6
6
  // DEPENDS: [@opencode-ai/sdk/v2, src/tui/context/estimate.ts, src/tui/context/types.ts]
7
7
  // LINKS: [M-PLUGIN-CONTEXT-TUI, DF-CONTEXT-INSPECTION, V-M-PLUGIN-CONTEXT-TUI]
8
8
  // ROLE: CORE_LOGIC
@@ -10,12 +10,17 @@
10
10
  // END_MODULE_CONTRACT
11
11
  //
12
12
  // START_MODULE_MAP
13
- // analyzeContext - Produce the complete context analysis rendered by the TUI plugin.
13
+ // analyzeContext - Produce the complete overview and detailed context analysis rendered by the TUI plugin.
14
14
  // selectActiveMessages - Keep only the latest compaction summary and subsequent turns.
15
+ // createTokenMetric - Pair estimated tokens with a percentage only when a positive context limit exists.
16
+ // sanitizeMcpName - Mirror OpenCode's MCP name sanitization contract.
17
+ // classifyToolSource - Classify known tools and uniquely matched MCP prefixes without guessing.
18
+ // ContextToolClassification - Source result plus explicit ambiguous MCP candidates.
19
+ // compareToolUsage - Sort tool detail by combined total descending and ID ascending.
15
20
  // END_MODULE_MAP
16
21
  //
17
22
  // START_CHANGE_SUMMARY
18
- // LAST_CHANGE: [C-CONTEXT-TUI-PLUGIN - Added honest active-context categorization and provider residual accounting.]
23
+ // LAST_CHANGE: [DIRECT-FIX - Preserved unknown connected MCP schemas as unavailable rather than estimating them as zero.]
19
24
  // END_CHANGE_SUMMARY
20
25
  import { estimateTextTokens, estimateValueTokens } from "./estimate.js";
21
26
  const BUILTIN_TOOL_IDS = new Set([
@@ -32,6 +37,7 @@ const BUILTIN_TOOL_IDS = new Set([
32
37
  "write",
33
38
  ]);
34
39
  const VVOC_TOOL_IDS = new Set(["edit", "work_item_open", "work_item_list", "work_item_close"]);
40
+ const MAX_ATTRIBUTION_WARNINGS = 3;
35
41
  const CATEGORY_LABELS = {
36
42
  system: "Agent/system instructions",
37
43
  "skill-catalog": "Skill catalog",
@@ -65,18 +71,42 @@ export function analyzeContext(input) {
65
71
  location: skill.location,
66
72
  });
67
73
  }
74
+ const toolDrafts = new Map();
68
75
  for (const tool of input.tools) {
69
- counters[classifyToolSchema(tool)] += estimateValueTokens({
76
+ const draft = getToolDraft(toolDrafts, tool.id);
77
+ draft.schemaListed = true;
78
+ draft.schemaTokens = estimateValueTokens({
70
79
  id: tool.id,
71
80
  description: tool.description,
72
81
  parameters: tool.parameters,
73
82
  });
74
83
  }
75
84
  const messageByID = new Map(activeMessages.map((message) => [message.id, message]));
85
+ const toolPartsByCall = new Map();
76
86
  for (const part of activeParts) {
87
+ if (part.type === "tool") {
88
+ toolPartsByCall.set(`${part.tool}\u0000${part.callID}`, part);
89
+ continue;
90
+ }
77
91
  countPart(part, messageByID.get(part.messageID), counters);
78
92
  }
79
- const categories = buildKnownCategories(counters);
93
+ for (const part of toolPartsByCall.values()) {
94
+ const historyTokens = countToolPart(part, counters);
95
+ const draft = getToolDraft(toolDrafts, part.tool);
96
+ draft.calls += 1;
97
+ draft.historyTokens += historyTokens;
98
+ }
99
+ const contextLimit = normalizeContextLimit(input.model?.contextLimit);
100
+ const detail = buildToolAttribution(toolDrafts, input.mcpServers, contextLimit, input.mcpSchemaCatalogAvailable ?? false);
101
+ counters["builtin-tool-schemas"] =
102
+ detail.attribution.reconciliation.schema.builtin.estimatedTokens;
103
+ counters["vvoc-tool-schemas"] = detail.attribution.reconciliation.schema.vvoc.estimatedTokens;
104
+ counters["external-tool-schemas"] =
105
+ detail.attribution.reconciliation.schema.external.estimatedTokens;
106
+ counters["tool-results"] = detail.attribution.reconciliation.history.toolResults.estimatedTokens;
107
+ counters["loaded-skills"] =
108
+ detail.attribution.reconciliation.history.loadedSkills.estimatedTokens;
109
+ const categories = buildKnownCategories(counters, contextLimit);
80
110
  const estimatedKnownTokens = categories.reduce((total, category) => total + category.estimatedTokens, 0);
81
111
  const measured = latestAssistant
82
112
  ? createMeasuredUsage(latestAssistant, input.model?.contextLimit)
@@ -89,7 +119,7 @@ export function analyzeContext(input) {
89
119
  categories.push({
90
120
  id: "provider-only",
91
121
  label: CATEGORY_LABELS["provider-only"],
92
- estimatedTokens: providerOnlyTokens,
122
+ ...createTokenMetric(providerOnlyTokens, contextLimit),
93
123
  detail: "Measured provider usage not attributable through public TUI/SDK data",
94
124
  source: "provider-residual",
95
125
  });
@@ -106,7 +136,8 @@ export function analyzeContext(input) {
106
136
  compacted: activeMessages.length < input.messages.length,
107
137
  activeMessageCount: activeMessages.length,
108
138
  mcpServers: [...input.mcpServers],
109
- warnings: [...(input.warnings ?? [])],
139
+ toolAttribution: detail.attribution,
140
+ warnings: [...(input.warnings ?? []), ...detail.warnings],
110
141
  };
111
142
  }
112
143
  export function selectActiveMessages(messages) {
@@ -121,6 +152,160 @@ export function selectActiveMessages(messages) {
121
152
  return summaryIndex >= 0 ? messages.slice(summaryIndex) : messages;
122
153
  }
123
154
  // END_BLOCK_CONTEXT_ANALYSIS
155
+ // START_BLOCK_DETAILED_ATTRIBUTION
156
+ export function createTokenMetric(estimatedTokens, contextLimit) {
157
+ const tokens = Number.isFinite(estimatedTokens) ? Math.max(0, estimatedTokens) : 0;
158
+ const limit = normalizeContextLimit(contextLimit);
159
+ if (limit === undefined)
160
+ return { estimatedTokens: tokens };
161
+ return { estimatedTokens: tokens, percent: (tokens / limit) * 100 };
162
+ }
163
+ export function sanitizeMcpName(value) {
164
+ return value.replace(/[^a-zA-Z0-9_-]/g, "_");
165
+ }
166
+ export function classifyToolSource(toolID, mcpServers) {
167
+ if (VVOC_TOOL_IDS.has(toolID))
168
+ return { source: { kind: "vvoc" } };
169
+ if (BUILTIN_TOOL_IDS.has(toolID))
170
+ return { source: { kind: "builtin" } };
171
+ const uniqueServers = new Map(mcpServers.map((server) => [server.name, server]));
172
+ const candidates = [...uniqueServers.values()]
173
+ .map((server) => ({ name: server.name, prefix: `${sanitizeMcpName(server.name)}_` }))
174
+ .filter((candidate) => toolID.startsWith(candidate.prefix));
175
+ if (candidates.length === 0)
176
+ return { source: { kind: "other" } };
177
+ const longestLength = Math.max(...candidates.map((candidate) => candidate.prefix.length));
178
+ const longest = candidates
179
+ .filter((candidate) => candidate.prefix.length === longestLength)
180
+ .sort((left, right) => compareText(left.name, right.name));
181
+ if (longest.length !== 1) {
182
+ return {
183
+ source: { kind: "other" },
184
+ ambiguousServers: longest.map((candidate) => candidate.name),
185
+ };
186
+ }
187
+ return { source: { kind: "mcp", server: longest[0].name } };
188
+ }
189
+ export function compareToolUsage(left, right) {
190
+ const totalDelta = right.total.estimatedTokens - left.total.estimatedTokens;
191
+ return totalDelta || compareText(left.id, right.id);
192
+ }
193
+ function buildToolAttribution(drafts, mcpServers, contextLimit, mcpSchemaCatalogAvailable) {
194
+ const serverByName = new Map(mcpServers.map((server) => [server.name, server]));
195
+ const ambiguities = new Map();
196
+ const tools = [...drafts.values()]
197
+ .map((draft) => {
198
+ const classification = classifyToolSource(draft.id, mcpServers);
199
+ if (classification.ambiguousServers) {
200
+ ambiguities.set(draft.id, classification.ambiguousServers);
201
+ }
202
+ const server = classification.source.kind === "mcp"
203
+ ? serverByName.get(classification.source.server)
204
+ : undefined;
205
+ const schema = resolveToolSchema(draft, classification.source, server, mcpSchemaCatalogAvailable);
206
+ return {
207
+ id: draft.id,
208
+ source: classification.source,
209
+ calls: draft.calls,
210
+ schemaKnown: schema.known,
211
+ schema: createTokenMetric(schema.tokens, contextLimit),
212
+ history: createTokenMetric(draft.historyTokens, contextLimit),
213
+ total: createTokenMetric(schema.tokens + draft.historyTokens, contextLimit),
214
+ };
215
+ })
216
+ .sort(compareToolUsage);
217
+ const schemaBuiltin = sumTools(tools, (tool) => tool.source.kind === "builtin", "schema");
218
+ const schemaVvoc = sumTools(tools, (tool) => tool.source.kind === "vvoc", "schema");
219
+ const schemaExternal = sumTools(tools, (tool) => tool.source.kind === "mcp" || tool.source.kind === "other", "schema");
220
+ const historyToolResults = sumTools(tools, (tool) => tool.id !== "skill", "history");
221
+ const historyLoadedSkills = sumTools(tools, (tool) => tool.id === "skill", "history");
222
+ const uniqueServers = [...serverByName.values()];
223
+ const mcpUsage = uniqueServers
224
+ .map((server) => {
225
+ const serverTools = tools.filter((tool) => tool.source.kind === "mcp" && tool.source.server === server.name);
226
+ const schemaKnown = server.status !== "connected" || mcpSchemaCatalogAvailable;
227
+ const schemaTokens = schemaKnown ? sumTools(serverTools, () => true, "schema") : 0;
228
+ const historyTokens = sumTools(serverTools, () => true, "history");
229
+ return {
230
+ ...server,
231
+ toolCount: schemaKnown
232
+ ? serverTools.filter((tool) => tool.schema.estimatedTokens > 0).length
233
+ : undefined,
234
+ schemaKnown,
235
+ schema: createTokenMetric(schemaTokens, contextLimit),
236
+ history: createTokenMetric(historyTokens, contextLimit),
237
+ total: createTokenMetric(schemaTokens + historyTokens, contextLimit),
238
+ tools: serverTools,
239
+ };
240
+ })
241
+ .sort(compareMcpUsage);
242
+ return {
243
+ attribution: {
244
+ tools,
245
+ mcpServers: mcpUsage,
246
+ otherTools: tools.filter((tool) => tool.source.kind === "other"),
247
+ reconciliation: {
248
+ schema: {
249
+ builtin: createTokenMetric(schemaBuiltin, contextLimit),
250
+ vvoc: createTokenMetric(schemaVvoc, contextLimit),
251
+ external: createTokenMetric(schemaExternal, contextLimit),
252
+ total: createTokenMetric(schemaBuiltin + schemaVvoc + schemaExternal, contextLimit),
253
+ },
254
+ history: {
255
+ toolResults: createTokenMetric(historyToolResults, contextLimit),
256
+ loadedSkills: createTokenMetric(historyLoadedSkills, contextLimit),
257
+ total: createTokenMetric(historyToolResults + historyLoadedSkills, contextLimit),
258
+ },
259
+ },
260
+ },
261
+ warnings: buildAmbiguityWarnings(ambiguities),
262
+ };
263
+ }
264
+ function getToolDraft(drafts, id) {
265
+ const current = drafts.get(id);
266
+ if (current)
267
+ return current;
268
+ const created = { id, schemaListed: false, schemaTokens: 0, historyTokens: 0, calls: 0 };
269
+ drafts.set(id, created);
270
+ return created;
271
+ }
272
+ function resolveToolSchema(draft, source, server, mcpSchemaCatalogAvailable) {
273
+ if (source.kind !== "mcp") {
274
+ return { known: draft.schemaListed, tokens: draft.schemaTokens };
275
+ }
276
+ if (!server)
277
+ return { known: false, tokens: 0 };
278
+ if (server.status !== "connected")
279
+ return { known: true, tokens: 0 };
280
+ if (!mcpSchemaCatalogAvailable)
281
+ return { known: false, tokens: 0 };
282
+ return { known: true, tokens: draft.schemaListed ? draft.schemaTokens : 0 };
283
+ }
284
+ function sumTools(tools, include, metric) {
285
+ return tools.reduce((total, tool) => total + (include(tool) ? tool[metric].estimatedTokens : 0), 0);
286
+ }
287
+ function compareMcpUsage(left, right) {
288
+ const totalDelta = right.total.estimatedTokens - left.total.estimatedTokens;
289
+ return totalDelta || compareText(left.name, right.name);
290
+ }
291
+ function compareText(left, right) {
292
+ return left < right ? -1 : left > right ? 1 : 0;
293
+ }
294
+ function buildAmbiguityWarnings(ambiguities) {
295
+ const entries = [...ambiguities.entries()].sort(([left], [right]) => compareText(left, right));
296
+ const visible = entries.length > MAX_ATTRIBUTION_WARNINGS
297
+ ? entries.slice(0, MAX_ATTRIBUTION_WARNINGS - 1)
298
+ : entries;
299
+ const warnings = visible.map(([toolID, servers]) => boundWarning(`MCP attribution ambiguous for "${toolID}": matches ${servers.join(", ")}; grouped under Other external/plugin.`));
300
+ if (entries.length > MAX_ATTRIBUTION_WARNINGS) {
301
+ warnings.push(`MCP attribution ambiguous for ${entries.length - visible.length} additional tool IDs; grouped under Other external/plugin.`);
302
+ }
303
+ return warnings;
304
+ }
305
+ function boundWarning(value) {
306
+ return value.length > 180 ? `${value.slice(0, 177)}...` : value;
307
+ }
308
+ // END_BLOCK_DETAILED_ATTRIBUTION
124
309
  // START_BLOCK_CATEGORY_COUNTING
125
310
  function createCategoryCounter() {
126
311
  return {
@@ -137,13 +322,6 @@ function createCategoryCounter() {
137
322
  "compacted-summary": 0,
138
323
  };
139
324
  }
140
- function classifyToolSchema(tool) {
141
- if (VVOC_TOOL_IDS.has(tool.id))
142
- return "vvoc-tool-schemas";
143
- if (BUILTIN_TOOL_IDS.has(tool.id))
144
- return "builtin-tool-schemas";
145
- return "external-tool-schemas";
146
- }
147
325
  function countPart(part, message, counters) {
148
326
  switch (part.type) {
149
327
  case "text": {
@@ -184,9 +362,6 @@ function countPart(part, message, counters) {
184
362
  url: part.url.startsWith("data:") ? undefined : part.url,
185
363
  });
186
364
  return;
187
- case "tool":
188
- countToolPart(part, counters);
189
- return;
190
365
  default:
191
366
  return;
192
367
  }
@@ -200,7 +375,8 @@ function countToolPart(part, counters) {
200
375
  error: state.status === "error" ? state.error : undefined,
201
376
  };
202
377
  const target = part.tool === "skill" ? "loaded-skills" : "tool-results";
203
- counters[target] += estimateValueTokens(payload);
378
+ const historyTokens = estimateValueTokens(payload);
379
+ counters[target] += historyTokens;
204
380
  if (state.status === "completed") {
205
381
  for (const attachment of state.attachments ?? []) {
206
382
  counters.files += estimateValueTokens({
@@ -210,14 +386,15 @@ function countToolPart(part, counters) {
210
386
  });
211
387
  }
212
388
  }
389
+ return historyTokens;
213
390
  }
214
- function buildKnownCategories(counters) {
391
+ function buildKnownCategories(counters, contextLimit) {
215
392
  return Object.entries(counters)
216
393
  .filter(([, estimatedTokens]) => estimatedTokens > 0)
217
394
  .map(([id, estimatedTokens]) => ({
218
395
  id,
219
396
  label: CATEGORY_LABELS[id],
220
- estimatedTokens,
397
+ ...createTokenMetric(estimatedTokens, contextLimit),
221
398
  source: "estimated",
222
399
  }));
223
400
  }
@@ -225,7 +402,7 @@ function buildKnownCategories(counters) {
225
402
  // START_BLOCK_MEASURED_USAGE
226
403
  function createMeasuredUsage(message, contextLimit) {
227
404
  const usedTokens = message.tokens.input + message.tokens.cache.read + message.tokens.output;
228
- const normalizedLimit = contextLimit && contextLimit > 0 ? contextLimit : undefined;
405
+ const normalizedLimit = normalizeContextLimit(contextLimit);
229
406
  return {
230
407
  usedTokens,
231
408
  contextLimit: normalizedLimit,
@@ -236,6 +413,11 @@ function createMeasuredUsage(message, contextLimit) {
236
413
  outputTokens: message.tokens.output,
237
414
  };
238
415
  }
416
+ function normalizeContextLimit(contextLimit) {
417
+ return contextLimit !== undefined && Number.isFinite(contextLimit) && contextLimit > 0
418
+ ? contextLimit
419
+ : undefined;
420
+ }
239
421
  function findLatestAssistant(messages) {
240
422
  for (let index = messages.length - 1; index >= 0; index -= 1) {
241
423
  const message = messages[index];
@@ -1 +1 @@
1
- {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../../src/tui/context/analyze.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../../src/tui/context/analyze.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  // VERSION: 1.0.0
3
3
  // START_MODULE_CONTRACT
4
4
  // PURPOSE: Collect bounded observable session, skill, agent, tool, model, and MCP data from the OpenCode TUI API.
5
- // SCOPE: Active session snapshots, safe SDK lookups, provider/model limit resolution, and bounded warning capture.
5
+ // SCOPE: Active session snapshots, safe SDK lookups, provider/model limit resolution, explicit MCP schema-catalog availability, and bounded warning capture.
6
6
  // DEPENDS: [@opencode-ai/plugin/tui, @opencode-ai/sdk/v2, src/tui/context/analyze.ts, src/tui/context/types.ts]
7
7
  // LINKS: [M-PLUGIN-CONTEXT-TUI, DF-CONTEXT-INSPECTION, V-M-PLUGIN-CONTEXT-TUI]
8
8
  // ROLE: INTEGRATION
@@ -10,13 +10,19 @@
10
10
  // END_MODULE_CONTRACT
11
11
  //
12
12
  // START_MODULE_MAP
13
- // collectContextAnalysis - Read current TUI state and SDK catalogs, then invoke the pure analyzer.
13
+ // collectContextAnalysis - Read current TUI state and supported SDK catalogs, mark unavailable MCP schema data, then invoke the pure analyzer.
14
14
  // END_MODULE_MAP
15
15
  //
16
16
  // START_CHANGE_SUMMARY
17
- // LAST_CHANGE: [C-CONTEXT-TUI-PLUGIN - Added fail-soft OpenCode TUI context collection.]
17
+ // LAST_CHANGE: [DIRECT-FIX - Marked the unsupported public MCP schema catalog as unavailable instead of zero.]
18
18
  // END_CHANGE_SUMMARY
19
19
  import { analyzeContext } from "./analyze.js";
20
+ // KNOWN LIMITATION (related upstream request: https://github.com/anomalyco/opencode/issues/1142):
21
+ // OpenCode 1.18.x serves /experimental/tool from ToolRegistry, then appends MCP tools later
22
+ // while constructing a session. Public TUI/SDK state exposes MCP status but no MCP schema
23
+ // catalog. Keep this false until OpenCode exposes a supported catalog; absence is unavailable,
24
+ // not a zero-token schema. Reconnecting to MCP servers here would duplicate host processes/auth.
25
+ const OPENCODE_MCP_SCHEMA_CATALOG_AVAILABLE = false;
20
26
  // START_BLOCK_CONTEXT_COLLECTION
21
27
  export async function collectContextAnalysis(api, sessionID) {
22
28
  const messages = [...api.state.session.messages(sessionID)];
@@ -46,6 +52,7 @@ export async function collectContextAnalysis(api, sessionID) {
46
52
  agents,
47
53
  skills,
48
54
  tools,
55
+ mcpSchemaCatalogAvailable: OPENCODE_MCP_SCHEMA_CATALOG_AVAILABLE,
49
56
  mcpServers: api.state.mcp().map((server) => ({
50
57
  name: server.name,
51
58
  status: server.status,
@@ -1 +1 @@
1
- {"version":3,"file":"collect.js","sourceRoot":"","sources":["../../../src/tui/context/collect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"collect.js","sourceRoot":"","sources":["../../../src/tui/context/collect.ts"],"names":[],"mappings":"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"}
@@ -5,9 +5,10 @@ export type ContextSkill = {
5
5
  location: string;
6
6
  content: string;
7
7
  };
8
+ export type ContextMcpStatus = "connected" | "disabled" | "failed" | "needs_auth" | "needs_client_registration";
8
9
  export type ContextMcpServer = {
9
10
  name: string;
10
- status: string;
11
+ status: ContextMcpStatus;
11
12
  error?: string;
12
13
  };
13
14
  export type ContextModel = {
@@ -24,18 +25,69 @@ export type ContextAnalysisInput = {
24
25
  agents: readonly Agent[];
25
26
  skills: readonly ContextSkill[];
26
27
  tools: readonly ToolListItem[];
28
+ /** Whether tools contains the complete connected MCP schema catalog. Defaults to false. */
29
+ mcpSchemaCatalogAvailable?: boolean;
27
30
  mcpServers: readonly ContextMcpServer[];
28
31
  model?: ContextModel;
29
32
  warnings?: readonly string[];
30
33
  };
31
34
  export type ContextCategoryId = "system" | "skill-catalog" | "loaded-skills" | "builtin-tool-schemas" | "vvoc-tool-schemas" | "external-tool-schemas" | "user-messages" | "assistant-messages" | "tool-results" | "files" | "compacted-summary" | "provider-only";
32
- export type ContextCategory = {
35
+ export type ContextTokenMetric = {
36
+ estimatedTokens: number;
37
+ percent?: number;
38
+ };
39
+ export type ContextCategory = ContextTokenMetric & {
33
40
  id: ContextCategoryId;
34
41
  label: string;
35
- estimatedTokens: number;
36
42
  detail?: string;
37
43
  source: "estimated" | "provider-residual";
38
44
  };
45
+ export type ContextToolSource = {
46
+ kind: "builtin";
47
+ } | {
48
+ kind: "vvoc";
49
+ } | {
50
+ kind: "mcp";
51
+ server: string;
52
+ } | {
53
+ kind: "other";
54
+ };
55
+ export type ContextToolUsage = {
56
+ id: string;
57
+ source: ContextToolSource;
58
+ calls: number;
59
+ schemaKnown: boolean;
60
+ schema: ContextTokenMetric;
61
+ history: ContextTokenMetric;
62
+ total: ContextTokenMetric;
63
+ };
64
+ export type ContextMcpUsage = ContextMcpServer & {
65
+ toolCount?: number;
66
+ schemaKnown: boolean;
67
+ schema: ContextTokenMetric;
68
+ history: ContextTokenMetric;
69
+ total: ContextTokenMetric;
70
+ tools: ContextToolUsage[];
71
+ };
72
+ export type ContextToolReconciliation = {
73
+ schema: {
74
+ builtin: ContextTokenMetric;
75
+ vvoc: ContextTokenMetric;
76
+ external: ContextTokenMetric;
77
+ total: ContextTokenMetric;
78
+ };
79
+ history: {
80
+ toolResults: ContextTokenMetric;
81
+ loadedSkills: ContextTokenMetric;
82
+ total: ContextTokenMetric;
83
+ };
84
+ };
85
+ export type ContextToolAttribution = {
86
+ tools: ContextToolUsage[];
87
+ mcpServers: ContextMcpUsage[];
88
+ otherTools: ContextToolUsage[];
89
+ reconciliation: ContextToolReconciliation;
90
+ };
39
91
  export type ContextMeasuredUsage = {
40
92
  usedTokens: number;
41
93
  contextLimit?: number;
@@ -57,5 +109,6 @@ export type ContextAnalysis = {
57
109
  compacted: boolean;
58
110
  activeMessageCount: number;
59
111
  mcpServers: ContextMcpServer[];
112
+ toolAttribution?: ContextToolAttribution;
60
113
  warnings: string[];
61
114
  };
@@ -1,8 +1,8 @@
1
1
  // FILE: src/tui/context/types.ts
2
2
  // VERSION: 1.0.0
3
3
  // START_MODULE_CONTRACT
4
- // PURPOSE: Define bounded input and output shapes for the context TUI collector, analyzer, and view.
5
- // SCOPE: Context categories, model metadata, MCP status summaries, warnings, and analysis input/output types.
4
+ // PURPOSE: Define bounded input and output shapes for the context TUI collector, detailed analyzer, and tabbed view.
5
+ // SCOPE: Context categories, reusable token metrics, schema observability, per-tool and per-MCP attribution, model metadata, warnings, and analysis input/output types.
6
6
  // DEPENDS: [@opencode-ai/sdk/v2]
7
7
  // LINKS: [M-PLUGIN-CONTEXT-TUI, V-M-PLUGIN-CONTEXT-TUI]
8
8
  // ROLE: TYPES
@@ -11,15 +11,24 @@
11
11
  //
12
12
  // START_MODULE_MAP
13
13
  // ContextSkill - Observable skill catalog entry.
14
+ // ContextMcpStatus - Canonical MCP status values exposed by OpenCode.
14
15
  // ContextMcpServer - MCP name/status snapshot exposed by the TUI state.
15
16
  // ContextModel - Current provider/model metadata and limits.
16
17
  // ContextAnalysisInput - Raw bounded data accepted by the pure analyzer.
18
+ // ContextCategoryId - Stable overview category identifiers.
19
+ // ContextTokenMetric - Estimated token count and optional model-context percentage.
17
20
  // ContextCategory - One estimated context category row.
18
- // ContextAnalysis - Measured usage, estimated categories, warnings, and metadata rendered by the dialog.
21
+ // ContextToolSource - Deterministic built-in, vvoc, MCP, or other tool ownership.
22
+ // ContextToolUsage - Per-tool observable schema and active-history attribution, including whether schema data is known.
23
+ // ContextMcpUsage - Per-server aggregate with nested attributed tools and explicit schema-catalog availability.
24
+ // ContextToolReconciliation - Detailed schema and history subtotals aligned with overview categories.
25
+ // ContextToolAttribution - Sorted detailed tool, MCP, other, and reconciliation model.
26
+ // ContextMeasuredUsage - Latest provider-reported usage and model-capacity values.
27
+ // ContextAnalysis - Measured usage, estimated categories, detailed attribution, warnings, and metadata rendered by the dialog.
19
28
  // END_MODULE_MAP
20
29
  //
21
30
  // START_CHANGE_SUMMARY
22
- // LAST_CHANGE: [C-CONTEXT-TUI-PLUGIN - Added shared context-inspection domain types.]
31
+ // LAST_CHANGE: [DIRECT-FIX - Distinguished unavailable MCP schema catalogs from measured zero-token schemas.]
23
32
  // END_CHANGE_SUMMARY
24
33
  export {};
25
34
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/tui/context/types.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,iBAAiB;AACjB,wBAAwB;AACxB,uGAAuG;AACvG,gHAAgH;AAChH,mCAAmC;AACnC,0DAA0D;AAC1D,gBAAgB;AAChB,sBAAsB;AACtB,sBAAsB;AACtB,EAAE;AACF,mBAAmB;AACnB,mDAAmD;AACnD,0EAA0E;AAC1E,+DAA+D;AAC/D,2EAA2E;AAC3E,0DAA0D;AAC1D,2GAA2G;AAC3G,iBAAiB;AACjB,EAAE;AACF,uBAAuB;AACvB,wFAAwF;AACxF,qBAAqB"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/tui/context/types.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,iBAAiB;AACjB,wBAAwB;AACxB,uHAAuH;AACvH,0KAA0K;AAC1K,mCAAmC;AACnC,0DAA0D;AAC1D,gBAAgB;AAChB,sBAAsB;AACtB,sBAAsB;AACtB,EAAE;AACF,mBAAmB;AACnB,mDAAmD;AACnD,wEAAwE;AACxE,0EAA0E;AAC1E,+DAA+D;AAC/D,2EAA2E;AAC3E,8DAA8D;AAC9D,sFAAsF;AACtF,0DAA0D;AAC1D,oFAAoF;AACpF,0HAA0H;AAC1H,kHAAkH;AAClH,wGAAwG;AACxG,yFAAyF;AACzF,qFAAqF;AACrF,iIAAiI;AACjI,iBAAiB;AACjB,EAAE;AACF,uBAAuB;AACvB,gHAAgH;AAChH,qBAAqB"}
@@ -1,3 +1,23 @@
1
1
  import type { TuiPluginApi } from "@opencode-ai/plugin/tui";
2
+ import type { RGBA } from "@opentui/core";
2
3
  import type { ContextAnalysis } from "./types.js";
4
+ type Color = RGBA | string;
5
+ type ContextTheme = {
6
+ text: Color;
7
+ textMuted: Color;
8
+ primary: Color;
9
+ warning: Color;
10
+ };
11
+ declare const CONTEXT_TABS: readonly ["overview", "tools", "mcp"];
12
+ export type ContextTab = (typeof CONTEXT_TABS)[number];
3
13
  export declare function openContextDialog(api: TuiPluginApi, analysis: ContextAnalysis): void;
14
+ export declare function ContextDialogContent(props: {
15
+ analysis: ContextAnalysis;
16
+ keymap?: TuiPluginApi["keymap"];
17
+ theme: ContextTheme;
18
+ }): any;
19
+ export declare function selectContextTabForKey(current: ContextTab, keyName: string): ContextTab | undefined;
20
+ export declare function registerContextDialogKeymap(keymap: TuiPluginApi["keymap"], select: (keyName: string) => void): () => void;
21
+ export declare function calculateContextBodyHeight(terminalHeight: number): number;
22
+ export declare function renderMetricBar(percent: number | undefined, width?: number): string;
23
+ export {};
@@ -1,27 +1,171 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "@opentui/solid/jsx-runtime";
2
+ import { useKeyboard, useTerminalDimensions } from "@opentui/solid";
3
+ import { createMemo, createSignal, onCleanup } from "solid-js";
4
+ const CONTEXT_TABS = ["overview", "tools", "mcp"];
5
+ const CONTEXT_DIALOG_MAX_BODY_HEIGHT = 16;
6
+ const CONTEXT_DIALOG_RESERVED_ROWS = 13;
2
7
  // START_BLOCK_CONTEXT_DIALOG
3
8
  export function openContextDialog(api, analysis) {
4
- const Dialog = api.ui.Dialog;
5
9
  const theme = api.theme.current;
10
+ api.ui.dialog.replace(() => (_jsx(ContextDialogContent, { analysis: analysis, keymap: api.keymap, theme: {
11
+ text: theme.text,
12
+ textMuted: theme.textMuted,
13
+ primary: theme.primary,
14
+ warning: theme.warning,
15
+ } })));
6
16
  api.ui.dialog.setSize("xlarge");
7
- api.ui.dialog.replace(() => (_jsx(Dialog, { size: "xlarge", onClose: () => api.ui.dialog.clear(), children: _jsxs("box", { flexDirection: "column", gap: 1, paddingLeft: 1, paddingRight: 1, children: [_jsxs("box", { flexDirection: "row", justifyContent: "space-between", children: [_jsx("text", { fg: theme.text, children: "Context usage" }), _jsx("text", { fg: theme.textMuted, children: formatModel(analysis) })] }), _jsx(UsageSummary, { analysis: analysis, primary: theme.primary, muted: theme.textMuted }), _jsxs("box", { flexDirection: "column", children: [_jsx("text", { fg: theme.text, children: "Approximate breakdown" }), analysis.categories.map((category) => (_jsxs("box", { flexDirection: "row", justifyContent: "space-between", children: [_jsx("text", { fg: category.source === "provider-residual" ? theme.warning : theme.textMuted, children: category.source === "estimated" ? `~ ${category.label}` : category.label }), _jsx("text", { fg: theme.text, children: formatTokens(category.estimatedTokens) })] })))] }), _jsxs("box", { flexDirection: "row", justifyContent: "space-between", children: [_jsx("text", { fg: theme.textMuted, children: "Active messages" }), _jsxs("text", { fg: theme.text, children: [analysis.activeMessageCount, analysis.compacted ? " (after compaction)" : ""] })] }), _jsx(McpSummary, { analysis: analysis, text: theme.text, muted: theme.textMuted }), analysis.estimationDriftTokens > 0 ? (_jsxs("text", { fg: theme.warning, children: ["Estimate drift: +", formatTokens(analysis.estimationDriftTokens), " above provider usage"] })) : null, analysis.warnings.slice(0, 3).map((warning) => (_jsxs("text", { fg: theme.warning, children: ["Warning: ", warning] }))), _jsx("text", { fg: theme.textMuted, children: "Measured = latest provider usage. ~ = local estimate. MCP tools without source metadata are grouped." })] }) })));
17
+ }
18
+ export function ContextDialogContent(props) {
19
+ const [tab, setTab] = createSignal("overview");
20
+ const dimensions = useTerminalDimensions();
21
+ const narrow = createMemo(() => dimensions().width < 72);
22
+ const bodyHeight = createMemo(() => calculateContextBodyHeight(dimensions().height));
23
+ const barWidth = createMemo(() => calculateMetricBarWidth(dimensions().width));
24
+ if (props.keymap) {
25
+ onCleanup(registerContextDialogKeymap(props.keymap, (keyName) => {
26
+ const selected = selectContextTabForKey(tab(), keyName);
27
+ if (selected !== undefined)
28
+ setTab(selected);
29
+ }));
30
+ }
31
+ else {
32
+ useKeyboard((event) => {
33
+ const selected = selectContextTabForKey(tab(), event.name);
34
+ if (selected === undefined)
35
+ return;
36
+ event.preventDefault();
37
+ event.stopPropagation();
38
+ setTab(selected);
39
+ });
40
+ }
41
+ return (_jsxs("box", { flexDirection: "column", gap: 1, paddingLeft: 1, paddingRight: 1, children: [_jsx("text", { fg: props.theme.text, wrapMode: "word", children: `Context usage\n${formatModel(props.analysis)}` }), _jsx(UsageSummary, { analysis: props.analysis, primary: props.theme.primary, muted: props.theme.textMuted, barWidth: barWidth() }), _jsx(TabBar, { tab: tab, theme: props.theme }), _jsx("scrollbox", { focused: true, height: bodyHeight(), scrollX: false, scrollY: true, viewportCulling: true, children: _jsx("box", { flexDirection: "column", gap: 1, width: "100%", children: () => tab() === "overview" ? (_jsx(OverviewTab, { analysis: props.analysis, theme: props.theme, narrow: narrow(), barWidth: barWidth() })) : tab() === "tools" ? (_jsx(ToolsTab, { analysis: props.analysis, theme: props.theme, narrow: narrow() })) : (_jsx(McpTab, { analysis: props.analysis, theme: props.theme, narrow: narrow() })) }) }), _jsx("text", { fg: props.theme.textMuted, wrapMode: "word", children: "Measured = latest provider usage. ~ = provider-neutral estimate. Percentages use only the current model context limit." })] }));
8
42
  }
9
43
  // END_BLOCK_CONTEXT_DIALOG
44
+ // START_BLOCK_TAB_NAVIGATION
45
+ export function selectContextTabForKey(current, keyName) {
46
+ if (keyName === "1")
47
+ return "overview";
48
+ if (keyName === "2")
49
+ return "tools";
50
+ if (keyName === "3")
51
+ return "mcp";
52
+ if (keyName !== "left" && keyName !== "right")
53
+ return undefined;
54
+ const index = CONTEXT_TABS.indexOf(current);
55
+ const delta = keyName === "left" ? -1 : 1;
56
+ return CONTEXT_TABS[(index + delta + CONTEXT_TABS.length) % CONTEXT_TABS.length];
57
+ }
58
+ export function registerContextDialogKeymap(keymap, select) {
59
+ const commands = [
60
+ { name: "vvoc.context.tab.left", key: "left", title: "Previous context tab" },
61
+ { name: "vvoc.context.tab.right", key: "right", title: "Next context tab" },
62
+ { name: "vvoc.context.tab.overview", key: "1", title: "Show context Overview" },
63
+ { name: "vvoc.context.tab.tools", key: "2", title: "Show context Tools" },
64
+ { name: "vvoc.context.tab.mcp", key: "3", title: "Show context MCP" },
65
+ ];
66
+ return keymap.registerLayer({
67
+ mode: "modal",
68
+ commands: commands.map((command) => ({
69
+ name: command.name,
70
+ title: command.title,
71
+ run() {
72
+ select(command.key);
73
+ },
74
+ })),
75
+ bindings: commands.map((command) => ({
76
+ key: command.key,
77
+ cmd: command.name,
78
+ desc: command.title,
79
+ })),
80
+ });
81
+ }
82
+ export function calculateContextBodyHeight(terminalHeight) {
83
+ const normalized = Number.isFinite(terminalHeight) ? Math.floor(terminalHeight) : 34;
84
+ const hostTopOffset = Math.floor(normalized / 4);
85
+ const centeredPanelHeight = normalized - hostTopOffset * 2;
86
+ const available = centeredPanelHeight - CONTEXT_DIALOG_RESERVED_ROWS;
87
+ return Math.max(1, Math.min(CONTEXT_DIALOG_MAX_BODY_HEIGHT, available));
88
+ }
89
+ function calculateMetricBarWidth(terminalWidth) {
90
+ const normalized = Number.isFinite(terminalWidth) ? Math.floor(terminalWidth) : 80;
91
+ return Math.max(8, Math.min(28, normalized - 34));
92
+ }
93
+ // END_BLOCK_TAB_NAVIGATION
94
+ // START_BLOCK_OVERVIEW_TAB
95
+ function OverviewTab(props) {
96
+ return (_jsxs("box", { flexDirection: "column", gap: 1, children: [_jsx("text", { fg: props.theme.text, children: "Approximate breakdown" }), props.analysis.categories.map((category) => (_jsx(MetricRow, { label: category.source === "estimated" ? `~ ${category.label}` : category.label, metric: category, color: category.source === "provider-residual" ? props.theme.warning : props.theme.textMuted, valueColor: props.theme.text, barColor: category.source === "provider-residual" ? props.theme.warning : props.theme.primary, narrow: props.narrow, barWidth: props.barWidth }))), _jsxs("box", { flexDirection: props.narrow ? "column" : "row", justifyContent: props.narrow ? "flex-start" : "space-between", children: [_jsx("text", { fg: props.theme.textMuted, children: "Active messages" }), _jsxs("text", { fg: props.theme.text, children: [props.analysis.activeMessageCount, props.analysis.compacted ? " (after compaction)" : ""] })] }), props.analysis.estimationDriftTokens > 0 ? (_jsxs("text", { fg: props.theme.warning, wrapMode: "word", children: ["Estimate drift: +", formatTokens(props.analysis.estimationDriftTokens), " above provider usage"] })) : null, props.analysis.warnings.slice(0, 3).map((warning) => (_jsxs("text", { fg: props.theme.warning, wrapMode: "word", children: ["Warning: ", warning] })))] }));
97
+ }
98
+ function MetricRow(props) {
99
+ return (_jsxs("box", { flexDirection: "column", children: [_jsxs("box", { flexDirection: props.narrow ? "column" : "row", justifyContent: props.narrow ? "flex-start" : "space-between", children: [_jsx("text", { fg: props.color, wrapMode: "word", children: props.label }), _jsx("text", { fg: props.valueColor, children: formatMetric(props.metric) })] }), _jsx("text", { fg: props.barColor, children: renderMetricBar(props.metric.percent, props.barWidth) })] }));
100
+ }
101
+ // END_BLOCK_OVERVIEW_TAB
102
+ // START_BLOCK_TOOLS_TAB
103
+ function ToolsTab(props) {
104
+ const tools = props.analysis.toolAttribution?.tools ?? [];
105
+ if (!props.analysis.toolAttribution) {
106
+ return _jsx("text", { fg: props.theme.warning, children: "Detailed tool attribution is unavailable." });
107
+ }
108
+ if (tools.length === 0) {
109
+ return _jsx("text", { fg: props.theme.textMuted, children: "No current tool schemas or active tool history." });
110
+ }
111
+ return (_jsxs("box", { flexDirection: "column", gap: 1, children: [_jsx("text", { fg: props.theme.text, children: "Tools \u00B7 schema + active post-compaction history" }), tools.map((tool) => (_jsx(ToolCard, { tool: tool, theme: props.theme, narrow: props.narrow })))] }));
112
+ }
113
+ function ToolCard(props) {
114
+ return (_jsxs("box", { flexDirection: "column", paddingLeft: props.nested ? 2 : 0, children: [_jsxs("box", { flexDirection: props.narrow ? "column" : "row", justifyContent: props.narrow ? "flex-start" : "space-between", children: [_jsx("text", { fg: props.theme.text, wrapMode: "char", children: props.tool.id }), _jsx("text", { fg: props.theme.textMuted, children: formatToolSource(props.tool.source) })] }), _jsxs("text", { fg: props.theme.textMuted, children: ["active calls ", props.tool.calls] }), _jsxs("text", { fg: props.theme.textMuted, wrapMode: "word", children: ["schema ", formatKnownMetric(props.tool.schema, props.tool.schemaKnown), " \u00B7 history", " ", formatMetric(props.tool.history)] }), _jsxs("text", { fg: props.theme.primary, children: [props.tool.schemaKnown ? "total" : "known total", " ", formatMetric(props.tool.total)] })] }));
115
+ }
116
+ // END_BLOCK_TOOLS_TAB
117
+ // START_BLOCK_MCP_TAB
118
+ function McpTab(props) {
119
+ const attribution = props.analysis.toolAttribution;
120
+ if (!attribution) {
121
+ return (_jsxs("box", { flexDirection: "column", gap: 1, children: [_jsx("text", { fg: props.theme.warning, children: "Detailed MCP attribution is unavailable." }), props.analysis.mcpServers.map((server) => (_jsxs("text", { fg: props.theme.textMuted, wrapMode: "word", children: [server.name, " \u00B7 ", server.status] })))] }));
122
+ }
123
+ return (_jsxs("box", { flexDirection: "column", gap: 1, children: [_jsx("text", { fg: props.theme.text, children: "MCP servers \u00B7 observable schemas + retained active history" }), attribution.mcpServers.length === 0 ? (_jsx("text", { fg: props.theme.textMuted, children: "No MCP servers reported." })) : (attribution.mcpServers.map((server) => (_jsx(McpServerCard, { server: server, theme: props.theme, narrow: props.narrow })))), _jsx("text", { fg: props.theme.text, children: "Other external/plugin" }), attribution.otherTools.length === 0 ? (_jsx("text", { fg: props.theme.textMuted, children: "No unattributed external or plugin tools." })) : (attribution.otherTools.map((tool) => (_jsx(ToolCard, { tool: tool, theme: props.theme, narrow: props.narrow, nested: true }))))] }));
124
+ }
125
+ function McpServerCard(props) {
126
+ return (_jsxs("box", { flexDirection: "column", children: [_jsxs("box", { flexDirection: props.narrow ? "column" : "row", justifyContent: props.narrow ? "flex-start" : "space-between", children: [_jsx("text", { fg: props.theme.text, wrapMode: "word", children: props.server.name }), _jsx("text", { fg: props.server.status === "connected" ? props.theme.primary : props.theme.warning, children: props.server.status })] }), _jsxs("text", { fg: props.theme.textMuted, children: ["current tools ", props.server.toolCount ?? "unavailable"] }), _jsxs("text", { fg: props.theme.textMuted, wrapMode: "word", children: ["schema ", formatKnownMetric(props.server.schema, props.server.schemaKnown), " \u00B7 history", " ", formatMetric(props.server.history)] }), _jsxs("text", { fg: props.theme.primary, children: [props.server.schemaKnown ? "total" : "known total", " ", formatMetric(props.server.total)] }), !props.server.schemaKnown && props.server.status === "connected" ? (_jsx("text", { fg: props.theme.textMuted, wrapMode: "word", children: "OpenCode API does not expose this MCP schema catalog." })) : null, props.server.error ? (_jsx("text", { fg: props.theme.warning, wrapMode: "word", children: props.server.error })) : null, props.server.tools.length === 0 ? (_jsx("text", { fg: props.theme.textMuted, wrapMode: "word", children: props.server.schemaKnown
127
+ ? "No attributed current schemas or active history."
128
+ : "No attributed active history; current schemas are unavailable." })) : (props.server.tools.map((tool) => (_jsx(ToolCard, { tool: tool, theme: props.theme, narrow: props.narrow, nested: true }))))] }));
129
+ }
130
+ // END_BLOCK_MCP_TAB
131
+ function TabBar(props) {
132
+ return (_jsx("text", { fg: props.theme.primary, wrapMode: "word", children: () => `${formatTabBar(props.tab())}\n←/→ tabs · 1/2/3 select · ↑/↓ scroll · Esc close` }));
133
+ }
10
134
  function UsageSummary(props) {
11
135
  const measured = props.analysis.measured;
12
136
  if (!measured) {
13
- return (_jsx("text", { fg: props.muted, children: "Provider usage is not available until the session has an assistant turn." }));
137
+ return (_jsx("text", { fg: props.muted, wrapMode: "word", children: "Provider usage is not available until the session has an assistant turn." }));
14
138
  }
15
139
  const percent = measured.percentUsed;
16
- return (_jsxs("box", { flexDirection: "column", children: [_jsxs("text", { fg: props.primary, children: [renderUsageBar(percent), " ", formatTokens(measured.usedTokens), measured.contextLimit ? ` / ${formatTokens(measured.contextLimit)}` : "", percent === undefined ? "" : ` (${percent.toFixed(1)}%)`] }), _jsxs("text", { fg: props.muted, children: ["input ", formatTokens(measured.inputTokens), " \u00B7 cache read", " ", formatTokens(measured.cacheReadTokens), " \u00B7 output ", formatTokens(measured.outputTokens), measured.remainingTokens === undefined
17
- ? ""
18
- : ` · remaining ${formatTokens(measured.remainingTokens)}`] })] }));
140
+ const usageLine = `${renderMetricBar(percent, props.barWidth)} ${formatTokens(measured.usedTokens)}${measured.contextLimit ? ` / ${formatTokens(measured.contextLimit)}` : ""}${percent === undefined ? "" : ` (${percent.toFixed(1)}%)`}`;
141
+ const tokenLine = `input ${formatTokens(measured.inputTokens)} · cache read ${formatTokens(measured.cacheReadTokens)} · output ${formatTokens(measured.outputTokens)}${measured.remainingTokens === undefined
142
+ ? ""
143
+ : ` · remaining ${formatTokens(measured.remainingTokens)}`}`;
144
+ return (_jsx("text", { fg: props.primary, wrapMode: "word", children: `${usageLine}\n${tokenLine}` }));
19
145
  }
20
- function McpSummary(props) {
21
- if (props.analysis.mcpServers.length === 0) {
22
- return _jsx("text", { fg: props.muted, children: "MCP servers: none reported" });
23
- }
24
- return (_jsxs("box", { flexDirection: "column", children: [_jsx("text", { fg: props.text, children: "MCP servers" }), props.analysis.mcpServers.map((server) => (_jsxs("box", { flexDirection: "row", justifyContent: "space-between", children: [_jsx("text", { fg: props.muted, children: server.name }), _jsx("text", { fg: props.text, children: server.status })] })))] }));
146
+ function formatTabBar(active) {
147
+ return CONTEXT_TABS.map((tab, index) => active === tab ? `[${index + 1} ${formatTabName(tab)}]` : `${index + 1} ${formatTabName(tab)}`).join(" ");
148
+ }
149
+ function formatTabName(tab) {
150
+ return tab === "mcp" ? "MCP" : tab[0].toUpperCase() + tab.slice(1);
151
+ }
152
+ function formatToolSource(source) {
153
+ if (source.kind === "builtin")
154
+ return "Built-in";
155
+ if (source.kind === "vvoc")
156
+ return "vvoc";
157
+ if (source.kind === "mcp")
158
+ return `MCP · ${source.server}`;
159
+ return "Other external/plugin";
160
+ }
161
+ function formatMetric(metric) {
162
+ return `${formatTokens(metric.estimatedTokens)} · ${formatPercent(metric.percent)}`;
163
+ }
164
+ function formatKnownMetric(metric, known) {
165
+ return known ? formatMetric(metric) : "unavailable";
166
+ }
167
+ function formatPercent(percent) {
168
+ return percent === undefined ? "—" : `${percent.toFixed(1)}%`;
25
169
  }
26
170
  function formatModel(analysis) {
27
171
  if (!analysis.model)
@@ -36,10 +180,10 @@ function formatTokens(tokens) {
36
180
  return `${(tokens / 1_000).toFixed(tokens >= 100_000 ? 0 : 1)}k`;
37
181
  return String(tokens);
38
182
  }
39
- function renderUsageBar(percent) {
40
- const width = 28;
183
+ export function renderMetricBar(percent, width = 28) {
184
+ const safeWidth = Number.isFinite(width) ? Math.max(1, Math.floor(width)) : 28;
41
185
  const normalized = percent === undefined ? 0 : Math.min(100, Math.max(0, percent));
42
- const filled = Math.round((normalized / 100) * width);
43
- return `[${"█".repeat(filled)}${"░".repeat(width - filled)}]`;
186
+ const filled = Math.round((normalized / 100) * safeWidth);
187
+ return `[${"█".repeat(filled)}${"░".repeat(safeWidth - filled)}]`;
44
188
  }
45
189
  //# sourceMappingURL=view.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"view.js","sourceRoot":"","sources":["../../../src/tui/context/view.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"view.js","sourceRoot":"","sources":["../../../src/tui/context/view.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@osovv/vv-opencode",
3
- "version": "1.1.2",
3
+ "version": "1.1.5",
4
4
  "description": "A curated, opinionated set of OpenCode plugins for spec-first, review-driven, safer agentic development.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -81,6 +81,7 @@
81
81
  "test": "bun test",
82
82
  "check": "bun run typecheck && bun run lint && bun run fmt:check && bun test",
83
83
  "pack:check": "bun run build && bun -e \"const root = await import('./dist/index.js'); if (!('GuardianPlugin' in root)) throw new Error('dist root export missing GuardianPlugin'); if (!('HashlineEditPlugin' in root)) throw new Error('dist root export missing HashlineEditPlugin'); if (!('ModelRolesPlugin' in root)) throw new Error('dist root export missing ModelRolesPlugin'); if (!('SystemContextInjectionPlugin' in root)) throw new Error('dist root export missing SystemContextInjectionPlugin'); if (!('WorkflowPlugin' in root)) throw new Error('dist root export missing WorkflowPlugin'); if (!('SecretsRedactionPlugin' in root)) throw new Error('dist root export missing SecretsRedactionPlugin'); const tui = await import('./dist/tui.js'); if (!tui.default || typeof tui.default.tui !== 'function') throw new Error('dist TUI export missing default tui module'); await import('./dist/plugins/guardian/index.js'); await import('./dist/plugins/hashline-edit/index.js'); await import('./dist/plugins/model-roles/index.js'); await import('./dist/plugins/system-context-injection/index.js'); await import('./dist/plugins/workflow/index.js'); await import('./dist/plugins/secrets-redaction/index.js')\" && npm pack --dry-run",
84
+ "tui:local": "bun scripts/tui-local.ts",
84
85
  "release:check": "bun scripts/release-check.ts",
85
86
  "release:bump": "bun scripts/release-bump.ts",
86
87
  "prepare": "lefthook install --force"
@@ -102,6 +103,7 @@
102
103
  "lefthook": "2.1.5",
103
104
  "oxfmt": "0.43.0",
104
105
  "oxlint": "1.58.0",
106
+ "solid-js": "1.9.12",
105
107
  "typescript": "5.8.2",
106
108
  "conventional-changelog-cli": "^5.0.0",
107
109
  "@commitlint/cli": "^19.0.0",
@@ -110,7 +112,8 @@
110
112
  "peerDependencies": {
111
113
  "@opentui/core": ">=0.4.3",
112
114
  "@opentui/keymap": ">=0.4.3",
113
- "@opentui/solid": ">=0.4.3"
115
+ "@opentui/solid": ">=0.4.3",
116
+ "solid-js": ">=1.9.12"
114
117
  },
115
118
  "engines": {
116
119
  "bun": ">=1.3.8",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://cdn.jsdelivr.net/npm/@osovv/vv-opencode@1.1.2/schemas/vvoc/v3.json",
3
+ "$id": "https://cdn.jsdelivr.net/npm/@osovv/vv-opencode@1.1.5/schemas/vvoc/v3.json",
4
4
  "title": "vvoc config",
5
5
  "description": "Canonical vvoc configuration document.",
6
6
  "type": "object",