femtocode 0.0.0 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.mjs +16 -14
- package/package.json +15 -14
package/dist/bin.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{parseArgs as e}from"node:util";import t,{useCallback as n,useEffect as r,useMemo as i,useState as a}from"react";import{Box as o,Static as s,Text as c,render as l,useApp as u,useInput as d}from"ink";import{createStore as f}from"zustand/vanilla";import*as p from"node:path";import{join as m}from"node:path";import{spawn as h}from"node:child_process";import*as g from"node:fs";import*as _ from"node:os";import*as v from"node:crypto";import*as y from"node:fs/promises";import{readFile as b,readdir as x,stat as ee}from"node:fs/promises";import{z as S}from"zod";import C from"@anthropic-ai/sdk";import w from"openai";import*as T from"@clack/prompts";import E from"picocolors";import D from"gray-matter";import{create as te,useStore as O}from"zustand";import{Fragment as k,jsx as A,jsxs as j}from"react/jsx-runtime";import{MultilineInput as ne}from"ink-multiline-input";import*as re from"diff";import{Lexer as M}from"marked";import N from"ink-select-input";import ie from"ink-text-input";let P;(function(e){e.providerIds=[`anthropic`,`minimax`,`openai`,`xai`,`zai`],e.providers={anthropic:{id:`anthropic`,name:`Anthropic`},minimax:{id:`minimax`,name:`MiniMax (minimax.io)`},openai:{id:`openai`,name:`OpenAI`},xai:{id:`xai`,name:`xAI`},zai:{id:`zai`,name:`Z.AI`}},e.models={"claude-opus-4-6":{id:`claude-opus-4-6`,name:`Claude Opus 4.6`,family:`claude-opus`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-05`,release_date:`2026-02-05`,last_updated:`2026-02-05`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:5,output:25,cache_read:.5,cache_write:6.25},limit:{context:2e5,output:128e3}},"gpt-5.3-codex":{id:`gpt-5.3-codex`,name:`GPT-5.3 Codex`,family:`gpt-codex`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2025-08-31`,release_date:`2026-02-05`,last_updated:`2026-02-05`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:1.75,output:14,cache_read:.175},limit:{context:4e5,output:128e3}},"glm-4.7-flash":{id:`glm-4.7-flash`,name:`GLM-4.7-Flash`,family:`glm-flash`,providerId:`zai`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-04`,release_date:`2026-01-19`,last_updated:`2026-01-19`,modalities:{input:[`text`],output:[`text`]},open_weights:!0,cost:{input:0,output:0,cache_read:0,cache_write:0},limit:{context:2e5,output:131072}},"MiniMax-M2.1":{id:`MiniMax-M2.1`,name:`MiniMax-M2.1`,family:`minimax`,providerId:`minimax`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:null,release_date:`2025-12-23`,last_updated:`2025-12-23`,modalities:{input:[`text`],output:[`text`]},open_weights:!0,cost:{input:.3,output:1.2},limit:{context:204800,output:131072}},"glm-4.7":{id:`glm-4.7`,name:`GLM-4.7`,family:`glm`,providerId:`zai`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-04`,release_date:`2025-12-22`,last_updated:`2025-12-22`,modalities:{input:[`text`],output:[`text`]},open_weights:!0,cost:{input:.6,output:2.2,cache_read:.11,cache_write:0},limit:{context:204800,output:131072}},"gpt-5.2-codex":{id:`gpt-5.2-codex`,name:`GPT-5.2 Codex`,family:`gpt-codex`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2025-08-31`,release_date:`2025-12-11`,last_updated:`2025-12-11`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:1.75,output:14,cache_read:.175},limit:{context:4e5,output:128e3}},"gpt-5.2-pro":{id:`gpt-5.2-pro`,name:`GPT-5.2 Pro`,family:`gpt-pro`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2025-08-31`,release_date:`2025-12-11`,last_updated:`2025-12-11`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:21,output:168},limit:{context:4e5,output:128e3}},"gpt-5.2-chat-latest":{id:`gpt-5.2-chat-latest`,name:`GPT-5.2 Chat`,family:`gpt-codex`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2025-08-31`,release_date:`2025-12-11`,last_updated:`2025-12-11`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:1.75,output:14,cache_read:.175},limit:{context:128e3,output:16384}},"gpt-5.2":{id:`gpt-5.2`,name:`GPT-5.2`,family:`gpt`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2025-08-31`,release_date:`2025-12-11`,last_updated:`2025-12-11`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:1.75,output:14,cache_read:.175},limit:{context:4e5,output:128e3}},"glm-4.6v":{id:`glm-4.6v`,name:`GLM-4.6V`,family:`glm`,providerId:`zai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-04`,release_date:`2025-12-08`,last_updated:`2025-12-08`,modalities:{input:[`text`,`image`,`video`],output:[`text`]},open_weights:!0,cost:{input:.3,output:.9},limit:{context:128e3,output:32768}},"claude-opus-4-5":{id:`claude-opus-4-5`,name:`Claude Opus 4.5 (latest)`,family:`claude-opus`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-03-31`,release_date:`2025-11-24`,last_updated:`2025-11-24`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:5,output:25,cache_read:.5,cache_write:6.25},limit:{context:2e5,output:64e3}},"grok-4-1-fast":{id:`grok-4-1-fast`,name:`Grok 4.1 Fast`,family:`grok`,providerId:`xai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-07`,release_date:`2025-11-19`,last_updated:`2025-11-19`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:.2,output:.5,cache_read:.05},limit:{context:2e6,output:3e4}},"grok-4-1-fast-non-reasoning":{id:`grok-4-1-fast-non-reasoning`,name:`Grok 4.1 Fast (Non-Reasoning)`,family:`grok`,providerId:`xai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-07`,release_date:`2025-11-19`,last_updated:`2025-11-19`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:.2,output:.5,cache_read:.05},limit:{context:2e6,output:3e4}},"gpt-5.1-codex":{id:`gpt-5.1-codex`,name:`GPT-5.1 Codex`,family:`gpt-codex`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2024-09-30`,release_date:`2025-11-13`,last_updated:`2025-11-13`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:1.25,output:10,cache_read:.125},limit:{context:4e5,output:128e3}},"gpt-5.1-codex-mini":{id:`gpt-5.1-codex-mini`,name:`GPT-5.1 Codex mini`,family:`gpt-codex`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2024-09-30`,release_date:`2025-11-13`,last_updated:`2025-11-13`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:.25,output:2,cache_read:.025},limit:{context:4e5,output:128e3}},"gpt-5.1":{id:`gpt-5.1`,name:`GPT-5.1`,family:`gpt`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2024-09-30`,release_date:`2025-11-13`,last_updated:`2025-11-13`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:1.25,output:10,cache_read:.13},limit:{context:4e5,output:128e3}},"gpt-5.1-codex-max":{id:`gpt-5.1-codex-max`,name:`GPT-5.1 Codex Max`,family:`gpt-codex`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2024-09-30`,release_date:`2025-11-13`,last_updated:`2025-11-13`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:1.25,output:10,cache_read:.125},limit:{context:4e5,output:128e3}},"gpt-5.1-chat-latest":{id:`gpt-5.1-chat-latest`,name:`GPT-5.1 Chat`,family:`gpt-codex`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2024-09-30`,release_date:`2025-11-13`,last_updated:`2025-11-13`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:1.25,output:10,cache_read:.125},limit:{context:128e3,output:16384}},"claude-opus-4-5-20251101":{id:`claude-opus-4-5-20251101`,name:`Claude Opus 4.5`,family:`claude-opus`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-03-31`,release_date:`2025-11-01`,last_updated:`2025-11-01`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:5,output:25,cache_read:.5,cache_write:6.25},limit:{context:2e5,output:64e3}},"MiniMax-M2":{id:`MiniMax-M2`,name:`MiniMax-M2`,family:`minimax`,providerId:`minimax`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:null,release_date:`2025-10-27`,last_updated:`2025-10-27`,modalities:{input:[`text`],output:[`text`]},open_weights:!0,cost:{input:.3,output:1.2},limit:{context:196608,output:128e3}},"claude-haiku-4-5":{id:`claude-haiku-4-5`,name:`Claude Haiku 4.5 (latest)`,family:`claude-haiku`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-02-28`,release_date:`2025-10-15`,last_updated:`2025-10-15`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:1,output:5,cache_read:.1,cache_write:1.25},limit:{context:2e5,output:64e3}},"claude-haiku-4-5-20251001":{id:`claude-haiku-4-5-20251001`,name:`Claude Haiku 4.5`,family:`claude-haiku`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-02-28`,release_date:`2025-10-15`,last_updated:`2025-10-15`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:1,output:5,cache_read:.1,cache_write:1.25},limit:{context:2e5,output:64e3}},"gpt-5-pro":{id:`gpt-5-pro`,name:`GPT-5 Pro`,family:`gpt-pro`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2024-09-30`,release_date:`2025-10-06`,last_updated:`2025-10-06`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:15,output:120},limit:{context:4e5,output:272e3}},"glm-4.6":{id:`glm-4.6`,name:`GLM-4.6`,family:`glm`,providerId:`zai`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-04`,release_date:`2025-09-30`,last_updated:`2025-09-30`,modalities:{input:[`text`],output:[`text`]},open_weights:!0,cost:{input:.6,output:2.2,cache_read:.11,cache_write:0},limit:{context:204800,output:131072}},"claude-sonnet-4-5":{id:`claude-sonnet-4-5`,name:`Claude Sonnet 4.5 (latest)`,family:`claude-sonnet`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-07-31`,release_date:`2025-09-29`,last_updated:`2025-09-29`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:3,output:15,cache_read:.3,cache_write:3.75},limit:{context:2e5,output:64e3}},"claude-sonnet-4-5-20250929":{id:`claude-sonnet-4-5-20250929`,name:`Claude Sonnet 4.5`,family:`claude-sonnet`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-07-31`,release_date:`2025-09-29`,last_updated:`2025-09-29`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:3,output:15,cache_read:.3,cache_write:3.75},limit:{context:2e5,output:64e3}},"grok-4-fast-non-reasoning":{id:`grok-4-fast-non-reasoning`,name:`Grok 4 Fast (Non-Reasoning)`,family:`grok`,providerId:`xai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-07`,release_date:`2025-09-19`,last_updated:`2025-09-19`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:.2,output:.5,cache_read:.05},limit:{context:2e6,output:3e4}},"grok-4-fast":{id:`grok-4-fast`,name:`Grok 4 Fast`,family:`grok`,providerId:`xai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-07`,release_date:`2025-09-19`,last_updated:`2025-09-19`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:.2,output:.5,cache_read:.05},limit:{context:2e6,output:3e4}},"gpt-5-codex":{id:`gpt-5-codex`,name:`GPT-5-Codex`,family:`gpt-codex`,providerId:`openai`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2024-09-30`,release_date:`2025-09-15`,last_updated:`2025-09-15`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:1.25,output:10,cache_read:.125},limit:{context:4e5,output:128e3}},"grok-code-fast-1":{id:`grok-code-fast-1`,name:`Grok Code Fast 1`,family:`grok`,providerId:`xai`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2023-10`,release_date:`2025-08-28`,last_updated:`2025-08-28`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:.2,output:1.5,cache_read:.02},limit:{context:256e3,output:1e4}},"glm-4.5v":{id:`glm-4.5v`,name:`GLM-4.5V`,family:`glm`,providerId:`zai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-04`,release_date:`2025-08-11`,last_updated:`2025-08-11`,modalities:{input:[`text`,`image`,`video`],output:[`text`]},open_weights:!0,cost:{input:.6,output:1.8},limit:{context:64e3,output:16384}},"gpt-5-nano":{id:`gpt-5-nano`,name:`GPT-5 Nano`,family:`gpt-nano`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2024-05-30`,release_date:`2025-08-07`,last_updated:`2025-08-07`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:.05,output:.4,cache_read:.005},limit:{context:4e5,output:128e3}},"gpt-5-mini":{id:`gpt-5-mini`,name:`GPT-5 Mini`,family:`gpt-mini`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2024-05-30`,release_date:`2025-08-07`,last_updated:`2025-08-07`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:.25,output:2,cache_read:.025},limit:{context:4e5,output:128e3}},"gpt-5-chat-latest":{id:`gpt-5-chat-latest`,name:`GPT-5 Chat (latest)`,family:`gpt-codex`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!1,structured_output:!0,temperature:!0,knowledge:`2024-09-30`,release_date:`2025-08-07`,last_updated:`2025-08-07`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:1.25,output:10},limit:{context:4e5,output:128e3}},"gpt-5":{id:`gpt-5`,name:`GPT-5`,family:`gpt`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2024-09-30`,release_date:`2025-08-07`,last_updated:`2025-08-07`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:1.25,output:10,cache_read:.125},limit:{context:4e5,output:128e3}},"claude-opus-4-1":{id:`claude-opus-4-1`,name:`Claude Opus 4.1 (latest)`,family:`claude-opus`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-03-31`,release_date:`2025-08-05`,last_updated:`2025-08-05`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:15,output:75,cache_read:1.5,cache_write:18.75},limit:{context:2e5,output:32e3}},"claude-opus-4-1-20250805":{id:`claude-opus-4-1-20250805`,name:`Claude Opus 4.1`,family:`claude-opus`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-03-31`,release_date:`2025-08-05`,last_updated:`2025-08-05`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:15,output:75,cache_read:1.5,cache_write:18.75},limit:{context:2e5,output:32e3}},"glm-4.5-flash":{id:`glm-4.5-flash`,name:`GLM-4.5-Flash`,family:`glm-flash`,providerId:`zai`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-04`,release_date:`2025-07-28`,last_updated:`2025-07-28`,modalities:{input:[`text`],output:[`text`]},open_weights:!0,cost:{input:0,output:0,cache_read:0,cache_write:0},limit:{context:131072,output:98304}},"glm-4.5":{id:`glm-4.5`,name:`GLM-4.5`,family:`glm`,providerId:`zai`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-04`,release_date:`2025-07-28`,last_updated:`2025-07-28`,modalities:{input:[`text`],output:[`text`]},open_weights:!0,cost:{input:.6,output:2.2,cache_read:.11,cache_write:0},limit:{context:131072,output:98304}},"glm-4.5-air":{id:`glm-4.5-air`,name:`GLM-4.5-Air`,family:`glm-air`,providerId:`zai`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-04`,release_date:`2025-07-28`,last_updated:`2025-07-28`,modalities:{input:[`text`],output:[`text`]},open_weights:!0,cost:{input:.2,output:1.1,cache_read:.03,cache_write:0},limit:{context:131072,output:98304}},"grok-4":{id:`grok-4`,name:`Grok 4`,family:`grok`,providerId:`xai`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-07`,release_date:`2025-07-09`,last_updated:`2025-07-09`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:3,output:15,cache_read:.75},limit:{context:256e3,output:64e3}},"o3-pro":{id:`o3-pro`,name:`o3-pro`,family:`o-pro`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2024-05`,release_date:`2025-06-10`,last_updated:`2025-06-10`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:20,output:80},limit:{context:2e5,output:1e5}},"claude-opus-4-0":{id:`claude-opus-4-0`,name:`Claude Opus 4 (latest)`,family:`claude-opus`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-03-31`,release_date:`2025-05-22`,last_updated:`2025-05-22`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:15,output:75,cache_read:1.5,cache_write:18.75},limit:{context:2e5,output:32e3}},"claude-sonnet-4-20250514":{id:`claude-sonnet-4-20250514`,name:`Claude Sonnet 4`,family:`claude-sonnet`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-03-31`,release_date:`2025-05-22`,last_updated:`2025-05-22`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:3,output:15,cache_read:.3,cache_write:3.75},limit:{context:2e5,output:64e3}},"claude-opus-4-20250514":{id:`claude-opus-4-20250514`,name:`Claude Opus 4`,family:`claude-opus`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-03-31`,release_date:`2025-05-22`,last_updated:`2025-05-22`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:15,output:75,cache_read:1.5,cache_write:18.75},limit:{context:2e5,output:32e3}},"claude-sonnet-4-0":{id:`claude-sonnet-4-0`,name:`Claude Sonnet 4 (latest)`,family:`claude-sonnet`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-03-31`,release_date:`2025-05-22`,last_updated:`2025-05-22`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:3,output:15,cache_read:.3,cache_write:3.75},limit:{context:2e5,output:64e3}},"codex-mini-latest":{id:`codex-mini-latest`,name:`Codex Mini`,family:`gpt-codex-mini`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!1,knowledge:`2024-04`,release_date:`2025-05-16`,last_updated:`2025-05-16`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:1.5,output:6,cache_read:.375},limit:{context:2e5,output:1e5}},"o4-mini":{id:`o4-mini`,name:`o4-mini`,family:`o-mini`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2024-05`,release_date:`2025-04-16`,last_updated:`2025-04-16`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:1.1,output:4.4,cache_read:.28},limit:{context:2e5,output:1e5}},o3:{id:`o3`,name:`o3`,family:`o`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2024-05`,release_date:`2025-04-16`,last_updated:`2025-04-16`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:2,output:8,cache_read:.5},limit:{context:2e5,output:1e5}},"gpt-4.1-nano":{id:`gpt-4.1-nano`,name:`GPT-4.1 nano`,family:`gpt-nano`,providerId:`openai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!0,temperature:!0,knowledge:`2024-04`,release_date:`2025-04-14`,last_updated:`2025-04-14`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:.1,output:.4,cache_read:.03},limit:{context:1047576,output:32768}},"gpt-4.1-mini":{id:`gpt-4.1-mini`,name:`GPT-4.1 mini`,family:`gpt-mini`,providerId:`openai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!0,temperature:!0,knowledge:`2024-04`,release_date:`2025-04-14`,last_updated:`2025-04-14`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:.4,output:1.6,cache_read:.1},limit:{context:1047576,output:32768}},"gpt-4.1":{id:`gpt-4.1`,name:`GPT-4.1`,family:`gpt`,providerId:`openai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!0,temperature:!0,knowledge:`2024-04`,release_date:`2025-04-14`,last_updated:`2025-04-14`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:2,output:8,cache_read:.5},limit:{context:1047576,output:32768}},"o1-pro":{id:`o1-pro`,name:`o1-pro`,family:`o-pro`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2023-09`,release_date:`2025-03-19`,last_updated:`2025-03-19`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:150,output:600},limit:{context:2e5,output:1e5}},"claude-3-7-sonnet-20250219":{id:`claude-3-7-sonnet-20250219`,name:`Claude Sonnet 3.7`,family:`claude-sonnet`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-10-31`,release_date:`2025-02-19`,last_updated:`2025-02-19`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:3,output:15,cache_read:.3,cache_write:3.75},limit:{context:2e5,output:64e3}},"claude-3-7-sonnet-latest":{id:`claude-3-7-sonnet-latest`,name:`Claude Sonnet 3.7 (latest)`,family:`claude-sonnet`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-10-31`,release_date:`2025-02-19`,last_updated:`2025-02-19`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:3,output:15,cache_read:.3,cache_write:3.75},limit:{context:2e5,output:64e3}},"grok-3-fast":{id:`grok-3-fast`,name:`Grok 3 Fast`,family:`grok`,providerId:`xai`,attachment:!1,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-11`,release_date:`2025-02-17`,last_updated:`2025-02-17`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:5,output:25,cache_read:1.25},limit:{context:131072,output:8192}},"grok-3-mini-fast-latest":{id:`grok-3-mini-fast-latest`,name:`Grok 3 Mini Fast Latest`,family:`grok`,providerId:`xai`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-11`,release_date:`2025-02-17`,last_updated:`2025-02-17`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:.6,output:4,cache_read:.15},limit:{context:131072,output:8192}},"grok-3":{id:`grok-3`,name:`Grok 3`,family:`grok`,providerId:`xai`,attachment:!1,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-11`,release_date:`2025-02-17`,last_updated:`2025-02-17`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:3,output:15,cache_read:.75},limit:{context:131072,output:8192}},"grok-3-fast-latest":{id:`grok-3-fast-latest`,name:`Grok 3 Fast Latest`,family:`grok`,providerId:`xai`,attachment:!1,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-11`,release_date:`2025-02-17`,last_updated:`2025-02-17`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:5,output:25,cache_read:1.25},limit:{context:131072,output:8192}},"grok-3-latest":{id:`grok-3-latest`,name:`Grok 3 Latest`,family:`grok`,providerId:`xai`,attachment:!1,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-11`,release_date:`2025-02-17`,last_updated:`2025-02-17`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:3,output:15,cache_read:.75},limit:{context:131072,output:8192}},"grok-3-mini":{id:`grok-3-mini`,name:`Grok 3 Mini`,family:`grok`,providerId:`xai`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-11`,release_date:`2025-02-17`,last_updated:`2025-02-17`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:.3,output:.5,cache_read:.075},limit:{context:131072,output:8192}},"grok-3-mini-latest":{id:`grok-3-mini-latest`,name:`Grok 3 Mini Latest`,family:`grok`,providerId:`xai`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-11`,release_date:`2025-02-17`,last_updated:`2025-02-17`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:.3,output:.5,cache_read:.075},limit:{context:131072,output:8192}},"grok-3-mini-fast":{id:`grok-3-mini-fast`,name:`Grok 3 Mini Fast`,family:`grok`,providerId:`xai`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-11`,release_date:`2025-02-17`,last_updated:`2025-02-17`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:.6,output:4,cache_read:.15},limit:{context:131072,output:8192}},"o3-mini":{id:`o3-mini`,name:`o3-mini`,family:`o-mini`,providerId:`openai`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2024-05`,release_date:`2024-12-20`,last_updated:`2025-01-29`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:1.1,output:4.4,cache_read:.55},limit:{context:2e5,output:1e5}},"grok-2-1212":{id:`grok-2-1212`,name:`Grok 2 (1212)`,family:`grok`,providerId:`xai`,attachment:!1,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-08`,release_date:`2024-12-12`,last_updated:`2024-12-12`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:2,output:10,cache_read:2},limit:{context:131072,output:8192}},o1:{id:`o1`,name:`o1`,family:`o`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2023-09`,release_date:`2024-12-05`,last_updated:`2024-12-05`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:15,output:60,cache_read:7.5},limit:{context:2e5,output:1e5}},"gpt-4o-2024-11-20":{id:`gpt-4o-2024-11-20`,name:`GPT-4o (2024-11-20)`,family:`gpt`,providerId:`openai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!0,temperature:!0,knowledge:`2023-09`,release_date:`2024-11-20`,last_updated:`2024-11-20`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:2.5,output:10,cache_read:1.25},limit:{context:128e3,output:16384}},"grok-vision-beta":{id:`grok-vision-beta`,name:`Grok Vision Beta`,family:`grok-vision`,providerId:`xai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-08`,release_date:`2024-11-01`,last_updated:`2024-11-01`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:5,output:15,cache_read:5},limit:{context:8192,output:4096}},"grok-beta":{id:`grok-beta`,name:`Grok Beta`,family:`grok-beta`,providerId:`xai`,attachment:!1,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-08`,release_date:`2024-11-01`,last_updated:`2024-11-01`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:5,output:15,cache_read:5},limit:{context:131072,output:4096}},"claude-3-5-sonnet-20241022":{id:`claude-3-5-sonnet-20241022`,name:`Claude Sonnet 3.5 v2`,family:`claude-sonnet`,providerId:`anthropic`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-04-30`,release_date:`2024-10-22`,last_updated:`2024-10-22`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:3,output:15,cache_read:.3,cache_write:3.75},limit:{context:2e5,output:8192}},"claude-3-5-haiku-latest":{id:`claude-3-5-haiku-latest`,name:`Claude Haiku 3.5 (latest)`,family:`claude-haiku`,providerId:`anthropic`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-07-31`,release_date:`2024-10-22`,last_updated:`2024-10-22`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:.8,output:4,cache_read:.08,cache_write:1},limit:{context:2e5,output:8192}},"claude-3-5-haiku-20241022":{id:`claude-3-5-haiku-20241022`,name:`Claude Haiku 3.5`,family:`claude-haiku`,providerId:`anthropic`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-07-31`,release_date:`2024-10-22`,last_updated:`2024-10-22`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:.8,output:4,cache_read:.08,cache_write:1},limit:{context:2e5,output:8192}},"o1-preview":{id:`o1-preview`,name:`o1-preview`,family:`o`,providerId:`openai`,attachment:!1,reasoning:!0,tool_call:!1,structured_output:!1,temperature:!0,knowledge:`2023-09`,release_date:`2024-09-12`,last_updated:`2024-09-12`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:15,output:60,cache_read:7.5},limit:{context:128e3,output:32768}},"o1-mini":{id:`o1-mini`,name:`o1-mini`,family:`o-mini`,providerId:`openai`,attachment:!1,reasoning:!0,tool_call:!1,structured_output:!0,temperature:!1,knowledge:`2023-09`,release_date:`2024-09-12`,last_updated:`2024-09-12`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:1.1,output:4.4,cache_read:.55},limit:{context:128e3,output:65536}},"grok-2-vision":{id:`grok-2-vision`,name:`Grok 2 Vision`,family:`grok`,providerId:`xai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-08`,release_date:`2024-08-20`,last_updated:`2024-08-20`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:2,output:10,cache_read:2},limit:{context:8192,output:4096}},"grok-2":{id:`grok-2`,name:`Grok 2`,family:`grok`,providerId:`xai`,attachment:!1,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-08`,release_date:`2024-08-20`,last_updated:`2024-08-20`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:2,output:10,cache_read:2},limit:{context:131072,output:8192}},"grok-2-vision-1212":{id:`grok-2-vision-1212`,name:`Grok 2 Vision (1212)`,family:`grok`,providerId:`xai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-08`,release_date:`2024-08-20`,last_updated:`2024-12-12`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:2,output:10,cache_read:2},limit:{context:8192,output:4096}},"grok-2-latest":{id:`grok-2-latest`,name:`Grok 2 Latest`,family:`grok`,providerId:`xai`,attachment:!1,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-08`,release_date:`2024-08-20`,last_updated:`2024-12-12`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:2,output:10,cache_read:2},limit:{context:131072,output:8192}},"grok-2-vision-latest":{id:`grok-2-vision-latest`,name:`Grok 2 Vision Latest`,family:`grok`,providerId:`xai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-08`,release_date:`2024-08-20`,last_updated:`2024-12-12`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:2,output:10,cache_read:2},limit:{context:8192,output:4096}},"gpt-4o-2024-08-06":{id:`gpt-4o-2024-08-06`,name:`GPT-4o (2024-08-06)`,family:`gpt`,providerId:`openai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!0,temperature:!0,knowledge:`2023-09`,release_date:`2024-08-06`,last_updated:`2024-08-06`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:2.5,output:10,cache_read:1.25},limit:{context:128e3,output:16384}},"gpt-4o-mini":{id:`gpt-4o-mini`,name:`GPT-4o mini`,family:`gpt-mini`,providerId:`openai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!0,temperature:!0,knowledge:`2023-09`,release_date:`2024-07-18`,last_updated:`2024-07-18`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:.15,output:.6,cache_read:.08},limit:{context:128e3,output:16384}},"o3-deep-research":{id:`o3-deep-research`,name:`o3-deep-research`,family:`o`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!1,knowledge:`2024-05`,release_date:`2024-06-26`,last_updated:`2024-06-26`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:10,output:40,cache_read:2.5},limit:{context:2e5,output:1e5}},"o4-mini-deep-research":{id:`o4-mini-deep-research`,name:`o4-mini-deep-research`,family:`o-mini`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!1,knowledge:`2024-05`,release_date:`2024-06-26`,last_updated:`2024-06-26`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:2,output:8,cache_read:.5},limit:{context:2e5,output:1e5}},"claude-3-5-sonnet-20240620":{id:`claude-3-5-sonnet-20240620`,name:`Claude Sonnet 3.5`,family:`claude-sonnet`,providerId:`anthropic`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-04-30`,release_date:`2024-06-20`,last_updated:`2024-06-20`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:3,output:15,cache_read:.3,cache_write:3.75},limit:{context:2e5,output:8192}},"gpt-4o-2024-05-13":{id:`gpt-4o-2024-05-13`,name:`GPT-4o (2024-05-13)`,family:`gpt`,providerId:`openai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!0,temperature:!0,knowledge:`2023-09`,release_date:`2024-05-13`,last_updated:`2024-05-13`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:5,output:15},limit:{context:128e3,output:4096}},"gpt-4o":{id:`gpt-4o`,name:`GPT-4o`,family:`gpt`,providerId:`openai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!0,temperature:!0,knowledge:`2023-09`,release_date:`2024-05-13`,last_updated:`2024-08-06`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:2.5,output:10,cache_read:1.25},limit:{context:128e3,output:16384}},"claude-3-haiku-20240307":{id:`claude-3-haiku-20240307`,name:`Claude Haiku 3`,family:`claude-haiku`,providerId:`anthropic`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2023-08-31`,release_date:`2024-03-13`,last_updated:`2024-03-13`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:.25,output:1.25,cache_read:.03,cache_write:.3},limit:{context:2e5,output:4096}},"claude-3-sonnet-20240229":{id:`claude-3-sonnet-20240229`,name:`Claude Sonnet 3`,family:`claude-sonnet`,providerId:`anthropic`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2023-08-31`,release_date:`2024-03-04`,last_updated:`2024-03-04`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:3,output:15,cache_read:.3,cache_write:.3},limit:{context:2e5,output:4096}},"claude-3-opus-20240229":{id:`claude-3-opus-20240229`,name:`Claude Opus 3`,family:`claude-opus`,providerId:`anthropic`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2023-08-31`,release_date:`2024-02-29`,last_updated:`2024-02-29`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:15,output:75,cache_read:1.5,cache_write:18.75},limit:{context:2e5,output:4096}},"text-embedding-3-small":{id:`text-embedding-3-small`,name:`text-embedding-3-small`,family:`text-embedding`,providerId:`openai`,attachment:!1,reasoning:!1,tool_call:!1,structured_output:!1,temperature:!1,knowledge:`2024-01`,release_date:`2024-01-25`,last_updated:`2024-01-25`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:.02,output:0},limit:{context:8191,output:1536}},"text-embedding-3-large":{id:`text-embedding-3-large`,name:`text-embedding-3-large`,family:`text-embedding`,providerId:`openai`,attachment:!1,reasoning:!1,tool_call:!1,structured_output:!1,temperature:!1,knowledge:`2024-01`,release_date:`2024-01-25`,last_updated:`2024-01-25`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:.13,output:0},limit:{context:8191,output:3072}},"gpt-4":{id:`gpt-4`,name:`GPT-4`,family:`gpt`,providerId:`openai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2023-11`,release_date:`2023-11-06`,last_updated:`2024-04-09`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:30,output:60},limit:{context:8192,output:8192}},"gpt-4-turbo":{id:`gpt-4-turbo`,name:`GPT-4 Turbo`,family:`gpt`,providerId:`openai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2023-12`,release_date:`2023-11-06`,last_updated:`2024-04-09`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:10,output:30},limit:{context:128e3,output:4096}},"gpt-3.5-turbo":{id:`gpt-3.5-turbo`,name:`GPT-3.5-turbo`,family:`gpt`,providerId:`openai`,attachment:!1,reasoning:!1,tool_call:!1,structured_output:!1,temperature:!0,knowledge:`2021-09-01`,release_date:`2023-03-01`,last_updated:`2023-11-06`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:.5,output:1.5,cache_read:1.25},limit:{context:16385,output:4096}},"text-embedding-ada-002":{id:`text-embedding-ada-002`,name:`text-embedding-ada-002`,family:`text-embedding`,providerId:`openai`,attachment:!1,reasoning:!1,tool_call:!1,structured_output:!1,temperature:!1,knowledge:`2022-12`,release_date:`2022-12-15`,last_updated:`2022-12-15`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:.1,output:0},limit:{context:8192,output:1536}}}})(P||={});let F;(function(e){e.catalog=P.models,e.providers=P.providers;function t(e){for(let t of Object.values(P.models))if(t.providerId===e&&!(e===`openai`&&!t.family?.includes(`codex`)))return t.id;throw Error(`No models found for provider "${e}". Run 'pnpm models' to regenerate model data.`)}function n(){return{anthropic:t(`anthropic`),openai:t(`openai`),xai:t(`xai`),minimax:t(`minimax`),zai:t(`zai`)}}let r=n();function i(e){return P.models[e]}e.get=i;function a(e){return e===`llamacpp`?`llama.cpp`:P.providers[e].name}e.providerName=a;function o(e){return e===`openai`||e===`xai`||e===`llamacpp`?`openai`:`anthropic`}e.sdk=o;function s(e){return e!==`llamacpp`}e.isStaticProvider=s;function c(e){return e.family?.includes(`codex`)??!1}e.isCodexModel=c;function l(e){return Object.values(P.models).filter(t=>t.providerId===e?e===`openai`?c(t):!0:!1).map(e=>e.id)}e.forProvider=l;function u(){return[...P.providerIds,`llamacpp`]}e.providerIds=u;function d(e){return r[e]}e.defaultModel=d})(F||={});let I;(function(e){let t=new Set([`user`,`assistant`,`tool_result`]);function n(e){return t.has(e.type)}e.isLLMVisible=n;function r(e){return e.filter(n)}e.getLLMVisibleItems=r;function i(e){return r(e).map(e=>{switch(e.type){case`user`:return{role:`user`,content:e.content};case`assistant`:return{role:`assistant`,content:e.content,tool_calls:e.tool_calls};case`tool_result`:return{role:`tool_result`,results:e.results}}})}e.toLLMMessages=i;function a(){return crypto.randomUUID()}e.nextId=a;function o(e){let{model:t,system:n,cwd:r}=e;return f()(e=>({history:[],model:t,system:n,cwd:r,status:`idle`,activity:null,cost:0,pushUserMessage(t){e(e=>({history:[...e.history,{id:a(),type:`user`,content:t}]}))},pushAssistantMessage(t){e(e=>({history:[...e.history,{id:a(),type:`assistant`,content:t.content,tool_calls:t.toolCalls}]}))},pushToolResult(t){e(e=>({history:[...e.history,{id:a(),type:`tool_result`,results:t}]}))},pushError(t){e(e=>({history:[...e.history,{id:a(),type:`error`,error:t}]}))},setStatus(t){e({status:t})},setActivity(t){e({activity:t})},addCost(t){e(e=>({cost:e.cost+t}))},setModel(t){e({model:t})},setCwd(t){e({cwd:t})},reset(){e({history:[],status:`idle`,activity:null,cost:0})}}))}e.createAppStore=o;function s(e){let{store:t,usage:n,model:r}=e,i=r.cost,a=n.cacheReadTokens??0,o=n.cacheWriteTokens??0,s=(n.inputTokens-a-o)/1e6*i.input,c=n.outputTokens/1e6*i.output,l=a/1e6*(i.cache_read??i.input),u=o/1e6*(i.cache_write??i.input);t.getState().addCost(s+c+l+u)}e.addUsageCost=s;function c(e){return Math.ceil(e/4)}function l(e){let{history:t,system:n}=e,i=c(n.length),a=0,o=0,s=r(t);for(let e of s)switch(e.type){case`user`:a+=e.content.length;break;case`assistant`:a+=e.content.length,e.tool_calls.length>0&&(o+=JSON.stringify(e.tool_calls).length);break;case`tool_result`:e.results.length>0&&(o+=JSON.stringify(e.results).length);break}let l=c(a),u=c(o);return{total:i+l+u,system:i,tools:u,conversation:l}}e.estimateTokens=l})(I||={});let ae;(function(e){function t(e){if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`Tool input must be a non-null object`)}function n(e,t){return typeof e.description==`string`?e.description:t}async function*r(e){let{llm:r,tools:i,store:a,userMessage:o,signal:s}=e,c=a.getState();c.setStatus(`working`),yield{type:`turn_start`},c.pushUserMessage(o);try{for(;;){let e=a.getState();if(s?.aborted){e.setStatus(`idle`),e.setActivity(null),yield{type:`turn_end`};return}let o={messages:I.toLLMMessages(e.history),system:e.system};s!==void 0&&(o.signal=s);let c=await r.complete(o),l=F.get(e.model);l!==void 0&&I.addUsageCost({store:a,usage:c.usage,model:l}),yield{type:`usage`,usage:c.usage};let u={role:`assistant`,content:c.content,tool_calls:c.toolCalls};for(let r of c.toolCalls){t(r.input);let i=r.input,a=n(i,r.name);e.setActivity(a),yield{type:`tool_use`,name:r.name,callId:r.id,description:a,input:i}}if(e.pushAssistantMessage({content:c.content,toolCalls:c.toolCalls}),c.toolCalls.length===0){e.setStatus(`idle`),e.setActivity(null),yield{type:`message`,message:u},yield{type:`turn_end`};return}let d=[];for(let r of c.toolCalls){t(r.input);let a=r.input,o=n(a,r.name);e.setActivity(o);let s=await i.execute(r);s.description=o,d.push(s),yield{type:`tool_result`,name:r.name,callId:r.id,description:o,output:s.output,is_error:s.is_error??!1}}e.pushToolResult(d),e.setActivity(null),yield{type:`message`,message:u}}}catch(e){let t=a.getState();t.setStatus(`idle`),t.setActivity(null),yield{type:`error`,error:e instanceof Error?e:Error(String(e),{cause:e})},yield{type:`turn_end`}}}e.run=r})(ae||={});let oe;(function(e){function t(){return p.join(_.homedir(),`.config`,`femto`,`bash-output`)}e.dir=t;function n(e){let n=e??t();g.existsSync(n)||g.mkdirSync(n,{recursive:!0})}e.ensureDir=n;function r(e){return String(e).padStart(2,`0`)}function i(e){return`${String(e.getFullYear())}-${r(e.getMonth()+1)}-${r(e.getDate())}-${r(e.getHours())}${r(e.getMinutes())}${r(e.getSeconds())}`}function a(){return`${i(new Date)}-${v.randomUUID().slice(0,8)}.txt`}e.generateFilename=a;function o(e){let r=e.outputDir??t();n(r);let i=a(),o=p.join(r,i);return g.writeFileSync(o,e.output,`utf-8`),o}e.persistOutput=o;function s(e){let{output:t,exitCode:n,command:r}=e,i={output:t};e.outputDir!==void 0&&(i.outputDir=e.outputDir);let a=o(i),s=t.split(`
|
|
2
|
+
import{parseArgs as e}from"node:util";import t,{useCallback as n,useEffect as r,useMemo as i,useState as a}from"react";import{Box as o,Static as s,Text as c,render as l,useApp as u,useInput as d}from"ink";import{createStore as f}from"zustand/vanilla";import*as p from"node:path";import{join as m}from"node:path";import{spawn as h}from"node:child_process";import*as g from"node:fs";import*as _ from"node:os";import*as v from"node:crypto";import*as y from"node:fs/promises";import{readFile as b,readdir as x,stat as S}from"node:fs/promises";import{z as C}from"zod";import w from"@anthropic-ai/sdk";import T from"openai";import*as E from"@clack/prompts";import D from"picocolors";import O from"gray-matter";import{create as ee,useStore as k}from"zustand";import{Fragment as A,jsx as j,jsxs as M}from"react/jsx-runtime";import{MultilineInput as te}from"ink-multiline-input";import*as ne from"diff";import{Lexer as re}from"marked";import N from"ink-select-input";import ie from"ink-text-input";let P;(function(e){e.providerIds=[`anthropic`,`minimax`,`openai`,`xai`,`zai`],e.providers={anthropic:{id:`anthropic`,name:`Anthropic`},minimax:{id:`minimax`,name:`MiniMax (minimax.io)`},openai:{id:`openai`,name:`OpenAI`},xai:{id:`xai`,name:`xAI`},zai:{id:`zai`,name:`Z.AI`}},e.models={"claude-opus-4-6":{id:`claude-opus-4-6`,name:`Claude Opus 4.6`,family:`claude-opus`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-05`,release_date:`2026-02-05`,last_updated:`2026-02-05`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:5,output:25,cache_read:.5,cache_write:6.25},limit:{context:2e5,output:128e3}},"gpt-5.3-codex":{id:`gpt-5.3-codex`,name:`GPT-5.3 Codex`,family:`gpt-codex`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2025-08-31`,release_date:`2026-02-05`,last_updated:`2026-02-05`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:1.75,output:14,cache_read:.175},limit:{context:4e5,output:128e3}},"glm-4.7-flash":{id:`glm-4.7-flash`,name:`GLM-4.7-Flash`,family:`glm-flash`,providerId:`zai`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-04`,release_date:`2026-01-19`,last_updated:`2026-01-19`,modalities:{input:[`text`],output:[`text`]},open_weights:!0,cost:{input:0,output:0,cache_read:0,cache_write:0},limit:{context:2e5,output:131072}},"MiniMax-M2.1":{id:`MiniMax-M2.1`,name:`MiniMax-M2.1`,family:`minimax`,providerId:`minimax`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:null,release_date:`2025-12-23`,last_updated:`2025-12-23`,modalities:{input:[`text`],output:[`text`]},open_weights:!0,cost:{input:.3,output:1.2},limit:{context:204800,output:131072}},"glm-4.7":{id:`glm-4.7`,name:`GLM-4.7`,family:`glm`,providerId:`zai`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-04`,release_date:`2025-12-22`,last_updated:`2025-12-22`,modalities:{input:[`text`],output:[`text`]},open_weights:!0,cost:{input:.6,output:2.2,cache_read:.11,cache_write:0},limit:{context:204800,output:131072}},"gpt-5.2-codex":{id:`gpt-5.2-codex`,name:`GPT-5.2 Codex`,family:`gpt-codex`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2025-08-31`,release_date:`2025-12-11`,last_updated:`2025-12-11`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:1.75,output:14,cache_read:.175},limit:{context:4e5,output:128e3}},"gpt-5.2-pro":{id:`gpt-5.2-pro`,name:`GPT-5.2 Pro`,family:`gpt-pro`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2025-08-31`,release_date:`2025-12-11`,last_updated:`2025-12-11`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:21,output:168},limit:{context:4e5,output:128e3}},"gpt-5.2-chat-latest":{id:`gpt-5.2-chat-latest`,name:`GPT-5.2 Chat`,family:`gpt-codex`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2025-08-31`,release_date:`2025-12-11`,last_updated:`2025-12-11`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:1.75,output:14,cache_read:.175},limit:{context:128e3,output:16384}},"gpt-5.2":{id:`gpt-5.2`,name:`GPT-5.2`,family:`gpt`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2025-08-31`,release_date:`2025-12-11`,last_updated:`2025-12-11`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:1.75,output:14,cache_read:.175},limit:{context:4e5,output:128e3}},"glm-4.6v":{id:`glm-4.6v`,name:`GLM-4.6V`,family:`glm`,providerId:`zai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-04`,release_date:`2025-12-08`,last_updated:`2025-12-08`,modalities:{input:[`text`,`image`,`video`],output:[`text`]},open_weights:!0,cost:{input:.3,output:.9},limit:{context:128e3,output:32768}},"claude-opus-4-5":{id:`claude-opus-4-5`,name:`Claude Opus 4.5 (latest)`,family:`claude-opus`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-03-31`,release_date:`2025-11-24`,last_updated:`2025-11-24`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:5,output:25,cache_read:.5,cache_write:6.25},limit:{context:2e5,output:64e3}},"grok-4-1-fast":{id:`grok-4-1-fast`,name:`Grok 4.1 Fast`,family:`grok`,providerId:`xai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-07`,release_date:`2025-11-19`,last_updated:`2025-11-19`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:.2,output:.5,cache_read:.05},limit:{context:2e6,output:3e4}},"grok-4-1-fast-non-reasoning":{id:`grok-4-1-fast-non-reasoning`,name:`Grok 4.1 Fast (Non-Reasoning)`,family:`grok`,providerId:`xai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-07`,release_date:`2025-11-19`,last_updated:`2025-11-19`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:.2,output:.5,cache_read:.05},limit:{context:2e6,output:3e4}},"gpt-5.1-codex":{id:`gpt-5.1-codex`,name:`GPT-5.1 Codex`,family:`gpt-codex`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2024-09-30`,release_date:`2025-11-13`,last_updated:`2025-11-13`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:1.25,output:10,cache_read:.125},limit:{context:4e5,output:128e3}},"gpt-5.1-codex-mini":{id:`gpt-5.1-codex-mini`,name:`GPT-5.1 Codex mini`,family:`gpt-codex`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2024-09-30`,release_date:`2025-11-13`,last_updated:`2025-11-13`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:.25,output:2,cache_read:.025},limit:{context:4e5,output:128e3}},"gpt-5.1":{id:`gpt-5.1`,name:`GPT-5.1`,family:`gpt`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2024-09-30`,release_date:`2025-11-13`,last_updated:`2025-11-13`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:1.25,output:10,cache_read:.13},limit:{context:4e5,output:128e3}},"gpt-5.1-codex-max":{id:`gpt-5.1-codex-max`,name:`GPT-5.1 Codex Max`,family:`gpt-codex`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2024-09-30`,release_date:`2025-11-13`,last_updated:`2025-11-13`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:1.25,output:10,cache_read:.125},limit:{context:4e5,output:128e3}},"gpt-5.1-chat-latest":{id:`gpt-5.1-chat-latest`,name:`GPT-5.1 Chat`,family:`gpt-codex`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2024-09-30`,release_date:`2025-11-13`,last_updated:`2025-11-13`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:1.25,output:10,cache_read:.125},limit:{context:128e3,output:16384}},"claude-opus-4-5-20251101":{id:`claude-opus-4-5-20251101`,name:`Claude Opus 4.5`,family:`claude-opus`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-03-31`,release_date:`2025-11-01`,last_updated:`2025-11-01`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:5,output:25,cache_read:.5,cache_write:6.25},limit:{context:2e5,output:64e3}},"MiniMax-M2":{id:`MiniMax-M2`,name:`MiniMax-M2`,family:`minimax`,providerId:`minimax`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:null,release_date:`2025-10-27`,last_updated:`2025-10-27`,modalities:{input:[`text`],output:[`text`]},open_weights:!0,cost:{input:.3,output:1.2},limit:{context:196608,output:128e3}},"claude-haiku-4-5":{id:`claude-haiku-4-5`,name:`Claude Haiku 4.5 (latest)`,family:`claude-haiku`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-02-28`,release_date:`2025-10-15`,last_updated:`2025-10-15`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:1,output:5,cache_read:.1,cache_write:1.25},limit:{context:2e5,output:64e3}},"claude-haiku-4-5-20251001":{id:`claude-haiku-4-5-20251001`,name:`Claude Haiku 4.5`,family:`claude-haiku`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-02-28`,release_date:`2025-10-15`,last_updated:`2025-10-15`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:1,output:5,cache_read:.1,cache_write:1.25},limit:{context:2e5,output:64e3}},"gpt-5-pro":{id:`gpt-5-pro`,name:`GPT-5 Pro`,family:`gpt-pro`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2024-09-30`,release_date:`2025-10-06`,last_updated:`2025-10-06`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:15,output:120},limit:{context:4e5,output:272e3}},"glm-4.6":{id:`glm-4.6`,name:`GLM-4.6`,family:`glm`,providerId:`zai`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-04`,release_date:`2025-09-30`,last_updated:`2025-09-30`,modalities:{input:[`text`],output:[`text`]},open_weights:!0,cost:{input:.6,output:2.2,cache_read:.11,cache_write:0},limit:{context:204800,output:131072}},"claude-sonnet-4-5":{id:`claude-sonnet-4-5`,name:`Claude Sonnet 4.5 (latest)`,family:`claude-sonnet`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-07-31`,release_date:`2025-09-29`,last_updated:`2025-09-29`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:3,output:15,cache_read:.3,cache_write:3.75},limit:{context:2e5,output:64e3}},"claude-sonnet-4-5-20250929":{id:`claude-sonnet-4-5-20250929`,name:`Claude Sonnet 4.5`,family:`claude-sonnet`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-07-31`,release_date:`2025-09-29`,last_updated:`2025-09-29`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:3,output:15,cache_read:.3,cache_write:3.75},limit:{context:2e5,output:64e3}},"grok-4-fast-non-reasoning":{id:`grok-4-fast-non-reasoning`,name:`Grok 4 Fast (Non-Reasoning)`,family:`grok`,providerId:`xai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-07`,release_date:`2025-09-19`,last_updated:`2025-09-19`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:.2,output:.5,cache_read:.05},limit:{context:2e6,output:3e4}},"grok-4-fast":{id:`grok-4-fast`,name:`Grok 4 Fast`,family:`grok`,providerId:`xai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-07`,release_date:`2025-09-19`,last_updated:`2025-09-19`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:.2,output:.5,cache_read:.05},limit:{context:2e6,output:3e4}},"gpt-5-codex":{id:`gpt-5-codex`,name:`GPT-5-Codex`,family:`gpt-codex`,providerId:`openai`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2024-09-30`,release_date:`2025-09-15`,last_updated:`2025-09-15`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:1.25,output:10,cache_read:.125},limit:{context:4e5,output:128e3}},"grok-code-fast-1":{id:`grok-code-fast-1`,name:`Grok Code Fast 1`,family:`grok`,providerId:`xai`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2023-10`,release_date:`2025-08-28`,last_updated:`2025-08-28`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:.2,output:1.5,cache_read:.02},limit:{context:256e3,output:1e4}},"glm-4.5v":{id:`glm-4.5v`,name:`GLM-4.5V`,family:`glm`,providerId:`zai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-04`,release_date:`2025-08-11`,last_updated:`2025-08-11`,modalities:{input:[`text`,`image`,`video`],output:[`text`]},open_weights:!0,cost:{input:.6,output:1.8},limit:{context:64e3,output:16384}},"gpt-5-nano":{id:`gpt-5-nano`,name:`GPT-5 Nano`,family:`gpt-nano`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2024-05-30`,release_date:`2025-08-07`,last_updated:`2025-08-07`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:.05,output:.4,cache_read:.005},limit:{context:4e5,output:128e3}},"gpt-5-mini":{id:`gpt-5-mini`,name:`GPT-5 Mini`,family:`gpt-mini`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2024-05-30`,release_date:`2025-08-07`,last_updated:`2025-08-07`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:.25,output:2,cache_read:.025},limit:{context:4e5,output:128e3}},"gpt-5-chat-latest":{id:`gpt-5-chat-latest`,name:`GPT-5 Chat (latest)`,family:`gpt-codex`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!1,structured_output:!0,temperature:!0,knowledge:`2024-09-30`,release_date:`2025-08-07`,last_updated:`2025-08-07`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:1.25,output:10},limit:{context:4e5,output:128e3}},"gpt-5":{id:`gpt-5`,name:`GPT-5`,family:`gpt`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2024-09-30`,release_date:`2025-08-07`,last_updated:`2025-08-07`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:1.25,output:10,cache_read:.125},limit:{context:4e5,output:128e3}},"claude-opus-4-1":{id:`claude-opus-4-1`,name:`Claude Opus 4.1 (latest)`,family:`claude-opus`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-03-31`,release_date:`2025-08-05`,last_updated:`2025-08-05`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:15,output:75,cache_read:1.5,cache_write:18.75},limit:{context:2e5,output:32e3}},"claude-opus-4-1-20250805":{id:`claude-opus-4-1-20250805`,name:`Claude Opus 4.1`,family:`claude-opus`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-03-31`,release_date:`2025-08-05`,last_updated:`2025-08-05`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:15,output:75,cache_read:1.5,cache_write:18.75},limit:{context:2e5,output:32e3}},"glm-4.5-flash":{id:`glm-4.5-flash`,name:`GLM-4.5-Flash`,family:`glm-flash`,providerId:`zai`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-04`,release_date:`2025-07-28`,last_updated:`2025-07-28`,modalities:{input:[`text`],output:[`text`]},open_weights:!0,cost:{input:0,output:0,cache_read:0,cache_write:0},limit:{context:131072,output:98304}},"glm-4.5":{id:`glm-4.5`,name:`GLM-4.5`,family:`glm`,providerId:`zai`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-04`,release_date:`2025-07-28`,last_updated:`2025-07-28`,modalities:{input:[`text`],output:[`text`]},open_weights:!0,cost:{input:.6,output:2.2,cache_read:.11,cache_write:0},limit:{context:131072,output:98304}},"glm-4.5-air":{id:`glm-4.5-air`,name:`GLM-4.5-Air`,family:`glm-air`,providerId:`zai`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-04`,release_date:`2025-07-28`,last_updated:`2025-07-28`,modalities:{input:[`text`],output:[`text`]},open_weights:!0,cost:{input:.2,output:1.1,cache_read:.03,cache_write:0},limit:{context:131072,output:98304}},"grok-4":{id:`grok-4`,name:`Grok 4`,family:`grok`,providerId:`xai`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-07`,release_date:`2025-07-09`,last_updated:`2025-07-09`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:3,output:15,cache_read:.75},limit:{context:256e3,output:64e3}},"o3-pro":{id:`o3-pro`,name:`o3-pro`,family:`o-pro`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2024-05`,release_date:`2025-06-10`,last_updated:`2025-06-10`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:20,output:80},limit:{context:2e5,output:1e5}},"claude-opus-4-0":{id:`claude-opus-4-0`,name:`Claude Opus 4 (latest)`,family:`claude-opus`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-03-31`,release_date:`2025-05-22`,last_updated:`2025-05-22`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:15,output:75,cache_read:1.5,cache_write:18.75},limit:{context:2e5,output:32e3}},"claude-sonnet-4-20250514":{id:`claude-sonnet-4-20250514`,name:`Claude Sonnet 4`,family:`claude-sonnet`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-03-31`,release_date:`2025-05-22`,last_updated:`2025-05-22`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:3,output:15,cache_read:.3,cache_write:3.75},limit:{context:2e5,output:64e3}},"claude-opus-4-20250514":{id:`claude-opus-4-20250514`,name:`Claude Opus 4`,family:`claude-opus`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-03-31`,release_date:`2025-05-22`,last_updated:`2025-05-22`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:15,output:75,cache_read:1.5,cache_write:18.75},limit:{context:2e5,output:32e3}},"claude-sonnet-4-0":{id:`claude-sonnet-4-0`,name:`Claude Sonnet 4 (latest)`,family:`claude-sonnet`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2025-03-31`,release_date:`2025-05-22`,last_updated:`2025-05-22`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:3,output:15,cache_read:.3,cache_write:3.75},limit:{context:2e5,output:64e3}},"codex-mini-latest":{id:`codex-mini-latest`,name:`Codex Mini`,family:`gpt-codex-mini`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!1,knowledge:`2024-04`,release_date:`2025-05-16`,last_updated:`2025-05-16`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:1.5,output:6,cache_read:.375},limit:{context:2e5,output:1e5}},"o4-mini":{id:`o4-mini`,name:`o4-mini`,family:`o-mini`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2024-05`,release_date:`2025-04-16`,last_updated:`2025-04-16`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:1.1,output:4.4,cache_read:.28},limit:{context:2e5,output:1e5}},o3:{id:`o3`,name:`o3`,family:`o`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2024-05`,release_date:`2025-04-16`,last_updated:`2025-04-16`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:2,output:8,cache_read:.5},limit:{context:2e5,output:1e5}},"gpt-4.1-nano":{id:`gpt-4.1-nano`,name:`GPT-4.1 nano`,family:`gpt-nano`,providerId:`openai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!0,temperature:!0,knowledge:`2024-04`,release_date:`2025-04-14`,last_updated:`2025-04-14`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:.1,output:.4,cache_read:.03},limit:{context:1047576,output:32768}},"gpt-4.1-mini":{id:`gpt-4.1-mini`,name:`GPT-4.1 mini`,family:`gpt-mini`,providerId:`openai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!0,temperature:!0,knowledge:`2024-04`,release_date:`2025-04-14`,last_updated:`2025-04-14`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:.4,output:1.6,cache_read:.1},limit:{context:1047576,output:32768}},"gpt-4.1":{id:`gpt-4.1`,name:`GPT-4.1`,family:`gpt`,providerId:`openai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!0,temperature:!0,knowledge:`2024-04`,release_date:`2025-04-14`,last_updated:`2025-04-14`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:2,output:8,cache_read:.5},limit:{context:1047576,output:32768}},"o1-pro":{id:`o1-pro`,name:`o1-pro`,family:`o-pro`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2023-09`,release_date:`2025-03-19`,last_updated:`2025-03-19`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:150,output:600},limit:{context:2e5,output:1e5}},"claude-3-7-sonnet-20250219":{id:`claude-3-7-sonnet-20250219`,name:`Claude Sonnet 3.7`,family:`claude-sonnet`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-10-31`,release_date:`2025-02-19`,last_updated:`2025-02-19`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:3,output:15,cache_read:.3,cache_write:3.75},limit:{context:2e5,output:64e3}},"claude-3-7-sonnet-latest":{id:`claude-3-7-sonnet-latest`,name:`Claude Sonnet 3.7 (latest)`,family:`claude-sonnet`,providerId:`anthropic`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-10-31`,release_date:`2025-02-19`,last_updated:`2025-02-19`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:3,output:15,cache_read:.3,cache_write:3.75},limit:{context:2e5,output:64e3}},"grok-3-fast":{id:`grok-3-fast`,name:`Grok 3 Fast`,family:`grok`,providerId:`xai`,attachment:!1,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-11`,release_date:`2025-02-17`,last_updated:`2025-02-17`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:5,output:25,cache_read:1.25},limit:{context:131072,output:8192}},"grok-3-mini-fast-latest":{id:`grok-3-mini-fast-latest`,name:`Grok 3 Mini Fast Latest`,family:`grok`,providerId:`xai`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-11`,release_date:`2025-02-17`,last_updated:`2025-02-17`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:.6,output:4,cache_read:.15},limit:{context:131072,output:8192}},"grok-3":{id:`grok-3`,name:`Grok 3`,family:`grok`,providerId:`xai`,attachment:!1,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-11`,release_date:`2025-02-17`,last_updated:`2025-02-17`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:3,output:15,cache_read:.75},limit:{context:131072,output:8192}},"grok-3-fast-latest":{id:`grok-3-fast-latest`,name:`Grok 3 Fast Latest`,family:`grok`,providerId:`xai`,attachment:!1,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-11`,release_date:`2025-02-17`,last_updated:`2025-02-17`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:5,output:25,cache_read:1.25},limit:{context:131072,output:8192}},"grok-3-latest":{id:`grok-3-latest`,name:`Grok 3 Latest`,family:`grok`,providerId:`xai`,attachment:!1,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-11`,release_date:`2025-02-17`,last_updated:`2025-02-17`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:3,output:15,cache_read:.75},limit:{context:131072,output:8192}},"grok-3-mini":{id:`grok-3-mini`,name:`Grok 3 Mini`,family:`grok`,providerId:`xai`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-11`,release_date:`2025-02-17`,last_updated:`2025-02-17`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:.3,output:.5,cache_read:.075},limit:{context:131072,output:8192}},"grok-3-mini-latest":{id:`grok-3-mini-latest`,name:`Grok 3 Mini Latest`,family:`grok`,providerId:`xai`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-11`,release_date:`2025-02-17`,last_updated:`2025-02-17`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:.3,output:.5,cache_read:.075},limit:{context:131072,output:8192}},"grok-3-mini-fast":{id:`grok-3-mini-fast`,name:`Grok 3 Mini Fast`,family:`grok`,providerId:`xai`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-11`,release_date:`2025-02-17`,last_updated:`2025-02-17`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:.6,output:4,cache_read:.15},limit:{context:131072,output:8192}},"o3-mini":{id:`o3-mini`,name:`o3-mini`,family:`o-mini`,providerId:`openai`,attachment:!1,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2024-05`,release_date:`2024-12-20`,last_updated:`2025-01-29`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:1.1,output:4.4,cache_read:.55},limit:{context:2e5,output:1e5}},"grok-2-1212":{id:`grok-2-1212`,name:`Grok 2 (1212)`,family:`grok`,providerId:`xai`,attachment:!1,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-08`,release_date:`2024-12-12`,last_updated:`2024-12-12`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:2,output:10,cache_read:2},limit:{context:131072,output:8192}},o1:{id:`o1`,name:`o1`,family:`o`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!0,temperature:!1,knowledge:`2023-09`,release_date:`2024-12-05`,last_updated:`2024-12-05`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:15,output:60,cache_read:7.5},limit:{context:2e5,output:1e5}},"gpt-4o-2024-11-20":{id:`gpt-4o-2024-11-20`,name:`GPT-4o (2024-11-20)`,family:`gpt`,providerId:`openai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!0,temperature:!0,knowledge:`2023-09`,release_date:`2024-11-20`,last_updated:`2024-11-20`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:2.5,output:10,cache_read:1.25},limit:{context:128e3,output:16384}},"grok-vision-beta":{id:`grok-vision-beta`,name:`Grok Vision Beta`,family:`grok-vision`,providerId:`xai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-08`,release_date:`2024-11-01`,last_updated:`2024-11-01`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:5,output:15,cache_read:5},limit:{context:8192,output:4096}},"grok-beta":{id:`grok-beta`,name:`Grok Beta`,family:`grok-beta`,providerId:`xai`,attachment:!1,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-08`,release_date:`2024-11-01`,last_updated:`2024-11-01`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:5,output:15,cache_read:5},limit:{context:131072,output:4096}},"claude-3-5-sonnet-20241022":{id:`claude-3-5-sonnet-20241022`,name:`Claude Sonnet 3.5 v2`,family:`claude-sonnet`,providerId:`anthropic`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-04-30`,release_date:`2024-10-22`,last_updated:`2024-10-22`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:3,output:15,cache_read:.3,cache_write:3.75},limit:{context:2e5,output:8192}},"claude-3-5-haiku-latest":{id:`claude-3-5-haiku-latest`,name:`Claude Haiku 3.5 (latest)`,family:`claude-haiku`,providerId:`anthropic`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-07-31`,release_date:`2024-10-22`,last_updated:`2024-10-22`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:.8,output:4,cache_read:.08,cache_write:1},limit:{context:2e5,output:8192}},"claude-3-5-haiku-20241022":{id:`claude-3-5-haiku-20241022`,name:`Claude Haiku 3.5`,family:`claude-haiku`,providerId:`anthropic`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-07-31`,release_date:`2024-10-22`,last_updated:`2024-10-22`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:.8,output:4,cache_read:.08,cache_write:1},limit:{context:2e5,output:8192}},"o1-preview":{id:`o1-preview`,name:`o1-preview`,family:`o`,providerId:`openai`,attachment:!1,reasoning:!0,tool_call:!1,structured_output:!1,temperature:!0,knowledge:`2023-09`,release_date:`2024-09-12`,last_updated:`2024-09-12`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:15,output:60,cache_read:7.5},limit:{context:128e3,output:32768}},"o1-mini":{id:`o1-mini`,name:`o1-mini`,family:`o-mini`,providerId:`openai`,attachment:!1,reasoning:!0,tool_call:!1,structured_output:!0,temperature:!1,knowledge:`2023-09`,release_date:`2024-09-12`,last_updated:`2024-09-12`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:1.1,output:4.4,cache_read:.55},limit:{context:128e3,output:65536}},"grok-2-vision":{id:`grok-2-vision`,name:`Grok 2 Vision`,family:`grok`,providerId:`xai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-08`,release_date:`2024-08-20`,last_updated:`2024-08-20`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:2,output:10,cache_read:2},limit:{context:8192,output:4096}},"grok-2":{id:`grok-2`,name:`Grok 2`,family:`grok`,providerId:`xai`,attachment:!1,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-08`,release_date:`2024-08-20`,last_updated:`2024-08-20`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:2,output:10,cache_read:2},limit:{context:131072,output:8192}},"grok-2-vision-1212":{id:`grok-2-vision-1212`,name:`Grok 2 Vision (1212)`,family:`grok`,providerId:`xai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-08`,release_date:`2024-08-20`,last_updated:`2024-12-12`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:2,output:10,cache_read:2},limit:{context:8192,output:4096}},"grok-2-latest":{id:`grok-2-latest`,name:`Grok 2 Latest`,family:`grok`,providerId:`xai`,attachment:!1,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-08`,release_date:`2024-08-20`,last_updated:`2024-12-12`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:2,output:10,cache_read:2},limit:{context:131072,output:8192}},"grok-2-vision-latest":{id:`grok-2-vision-latest`,name:`Grok 2 Vision Latest`,family:`grok`,providerId:`xai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-08`,release_date:`2024-08-20`,last_updated:`2024-12-12`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:2,output:10,cache_read:2},limit:{context:8192,output:4096}},"gpt-4o-2024-08-06":{id:`gpt-4o-2024-08-06`,name:`GPT-4o (2024-08-06)`,family:`gpt`,providerId:`openai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!0,temperature:!0,knowledge:`2023-09`,release_date:`2024-08-06`,last_updated:`2024-08-06`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:2.5,output:10,cache_read:1.25},limit:{context:128e3,output:16384}},"gpt-4o-mini":{id:`gpt-4o-mini`,name:`GPT-4o mini`,family:`gpt-mini`,providerId:`openai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!0,temperature:!0,knowledge:`2023-09`,release_date:`2024-07-18`,last_updated:`2024-07-18`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:.15,output:.6,cache_read:.08},limit:{context:128e3,output:16384}},"o3-deep-research":{id:`o3-deep-research`,name:`o3-deep-research`,family:`o`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!1,knowledge:`2024-05`,release_date:`2024-06-26`,last_updated:`2024-06-26`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:10,output:40,cache_read:2.5},limit:{context:2e5,output:1e5}},"o4-mini-deep-research":{id:`o4-mini-deep-research`,name:`o4-mini-deep-research`,family:`o-mini`,providerId:`openai`,attachment:!0,reasoning:!0,tool_call:!0,structured_output:!1,temperature:!1,knowledge:`2024-05`,release_date:`2024-06-26`,last_updated:`2024-06-26`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:2,output:8,cache_read:.5},limit:{context:2e5,output:1e5}},"claude-3-5-sonnet-20240620":{id:`claude-3-5-sonnet-20240620`,name:`Claude Sonnet 3.5`,family:`claude-sonnet`,providerId:`anthropic`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2024-04-30`,release_date:`2024-06-20`,last_updated:`2024-06-20`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:3,output:15,cache_read:.3,cache_write:3.75},limit:{context:2e5,output:8192}},"gpt-4o-2024-05-13":{id:`gpt-4o-2024-05-13`,name:`GPT-4o (2024-05-13)`,family:`gpt`,providerId:`openai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!0,temperature:!0,knowledge:`2023-09`,release_date:`2024-05-13`,last_updated:`2024-05-13`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:5,output:15},limit:{context:128e3,output:4096}},"gpt-4o":{id:`gpt-4o`,name:`GPT-4o`,family:`gpt`,providerId:`openai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!0,temperature:!0,knowledge:`2023-09`,release_date:`2024-05-13`,last_updated:`2024-08-06`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:2.5,output:10,cache_read:1.25},limit:{context:128e3,output:16384}},"claude-3-haiku-20240307":{id:`claude-3-haiku-20240307`,name:`Claude Haiku 3`,family:`claude-haiku`,providerId:`anthropic`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2023-08-31`,release_date:`2024-03-13`,last_updated:`2024-03-13`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:.25,output:1.25,cache_read:.03,cache_write:.3},limit:{context:2e5,output:4096}},"claude-3-sonnet-20240229":{id:`claude-3-sonnet-20240229`,name:`Claude Sonnet 3`,family:`claude-sonnet`,providerId:`anthropic`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2023-08-31`,release_date:`2024-03-04`,last_updated:`2024-03-04`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:3,output:15,cache_read:.3,cache_write:.3},limit:{context:2e5,output:4096}},"claude-3-opus-20240229":{id:`claude-3-opus-20240229`,name:`Claude Opus 3`,family:`claude-opus`,providerId:`anthropic`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2023-08-31`,release_date:`2024-02-29`,last_updated:`2024-02-29`,modalities:{input:[`text`,`image`,`pdf`],output:[`text`]},open_weights:!1,cost:{input:15,output:75,cache_read:1.5,cache_write:18.75},limit:{context:2e5,output:4096}},"text-embedding-3-small":{id:`text-embedding-3-small`,name:`text-embedding-3-small`,family:`text-embedding`,providerId:`openai`,attachment:!1,reasoning:!1,tool_call:!1,structured_output:!1,temperature:!1,knowledge:`2024-01`,release_date:`2024-01-25`,last_updated:`2024-01-25`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:.02,output:0},limit:{context:8191,output:1536}},"text-embedding-3-large":{id:`text-embedding-3-large`,name:`text-embedding-3-large`,family:`text-embedding`,providerId:`openai`,attachment:!1,reasoning:!1,tool_call:!1,structured_output:!1,temperature:!1,knowledge:`2024-01`,release_date:`2024-01-25`,last_updated:`2024-01-25`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:.13,output:0},limit:{context:8191,output:3072}},"gpt-4":{id:`gpt-4`,name:`GPT-4`,family:`gpt`,providerId:`openai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2023-11`,release_date:`2023-11-06`,last_updated:`2024-04-09`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:30,output:60},limit:{context:8192,output:8192}},"gpt-4-turbo":{id:`gpt-4-turbo`,name:`GPT-4 Turbo`,family:`gpt`,providerId:`openai`,attachment:!0,reasoning:!1,tool_call:!0,structured_output:!1,temperature:!0,knowledge:`2023-12`,release_date:`2023-11-06`,last_updated:`2024-04-09`,modalities:{input:[`text`,`image`],output:[`text`]},open_weights:!1,cost:{input:10,output:30},limit:{context:128e3,output:4096}},"gpt-3.5-turbo":{id:`gpt-3.5-turbo`,name:`GPT-3.5-turbo`,family:`gpt`,providerId:`openai`,attachment:!1,reasoning:!1,tool_call:!1,structured_output:!1,temperature:!0,knowledge:`2021-09-01`,release_date:`2023-03-01`,last_updated:`2023-11-06`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:.5,output:1.5,cache_read:1.25},limit:{context:16385,output:4096}},"text-embedding-ada-002":{id:`text-embedding-ada-002`,name:`text-embedding-ada-002`,family:`text-embedding`,providerId:`openai`,attachment:!1,reasoning:!1,tool_call:!1,structured_output:!1,temperature:!1,knowledge:`2022-12`,release_date:`2022-12-15`,last_updated:`2022-12-15`,modalities:{input:[`text`],output:[`text`]},open_weights:!1,cost:{input:.1,output:0},limit:{context:8192,output:1536}}}})(P||={});let F;(function(e){e.catalog=P.models,e.providers=P.providers;function t(e){for(let t of Object.values(P.models))if(t.providerId===e&&!(e===`openai`&&!t.family?.includes(`codex`)))return t.id;throw Error(`No models found for provider "${e}". Run 'pnpm models' to regenerate model data.`)}function n(){return{anthropic:t(`anthropic`),openai:t(`openai`),xai:t(`xai`),minimax:t(`minimax`),zai:t(`zai`)}}let r=n();function i(e){return P.models[e]}e.get=i;function a(e){return e===`llamacpp`?`llama.cpp`:P.providers[e].name}e.providerName=a;function o(e){return e===`openai`||e===`xai`||e===`llamacpp`?`openai`:`anthropic`}e.sdk=o;function s(e){return e!==`llamacpp`}e.isStaticProvider=s;function c(e){return e.family?.includes(`codex`)??!1}e.isCodexModel=c;function l(e){return Object.values(P.models).filter(t=>t.providerId===e?e===`openai`?c(t):!0:!1).map(e=>e.id)}e.forProvider=l;function u(){return[...P.providerIds,`llamacpp`]}e.providerIds=u;function d(e){return r[e]}e.defaultModel=d})(F||={});let I;(function(e){let t=new Set([`user`,`assistant`,`tool_result`]);function n(e){return t.has(e.type)}e.isLLMVisible=n;function r(e){return e.filter(n)}e.getLLMVisibleItems=r;function i(e){return r(e).map(e=>{switch(e.type){case`user`:return{role:`user`,content:e.content};case`assistant`:return{role:`assistant`,content:e.content,tool_calls:e.tool_calls};case`tool_result`:return{role:`tool_result`,results:e.results}}})}e.toLLMMessages=i;function a(){return crypto.randomUUID()}e.nextId=a;function o(e){let{model:t,system:n,cwd:r}=e;return f()(e=>({history:[],model:t,system:n,cwd:r,status:`idle`,activity:null,cost:0,pushUserMessage(t){e(e=>({history:[...e.history,{id:a(),type:`user`,content:t}]}))},pushAssistantMessage(t){e(e=>({history:[...e.history,{id:a(),type:`assistant`,content:t.content,tool_calls:t.toolCalls}]}))},pushToolResult(t){e(e=>({history:[...e.history,{id:a(),type:`tool_result`,results:t}]}))},pushError(t){e(e=>({history:[...e.history,{id:a(),type:`error`,error:t}]}))},setStatus(t){e({status:t})},setActivity(t){e({activity:t})},addCost(t){e(e=>({cost:e.cost+t}))},setModel(t){e({model:t})},setCwd(t){e({cwd:t})},reset(){e({history:[],status:`idle`,activity:null,cost:0})}}))}e.createAppStore=o;function s(e){let{store:t,usage:n,model:r}=e,i=r.cost,a=n.cacheReadTokens??0,o=n.cacheWriteTokens??0,s=(n.inputTokens-a-o)/1e6*i.input,c=n.outputTokens/1e6*i.output,l=a/1e6*(i.cache_read??i.input),u=o/1e6*(i.cache_write??i.input);t.getState().addCost(s+c+l+u)}e.addUsageCost=s;function c(e){return Math.ceil(e/4)}function l(e){let{history:t,system:n}=e,i=c(n.length),a=0,o=0,s=r(t);for(let e of s)switch(e.type){case`user`:a+=e.content.length;break;case`assistant`:a+=e.content.length,e.tool_calls.length>0&&(o+=JSON.stringify(e.tool_calls).length);break;case`tool_result`:e.results.length>0&&(o+=JSON.stringify(e.results).length);break}let l=c(a),u=c(o);return{total:i+l+u,system:i,tools:u,conversation:l}}e.estimateTokens=l})(I||={});let ae;(function(e){function t(e){if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`Tool input must be a non-null object`)}function n(e,t){return typeof e.description==`string`?e.description:t}async function*r(e){let{llm:r,tools:i,store:a,userMessage:o,signal:s}=e,c=a.getState();c.setStatus(`working`),yield{type:`turn_start`},c.pushUserMessage(o);try{for(;;){let e=a.getState();if(s?.aborted){e.setStatus(`idle`),e.setActivity(null),yield{type:`turn_end`};return}let o={messages:I.toLLMMessages(e.history),system:e.system};s!==void 0&&(o.signal=s);let c=await r.complete(o),l=F.get(e.model);l!==void 0&&I.addUsageCost({store:a,usage:c.usage,model:l}),yield{type:`usage`,usage:c.usage};let u={role:`assistant`,content:c.content,tool_calls:c.toolCalls};for(let r of c.toolCalls){t(r.input);let i=r.input,a=n(i,r.name);e.setActivity(a),yield{type:`tool_use`,name:r.name,callId:r.id,description:a,input:i}}if(e.pushAssistantMessage({content:c.content,toolCalls:c.toolCalls}),c.toolCalls.length===0){e.setStatus(`idle`),e.setActivity(null),yield{type:`message`,message:u},yield{type:`turn_end`};return}let d=[];for(let r of c.toolCalls){t(r.input);let a=r.input,o=n(a,r.name);e.setActivity(o);let s=await i.execute(r);s.description=o,d.push(s),yield{type:`tool_result`,name:r.name,callId:r.id,description:o,output:s.output,is_error:s.is_error??!1}}e.pushToolResult(d),e.setActivity(null),yield{type:`message`,message:u}}}catch(e){let t=a.getState();t.setStatus(`idle`),t.setActivity(null),yield{type:`error`,error:e instanceof Error?e:Error(String(e),{cause:e})},yield{type:`turn_end`}}}e.run=r})(ae||={});let oe;(function(e){function t(){return p.join(_.homedir(),`.config`,`femto`,`bash-output`)}e.dir=t;function n(e){let n=e??t();g.existsSync(n)||g.mkdirSync(n,{recursive:!0})}e.ensureDir=n;function r(e){return String(e).padStart(2,`0`)}function i(e){return`${String(e.getFullYear())}-${r(e.getMonth()+1)}-${r(e.getDate())}-${r(e.getHours())}${r(e.getMinutes())}${r(e.getSeconds())}`}function a(){return`${i(new Date)}-${v.randomUUID().slice(0,8)}.txt`}e.generateFilename=a;function o(e){let r=e.outputDir??t();n(r);let i=a(),o=p.join(r,i);return g.writeFileSync(o,e.output,`utf-8`),o}e.persistOutput=o;function s(e){let{output:t,exitCode:n,command:r}=e,i={output:t};e.outputDir!==void 0&&(i.outputDir=e.outputDir);let a=o(i),s=t.split(`
|
|
3
3
|
`),c=s.length,l=c>10,u,d;if(l){let e=c-5-5,t=s.slice(0,5),i=s.slice(-5);u=`[stdout: ${String(c)} lines, exit: ${String(n)}, showing 5 head and 5 tail, ${String(e)} omitted, use read() to see full output, full output: ${a}]`;let o=`...\n[${String(e)} lines omitted, use read() to see full output, full output: ${a}]\n...`;d=`$ ${r}\n${t.join(`
|
|
4
4
|
`)}\n${o}\n${i.join(`
|
|
5
5
|
`)}`}else u=`[stdout: ${String(c)} lines, exit: ${String(n)}, full output: ${a}]`,d=`$ ${r}\n${t}`;return{formatted:`${u}\n\n${d}`,filePath:a}}e.format=s})(oe||={});let L;(function(e){e.schema={name:`bash`,description:`Run a bash command`,input_schema:{type:`object`,properties:{command:{type:`string`,description:`The command to run`},description:{type:`string`,description:`Short human-friendly description of what this does`}},required:[`command`,`description`]}};function t(e){return e.name===`bash`}e.isMatch=t;async function n(e){let{call:t,cwd:n}=e,r=t.input.command.trim(),i=h(`bash`,[`-c`,r],{cwd:n,env:{...process.env,TERM:`xterm-256color`,FEMTO:`1`,SHELL:`/bin/bash`}}),a=[];i.stdout.setEncoding(`utf-8`),i.stderr.setEncoding(`utf-8`),i.stdout.on(`data`,e=>{a.push(e)}),i.stderr.on(`data`,e=>{a.push(e)});let o=await new Promise(e=>{i.on(`close`,t=>{e(t??0)}),i.on(`error`,()=>{e(1)})}),s=a.join(``).trim(),{formatted:c}=oe.format({output:s,exitCode:o,command:r}),l=s.split(`
|
|
@@ -7,12 +7,12 @@ import{parseArgs as e}from"node:util";import t,{useCallback as n,useEffect as r,
|
|
|
7
7
|
`),n=e.length;if(o>=n){let e={call_id:t.id,name:`read`,output:`[${a}: ${String(n)} lines, offset ${String(o)} is beyond end of file]`,description:a,filePath:a};return t.input.offset!==void 0&&(e.offset=o),e}let r=e.slice(o,o+s),i=o+s<n,l=n-o-r.length,u=[];c>=400&&u.push(`[Note: Max 400 lines per read. Use offset to read this file in chunks if more lines are needed.]`);let d=o+r.length-1;i?u.push(`[${a}: ${String(n)} lines, showing ${String(o)}-${String(d)}, ${String(l)} omitted]`):u.push(`[${a}: ${String(n)} lines, showing ${String(o)}-${String(d)}]`),u.push(r.join(`
|
|
8
8
|
`)),i&&u.push(`[${String(l)} more lines, use offset=${String(o+s)} to continue]`);let f={call_id:t.id,name:`read`,output:u.join(`
|
|
9
9
|
|
|
10
|
-
`),description:a,filePath:a};return t.input.offset!==void 0&&(f.offset=o),t.input.limit!==void 0&&(f.limit=s),f}catch(e){if(r(e)&&e.code===`ENOENT`)return{call_id:t.id,name:`read`,output:`File not found: ${a}`,is_error:!0,filePath:a};if(r(e)&&e.code===`EISDIR`)return{call_id:t.id,name:`read`,output:`Cannot read directory: ${a}. Use bash with 'ls' to list directory contents.`,is_error:!0,filePath:a};throw Error(`Failed to read ${a}`,{cause:e})}}e.execute=n;function r(e){return e instanceof Error&&`code`in e}})(z||={});let B;(function(e){e.schemas=[L.schema,R.schema,z.schema];function t(e){let t=e?.cwd??process.cwd();return{async execute(r){if(L.isMatch(r)){let i=r.input.command.trim();if(i.startsWith(`cd `)){let a=n({target:i.slice(3).trim(),cwd:t});return a.error===void 0?(t=a.path,e?.onCwdChange?.(t),{call_id:r.id,name:`bash`,output:`Changed directory to ${t}`}):{call_id:r.id,name:`bash`,output:a.error,is_error:!0}}return await L.execute({call:r,cwd:t})}return R.isMatch(r)?await R.execute({call:r}):z.isMatch(r)?await z.execute({call:r,cwd:t}):{call_id:r.id,name:`unknown`,output:`Unknown tool`,is_error:!0}}}}e.createExecutor=t;function n(e){let{target:t,cwd:n}=e,r;if(t===`~`||t.startsWith(`~/`)){let e=process.env.HOME;if(!e)return{error:`HOME environment variable not set`};r=t===`~`?e:p.join(e,t.slice(2))}else r=p.isAbsolute(t)?t:p.resolve(n,t);return{path:r}}e.resolveCd=n})(B||={});let se;(function(e){function t(e){let{store:t,llmResolver:n}=e,r=B.createExecutor({onCwdChange:e=>{t.getState().setCwd(e)}}),i;return{async*run(e){let a=t.getState(),o=n.resolve(a.model);i=new AbortController;let s={llm:o,tools:r,store:t,userMessage:e,signal:i.signal};try{yield*ae.run(s)}finally{i=void 0}},abort(){i?.abort()}}}e.create=t})(se||={});let V;(function(e){let t=S.enum([`anthropic`,`openai`,`xai`,`minimax`,`zai`,`llamacpp`]),n=S.object({provider:t,model:S.string().optional(),credentials:S.record(S.string(),S.string()),llamacppUrl:S.string().optional()});function r(){return p.join(_.homedir(),`.femto`)}e.dir=r;function i(){return p.join(r(),`config.json`)}e.filePath=i;function a(){return g.existsSync(i())}e.exists=a;function o(){if(!a())return;let e=i(),t=g.readFileSync(e,`utf-8`),r;try{r=JSON.parse(t)}catch(t){throw Error(`Failed to parse config at ${e}: ${t instanceof Error?t.message:String(t)}`)}let o=n.safeParse(r);if(!o.success)throw Error(`Invalid config at ${e}: ${o.error.issues.map(e=>e.message).join(`, `)}`);let s={provider:o.data.provider,credentials:o.data.credentials};return o.data.model!==void 0&&(s.model=o.data.model),o.data.llamacppUrl!==void 0&&(s.llamacppUrl=o.data.llamacppUrl),s}e.load=o;function s(e){let t=r();g.existsSync(t)||g.mkdirSync(t,{recursive:!0}),g.writeFileSync(i(),JSON.stringify(e,null,2))}e.save=s;function c(e){return process.env[{anthropic:`ANTHROPIC_API_KEY`,openai:`OPENAI_API_KEY`,xai:`XAI_API_KEY`,minimax:`MINIMAX_API_KEY`,zai:`ZAI_API_KEY`}[e.provider]]??e.data.credentials[e.provider]}e.getApiKey=c;function l(e){let t=process.env.LLAMACPP_URL??e.llamacppUrl;if(t)return t.endsWith(`/`)?t.slice(0,-1):t}e.getLlamaCppUrl=l;function u(e){return e.provider===`llamacpp`?l(e.data)!==void 0:c({provider:e.provider,data:e.data})!==void 0}e.hasCredentials=u;function d(){return!!process.env.FEMTO_VERBOSE}e.verbose=d})(V||={});let H;(function(e){function t(e){if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`Tool input must be a non-null object`)}function n(e){let n=new C({apiKey:e.apiKey,baseURL:e.baseURL});return{async complete(a){let o=i(a.messages),s=r(B.schemas),c=await n.messages.create({model:e.model,max_tokens:8096,system:a.system??`You are a helpful coding assistant.`,messages:o,tools:s},{signal:a.signal}),l=``,u=[];for(let e of c.content)e.type===`text`?l+=e.text:e.type===`tool_use`&&(t(e.input),u.push({id:e.id,name:e.name,input:e.input}));let d;d=c.stop_reason===`tool_use`?`tool_use`:c.stop_reason===`max_tokens`?`max_tokens`:`end`;let f={inputTokens:c.usage.input_tokens,outputTokens:c.usage.output_tokens},p={...c.usage},m=p.cache_read_input_tokens;typeof m==`number`&&(f.cacheReadTokens=m);let h=p.cache_creation_input_tokens;return typeof h==`number`&&(f.cacheWriteTokens=h),{content:l,toolCalls:u,stopReason:d,usage:f}}}}e.create=n;function r(e){return e.map(e=>({name:e.name,description:e.description,input_schema:{type:e.input_schema.type,properties:e.input_schema.properties,required:[...e.input_schema.required]}}))}function i(e){let n=[];for(let r of e)switch(r.role){case`user`:n.push({role:`user`,content:r.content});break;case`assistant`:{let e=[];r.content&&e.push({type:`text`,text:r.content});for(let n of r.tool_calls)t(n.input),e.push({type:`tool_use`,id:n.id,name:n.name,input:n.input});n.push({role:`assistant`,content:e});break}case`tool_result`:{let e=r.results.map(e=>{let t={type:`tool_result`,tool_use_id:e.call_id,content:e.output};return e.is_error===!0&&(t.is_error=!0),t});n.push({role:`user`,content:e});break}}return n}})(H||={});let U;(function(e){function t(e){let t=new w({apiKey:`no-key-needed`,baseURL:`${e.baseUrl}/v1`});return{async complete(i){let a=r(B.schemas),o=n(i.messages,i.system),s={model:e.model,messages:o};a.length>0&&(s.tools=a);let c=await t.chat.completions.create(s,{signal:i.signal}),l=c.choices[0];if(l===void 0)throw Error(`No response choice returned from llama.cpp`);let u=l.message.content??``,d=[];if(l.message.tool_calls)for(let e of l.message.tool_calls){if(e.type!==`function`)continue;let t;try{t=JSON.parse(e.function.arguments)}catch{t={}}d.push({id:e.id,name:e.function.name,input:t})}let f;f=l.finish_reason===`length`?`max_tokens`:l.finish_reason===`tool_calls`||d.length>0?`tool_use`:`end`;let p={inputTokens:c.usage?.prompt_tokens??0,outputTokens:c.usage?.completion_tokens??0};return{content:u,toolCalls:d,stopReason:f,usage:p}}}}e.create=t;function n(e,t){let n=[];t&&n.push({role:`system`,content:t});for(let t of e)switch(t.role){case`user`:n.push({role:`user`,content:t.content});break;case`assistant`:t.tool_calls.length>0?n.push({role:`assistant`,content:t.content||null,tool_calls:t.tool_calls.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.input)}}))}):n.push({role:`assistant`,content:t.content});break;case`tool_result`:for(let e of t.results)n.push({role:`tool`,tool_call_id:e.call_id,content:e.output});break}return n}function r(e){return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.input_schema}}))}let i=S.object({data:S.array(S.object({id:S.string()}))});async function a(e){let t=await fetch(`${e}/v1/models`);if(!t.ok)throw Error(`Failed to fetch models: ${String(t.status)} ${t.statusText}`);let n=i.safeParse(await t.json());if(!n.success)throw Error(`Invalid response format from llama.cpp server`);return n.data.data.map(e=>e.id)}e.listModels=a})(U||={});let ce;(function(e){function t(e){return H.create({model:e.model,apiKey:e.apiKey,baseURL:`https://api.minimax.io/anthropic/v1`})}e.create=t})(ce||={});let W;(function(e){function t(e){let t=new w({apiKey:e.apiKey,baseURL:e.baseURL});return{async complete(i){let a=r(B.schemas),o=n(i.messages),s={model:e.model,input:o,tools:a};i.system&&(s.instructions=i.system);let c=await t.responses.create(s,{signal:i.signal}),l=``,u=[];for(let e of c.output)if(e.type===`message`)for(let t of e.content)t.type===`output_text`&&(l+=t.text);else if(e.type===`function_call`){let t;try{t=JSON.parse(e.arguments)}catch{t={}}u.push({id:e.call_id,name:e.name,input:t})}let d;d=c.status===`incomplete`?c.incomplete_details?.reason===`max_output_tokens`?`max_tokens`:`end`:u.length>0?`tool_use`:`end`;let f={inputTokens:c.usage?.input_tokens??0,outputTokens:c.usage?.output_tokens??0},p=c.usage?.input_tokens_details;return p&&`cached_tokens`in p&&(f.cacheReadTokens=p.cached_tokens),{content:l,toolCalls:u,stopReason:d,usage:f}}}}e.create=t;function n(e){let t=[];for(let n of e)switch(n.role){case`user`:t.push({type:`message`,role:`user`,content:[{type:`input_text`,text:n.content}]});break;case`assistant`:n.content&&t.push({type:`message`,role:`assistant`,content:n.content});for(let e of n.tool_calls)t.push({type:`function_call`,call_id:e.id,name:e.name,arguments:JSON.stringify(e.input)});break;case`tool_result`:for(let e of n.results)t.push({type:`function_call_output`,call_id:e.call_id,output:e.output});break}return t}function r(e){return e.map(e=>({type:`function`,name:e.name,description:e.description,parameters:e.input_schema,strict:!1}))}})(W||={});let le;(function(e){function t(e){return W.create({model:e.model,apiKey:e.apiKey,baseURL:`https://api.x.ai/v1`})}e.create=t})(le||={});let ue;(function(e){function t(e){return H.create({model:e.model,apiKey:e.apiKey,baseURL:`https://api.z.ai/api/anthropic`})}e.create=t})(ue||={});let de;(function(e){let t={anthropic:e=>H.create({model:e.model,apiKey:e.apiKey}),openai:e=>W.create({model:e.model,apiKey:e.apiKey}),xai:e=>le.create({model:e.model,apiKey:e.apiKey}),minimax:e=>ce.create({model:e.model,apiKey:e.apiKey}),zai:e=>ue.create({model:e.model,apiKey:e.apiKey}),llamacpp:e=>{if(e.baseUrl===void 0)throw Error(`baseUrl required for llamacpp`);return U.create({model:e.model,baseUrl:e.baseUrl})}};function n(e){let{model:n,apiKey:r,baseUrl:i}=e,a=e.provider;if(a===void 0){let e=F.get(n);if(e===void 0)throw Error(`Unknown model: ${n}`);a=e.providerId}let o=t[a];return o(i===void 0?{model:n,apiKey:r}:{model:n,apiKey:r,baseUrl:i})}e.create=n})(de||={});let G;(function(e){function t(e){let{credentials:t}=e,n,r;return{resolve(e){if(r!==void 0&&n===e)return r;let i=F.get(e),a=i===void 0?`llamacpp`:i.providerId,o,s;if(a===`llamacpp`){if(t.llamacppUrl===void 0)throw Error(`No llama.cpp URL configured`);o=`not-needed`,s=t.llamacppUrl}else{let e=t.apiKeys[a];if(e===void 0)throw Error(`No API key for provider: ${a}`);o=e}return n=e,r=de.create({model:e,apiKey:o,provider:a,baseUrl:s}),r}}}e.create=t})(G||={});let K;(function(e){async function t(e){try{return await ee(e)}catch{return}}async function n(e){try{return await x(e)}catch{return}}async function r(e){try{return await b(e,`utf-8`)}catch{return}}function i(e){try{return D(e)}catch{return}}function a(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`).replace(/'/g,`'`)}function o(e){return!(e.length===0||e.length>64||!/^[a-z0-9-]+$/.test(e)||e.startsWith(`-`)||e.endsWith(`-`)||e.includes(`--`))}e.isValidSkillName=o;function s(e){let{data:t,expectedName:n,skillMdPath:r}=e,i=t.name,a=t.description;return typeof i!=`string`||i.length===0?{ok:!1,error:`missing or invalid 'name' field`}:i===n?o(i)?typeof a!=`string`||a.length===0?{ok:!1,error:`missing or invalid 'description' field`}:a.length>1024?{ok:!1,error:`description exceeds 1024 characters`}:{ok:!0,metadata:{name:i,description:a,path:r}}:{ok:!1,error:`invalid name format '${i}'`}:{ok:!1,error:`name '${i}' does not match folder '${n}'`}}async function c(e){let{path:n,expectedName:a}=e,o=m(n,`SKILL.md`),c=await t(n);if(c===void 0||!c.isDirectory())return{path:n,error:`not a directory`};let l=await t(o);if(l===void 0)return{path:n,error:`SKILL.md not found`};if(!l.isFile())return{path:n,error:`SKILL.md is not a file`};let u=await r(o);if(u===void 0)return{path:n,error:`failed to read SKILL.md`};let d=i(u);if(d===void 0)return{path:n,error:`invalid frontmatter`};let f=s({data:d.data,expectedName:a,skillMdPath:o});return f.ok?{path:n,metadata:f.metadata}:{path:n,error:f.error}}e.parseSkill=c;async function l(e){let{cwd:r}=e,i=m(r,`skills`),a=await t(i);if(a===void 0||!a.isDirectory())return[];let o=await n(i);if(o===void 0)return[];let s=[];for(let e of o){let t=await c({path:m(i,e),expectedName:e});t.metadata!==void 0&&s.push(t.metadata)}return s}e.discover=l;function u(e){return e.length===0?``:`<available_skills>\n${e.map(e=>` <skill>
|
|
11
|
-
<name>${
|
|
12
|
-
<description>${
|
|
13
|
-
<location>${
|
|
10
|
+
`),description:a,filePath:a};return t.input.offset!==void 0&&(f.offset=o),t.input.limit!==void 0&&(f.limit=s),f}catch(e){if(r(e)&&e.code===`ENOENT`)return{call_id:t.id,name:`read`,output:`File not found: ${a}`,is_error:!0,filePath:a};if(r(e)&&e.code===`EISDIR`)return{call_id:t.id,name:`read`,output:`Cannot read directory: ${a}. Use bash with 'ls' to list directory contents.`,is_error:!0,filePath:a};throw Error(`Failed to read ${a}`,{cause:e})}}e.execute=n;function r(e){return e instanceof Error&&`code`in e}})(z||={});let B;(function(e){e.schemas=[L.schema,R.schema,z.schema];function t(e){let t=e?.cwd??process.cwd();return{async execute(r){if(L.isMatch(r)){let i=r.input.command.trim();if(i.startsWith(`cd `)){let a=n({target:i.slice(3).trim(),cwd:t});return a.error===void 0?(t=a.path,e?.onCwdChange?.(t),{call_id:r.id,name:`bash`,output:`Changed directory to ${t}`}):{call_id:r.id,name:`bash`,output:a.error,is_error:!0}}return await L.execute({call:r,cwd:t})}return R.isMatch(r)?await R.execute({call:r}):z.isMatch(r)?await z.execute({call:r,cwd:t}):{call_id:r.id,name:`unknown`,output:`Unknown tool`,is_error:!0}}}}e.createExecutor=t;function n(e){let{target:t,cwd:n}=e,r;if(t===`~`||t.startsWith(`~/`)){let e=process.env.HOME;if(!e)return{error:`HOME environment variable not set`};r=t===`~`?e:p.join(e,t.slice(2))}else r=p.isAbsolute(t)?t:p.resolve(n,t);return{path:r}}e.resolveCd=n})(B||={});let se;(function(e){function t(e){let{store:t,llmResolver:n}=e,r=B.createExecutor({onCwdChange:e=>{t.getState().setCwd(e)}}),i;return{async*run(e){let a=t.getState(),o=n.resolve(a.model);i=new AbortController;let s={llm:o,tools:r,store:t,userMessage:e,signal:i.signal};try{yield*ae.run(s)}finally{i=void 0}},abort(){i?.abort()}}}e.create=t})(se||={});let V;(function(e){let t=C.enum([`anthropic`,`openai`,`xai`,`minimax`,`zai`,`llamacpp`]),n=C.object({provider:t,model:C.string().optional(),credentials:C.record(C.string(),C.string()),llamacppUrl:C.string().optional()});function r(){return p.join(_.homedir(),`.femto`)}e.dir=r;function i(){return p.join(r(),`config.json`)}e.filePath=i;function a(){return g.existsSync(i())}e.exists=a;function o(){if(!a())return;let e=i(),t=g.readFileSync(e,`utf-8`),r;try{r=JSON.parse(t)}catch(t){throw Error(`Failed to parse config at ${e}: ${t instanceof Error?t.message:String(t)}`)}let o=n.safeParse(r);if(!o.success)throw Error(`Invalid config at ${e}: ${o.error.issues.map(e=>e.message).join(`, `)}`);let s={provider:o.data.provider,credentials:o.data.credentials};return o.data.model!==void 0&&(s.model=o.data.model),o.data.llamacppUrl!==void 0&&(s.llamacppUrl=o.data.llamacppUrl),s}e.load=o;function s(e){let t=r();g.existsSync(t)||g.mkdirSync(t,{recursive:!0}),g.writeFileSync(i(),JSON.stringify(e,null,2))}e.save=s;function c(e){return process.env[{anthropic:`ANTHROPIC_API_KEY`,openai:`OPENAI_API_KEY`,xai:`XAI_API_KEY`,minimax:`MINIMAX_API_KEY`,zai:`ZAI_API_KEY`}[e.provider]]??e.data.credentials[e.provider]}e.getApiKey=c;function l(e){let t=process.env.LLAMACPP_URL??e.llamacppUrl;if(t)return t.endsWith(`/`)?t.slice(0,-1):t}e.getLlamaCppUrl=l;function u(e){return e.provider===`llamacpp`?l(e.data)!==void 0:c({provider:e.provider,data:e.data})!==void 0}e.hasCredentials=u;function d(){return!!process.env.FEMTO_VERBOSE}e.verbose=d})(V||={});let H;(function(e){function t(e){if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`Tool input must be a non-null object`)}function n(e){let n=new w({apiKey:e.apiKey,baseURL:e.baseURL});return{async complete(a){let o=i(a.messages),s=r(B.schemas),c=await n.messages.create({model:e.model,max_tokens:8096,system:a.system??`You are a helpful coding assistant.`,messages:o,tools:s},{signal:a.signal}),l=``,u=[];for(let e of c.content)e.type===`text`?l+=e.text:e.type===`tool_use`&&(t(e.input),u.push({id:e.id,name:e.name,input:e.input}));let d;d=c.stop_reason===`tool_use`?`tool_use`:c.stop_reason===`max_tokens`?`max_tokens`:`end`;let f={inputTokens:c.usage.input_tokens,outputTokens:c.usage.output_tokens},p={...c.usage},m=p.cache_read_input_tokens;typeof m==`number`&&(f.cacheReadTokens=m);let h=p.cache_creation_input_tokens;return typeof h==`number`&&(f.cacheWriteTokens=h),{content:l,toolCalls:u,stopReason:d,usage:f}}}}e.create=n;function r(e){return e.map(e=>({name:e.name,description:e.description,input_schema:{type:e.input_schema.type,properties:e.input_schema.properties,required:[...e.input_schema.required]}}))}function i(e){let n=[];for(let r of e)switch(r.role){case`user`:n.push({role:`user`,content:r.content});break;case`assistant`:{let e=[];r.content&&e.push({type:`text`,text:r.content});for(let n of r.tool_calls)t(n.input),e.push({type:`tool_use`,id:n.id,name:n.name,input:n.input});n.push({role:`assistant`,content:e});break}case`tool_result`:{let e=r.results.map(e=>{let t={type:`tool_result`,tool_use_id:e.call_id,content:e.output};return e.is_error===!0&&(t.is_error=!0),t});n.push({role:`user`,content:e});break}}return n}})(H||={});let U;(function(e){function t(e){let t=new T({apiKey:`no-key-needed`,baseURL:`${e.baseUrl}/v1`});return{async complete(i){let a=r(B.schemas),o=n(i.messages,i.system),s={model:e.model,messages:o};a.length>0&&(s.tools=a);let c=await t.chat.completions.create(s,{signal:i.signal}),l=c.choices[0];if(l===void 0)throw Error(`No response choice returned from llama.cpp`);let u=l.message.content??``,d=[];if(l.message.tool_calls)for(let e of l.message.tool_calls){if(e.type!==`function`)continue;let t;try{t=JSON.parse(e.function.arguments)}catch{t={}}d.push({id:e.id,name:e.function.name,input:t})}let f;f=l.finish_reason===`length`?`max_tokens`:l.finish_reason===`tool_calls`||d.length>0?`tool_use`:`end`;let p={inputTokens:c.usage?.prompt_tokens??0,outputTokens:c.usage?.completion_tokens??0};return{content:u,toolCalls:d,stopReason:f,usage:p}}}}e.create=t;function n(e,t){let n=[];t&&n.push({role:`system`,content:t});for(let t of e)switch(t.role){case`user`:n.push({role:`user`,content:t.content});break;case`assistant`:t.tool_calls.length>0?n.push({role:`assistant`,content:t.content||null,tool_calls:t.tool_calls.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.input)}}))}):n.push({role:`assistant`,content:t.content});break;case`tool_result`:for(let e of t.results)n.push({role:`tool`,tool_call_id:e.call_id,content:e.output});break}return n}function r(e){return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.input_schema}}))}let i=C.object({data:C.array(C.object({id:C.string()}))});async function a(e){let t=await fetch(`${e}/v1/models`);if(!t.ok)throw Error(`Failed to fetch models: ${String(t.status)} ${t.statusText}`);let n=i.safeParse(await t.json());if(!n.success)throw Error(`Invalid response format from llama.cpp server`);return n.data.data.map(e=>e.id)}e.listModels=a})(U||={});let ce;(function(e){function t(e){return H.create({model:e.model,apiKey:e.apiKey,baseURL:`https://api.minimax.io/anthropic/v1`})}e.create=t})(ce||={});let W;(function(e){function t(e){let t=new T({apiKey:e.apiKey,baseURL:e.baseURL});return{async complete(i){let a=r(B.schemas),o=n(i.messages),s={model:e.model,input:o,tools:a};i.system&&(s.instructions=i.system);let c=await t.responses.create(s,{signal:i.signal}),l=``,u=[];for(let e of c.output)if(e.type===`message`)for(let t of e.content)t.type===`output_text`&&(l+=t.text);else if(e.type===`function_call`){let t;try{t=JSON.parse(e.arguments)}catch{t={}}u.push({id:e.call_id,name:e.name,input:t})}let d;d=c.status===`incomplete`?c.incomplete_details?.reason===`max_output_tokens`?`max_tokens`:`end`:u.length>0?`tool_use`:`end`;let f={inputTokens:c.usage?.input_tokens??0,outputTokens:c.usage?.output_tokens??0},p=c.usage?.input_tokens_details;return p&&`cached_tokens`in p&&(f.cacheReadTokens=p.cached_tokens),{content:l,toolCalls:u,stopReason:d,usage:f}}}}e.create=t;function n(e){let t=[];for(let n of e)switch(n.role){case`user`:t.push({type:`message`,role:`user`,content:[{type:`input_text`,text:n.content}]});break;case`assistant`:n.content&&t.push({type:`message`,role:`assistant`,content:n.content});for(let e of n.tool_calls)t.push({type:`function_call`,call_id:e.id,name:e.name,arguments:JSON.stringify(e.input)});break;case`tool_result`:for(let e of n.results)t.push({type:`function_call_output`,call_id:e.call_id,output:e.output});break}return t}function r(e){return e.map(e=>({type:`function`,name:e.name,description:e.description,parameters:e.input_schema,strict:!1}))}})(W||={});let le;(function(e){function t(e){return W.create({model:e.model,apiKey:e.apiKey,baseURL:`https://api.x.ai/v1`})}e.create=t})(le||={});let ue;(function(e){function t(e){return H.create({model:e.model,apiKey:e.apiKey,baseURL:`https://api.z.ai/api/anthropic`})}e.create=t})(ue||={});let de;(function(e){let t={anthropic:e=>H.create({model:e.model,apiKey:e.apiKey}),openai:e=>W.create({model:e.model,apiKey:e.apiKey}),xai:e=>le.create({model:e.model,apiKey:e.apiKey}),minimax:e=>ce.create({model:e.model,apiKey:e.apiKey}),zai:e=>ue.create({model:e.model,apiKey:e.apiKey}),llamacpp:e=>{if(e.baseUrl===void 0)throw Error(`baseUrl required for llamacpp`);return U.create({model:e.model,baseUrl:e.baseUrl})}};function n(e){let{model:n,apiKey:r,baseUrl:i}=e,a=e.provider;if(a===void 0){let e=F.get(n);if(e===void 0)throw Error(`Unknown model: ${n}`);a=e.providerId}let o=t[a];return o(i===void 0?{model:n,apiKey:r}:{model:n,apiKey:r,baseUrl:i})}e.create=n})(de||={});let G;(function(e){function t(e){let{credentials:t}=e,n,r;return{resolve(e){if(r!==void 0&&n===e)return r;let i=F.get(e),a=i===void 0?`llamacpp`:i.providerId,o,s;if(a===`llamacpp`){if(t.llamacppUrl===void 0)throw Error(`No llama.cpp URL configured`);o=`not-needed`,s=t.llamacppUrl}else{let e=t.apiKeys[a];if(e===void 0)throw Error(`No API key for provider: ${a}`);o=e}return n=e,r=de.create({model:e,apiKey:o,provider:a,baseUrl:s}),r}}}e.create=t})(G||={});let K;(function(e){async function t(e){let{cwd:t}=e;return new Promise(e=>{let n=h(`git`,[`rev-parse`,`--show-toplevel`],{cwd:t,stdio:[`ignore`,`pipe`,`ignore`]}),r=``;n.stdout.setEncoding(`utf-8`),n.stdout.on(`data`,e=>{r+=e}),n.on(`close`,t=>{e(t===0?r.trim():void 0)}),n.on(`error`,()=>{e(void 0)})})}async function n(e){try{return await S(e)}catch{return}}async function r(e){try{return await x(e)}catch{return}}async function i(e){try{return await b(e,`utf-8`)}catch{return}}function a(e){try{return O(e)}catch{return}}function o(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`).replace(/'/g,`'`)}function s(e){return!(e.length===0||e.length>64||!/^[a-z0-9-]+$/.test(e)||e.startsWith(`-`)||e.endsWith(`-`)||e.includes(`--`))}e.isValidSkillName=s;function c(e){let{data:t,expectedName:n,skillMdPath:r}=e,i=t.name,a=t.description;return typeof i!=`string`||i.length===0?{ok:!1,error:`missing or invalid 'name' field`}:i===n?s(i)?typeof a!=`string`||a.length===0?{ok:!1,error:`missing or invalid 'description' field`}:a.length>1024?{ok:!1,error:`description exceeds 1024 characters`}:{ok:!0,metadata:{name:i,description:a,path:r}}:{ok:!1,error:`invalid name format '${i}'`}:{ok:!1,error:`name '${i}' does not match folder '${n}'`}}async function l(e){let{path:t,expectedName:r}=e,o=m(t,`SKILL.md`),s=await n(t);if(s===void 0||!s.isDirectory())return{path:t,error:`not a directory`};let l=await n(o);if(l===void 0)return{path:t,error:`SKILL.md not found`};if(!l.isFile())return{path:t,error:`SKILL.md is not a file`};let u=await i(o);if(u===void 0)return{path:t,error:`failed to read SKILL.md`};let d=a(u);if(d===void 0)return{path:t,error:`invalid frontmatter`};let f=c({data:d.data,expectedName:r,skillMdPath:o});return f.ok?{path:t,metadata:f.metadata}:{path:t,error:f.error}}e.parseSkill=l;async function u(e){let{cwd:i}=e,a=await t({cwd:i});if(a===void 0)return[];let o=m(a,`.agents`,`skills`),s=await n(o);if(s===void 0||!s.isDirectory())return[];let c=await r(o);if(c===void 0)return[];let u=[];for(let e of c){let t=await l({path:m(o,e),expectedName:e});t.metadata!==void 0&&u.push(t.metadata)}return u}e.discover=u;function d(e){return e.length===0?``:`<available_skills>\n${e.map(e=>` <skill>
|
|
11
|
+
<name>${o(e.name)}</name>
|
|
12
|
+
<description>${o(e.description)}</description>
|
|
13
|
+
<location>${o(e.path)}</location>
|
|
14
14
|
</skill>`).join(`
|
|
15
|
-
`)}\n</available_skills>`}e.toPromptXml=
|
|
15
|
+
`)}\n</available_skills>`}e.toPromptXml=d})(K||={});let q;(function(e){let t=[`CLAUDE.md`,`AGENTS.md`];async function n(e){try{return await b(e,`utf-8`)}catch{return}}async function r(e){let{cwd:r}=e,i=[`You are an expert coding assistant. You help users with coding tasks by reading files, executing commands, editing code, and writing new files.
|
|
16
16
|
|
|
17
17
|
Guidelines:
|
|
18
18
|
- Use bash for file operations like ls, grep, find
|
|
@@ -24,10 +24,10 @@ Guidelines:
|
|
|
24
24
|
- Be concise in your responses
|
|
25
25
|
- Show file paths clearly when working with files`];for(let e of t){let t=await n(m(r,e));t!==void 0&&i.push(t)}let a=await K.discover({cwd:r});return a.length>0&&i.push(K.toPromptXml(a)),i.join(`
|
|
26
26
|
|
|
27
|
-
`)}e.loadSystem=r})(q||={});let fe;(function(e){function t(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function n(e){return Math.ceil(e.length/4)}function r(e){return`${String(Math.round(e/1e3))}k`}function i(e,t){return`${e}\n${t.map(e=>
|
|
28
|
-
`)}`}async function a(e){let{cwd:a}=e;
|
|
29
|
-
`),m=n(f);
|
|
30
|
-
`);return e.added?n.map((e,n)=>j(c,{color:`green`,children:[`+ `,e]},`${String(t)}-${String(n)}`)):e.removed?n.map((e,n)=>j(c,{color:`red`,children:[`- `,e]},`${String(t)}-${String(n)}`)):n.map((e,n)=>j(c,{dimColor:!0,children:[` `,e]},`${String(t)}-${String(n)}`))})})}let J;(function(e){function t(e){let t=n(e);if(t){let n=e.slice(0,e.length-t.fullMatch.length);return{tokens:M.lex(n),incompleteCodeBlock:{lang:t.lang,text:t.text}}}return{tokens:M.lex(e)}}e.parse=t;function n(e){let t=e.match(/```(\w*)\n([\s\S]*)$/);if(!t)return;let n=t[0],r=t[1],i=t[2];if(n===void 0)throw Error(`Unexpected undefined fullMatch`);if(i===void 0)throw Error(`Unexpected undefined afterFence`);if(!i.includes("```"))return{lang:r??``,text:i,fullMatch:n}}function r(e){return e.type===`code`}e.isCode=r;function i(e){return e.type===`heading`}e.isHeading=i;function a(e){return e.type===`paragraph`}e.isParagraph=a;function o(e){return e.type===`list`}e.isList=o;function s(e){return e.type===`blockquote`}e.isBlockquote=s;function c(e){return e.type===`strong`}e.isStrong=c;function l(e){return e.type===`em`}e.isEm=l;function u(e){return e.type===`codespan`}e.isCodespan=u;function d(e){return e.type===`link`}e.isLink=d;function f(e){return e.type===`text`}e.isText=f;function p(e){return e.type===`space`}e.isSpace=p;function m(e){return e.type===`hr`}e.isHr=m;function h(e){return e.type===`table`}e.isTable=h})(J||={});let Y;(function(e){function n({token:e}){return J.isCode(e)?A(r,{token:e}):J.isHeading(e)?A(a,{token:e}):J.isParagraph(e)?A(s,{token:e}):J.isList(e)?A(l,{token:e}):J.isBlockquote(e)?A(u,{token:e}):J.isHr(e)?A(d,{}):J.isTable(e)?A(m,{token:e}):J.isSpace(e)?A(k,{}):`raw`in e&&typeof e.raw==`string`?A(c,{children:e.raw}):A(k,{})}e.TokenComponent=n;function r({token:e}){let t=e.lang?` ${e.lang}`:``;return j(o,{flexDirection:`column`,borderStyle:`round`,borderColor:`gray`,paddingX:1,marginTop:1,children:[t&&A(c,{dimColor:!0,children:t}),A(c,{children:e.text})]})}e.CodeBlock=r;function i({incompleteCodeBlock:e}){let t=e.lang?` ${e.lang}`:``;return j(o,{flexDirection:`column`,borderStyle:`round`,borderColor:`yellow`,paddingX:1,marginTop:1,children:[t&&A(c,{dimColor:!0,children:t}),A(c,{children:e.text}),A(c,{color:`yellow`,children:`...`})]})}e.IncompleteCodeBlock=i;function a({token:e}){return A(o,{marginTop:2,marginBottom:1,children:A(c,{bold:!0,color:`cyan`,children:e.text})})}e.Heading=a;function s({token:e}){return A(o,{marginY:0,children:A(c,{wrap:`wrap`,children:A(h,{tokens:e.tokens??[]})})})}e.Paragraph=s;function l({token:e}){return A(o,{flexDirection:`column`,children:e.items.map((t,n)=>j(o,{children:[A(c,{children:e.ordered?`${String(n+1)}. `:` • `}),A(c,{wrap:`wrap`,children:A(h,{tokens:t.tokens??[]})})]},String(n)))})}e.List=l;function u({token:e}){return A(o,{flexDirection:`column`,children:e.tokens.map((e,t)=>j(o,{children:[A(c,{color:`gray`,children:`│ `}),J.isParagraph(e)?A(c,{wrap:`wrap`,children:A(h,{tokens:e.tokens??[]})}):A(n,{token:e})]},String(t)))})}e.Blockquote=u;function d(){return A(o,{marginTop:1,children:A(c,{dimColor:!0,children:`─`.repeat(40)})})}e.HorizontalRule=d;function f(e){return e.header.map((t,n)=>{let r=t.text.length,i=e.rows.reduce((e,t)=>{let r=t[n]?.text.length??0;return Math.max(e,r)},0);return Math.max(r,i)})}function p({cell:e,width:t,isHeader:n}){return A(o,{width:t,children:n?A(c,{bold:!0,children:A(h,{tokens:e.tokens})}):A(c,{children:A(h,{tokens:e.tokens})})})}function m({token:e}){let n=f(e);function r(){return`|`+n.map(e=>`-`.repeat(e+2)).join(`|`)+`|`}return j(o,{flexDirection:`column`,marginTop:1,children:[j(o,{children:[A(c,{dimColor:!0,children:`| `}),e.header.map((e,r)=>{let i=n[r];if(i===void 0)throw Error(`Column width not found for index ${String(r)}`);return j(t.Fragment,{children:[A(p,{cell:e,width:i,isHeader:!0}),A(c,{dimColor:!0,children:` | `})]},String(r))})]}),A(c,{dimColor:!0,children:r()}),e.rows.map((e,r)=>j(o,{children:[A(c,{dimColor:!0,children:`| `}),e.map((e,r)=>{let i=n[r];if(i===void 0)throw Error(`Column width not found for index ${String(r)}`);return j(t.Fragment,{children:[A(p,{cell:e,width:i,isHeader:!1}),A(c,{dimColor:!0,children:` | `})]},String(r))})]},String(r)))]})}e.Table=m;function h({tokens:e}){return A(k,{children:e.map((e,n)=>J.isStrong(e)?Array.isArray(e.tokens)&&e.tokens.length>0?A(c,{bold:!0,children:A(h,{tokens:e.tokens})},n):A(c,{bold:!0,children:e.text},n):J.isEm(e)?Array.isArray(e.tokens)&&e.tokens.length>0?A(c,{italic:!0,children:A(h,{tokens:e.tokens})},n):A(c,{italic:!0,children:e.text},n):J.isCodespan(e)?j(c,{color:`yellow`,children:["`",e.text,"`"]},n):J.isLink(e)?j(t.Fragment,{children:[A(c,{color:`blue`,underline:!0,children:e.text}),j(c,{dimColor:!0,children:[` (`,e.href,`)`]})]},n):J.isText(e)?Array.isArray(e.tokens)&&e.tokens.length>0?A(h,{tokens:e.tokens},n):A(c,{children:e.text},n):`tokens`in e&&Array.isArray(e.tokens)?A(h,{tokens:e.tokens},n):`text`in e&&typeof e.text==`string`?A(c,{children:e.text},n):`raw`in e&&typeof e.raw==`string`?A(c,{children:e.raw},n):null)})}e.InlineTokens=h})(Y||={});function Ee({content:e}){if(!e)return A(k,{});let{tokens:t,incompleteCodeBlock:n}=J.parse(e);return j(o,{flexDirection:`column`,children:[t.map((e,t)=>A(Y.TokenComponent,{token:e},t)),n&&A(Y.IncompleteCodeBlock,{incompleteCodeBlock:n})]})}function De({content:e}){return j(o,{marginTop:1,children:[A(c,{color:`blue`,children:`│ `}),A(c,{wrap:`wrap`,children:e})]})}function Oe({content:e}){return e?j(o,{flexDirection:`row`,marginTop:1,children:[A(c,{color:`yellow`,children:`│ `}),A(o,{flexDirection:`column`,flexGrow:1,children:A(Ee,{content:e})})]}):A(k,{})}function ke(e,t){return e.length<=t?e:e.slice(0,t-3)+`...`}function Ae({results:e}){return j(o,{flexDirection:`row`,marginTop:1,children:[A(c,{color:`yellow`,children:`│ `}),A(o,{flexDirection:`column`,flexGrow:1,children:e.map((e,t)=>{let n=e.description||e.call_id;return A(o,{flexDirection:`column`,children:e.name===`bash`&&e.command?j(o,{flexDirection:`column`,children:[j(o,{children:[e.is_error?A(c,{color:`red`,children:`✗ `}):A(c,{color:`green`,children:`✓ `}),A(c,{children:`bash(`}),A(c,{children:ke(e.command,120)}),A(c,{children:`)`})]}),e.is_error&&A(o,{marginLeft:2,children:A(c,{color:`red`,children:e.output.length>100?e.output.slice(0,100)+`...`:e.output})}),!e.is_error&&e.preview&&e.preview.length>0&&j(o,{marginLeft:2,flexDirection:`column`,children:[e.previewTruncated!==void 0&&e.previewTruncated>0&&j(c,{dimColor:!0,children:[`... `,e.previewTruncated,` lines truncated ...`]}),e.preview.map((e,t)=>A(c,{dimColor:!0,children:e},t))]})]}):e.name===`read`&&e.filePath?j(o,{flexDirection:`column`,children:[j(o,{children:[e.is_error?A(c,{color:`red`,children:`✗ `}):A(c,{color:`green`,children:`✓ `}),A(c,{children:`read(`}),A(c,{children:ke(e.filePath,120)}),e.offset!==void 0&&j(k,{children:[A(c,{dimColor:!0,children:`, offset`}),A(c,{dimColor:!0,children:`=`}),A(c,{dimColor:!0,children:e.offset})]}),e.limit!==void 0&&j(k,{children:[A(c,{dimColor:!0,children:`, limit`}),A(c,{dimColor:!0,children:`=`}),A(c,{dimColor:!0,children:e.limit})]}),A(c,{children:`)`})]}),e.is_error&&A(o,{marginLeft:2,children:A(c,{color:`red`,children:e.output.length>100?e.output.slice(0,100)+`...`:e.output})})]}):e.is_error?j(o,{flexDirection:`column`,children:[j(o,{children:[A(c,{color:`red`,children:`✗ `}),A(c,{dimColor:!0,children:n}),A(c,{color:`red`,children:` — failed`})]}),A(o,{marginLeft:2,children:A(c,{color:`red`,children:e.output.length>100?e.output.slice(0,100)+`...`:e.output})})]}):j(o,{flexDirection:`column`,children:[j(o,{children:[A(c,{color:`green`,children:`✓ `}),A(c,{dimColor:!0,children:n})]}),e.diff&&A(Te,{oldString:e.diff.oldString,newString:e.diff.newString})]})},e.call_id||t)})})]})}function je({error:e}){return j(o,{flexDirection:`column`,children:[A(c,{bold:!0,color:`red`,children:`Error:`}),A(c,{color:`red`,children:e})]})}function Me({item:e}){switch(e.type){case`user`:return A(De,{content:e.content});case`assistant`:return A(Oe,{content:e.content});case`tool_result`:return A(Ae,{results:e.results});case`error`:return A(je,{error:e.error})}}let X;(function(e){async function t(e){let t=V.load();if(!t)return{options:[],initialIndex:0};let n=F.providerIds().filter(e=>V.hasCredentials({provider:e,data:t})),r=[],i=0;for(let a of n){let n=F.providerName(a);if(a===`llamacpp`){let a=V.getLlamaCppUrl(t);if(a)try{let t=await U.listModels(a);for(let a of t)a===e.currentModel&&(i=r.length),r.push({label:`${a} (${n})`,value:`llamacpp:${a}`,providerId:`llamacpp`,model:a})}catch{}}else{let t=F.forProvider(a);for(let o of t){o===e.currentModel&&(i=r.length);let t=o===F.defaultModel(a);r.push({label:t?`${o} (${n}, default)`:`${o} (${n})`,value:`${a}:${o}`,providerId:a,model:o})}}}return{options:r,initialIndex:i}}e.getOptions=t;function n(e){let t=V.load();if(!t)throw Error(`No config found`);t.provider=e.providerId,t.model=e.model,V.save(t)}e.applySelection=n})(X||={});let Z;(function(e){let t=[`anthropic`,`openai`,`xai`,`minimax`,`zai`,`llamacpp`];function n(){let e=V.load();return e?t.filter(t=>!V.hasCredentials({provider:t,data:e})).map(e=>({label:F.providerName(e),value:e,providerId:e})):t.map(e=>({label:F.providerName(e),value:e,providerId:e}))}e.getUnconfiguredProviders=n;function r(e){let{provider:t,apiKey:n}=e,r=V.load(),i={provider:r?.provider??t,credentials:{...r?.credentials,[t]:n}};r?.model&&(i.model=r.model),r?.llamacppUrl&&(i.llamacppUrl=r.llamacppUrl),V.save(i)}e.saveApiKey=r;function i(e){if(!e.trim())return`URL is required`;try{new URL(e);return}catch{return`Invalid URL format`}}e.validateUrl=i;async function a(e){let t=e.endsWith(`/`)?e.slice(0,-1):e;try{let e=await U.listModels(t);return e.length===0?{models:[],error:`No models loaded on server`}:{models:e}}catch(e){return{models:[],error:`Could not reach server: ${e instanceof Error?e.message:String(e)}`}}}e.fetchLlamaCppModels=a;function o(e){let{url:t,model:n}=e,r=t.endsWith(`/`)?t.slice(0,-1):t,i=V.load(),a={provider:i?.provider??`llamacpp`,model:i?.model??n,credentials:i?.credentials??{},llamacppUrl:r};V.save(a)}e.saveLlamaCpp=o})(Z||={});function Ne(e){let{items:t,onSelect:n,initialIndex:r=0,isFocused:s=!0,limit:l=20,scrollMargin:u=3,placeholder:f=`Type to filter...`}=e,[p,m]=a(``),[h,g]=a(r),_=i(()=>{if(!p.trim())return t;let e=p.toLowerCase();return t.filter(t=>t.label.toLowerCase().includes(e))},[t,p]),v=i(()=>{if(_.length<=l)return 0;let e=Math.max(0,h-(l-u-1)),t=Math.max(0,h-u),n=Math.max(0,_.length-l);return Math.min(n,Math.max(e,Math.min(t,n)))},[_.length,l,h,u]),y=i(()=>_.slice(v,v+l),[_,v,l]),b=v,x=Math.max(0,_.length-v-l);return d((e,t)=>{if(t.upArrow)g(e=>Math.max(0,e-1));else if(t.downArrow)g(e=>Math.min(_.length-1,e+1));else if(t.return){let e=_[h];e&&n(e)}else t.backspace||t.delete?(m(e=>e.slice(0,-1)),g(0)):e&&!t.ctrl&&!t.meta&&!t.tab&&!t.escape&&!t.leftArrow&&!t.rightArrow&&(m(t=>t+e),g(0))},{isActive:s}),j(o,{flexDirection:`column`,children:[j(o,{children:[A(c,{dimColor:!0,children:`> `}),p?A(c,{children:p}):A(c,{dimColor:!0,children:f})]}),A(o,{flexDirection:`column`,marginTop:1,children:_.length===0?A(c,{dimColor:!0,children:`No matches`}):j(k,{children:[b>0?j(c,{dimColor:!0,children:[` ↑ `,b,` more`]}):null,y.map((e,t)=>A(o,{children:v+t===h?j(c,{color:`blue`,children:[`❯ `,e.label]}):j(c,{children:[` `,e.label]})},e.value)),x>0?j(c,{dimColor:!0,children:[` ↓ `,x,` more`]}):null]})})]})}const Pe=[{label:`Select model`,value:`select-model`},{label:`Add provider`,value:`add-provider`}];function Fe(e){let{currentModel:t,onClose:r,onModelChange:i}=e,[s,l]=a(`main`),[u,f]=a(!1),[p,m]=a(``),[h,g]=a(null),[_,v]=a([]),[y,b]=a(0),[x,ee]=a([]),[S,C]=a(null),[w,T]=a(``),[E,D]=a(``),[te,O]=a([]),k=n(()=>{g(null),s===`main`?r():s===`enter-api-key`||s===`enter-llamacpp-url`||s===`select-llamacpp-model`?(l(`select-provider`),T(``),D(``)):l(`main`)},[s,r]);d((e,t)=>{t.escape&&k()},{isActive:!0});let ne=n(e=>{switch(e.value){case`select-model`:f(!0),m(`Loading models...`),X.getOptions({currentModel:t}).then(e=>{v(e.options),b(e.initialIndex),f(!1),l(`select-model`)});break;case`add-provider`:{let e=Z.getUnconfiguredProviders();if(e.length===0){g(`All providers already configured!`);return}ee(e),l(`select-provider`);break}}},[t]),re=n(e=>{let t=_.find(t=>t.value===e.value);if(!t)throw Error(`Model option not found: ${e.value}`);X.applySelection(t),i(t.model),r()},[_,i,r]),M=n(e=>{let t=x.find(t=>t.value===e.value);if(!t)throw Error(`Provider option not found: ${e.value}`);let n=t.providerId;C(n),l(n===`llamacpp`?`enter-llamacpp-url`:`enter-api-key`)},[x]),P=n(e=>{if(!e.trim()){g(`API key is required`);return}if(!S||S===`llamacpp`)throw Error(`Invalid provider state`);Z.saveApiKey({provider:S,apiKey:e}),T(``),C(null),r()},[S,r]),F=n(e=>{let t=Z.validateUrl(e);if(t){g(t);return}f(!0),m(`Connecting to server...`),Z.fetchLlamaCppModels(e).then(e=>{if(f(!1),e.error){g(e.error);return}O(e.models),l(`select-llamacpp-model`)})},[]),I=n(e=>{Z.saveLlamaCpp({url:E,model:e.value}),D(``),C(null),r()},[E,r]);if(u)return A(o,{flexDirection:`column`,marginTop:3,children:A(c,{dimColor:!0,children:p})});if(s===`select-model`)return j(o,{flexDirection:`column`,marginTop:3,children:[A(c,{dimColor:!0,children:`(Esc to go back, arrows to navigate, Enter to select)`}),A(o,{marginTop:1,children:A(Ne,{items:_,onSelect:re,initialIndex:y,isFocused:!0,limit:20,scrollMargin:3})})]});if(s===`select-provider`)return j(o,{flexDirection:`column`,marginTop:3,children:[A(c,{dimColor:!0,children:`(Esc to go back, arrows to navigate, Enter to select)`}),A(o,{marginTop:1,children:A(N,{items:x,onSelect:M,isFocused:!0})})]});if(s===`enter-api-key`)return j(o,{flexDirection:`column`,marginTop:3,children:[j(c,{dimColor:!0,children:[`Enter `,S,` API key (Esc to go back, Enter to save)`]}),h?A(c,{color:`red`,children:h}):null,j(o,{marginTop:1,children:[A(c,{children:`> `}),A(ie,{value:w,onChange:T,onSubmit:P,mask:`*`})]})]});if(s===`enter-llamacpp-url`)return j(o,{flexDirection:`column`,marginTop:3,children:[A(c,{dimColor:!0,children:`Enter llama.cpp server URL (Esc to go back, Enter to connect)`}),h?A(c,{color:`red`,children:h}):null,j(o,{marginTop:1,children:[A(c,{children:`> `}),A(ie,{value:E,onChange:D,onSubmit:F,placeholder:`http://localhost:8080`})]})]});if(s===`select-llamacpp-model`){let e=te.map(e=>({label:e,value:e}));return j(o,{flexDirection:`column`,marginTop:3,children:[A(c,{dimColor:!0,children:`(Esc to go back, arrows to navigate, Enter to select)`}),A(o,{marginTop:1,children:A(N,{items:e,onSelect:I,isFocused:!0})})]})}return j(o,{flexDirection:`column`,marginTop:3,children:[h?A(c,{color:`red`,children:h}):A(c,{dimColor:!0,children:`(Esc to close, arrows to navigate, Enter to select)`}),A(o,{marginTop:1,children:A(N,{items:Pe,onSelect:ne,isFocused:!0})})]})}const Q=te()(()=>({agent:null,appStore:null,isSubmitting:!1,isMenuOpen:!1}));function Ie(){return Q.getState().isSubmitting?!1:(Q.setState({isSubmitting:!0}),!0)}function Le(){Q.setState({isSubmitting:!1})}const $={initialize:e=>{let{agent:t,appStore:n}=e;Q.setState({agent:t,appStore:n})},submit:async e=>{let t=e.trim();if(!t)return;let{agent:n,appStore:r}=Q.getState();if(n===null)throw Error(`Agent not initialized`);if(r===null)throw Error(`AppStore not initialized`);if(Ie())try{for await(let e of n.run(t))e.type===`error`&&r.getState().pushError(e.error.message)}finally{Le()}},abort:()=>{let{agent:e}=Q.getState();e!==null&&e.abort()},openMenu:()=>{Q.setState({isMenuOpen:!0})},closeMenu:()=>{Q.setState({isMenuOpen:!1})}};function Re(e){let{item:t}=e;return t.type===`header`?j(o,{flexDirection:`column`,marginBottom:1,children:[A(c,{bold:!0,children:`femto`}),A(c,{dimColor:!0,children:`tiny extensible coding agent`}),j(c,{dimColor:!0,children:[`v`,`0.0.0`]})]}):A(Me,{item:t})}function ze({agent:e,appStore:t}){let{exit:c}=u(),[l,f]=a(``);r(()=>{$.initialize({agent:e,appStore:t})},[e,t]);let p=O(t,e=>e.history),m=O(t,e=>e.status===`working`),h=O(t,e=>e.activity),g=O(t,e=>e.model),_=Q(e=>e.isMenuOpen);d((e,t)=>{t.tab&&$.openMenu()},{isActive:!m&&!_});let v=n(e=>{t.getState().setModel(e)},[t]),y=i(()=>[{id:`header`,type:`header`},...p],[p]),b=n(e=>{let t=e.trim();if(t){if(t===`/exit`||t===`/quit`){c();return}f(``),$.submit(t)}},[c]);return j(k,{children:[A(s,{items:y,children:function(e){return A(Re,{item:e},e.id)}}),j(o,{flexDirection:`column`,paddingX:1,children:[A(ye,{appStore:t}),_?A(Fe,{currentModel:g,onClose:$.closeMenu,onModelChange:v}):A(we,{value:l,onChange:f,onSubmit:b,focus:!m,disabled:m,activity:h,onInterrupt:$.abort})]})]})}let Be;(function(n){function r(){let{values:t,positionals:n}=e({args:process.argv.slice(2),options:{model:{type:`string`,short:`m`},verbose:{type:`boolean`,short:`v`,default:!1},help:{type:`boolean`,short:`h`,default:!1}},allowPositionals:!0});return{...t,command:n[0],commandArg:n[1]}}function i(){console.log(`femto - a tiny coding agent
|
|
27
|
+
`)}e.loadSystem=r})(q||={});let fe;(function(e){function t(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function n(e){return Math.ceil(e.length/4)}function r(e){return`${String(Math.round(e/1e3))}k`}function i(e,t){return`${e}\n${t.map(e=>D.dim(e)).join(`
|
|
28
|
+
`)}`}async function a(e){let{cwd:a}=e;E.intro(`femto info`),E.log.message(i(`Version`,[`0.0.1`]));let o=V.load(),s=[`Path: ${V.filePath()}`];if(o)if(s.push(`Selected provider: ${F.providerName(o.provider)}`),o.provider===`llamacpp`){let e=V.getLlamaCppUrl(o);s.push(`Server URL: ${e??`not configured`}`),s.push(`Selected model: ${o.model??`not configured`}`)}else{let e=o.model??F.defaultModel(o.provider),t=F.get(e);t===void 0?s.push(`Selected model: ${e}`):s.push(`Selected model: ${e} (${r(t.limit.context)} context)`)}else s.push(`No config found. Run: femto provider`);E.log.message(i(`Config`,s));let c=[];for(let e of F.providerIds()){let t=o!==void 0&&V.hasCredentials({provider:e,data:o}),n=t?`✓`:`✗`,r=t?`configured`:`missing`;c.push(`${n} ${F.providerName(e)} (${r})`)}E.log.message(i(`Providers`,c));let l=await K.discover({cwd:a}),u=`${a}/skills/`,d=[];if(l.length===0)d.push(`No skills found`);else for(let e of l)d.push(`- ${e.name}: ${e.description}`);E.log.message(i(`Skills (${String(l.length)} found in ${u})`,d));let f=await q.loadSystem({cwd:a}),p=f.split(`
|
|
29
|
+
`),m=n(f);E.log.message(i(`System Prompt (${String(p.length)} lines, ~${t(m)} tokens)`,p)),E.outro(`Done`)}e.run=a})(fe||={});let pe;(function(e){let t=[`anthropic`,`openai`,`xai`,`minimax`,`zai`,`llamacpp`];async function n(){let e=await E.text({message:`Enter llama.cpp server URL`,placeholder:`http://localhost:8080`,validate:function(e){if(!e)return`URL is required`;try{new URL(e);return}catch{return`Invalid URL format`}}});E.isCancel(e)&&(E.cancel(`Setup cancelled`),process.exit(0));let t=e.endsWith(`/`)?e.slice(0,-1):e,n=E.spinner();n.start(`Connecting to server...`);let r;try{r=await U.listModels(t)}catch(e){n.stop(`Failed to connect`);let t=e instanceof Error?e.message:String(e);E.cancel(`Could not reach server: ${t}`),process.exit(1)}r.length===0&&(n.stop(`No models found`),E.cancel(`No models loaded on server`),process.exit(1)),n.stop(`Found ${String(r.length)} model(s)`);let i=await E.select({message:`Select default model`,options:r.map(e=>({value:e,label:e}))});return E.isCancel(i)&&(E.cancel(`Setup cancelled`),process.exit(0)),{url:t,model:i}}async function r(){E.intro(`femto setup`);let e=await E.select({message:`Select a provider`,options:t.map(e=>({value:e,label:F.providerName(e)}))});E.isCancel(e)&&(E.cancel(`Setup cancelled`),process.exit(0));let r=V.load();if(e===`llamacpp`){let{url:e,model:t}=await n(),i={provider:`llamacpp`,model:t,credentials:r?.credentials??{},llamacppUrl:e};return V.save(i),E.outro(`Saved to ${V.filePath()}`),i}let i=F.providerName(e),a=await E.password({message:`Enter ${i} API key`});E.isCancel(a)&&(E.cancel(`Setup cancelled`),process.exit(0));let o={provider:e,credentials:{...r?.credentials,[e]:a}};return V.save(o),E.outro(`Saved to ${V.filePath()}`),o}e.run=r;async function i(){let e=V.load();if(!e)return r();E.intro(`Add provider`);let i=t.filter(t=>!V.hasCredentials({provider:t,data:e}));if(i.length===0)return E.outro(`All providers already configured!`),e;let a=await E.select({message:`Select a provider to add`,options:i.map(e=>({value:e,label:F.providerName(e)}))});if(E.isCancel(a))return E.cancel(`Cancelled`),e;if(a===`llamacpp`){let{url:t}=await n(),r={...e,llamacppUrl:t};return V.save(r),E.outro(`Added llamacpp configuration. Run 'femto model' to switch.`),r}let o=F.providerName(a),s=await E.password({message:`Enter ${o} API key`});if(E.isCancel(s))return E.cancel(`Cancelled`),e;let c={...e,credentials:{...e.credentials,[a]:s}};return V.save(c),E.outro(`Added ${o} credentials`),c}e.addProvider=i})(pe||={});let me;(function(e){async function t(e){let{prompt:t,verbose:r,agent:i}=e,a=``;for await(let e of i.run(t))r&&console.log(JSON.stringify(n(e))),e.type===`message`&&e.message.tool_calls.length===0&&(a=e.message.content),e.type===`error`&&(process.exitCode=1);a&&console.log(a)}e.execute=t;function n(e){switch(e.type){case`turn_start`:return{type:`turn_start`};case`turn_end`:return{type:`turn_end`};case`tool_use`:return{type:`tool_use`,name:e.name,callId:e.callId,description:e.description,input:e.input};case`tool_result`:return{type:`tool_result`,name:e.name,callId:e.callId,description:e.description,output:e.output,is_error:e.is_error};case`message`:return{type:`message`,content:e.message.content,tool_calls:e.message.tool_calls};case`usage`:return{type:`usage`,inputTokens:e.usage.inputTokens,outputTokens:e.usage.outputTokens,cacheReadTokens:e.usage.cacheReadTokens,cacheWriteTokens:e.usage.cacheWriteTokens};case`error`:return{type:`error`,name:e.error.name,message:e.error.message}}}})(me||={});let he;(function(e){function t(){let e=process.stdout,t=e.write.bind(e);e.write=function(e,n,r){t(`\x1B[?2026h`);let i;return i=typeof e==`string`?typeof n==`function`?t(e,n):n===void 0?t(e):t(e,n,r):typeof n==`function`?t(e,n):t(e,r),t(`\x1B[?2026l`),i}}e.enableSynchronizedOutput=t})(he||={});function ge(e){let{path:t,maxLength:n}=e,r=process.env.HOME??``,i=t;if(r&&t.startsWith(r)&&(i=`~`+t.slice(r.length)),i.length<=n)return i;let a=i.split(`/`);if(a.length<=2)return i;let o=a[0],s=a[a.length-1];if(o===void 0||s===void 0)return i;let c=[o,...a.slice(1,-1).map(e=>e[0]??``),s].join(`/`);return c.length<=n?c:`.../`+s}function _e(e){return e>=1e3?(e/1e3).toFixed(1)+`k`:String(e)}function ve(e){return e<.01?`${(e*100).toFixed(2)}¢`:`$${e.toFixed(2)}`}function ye({appStore:e}){let t=k(e,e=>e.model),n=k(e,e=>e.cwd),r=k(e,e=>e.cost),i=k(e,e=>e.history),a=k(e,e=>e.system),s=I.estimateTokens({history:i,system:a}),l=ge({path:n,maxLength:30}),u=ve(r),d=F.get(t),f;if(d!==void 0){let e=Math.round(s.total/d.limit.context*100);f=`${_e(s.total)} (${String(e)}%)`}else f=_e(s.total);return M(o,{marginTop:1,children:[M(c,{dimColor:!0,children:[u,` | `,f,` | `,t,` | `,l,` |`,` `]}),j(c,{bold:!0,children:`Tab`}),j(c,{dimColor:!0,children:` to open menu`})]})}const be=[`|`,`/`,`-`,`\\`];function xe(e){return e.return&&!e.shift}function Se(e){return e.return&&e.shift}const Ce={submit:xe,newline:Se};function we({value:e,onChange:t,onSubmit:n,focus:i=!0,disabled:s=!1,activity:l=null,onInterrupt:u}){let[f,p]=a(0);if(r(()=>{if(!s)return;let e=setInterval(()=>{p(e=>(e+1)%be.length)},200);return function(){clearInterval(e)}},[s]),d((e,t)=>{t.escape&&u&&u()},{isActive:s}),s){let e=be[f];if(e===void 0)throw Error(`Invalid spinner frame`);return M(o,{children:[M(c,{dimColor:!0,children:[e,` `,l??`Thinking...`,` (`]}),j(c,{bold:!0,children:`Esc`}),j(c,{dimColor:!0,children:` to interrupt)`})]})}return M(o,{children:[j(c,{children:`> `}),j(te,{value:e,onChange:t,onSubmit:n,focus:i,rows:1,maxRows:10,keyBindings:Ce})]})}function Te({oldString:e,newString:t}){return j(o,{flexDirection:`column`,marginTop:1,children:ne.diffLines(e,t).map((e,t)=>{let n=e.value.replace(/\n$/,``).split(`
|
|
30
|
+
`);return e.added?n.map((e,n)=>M(c,{color:`green`,children:[`+ `,e]},`${String(t)}-${String(n)}`)):e.removed?n.map((e,n)=>M(c,{color:`red`,children:[`- `,e]},`${String(t)}-${String(n)}`)):n.map((e,n)=>M(c,{dimColor:!0,children:[` `,e]},`${String(t)}-${String(n)}`))})})}let J;(function(e){function t(e){let t=n(e);if(t){let n=e.slice(0,e.length-t.fullMatch.length);return{tokens:re.lex(n),incompleteCodeBlock:{lang:t.lang,text:t.text}}}return{tokens:re.lex(e)}}e.parse=t;function n(e){let t=e.match(/```(\w*)\n([\s\S]*)$/);if(!t)return;let n=t[0],r=t[1],i=t[2];if(n===void 0)throw Error(`Unexpected undefined fullMatch`);if(i===void 0)throw Error(`Unexpected undefined afterFence`);if(!i.includes("```"))return{lang:r??``,text:i,fullMatch:n}}function r(e){return e.type===`code`}e.isCode=r;function i(e){return e.type===`heading`}e.isHeading=i;function a(e){return e.type===`paragraph`}e.isParagraph=a;function o(e){return e.type===`list`}e.isList=o;function s(e){return e.type===`blockquote`}e.isBlockquote=s;function c(e){return e.type===`strong`}e.isStrong=c;function l(e){return e.type===`em`}e.isEm=l;function u(e){return e.type===`codespan`}e.isCodespan=u;function d(e){return e.type===`link`}e.isLink=d;function f(e){return e.type===`text`}e.isText=f;function p(e){return e.type===`space`}e.isSpace=p;function m(e){return e.type===`hr`}e.isHr=m;function h(e){return e.type===`table`}e.isTable=h})(J||={});let Y;(function(e){function n({token:e}){return J.isCode(e)?j(r,{token:e}):J.isHeading(e)?j(a,{token:e}):J.isParagraph(e)?j(s,{token:e}):J.isList(e)?j(l,{token:e}):J.isBlockquote(e)?j(u,{token:e}):J.isHr(e)?j(d,{}):J.isTable(e)?j(m,{token:e}):J.isSpace(e)?j(A,{}):`raw`in e&&typeof e.raw==`string`?j(c,{children:e.raw}):j(A,{})}e.TokenComponent=n;function r({token:e}){let t=e.lang?` ${e.lang}`:``;return M(o,{flexDirection:`column`,borderStyle:`round`,borderColor:`gray`,paddingX:1,marginTop:1,children:[t&&j(c,{dimColor:!0,children:t}),j(c,{children:e.text})]})}e.CodeBlock=r;function i({incompleteCodeBlock:e}){let t=e.lang?` ${e.lang}`:``;return M(o,{flexDirection:`column`,borderStyle:`round`,borderColor:`yellow`,paddingX:1,marginTop:1,children:[t&&j(c,{dimColor:!0,children:t}),j(c,{children:e.text}),j(c,{color:`yellow`,children:`...`})]})}e.IncompleteCodeBlock=i;function a({token:e}){return j(o,{marginTop:2,marginBottom:1,children:j(c,{bold:!0,color:`cyan`,children:e.text})})}e.Heading=a;function s({token:e}){return j(o,{marginY:0,children:j(c,{wrap:`wrap`,children:j(h,{tokens:e.tokens??[]})})})}e.Paragraph=s;function l({token:e}){return j(o,{flexDirection:`column`,children:e.items.map((t,n)=>M(o,{children:[j(c,{children:e.ordered?`${String(n+1)}. `:` • `}),j(c,{wrap:`wrap`,children:j(h,{tokens:t.tokens??[]})})]},String(n)))})}e.List=l;function u({token:e}){return j(o,{flexDirection:`column`,children:e.tokens.map((e,t)=>M(o,{children:[j(c,{color:`gray`,children:`│ `}),J.isParagraph(e)?j(c,{wrap:`wrap`,children:j(h,{tokens:e.tokens??[]})}):j(n,{token:e})]},String(t)))})}e.Blockquote=u;function d(){return j(o,{marginTop:1,children:j(c,{dimColor:!0,children:`─`.repeat(40)})})}e.HorizontalRule=d;function f(e){return e.header.map((t,n)=>{let r=t.text.length,i=e.rows.reduce((e,t)=>{let r=t[n]?.text.length??0;return Math.max(e,r)},0);return Math.max(r,i)})}function p({cell:e,width:t,isHeader:n}){return j(o,{width:t,children:n?j(c,{bold:!0,children:j(h,{tokens:e.tokens})}):j(c,{children:j(h,{tokens:e.tokens})})})}function m({token:e}){let n=f(e);function r(){return`|`+n.map(e=>`-`.repeat(e+2)).join(`|`)+`|`}return M(o,{flexDirection:`column`,marginTop:1,children:[M(o,{children:[j(c,{dimColor:!0,children:`| `}),e.header.map((e,r)=>{let i=n[r];if(i===void 0)throw Error(`Column width not found for index ${String(r)}`);return M(t.Fragment,{children:[j(p,{cell:e,width:i,isHeader:!0}),j(c,{dimColor:!0,children:` | `})]},String(r))})]}),j(c,{dimColor:!0,children:r()}),e.rows.map((e,r)=>M(o,{children:[j(c,{dimColor:!0,children:`| `}),e.map((e,r)=>{let i=n[r];if(i===void 0)throw Error(`Column width not found for index ${String(r)}`);return M(t.Fragment,{children:[j(p,{cell:e,width:i,isHeader:!1}),j(c,{dimColor:!0,children:` | `})]},String(r))})]},String(r)))]})}e.Table=m;function h({tokens:e}){return j(A,{children:e.map((e,n)=>J.isStrong(e)?Array.isArray(e.tokens)&&e.tokens.length>0?j(c,{bold:!0,children:j(h,{tokens:e.tokens})},n):j(c,{bold:!0,children:e.text},n):J.isEm(e)?Array.isArray(e.tokens)&&e.tokens.length>0?j(c,{italic:!0,children:j(h,{tokens:e.tokens})},n):j(c,{italic:!0,children:e.text},n):J.isCodespan(e)?M(c,{color:`yellow`,children:["`",e.text,"`"]},n):J.isLink(e)?M(t.Fragment,{children:[j(c,{color:`blue`,underline:!0,children:e.text}),M(c,{dimColor:!0,children:[` (`,e.href,`)`]})]},n):J.isText(e)?Array.isArray(e.tokens)&&e.tokens.length>0?j(h,{tokens:e.tokens},n):j(c,{children:e.text},n):`tokens`in e&&Array.isArray(e.tokens)?j(h,{tokens:e.tokens},n):`text`in e&&typeof e.text==`string`?j(c,{children:e.text},n):`raw`in e&&typeof e.raw==`string`?j(c,{children:e.raw},n):null)})}e.InlineTokens=h})(Y||={});function Ee({content:e}){if(!e)return j(A,{});let{tokens:t,incompleteCodeBlock:n}=J.parse(e);return M(o,{flexDirection:`column`,children:[t.map((e,t)=>j(Y.TokenComponent,{token:e},t)),n&&j(Y.IncompleteCodeBlock,{incompleteCodeBlock:n})]})}function De({content:e}){return M(o,{marginTop:1,children:[j(c,{color:`blue`,children:`│ `}),j(c,{wrap:`wrap`,children:e})]})}function Oe({content:e}){return e?M(o,{flexDirection:`row`,marginTop:1,children:[j(c,{color:`yellow`,children:`│ `}),j(o,{flexDirection:`column`,flexGrow:1,children:j(Ee,{content:e})})]}):j(A,{})}function ke(e,t){return e.length<=t?e:e.slice(0,t-3)+`...`}function Ae({results:e}){return M(o,{flexDirection:`row`,marginTop:1,children:[j(c,{color:`yellow`,children:`│ `}),j(o,{flexDirection:`column`,flexGrow:1,children:e.map((e,t)=>{let n=e.description||e.call_id;return j(o,{flexDirection:`column`,children:e.name===`bash`&&e.command?M(o,{flexDirection:`column`,children:[M(o,{children:[e.is_error?j(c,{color:`red`,children:`✗ `}):j(c,{color:`green`,children:`✓ `}),j(c,{children:`bash(`}),j(c,{children:ke(e.command,120)}),j(c,{children:`)`})]}),e.is_error&&j(o,{marginLeft:2,children:j(c,{color:`red`,children:e.output.length>100?e.output.slice(0,100)+`...`:e.output})}),!e.is_error&&e.preview&&e.preview.length>0&&M(o,{marginLeft:2,flexDirection:`column`,children:[e.previewTruncated!==void 0&&e.previewTruncated>0&&M(c,{dimColor:!0,children:[`... `,e.previewTruncated,` lines truncated ...`]}),e.preview.map((e,t)=>j(c,{dimColor:!0,children:e},t))]})]}):e.name===`read`&&e.filePath?M(o,{flexDirection:`column`,children:[M(o,{children:[e.is_error?j(c,{color:`red`,children:`✗ `}):j(c,{color:`green`,children:`✓ `}),j(c,{children:`read(`}),j(c,{children:ke(e.filePath,120)}),e.offset!==void 0&&M(A,{children:[j(c,{dimColor:!0,children:`, offset`}),j(c,{dimColor:!0,children:`=`}),j(c,{dimColor:!0,children:e.offset})]}),e.limit!==void 0&&M(A,{children:[j(c,{dimColor:!0,children:`, limit`}),j(c,{dimColor:!0,children:`=`}),j(c,{dimColor:!0,children:e.limit})]}),j(c,{children:`)`})]}),e.is_error&&j(o,{marginLeft:2,children:j(c,{color:`red`,children:e.output.length>100?e.output.slice(0,100)+`...`:e.output})})]}):e.is_error?M(o,{flexDirection:`column`,children:[M(o,{children:[j(c,{color:`red`,children:`✗ `}),j(c,{dimColor:!0,children:n}),j(c,{color:`red`,children:` — failed`})]}),j(o,{marginLeft:2,children:j(c,{color:`red`,children:e.output.length>100?e.output.slice(0,100)+`...`:e.output})})]}):M(o,{flexDirection:`column`,children:[M(o,{children:[j(c,{color:`green`,children:`✓ `}),j(c,{dimColor:!0,children:n})]}),e.diff&&j(Te,{oldString:e.diff.oldString,newString:e.diff.newString})]})},e.call_id||t)})})]})}function je({error:e}){return M(o,{flexDirection:`column`,children:[j(c,{bold:!0,color:`red`,children:`Error:`}),j(c,{color:`red`,children:e})]})}function Me({item:e}){switch(e.type){case`user`:return j(De,{content:e.content});case`assistant`:return j(Oe,{content:e.content});case`tool_result`:return j(Ae,{results:e.results});case`error`:return j(je,{error:e.error})}}let X;(function(e){async function t(e){let t=V.load();if(!t)return{options:[],initialIndex:0};let n=F.providerIds().filter(e=>V.hasCredentials({provider:e,data:t})),r=[],i=0;for(let a of n){let n=F.providerName(a);if(a===`llamacpp`){let a=V.getLlamaCppUrl(t);if(a)try{let t=await U.listModels(a);for(let a of t)a===e.currentModel&&(i=r.length),r.push({label:`${a} (${n})`,value:`llamacpp:${a}`,providerId:`llamacpp`,model:a})}catch{}}else{let t=F.forProvider(a);for(let o of t){o===e.currentModel&&(i=r.length);let t=o===F.defaultModel(a);r.push({label:t?`${o} (${n}, default)`:`${o} (${n})`,value:`${a}:${o}`,providerId:a,model:o})}}}return{options:r,initialIndex:i}}e.getOptions=t;function n(e){let t=V.load();if(!t)throw Error(`No config found`);t.provider=e.providerId,t.model=e.model,V.save(t)}e.applySelection=n})(X||={});let Z;(function(e){let t=[`anthropic`,`openai`,`xai`,`minimax`,`zai`,`llamacpp`];function n(){let e=V.load();return e?t.filter(t=>!V.hasCredentials({provider:t,data:e})).map(e=>({label:F.providerName(e),value:e,providerId:e})):t.map(e=>({label:F.providerName(e),value:e,providerId:e}))}e.getUnconfiguredProviders=n;function r(e){let{provider:t,apiKey:n}=e,r=V.load(),i={provider:r?.provider??t,credentials:{...r?.credentials,[t]:n}};r?.model&&(i.model=r.model),r?.llamacppUrl&&(i.llamacppUrl=r.llamacppUrl),V.save(i)}e.saveApiKey=r;function i(e){if(!e.trim())return`URL is required`;try{new URL(e);return}catch{return`Invalid URL format`}}e.validateUrl=i;async function a(e){let t=e.endsWith(`/`)?e.slice(0,-1):e;try{let e=await U.listModels(t);return e.length===0?{models:[],error:`No models loaded on server`}:{models:e}}catch(e){return{models:[],error:`Could not reach server: ${e instanceof Error?e.message:String(e)}`}}}e.fetchLlamaCppModels=a;function o(e){let{url:t,model:n}=e,r=t.endsWith(`/`)?t.slice(0,-1):t,i=V.load(),a={provider:i?.provider??`llamacpp`,model:i?.model??n,credentials:i?.credentials??{},llamacppUrl:r};V.save(a)}e.saveLlamaCpp=o})(Z||={});function Ne(e){let{items:t,onSelect:n,initialIndex:r=0,isFocused:s=!0,limit:l=20,scrollMargin:u=3,placeholder:f=`Type to filter...`}=e,[p,m]=a(``),[h,g]=a(r),_=i(()=>{if(!p.trim())return t;let e=p.toLowerCase();return t.filter(t=>t.label.toLowerCase().includes(e))},[t,p]),v=i(()=>{if(_.length<=l)return 0;let e=Math.max(0,h-(l-u-1)),t=Math.max(0,h-u),n=Math.max(0,_.length-l);return Math.min(n,Math.max(e,Math.min(t,n)))},[_.length,l,h,u]),y=i(()=>_.slice(v,v+l),[_,v,l]),b=v,x=Math.max(0,_.length-v-l);return d((e,t)=>{if(t.upArrow)g(e=>Math.max(0,e-1));else if(t.downArrow)g(e=>Math.min(_.length-1,e+1));else if(t.return){let e=_[h];e&&n(e)}else t.backspace||t.delete?(m(e=>e.slice(0,-1)),g(0)):e&&!t.ctrl&&!t.meta&&!t.tab&&!t.escape&&!t.leftArrow&&!t.rightArrow&&(m(t=>t+e),g(0))},{isActive:s}),M(o,{flexDirection:`column`,children:[M(o,{children:[j(c,{dimColor:!0,children:`> `}),p?j(c,{children:p}):j(c,{dimColor:!0,children:f})]}),j(o,{flexDirection:`column`,marginTop:1,children:_.length===0?j(c,{dimColor:!0,children:`No matches`}):M(A,{children:[b>0?M(c,{dimColor:!0,children:[` ↑ `,b,` more`]}):null,y.map((e,t)=>j(o,{children:v+t===h?M(c,{color:`blue`,children:[`❯ `,e.label]}):M(c,{children:[` `,e.label]})},e.value)),x>0?M(c,{dimColor:!0,children:[` ↓ `,x,` more`]}):null]})})]})}const Pe=[{label:`Select model`,value:`select-model`},{label:`Add provider`,value:`add-provider`}];function Fe(e){let{currentModel:t,onClose:r,onModelChange:i}=e,[s,l]=a(`main`),[u,f]=a(!1),[p,m]=a(``),[h,g]=a(null),[_,v]=a([]),[y,b]=a(0),[x,S]=a([]),[C,w]=a(null),[T,E]=a(``),[D,O]=a(``),[ee,k]=a([]),A=n(()=>{g(null),s===`main`?r():s===`enter-api-key`||s===`enter-llamacpp-url`||s===`select-llamacpp-model`?(l(`select-provider`),E(``),O(``)):l(`main`)},[s,r]);d((e,t)=>{t.escape&&A()},{isActive:!0});let te=n(e=>{switch(e.value){case`select-model`:f(!0),m(`Loading models...`),X.getOptions({currentModel:t}).then(e=>{v(e.options),b(e.initialIndex),f(!1),l(`select-model`)});break;case`add-provider`:{let e=Z.getUnconfiguredProviders();if(e.length===0){g(`All providers already configured!`);return}S(e),l(`select-provider`);break}}},[t]),ne=n(e=>{let t=_.find(t=>t.value===e.value);if(!t)throw Error(`Model option not found: ${e.value}`);X.applySelection(t),i(t.model),r()},[_,i,r]),re=n(e=>{let t=x.find(t=>t.value===e.value);if(!t)throw Error(`Provider option not found: ${e.value}`);let n=t.providerId;w(n),l(n===`llamacpp`?`enter-llamacpp-url`:`enter-api-key`)},[x]),P=n(e=>{if(!e.trim()){g(`API key is required`);return}if(!C||C===`llamacpp`)throw Error(`Invalid provider state`);Z.saveApiKey({provider:C,apiKey:e}),E(``),w(null),r()},[C,r]),F=n(e=>{let t=Z.validateUrl(e);if(t){g(t);return}f(!0),m(`Connecting to server...`),Z.fetchLlamaCppModels(e).then(e=>{if(f(!1),e.error){g(e.error);return}k(e.models),l(`select-llamacpp-model`)})},[]),I=n(e=>{Z.saveLlamaCpp({url:D,model:e.value}),O(``),w(null),r()},[D,r]);if(u)return j(o,{flexDirection:`column`,marginTop:3,children:j(c,{dimColor:!0,children:p})});if(s===`select-model`)return M(o,{flexDirection:`column`,marginTop:3,children:[j(c,{dimColor:!0,children:`(Esc to go back, arrows to navigate, Enter to select)`}),j(o,{marginTop:1,children:j(Ne,{items:_,onSelect:ne,initialIndex:y,isFocused:!0,limit:20,scrollMargin:3})})]});if(s===`select-provider`)return M(o,{flexDirection:`column`,marginTop:3,children:[j(c,{dimColor:!0,children:`(Esc to go back, arrows to navigate, Enter to select)`}),j(o,{marginTop:1,children:j(N,{items:x,onSelect:re,isFocused:!0})})]});if(s===`enter-api-key`)return M(o,{flexDirection:`column`,marginTop:3,children:[M(c,{dimColor:!0,children:[`Enter `,C,` API key (Esc to go back, Enter to save)`]}),h?j(c,{color:`red`,children:h}):null,M(o,{marginTop:1,children:[j(c,{children:`> `}),j(ie,{value:T,onChange:E,onSubmit:P,mask:`*`})]})]});if(s===`enter-llamacpp-url`)return M(o,{flexDirection:`column`,marginTop:3,children:[j(c,{dimColor:!0,children:`Enter llama.cpp server URL (Esc to go back, Enter to connect)`}),h?j(c,{color:`red`,children:h}):null,M(o,{marginTop:1,children:[j(c,{children:`> `}),j(ie,{value:D,onChange:O,onSubmit:F,placeholder:`http://localhost:8080`})]})]});if(s===`select-llamacpp-model`){let e=ee.map(e=>({label:e,value:e}));return M(o,{flexDirection:`column`,marginTop:3,children:[j(c,{dimColor:!0,children:`(Esc to go back, arrows to navigate, Enter to select)`}),j(o,{marginTop:1,children:j(N,{items:e,onSelect:I,isFocused:!0})})]})}return M(o,{flexDirection:`column`,marginTop:3,children:[h?j(c,{color:`red`,children:h}):j(c,{dimColor:!0,children:`(Esc to close, arrows to navigate, Enter to select)`}),j(o,{marginTop:1,children:j(N,{items:Pe,onSelect:te,isFocused:!0})})]})}const Q=ee()(()=>({agent:null,appStore:null,isSubmitting:!1,isMenuOpen:!1}));function Ie(){return Q.getState().isSubmitting?!1:(Q.setState({isSubmitting:!0}),!0)}function Le(){Q.setState({isSubmitting:!1})}const $={initialize:e=>{let{agent:t,appStore:n}=e;Q.setState({agent:t,appStore:n})},submit:async e=>{let t=e.trim();if(!t)return;let{agent:n,appStore:r}=Q.getState();if(n===null)throw Error(`Agent not initialized`);if(r===null)throw Error(`AppStore not initialized`);if(Ie())try{for await(let e of n.run(t))e.type===`error`&&r.getState().pushError(e.error.message)}finally{Le()}},abort:()=>{let{agent:e}=Q.getState();e!==null&&e.abort()},openMenu:()=>{Q.setState({isMenuOpen:!0})},closeMenu:()=>{Q.setState({isMenuOpen:!1})}};function Re(e){let{item:t}=e;return t.type===`header`?M(o,{flexDirection:`column`,marginBottom:1,children:[j(c,{bold:!0,children:`femto`}),j(c,{dimColor:!0,children:`tiny extensible coding agent`}),M(c,{dimColor:!0,children:[`v`,`0.0.1`]})]}):j(Me,{item:t})}function ze({agent:e,appStore:t}){let{exit:c}=u(),[l,f]=a(``);r(()=>{$.initialize({agent:e,appStore:t})},[e,t]);let p=k(t,e=>e.history),m=k(t,e=>e.status===`working`),h=k(t,e=>e.activity),g=k(t,e=>e.model),_=Q(e=>e.isMenuOpen);d((e,t)=>{t.tab&&$.openMenu()},{isActive:!m&&!_});let v=n(e=>{t.getState().setModel(e)},[t]),y=i(()=>[{id:`header`,type:`header`},...p],[p]),b=n(e=>{let t=e.trim();if(t){if(t===`/exit`||t===`/quit`){c();return}f(``),$.submit(t)}},[c]);return M(A,{children:[j(s,{items:y,children:function(e){return j(Re,{item:e},e.id)}}),M(o,{flexDirection:`column`,paddingX:1,children:[j(ye,{appStore:t}),_?j(Fe,{currentModel:g,onClose:$.closeMenu,onModelChange:v}):j(we,{value:l,onChange:f,onSubmit:b,focus:!m,disabled:m,activity:h,onInterrupt:$.abort})]})]})}let Be;(function(n){function r(){let{values:t,positionals:n}=e({args:process.argv.slice(2),options:{model:{type:`string`,short:`m`},provider:{type:`string`,short:`p`},"llamacpp-url":{type:`string`},verbose:{type:`boolean`,short:`v`,default:!1},help:{type:`boolean`,short:`h`,default:!1}},allowPositionals:!0}),r={verbose:t.verbose,help:t.help,command:n[0],commandArg:n[1]};return t.model!==void 0&&(r.model=t.model),t.provider!==void 0&&(r.provider=t.provider),t[`llamacpp-url`]!==void 0&&(r.llamacppUrl=t[`llamacpp-url`]),r}function i(){console.log(`femto - a tiny coding agent
|
|
31
31
|
|
|
32
32
|
Usage: femto [command] [options]
|
|
33
33
|
|
|
@@ -36,7 +36,9 @@ Commands:
|
|
|
36
36
|
run <prompt> Run a single agent turn non-interactively
|
|
37
37
|
|
|
38
38
|
Options:
|
|
39
|
-
-m, --model <name>
|
|
40
|
-
-
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
-m, --model <name> Use a specific model for this session
|
|
40
|
+
-p, --provider <id> Provider: anthropic|openai|xai|minimax|zai|llamacpp
|
|
41
|
+
--llamacpp-url <url> llama.cpp server URL (for llamacpp provider)
|
|
42
|
+
-v, --verbose Enable verbose output (prints JSON events for run)
|
|
43
|
+
-h, --help Show this help message`)}function a(e){let{requestedModel:t,config:n}=e;if(n.provider===`llamacpp`){let e=t??n.model;if(!e)throw Error(`No model configured for llamacpp. Run: femto model`);return{model:e,provider:`llamacpp`}}let r=t??n.model??F.defaultModel(n.provider),i=F.get(r);if(i===void 0)throw Error(`Unknown model: ${r}`);if(i.providerId!==n.provider)if(V.hasCredentials({provider:i.providerId,data:n}))n.provider=i.providerId,V.save(n);else throw Error(`Model ${r} requires ${i.providerId} but no credentials found. Run: femto setup`);return{model:r,provider:i.providerId}}function o(e){let t={};for(let n of[`anthropic`,`openai`,`xai`,`minimax`,`zai`]){let r=V.getApiKey({provider:n,data:e});r!==void 0&&(t[n]=r)}return{apiKeys:t,llamacppUrl:V.getLlamaCppUrl(e)}}let s=[`anthropic`,`openai`,`xai`,`minimax`,`zai`,`llamacpp`];function c(e){return s.includes(e)}async function u(e){let{prompt:t,model:n,provider:r,llamacppUrl:i,verbose:l}=e,u=V.load(),d;if(r!==void 0){if(!c(r)){console.error(`Invalid provider: ${r}. Valid providers: ${s.join(`, `)}`),process.exitCode=1;return}d=r}else u!==void 0&&(d=u.provider);let f=n??u?.model;if(d===void 0){console.error(`No config found and no --provider specified. Run 'femto' interactively to set up, or provide --provider and --model flags.`),process.exitCode=1;return}let p=i??u?.llamacppUrl??process.env.LLAMACPP_URL;if(d===`llamacpp`&&p===void 0){console.error(`llama.cpp provider requires --llamacpp-url flag or LLAMACPP_URL environment variable.`),process.exitCode=1;return}if(d===`llamacpp`&&f===void 0){console.error(`llama.cpp provider requires --model flag to specify the model name.`),process.exitCode=1;return}let m={provider:d,credentials:u?.credentials??{}};f!==void 0&&(m.model=f),p!==void 0&&(m.llamacppUrl=p);let h={config:m};n!==void 0&&(h.requestedModel=n);let{model:g}=a(h),_=process.cwd(),v=await q.loadSystem({cwd:_}),y=I.createAppStore({model:g,system:v,cwd:_}),b=o(m),x=G.create({credentials:b}),S=se.create({store:y,llmResolver:x});await me.execute({prompt:t,verbose:l,agent:S,store:y})}async function d(){let e=r();if(e.help){i();return}if(e.command===`info`){await fe.run({cwd:process.cwd()});return}if(e.command===`run`){let t=e.commandArg;if(!t){console.error(`Usage: femto run <prompt>`),process.exitCode=1;return}let n={prompt:t,verbose:e.verbose};e.model!==void 0&&(n.model=e.model),e.provider!==void 0&&(n.provider=e.provider),e.llamacppUrl!==void 0&&(n.llamacppUrl=e.llamacppUrl),await u(n);return}let n=V.load();n||(console.log(`No config found. Let's set up femto!
|
|
44
|
+
`),n=await pe.run(),console.log());let s={config:n};e.model!==void 0&&(s.requestedModel=e.model);let{model:c}=a(s),d=process.cwd(),f=await q.loadSystem({cwd:d}),p=I.createAppStore({model:c,system:f,cwd:d}),m=o(n),h=G.create({credentials:m}),g=se.create({store:p,llmResolver:h});he.enableSynchronizedOutput();let{waitUntilExit:_}=l(t.createElement(ze,{agent:g,appStore:p}));await _()}n.run=d})(Be||={}),Be.run().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});export{};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "femtocode",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "A tiny coding agent extensible with skills",
|
|
6
6
|
"main": "./dist/bin.mjs",
|
|
@@ -10,14 +10,23 @@
|
|
|
10
10
|
"files": [
|
|
11
11
|
"dist"
|
|
12
12
|
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"start": "node dist/bin.mjs",
|
|
15
|
+
"models": "tsx src/populate-models.ts && prettier --write src/model.data.ts",
|
|
16
|
+
"lint": "tsgo --noEmit && knip && eslint .",
|
|
17
|
+
"test": "vitest run --coverage",
|
|
18
|
+
"build": "tsdown",
|
|
19
|
+
"format": "prettier --write .",
|
|
20
|
+
"release": "dotenv release-it --"
|
|
21
|
+
},
|
|
13
22
|
"repository": {
|
|
14
23
|
"type": "git",
|
|
15
|
-
"url": "git+https://github.com/joseferben/
|
|
24
|
+
"url": "git+https://github.com/joseferben/femtocode.git"
|
|
16
25
|
},
|
|
17
26
|
"bugs": {
|
|
18
|
-
"url": "https://github.com/joseferben/
|
|
27
|
+
"url": "https://github.com/joseferben/femtocode/issues"
|
|
19
28
|
},
|
|
20
|
-
"homepage": "https://github.com/joseferben/
|
|
29
|
+
"homepage": "https://github.com/joseferben/femtocode#readme",
|
|
21
30
|
"keywords": [
|
|
22
31
|
"ai",
|
|
23
32
|
"coding-agent",
|
|
@@ -29,6 +38,7 @@
|
|
|
29
38
|
"engines": {
|
|
30
39
|
"node": ">=20"
|
|
31
40
|
},
|
|
41
|
+
"packageManager": "pnpm@10.10.0",
|
|
32
42
|
"devDependencies": {
|
|
33
43
|
"@eslint/js": "^9.39.2",
|
|
34
44
|
"@tsconfig/node24": "^24.0.4",
|
|
@@ -64,14 +74,5 @@
|
|
|
64
74
|
"react": "^19.2.4",
|
|
65
75
|
"zod": "^4.3.6",
|
|
66
76
|
"zustand": "^5.0.11"
|
|
67
|
-
},
|
|
68
|
-
"scripts": {
|
|
69
|
-
"start": "node dist/bin.mjs",
|
|
70
|
-
"models": "tsx src/populate-models.ts && prettier --write src/model.data.ts",
|
|
71
|
-
"lint": "tsgo --noEmit && knip && eslint .",
|
|
72
|
-
"test": "vitest run --coverage",
|
|
73
|
-
"build": "tsdown",
|
|
74
|
-
"format": "prettier --write .",
|
|
75
|
-
"release": "dotenv release-it --"
|
|
76
77
|
}
|
|
77
|
-
}
|
|
78
|
+
}
|