opencode-extended-sidebar 0.2.90

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 (105) hide show
  1. package/.oesignore +17 -0
  2. package/CHANGELOG.md +95 -0
  3. package/LICENSE +21 -0
  4. package/README.md +235 -0
  5. package/oes.json +11 -0
  6. package/package.json +100 -0
  7. package/scripts/install-git-hooks.mjs +29 -0
  8. package/src/pware.oc.core/constants/index.ts +18 -0
  9. package/src/pware.oc.core/constants/pware.oc.core.constants.eventKind.ts +29 -0
  10. package/src/pware.oc.core/constants/pware.oc.core.constants.eventName.ts +13 -0
  11. package/src/pware.oc.core/constants/pware.oc.core.constants.eventType.ts +241 -0
  12. package/src/pware.oc.core/constants/pware.oc.core.constants.myWork.ts +55 -0
  13. package/src/pware.oc.core/constants/pware.oc.core.constants.partType.ts +65 -0
  14. package/src/pware.oc.core/constants/pware.oc.core.constants.phase.ts +58 -0
  15. package/src/pware.oc.core/constants/pware.oc.core.constants.pulse.ts +63 -0
  16. package/src/pware.oc.core/constants/pware.oc.core.constants.rowKind.ts +34 -0
  17. package/src/pware.oc.core/constants/pware.oc.core.constants.status.ts +74 -0
  18. package/src/pware.oc.core/constants/pware.oc.core.constants.toolName.ts +69 -0
  19. package/src/pware.oc.core/git/index.ts +7 -0
  20. package/src/pware.oc.core/git/pware.oc.core.git.ts +237 -0
  21. package/src/pware.oc.core/git/pware.oc.core.gitignore.ts +87 -0
  22. package/src/pware.oc.core/index.ts +18 -0
  23. package/src/pware.oc.core/pware.oc.core.bus.ts +42 -0
  24. package/src/pware.oc.core/pware.oc.core.cache.ts +48 -0
  25. package/src/pware.oc.core/pware.oc.core.clipboard.ts +97 -0
  26. package/src/pware.oc.core/pware.oc.core.debug.ts +280 -0
  27. package/src/pware.oc.core/pware.oc.core.events.ts +79 -0
  28. package/src/pware.oc.core/pware.oc.core.glyph.ts +135 -0
  29. package/src/pware.oc.core/pware.oc.core.layout.ts +234 -0
  30. package/src/pware.oc.core/pware.oc.core.oes.ts +89 -0
  31. package/src/pware.oc.core/pware.oc.core.paths.ts +240 -0
  32. package/src/pware.oc.core/pware.oc.core.preview.ts +74 -0
  33. package/src/pware.oc.core/pware.oc.core.pulse.ts +726 -0
  34. package/src/pware.oc.core/pware.oc.core.sqlite.ts +175 -0
  35. package/src/pware.oc.core/pware.oc.core.status.ts +214 -0
  36. package/src/pware.oc.core/pware.oc.core.timing.ts +63 -0
  37. package/src/pware.oc.core/pware.oc.core.width.ts +215 -0
  38. package/src/pware.oc.omo/constants/index.ts +15 -0
  39. package/src/pware.oc.omo/constants/pware.oc.omo.constants.backgroundTask.ts +18 -0
  40. package/src/pware.oc.omo/constants/pware.oc.omo.constants.boulderStatus.ts +49 -0
  41. package/src/pware.oc.omo/constants/pware.oc.omo.constants.docKind.ts +29 -0
  42. package/src/pware.oc.omo/constants/pware.oc.omo.constants.eventName.ts +11 -0
  43. package/src/pware.oc.omo/constants/pware.oc.omo.constants.planStatus.ts +60 -0
  44. package/src/pware.oc.omo/constants/pware.oc.omo.constants.reviewStatus.ts +49 -0
  45. package/src/pware.oc.omo/constants/pware.oc.omo.constants.startWork.ts +25 -0
  46. package/src/pware.oc.omo/constants/pware.oc.omo.constants.verdict.ts +38 -0
  47. package/src/pware.oc.omo/index.ts +7 -0
  48. package/src/pware.oc.omo/resolver/index.ts +19 -0
  49. package/src/pware.oc.omo/resolver/pware.oc.omo.resolver.approval.ts +179 -0
  50. package/src/pware.oc.omo/resolver/pware.oc.omo.resolver.approvalGroup.ts +116 -0
  51. package/src/pware.oc.omo/resolver/pware.oc.omo.resolver.approvalState.ts +34 -0
  52. package/src/pware.oc.omo/resolver/pware.oc.omo.resolver.boulder.ts +503 -0
  53. package/src/pware.oc.omo/resolver/pware.oc.omo.resolver.config.ts +40 -0
  54. package/src/pware.oc.omo/resolver/pware.oc.omo.resolver.doc.ts +269 -0
  55. package/src/pware.oc.omo/resolver/pware.oc.omo.resolver.draftFile.ts +18 -0
  56. package/src/pware.oc.omo/resolver/pware.oc.omo.resolver.notepadsFile.ts +18 -0
  57. package/src/pware.oc.omo/resolver/pware.oc.omo.resolver.plan.ts +155 -0
  58. package/src/pware.oc.omo/resolver/pware.oc.omo.resolver.planFile.ts +361 -0
  59. package/src/pware.oc.omo/resolver/pware.oc.omo.resolver.proofFile.ts +18 -0
  60. package/src/pware.oc.omo/resolver/pware.oc.omo.resolver.rulesFile.ts +11 -0
  61. package/src/pware.oc.omo/resolver/pware.oc.omo.resolver.runContinuationFile.ts +14 -0
  62. package/src/pware.oc.opencode/constants/index.ts +10 -0
  63. package/src/pware.oc.opencode/constants/pware.oc.opencode.constants.eventName.ts +15 -0
  64. package/src/pware.oc.opencode/constants/pware.oc.opencode.constants.fileTouch.ts +18 -0
  65. package/src/pware.oc.opencode/constants/pware.oc.opencode.constants.questionKind.ts +45 -0
  66. package/src/pware.oc.opencode/constants/pware.oc.opencode.constants.sessionStatus.ts +58 -0
  67. package/src/pware.oc.opencode/index.ts +8 -0
  68. package/src/pware.oc.opencode/pware.oc.opencode.events.ts +182 -0
  69. package/src/pware.oc.opencode/pware.oc.opencode.files.ts +399 -0
  70. package/src/pware.oc.opencode/resolver/index.ts +170 -0
  71. package/src/pware.oc.opencode/resolver/pware.oc.opencode.resolver.file.ts +162 -0
  72. package/src/pware.oc.opencode/resolver/pware.oc.opencode.resolver.question.ts +185 -0
  73. package/src/pware.oc.opencode/resolver/pware.oc.opencode.resolver.session.ts +211 -0
  74. package/src/pware.oc.opencode/resolver/pware.oc.opencode.resolver.todo.ts +26 -0
  75. package/src/pware.oc.opencode/resolver/pware.oc.opencode.resolver.tool.ts +236 -0
  76. package/src/pware.oc.perf/index.ts +14 -0
  77. package/src/pware.oc.perf/pware.oc.perf.asciichart.d.ts +15 -0
  78. package/src/pware.oc.perf/pware.oc.perf.charts.ts +284 -0
  79. package/src/pware.oc.perf/pware.oc.perf.reader.ts +927 -0
  80. package/src/pware.oc.perf/pware.oc.perf.realtime.ts +88 -0
  81. package/src/pware.oc.perf/pware.oc.perf.realtimeBlock.ts +118 -0
  82. package/src/pware.oc.perf/pware.oc.perf.realtimeCpuRam.ts +79 -0
  83. package/src/pware.oc.perf/pware.oc.perf.realtimeSampler.ts +71 -0
  84. package/src/pware.oc.perf/pware.oc.perf.realtimeTimeline.ts +214 -0
  85. package/src/pware.oc.perf/pware.oc.perf.self.ts +179 -0
  86. package/src/pware.oc.perf/pware.oc.perf.view.tsx +462 -0
  87. package/src/pware.oc.runtime/index.ts +13 -0
  88. package/src/pware.oc.runtime/pware.oc.runtime.monitor.ts +142 -0
  89. package/src/pware.oc.runtime/pware.oc.runtime.mywork-enrich.ts +79 -0
  90. package/src/pware.oc.runtime/pware.oc.runtime.mywork.ts +253 -0
  91. package/src/pware.oc.runtime/pware.oc.runtime.questions.ts +95 -0
  92. package/src/pware.oc.runtime/pware.oc.runtime.snapshotClient.ts +129 -0
  93. package/src/pware.oc.runtime/pware.oc.runtime.source.ts +105 -0
  94. package/src/pware.oc.runtime/pware.oc.runtime.worker.ts +43 -0
  95. package/src/pware.oc.runtime/resolver/index.ts +224 -0
  96. package/src/pware.oc.runtime/resolver/pware.oc.runtime.resolver.delegate.ts +146 -0
  97. package/src/pware.oc.ui/index.ts +12 -0
  98. package/src/pware.oc.ui/pware.oc.ui.chrome.tsx +339 -0
  99. package/src/pware.oc.ui/pware.oc.ui.glyphs.tsx +144 -0
  100. package/src/pware.oc.ui/pware.oc.ui.host.tsx +111 -0
  101. package/src/pware.oc.ui/pware.oc.ui.live.tsx +82 -0
  102. package/src/pware.oc.ui/pware.oc.ui.menudialogs.tsx +843 -0
  103. package/src/pware.oc.ui/pware.oc.ui.sections.tsx +526 -0
  104. package/src/pware.oc.ui/pware.oc.ui.sidebar.tsx +1629 -0
  105. package/src/pware.oc.ui.tsx +98 -0
package/.oesignore ADDED
@@ -0,0 +1,17 @@
1
+ # Directories hidden from the Files panel.
2
+ tmp/
3
+ .tmp/
4
+ .omo/
5
+ .agentize/
6
+ .hidden/
7
+
8
+ # Boilerplate root files.
9
+ .gitignore
10
+ backlog.md
11
+ CHANGELOG.md
12
+ LICENSE
13
+ oes.json
14
+ opencode.json
15
+ package.json
16
+ README.md
17
+ skills-lock.json
package/CHANGELOG.md ADDED
@@ -0,0 +1,95 @@
1
+ # Changelog
2
+
3
+ - **0.2.90** (2026-09-07) Publish the sidebar to npm so OpenCode can install it by package name.
4
+ - **0.2.89** (2026-09-07) Rewrite the panel reference as per-feature tables so each sidebar capability is one scannable row.
5
+ - **0.2.88** (2026-09-05) Offer start work from the Plans archive picker so an archived plan can be launched directly and the archive drops Approve.
6
+ - **0.2.87** (2026-09-05) Reconcile a plan with no parseable status against its boulder work so a completed plan lands in Finished instead of the Plans archive.
7
+ - **0.2.86** (2026-09-05) Open the My-work Plans and Draft docs archives through the approval picker so a click offers Navigate to session before the preview instead of previewing the fi.
8
+ - **0.2.85** (2026-09-05) Hide drafts superseded by a plan of the same name in the shared omo scan so one rule drops them from both the Session draft list and the My-work buckets.
9
+ - **0.2.84** (2026-09-05) Make the open-question reconcile backstop a configurable 15 s oes.json option and merge the approvals and docs scans into one shared per-root omo stamp cache.
10
+ - **0.2.83** (2026-09-05) Measure every sidebar row budget in wcwidth columns so wide CJK/emoji text clips cleanly instead of wrapping, surface plan files that no action group covers in .
11
+ - **0.2.82** (2026-09-04) Scope the Session-tab drafts list to drafts the current session wrote and add a My-work Draft docs archive for drafts no action group covers.
12
+ - **0.2.81** (2026-09-04) Add a token-rate bar and realtime fullscreen modal to the OES bar, widen the shared chart plot, and shrink the preview dialog chrome.
13
+ - **0.2.80** (2026-09-04) describe the realtime fullscreen modal and prune inline-fullscreen references.
14
+ - **0.2.79** (2026-09-04) route the realtime fullscreen F into a live modal instead of inline expansion.
15
+ - **0.2.78** (2026-09-04) fullscreen realtime modal with category selector and multi-line series.
16
+ - **0.2.77** (2026-09-04) add a pure multi-series realtime line renderer with per-series scale.
17
+ - **0.2.76** (2026-09-04) give each realtime selector row its own unit label.
18
+ - **0.2.75** (2026-09-04) Replace the project-wide open-question scan with an in-memory per-session cache invalidated by targeted question-part host events plus a 30-second reconcile bac.
19
+ - **0.2.74** (2026-09-04) Move recent sessions into the My work Sessions group, remove spare gap rows above OES and below the tab bar, and retune direction-glyph sin-fades on the 50ms ti.
20
+ - **0.2.73** (2026-09-04) Move the project-wide open-question scan into the snapshot worker so the ~500ms json_extract over every part no longer freezes the UI thread, expose it as snap(.
21
+ - **0.2.72** (2026-09-04) Fold the whole realtime block (OES status bar, realtime category tabs and the 4-row chart) under a chevron-led OES header that starts collapsed and is remembere.
22
+ - **0.2.71** (2026-09-03) Add an on-screen debug console to the bottom of the sidebar that shows the newest event labels from a 200-line in-memory ring fed only while a debug or profile .
23
+ - **0.2.70** (2026-09-03) Gate the plugin self-cost line behind the debug/profile loggers, swap the tab-header pipe separators for per-tab status-light glyphs whose My-work light scans p.
24
+ - **0.2.69** (2026-09-03) Add Codecov coverage reporting with a 90% line gate and live README badge, excluding thin TUI wrappers and runtime I/O glue from coverage.
25
+ - **0.2.68** (2026-09-03) Extract the inline work-state and canonical status literals behind constants: new WORK_STATE_* values in the omo planStatus module (the WorkState type now deriv.
26
+ - **0.2.67** (2026-09-03) Calibrate the sidebar row-plan chrome from the opencode TUI source: split PANEL_CHROME into the measured 6-row host frame plus a title reserve, and drop the dea.
27
+ - **0.2.66** (2026-09-03) Fold D:/ vs D:\ and git-bash /d/ path spellings through shared foldPathKey/samePath helpers and compare the realtime session.updated project filter through same.
28
+ - **0.2.65** (2026-09-03) Flank the realtime braille chart with a compact axis column showing the recent max on top and the 0 baseline below, via a <=3-char formatCompact label.
29
+ - **0.2.64** (2026-09-03) Unify the realtime widget onto one shared 300ms wall-clock timeline whose token/cache series are 1s windowed derivatives reconciled with estimated stream deltas.
30
+ - **0.2.63** (2026-09-03) Tune the realtime block to 30 ms CPU/RAM sampling with a rolling 1 s window and 40 ms coalesced token redraws, draw the chart 3 rows tall, and show a one-row co.
31
+ - **0.2.62** (2026-09-03) Add an event-driven realtime block with token, cache and process CPU/RAM series under the OES bar and route glyph colours through a shared resolver.
32
+ - **0.2.61** (2026-09-02) Expose a shared new-session prompt as.
33
+ - **0.2.60** (2026-09-02) Switch the tok/s sparkline to ASCII output and align chart docs and tests.
34
+ - **0.2.59** (2026-09-02) Add a Dismissed questions My work group and route dismissed-question errors into it.
35
+ - **0.2.58** (2026-09-02) Add a GitHub Actions CI workflow that typechecks, tests with coverage, and benchmarks on push.
36
+ - **0.2.57** (2026-09-02) Smooth the OES token-rate sparkline by bucket-averaging and window-averaging the series before rendering.
37
+ - **0.2.56** (2026-09-02) Fix the stuck OES status bar, add a live braille token-rate sparkline, normalize prefixed session IDs, and hide empty ghost sessions.
38
+ - **0.2.55** (2026-09-02) Add a live token-rate status bar and auto-resolve or dismiss stale interrupted My work questions.
39
+ - **0.2.54** (2026-09-02) Normalize OS-specific ignore rules and cross-platform line endings for consistent multi-OS development.
40
+ - **0.2.53** (2026-09-01) Drop the redundant queued glyph on delegate rows so a pending task shows one hourglass.
41
+ - **0.2.52** (2026-09-01) Indent delegate children one glyph column under their agent header.
42
+ - **0.2.51** (2026-09-01) Normalize row highlighting so only active rows are coloured and static lists stay muted.
43
+ - **0.2.50** (2026-09-01) Add a Session Drafts group and give file lists a searchable view-all header action.
44
+ - **0.2.49** (2026-09-01) Remove the OMO bottom group and fold the document index into per-kind file resolvers with session and plan-status filters.
45
+ - **0.2.48** (2026-09-01) Stop the sidebar freezing on a locked database by failing fast on lock waits, serving the last snapshot, and reading the runtime snapshot in a worker thread.
46
+ - **0.2.47** (2026-09-01) Round perf trend y-axis labels to drop trailing-zero decimals.
47
+ - **0.2.46** (2026-09-01) Rename the Details tab to Project and tag the current session with a [C] suffix.
48
+ - **0.2.45** (2026-09-01) Reconcile My work plan grouping against boulder work and writer-session todos so an approved plan whose work finished shows as Finished instead of Ready to star.
49
+ - **0.2.44** (2026-09-01) Replace the touched-file detail DialogPad with a native DialogSelect that offers Preview or Copy relative path, and disable approval dialog actions instead of t.
50
+ - **0.2.43** (2026-09-01) Close the tab-status test gap by extracting the render decision into a tested tabStatusLine helper so a ready tab's null status can no longer crash the row.
51
+ - **0.2.42** (2026-09-01) Fix the My work tab briefly showing nothing on first open by re-delivering the initial snapshot the bus dropped before its listener attached, and treat a not-ye.
52
+ - **0.2.41** (2026-09-01) Add per-tab status rows that show session-switch and cold-tab loading with a braille spinner, DB errors and Stats empty notes until data lands, and relabel the .
53
+ - **0.2.40** (2026-09-01) Document perf chart modules and the dependency change.
54
+ - **0.2.39** (2026-09-01) Render perf bars and trends with chart libraries, dropping hand-rolled barGlyphs and sparkline.
55
+ - **0.2.38** (2026-09-01) Add perf charts dialog with stats, histogram and gauges.
56
+ - **0.2.37** (2026-09-01) Add perf chart and stat render helpers (asciiTrend, shareBar, perfStatLine, histogram, gauge).
57
+ - **0.2.36** (2026-09-01) Add perf series pipeline helpers (interpolate, smooth, downsample, stripAnsi).
58
+ - **0.2.35** (2026-09-01) Add asciichart, simple-statistics and @crafter/charts chart/stat dependencies.
59
+ - **0.2.34** (2026-09-01) Close the omo layer's cross-domain edges by moving workStatusGlyph into core and the approval session-state enrichment type into runtime (EnrichedApproval), correct the perf layer rule so its TUI view may import ui, and version the .cursor rules in the repo
60
+ - **0.2.33** (2026-09-01) Extract the host and OMO event wiring into a typed event bus (pware.oc.core.bus with PwareEvent and per-layer EV_* event-name constants), adapt host TUI events .
61
+ - **0.2.32** (2026-09-01) Refresh a session's status together with its age on live-snapshot cache hits so the My work Running group no longer keeps sessions that went idle, list only run.
62
+ - **0.2.31** (2026-09-01) Replace the left/right direction flows with single-dot waves growing from the middle row (⠂⠒⠲ right while a tool call is in flight, ⠐⠒⠙ left while tokens stream.
63
+ - **0.2.30** (2026-09-01) Split every sidebar row into a state glyph plus a per-direction braille flow where a single dot sweeps right while a tool call is in flight, left while tokens s.
64
+ - **0.2.29** (2026-09-01) Add a Running group to the My work queue that lists recent main sessions still running or idle with their live status label, built by a toRunningItems filter ov.
65
+ - **0.2.28** (2026-09-01) Move the plan-to-writer-session index from the opencode resolver into the omo layer as a shared per-document-kind file engine (plan, draft, notepads, evidence, .
66
+ - **0.2.27** (2026-09-01) Make My work an action-based queue — Ready to review / Ready to start / Finished / Drafting groups with a planner-session row suffix backed by an in-memory plan.
67
+ - **0.2.26** (2026-08-31) Make every panel list end in a clickable "+N more" revealer via a shared RowList with useReveal and MoreReveal (replacing sliceWithOverflow so no content row is.
68
+ - **0.2.25** (2026-08-31) Extract shared sidebar primitives into a new pware.oc.ui.sections module (useFold over the legacy folded kv contract, FoldSection, budget-sliced GroupSection, a.
69
+ - **0.2.24** (2026-08-31) Add a live plugin self-cost status line above the panel that samples event, scan and tick latency plus renderer FPS through a new perf.self reader, export it fr.
70
+ - **0.2.23** (2026-08-31) Show the ulw-plan review lifecycle on My work approval rows (R<round> per-lane momus/independent glyphs) by parsing the draft frontmatter review block in plan.t.
71
+ - **0.2.22** (2026-08-31) Enforce CRLF line endings via a repo .gitattributes (text=auto eol=crlf) so git stops warning about LF-to-CRLF conversions on Windows, and keep the shell hooks .
72
+ - **0.2.21** (2026-08-31) Extract OpenCode and OMO string literals into documented per-domain constants (partType, eventType, toolName in core; planStatus, boulderStatus, backgroundTask,.
73
+ - **0.2.20** (2026-08-31) Reorganize the plugin source into pware.-prefixed layered modules (core, opencode, omo, runtime, perf, ui) with per-layer barrels and an ARCHITECTURE.md module map, rename the live-snapshot symbols to runtime naming (RuntimeSnapshot, readRuntimeSnapshot, resetRuntimeCache), move SPARK_FRAMES back into pulse to restore the core-never-imports-ui layer rule, mirror the test tree to the new layout, repoint the plugin entry export, and add an always-on architecture rule
74
+ - **0.2.19** (2026-08-31) Show the planner session state on pending-approval rows in My work (working/waiting/idle/archived/unknown) by enriching each approval via a new approvalState re.
75
+ - **0.2.18** (2026-08-31) Make My work questions project-wide so a restart or session switch can no longer hide an open question, and widen the Sessions list with a sessionFetch revealer.
76
+ - **0.2.17** (2026-08-31) Rename the pending-approval Continue row to Navigate to session and add an Approve row in its own category that sends an ok reply to the plan's writer session v.
77
+ - **0.2.16** (2026-08-31) Extract every status-to-character mapping into a single pware.oc.ui.glyphs module (workStatusGlyph, markGlyph with queued rendering as the ◷ clock instead of th.
78
+ - **0.2.15** (2026-08-31) Extract the resolution layer into src/resolvers: per-entity opencode (session/tool/file/question/todo) and omo (boulder/plan/approval/doc/config) resolver modul.
79
+ - **0.2.14** (2026-08-31) Add a Project tab rolling up tools and files across recent sessions (tab bar is now OES | Project | Session | Perf, old Current renamed to Session), show the wi.
80
+ - **0.2.13** (2026-08-31) Filter Files through `.oesignore` and `.gitignore` with the `ignore` package, exclude `question` from Perf timing, and add a `… N more` Files expander.
81
+ - **0.2.12** (2026-08-31) Add perf timing log feature and update project files.
82
+ - **0.2.11** (2026-08-31) Open a dated Perf timing log when you click a Time phase, Models header, or slow-tool row.
83
+ - **0.2.10** (2026-08-30) Show a success toast when the sidebar plugin loads.
84
+ - **0.2.9** (2026-08-30) Split OES and OMO into stacked groups with Works, Boulder, and Docs tabs plus height-aware row trimming.
85
+ - **0.2.8** (2026-08-30) Open OMO plan rows as a headed markdown preview and mark plan status with check glyphs.
86
+ - **0.2.7** (2026-08-30) Keep file previews inside a terminal-sized scrollbox so Copy and Close stay on screen.
87
+ - **0.2.6** (2026-08-30) Use a down-triangle glyph on Delegate group headers so they no longer look like rows.
88
+ - **0.2.5** (2026-08-30) Add click-for-detail dialogs with formatted Markdown preview and group Delegates by agent name.
89
+ - **0.2.4** (2026-08-30) Stop leftover Delegates spinners once the OpenCode session is idle, extract tool and file metadata in SQLite, and spawn git status off the TUI thread.
90
+ - **0.2.3** (2026-08-30) Add an OMO Plans tab, underline clickable chrome, and label task tools by their short description.
91
+ - **0.2.2** (2026-08-30) Speed up large-tree refresh and mark thinking with a therefore sign instead of a star.
92
+ - **0.2.1** (2026-08-30) Initial public release of the OpenCode Extended Sidebar TUI plugin.
93
+ One sentence per commit. The `commit-msg` hook bumps the patch in `package.json` and prepends a line here.
94
+
95
+ - **0.2.0** (2026-08-30) Session switcher, live tools, file diffs, and oes.json display options.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 pleware
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,235 @@
1
+ <p align="center">
2
+ <img src="https://raw.githubusercontent.com/pleware/opencode-extended-sidebar/main/assets/branding.png" alt="OpenCode Extended Sidebar" width="720" />
3
+ </p>
4
+
5
+ # OpenCode Extended Sidebar | TUI Plugin
6
+
7
+ **Mission control for your OpenCode agents — right inside the TUI.**
8
+
9
+ Switch sessions, watch tools run live, see which files changed, and where the time went. No browser, no dashboard, four tiny dependencies.
10
+
11
+ ![OpenCode plugin](https://img.shields.io/badge/OpenCode-TUI%20plugin-000?style=flat-square) ![CI](https://github.com/pleware/opencode-extended-sidebar/actions/workflows/ci.yml/badge.svg) [![npm](https://img.shields.io/npm/v/opencode-extended-sidebar)](https://www.npmjs.com/package/opencode-extended-sidebar) [![codecov](https://codecov.io/gh/pleware/opencode-extended-sidebar/branch/main/graph/badge.svg)](https://codecov.io/gh/pleware/opencode-extended-sidebar) ![Runtime deps](https://img.shields.io/badge/runtime%20deps-4-brightgreen?style=flat-square) ![Read only](https://img.shields.io/badge/database-read--only-blue?style=flat-square) ![License](https://img.shields.io/badge/license-MIT-lightgrey?style=flat-square)
12
+
13
+ ---
14
+
15
+ ## Demo
16
+
17
+ **[ demo recording goes here ]**
18
+
19
+ *A short GIF showing session switching, live tool activity and file diffs.*
20
+
21
+ ---
22
+
23
+ ## Why
24
+
25
+ OpenCode gives you one conversation at a time. Real work looks different: an orchestrator, delegates, tool calls, and a trail of edited files. Extended Sidebar puts that back on screen. It reads OpenCode's own database — nothing to sync, no daemon. Open the TUI and the panel is there.
26
+
27
+ ## ⇄ Session switcher
28
+
29
+ > Recent sessions, one click away, now live in the **My work** tab as the `Sessions` group. Title, age, and whether it is still alive. The current session is tagged `[C]`. The group header keeps two right-rail labels: `switch` opens the host session switcher (the same `/sessions` command) and `new` jumps to the home prompt — the native new-session composer with `/` slash autocomplete, `@` mentions and the agent/model picker; Enter creates the session and sends it. The command palette exposes `nw`, and slash autocomplete exposes `/nw` (alias `/new`); both jump to that same home prompt. Empty sessions that were never prompted are hidden from the list. A trimmed group ends in a clickable `… +N more`. **Project** still rolls up the tools and files from those same recent sessions.
30
+
31
+ ## ⊚ Live activity pulse
32
+
33
+ > Two glyphs per live row: a **state** glyph first — the braille spinner while working, `•` idle, `⧗` queued, `×` failed — then a **direction** glyph while one is active: **→** while a tool call is in flight, **←** while tokens stream in, **◷** while waiting on the model — blinking about twice a second and coloured by what is happening: green receiving tokens, yellow waiting on the model, accent a tool in flight. Idle rows keep the slot blank so the list stays aligned. Colours come from your OpenCode theme.
34
+
35
+ ## ≡ Tool Calls feed that names things
36
+
37
+ > Each row is labelled with what actually ran — command, file, pattern, or task — plus how long it took. Running calls tick live; failures show `×`. Click a tool for a metadata sheet (never args or output). **Project** carries the same feed rolled up from the recent sessions. The feed shows the latest `toolRows` (default 5) and ends in a `… +N more` control that reveals the next batch with each click, up to `toolFetch` (default 20) rows of history.
38
+
39
+ ## ± File changes with diff stats
40
+
41
+ > Files this session touched, with `+N −M` and git letters (`M` `A` `D` `R` `C` `U` `T` `?`). **V** means viewed — a session read with no git status. Click Markdown for a scrollable preview; other files open a native picker — **Preview** or **Copy relative path**. **Project** merges the same list across the recent sessions. A file list's header carries a `view all` action that opens a searchable picker of every file.
42
+ >
43
+ > Scratch dirs (`tmp/`, `.tmp/`, `.omo/`) and boilerplate filenames are hidden via the plugin's default `.oesignore`. The project's own `.oesignore` (gitignore format) is honoured automatically when present; set `skipGitignore` to also honour the project's `.gitignore`.
44
+
45
+ ## ⋔ Delegates and sub-agents
46
+
47
+ > When an orchestrator hands work off, delegates appear as their own rows — tokens, status, pulse, click to jump. **Project** lists the project's boulder. **Session** lists only this session's children.
48
+
49
+ ## ? My work — what is waiting on you
50
+
51
+ > One queue of things that need **your** action, shown first in the core group. Open `question` tools anywhere in the project appear as rows. Three states: `?` **Awaiting answer** (the agent is live and waiting — click to jump to the session and answer), `⊘` **Interrupted** (the question was aborted — answer never came, the reason shows on a muted line under the session name; once an interrupted question has terminated it is treated as resolved and hidden), and `×` **Errors** (the question tool genuinely failed — collapsed by default, expand for the error text on a muted line under the session name). Interrupted and Errors rows open a picker with **Navigate to session** and **Dismiss** — dismissing hides the row and is remembered for the project. Then a **Sessions** group (`◔`) — every recent session, live or idle, each showing the title, its live status mark and the `[C]` current tag, click to jump straight back in. A `Pinned` group (empty for now) sits ahead of the queue for sessions you pin. OMO plans and drafts appear in six foldable groups — four action queues plus two archives. Click a group header to fold it to its count line, and a trimmed group ends in a clickable `… +N more`: `Ready to review` (`!`, plans genuinely waiting for your sign-off), `Ready to start` (`▶`, approved plans you can launch), `Finished` (`✓`, done plans — an approved plan is auto-reconciled to Finished when its boulder work completed, or the writer session's todos are all done) and `Drafting` (`…` rows, drafts still being written — click for a picker: **Navigate to session** jumps to the session that wrote the draft, **Preview plan file** opens it as a preview) and `Draft docs` (`•` rows — draft files no action queue shows and whose plan file does not exist yet (a draft superseded by a plan of the same name is hidden entirely): approved or done drafts, unknown-status drafts, or notes with no status at all; click opens the file as a preview) and `Plans` (`▸` rows — plan files that no action queue shows: plans with an unknown or absent status). Clicking an archived plan opens the native, searchable picker: **Navigate to session** jumps to the session that wrote the plan (a muted reason is shown when no session is found), **Preview plan file** opens it as a preview, and the three **start work** rows (`start work`, `start work --make-pr`, `start work --ship`) launch the OMO plan in the current session. An archived plan can be started directly, not only previewed, and the archive offers no **Approve**. Rows are names only — no per-row age or session-status clutter; the right rail carries the review state when present. Review-required plans add the ulw-plan review state `R<round> <momus><independent>`, with per-lane glyphs `✓` approved, `!` changes requested, `?` inconclusive, `…` review live, `·` waiting. A session row carries a clickable `P` pin link (placeholder until the pinned backend is wired). When `.omo/` is absent the approval section is simply gone; the question queue works on OpenCode alone.
52
+
53
+ ## ◴ Where the time actually goes
54
+
55
+ > **Perf** splits the wall clock into wait, think, stream and tools, then ranks models and slow calls. Click a phase, a section title, or a tool row for a dated column log. The scan runs only while this tab is open.
56
+ >
57
+ > The top row is the **OES bar**: a braille spinner while a tab loads or a session switch is in flight and `×` on a real error (with the message). When the status is quiet it shows an 8-column block bar plus an integer **tok/s** estimate from streaming deltas (≈ code points ÷ 4 over a 5 s window) — the same live reading the old bar used before the realtime widget. The bar is an inline trend, so it renders at 30% opacity; the number beside it takes full contrast only while tokens are actually moving, and fades with the bar at `0 tok/s`. A **`C`** link on the right opens the **charts** popup: Tok / Cache / Proc / Net category tabs, row selectors, and one 8-row ASCII trend at a time (sized to the dialog, live on the shared timeline); dismiss with **esc** or the header link, same as native OpenCode dialogs. The sidebar itself no longer carries inline category tabs or a braille chart. On a cold start the first line is briefly taken by a one-row `engage` boot line — a braille spinner plus a block fill that completes in about a second — which ends when the first snapshot lands and hands over to the `Loaded. Engage!` success toast. No prompt or output text ever leaves the panel — only the count.
58
+ >
59
+ > A muted **self** line above the tab row — `self 0.4ms/ev · 1.2ms/sc · 59fps` — shows what the plugin itself costs: average event-handler ms, average scan (fingerprint + snapshot) ms, and the TUI renderer's FPS. It measures the plugin's own runtime, not the model's. The line is diagnostic: it renders — and its timing runs — only while `OES_DEBUG_OPENCODE` or `OES_DEBUG_PROFILE` is active, so a normal session pays nothing for it. `OES_DEBUG_OPENCODE=1` additionally writes `self`-tagged JSON lines to the debug log.
60
+
61
+ ## ▣ One group, four views
62
+
63
+ > ```
64
+ > • My work • Session • Project • Stats
65
+ > ```
66
+ >
67
+ > **Session** is this agent, its delegates, tools, files and — with OMO — the drafts this session wrote (last five inline behind a `view all` picker). **My work** is the queue of things waiting on you — open questions, the recent sessions list (with `switch`/`new`), OMO plan approvals grouped by the action they need, and the `Draft docs` + `Plans` archives of leftover draft/plan files. **Project** is the project-wide view — the tools and files every recent session touched. **Stats** is timing. Each tab is led by a status light in place of a separator: `Session`, `Project` and `Stats` always show a muted `•`, while the **My work** light turns into `?` / `×` / `!` / `▶` / `⊘` whenever something is waiting on you **right now** — a live open question, a still-open failed question, a plan to review or start, an interrupted question. An *ended* failure is history (the Errors group still lists it once My work is open) and never lights the tab. The scan is project-wide and re-runs whenever the DB snapshot changes (≈1 s) with a 5-second periodic floor, so a freshly asked question lights the tab almost immediately. Tabs and folds are remembered. Clickable labels underline on hover. While a tab waits for its data a transient status row sits at its top — a braille spinner with `switching · <id>` while a session switch is in flight, `loading` on a cold tab, or an error/empty note (`no turns yet` on Stats) — and disappears the moment the data lands, so a switch never reads as a broken panel.
68
+
69
+ ## ⇕ Rows that fit the window
70
+
71
+ > `oes.json` row counts are ceilings. A short terminal trims live activity last, then Files, then Delegates. Every list ends in a clickable `… +N more`: the Tool Calls feed reveals another `toolRows` per click (up to `toolFetch`); My work groups and Delegates reveal more with each click too. File lists (Files, Drafts) drop the inline revealer for a header `view all` that opens a searchable picker of the full list.
72
+ >
73
+ > Row text is clipped to the measured column width (wcwidth), not to code units — a wide glyph (CJK, emoji) is cut off cleanly instead of wrapping the line to a second row.
74
+
75
+ ## ⊘ Privacy first
76
+
77
+ > The panel never shows prompts, tool arguments, outputs, patch bodies, or absolute paths. The database is opened read-only. What you see is names, counts, statuses and durations.
78
+
79
+ ## ∅ Four dependencies
80
+
81
+ > Four runtime packages — [`ignore`](https://www.npmjs.com/package/ignore), [`asciichart`](https://www.npmjs.com/package/asciichart), [`simple-statistics`](https://www.npmjs.com/package/simple-statistics), [`@crafter/charts`](https://www.npmjs.com/package/@crafter/charts) — each with zero transitive dependencies. SQLite comes from `bun:sqlite` or `node:sqlite`; everything else is an OpenCode peer you already have.
82
+
83
+ ## Legend
84
+
85
+ The glyph says *what* is happening; the colour says *how fresh* it is. Both come from your OpenCode theme.
86
+
87
+ **Glyphs**
88
+
89
+ | Glyph | Meaning |
90
+ | ------------------------------- | ------------------------------------------------------------- |
91
+ | `⠋ ⠙ ⠹ ⠸ ⠼ …` | working — the same braille spinner OpenCode uses for thinking |
92
+ | `◷` | waiting on the model (direction glyph — blinks) |
93
+ | `→` | tool in flight (direction glyph — blinks) |
94
+ | `←` | tokens streaming in (direction glyph — blinks) |
95
+ | `•` | idle — finished or archived |
96
+ | `⧗` | queued — waiting for a concurrency slot |
97
+ | `▾` | group header (`▼` is the section fold) |
98
+ | `×` | failed |
99
+ | `?` `⊘` `×` `◔` `!` `…` `•` `▸` `▶` `✓` | My work: awaiting an answer / interrupted / errors / running / ready to review / drafting / draft docs (muted document rows) / plans (muted document rows) / ready to start / finished |
100
+ | `✓` `!` `?` `·` | Review lanes: approved / changes requested / inconclusive / waiting |
101
+ | `M` `A` `D` `R` `C` `U` `T` `?` | Files: git status — same letters as `git status --short` |
102
+ | `V` | Files: viewed (session read only) |
103
+ | `[C]` | Sessions: the current session label |
104
+ | `∴` | Perf: thinking |
105
+ | `█░` | Perf: share of the wall clock — `@crafter/charts` bar, filled `█` + partial blocks, space-empty |
106
+ | `▁▂▃▄▅▆▇█` | Perf: trend line chart — `asciichart`, nulls interpolated |
107
+
108
+ The working spinner animates on a separate fast glyph tick (80 ms) while rows and ages stay on the coarse 50 ms / 1 s clocks, and a direction glyph fades in and out on the tick cadence, expiring on its own — it stops after ~2 s receiving tokens, ~15 s waiting on the model, ~30 s after a tool call — unless the session is still busy. The state glyph shows `×` on a failed row and `•` on a finished one; the direction slot shows the glyph only while it is active, staying blank otherwise so every row aligns. A queued delegate shows `⧗` in warning yellow — it is waiting for a slot, not done.
109
+
110
+ **Colours**
111
+
112
+ | Colour | Theme key | Meaning |
113
+ | ---------------------- | --------------------------- | ------------------------------------------------ |
114
+ | green | `success` | receiving tokens, or active within the last 5 s |
115
+ | yellow | `warning` | waiting on the model, queued work, or last seen 5–10 s ago |
116
+ | accent | `primary` | tool in flight — also the current row |
117
+ | red | `error` | failed |
118
+ | muted | `textMuted` | idle, done or archived |
119
+ | green `+N` / red `−M` | `diffAdded` / `diffRemoved` | added and removed lines |
120
+ | `A` green / `D` red / `M` yellow | `success` / `error` / `warning` | Files: git-status letter by state; other letters muted |
121
+ | accent `∴` | `primary` | Perf: thinking |
122
+
123
+ While an arrow is lit it drives the colour. The current session is **bold** and tagged `[C]` in the Sessions list. Clickable labels **underline on hover**. On Perf the same arrows mean measured time: wait, stream, tools.
124
+
125
+ ## Install
126
+
127
+ This is a TUI plugin. It belongs in `tui.json`, not `opencode.json`.
128
+
129
+ ```sh
130
+ opencode plugin opencode-extended-sidebar --global
131
+ ```
132
+
133
+ Or add the npm name in `~/.config/opencode/tui.json`:
134
+
135
+ ```json
136
+ {
137
+ "$schema": "https://opencode.ai/tui.json",
138
+ "plugin": ["opencode-extended-sidebar"]
139
+ }
140
+ ```
141
+
142
+ Restart the OpenCode TUI. OpenCode installs the package from npm and the panel starts reading your existing session history.
143
+
144
+ For local development, point `plugin` at a `file:///` path to this checkout instead.
145
+
146
+ ## Configuration
147
+
148
+ Later files win:
149
+
150
+ 1. the plugin's own `oes.json` (defaults)
151
+ 2. `~/.config/opencode/oes.json` (respects `XDG_CONFIG_HOME`)
152
+ 3. `<project>/oes.json`
153
+
154
+ ```json
155
+ {
156
+ "fileRows": 8,
157
+ "perfHistory": 3,
158
+ "perfRows": 5,
159
+ "perfTurns": 120,
160
+ "questionReconcileSec": 15,
161
+ "sessionFetch": 20,
162
+ "skipGitignore": false,
163
+ "toolRows": 5,
164
+ "toolFetch": 20
165
+ }
166
+ ```
167
+
168
+ | Key | Default | What it controls |
169
+ | ------------------------ | -------------------------------- | ----------------------------------------------------- |
170
+ | `fileRows` | `8` | most file rows shown |
171
+ | `perfHistory` | `3` | sessions under Perf → History; `0` hides it |
172
+ | `perfRows` | `5` | rows per Perf section |
173
+ | `perfTurns` | `120` | recent turns Perf measures |
174
+ | `questionReconcileSec` | `15` | seconds between full open-question rescans when no live hint arrives |
175
+ | `sessionFetch` | `20` | recent sessions fetched for the My work `Sessions` group |
176
+ | `skipGitignore` | `false` | also honour the project's root `.gitignore` (`.oesignore` is always honoured) |
177
+ | `toolRows` | `5` | most tool-call rows shown; the `… +N more` control reveals another `toolRows` per click |
178
+ | `toolFetch` | `20` | tool-call history kept behind the `… +N more` revealer; distinct from `toolRows` |
179
+
180
+ Row counts are ceilings: a short terminal trims below them. Changes apply on the next refresh — no restart.
181
+
182
+ Ignored files come from `.oesignore` and, when enabled, `.gitignore` — both at the project root, both in gitignore format. The plugin ships a default `.oesignore`.
183
+
184
+ ## Debug
185
+
186
+ Set `OES_DEBUG_OPENCODE` in the environment **before** starting OpenCode, then restart the TUI. While either logger is active the sidebar shows the muted `self` cost line with a yellow flag row above it — `debug mode` and/or `profile` — plus a second muted row that prints the **resolved log directory** (`logs <path>`) so you can see exactly where files are being written. Below everything the panel then also draws a read-only **debug console**: short event labels (`db open`, …) newest first, only 5 visible rows over a 200-line in-memory ring that wheel-scrolls to older events. The console is fed only while a logger is on — with no logger active the `self` line, its measurement, and the console are off entirely.
187
+
188
+ ```bash
189
+ # writes to <plugin>/logs/oes-debug-YYYY-MM-DD.log
190
+ OES_DEBUG_OPENCODE=1 opencode
191
+ ```
192
+
193
+ ```powershell
194
+ $env:OES_DEBUG_OPENCODE = "1"
195
+ opencode
196
+ ```
197
+
198
+ `1`, `true`, `yes`, or `on` use the plugin's `logs/` directory. Any other non-empty value is treated as a directory path. `0`, `false`, `no`, or `off` turns it off. Lines are JSON (`ts`, `tag`, `msg`, optional `data`) — path resolution, monitor emits, Perf reads, and the `self` tag logs the plugin's own measured latencies. Logging never crashes the panel.
199
+
200
+ SQLite reads fail fast: `busy_timeout` is 100 ms, so a transient WAL lock no longer freezes the panel — the previous snapshot is kept on screen and a `sql.busy` debug line (with the SQL in `data.q`) is appended so lock contention is visible in the log.
201
+
202
+ The same semantics power `OES_DEBUG_PROFILE`, which times **every plugin entry point and hotspot** and writes one line per call to `<plugin>/logs/oes-profile-YYYY-MM-DD.log`: `{ ts, tag, ms, data? }`. In this local repo checkout, `<plugin>/logs` means `./logs` at the repository root (not `./src/logs`). Tags: `event` (per event type), `tick`, `render` (the re-render trigger), `requestRender`, `row` (per row built), `scan`, `monitor.emit` (fingerprint + snapshot), `db.snapshot` / `db.feed` / `db.questions` / `perf.read`, `sql` (every query, with its SQL in `data.q`), `omo.read` / `omo.stamp` / `omo.config` / `omo.approvals` / `omo.docs`, `mywork.approvals` (the per-approval session lookup), `files.decorate` (git marks), `git`, `remount`, `hydrate`, and the async host calls `rpc.diff` / `rpc.selectSession` / `rpc.startWork` / `rpc.approve`. When the panel unmounts, one `summary` line with per-tag `{ n, total, avg, max }` is appended — the whole wall-clock split in a single line.
203
+
204
+ ## How it works
205
+
206
+ The panel is a read-only view of data OpenCode already stores.
207
+
208
+ | Source | Path | Used for |
209
+ | --------------- | ------------------------------------------------------------- | -------------------------------- |
210
+ | OpenCode SQLite | `~/.local/share/opencode/opencode.db` (or `OPENCODE_DB`) | sessions, tools, files, timings |
211
+ | OMO | `<project>/.omo/` | plan approvals (My work) — optional |
212
+ | `oes.json` | plugin / user config / project | display limits |
213
+ | ignore files | `<project>/.oesignore` (always) · `.gitignore` (with `skipGitignore`) | files hidden from the panel |
214
+
215
+ It refreshes from database stamps, file watches, and OpenCode events. The always-on runtime snapshot is read off the TUI main thread in a Bun worker (with a synchronous fallback if the worker is unavailable), so SQLite reads never block the UI. Cost is shown only when the provider reports it. The `self` line measures the plugin's own runtime with `performance.now()` and the TUI renderer's native frame stats — no extra data source — and it runs only while a debug or profile logger is active.
216
+
217
+ ## Contributing
218
+
219
+ Issues and pull requests are welcome. Constraints: read-only OpenCode data, no prompts or tool I/O in the UI, every row must survive a narrow terminal.
220
+
221
+ Every commit patch-bumps `package.json` and prepends one English sentence to [CHANGELOG.md](CHANGELOG.md). Write that sentence as the first line of the commit message. A green CI run on `main` publishes that version to npm.
222
+
223
+ `bun test` runs unit and fixture tests. `bun run typecheck` checks types with `tsc --noEmit`. `bun run bench` times the 5k-part scan.
224
+
225
+ ## License
226
+
227
+ MIT. Copyright © 2026 [pleware](https://github.com/pleware).
228
+
229
+ <p>
230
+ <a href="https://github.com/pleware"><img src="https://raw.githubusercontent.com/pleware/opencode-extended-sidebar/main/assets/branding.pware.png" alt="pware" width="72" /></a>
231
+ </p>
232
+
233
+ ## Acknowledgements
234
+
235
+ This plugin started as a TUI take on the same idea as [Phrouros](https://github.com/disaeye/phrouros) — a live view of OpenCode agents, delegates and session activity, only inside the sidebar instead of a browser. Thank you to [disaeye](https://github.com/disaeye) for Phrouros.
package/oes.json ADDED
@@ -0,0 +1,11 @@
1
+ {
2
+ "fileRows": 8,
3
+ "perfHistory": 3,
4
+ "perfRows": 5,
5
+ "perfTurns": 120,
6
+ "questionReconcileSec": 15,
7
+ "sessionFetch": 20,
8
+ "skipGitignore": false,
9
+ "toolRows": 5,
10
+ "toolFetch": 20
11
+ }
package/package.json ADDED
@@ -0,0 +1,100 @@
1
+ {
2
+ "name": "opencode-extended-sidebar",
3
+ "version": "0.2.90",
4
+ "description": "OpenCode TUI sidebar: session switcher, live tools/files, click-for-detail dialogs with scrollable file preview, perf timing logs and a chart dialog with trend lines, histograms and gauges, debug/profile mode banners with a resolved log-path hint, a live self-cost status line (event/scan latency + renderer FPS), height-aware row trimming, an action-based My work queue (open questions + plan approvals grouped by ready-to-review / ready-to-start / finished / drafting / draft-docs and plans archives, a pinned-sessions group, and a review-state suffix), per-tab transient status rows (session-switch spinner, cold-tab loading, error and empty notes), a new-session jump exposed as command-palette `nw` and slash `/nw`, and optional OMO plan approvals with a delegate view (read-only)",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "PWare <pawel@pware.ai>",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/pleware/opencode-extended-sidebar.git"
11
+ },
12
+ "homepage": "https://github.com/pleware/opencode-extended-sidebar#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/pleware/opencode-extended-sidebar/issues"
15
+ },
16
+ "keywords": [
17
+ "opencode",
18
+ "plugin",
19
+ "tui",
20
+ "sidebar",
21
+ "session-switcher",
22
+ "token-usage",
23
+ "latency",
24
+ "observability",
25
+ "charts",
26
+ "statistics",
27
+ "asciichart",
28
+ "perf-charts",
29
+ "profile-logs",
30
+ "self-cost",
31
+ "fps",
32
+ "oh-my-openagent",
33
+ "markdown-preview",
34
+ "my-work",
35
+ "work-queue",
36
+ "tab-status",
37
+ "loading-indicator",
38
+ "command-palette",
39
+ "slash-command",
40
+ "plan-resolution",
41
+ "session-status",
42
+ "phrouros"
43
+ ],
44
+ "oc-plugin": [
45
+ "tui"
46
+ ],
47
+ "exports": {
48
+ "./tui": "./src/pware.oc.ui.tsx"
49
+ },
50
+ "files": [
51
+ "src",
52
+ "oes.json",
53
+ ".oesignore",
54
+ "scripts/install-git-hooks.mjs",
55
+ "README.md",
56
+ "CHANGELOG.md",
57
+ "LICENSE"
58
+ ],
59
+ "publishConfig": {
60
+ "access": "public"
61
+ },
62
+ "peerDependencies": {
63
+ "@opencode-ai/plugin": ">=1.3.7",
64
+ "@opentui/core": ">=0.5.8",
65
+ "@opentui/solid": ">=0.5.8",
66
+ "solid-js": ">=1.9.0"
67
+ },
68
+ "devDependencies": {
69
+ "@opentui/core": "^0.5.9",
70
+ "@opentui/solid": "^0.5.9",
71
+ "@types/bun": "^1.4.0",
72
+ "solid-js": "^1.9.15"
73
+ },
74
+ "peerDependenciesMeta": {
75
+ "@opentui/core": {
76
+ "optional": true
77
+ },
78
+ "@opentui/solid": {
79
+ "optional": true
80
+ },
81
+ "solid-js": {
82
+ "optional": true
83
+ }
84
+ },
85
+ "engines": {
86
+ "node": ">=20"
87
+ },
88
+ "scripts": {
89
+ "prepare": "node scripts/install-git-hooks.mjs",
90
+ "test": "bun test test/unit test/snapshot",
91
+ "typecheck": "tsc --noEmit",
92
+ "bench": "bun test test/bench"
93
+ },
94
+ "dependencies": {
95
+ "ignore": "^7.0.7",
96
+ "asciichart": "^1.5.25",
97
+ "simple-statistics": "^7.11.0",
98
+ "@crafter/charts": "^0.2.5"
99
+ }
100
+ }
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Ustawia core.hooksPath=.githooks tylko gdy ten pakiet jest samym klonem repo
4
+ * (nie gdy leży w node_modules innego projektu).
5
+ */
6
+ import { execSync } from "node:child_process"
7
+ import { existsSync } from "node:fs"
8
+ import { dirname, resolve } from "node:path"
9
+ import { fileURLToPath } from "node:url"
10
+
11
+ const pkgRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..")
12
+ const hook = resolve(pkgRoot, ".githooks/commit-msg")
13
+ if (!existsSync(hook)) process.exit(0)
14
+
15
+ try {
16
+ const top = execSync("git rev-parse --show-toplevel", {
17
+ cwd: pkgRoot,
18
+ encoding: "utf8",
19
+ stdio: ["ignore", "pipe", "ignore"],
20
+ }).trim()
21
+ if (resolve(top) !== pkgRoot) process.exit(0)
22
+
23
+ execSync("git config core.hooksPath .githooks", {
24
+ cwd: pkgRoot,
25
+ stdio: "ignore",
26
+ })
27
+ } catch {
28
+ // brak gita / poza klonem — nic nie rób
29
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * pware.oc.core.constants
3
+ *
4
+ * Single source of truth for the plugin's string literals: OpenCode host
5
+ * literals (part types, host event types, tool names) plus the plugin's own
6
+ * canonical vocabularies (statuses, pulse/marks, row kinds, event kinds,
7
+ * My work groups, Perf/self phases).
8
+ */
9
+ export * from "./pware.oc.core.constants.partType.js"
10
+ export * from "./pware.oc.core.constants.eventType.js"
11
+ export * from "./pware.oc.core.constants.toolName.js"
12
+ export * from "./pware.oc.core.constants.status.js"
13
+ export * from "./pware.oc.core.constants.pulse.js"
14
+ export * from "./pware.oc.core.constants.eventKind.js"
15
+ export * from "./pware.oc.core.constants.rowKind.js"
16
+ export * from "./pware.oc.core.constants.myWork.js"
17
+ export * from "./pware.oc.core.constants.phase.js"
18
+ export * from "./pware.oc.core.constants.eventName.js"
@@ -0,0 +1,29 @@
1
+ /**
2
+ * pware.oc.core.constants.eventkind
3
+ *
4
+ * The plugin's own classification of host events — the four buckets the panel
5
+ * reacts to. `pware.oc.core.events.ts` maps raw event types onto these.
6
+ */
7
+
8
+ /** Event kind: model flow (delta / step / status). */
9
+ export const EVENT_KIND_FLOW = "flow"
10
+
11
+ /** Event kind: a tool call. */
12
+ export const EVENT_KIND_TOOL = "tool"
13
+
14
+ /** Event kind: a file was edited. */
15
+ export const EVENT_KIND_FILE = "file"
16
+
17
+ /** Event kind: the database should be re-read. */
18
+ export const EVENT_KIND_DB_REFRESH = "db-refresh"
19
+
20
+ /** Every host event kind the plugin recognizes. */
21
+ export const EVENT_KINDS = [
22
+ EVENT_KIND_FLOW,
23
+ EVENT_KIND_TOOL,
24
+ EVENT_KIND_FILE,
25
+ EVENT_KIND_DB_REFRESH,
26
+ ] as const
27
+
28
+ /** A host event kind. */
29
+ export type EventKind = (typeof EVENT_KINDS)[number]
@@ -0,0 +1,13 @@
1
+ export const EV_OES_REFRESH_HINT = "pware.oes.refresh.hint"
2
+ export const EV_OES_SNAPSHOT = "pware.oes.snapshot"
3
+ export const EV_OES_SESSION_SELECT = "pware.oes.session.select"
4
+ export const EV_OES_QUESTION_HINT = "pware.oes.question.hint"
5
+
6
+ export const OES_EVENT_NAMES = [
7
+ EV_OES_REFRESH_HINT,
8
+ EV_OES_SNAPSHOT,
9
+ EV_OES_SESSION_SELECT,
10
+ EV_OES_QUESTION_HINT,
11
+ ] as const
12
+
13
+ export type OesEventName = (typeof OES_EVENT_NAMES)[number]