Files
oc-ls-stats/TUIPLUGIN.md
T
Troed Sångberg 36fcaa27a1 feat: v0.0.40 - per-slot PP calculation from /slots endpoint
- Fix PP calculation: use per-slot n_prompt_tokens during prefill state
  instead of global llamacpp:prompt_tokens_total from /metrics
- Add isPrefilling flag and prefill tracking state (slotId, capturedTokens, startAt)
- Add dedicated formatters: formatPps, formatTps, formatAvg, pad4
- Replace formatRate suffixes with raw number formatters
- Display: PP | TPS | AVG with fixed-width 4-char padding
- Slot polling every 2s with model query parameter
- Debug logging to /tmp/oc-ls-stats-debug.log
- Add .npmignore, TUIPLUGIN.md, test-debug-log.jsonl
- Update AGENTS.md with slot state phases, PP calculation docs
2026-06-13 22:52:31 +02:00

121 lines
4.9 KiB
Markdown

# TUI Plugin Investigation - oc-ls-stats
## Problem
The `@troed/oc-ls-stats` TUI plugin installs successfully via `opencode plugin` but produces no visible output in the OpenCode TUI.
## Key Findings
### 1. OpenCode Plugin Architecture
- **Server plugins**: Configured in `opencode.jsonc` under `plugin` array, shown in `/status`
- **TUI plugins**: Configured in `~/.config/opencode/tui.json` under `plugin` array, NOT shown in `/status`
- These are two completely separate plugin loaders
### 2. TUI Plugin Installation
- Command: `opencode plugin "<package>@latest" --global`
- Installs to: `~/.cache/opencode/packages/<package>@latest/node_modules/<package>/`
- For scoped packages: `~/.cache/opencode/packages/@scope/package@latest/node_modules/@scope/package/`
- Config updated: `~/.config/opencode/tui.json`
- Peer deps installed to: `~/.config/opencode/node_modules/`
### 3. TUI Plugin Loading
- TUI config loaded in a separate process from the main OpenCode instance
- Logs show only: `"loading tui config"` and `"applying tui config"`
- No plugin loading errors appear in logs (same as working oc-tps)
- Plugin loading happens silently - no success/error logs
### 4. Registry Configuration
- `~/.npmrc`:
```
registry=https://registry.npmjs.org/
//git.sync.wtf/api/packages/troed/npm/:_authToken=590922c3fe27e44cd5a216f14375cff575e52b5c
@troed:registry=https://git.sync.wtf/api/packages/troed/npm/
```
- Public npm for `@opencode-ai/*` and other unscoped packages
- Forgejo registry for `@troed/*` scoped packages
### 5. Package Structure (working vs non-working)
Both plugins have identical structure:
```json
{
"name": "@troed/oc-ls-stats",
"version": "0.0.x",
"type": "module",
"exports": { "./tui": { "import": "./tui.tsx" } },
"peerDependencies": {
"@opencode-ai/plugin": "*",
"@opentui/core": "*",
"@opentui/solid": "*",
"solid-js": "*"
}
}
```
Export format (identical):
```typescript
const plugin: TuiPluginModule & { id: string } = {
id: "oc-tps",
tui,
}
export default plugin
```
### 6. What We Tried (all failed)
- Pointing to file directly (`file:///path/to/tui.tsx`) - didn't work
- Adding `oc-plugin` field to package.json - didn't work
- Adding `main` field to package.json - didn't work
- Tuple format in tui.json - rejected by OpenCode
- Copying file to `~/.config/opencode/plugins/` - didn't work
- Publishing to Forgejo without scope - peer deps resolve from Forgejo (404)
- Publishing with scope (`@troed/`) - installs but no output
- Manual npm install to `~/.config/opencode/node_modules/` - no output
- Adding console.log - not visible (TUI runs in separate process)
- Adding early slot registration - no output
- Wrapping loadConfigUrls in try-catch - no output
- Simplified slot handler to static text - no output
- Multiple version bumps and reinstalls - no output
### 7. Stale Cache Issues
- OpenCode caches plugins in `~/.cache/opencode/packages/`
- Stale entries from manual installs can persist
- Multiple stale directories created during debugging:
- `~/.cache/opencode/packages/oc-ls-stats@latest` (empty)
- `~/.cache/opencode/packages/@troed/oc-ls-stats:latest` (colon in name)
- `~/.cache/opencode/packages/troed/oc-ls-stats@latest` (missing @)
- Must manually clear cache before reinstalling: `rm -rf ~/.cache/opencode/packages/@troed/oc-ls-stats@latest`
### 8. Background Dependency Install Error
- `~/.opencode/package.json` has `"@opencode-ai/plugin": "1.4.9"` as dependency
- OpenCode tries to install this from Forgejo (404) during startup
- This is a separate issue from TUI plugin loading
- The package is already installed in `~/.opencode/node_modules/`
### 9. Working Reference: oc-tps
- Installed via: `opencode plugin oc-tps@latest --global`
- Cache location: `~/.cache/opencode/packages/oc-tps@latest/node_modules/oc-tps/`
- tui.json: `"oc-tps@latest"` (unscoped)
- Shows TPS output correctly
- NOT listed in `/status` (expected for TUI plugins)
- No log output (same as oc-ls-stats)
### 10. Current State
- `@troed/oc-ls-stats@0.0.8` published to Forgejo
- Installed in cache with correct version
- tui.json: `["@troed/oc-ls-stats@latest"]`
- Peer deps installed in `~/.config/opencode/node_modules/`
- Slot registration added at start of tui function
- Static text output in slot handler
- **Still no visible output**
## Conclusion
The plugin installs and appears to load (same log pattern as working oc-tps), but produces no output. The root cause is unknown. Possible causes:
1. OpenCode's TUI plugin loader has an issue with scoped packages
2. There's a runtime error that's not being logged
3. The slot registration is not being triggered for some reason
4. There's a difference in how the TUI process resolves modules for scoped vs unscoped packages
## Next Steps
- Compare the exact module resolution path between oc-tps and oc-ls-stats
- Check if the TUI process can actually import the scoped package
- Verify the slot registration is being called (maybe via a side effect)
- Check if there's a TUI-specific debug mode or log output