opencode-navigator 0.21.0 → 0.21.2

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/dist/server.js CHANGED
@@ -50,7 +50,7 @@ var NavigatorQuotaRpc={id:"opencode-navigator.quotas",methods:{read:{input:model
50
50
  }}}};
51
51
  function normalizeProviderQuota(snapshot){if(!snapshot.providerId||!snapshot.providerName||!snapshot.model.providerID||!snapshot.model.modelID||!snapshot.model.sessionID||!Number.isFinite(snapshot.fetchedAt)){throw new Error("Invalid provider quota identity")
52
52
  }
53
- const windows=snapshot.windows.map((window)=>{if(!window.id||!window.label||window.modelID!==snapshot.model.modelID||!window.unit||window.used!==undefined&&!Number.isFinite(window.used)||window.remaining!==undefined&&!Number.isFinite(window.remaining)||window.used===undefined&&window.remaining===undefined&&window.total===undefined||window.total!==undefined&&(!Number.isFinite(window.total)||window.total<0)||window.durationMinutes!==undefined&&(!Number.isFinite(window.durationMinutes)||window.durationMinutes<0)||window.resetsAt!==undefined&&!Number.isFinite(window.resetsAt)){throw new Error("Quota window does not match the selected model or contains invalid values")
53
+ const windows=snapshot.windows.map((window)=>{if(!window.id||!window.label||window.scope!==undefined&&window.scope!=="account"&&window.scope!=="model"||(window.scope==="account"?!snapshot.accountId||window.modelID!==undefined:window.modelID!==snapshot.model.modelID)||!window.unit||window.used!==undefined&&!Number.isFinite(window.used)||window.remaining!==undefined&&!Number.isFinite(window.remaining)||window.used===undefined&&window.remaining===undefined&&window.total===undefined||window.total!==undefined&&(!Number.isFinite(window.total)||window.total<0)||window.durationMinutes!==undefined&&(!Number.isFinite(window.durationMinutes)||window.durationMinutes<0)||window.resetsAt!==undefined&&!Number.isFinite(window.resetsAt)){throw new Error("Quota window does not match the selected model or contains invalid values")
54
54
  }
55
55
  return{...window}})
56
56
  const bankedResets=snapshot.bankedResets
@@ -60,7 +60,7 @@ return{...balance}})
60
60
  if(bankedResets&&(!Number.isSafeInteger(bankedResets.availableCount)||bankedResets.availableCount<0)){throw new Error("Invalid banked reset count")
61
61
  }
62
62
  return{...snapshot,windows,...balances&&{balances},...bankedResets&&{bankedResets:{availableCount:bankedResets.availableCount,...bankedResets.credits&&{credits:[...bankedResets.credits]}}}}}
63
- var rows=[["openai","OpenAI / Codex",["subscription","api-rate-limits"],"Codex account RPC; HTTP response request/token limits for API connections.","https://developers.openai.com/api/docs/guides/rate-limits"],["anthropic","Anthropic / Claude",["api-rate-limits","configured-limits"],"Model HTTP headers; eligible organization/admin credentials can read configured model limits. Claude subscription windows are separate.","https://platform.claude.com/docs/en/manage-claude/rate-limits-api"],["openrouter","OpenRouter",["key-budget","account-balance"],"Inference-key budget; account credits require a management key. Free-model request limits apply only to free variants.","https://openrouter.ai/docs/api/api-reference/api-keys/get-current-api-key"],["deepseek","DeepSeek",["account-balance"],"Provider-reported USD/CNY available, granted and topped-up balances.","https://api-docs.deepseek.com/api/get-user-balance"],["moonshotai","Moonshot / Kimi API",["account-balance"],"International USD balances; coding subscriptions are a different product.","https://platform.moonshot.ai/docs/api/balance"],["moonshotai-cn","Moonshot / Kimi API China",["account-balance"],"China CNY balances; never reuse an international key against the China endpoint.","https://platform.moonshot.cn/docs/api/balance"],["minimax","MiniMax",["subscription","account-balance"],"Token Plan model rows/explicit percentages; official SDK balance response for pay-as-you-go keys.","https://platform.minimax.io/docs/token-plan/faq"],["minimax-cn","MiniMax China",["subscription","account-balance"],"Region-specific native Token Plan and SDK balance endpoints.","https://github.com/MiniMax-AI/cli/tree/main/src/sdk/quota"],["github-copilot","GitHub Copilot",["subscription"],"Official SDK token-scoped quota/model RPC; no direct copilot_internal calls or ambient CLI login.","https://github.com/github/copilot-sdk/blob/main/docs/features/usage-and-billing.md"],["groq","Groq",["api-rate-limits"],"Native model response headers: requests per day and tokens per minute.","https://console.groq.com/docs/rate-limits"],["fireworks-ai","Fireworks",["configured-limits","api-rate-limits"],"Native model token/second capacities and account monthly spend quota; GPU quotas are excluded.","https://docs.fireworks.ai/serverless/rate-limits"],["siliconflow","SiliconFlow",["account-balance"],"Native current-user balances; retain unknown currency when the API does not report it.","https://docs.siliconflow.com/en/api-reference/userinfo/get-user-info"],["siliconflow-cn","SiliconFlow China",["account-balance"],"Region-specific current-user balances; currency is unknown when the API omits it.","https://docs.siliconflow.cn/"],["novita-ai","Novita",["account-balance"],"Native current-user balances in 1/10000 USD.","https://novita.ai/docs/api-reference/basic-get-user-balance"],["poe","Poe",["account-balance"],"API account point balance; includes plan and add-on points, not session token usage.","https://creator.poe.com/docs/resources/usage-api"],["nano-gpt","NanoGPT",["account-balance","subscription"],"Native USD/Nano balance and documented subscription token windows; null/degraded counters remain unknown.","https://docs.nano-gpt.com/api-reference/endpoint/subscription-usage"],["aihubmix","AIHubMix",["account-balance"],"Current-account balance API needs a Manage Key; inference keys do not grant management access.","https://docs.aihubmix.com/en/api/CliEndpoints/get-self"],["azure","Azure OpenAI",["api-rate-limits"],"Remaining request/token headers for the actual deployment; no ChatGPT subscription or inferred cloud balance.","https://learn.microsoft.com/en-us/azure/ai-foundry/openai/quotas-limits"],["cerebras","Cerebras",["api-rate-limits"],"Only self-describing native counters actually returned for the selected model; console tier examples are not live quota.","https://inference-docs.cerebras.ai/support/rate-limits"],["mistral","Mistral",[],"Documented remaining header lacks a verified unit/window association; no inferred subscription balance.","https://docs.mistral.ai/resources/known-limitations"],["togetherai","Together AI",[],"Dynamic model limits expose retry intervals, not remaining quota; billing UI does not establish a remaining-credit API.","https://docs.together.ai/docs/rate-limits"],["xai","xAI / Grok",[],"Management billing needs separate team credentials; no verified portable remaining API for this inference connection.","https://docs.x.ai/"],["perplexity","Perplexity",[],"No verified remaining-credit API for an inference key. API credits, consumer subscriptions and Computer credits are distinct.","https://www.perplexity.ai/help-center/en/articles/10354847-api-payment-and-billing"],["google","Google Gemini",["configured-limits"],"Native model-matched QuotaFailure responses when provided; cloud quota permissions differ from an inference key.","https://ai.google.dev/gemini-api/docs/rate-limits"],["google-vertex","Google Vertex AI",["configured-limits"],"Native model-matched quota error details; cloud project/region management and dynamic shared quotas are separate.","https://cloud.google.com/vertex-ai/generative-ai/docs/quotas"],["amazon-bedrock","Amazon Bedrock",[],"Service Quotas/CloudWatch require cloud IAM/region/model mapping not exposed by a portable inference connection.","https://docs.aws.amazon.com/bedrock/latest/userguide/quotas.html"],["cloudflare-workers-ai","Cloudflare Workers AI",[],"Account analytics do not prove remaining free allowance; separate account management capability is required.","https://developers.cloudflare.com/workers-ai/platform/limits/"],["huggingface","Hugging Face Inference Providers",[],"Hub request quota is not an inference-model quota or inference-credit balance.","https://huggingface.co/docs/inference-providers/pricing"],["zai","Z.ai / GLM Coding Plan",[],"No verified external quota contract for monitor/dashboard APIs; private endpoints are excluded.","https://docs.z.ai/devpack/overview"],["kimi-for-coding","Kimi Code subscription",[],"Keep separate from Moonshot API balance; an external subscription usage contract/model mapping must be verified.","https://www.kimi.com/code/docs/en/"],["alibaba","Alibaba Cloud / Qwen / DashScope",[],"Cloud account/project billing permissions and model mapping are required; browser OAuth state is not a quota source.","https://www.alibabacloud.com/help/en/model-studio/"],["opencode","OpenCode Zen / Go",[],"Session token/cost statistics are not provider quota; no undocumented billing endpoints.","https://opencode.ai/docs/zen/"],["cursor","Cursor",[],"Consumer usage needs a supported external API; no cookie or credential-file integrations.","https://docs.cursor.com/"],["windsurf","Windsurf / Codeium",[],"Consumer plan windows need a supported external API; no private account endpoints.","https://docs.windsurf.com/"],["amp","Amp",[],"Product credits need a supported external account API; no cookie or local credential extraction.","https://ampcode.com/manual"],["ollama","Ollama",[],"Local inference has no provider subscription window; cloud products require their own account API.","https://docs.ollama.com/api"],["lmstudio","LM Studio",[],"Local inference has no provider subscription quota to read.","https://lmstudio.ai/docs/developer"],["nvidia","NVIDIA NIM / NGC",[],"Inference access does not identify cloud/trial NGC credit balance or self-hosted resource quota.","https://docs.nvidia.com/nim/"],["cohere","Cohere",[],"No verified native remaining-counter contract for this integration; static organization tier examples are not live quotas.","https://docs.cohere.com/docs/rate-limits"],["ai21","AI21",[],"No verified native remaining-counter contract or subscription balance endpoint for this integration.","https://docs.ai21.com/"],["replicate","Replicate",[],"Prediction cost is not remaining account credit; no inferred balance from execution cost.","https://replicate.com/docs/topics/billing"],["chutes","Chutes",[],"Current-user quota APIs exist, but their public schemas do not establish native units/model allowance semantics yet.","https://chutes.ai/docs/api-reference/users"],["requesty","Requesty",[],"Enterprise management key and key ID are required; dated usage reports alone are not remaining budget.","https://docs.requesty.ai/features/key-management-api"],["baseten","Baseten",[],"No independently verified portable remaining quota API for the configured inference connection.","https://docs.baseten.co/"],["modelscope","ModelScope",[],"No independently verified portable remaining quota API/model mapping for the selected connection.","https://opencode.ai/docs/providers/"],["nebius","Nebius",[],"Cloud billing/management access is separate from a plain inference credential.","https://docs.nebius.com/"],["vultr","Vultr",[],"Cloud management quota/billing permissions are separate from inference access.","https://docs.vultr.com/"],["v0","Vercel v0",[],"Consumer/product credits need their own documented external account API.","https://v0.dev/docs"]]
63
+ var rows=[["openai","OpenAI / Codex",["subscription","api-rate-limits"],"Verified Codex account quota shared across models; HTTP response request/token limits for API connections.","https://developers.openai.com/api/docs/guides/rate-limits"],["anthropic","Anthropic / Claude",["api-rate-limits","configured-limits"],"Model HTTP headers; eligible organization/admin credentials can read configured model limits. Claude subscription windows are separate.","https://platform.claude.com/docs/en/manage-claude/rate-limits-api"],["openrouter","OpenRouter",["key-budget","account-balance"],"Inference-key budget; account credits require a management key. Free-model request limits apply only to free variants.","https://openrouter.ai/docs/api/api-reference/api-keys/get-current-api-key"],["deepseek","DeepSeek",["account-balance"],"Provider-reported USD/CNY available, granted and topped-up balances.","https://api-docs.deepseek.com/api/get-user-balance"],["moonshotai","Moonshot / Kimi API",["account-balance"],"International USD balances; coding subscriptions are a different product.","https://platform.moonshot.ai/docs/api/balance"],["moonshotai-cn","Moonshot / Kimi API China",["account-balance"],"China CNY balances; never reuse an international key against the China endpoint.","https://platform.moonshot.cn/docs/api/balance"],["minimax","MiniMax",["subscription","account-balance"],"Token Plan model rows/explicit percentages; official SDK balance response for pay-as-you-go keys.","https://platform.minimax.io/docs/token-plan/faq"],["minimax-cn","MiniMax China",["subscription","account-balance"],"Region-specific native Token Plan and SDK balance endpoints.","https://github.com/MiniMax-AI/cli/tree/main/src/sdk/quota"],["github-copilot","GitHub Copilot",["subscription"],"Official SDK token-scoped quota/model RPC; no direct copilot_internal calls or ambient CLI login.","https://github.com/github/copilot-sdk/blob/main/docs/features/usage-and-billing.md"],["groq","Groq",["api-rate-limits"],"Native model response headers: requests per day and tokens per minute.","https://console.groq.com/docs/rate-limits"],["fireworks-ai","Fireworks",["configured-limits","api-rate-limits"],"Native model token/second capacities and account monthly spend quota; GPU quotas are excluded.","https://docs.fireworks.ai/serverless/rate-limits"],["siliconflow","SiliconFlow",["account-balance"],"Native current-user balances; retain unknown currency when the API does not report it.","https://docs.siliconflow.com/en/api-reference/userinfo/get-user-info"],["siliconflow-cn","SiliconFlow China",["account-balance"],"Region-specific current-user balances; currency is unknown when the API omits it.","https://docs.siliconflow.cn/"],["novita-ai","Novita",["account-balance"],"Native current-user balances in 1/10000 USD.","https://novita.ai/docs/api-reference/basic-get-user-balance"],["poe","Poe",["account-balance"],"API account point balance; includes plan and add-on points, not session token usage.","https://creator.poe.com/docs/resources/usage-api"],["nano-gpt","NanoGPT",["account-balance","subscription"],"Native USD/Nano balance and documented subscription token windows; null/degraded counters remain unknown.","https://docs.nano-gpt.com/api-reference/endpoint/subscription-usage"],["aihubmix","AIHubMix",["account-balance"],"Current-account balance API needs a Manage Key; inference keys do not grant management access.","https://docs.aihubmix.com/en/api/CliEndpoints/get-self"],["azure","Azure OpenAI",["api-rate-limits"],"Remaining request/token headers for the actual deployment; no ChatGPT subscription or inferred cloud balance.","https://learn.microsoft.com/en-us/azure/ai-foundry/openai/quotas-limits"],["cerebras","Cerebras",["api-rate-limits"],"Only self-describing native counters actually returned for the selected model; console tier examples are not live quota.","https://inference-docs.cerebras.ai/support/rate-limits"],["mistral","Mistral",[],"Documented remaining header lacks a verified unit/window association; no inferred subscription balance.","https://docs.mistral.ai/resources/known-limitations"],["togetherai","Together AI",[],"Dynamic model limits expose retry intervals, not remaining quota; billing UI does not establish a remaining-credit API.","https://docs.together.ai/docs/rate-limits"],["xai","xAI / Grok",[],"Management billing needs separate team credentials; no verified portable remaining API for this inference connection.","https://docs.x.ai/"],["perplexity","Perplexity",[],"No verified remaining-credit API for an inference key. API credits, consumer subscriptions and Computer credits are distinct.","https://www.perplexity.ai/help-center/en/articles/10354847-api-payment-and-billing"],["google","Google Gemini",["configured-limits"],"Native model-matched QuotaFailure responses when provided; cloud quota permissions differ from an inference key.","https://ai.google.dev/gemini-api/docs/rate-limits"],["google-vertex","Google Vertex AI",["configured-limits"],"Native model-matched quota error details; cloud project/region management and dynamic shared quotas are separate.","https://cloud.google.com/vertex-ai/generative-ai/docs/quotas"],["amazon-bedrock","Amazon Bedrock",[],"Service Quotas/CloudWatch require cloud IAM/region/model mapping not exposed by a portable inference connection.","https://docs.aws.amazon.com/bedrock/latest/userguide/quotas.html"],["cloudflare-workers-ai","Cloudflare Workers AI",[],"Account analytics do not prove remaining free allowance; separate account management capability is required.","https://developers.cloudflare.com/workers-ai/platform/limits/"],["huggingface","Hugging Face Inference Providers",[],"Hub request quota is not an inference-model quota or inference-credit balance.","https://huggingface.co/docs/inference-providers/pricing"],["zai","Z.ai / GLM Coding Plan",[],"No verified external quota contract for monitor/dashboard APIs; private endpoints are excluded.","https://docs.z.ai/devpack/overview"],["kimi-for-coding","Kimi Code subscription",[],"Keep separate from Moonshot API balance; an external subscription usage contract/model mapping must be verified.","https://www.kimi.com/code/docs/en/"],["alibaba","Alibaba Cloud / Qwen / DashScope",[],"Cloud account/project billing permissions and model mapping are required; browser OAuth state is not a quota source.","https://www.alibabacloud.com/help/en/model-studio/"],["opencode","OpenCode Zen / Go",[],"Session token/cost statistics are not provider quota; no undocumented billing endpoints.","https://opencode.ai/docs/zen/"],["cursor","Cursor",[],"Consumer usage needs a supported external API; no cookie or credential-file integrations.","https://docs.cursor.com/"],["windsurf","Windsurf / Codeium",[],"Consumer plan windows need a supported external API; no private account endpoints.","https://docs.windsurf.com/"],["amp","Amp",[],"Product credits need a supported external account API; no cookie or local credential extraction.","https://ampcode.com/manual"],["ollama","Ollama",[],"Local inference has no provider subscription window; cloud products require their own account API.","https://docs.ollama.com/api"],["lmstudio","LM Studio",[],"Local inference has no provider subscription quota to read.","https://lmstudio.ai/docs/developer"],["nvidia","NVIDIA NIM / NGC",[],"Inference access does not identify cloud/trial NGC credit balance or self-hosted resource quota.","https://docs.nvidia.com/nim/"],["cohere","Cohere",[],"No verified native remaining-counter contract for this integration; static organization tier examples are not live quotas.","https://docs.cohere.com/docs/rate-limits"],["ai21","AI21",[],"No verified native remaining-counter contract or subscription balance endpoint for this integration.","https://docs.ai21.com/"],["replicate","Replicate",[],"Prediction cost is not remaining account credit; no inferred balance from execution cost.","https://replicate.com/docs/topics/billing"],["chutes","Chutes",[],"Current-user quota APIs exist, but their public schemas do not establish native units/model allowance semantics yet.","https://chutes.ai/docs/api-reference/users"],["requesty","Requesty",[],"Enterprise management key and key ID are required; dated usage reports alone are not remaining budget.","https://docs.requesty.ai/features/key-management-api"],["baseten","Baseten",[],"No independently verified portable remaining quota API for the configured inference connection.","https://docs.baseten.co/"],["modelscope","ModelScope",[],"No independently verified portable remaining quota API/model mapping for the selected connection.","https://opencode.ai/docs/providers/"],["nebius","Nebius",[],"Cloud billing/management access is separate from a plain inference credential.","https://docs.nebius.com/"],["vultr","Vultr",[],"Cloud management quota/billing permissions are separate from inference access.","https://docs.vultr.com/"],["v0","Vercel v0",[],"Consumer/product credits need their own documented external account API.","https://v0.dev/docs"]]
64
64
  var PROVIDER_QUOTA_CAPABILITIES= rows.map(([id,name,sources,reason,url])=>({id,name,sources,reason,documentation:[url]}))
65
65
  var aliases={fireworks:"fireworks-ai",novita:"novita-ai",moonshot:"moonshotai","minimax-coding-plan":"minimax","minimax-coding-plan-cn":"minimax-cn",together:"togetherai","silicon-flow":"siliconflow","github-copilot-enterprise":"github-copilot","google-vertex-anthropic":"google-vertex","z-ai":"zai",zhipuai:"zai",dashscope:"alibaba","alibaba-cn":"alibaba",qwen:"alibaba","opencode-go":"opencode","opencode-zen":"opencode",codeium:"windsurf","azure-cognitive-services":"azure"
66
66
  }
package/dist/tui.js CHANGED
@@ -3,7 +3,7 @@ import {insert as _$insert,setProp as _$setProp,createElement as _$createElement
3
3
 
4
4
 
5
5
 
6
- import {createSignal as createSignal2,createSignal,createEffect,onCleanup,createContext,useContext,createContext as createContext2,createSignal as createSignal3,useContext as useContext2,createEffect as createEffect2,splitProps,untrack,splitProps as splitProps2,For,createEffect as createEffect3,onCleanup as onCleanup2,createEffect as createEffect4,Show,splitProps as splitProps3,createSignal as createSignal4,createSignal as createSignal5,createSignal as createSignal6,onCleanup as onCleanup3,batch,createSignal as createSignal8,createSignal as createSignal7,createEffect as createEffect5,createSignal as createSignal9,onCleanup as onCleanup4,createSignal as createSignal10,createSignal as createSignal11,Index,createSignal as createSignal12,onCleanup as onCleanup5,createEffect as createEffect7,onCleanup as onCleanup7,batch as batch2,createEffect as createEffect6,createMemo,createSignal as createSignal13,onCleanup as onCleanup6,onMount,For as For2,For as For3,Show as Show2,createMemo as createMemo2,Show as Show3,createSignal as createSignal14,onCleanup as onCleanup8,For as For4,For as For5,For as For8,createMemo as createMemo4,onMount as onMount3,For as For7,createMemo as createMemo3,onMount as onMount2,Show as Show5,createEffect as createEffect8,createSignal as createSignal15,onCleanup as onCleanup9,Show as Show4,For as For6,For as For9,createEffect as createEffect9,createMemo as createMemo5,onCleanup as onCleanup10,createEffect as createEffect10,createMemo as createMemo6,untrack as untrack2,For as For10,createEffect as createEffect11,createMemo as createMemo8,onCleanup as onCleanup11,onMount as onMount4,createMemo as createMemo7,Show as Show6,onCleanup as onCleanup12,createEffect as createEffect12,onCleanup as onCleanup13,createSignal as createSignal16,createMemo as createMemo9,createEffect as createEffect13,onCleanup as onCleanup14,onMount as onMount5,onCleanup as onCleanup15,onMount as onMount6,For as For11,createSignal as createSignal17,createSignal as createSignal18,Show as Show7,createSignal as createSignal20,createSignal as createSignal19,onCleanup as onCleanup16,For as For12,Show as Show10,createMemo as createMemo11,createComputed,createMemo as createMemo10,createSignal as createSignal21,untrack as untrack3,Show as Show8,createComputed as createComputed2,untrack as untrack4,Show as Show9,createEffect as createEffect14,createSignal as createSignal22,createMemo as createMemo13,createSignal as createSignal25,createMemo as createMemo12,For as For13,Show as Show14,Show as Show11,Show as Show12,createSignal as createSignal23,createContext as createContext3,useContext as useContext3,Show as Show13,createSignal as createSignal24,onCleanup as onCleanup17,Show as Show17,createSignal as createSignal26,untrack as untrack5,createSignal as createSignal27,createEffect as createEffect15,For as For14,createSignal as createSignal28,onMount as onMount7,Show as Show15,Show as Show16,For as For15,Show as Show19,createMemo as createMemo15,Show as Show18,createMemo as createMemo14,createSignal as createSignal29,createEffect as createEffect16,onCleanup as onCleanup18,For as For20,Match,Switch,createMemo as createMemo19,onCleanup as onCleanup22,For as For16,Show as Show20,createSignal as createSignal30,createEffect as createEffect17,createMemo as createMemo16,onCleanup as onCleanup19,untrack as untrack6,For as For18,Show as Show23,createEffect as createEffect18,createMemo as createMemo17,createSignal as createSignal31,onCleanup as onCleanup20,untrack as untrack7,For as For17,Show as Show22,Show as Show21,Show as Show27,createEffect as createEffect19,createMemo as createMemo18,createSignal as createSignal32,onCleanup as onCleanup21,untrack as untrack8,For as For19,Show as Show25,Show as Show24,Show as Show26,createEffect as createEffect20,createMemo as createMemo20,onCleanup as onCleanup23,untrack as untrack9,Show as Show28,createMemo as createMemo21,onCleanup as onCleanup24,createEffect as createEffect21,onCleanup as onCleanup25,untrack as untrack10,createSignal as createSignal33,onCleanup as onCleanup26,onMount as onMount8} from "solid-js"
6
+ import {createSignal as createSignal2,createSignal,createEffect,onCleanup,createContext,useContext,createContext as createContext2,createSignal as createSignal3,useContext as useContext2,createEffect as createEffect2,splitProps,untrack,splitProps as splitProps2,For,createEffect as createEffect3,onCleanup as onCleanup2,createEffect as createEffect4,Show,splitProps as splitProps3,createSignal as createSignal4,createSignal as createSignal5,createSignal as createSignal6,onCleanup as onCleanup3,batch,createSignal as createSignal8,createSignal as createSignal7,createEffect as createEffect5,createSignal as createSignal9,onCleanup as onCleanup4,createSignal as createSignal10,createSignal as createSignal11,Index,createSignal as createSignal12,onCleanup as onCleanup5,createEffect as createEffect7,onCleanup as onCleanup7,batch as batch2,createEffect as createEffect6,createMemo,createSignal as createSignal13,onCleanup as onCleanup6,onMount,For as For2,For as For3,Show as Show2,createMemo as createMemo2,Show as Show3,createSignal as createSignal14,onCleanup as onCleanup8,For as For4,For as For5,For as For8,createMemo as createMemo4,onMount as onMount3,For as For7,createMemo as createMemo3,onMount as onMount2,Show as Show5,createEffect as createEffect8,createSignal as createSignal15,onCleanup as onCleanup9,Show as Show4,For as For6,For as For9,createEffect as createEffect9,createMemo as createMemo5,onCleanup as onCleanup10,createEffect as createEffect10,createMemo as createMemo6,untrack as untrack2,For as For10,createEffect as createEffect11,createMemo as createMemo8,onCleanup as onCleanup11,onMount as onMount4,createMemo as createMemo7,Show as Show6,onCleanup as onCleanup12,createEffect as createEffect12,onCleanup as onCleanup13,createSignal as createSignal16,createMemo as createMemo9,createEffect as createEffect13,onCleanup as onCleanup14,onMount as onMount5,onCleanup as onCleanup15,onMount as onMount6,For as For11,createSignal as createSignal17,createSignal as createSignal18,Show as Show7,createSignal as createSignal20,createSignal as createSignal19,onCleanup as onCleanup16,For as For12,Show as Show10,createMemo as createMemo11,createComputed,createMemo as createMemo10,createSignal as createSignal21,untrack as untrack3,Show as Show8,createComputed as createComputed2,untrack as untrack4,Show as Show9,createSignal as createSignal23,createEffect as createEffect14,createSignal as createSignal22,on,createMemo as createMemo13,createSignal as createSignal26,createMemo as createMemo12,For as For13,Show as Show14,Show as Show11,Show as Show12,createSignal as createSignal24,createContext as createContext3,useContext as useContext3,Show as Show13,createSignal as createSignal25,onCleanup as onCleanup17,Show as Show19,createSignal as createSignal27,untrack as untrack5,createSignal as createSignal28,createEffect as createEffect15,For as For14,Show as Show15,Show as Show16,Show as Show17,Show as Show18,For as For15,Show as Show21,createMemo as createMemo15,Show as Show20,createMemo as createMemo14,createSignal as createSignal29,createEffect as createEffect16,onCleanup as onCleanup18,For as For20,Match,Switch,createMemo as createMemo19,onCleanup as onCleanup22,For as For16,Show as Show22,createSignal as createSignal30,createEffect as createEffect17,createMemo as createMemo16,onCleanup as onCleanup19,untrack as untrack6,For as For18,Show as Show25,createEffect as createEffect18,createMemo as createMemo17,createSignal as createSignal31,onCleanup as onCleanup20,untrack as untrack7,For as For17,Show as Show24,Show as Show23,Show as Show29,createEffect as createEffect19,createMemo as createMemo18,createSignal as createSignal32,onCleanup as onCleanup21,untrack as untrack8,For as For19,Show as Show27,Show as Show26,Show as Show28,createEffect as createEffect20,createMemo as createMemo20,onCleanup as onCleanup23,untrack as untrack9,Show as Show30,createMemo as createMemo21,onCleanup as onCleanup24,createEffect as createEffect21,onCleanup as onCleanup25,untrack as untrack10,createSignal as createSignal33,onCleanup as onCleanup26,onMount as onMount7} from "solid-js"
7
7
  var SIDEBAR_SECTIONS=["limits","todo","subagents","skills","quick_actions","lsp","mcp"]
8
8
  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"]
9
9
  function preferencesScope(path){return path.worktree||path.directory||"global"
@@ -5464,46 +5464,67 @@ return _el$
5464
5464
 
5465
5465
 
5466
5466
 
5467
+
5468
+
5469
+
5470
+
5471
+
5472
+
5473
+
5467
5474
  var graphemes=new Intl.Segmenter(undefined,{granularity:"grapheme"
5468
5475
  })
5469
- function truncateEnd(value,maxWidth){if(Bun.stringWidth(value)<=maxWidth)
5476
+ function truncateEnd(value,width){if(Bun.stringWidth(value)<=width)
5470
5477
  return value
5471
- if(maxWidth<=0)
5478
+ if(width<=0)
5472
5479
  return ""
5473
- const ellipsis=maxWidth>=3?"...":".".repeat(maxWidth)
5474
- const contentWidth=maxWidth-Bun.stringWidth(ellipsis)
5480
+ const ellipsis=width>=3?"...":".".repeat(width)
5475
5481
  let result=""
5476
5482
  for(const{segment
5477
- } of graphemes.segment(value)){if(Bun.stringWidth(result + segment)>contentWidth)
5483
+ } of graphemes.segment(value)){if(Bun.stringWidth(result + segment)>width-ellipsis.length)
5478
5484
  break
5479
5485
  result += segment
5480
5486
  }
5481
5487
  return result + ellipsis
5482
5488
  }
5489
+ function SectionHeaderControl(props){const [width,setWidth]=createSignal22()
5490
+ const control=useSidebarItem(props.api,props.interaction,{id:props.action.id,position:()=>props.position,disabled:props.action.disabled,activate:props.action.onActivate
5491
+ },()=>props.api.theme.current.accent,"control")
5492
+ createEffect14(on(()=>[props.action.label(),props.resetWidth],()=>setWidth(undefined)))
5493
+ const label=()=>width()===undefined||props.iconOnly?props.action.label():truncateEnd(props.action.label(),width()-2)
5494
+ return _$createComponent(SelectionBox,{ref:(node)=>control.ref(node),get id(){return props.action.id
5495
+ },get iconOnly(){return props.iconOnly
5496
+ },get width(){return props.iconOnly?3:undefined
5497
+ },get flexShrink(){return props.iconOnly?0:1
5498
+ },minWidth:3,overflow:"hidden",get alignItems(){return props.iconOnly?"center":undefined
5499
+ },get backgroundColor(){return control.backgroundColor()
5500
+ },onSizeChange:function(){setWidth(this.width)
5501
+ },get onMouseOver(){return control.onMouseOver
5502
+ },get onMouseOut(){return control.onMouseOut
5503
+ },onMouseDown:(event)=>event.stopPropagation(),onMouseUp:(event)=>{event.stopPropagation()
5504
+ control.activate(event)
5505
+ },get children(){var _el$=_$createElement("text")
5506
+ _$setProp(_el$,"wrapMode","none")
5507
+ _$setProp(_el$,"height",1)
5508
+ _$insert(_el$,label)
5509
+ _$effect((_$p)=>_$setProp(_el$,"fg",control.foregroundColor(),_$p))
5510
+ return _el$
5511
+ }})
5512
+ }
5483
5513
  function Section(props){const icons=useIcons()
5484
- const [actionWidth,setActionWidth]=createSignal22()
5514
+ const [headerWidth,setHeaderWidth]=createSignal23(0)
5485
5515
  const icon=()=>props.section?icons.section(props.section):props.icon
5486
5516
  const theme=()=>props.api.theme.current
5487
5517
  const item=useSidebarItem(props.api,props.interaction,{id:props.sectionId??`section.${props.title}`,position:()=>({section:props.navigationSection??0,row:0,column:0
5488
5518
  }),activate:props.onToggle
5489
5519
  })
5490
- const action=props.headerAction?useSidebarItem(props.api,props.interaction,{id:props.headerAction.id,position:()=>({section:props.navigationSection??0,row:0,column:1
5491
- }),disabled:props.headerAction.disabled,activate:props.headerAction.onActivate
5492
- },()=>theme().accent,"control"):undefined
5493
- createEffect14(()=>{props.headerAction?.label()
5494
- setActionWidth(undefined)
5495
- })
5496
- const actionLabel=()=>{const label=props.headerAction?.label()??""
5497
- const width=actionWidth()
5498
- return width===undefined?label:truncateEnd(label,width-2)
5499
- }
5500
5520
  return(()=>{var _el$=_$createElement("box")
5501
5521
  _$setProp(_el$,"gap",1)
5502
5522
  _$insert(_el$,_$createComponent(SelectionBox,{ref:(node)=>item.ref(node),get id(){return props.sectionId
5503
5523
  },flexDirection:"row",height:1,justifyContent:"space-between",gap:1,paddingLeft:1,paddingRight:1,get backgroundColor(){return item.backgroundColor()
5504
5524
  },get onMouseOver(){return item.onMouseOver
5505
5525
  },get onMouseOut(){return item.onMouseOut
5506
- },onMouseDown:(event)=>item.activate(event),onSizeChange:()=>setActionWidth(undefined),get children(){return [(()=>{var _el$2=_$createElement("text"),_el$3=_$createElement("span"),_el$4=_$createTextNode(` `),_el$5=_$createElement("span"),_el$6=_$createElement("b")
5526
+ },onMouseDown:(event)=>item.activate(event),onSizeChange:function(){setHeaderWidth(this.width)
5527
+ },get children(){return [(()=>{var _el$2=_$createElement("text"),_el$3=_$createElement("span"),_el$4=_$createTextNode(` `),_el$5=_$createElement("span"),_el$6=_$createElement("b")
5507
5528
  _$insertNode(_el$2,_el$3)
5508
5529
  _$insertNode(_el$2,_el$4)
5509
5530
  _$insertNode(_el$2,_el$5)
@@ -5525,28 +5546,23 @@ return _p$
5525
5546
  },{e:undefined,t:undefined,a:undefined
5526
5547
  })
5527
5548
  return _el$2
5528
- })(),(()=>{var _el$7=_$createElement("box"),_el$8=_$createElement("text")
5529
- _$insertNode(_el$7,_el$8)
5549
+ })(),(()=>{var _el$7=_$createElement("box")
5530
5550
  _$setProp(_el$7,"flexDirection","row")
5531
5551
  _$setProp(_el$7,"gap",1)
5532
5552
  _$setProp(_el$7,"flexGrow",1)
5533
5553
  _$setProp(_el$7,"minWidth",0)
5534
5554
  _$setProp(_el$7,"justifyContent","flex-end")
5535
- _$insert(_el$7,_$createComponent(Show9,{when:action,children:(control)=>_$createComponent(SelectionBox,{ref:(node)=>control().ref(node),get id(){return props.headerAction?.id
5536
- },flexShrink:1,minWidth:3,overflow:"hidden",get backgroundColor(){return control().backgroundColor()
5537
- },onSizeChange:function(){setActionWidth(this.width)
5538
- },get onMouseOver(){return control().onMouseOver
5539
- },get onMouseOut(){return control().onMouseOut
5540
- },onMouseDown:(event)=>event.stopPropagation(),onMouseUp:(event)=>{event.stopPropagation()
5541
- control().activate(event)
5542
- },get children(){var _el$9=_$createElement("text")
5543
- _$setProp(_el$9,"wrapMode","none")
5544
- _$setProp(_el$9,"height",1)
5545
- _$insert(_el$9,actionLabel)
5546
- _$effect((_$p)=>_$setProp(_el$9,"fg",control().foregroundColor(),_$p))
5547
- return _el$9
5548
- }})
5549
- }),_el$8)
5555
+ _$insert(_el$7,()=>props.headerControls,null)
5556
+ _$insert(_el$7,_$createComponent(Show9,{get when(){return props.headerAction
5557
+ },children:(action)=>_$createComponent(SectionHeaderControl,{get api(){return props.api
5558
+ },get interaction(){return props.interaction
5559
+ },get action(){return action()
5560
+ },get resetWidth(){return headerWidth()
5561
+ },get position(){return{section:props.navigationSection??0,row:0,column:1
5562
+ }}})
5563
+ }),null)
5564
+ _$insert(_el$7,_$createComponent(Show9,{get when(){return props.summary
5565
+ },get children(){var _el$8=_$createElement("text")
5550
5566
  _$setProp(_el$8,"wrapMode","none")
5551
5567
  _$setProp(_el$8,"truncate",true)
5552
5568
  _$setProp(_el$8,"height",1)
@@ -5557,6 +5573,8 @@ _v$5!==_p$.t&&(_p$.t=_$setProp(_el$8,"flexShrink",_v$5,_p$.t))
5557
5573
  return _p$
5558
5574
  },{e:undefined,t:undefined
5559
5575
  })
5576
+ return _el$8
5577
+ }}),null)
5560
5578
  return _el$7
5561
5579
  })()]
5562
5580
  }}),null)
@@ -5851,8 +5869,8 @@ return _el$5
5851
5869
  function createSidebarBookmark(input){const{api,interaction,row,position,favorite,disabled,onToggle
5852
5870
  }=input
5853
5871
  const id=`${input.id}.favorite`
5854
- const [rowHovered,setRowHovered]=createSignal23(false)
5855
- const [controlHovered,setControlHovered]=createSignal23(false)
5872
+ const [rowHovered,setRowHovered]=createSignal24(false)
5873
+ const [controlHovered,setControlHovered]=createSignal24(false)
5856
5874
  const control=useSidebarItem(api,interaction,{id,position:()=>({...position(),column:0
5857
5875
  }),disabled,activate:()=>{onToggle()
5858
5876
  queueMicrotask(()=>interaction?.select(id))
@@ -5968,7 +5986,7 @@ return _el$2
5968
5986
  function SectionFilter(props){const icons=useIcons()
5969
5987
  let input
5970
5988
  let unregisterInput
5971
- const [inputFocused,setInputFocused]=createSignal24(false)
5989
+ const [inputFocused,setInputFocused]=createSignal25(false)
5972
5990
  const theme=()=>props.api.theme.current
5973
5991
  const item=useSidebarItem(props.api,props.interaction,{id:props.id??`filter.${props.placeholder}`,position:()=>props.position??{section:0,row:0,column:0
5974
5992
  },activate:()=>{if(!input)
@@ -6098,7 +6116,7 @@ return _el$
6098
6116
  }})
6099
6117
  }
6100
6118
  function McpSection(props){const icons=useIcons()
6101
- const [query,setQuery]=createSignal25("")
6119
+ const [query,setQuery]=createSignal26("")
6102
6120
  const model=createMcpSectionModel(props,query)
6103
6121
  const navigationSection=()=>props.navigationSection??6
6104
6122
  const summary=createMemo13(()=>`${model.active()}/${model.list().length}${model.errors() ? ` \xB7 ${model.errors()} ${icons.icon("error")}` : ""}`)
@@ -6186,6 +6204,9 @@ return _$createComponent(SectionWithHeaderAction,{get api(){return props.api
6186
6204
 
6187
6205
 
6188
6206
 
6207
+
6208
+
6209
+
6189
6210
 
6190
6211
 
6191
6212
 
@@ -6238,7 +6259,7 @@ _$insert(_el$2,()=>props.action.label)
6238
6259
  _$effect((_$p)=>_$setProp(_el$2,"fg",row.foregroundColor(),_$p))
6239
6260
  return _el$2
6240
6261
  })()
6241
- },get metadata(){return _$createComponent(Show18,{get when(){return visibleShortcut()
6262
+ },get metadata(){return _$createComponent(Show20,{get when(){return visibleShortcut()
6242
6263
  },children:(value)=>(()=>{var _el$3=_$createElement("text")
6243
6264
  _$setProp(_el$3,"flexShrink",0)
6244
6265
  _$setProp(_el$3,"wrapMode","none")
@@ -6247,7 +6268,7 @@ _$effect((_$p)=>_$setProp(_el$3,"fg",row.focused()?row.foregroundColor():theme()
6247
6268
  return _el$3
6248
6269
  })()
6249
6270
  })
6250
- },get details(){return _$createComponent(Show18,{get when(){return props.disabled
6271
+ },get details(){return _$createComponent(Show20,{get when(){return props.disabled
6251
6272
  },children:(reason)=>(()=>{var _el$4=_$createElement("text")
6252
6273
  _$setProp(_el$4,"wrapMode","word")
6253
6274
  _$insert(_el$4,reason)
@@ -6275,7 +6296,7 @@ return _$createComponent(Section,{get api(){return props.api
6275
6296
  },onToggle:()=>props.preferences.toggleSectionExpanded("quick_actions"),get children(){return [_$createComponent(SidebarRowList,{get api(){return props.api
6276
6297
  },get interaction(){return props.interaction
6277
6298
  },get density(){return props.preferences.rowDensity?.()??"compact"
6278
- },get children(){return [_$createComponent(Show19,{get when(){return actions().length===0
6299
+ },get children(){return [_$createComponent(Show21,{get when(){return actions().length===0
6279
6300
  },get children(){var _el$=_$createElement("text")
6280
6301
  _$insertNode(_el$,_$createTextNode(`No quick actions selected`))
6281
6302
  _$effect((_$p)=>_$setProp(_el$,"fg",props.api.theme.current.textMuted,_$p))
@@ -6522,7 +6543,7 @@ _$insert(_el$,_$createComponent(SectionFilter,{get api(){return props.api
6522
6543
  }},get query(){return query()
6523
6544
  },placeholder:"Filter skills...",onInput:setQuery
6524
6545
  }),null)
6525
- _$insert(_el$,_$createComponent(Show20,{get when(){return model.filtered().length>0
6546
+ _$insert(_el$,_$createComponent(Show22,{get when(){return model.filtered().length>0
6526
6547
  },get fallback(){return(()=>{var _el$2=_$createElement("text")
6527
6548
  _$insertNode(_el$2,_$createTextNode(`No matching skills`))
6528
6549
  _$effect((_$p)=>_$setProp(_el$2,"fg",props.api.theme.current.textMuted,_$p))
@@ -6533,7 +6554,7 @@ return _el$2
6533
6554
  },get grouped(){return model.grouped
6534
6555
  },get density(){return props.preferences.rowDensity?.()??"compact"
6535
6556
  },get children(){return _$createComponent(For16,{get each(){return model.visibility.visible()
6536
- },children:(item,index)=>[_$createComponent(Show20,{get when(){return _$memo(()=>!!model.grouped())()&&(index()===0||model.visibility.visible()[index()-1]?.bucket!==item.bucket)
6557
+ },children:(item,index)=>[_$createComponent(Show22,{get when(){return _$memo(()=>!!model.grouped())()&&(index()===0||model.visibility.visible()[index()-1]?.bucket!==item.bucket)
6537
6558
  },get children(){var _el$4=_$createElement("text")
6538
6559
  _$setProp(_el$4,"height",1)
6539
6560
  _$setProp(_el$4,"wrapMode","none")
@@ -6660,7 +6681,7 @@ return()=>_c$()?`${props.item.run.startedBeforeObservation ? `${icons.icon("rece
6660
6681
  _$effect((_$p)=>_$setProp(_el$3,"fg",row.focused()?row.foregroundColor():theme().textMuted,_$p))
6661
6682
  return _el$3
6662
6683
  })()
6663
- },get details(){return [_$createComponent(Show21,{get when(){return props.item.run?.errorMessage
6684
+ },get details(){return [_$createComponent(Show23,{get when(){return props.item.run?.errorMessage
6664
6685
  },get children(){var _el$4=_$createElement("text"),_el$5=_$createTextNode(`: `)
6665
6686
  _$insertNode(_el$4,_el$5)
6666
6687
  _$setProp(_el$4,"wrapMode","word")
@@ -6668,12 +6689,12 @@ _$insert(_el$4,()=>cancelled()?"Cancelled":"Error",_el$5)
6668
6689
  _$insert(_el$4,()=>props.item.run?.errorMessage,null)
6669
6690
  _$effect((_$p)=>_$setProp(_el$4,"fg",row.focused()?row.foregroundColor():failed()?theme().error:theme().textMuted,_$p))
6670
6691
  return _el$4
6671
- }}),_$createComponent(Show21,{get when(){return props.item.unavailable
6692
+ }}),_$createComponent(Show23,{get when(){return props.item.unavailable
6672
6693
  },get children(){var _el$6=_$createElement("text")
6673
6694
  _$insertNode(_el$6,_$createTextNode(`Worker status unavailable`))
6674
6695
  _$effect((_$p)=>_$setProp(_el$6,"fg",theme().warning,_$p))
6675
6696
  return _el$6
6676
- }}),_$createComponent(Show21,{get when(){return _$memo(()=>props.item.status.type==="retry")()?props.item.status:undefined
6697
+ }}),_$createComponent(Show23,{get when(){return _$memo(()=>props.item.status.type==="retry")()?props.item.status:undefined
6677
6698
  },children:(status)=>(()=>{var _el$0=_$createElement("text"),_el$1=_$createTextNode(`Retry #`),_el$10=_$createTextNode(` \xB7 `),_el$11=_$createTextNode(`s \xB7 `)
6678
6699
  _$insertNode(_el$0,_el$1)
6679
6700
  _$insertNode(_el$0,_el$10)
@@ -6685,7 +6706,7 @@ _$insert(_el$0,()=>status().message,null)
6685
6706
  _$effect((_$p)=>_$setProp(_el$0,"fg",row.focused()?row.foregroundColor():theme().warning,_$p))
6686
6707
  return _el$0
6687
6708
  })()
6688
- }),_$createComponent(Show21,{get when(){return _$memo(()=>!!idle())()&&!props.item.run?.errorMessage
6709
+ }),_$createComponent(Show23,{get when(){return _$memo(()=>!!idle())()&&!props.item.run?.errorMessage
6689
6710
  },get children(){var _el$8=_$createElement("text")
6690
6711
  _$insertNode(_el$8,_$createTextNode(`Finished`))
6691
6712
  _$effect((_$p)=>_$setProp(_el$8,"fg",theme().textMuted,_$p))
@@ -6701,7 +6722,7 @@ function SubagentList(props){return _$createComponent(SidebarRowList,{get api(){
6701
6722
  const item=()=>props.itemById(id)??initial
6702
6723
  const startsGroup=()=>index()===0||props.visible[index()-1]?.group!==item().group
6703
6724
  return(()=>{var _el$=_$createElement("box")
6704
- _$insert(_el$,_$createComponent(Show22,{get when(){return startsGroup()
6725
+ _$insert(_el$,_$createComponent(Show24,{get when(){return startsGroup()
6705
6726
  },get children(){var _el$2=_$createElement("text"),_el$3=_$createElement("b")
6706
6727
  _$insertNode(_el$2,_el$3)
6707
6728
  _$insert(_el$3,()=>item().group)
@@ -6727,7 +6748,7 @@ return _$createComponent(Section,{get api(){return props.api
6727
6748
  },sectionId:`${PLUGIN_ID}.section.subagents`,get navigationSection(){return navigationSection()
6728
6749
  },title:"SUBAGENTS",section:"subagents",get summary(){return `${model.list().length} active \xB7 ${model.recent().length} recent`
6729
6750
  },get open(){return props.preferences.expanded().subagents
6730
- },onToggle:()=>props.preferences.toggleSectionExpanded("subagents"),get children(){return [_$createComponent(Show23,{get when(){return model.parentID()
6751
+ },onToggle:()=>props.preferences.toggleSectionExpanded("subagents"),get children(){return [_$createComponent(Show25,{get when(){return model.parentID()
6731
6752
  },children:(id)=>_$createComponent(McpBulkAction,{get api(){return props.api
6732
6753
  },get interaction(){return props.interaction
6733
6754
  },id:`${PLUGIN_ID}.subagents.parent`,get position(){return{section:navigationSection(),row:1,column:0
@@ -6761,7 +6782,7 @@ _$insert(_el$2,_$createComponent(For18,{get each(){return model.tabs()
6761
6782
  },onActivate:()=>model.setMode(value)
6762
6783
  })
6763
6784
  }))
6764
- _$insert(_el$,_$createComponent(Show23,{get when(){return model.filtered().length===0
6785
+ _$insert(_el$,_$createComponent(Show25,{get when(){return model.filtered().length===0
6765
6786
  },get children(){var _el$3=_$createElement("text")
6766
6787
  _$insertNode(_el$3,_$createTextNode(`No matching subagents`))
6767
6788
  _$effect((_$p)=>_$setProp(_el$3,"fg",props.api.theme.current.textMuted,_$p))
@@ -6845,7 +6866,7 @@ _$insert(_el$2,()=>icons.icon(done()?"done":active()?"busy":cancelled()?"close":
6845
6866
  _$setProp(_el$3,"flexGrow",1)
6846
6867
  _$setProp(_el$3,"wrapMode","word")
6847
6868
  _$insert(_el$3,()=>props.item.content)
6848
- _$insert(_el$,_$createComponent(Show24,{get when(){return props.item.priority==="high"||props.item.priority==="medium"||props.item.priority==="low"
6869
+ _$insert(_el$,_$createComponent(Show26,{get when(){return props.item.priority==="high"||props.item.priority==="medium"||props.item.priority==="low"
6849
6870
  },get children(){var _el$4=_$createElement("text"),_el$5=_$createElement("b"),_el$6=_$createTextNode(` `)
6850
6871
  _$insertNode(_el$4,_el$5)
6851
6872
  _$setProp(_el$4,"width",2)
@@ -6881,7 +6902,7 @@ _$insert(_el$2,_$createComponent(For19,{each:["all","active","finished"],childre
6881
6902
  },onActivate:()=>props.setMode(value)
6882
6903
  })
6883
6904
  }))
6884
- _$insert(_el$,_$createComponent(Show25,{get when(){return props.view.rows.length>0
6905
+ _$insert(_el$,_$createComponent(Show27,{get when(){return props.view.rows.length>0
6885
6906
  },get fallback(){return _$createComponent(EmptyTodo,{get api(){return props.api
6886
6907
  },get mode(){return props.mode
6887
6908
  }})
@@ -6891,7 +6912,7 @@ _$insert(_el$,_$createComponent(Show25,{get when(){return props.view.rows.length
6891
6912
  },get children(){return _$createComponent(For19,{get each(){return props.visibility.visible()
6892
6913
  },children:(row,index)=>{const startsGroup=()=>index()===0||props.visibility.visible()[index()-1].group!==row.group
6893
6914
  return(()=>{var _el$3=_$createElement("box")
6894
- _$insert(_el$3,_$createComponent(Show25,{get when(){return startsGroup()
6915
+ _$insert(_el$3,_$createComponent(Show27,{get when(){return startsGroup()
6895
6916
  },get children(){var _el$4=_$createElement("text"),_el$5=_$createElement("b")
6896
6917
  _$insertNode(_el$4,_el$5)
6897
6918
  _$insert(_el$5,()=>row.group)
@@ -6928,7 +6949,7 @@ return _el$6
6928
6949
 
6929
6950
 
6930
6951
  function TodoGuidanceControl(props){const state=()=>props.controller.guidance(props.sessionID)
6931
- return _$createComponent(Show26,{get when(){return state().available
6952
+ return _$createComponent(Show28,{get when(){return state().available
6932
6953
  },get children(){var _el$=_$createElement("box")
6933
6954
  _$insert(_el$,_$createComponent(SectionTab,{get api(){return props.api
6934
6955
  },get interaction(){return props.interaction
@@ -6938,7 +6959,7 @@ _$insert(_el$,_$createComponent(SectionTab,{get api(){return props.api
6938
6959
  },get disabled(){return state().saving
6939
6960
  },onActivate:()=>void props.controller.setGuidance(props.sessionID,!state().enabled)
6940
6961
  }),null)
6941
- _$insert(_el$,_$createComponent(Show26,{get when(){return state().error
6962
+ _$insert(_el$,_$createComponent(Show28,{get when(){return state().error
6942
6963
  },children:(message)=>(()=>{var _el$2=_$createElement("text")
6943
6964
  _$setProp(_el$2,"wrapMode","word")
6944
6965
  _$insert(_el$2,message)
@@ -6976,10 +6997,10 @@ return _$createComponent(Section,{get api(){return props.api
6976
6997
  },sectionId:`${PLUGIN_ID}.section.todo`,get navigationSection(){return navigationSection()
6977
6998
  },title:"TODO",section:"todo",get summary(){return _$memo(()=>!!(unavailable()||managed()?.missing(props.sessionID)))()?"\u2014":`${view().counts.completed}/${list().length}`
6978
6999
  },get open(){return props.preferences.expanded().todo
6979
- },onToggle:()=>props.preferences.toggleSectionExpanded("todo"),get children(){return _$createComponent(Show27,{get when(){return unavailable()
7000
+ },onToggle:()=>props.preferences.toggleSectionExpanded("todo"),get children(){return _$createComponent(Show29,{get when(){return unavailable()
6980
7001
  },get fallback(){return(()=>{var _el$=_$createElement("box")
6981
7002
  _$setProp(_el$,"gap",1)
6982
- _$insert(_el$,_$createComponent(Show27,{get when(){return managed()?.guidance(props.sessionID).available
7003
+ _$insert(_el$,_$createComponent(Show29,{get when(){return managed()?.guidance(props.sessionID).available
6983
7004
  },get children(){return _$createComponent(TodoGuidanceControl,{get api(){return props.api
6984
7005
  },get controller(){return managed()
6985
7006
  },get sessionID(){return props.sessionID
@@ -6987,7 +7008,7 @@ _$insert(_el$,_$createComponent(Show27,{get when(){return managed()?.guidance(pr
6987
7008
  },get navigationSection(){return navigationSection()
6988
7009
  }})
6989
7010
  }}),null)
6990
- _$insert(_el$,_$createComponent(Show27,{get when(){return managed()?.missing(props.sessionID)
7011
+ _$insert(_el$,_$createComponent(Show29,{get when(){return managed()?.missing(props.sessionID)
6991
7012
  },get fallback(){return _$createComponent(SectionRequestBody,{get api(){return props.api
6992
7013
  },get interaction(){return props.interaction
6993
7014
  },id:`${PLUGIN_ID}.retry.todo`,get position(){return{section:navigationSection(),row:1,column:0
@@ -7131,7 +7152,7 @@ _$setProp(_el$2,"flexDirection","row")
7131
7152
  _$setProp(_el$2,"justifyContent","space-between")
7132
7153
  _$setProp(_el$2,"gap",1)
7133
7154
  _$setProp(_el$3,"flexGrow",1)
7134
- _$insert(_el$3,_$createComponent(Show28,{get when(){return props.preferences.showSessionTitle()
7155
+ _$insert(_el$3,_$createComponent(Show30,{get when(){return props.preferences.showSessionTitle()
7135
7156
  },get children(){var _el$4=_$createElement("text"),_el$5=_$createElement("b")
7136
7157
  _$insertNode(_el$4,_el$5)
7137
7158
  _$setProp(_el$4,"wrapMode","word")
@@ -7139,7 +7160,7 @@ _$insert(_el$5,()=>props.title)
7139
7160
  _$effect((_$p)=>_$setProp(_el$4,"fg",theme().text,_$p))
7140
7161
  return _el$4
7141
7162
  }}),null)
7142
- _$insert(_el$3,_$createComponent(Show28,{get when(){return _$memo(()=>!!props.preferences.showSessionDate())()&&created()
7163
+ _$insert(_el$3,_$createComponent(Show30,{get when(){return _$memo(()=>!!props.preferences.showSessionDate())()&&created()
7143
7164
  },children:(value)=>(()=>{var _el$6=_$createElement("text")
7144
7165
  _$insert(_el$6,value)
7145
7166
  _$effect((_$p)=>_$setProp(_el$6,"fg",theme().textMuted,_$p))
@@ -7405,7 +7426,7 @@ function createV2UI(context){let dialogOpen=false
7405
7426
  function DialogPrompt(props){let active=true
7406
7427
  onCleanup26(()=>{active=false
7407
7428
  })
7408
- onMount8(async ()=>{const value=await context.ui.dialog.prompt({title:props.title,placeholder:props.placeholder,value:props.value
7429
+ onMount7(async ()=>{const value=await context.ui.dialog.prompt({title:props.title,placeholder:props.placeholder,value:props.value
7409
7430
  })
7410
7431
  if(!active)
7411
7432
  return
@@ -7419,7 +7440,7 @@ return _$createElement("box")
7419
7440
  function DialogConfirm(props){let active=true
7420
7441
  onCleanup26(()=>{active=false
7421
7442
  })
7422
- onMount8(async ()=>{const confirmed=await context.ui.dialog.confirm({title:props.title,message:props.message
7443
+ onMount7(async ()=>{const confirmed=await context.ui.dialog.confirm({title:props.title,message:props.message
7423
7444
  })
7424
7445
  if(!active)
7425
7446
  return
@@ -7564,8 +7585,8 @@ const preferences=createPreferencesController(api,config,createPreferencesStore(
7564
7585
  const limitsPath=import.meta.url.includes("/dist/tui.js")?"./provider-limits.js":"../provider-limits"
7565
7586
  const limitsModule=await import(limitsPath)
7566
7587
  const LimitsSection=limitsModule.ProviderLimitsSection
7567
- const{controller:limits,codex,accountSource,selectModel,capabilities
7568
- }=limitsModule.createProviderQuotaIntegration(api,preferences,"0.21.0",hostContext)
7588
+ const{controller:limits,codex,accountSource,selectModel,modelSelection
7589
+ }=limitsModule.createProviderQuotaIntegration(api,preferences,"0.21.2",hostContext)
7569
7590
  const mcp=createMcpController(api,preferences.persistMcp,preferences)
7570
7591
  const interaction=createSidebarInteraction(api,()=>openKeyboardHelp(api,preferences.lspIconStyle,preferences.cornerFont))
7571
7592
  const startup=createStartupSessionController(api,preferences)
@@ -7593,7 +7614,7 @@ api.slots.register({order:100,slots:{app(){return _$createComponent(IconProvider
7593
7614
  },interaction,skills,subagents,mcp
7594
7615
  }),_$createComponent(FirstRunWizardPersistence,{api,preferences
7595
7616
  }),_$createComponent(StartupSessionBinding,{api,controller:startup
7596
- }),_$createComponent(UpgradeNotesBinding,{api,preferences,version:"0.21.0"
7617
+ }),_$createComponent(UpgradeNotesBinding,{api,preferences,version:"0.21.2"
7597
7618
  }),_$createComponent(McpPersistence,{api,controller:mcp
7598
7619
  })]
7599
7620
  }})
@@ -7606,7 +7627,7 @@ api.slots.register({order:100,slots:{app(){return _$createComponent(IconProvider
7606
7627
  },sidebar_content(_context,props){return _$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7607
7628
  },get multilineCorners(){return preferences.cornerFont
7608
7629
  },get children(){return _$createComponent(SidebarContent,{api,get onNewSession(){return startup.handleNewSession
7609
- },mcp,limitsSection:(navigationSection)=>_$createComponent(LimitsSection,{api,preferences,interaction,controller:limits,codex,capabilities,navigationSection
7630
+ },mcp,limitsSection:(navigationSection)=>_$createComponent(LimitsSection,{api,preferences,interaction,controller:limits,codex,modelSelection,navigationSection
7610
7631
  }),todo,subagents,skills,preferences,interaction,get sessionID(){return props.session_id
7611
7632
  }})
7612
7633
  }})
@@ -7624,12 +7645,12 @@ throw result.error
7624
7645
  }
7625
7646
  return result.data?.type==="text"?result.data.content:undefined
7626
7647
  })
7627
- const versionStatus=createVersionStatus(api,"0.21.0")
7628
- const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.21.0"))
7648
+ const versionStatus=createVersionStatus(api,"0.21.2")
7649
+ const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.21.2"))
7629
7650
  api.slots.register({order:90,slots:{sidebar_footer(_context,props){return _$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7630
7651
  },get multilineCorners(){return preferences.cornerFont
7631
7652
  },get children(){return _$createComponent(VersionFooter,{api,get sessionID(){return props.session_id
7632
- },navigatorVersion:"0.21.0",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7653
+ },navigatorVersion:"0.21.2",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7633
7654
  },get onNavigatorUpdate(){return versionUpdates.navigator
7634
7655
  }})
7635
7656
  }})
@@ -7643,15 +7664,15 @@ return
7643
7664
  return new TextDecoder().decode(await context.client.file.read({location:context.location,path:".opencode/navigator.json"
7644
7665
  }))
7645
7666
  },todo,context)
7646
- const versionStatus=createVersionStatus(adapter.api,"0.21.0")
7647
- const versionUpdates=createVersionUpdateActions(adapter.api,versionStatus,createOpenCodeV2VersionUpdater(context),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.21.0"))
7667
+ const versionStatus=createVersionStatus(adapter.api,"0.21.2")
7668
+ const versionUpdates=createVersionUpdateActions(adapter.api,versionStatus,createOpenCodeV2VersionUpdater(context),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.21.2"))
7648
7669
  const disposeFooter=context.ui.slot({append:"sidebar.footer",render:()=>_$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7649
7670
  },get multilineCorners(){return preferences.cornerFont
7650
7671
  },get children(){var _el$=_$createElement("box")
7651
7672
  _$setProp(_el$,"flexDirection","row")
7652
7673
  _$setProp(_el$,"justifyContent","space-between")
7653
7674
  _$insert(_el$,_$createComponent(VersionSummary,{get api(){return adapter.api
7654
- },navigatorVersion:"0.21.0",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7675
+ },navigatorVersion:"0.21.2",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7655
7676
  },get onNavigatorUpdate(){return versionUpdates.navigator
7656
7677
  }}),null)
7657
7678
  _$insert(_el$,_$createComponent(SettingsFooterButton,{get api(){return adapter.api
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "opencode-navigator",
4
- "version": "0.21.0",
4
+ "version": "0.21.2",
5
5
  "description": "Search, navigate, and manage OpenCode sessions from the TUI",
6
6
  "type": "module",
7
7
  "packageManager": "bun@1.4.2",