opencode-navigator 0.19.3 → 0.21.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/PROVIDERS.md +92 -0
- package/README.md +136 -10
- package/dist/{chunk-r37n7w97.js → chunk-c1kw6ktv.js} +3 -4
- package/dist/chunk-cmmnfes2.js +7 -0
- package/dist/layout-preset-actions.js +438 -0
- package/dist/mcp-groups.js +4 -4
- package/dist/project-profile.js +280 -0
- package/dist/provider-limits.js +1027 -0
- package/dist/quick-actions-settings.js +2 -5
- package/dist/rpc.js +6 -1
- package/dist/server.js +589 -1
- package/dist/settings-import.js +40 -0
- package/dist/skill-groups.js +4 -4
- package/dist/trusted-skills.js +22 -0
- package/dist/tui.js +299 -273
- package/package.json +16 -11
- package/scripts/save-project-profile.mjs +41 -0
- package/scripts/update-local-snapshot.mjs +14 -12
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## [0.21.0] - 2026-10-06
|
|
6
|
+
|
|
7
|
+
- Automatically verify Codex account identity from OpenCode 2's ChatGPT connection. When host identity is unavailable, confirm a private binding once per connection or provider and reuse it across models, projects, and sessions; preserve compatible older confirmations and isolate conflicting ones until relinked.
|
|
8
|
+
- Expand OpenCode 2 Limits with documented native subscription allowances, API rate-limit observations, configured capacities, account balances, and key budgets. Keep provider-native units, currencies, model associations, and active-account boundaries explicit.
|
|
9
|
+
- Add Provider sources to explain each provider's supported measurements, required permissions, and unavailable APIs without guessing remaining quota.
|
|
10
|
+
- Keep available account balances visible when a separate subscription read fails, and show exhausted NanoGPT subscription windows instead of hiding them.
|
|
11
|
+
- Keep stale quota guidance visible after failed refreshes, reject late results after credential changes, and recover from stalled provider reads without blocking model response streams.
|
|
12
|
+
|
|
13
|
+
## [0.20.0] - 2026-10-05
|
|
14
|
+
|
|
15
|
+
- Add a default-visible Limits section for the selected model's provider-native quota windows, reset times, account identity, and freshness. Codex CLI support requires an explicit private account binding; unsupported providers show calm guidance.
|
|
16
|
+
- Review Codex banked reset credits and use them only after a separate confirmation and fresh eligibility checks. Preserve the same attempt key when reconciling an uncertain result, including after a restart.
|
|
17
|
+
- Save named, commit-safe project layout and MCP profiles to `.opencode/navigator.json` with the `opencode-navigator-profile` command, an explicit preview, and `--apply`; profile application remains manual.
|
|
18
|
+
|
|
5
19
|
## [0.19.3] - 2026-10-03
|
|
6
20
|
|
|
7
21
|
- Indent grouped Todo, Subagent, Skill, and MCP rows and align MCP server status indicators with their group headings.
|
|
@@ -64,6 +78,8 @@
|
|
|
64
78
|
|
|
65
79
|
Earlier release notes are available on [GitHub Releases](https://github.com/St1ggy/opencode-navigator/releases).
|
|
66
80
|
|
|
81
|
+
[0.21.0]: https://github.com/St1ggy/opencode-navigator/compare/v0.20.0...v0.21.0
|
|
82
|
+
[0.20.0]: https://github.com/St1ggy/opencode-navigator/compare/v0.19.3...v0.20.0
|
|
67
83
|
[0.19.3]: https://github.com/St1ggy/opencode-navigator/compare/v0.19.2...v0.19.3
|
|
68
84
|
[0.19.2]: https://github.com/St1ggy/opencode-navigator/compare/v0.19.1...v0.19.2
|
|
69
85
|
[0.19.1]: https://github.com/St1ggy/opencode-navigator/compare/v0.19.0...v0.19.1
|
package/PROVIDERS.md
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Provider Quota Sources
|
|
2
|
+
|
|
3
|
+
Navigator follows the currently selected host model and active provider connection.
|
|
4
|
+
It never treats session token/cost totals as remaining provider quota. Subscription
|
|
5
|
+
windows, API rate limits, configured capacities, and monetary balances are different
|
|
6
|
+
measurements and are labelled separately.
|
|
7
|
+
|
|
8
|
+
The implemented contracts were rechecked on 2026-10-06. The runtime also includes providers from
|
|
9
|
+
the host catalog; an unrecognized provider gets an explicit unverified-source state
|
|
10
|
+
rather than fabricated quota values. Availability depends on the selected account,
|
|
11
|
+
permissions, region, transport, and supported host APIs.
|
|
12
|
+
|
|
13
|
+
## Audited Read Sources
|
|
14
|
+
|
|
15
|
+
| Provider | Native source | Scope and prerequisites | Reference |
|
|
16
|
+
| --- | --- | --- | --- |
|
|
17
|
+
| OpenAI / Codex ChatGPT | Codex app-server account/rate-limit RPC and manual reset credits | Verified account identity; exact provider-reported model bucket | [Codex protocol](https://github.com/openai/codex/tree/main/codex-rs/app-server-protocol) |
|
|
18
|
+
| 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) |
|
|
19
|
+
| 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) |
|
|
20
|
+
| Azure OpenAI | Native remaining request/token headers | Actual deployment response; does not expose a ChatGPT subscription | [Quotas and limits](https://learn.microsoft.com/en-us/azure/ai-foundry/openai/quotas-limits) |
|
|
21
|
+
| Groq | Native request/day and token/minute response headers | Actual response for the selected model/account | [Rate limits](https://console.groq.com/docs/rate-limits) |
|
|
22
|
+
| Fireworks | Model response throughput headers; account quotas API | Native token/second capacities; account lookup must be unambiguous, and GPU quotas are excluded from chat-model views | [Serverless limits](https://docs.fireworks.ai/serverless/rate-limits), [Quotas API](https://docs.fireworks.ai/api-reference/list-quotas) |
|
|
23
|
+
| OpenRouter | Current-key USD spending budget and free-model daily requests | Normal inference key; free-model counters apply only to documented free variants | [Key API](https://openrouter.ai/docs/api/api-reference/api-keys/get-current-api-key) |
|
|
24
|
+
| OpenRouter management | Account purchased/used credits in USD | Management key required; never substitute key budget for account balance | [Credits API](https://openrouter.ai/docs/api/api-reference/credits/get-remaining-credits) |
|
|
25
|
+
| DeepSeek | Current-user currency balances | Existing inference API key; API supplies USD/CNY and separates granted/top-up balances | [Balance API](https://api-docs.deepseek.com/api/get-user-balance) |
|
|
26
|
+
| Moonshot / Kimi API | Available, voucher, and cash balance | Region-specific API key; international USD and China CNY are not interchangeable | [International balance](https://platform.moonshot.ai/docs/api/balance), [China balance](https://platform.moonshot.cn/docs/api/balance) |
|
|
27
|
+
| MiniMax Token Plan | Documented token-plan remains endpoint and provider-owned response types | Subscription key; explicit model rows/percentages only, without guessing ambiguous legacy count direction | [Token Plan FAQ](https://platform.minimax.io/docs/token-plan/faq), [Official quota SDK](https://github.com/MiniMax-AI/cli/tree/main/src/sdk/quota) |
|
|
28
|
+
| GitHub Copilot | Official SDK account quota RPC with explicit host token | SDK runtime; token-scoped model lookup and quota read; no private REST endpoint calls | [Official SDK](https://github.com/github/copilot-sdk), [Authentication](https://github.com/github/copilot-sdk/blob/main/docs/auth/authenticate.md) |
|
|
29
|
+
| NanoGPT | USD/Nano balances and daily/weekly subscription input-token quotas | Existing inference key; only models in the same API host's subscription-only catalog; null/degraded counters remain unknown | [Balance](https://docs.nano-gpt.com/api-reference/endpoint/check-balance), [Usage](https://docs.nano-gpt.com/api-reference/endpoint/subscription-usage), [Models](https://docs.nano-gpt.com/api-reference/endpoint/models) |
|
|
30
|
+
| SiliconFlow / China | Current-user available, charged, and granted balances | Region-specific inference key; retain unknown currency when the response omits it | [User info](https://docs.siliconflow.com/en/api-reference/userinfo/get-user-info) |
|
|
31
|
+
| Novita | Available balance, cash balance, credit limit, pending charges, and outstanding invoices | Existing inference key; exact 1/10000 USD scaling | [Balance](https://novita.ai/docs/api-reference/basic-get-user-balance) |
|
|
32
|
+
| Poe | Current combined plan/add-on point balance | Existing API credential; points are not dollars or tokens | [Usage API](https://creator.poe.com/docs/resources/usage-api) |
|
|
33
|
+
| AIHubMix | Current-user USD balance | Manage Key required; quota units scale by 500000 per USD | [Current user](https://docs.aihubmix.com/en/api/CliEndpoints/get-self) |
|
|
34
|
+
|
|
35
|
+
## Capability Constraints And Other Providers
|
|
36
|
+
|
|
37
|
+
| Provider / product | Constraint or additional capability required | Public reference |
|
|
38
|
+
| --- | --- | --- |
|
|
39
|
+
| Claude Pro/Max / Claude Code | Session-local `rate_limits` statusline exists; it does not provide a portable OpenCode cross-process subscription read API | [Statusline](https://code.claude.com/docs/en/statusline) |
|
|
40
|
+
| Google Gemini API | Project/model rate limits; AI Studio and cloud quota permissions are separate from a plain inference key | [Gemini limits](https://ai.google.dev/gemini-api/docs/rate-limits) |
|
|
41
|
+
| Google Vertex AI | Project/region quota and cloud authentication; shared/dynamic quotas are not a personal subscription balance | [Vertex quotas](https://cloud.google.com/vertex-ai/generative-ai/docs/quotas) |
|
|
42
|
+
| Amazon Bedrock | IAM/region Service Quotas and CloudWatch require additional cloud capabilities and exact model/quota mapping | [Bedrock quotas](https://docs.aws.amazon.com/bedrock/latest/userguide/quotas.html) |
|
|
43
|
+
| Azure AI / Microsoft Foundry | Resource/deployment quotas and cloud management permissions; no portable credit balance from an inference key alone | [Foundry quotas](https://learn.microsoft.com/en-us/azure/ai-foundry/openai/quotas-limits) |
|
|
44
|
+
| Cerebras | Organization/project/model rate limits; parse only self-describing native counters actually present in the model response, never copy console tier examples | [Cerebras limits](https://inference-docs.cerebras.ai/support/rate-limits) |
|
|
45
|
+
| Mistral | Organization request/token limits and remaining headers; do not infer missing counter units or a subscription balance | [Known limitations](https://docs.mistral.ai/resources/known-limitations) |
|
|
46
|
+
| Together AI | Current serverless API exposes a retry interval on 429, not remaining counters; a portable remaining-credit API is not established by billing UI documentation | [Credits](https://docs.together.ai/docs/billing-credits), [Rate limits](https://docs.together.ai/docs/rate-limits) |
|
|
47
|
+
| xAI / Grok | API usage differs from consumer subscriptions; management billing needs separate team credentials | [Developer docs](https://docs.x.ai/) |
|
|
48
|
+
| Perplexity | API credits are separate from the consumer subscription and Computer credits; billing UI does not establish a remaining-credit read endpoint | [API billing](https://www.perplexity.ai/help-center/en/articles/10354847-api-payment-and-billing) |
|
|
49
|
+
| Kimi Code subscription | Keep separate from Moonshot pay-as-you-go balance; undocumented usage/browser endpoints are not adopted | [Kimi Code](https://www.kimi.com/code/docs/en/) |
|
|
50
|
+
| Z.ai / Zhipu GLM Coding Plan | Usage windows exist; monitor/dashboard endpoints require a documented external API contract before integration | [Coding Plan](https://docs.z.ai/devpack/overview) |
|
|
51
|
+
| 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/) |
|
|
52
|
+
| 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) |
|
|
53
|
+
| 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/) |
|
|
54
|
+
| OpenCode Zen / Go | Host session statistics are not the provider's account balance; no undocumented billing endpoints are queried | [OpenCode Zen](https://opencode.ai/docs/zen/) |
|
|
55
|
+
| Cursor | Consumer account usage requires a supported external API; no browser cookies or local credential extraction | [Cursor docs](https://docs.cursor.com/) |
|
|
56
|
+
| Windsurf / Codeium | Consumer plan usage is separate from API response rate limits; no private account endpoints | [Windsurf docs](https://docs.windsurf.com/) |
|
|
57
|
+
| Amp | Product credits require a supported external account API; no credential-file or cookie integrations | [Amp manual](https://ampcode.com/manual) |
|
|
58
|
+
| OpenAI-compatible gateways | Protocol compatibility does not prove account identity, native quota units, or backend bucket/model mapping | [OpenCode providers](https://opencode.ai/docs/providers/) |
|
|
59
|
+
| Ollama / LM Studio / local models | Local inference generally has no provider subscription quota to read; cloud offerings are separate products | [Ollama API](https://docs.ollama.com/api), [LM Studio API](https://lmstudio.ai/docs/developer) |
|
|
60
|
+
| NVIDIA NIM / NGC | Cloud/trial and self-hosted limits differ; an inference endpoint does not identify an NGC credit balance | [NIM docs](https://docs.nvidia.com/nim/) |
|
|
61
|
+
| Cohere | Organization/API rate limits are distinct from subscription windows and account credit balances | [Cohere rate limits](https://docs.cohere.com/docs/rate-limits) |
|
|
62
|
+
| AI21 | Project/model rate limits; no independently verified subscription remaining-window API | [AI21 docs](https://docs.ai21.com/) |
|
|
63
|
+
| Replicate | Model execution billing is distinct from subscription quota; no inferred remaining credits from prediction cost | [Billing](https://replicate.com/docs/topics/billing) |
|
|
64
|
+
| Baseten / ModelScope / Nebius / Vultr / v0 | Additional billing permissions or an independently verified model/quota contract are required; protocol compatibility alone is insufficient | [OpenCode providers](https://opencode.ai/docs/providers/) |
|
|
65
|
+
| Chutes | Public current-user quota routes exist, but native units and model/allowance semantics have not been independently established | [Users API](https://chutes.ai/docs/api-reference/users) |
|
|
66
|
+
| Requesty | Management key/key ID and budget semantics are required; dated usage reports are not remaining quota | [Key management API](https://docs.requesty.ai/features/key-management-api) |
|
|
67
|
+
|
|
68
|
+
## Authentication And Host Boundaries
|
|
69
|
+
|
|
70
|
+
- OpenCode 2 metadata matching uses public provider/credential APIs and the built-in
|
|
71
|
+
ChatGPT OAuth `metadata.accountID`. Account IDs are compared with Codex's own
|
|
72
|
+
reported identity; a provider name or model-name similarity is not proof.
|
|
73
|
+
- A confirmation is saved once per connection, or per provider when the host has
|
|
74
|
+
no connection API. Models do not need separate confirmations. Conflicting older
|
|
75
|
+
model-specific records remain isolated until an explicit relink.
|
|
76
|
+
- Additional read-only sources use Navigator's OpenCode 2 server plugin and public
|
|
77
|
+
integration/HTTP-response hooks. Secrets remain on the server and are never
|
|
78
|
+
returned by quota RPCs, written to Navigator preferences, or included in logs.
|
|
79
|
+
- Native response observations do not issue extra model requests. No quota read
|
|
80
|
+
triggers inference, a credit purchase, a reset, or an authorization flow.
|
|
81
|
+
- HTTP-only observations may be absent for WebSocket transports. Report that
|
|
82
|
+
limitation instead of changing the host transport or reading private frames.
|
|
83
|
+
- The native adapters are available through the OpenCode 2 server plugin. OpenCode
|
|
84
|
+
1.x keeps Codex support and capability guidance without accessing host internals.
|
|
85
|
+
- REST credentials are not reused against a native provider origin when the host
|
|
86
|
+
explicitly configures a different gateway origin. Redirects are rejected.
|
|
87
|
+
- Contract fixtures cover endpoint selection, regions, units, pagination, account
|
|
88
|
+
ambiguity/rotation, malformed bodies, cancellation, and partial-data handling.
|
|
89
|
+
These are deterministic checks, not live billing-account probes.
|
|
90
|
+
- Documentation from reference implementations is used only to discover APIs;
|
|
91
|
+
browser cookies, credential-file readers, private endpoints, and organization-
|
|
92
|
+
specific stacks are excluded.
|
package/README.md
CHANGED
|
@@ -355,6 +355,109 @@ dialog for the current session and `session.permissions` in the user-wide
|
|
|
355
355
|
`cli.json` (`"prompt"` or `"autoaccept"`) for its startup default. Restart
|
|
356
356
|
OpenCode after changing `cli.json`.
|
|
357
357
|
|
|
358
|
+
## Limits: provider quotas and banked resets
|
|
359
|
+
|
|
360
|
+
Navigator keeps subscription limits separate from OpenCode's session token and
|
|
361
|
+
cost statistics. Codex subscription data comes from its documented app-server
|
|
362
|
+
`account/rateLimits/read` RPC. It reports provider-owned usage windows, reset
|
|
363
|
+
times, account identity, and any available banked reset credits. The installed
|
|
364
|
+
Codex 0.160.0 protocol also exposes the separate
|
|
365
|
+
`account/rateLimitResetCredit/consume` RPC. Navigator requires explicit
|
|
366
|
+
confirmation before using it and never redeems credits in the background.
|
|
367
|
+
Limits follows the model selected in the current OpenCode session. A Codex
|
|
368
|
+
account's windows appear only if the provider explicitly maps them to that
|
|
369
|
+
model; otherwise the section explains that a matching quota is unavailable.
|
|
370
|
+
Switching provider, model, session, or account invalidates stale reads and credit actions.
|
|
371
|
+
CodexBar is useful for discovering providers, but its cookie, credential-file,
|
|
372
|
+
and undocumented endpoint integrations are not Navigator data sources.
|
|
373
|
+
|
|
374
|
+
| Source | Native measurement | Banked reset credits |
|
|
375
|
+
| --- | --- | --- |
|
|
376
|
+
| Codex app-server | Rate-limit windows and account ID | Available count, optional details and expiry, confirmed manual consumption |
|
|
377
|
+
| MiniMax and NanoGPT | Explicit model-associated subscription windows; separate pay-as-you-go balances | Read-only |
|
|
378
|
+
| GitHub Copilot | Official SDK token-scoped premium allowance, checked against the selected model's billing metadata | Read-only |
|
|
379
|
+
| OpenRouter, DeepSeek, Moonshot, SiliconFlow, Novita, Poe, AIHubMix | Current-account balance or key spending budget, preserving provider-native currency/points and permission requirements | Read-only |
|
|
380
|
+
| OpenAI API, Anthropic, Azure OpenAI, Groq, Cerebras, Fireworks | Native model-response counters or explicitly labelled configured capacities | Read-only |
|
|
381
|
+
| Claude Code (not integrated) | Session-local `rate_limits` statusline payload after a Claude Code response | No documented cross-process consumption API |
|
|
382
|
+
| OpenCode session statistics | Token and cost statistics, not subscription quota | Not applicable |
|
|
383
|
+
| Other providers | Capability guidance until a documented source and model/account mapping are verified | No action without a documented consume API |
|
|
384
|
+
|
|
385
|
+
The additional native sources use the **OpenCode 2 Navigator server plugin** already
|
|
386
|
+
used for Todo. Configure it on the 2.x launch path as described in the installation
|
|
387
|
+
section. OpenCode 1.x retains Codex support; additional sources need the 2.x public
|
|
388
|
+
integration/HTTP APIs. Without the server plugin, Limits shows setup guidance.
|
|
389
|
+
**Provider sources** lists audited capabilities and unsupported-source reasons;
|
|
390
|
+
the [source inventory](PROVIDERS.md) includes public API references and prerequisites.
|
|
391
|
+
|
|
392
|
+
The server resolves the active host credential through OpenCode's public API.
|
|
393
|
+
Quota RPCs return measurements, never credentials. Response-header observations
|
|
394
|
+
use real model requests without issuing extra inference calls or consuming their
|
|
395
|
+
response bodies. HTTP-only observations may be absent on WebSocket transports.
|
|
396
|
+
REST reads use a short in-memory cache; Refresh bypasses it. Observed headers older
|
|
397
|
+
than two minutes are marked stale instead of presented as current remaining quota.
|
|
398
|
+
|
|
399
|
+
Limits is visible and expanded by default, first below the session title. Change
|
|
400
|
+
its visibility and order under **Settings → Sections** in Global or Current
|
|
401
|
+
worktree scope. Hiding or collapsing it does not stop background refreshes, and
|
|
402
|
+
does not grant permission to spend a reset credit. **Focus Limits** is also
|
|
403
|
+
available from the command palette.
|
|
404
|
+
|
|
405
|
+

|
|
406
|
+
|
|
407
|
+

|
|
408
|
+
|
|
409
|
+
### Link the intended Codex account
|
|
410
|
+
|
|
411
|
+
Install a Codex CLI exposing the documented read and consume RPCs (verified with
|
|
412
|
+
0.160.0), ensure `codex` is on the same machine's `PATH`, and sign in with a ChatGPT
|
|
413
|
+
account. Navigator starts `codex app-server --stdio` lazily after the account is
|
|
414
|
+
associated with the selected ChatGPT connection.
|
|
415
|
+
|
|
416
|
+
OpenCode 2's built-in ChatGPT OAuth integration reports an account ID. Navigator
|
|
417
|
+
automatically associates that identity and verifies it against Codex's reported
|
|
418
|
+
account. API-key OpenAI connections use API measurements instead of a ChatGPT
|
|
419
|
+
subscription.
|
|
420
|
+
|
|
421
|
+
When the host does not provide a verifiable identity, select **Link Codex CLI
|
|
422
|
+
account** and confirm the reported account ID if it matches this host connection.
|
|
423
|
+
The private, user-wide binding is saved **once per connection**, or once per
|
|
424
|
+
provider on hosts without a connection API, and reused across models, projects,
|
|
425
|
+
and sessions. **Unlink Codex account** removes the manual association; **Relink
|
|
426
|
+
Codex account** is available after an account change. Compatible older model
|
|
427
|
+
bindings are reused; conflicting bindings remain isolated until a deliberate relink.
|
|
428
|
+
|
|
429
|
+
For an associated model, Limits shows only buckets with a provider-reported model
|
|
430
|
+
association, their native usage units and window durations, reset times, and
|
|
431
|
+
the last successful read time. It refreshes quietly every five seconds, even
|
|
432
|
+
when hidden. **Refresh** requests a read immediately; a failed read preserves
|
|
433
|
+
cached windows with a stale label and **Retry**. Unsupported mappings, changed
|
|
434
|
+
sign-in/account, and rate-limited reads have separate muted guidance.
|
|
435
|
+
|
|
436
|
+
### Review and manually use a banked reset
|
|
437
|
+
|
|
438
|
+
**Review reset credits** displays the provider's available count, optional credit
|
|
439
|
+
details, statuses, and expiry. Selecting a credit first checks fresh eligibility
|
|
440
|
+
and opens a separate confirmation tied to the current account and model. Cancel
|
|
441
|
+
or Escape returns to the credit list without spending anything.
|
|
442
|
+
|
|
443
|
+
The provider must report ordinary usage blocked, a matching quota window, and an
|
|
444
|
+
available reset credit. A displayed percentage alone does not establish
|
|
445
|
+
eligibility. A reset can affect other eligible Codex windows as well. Navigator
|
|
446
|
+
checks the account and eligibility again before submission. Read-only providers
|
|
447
|
+
do not gain a consume action.
|
|
448
|
+
|
|
449
|
+
After an uncertain result, **Reconcile pending attempt** reuses the same
|
|
450
|
+
idempotency key, including after a restart. Only its unresolved account/model,
|
|
451
|
+
optional credit ID, and attempt key are saved in private preferences. Definitive
|
|
452
|
+
outcomes clear that journal; quotas themselves are not saved to disk. A pending
|
|
453
|
+
attempt on another account must be resolved on its original binding first.
|
|
454
|
+
|
|
455
|
+

|
|
456
|
+
|
|
457
|
+
An absent Codex credit detail list does not mean there are zero credits: the
|
|
458
|
+
provider may report a count without individual rows. Navigator does not read
|
|
459
|
+
provider credential files or save credentials in preferences.
|
|
460
|
+
|
|
358
461
|
## Configuration sources
|
|
359
462
|
|
|
360
463
|
Navigator validates and deep-merges three simultaneous sources in this order:
|
|
@@ -457,9 +560,31 @@ sources are left untouched.
|
|
|
457
560
|
Configured files may define behavior, layout, desired MCP states, layout and MCP
|
|
458
561
|
presets, workspace-profile links, and MCP groups. Navigator deliberately ignores
|
|
459
562
|
favorites, recent-item history, trusted skills, onboarding state, paths, and other
|
|
460
|
-
private mutable data.
|
|
461
|
-
|
|
462
|
-
|
|
563
|
+
private mutable data. UI changes normally use the concurrency-safe preferences
|
|
564
|
+
file under OpenCode's state directory. Resetting a scope removes only its saved
|
|
565
|
+
override and reveals configured values again.
|
|
566
|
+
|
|
567
|
+
To deliberately save a named, commit-safe project profile, choose **Current
|
|
568
|
+
worktree** in Navigator Settings, copy the portable settings JSON, and paste it
|
|
569
|
+
into a temporary file. From that project's root, preview and then save it:
|
|
570
|
+
|
|
571
|
+
```sh
|
|
572
|
+
opencode-navigator-profile save Focus < /path/to/portable-settings.json
|
|
573
|
+
opencode-navigator-profile save Focus --apply < /path/to/portable-settings.json
|
|
574
|
+
```
|
|
575
|
+
|
|
576
|
+
If the command is not installed globally, run it with
|
|
577
|
+
`npx --yes --package=opencode-navigator opencode-navigator-profile` instead.
|
|
578
|
+
The command writes only the validated layout preset, desired MCP states, and
|
|
579
|
+
their optional link into `.opencode/navigator.json`. It preserves other project
|
|
580
|
+
configuration, rejects stale or symlinked targets, and never copies favorites,
|
|
581
|
+
history, trust choices, or private paths. Use `--replace` deliberately to update
|
|
582
|
+
an existing project profile. After saving, restart OpenCode to load the project
|
|
583
|
+
file, then open **Settings → Presets → Focus → Preview & apply**. The profile is
|
|
584
|
+
never applied merely by entering the project, and applying it does not save the
|
|
585
|
+
layout as a default. Saved Global or Current worktree presets with the same name
|
|
586
|
+
still take precedence, so use a distinct name if you want the project profile
|
|
587
|
+
to be visible in the current installation.
|
|
463
588
|
|
|
464
589
|
Choose `Global` or `Current worktree` before editing from the sidebar gear button.
|
|
465
590
|
Behavior changes apply immediately in the selected scope. Section visibility,
|
|
@@ -622,11 +747,12 @@ session or workspace dismisses the entire search dialog chain.
|
|
|
622
747
|
Development requires Bun 1.4.2 and Node.js 24.16 or newer. Install dependencies with
|
|
623
748
|
`bun install --frozen-lockfile`.
|
|
624
749
|
|
|
625
|
-
|
|
626
|
-
[`@st1ggy/linter-config`](https://github.com/St1ggy/linter-config);
|
|
627
|
-
common preset. `
|
|
628
|
-
OpenTUI callbacks, SDK compatibility, and test fixtures. Type-aware
|
|
629
|
-
application code, tests, build scripts,
|
|
750
|
+
Oxlint uses the `solid-ox` preset from
|
|
751
|
+
[`@st1ggy/linter-config`](https://github.com/St1ggy/linter-config); Oxfmt uses its
|
|
752
|
+
`oxfmt-common` preset. `oxlint.config.ts` documents project-specific adaptations for
|
|
753
|
+
OpenTUI callbacks, SDK compatibility, and test fixtures. Type-aware analysis uses
|
|
754
|
+
`oxlint-tsgolint`; `tsconfig.lint.json` covers application code, tests, build scripts,
|
|
755
|
+
and configuration files. Formatter exclusions are maintained in `oxfmt.config.ts`.
|
|
630
756
|
|
|
631
757
|
```sh
|
|
632
758
|
bun run test
|
|
@@ -644,7 +770,7 @@ bun run screenshots:verify
|
|
|
644
770
|
bun run check
|
|
645
771
|
```
|
|
646
772
|
|
|
647
|
-
`bun run check` runs the tests, TypeScript,
|
|
773
|
+
`bun run check` runs the tests, TypeScript, Oxlint, bundle-size guard, and Oxfmt
|
|
648
774
|
check. The unminified TUI bundle is limited to 360,000 bytes.
|
|
649
775
|
Font generation is a separate development task: `bun run font:build` and
|
|
650
776
|
`bun run font:check` use `uv` and the pinned FontTools dependency. Users install
|
|
@@ -655,7 +781,7 @@ CI checks that the bundled font matches its generator.
|
|
|
655
781
|
through Ghostty on Xvfb. The image includes the bundled corner font and a pinned
|
|
656
782
|
JetBrainsMono Nerd Font; every displayed task, session, workspace, path, skill,
|
|
657
783
|
server, error, and preset is synthetic. `bun run screenshots:verify` renders the
|
|
658
|
-
same
|
|
784
|
+
same scenes to a temporary directory and fails if any PNG differs. Additional scenes
|
|
659
785
|
keep the pinned Nerd Font but remove the Navigator corner font so the uninstalled-font
|
|
660
786
|
experience remains reproducible beside the required-font captures. The harness
|
|
661
787
|
requires Docker with Linux ARM64 support. These commands are available for harness
|
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import {PresetMenu} from "./tui.js"
|
|
2
1
|
import {createComponent as _$createComponent} from "@opentui/solid"
|
|
3
|
-
import {useDialogs} from "./tui.js"
|
|
2
|
+
import {SelectionMenu,useDialogs} from "./tui.js"
|
|
4
3
|
function GroupAssignmentDialog(props){const dialogs=useDialogs(props.api)
|
|
5
4
|
const options=()=>[...props.groups().map((group)=>({title:group,value:`:${group}`,description:group===props.assigned()?"Current":"Existing group"
|
|
6
5
|
})),{title:"Create new group",value:"+",description:"Type a name"
|
|
7
6
|
},{title:"Ungrouped",value:":",description:props.assigned()?"Remove assignment":"No group"
|
|
8
7
|
}]
|
|
9
|
-
return _$createComponent(
|
|
8
|
+
return _$createComponent(SelectionMenu,{get api(){return props.api
|
|
10
9
|
},get title(){return props.title
|
|
11
10
|
},get options(){return options()
|
|
12
11
|
},onSelect:(option)=>{if(option.value!=="+"){props.onAssign(option.value.slice(1)||undefined)
|
|
@@ -21,4 +20,4 @@ dialogs.back()
|
|
|
21
20
|
}})
|
|
22
21
|
}})
|
|
23
22
|
}
|
|
24
|
-
export{
|
|
23
|
+
export{GroupAssignmentDialog}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
var PLUGIN_ID="opencode-navigator"
|
|
2
|
+
var TOGGLE_COMMAND=`${PLUGIN_ID}.toggle`
|
|
3
|
+
var FOCUS_COMMAND=`${PLUGIN_ID}.focus`
|
|
4
|
+
var SEARCH_COMMAND=`${PLUGIN_ID}.search`;
|
|
5
|
+
var QUICK_ACTION_IDS=["session.rename","session.timeline","session.copy","session.export","session.compact","session.list","session.new","session.fork","messages.copy","session.first","session.last","session.messages_last_user","session.message.next","session.message.previous","permission.mode"]
|
|
6
|
+
var SECTION_DEFINITIONS=[{name:"limits",label:"Limits"},{name:"todo",label:"Todo"},{name:"subagents",label:"Subagents"},{name:"skills",label:"Skills"},{name:"quick_actions",label:"Quick actions"},{name:"lsp",label:"LSP"},{name:"mcp",label:"MCP"}]
|
|
7
|
+
export{QUICK_ACTION_IDS,SECTION_DEFINITIONS,PLUGIN_ID}
|