agentix-cli 0.112.0 → 0.114.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/mac-helper/Resources/AppIcon.png +0 -0
- package/apps/mac-voice/Resources/AppIcon.png +0 -0
- package/apps/mac-voice/Resources/Info.plist +1 -0
- package/apps/mac-voice/build.sh +10 -0
- package/dist/{App-4AX6LR6Q.js → App-Q4UAYL2V.js} +2 -2
- package/dist/{ChatApp-HAIPYO4I.js → ChatApp-6KGP57OP.js} +2 -2
- package/dist/agent-5F4EKGQN.js +2 -0
- package/dist/{board-dashboard-RNWZ3H2T.js → board-dashboard-GGW5ZZLT.js} +841 -329
- package/dist/board-dashboard-GGW5ZZLT.js.map +1 -0
- package/dist/{chunk-5MUJZODV.js → chunk-2PJKGZWP.js} +32 -32
- package/dist/chunk-2PJKGZWP.js.map +1 -0
- package/dist/{chunk-NHAVY7VU.js → chunk-4COYYJJY.js} +2 -2
- package/dist/{chunk-QAIYUMHW.js → chunk-4VDA4UM7.js} +2 -2
- package/dist/{chunk-K4TN34OM.js → chunk-6WNQY6K2.js} +2 -2
- package/dist/{chunk-HIVQHFPT.js → chunk-A35RTVMM.js} +2 -2
- package/dist/{chunk-DG5I6PPM.js → chunk-BGG3ZSMW.js} +4 -2
- package/dist/chunk-BGG3ZSMW.js.map +1 -0
- package/dist/{chunk-2JEJIVOZ.js → chunk-C4S5XQKD.js} +2 -2
- package/dist/{chunk-ZVUVFMYN.js → chunk-CYKPDILL.js} +2 -2
- package/dist/{chunk-JRMYIPIL.js → chunk-FDCTFT2Q.js} +2 -2
- package/dist/{chunk-2S5T3VT5.js → chunk-HG6QA6EU.js} +2 -2
- package/dist/{chunk-HNRQQEDE.js → chunk-HPY54DU6.js} +2 -2
- package/dist/{chunk-EUCLJ2VL.js → chunk-ILGLEA3I.js} +5 -5
- package/dist/{chunk-EUCLJ2VL.js.map → chunk-ILGLEA3I.js.map} +1 -1
- package/dist/{chunk-ETV2UH66.js → chunk-J3GXZQXY.js} +2 -2
- package/dist/{chunk-Q6ILGUDE.js → chunk-LP227A6L.js} +2 -2
- package/dist/{chunk-WN5MCIVA.js → chunk-O2RVUM2B.js} +2 -2
- package/dist/{chunk-SFAZ6IH2.js → chunk-QQIWLN3H.js} +160 -160
- package/dist/chunk-QQIWLN3H.js.map +1 -0
- package/dist/{chunk-N7HKIMMR.js → chunk-SCJ5ZXEN.js} +2 -2
- package/dist/{chunk-C245D4BZ.js → chunk-UG2OF2EI.js} +2 -2
- package/dist/{chunk-7MTHXIT5.js → chunk-VGI4EZTP.js} +2 -2
- package/dist/{chunk-R4KGAIBF.js → chunk-VQM77L54.js} +2 -2
- package/dist/{chunk-6DGPWKRK.js → chunk-VTWSW4KB.js} +2 -2
- package/dist/{chunk-RXAR3JIV.js → chunk-XTO4GRGN.js} +8 -8
- package/dist/{chunk-MOO6DKMZ.js → chunk-XX7NXI3Y.js} +2 -2
- package/dist/{chunk-34KJ4Q4E.js → chunk-Y5HBYSJW.js} +12 -12
- package/dist/chunk-Y5HBYSJW.js.map +1 -0
- package/dist/{chunk-23A5K5UW.js → chunk-Y5MFVVTM.js} +2 -2
- package/dist/{chunk-XEJ4E5HH.js → chunk-YLKCFW2R.js} +2 -2
- package/dist/{chunk-ANV4T62P.js → chunk-YU5NDKPA.js} +6 -6
- package/dist/cli.js +1 -1
- package/dist/{client-MYU23KWY.js → client-QTXWO46T.js} +2 -2
- package/dist/{compaction-MECSN36J.js → compaction-FS6XNRLM.js} +3 -3
- package/dist/config-4XGZYYQP.js +2 -0
- package/dist/config-mutator-QLSA6JOY.js +2 -0
- package/dist/{context-planner-JU7CNXCB.js → context-planner-BKHPKDX5.js} +2 -2
- package/dist/{doctor-AUF5HJPW.js → doctor-DO262COW.js} +2 -2
- package/dist/heal-U67X6NIN.js +2 -0
- package/dist/index.d.ts +184 -0
- package/dist/index.js +1 -1
- package/dist/memory-extract-ATD6YLRK.js +2 -0
- package/dist/processes-5MP32QZT.js +2 -0
- package/dist/{program-7ZNCVU5A.js → program-IEMICVO3.js} +14 -14
- package/dist/{promote-FP4LHKWZ.js → promote-S7SKOKX2.js} +2 -2
- package/dist/{providers-ES5KVLI4.js → providers-55NC2SFN.js} +2 -2
- package/dist/{query-IJWC42YJ.js → query-GOBQ3GL5.js} +2 -2
- package/dist/{registry-US7IWI5G.js → registry-HUJEORRW.js} +2 -2
- package/dist/{request-planner-SDUMKFFP.js → request-planner-RYWFGBGK.js} +2 -2
- package/dist/{review-candidates-QOKFHMPL.js → review-candidates-TXX532LY.js} +2 -2
- package/dist/{routing-XZBHJ63Q.js → routing-IT4YS6X3.js} +2 -2
- package/dist/schedule-tool-FJKH2ERY.js +2 -0
- package/dist/scheduler-ALPDUE4H.js +2 -0
- package/dist/{seat-OU3VAP5Y.js → seat-LK45MTVI.js} +2 -2
- package/dist/{select-S6E3HJPE.js → select-4LAHUZ74.js} +2 -2
- package/dist/{set-enabled-GY7O7IRS.js → set-enabled-F2K56HQZ.js} +2 -2
- package/dist/{tool-RGYNLN6I.js → tool-J4VHHZWN.js} +2 -2
- package/dist/{tool-RT5REMY7.js → tool-W3ODKQM2.js} +2 -2
- package/dist/wiki-FZHSX4K3.js +2 -0
- package/package.json +1 -1
- package/dist/agent-Q7MDX45J.js +0 -2
- package/dist/board-dashboard-RNWZ3H2T.js.map +0 -1
- package/dist/chunk-34KJ4Q4E.js.map +0 -1
- package/dist/chunk-5MUJZODV.js.map +0 -1
- package/dist/chunk-DG5I6PPM.js.map +0 -1
- package/dist/chunk-SFAZ6IH2.js.map +0 -1
- package/dist/config-45OK6PHO.js +0 -2
- package/dist/config-mutator-4SUOOBNK.js +0 -2
- package/dist/heal-CMQL5SG4.js +0 -2
- package/dist/memory-extract-YCNCARZ2.js +0 -2
- package/dist/processes-W5VHBP7T.js +0 -2
- package/dist/schedule-tool-XQYEDYXX.js +0 -2
- package/dist/scheduler-VDIZDO6Y.js +0 -2
- package/dist/wiki-3UTXUIN6.js +0 -2
- /package/dist/{App-4AX6LR6Q.js.map → App-Q4UAYL2V.js.map} +0 -0
- /package/dist/{ChatApp-HAIPYO4I.js.map → ChatApp-6KGP57OP.js.map} +0 -0
- /package/dist/{agent-Q7MDX45J.js.map → agent-5F4EKGQN.js.map} +0 -0
- /package/dist/{chunk-NHAVY7VU.js.map → chunk-4COYYJJY.js.map} +0 -0
- /package/dist/{chunk-QAIYUMHW.js.map → chunk-4VDA4UM7.js.map} +0 -0
- /package/dist/{chunk-K4TN34OM.js.map → chunk-6WNQY6K2.js.map} +0 -0
- /package/dist/{chunk-HIVQHFPT.js.map → chunk-A35RTVMM.js.map} +0 -0
- /package/dist/{chunk-2JEJIVOZ.js.map → chunk-C4S5XQKD.js.map} +0 -0
- /package/dist/{chunk-ZVUVFMYN.js.map → chunk-CYKPDILL.js.map} +0 -0
- /package/dist/{chunk-JRMYIPIL.js.map → chunk-FDCTFT2Q.js.map} +0 -0
- /package/dist/{chunk-2S5T3VT5.js.map → chunk-HG6QA6EU.js.map} +0 -0
- /package/dist/{chunk-HNRQQEDE.js.map → chunk-HPY54DU6.js.map} +0 -0
- /package/dist/{chunk-ETV2UH66.js.map → chunk-J3GXZQXY.js.map} +0 -0
- /package/dist/{chunk-Q6ILGUDE.js.map → chunk-LP227A6L.js.map} +0 -0
- /package/dist/{chunk-WN5MCIVA.js.map → chunk-O2RVUM2B.js.map} +0 -0
- /package/dist/{chunk-N7HKIMMR.js.map → chunk-SCJ5ZXEN.js.map} +0 -0
- /package/dist/{chunk-C245D4BZ.js.map → chunk-UG2OF2EI.js.map} +0 -0
- /package/dist/{chunk-7MTHXIT5.js.map → chunk-VGI4EZTP.js.map} +0 -0
- /package/dist/{chunk-R4KGAIBF.js.map → chunk-VQM77L54.js.map} +0 -0
- /package/dist/{chunk-6DGPWKRK.js.map → chunk-VTWSW4KB.js.map} +0 -0
- /package/dist/{chunk-RXAR3JIV.js.map → chunk-XTO4GRGN.js.map} +0 -0
- /package/dist/{chunk-MOO6DKMZ.js.map → chunk-XX7NXI3Y.js.map} +0 -0
- /package/dist/{chunk-23A5K5UW.js.map → chunk-Y5MFVVTM.js.map} +0 -0
- /package/dist/{chunk-XEJ4E5HH.js.map → chunk-YLKCFW2R.js.map} +0 -0
- /package/dist/{chunk-ANV4T62P.js.map → chunk-YU5NDKPA.js.map} +0 -0
- /package/dist/{client-MYU23KWY.js.map → client-QTXWO46T.js.map} +0 -0
- /package/dist/{compaction-MECSN36J.js.map → compaction-FS6XNRLM.js.map} +0 -0
- /package/dist/{config-45OK6PHO.js.map → config-4XGZYYQP.js.map} +0 -0
- /package/dist/{config-mutator-4SUOOBNK.js.map → config-mutator-QLSA6JOY.js.map} +0 -0
- /package/dist/{context-planner-JU7CNXCB.js.map → context-planner-BKHPKDX5.js.map} +0 -0
- /package/dist/{doctor-AUF5HJPW.js.map → doctor-DO262COW.js.map} +0 -0
- /package/dist/{heal-CMQL5SG4.js.map → heal-U67X6NIN.js.map} +0 -0
- /package/dist/{memory-extract-YCNCARZ2.js.map → memory-extract-ATD6YLRK.js.map} +0 -0
- /package/dist/{processes-W5VHBP7T.js.map → processes-5MP32QZT.js.map} +0 -0
- /package/dist/{program-7ZNCVU5A.js.map → program-IEMICVO3.js.map} +0 -0
- /package/dist/{promote-FP4LHKWZ.js.map → promote-S7SKOKX2.js.map} +0 -0
- /package/dist/{providers-ES5KVLI4.js.map → providers-55NC2SFN.js.map} +0 -0
- /package/dist/{query-IJWC42YJ.js.map → query-GOBQ3GL5.js.map} +0 -0
- /package/dist/{registry-US7IWI5G.js.map → registry-HUJEORRW.js.map} +0 -0
- /package/dist/{request-planner-SDUMKFFP.js.map → request-planner-RYWFGBGK.js.map} +0 -0
- /package/dist/{review-candidates-QOKFHMPL.js.map → review-candidates-TXX532LY.js.map} +0 -0
- /package/dist/{routing-XZBHJ63Q.js.map → routing-IT4YS6X3.js.map} +0 -0
- /package/dist/{schedule-tool-XQYEDYXX.js.map → schedule-tool-FJKH2ERY.js.map} +0 -0
- /package/dist/{scheduler-VDIZDO6Y.js.map → scheduler-ALPDUE4H.js.map} +0 -0
- /package/dist/{seat-OU3VAP5Y.js.map → seat-LK45MTVI.js.map} +0 -0
- /package/dist/{select-S6E3HJPE.js.map → select-4LAHUZ74.js.map} +0 -0
- /package/dist/{set-enabled-GY7O7IRS.js.map → set-enabled-F2K56HQZ.js.map} +0 -0
- /package/dist/{tool-RGYNLN6I.js.map → tool-J4VHHZWN.js.map} +0 -0
- /package/dist/{tool-RT5REMY7.js.map → tool-W3ODKQM2.js.map} +0 -0
- /package/dist/{wiki-3UTXUIN6.js.map → wiki-FZHSX4K3.js.map} +0 -0
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
import{a as G,b as _e}from"./chunk-7I7IEX4S.js";import{a as N}from"./chunk-QIJLFPWE.js";import{existsSync as oe,readFileSync as de,writeFileSync as
|
|
2
|
-
`)}var Y,
|
|
1
|
+
import{a as G,b as _e}from"./chunk-7I7IEX4S.js";import{a as N}from"./chunk-QIJLFPWE.js";import{existsSync as oe,readFileSync as de,writeFileSync as Ae,mkdirSync as we}from"fs";import E from"path";import me from"os";import B from"chalk";import I from"prompts";function S(){if(!oe(ne))return null;try{let s=JSON.parse(de(ne,"utf8"));return s.provider&&s.authType&&s.token&&s.model?s:null}catch{return null}}function xe(s){oe(te)||we(te,{recursive:!0}),Ae(ne,JSON.stringify(s,null,2),"utf8")}function L(s){if(s?.trim()){let p=s.startsWith("sk-ant-oat")?"oauth":"api-key";return{token:s.trim(),authType:p}}let e=process.env.ANTHROPIC_OAUTH_TOKEN;if(e?.trim())return{token:e.trim(),authType:"oauth"};let t=process.env.CLAUDE_CODE_OAUTH_TOKEN;if(t?.trim())return{token:t.trim(),authType:"oauth"};let r=process.env.ANTHROPIC_API_KEY;if(r?.trim())return{token:r.trim(),authType:"api-key"};let n=S();if(n)return{token:n.token,authType:n.authType};let o=me.homedir(),l=[E.join(o,".openclaw","agents","main","agent","auth-profiles.json"),E.join(o,".openclaw","auth-profiles.json"),E.join(o,".openclaw","credentials","oauth.json"),E.join(o,".claude","oauth.json"),E.join(o,".config","claude","oauth.json"),E.join(o,".config","anthropic","oauth.json")];for(let p of l){let m=be(p);if(m)return{token:m,authType:"oauth"}}return null}function be(s){if(!oe(s))return"";try{let e=JSON.parse(de(s,"utf8"));if(e.profiles){let t="";for(let[r,n]of Object.entries(e.profiles))if(r.startsWith("anthropic")){if(n.type==="oauth"&&n.access){if(n.expires&&Date.now()>n.expires)continue;return n.access}n.type==="token"&&n.token&&(t=n.token)}if(t)return t}return e.anthropic?.access?e.anthropic.access:e.anthropic?.token?e.anthropic.token:""}catch{return""}}async function ve(){let s=process.env.ANTHROPIC_API_KEY;if(s?.trim()){let r=s.slice(0,10)+"..."+s.slice(-4),{useExisting:n}=await I({type:"confirm",name:"useExisting",message:`Use existing ANTHROPIC_API_KEY (env, ${r})?`,initial:!0});if(n)return{token:s.trim(),authType:"api-key"}}let e=S();if(e?.authType==="api-key"&&e.token){let r=e.token.slice(0,10)+"..."+e.token.slice(-4),{useExisting:n}=await I({type:"confirm",name:"useExisting",message:`Use stored API key (${r})?`,initial:!0});if(n)return{token:e.token,authType:"api-key"}}let{apiKey:t}=await I({type:"password",name:"apiKey",message:"Enter Anthropic API key",validate:r=>r.startsWith("sk-ant-api")?r.length<40?"API key seems too short":!0:"API key must start with sk-ant-api"});return t?{token:t,authType:"api-key"}:null}async function Re(){G.break();let s=46,e="Run `claude setup-token` in your terminal.",t="Then paste the generated token below.";console.log(` ${B.cyan("Anthropic setup-token")} ${"\u2500".repeat(s-21-1)}\u256E`),console.log(` ${" ".repeat(s)}\u2502`),console.log(` ${e}${" ".repeat(s-e.length)}\u2502`),console.log(` ${t}${" ".repeat(s-t.length)}\u2502`),console.log(` ${" ".repeat(s)}\u2502`),console.log(` ${"\u2500".repeat(s)}\u256F`),G.break();let{token:r}=await I({type:"password",name:"token",message:"Paste Anthropic setup-token",validate:o=>o.trim()?o.length<40?"Token seems too short":!0:"Token is required"});if(!r)return null;let{tokenName:n}=await I({type:"text",name:"tokenName",message:"Token name (blank = default)"});return{token:r,authType:"oauth"}}async function Oe(){for(;;){let{provider:s}=await I({type:"select",name:"provider",message:"Model/auth provider",choices:[{title:"Anthropic",value:"anthropic",description:"setup-token + API key"}]});if(s===void 0)return null;let{method:e}=await I({type:"select",name:"method",message:"Anthropic auth method",choices:[{title:"Anthropic token (paste setup-token)",value:"setup-token",description:"run `claude setup-token` elsewhere, then paste the token here"},{title:"Anthropic API key",value:"api-key"},{title:B.dim("Back"),value:"back"}]});if(e===void 0)return null;if(e!=="back")return e==="api-key"?ve():e==="setup-token"?Re():null}}async function Te(){let s=S(),e=re.map(r=>({title:r.label,value:r.id,description:r.hint+(s?.model===r.id?" \xB7 current":"")}));if(s?.model){let r=re.find(o=>o.id===s.model),n=r?r.label:s.model;e.unshift({title:`Keep current (${n})`,value:s.model,description:"no change"})}let{modelId:t}=await I({type:"select",name:"modelId",message:"Default model",choices:e});return t||null}async function Pe(){let s=await Oe();if(!s)return null;let e=await Te();if(!e)return null;let t={provider:s.authType==="oauth"?"claude-code":"claude",authType:s.authType,token:s.token,model:e};return xe(t),G.break(),G.success("Configuration saved to ~/.agentx/auth.json"),console.log(` Provider: ${B.bold("anthropic")} (${t.authType})`),console.log(` Model: ${B.bold(re.find(r=>r.id===t.model)?.label||t.model)}`),t}async function Ke(s){return L(s)?!0:(G.warn("No AI credentials configured."),G.break(),await Pe()!==null)}var te,ne,re,H=N(()=>{"use strict";_e();te=E.join(me.homedir(),".agentx"),ne=E.join(te,"auth.json");re=[{id:"claude-sonnet-4-20250514",label:"anthropic/claude-sonnet-4",hint:"Claude Sonnet 4 \xB7 ctx 200k \xB7 recommended"},{id:"claude-opus-4-20250514",label:"anthropic/claude-opus-4-5",hint:"Claude Opus 4.5 \xB7 ctx 200k \xB7 reasoning"},{id:"claude-haiku-4-20250514",label:"anthropic/claude-haiku-4",hint:"Claude Haiku 4 \xB7 ctx 200k \xB7 fast"}]});function Se(s){return(s?Y.filter(t=>s.includes(t.name)):Y).map(({name:t,description:r,input_schema:n})=>({name:t,description:r,input_schema:n}))}function C(){return Se(["create_files","ask_user"])}function Be(){let s=Y.filter(t=>t.name!=="create_files"&&t.name!=="ask_user");if(s.length===0)return"";let e=["# Available Capabilities","In addition to generating files, you have the following capabilities:",""];for(let t of s)e.push(`## ${t.name}`),e.push(t.description),e.push("");return e.join(`
|
|
2
|
+
`)}var Y,He,W=N(()=>{"use strict";Y=[{name:"create_files",description:"Create one or more files as output. Use this when you need to generate code, documents, configs, or any file-based output.",input_schema:{type:"object",properties:{files:{type:"array",items:{type:"object",properties:{path:{type:"string",description:"Relative file path from project root (e.g., src/components/Button.tsx)"},content:{type:"string",description:"The full content of the file"},language:{type:"string",description:"Programming language or file type"},description:{type:"string",description:"Brief description of what this file does"}},required:["path","content"]}},summary:{type:"string",description:"Brief summary of all generated files"}},required:["files"]},permission:"file-write"},{name:"ask_user",description:"Ask the user a clarifying question when you need more information to proceed. Use this when the request is ambiguous or you need to confirm important decisions.",input_schema:{type:"object",properties:{question:{type:"string",description:"The question to ask the user"},options:{type:"array",items:{type:"string"},description:"Optional list of choices for the user"}},required:["question"]},permission:"none"},{name:"read_file",description:"Read the contents of a file. Use this to inspect existing code, understand patterns, check implementations, or gather context before generating code.",input_schema:{type:"object",properties:{path:{type:"string",description:"Relative file path from project root"},max_lines:{type:"number",description:"Maximum number of lines to read. Defaults to 500. Use for large files."}},required:["path"]},permission:"file-read"},{name:"search_files",description:"Search for files matching a pattern and optionally search their content with a regex. Use this to find relevant code, understand project structure, or locate specific patterns.",input_schema:{type:"object",properties:{pattern:{type:"string",description:"Glob pattern to match files (e.g., 'src/**/*.ts', '*.json')"},content_regex:{type:"string",description:"Optional regex to search within matched files. Returns matching lines."},max_results:{type:"number",description:"Maximum number of results to return. Default: 50."}},required:["pattern"]},permission:"none"},{name:"list_directory",description:"List files and directories at a given path. Use this to explore project structure.",input_schema:{type:"object",properties:{path:{type:"string",description:"Relative directory path from project root. Defaults to '.' (root)."},recursive:{type:"boolean",description:"List recursively. Default: false."},max_depth:{type:"number",description:"Maximum depth for recursive listing. Default: 3."}}},permission:"none"},{name:"run_command",description:"Execute a shell command. Use this to run build tools, test commands, linters, or inspect the environment. Commands run in the project root directory.",input_schema:{type:"object",properties:{command:{type:"string",description:"The shell command to execute"},timeout:{type:"number",description:"Timeout in milliseconds. Default: 30000 (30 seconds)."}},required:["command"]},permission:"command"},{name:"edit_file",description:"Apply search-and-replace edits to an existing file. Use this for targeted modifications to existing code rather than rewriting entire files.",input_schema:{type:"object",properties:{path:{type:"string",description:"Relative file path from project root"},edits:{type:"array",items:{type:"object",properties:{old_text:{type:"string",description:"The exact text to find in the file"},new_text:{type:"string",description:"The replacement text"}},required:["old_text","new_text"]},description:"List of search/replace pairs to apply in order"}},required:["path","edits"]},permission:"file-write"},{name:"spawn_agent",description:"Spawn a sub-agent to handle a task in the background. The sub-agent runs in its own session and returns results. Use this for parallel research, long-running tasks, or delegating work to a specialized agent.",input_schema:{type:"object",properties:{agent_id:{type:"string",description:"The ID of the agent to spawn (must be a registered agent)"},prompt:{type:"string",description:"The task description for the sub-agent"},timeout_seconds:{type:"number",description:"Maximum time to wait for completion in seconds. Default: 300 (5 minutes)."}},required:["agent_id","prompt"]},permission:"none"}];He=Y.map(s=>s.name)});function X(s){return!s||s.length<Ee?s:[{type:"text",text:s,cache_control:{type:"ephemeral"}}]}var V,z,Ee,q,se=N(()=>{"use strict";H();W();V="claude-sonnet-4-20250514",z=8192,Ee=4*1024;q=class{name="claude";apiKey;authType="api-key";constructor(e){if(this.apiKey=e||process.env.ANTHROPIC_API_KEY||"",!this.apiKey){let t=L();t&&(this.apiKey=t.token,this.authType=t.authType)}if(!this.apiKey)throw new Error("Anthropic API key required. Run `agentx model` to configure, set ANTHROPIC_API_KEY, or pass --api-key.")}async generate(e,t){let r=t?.model||V,n=t?.maxTokens||z,o=e.find(c=>c.role==="system"),l=e.filter(c=>c.role!=="system").map(c=>({role:c.role,content:c.content})),p={model:r,max_tokens:n,messages:l,tools:C()};o&&(p.system=X(o.content)),t?.temperature!==void 0&&(p.temperature=t.temperature);let m=await this.callApi(p,t);return this.parseResponse(m)}async generateRaw(e,t,r,n){let o=n?.model||V,l=n?.maxTokens||z,p={model:o,max_tokens:l,system:X(t),messages:e,tools:r};n?.temperature!==void 0&&(p.temperature=n.temperature),n?.toolChoice&&(p.tool_choice={type:"tool",name:n.toolChoice.name});let m=await this.callApi(p,n);return{content:m.content.map(g=>g.type==="text"?{type:"text",text:g.text||""}:g.type==="tool_use"?{type:"tool_use",id:g.id||"",name:g.name||"",input:g.input||{}}:{type:"text",text:""}),stop_reason:m.stop_reason,usage:m.usage}}async*stream(e,t){let r=t?.model||V,n=t?.maxTokens||z,o=e.find(f=>f.role==="system"),l=e.filter(f=>f.role!=="system").map(f=>({role:f.role,content:f.content})),p={model:r,max_tokens:n,messages:l,stream:!0,tools:C()};o&&(p.system=X(o.content));let m=this.buildHeaders(),c=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:m,body:JSON.stringify(p),signal:t?.abortSignal});if(!c.ok){let f=await c.text();yield{type:"error",error:`Anthropic API error (${c.status}): ${f}`};return}let g=c.body?.getReader();if(!g){yield{type:"error",error:"No response body"};return}let k=new TextDecoder,d="",h=[],w="",A,b=0,i=null,y=f=>{let R=(f||"").trim();if(!R||R.includes("```"))return;let T=R.replace(/\r\n/g,`
|
|
3
3
|
`).split(`
|
|
4
4
|
`),x=T.slice(Math.max(0,T.length-20)),u=x.join(`
|
|
5
5
|
`);if(/\b(plan|proposal)\b/i.test(u)&&/(ready for your review|review (the )?plan|requesting plan approval|awaiting approval|waiting for (your )?approval|approve (the )?plan|approval to proceed)/i.test(u))return`The provider is requesting plan approval.
|
|
6
6
|
Reply with:
|
|
7
7
|
- approve
|
|
8
8
|
- revise: <what to change>
|
|
9
|
-
- cancel`;let
|
|
10
|
-
`).trim();if(!(j.length<5))return j.length>800?j.slice(0,800).trimEnd():j};try{for(;;){let{done:f,value:R}=await g.read();if(f)break;d+=
|
|
11
|
-
`);d=T.pop()||"";for(let x of T){if(!x.startsWith("data: "))continue;let u=x.slice(6).trim();if(u!=="[DONE]")try{let a=JSON.parse(u);if(a.type==="content_block_start"&&a.content_block?.type==="tool_use"){if(
|
|
12
|
-
${
|
|
13
|
-
Options: ${
|
|
14
|
-
${
|
|
15
|
-
Options: ${
|
|
16
|
-
${f.summary}`)),
|
|
17
|
-
Options: ${f.options.join(", ")}`))}catch{}
|
|
18
|
-
`);d=R.pop()||"";for(let T of R){if(!T.startsWith("data: "))continue;let x=T.slice(6).trim();if(!x||x==="[DONE]")continue;let u;try{u=JSON.parse(x)}catch{continue}if(u.type==="message_start"&&u.message?.usage&&(b=u.message.usage.input_tokens||0),u.type==="content_block_start"){let a=u.content_block;a?.type==="text"?(w=h.length,h.push({type:"text",text:""})):a?.type==="tool_use"?(w=h.length,h.push({type:"tool_use",id:a.id||"",name:a.name||"",input:{}}),h[w]._rawJson=""):w=null}if(u.type==="content_block_delta"&&w!=null){let a=h[w];u.delta?.type==="text_delta"&&a.type==="text"?(a.text+=u.delta.text,yield{type:"text_delta",text:u.delta.text}):u.delta?.type==="input_json_delta"&&a.type==="tool_use"&&(a._rawJson+=u.delta.partial_json||"")}if(u.type==="content_block_stop"&&w!=null){let a=h[w];if(a.type==="tool_use"){let
|
|
9
|
+
- cancel`;let _=P=>/^(question|clarification|clarify|i need|need more|before i proceed|to proceed|please (confirm|clarify)|which|what|where|when|how|do you)/i.test(P.trim()),O=-1;for(let P=x.length-1;P>=0;P--){let $=x[P].trim();if($&&(_($)||$.includes("?"))){O=P;break}}if(O===-1)return;let v=[];for(let P=O;P<x.length&&v.length<8;P++){let $=x[P],ee=$.trim();if(v.length>0&&!ee||v.length>0&&!/^(options?:|[-*]\s|\d+[\).]\s)/i.test(ee)&&!ee.includes("?"))break;v.push($.trimEnd())}let j=v.join(`
|
|
10
|
+
`).trim();if(!(j.length<5))return j.length>800?j.slice(0,800).trimEnd():j};try{for(;;){let{done:f,value:R}=await g.read();if(f)break;d+=k.decode(R,{stream:!0});let T=d.split(`
|
|
11
|
+
`);d=T.pop()||"";for(let x of T){if(!x.startsWith("data: "))continue;let u=x.slice(6).trim();if(u!=="[DONE]")try{let a=JSON.parse(u);if(a.type==="content_block_start"&&a.content_block?.type==="tool_use"){if(i){yield{type:"tool_use_end",name:i.name};try{let _=JSON.parse(i.json||"{}");i.name==="create_files"&&_&&(Array.isArray(_.files)&&h.push(..._.files),typeof _.summary=="string"&&_.summary.trim()&&(w+=`
|
|
12
|
+
${_.summary}`)),i.name==="ask_user"&&_&&typeof _.question=="string"&&_.question.trim()&&(A=_.question,Array.isArray(_.options)&&_.options.length&&(A+=`
|
|
13
|
+
Options: ${_.options.join(", ")}`))}catch{}finally{i=null}}i={name:a.content_block.name,id:a.content_block.id,json:""},yield{type:"tool_use_start",name:a.content_block.name,id:a.content_block.id}}if(a.type==="content_block_delta"&&(a.delta?.type==="text_delta"&&(w+=a.delta.text,yield{type:"text_delta",text:a.delta.text}),a.delta?.type==="input_json_delta"&&(i&&(i.json+=a.delta.partial_json||""),yield{type:"tool_use_delta",json:a.delta.partial_json})),a.type==="content_block_stop"&&i){yield{type:"tool_use_end",name:i.name};try{let _=JSON.parse(i.json||"{}");i.name==="create_files"&&_&&(Array.isArray(_.files)&&h.push(..._.files),typeof _.summary=="string"&&_.summary.trim()&&(w+=`
|
|
14
|
+
${_.summary}`)),i.name==="ask_user"&&_&&typeof _.question=="string"&&_.question.trim()&&(A=_.question,Array.isArray(_.options)&&_.options.length&&(A+=`
|
|
15
|
+
Options: ${_.options.join(", ")}`))}catch{}finally{i=null}}a.type==="message_delta"&&a.usage&&(b=(a.usage.input_tokens||0)+(a.usage.output_tokens||0)),a.type}catch{}}}}finally{g.releaseLock()}if(i){yield{type:"tool_use_end",name:i.name};try{let f=JSON.parse(i.json||"{}");i.name==="create_files"&&f&&(Array.isArray(f.files)&&h.push(...f.files),typeof f.summary=="string"&&f.summary.trim()&&(w+=`
|
|
16
|
+
${f.summary}`)),i.name==="ask_user"&&f&&typeof f.question=="string"&&f.question.trim()&&(A=f.question,Array.isArray(f.options)&&f.options.length&&(A+=`
|
|
17
|
+
Options: ${f.options.join(", ")}`))}catch{}i=null}!A&&h.length===0&&(A=y(w)),yield{type:"done",result:{content:w,files:h,followUp:A,tokensUsed:b}}}async*generateRawStream(e,t,r,n){let o=n?.model||V,l=n?.maxTokens||z,p={model:o,max_tokens:l,system:X(t),messages:e,tools:r,stream:!0};n?.temperature!==void 0&&(p.temperature=n.temperature);let m=this.buildHeaders(),c;try{c=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:m,body:JSON.stringify(p),signal:n?.abortSignal})}catch(y){yield{type:"error",error:`Anthropic stream init failed: ${y?.message??y}`};return}if(!c.ok){let y=await c.text().catch(()=>"");yield{type:"error",error:`Anthropic API error (${c.status}): ${y.slice(0,500)}`};return}let g=c.body?.getReader();if(!g){yield{type:"error",error:"No response body on Anthropic stream"};return}let k=new TextDecoder,d="",h=[],w=null,A="end_turn",b=0,i=0;try{for(;;){let{done:y,value:f}=await g.read();if(y)break;d+=k.decode(f,{stream:!0});let R=d.split(`
|
|
18
|
+
`);d=R.pop()||"";for(let T of R){if(!T.startsWith("data: "))continue;let x=T.slice(6).trim();if(!x||x==="[DONE]")continue;let u;try{u=JSON.parse(x)}catch{continue}if(u.type==="message_start"&&u.message?.usage&&(b=u.message.usage.input_tokens||0),u.type==="content_block_start"){let a=u.content_block;a?.type==="text"?(w=h.length,h.push({type:"text",text:""})):a?.type==="tool_use"?(w=h.length,h.push({type:"tool_use",id:a.id||"",name:a.name||"",input:{}}),h[w]._rawJson=""):w=null}if(u.type==="content_block_delta"&&w!=null){let a=h[w];u.delta?.type==="text_delta"&&a.type==="text"?(a.text+=u.delta.text,yield{type:"text_delta",text:u.delta.text}):u.delta?.type==="input_json_delta"&&a.type==="tool_use"&&(a._rawJson+=u.delta.partial_json||"")}if(u.type==="content_block_stop"&&w!=null){let a=h[w];if(a.type==="tool_use"){let _=a._rawJson||"{}";try{a.input=JSON.parse(_)}catch{a.input={}}delete a._rawJson}w=null}u.type==="message_delta"&&(u.delta?.stop_reason&&(A=u.delta.stop_reason),u.usage&&(i=u.usage.output_tokens||0))}}}catch(y){yield{type:"error",error:`Anthropic stream read failed: ${y?.message??y}`};return}finally{g.releaseLock()}yield{type:"raw_result",result:{content:h,stop_reason:A,usage:{input_tokens:b,output_tokens:i}}}}buildHeaders(){let e={"Content-Type":"application/json","anthropic-version":"2023-06-01"};return this.authType==="oauth"?(e.Authorization=`Bearer ${this.apiKey}`,e["anthropic-beta"]="claude-code-20250219,oauth-2025-04-20",e["user-agent"]="claude-cli/2.1.2 (external, cli)",e["x-app"]="cli",e["anthropic-dangerous-direct-browser-access"]="true"):e["x-api-key"]=this.apiKey,e}async callApi(e,t){let r=this.buildHeaders(),n=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:r,body:JSON.stringify(e),signal:t?.abortSignal});if(!n.ok){let o=await n.text();throw new Error(`Anthropic API error (${n.status}): ${o}`)}return await n.json()}parseResponse(e){let t=[],r="",n;for(let o of e.content)if(o.type==="text"&&(r+=o.text||""),o.type==="tool_use"){if(o.name==="create_files"&&o.input){let l=o.input;t.push(...l.files||[]),l.summary&&(r+=`
|
|
19
19
|
${l.summary}`)}if(o.name==="ask_user"&&o.input){let l=o.input;n=l.question,l.options?.length&&(n+=`
|
|
20
|
-
Options: ${l.options.join(", ")}`)}}return{content:r,files:t,followUp:n,tokensUsed:e.usage.input_tokens+e.usage.output_tokens}}}});import{execa as fe}from"execa";import{tmpdir as
|
|
20
|
+
Options: ${l.options.join(", ")}`)}}return{content:r,files:t,followUp:n,tokensUsed:e.usage.input_tokens+e.usage.output_tokens}}}});import{execa as fe}from"execa";import{tmpdir as Ie}from"os";function Me(s){let e=["-p","--output-format","json","--model",s.model,"--dangerously-skip-permissions"];return s.bare&&e.push(...Ce),s.systemPrompt&&e.push(s.bare?"--system-prompt":"--append-system-prompt",s.systemPrompt),e.push(s.prompt),e}function ge(s){let e=(s.stderr||s.stdout||"").toString().trim();return e||(s.isCanceled?"Claude CLI aborted by caller (timeout or cancel)":s.timedOut?"Claude CLI timed out":s.signal?`Claude CLI killed by ${s.signal}`:`Claude CLI failed (exit ${s.exitCode??"unknown"}, no output)`)}var K,ie,ye,Ce,J,ae=N(()=>{"use strict";H();W();K="claude-sonnet-4-20250514",ie=8192,ye={"claude-sonnet-4-20250514":"sonnet","claude-opus-4-20250514":"opus","claude-haiku-4-20250514":"haiku"},Ce=["--tools","","--strict-mcp-config","--mcp-config",'{"mcpServers":{}}',"--settings",'{"disableAllHooks":true}',"--no-session-persistence","--setting-sources",""];J=class{name="claude-code";credential;constructor(){let e=S();if(e){this.credential={type:e.authType,token:e.token};return}let t=L();if(!t)throw new Error(`No Claude credentials found.
|
|
21
21
|
Options:
|
|
22
22
|
1. Run \`agentx model\` to configure credentials
|
|
23
23
|
2. Set ANTHROPIC_API_KEY environment variable
|
|
24
24
|
3. Set ANTHROPIC_OAUTH_TOKEN environment variable`);this.credential={type:t.authType,token:t.token}}async generate(e,t){return this.credential.type==="oauth"?this.generateViaCli(e,t):this.generateViaApi(e,t)}async generateRaw(e,t,r,n){if(this.credential.type==="oauth")throw new Error("generateRaw() not available for OAuth/CLI mode");let o=n?.model||K,l=n?.maxTokens||ie,p={model:o,max_tokens:l,system:t,messages:e,tools:r};n?.temperature!==void 0&&(p.temperature=n.temperature);let m={"Content-Type":"application/json","anthropic-version":"2023-06-01","x-api-key":this.credential.token},c=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:m,body:JSON.stringify(p)});if(!c.ok){let d=await c.text();throw new Error(`Anthropic API error (${c.status}): ${d}`)}let g=await c.json();return{content:g.content.map(d=>d.type==="text"?{type:"text",text:d.text||""}:d.type==="tool_use"?{type:"tool_use",id:d.id||"",name:d.name||"",input:d.input||{}}:{type:"text",text:""}),stop_reason:g.stop_reason,usage:g.usage}}get supportsAgenticLoop(){return this.credential.type==="api-key"}async generateViaCli(e,t){let r=t?.model||S()?.model||K,n=ye[r]||r,o=e.find(d=>d.role==="system"),p=e.filter(d=>d.role==="user").map(d=>d.content).join(`
|
|
25
25
|
|
|
26
|
-
`),m=
|
|
26
|
+
`),m=Me({model:n,systemPrompt:o?.content,prompt:p,bare:t?.bare===!0}),c={...process.env};delete c.ANTHROPIC_API_KEY,delete c.ANTHROPIC_API_KEY_OLD;let g=await fe("claude",m,{env:c,extendEnv:!1,reject:!1,timeout:3e5,stdin:"ignore",...t?.bare?{cwd:Ie()}:{},...t?.abortSignal?{signal:t.abortSignal}:{}});if(g.exitCode!==0)throw new Error(`Claude CLI error: ${ge(g)}`);let k=g.stdout.trim();try{let d=JSON.parse(k);if(d.is_error&&d.result)throw new Error(d.result)}catch(d){if(d.message&&!d.message.includes("JSON"))throw d}return this.parseCliOutput(k)}async generateViaApi(e,t){let r=t?.model||K,n=t?.maxTokens||ie,o=e.find(k=>k.role==="system"),l=e.filter(k=>k.role!=="system").map(k=>({role:k.role,content:k.content})),p={model:r,max_tokens:n,messages:l,tools:C()};o&&(p.system=o.content),t?.temperature!==void 0&&(p.temperature=t.temperature);let m={"Content-Type":"application/json","anthropic-version":"2023-06-01","x-api-key":this.credential.token},c=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:m,body:JSON.stringify(p)});if(!c.ok){let k=await c.text();throw new Error(`Anthropic API error (${c.status}): ${k}`)}let g=await c.json();return this.parseApiResponse(g)}async*stream(e,t){this.credential.type==="oauth"?yield*this.streamViaCli(e,t):yield*this.streamViaApi(e,t)}async*streamViaCli(e,t){let r=t?.model||S()?.model||K,n=ye[r]||r,o=e.find(i=>i.role==="system"),p=e.filter(i=>i.role==="user").map(i=>i.content).join(`
|
|
27
27
|
|
|
28
|
-
`),m=["-p","--output-format","stream-json","--model",n,"--dangerously-skip-permissions"];o&&m.push("--append-system-prompt",o.content),m.push(p);let c={...process.env};delete c.ANTHROPIC_API_KEY,delete c.ANTHROPIC_API_KEY_OLD;let g=fe("claude",m,{env:c,extendEnv:!1,reject:!1,timeout:3e5,stdin:"ignore"}),
|
|
29
|
-
`).filter(Boolean);for(let x of T)try{let u=JSON.parse(x);if(u.type==="error"){h=String(u.error||u.message||"Claude CLI error");continue}if(u.is_error&&(u.result||u.message)){h=String(u.result||u.message);continue}u.type==="assistant"&&u.message?(
|
|
30
|
-
`);d=R.pop()||"";for(let T of R){if(!T.startsWith("data: "))continue;let x=T.slice(6).trim();if(x!=="[DONE]")try{let u=JSON.parse(x);if(u.type==="content_block_start"&&u.content_block?.type==="tool_use"){if(
|
|
31
|
-
${a.summary}`)),
|
|
32
|
-
Options: ${a.options.join(", ")}`))}catch{}finally{
|
|
33
|
-
${a.summary}`)),
|
|
34
|
-
Options: ${a.options.join(", ")}`))}catch{}finally{
|
|
35
|
-
${y.summary}`)),
|
|
36
|
-
Options: ${y.options.join(", ")}`))}catch{}
|
|
28
|
+
`),m=["-p","--output-format","stream-json","--model",n,"--dangerously-skip-permissions"];o&&m.push("--append-system-prompt",o.content),m.push(p);let c={...process.env};delete c.ANTHROPIC_API_KEY,delete c.ANTHROPIC_API_KEY_OLD;let g=fe("claude",m,{env:c,extendEnv:!1,reject:!1,timeout:3e5,stdin:"ignore"}),k="",d="",h;if(g.stderr&&g.stderr.on("data",i=>{d+=Buffer.isBuffer(i)?i.toString("utf8"):String(i)}),g.stdout){let i=new TextDecoder,y=g.stdout;for await(let f of y){let T=(typeof f=="string"?f:i.decode(f,{stream:!0})).split(`
|
|
29
|
+
`).filter(Boolean);for(let x of T)try{let u=JSON.parse(x);if(u.type==="error"){h=String(u.error||u.message||"Claude CLI error");continue}if(u.is_error&&(u.result||u.message)){h=String(u.result||u.message);continue}u.type==="assistant"&&u.message?(k+=u.message,yield{type:"text_delta",text:u.message}):u.type==="result"&&(k=u.result||k)}catch{k+=x,yield{type:"text_delta",text:x}}}}let w=await g;if(w.exitCode!==0&&!h&&(h=d.toString().trim()||ge(w)),h){yield{type:"error",error:`Claude CLI error: ${h}`};return}let A=this.extractFilesFromText(k),b=A.length===0?this.inferFollowUpFromText(k):void 0;yield{type:"done",result:{content:k,files:A,followUp:b,tokensUsed:0}}}async*streamViaApi(e,t){let r=t?.model||K,n=t?.maxTokens||ie,o=e.find(y=>y.role==="system"),l=e.filter(y=>y.role!=="system").map(y=>({role:y.role,content:y.content})),p={model:r,max_tokens:n,messages:l,tools:C(),stream:!0};o&&(p.system=o.content);let m={"Content-Type":"application/json","anthropic-version":"2023-06-01","x-api-key":this.credential.token},c=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:m,body:JSON.stringify(p)});if(!c.ok){let y=await c.text();yield{type:"error",error:`Anthropic API error (${c.status}): ${y}`};return}let g=c.body?.getReader();if(!g){yield{type:"error",error:"No response body"};return}let k=new TextDecoder,d="",h="",w=0,A=[],b,i=null;try{for(;;){let{done:y,value:f}=await g.read();if(y)break;d+=k.decode(f,{stream:!0});let R=d.split(`
|
|
30
|
+
`);d=R.pop()||"";for(let T of R){if(!T.startsWith("data: "))continue;let x=T.slice(6).trim();if(x!=="[DONE]")try{let u=JSON.parse(x);if(u.type==="content_block_start"&&u.content_block?.type==="tool_use"){if(i){yield{type:"tool_use_end",name:i.name};try{let a=JSON.parse(i.json||"{}");i.name==="create_files"&&a&&(Array.isArray(a.files)&&A.push(...a.files),typeof a.summary=="string"&&a.summary.trim()&&(h+=`
|
|
31
|
+
${a.summary}`)),i.name==="ask_user"&&a&&typeof a.question=="string"&&a.question.trim()&&(b=a.question,Array.isArray(a.options)&&a.options.length&&(b+=`
|
|
32
|
+
Options: ${a.options.join(", ")}`))}catch{}finally{i=null}}i={name:u.content_block.name,id:u.content_block.id,json:""},yield{type:"tool_use_start",name:i.name,id:i.id}}if(u.type==="content_block_delta"&&u.delta?.type==="text_delta"&&(h+=u.delta.text,yield{type:"text_delta",text:u.delta.text}),u.type==="content_block_delta"&&u.delta?.type==="input_json_delta"&&(i&&(i.json+=u.delta.partial_json||""),yield{type:"tool_use_delta",json:u.delta.partial_json}),u.type==="content_block_stop"&&i){yield{type:"tool_use_end",name:i.name};try{let a=JSON.parse(i.json||"{}");i.name==="create_files"&&a&&(Array.isArray(a.files)&&A.push(...a.files),typeof a.summary=="string"&&a.summary.trim()&&(h+=`
|
|
33
|
+
${a.summary}`)),i.name==="ask_user"&&a&&typeof a.question=="string"&&a.question.trim()&&(b=a.question,Array.isArray(a.options)&&a.options.length&&(b+=`
|
|
34
|
+
Options: ${a.options.join(", ")}`))}catch{}finally{i=null}}u.type==="message_delta"&&u.usage&&(w=(u.usage.input_tokens||0)+(u.usage.output_tokens||0))}catch{}}}}finally{g.releaseLock()}if(i){yield{type:"tool_use_end",name:i.name};try{let y=JSON.parse(i.json||"{}");i.name==="create_files"&&y&&(Array.isArray(y.files)&&A.push(...y.files),typeof y.summary=="string"&&y.summary.trim()&&(h+=`
|
|
35
|
+
${y.summary}`)),i.name==="ask_user"&&y&&typeof y.question=="string"&&y.question.trim()&&(b=y.question,Array.isArray(y.options)&&y.options.length&&(b+=`
|
|
36
|
+
Options: ${y.options.join(", ")}`))}catch{}i=null}A.length===0&&A.push(...this.extractFilesFromText(h)),!b&&A.length===0&&(b=this.inferFollowUpFromText(h)),yield{type:"done",result:{content:h,files:A,followUp:b,tokensUsed:w}}}parseCliOutput(e){let t;try{t=JSON.parse(e)}catch{let l=this.inferFollowUpFromText(e.trim());return{content:e.trim(),files:[],followUp:l,tokensUsed:0}}let r=t.result||t.text||t.content||"",n=this.extractFilesFromText(r),o=n.length===0?this.inferFollowUpFromText(r):void 0;return{content:r,files:n,followUp:o,tokensUsed:t.usage?(t.usage.input_tokens||0)+(t.usage.output_tokens||0):0}}extractFilesFromText(e){let t=[],r=/```[\w]*\s*([\w/._-]+\.\w+)\n([\s\S]*?)```/g,n;for(;(n=r.exec(e))!==null;){let o=n[1],l=n[2];o&&l&&t.push({path:o,content:l.trimEnd()})}return t}inferFollowUpFromText(e){let t=(e||"").trim();if(!t||t.includes("```"))return;let r=t.replace(/\r\n/g,`
|
|
37
37
|
`).split(`
|
|
38
38
|
`),n=r.slice(Math.max(0,r.length-20)),o=n.join(`
|
|
39
39
|
`);if(/\b(plan|proposal)\b/i.test(o)&&/(ready for your review|review (the )?plan|requesting plan approval|awaiting approval|waiting for (your )?approval|approve (the )?plan|approval to proceed)/i.test(o))return`The provider is requesting plan approval.
|
|
40
40
|
Reply with:
|
|
41
41
|
- approve
|
|
42
42
|
- revise: <what to change>
|
|
43
|
-
- cancel`;let p=
|
|
43
|
+
- cancel`;let p=k=>/^(question|clarification|clarify|i need|need more|before i proceed|to proceed|please (confirm|clarify)|which|what|where|when|how|do you)/i.test(k.trim()),m=-1;for(let k=n.length-1;k>=0;k--){let d=n[k].trim();if(d&&(p(d)||d.includes("?"))){m=k;break}}if(m===-1)return;let c=[];for(let k=m;k<n.length&&c.length<8;k++){let d=n[k],h=d.trim();if(c.length>0&&!h||c.length>0&&!/^(options?:|[-*]\s|\d+[\).]\s)/i.test(h)&&!h.includes("?"))break;c.push(d.trimEnd())}let g=c.join(`
|
|
44
44
|
`).trim();if(!(g.length<5))return g.length>800?g.slice(0,800).trimEnd():g}parseApiResponse(e){let t=[],r="",n;for(let o of e.content)if(o.type==="text"&&(r+=o.text||""),o.type==="tool_use"){if(o.name==="create_files"&&o.input){let l=o.input;t.push(...l.files||[]),l.summary&&(r+=`
|
|
45
45
|
${l.summary}`)}if(o.name==="ask_user"&&o.input){let l=o.input;n=l.question,l.options?.length&&(n+=`
|
|
46
|
-
Options: ${l.options.join(", ")}`)}}return{content:r,files:t,followUp:n,tokensUsed:e.usage.input_tokens+e.usage.output_tokens}}}});var ce,le,D,pe=N(()=>{"use strict";W();ce="gpt-4o-mini",le=8192,D=class{name="openai";apiKey;baseUrl;thinkingEnabled;constructor(e,t,r={}){this.apiKey=e||process.env.OPENAI_API_KEY||"",this.baseUrl=(t||process.env.OPENAI_BASE_URL||"https://api.openai.com/v1").replace(/\/$/,"");let n=this.baseUrl.includes("deepseek.com");if(this.thinkingEnabled=n?r.thinking!==!1:null,!this.apiKey)throw new Error("OpenAI-compatible API key required. Set OPENAI_API_KEY (or pass --api-key). For DeepSeek, also set OPENAI_BASE_URL=https://api.deepseek.com/v1.")}async generate(e,t){let r=t?.model||process.env.OPENAI_MODEL||ce,n=t?.maxTokens||le,o=e.map(m=>({role:m.role,content:m.content})),l={model:r,max_tokens:n,messages:o,tools:this.legacyToolsAsOpenAI()};t?.temperature!==void 0&&(l.temperature=t.temperature);let p=await this.callApi(l);return this.parseHighLevelResponse(p)}async generateRaw(e,t,r,n){let o=this.buildRawBody(e,t,r,n),l=await this.callApi(o,n?.abortSignal);return this.parseRawResponse(l)}async*generateRawStream(e,t,r,n){let o={...this.buildRawBody(e,t,r,n),stream:!0,stream_options:{include_usage:!0}},l;try{l=await fetch(`${this.baseUrl}/chat/completions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify(this.maybeDeepseekExtras(o)),signal:n?.abortSignal})}catch(f){if(f?.name==="AbortError"||n?.abortSignal?.aborted){yield{type:"error",error:"cancelled"};return}yield{type:"error",error:`OpenAI-compat raw stream init failed: ${f?.message??f}`};return}if(!l.ok){let f=await l.text().catch(()=>"");yield{type:"error",error:`OpenAI-compat API error (${l.status}): ${f.slice(0,500)}`};return}let p=l.body?.getReader();if(!p){yield{type:"error",error:"No response body on OpenAI-compat raw stream"};return}let m=()=>{p.cancel(new Error("aborted")).catch(()=>{})};n?.abortSignal&&(n.abortSignal.aborted?m():n.abortSignal.addEventListener("abort",m,{once:!0}));let c=new TextDecoder,g="",
|
|
47
|
-
`);g=T.pop()||"";for(let x of T){if(!x.startsWith("data: "))continue;let u=x.slice(6).trim();if(!u||u==="[DONE]")continue;let a;try{a=JSON.parse(u)}catch{continue}let
|
|
48
|
-
`);g=f.pop()||"";for(let R of f){if(!R.startsWith("data: "))continue;let T=R.slice(6).trim();if(T==="[DONE]")continue;let x;try{x=JSON.parse(T)}catch{continue}let a=x.choices?.[0]?.delta;if(typeof a?.reasoning_content=="string"&&a.reasoning_content&&(yield{type:"thinking_delta",text:a.reasoning_content}),typeof a?.content=="string"&&a.content&&(
|
|
49
|
-
`:"")+y.summary)):
|
|
50
|
-
Options: ${y.options.join(", ")}`))}catch{}}yield{type:"done",result:{content:
|
|
46
|
+
Options: ${l.options.join(", ")}`)}}return{content:r,files:t,followUp:n,tokensUsed:e.usage.input_tokens+e.usage.output_tokens}}}});var ce,le,D,pe=N(()=>{"use strict";W();ce="gpt-4o-mini",le=8192,D=class{name="openai";apiKey;baseUrl;thinkingEnabled;constructor(e,t,r={}){this.apiKey=e||process.env.OPENAI_API_KEY||"",this.baseUrl=(t||process.env.OPENAI_BASE_URL||"https://api.openai.com/v1").replace(/\/$/,"");let n=this.baseUrl.includes("deepseek.com");if(this.thinkingEnabled=n?r.thinking!==!1:null,!this.apiKey)throw new Error("OpenAI-compatible API key required. Set OPENAI_API_KEY (or pass --api-key). For DeepSeek, also set OPENAI_BASE_URL=https://api.deepseek.com/v1.")}async generate(e,t){let r=t?.model||process.env.OPENAI_MODEL||ce,n=t?.maxTokens||le,o=e.map(m=>({role:m.role,content:m.content})),l={model:r,max_tokens:n,messages:o,tools:this.legacyToolsAsOpenAI()};t?.temperature!==void 0&&(l.temperature=t.temperature);let p=await this.callApi(l);return this.parseHighLevelResponse(p)}async generateRaw(e,t,r,n){let o=this.buildRawBody(e,t,r,n),l=await this.callApi(o,n?.abortSignal);return this.parseRawResponse(l)}async*generateRawStream(e,t,r,n){let o={...this.buildRawBody(e,t,r,n),stream:!0,stream_options:{include_usage:!0}},l;try{l=await fetch(`${this.baseUrl}/chat/completions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify(this.maybeDeepseekExtras(o)),signal:n?.abortSignal})}catch(f){if(f?.name==="AbortError"||n?.abortSignal?.aborted){yield{type:"error",error:"cancelled"};return}yield{type:"error",error:`OpenAI-compat raw stream init failed: ${f?.message??f}`};return}if(!l.ok){let f=await l.text().catch(()=>"");yield{type:"error",error:`OpenAI-compat API error (${l.status}): ${f.slice(0,500)}`};return}let p=l.body?.getReader();if(!p){yield{type:"error",error:"No response body on OpenAI-compat raw stream"};return}let m=()=>{p.cancel(new Error("aborted")).catch(()=>{})};n?.abortSignal&&(n.abortSignal.aborted?m():n.abortSignal.addEventListener("abort",m,{once:!0}));let c=new TextDecoder,g="",k="",d="",h=0,w=0,A=null,b={};try{for(;;){if(n?.abortSignal?.aborted){yield{type:"error",error:"cancelled"};return}let{done:f,value:R}=await p.read();if(f)break;g+=c.decode(R,{stream:!0});let T=g.split(`
|
|
47
|
+
`);g=T.pop()||"";for(let x of T){if(!x.startsWith("data: "))continue;let u=x.slice(6).trim();if(!u||u==="[DONE]")continue;let a;try{a=JSON.parse(u)}catch{continue}let _=a.choices?.[0],O=_?.delta;if(_?.finish_reason&&(A=_.finish_reason),typeof O?.reasoning_content=="string"&&O.reasoning_content&&(d+=O.reasoning_content,yield{type:"thinking_delta",text:O.reasoning_content}),typeof O?.content=="string"&&O.content&&(k+=O.content,yield{type:"text_delta",text:O.content}),Array.isArray(O?.tool_calls))for(let v of O.tool_calls){let j=v.index;if(j==null)continue;let P=b[j]||={id:"",name:"",argumentsRaw:""};v.id&&(P.id=v.id),v.function?.name&&(P.name=v.function.name),v.function?.arguments&&(P.argumentsRaw+=v.function.arguments)}a.usage&&(h=a.usage.prompt_tokens||0,w=a.usage.completion_tokens||0)}}}catch(f){if(f?.name==="AbortError"||n?.abortSignal?.aborted){yield{type:"error",error:"cancelled"};return}yield{type:"error",error:`OpenAI-compat raw stream read failed: ${f?.message??f}`};return}finally{n?.abortSignal&&n.abortSignal.removeEventListener("abort",m)}let i=[];d&&i.push({type:"reasoning",text:d}),k&&i.push({type:"text",text:k});for(let f of Object.values(b)){if(!f.id||!f.name)continue;let R={};try{R=f.argumentsRaw?JSON.parse(f.argumentsRaw):{}}catch{}i.push({type:"tool_use",id:f.id,name:f.name,input:R})}let y="end_turn";switch(A){case"tool_calls":case"function_call":y="tool_use";break;case"length":y="max_tokens";break}yield{type:"raw_result",result:{content:i,stop_reason:y,usage:{input_tokens:h,output_tokens:w}}}}buildRawBody(e,t,r,n){let o=n?.model||process.env.OPENAI_MODEL||ce,l=n?.maxTokens||le,p=t?[{role:"system",content:t}]:[];for(let c of e){let g=Array.isArray(c.content)?c.content:[{type:"text",text:c.content}];if(c.role==="user"){let k=g.filter(h=>h.type==="tool_result"),d=g.filter(h=>h.type==="text").map(h=>h.text).join("");for(let h of k)p.push({role:"tool",tool_call_id:h.tool_use_id,content:h.is_error?`[error] ${h.content}`:h.content});d?p.push({role:"user",content:d}):k.length===0&&p.push({role:"user",content:c.content})}else{let k=g.filter(A=>A.type==="tool_use"),d=g.filter(A=>A.type==="text").map(A=>A.text).join(""),h=g.filter(A=>A.type==="reasoning").map(A=>A.text).join(""),w={role:"assistant",content:d||null};k.length>0&&(w.tool_calls=k.map(A=>({id:A.id,type:"function",function:{name:A.name,arguments:JSON.stringify(A.input||{})}}))),h&&(w.reasoning_content=h),p.push(w)}}let m={model:o,max_tokens:l,messages:p,tools:r.map(c=>({type:"function",function:{name:c.name,description:c.description,parameters:c.input_schema}})),tool_choice:"auto"};return n?.temperature!==void 0&&(m.temperature=n.temperature),n?.toolChoice&&(m.tool_choice={type:"function",function:{name:n.toolChoice.name}}),n?.responseFormat&&(m.response_format={type:"json_schema",json_schema:{name:n.responseFormat.name,schema:n.responseFormat.schema,strict:!0}}),n?.logprobs?.enabled&&(m.logprobs=!0,m.top_logprobs=n.logprobs.topK),m}async*stream(e,t){let r=t?.model||process.env.OPENAI_MODEL||ce,n=t?.maxTokens||le,o=e.map(i=>({role:i.role,content:i.content})),l={model:r,max_tokens:n,messages:o,tools:this.legacyToolsAsOpenAI(),stream:!0,stream_options:{include_usage:!0}};t?.temperature!==void 0&&(l.temperature=t.temperature);let p;try{p=await fetch(`${this.baseUrl}/chat/completions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify(this.maybeDeepseekExtras(l))})}catch(i){yield{type:"error",error:`OpenAI-compat stream init failed: ${i.message}`};return}if(!p.ok){let i=await p.text().catch(()=>"");yield{type:"error",error:`OpenAI-compat API error (${p.status}): ${i.slice(0,500)}`};return}let m=p.body?.getReader();if(!m){yield{type:"error",error:"No response body on OpenAI-compat stream"};return}let c=new TextDecoder,g="",k="",d,h=0,w=[],A={},b={};try{for(;;){let{done:i,value:y}=await m.read();if(i)break;g+=c.decode(y,{stream:!0});let f=g.split(`
|
|
48
|
+
`);g=f.pop()||"";for(let R of f){if(!R.startsWith("data: "))continue;let T=R.slice(6).trim();if(T==="[DONE]")continue;let x;try{x=JSON.parse(T)}catch{continue}let a=x.choices?.[0]?.delta;if(typeof a?.reasoning_content=="string"&&a.reasoning_content&&(yield{type:"thinking_delta",text:a.reasoning_content}),typeof a?.content=="string"&&a.content&&(k+=a.content,yield{type:"text_delta",text:a.content}),Array.isArray(a?.tool_calls))for(let _ of a.tool_calls){let O=_.index;if(O==null)continue;let v=A[O]||={id:"",name:"",argumentsRaw:""};_.id&&(v.id=_.id),_.function?.name&&(v.name=_.function.name),_.function?.arguments&&(v.argumentsRaw+=_.function.arguments),v.id&&v.name&&!b[O]&&(b[O]=!0,yield{type:"tool_use_start",name:v.name,id:v.id}),b[O]&&_.function?.arguments&&(yield{type:"tool_use_delta",json:_.function.arguments})}x.usage&&(h=(x.usage.prompt_tokens||0)+(x.usage.completion_tokens||0))}}}catch(i){yield{type:"error",error:`OpenAI-compat stream read failed: ${i.message}`};return}for(let i of Object.values(A))if(i.name){yield{type:"tool_use_end",name:i.name};try{let y=i.argumentsRaw?JSON.parse(i.argumentsRaw):{};i.name==="create_files"&&Array.isArray(y.files)?(w.push(...y.files),typeof y.summary=="string"&&y.summary.trim()&&(k+=(k?`
|
|
49
|
+
`:"")+y.summary)):i.name==="ask_user"&&typeof y.question=="string"&&(d=y.question,Array.isArray(y.options)&&y.options.length&&(d+=`
|
|
50
|
+
Options: ${y.options.join(", ")}`))}catch{}}yield{type:"done",result:{content:k,files:w,followUp:d,tokensUsed:h}}}async callApi(e,t){let r=await fetch(`${this.baseUrl}/chat/completions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify(this.maybeDeepseekExtras(e)),signal:t});if(!r.ok){let n=await r.text().catch(()=>"");throw new Error(`OpenAI-compatible API error (${r.status}) ${this.baseUrl}: ${n.slice(0,500)}`)}return await r.json()}maybeDeepseekExtras(e){return this.thinkingEnabled===null?e:this.thinkingEnabled===!1?{...e,enable_thinking:!1}:e}parseHighLevelResponse(e){let r=e.choices?.[0]?.message,n=[],o=r?.content||"",l;for(let m of r?.tool_calls||[]){let c={};try{c=JSON.parse(m.function.arguments||"{}")}catch{}m.function.name==="create_files"&&Array.isArray(c.files)?(n.push(...c.files),typeof c.summary=="string"&&c.summary.trim()&&(o+=(o?`
|
|
51
51
|
`:"")+c.summary)):m.function.name==="ask_user"&&typeof c.question=="string"&&(l=c.question,Array.isArray(c.options)&&c.options.length&&(l+=`
|
|
52
|
-
Options: ${c.options.join(", ")}`))}let p=e.usage;return{content:o,files:n,followUp:l,tokensUsed:p?(p.prompt_tokens||0)+(p.completion_tokens||0):void 0}}parseRawResponse(e){let t=e.choices?.[0],r=t?.message,n=[];r?.reasoning_content&&n.push({type:"reasoning",text:r.reasoning_content}),r?.content&&n.push({type:"text",text:r.content});for(let p of r?.tool_calls||[]){let m={};try{m=p.function.arguments?JSON.parse(p.function.arguments):{}}catch{}n.push({type:"tool_use",id:p.id,name:p.function.name,input:m})}let o="end_turn";switch(t?.finish_reason){case"tool_calls":case"function_call":o="tool_use";break;case"length":o="max_tokens";break;case"stop":case null:case void 0:default:o="end_turn"}let l=e.usage;return{content:n,stop_reason:o,usage:{input_tokens:l?.prompt_tokens||0,output_tokens:l?.completion_tokens||0}}}legacyToolsAsOpenAI(){return C().map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:e.input_schema}}))}}});import{readFileSync as
|
|
53
|
-
`)}return""}function M(
|
|
54
|
-
//# sourceMappingURL=chunk-
|
|
52
|
+
Options: ${c.options.join(", ")}`))}let p=e.usage;return{content:o,files:n,followUp:l,tokensUsed:p?(p.prompt_tokens||0)+(p.completion_tokens||0):void 0}}parseRawResponse(e){let t=e.choices?.[0],r=t?.message,n=[];r?.reasoning_content&&n.push({type:"reasoning",text:r.reasoning_content}),r?.content&&n.push({type:"text",text:r.content});for(let p of r?.tool_calls||[]){let m={};try{m=p.function.arguments?JSON.parse(p.function.arguments):{}}catch{}n.push({type:"tool_use",id:p.id,name:p.function.name,input:m})}let o="end_turn";switch(t?.finish_reason){case"tool_calls":case"function_call":o="tool_use";break;case"length":o="max_tokens";break;case"stop":case null:case void 0:default:o="end_turn"}let l=e.usage;return{content:n,stop_reason:o,usage:{input_tokens:l?.prompt_tokens||0,output_tokens:l?.completion_tokens||0}}}legacyToolsAsOpenAI(){return C().map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:e.input_schema}}))}}});import{readFileSync as je}from"fs";function Ne(){let s=process.env.AGENTX_DEMO_SCRIPT;if(!s)return{steps:[],fallback:ue};try{let e=JSON.parse(je(s,"utf-8"));return{steps:Array.isArray(e.steps)?e.steps:[],fallback:e.fallback||ue}}catch(e){return{steps:[],fallback:{reply:`Demo script unreadable (${e.message}) \u2014 check AGENTX_DEMO_SCRIPT.`}}}}function U(s){for(let e=s.length-1;e>=0;e--){if(s[e].role!=="user")continue;let t=s[e].content;if(typeof t=="string")return t;if(Array.isArray(t))return t.map(r=>r?.type==="text"?r.text:r?.type==="tool_result"?r.content:"").filter(Boolean).join(`
|
|
53
|
+
`)}return""}function M(s,e){return new Promise((t,r)=>{if(e?.aborted)return r(new Error("aborted"));let n=setTimeout(t,s);e?.addEventListener("abort",()=>{clearTimeout(n),r(new Error("aborted"))},{once:!0})})}function Q(s){return s.match(/\S+\s*/g)||[s]}var ue,F,Z,he=N(()=>{"use strict";ue={reply:"This is demo mode \u2014 I answer from a script, not a live model. Run `agentx setup` to connect a real provider."};F=s=>Math.max(1,Math.round(s.length/4)),Z=class{name="demo";script;constructor(){this.script=Ne()}pick(e){let t,r=-1;for(let o of this.script.steps)try{let l=new RegExp(o.match,"ig"),p,m=-1;for(;(p=l.exec(e))!==null;)m=p.index,p.index===l.lastIndex&&l.lastIndex++;m>r&&(r=m,t=o)}catch{}if(t)return{reply:t.reply,thinking:t.thinking,delayMs:t.delayMs??700,chunkMs:t.chunkMs??35};let n=this.script.fallback||ue;return{reply:n.reply,thinking:n.thinking,delayMs:n.delayMs??700,chunkMs:n.chunkMs??35}}async generate(e,t){let r=this.pick(U(e));return await M(r.delayMs,t?.abortSignal),{content:r.reply,files:[],tokensUsed:F(r.reply)}}async*stream(e,t){let r=this.pick(U(e));if(await M(r.delayMs,t?.abortSignal),r.thinking)for(let n of Q(r.thinking))yield{type:"thinking_delta",text:n},await M(r.chunkMs,t?.abortSignal);for(let n of Q(r.reply))yield{type:"text_delta",text:n},await M(r.chunkMs,t?.abortSignal);yield{type:"done",result:{content:r.reply,files:[],tokensUsed:F(r.reply)}}}async generateRaw(e,t,r,n){let o=this.pick(U(e));return await M(o.delayMs,n?.abortSignal),{content:[{type:"text",text:o.reply}],stop_reason:"end_turn",usage:{input_tokens:F(U(e)),output_tokens:F(o.reply)}}}async*generateRawStream(e,t,r,n){let o=this.pick(U(e));if(await M(o.delayMs,n?.abortSignal),o.thinking)for(let l of Q(o.thinking))yield{type:"thinking_delta",text:l},await M(o.chunkMs,n?.abortSignal);for(let l of Q(o.reply))yield{type:"text_delta",text:l},await M(o.chunkMs,n?.abortSignal);yield{type:"raw_result",result:{content:[{type:"text",text:o.reply}],stop_reason:"end_turn",usage:{input_tokens:F(U(e)),output_tokens:F(o.reply)}}}}}});function ut(s="claude-code",e,t={}){let r=s;if(s==="claude-code"&&!e){let n=S();n&&(r=n.provider)}switch(r){case"claude-code":return new J;case"claude":return new q(e);case"openai":return new D(e,void 0,{thinking:t.thinking});case"deepseek":return new D(e||process.env[ke.envKey]||process.env.OPENAI_API_KEY,ke.baseUrl,{thinking:t.thinking});case"demo":return new Z;case"ollama":throw new Error("Ollama provider coming soon. Workaround: set provider to 'openai' with OPENAI_BASE_URL=http://localhost:11434/v1 (Ollama exposes an OpenAI-compatible endpoint). Or contribute at github.com/anis-marrouchi/agentx");default:throw new Error(`Unknown provider: ${r}. Supported: claude-code, claude, openai, deepseek`)}}var ke,Ge=N(()=>{se();ae();pe();he();H();se();ae();pe();ke={baseUrl:"https://api.deepseek.com/v1",envKey:"DEEPSEEK_API_KEY"}});export{S as a,xe as b,L as c,Pe as d,Ke as e,H as f,Se as g,C as h,Be as i,He as j,W as k,q as l,J as m,D as n,ut as o,Ge as p};
|
|
54
|
+
//# sourceMappingURL=chunk-2PJKGZWP.js.map
|