iosm-cli 0.2.1 → 0.2.3
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 +61 -0
- package/README.md +8 -7
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +2 -3
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/models-dev-provider-catalog.d.ts +30 -0
- package/dist/core/models-dev-provider-catalog.d.ts.map +1 -0
- package/dist/core/models-dev-provider-catalog.js +118 -0
- package/dist/core/models-dev-provider-catalog.js.map +1 -0
- package/dist/core/models-dev-providers.d.ts +12 -0
- package/dist/core/models-dev-providers.d.ts.map +1 -0
- package/dist/core/models-dev-providers.js +736 -0
- package/dist/core/models-dev-providers.js.map +1 -0
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +62 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +3 -11
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts +13 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +89 -27
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +13 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +261 -21
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/docs/configuration.md +4 -1
- package/docs/getting-started.md +2 -2
- package/docs/interactive-mode.md +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models-dev-providers.js","sourceRoot":"","sources":["../../src/core/models-dev-providers.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Snapshot of models.dev providers used by OpenCode provider auth flow.\n * Source: https://models.dev/api.json\n * Generated: 2026-03-11T19:28:51.239Z\n */\n\nexport interface ModelsDevProviderInfo {\n\tid: string;\n\tname: string;\n\tenv: readonly string[];\n}\n\nexport const MODELS_DEV_PROVIDERS: readonly ModelsDevProviderInfo[] = [\n {\n \"id\": \"302ai\",\n \"name\": \"302.AI\",\n \"env\": [\n \"302AI_API_KEY\"\n ]\n },\n {\n \"id\": \"abacus\",\n \"name\": \"Abacus\",\n \"env\": [\n \"ABACUS_API_KEY\"\n ]\n },\n {\n \"id\": \"aihubmix\",\n \"name\": \"AIHubMix\",\n \"env\": [\n \"AIHUBMIX_API_KEY\"\n ]\n },\n {\n \"id\": \"alibaba\",\n \"name\": \"Alibaba\",\n \"env\": [\n \"DASHSCOPE_API_KEY\"\n ]\n },\n {\n \"id\": \"alibaba-cn\",\n \"name\": \"Alibaba (China)\",\n \"env\": [\n \"DASHSCOPE_API_KEY\"\n ]\n },\n {\n \"id\": \"alibaba-coding-plan\",\n \"name\": \"Alibaba Coding Plan\",\n \"env\": [\n \"ALIBABA_CODING_PLAN_API_KEY\"\n ]\n },\n {\n \"id\": \"alibaba-coding-plan-cn\",\n \"name\": \"Alibaba Coding Plan (China)\",\n \"env\": [\n \"ALIBABA_CODING_PLAN_API_KEY\"\n ]\n },\n {\n \"id\": \"amazon-bedrock\",\n \"name\": \"Amazon Bedrock\",\n \"env\": [\n \"AWS_ACCESS_KEY_ID\",\n \"AWS_SECRET_ACCESS_KEY\",\n \"AWS_REGION\",\n \"AWS_BEARER_TOKEN_BEDROCK\"\n ]\n },\n {\n \"id\": \"anthropic\",\n \"name\": \"Anthropic\",\n \"env\": [\n \"ANTHROPIC_API_KEY\"\n ]\n },\n {\n \"id\": \"azure\",\n \"name\": \"Azure\",\n \"env\": [\n \"AZURE_RESOURCE_NAME\",\n \"AZURE_API_KEY\"\n ]\n },\n {\n \"id\": \"azure-cognitive-services\",\n \"name\": \"Azure Cognitive Services\",\n \"env\": [\n \"AZURE_COGNITIVE_SERVICES_RESOURCE_NAME\",\n \"AZURE_COGNITIVE_SERVICES_API_KEY\"\n ]\n },\n {\n \"id\": \"bailing\",\n \"name\": \"Bailing\",\n \"env\": [\n \"BAILING_API_TOKEN\"\n ]\n },\n {\n \"id\": \"baseten\",\n \"name\": \"Baseten\",\n \"env\": [\n \"BASETEN_API_KEY\"\n ]\n },\n {\n \"id\": \"berget\",\n \"name\": \"Berget.AI\",\n \"env\": [\n \"BERGET_API_KEY\"\n ]\n },\n {\n \"id\": \"cerebras\",\n \"name\": \"Cerebras\",\n \"env\": [\n \"CEREBRAS_API_KEY\"\n ]\n },\n {\n \"id\": \"chutes\",\n \"name\": \"Chutes\",\n \"env\": [\n \"CHUTES_API_KEY\"\n ]\n },\n {\n \"id\": \"clarifai\",\n \"name\": \"Clarifai\",\n \"env\": [\n \"CLARIFAI_PAT\"\n ]\n },\n {\n \"id\": \"cloudferro-sherlock\",\n \"name\": \"CloudFerro Sherlock\",\n \"env\": [\n \"CLOUDFERRO_SHERLOCK_API_KEY\"\n ]\n },\n {\n \"id\": \"cloudflare-ai-gateway\",\n \"name\": \"Cloudflare AI Gateway\",\n \"env\": [\n \"CLOUDFLARE_API_TOKEN\",\n \"CLOUDFLARE_ACCOUNT_ID\",\n \"CLOUDFLARE_GATEWAY_ID\"\n ]\n },\n {\n \"id\": \"cloudflare-workers-ai\",\n \"name\": \"Cloudflare Workers AI\",\n \"env\": [\n \"CLOUDFLARE_ACCOUNT_ID\",\n \"CLOUDFLARE_API_KEY\"\n ]\n },\n {\n \"id\": \"cohere\",\n \"name\": \"Cohere\",\n \"env\": [\n \"COHERE_API_KEY\"\n ]\n },\n {\n \"id\": \"cortecs\",\n \"name\": \"Cortecs\",\n \"env\": [\n \"CORTECS_API_KEY\"\n ]\n },\n {\n \"id\": \"drun\",\n \"name\": \"D.Run (China)\",\n \"env\": [\n \"DRUN_API_KEY\"\n ]\n },\n {\n \"id\": \"deepinfra\",\n \"name\": \"Deep Infra\",\n \"env\": [\n \"DEEPINFRA_API_KEY\"\n ]\n },\n {\n \"id\": \"deepseek\",\n \"name\": \"DeepSeek\",\n \"env\": [\n \"DEEPSEEK_API_KEY\"\n ]\n },\n {\n \"id\": \"evroc\",\n \"name\": \"evroc\",\n \"env\": [\n \"EVROC_API_KEY\"\n ]\n },\n {\n \"id\": \"fastrouter\",\n \"name\": \"FastRouter\",\n \"env\": [\n \"FASTROUTER_API_KEY\"\n ]\n },\n {\n \"id\": \"fireworks-ai\",\n \"name\": \"Fireworks AI\",\n \"env\": [\n \"FIREWORKS_API_KEY\"\n ]\n },\n {\n \"id\": \"firmware\",\n \"name\": \"Firmware\",\n \"env\": [\n \"FIRMWARE_API_KEY\"\n ]\n },\n {\n \"id\": \"friendli\",\n \"name\": \"Friendli\",\n \"env\": [\n \"FRIENDLI_TOKEN\"\n ]\n },\n {\n \"id\": \"github-copilot\",\n \"name\": \"GitHub Copilot\",\n \"env\": [\n \"GITHUB_TOKEN\"\n ]\n },\n {\n \"id\": \"github-models\",\n \"name\": \"GitHub Models\",\n \"env\": [\n \"GITHUB_TOKEN\"\n ]\n },\n {\n \"id\": \"gitlab\",\n \"name\": \"GitLab Duo\",\n \"env\": [\n \"GITLAB_TOKEN\"\n ]\n },\n {\n \"id\": \"google\",\n \"name\": \"Google\",\n \"env\": [\n \"GOOGLE_GENERATIVE_AI_API_KEY\",\n \"GEMINI_API_KEY\"\n ]\n },\n {\n \"id\": \"groq\",\n \"name\": \"Groq\",\n \"env\": [\n \"GROQ_API_KEY\"\n ]\n },\n {\n \"id\": \"helicone\",\n \"name\": \"Helicone\",\n \"env\": [\n \"HELICONE_API_KEY\"\n ]\n },\n {\n \"id\": \"huggingface\",\n \"name\": \"Hugging Face\",\n \"env\": [\n \"HF_TOKEN\"\n ]\n },\n {\n \"id\": \"iflowcn\",\n \"name\": \"iFlow\",\n \"env\": [\n \"IFLOW_API_KEY\"\n ]\n },\n {\n \"id\": \"inception\",\n \"name\": \"Inception\",\n \"env\": [\n \"INCEPTION_API_KEY\"\n ]\n },\n {\n \"id\": \"inference\",\n \"name\": \"Inference\",\n \"env\": [\n \"INFERENCE_API_KEY\"\n ]\n },\n {\n \"id\": \"io-net\",\n \"name\": \"IO.NET\",\n \"env\": [\n \"IOINTELLIGENCE_API_KEY\"\n ]\n },\n {\n \"id\": \"jiekou\",\n \"name\": \"Jiekou.AI\",\n \"env\": [\n \"JIEKOU_API_KEY\"\n ]\n },\n {\n \"id\": \"kilo\",\n \"name\": \"Kilo Gateway\",\n \"env\": [\n \"KILO_API_KEY\"\n ]\n },\n {\n \"id\": \"kimi-for-coding\",\n \"name\": \"Kimi For Coding\",\n \"env\": [\n \"KIMI_API_KEY\"\n ]\n },\n {\n \"id\": \"kuae-cloud-coding-plan\",\n \"name\": \"KUAE Cloud Coding Plan\",\n \"env\": [\n \"KUAE_API_KEY\"\n ]\n },\n {\n \"id\": \"llama\",\n \"name\": \"Llama\",\n \"env\": [\n \"LLAMA_API_KEY\"\n ]\n },\n {\n \"id\": \"lmstudio\",\n \"name\": \"LMStudio\",\n \"env\": [\n \"LMSTUDIO_API_KEY\"\n ]\n },\n {\n \"id\": \"lucidquery\",\n \"name\": \"LucidQuery AI\",\n \"env\": [\n \"LUCIDQUERY_API_KEY\"\n ]\n },\n {\n \"id\": \"meganova\",\n \"name\": \"Meganova\",\n \"env\": [\n \"MEGANOVA_API_KEY\"\n ]\n },\n {\n \"id\": \"minimax\",\n \"name\": \"MiniMax (minimax.io)\",\n \"env\": [\n \"MINIMAX_API_KEY\"\n ]\n },\n {\n \"id\": \"minimax-cn\",\n \"name\": \"MiniMax (minimaxi.com)\",\n \"env\": [\n \"MINIMAX_API_KEY\"\n ]\n },\n {\n \"id\": \"minimax-coding-plan\",\n \"name\": \"MiniMax Coding Plan (minimax.io)\",\n \"env\": [\n \"MINIMAX_API_KEY\"\n ]\n },\n {\n \"id\": \"minimax-cn-coding-plan\",\n \"name\": \"MiniMax Coding Plan (minimaxi.com)\",\n \"env\": [\n \"MINIMAX_API_KEY\"\n ]\n },\n {\n \"id\": \"mistral\",\n \"name\": \"Mistral\",\n \"env\": [\n \"MISTRAL_API_KEY\"\n ]\n },\n {\n \"id\": \"moark\",\n \"name\": \"Moark\",\n \"env\": [\n \"MOARK_API_KEY\"\n ]\n },\n {\n \"id\": \"modelscope\",\n \"name\": \"ModelScope\",\n \"env\": [\n \"MODELSCOPE_API_KEY\"\n ]\n },\n {\n \"id\": \"moonshotai\",\n \"name\": \"Moonshot AI\",\n \"env\": [\n \"MOONSHOT_API_KEY\"\n ]\n },\n {\n \"id\": \"moonshotai-cn\",\n \"name\": \"Moonshot AI (China)\",\n \"env\": [\n \"MOONSHOT_API_KEY\"\n ]\n },\n {\n \"id\": \"morph\",\n \"name\": \"Morph\",\n \"env\": [\n \"MORPH_API_KEY\"\n ]\n },\n {\n \"id\": \"nano-gpt\",\n \"name\": \"NanoGPT\",\n \"env\": [\n \"NANO_GPT_API_KEY\"\n ]\n },\n {\n \"id\": \"nebius\",\n \"name\": \"Nebius Token Factory\",\n \"env\": [\n \"NEBIUS_API_KEY\"\n ]\n },\n {\n \"id\": \"nova\",\n \"name\": \"Nova\",\n \"env\": [\n \"NOVA_API_KEY\"\n ]\n },\n {\n \"id\": \"novita-ai\",\n \"name\": \"NovitaAI\",\n \"env\": [\n \"NOVITA_API_KEY\"\n ]\n },\n {\n \"id\": \"nvidia\",\n \"name\": \"Nvidia\",\n \"env\": [\n \"NVIDIA_API_KEY\"\n ]\n },\n {\n \"id\": \"ollama-cloud\",\n \"name\": \"Ollama Cloud\",\n \"env\": [\n \"OLLAMA_API_KEY\"\n ]\n },\n {\n \"id\": \"openai\",\n \"name\": \"OpenAI\",\n \"env\": [\n \"OPENAI_API_KEY\"\n ]\n },\n {\n \"id\": \"opencode-go\",\n \"name\": \"OpenCode Go\",\n \"env\": [\n \"OPENCODE_API_KEY\"\n ]\n },\n {\n \"id\": \"opencode\",\n \"name\": \"OpenCode Zen\",\n \"env\": [\n \"OPENCODE_API_KEY\"\n ]\n },\n {\n \"id\": \"openrouter\",\n \"name\": \"OpenRouter\",\n \"env\": [\n \"OPENROUTER_API_KEY\"\n ]\n },\n {\n \"id\": \"ovhcloud\",\n \"name\": \"OVHcloud AI Endpoints\",\n \"env\": [\n \"OVHCLOUD_API_KEY\"\n ]\n },\n {\n \"id\": \"perplexity\",\n \"name\": \"Perplexity\",\n \"env\": [\n \"PERPLEXITY_API_KEY\"\n ]\n },\n {\n \"id\": \"perplexity-agent\",\n \"name\": \"Perplexity Agent\",\n \"env\": [\n \"PERPLEXITY_API_KEY\"\n ]\n },\n {\n \"id\": \"poe\",\n \"name\": \"Poe\",\n \"env\": [\n \"POE_API_KEY\"\n ]\n },\n {\n \"id\": \"privatemode-ai\",\n \"name\": \"Privatemode AI\",\n \"env\": [\n \"PRIVATEMODE_API_KEY\",\n \"PRIVATEMODE_ENDPOINT\"\n ]\n },\n {\n \"id\": \"qihang-ai\",\n \"name\": \"QiHang\",\n \"env\": [\n \"QIHANG_API_KEY\"\n ]\n },\n {\n \"id\": \"qiniu-ai\",\n \"name\": \"Qiniu\",\n \"env\": [\n \"QINIU_API_KEY\"\n ]\n },\n {\n \"id\": \"requesty\",\n \"name\": \"Requesty\",\n \"env\": [\n \"REQUESTY_API_KEY\"\n ]\n },\n {\n \"id\": \"sap-ai-core\",\n \"name\": \"SAP AI Core\",\n \"env\": [\n \"AICORE_SERVICE_KEY\"\n ]\n },\n {\n \"id\": \"scaleway\",\n \"name\": \"Scaleway\",\n \"env\": [\n \"SCALEWAY_API_KEY\"\n ]\n },\n {\n \"id\": \"siliconflow\",\n \"name\": \"SiliconFlow\",\n \"env\": [\n \"SILICONFLOW_API_KEY\"\n ]\n },\n {\n \"id\": \"siliconflow-cn\",\n \"name\": \"SiliconFlow (China)\",\n \"env\": [\n \"SILICONFLOW_CN_API_KEY\"\n ]\n },\n {\n \"id\": \"stackit\",\n \"name\": \"STACKIT\",\n \"env\": [\n \"STACKIT_API_KEY\"\n ]\n },\n {\n \"id\": \"stepfun\",\n \"name\": \"StepFun\",\n \"env\": [\n \"STEPFUN_API_KEY\"\n ]\n },\n {\n \"id\": \"submodel\",\n \"name\": \"submodel\",\n \"env\": [\n \"SUBMODEL_INSTAGEN_ACCESS_KEY\"\n ]\n },\n {\n \"id\": \"synthetic\",\n \"name\": \"Synthetic\",\n \"env\": [\n \"SYNTHETIC_API_KEY\"\n ]\n },\n {\n \"id\": \"togetherai\",\n \"name\": \"Together AI\",\n \"env\": [\n \"TOGETHER_API_KEY\"\n ]\n },\n {\n \"id\": \"upstage\",\n \"name\": \"Upstage\",\n \"env\": [\n \"UPSTAGE_API_KEY\"\n ]\n },\n {\n \"id\": \"v0\",\n \"name\": \"v0\",\n \"env\": [\n \"V0_API_KEY\"\n ]\n },\n {\n \"id\": \"venice\",\n \"name\": \"Venice AI\",\n \"env\": [\n \"VENICE_API_KEY\"\n ]\n },\n {\n \"id\": \"vercel\",\n \"name\": \"Vercel AI Gateway\",\n \"env\": [\n \"AI_GATEWAY_API_KEY\"\n ]\n },\n {\n \"id\": \"google-vertex\",\n \"name\": \"Vertex\",\n \"env\": [\n \"GOOGLE_VERTEX_PROJECT\",\n \"GOOGLE_VERTEX_LOCATION\",\n \"GOOGLE_APPLICATION_CREDENTIALS\"\n ]\n },\n {\n \"id\": \"google-vertex-anthropic\",\n \"name\": \"Vertex (Anthropic)\",\n \"env\": [\n \"GOOGLE_VERTEX_PROJECT\",\n \"GOOGLE_VERTEX_LOCATION\",\n \"GOOGLE_APPLICATION_CREDENTIALS\"\n ]\n },\n {\n \"id\": \"vivgrid\",\n \"name\": \"Vivgrid\",\n \"env\": [\n \"VIVGRID_API_KEY\"\n ]\n },\n {\n \"id\": \"vultr\",\n \"name\": \"Vultr\",\n \"env\": [\n \"VULTR_API_KEY\"\n ]\n },\n {\n \"id\": \"wandb\",\n \"name\": \"Weights & Biases\",\n \"env\": [\n \"WANDB_API_KEY\"\n ]\n },\n {\n \"id\": \"xai\",\n \"name\": \"xAI\",\n \"env\": [\n \"XAI_API_KEY\"\n ]\n },\n {\n \"id\": \"xiaomi\",\n \"name\": \"Xiaomi\",\n \"env\": [\n \"XIAOMI_API_KEY\"\n ]\n },\n {\n \"id\": \"zai\",\n \"name\": \"Z.AI\",\n \"env\": [\n \"ZHIPU_API_KEY\"\n ]\n },\n {\n \"id\": \"zai-coding-plan\",\n \"name\": \"Z.AI Coding Plan\",\n \"env\": [\n \"ZHIPU_API_KEY\"\n ]\n },\n {\n \"id\": \"zenmux\",\n \"name\": \"ZenMux\",\n \"env\": [\n \"ZENMUX_API_KEY\"\n ]\n },\n {\n \"id\": \"zhipuai\",\n \"name\": \"Zhipu AI\",\n \"env\": [\n \"ZHIPU_API_KEY\"\n ]\n },\n {\n \"id\": \"zhipuai-coding-plan\",\n \"name\": \"Zhipu AI Coding Plan\",\n \"env\": [\n \"ZHIPU_API_KEY\"\n ]\n }\n] as const;\n"]}
|
package/dist/core/sdk.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/core/sdk.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC3F,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/core/sdk.ts"],"names":[],"mappings":"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"}
|
package/dist/core/sdk.js
CHANGED
|
@@ -6,6 +6,7 @@ import { AgentSession } from "./agent-session.js";
|
|
|
6
6
|
import { AuthStorage } from "./auth-storage.js";
|
|
7
7
|
import { DEFAULT_THINKING_LEVEL } from "./defaults.js";
|
|
8
8
|
import { convertToLlm } from "./messages.js";
|
|
9
|
+
import { loadModelsDevProviderCatalog } from "./models-dev-provider-catalog.js";
|
|
9
10
|
import { ModelRegistry } from "./model-registry.js";
|
|
10
11
|
import { findInitialModel } from "./model-resolver.js";
|
|
11
12
|
import { DefaultResourceLoader } from "./resource-loader.js";
|
|
@@ -46,6 +47,61 @@ function resolveModelBySpecifier(modelRegistry, specifier, preferredProvider) {
|
|
|
46
47
|
}
|
|
47
48
|
return all[0];
|
|
48
49
|
}
|
|
50
|
+
function resolveModelsDevApi(modelNpm) {
|
|
51
|
+
const npm = modelNpm?.toLowerCase() ?? "";
|
|
52
|
+
if (npm.includes("anthropic"))
|
|
53
|
+
return "anthropic-messages";
|
|
54
|
+
if (npm.includes("google-vertex"))
|
|
55
|
+
return "google-vertex";
|
|
56
|
+
if (npm.includes("google"))
|
|
57
|
+
return "google-generative-ai";
|
|
58
|
+
if (npm.includes("amazon-bedrock"))
|
|
59
|
+
return "bedrock-converse-stream";
|
|
60
|
+
if (npm.includes("mistral"))
|
|
61
|
+
return "mistral-conversations";
|
|
62
|
+
if (npm.includes("@ai-sdk/openai") && !npm.includes("compatible"))
|
|
63
|
+
return "openai-responses";
|
|
64
|
+
return "openai-completions";
|
|
65
|
+
}
|
|
66
|
+
function buildModelsDevProviderConfig(providerInfo) {
|
|
67
|
+
const baseUrl = providerInfo.api ?? providerInfo.models.find((model) => !!model.api)?.api;
|
|
68
|
+
if (!baseUrl)
|
|
69
|
+
return undefined;
|
|
70
|
+
if (providerInfo.models.length === 0)
|
|
71
|
+
return undefined;
|
|
72
|
+
const models = providerInfo.models.map((model) => ({
|
|
73
|
+
id: model.id,
|
|
74
|
+
name: model.name,
|
|
75
|
+
api: resolveModelsDevApi(model.npm ?? providerInfo.npm),
|
|
76
|
+
reasoning: model.reasoning,
|
|
77
|
+
input: [...model.input],
|
|
78
|
+
cost: model.cost,
|
|
79
|
+
contextWindow: model.contextWindow,
|
|
80
|
+
maxTokens: model.maxTokens,
|
|
81
|
+
headers: Object.keys(model.headers).length > 0 ? model.headers : undefined,
|
|
82
|
+
}));
|
|
83
|
+
return {
|
|
84
|
+
baseUrl,
|
|
85
|
+
models,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
async function hydrateProviderModelFromModelsDev(modelRegistry, providerId, modelId) {
|
|
89
|
+
if (modelRegistry.find(providerId, modelId))
|
|
90
|
+
return;
|
|
91
|
+
try {
|
|
92
|
+
const catalog = await loadModelsDevProviderCatalog();
|
|
93
|
+
const providerInfo = catalog.get(providerId);
|
|
94
|
+
if (!providerInfo)
|
|
95
|
+
return;
|
|
96
|
+
const config = buildModelsDevProviderConfig(providerInfo);
|
|
97
|
+
if (!config)
|
|
98
|
+
return;
|
|
99
|
+
modelRegistry.registerProvider(providerId, config);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// Best-effort hydration only; keep startup resilient when catalog/network is unavailable.
|
|
103
|
+
}
|
|
104
|
+
}
|
|
49
105
|
/**
|
|
50
106
|
* Create an AgentSession with the specified options.
|
|
51
107
|
*
|
|
@@ -107,6 +163,7 @@ export async function createAgentSession(options = {}) {
|
|
|
107
163
|
const requireExplicitModelSelection = options.requireExplicitModelSelection === true;
|
|
108
164
|
// If session has data, try to restore model from it
|
|
109
165
|
if (!model && hasExistingSession && existingSession.model) {
|
|
166
|
+
await hydrateProviderModelFromModelsDev(modelRegistry, existingSession.model.provider, existingSession.model.modelId);
|
|
110
167
|
const restoredModel = modelRegistry.find(existingSession.model.provider, existingSession.model.modelId);
|
|
111
168
|
if (restoredModel && (await modelRegistry.getApiKey(restoredModel))) {
|
|
112
169
|
model = restoredModel;
|
|
@@ -117,6 +174,11 @@ export async function createAgentSession(options = {}) {
|
|
|
117
174
|
}
|
|
118
175
|
// If still no model, use findInitialModel unless explicit selection is required.
|
|
119
176
|
if (!model && !requireExplicitModelSelection) {
|
|
177
|
+
const defaultProvider = settingsManager.getDefaultProvider();
|
|
178
|
+
const defaultModelId = settingsManager.getDefaultModel();
|
|
179
|
+
if (defaultProvider && defaultModelId) {
|
|
180
|
+
await hydrateProviderModelFromModelsDev(modelRegistry, defaultProvider, defaultModelId);
|
|
181
|
+
}
|
|
120
182
|
const result = await findInitialModel({
|
|
121
183
|
scopedModels: options.scopedModels ?? [],
|
|
122
184
|
isContinuing: hasExistingSession,
|
package/dist/core/sdk.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/core/sdk.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport { Agent, type AgentMessage, type ThinkingLevel } from \"@mariozechner/pi-agent-core\";\nimport type { Message, Model } from \"@mariozechner/pi-ai\";\nimport { getAgentDir, getDocsPath } from \"../config.js\";\nimport { createAskUserTool } from \"./ask-user-tool.js\";\nimport { AgentSession } from \"./agent-session.js\";\nimport { AuthStorage } from \"./auth-storage.js\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.js\";\nimport type { ExtensionRunner, LoadExtensionsResult, ToolDefinition } from \"./extensions/index.js\";\nimport { convertToLlm } from \"./messages.js\";\nimport { ModelRegistry } from \"./model-registry.js\";\nimport { findInitialModel } from \"./model-resolver.js\";\nimport type { ResourceLoader } from \"./resource-loader.js\";\nimport { DefaultResourceLoader } from \"./resource-loader.js\";\nimport { SessionManager } from \"./session-manager.js\";\nimport { SettingsManager } from \"./settings-manager.js\";\nimport type { SharedMemoryContext } from \"./shared-memory.js\";\nimport { loadCustomSubagents, resolveCustomSubagentReference } from \"./subagents.js\";\nimport { time } from \"./timings.js\";\nimport { createSharedMemoryReadTool, createSharedMemoryWriteTool } from \"./tools/shared-memory.js\";\nimport { patchAgentForParallelTaskExecution } from \"./parallel-task-agent.js\";\nimport {\n\tallTools,\n\tastGrepTool,\n\tbashTool,\n\tcodingTools,\n\tcombyTool,\n\tcreateAstGrepTool,\n\tcreateBashTool,\n\tcreateCodingTools,\n\tcreateCombyTool,\n\tcreateEditTool,\n\tcreateFdTool,\n\tcreateFindTool,\n\tcreateGrepTool,\n\tcreateJqTool,\n\tcreateLsTool,\n\tcreateReadOnlyTools,\n\tcreateReadTool,\n\tcreateRgTool,\n\tcreateSedTool,\n\tcreateSemgrepTool,\n\tcreateSemanticSearchTool,\n\tcreateTaskTool,\n\tcreateToolsFromNames,\n\tcreateWriteTool,\n\teditTool,\n\tfdTool,\n\tfindTool,\n\tgrepTool,\n\tjqTool,\n\tlsTool,\n\treadOnlyTools,\n\treadTool,\n\trgTool,\n\tsedTool,\n\tsemanticSearchTool,\n\tsemgrepTool,\n\ttodoReadTool,\n\ttodoWriteTool,\n\ttype TaskToolProgress,\n\ttype TaskToolProgressPhase,\n\ttype Tool,\n\ttype ToolName,\n\tyqTool,\n\tcreateYqTool,\n\twriteTool,\n} from \"./tools/index.js\";\nimport { getAgentProfile, type AgentProfileName } from \"./agent-profiles.js\";\n\nexport interface CreateAgentSessionOptions {\n\t/** Working directory for project-local discovery. Default: process.cwd() */\n\tcwd?: string;\n\t/** Global config directory. Default: ~/.iosm/agent */\n\tagentDir?: string;\n\n\t/** Auth storage for credentials. Default: AuthStorage.create(agentDir/auth.json) */\n\tauthStorage?: AuthStorage;\n\t/** Model registry. Default: new ModelRegistry(authStorage, agentDir/models.json) */\n\tmodelRegistry?: ModelRegistry;\n\n\t/** Model to use. Default: from settings, else first available */\n\tmodel?: Model<any>;\n\t/** Require explicit model selection by the user; disables automatic model fallback/selection for new sessions. */\n\trequireExplicitModelSelection?: boolean;\n\t/** Thinking level. Default: from settings, else 'medium' (clamped to model capabilities) */\n\tthinkingLevel?: ThinkingLevel;\n\t/** Models available for cycling (Ctrl+P in interactive mode) */\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\n\t/** Built-in tools to use. Default: active profile tools (profile defaults to \"full\"). */\n\ttools?: Tool[];\n\t/** Custom tools to register (in addition to built-in tools). */\n\tcustomTools?: ToolDefinition[];\n\t/** Enable the interactive ask_user clarification tool. Best used in interactive or RPC sessions. */\n\tenableAskUserTool?: boolean;\n\n\t/** Resource loader. When omitted, DefaultResourceLoader is used. */\n\tresourceLoader?: ResourceLoader;\n\n\t/** Session manager. Default: SessionManager.create(cwd) */\n\tsessionManager?: SessionManager;\n\n\t/** Settings manager. Default: SettingsManager.create(cwd, agentDir) */\n\tsettingsManager?: SettingsManager;\n\n\t/**\n\t * Agent profile name. Overrides tools and thinkingLevel with profile defaults.\n\t * Profiles: explore, plan, iosm_analyst, iosm_verifier, cycle_planner, full (default).\n\t */\n\tprofile?: AgentProfileName | string;\n\n\t/**\n\t * Whether to register the Task tool (subagent spawning).\n\t * Default: true for interactive/print sessions; false for subagent sessions to avoid recursion.\n\t */\n\tenableTaskTool?: boolean;\n}\n\n/** Result from createAgentSession */\nexport interface CreateAgentSessionResult {\n\t/** The created session */\n\tsession: AgentSession;\n\t/** Extensions result (for UI context setup in interactive mode) */\n\textensionsResult: LoadExtensionsResult;\n\t/** Warning if session was restored with a different model than saved */\n\tmodelFallbackMessage?: string;\n}\n\n// Re-exports\n\nexport type {\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionContext,\n\tExtensionFactory,\n\tSlashCommandInfo,\n\tSlashCommandLocation,\n\tSlashCommandSource,\n\tToolDefinition,\n} from \"./extensions/index.js\";\nexport type { PromptTemplate } from \"./prompt-templates.js\";\nexport type { Skill } from \"./skills.js\";\nexport type { Tool } from \"./tools/index.js\";\n\n\texport {\n\t\tcreateAskUserTool,\n\t\t// Pre-built tools (use process.cwd())\n\t\treadTool,\n\t\tbashTool,\n\t\teditTool,\n\t\twriteTool,\n\t\tgrepTool,\n\t\tfindTool,\n\t\tlsTool,\n\t\trgTool,\n\t\tfdTool,\n\t\tastGrepTool,\n\t\tcombyTool,\n\t\tjqTool,\n\t\tyqTool,\n\t\tsemgrepTool,\n\t\tsedTool,\n\t\tsemanticSearchTool,\n\t\tcodingTools,\n\t\treadOnlyTools,\n\t\tallTools as allBuiltInTools,\n\t\t// Tool factories (for custom cwd)\n\t\tcreateCodingTools,\n\tcreateReadOnlyTools,\n\tcreateReadTool,\n\tcreateBashTool,\n\tcreateEditTool,\n\t\tcreateWriteTool,\n\t\tcreateGrepTool,\n\t\tcreateFindTool,\n\t\tcreateLsTool,\n\t\tcreateRgTool,\n\t\tcreateFdTool,\n\t\tcreateAstGrepTool,\n\t\tcreateCombyTool,\n\t\tcreateJqTool,\n\t\tcreateYqTool,\n\t\tcreateSemgrepTool,\n\t\tcreateSedTool,\n\t\tcreateSemanticSearchTool,\n\t};\n\n// Helper Functions\n\nfunction getDefaultAgentDir(): string {\n\treturn getAgentDir();\n}\n\nfunction resolveModelBySpecifier(\n\tmodelRegistry: ModelRegistry,\n\tspecifier: string,\n\tpreferredProvider?: string,\n): Model<any> | undefined {\n\tconst raw = specifier.trim();\n\tif (!raw) return undefined;\n\tconst slash = raw.indexOf(\"/\");\n\tif (slash > 0 && slash < raw.length - 1) {\n\t\tconst provider = raw.slice(0, slash);\n\t\tconst modelId = raw.slice(slash + 1);\n\t\treturn modelRegistry.find(provider, modelId);\n\t}\n\n\tconst all = modelRegistry.getAll().filter((candidate) => candidate.id === raw);\n\tif (all.length === 0) return undefined;\n\tif (preferredProvider) {\n\t\tconst preferred = all.find((candidate) => candidate.provider === preferredProvider);\n\t\tif (preferred) return preferred;\n\t}\n\treturn all[0];\n}\n\n/**\n * Create an AgentSession with the specified options.\n *\n * @example\n * ```typescript\n * // Minimal - uses defaults\n * const { session } = await createAgentSession();\n *\n * // With explicit model\n * import { getModel } from '@mariozechner/pi-ai';\n * const { session } = await createAgentSession({\n * model: getModel('anthropic', 'claude-opus-4-5'),\n * thinkingLevel: 'high',\n * });\n *\n * // Continue previous session\n * const { session, modelFallbackMessage } = await createAgentSession({\n * continueSession: true,\n * });\n *\n * // Full control\n * const loader = new DefaultResourceLoader({\n * cwd: process.cwd(),\n * agentDir: getAgentDir(),\n * settingsManager: SettingsManager.create(),\n * });\n * await loader.reload();\n * const { session } = await createAgentSession({\n * model: myModel,\n * tools: [readTool, bashTool],\n * resourceLoader: loader,\n * sessionManager: SessionManager.inMemory(),\n * });\n * ```\n */\nexport async function createAgentSession(options: CreateAgentSessionOptions = {}): Promise<CreateAgentSessionResult> {\n\tconst cwd = options.cwd ?? process.cwd();\n\tconst agentDir = options.agentDir ?? getDefaultAgentDir();\n\tconst contextProfile = options.profile?.toString().toLowerCase() === \"iosm\" ? \"iosm\" : \"standard\";\n\tlet resourceLoader = options.resourceLoader;\n\n\t// Use provided or create AuthStorage and ModelRegistry\n\tconst authPath = options.agentDir ? join(agentDir, \"auth.json\") : undefined;\n\tconst modelsPath = options.agentDir ? join(agentDir, \"models.json\") : undefined;\n\tconst authStorage = options.authStorage ?? AuthStorage.create(authPath);\n\tconst modelRegistry = options.modelRegistry ?? new ModelRegistry(authStorage, modelsPath);\n\n\tconst settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);\n\tconst sessionManager = options.sessionManager ?? SessionManager.create(cwd);\n\n\tif (!resourceLoader) {\n\t\tresourceLoader = new DefaultResourceLoader({ cwd, agentDir, settingsManager, contextProfile });\n\t\tawait resourceLoader.reload();\n\t\ttime(\"resourceLoader.reload\");\n\t}\n\n\t// Check if session has existing data to restore\n\tconst existingSession = sessionManager.buildSessionContext();\n\tconst hasExistingSession = existingSession.messages.length > 0;\n\tconst hasThinkingEntry = sessionManager.getBranch().some((entry) => entry.type === \"thinking_level_change\");\n\n\tlet model = options.model;\n\tlet modelFallbackMessage: string | undefined;\n\tconst requireExplicitModelSelection = options.requireExplicitModelSelection === true;\n\n\t// If session has data, try to restore model from it\n\tif (!model && hasExistingSession && existingSession.model) {\n\t\tconst restoredModel = modelRegistry.find(existingSession.model.provider, existingSession.model.modelId);\n\t\tif (restoredModel && (await modelRegistry.getApiKey(restoredModel))) {\n\t\t\tmodel = restoredModel;\n\t\t}\n\t\tif (!model) {\n\t\t\tmodelFallbackMessage = `Could not restore model ${existingSession.model.provider}/${existingSession.model.modelId}`;\n\t\t}\n\t}\n\n\t// If still no model, use findInitialModel unless explicit selection is required.\n\tif (!model && !requireExplicitModelSelection) {\n\t\tconst result = await findInitialModel({\n\t\t\tscopedModels: options.scopedModels ?? [],\n\t\t\tisContinuing: hasExistingSession,\n\t\t\tdefaultProvider: settingsManager.getDefaultProvider(),\n\t\t\tdefaultModelId: settingsManager.getDefaultModel(),\n\t\t\tdefaultThinkingLevel: settingsManager.getDefaultThinkingLevel(),\n\t\t\tmodelRegistry,\n\t\t});\n\t\tmodel = result.model;\n\t\tif (!model) {\n\t\t\tmodelFallbackMessage = `No models available. Use /login or set an API key environment variable. See ${join(getDocsPath(), \"providers.md\")}. Then use /model to select a model.`;\n\t\t} else if (modelFallbackMessage) {\n\t\t\tmodelFallbackMessage += `. Using ${model.provider}/${model.id}`;\n\t\t}\n\t} else if (!model && requireExplicitModelSelection && !hasExistingSession) {\n\t\tmodelFallbackMessage = \"No model selected. Choose one with /model or pass --provider and --model.\";\n\t}\n\n\tlet thinkingLevel = options.thinkingLevel;\n\n\t// If session has data, restore thinking level from it\n\tif (thinkingLevel === undefined && hasExistingSession) {\n\t\tthinkingLevel = hasThinkingEntry\n\t\t\t? (existingSession.thinkingLevel as ThinkingLevel)\n\t\t\t: (settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL);\n\t}\n\n\t// Fall back to settings default\n\tif (thinkingLevel === undefined) {\n\t\tthinkingLevel = settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;\n\t}\n\n\t// Clamp to model capabilities\n\tif (!model || !model.reasoning) {\n\t\tthinkingLevel = \"off\";\n\t}\n\n\t// Apply agent profile: default to \"full\" when no explicit profile is provided.\n\t// This keeps runtime tool availability aligned with UI/profile badges.\n\tconst profile = getAgentProfile(options.profile);\n\tif (profile.name !== \"full\") {\n\t\t// Profile overrides thinking level only when caller did not explicitly pass one\n\t\tif (options.thinkingLevel === undefined && !hasExistingSession) {\n\t\t\tthinkingLevel = profile.thinkingLevel;\n\t\t\t// Re-clamp to model capabilities\n\t\t\tif (!model || !model.reasoning) {\n\t\t\t\tthinkingLevel = \"off\";\n\t\t\t}\n\t\t}\n\t}\n\n\tconst enableTaskTool = options.enableTaskTool !== false; // default true\n\tconst profileToolNames: string[] = [...profile.tools, ...(enableTaskTool ? [\"task\"] : []), \"todo_write\", \"todo_read\"].filter(\n\t\t(n) => n === \"task\" || n in allTools,\n\t);\n\n\tconst initialActiveToolNames: string[] = options.tools\n\t\t? options.tools.map((t) => t.name).filter((n) => n === \"task\" || n in allTools)\n\t\t: profileToolNames;\n\n\tlet agent: Agent;\n\n\t// Create convertToLlm wrapper that filters images if blockImages is enabled (defense-in-depth)\n\tconst convertToLlmWithBlockImages = (messages: AgentMessage[]): Message[] => {\n\t\tconst converted = convertToLlm(messages);\n\t\t// Check setting dynamically so mid-session changes take effect\n\t\tif (!settingsManager.getBlockImages()) {\n\t\t\treturn converted;\n\t\t}\n\t\t// Filter out ImageContent from all messages, replacing with text placeholder\n\t\treturn converted.map((msg) => {\n\t\t\tif (msg.role === \"user\" || msg.role === \"toolResult\") {\n\t\t\t\tconst content = msg.content;\n\t\t\t\tif (Array.isArray(content)) {\n\t\t\t\t\tconst hasImages = content.some((c) => c.type === \"image\");\n\t\t\t\t\tif (hasImages) {\n\t\t\t\t\t\tconst filteredContent = content\n\t\t\t\t\t\t\t.map((c) =>\n\t\t\t\t\t\t\t\tc.type === \"image\" ? { type: \"text\" as const, text: \"Image reading is disabled.\" } : c,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t(c, i, arr) =>\n\t\t\t\t\t\t\t\t\t// Dedupe consecutive \"Image reading is disabled.\" texts\n\t\t\t\t\t\t\t\t\t!(\n\t\t\t\t\t\t\t\t\t\tc.type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\tc.text === \"Image reading is disabled.\" &&\n\t\t\t\t\t\t\t\t\t\ti > 0 &&\n\t\t\t\t\t\t\t\t\t\tarr[i - 1].type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t(arr[i - 1] as { type: \"text\"; text: string }).text === \"Image reading is disabled.\"\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\treturn { ...msg, content: filteredContent };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn msg;\n\t\t});\n\t};\n\n\tconst extensionRunnerRef: { current?: ExtensionRunner } = {};\n\n\tagent = new Agent({\n\t\tinitialState: {\n\t\t\tsystemPrompt: \"\",\n\t\t\tmodel,\n\t\t\tthinkingLevel,\n\t\t\ttools: [],\n\t\t},\n\t\tconvertToLlm: convertToLlmWithBlockImages,\n\t\tsessionId: sessionManager.getSessionId(),\n\t\ttransformContext: async (messages) => {\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner) return messages;\n\t\t\treturn runner.emitContext(messages);\n\t\t},\n\t\tsteeringMode: settingsManager.getSteeringMode(),\n\t\tfollowUpMode: settingsManager.getFollowUpMode(),\n\t\ttransport: settingsManager.getTransport(),\n\t\tthinkingBudgets: settingsManager.getThinkingBudgets(),\n\t\tmaxRetryDelayMs: settingsManager.getRetrySettings().maxDelayMs,\n\t\tgetApiKey: async (provider) => {\n\t\t\t// Use the provider argument from the in-flight request;\n\t\t\t// agent.state.model may already be switched mid-turn.\n\t\t\tconst resolvedProvider = provider || agent.state.model?.provider;\n\t\t\tif (!resolvedProvider) {\n\t\t\t\tthrow new Error(\"No model selected\");\n\t\t\t}\n\t\t\tconst key = await modelRegistry.getApiKeyForProvider(resolvedProvider);\n\t\t\tif (!key) {\n\t\t\t\tconst model = agent.state.model;\n\t\t\t\tconst isOAuth = model && modelRegistry.isUsingOAuth(model);\n\t\t\t\tif (isOAuth) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Authentication failed for \"${resolvedProvider}\". ` +\n\t\t\t\t\t\t\t`Credentials may have expired or network is unavailable. ` +\n\t\t\t\t\t\t\t`Run '/login ${resolvedProvider}' to re-authenticate.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`No API key found for \"${resolvedProvider}\". ` +\n\t\t\t\t\t\t`Set an API key environment variable or run '/login ${resolvedProvider}'.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn key;\n\t\t},\n\t});\n\tpatchAgentForParallelTaskExecution(agent);\n\n\t// Restore messages if session has existing data\n\tif (hasExistingSession) {\n\t\tagent.replaceMessages(existingSession.messages);\n\t\tif (!hasThinkingEntry) {\n\t\t\tsessionManager.appendThinkingLevelChange(thinkingLevel);\n\t\t}\n\t} else {\n\t\t// Save initial model and thinking level for new sessions so they can be restored on resume\n\t\tif (model) {\n\t\t\tsessionManager.appendModelChange(model.provider, model.id);\n\t\t}\n\t\tsessionManager.appendThinkingLevelChange(thinkingLevel);\n\t}\n\n\t// Build Task tool SubagentRunner — spawns isolated sub-sessions without circular imports\n\tconst taskToolRunner = enableTaskTool\n\t\t? async (runnerOptions: {\n\t\t\t\tsystemPrompt: string;\n\t\t\t\ttools: string[];\n\t\t\t\tprompt: string;\n\t\t\t\tcwd: string;\n\t\t\t\tmodelOverride?: string;\n\t\t\t\tsharedMemoryContext?: SharedMemoryContext;\n\t\t\t\tsignal?: AbortSignal;\n\t\t\t\tonProgress?: (progress: TaskToolProgress) => void;\n\t\t\t}): Promise<\n\t\t\t\tstring | { output: string; sessionId?: string; stats?: { toolCallsStarted: number; toolCallsCompleted: number; assistantMessages: number } }\n\t\t\t> => {\n\t\t\t\tlet subModel = model;\n\t\t\t\tif (runnerOptions.modelOverride) {\n\t\t\t\t\tconst resolved = resolveModelBySpecifier(\n\t\t\t\t\t\tmodelRegistry,\n\t\t\t\t\t\trunnerOptions.modelOverride,\n\t\t\t\t\t\tmodel?.provider,\n\t\t\t\t\t);\n\t\t\t\t\tif (!resolved) {\n\t\t\t\t\t\tthrow new Error(`Unknown model override: ${runnerOptions.modelOverride}`);\n\t\t\t\t\t}\n\t\t\t\t\tif (!(await modelRegistry.getApiKey(resolved))) {\n\t\t\t\t\t\tthrow new Error(`No API key available for model override: ${resolved.provider}/${resolved.id}`);\n\t\t\t\t\t}\n\t\t\t\t\tsubModel = resolved;\n\t\t\t\t}\n\t\t\t\tconst sharedMemoryTools: ToolDefinition[] | undefined = runnerOptions.sharedMemoryContext\n\t\t\t\t\t? [\n\t\t\t\t\t\t\tcreateSharedMemoryWriteTool(runnerOptions.sharedMemoryContext) as unknown as ToolDefinition,\n\t\t\t\t\t\t\tcreateSharedMemoryReadTool(runnerOptions.sharedMemoryContext) as unknown as ToolDefinition,\n\t\t\t\t\t\t]\n\t\t\t\t\t: undefined;\n\t\t\t\tconst { session: sub } = await createAgentSession({\n\t\t\t\t\tcwd: runnerOptions.cwd,\n\t\t\t\t\tagentDir,\n\t\t\t\t\tauthStorage,\n\t\t\t\t\tmodelRegistry,\n\t\t\t\t\tmodel: subModel,\n\t\t\t\t\ttools: createToolsFromNames(runnerOptions.cwd, runnerOptions.tools, {\n\t\t\t\t\t\tsemantic: { authStorage, agentDir },\n\t\t\t\t\t}),\n\t\t\t\t\tcustomTools: sharedMemoryTools,\n\t\t\t\t\tsessionManager: SessionManager.inMemory(),\n\t\t\t\t\tsettingsManager,\n\t\t\t\t\tenableTaskTool: false, // prevent recursive subagent spawning\n\t\t\t\t});\n\n\t\t\t\t// Apply profile system prompt by appending it to the base after session init\n\t\t\t\tif (runnerOptions.systemPrompt) {\n\t\t\t\t\tconst base = sub.agent.state.systemPrompt;\n\t\t\t\t\tsub.agent.setSystemPrompt(\n\t\t\t\t\t\tbase ? `${base}\\n\\n${runnerOptions.systemPrompt}` : runnerOptions.systemPrompt,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Collect all assistant text from the sub-session\n\t\t\t\tconst chunks: string[] = [];\n\t\t\t\tconst abortSubagent = (): void => {\n\t\t\t\t\tvoid sub.abort();\n\t\t\t\t};\n\t\t\t\tif (runnerOptions.signal?.aborted) {\n\t\t\t\t\tabortSubagent();\n\t\t\t\t\tthrow new Error(\"Operation aborted\");\n\t\t\t\t}\n\t\t\t\trunnerOptions.signal?.addEventListener(\"abort\", abortSubagent, { once: true });\n\t\t\t\tconst progressState = {\n\t\t\t\t\ttoolCallsStarted: 0,\n\t\t\t\t\ttoolCallsCompleted: 0,\n\t\t\t\t\tassistantMessages: 0,\n\t\t\t\t\tactiveTool: undefined as string | undefined,\n\t\t\t\t};\n\t\t\t\tconst trimInline = (value: string, max = 60): string => {\n\t\t\t\t\tconst compact = value.trim().replace(/\\s+/g, \" \");\n\t\t\t\t\treturn compact.length > max ? `${compact.slice(0, Math.max(1, max - 3))}...` : compact;\n\t\t\t\t};\n\t\t\t\tconst summarizeToolTarget = (toolName: string, args: unknown): string => {\n\t\t\t\t\tif (!args || typeof args !== \"object\") return `running ${toolName}`;\n\t\t\t\t\tconst record = args as Record<string, unknown>;\n\t\t\t\t\tconst filePath =\n\t\t\t\t\t\ttypeof record.file_path === \"string\"\n\t\t\t\t\t\t\t? record.file_path\n\t\t\t\t\t\t\t: typeof record.path === \"string\"\n\t\t\t\t\t\t\t\t? record.path\n\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\tif (filePath) {\n\t\t\t\t\t\treturn `running ${toolName} (${trimInline(filePath, 50)})`;\n\t\t\t\t\t}\n\t\t\t\t\tconst command =\n\t\t\t\t\t\ttypeof record.command === \"string\"\n\t\t\t\t\t\t\t? record.command\n\t\t\t\t\t\t\t: typeof record.cmd === \"string\"\n\t\t\t\t\t\t\t\t? record.cmd\n\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\tif (command) {\n\t\t\t\t\t\treturn `running ${toolName} (${trimInline(command, 50)})`;\n\t\t\t\t\t}\n\t\t\t\t\treturn `running ${toolName}`;\n\t\t\t\t};\n\t\t\t\tconst emitProgress = (phase: TaskToolProgressPhase, message: string, activeTool?: string): void => {\n\t\t\t\t\tprogressState.activeTool = activeTool;\n\t\t\t\t\trunnerOptions.onProgress?.({\n\t\t\t\t\t\tkind: \"subagent_progress\",\n\t\t\t\t\t\tphase,\n\t\t\t\t\t\tmessage,\n\t\t\t\t\t\tcwd: runnerOptions.cwd,\n\t\t\t\t\t\tactiveTool: progressState.activeTool,\n\t\t\t\t\t\ttoolCallsStarted: progressState.toolCallsStarted,\n\t\t\t\t\t\ttoolCallsCompleted: progressState.toolCallsCompleted,\n\t\t\t\t\t\tassistantMessages: progressState.assistantMessages,\n\t\t\t\t\t});\n\t\t\t\t};\n\t\t\t\temitProgress(\"starting\", \"booting subagent\", undefined);\n\n\t\t\t\ttry {\n\t\t\t\t\tsub.subscribe((event) => {\n\t\t\t\t\t\tif (event.type === \"message_end\" && event.message.role === \"assistant\") {\n\t\t\t\t\t\t\tprogressState.assistantMessages += 1;\n\t\t\t\t\t\t\tfor (const part of event.message.content) {\n\t\t\t\t\t\t\t\tif (part.type === \"text\" && part.text.trim()) {\n\t\t\t\t\t\t\t\t\tchunks.push(part.text.trim());\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (chunks.length > 0) {\n\t\t\t\t\t\t\t\temitProgress(\"responding\", \"drafting response\", undefined);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (event.type === \"tool_execution_start\") {\n\t\t\t\t\t\t\tprogressState.toolCallsStarted += 1;\n\t\t\t\t\t\t\tconst toolName = event.toolName ?? \"tool\";\n\t\t\t\t\t\t\temitProgress(\"running\", summarizeToolTarget(toolName, event.args), toolName);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (event.type === \"tool_execution_end\") {\n\t\t\t\t\t\t\tprogressState.toolCallsCompleted += 1;\n\t\t\t\t\t\t\tconst toolName = event.toolName ?? \"tool\";\n\t\t\t\t\t\t\tconst nextActive = progressState.activeTool === toolName ? undefined : progressState.activeTool;\n\t\t\t\t\t\t\temitProgress(\"running\", `completed ${toolName}`, nextActive);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tawait sub.prompt(runnerOptions.prompt, { skipIosmAutopilot: true });\n\t\t\t\t\tif (runnerOptions.signal?.aborted) {\n\t\t\t\t\t\tthrow new Error(\"Operation aborted\");\n\t\t\t\t\t}\n\t\t\t\t\temitProgress(\"responding\", \"finalizing response\", undefined);\n\t\t\t\t\tconst sessionId = sub.sessionManager.getSessionId();\n\t\t\t\t\treturn {\n\t\t\t\t\t\toutput: chunks.join(\"\\n\\n\"),\n\t\t\t\t\t\tsessionId,\n\t\t\t\t\t\tstats: {\n\t\t\t\t\t\t\ttoolCallsStarted: progressState.toolCallsStarted,\n\t\t\t\t\t\t\ttoolCallsCompleted: progressState.toolCallsCompleted,\n\t\t\t\t\t\t\tassistantMessages: progressState.assistantMessages,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t} finally {\n\t\t\t\t\trunnerOptions.signal?.removeEventListener(\"abort\", abortSubagent);\n\t\t\t\t\tsub.dispose();\n\t\t\t\t}\n\t\t\t}\n\t\t: undefined;\n\n\tlet sessionRef: AgentSession | undefined;\n\tconst initialCustomSubagents = loadCustomSubagents({ cwd, agentDir });\n\tfor (const diagnostic of initialCustomSubagents.diagnostics) {\n\t\tconsole.warn(`Warning: invalid subagent ${diagnostic.path}: ${diagnostic.message}`);\n\t}\n\tconst taskTool = taskToolRunner\n\t\t? createTaskTool(cwd, taskToolRunner, {\n\t\t\t\tresolveCustomSubagent: (name) => {\n\t\t\t\t\t// Resolve against live on-disk definitions so newly created agents\n\t\t\t\t\t// are immediately callable in the same interactive session.\n\t\t\t\t\tconst current = loadCustomSubagents({ cwd, agentDir });\n\t\t\t\t\tconst resolvedName = resolveCustomSubagentReference(name, current.agents);\n\t\t\t\t\treturn resolvedName ? current.agents.find((agent) => agent.name === resolvedName) : undefined;\n\t\t\t\t},\n\t\t\t\tavailableCustomSubagents: initialCustomSubagents.agents.map((agent) => agent.name),\n\t\t\t\tavailableCustomSubagentHints: initialCustomSubagents.agents.map((agent) => ({\n\t\t\t\t\tname: agent.name,\n\t\t\t\t\tdescription: agent.description,\n\t\t\t\t})),\n\t\t\t\tgetMetaMessages: () => sessionRef?.getMetaMessages() ?? [],\n\t\t\t})\n\t\t: undefined;\n\n\t// Wire in ask_user, task tool, and any caller-supplied custom tools\n\tconst baseCustomTools: ToolDefinition[] = [\n\t\t...(options.customTools ?? []).filter(\n\t\t\t(t) => t.name !== \"ask_user\" && t.name !== \"task\",\n\t\t),\n\t\t...(taskTool ? [taskTool as unknown as ToolDefinition] : []),\n\t];\n\n\tconst customTools: ToolDefinition[] | undefined = options.enableAskUserTool\n\t\t? [\n\t\t\t\t...baseCustomTools.filter((tool) => tool.name !== \"ask_user\"),\n\t\t\t\tcreateAskUserTool() as unknown as ToolDefinition,\n\t\t\t]\n\t\t: baseCustomTools.length > 0\n\t\t\t? baseCustomTools\n\t\t\t: options.customTools;\n\n\tconst session = new AgentSession({\n\t\tagent,\n\t\tsessionManager,\n\t\tsettingsManager,\n\t\tcwd,\n\t\tscopedModels: options.scopedModels,\n\t\tresourceLoader,\n\t\tcustomTools,\n\t\tmodelRegistry,\n\t\tinitialActiveToolNames,\n\t\textensionRunnerRef,\n\t\tsystemPromptSuffix: profile?.systemPromptAppend || undefined,\n\t\tiosmAutopilotEnabled: profile?.name === \"iosm\",\n\t});\n\tsessionRef = session;\n\tconst extensionsResult = resourceLoader.getExtensions();\n\n\treturn {\n\t\tsession,\n\t\textensionsResult,\n\t\tmodelFallbackMessage,\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/core/sdk.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport { Agent, type AgentMessage, type ThinkingLevel } from \"@mariozechner/pi-agent-core\";\nimport type { Api, Message, Model } from \"@mariozechner/pi-ai\";\nimport { getAgentDir, getDocsPath } from \"../config.js\";\nimport { createAskUserTool } from \"./ask-user-tool.js\";\nimport { AgentSession } from \"./agent-session.js\";\nimport { AuthStorage } from \"./auth-storage.js\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.js\";\nimport type { ExtensionRunner, LoadExtensionsResult, ToolDefinition } from \"./extensions/index.js\";\nimport { convertToLlm } from \"./messages.js\";\nimport { loadModelsDevProviderCatalog, type ModelsDevProviderCatalogInfo } from \"./models-dev-provider-catalog.js\";\nimport { ModelRegistry, type ProviderConfigInput } from \"./model-registry.js\";\nimport { findInitialModel } from \"./model-resolver.js\";\nimport type { ResourceLoader } from \"./resource-loader.js\";\nimport { DefaultResourceLoader } from \"./resource-loader.js\";\nimport { SessionManager } from \"./session-manager.js\";\nimport { SettingsManager } from \"./settings-manager.js\";\nimport type { SharedMemoryContext } from \"./shared-memory.js\";\nimport { loadCustomSubagents, resolveCustomSubagentReference } from \"./subagents.js\";\nimport { time } from \"./timings.js\";\nimport { createSharedMemoryReadTool, createSharedMemoryWriteTool } from \"./tools/shared-memory.js\";\nimport { patchAgentForParallelTaskExecution } from \"./parallel-task-agent.js\";\nimport {\n\tallTools,\n\tastGrepTool,\n\tbashTool,\n\tcodingTools,\n\tcombyTool,\n\tcreateAstGrepTool,\n\tcreateBashTool,\n\tcreateCodingTools,\n\tcreateCombyTool,\n\tcreateEditTool,\n\tcreateFdTool,\n\tcreateFindTool,\n\tcreateGrepTool,\n\tcreateJqTool,\n\tcreateLsTool,\n\tcreateReadOnlyTools,\n\tcreateReadTool,\n\tcreateRgTool,\n\tcreateSedTool,\n\tcreateSemgrepTool,\n\tcreateSemanticSearchTool,\n\tcreateTaskTool,\n\tcreateToolsFromNames,\n\tcreateWriteTool,\n\teditTool,\n\tfdTool,\n\tfindTool,\n\tgrepTool,\n\tjqTool,\n\tlsTool,\n\treadOnlyTools,\n\treadTool,\n\trgTool,\n\tsedTool,\n\tsemanticSearchTool,\n\tsemgrepTool,\n\ttodoReadTool,\n\ttodoWriteTool,\n\ttype TaskToolProgress,\n\ttype TaskToolProgressPhase,\n\ttype Tool,\n\ttype ToolName,\n\tyqTool,\n\tcreateYqTool,\n\twriteTool,\n} from \"./tools/index.js\";\nimport { getAgentProfile, type AgentProfileName } from \"./agent-profiles.js\";\n\nexport interface CreateAgentSessionOptions {\n\t/** Working directory for project-local discovery. Default: process.cwd() */\n\tcwd?: string;\n\t/** Global config directory. Default: ~/.iosm/agent */\n\tagentDir?: string;\n\n\t/** Auth storage for credentials. Default: AuthStorage.create(agentDir/auth.json) */\n\tauthStorage?: AuthStorage;\n\t/** Model registry. Default: new ModelRegistry(authStorage, agentDir/models.json) */\n\tmodelRegistry?: ModelRegistry;\n\n\t/** Model to use. Default: from settings, else first available */\n\tmodel?: Model<any>;\n\t/** Require explicit model selection by the user; disables automatic model fallback/selection for new sessions. */\n\trequireExplicitModelSelection?: boolean;\n\t/** Thinking level. Default: from settings, else 'medium' (clamped to model capabilities) */\n\tthinkingLevel?: ThinkingLevel;\n\t/** Models available for cycling (Ctrl+P in interactive mode) */\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\n\t/** Built-in tools to use. Default: active profile tools (profile defaults to \"full\"). */\n\ttools?: Tool[];\n\t/** Custom tools to register (in addition to built-in tools). */\n\tcustomTools?: ToolDefinition[];\n\t/** Enable the interactive ask_user clarification tool. Best used in interactive or RPC sessions. */\n\tenableAskUserTool?: boolean;\n\n\t/** Resource loader. When omitted, DefaultResourceLoader is used. */\n\tresourceLoader?: ResourceLoader;\n\n\t/** Session manager. Default: SessionManager.create(cwd) */\n\tsessionManager?: SessionManager;\n\n\t/** Settings manager. Default: SettingsManager.create(cwd, agentDir) */\n\tsettingsManager?: SettingsManager;\n\n\t/**\n\t * Agent profile name. Overrides tools and thinkingLevel with profile defaults.\n\t * Profiles: explore, plan, iosm_analyst, iosm_verifier, cycle_planner, full (default).\n\t */\n\tprofile?: AgentProfileName | string;\n\n\t/**\n\t * Whether to register the Task tool (subagent spawning).\n\t * Default: true for interactive/print sessions; false for subagent sessions to avoid recursion.\n\t */\n\tenableTaskTool?: boolean;\n}\n\n/** Result from createAgentSession */\nexport interface CreateAgentSessionResult {\n\t/** The created session */\n\tsession: AgentSession;\n\t/** Extensions result (for UI context setup in interactive mode) */\n\textensionsResult: LoadExtensionsResult;\n\t/** Warning if session was restored with a different model than saved */\n\tmodelFallbackMessage?: string;\n}\n\n// Re-exports\n\nexport type {\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionContext,\n\tExtensionFactory,\n\tSlashCommandInfo,\n\tSlashCommandLocation,\n\tSlashCommandSource,\n\tToolDefinition,\n} from \"./extensions/index.js\";\nexport type { PromptTemplate } from \"./prompt-templates.js\";\nexport type { Skill } from \"./skills.js\";\nexport type { Tool } from \"./tools/index.js\";\n\n\texport {\n\t\tcreateAskUserTool,\n\t\t// Pre-built tools (use process.cwd())\n\t\treadTool,\n\t\tbashTool,\n\t\teditTool,\n\t\twriteTool,\n\t\tgrepTool,\n\t\tfindTool,\n\t\tlsTool,\n\t\trgTool,\n\t\tfdTool,\n\t\tastGrepTool,\n\t\tcombyTool,\n\t\tjqTool,\n\t\tyqTool,\n\t\tsemgrepTool,\n\t\tsedTool,\n\t\tsemanticSearchTool,\n\t\tcodingTools,\n\t\treadOnlyTools,\n\t\tallTools as allBuiltInTools,\n\t\t// Tool factories (for custom cwd)\n\t\tcreateCodingTools,\n\tcreateReadOnlyTools,\n\tcreateReadTool,\n\tcreateBashTool,\n\tcreateEditTool,\n\t\tcreateWriteTool,\n\t\tcreateGrepTool,\n\t\tcreateFindTool,\n\t\tcreateLsTool,\n\t\tcreateRgTool,\n\t\tcreateFdTool,\n\t\tcreateAstGrepTool,\n\t\tcreateCombyTool,\n\t\tcreateJqTool,\n\t\tcreateYqTool,\n\t\tcreateSemgrepTool,\n\t\tcreateSedTool,\n\t\tcreateSemanticSearchTool,\n\t};\n\n// Helper Functions\n\nfunction getDefaultAgentDir(): string {\n\treturn getAgentDir();\n}\n\nfunction resolveModelBySpecifier(\n\tmodelRegistry: ModelRegistry,\n\tspecifier: string,\n\tpreferredProvider?: string,\n): Model<any> | undefined {\n\tconst raw = specifier.trim();\n\tif (!raw) return undefined;\n\tconst slash = raw.indexOf(\"/\");\n\tif (slash > 0 && slash < raw.length - 1) {\n\t\tconst provider = raw.slice(0, slash);\n\t\tconst modelId = raw.slice(slash + 1);\n\t\treturn modelRegistry.find(provider, modelId);\n\t}\n\n\tconst all = modelRegistry.getAll().filter((candidate) => candidate.id === raw);\n\tif (all.length === 0) return undefined;\n\tif (preferredProvider) {\n\t\tconst preferred = all.find((candidate) => candidate.provider === preferredProvider);\n\t\tif (preferred) return preferred;\n\t}\n\treturn all[0];\n}\n\nfunction resolveModelsDevApi(modelNpm?: string): Api {\n\tconst npm = modelNpm?.toLowerCase() ?? \"\";\n\tif (npm.includes(\"anthropic\")) return \"anthropic-messages\";\n\tif (npm.includes(\"google-vertex\")) return \"google-vertex\";\n\tif (npm.includes(\"google\")) return \"google-generative-ai\";\n\tif (npm.includes(\"amazon-bedrock\")) return \"bedrock-converse-stream\";\n\tif (npm.includes(\"mistral\")) return \"mistral-conversations\";\n\tif (npm.includes(\"@ai-sdk/openai\") && !npm.includes(\"compatible\")) return \"openai-responses\";\n\treturn \"openai-completions\";\n}\n\nfunction buildModelsDevProviderConfig(providerInfo: ModelsDevProviderCatalogInfo): ProviderConfigInput | undefined {\n\tconst baseUrl = providerInfo.api ?? providerInfo.models.find((model) => !!model.api)?.api;\n\tif (!baseUrl) return undefined;\n\tif (providerInfo.models.length === 0) return undefined;\n\n\tconst models: NonNullable<ProviderConfigInput[\"models\"]> = providerInfo.models.map((model) => ({\n\t\tid: model.id,\n\t\tname: model.name,\n\t\tapi: resolveModelsDevApi(model.npm ?? providerInfo.npm),\n\t\treasoning: model.reasoning,\n\t\tinput: [...model.input],\n\t\tcost: model.cost,\n\t\tcontextWindow: model.contextWindow,\n\t\tmaxTokens: model.maxTokens,\n\t\theaders: Object.keys(model.headers).length > 0 ? model.headers : undefined,\n\t}));\n\n\treturn {\n\t\tbaseUrl,\n\t\tmodels,\n\t};\n}\n\nasync function hydrateProviderModelFromModelsDev(\n\tmodelRegistry: ModelRegistry,\n\tproviderId: string,\n\tmodelId: string,\n): Promise<void> {\n\tif (modelRegistry.find(providerId, modelId)) return;\n\ttry {\n\t\tconst catalog = await loadModelsDevProviderCatalog();\n\t\tconst providerInfo = catalog.get(providerId);\n\t\tif (!providerInfo) return;\n\n\t\tconst config = buildModelsDevProviderConfig(providerInfo);\n\t\tif (!config) return;\n\n\t\tmodelRegistry.registerProvider(providerId, config);\n\t} catch {\n\t\t// Best-effort hydration only; keep startup resilient when catalog/network is unavailable.\n\t}\n}\n\n/**\n * Create an AgentSession with the specified options.\n *\n * @example\n * ```typescript\n * // Minimal - uses defaults\n * const { session } = await createAgentSession();\n *\n * // With explicit model\n * import { getModel } from '@mariozechner/pi-ai';\n * const { session } = await createAgentSession({\n * model: getModel('anthropic', 'claude-opus-4-5'),\n * thinkingLevel: 'high',\n * });\n *\n * // Continue previous session\n * const { session, modelFallbackMessage } = await createAgentSession({\n * continueSession: true,\n * });\n *\n * // Full control\n * const loader = new DefaultResourceLoader({\n * cwd: process.cwd(),\n * agentDir: getAgentDir(),\n * settingsManager: SettingsManager.create(),\n * });\n * await loader.reload();\n * const { session } = await createAgentSession({\n * model: myModel,\n * tools: [readTool, bashTool],\n * resourceLoader: loader,\n * sessionManager: SessionManager.inMemory(),\n * });\n * ```\n */\nexport async function createAgentSession(options: CreateAgentSessionOptions = {}): Promise<CreateAgentSessionResult> {\n\tconst cwd = options.cwd ?? process.cwd();\n\tconst agentDir = options.agentDir ?? getDefaultAgentDir();\n\tconst contextProfile = options.profile?.toString().toLowerCase() === \"iosm\" ? \"iosm\" : \"standard\";\n\tlet resourceLoader = options.resourceLoader;\n\n\t// Use provided or create AuthStorage and ModelRegistry\n\tconst authPath = options.agentDir ? join(agentDir, \"auth.json\") : undefined;\n\tconst modelsPath = options.agentDir ? join(agentDir, \"models.json\") : undefined;\n\tconst authStorage = options.authStorage ?? AuthStorage.create(authPath);\n\tconst modelRegistry = options.modelRegistry ?? new ModelRegistry(authStorage, modelsPath);\n\n\tconst settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);\n\tconst sessionManager = options.sessionManager ?? SessionManager.create(cwd);\n\n\tif (!resourceLoader) {\n\t\tresourceLoader = new DefaultResourceLoader({ cwd, agentDir, settingsManager, contextProfile });\n\t\tawait resourceLoader.reload();\n\t\ttime(\"resourceLoader.reload\");\n\t}\n\n\t// Check if session has existing data to restore\n\tconst existingSession = sessionManager.buildSessionContext();\n\tconst hasExistingSession = existingSession.messages.length > 0;\n\tconst hasThinkingEntry = sessionManager.getBranch().some((entry) => entry.type === \"thinking_level_change\");\n\n\tlet model = options.model;\n\tlet modelFallbackMessage: string | undefined;\n\tconst requireExplicitModelSelection = options.requireExplicitModelSelection === true;\n\n\t// If session has data, try to restore model from it\n\tif (!model && hasExistingSession && existingSession.model) {\n\t\tawait hydrateProviderModelFromModelsDev(modelRegistry, existingSession.model.provider, existingSession.model.modelId);\n\t\tconst restoredModel = modelRegistry.find(existingSession.model.provider, existingSession.model.modelId);\n\t\tif (restoredModel && (await modelRegistry.getApiKey(restoredModel))) {\n\t\t\tmodel = restoredModel;\n\t\t}\n\t\tif (!model) {\n\t\t\tmodelFallbackMessage = `Could not restore model ${existingSession.model.provider}/${existingSession.model.modelId}`;\n\t\t}\n\t}\n\n\t// If still no model, use findInitialModel unless explicit selection is required.\n\tif (!model && !requireExplicitModelSelection) {\n\t\tconst defaultProvider = settingsManager.getDefaultProvider();\n\t\tconst defaultModelId = settingsManager.getDefaultModel();\n\t\tif (defaultProvider && defaultModelId) {\n\t\t\tawait hydrateProviderModelFromModelsDev(\n\t\t\t\tmodelRegistry,\n\t\t\t\tdefaultProvider,\n\t\t\t\tdefaultModelId,\n\t\t\t);\n\t\t}\n\t\tconst result = await findInitialModel({\n\t\t\tscopedModels: options.scopedModels ?? [],\n\t\t\tisContinuing: hasExistingSession,\n\t\t\tdefaultProvider: settingsManager.getDefaultProvider(),\n\t\t\tdefaultModelId: settingsManager.getDefaultModel(),\n\t\t\tdefaultThinkingLevel: settingsManager.getDefaultThinkingLevel(),\n\t\t\tmodelRegistry,\n\t\t});\n\t\tmodel = result.model;\n\t\tif (!model) {\n\t\t\tmodelFallbackMessage = `No models available. Use /login or set an API key environment variable. See ${join(getDocsPath(), \"providers.md\")}. Then use /model to select a model.`;\n\t\t} else if (modelFallbackMessage) {\n\t\t\tmodelFallbackMessage += `. Using ${model.provider}/${model.id}`;\n\t\t}\n\t} else if (!model && requireExplicitModelSelection && !hasExistingSession) {\n\t\tmodelFallbackMessage = \"No model selected. Choose one with /model or pass --provider and --model.\";\n\t}\n\n\tlet thinkingLevel = options.thinkingLevel;\n\n\t// If session has data, restore thinking level from it\n\tif (thinkingLevel === undefined && hasExistingSession) {\n\t\tthinkingLevel = hasThinkingEntry\n\t\t\t? (existingSession.thinkingLevel as ThinkingLevel)\n\t\t\t: (settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL);\n\t}\n\n\t// Fall back to settings default\n\tif (thinkingLevel === undefined) {\n\t\tthinkingLevel = settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;\n\t}\n\n\t// Clamp to model capabilities\n\tif (!model || !model.reasoning) {\n\t\tthinkingLevel = \"off\";\n\t}\n\n\t// Apply agent profile: default to \"full\" when no explicit profile is provided.\n\t// This keeps runtime tool availability aligned with UI/profile badges.\n\tconst profile = getAgentProfile(options.profile);\n\tif (profile.name !== \"full\") {\n\t\t// Profile overrides thinking level only when caller did not explicitly pass one\n\t\tif (options.thinkingLevel === undefined && !hasExistingSession) {\n\t\t\tthinkingLevel = profile.thinkingLevel;\n\t\t\t// Re-clamp to model capabilities\n\t\t\tif (!model || !model.reasoning) {\n\t\t\t\tthinkingLevel = \"off\";\n\t\t\t}\n\t\t}\n\t}\n\n\tconst enableTaskTool = options.enableTaskTool !== false; // default true\n\tconst profileToolNames: string[] = [...profile.tools, ...(enableTaskTool ? [\"task\"] : []), \"todo_write\", \"todo_read\"].filter(\n\t\t(n) => n === \"task\" || n in allTools,\n\t);\n\n\tconst initialActiveToolNames: string[] = options.tools\n\t\t? options.tools.map((t) => t.name).filter((n) => n === \"task\" || n in allTools)\n\t\t: profileToolNames;\n\n\tlet agent: Agent;\n\n\t// Create convertToLlm wrapper that filters images if blockImages is enabled (defense-in-depth)\n\tconst convertToLlmWithBlockImages = (messages: AgentMessage[]): Message[] => {\n\t\tconst converted = convertToLlm(messages);\n\t\t// Check setting dynamically so mid-session changes take effect\n\t\tif (!settingsManager.getBlockImages()) {\n\t\t\treturn converted;\n\t\t}\n\t\t// Filter out ImageContent from all messages, replacing with text placeholder\n\t\treturn converted.map((msg) => {\n\t\t\tif (msg.role === \"user\" || msg.role === \"toolResult\") {\n\t\t\t\tconst content = msg.content;\n\t\t\t\tif (Array.isArray(content)) {\n\t\t\t\t\tconst hasImages = content.some((c) => c.type === \"image\");\n\t\t\t\t\tif (hasImages) {\n\t\t\t\t\t\tconst filteredContent = content\n\t\t\t\t\t\t\t.map((c) =>\n\t\t\t\t\t\t\t\tc.type === \"image\" ? { type: \"text\" as const, text: \"Image reading is disabled.\" } : c,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t(c, i, arr) =>\n\t\t\t\t\t\t\t\t\t// Dedupe consecutive \"Image reading is disabled.\" texts\n\t\t\t\t\t\t\t\t\t!(\n\t\t\t\t\t\t\t\t\t\tc.type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\tc.text === \"Image reading is disabled.\" &&\n\t\t\t\t\t\t\t\t\t\ti > 0 &&\n\t\t\t\t\t\t\t\t\t\tarr[i - 1].type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t(arr[i - 1] as { type: \"text\"; text: string }).text === \"Image reading is disabled.\"\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\treturn { ...msg, content: filteredContent };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn msg;\n\t\t});\n\t};\n\n\tconst extensionRunnerRef: { current?: ExtensionRunner } = {};\n\n\tagent = new Agent({\n\t\tinitialState: {\n\t\t\tsystemPrompt: \"\",\n\t\t\tmodel,\n\t\t\tthinkingLevel,\n\t\t\ttools: [],\n\t\t},\n\t\tconvertToLlm: convertToLlmWithBlockImages,\n\t\tsessionId: sessionManager.getSessionId(),\n\t\ttransformContext: async (messages) => {\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner) return messages;\n\t\t\treturn runner.emitContext(messages);\n\t\t},\n\t\tsteeringMode: settingsManager.getSteeringMode(),\n\t\tfollowUpMode: settingsManager.getFollowUpMode(),\n\t\ttransport: settingsManager.getTransport(),\n\t\tthinkingBudgets: settingsManager.getThinkingBudgets(),\n\t\tmaxRetryDelayMs: settingsManager.getRetrySettings().maxDelayMs,\n\t\tgetApiKey: async (provider) => {\n\t\t\t// Use the provider argument from the in-flight request;\n\t\t\t// agent.state.model may already be switched mid-turn.\n\t\t\tconst resolvedProvider = provider || agent.state.model?.provider;\n\t\t\tif (!resolvedProvider) {\n\t\t\t\tthrow new Error(\"No model selected\");\n\t\t\t}\n\t\t\tconst key = await modelRegistry.getApiKeyForProvider(resolvedProvider);\n\t\t\tif (!key) {\n\t\t\t\tconst model = agent.state.model;\n\t\t\t\tconst isOAuth = model && modelRegistry.isUsingOAuth(model);\n\t\t\t\tif (isOAuth) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Authentication failed for \"${resolvedProvider}\". ` +\n\t\t\t\t\t\t\t`Credentials may have expired or network is unavailable. ` +\n\t\t\t\t\t\t\t`Run '/login ${resolvedProvider}' to re-authenticate.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`No API key found for \"${resolvedProvider}\". ` +\n\t\t\t\t\t\t`Set an API key environment variable or run '/login ${resolvedProvider}'.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn key;\n\t\t},\n\t});\n\tpatchAgentForParallelTaskExecution(agent);\n\n\t// Restore messages if session has existing data\n\tif (hasExistingSession) {\n\t\tagent.replaceMessages(existingSession.messages);\n\t\tif (!hasThinkingEntry) {\n\t\t\tsessionManager.appendThinkingLevelChange(thinkingLevel);\n\t\t}\n\t} else {\n\t\t// Save initial model and thinking level for new sessions so they can be restored on resume\n\t\tif (model) {\n\t\t\tsessionManager.appendModelChange(model.provider, model.id);\n\t\t}\n\t\tsessionManager.appendThinkingLevelChange(thinkingLevel);\n\t}\n\n\t// Build Task tool SubagentRunner — spawns isolated sub-sessions without circular imports\n\tconst taskToolRunner = enableTaskTool\n\t\t? async (runnerOptions: {\n\t\t\t\tsystemPrompt: string;\n\t\t\t\ttools: string[];\n\t\t\t\tprompt: string;\n\t\t\t\tcwd: string;\n\t\t\t\tmodelOverride?: string;\n\t\t\t\tsharedMemoryContext?: SharedMemoryContext;\n\t\t\t\tsignal?: AbortSignal;\n\t\t\t\tonProgress?: (progress: TaskToolProgress) => void;\n\t\t\t}): Promise<\n\t\t\t\tstring | { output: string; sessionId?: string; stats?: { toolCallsStarted: number; toolCallsCompleted: number; assistantMessages: number } }\n\t\t\t> => {\n\t\t\t\tlet subModel = model;\n\t\t\t\tif (runnerOptions.modelOverride) {\n\t\t\t\t\tconst resolved = resolveModelBySpecifier(\n\t\t\t\t\t\tmodelRegistry,\n\t\t\t\t\t\trunnerOptions.modelOverride,\n\t\t\t\t\t\tmodel?.provider,\n\t\t\t\t\t);\n\t\t\t\t\tif (!resolved) {\n\t\t\t\t\t\tthrow new Error(`Unknown model override: ${runnerOptions.modelOverride}`);\n\t\t\t\t\t}\n\t\t\t\t\tif (!(await modelRegistry.getApiKey(resolved))) {\n\t\t\t\t\t\tthrow new Error(`No API key available for model override: ${resolved.provider}/${resolved.id}`);\n\t\t\t\t\t}\n\t\t\t\t\tsubModel = resolved;\n\t\t\t\t}\n\t\t\t\tconst sharedMemoryTools: ToolDefinition[] | undefined = runnerOptions.sharedMemoryContext\n\t\t\t\t\t? [\n\t\t\t\t\t\t\tcreateSharedMemoryWriteTool(runnerOptions.sharedMemoryContext) as unknown as ToolDefinition,\n\t\t\t\t\t\t\tcreateSharedMemoryReadTool(runnerOptions.sharedMemoryContext) as unknown as ToolDefinition,\n\t\t\t\t\t\t]\n\t\t\t\t\t: undefined;\n\t\t\t\tconst { session: sub } = await createAgentSession({\n\t\t\t\t\tcwd: runnerOptions.cwd,\n\t\t\t\t\tagentDir,\n\t\t\t\t\tauthStorage,\n\t\t\t\t\tmodelRegistry,\n\t\t\t\t\tmodel: subModel,\n\t\t\t\t\ttools: createToolsFromNames(runnerOptions.cwd, runnerOptions.tools, {\n\t\t\t\t\t\tsemantic: { authStorage, agentDir },\n\t\t\t\t\t}),\n\t\t\t\t\tcustomTools: sharedMemoryTools,\n\t\t\t\t\tsessionManager: SessionManager.inMemory(),\n\t\t\t\t\tsettingsManager,\n\t\t\t\t\tenableTaskTool: false, // prevent recursive subagent spawning\n\t\t\t\t});\n\n\t\t\t\t// Apply profile system prompt by appending it to the base after session init\n\t\t\t\tif (runnerOptions.systemPrompt) {\n\t\t\t\t\tconst base = sub.agent.state.systemPrompt;\n\t\t\t\t\tsub.agent.setSystemPrompt(\n\t\t\t\t\t\tbase ? `${base}\\n\\n${runnerOptions.systemPrompt}` : runnerOptions.systemPrompt,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Collect all assistant text from the sub-session\n\t\t\t\tconst chunks: string[] = [];\n\t\t\t\tconst abortSubagent = (): void => {\n\t\t\t\t\tvoid sub.abort();\n\t\t\t\t};\n\t\t\t\tif (runnerOptions.signal?.aborted) {\n\t\t\t\t\tabortSubagent();\n\t\t\t\t\tthrow new Error(\"Operation aborted\");\n\t\t\t\t}\n\t\t\t\trunnerOptions.signal?.addEventListener(\"abort\", abortSubagent, { once: true });\n\t\t\t\tconst progressState = {\n\t\t\t\t\ttoolCallsStarted: 0,\n\t\t\t\t\ttoolCallsCompleted: 0,\n\t\t\t\t\tassistantMessages: 0,\n\t\t\t\t\tactiveTool: undefined as string | undefined,\n\t\t\t\t};\n\t\t\t\tconst trimInline = (value: string, max = 60): string => {\n\t\t\t\t\tconst compact = value.trim().replace(/\\s+/g, \" \");\n\t\t\t\t\treturn compact.length > max ? `${compact.slice(0, Math.max(1, max - 3))}...` : compact;\n\t\t\t\t};\n\t\t\t\tconst summarizeToolTarget = (toolName: string, args: unknown): string => {\n\t\t\t\t\tif (!args || typeof args !== \"object\") return `running ${toolName}`;\n\t\t\t\t\tconst record = args as Record<string, unknown>;\n\t\t\t\t\tconst filePath =\n\t\t\t\t\t\ttypeof record.file_path === \"string\"\n\t\t\t\t\t\t\t? record.file_path\n\t\t\t\t\t\t\t: typeof record.path === \"string\"\n\t\t\t\t\t\t\t\t? record.path\n\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\tif (filePath) {\n\t\t\t\t\t\treturn `running ${toolName} (${trimInline(filePath, 50)})`;\n\t\t\t\t\t}\n\t\t\t\t\tconst command =\n\t\t\t\t\t\ttypeof record.command === \"string\"\n\t\t\t\t\t\t\t? record.command\n\t\t\t\t\t\t\t: typeof record.cmd === \"string\"\n\t\t\t\t\t\t\t\t? record.cmd\n\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\tif (command) {\n\t\t\t\t\t\treturn `running ${toolName} (${trimInline(command, 50)})`;\n\t\t\t\t\t}\n\t\t\t\t\treturn `running ${toolName}`;\n\t\t\t\t};\n\t\t\t\tconst emitProgress = (phase: TaskToolProgressPhase, message: string, activeTool?: string): void => {\n\t\t\t\t\tprogressState.activeTool = activeTool;\n\t\t\t\t\trunnerOptions.onProgress?.({\n\t\t\t\t\t\tkind: \"subagent_progress\",\n\t\t\t\t\t\tphase,\n\t\t\t\t\t\tmessage,\n\t\t\t\t\t\tcwd: runnerOptions.cwd,\n\t\t\t\t\t\tactiveTool: progressState.activeTool,\n\t\t\t\t\t\ttoolCallsStarted: progressState.toolCallsStarted,\n\t\t\t\t\t\ttoolCallsCompleted: progressState.toolCallsCompleted,\n\t\t\t\t\t\tassistantMessages: progressState.assistantMessages,\n\t\t\t\t\t});\n\t\t\t\t};\n\t\t\t\temitProgress(\"starting\", \"booting subagent\", undefined);\n\n\t\t\t\ttry {\n\t\t\t\t\tsub.subscribe((event) => {\n\t\t\t\t\t\tif (event.type === \"message_end\" && event.message.role === \"assistant\") {\n\t\t\t\t\t\t\tprogressState.assistantMessages += 1;\n\t\t\t\t\t\t\tfor (const part of event.message.content) {\n\t\t\t\t\t\t\t\tif (part.type === \"text\" && part.text.trim()) {\n\t\t\t\t\t\t\t\t\tchunks.push(part.text.trim());\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (chunks.length > 0) {\n\t\t\t\t\t\t\t\temitProgress(\"responding\", \"drafting response\", undefined);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (event.type === \"tool_execution_start\") {\n\t\t\t\t\t\t\tprogressState.toolCallsStarted += 1;\n\t\t\t\t\t\t\tconst toolName = event.toolName ?? \"tool\";\n\t\t\t\t\t\t\temitProgress(\"running\", summarizeToolTarget(toolName, event.args), toolName);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (event.type === \"tool_execution_end\") {\n\t\t\t\t\t\t\tprogressState.toolCallsCompleted += 1;\n\t\t\t\t\t\t\tconst toolName = event.toolName ?? \"tool\";\n\t\t\t\t\t\t\tconst nextActive = progressState.activeTool === toolName ? undefined : progressState.activeTool;\n\t\t\t\t\t\t\temitProgress(\"running\", `completed ${toolName}`, nextActive);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tawait sub.prompt(runnerOptions.prompt, { skipIosmAutopilot: true });\n\t\t\t\t\tif (runnerOptions.signal?.aborted) {\n\t\t\t\t\t\tthrow new Error(\"Operation aborted\");\n\t\t\t\t\t}\n\t\t\t\t\temitProgress(\"responding\", \"finalizing response\", undefined);\n\t\t\t\t\tconst sessionId = sub.sessionManager.getSessionId();\n\t\t\t\t\treturn {\n\t\t\t\t\t\toutput: chunks.join(\"\\n\\n\"),\n\t\t\t\t\t\tsessionId,\n\t\t\t\t\t\tstats: {\n\t\t\t\t\t\t\ttoolCallsStarted: progressState.toolCallsStarted,\n\t\t\t\t\t\t\ttoolCallsCompleted: progressState.toolCallsCompleted,\n\t\t\t\t\t\t\tassistantMessages: progressState.assistantMessages,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t} finally {\n\t\t\t\t\trunnerOptions.signal?.removeEventListener(\"abort\", abortSubagent);\n\t\t\t\t\tsub.dispose();\n\t\t\t\t}\n\t\t\t}\n\t\t: undefined;\n\n\tlet sessionRef: AgentSession | undefined;\n\tconst initialCustomSubagents = loadCustomSubagents({ cwd, agentDir });\n\tfor (const diagnostic of initialCustomSubagents.diagnostics) {\n\t\tconsole.warn(`Warning: invalid subagent ${diagnostic.path}: ${diagnostic.message}`);\n\t}\n\tconst taskTool = taskToolRunner\n\t\t? createTaskTool(cwd, taskToolRunner, {\n\t\t\t\tresolveCustomSubagent: (name) => {\n\t\t\t\t\t// Resolve against live on-disk definitions so newly created agents\n\t\t\t\t\t// are immediately callable in the same interactive session.\n\t\t\t\t\tconst current = loadCustomSubagents({ cwd, agentDir });\n\t\t\t\t\tconst resolvedName = resolveCustomSubagentReference(name, current.agents);\n\t\t\t\t\treturn resolvedName ? current.agents.find((agent) => agent.name === resolvedName) : undefined;\n\t\t\t\t},\n\t\t\t\tavailableCustomSubagents: initialCustomSubagents.agents.map((agent) => agent.name),\n\t\t\t\tavailableCustomSubagentHints: initialCustomSubagents.agents.map((agent) => ({\n\t\t\t\t\tname: agent.name,\n\t\t\t\t\tdescription: agent.description,\n\t\t\t\t})),\n\t\t\t\tgetMetaMessages: () => sessionRef?.getMetaMessages() ?? [],\n\t\t\t})\n\t\t: undefined;\n\n\t// Wire in ask_user, task tool, and any caller-supplied custom tools\n\tconst baseCustomTools: ToolDefinition[] = [\n\t\t...(options.customTools ?? []).filter(\n\t\t\t(t) => t.name !== \"ask_user\" && t.name !== \"task\",\n\t\t),\n\t\t...(taskTool ? [taskTool as unknown as ToolDefinition] : []),\n\t];\n\n\tconst customTools: ToolDefinition[] | undefined = options.enableAskUserTool\n\t\t? [\n\t\t\t\t...baseCustomTools.filter((tool) => tool.name !== \"ask_user\"),\n\t\t\t\tcreateAskUserTool() as unknown as ToolDefinition,\n\t\t\t]\n\t\t: baseCustomTools.length > 0\n\t\t\t? baseCustomTools\n\t\t\t: options.customTools;\n\n\tconst session = new AgentSession({\n\t\tagent,\n\t\tsessionManager,\n\t\tsettingsManager,\n\t\tcwd,\n\t\tscopedModels: options.scopedModels,\n\t\tresourceLoader,\n\t\tcustomTools,\n\t\tmodelRegistry,\n\t\tinitialActiveToolNames,\n\t\textensionRunnerRef,\n\t\tsystemPromptSuffix: profile?.systemPromptAppend || undefined,\n\t\tiosmAutopilotEnabled: profile?.name === \"iosm\",\n\t});\n\tsessionRef = session;\n\tconst extensionsResult = resourceLoader.getExtensions();\n\n\treturn {\n\t\tsession,\n\t\textensionsResult,\n\t\tmodelFallbackMessage,\n\t};\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"footer.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/footer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAiC,MAAM,sBAAsB,CAAC;AACrF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAC;AAyDxF;;;GAGG;AACH,qBAAa,eAAgB,YAAW,SAAS;IAM/C,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,UAAU;IANnB,OAAO,CAAC,kBAAkB,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,aAAa,CAAM;gBAGlB,OAAO,EAAE,YAAY,EACrB,UAAU,EAAE,0BAA0B;IAG/C,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI7C;;;OAGG;IACH,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAInC;;;;OAIG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIvC;;;OAGG;IACH,UAAU,IAAI,IAAI;IAIlB;;;OAGG;IACH,OAAO,IAAI,IAAI;IAIf,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"footer.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/footer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAiC,MAAM,sBAAsB,CAAC;AACrF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAC;AAyDxF;;;GAGG;AACH,qBAAa,eAAgB,YAAW,SAAS;IAM/C,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,UAAU;IANnB,OAAO,CAAC,kBAAkB,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,aAAa,CAAM;gBAGlB,OAAO,EAAE,YAAY,EACrB,UAAU,EAAE,0BAA0B;IAG/C,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI7C;;;OAGG;IACH,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAInC;;;;OAIG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIvC;;;OAGG;IACH,UAAU,IAAI,IAAI;IAIlB;;;OAGG;IACH,OAAO,IAAI,IAAI;IAIf,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CA+L/B"}
|
|
@@ -203,8 +203,8 @@ export class FooterComponent {
|
|
|
203
203
|
}
|
|
204
204
|
usageParts.push(contextPercentStr);
|
|
205
205
|
let statsLeft = [...statusParts, ...usageParts].join(separator);
|
|
206
|
-
// Add model
|
|
207
|
-
const modelName = state.model
|
|
206
|
+
// Add provider/model on the right side, plus thinking level if model supports it
|
|
207
|
+
const modelName = state.model ? `${state.model.provider}/${state.model.id}` : "no-model";
|
|
208
208
|
let statsLeftWidth = visibleWidth(statsLeft);
|
|
209
209
|
// If statsLeft is too wide, truncate it
|
|
210
210
|
if (statsLeftWidth > width) {
|
|
@@ -222,15 +222,7 @@ export class FooterComponent {
|
|
|
222
222
|
? `${theme.fg("accent", modelName)}${theme.fg("muted", " • thinking off")}`
|
|
223
223
|
: `${theme.fg("accent", modelName)}${theme.fg("muted", ` • ${thinkingLevel}`)}`;
|
|
224
224
|
}
|
|
225
|
-
|
|
226
|
-
let rightSide = rightSideWithoutProvider;
|
|
227
|
-
if (this.footerData.getAvailableProviderCount() > 1 && state.model) {
|
|
228
|
-
rightSide = `${theme.fg("muted", `(${state.model.provider}) `)}${rightSideWithoutProvider}`;
|
|
229
|
-
if (statsLeftWidth + minPadding + visibleWidth(rightSide) > width) {
|
|
230
|
-
// Too wide, fall back
|
|
231
|
-
rightSide = rightSideWithoutProvider;
|
|
232
|
-
}
|
|
233
|
-
}
|
|
225
|
+
const rightSide = rightSideWithoutProvider;
|
|
234
226
|
const rightSideWidth = visibleWidth(rightSide);
|
|
235
227
|
const totalNeeded = statsLeftWidth + minPadding + rightSideWidth;
|
|
236
228
|
let statsLine;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"footer.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/footer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAkB,eAAe,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGrF,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C;;;GAGG;AACH,SAAS,kBAAkB,CAAC,IAAY;IACvC,qFAAqF;IACrF,OAAO,IAAI;SACT,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC;SACzB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,IAAI,EAAE,CAAC;AACV,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,KAAa;IAClC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1C,IAAI,KAAK,GAAG,KAAK;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1D,IAAI,KAAK,GAAG,OAAO;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC;IAC3D,IAAI,KAAK,GAAG,QAAQ;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAChE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC;AAC1C,CAAC;AAED,SAAS,KAAK,CAAC,IAAY,EAAE,KAAiD;IAC7E,OAAO,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC5E,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,GAAW;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,uCAAuC;IACvC,IAAI,OAA2B,CAAC;IAChC,IAAI,CAAC;QACJ,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC1C,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACvC,CAAC;QACF,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,qBAAqB;IACtB,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,OAAO,KAAK,GAAG,MAAM,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,eAAe;IAK3B,YACS,OAAqB,EACrB,UAAsC;QADtC,YAAO,GAAP,OAAO,CAAc;QACrB,eAAU,GAAV,UAAU,CAA4B;QANvC,uBAAkB,GAAG,IAAI,CAAC;QAC1B,aAAQ,GAAG,KAAK,CAAC;QACjB,kBAAa,GAAG,EAAE,CAAC;IAKxB,CAAC;IAEJ,qBAAqB,CAAC,OAAgB;QACrC,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC;IACnC,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,OAAgB;QAC3B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACH,gBAAgB,CAAC,OAAe;QAC/B,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,UAAU;QACT,sDAAsD;IACvD,CAAC;IAED;;;OAGG;IACH,OAAO;QACN,0CAA0C;IAC3C,CAAC;IAED,MAAM,CAAC,KAAa;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QACjC,MAAM,SAAS,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAEzC,0FAA0F;QAC1F,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,UAAU,EAAE,EAAE,CAAC;YAC9D,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACpE,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;gBACxC,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;gBAC1C,cAAc,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;gBAChD,eAAe,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;gBAClD,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;YAC7C,CAAC;QACF,CAAC;QAED,uEAAuE;QACvE,oEAAoE;QACpE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;QACpD,MAAM,aAAa,GAAG,YAAY,EAAE,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC,CAAC;QACrF,MAAM,mBAAmB,GAAG,YAAY,EAAE,OAAO,IAAI,CAAC,CAAC;QACvD,MAAM,cAAc,GAAG,YAAY,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAE7F,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,cAA2C,CAAC;QAChF,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE,EAAE,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAE9D,gCAAgC;QAChC,IAAI,GAAG,GAAG,UAAU,CAAC;QACrB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;QACzD,IAAI,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC,CAAC;QAED,8BAA8B;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;QAC9C,IAAI,MAAM,EAAE,CAAC;YACZ,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM,GAAG,CAAC;QAC5B,CAAC;QAED,0BAA0B;QAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;QACjE,IAAI,WAAW,EAAE,CAAC;YACjB,GAAG,GAAG,GAAG,GAAG,MAAM,WAAW,EAAE,CAAC;QACjC,CAAC;QAED,MAAM,WAAW,GAAG,EAAE,CAAC;QAEvB,kFAAkF;QAClF,mFAAmF;QACnF,kFAAkF;QAClF,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC3C,CAAC;QAED,yEAAyE;QACzE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;QACtD,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YAC/B,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACrC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACP,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,IAAI,CAAC,CAAC;QAC9D,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;YACzB,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,eAAe,EAAE,EAAE,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QACjG,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC;QACpD,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACtB,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,YAAY,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;QAC7D,CAAC;QAED,mBAAmB;QACnB,MAAM,UAAU,GAAG,EAAE,CAAC;QACtB,IAAI,UAAU;YAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QACnF,IAAI,WAAW;YAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;QACrF,IAAI,cAAc;YAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,YAAY,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3F,IAAI,eAAe;YAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,YAAY,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC;QAE7F,+DAA+D;QAC/D,MAAM,iBAAiB,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACrG,IAAI,SAAS,IAAI,iBAAiB,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC/E,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC7C,CAAC;QAED,6CAA6C;QAC7C,IAAI,iBAAyB,CAAC;QAC9B,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,MAAM,qBAAqB,GAC1B,cAAc,KAAK,GAAG;YACrB,CAAC,CAAC,SAAS,YAAY,CAAC,aAAa,CAAC,GAAG,aAAa,EAAE;YACxD,CAAC,CAAC,OAAO,cAAc,KAAK,YAAY,CAAC,aAAa,CAAC,GAAG,aAAa,EAAE,CAAC;QAC5E,IAAI,mBAAmB,GAAG,EAAE,EAAE,CAAC;YAC9B,iBAAiB,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;QAC9D,CAAC;aAAM,IAAI,mBAAmB,GAAG,EAAE,EAAE,CAAC;YACrC,iBAAiB,GAAG,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACP,iBAAiB,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;QAC9D,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAEnC,IAAI,SAAS,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEhE,6EAA6E;QAC7E,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,UAAU,CAAC;QAEhD,IAAI,cAAc,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QAE7C,wCAAwC;QACxC,IAAI,cAAc,GAAG,KAAK,EAAE,CAAC;YAC5B,SAAS,GAAG,eAAe,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YACrD,cAAc,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1C,CAAC;QAED,mFAAmF;QACnF,MAAM,UAAU,GAAG,CAAC,CAAC;QAErB,2DAA2D;QAC3D,IAAI,wBAAwB,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC5G,IAAI,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC;YAC5B,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC;YACnD,wBAAwB;gBACvB,aAAa,KAAK,KAAK;oBACtB,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,CAAC,EAAE;oBAC3E,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,aAAa,EAAE,CAAC,EAAE,CAAC;QACnF,CAAC;QAED,8FAA8F;QAC9F,IAAI,SAAS,GAAG,wBAAwB,CAAC;QACzC,IAAI,IAAI,CAAC,UAAU,CAAC,yBAAyB,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACpE,SAAS,GAAG,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,GAAG,wBAAwB,EAAE,CAAC;YAC5F,IAAI,cAAc,GAAG,UAAU,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,KAAK,EAAE,CAAC;gBACnE,sBAAsB;gBACtB,SAAS,GAAG,wBAAwB,CAAC;YACtC,CAAC;QACF,CAAC;QAED,MAAM,cAAc,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,WAAW,GAAG,cAAc,GAAG,UAAU,GAAG,cAAc,CAAC;QAEjE,IAAI,SAAiB,CAAC;QACtB,IAAI,WAAW,IAAI,KAAK,EAAE,CAAC;YAC1B,8CAA8C;YAC9C,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,cAAc,GAAG,cAAc,CAAC,CAAC;YACpE,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;QAC7C,CAAC;aAAM,CAAC;YACP,8BAA8B;YAC9B,MAAM,iBAAiB,GAAG,KAAK,GAAG,cAAc,GAAG,UAAU,CAAC;YAC9D,IAAI,iBAAiB,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,cAAc,GAAG,eAAe,CAAC,SAAS,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC;gBACzE,MAAM,mBAAmB,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;gBACzD,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,cAAc,GAAG,mBAAmB,CAAC,CAAC,CAAC;gBACtF,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,cAAc,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACP,yCAAyC;gBACzC,SAAS,GAAG,SAAS,CAAC;YACvB,CAAC;QACF,CAAC;QAED,+DAA+D;QAC/D,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;QAC7C,IAAI,OAAe,CAAC;QACpB,IAAI,UAAU,EAAE,CAAC;YAChB,+DAA+D;YAC/D,MAAM,WAAW,GAAG,IAAI,GAAG,UAAU,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC7D,MAAM,gBAAgB,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;YACnD,0DAA0D;YAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,gBAAgB,CAAC,CAAC;YAC1D,MAAM,eAAe,GAAG,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;YACnG,OAAO,GAAG,eAAe,GAAG,WAAW,CAAC;QACzC,CAAC;aAAM,CAAC;YACP,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAChF,CAAC;QACD,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAEnC,wEAAwE;QACxE,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC;QACjE,IAAI,iBAAiB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;iBAC5D,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;iBACtC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;YAC9C,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC5C,iFAAiF;YACjF,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,KAAK,CAAC;IACd,CAAC;CACD","sourcesContent":["import { existsSync, readdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { type Component, truncateToWidth, visibleWidth } from \"@mariozechner/pi-tui\";\nimport type { AgentSession } from \"../../../core/agent-session.js\";\nimport type { ReadonlyFooterDataProvider } from \"../../../core/footer-data-provider.js\";\nimport { theme } from \"../theme/theme.js\";\n\n/**\n * Sanitize text for display in a single-line status.\n * Removes newlines, tabs, carriage returns, and other control characters.\n */\nfunction sanitizeStatusText(text: string): string {\n\t// Replace newlines, tabs, carriage returns with space, then collapse multiple spaces\n\treturn text\n\t\t.replace(/[\\r\\n\\t]/g, \" \")\n\t\t.replace(/ +/g, \" \")\n\t\t.trim();\n}\n\n/**\n * Format token counts (similar to web-ui)\n */\nfunction formatTokens(count: number): string {\n\tif (count < 1000) return count.toString();\n\tif (count < 10000) return `${(count / 1000).toFixed(1)}k`;\n\tif (count < 1000000) return `${Math.round(count / 1000)}k`;\n\tif (count < 10000000) return `${(count / 1000000).toFixed(1)}M`;\n\treturn `${Math.round(count / 1000000)}M`;\n}\n\nfunction badge(text: string, color: \"accent\" | \"success\" | \"warning\" | \"muted\"): string {\n\treturn theme.fg(\"dim\", \"[\") + theme.fg(color, text) + theme.fg(\"dim\", \"]\");\n}\n\n/**\n * Detect IOSM workspace and return a compact status segment.\n * Returns empty string when no IOSM workspace is found.\n */\nfunction getIosmStatus(cwd: string): string {\n\tconst iosmDir = join(cwd, \".iosm\");\n\tif (!existsSync(iosmDir)) return \"\";\n\n\t// Try to find the most recent cycle ID\n\tlet cycleId: string | undefined;\n\ttry {\n\t\tconst cyclesDir = join(iosmDir, \"cycles\");\n\t\tif (existsSync(cyclesDir)) {\n\t\t\tconst entries = readdirSync(cyclesDir).sort();\n\t\t\tif (entries.length > 0) {\n\t\t\t\tcycleId = entries[entries.length - 1];\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Ignore read errors\n\t}\n\n\tconst label = theme.fg(\"accent\", \"iosm\");\n\tconst suffix = cycleId ? theme.fg(\"muted\", ` #${cycleId}`) : \"\";\n\treturn label + suffix;\n}\n\n/**\n * Footer component that shows pwd, token stats, and context usage.\n * Computes token/context stats from session, gets git branch and extension statuses from provider.\n */\nexport class FooterComponent implements Component {\n\tprivate autoCompactEnabled = true;\n\tprivate planMode = false;\n\tprivate activeProfile = \"\";\n\n\tconstructor(\n\t\tprivate session: AgentSession,\n\t\tprivate footerData: ReadonlyFooterDataProvider,\n\t) {}\n\n\tsetAutoCompactEnabled(enabled: boolean): void {\n\t\tthis.autoCompactEnabled = enabled;\n\t}\n\n\t/**\n\t * Toggle plan-mode badge in the status line.\n\t * When enabled, a [PLAN] badge is prepended before the session state badge.\n\t */\n\tsetPlanMode(enabled: boolean): void {\n\t\tthis.planMode = enabled;\n\t}\n\n\t/**\n\t * Set the active profile name.\n\t * When non-empty, a [profile] badge is shown in the status line so the\n\t * operator can always see the current profile, including \"full\".\n\t */\n\tsetActiveProfile(profile: string): void {\n\t\tthis.activeProfile = profile;\n\t}\n\n\t/**\n\t * No-op: git branch caching now handled by provider.\n\t * Kept for compatibility with existing call sites in interactive-mode.\n\t */\n\tinvalidate(): void {\n\t\t// No-op: git branch is cached/invalidated by provider\n\t}\n\n\t/**\n\t * Clean up resources.\n\t * Git watcher cleanup now handled by provider.\n\t */\n\tdispose(): void {\n\t\t// Git watcher cleanup handled by provider\n\t}\n\n\trender(width: number): string[] {\n\t\tconst state = this.session.state;\n\t\tconst separator = theme.fg(\"dim\", \" • \");\n\n\t\t// Calculate cumulative usage from ALL session entries (not just post-compaction messages)\n\t\tlet totalInput = 0;\n\t\tlet totalOutput = 0;\n\t\tlet totalCacheRead = 0;\n\t\tlet totalCacheWrite = 0;\n\t\tlet totalCost = 0;\n\n\t\tfor (const entry of this.session.sessionManager.getEntries()) {\n\t\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\t\ttotalInput += entry.message.usage.input;\n\t\t\t\ttotalOutput += entry.message.usage.output;\n\t\t\t\ttotalCacheRead += entry.message.usage.cacheRead;\n\t\t\t\ttotalCacheWrite += entry.message.usage.cacheWrite;\n\t\t\t\ttotalCost += entry.message.usage.cost.total;\n\t\t\t}\n\t\t}\n\n\t\t// Calculate context usage from session (handles compaction correctly).\n\t\t// After compaction, tokens are unknown until the next LLM response.\n\t\tconst contextUsage = this.session.getContextUsage();\n\t\tconst contextWindow = contextUsage?.contextWindow ?? state.model?.contextWindow ?? 0;\n\t\tconst contextPercentValue = contextUsage?.percent ?? 0;\n\t\tconst contextPercent = contextUsage?.percent !== null ? contextPercentValue.toFixed(1) : \"?\";\n\n\t\tconst sessionManager = this.session.sessionManager as { getCwd?: () => string };\n\t\tconst sessionCwd = sessionManager.getCwd?.() ?? process.cwd();\n\n\t\t// Replace home directory with ~\n\t\tlet pwd = sessionCwd;\n\t\tconst home = process.env.HOME || process.env.USERPROFILE;\n\t\tif (home && pwd.startsWith(home)) {\n\t\t\tpwd = `~${pwd.slice(home.length)}`;\n\t\t}\n\n\t\t// Add git branch if available\n\t\tconst branch = this.footerData.getGitBranch();\n\t\tif (branch) {\n\t\t\tpwd = `${pwd} (${branch})`;\n\t\t}\n\n\t\t// Add session name if set\n\t\tconst sessionName = this.session.sessionManager.getSessionName();\n\t\tif (sessionName) {\n\t\t\tpwd = `${pwd} • ${sessionName}`;\n\t\t}\n\n\t\tconst statusParts = [];\n\n\t\t// Plan-mode badge: prepended first so it is always the leftmost status indicator.\n\t\t// This placement mirrors how editors surface mode indicators (e.g. INSERT, VISUAL)\n\t\t// before the file-status indicator, giving the operator immediate mode awareness.\n\t\tif (this.planMode) {\n\t\t\tstatusParts.push(badge(\"PLAN\", \"accent\"));\n\t\t}\n\n\t\t// Profile badge is always shown when a profile is set, including \"full\".\n\t\tif (this.activeProfile) {\n\t\t\tstatusParts.push(badge(this.activeProfile, \"muted\"));\n\t\t}\n\n\t\tif (this.session.isCompacting) {\n\t\t\tstatusParts.push(badge(\"compacting\", \"warning\"));\n\t\t} else if (this.session.isStreaming) {\n\t\t\tstatusParts.push(badge(\"working\", \"accent\"));\n\t\t} else {\n\t\t\tstatusParts.push(badge(\"ready\", \"success\"));\n\t\t}\n\n\t\tconst pendingMessages = this.session.pendingMessageCount ?? 0;\n\t\tif (pendingMessages > 0) {\n\t\t\tstatusParts.push(badge(`queue ${pendingMessages}`, pendingMessages > 1 ? \"warning\" : \"accent\"));\n\t\t}\n\n\t\tconst retryAttempt = this.session.retryAttempt ?? 0;\n\t\tif (retryAttempt > 0) {\n\t\t\tstatusParts.push(badge(`retry ${retryAttempt}`, \"warning\"));\n\t\t}\n\n\t\t// Build stats line\n\t\tconst usageParts = [];\n\t\tif (totalInput) usageParts.push(theme.fg(\"muted\", `↑${formatTokens(totalInput)}`));\n\t\tif (totalOutput) usageParts.push(theme.fg(\"muted\", `↓${formatTokens(totalOutput)}`));\n\t\tif (totalCacheRead) usageParts.push(theme.fg(\"muted\", `R${formatTokens(totalCacheRead)}`));\n\t\tif (totalCacheWrite) usageParts.push(theme.fg(\"muted\", `W${formatTokens(totalCacheWrite)}`));\n\n\t\t// Show cost with \"(sub)\" indicator if using OAuth subscription\n\t\tconst usingSubscription = state.model ? this.session.modelRegistry.isUsingOAuth(state.model) : false;\n\t\tif (totalCost || usingSubscription) {\n\t\t\tconst costStr = `$${totalCost.toFixed(3)}${usingSubscription ? \" (sub)\" : \"\"}`;\n\t\t\tusageParts.push(theme.fg(\"muted\", costStr));\n\t\t}\n\n\t\t// Colorize context percentage based on usage\n\t\tlet contextPercentStr: string;\n\t\tconst autoIndicator = this.autoCompactEnabled ? \" (auto)\" : \"\";\n\t\tconst contextPercentDisplay =\n\t\t\tcontextPercent === \"?\"\n\t\t\t\t? `ctx ?/${formatTokens(contextWindow)}${autoIndicator}`\n\t\t\t\t: `ctx ${contextPercent}%/${formatTokens(contextWindow)}${autoIndicator}`;\n\t\tif (contextPercentValue > 90) {\n\t\t\tcontextPercentStr = theme.fg(\"error\", contextPercentDisplay);\n\t\t} else if (contextPercentValue > 70) {\n\t\t\tcontextPercentStr = theme.fg(\"warning\", contextPercentDisplay);\n\t\t} else {\n\t\t\tcontextPercentStr = theme.fg(\"muted\", contextPercentDisplay);\n\t\t}\n\t\tusageParts.push(contextPercentStr);\n\n\t\tlet statsLeft = [...statusParts, ...usageParts].join(separator);\n\n\t\t// Add model name on the right side, plus thinking level if model supports it\n\t\tconst modelName = state.model?.id || \"no-model\";\n\n\t\tlet statsLeftWidth = visibleWidth(statsLeft);\n\n\t\t// If statsLeft is too wide, truncate it\n\t\tif (statsLeftWidth > width) {\n\t\t\tstatsLeft = truncateToWidth(statsLeft, width, \"...\");\n\t\t\tstatsLeftWidth = visibleWidth(statsLeft);\n\t\t}\n\n\t\t// Calculate available space for padding (minimum 2 spaces between stats and model)\n\t\tconst minPadding = 2;\n\n\t\t// Add thinking level indicator if model supports reasoning\n\t\tlet rightSideWithoutProvider = state.model ? theme.fg(\"accent\", modelName) : theme.fg(\"warning\", modelName);\n\t\tif (state.model?.reasoning) {\n\t\t\tconst thinkingLevel = state.thinkingLevel || \"off\";\n\t\t\trightSideWithoutProvider =\n\t\t\t\tthinkingLevel === \"off\"\n\t\t\t\t\t? `${theme.fg(\"accent\", modelName)}${theme.fg(\"muted\", \" • thinking off\")}`\n\t\t\t\t\t: `${theme.fg(\"accent\", modelName)}${theme.fg(\"muted\", ` • ${thinkingLevel}`)}`;\n\t\t}\n\n\t\t// Prepend the provider in parentheses if there are multiple providers and there's enough room\n\t\tlet rightSide = rightSideWithoutProvider;\n\t\tif (this.footerData.getAvailableProviderCount() > 1 && state.model) {\n\t\t\trightSide = `${theme.fg(\"muted\", `(${state.model.provider}) `)}${rightSideWithoutProvider}`;\n\t\t\tif (statsLeftWidth + minPadding + visibleWidth(rightSide) > width) {\n\t\t\t\t// Too wide, fall back\n\t\t\t\trightSide = rightSideWithoutProvider;\n\t\t\t}\n\t\t}\n\n\t\tconst rightSideWidth = visibleWidth(rightSide);\n\t\tconst totalNeeded = statsLeftWidth + minPadding + rightSideWidth;\n\n\t\tlet statsLine: string;\n\t\tif (totalNeeded <= width) {\n\t\t\t// Both fit - add padding to right-align model\n\t\t\tconst padding = \" \".repeat(width - statsLeftWidth - rightSideWidth);\n\t\t\tstatsLine = statsLeft + padding + rightSide;\n\t\t} else {\n\t\t\t// Need to truncate right side\n\t\t\tconst availableForRight = width - statsLeftWidth - minPadding;\n\t\t\tif (availableForRight > 0) {\n\t\t\t\tconst truncatedRight = truncateToWidth(rightSide, availableForRight, \"\");\n\t\t\t\tconst truncatedRightWidth = visibleWidth(truncatedRight);\n\t\t\t\tconst padding = \" \".repeat(Math.max(0, width - statsLeftWidth - truncatedRightWidth));\n\t\t\t\tstatsLine = statsLeft + padding + truncatedRight;\n\t\t\t} else {\n\t\t\t\t// Not enough space for right side at all\n\t\t\t\tstatsLine = statsLeft;\n\t\t\t}\n\t\t}\n\n\t\t// Build pwd line, optionally with IOSM status segment appended\n\t\tconst iosmStatus = getIosmStatus(sessionCwd);\n\t\tlet pwdLine: string;\n\t\tif (iosmStatus) {\n\t\t\t// Assemble the IOSM segment (carries its own ANSI color codes)\n\t\t\tconst iosmSegment = \" [\" + iosmStatus + theme.fg(\"dim\", \"]\");\n\t\t\tconst iosmSegmentWidth = visibleWidth(iosmSegment);\n\t\t\t// Truncate pwd portion to leave room for the iosm segment\n\t\t\tconst maxPwdWidth = Math.max(0, width - iosmSegmentWidth);\n\t\t\tconst dimPwdTruncated = truncateToWidth(theme.fg(\"dim\", pwd), maxPwdWidth, theme.fg(\"dim\", \"...\"));\n\t\t\tpwdLine = dimPwdTruncated + iosmSegment;\n\t\t} else {\n\t\t\tpwdLine = truncateToWidth(theme.fg(\"dim\", pwd), width, theme.fg(\"dim\", \"...\"));\n\t\t}\n\t\tconst lines = [pwdLine, statsLine];\n\n\t\t// Add extension statuses on a single line, sorted by key alphabetically\n\t\tconst extensionStatuses = this.footerData.getExtensionStatuses();\n\t\tif (extensionStatuses.size > 0) {\n\t\t\tconst sortedStatuses = Array.from(extensionStatuses.entries())\n\t\t\t\t.sort(([a], [b]) => a.localeCompare(b))\n\t\t\t\t.map(([, text]) => sanitizeStatusText(text));\n\t\t\tconst statusLine = sortedStatuses.join(\" \");\n\t\t\t// Truncate to terminal width with dim ellipsis for consistency with footer style\n\t\t\tlines.push(truncateToWidth(statusLine, width, theme.fg(\"dim\", \"...\")));\n\t\t}\n\n\t\treturn lines;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"footer.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/footer.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { type Component, truncateToWidth, visibleWidth } from \"@mariozechner/pi-tui\";\nimport type { AgentSession } from \"../../../core/agent-session.js\";\nimport type { ReadonlyFooterDataProvider } from \"../../../core/footer-data-provider.js\";\nimport { theme } from \"../theme/theme.js\";\n\n/**\n * Sanitize text for display in a single-line status.\n * Removes newlines, tabs, carriage returns, and other control characters.\n */\nfunction sanitizeStatusText(text: string): string {\n\t// Replace newlines, tabs, carriage returns with space, then collapse multiple spaces\n\treturn text\n\t\t.replace(/[\\r\\n\\t]/g, \" \")\n\t\t.replace(/ +/g, \" \")\n\t\t.trim();\n}\n\n/**\n * Format token counts (similar to web-ui)\n */\nfunction formatTokens(count: number): string {\n\tif (count < 1000) return count.toString();\n\tif (count < 10000) return `${(count / 1000).toFixed(1)}k`;\n\tif (count < 1000000) return `${Math.round(count / 1000)}k`;\n\tif (count < 10000000) return `${(count / 1000000).toFixed(1)}M`;\n\treturn `${Math.round(count / 1000000)}M`;\n}\n\nfunction badge(text: string, color: \"accent\" | \"success\" | \"warning\" | \"muted\"): string {\n\treturn theme.fg(\"dim\", \"[\") + theme.fg(color, text) + theme.fg(\"dim\", \"]\");\n}\n\n/**\n * Detect IOSM workspace and return a compact status segment.\n * Returns empty string when no IOSM workspace is found.\n */\nfunction getIosmStatus(cwd: string): string {\n\tconst iosmDir = join(cwd, \".iosm\");\n\tif (!existsSync(iosmDir)) return \"\";\n\n\t// Try to find the most recent cycle ID\n\tlet cycleId: string | undefined;\n\ttry {\n\t\tconst cyclesDir = join(iosmDir, \"cycles\");\n\t\tif (existsSync(cyclesDir)) {\n\t\t\tconst entries = readdirSync(cyclesDir).sort();\n\t\t\tif (entries.length > 0) {\n\t\t\t\tcycleId = entries[entries.length - 1];\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Ignore read errors\n\t}\n\n\tconst label = theme.fg(\"accent\", \"iosm\");\n\tconst suffix = cycleId ? theme.fg(\"muted\", ` #${cycleId}`) : \"\";\n\treturn label + suffix;\n}\n\n/**\n * Footer component that shows pwd, token stats, and context usage.\n * Computes token/context stats from session, gets git branch and extension statuses from provider.\n */\nexport class FooterComponent implements Component {\n\tprivate autoCompactEnabled = true;\n\tprivate planMode = false;\n\tprivate activeProfile = \"\";\n\n\tconstructor(\n\t\tprivate session: AgentSession,\n\t\tprivate footerData: ReadonlyFooterDataProvider,\n\t) {}\n\n\tsetAutoCompactEnabled(enabled: boolean): void {\n\t\tthis.autoCompactEnabled = enabled;\n\t}\n\n\t/**\n\t * Toggle plan-mode badge in the status line.\n\t * When enabled, a [PLAN] badge is prepended before the session state badge.\n\t */\n\tsetPlanMode(enabled: boolean): void {\n\t\tthis.planMode = enabled;\n\t}\n\n\t/**\n\t * Set the active profile name.\n\t * When non-empty, a [profile] badge is shown in the status line so the\n\t * operator can always see the current profile, including \"full\".\n\t */\n\tsetActiveProfile(profile: string): void {\n\t\tthis.activeProfile = profile;\n\t}\n\n\t/**\n\t * No-op: git branch caching now handled by provider.\n\t * Kept for compatibility with existing call sites in interactive-mode.\n\t */\n\tinvalidate(): void {\n\t\t// No-op: git branch is cached/invalidated by provider\n\t}\n\n\t/**\n\t * Clean up resources.\n\t * Git watcher cleanup now handled by provider.\n\t */\n\tdispose(): void {\n\t\t// Git watcher cleanup handled by provider\n\t}\n\n\trender(width: number): string[] {\n\t\tconst state = this.session.state;\n\t\tconst separator = theme.fg(\"dim\", \" • \");\n\n\t\t// Calculate cumulative usage from ALL session entries (not just post-compaction messages)\n\t\tlet totalInput = 0;\n\t\tlet totalOutput = 0;\n\t\tlet totalCacheRead = 0;\n\t\tlet totalCacheWrite = 0;\n\t\tlet totalCost = 0;\n\n\t\tfor (const entry of this.session.sessionManager.getEntries()) {\n\t\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\t\ttotalInput += entry.message.usage.input;\n\t\t\t\ttotalOutput += entry.message.usage.output;\n\t\t\t\ttotalCacheRead += entry.message.usage.cacheRead;\n\t\t\t\ttotalCacheWrite += entry.message.usage.cacheWrite;\n\t\t\t\ttotalCost += entry.message.usage.cost.total;\n\t\t\t}\n\t\t}\n\n\t\t// Calculate context usage from session (handles compaction correctly).\n\t\t// After compaction, tokens are unknown until the next LLM response.\n\t\tconst contextUsage = this.session.getContextUsage();\n\t\tconst contextWindow = contextUsage?.contextWindow ?? state.model?.contextWindow ?? 0;\n\t\tconst contextPercentValue = contextUsage?.percent ?? 0;\n\t\tconst contextPercent = contextUsage?.percent !== null ? contextPercentValue.toFixed(1) : \"?\";\n\n\t\tconst sessionManager = this.session.sessionManager as { getCwd?: () => string };\n\t\tconst sessionCwd = sessionManager.getCwd?.() ?? process.cwd();\n\n\t\t// Replace home directory with ~\n\t\tlet pwd = sessionCwd;\n\t\tconst home = process.env.HOME || process.env.USERPROFILE;\n\t\tif (home && pwd.startsWith(home)) {\n\t\t\tpwd = `~${pwd.slice(home.length)}`;\n\t\t}\n\n\t\t// Add git branch if available\n\t\tconst branch = this.footerData.getGitBranch();\n\t\tif (branch) {\n\t\t\tpwd = `${pwd} (${branch})`;\n\t\t}\n\n\t\t// Add session name if set\n\t\tconst sessionName = this.session.sessionManager.getSessionName();\n\t\tif (sessionName) {\n\t\t\tpwd = `${pwd} • ${sessionName}`;\n\t\t}\n\n\t\tconst statusParts = [];\n\n\t\t// Plan-mode badge: prepended first so it is always the leftmost status indicator.\n\t\t// This placement mirrors how editors surface mode indicators (e.g. INSERT, VISUAL)\n\t\t// before the file-status indicator, giving the operator immediate mode awareness.\n\t\tif (this.planMode) {\n\t\t\tstatusParts.push(badge(\"PLAN\", \"accent\"));\n\t\t}\n\n\t\t// Profile badge is always shown when a profile is set, including \"full\".\n\t\tif (this.activeProfile) {\n\t\t\tstatusParts.push(badge(this.activeProfile, \"muted\"));\n\t\t}\n\n\t\tif (this.session.isCompacting) {\n\t\t\tstatusParts.push(badge(\"compacting\", \"warning\"));\n\t\t} else if (this.session.isStreaming) {\n\t\t\tstatusParts.push(badge(\"working\", \"accent\"));\n\t\t} else {\n\t\t\tstatusParts.push(badge(\"ready\", \"success\"));\n\t\t}\n\n\t\tconst pendingMessages = this.session.pendingMessageCount ?? 0;\n\t\tif (pendingMessages > 0) {\n\t\t\tstatusParts.push(badge(`queue ${pendingMessages}`, pendingMessages > 1 ? \"warning\" : \"accent\"));\n\t\t}\n\n\t\tconst retryAttempt = this.session.retryAttempt ?? 0;\n\t\tif (retryAttempt > 0) {\n\t\t\tstatusParts.push(badge(`retry ${retryAttempt}`, \"warning\"));\n\t\t}\n\n\t\t// Build stats line\n\t\tconst usageParts = [];\n\t\tif (totalInput) usageParts.push(theme.fg(\"muted\", `↑${formatTokens(totalInput)}`));\n\t\tif (totalOutput) usageParts.push(theme.fg(\"muted\", `↓${formatTokens(totalOutput)}`));\n\t\tif (totalCacheRead) usageParts.push(theme.fg(\"muted\", `R${formatTokens(totalCacheRead)}`));\n\t\tif (totalCacheWrite) usageParts.push(theme.fg(\"muted\", `W${formatTokens(totalCacheWrite)}`));\n\n\t\t// Show cost with \"(sub)\" indicator if using OAuth subscription\n\t\tconst usingSubscription = state.model ? this.session.modelRegistry.isUsingOAuth(state.model) : false;\n\t\tif (totalCost || usingSubscription) {\n\t\t\tconst costStr = `$${totalCost.toFixed(3)}${usingSubscription ? \" (sub)\" : \"\"}`;\n\t\t\tusageParts.push(theme.fg(\"muted\", costStr));\n\t\t}\n\n\t\t// Colorize context percentage based on usage\n\t\tlet contextPercentStr: string;\n\t\tconst autoIndicator = this.autoCompactEnabled ? \" (auto)\" : \"\";\n\t\tconst contextPercentDisplay =\n\t\t\tcontextPercent === \"?\"\n\t\t\t\t? `ctx ?/${formatTokens(contextWindow)}${autoIndicator}`\n\t\t\t\t: `ctx ${contextPercent}%/${formatTokens(contextWindow)}${autoIndicator}`;\n\t\tif (contextPercentValue > 90) {\n\t\t\tcontextPercentStr = theme.fg(\"error\", contextPercentDisplay);\n\t\t} else if (contextPercentValue > 70) {\n\t\t\tcontextPercentStr = theme.fg(\"warning\", contextPercentDisplay);\n\t\t} else {\n\t\t\tcontextPercentStr = theme.fg(\"muted\", contextPercentDisplay);\n\t\t}\n\t\tusageParts.push(contextPercentStr);\n\n\t\tlet statsLeft = [...statusParts, ...usageParts].join(separator);\n\n\t\t// Add provider/model on the right side, plus thinking level if model supports it\n\t\tconst modelName = state.model ? `${state.model.provider}/${state.model.id}` : \"no-model\";\n\n\t\tlet statsLeftWidth = visibleWidth(statsLeft);\n\n\t\t// If statsLeft is too wide, truncate it\n\t\tif (statsLeftWidth > width) {\n\t\t\tstatsLeft = truncateToWidth(statsLeft, width, \"...\");\n\t\t\tstatsLeftWidth = visibleWidth(statsLeft);\n\t\t}\n\n\t\t// Calculate available space for padding (minimum 2 spaces between stats and model)\n\t\tconst minPadding = 2;\n\n\t\t// Add thinking level indicator if model supports reasoning\n\t\tlet rightSideWithoutProvider = state.model ? theme.fg(\"accent\", modelName) : theme.fg(\"warning\", modelName);\n\t\tif (state.model?.reasoning) {\n\t\t\tconst thinkingLevel = state.thinkingLevel || \"off\";\n\t\t\trightSideWithoutProvider =\n\t\t\t\tthinkingLevel === \"off\"\n\t\t\t\t\t? `${theme.fg(\"accent\", modelName)}${theme.fg(\"muted\", \" • thinking off\")}`\n\t\t\t\t\t: `${theme.fg(\"accent\", modelName)}${theme.fg(\"muted\", ` • ${thinkingLevel}`)}`;\n\t\t}\n\n\t\tconst rightSide = rightSideWithoutProvider;\n\n\t\tconst rightSideWidth = visibleWidth(rightSide);\n\t\tconst totalNeeded = statsLeftWidth + minPadding + rightSideWidth;\n\n\t\tlet statsLine: string;\n\t\tif (totalNeeded <= width) {\n\t\t\t// Both fit - add padding to right-align model\n\t\t\tconst padding = \" \".repeat(width - statsLeftWidth - rightSideWidth);\n\t\t\tstatsLine = statsLeft + padding + rightSide;\n\t\t} else {\n\t\t\t// Need to truncate right side\n\t\t\tconst availableForRight = width - statsLeftWidth - minPadding;\n\t\t\tif (availableForRight > 0) {\n\t\t\t\tconst truncatedRight = truncateToWidth(rightSide, availableForRight, \"\");\n\t\t\t\tconst truncatedRightWidth = visibleWidth(truncatedRight);\n\t\t\t\tconst padding = \" \".repeat(Math.max(0, width - statsLeftWidth - truncatedRightWidth));\n\t\t\t\tstatsLine = statsLeft + padding + truncatedRight;\n\t\t\t} else {\n\t\t\t\t// Not enough space for right side at all\n\t\t\t\tstatsLine = statsLeft;\n\t\t\t}\n\t\t}\n\n\t\t// Build pwd line, optionally with IOSM status segment appended\n\t\tconst iosmStatus = getIosmStatus(sessionCwd);\n\t\tlet pwdLine: string;\n\t\tif (iosmStatus) {\n\t\t\t// Assemble the IOSM segment (carries its own ANSI color codes)\n\t\t\tconst iosmSegment = \" [\" + iosmStatus + theme.fg(\"dim\", \"]\");\n\t\t\tconst iosmSegmentWidth = visibleWidth(iosmSegment);\n\t\t\t// Truncate pwd portion to leave room for the iosm segment\n\t\t\tconst maxPwdWidth = Math.max(0, width - iosmSegmentWidth);\n\t\t\tconst dimPwdTruncated = truncateToWidth(theme.fg(\"dim\", pwd), maxPwdWidth, theme.fg(\"dim\", \"...\"));\n\t\t\tpwdLine = dimPwdTruncated + iosmSegment;\n\t\t} else {\n\t\t\tpwdLine = truncateToWidth(theme.fg(\"dim\", pwd), width, theme.fg(\"dim\", \"...\"));\n\t\t}\n\t\tconst lines = [pwdLine, statsLine];\n\n\t\t// Add extension statuses on a single line, sorted by key alphabetically\n\t\tconst extensionStatuses = this.footerData.getExtensionStatuses();\n\t\tif (extensionStatuses.size > 0) {\n\t\t\tconst sortedStatuses = Array.from(extensionStatuses.entries())\n\t\t\t\t.sort(([a], [b]) => a.localeCompare(b))\n\t\t\t\t.map(([, text]) => sanitizeStatusText(text));\n\t\t\tconst statusLine = sortedStatuses.join(\" \");\n\t\t\t// Truncate to terminal width with dim ellipsis for consistency with footer style\n\t\t\tlines.push(truncateToWidth(statusLine, width, theme.fg(\"dim\", \"...\")));\n\t\t}\n\n\t\treturn lines;\n\t}\n}\n"]}
|
|
@@ -1,18 +1,30 @@
|
|
|
1
1
|
import { Container } from "@mariozechner/pi-tui";
|
|
2
2
|
import type { AuthStorage } from "../../../core/auth-storage.js";
|
|
3
|
+
export type LoginProviderKind = "oauth" | "api_key";
|
|
4
|
+
export type LoginProviderOption = {
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
kind: LoginProviderKind;
|
|
8
|
+
};
|
|
3
9
|
/**
|
|
4
10
|
* Component that renders an OAuth provider selector
|
|
5
11
|
*/
|
|
6
12
|
export declare class OAuthSelectorComponent extends Container {
|
|
13
|
+
private searchInput;
|
|
14
|
+
private summaryText;
|
|
7
15
|
private listContainer;
|
|
8
16
|
private allProviders;
|
|
17
|
+
private filteredProviders;
|
|
9
18
|
private selectedIndex;
|
|
19
|
+
private maxVisible;
|
|
10
20
|
private mode;
|
|
11
21
|
private authStorage;
|
|
12
22
|
private onSelectCallback;
|
|
13
23
|
private onCancelCallback;
|
|
14
|
-
|
|
24
|
+
private apiKeyProviders;
|
|
25
|
+
constructor(mode: "login" | "logout", authStorage: AuthStorage, onSelect: (provider: LoginProviderOption) => void, onCancel: () => void, apiKeyProviders?: LoginProviderOption[]);
|
|
15
26
|
private loadProviders;
|
|
27
|
+
private applyFilter;
|
|
16
28
|
private updateList;
|
|
17
29
|
handleInput(keyData: string): void;
|
|
18
30
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-selector.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/oauth-selector.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"oauth-selector.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/oauth-selector.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAyE,MAAM,sBAAsB,CAAC;AACxH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAIjE,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,SAAS,CAAC;AAEpD,MAAM,MAAM,mBAAmB,GAAG;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,iBAAiB,CAAC;CACxB,CAAC;AAMF;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,SAAS;IACpD,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,WAAW,CAAO;IAC1B,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,gBAAgB,CAA0C;IAClE,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,eAAe,CAAwB;gBAG9C,IAAI,EAAE,OAAO,GAAG,QAAQ,EACxB,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,IAAI,EACjD,QAAQ,EAAE,MAAM,IAAI,EACpB,eAAe,GAAE,mBAAmB,EAAoC;IA0CzE,OAAO,CAAC,aAAa;IAgDrB,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,UAAU;IA6DlB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CA0ClC"}
|