opencode-navigator 0.23.0 → 0.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/HOST_API.md +25 -5
- package/LINT_COVERAGE.md +201 -0
- package/PROVIDERS.md +2 -2
- package/README.md +100 -9
- package/dist/chunk-fd7394y1.js +17 -0
- package/dist/chunk-pwa1wzer.js +22 -0
- package/dist/native-todo-setup.js +1156 -0
- package/dist/navigator-updates.js +63 -25
- package/dist/onboarding.js +379 -0
- package/dist/provider-limits.js +14 -7
- package/dist/runtime-dependencies.json +5 -5
- package/dist/server.js +2 -2
- package/dist/sidebar-settings.js +901 -420
- package/dist/toolbar-settings.js +143 -34
- package/dist/tui.js +512 -625
- package/dist/upgrade-notes.js +87 -0
- package/package.json +20 -15
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.25.0] - 2026-10-31
|
|
4
|
+
|
|
5
|
+
- Offer Enable Todo when OpenCode 2's native tool is disabled, with an existing server-config picker, exact change preview and separate confirmation. Preserve unrelated JSONC content and refuse stale targets; distinguish disabled Todo from an enabled empty list.
|
|
6
|
+
- Update the seven-slide setup wizard for native Todo enablement, provider/account limits, multi-icon or text-only toolbar pins, About/changelog and Bug reports. Describe each host's real permissions/LSP capabilities and keep navigation visible while short-terminal content scrolls.
|
|
7
|
+
|
|
8
|
+
## [0.24.0] - 2026-10-31
|
|
9
|
+
|
|
10
|
+
- Support the latest stable OpenCode 1.19.5 and 2.2.5 releases, preserving both host adapters and existing sidebar behavior.
|
|
11
|
+
- Preserve Limits scales and reset-credit controls across equivalent quota snapshots and unrelated workspace events, while retaining current-account and credential-change guards.
|
|
12
|
+
- Keep rounded selection backgrounds consistent in nested dialogs and highlighted rows.
|
|
13
|
+
- Configure each toolbar button with zero to three icons and optional custom text, including text-only buttons. Keep legacy/state choices, unsaved drafts, rounded clipping, and width-aware More/wrapping.
|
|
14
|
+
- Keep Quick Action rows and their hover/focus state stable while typing in the main prompt on both supported OpenCode hosts.
|
|
15
|
+
- Show toolbar hover/focus hints without moving Limits or other sections, preserving centered, uniformly sized icon controls and empty-toolbar collapse.
|
|
16
|
+
- Add Settings → About with the running versions, explicit update status/checking, confirmed updates, and a versioned changelog that can be reopened independently of first-launch upgrade notes.
|
|
17
|
+
- Prepare editable Bug reports with confirmed sending through authenticated GitHub CLI and an independent Open in browser action. Retain drafts through errors and cancellation, and require manual review before retrying an uncertain submission.
|
|
18
|
+
|
|
3
19
|
## [0.23.0] - 2026-10-28
|
|
4
20
|
|
|
5
21
|
- Support only the latest stable OpenCode 1.x and 2.x releases, currently 1.19.5 and 2.2.0, including the newer terminal renderer.
|
package/HOST_API.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# Public Host APIs And Remaining Gaps
|
|
2
2
|
|
|
3
|
-
Navigator supports only OpenCode **1.19.5** and **2.2.
|
|
3
|
+
Navigator supports only OpenCode **1.19.5** and **2.2.5**, the current stable
|
|
4
4
|
release in each major line. Published SDK declarations and real-host checks
|
|
5
5
|
define the boundary; internal host components are not plugin APIs.
|
|
6
6
|
|
|
7
7
|
## Host-Owned Services
|
|
8
8
|
|
|
9
|
-
| Capability | OpenCode 1.19.5 | OpenCode 2.2.
|
|
9
|
+
| Capability | OpenCode 1.19.5 | OpenCode 2.2.5 |
|
|
10
10
|
| --- | --- | --- |
|
|
11
11
|
| Todo | Supported host Todo source/events | Public message cache, completed `todowrite` and revert boundary |
|
|
12
12
|
| Skills | Host discovery and prompt insertion | Native Skill cache and `session.skill` with exact ID |
|
|
@@ -26,11 +26,14 @@ justify bypassing a native API.
|
|
|
26
26
|
| Implementation | Missing equivalent / preserved semantics | Removal condition |
|
|
27
27
|
| --- | --- | --- |
|
|
28
28
|
| Shared private preferences and atomic lock | A common 1.x/2.x store with existing data, Global/Worktree overrides, portable-default precedence and user-wide pins/groups/trust. The 2.x host store is per-channel/plugin, not this cross-host contract. No mirrored store is created. | A public shared store and supported migration preserving scopes and concurrency. |
|
|
29
|
-
| Nested dialog frames | The host has one active dialog, not the preceding frame's query, selection, scroll and unsaved draft.
|
|
29
|
+
| Nested dialog frames | The host has one active dialog, not the preceding frame's query, selection, scroll and unsaved draft. OpenCode 1 prompts and standalone confirmations delegate to native APIs. The 2.x promise prompt replaces its owner and loses Navigator's return callback, reproduced in the real toolbar-text smoke; Navigator-owned nested one-line prompts use a focused Shared editor. | Native nested frames and prompt ownership/dismissal semantics with equivalent restore and stale-target behavior. |
|
|
30
|
+
| About service port and manual release history | Navigator-specific metadata/update state must be shared between footer, shortcuts and deferred Settings. The shipped changelog is read separately from the first-launch claim; no second updater or preference mirror is created. Nested update confirmations stay in the existing frame stack. | Public host facilities preserving Navigator release identity, changelog browsing and nested return state. |
|
|
31
|
+
| Bug-report transport and external browser launch | Neither supported public TUI contract provides GitHub issue creation or an external browser opener. Direct sending uses the user's authenticated `gh` without reading credential files; a `type: Bug` repository form handles browser reports. Bounded argv-based OS launch has a visible link/clipboard fallback on remote or headless hosts. | Equivalent public host issue/browser APIs preserving authentication ownership, editable draft, real issue type and confirmation semantics. |
|
|
30
32
|
| Literal Ctrl+, hook on 2.x | Public plugin bindings are strings; the comma expander splits literal commas into alternatives. The named parser does not normalize `comma` to the actual comma event. Dispatch still uses the native command API. | A documented literal-comma binding passing the real Settings smoke. |
|
|
31
33
|
| Subagent child discovery | Published TUI Data caches sessions but has no complete children-sync operation. Initial/manual/reconnect discovery uses the public paginated API and syncs unknown IDs into the host cache. | A complete children-sync/query on the supplied public Data interface. |
|
|
32
34
|
| Subagent observation history and retry details | Native status and cached transcript retry data are used first; recent runs, pre-observation clock markers, errors and unloaded-child retry detail remain observation history. | Equivalent public observed-run/retry history without loading every transcript. |
|
|
33
35
|
| Read-only Todo projection | Native completed tool calls and revert are public; the host's `sessionTodos` helper is not exported. No direct CRUD/priority API exists. | A public equivalent projection; editing also requires an explicitly selected interaction and supported API. |
|
|
36
|
+
| Native Todo enablement | `config.get` exposes ordered sources, but `experimental.config.update` supports only shell. The setup feature previews and confirms a JSONC leaf edit in an existing discovered source through public server file APIs. File reads are location-confined, so selected-file IO is routed to its server-side parent; the original session/location remains the stale-target guard. Reads immediately before writes reject changed previews, and readback verifies the file and effective flag. The public write API has no CAS, so this is not an atomic transaction against concurrent external writers; uncertain outcomes require Refresh before retry. No model, shell or Todo event is used. | A public Todo config patch API preserving source precedence, unrelated JSONC content and conditional-write semantics. |
|
|
34
37
|
| Console/Go request lifecycle and projection | `client.usage.limits` is public, but the internal usage cache and budget selectors are not in published Plugin Context. Workspace IDs are not provider account IDs. | Equivalent public cache and selector on the plugin interface. |
|
|
35
38
|
| External quotas / reset credits | Console/Go is not a universal provider API and has no Codex reset-credit consume operation. Sources stay documented, account-bound and portable. Native auth/request errors never enable a bypass reader. | Host APIs matching provider/account/units/resets and idempotent consume semantics. |
|
|
36
39
|
| Pinned-file snapshot installer | Native package updates do not implement the recognized versioned wrapper/staging layout. Preserve installation source and scope. | A public atomic file-snapshot update API with equivalent verification. |
|
|
@@ -49,11 +52,28 @@ justify bypassing a native API.
|
|
|
49
52
|
|
|
50
53
|
Both current hosts have isolated real-host checks. Historical installer fixtures
|
|
51
54
|
exercise migration only; they do not extend the supported host matrix.
|
|
52
|
-
|
|
55
|
+
The published 2.2.5 TUI context, plugin, index and Solid declarations are identical
|
|
56
|
+
to 2.2.0. OpenTUI 0.8 retains the drawing-only paint-hook contract; renderer tests,
|
|
57
|
+
nested dialogs and frame-level typing probes run against the updated runtime.
|
|
58
|
+
Development uses Bun 1.4.4 and OpenTUI 0.8.1, leaving Solid/OpenTUI external so the
|
|
53
59
|
host owns its runtime. The 1.x host ships older runtime modules; its actual smoke
|
|
54
60
|
must pass rather than injecting the development modules into it.
|
|
55
61
|
|
|
56
|
-
OpenTUI 0.
|
|
62
|
+
OpenTUI 0.8 supports Node >=26.4.0 or Bun >=1.3.14. The updater verifies a staged
|
|
57
63
|
target with an available compatible runtime before switching a recognized local
|
|
58
64
|
wrapper. A lazy root import succeeding under an older Node does not prove full
|
|
59
65
|
renderer/FFI support. CI and package verification use Node 26.12.1.
|
|
66
|
+
|
|
67
|
+
### Deliberate Compatibility Pins
|
|
68
|
+
|
|
69
|
+
- `web-tree-sitter` stays at **0.25.10**, the exact peer required by OpenTUI
|
|
70
|
+
0.8.0. Upgrade it when the supported host runtime publishes a compatible peer
|
|
71
|
+
contract; the independent 0.27 line is not a compatible substitution.
|
|
72
|
+
- `typescript` is **7.0.2** throughout the resolved project graph. The shared
|
|
73
|
+
preset's legacy compiler dependency is overridden to TS7; its incompatible
|
|
74
|
+
SonarJS and typescript-eslint JS plugins are not loaded. Native replacements,
|
|
75
|
+
retained compatible plugins and the explicitly approved coverage loss are
|
|
76
|
+
documented in [Lint coverage](LINT_COVERAGE.md). No TS6 compatibility copy is used.
|
|
77
|
+
- Bun remains pinned at **1.4.4**, the current stable release. Direct dependencies
|
|
78
|
+
otherwise use their latest compatible stable releases; transitive updates stay
|
|
79
|
+
within upstream ranges. Runtime peers remain host-owned and are not bundled.
|
package/LINT_COVERAGE.md
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
# TypeScript 7 Lint Coverage
|
|
2
|
+
|
|
3
|
+
Project type checking uses stable TypeScript 7. The lockfile resolves every
|
|
4
|
+
TypeScript dependency, including the shared preset's dependency tree, to that
|
|
5
|
+
version. There is no TypeScript 6 compatibility installation.
|
|
6
|
+
|
|
7
|
+
Oxlint uses `@st1ggy/linter-config/solid-ox` with type-aware analysis. Oxfmt uses
|
|
8
|
+
`@st1ggy/linter-config/oxfmt-common`. `scripts/native-lint-config.ts` adapts the
|
|
9
|
+
published preset without editing installed packages. The user explicitly approved
|
|
10
|
+
the uncovered SonarJS checks below after reviewing the TS7 incompatibility.
|
|
11
|
+
|
|
12
|
+
## Preserved Checks
|
|
13
|
+
|
|
14
|
+
- Native ESLint, TypeScript, import and Unicorn rules remain enabled.
|
|
15
|
+
- The compatible Solid, ESLint-core, import-x, stylistic and Unicorn JS plugins
|
|
16
|
+
remain enabled. There is no blanket removal of JS plugins.
|
|
17
|
+
- `typescript-js/array-type` and `typescript-js/prefer-as-const` use their native
|
|
18
|
+
`typescript/` equivalents. The legacy typescript-eslint plugin is not loaded.
|
|
19
|
+
- Six SonarJS checks use native ESLint equivalents: `block-scoped-var`,
|
|
20
|
+
`no-delete-var`, `no-fallthrough`, `no-labels`, `no-unused-vars` and
|
|
21
|
+
`no-useless-catch`. Existing native options take precedence.
|
|
22
|
+
- Oxfmt still checks formatting separately. This migration does not configure
|
|
23
|
+
Stylelint for the CSS-free TUI project.
|
|
24
|
+
|
|
25
|
+
## Approved Coverage Loss
|
|
26
|
+
|
|
27
|
+
The published preset configures 161 SonarJS rule names. Six have the direct
|
|
28
|
+
native mappings above. The following 155 preset checks are not loaded after
|
|
29
|
+
removing the TS6-dependent SonarJS plugin. Some overlap with other retained rules,
|
|
30
|
+
but that is not claimed as complete semantic equivalence. The list includes
|
|
31
|
+
checks for frameworks and services this project does not use; it describes the
|
|
32
|
+
preset, not 155 distinct bugs or applicable findings in Navigator.
|
|
33
|
+
|
|
34
|
+
In particular, native cyclomatic complexity is not a replacement for SonarJS
|
|
35
|
+
cognitive complexity. Identical-function detection, several security/regex
|
|
36
|
+
checks and SonarJS-specific test heuristics lose their dedicated coverage.
|
|
37
|
+
|
|
38
|
+
```text
|
|
39
|
+
sonarjs/assertions-in-test-cases
|
|
40
|
+
sonarjs/async-test-assertions
|
|
41
|
+
sonarjs/aws-apigateway-public-api
|
|
42
|
+
sonarjs/aws-ec2-rds-dms-public
|
|
43
|
+
sonarjs/aws-ec2-unencrypted-ebs-volume
|
|
44
|
+
sonarjs/aws-efs-unencrypted
|
|
45
|
+
sonarjs/aws-iam-all-privileges
|
|
46
|
+
sonarjs/aws-iam-privilege-escalation
|
|
47
|
+
sonarjs/aws-iam-public-access
|
|
48
|
+
sonarjs/aws-opensearchservice-domain
|
|
49
|
+
sonarjs/aws-rds-unencrypted-databases
|
|
50
|
+
sonarjs/aws-restricted-ip-admin-access
|
|
51
|
+
sonarjs/aws-s3-bucket-granted-access
|
|
52
|
+
sonarjs/aws-s3-bucket-insecure-http
|
|
53
|
+
sonarjs/aws-s3-bucket-public-access
|
|
54
|
+
sonarjs/aws-s3-bucket-versioning
|
|
55
|
+
sonarjs/aws-sagemaker-unencrypted-notebook
|
|
56
|
+
sonarjs/aws-sns-unencrypted-topics
|
|
57
|
+
sonarjs/aws-sqs-unencrypted-queue
|
|
58
|
+
sonarjs/call-argument-line
|
|
59
|
+
sonarjs/chai-determinate-assertion
|
|
60
|
+
sonarjs/class-name
|
|
61
|
+
sonarjs/code-eval
|
|
62
|
+
sonarjs/cognitive-complexity
|
|
63
|
+
sonarjs/comma-or-logical-or-case
|
|
64
|
+
sonarjs/constructor-for-side-effects
|
|
65
|
+
sonarjs/content-length
|
|
66
|
+
sonarjs/content-security-policy
|
|
67
|
+
sonarjs/cookie-no-httponly
|
|
68
|
+
sonarjs/cors
|
|
69
|
+
sonarjs/csrf
|
|
70
|
+
sonarjs/disabled-timeout
|
|
71
|
+
sonarjs/dynamically-constructed-templates
|
|
72
|
+
sonarjs/encryption-secure-mode
|
|
73
|
+
sonarjs/explicit-test-skip
|
|
74
|
+
sonarjs/file-permissions
|
|
75
|
+
sonarjs/file-uploads
|
|
76
|
+
sonarjs/fixme-tag
|
|
77
|
+
sonarjs/for-loop-increment-sign
|
|
78
|
+
sonarjs/function-inside-loop
|
|
79
|
+
sonarjs/future-reserved-words
|
|
80
|
+
sonarjs/generator-without-yield
|
|
81
|
+
sonarjs/hardcoded-secret-signatures
|
|
82
|
+
sonarjs/hashing
|
|
83
|
+
sonarjs/hooks-before-test-cases
|
|
84
|
+
sonarjs/inconsistent-function-call
|
|
85
|
+
sonarjs/insecure-cookie
|
|
86
|
+
sonarjs/insecure-jwt-token
|
|
87
|
+
sonarjs/inverted-assertion-arguments
|
|
88
|
+
sonarjs/label-position
|
|
89
|
+
sonarjs/link-with-target-blank
|
|
90
|
+
sonarjs/max-switch-cases
|
|
91
|
+
sonarjs/memoize-cache-key
|
|
92
|
+
sonarjs/misplaced-loop-counter
|
|
93
|
+
sonarjs/no-all-duplicated-branches
|
|
94
|
+
sonarjs/no-angular-bypass-sanitization
|
|
95
|
+
sonarjs/no-case-label-in-switch
|
|
96
|
+
sonarjs/no-clear-text-protocols
|
|
97
|
+
sonarjs/no-code-after-done
|
|
98
|
+
sonarjs/no-dead-store
|
|
99
|
+
sonarjs/no-debug-commands-in-ui-tests
|
|
100
|
+
sonarjs/no-default-utility-imports
|
|
101
|
+
sonarjs/no-duplicate-in-composite
|
|
102
|
+
sonarjs/no-duplicate-test-title
|
|
103
|
+
sonarjs/no-duplicated-branches
|
|
104
|
+
sonarjs/no-element-overwrite
|
|
105
|
+
sonarjs/no-empty-collection
|
|
106
|
+
sonarjs/no-empty-test-file
|
|
107
|
+
sonarjs/no-empty-test-title
|
|
108
|
+
sonarjs/no-equals-in-for-termination
|
|
109
|
+
sonarjs/no-exclusive-tests
|
|
110
|
+
sonarjs/no-extra-arguments
|
|
111
|
+
sonarjs/no-fixed-wait-in-tests
|
|
112
|
+
sonarjs/no-floating-point-equality
|
|
113
|
+
sonarjs/no-forced-browser-interaction
|
|
114
|
+
sonarjs/no-global-this
|
|
115
|
+
sonarjs/no-globals-shadowing
|
|
116
|
+
sonarjs/no-gratuitous-expressions
|
|
117
|
+
sonarjs/no-hardcoded-ip
|
|
118
|
+
sonarjs/no-hardcoded-passwords
|
|
119
|
+
sonarjs/no-hardcoded-secrets
|
|
120
|
+
sonarjs/no-hook-setter-in-body
|
|
121
|
+
sonarjs/no-identical-conditions
|
|
122
|
+
sonarjs/no-identical-expressions
|
|
123
|
+
sonarjs/no-identical-functions
|
|
124
|
+
sonarjs/no-ignored-exceptions
|
|
125
|
+
sonarjs/no-implicit-global
|
|
126
|
+
sonarjs/no-incomplete-assertions
|
|
127
|
+
sonarjs/no-internal-api-use
|
|
128
|
+
sonarjs/no-interpolation-in-inline-snapshots
|
|
129
|
+
sonarjs/no-invariant-returns
|
|
130
|
+
sonarjs/no-inverted-boolean-check
|
|
131
|
+
sonarjs/no-literal-call
|
|
132
|
+
sonarjs/no-mime-sniff
|
|
133
|
+
sonarjs/no-mixed-completion-style
|
|
134
|
+
sonarjs/no-nested-assignment
|
|
135
|
+
sonarjs/no-nested-conditional
|
|
136
|
+
sonarjs/no-nested-functions
|
|
137
|
+
sonarjs/no-nested-template-literals
|
|
138
|
+
sonarjs/no-os-command-from-path
|
|
139
|
+
sonarjs/no-parameter-reassignment
|
|
140
|
+
sonarjs/no-primitive-wrappers
|
|
141
|
+
sonarjs/no-redundant-assignments
|
|
142
|
+
sonarjs/no-redundant-boolean
|
|
143
|
+
sonarjs/no-redundant-jump
|
|
144
|
+
sonarjs/no-referrer-policy
|
|
145
|
+
sonarjs/no-same-argument-assert
|
|
146
|
+
sonarjs/no-same-line-conditional
|
|
147
|
+
sonarjs/no-session-cookies-on-static-assets
|
|
148
|
+
sonarjs/no-skipped-tests
|
|
149
|
+
sonarjs/no-table-as-layout
|
|
150
|
+
sonarjs/no-trivial-assertions
|
|
151
|
+
sonarjs/no-unenclosed-multiline-block
|
|
152
|
+
sonarjs/no-uniq-key
|
|
153
|
+
sonarjs/no-unthrown-error
|
|
154
|
+
sonarjs/no-unused-collection
|
|
155
|
+
sonarjs/no-use-of-empty-return-value
|
|
156
|
+
sonarjs/no-useless-increment
|
|
157
|
+
sonarjs/no-useless-react-setstate
|
|
158
|
+
sonarjs/no-weak-cipher
|
|
159
|
+
sonarjs/no-weak-keys
|
|
160
|
+
sonarjs/non-existent-operator
|
|
161
|
+
sonarjs/object-alt-content
|
|
162
|
+
sonarjs/parameterized-tests
|
|
163
|
+
sonarjs/prefer-default-last
|
|
164
|
+
sonarjs/prefer-native-lodash-alternative
|
|
165
|
+
sonarjs/prefer-promise-shorthand
|
|
166
|
+
sonarjs/prefer-single-boolean-return
|
|
167
|
+
sonarjs/prefer-specific-assertions
|
|
168
|
+
sonarjs/prefer-type-guard
|
|
169
|
+
sonarjs/prefer-while
|
|
170
|
+
sonarjs/production-debug
|
|
171
|
+
sonarjs/pseudo-random
|
|
172
|
+
sonarjs/public-static-readonly
|
|
173
|
+
sonarjs/publicly-writable-directories
|
|
174
|
+
sonarjs/redundant-type-aliases
|
|
175
|
+
sonarjs/review-blockchain-mnemonic
|
|
176
|
+
sonarjs/session-regeneration
|
|
177
|
+
sonarjs/stable-tests
|
|
178
|
+
sonarjs/stateful-regex
|
|
179
|
+
sonarjs/strict-transport-security
|
|
180
|
+
sonarjs/super-linear-regex
|
|
181
|
+
sonarjs/synchronous-suite-callback
|
|
182
|
+
sonarjs/table-header
|
|
183
|
+
sonarjs/table-header-reference
|
|
184
|
+
sonarjs/test-check-exception
|
|
185
|
+
sonarjs/todo-tag
|
|
186
|
+
sonarjs/unverified-certificate
|
|
187
|
+
sonarjs/unverified-hostname
|
|
188
|
+
sonarjs/updated-const-var
|
|
189
|
+
sonarjs/updated-loop-counter
|
|
190
|
+
sonarjs/use-type-alias
|
|
191
|
+
sonarjs/weak-ssl
|
|
192
|
+
sonarjs/x-powered-by
|
|
193
|
+
sonarjs/xml-parser-xxe
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## Removing The Adapter
|
|
197
|
+
|
|
198
|
+
Replace the compatibility projection when the shared preset offers a TS7-only
|
|
199
|
+
stack with equivalent native rules or compatible public plugin APIs. Keep the
|
|
200
|
+
coverage inventory explicit when upgrading that preset; do not label a removed
|
|
201
|
+
check as preserved merely because a similarly named rule exists.
|
package/PROVIDERS.md
CHANGED
|
@@ -19,7 +19,7 @@ network failure does not switch to a credential-based or external reader.
|
|
|
19
19
|
|
|
20
20
|
| Provider | Native source | Scope and prerequisites | Reference |
|
|
21
21
|
| --- | --- | --- | --- |
|
|
22
|
-
| OpenCode Console / Go | Public OpenCode 2.2 `usage.limits` client API | Workspace identity, applicable USD budgets and percent-based Go windows; no Navigator server required | [Published client](https://cdn.jsdelivr.net/npm/@opencode/client@2.2.
|
|
22
|
+
| OpenCode Console / Go | Public OpenCode 2.2 `usage.limits` client API | Workspace identity, applicable USD budgets and percent-based Go windows; no Navigator server required | [Published client](https://cdn.jsdelivr.net/npm/@opencode/client@2.2.5/dist/promise/generated/client.d.ts), [Usage schema](https://github.com/anomalyco/opencode/blob/v2.2.5/packages/schema/src/usage-limits.ts) |
|
|
23
23
|
| OpenAI / Codex ChatGPT | Codex app-server account/rate-limit RPC and manual reset credits | Verified account identity; ordinary `codex` quota is account-scoped even with null model metadata; separate model buckets need explicit association; native durations describe quota windows, not time until reset | [Codex protocol](https://github.com/openai/codex/tree/main/codex-rs/app-server-protocol) |
|
|
24
24
|
| OpenAI API | HTTP request/token/project-token rate-limit headers | Actual response for the selected model/account; HTTP transport | [Rate limits](https://developers.openai.com/api/docs/guides/rate-limits) |
|
|
25
25
|
| Anthropic API | Native response headers and organization rate-limits API | Per-model headers; configured limits need an eligible org/admin credential and explicit model association | [Rate limits API](https://platform.claude.com/docs/en/manage-claude/rate-limits-api) |
|
|
@@ -57,7 +57,7 @@ network failure does not switch to a credential-based or external reader.
|
|
|
57
57
|
| Qwen / Alibaba Cloud / DashScope | Model/project/cloud quota and billing permissions; browser OAuth state is not a portable quota source | [Model Studio docs](https://www.alibabacloud.com/help/en/model-studio/) |
|
|
58
58
|
| Hugging Face Inference Providers | Hub request quotas are not automatically inference-model quotas or inference credits | [Hub limits](https://huggingface.co/docs/hub/rate-limits), [Inference pricing](https://huggingface.co/docs/inference-providers/pricing) |
|
|
59
59
|
| Cloudflare Workers AI | Account billing/analytics and model/resource limits; do not derive remaining free allowance from static daily examples | [Workers AI limits](https://developers.cloudflare.com/workers-ai/platform/limits/) |
|
|
60
|
-
| OpenCode Console / Go boundaries | Native workspace budgets and Go allowance are supported, not an inferred wallet balance; other providers need their own documented source | [Host usage source](https://github.com/anomalyco/opencode/blob/v2.2.
|
|
60
|
+
| OpenCode Console / Go boundaries | Native workspace budgets and Go allowance are supported, not an inferred wallet balance; other providers need their own documented source | [Host usage source](https://github.com/anomalyco/opencode/blob/v2.2.5/packages/core/src/usage-limits.ts) |
|
|
61
61
|
| Cursor | Consumer account usage requires a supported external API; no browser cookies or local credential extraction | [Cursor docs](https://docs.cursor.com/) |
|
|
62
62
|
| Windsurf / Codeium | Consumer plan usage is separate from API response rate limits; no private account endpoints | [Windsurf docs](https://docs.windsurf.com/) |
|
|
63
63
|
| Amp | Product credits require a supported external account API; no credential-file or cookie integrations | [Amp manual](https://ampcode.com/manual) |
|
package/README.md
CHANGED
|
@@ -29,6 +29,7 @@ See the [changelog](CHANGELOG.md) for release-by-release changes.
|
|
|
29
29
|
- Show or hide each sidebar section independently
|
|
30
30
|
- Hide the session title or its creation date independently in OpenCode 1.x without losing the settings control
|
|
31
31
|
- Configure section visibility and order from the sidebar settings button
|
|
32
|
+
- Open Settings → About for the running version, update checks, versioned release history, and editable GitHub Bug reports
|
|
32
33
|
- Separate adjacent sections with quiet theme-aware dividers instead of background cards
|
|
33
34
|
- Save visibility, expansion, and order globally or for the current worktree
|
|
34
35
|
- Copy the selected scope's layout and MCP states as versioned JSON, then validate and preview imports
|
|
@@ -43,8 +44,8 @@ collapsed. Use `Save current layout as default` in sidebar settings to reuse the
|
|
|
43
44
|
current visible/hidden, expanded/collapsed, and ordering states in new sessions.
|
|
44
45
|
|
|
45
46
|
**Only the latest stable release in each major line is supported: OpenCode
|
|
46
|
-
1.19.5 and 2.2.
|
|
47
|
-
part of the supported compatibility matrix. The 2.2 integration uses OpenTUI 0.
|
|
47
|
+
1.19.5 and 2.2.5.** Both have separate real-host checks. Older releases are not
|
|
48
|
+
part of the supported compatibility matrix. The 2.2 integration uses OpenTUI 0.8
|
|
48
49
|
and public host caches, events, keymap layers, and client APIs while retaining
|
|
49
50
|
the separate 1.x adapter. See [Host API boundaries](HOST_API.md) for remaining
|
|
50
51
|
capability gaps and removal conditions. On OpenCode 2, Navigator reads the same native Todo history as
|
|
@@ -196,8 +197,22 @@ OpenCode 2.x CLI plugins are global terminal settings; there is no project-local
|
|
|
196
197
|
plugin overrides are required. OpenCode validates `cli.json` strictly, so keep it
|
|
197
198
|
within the linked schema and restart OpenCode after changing it.
|
|
198
199
|
|
|
199
|
-
OpenCode 2
|
|
200
|
-
|
|
200
|
+
OpenCode 2's built-in Todo tool is opt-in. When its effective configuration
|
|
201
|
+
disables the tool, Navigator offers **Enable Todo…** in the section and
|
|
202
|
+
**Enable native Todo** in the command palette. Choose an existing discovered
|
|
203
|
+
server configuration file, review `experimental.todo → true`, then confirm
|
|
204
|
+
**Enable Todo**. Cancel and Escape preserve the file. Navigator retains JSONC
|
|
205
|
+
comments, formatting and unrelated settings, and checks for changed files,
|
|
206
|
+
configuration sources, sessions and workspaces before writing.
|
|
207
|
+
|
|
208
|
+
The check uses the host configuration, not the presence or absence of tasks.
|
|
209
|
+
An enabled empty list therefore says **No tasks yet** without another enable
|
|
210
|
+
offer. Configuration read failures have their own Retry action. Remote file
|
|
211
|
+
operations stay on the connected server; no model or Todo mutation is used for
|
|
212
|
+
setup. Refresh or restart OpenCode if a saved flag has not yet been applied.
|
|
213
|
+
See [Host API boundaries](HOST_API.md) for precedence and conditional-write limits.
|
|
214
|
+
|
|
215
|
+
Alternatively, enable the tool manually in the server configuration used by that host:
|
|
201
216
|
|
|
202
217
|
```json
|
|
203
218
|
{
|
|
@@ -215,6 +230,10 @@ completed list visible; a completed write with an empty array clears it.
|
|
|
215
230
|
Native tasks have `content` and one of `pending`, `in_progress`, `completed`, or
|
|
216
231
|
`cancelled`; priorities remain unavailable in OpenCode 2's native schema.
|
|
217
232
|
|
|
233
|
+

|
|
234
|
+
|
|
235
|
+

|
|
236
|
+
|
|
218
237
|
The optional **server** half of Navigator is used for provider-native quotas and
|
|
219
238
|
read-only access to the previous Navigator Todo archive. Add it to the server
|
|
220
239
|
configuration only when those integrations are needed:
|
|
@@ -348,9 +367,13 @@ opencode
|
|
|
348
367
|
OpenCode reads TUI configuration at startup. Restart it after changing the
|
|
349
368
|
plugin or `tui.json`.
|
|
350
369
|
|
|
351
|
-
On first launch, a seven-step setup wizard introduces monitoring
|
|
352
|
-
|
|
353
|
-
|
|
370
|
+
On first launch, a seven-step setup wizard introduces monitoring and native Todo
|
|
371
|
+
enablement, provider/account limits, Search Everything and Skills, Actions and
|
|
372
|
+
private toolbar pins, host-supported language tools, MCP, and customization.
|
|
373
|
+
It includes About, release history and Bug reports before the final section picker.
|
|
374
|
+
Descriptions match each host's permissions/LSP capabilities. Long content and
|
|
375
|
+
section choices scroll with the mouse or PageUp/PageDown while headings and
|
|
376
|
+
Back/Next/Finish stay visible. The guide is shown once and can be opened again
|
|
354
377
|
later from the sidebar settings button. The settings dialog also selects global
|
|
355
378
|
or current-worktree scope, manages named layout presets, and controls section
|
|
356
379
|
order, MCP state persistence, icon style, and the sidebar shortcuts without
|
|
@@ -358,6 +381,8 @@ a restart. Settings are grouped into tabs; use `Tab` and `Shift+Tab` to switch
|
|
|
358
381
|
tabs. In the Sections tab, use `Left`/`Right` or `Shift+Up`/`Shift+Down` to
|
|
359
382
|
reorder the selected section.
|
|
360
383
|
|
|
384
|
+

|
|
385
|
+
|
|
361
386
|
The Sections tab combines visibility, ordering, and the number of visible items
|
|
362
387
|
for each section. Click `Items: All` / `Items: N`, or press `L` on the selected
|
|
363
388
|
section, to edit its item limit. Enter toggles visibility; the arrow controls
|
|
@@ -394,16 +419,30 @@ Choose a base icon in the searchable picker, then select **Pin to toolbar**.
|
|
|
394
419
|
The manager lets you change icons, move buttons, or unpin them. Cancelling the
|
|
395
420
|
picker returns to the draft; cancelling the draft discards its changes.
|
|
396
421
|
|
|
422
|
+
For each button, **Icons and text…** lets you choose **zero to three ordered icons**
|
|
423
|
+
and an optional custom single-line label. Use **Base icons…** to add, replace or
|
|
424
|
+
remove icons, and **Text…** for the label. Zero icons produces a text-only button;
|
|
425
|
+
an entirely empty appearance cannot be saved. Labels accept up to 128 characters
|
|
426
|
+
and are clipped to the available cells without overwriting the rounded ends.
|
|
427
|
+
State-specific icon groups retain the existing per-state choices. Nested edits
|
|
428
|
+
remain drafts until the final **Pin to toolbar** or **Save** action.
|
|
429
|
+
|
|
397
430
|
Where the host exposes a state, the same button can use a different icon for each
|
|
398
431
|
state: auto-approve On/Off on OpenCode 1.x, and Idle/Compacting on OpenCode 2.x.
|
|
399
432
|
The 2.x permissions button opens host Settings and uses its base icon. Hover or
|
|
400
433
|
keyboard focus shows the button's name, observed state, or unavailable reason.
|
|
434
|
+
The hint uses the existing gap beneath the toolbar, so appearing or disappearing
|
|
435
|
+
does not move Limits or any other section. Default single-icon buttons stay
|
|
436
|
+
centered in uniform three-cell controls in both Nerd Font and Text modes.
|
|
401
437
|
Skill buttons retain confirmation and trust settings; a missing or ambiguous
|
|
402
438
|
source stays pinned but cannot run.
|
|
403
439
|
|
|
404
440
|
**Behavior → Toolbar overflow** switches between one row with a **More** menu
|
|
405
441
|
(the default) and wrapping rows. Left/Right moves along a row; Up/Down moves
|
|
406
442
|
between rows. The setting follows Global/Worktree scope and portable defaults.
|
|
443
|
+
Overflow uses actual bounded button widths. The largest configured state appearance
|
|
444
|
+
reserves the button's width so changing state does not reshuffle the toolbar.
|
|
445
|
+
Default single-icon buttons remain three cells wide.
|
|
407
446
|
Pins, their order, icons, and exact Skill sources are private user-wide preferences
|
|
408
447
|
and are excluded from portable exports. Use **Reload settings from file** in other
|
|
409
448
|
running sessions after saving changes in another instance.
|
|
@@ -412,6 +451,10 @@ running sessions after saving changes in another instance.
|
|
|
412
451
|
|
|
413
452
|

|
|
414
453
|
|
|
454
|
+

|
|
455
|
+
|
|
456
|
+

|
|
457
|
+
|
|
415
458
|
In OpenCode 1.x, Navigator saves changes to the auto-approve mode as a user-wide
|
|
416
459
|
default, including changes made through OpenCode's own command palette. Set the
|
|
417
460
|
default under **Navigator Settings → Behavior → Default auto-approve permissions**;
|
|
@@ -421,6 +464,50 @@ dialog for the current session and `session.permissions` in the user-wide
|
|
|
421
464
|
`cli.json` (`"prompt"` or `"autoaccept"`) for its startup default. Restart
|
|
422
465
|
OpenCode after changing `cli.json`.
|
|
423
466
|
|
|
467
|
+
### About, release history, and support
|
|
468
|
+
|
|
469
|
+
Open **Navigator Settings → About** with the settings control or `Ctrl+,`.
|
|
470
|
+
The tab shows the running Navigator and OpenCode versions, the last update-check
|
|
471
|
+
result, and **Check for updates**. A failed check is reported as a failure rather
|
|
472
|
+
than an up-to-date result. **Update Navigator…** uses the same confirmation,
|
|
473
|
+
installation method/scope, stale-target guards and restart guidance as the footer
|
|
474
|
+
and Navigator shortcuts.
|
|
475
|
+
|
|
476
|
+
**Changelog by version…** browses the `CHANGELOG.md` shipped with the plugin.
|
|
477
|
+
Choose a version to read its scrollable notes; Escape returns to the selected
|
|
478
|
+
version and then to About. Technical-only versions have an explicit empty state.
|
|
479
|
+
Manual browsing does not consume or reset the one-time upgrade notes shown after
|
|
480
|
+
an update.
|
|
481
|
+
|
|
482
|
+
**Report a bug…** opens an editable title and Markdown body. The visible default
|
|
483
|
+
context contains software versions, platform and runtime only. Navigator does
|
|
484
|
+
not collect chat, source, workspace paths, logs or credentials for the report.
|
|
485
|
+
|
|
486
|
+
- **Send to GitHub…** uses an installed, already authenticated [GitHub CLI](https://cli.github.com/)
|
|
487
|
+
with support for `gh issue create --type`. A separate preview confirms the
|
|
488
|
+
repository, the real **Bug** issue type, title and body before sending. GitHub
|
|
489
|
+
credentials stay with `gh`, never in Navigator preferences.
|
|
490
|
+
- **Open in browser** opens the same draft in the repository's Bug issue form,
|
|
491
|
+
independently of CLI installation or authentication. Large reports use an
|
|
492
|
+
explicit **Copy report & open browser** action; browser-launch failures offer
|
|
493
|
+
a copyable link without discarding the draft.
|
|
494
|
+
- A partial result retains its issue URL. An uncertain outcome opens the issues
|
|
495
|
+
list for review and requires an explicit **Retry after checking GitHub** before
|
|
496
|
+
another confirmed send. Navigator never automatically retries issue creation.
|
|
497
|
+
|
|
498
|
+
Enter inserts a newline in the body; Tab moves between fields and actions, and
|
|
499
|
+
`Ctrl+Enter` opens the send preview. Escape/Cancel returns to the previous screen
|
|
500
|
+
with the draft retained for the current Settings flow. Reports are not saved in
|
|
501
|
+
private preferences.
|
|
502
|
+
|
|
503
|
+
Quick Actions also keep their mounted rows while ordinary prompt typing updates
|
|
504
|
+
the host's command state. Live labels, availability and real source updates still
|
|
505
|
+
refresh immediately.
|
|
506
|
+
|
|
507
|
+

|
|
508
|
+
|
|
509
|
+

|
|
510
|
+
|
|
424
511
|
## Limits: provider quotas and banked resets
|
|
425
512
|
|
|
426
513
|
Navigator keeps subscription limits separate from OpenCode's session token and
|
|
@@ -478,7 +565,7 @@ REST reads use a short in-memory cache; Refresh bypasses it. Observed headers ol
|
|
|
478
565
|
than two minutes are marked stale instead of presented as current remaining quota.
|
|
479
566
|
|
|
480
567
|
Navigator shares the host's Solid/OpenTUI runtime. Development and CI use Bun 1.4.4
|
|
481
|
-
and Node 26.12.1; OpenTUI 0.
|
|
568
|
+
and Node 26.12.1; OpenTUI 0.8's supported Node path starts at 26.4.0. A confirmed
|
|
482
569
|
pinned-snapshot update verifies its target with supported Bun (at least 1.3.14)
|
|
483
570
|
or Node before switching the wrapper. If neither is available, the running snapshot
|
|
484
571
|
is preserved with guidance; the updater does not install a runtime globally.
|
|
@@ -887,7 +974,8 @@ session or workspace dismisses the entire search dialog chain.
|
|
|
887
974
|
|
|
888
975
|
## Scripts
|
|
889
976
|
|
|
890
|
-
Development
|
|
977
|
+
Development uses Bun 1.4.4 and stable TypeScript 7. Standalone Node/OpenTUI paths
|
|
978
|
+
require Node.js 26.4 or newer; CI pins Node 26.12.1. Install dependencies with
|
|
891
979
|
`bun install --frozen-lockfile`.
|
|
892
980
|
|
|
893
981
|
Oxlint uses the `solid-ox` preset from
|
|
@@ -896,6 +984,9 @@ Oxlint uses the `solid-ox` preset from
|
|
|
896
984
|
OpenTUI callbacks, SDK compatibility, and test fixtures. Type-aware analysis uses
|
|
897
985
|
`oxlint-tsgolint`; `tsconfig.lint.json` covers application code, tests, build scripts,
|
|
898
986
|
and configuration files. Formatter exclusions are maintained in `oxfmt.config.ts`.
|
|
987
|
+
The resolved dependency tree contains TS7 only. The approved removal of
|
|
988
|
+
incompatible SonarJS checks and native replacements is documented in
|
|
989
|
+
[Lint coverage](LINT_COVERAGE.md); compatible Solid and other JS checks remain.
|
|
899
990
|
|
|
900
991
|
```sh
|
|
901
992
|
bun run test
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
function versionParts(value){const match=/^v?(\d+)\.(\d+)\.(\d+)(?:-([^+]+))?/.exec(value)
|
|
2
|
+
return match?{numbers:match.slice(1,4).map(Number),prerelease:match[4]||undefined}:undefined
|
|
3
|
+
}
|
|
4
|
+
function isNewerVersion(latest,current){const next=versionParts(latest)
|
|
5
|
+
const installed=versionParts(current)
|
|
6
|
+
if(!next||!installed)
|
|
7
|
+
return false
|
|
8
|
+
for(let index=0;index<3; index++){if(next.numbers[index]!==installed.numbers[index])
|
|
9
|
+
return next.numbers[index]>installed.numbers[index]
|
|
10
|
+
}
|
|
11
|
+
return installed.prerelease!==undefined&&next.prerelease===undefined
|
|
12
|
+
}
|
|
13
|
+
function isSameMajorVersion(left,right){const first=versionParts(left)
|
|
14
|
+
const second=versionParts(right)
|
|
15
|
+
return Boolean(first&&second&&first.numbers[0]===second.numbers[0])
|
|
16
|
+
}
|
|
17
|
+
export{isNewerVersion,isSameMajorVersion}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import {isNewerVersion
|
|
2
|
+
} from "./chunk-fd7394y1.js";
|
|
3
|
+
function parseChangelog2(source){const entries=[]
|
|
4
|
+
let entry
|
|
5
|
+
for(const line of source.split(/\r?\n/)){const heading=/^## \[(\d+\.\d+\.\d+(?:-[\w.-]+)?)\]/.exec(line)
|
|
6
|
+
if(heading){entry={version:heading[1],changes:[]}
|
|
7
|
+
entries.push(entry)
|
|
8
|
+
} else if(line.startsWith("## "))
|
|
9
|
+
entry=undefined
|
|
10
|
+
else if(entry&&line.startsWith("- "))
|
|
11
|
+
entry.changes.push(line.slice(2))
|
|
12
|
+
}
|
|
13
|
+
return entries
|
|
14
|
+
}
|
|
15
|
+
function changesSince2(source,previous,current){return parseChangelog2(source).filter((entry)=>entry.changes.length>0&&isNewerVersion(entry.version,previous)&&!isNewerVersion(entry.version,current))
|
|
16
|
+
}
|
|
17
|
+
async function readBundledChangelog2(){const packaged=Bun.file(new URL("../CHANGELOG.md",import.meta.url))
|
|
18
|
+
if(await packaged.exists())
|
|
19
|
+
return packaged.text()
|
|
20
|
+
return Bun.file(new URL("../../../../CHANGELOG.md",import.meta.url)).text()
|
|
21
|
+
}
|
|
22
|
+
export{parseChangelog2,changesSince2,readBundledChangelog2}
|