agentix-cli 0.25.0 → 0.27.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/README.md +2 -0
- package/dist/{App-6Y7B3YQH.js → App-U52IPUK2.js} +2 -2
- package/dist/{ChatApp-KIEUJ2DS.js → ChatApp-XP4OMHPL.js} +2 -2
- package/dist/agent-V2CA4TXD.js +2 -0
- package/dist/article-fields-L4D2BOGY.js +2 -0
- package/dist/article-quality-44ONVGLN.js +3 -0
- package/dist/article-quality-44ONVGLN.js.map +1 -0
- package/dist/{audit-JU3HWISB.js → audit-4245CX6P.js} +2 -2
- package/dist/backfill-MTD2B62I.js +6 -0
- package/dist/backfill-MTD2B62I.js.map +1 -0
- package/dist/{board-dashboard-CQ5F4GPD.js → board-dashboard-TTMAYRLG.js} +2445 -519
- package/dist/board-dashboard-TTMAYRLG.js.map +1 -0
- package/dist/{builtin-FRKAQMFS.js → builtin-B67DMJ3M.js} +2 -2
- package/dist/calibration-ILS5OI44.js +2 -0
- package/dist/chunk-2T5W3ETS.js +5 -0
- package/dist/{chunk-FDMWOPEL.js.map → chunk-2T5W3ETS.js.map} +1 -1
- package/dist/chunk-3SCPRYJB.js +5 -0
- package/dist/chunk-3SCPRYJB.js.map +1 -0
- package/dist/chunk-4BR7D2OU.js +36 -0
- package/dist/chunk-4BR7D2OU.js.map +1 -0
- package/dist/{chunk-P4VWIVKN.js → chunk-52ZPELD2.js} +403 -29
- package/dist/chunk-52ZPELD2.js.map +1 -0
- package/dist/{chunk-5U35WAZF.js → chunk-77OV7346.js} +6 -6
- package/dist/chunk-77OV7346.js.map +1 -0
- package/dist/chunk-AJ5RMU7X.js +2 -0
- package/dist/chunk-AJ5RMU7X.js.map +1 -0
- package/dist/chunk-AJONZWLT.js +2 -0
- package/dist/chunk-AJONZWLT.js.map +1 -0
- package/dist/chunk-AX2PWSRT.js +114 -0
- package/dist/chunk-AX2PWSRT.js.map +1 -0
- package/dist/chunk-BH3GTCZ6.js +2 -0
- package/dist/chunk-BH3GTCZ6.js.map +1 -0
- package/dist/chunk-BPIRO4YD.js +126 -0
- package/dist/chunk-BPIRO4YD.js.map +1 -0
- package/dist/chunk-CJQQIRPD.js +13 -0
- package/dist/chunk-CJQQIRPD.js.map +1 -0
- package/dist/chunk-DCDQZR7I.js +24 -0
- package/dist/chunk-DCDQZR7I.js.map +1 -0
- package/dist/chunk-EVWEG3VD.js +3 -0
- package/dist/chunk-EVWEG3VD.js.map +1 -0
- package/dist/chunk-F4HZTZHW.js +2 -0
- package/dist/chunk-F4HZTZHW.js.map +1 -0
- package/dist/chunk-F6CNF7V3.js +25 -0
- package/dist/chunk-F6CNF7V3.js.map +1 -0
- package/dist/chunk-FIEJDZVC.js +121 -0
- package/dist/chunk-FIEJDZVC.js.map +1 -0
- package/dist/chunk-FIOB3MEX.js +2 -0
- package/dist/{chunk-H5D7ATXS.js → chunk-FKBGJYWQ.js} +5 -5
- package/dist/chunk-FKBGJYWQ.js.map +1 -0
- package/dist/chunk-GDWJUGB5.js +9 -0
- package/dist/chunk-GDWJUGB5.js.map +1 -0
- package/dist/{chunk-TRJTTBE2.js → chunk-IB3F7VBE.js} +7 -7
- package/dist/{chunk-TRJTTBE2.js.map → chunk-IB3F7VBE.js.map} +1 -1
- package/dist/chunk-IBUSGCLQ.js +109 -0
- package/dist/chunk-IBUSGCLQ.js.map +1 -0
- package/dist/{chunk-LDHPMJ7M.js → chunk-IWMW5432.js} +3 -3
- package/dist/chunk-IWMW5432.js.map +1 -0
- package/dist/chunk-K33GIBSE.js +2 -0
- package/dist/chunk-K33GIBSE.js.map +1 -0
- package/dist/chunk-L2IZPR6P.js +45 -0
- package/dist/chunk-L2IZPR6P.js.map +1 -0
- package/dist/chunk-L2WSPY6S.js +2 -0
- package/dist/chunk-L2WSPY6S.js.map +1 -0
- package/dist/chunk-LCIREYTD.js +54 -0
- package/dist/chunk-LCIREYTD.js.map +1 -0
- package/dist/chunk-LNRB5MCU.js +530 -0
- package/dist/chunk-LNRB5MCU.js.map +1 -0
- package/dist/chunk-OPHIXXGI.js +157 -0
- package/dist/chunk-OPHIXXGI.js.map +1 -0
- package/dist/{chunk-JTJIPNXY.js → chunk-PNWNVOEZ.js} +1 -1
- package/dist/chunk-PNWNVOEZ.js.map +1 -0
- package/dist/{chunk-LNXCJWOU.js → chunk-UFAGYX73.js} +45 -47
- package/dist/chunk-UFAGYX73.js.map +1 -0
- package/dist/{chunk-DJEZ2HVU.js → chunk-VDMYBPYB.js} +1 -1
- package/dist/chunk-VDMYBPYB.js.map +1 -0
- package/dist/chunk-VTE7L6LO.js +5 -0
- package/dist/{chunk-G57RZCXM.js.map → chunk-VTE7L6LO.js.map} +1 -1
- package/dist/chunk-W5C2GDNC.js +32 -0
- package/dist/{chunk-JP5IEXR7.js.map → chunk-W5C2GDNC.js.map} +1 -1
- package/dist/chunk-WPMX3VGI.js +3 -0
- package/dist/chunk-WPMX3VGI.js.map +1 -0
- package/dist/chunk-WZ72HX5C.js +1182 -0
- package/dist/chunk-WZ72HX5C.js.map +1 -0
- package/dist/chunk-ZTEU5JVQ.js +2 -0
- package/dist/chunk-ZTEU5JVQ.js.map +1 -0
- package/dist/{chunk-2WVX3LEC.js → chunk-ZVP6GB4G.js} +1 -1
- package/dist/chunk-ZVP6GB4G.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/client-PX25MD47.js +2 -0
- package/dist/{compaction-NWEMOSHA.js → compaction-FD4R23HZ.js} +4 -4
- package/dist/config-HL5F36V4.js +2 -0
- package/dist/config-mutator-HBX53OMJ.js +2 -0
- package/dist/{conflict-detector-D7VIYPDI.js → conflict-detector-ZPOT3M2C.js} +2 -2
- package/dist/conflict-detector-ZPOT3M2C.js.map +1 -0
- package/dist/context-planner-AQHJMVY2.js +17 -0
- package/dist/context-planner-AQHJMVY2.js.map +1 -0
- package/dist/debug-3MEUO2P2.js +2 -0
- package/dist/{discover-XJXQXXIO.js → discover-D4VVRNAI.js} +2 -2
- package/dist/discover-D4VVRNAI.js.map +1 -0
- package/dist/doctor-PBAH6XL3.js +2 -0
- package/dist/editor-chat-OB7IQOB5.js +137 -0
- package/dist/editor-chat-OB7IQOB5.js.map +1 -0
- package/dist/entry-triage-LK34TSQD.js +2 -0
- package/dist/entry-triage-LK34TSQD.js.map +1 -0
- package/dist/facts-YVEJOM7O.js +22 -0
- package/dist/facts-YVEJOM7O.js.map +1 -0
- package/dist/heal-FVLBHYP7.js +2 -0
- package/dist/index.d.ts +1073 -65
- package/dist/index.js +13 -13
- package/dist/index.js.map +1 -1
- package/dist/{ingest-whatsapp-LZE62INA.js → ingest-whatsapp-NS4OWDOU.js} +2 -2
- package/dist/loader-4ZGTK7LD.js +2 -0
- package/dist/loader-BOKE5M5S.js +2 -0
- package/dist/memory-extract-F5ZHWY5E.js +2 -0
- package/dist/{migrate-v2-QO7SLKIM.js → migrate-v2-V4WN2VVM.js} +2 -2
- package/dist/ntfy-X7EPB3TG.js +4 -0
- package/dist/ntfy-X7EPB3TG.js.map +1 -0
- package/dist/processes-WU23U2OJ.js +2 -0
- package/dist/program-YGXVCV2Y.js +2 -0
- package/dist/{projects-api-KRME2YKZ.js → projects-api-QE6L65SK.js} +2 -2
- package/dist/{projects-mutate-3NHVG437.js → projects-mutate-MY7JTLSZ.js} +2 -2
- package/dist/providers-KO2DODIO.js +2 -0
- package/dist/query-ZKTFJMNE.js +2 -0
- package/dist/questions-4B4KSPXG.js +3 -0
- package/dist/questions-4B4KSPXG.js.map +1 -0
- package/dist/recipes-7S4MC5OJ.js +2 -0
- package/dist/registry-PSZDPFZK.js +2 -0
- package/dist/review-candidates-AEUXRQQC.js +4 -0
- package/dist/review-candidates-AEUXRQQC.js.map +1 -0
- package/dist/review-store-B4YE3EFK.js +4 -0
- package/dist/review-store-B4YE3EFK.js.map +1 -0
- package/dist/{rotation-memo-B3EXXSEH.js → rotation-memo-7T75BLEX.js} +2 -2
- package/dist/routing-4PV66BK6.js +2 -0
- package/dist/routing-4PV66BK6.js.map +1 -0
- package/dist/runner-YRBVNYTY.js +2 -0
- package/dist/scheduler-GZZAN6ZG.js +2 -0
- package/dist/seat-VZ7AVO27.js +2 -0
- package/dist/select-F5I5PO2O.js +2 -0
- package/dist/select-F5I5PO2O.js.map +1 -0
- package/dist/store-MCOA6N4F.js +2 -0
- package/dist/{subagent-WV7QKQ3L.js → subagent-2SJHSSJS.js} +2 -2
- package/dist/{surface-usage-PRL6Z4U3.js → surface-usage-NS74AXSE.js} +2 -2
- package/dist/timers-PCB4ZIBD.js +2 -0
- package/dist/triage-backtest-JNO7RKX7.js +2 -0
- package/dist/triage-backtest-JNO7RKX7.js.map +1 -0
- package/dist/types-H5ENIUIT.js +2 -0
- package/dist/types-OIFU3KSQ.js +2 -0
- package/dist/web/workflow-editor.global.js +1542 -0
- package/dist/web/workflow-editor.global.js.map +1 -0
- package/dist/{whatsapp-state-XMTCSRXU.js → whatsapp-state-6D6FHHD2.js} +2 -2
- package/dist/wiki-N5SMP3DT.js +2 -0
- package/dist/wiki-N5SMP3DT.js.map +1 -0
- package/dist/workflows/templates/branching.yaml +1 -1
- package/dist/{workspace-setup-TBQAHYHJ.js → workspace-setup-B3F3TUDE.js} +2 -2
- package/dist/workspace-setup-B3F3TUDE.js.map +1 -0
- package/package.json +1 -1
- package/dist/agent-QGZIAZMY.js +0 -2
- package/dist/architect-SEPWMWS4.js +0 -2
- package/dist/board-dashboard-CQ5F4GPD.js.map +0 -1
- package/dist/chunk-2WVX3LEC.js.map +0 -1
- package/dist/chunk-3WQFCIB6.js +0 -24
- package/dist/chunk-3WQFCIB6.js.map +0 -1
- package/dist/chunk-4YCH6IZV.js +0 -2
- package/dist/chunk-53GCFZPR.js +0 -116
- package/dist/chunk-53GCFZPR.js.map +0 -1
- package/dist/chunk-53NRX2NA.js +0 -2
- package/dist/chunk-53NRX2NA.js.map +0 -1
- package/dist/chunk-5U35WAZF.js.map +0 -1
- package/dist/chunk-BFXONUUN.js +0 -108
- package/dist/chunk-BFXONUUN.js.map +0 -1
- package/dist/chunk-BFZUG66X.js +0 -45
- package/dist/chunk-BFZUG66X.js.map +0 -1
- package/dist/chunk-DJEZ2HVU.js.map +0 -1
- package/dist/chunk-FDMWOPEL.js +0 -5
- package/dist/chunk-FDWOECJY.js +0 -54
- package/dist/chunk-FDWOECJY.js.map +0 -1
- package/dist/chunk-G57RZCXM.js +0 -5
- package/dist/chunk-H5D7ATXS.js.map +0 -1
- package/dist/chunk-HA3XI7Z2.js +0 -155
- package/dist/chunk-HA3XI7Z2.js.map +0 -1
- package/dist/chunk-HR4JSRZS.js +0 -3
- package/dist/chunk-HR4JSRZS.js.map +0 -1
- package/dist/chunk-ISEBLHWX.js +0 -118
- package/dist/chunk-ISEBLHWX.js.map +0 -1
- package/dist/chunk-JP5IEXR7.js +0 -32
- package/dist/chunk-JTJIPNXY.js.map +0 -1
- package/dist/chunk-JXWAGMI2.js +0 -13
- package/dist/chunk-JXWAGMI2.js.map +0 -1
- package/dist/chunk-KUCCW2VG.js +0 -431
- package/dist/chunk-KUCCW2VG.js.map +0 -1
- package/dist/chunk-LDHPMJ7M.js.map +0 -1
- package/dist/chunk-LNXCJWOU.js.map +0 -1
- package/dist/chunk-NGSIRE4X.js +0 -126
- package/dist/chunk-NGSIRE4X.js.map +0 -1
- package/dist/chunk-P4VWIVKN.js.map +0 -1
- package/dist/chunk-Q6YO7LYE.js +0 -47
- package/dist/chunk-Q6YO7LYE.js.map +0 -1
- package/dist/chunk-SR3X25TN.js +0 -3
- package/dist/chunk-SR3X25TN.js.map +0 -1
- package/dist/chunk-TMKLHTCG.js +0 -971
- package/dist/chunk-TMKLHTCG.js.map +0 -1
- package/dist/chunk-VJUTQAPJ.js +0 -2
- package/dist/chunk-VJUTQAPJ.js.map +0 -1
- package/dist/client-GGVVLOOF.js +0 -2
- package/dist/config-7FSZFRTQ.js +0 -2
- package/dist/config-mutator-POCOYYJ4.js +0 -2
- package/dist/conflict-detector-D7VIYPDI.js.map +0 -1
- package/dist/context-planner-45GEWKGL.js +0 -17
- package/dist/context-planner-45GEWKGL.js.map +0 -1
- package/dist/debug-N3B5NVJU.js +0 -2
- package/dist/discover-XJXQXXIO.js.map +0 -1
- package/dist/doctor-DHLBEKA4.js +0 -2
- package/dist/heal-HZ3EQD52.js +0 -2
- package/dist/loader-5CA3O5GM.js +0 -2
- package/dist/loader-6IHUCPVO.js +0 -2
- package/dist/memory-extract-AENFVVO5.js +0 -2
- package/dist/processes-UIC4XXA6.js +0 -2
- package/dist/program-WVAVJFND.js +0 -2
- package/dist/providers-L27BJ5A6.js +0 -2
- package/dist/query-HZYYRCLU.js +0 -2
- package/dist/recipes-EPLE2SNT.js +0 -2
- package/dist/registry-T36ZIAWV.js +0 -2
- package/dist/runner-BFYDWPUO.js +0 -2
- package/dist/scheduler-GH7TIKYS.js +0 -2
- package/dist/store-I3HEWVLQ.js +0 -2
- package/dist/timers-5LPZN55J.js +0 -2
- package/dist/types-VECTMYTO.js +0 -2
- package/dist/types-Y6ZCZ52Z.js +0 -2
- package/dist/wiki-M6YNRFC4.js +0 -2
- /package/dist/{App-6Y7B3YQH.js.map → App-U52IPUK2.js.map} +0 -0
- /package/dist/{ChatApp-KIEUJ2DS.js.map → ChatApp-XP4OMHPL.js.map} +0 -0
- /package/dist/{agent-QGZIAZMY.js.map → agent-V2CA4TXD.js.map} +0 -0
- /package/dist/{architect-SEPWMWS4.js.map → article-fields-L4D2BOGY.js.map} +0 -0
- /package/dist/{audit-JU3HWISB.js.map → audit-4245CX6P.js.map} +0 -0
- /package/dist/{builtin-FRKAQMFS.js.map → builtin-B67DMJ3M.js.map} +0 -0
- /package/dist/{chunk-4YCH6IZV.js.map → calibration-ILS5OI44.js.map} +0 -0
- /package/dist/{client-GGVVLOOF.js.map → chunk-FIOB3MEX.js.map} +0 -0
- /package/dist/{config-7FSZFRTQ.js.map → client-PX25MD47.js.map} +0 -0
- /package/dist/{compaction-NWEMOSHA.js.map → compaction-FD4R23HZ.js.map} +0 -0
- /package/dist/{config-mutator-POCOYYJ4.js.map → config-HL5F36V4.js.map} +0 -0
- /package/dist/{debug-N3B5NVJU.js.map → config-mutator-HBX53OMJ.js.map} +0 -0
- /package/dist/{doctor-DHLBEKA4.js.map → debug-3MEUO2P2.js.map} +0 -0
- /package/dist/{heal-HZ3EQD52.js.map → doctor-PBAH6XL3.js.map} +0 -0
- /package/dist/{loader-5CA3O5GM.js.map → heal-FVLBHYP7.js.map} +0 -0
- /package/dist/{ingest-whatsapp-LZE62INA.js.map → ingest-whatsapp-NS4OWDOU.js.map} +0 -0
- /package/dist/{loader-6IHUCPVO.js.map → loader-4ZGTK7LD.js.map} +0 -0
- /package/dist/{memory-extract-AENFVVO5.js.map → loader-BOKE5M5S.js.map} +0 -0
- /package/dist/{processes-UIC4XXA6.js.map → memory-extract-F5ZHWY5E.js.map} +0 -0
- /package/dist/{migrate-v2-QO7SLKIM.js.map → migrate-v2-V4WN2VVM.js.map} +0 -0
- /package/dist/{program-WVAVJFND.js.map → processes-WU23U2OJ.js.map} +0 -0
- /package/dist/{providers-L27BJ5A6.js.map → program-YGXVCV2Y.js.map} +0 -0
- /package/dist/{projects-api-KRME2YKZ.js.map → projects-api-QE6L65SK.js.map} +0 -0
- /package/dist/{projects-mutate-3NHVG437.js.map → projects-mutate-MY7JTLSZ.js.map} +0 -0
- /package/dist/{query-HZYYRCLU.js.map → providers-KO2DODIO.js.map} +0 -0
- /package/dist/{recipes-EPLE2SNT.js.map → query-ZKTFJMNE.js.map} +0 -0
- /package/dist/{registry-T36ZIAWV.js.map → recipes-7S4MC5OJ.js.map} +0 -0
- /package/dist/{runner-BFYDWPUO.js.map → registry-PSZDPFZK.js.map} +0 -0
- /package/dist/{rotation-memo-B3EXXSEH.js.map → rotation-memo-7T75BLEX.js.map} +0 -0
- /package/dist/{scheduler-GH7TIKYS.js.map → runner-YRBVNYTY.js.map} +0 -0
- /package/dist/{store-I3HEWVLQ.js.map → scheduler-GZZAN6ZG.js.map} +0 -0
- /package/dist/{surface-usage-PRL6Z4U3.js.map → seat-VZ7AVO27.js.map} +0 -0
- /package/dist/{timers-5LPZN55J.js.map → store-MCOA6N4F.js.map} +0 -0
- /package/dist/{subagent-WV7QKQ3L.js.map → subagent-2SJHSSJS.js.map} +0 -0
- /package/dist/{types-VECTMYTO.js.map → surface-usage-NS74AXSE.js.map} +0 -0
- /package/dist/{types-Y6ZCZ52Z.js.map → timers-PCB4ZIBD.js.map} +0 -0
- /package/dist/{wiki-M6YNRFC4.js.map → types-H5ENIUIT.js.map} +0 -0
- /package/dist/{workspace-setup-TBQAHYHJ.js.map → types-OIFU3KSQ.js.map} +0 -0
- /package/dist/{whatsapp-state-XMTCSRXU.js.map → whatsapp-state-6D6FHHD2.js.map} +0 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{b as e}from"./chunk-FIOB3MEX.js";import n from"chalk";var c,l=e(()=>{"use strict";c={error(...o){console.log(n.red(...o))},warn(...o){console.log(n.yellow(...o))},info(...o){console.log(n.cyan(...o))},success(...o){console.log(n.green(...o))},break(){console.log("")}}});export{c as a,l as b};
|
|
2
|
+
//# sourceMappingURL=chunk-L2WSPY6S.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/logger.ts"],"sourcesContent":["import chalk from \"chalk\"\n\nexport const logger = {\n error(...args: unknown[]) {\n console.log(chalk.red(...args))\n },\n warn(...args: unknown[]) {\n console.log(chalk.yellow(...args))\n },\n info(...args: unknown[]) {\n console.log(chalk.cyan(...args))\n },\n success(...args: unknown[]) {\n console.log(chalk.green(...args))\n },\n break() {\n console.log(\"\")\n },\n}\n"],"mappings":"wCAAA,OAAOA,MAAW,QAAlB,IAEaC,EAFbC,EAAAC,EAAA,kBAEaF,EAAS,CACpB,SAASG,EAAiB,CACxB,QAAQ,IAAIJ,EAAM,IAAI,GAAGI,CAAI,CAAC,CAChC,EACA,QAAQA,EAAiB,CACvB,QAAQ,IAAIJ,EAAM,OAAO,GAAGI,CAAI,CAAC,CACnC,EACA,QAAQA,EAAiB,CACvB,QAAQ,IAAIJ,EAAM,KAAK,GAAGI,CAAI,CAAC,CACjC,EACA,WAAWA,EAAiB,CAC1B,QAAQ,IAAIJ,EAAM,MAAM,GAAGI,CAAI,CAAC,CAClC,EACA,OAAQ,CACN,QAAQ,IAAI,EAAE,CAChB,CACF","names":["chalk","logger","init_logger","__esmMin","args"]}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import{a as G,b as _e}from"./chunk-L2WSPY6S.js";import{b as N}from"./chunk-FIOB3MEX.js";import{existsSync as oe,readFileSync as de,writeFileSync as ke,mkdirSync as Ae}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 a=JSON.parse(de(ne,"utf8"));return a.provider&&a.authType&&a.token&&a.model?a:null}catch{return null}}function we(a){oe(te)||Ae(te,{recursive:!0}),ke(ne,JSON.stringify(a,null,2),"utf8")}function L(a){if(a?.trim()){let p=a.startsWith("sk-ant-oat")?"oauth":"api-key";return{token:a.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=xe(p);if(m)return{token:m,authType:"oauth"}}return null}function xe(a){if(!oe(a))return"";try{let e=JSON.parse(de(a,"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 be(){let a=process.env.ANTHROPIC_API_KEY;if(a?.trim()){let r=a.slice(0,10)+"..."+a.slice(-4),{useExisting:n}=await I({type:"confirm",name:"useExisting",message:`Use existing ANTHROPIC_API_KEY (env, ${r})?`,initial:!0});if(n)return{token:a.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 ve(){G.break();let a=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(a-21-1)}\u256E`),console.log(` ${" ".repeat(a)}\u2502`),console.log(` ${e}${" ".repeat(a-e.length)}\u2502`),console.log(` ${t}${" ".repeat(a-t.length)}\u2502`),console.log(` ${" ".repeat(a)}\u2502`),console.log(` ${"\u2500".repeat(a)}\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 Re(){for(;;){let{provider:a}=await I({type:"select",name:"provider",message:"Model/auth provider",choices:[{title:"Anthropic",value:"anthropic",description:"setup-token + API key"}]});if(a===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"?be():e==="setup-token"?ve():null}}async function Oe(){let a=S(),e=re.map(r=>({title:r.label,value:r.id,description:r.hint+(a?.model===r.id?" \xB7 current":"")}));if(a?.model){let r=re.find(o=>o.id===a.model),n=r?r.label:a.model;e.unshift({title:`Keep current (${n})`,value:a.model,description:"no change"})}let{modelId:t}=await I({type:"select",name:"modelId",message:"Default model",choices:e});return t||null}async function Te(){let a=await Re();if(!a)return null;let e=await Oe();if(!e)return null;let t={provider:a.authType==="oauth"?"claude-code":"claude",authType:a.authType,token:a.token,model:e};return we(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 Ue(a){return L(a)?!0:(G.warn("No AI credentials configured."),G.break(),await Te()!==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 Pe(a){return(a?Y.filter(t=>a.includes(t.name)):Y).map(({name:t,description:r,input_schema:n})=>({name:t,description:r,input_schema:n}))}function M(){return Pe(["create_files","ask_user"])}function Le(){let a=Y.filter(t=>t.name!=="create_files"&&t.name!=="ask_user");if(a.length===0)return"";let e=["# Available Capabilities","In addition to generating files, you have the following capabilities:",""];for(let t of a)e.push(`## ${t.name}`),e.push(t.description),e.push("");return e.join(`
|
|
2
|
+
`)}var Y,qe,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"}];qe=Y.map(a=>a.name)});function X(a){return!a||a.length<Se?a:[{type:"text",text:a,cache_control:{type:"ephemeral"}}]}var V,z,Se,q,se=N(()=>{"use strict";H();W();V="claude-sonnet-4-20250514",z=8192,Se=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:M()};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:M()};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 _=new TextDecoder,d="",h=[],w="",A,b=0,s=null,y=f=>{let R=(f||"").trim();if(!R||R.includes("```"))return;let T=R.replace(/\r\n/g,`
|
|
3
|
+
`).split(`
|
|
4
|
+
`),x=T.slice(Math.max(0,T.length-20)),u=x.join(`
|
|
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
|
+
Reply with:
|
|
7
|
+
- approve
|
|
8
|
+
- revise: <what to change>
|
|
9
|
+
- cancel`;let k=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($&&(k($)||$.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+=_.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 i=JSON.parse(u);if(i.type==="content_block_start"&&i.content_block?.type==="tool_use"){if(s){yield{type:"tool_use_end",name:s.name};try{let k=JSON.parse(s.json||"{}");s.name==="create_files"&&k&&(Array.isArray(k.files)&&h.push(...k.files),typeof k.summary=="string"&&k.summary.trim()&&(w+=`
|
|
12
|
+
${k.summary}`)),s.name==="ask_user"&&k&&typeof k.question=="string"&&k.question.trim()&&(A=k.question,Array.isArray(k.options)&&k.options.length&&(A+=`
|
|
13
|
+
Options: ${k.options.join(", ")}`))}catch{}finally{s=null}}s={name:i.content_block.name,id:i.content_block.id,json:""},yield{type:"tool_use_start",name:i.content_block.name,id:i.content_block.id}}if(i.type==="content_block_delta"&&(i.delta?.type==="text_delta"&&(w+=i.delta.text,yield{type:"text_delta",text:i.delta.text}),i.delta?.type==="input_json_delta"&&(s&&(s.json+=i.delta.partial_json||""),yield{type:"tool_use_delta",json:i.delta.partial_json})),i.type==="content_block_stop"&&s){yield{type:"tool_use_end",name:s.name};try{let k=JSON.parse(s.json||"{}");s.name==="create_files"&&k&&(Array.isArray(k.files)&&h.push(...k.files),typeof k.summary=="string"&&k.summary.trim()&&(w+=`
|
|
14
|
+
${k.summary}`)),s.name==="ask_user"&&k&&typeof k.question=="string"&&k.question.trim()&&(A=k.question,Array.isArray(k.options)&&k.options.length&&(A+=`
|
|
15
|
+
Options: ${k.options.join(", ")}`))}catch{}finally{s=null}}i.type==="message_delta"&&i.usage&&(b=(i.usage.input_tokens||0)+(i.usage.output_tokens||0)),i.type}catch{}}}}finally{g.releaseLock()}if(s){yield{type:"tool_use_end",name:s.name};try{let f=JSON.parse(s.json||"{}");s.name==="create_files"&&f&&(Array.isArray(f.files)&&h.push(...f.files),typeof f.summary=="string"&&f.summary.trim()&&(w+=`
|
|
16
|
+
${f.summary}`)),s.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{}s=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 _=new TextDecoder,d="",h=[],w=null,A="end_turn",b=0,s=0;try{for(;;){let{done:y,value:f}=await g.read();if(y)break;d+=_.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 i=u.content_block;i?.type==="text"?(w=h.length,h.push({type:"text",text:""})):i?.type==="tool_use"?(w=h.length,h.push({type:"tool_use",id:i.id||"",name:i.name||"",input:{}}),h[w]._rawJson=""):w=null}if(u.type==="content_block_delta"&&w!=null){let i=h[w];u.delta?.type==="text_delta"&&i.type==="text"?(i.text+=u.delta.text,yield{type:"text_delta",text:u.delta.text}):u.delta?.type==="input_json_delta"&&i.type==="tool_use"&&(i._rawJson+=u.delta.partial_json||"")}if(u.type==="content_block_stop"&&w!=null){let i=h[w];if(i.type==="tool_use"){let k=i._rawJson||"{}";try{i.input=JSON.parse(k)}catch{i.input={}}delete i._rawJson}w=null}u.type==="message_delta"&&(u.delta?.stop_reason&&(A=u.delta.stop_reason),u.usage&&(s=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:s}}}}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
|
+
${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";var K,ie,ye,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"},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
|
+
Options:
|
|
22
|
+
1. Run \`agentx model\` to configure credentials
|
|
23
|
+
2. Set ANTHROPIC_API_KEY environment variable
|
|
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
|
+
|
|
26
|
+
`),m=["-p","--output-format","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=await fe("claude",m,{env:c,extendEnv:!1,reject:!1,timeout:3e5,stdin:"ignore"});if(g.exitCode!==0){let d=g.stderr||g.stdout||"Claude CLI failed";throw new Error(`Claude CLI error: ${d}`)}let _=g.stdout.trim();try{let d=JSON.parse(_);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(_)}async generateViaApi(e,t){let r=t?.model||K,n=t?.maxTokens||ie,o=e.find(_=>_.role==="system"),l=e.filter(_=>_.role!=="system").map(_=>({role:_.role,content:_.content})),p={model:r,max_tokens:n,messages:l,tools:M()};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 _=await c.text();throw new Error(`Anthropic API error (${c.status}): ${_}`)}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(s=>s.role==="system"),p=e.filter(s=>s.role==="user").map(s=>s.content).join(`
|
|
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"}),_="",d="",h;if(g.stderr&&g.stderr.on("data",s=>{d+=Buffer.isBuffer(s)?s.toString("utf8"):String(s)}),g.stdout){let s=new TextDecoder,y=g.stdout;for await(let f of y){let T=(typeof f=="string"?f:s.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?(_+=u.message,yield{type:"text_delta",text:u.message}):u.type==="result"&&(_=u.result||_)}catch{_+=x,yield{type:"text_delta",text:x}}}}let w=await g;if(w.exitCode!==0&&!h&&(h=(d||w.stderr||w.stdout||"Claude CLI failed").toString().trim()),h){yield{type:"error",error:`Claude CLI error: ${h}`};return}let A=this.extractFilesFromText(_),b=A.length===0?this.inferFollowUpFromText(_):void 0;yield{type:"done",result:{content:_,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:M(),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 _=new TextDecoder,d="",h="",w=0,A=[],b,s=null;try{for(;;){let{done:y,value:f}=await g.read();if(y)break;d+=_.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(s){yield{type:"tool_use_end",name:s.name};try{let i=JSON.parse(s.json||"{}");s.name==="create_files"&&i&&(Array.isArray(i.files)&&A.push(...i.files),typeof i.summary=="string"&&i.summary.trim()&&(h+=`
|
|
31
|
+
${i.summary}`)),s.name==="ask_user"&&i&&typeof i.question=="string"&&i.question.trim()&&(b=i.question,Array.isArray(i.options)&&i.options.length&&(b+=`
|
|
32
|
+
Options: ${i.options.join(", ")}`))}catch{}finally{s=null}}s={name:u.content_block.name,id:u.content_block.id,json:""},yield{type:"tool_use_start",name:s.name,id:s.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"&&(s&&(s.json+=u.delta.partial_json||""),yield{type:"tool_use_delta",json:u.delta.partial_json}),u.type==="content_block_stop"&&s){yield{type:"tool_use_end",name:s.name};try{let i=JSON.parse(s.json||"{}");s.name==="create_files"&&i&&(Array.isArray(i.files)&&A.push(...i.files),typeof i.summary=="string"&&i.summary.trim()&&(h+=`
|
|
33
|
+
${i.summary}`)),s.name==="ask_user"&&i&&typeof i.question=="string"&&i.question.trim()&&(b=i.question,Array.isArray(i.options)&&i.options.length&&(b+=`
|
|
34
|
+
Options: ${i.options.join(", ")}`))}catch{}finally{s=null}}u.type==="message_delta"&&u.usage&&(w=(u.usage.input_tokens||0)+(u.usage.output_tokens||0))}catch{}}}}finally{g.releaseLock()}if(s){yield{type:"tool_use_end",name:s.name};try{let y=JSON.parse(s.json||"{}");s.name==="create_files"&&y&&(Array.isArray(y.files)&&A.push(...y.files),typeof y.summary=="string"&&y.summary.trim()&&(h+=`
|
|
35
|
+
${y.summary}`)),s.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{}s=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
|
+
`).split(`
|
|
38
|
+
`),n=r.slice(Math.max(0,r.length-20)),o=n.join(`
|
|
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
|
+
Reply with:
|
|
41
|
+
- approve
|
|
42
|
+
- revise: <what to change>
|
|
43
|
+
- 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(_.trim()),m=-1;for(let _=n.length-1;_>=0;_--){let d=n[_].trim();if(d&&(p(d)||d.includes("?"))){m=_;break}}if(m===-1)return;let c=[];for(let _=m;_<n.length&&c.length<8;_++){let d=n[_],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
|
+
`).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
|
+
${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="",_="",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 i;try{i=JSON.parse(u)}catch{continue}let k=i.choices?.[0],O=k?.delta;if(k?.finish_reason&&(A=k.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&&(_+=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)}i.usage&&(h=i.usage.prompt_tokens||0,w=i.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 s=[];d&&s.push({type:"reasoning",text:d}),_&&s.push({type:"text",text:_});for(let f of Object.values(b)){if(!f.id||!f.name)continue;let R={};try{R=f.argumentsRaw?JSON.parse(f.argumentsRaw):{}}catch{}s.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:s,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 _=g.filter(h=>h.type==="tool_result"),d=g.filter(h=>h.type==="text").map(h=>h.text).join("");for(let h of _)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}):_.length===0&&p.push({role:"user",content:c.content})}else{let _=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};_.length>0&&(w.tool_calls=_.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(s=>({role:s.role,content:s.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(s){yield{type:"error",error:`OpenAI-compat stream init failed: ${s.message}`};return}if(!p.ok){let s=await p.text().catch(()=>"");yield{type:"error",error:`OpenAI-compat API error (${p.status}): ${s.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="",_="",d,h=0,w=[],A={},b={};try{for(;;){let{done:s,value:y}=await m.read();if(s)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 i=x.choices?.[0]?.delta;if(typeof i?.reasoning_content=="string"&&i.reasoning_content&&(yield{type:"thinking_delta",text:i.reasoning_content}),typeof i?.content=="string"&&i.content&&(_+=i.content,yield{type:"text_delta",text:i.content}),Array.isArray(i?.tool_calls))for(let k of i.tool_calls){let O=k.index;if(O==null)continue;let v=A[O]||={id:"",name:"",argumentsRaw:""};k.id&&(v.id=k.id),k.function?.name&&(v.name=k.function.name),k.function?.arguments&&(v.argumentsRaw+=k.function.arguments),v.id&&v.name&&!b[O]&&(b[O]=!0,yield{type:"tool_use_start",name:v.name,id:v.id}),b[O]&&k.function?.arguments&&(yield{type:"tool_use_delta",json:k.function.arguments})}x.usage&&(h=(x.usage.prompt_tokens||0)+(x.usage.completion_tokens||0))}}}catch(s){yield{type:"error",error:`OpenAI-compat stream read failed: ${s.message}`};return}for(let s of Object.values(A))if(s.name){yield{type:"tool_use_end",name:s.name};try{let y=s.argumentsRaw?JSON.parse(s.argumentsRaw):{};s.name==="create_files"&&Array.isArray(y.files)?(w.push(...y.files),typeof y.summary=="string"&&y.summary.trim()&&(_+=(_?`
|
|
49
|
+
`:"")+y.summary)):s.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:_,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
|
+
`:"")+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 M().map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:e.input_schema}}))}}});import{readFileSync as Ee}from"fs";function Ie(){let a=process.env.AGENTX_DEMO_SCRIPT;if(!a)return{steps:[],fallback:ue};try{let e=JSON.parse(Ee(a,"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(a){for(let e=a.length-1;e>=0;e--){if(a[e].role!=="user")continue;let t=a[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 C(a,e){return new Promise((t,r)=>{if(e?.aborted)return r(new Error("aborted"));let n=setTimeout(t,a);e?.addEventListener("abort",()=>{clearTimeout(n),r(new Error("aborted"))},{once:!0})})}function Q(a){return a.match(/\S+\s*/g)||[a]}var ue,F,Z,ge=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=a=>Math.max(1,Math.round(a.length/4)),Z=class{name="demo";script;constructor(){this.script=Ie()}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 C(r.delayMs,t?.abortSignal),{content:r.reply,files:[],tokensUsed:F(r.reply)}}async*stream(e,t){let r=this.pick(U(e));if(await C(r.delayMs,t?.abortSignal),r.thinking)for(let n of Q(r.thinking))yield{type:"thinking_delta",text:n},await C(r.chunkMs,t?.abortSignal);for(let n of Q(r.reply))yield{type:"text_delta",text:n},await C(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 C(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 C(o.delayMs,n?.abortSignal),o.thinking)for(let l of Q(o.thinking))yield{type:"thinking_delta",text:l},await C(o.chunkMs,n?.abortSignal);for(let l of Q(o.reply))yield{type:"text_delta",text:l},await C(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 it(a="claude-code",e,t={}){let r=a;if(a==="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[he.envKey]||process.env.OPENAI_API_KEY,he.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 he,Me=N(()=>{se();ae();pe();ge();H();se();ae();pe();he={baseUrl:"https://api.deepseek.com/v1",envKey:"DEEPSEEK_API_KEY"}});export{S as a,we as b,L as c,Te as d,Ue as e,H as f,Pe as g,M as h,Le as i,qe as j,W as k,q as l,J as m,D as n,it as o,Me as p};
|
|
54
|
+
//# sourceMappingURL=chunk-LCIREYTD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/auth-store.ts","../src/agent/tools/definitions.ts","../src/agent/providers/claude.ts","../src/agent/providers/claude-code.ts","../src/agent/providers/openai.ts","../src/agent/providers/demo.ts","../src/agent/providers/index.ts"],"sourcesContent":["import { existsSync, readFileSync, writeFileSync, mkdirSync } from \"fs\"\nimport path from \"path\"\nimport os from \"os\"\nimport chalk from \"chalk\"\nimport prompts from \"prompts\"\nimport { logger } from \"@/utils/logger\"\n\n// --- Auth config stored at ~/.agentx/auth.json ---\n\nexport interface AuthConfig {\n provider: \"claude\" | \"claude-code\"\n authType: \"api-key\" | \"oauth\"\n token: string\n model: string\n}\n\nconst AUTH_DIR = path.join(os.homedir(), \".agentx\")\nconst AUTH_FILE = path.join(AUTH_DIR, \"auth.json\")\n\nexport function loadAuthConfig(): AuthConfig | null {\n if (!existsSync(AUTH_FILE)) return null\n try {\n const data = JSON.parse(readFileSync(AUTH_FILE, \"utf8\"))\n if (data.provider && data.authType && data.token && data.model) {\n return data as AuthConfig\n }\n return null\n } catch {\n return null\n }\n}\n\nexport function saveAuthConfig(config: AuthConfig): void {\n if (!existsSync(AUTH_DIR)) {\n mkdirSync(AUTH_DIR, { recursive: true })\n }\n writeFileSync(AUTH_FILE, JSON.stringify(config, null, 2), \"utf8\")\n}\n\n/**\n * Resolve a token for the Anthropic API.\n * Priority: (1) explicit token, (2) env vars, (3) ~/.agentx/auth.json, (4) OpenClaw auth stores\n */\nexport function resolveToken(explicitKey?: string): {\n token: string\n authType: \"api-key\" | \"oauth\"\n} | null {\n // 1. Explicit CLI flag\n if (explicitKey?.trim()) {\n const type = explicitKey.startsWith(\"sk-ant-oat\") ? \"oauth\" : \"api-key\"\n return { token: explicitKey.trim(), authType: type }\n }\n\n // 2. Environment variables\n const envOAuth = process.env.ANTHROPIC_OAUTH_TOKEN\n if (envOAuth?.trim()) {\n return { token: envOAuth.trim(), authType: \"oauth\" }\n }\n\n // Claude Code's native env var (sk-ant-oat01-...). Same OAuth token format\n // as ANTHROPIC_OAUTH_TOKEN but Claude Code sets it under its own name, so\n // without this fallback the SDK providers fail to resolve even though the\n // `claude` CLI in the same shell works fine. Enables the context planner\n // to use the fast SDK path instead of cold-spawning a subprocess.\n const envClaudeCodeOAuth = process.env.CLAUDE_CODE_OAUTH_TOKEN\n if (envClaudeCodeOAuth?.trim()) {\n return { token: envClaudeCodeOAuth.trim(), authType: \"oauth\" }\n }\n\n const envApiKey = process.env.ANTHROPIC_API_KEY\n if (envApiKey?.trim()) {\n return { token: envApiKey.trim(), authType: \"api-key\" }\n }\n\n // 3. Stored config\n const stored = loadAuthConfig()\n if (stored) {\n return { token: stored.token, authType: stored.authType }\n }\n\n // 4. OpenClaw auth-profiles store (legacy fallback)\n const homeDir = os.homedir()\n const storePaths = [\n path.join(homeDir, \".openclaw\", \"agents\", \"main\", \"agent\", \"auth-profiles.json\"),\n path.join(homeDir, \".openclaw\", \"auth-profiles.json\"),\n path.join(homeDir, \".openclaw\", \"credentials\", \"oauth.json\"),\n path.join(homeDir, \".claude\", \"oauth.json\"),\n path.join(homeDir, \".config\", \"claude\", \"oauth.json\"),\n path.join(homeDir, \".config\", \"anthropic\", \"oauth.json\"),\n ]\n\n for (const p of storePaths) {\n const t = readTokenFromAuthProfiles(p)\n if (t) {\n return { token: t, authType: \"oauth\" }\n }\n }\n\n return null\n}\n\n/**\n * Read an Anthropic OAuth/token credential from an auth-profiles or oauth JSON file.\n */\nfunction readTokenFromAuthProfiles(filePath: string): string {\n if (!existsSync(filePath)) return \"\"\n\n try {\n const data = JSON.parse(readFileSync(filePath, \"utf8\"))\n\n // Modern auth-profiles format: { profiles: { \"anthropic:xxx\": { type, access/token } } }\n if (data.profiles) {\n let fallbackToken = \"\"\n for (const [id, cred] of Object.entries(data.profiles) as [string, any][]) {\n if (!id.startsWith(\"anthropic\")) continue\n if (cred.type === \"oauth\" && cred.access) {\n if (cred.expires && Date.now() > cred.expires) {\n continue\n }\n return cred.access\n }\n if (cred.type === \"token\" && cred.token) {\n fallbackToken = cred.token\n }\n }\n if (fallbackToken) return fallbackToken\n }\n\n // Legacy oauth.json format: { anthropic: { access: \"...\" } }\n if (data.anthropic?.access) return data.anthropic.access\n if (data.anthropic?.token) return data.anthropic.token\n\n return \"\"\n } catch {\n return \"\"\n }\n}\n\n// --- Model setup & credentials ---\n\nconst ANTHROPIC_MODELS = [\n { id: \"claude-sonnet-4-20250514\", label: \"anthropic/claude-sonnet-4\", hint: \"Claude Sonnet 4 · ctx 200k · recommended\" },\n { id: \"claude-opus-4-20250514\", label: \"anthropic/claude-opus-4-5\", hint: \"Claude Opus 4.5 · ctx 200k · reasoning\" },\n { id: \"claude-haiku-4-20250514\", label: \"anthropic/claude-haiku-4\", hint: \"Claude Haiku 4 · ctx 200k · fast\" },\n]\n\nasync function handleApiKey(): Promise<{ token: string; authType: \"api-key\" } | null> {\n const envKey = process.env.ANTHROPIC_API_KEY\n if (envKey?.trim()) {\n const preview = envKey.slice(0, 10) + \"...\" + envKey.slice(-4)\n const { useExisting } = await prompts({\n type: \"confirm\",\n name: \"useExisting\",\n message: `Use existing ANTHROPIC_API_KEY (env, ${preview})?`,\n initial: true,\n })\n\n if (useExisting) {\n return { token: envKey.trim(), authType: \"api-key\" }\n }\n }\n\n const stored = loadAuthConfig()\n if (stored?.authType === \"api-key\" && stored.token) {\n const preview = stored.token.slice(0, 10) + \"...\" + stored.token.slice(-4)\n const { useExisting } = await prompts({\n type: \"confirm\",\n name: \"useExisting\",\n message: `Use stored API key (${preview})?`,\n initial: true,\n })\n\n if (useExisting) {\n return { token: stored.token, authType: \"api-key\" }\n }\n }\n\n const { apiKey } = await prompts({\n type: \"password\",\n name: \"apiKey\",\n message: \"Enter Anthropic API key\",\n validate: (v: string) => {\n if (!v.startsWith(\"sk-ant-api\")) return \"API key must start with sk-ant-api\"\n if (v.length < 40) return \"API key seems too short\"\n return true\n },\n })\n\n if (!apiKey) return null\n return { token: apiKey, authType: \"api-key\" }\n}\n\nasync function handleSetupToken(): Promise<{ token: string; authType: \"oauth\" } | null> {\n logger.break()\n const boxWidth = 46\n const line1 = \"Run `claude setup-token` in your terminal.\"\n const line2 = \"Then paste the generated token below.\"\n console.log(` ${chalk.cyan(\"Anthropic setup-token\")} ${\"─\".repeat(boxWidth - \"Anthropic setup-token\".length - 1)}╮`)\n console.log(` ${\" \".repeat(boxWidth)}│`)\n console.log(` ${line1}${\" \".repeat(boxWidth - line1.length)}│`)\n console.log(` ${line2}${\" \".repeat(boxWidth - line2.length)}│`)\n console.log(` ${\" \".repeat(boxWidth)}│`)\n console.log(` ${\"─\".repeat(boxWidth)}╯`)\n logger.break()\n\n const { token } = await prompts({\n type: \"password\",\n name: \"token\",\n message: \"Paste Anthropic setup-token\",\n validate: (v: string) => {\n if (!v.trim()) return \"Token is required\"\n if (v.length < 40) return \"Token seems too short\"\n return true\n },\n })\n\n if (!token) return null\n\n const { tokenName } = await prompts({\n type: \"text\",\n name: \"tokenName\",\n message: \"Token name (blank = default)\",\n })\n\n return { token, authType: \"oauth\" }\n}\n\ntype AuthResult = { token: string; authType: \"api-key\" | \"oauth\" } | null\n\nasync function selectAuthMethod(): Promise<AuthResult> {\n while (true) {\n const { provider } = await prompts({\n type: \"select\",\n name: \"provider\",\n message: \"Model/auth provider\",\n choices: [\n { title: \"Anthropic\", value: \"anthropic\", description: \"setup-token + API key\" },\n ],\n })\n\n if (provider === undefined) return null\n\n const { method } = await prompts({\n type: \"select\",\n name: \"method\",\n message: \"Anthropic auth method\",\n choices: [\n { title: \"Anthropic token (paste setup-token)\", value: \"setup-token\", description: \"run `claude setup-token` elsewhere, then paste the token here\" },\n { title: \"Anthropic API key\", value: \"api-key\" },\n { title: chalk.dim(\"Back\"), value: \"back\" },\n ],\n })\n\n if (method === undefined) return null\n if (method === \"back\") continue\n\n if (method === \"api-key\") return handleApiKey()\n if (method === \"setup-token\") return handleSetupToken()\n\n return null\n }\n}\n\nasync function selectModel(): Promise<string | null> {\n const stored = loadAuthConfig()\n\n const choices = ANTHROPIC_MODELS.map((m) => ({\n title: m.label,\n value: m.id,\n description: m.hint + (stored?.model === m.id ? \" · current\" : \"\"),\n }))\n\n if (stored?.model) {\n const current = ANTHROPIC_MODELS.find((m) => m.id === stored.model)\n const label = current ? current.label : stored.model\n choices.unshift({\n title: `Keep current (${label})`,\n value: stored.model,\n description: \"no change\",\n })\n }\n\n const { modelId } = await prompts({\n type: \"select\",\n name: \"modelId\",\n message: \"Default model\",\n choices,\n })\n\n return modelId || null\n}\n\n/**\n * Reusable interactive setup flow. Returns the saved config, or null if the user cancelled.\n */\nexport async function runModelSetup(): Promise<AuthConfig | null> {\n const auth = await selectAuthMethod()\n if (!auth) return null\n\n const modelId = await selectModel()\n if (!modelId) return null\n\n const config: AuthConfig = {\n provider: auth.authType === \"oauth\" ? \"claude-code\" : \"claude\",\n authType: auth.authType,\n token: auth.token,\n model: modelId,\n }\n\n saveAuthConfig(config)\n\n logger.break()\n logger.success(\"Configuration saved to ~/.agentx/auth.json\")\n console.log(` Provider: ${chalk.bold(\"anthropic\")} (${config.authType})`)\n console.log(` Model: ${chalk.bold(ANTHROPIC_MODELS.find((m) => m.id === config.model)?.label || config.model)}`)\n\n return config\n}\n\n/**\n * Ensure credentials are available. If not, auto-prompt the interactive setup.\n * Returns true if credentials are ready, false if user cancelled.\n */\nexport async function ensureCredentials(explicitKey?: string): Promise<boolean> {\n const resolved = resolveToken(explicitKey)\n if (resolved) return true\n\n logger.warn(\"No AI credentials configured.\")\n logger.break()\n\n const result = await runModelSetup()\n return result !== null\n}\n","// --- Agent tool definitions in Anthropic tool_use format ---\n\nexport interface ToolDefinition {\n name: string\n description: string\n input_schema: Record<string, unknown>\n permission?: \"file-read\" | \"file-write\" | \"command\" | \"none\"\n}\n\nconst TOOL_DEFINITIONS: ToolDefinition[] = [\n {\n name: \"create_files\",\n description:\n \"Create one or more files as output. Use this when you need to generate code, documents, configs, or any file-based output.\",\n input_schema: {\n type: \"object\",\n properties: {\n files: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description:\n \"Relative file path from project root (e.g., src/components/Button.tsx)\",\n },\n content: {\n type: \"string\",\n description: \"The full content of the file\",\n },\n language: {\n type: \"string\",\n description: \"Programming language or file type\",\n },\n description: {\n type: \"string\",\n description: \"Brief description of what this file does\",\n },\n },\n required: [\"path\", \"content\"],\n },\n },\n summary: {\n type: \"string\",\n description: \"Brief summary of all generated files\",\n },\n },\n required: [\"files\"],\n },\n permission: \"file-write\",\n },\n {\n name: \"ask_user\",\n description:\n \"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.\",\n input_schema: {\n type: \"object\",\n properties: {\n question: {\n type: \"string\",\n description: \"The question to ask the user\",\n },\n options: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Optional list of choices for the user\",\n },\n },\n required: [\"question\"],\n },\n permission: \"none\",\n },\n {\n name: \"read_file\",\n description:\n \"Read the contents of a file. Use this to inspect existing code, understand patterns, check implementations, or gather context before generating code.\",\n input_schema: {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description: \"Relative file path from project root\",\n },\n max_lines: {\n type: \"number\",\n description:\n \"Maximum number of lines to read. Defaults to 500. Use for large files.\",\n },\n },\n required: [\"path\"],\n },\n permission: \"file-read\",\n },\n {\n name: \"search_files\",\n description:\n \"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.\",\n input_schema: {\n type: \"object\",\n properties: {\n pattern: {\n type: \"string\",\n description:\n \"Glob pattern to match files (e.g., 'src/**/*.ts', '*.json')\",\n },\n content_regex: {\n type: \"string\",\n description:\n \"Optional regex to search within matched files. Returns matching lines.\",\n },\n max_results: {\n type: \"number\",\n description: \"Maximum number of results to return. Default: 50.\",\n },\n },\n required: [\"pattern\"],\n },\n permission: \"none\",\n },\n {\n name: \"list_directory\",\n description:\n \"List files and directories at a given path. Use this to explore project structure.\",\n input_schema: {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description:\n \"Relative directory path from project root. Defaults to '.' (root).\",\n },\n recursive: {\n type: \"boolean\",\n description: \"List recursively. Default: false.\",\n },\n max_depth: {\n type: \"number\",\n description: \"Maximum depth for recursive listing. Default: 3.\",\n },\n },\n },\n permission: \"none\",\n },\n {\n name: \"run_command\",\n description:\n \"Execute a shell command. Use this to run build tools, test commands, linters, or inspect the environment. Commands run in the project root directory.\",\n input_schema: {\n type: \"object\",\n properties: {\n command: {\n type: \"string\",\n description: \"The shell command to execute\",\n },\n timeout: {\n type: \"number\",\n description:\n \"Timeout in milliseconds. Default: 30000 (30 seconds).\",\n },\n },\n required: [\"command\"],\n },\n permission: \"command\",\n },\n {\n name: \"edit_file\",\n description:\n \"Apply search-and-replace edits to an existing file. Use this for targeted modifications to existing code rather than rewriting entire files.\",\n input_schema: {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description: \"Relative file path from project root\",\n },\n edits: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n old_text: {\n type: \"string\",\n description: \"The exact text to find in the file\",\n },\n new_text: {\n type: \"string\",\n description: \"The replacement text\",\n },\n },\n required: [\"old_text\", \"new_text\"],\n },\n description: \"List of search/replace pairs to apply in order\",\n },\n },\n required: [\"path\", \"edits\"],\n },\n permission: \"file-write\",\n },\n {\n name: \"spawn_agent\",\n description:\n \"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.\",\n input_schema: {\n type: \"object\",\n properties: {\n agent_id: {\n type: \"string\",\n description: \"The ID of the agent to spawn (must be a registered agent)\",\n },\n prompt: {\n type: \"string\",\n description: \"The task description for the sub-agent\",\n },\n timeout_seconds: {\n type: \"number\",\n description: \"Maximum time to wait for completion in seconds. Default: 300 (5 minutes).\",\n },\n },\n required: [\"agent_id\", \"prompt\"],\n },\n permission: \"none\",\n },\n]\n\n/**\n * Get all tool definitions in Anthropic API format (for generateRaw()).\n * Optionally filter by enabled tool names.\n */\nexport function getAnthropicTools(enabledTools?: string[]): Array<{\n name: string\n description: string\n input_schema: Record<string, unknown>\n}> {\n const defs = enabledTools\n ? TOOL_DEFINITIONS.filter((t) => enabledTools.includes(t.name))\n : TOOL_DEFINITIONS\n\n return defs.map(({ name, description, input_schema }) => ({\n name,\n description,\n input_schema,\n }))\n}\n\n/**\n * Get the legacy tools (create_files + ask_user) for backward compatibility.\n */\nexport function getLegacyTools(): Array<{\n name: string\n description: string\n input_schema: Record<string, unknown>\n}> {\n return getAnthropicTools([\"create_files\", \"ask_user\"])\n}\n\n/**\n * Format tool descriptions for inclusion in a system prompt.\n * Used when the `claude` CLI binary handles its own tools —\n * we describe our additional tools as text so the binary's built-in\n * capabilities (read, write, bash) handle them natively.\n */\nexport function formatToolsForSystemPrompt(): string {\n const agenticTools = TOOL_DEFINITIONS.filter(\n (t) => t.name !== \"create_files\" && t.name !== \"ask_user\"\n )\n\n if (agenticTools.length === 0) return \"\"\n\n const lines = [\n \"# Available Capabilities\",\n \"In addition to generating files, you have the following capabilities:\",\n \"\",\n ]\n\n for (const tool of agenticTools) {\n lines.push(`## ${tool.name}`)\n lines.push(tool.description)\n lines.push(\"\")\n }\n\n return lines.join(\"\\n\")\n}\n\nexport const ALL_TOOL_NAMES = TOOL_DEFINITIONS.map((t) => t.name)\n","import type {\n AgentProvider,\n GenerationMessage,\n GenerationResult,\n GeneratedFile,\n ProviderOptions,\n StreamEvent,\n AnthropicMessage,\n RawGenerationResult,\n RawStreamEvent,\n ContentBlock,\n} from \"./types\"\nimport { resolveToken } from \"@/utils/auth-store\"\nimport { getLegacyTools } from \"../tools/definitions\"\n\n// --- Claude provider (default) using Anthropic SDK ---\n\nconst DEFAULT_MODEL = \"claude-sonnet-4-20250514\"\nconst DEFAULT_MAX_TOKENS = 8192\n// Min tokens for Anthropic prompt-cache eligibility (varies by model:\n// 1024 Haiku / 2048 Sonnet / 4096 Opus). Below threshold the API\n// silently skips caching. We wrap unconditionally — cheap when it\n// doesn't fit, big win when it does. Voice/text on acme-public have\n// 40K-token system prompts so caching always kicks in there.\nconst CACHE_MIN_CHARS = 4 * 1024 // ~1k tokens at 4 char/tok\n\n/**\n * Wrap a system-prompt string in an Anthropic structured-block array\n * with `cache_control: { type: \"ephemeral\" }`. Returns a plain string\n * when the prompt is too short to be cache-eligible (saves a request-\n * shape change that wouldn't help). Cache TTL is the default 5 minutes;\n * suitable for back-to-back chat turns within a session.\n */\nfunction wrapSystemForCache(systemPrompt: string): unknown {\n if (!systemPrompt || systemPrompt.length < CACHE_MIN_CHARS) {\n return systemPrompt\n }\n return [\n {\n type: \"text\",\n text: systemPrompt,\n cache_control: { type: \"ephemeral\" },\n },\n ]\n}\n\ninterface AnthropicResponse {\n id: string\n content: Array<{\n type: \"text\" | \"tool_use\" | \"tool_result\"\n text?: string\n id?: string\n name?: string\n input?: Record<string, unknown>\n tool_use_id?: string\n content?: string\n }>\n model: string\n stop_reason: string\n usage: { input_tokens: number; output_tokens: number }\n}\n\nexport class ClaudeProvider implements AgentProvider {\n name = \"claude\"\n private apiKey: string\n private authType: \"api-key\" | \"oauth\" = \"api-key\"\n\n constructor(apiKey?: string) {\n this.apiKey = apiKey || process.env.ANTHROPIC_API_KEY || \"\"\n if (!this.apiKey) {\n // Fallback to auth store\n const resolved = resolveToken()\n if (resolved) {\n this.apiKey = resolved.token\n this.authType = resolved.authType\n }\n }\n if (!this.apiKey) {\n throw new Error(\n \"Anthropic API key required. Run `agentx model` to configure, set ANTHROPIC_API_KEY, or pass --api-key.\"\n )\n }\n }\n\n async generate(\n messages: GenerationMessage[],\n options?: ProviderOptions\n ): Promise<GenerationResult> {\n const model = options?.model || DEFAULT_MODEL\n const maxTokens = options?.maxTokens || DEFAULT_MAX_TOKENS\n\n // Extract system message\n const systemMsg = messages.find((m) => m.role === \"system\")\n const conversationMsgs = messages\n .filter((m) => m.role !== \"system\")\n .map((m) => ({\n role: m.role as \"user\" | \"assistant\",\n content: m.content,\n }))\n\n const body: Record<string, unknown> = {\n model,\n max_tokens: maxTokens,\n messages: conversationMsgs,\n tools: getLegacyTools(),\n }\n\n if (systemMsg) {\n body.system = wrapSystemForCache(systemMsg.content)\n }\n\n if (options?.temperature !== undefined) {\n body.temperature = options.temperature\n }\n\n const response = await this.callApi(body, options)\n\n return this.parseResponse(response)\n }\n\n async generateRaw(\n messages: AnthropicMessage[],\n systemPrompt: string,\n tools: Array<{ name: string; description: string; input_schema: Record<string, unknown> }>,\n options?: ProviderOptions\n ): Promise<RawGenerationResult> {\n const model = options?.model || DEFAULT_MODEL\n const maxTokens = options?.maxTokens || DEFAULT_MAX_TOKENS\n\n const body: Record<string, unknown> = {\n model,\n max_tokens: maxTokens,\n system: wrapSystemForCache(systemPrompt),\n messages,\n tools,\n }\n\n if (options?.temperature !== undefined) {\n body.temperature = options.temperature\n }\n\n if (options?.toolChoice) {\n body.tool_choice = { type: \"tool\", name: options.toolChoice.name }\n }\n\n const response = await this.callApi(body, options)\n\n // Map response content blocks to our ContentBlock type\n const content: ContentBlock[] = response.content.map((block) => {\n if (block.type === \"text\") {\n return { type: \"text\" as const, text: block.text || \"\" }\n }\n if (block.type === \"tool_use\") {\n return {\n type: \"tool_use\" as const,\n id: block.id || \"\",\n name: block.name || \"\",\n input: block.input || {},\n }\n }\n return { type: \"text\" as const, text: \"\" }\n })\n\n return {\n content,\n stop_reason: response.stop_reason as RawGenerationResult[\"stop_reason\"],\n usage: response.usage,\n }\n }\n\n async *stream(\n messages: GenerationMessage[],\n options?: ProviderOptions\n ): AsyncIterable<StreamEvent> {\n const model = options?.model || DEFAULT_MODEL\n const maxTokens = options?.maxTokens || DEFAULT_MAX_TOKENS\n\n const systemMsg = messages.find((m) => m.role === \"system\")\n const conversationMsgs = messages\n .filter((m) => m.role !== \"system\")\n .map((m) => ({\n role: m.role as \"user\" | \"assistant\",\n content: m.content,\n }))\n\n const body: Record<string, unknown> = {\n model,\n max_tokens: maxTokens,\n messages: conversationMsgs,\n stream: true,\n tools: getLegacyTools(),\n }\n\n if (systemMsg) {\n body.system = wrapSystemForCache(systemMsg.content)\n }\n\n const headers = this.buildHeaders()\n\n const res = await fetch(\"https://api.anthropic.com/v1/messages\", {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: options?.abortSignal,\n })\n\n if (!res.ok) {\n const errorText = await res.text()\n yield { type: \"error\", error: `Anthropic API error (${res.status}): ${errorText}` }\n return\n }\n\n const reader = res.body?.getReader()\n if (!reader) {\n yield { type: \"error\", error: \"No response body\" }\n return\n }\n\n const decoder = new TextDecoder()\n let buffer = \"\"\n const files: GeneratedFile[] = []\n let content = \"\"\n let followUp: string | undefined\n let tokensUsed = 0\n let activeTool: { name: string; id: string; json: string } | null = null\n\n const inferFollowUpFromText = (text: string): string | undefined => {\n const cleaned = (text || \"\").trim()\n if (!cleaned) return undefined\n if (cleaned.includes(\"```\")) return undefined\n\n const lines = cleaned.replace(/\\r\\n/g, \"\\n\").split(\"\\n\")\n const tail = lines.slice(Math.max(0, lines.length - 20))\n const tailText = tail.join(\"\\n\")\n\n const looksLikePlanApproval =\n /\\b(plan|proposal)\\b/i.test(tailText) &&\n /(ready for your review|review (the )?plan|requesting plan approval|awaiting approval|waiting for (your )?approval|approve (the )?plan|approval to proceed)/i.test(\n tailText\n )\n\n if (looksLikePlanApproval) {\n return (\n \"The provider is requesting plan approval.\\n\" +\n \"Reply with:\\n\" +\n \"- approve\\n\" +\n \"- revise: <what to change>\\n\" +\n \"- cancel\"\n )\n }\n\n const isIntro = (l: string) =>\n /^(question|clarification|clarify|i need|need more|before i proceed|to proceed|please (confirm|clarify)|which|what|where|when|how|do you)/i.test(\n l.trim()\n )\n\n let startIdx = -1\n for (let i = tail.length - 1; i >= 0; i--) {\n const l = tail[i].trim()\n if (!l) continue\n if (isIntro(l) || l.includes(\"?\")) {\n startIdx = i\n break\n }\n }\n if (startIdx === -1) return undefined\n\n const out: string[] = []\n for (let i = startIdx; i < tail.length && out.length < 8; i++) {\n const l = tail[i]\n const t = l.trim()\n if (out.length > 0 && !t) break\n if (\n out.length > 0 &&\n !/^(options?:|[-*]\\s|\\d+[\\).]\\s)/i.test(t) &&\n !t.includes(\"?\")\n ) {\n break\n }\n out.push(l.trimEnd())\n }\n\n const candidate = out.join(\"\\n\").trim()\n if (candidate.length < 5) return undefined\n if (candidate.length > 800) return candidate.slice(0, 800).trimEnd()\n return candidate\n }\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split(\"\\n\")\n buffer = lines.pop() || \"\"\n\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) continue\n const data = line.slice(6).trim()\n if (data === \"[DONE]\") continue\n\n try {\n const event = JSON.parse(data)\n\n if (event.type === \"content_block_start\") {\n if (event.content_block?.type === \"tool_use\") {\n // Finalize any previous tool block if the stream didn't send a stop.\n if (activeTool) {\n yield { type: \"tool_use_end\", name: activeTool.name }\n try {\n const input = JSON.parse(activeTool.json || \"{}\") as any\n if (activeTool.name === \"create_files\" && input) {\n if (Array.isArray(input.files)) {\n files.push(...(input.files as GeneratedFile[]))\n }\n if (typeof input.summary === \"string\" && input.summary.trim()) {\n content += `\\n${input.summary}`\n }\n }\n if (activeTool.name === \"ask_user\" && input) {\n if (typeof input.question === \"string\" && input.question.trim()) {\n followUp = input.question\n if (Array.isArray(input.options) && input.options.length) {\n followUp += `\\nOptions: ${input.options.join(\", \")}`\n }\n }\n }\n } catch {\n // Ignore invalid tool JSON\n } finally {\n activeTool = null\n }\n }\n\n activeTool = {\n name: event.content_block.name,\n id: event.content_block.id,\n json: \"\",\n }\n yield {\n type: \"tool_use_start\",\n name: event.content_block.name,\n id: event.content_block.id,\n }\n }\n }\n\n if (event.type === \"content_block_delta\") {\n if (event.delta?.type === \"text_delta\") {\n content += event.delta.text\n yield { type: \"text_delta\", text: event.delta.text }\n }\n if (event.delta?.type === \"input_json_delta\") {\n if (activeTool) activeTool.json += event.delta.partial_json || \"\"\n yield { type: \"tool_use_delta\", json: event.delta.partial_json }\n }\n }\n\n if (event.type === \"content_block_stop\") {\n // Tool use blocks are complete\n if (activeTool) {\n // Manually inline finalize to avoid generator gymnastics.\n yield { type: \"tool_use_end\", name: activeTool.name }\n try {\n const input = JSON.parse(activeTool.json || \"{}\") as any\n if (activeTool.name === \"create_files\" && input) {\n if (Array.isArray(input.files)) {\n files.push(...(input.files as GeneratedFile[]))\n }\n if (typeof input.summary === \"string\" && input.summary.trim()) {\n content += `\\n${input.summary}`\n }\n }\n if (activeTool.name === \"ask_user\" && input) {\n if (typeof input.question === \"string\" && input.question.trim()) {\n followUp = input.question\n if (Array.isArray(input.options) && input.options.length) {\n followUp += `\\nOptions: ${input.options.join(\", \")}`\n }\n }\n }\n } catch {\n // Ignore invalid tool JSON\n } finally {\n activeTool = null\n }\n }\n }\n\n if (event.type === \"message_delta\") {\n if (event.usage) {\n tokensUsed = (event.usage.input_tokens || 0) + (event.usage.output_tokens || 0)\n }\n }\n\n if (event.type === \"message_stop\") {\n // Message complete\n }\n } catch {\n // Skip unparseable lines\n }\n }\n }\n } finally {\n reader.releaseLock()\n }\n\n // Flush any trailing tool input.\n if (activeTool) {\n yield { type: \"tool_use_end\", name: activeTool.name }\n try {\n const input = JSON.parse(activeTool.json || \"{}\") as any\n if (activeTool.name === \"create_files\" && input) {\n if (Array.isArray(input.files)) {\n files.push(...(input.files as GeneratedFile[]))\n }\n if (typeof input.summary === \"string\" && input.summary.trim()) {\n content += `\\n${input.summary}`\n }\n }\n if (activeTool.name === \"ask_user\" && input) {\n if (typeof input.question === \"string\" && input.question.trim()) {\n followUp = input.question\n if (Array.isArray(input.options) && input.options.length) {\n followUp += `\\nOptions: ${input.options.join(\", \")}`\n }\n }\n }\n } catch {\n // Ignore\n }\n activeTool = null\n }\n\n if (!followUp && files.length === 0) {\n followUp = inferFollowUpFromText(content)\n }\n\n yield {\n type: \"done\",\n result: { content, files, followUp, tokensUsed },\n }\n }\n\n /**\n * Streaming variant of generateRaw — yields text_delta events per\n * chunk so callers can pipe per-token to a UI, AND assembles the full\n * RawGenerationResult (with tool_use blocks intact, stop_reason set)\n * so the agentic loop's tool dispatch keeps working unchanged.\n *\n * Implementation mirrors stream() but:\n * - Targets generateRaw's signature (anthropicMessages + systemPrompt +\n * tools as parameters, not interleaved messages).\n * - Builds a ContentBlock[] with both text and tool_use blocks in the\n * order they arrived, so the agentic loop's `result.content.filter(\n * b => b.type === \"tool_use\")` still finds them.\n * - Yields one terminal `raw_result` event the loop consumes.\n */\n async *generateRawStream(\n messages: AnthropicMessage[],\n systemPrompt: string,\n tools: Array<{ name: string; description: string; input_schema: Record<string, unknown> }>,\n options?: ProviderOptions,\n ): AsyncIterable<RawStreamEvent> {\n const model = options?.model || DEFAULT_MODEL\n const maxTokens = options?.maxTokens || DEFAULT_MAX_TOKENS\n\n const body: Record<string, unknown> = {\n model,\n max_tokens: maxTokens,\n system: wrapSystemForCache(systemPrompt),\n messages,\n tools,\n stream: true,\n }\n if (options?.temperature !== undefined) body.temperature = options.temperature\n\n const headers = this.buildHeaders()\n let res: Response\n try {\n res = await fetch(\"https://api.anthropic.com/v1/messages\", {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: options?.abortSignal,\n })\n } catch (err: any) {\n yield { type: \"error\", error: `Anthropic stream init failed: ${err?.message ?? err}` }\n return\n }\n\n if (!res.ok) {\n const errText = await res.text().catch(() => \"\")\n yield { type: \"error\", error: `Anthropic API error (${res.status}): ${errText.slice(0, 500)}` }\n return\n }\n\n const reader = res.body?.getReader()\n if (!reader) {\n yield { type: \"error\", error: \"No response body on Anthropic stream\" }\n return\n }\n\n const decoder = new TextDecoder()\n let buffer = \"\"\n const blocks: ContentBlock[] = []\n let activeBlockIdx: number | null = null\n let stopReason: RawGenerationResult[\"stop_reason\"] = \"end_turn\"\n let inputTokens = 0\n let outputTokens = 0\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split(\"\\n\")\n buffer = lines.pop() || \"\"\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) continue\n const data = line.slice(6).trim()\n if (!data || data === \"[DONE]\") continue\n\n let event: any\n try { event = JSON.parse(data) } catch { continue }\n\n if (event.type === \"message_start\" && event.message?.usage) {\n inputTokens = event.message.usage.input_tokens || 0\n }\n\n if (event.type === \"content_block_start\") {\n const cb = event.content_block\n if (cb?.type === \"text\") {\n activeBlockIdx = blocks.length\n blocks.push({ type: \"text\", text: \"\" })\n } else if (cb?.type === \"tool_use\") {\n activeBlockIdx = blocks.length\n blocks.push({\n type: \"tool_use\",\n id: cb.id || \"\",\n name: cb.name || \"\",\n input: {},\n })\n // We'll accumulate the input JSON across input_json_delta\n // events and parse once content_block_stop fires.\n ;(blocks[activeBlockIdx] as any)._rawJson = \"\"\n } else {\n activeBlockIdx = null\n }\n }\n\n if (event.type === \"content_block_delta\" && activeBlockIdx != null) {\n const block = blocks[activeBlockIdx]\n if (event.delta?.type === \"text_delta\" && block.type === \"text\") {\n block.text += event.delta.text\n yield { type: \"text_delta\", text: event.delta.text }\n } else if (event.delta?.type === \"input_json_delta\" && block.type === \"tool_use\") {\n ;(block as any)._rawJson += event.delta.partial_json || \"\"\n }\n }\n\n if (event.type === \"content_block_stop\" && activeBlockIdx != null) {\n const block = blocks[activeBlockIdx]\n if (block.type === \"tool_use\") {\n const raw = (block as any)._rawJson || \"{}\"\n try {\n block.input = JSON.parse(raw) as Record<string, unknown>\n } catch {\n block.input = {}\n }\n delete (block as any)._rawJson\n }\n activeBlockIdx = null\n }\n\n if (event.type === \"message_delta\") {\n if (event.delta?.stop_reason) {\n stopReason = event.delta.stop_reason as RawGenerationResult[\"stop_reason\"]\n }\n if (event.usage) {\n outputTokens = event.usage.output_tokens || 0\n }\n }\n }\n }\n } catch (err: any) {\n yield { type: \"error\", error: `Anthropic stream read failed: ${err?.message ?? err}` }\n return\n } finally {\n reader.releaseLock()\n }\n\n yield {\n type: \"raw_result\",\n result: {\n content: blocks,\n stop_reason: stopReason,\n usage: { input_tokens: inputTokens, output_tokens: outputTokens },\n },\n }\n }\n\n private buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"anthropic-version\": \"2023-06-01\",\n }\n\n if (this.authType === \"oauth\") {\n headers[\"Authorization\"] = `Bearer ${this.apiKey}`\n headers[\"anthropic-beta\"] = \"claude-code-20250219,oauth-2025-04-20\"\n headers[\"user-agent\"] = \"claude-cli/2.1.2 (external, cli)\"\n headers[\"x-app\"] = \"cli\"\n headers[\"anthropic-dangerous-direct-browser-access\"] = \"true\"\n } else {\n headers[\"x-api-key\"] = this.apiKey\n }\n\n return headers\n }\n\n private async callApi(\n body: Record<string, unknown>,\n options?: ProviderOptions,\n ): Promise<AnthropicResponse> {\n const headers = this.buildHeaders()\n\n // Every request here is cancellable. Without the signal an operator\n // cancel only marks the task aborted in the registry while the HTTP\n // request runs to completion, and a caller's own AbortController — the\n // shape used by src/graph/classifier.ts and src/agents/context-planner.ts\n // — does nothing at all.\n const res = await fetch(\"https://api.anthropic.com/v1/messages\", {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: options?.abortSignal,\n })\n\n if (!res.ok) {\n const errorText = await res.text()\n throw new Error(`Anthropic API error (${res.status}): ${errorText}`)\n }\n\n return (await res.json()) as AnthropicResponse\n }\n\n private parseResponse(response: AnthropicResponse): GenerationResult {\n const files: GeneratedFile[] = []\n let content = \"\"\n let followUp: string | undefined\n\n for (const block of response.content) {\n if (block.type === \"text\") {\n content += block.text || \"\"\n }\n\n if (block.type === \"tool_use\") {\n if (block.name === \"create_files\" && block.input) {\n const input = block.input as {\n files: GeneratedFile[]\n summary?: string\n }\n files.push(...(input.files || []))\n if (input.summary) {\n content += `\\n${input.summary}`\n }\n }\n\n if (block.name === \"ask_user\" && block.input) {\n const input = block.input as { question: string; options?: string[] }\n followUp = input.question\n if (input.options?.length) {\n followUp += `\\nOptions: ${input.options.join(\", \")}`\n }\n }\n }\n }\n\n return {\n content,\n files,\n followUp,\n tokensUsed: response.usage.input_tokens + response.usage.output_tokens,\n }\n }\n}\n","import type {\n AgentProvider,\n GenerationMessage,\n GenerationResult,\n GeneratedFile,\n ProviderOptions,\n StreamEvent,\n AnthropicMessage,\n RawGenerationResult,\n ContentBlock,\n} from \"./types\"\nimport { resolveToken, loadAuthConfig } from \"@/utils/auth-store\"\nimport { execa } from \"execa\"\nimport { getLegacyTools } from \"../tools/definitions\"\n\n// --- Claude Code provider: uses Claude CLI (subscription) or direct API (API key) ---\n\nconst DEFAULT_MODEL = \"claude-sonnet-4-20250514\"\nconst DEFAULT_MAX_TOKENS = 8192\n\n// Model ID → claude CLI alias\nconst CLI_MODEL_ALIASES: Record<string, string> = {\n \"claude-sonnet-4-20250514\": \"sonnet\",\n \"claude-opus-4-20250514\": \"opus\",\n \"claude-haiku-4-20250514\": \"haiku\",\n}\n\ntype AuthCredential = { type: \"oauth\"; token: string } | { type: \"api-key\"; token: string }\n\ninterface AnthropicResponse {\n id: string\n content: Array<{\n type: \"text\" | \"tool_use\" | \"tool_result\"\n text?: string\n id?: string\n name?: string\n input?: Record<string, unknown>\n }>\n model: string\n stop_reason: string\n usage: { input_tokens: number; output_tokens: number }\n}\n\nexport class ClaudeCodeProvider implements AgentProvider {\n name = \"claude-code\"\n private credential: AuthCredential\n\n constructor() {\n // Stored config takes priority — if user ran `agentx model` and chose OAuth,\n // we use that regardless of ANTHROPIC_API_KEY env var (same as OpenClaw's clearEnv).\n const stored = loadAuthConfig()\n if (stored) {\n this.credential = { type: stored.authType, token: stored.token }\n return\n }\n\n const resolved = resolveToken()\n if (!resolved) {\n throw new Error(\n \"No Claude credentials found.\\n\" +\n \"Options:\\n\" +\n \" 1. Run `agentx model` to configure credentials\\n\" +\n \" 2. Set ANTHROPIC_API_KEY environment variable\\n\" +\n \" 3. Set ANTHROPIC_OAUTH_TOKEN environment variable\"\n )\n }\n this.credential = { type: resolved.authType, token: resolved.token }\n }\n\n async generate(\n messages: GenerationMessage[],\n options?: ProviderOptions\n ): Promise<GenerationResult> {\n // OAuth tokens → use claude CLI (subscription billing)\n // API keys → call API directly\n if (this.credential.type === \"oauth\") {\n return this.generateViaCli(messages, options)\n }\n return this.generateViaApi(messages, options)\n }\n\n /**\n * generateRaw() for the agentic tool_result loop.\n * Only available for API key auth — the CLI binary has its own agent loop.\n */\n async generateRaw(\n messages: AnthropicMessage[],\n systemPrompt: string,\n tools: Array<{ name: string; description: string; input_schema: Record<string, unknown> }>,\n options?: ProviderOptions\n ): Promise<RawGenerationResult> {\n // OAuth path: not supported — the claude CLI has its own built-in tools\n if (this.credential.type === \"oauth\") {\n throw new Error(\"generateRaw() not available for OAuth/CLI mode\")\n }\n\n const model = options?.model || DEFAULT_MODEL\n const maxTokens = options?.maxTokens || DEFAULT_MAX_TOKENS\n\n const body: Record<string, unknown> = {\n model,\n max_tokens: maxTokens,\n system: systemPrompt,\n messages,\n tools,\n }\n\n if (options?.temperature !== undefined) {\n body.temperature = options.temperature\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"anthropic-version\": \"2023-06-01\",\n \"x-api-key\": this.credential.token,\n }\n\n const res = await fetch(\"https://api.anthropic.com/v1/messages\", {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n })\n\n if (!res.ok) {\n const errorText = await res.text()\n throw new Error(`Anthropic API error (${res.status}): ${errorText}`)\n }\n\n const response = (await res.json()) as AnthropicResponse\n\n const content: ContentBlock[] = response.content.map((block) => {\n if (block.type === \"text\") {\n return { type: \"text\" as const, text: block.text || \"\" }\n }\n if (block.type === \"tool_use\") {\n return {\n type: \"tool_use\" as const,\n id: block.id || \"\",\n name: block.name || \"\",\n input: block.input || {},\n }\n }\n return { type: \"text\" as const, text: \"\" }\n })\n\n return {\n content,\n stop_reason: response.stop_reason as RawGenerationResult[\"stop_reason\"],\n usage: response.usage,\n }\n }\n\n /**\n * Returns true if this provider can use the agentic tool loop.\n * Only available for API key auth (CLI mode falls back to legacy loop).\n */\n get supportsAgenticLoop(): boolean {\n return this.credential.type === \"api-key\"\n }\n\n /**\n * Generate via the `claude` CLI binary.\n * This is how subscription billing works — the CLI handles auth internally.\n */\n private async generateViaCli(\n messages: GenerationMessage[],\n options?: ProviderOptions\n ): Promise<GenerationResult> {\n const model = options?.model || loadAuthConfig()?.model || DEFAULT_MODEL\n const cliModel = CLI_MODEL_ALIASES[model] || model\n\n const systemMsg = messages.find((m) => m.role === \"system\")\n const userMsgs = messages.filter((m) => m.role === \"user\")\n const prompt = userMsgs.map((m) => m.content).join(\"\\n\\n\")\n\n const args = [\n \"-p\",\n \"--output-format\", \"json\",\n \"--model\", cliModel,\n \"--dangerously-skip-permissions\",\n ]\n\n if (systemMsg) {\n args.push(\"--append-system-prompt\", systemMsg.content)\n }\n\n // Prompt goes as the last positional argument\n args.push(prompt)\n\n // Clear ANTHROPIC_API_KEY to force CLI to use subscription auth\n const env = { ...process.env }\n delete env.ANTHROPIC_API_KEY\n delete env.ANTHROPIC_API_KEY_OLD\n\n const result = await execa(\"claude\", args, {\n env,\n extendEnv: false,\n reject: false,\n timeout: 300_000,\n stdin: \"ignore\",\n })\n\n if (result.exitCode !== 0) {\n const err = result.stderr || result.stdout || \"Claude CLI failed\"\n throw new Error(`Claude CLI error: ${err}`)\n }\n\n // Claude CLI may return success exit code but with is_error in JSON\n const output = result.stdout.trim()\n try {\n const json = JSON.parse(output)\n if (json.is_error && json.result) {\n throw new Error(json.result)\n }\n } catch (e: any) {\n if (e.message && !e.message.includes(\"JSON\")) throw e\n // Not JSON — that's fine, parseCliOutput will handle it\n }\n\n return this.parseCliOutput(output)\n }\n\n /**\n * Generate via direct Anthropic API call (for API key auth).\n */\n private async generateViaApi(\n messages: GenerationMessage[],\n options?: ProviderOptions\n ): Promise<GenerationResult> {\n const model = options?.model || DEFAULT_MODEL\n const maxTokens = options?.maxTokens || DEFAULT_MAX_TOKENS\n\n const systemMsg = messages.find((m) => m.role === \"system\")\n const conversationMsgs = messages\n .filter((m) => m.role !== \"system\")\n .map((m) => ({\n role: m.role as \"user\" | \"assistant\",\n content: m.content,\n }))\n\n const body: Record<string, unknown> = {\n model,\n max_tokens: maxTokens,\n messages: conversationMsgs,\n tools: getLegacyTools(),\n }\n\n if (systemMsg) {\n body.system = systemMsg.content\n }\n\n if (options?.temperature !== undefined) {\n body.temperature = options.temperature\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"anthropic-version\": \"2023-06-01\",\n \"x-api-key\": this.credential.token,\n }\n\n const res = await fetch(\"https://api.anthropic.com/v1/messages\", {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n })\n\n if (!res.ok) {\n const errorText = await res.text()\n throw new Error(`Anthropic API error (${res.status}): ${errorText}`)\n }\n\n const response = (await res.json()) as AnthropicResponse\n return this.parseApiResponse(response)\n }\n\n /**\n * Stream responses. For OAuth, uses CLI with --output-format stream-json.\n * For API keys, uses SSE streaming.\n */\n async *stream(\n messages: GenerationMessage[],\n options?: ProviderOptions\n ): AsyncIterable<StreamEvent> {\n if (this.credential.type === \"oauth\") {\n // CLI streaming via --output-format stream-json\n yield* this.streamViaCli(messages, options)\n } else {\n // API streaming via SSE (same as ClaudeProvider.stream)\n yield* this.streamViaApi(messages, options)\n }\n }\n\n private async *streamViaCli(\n messages: GenerationMessage[],\n options?: ProviderOptions\n ): AsyncIterable<StreamEvent> {\n const model = options?.model || loadAuthConfig()?.model || DEFAULT_MODEL\n const cliModel = CLI_MODEL_ALIASES[model] || model\n\n const systemMsg = messages.find((m) => m.role === \"system\")\n const userMsgs = messages.filter((m) => m.role === \"user\")\n const prompt = userMsgs.map((m) => m.content).join(\"\\n\\n\")\n\n const args = [\n \"-p\",\n \"--output-format\", \"stream-json\",\n \"--model\", cliModel,\n \"--dangerously-skip-permissions\",\n ]\n\n if (systemMsg) {\n args.push(\"--append-system-prompt\", systemMsg.content)\n }\n\n args.push(prompt)\n\n const env = { ...process.env }\n delete env.ANTHROPIC_API_KEY\n delete env.ANTHROPIC_API_KEY_OLD\n\n const child = execa(\"claude\", args, {\n env,\n extendEnv: false,\n reject: false,\n timeout: 300_000,\n stdin: \"ignore\",\n })\n\n let fullContent = \"\"\n let stderr = \"\"\n let fatalError: string | undefined\n\n if (child.stderr) {\n child.stderr.on(\"data\", (chunk: any) => {\n stderr += Buffer.isBuffer(chunk) ? chunk.toString(\"utf8\") : String(chunk)\n })\n }\n\n if (child.stdout) {\n const decoder = new TextDecoder()\n const readable = child.stdout as unknown as AsyncIterable<Uint8Array>\n\n for await (const chunk of readable) {\n const text = typeof chunk === \"string\" ? chunk : decoder.decode(chunk, { stream: true })\n // Stream JSON format: each line is a JSON object\n const lines = text.split(\"\\n\").filter(Boolean)\n for (const line of lines) {\n try {\n const event = JSON.parse(line)\n // Some claude stream-json builds emit error events.\n if (event.type === \"error\") {\n fatalError = String(event.error || event.message || \"Claude CLI error\")\n continue\n }\n if (event.is_error && (event.result || event.message)) {\n fatalError = String(event.result || event.message)\n continue\n }\n if (event.type === \"assistant\" && event.message) {\n fullContent += event.message\n yield { type: \"text_delta\", text: event.message }\n } else if (event.type === \"result\") {\n fullContent = event.result || fullContent\n }\n } catch {\n // Not JSON, treat as raw text\n fullContent += line\n yield { type: \"text_delta\", text: line }\n }\n }\n }\n }\n\n const res = await child\n if (res.exitCode !== 0 && !fatalError) {\n fatalError = (stderr || res.stderr || res.stdout || \"Claude CLI failed\").toString().trim()\n }\n\n if (fatalError) {\n yield { type: \"error\", error: `Claude CLI error: ${fatalError}` }\n return\n }\n\n const files = this.extractFilesFromText(fullContent)\n const followUp =\n files.length === 0 ? this.inferFollowUpFromText(fullContent) : undefined\n yield {\n type: \"done\",\n result: { content: fullContent, files, followUp, tokensUsed: 0 },\n }\n }\n\n private async *streamViaApi(\n messages: GenerationMessage[],\n options?: ProviderOptions\n ): AsyncIterable<StreamEvent> {\n const model = options?.model || DEFAULT_MODEL\n const maxTokens = options?.maxTokens || DEFAULT_MAX_TOKENS\n\n const systemMsg = messages.find((m) => m.role === \"system\")\n const conversationMsgs = messages\n .filter((m) => m.role !== \"system\")\n .map((m) => ({ role: m.role as \"user\" | \"assistant\", content: m.content }))\n\n const body: Record<string, unknown> = {\n model,\n max_tokens: maxTokens,\n messages: conversationMsgs,\n tools: getLegacyTools(),\n stream: true,\n }\n\n if (systemMsg) body.system = systemMsg.content\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"anthropic-version\": \"2023-06-01\",\n \"x-api-key\": this.credential.token,\n }\n\n const res = await fetch(\"https://api.anthropic.com/v1/messages\", {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n })\n\n if (!res.ok) {\n const errorText = await res.text()\n yield { type: \"error\", error: `Anthropic API error (${res.status}): ${errorText}` }\n return\n }\n\n const reader = res.body?.getReader()\n if (!reader) {\n yield { type: \"error\", error: \"No response body\" }\n return\n }\n\n const decoder = new TextDecoder()\n let buffer = \"\"\n let content = \"\"\n let tokensUsed = 0\n const files: GeneratedFile[] = []\n let followUp: string | undefined\n let activeTool: { name: string; id: string; json: string } | null = null\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split(\"\\n\")\n buffer = lines.pop() || \"\"\n\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) continue\n const data = line.slice(6).trim()\n if (data === \"[DONE]\") continue\n\n try {\n const event = JSON.parse(data)\n if (event.type === \"content_block_start\") {\n if (event.content_block?.type === \"tool_use\") {\n // Finalize any previous tool block if the stream didn't send a stop.\n if (activeTool) {\n yield { type: \"tool_use_end\", name: activeTool.name }\n try {\n const input = JSON.parse(activeTool.json || \"{}\") as any\n if (activeTool.name === \"create_files\" && input) {\n if (Array.isArray(input.files)) {\n files.push(...(input.files as GeneratedFile[]))\n }\n if (typeof input.summary === \"string\" && input.summary.trim()) {\n content += `\\n${input.summary}`\n }\n }\n if (activeTool.name === \"ask_user\" && input) {\n if (typeof input.question === \"string\" && input.question.trim()) {\n followUp = input.question\n if (Array.isArray(input.options) && input.options.length) {\n followUp += `\\nOptions: ${input.options.join(\", \")}`\n }\n }\n }\n } catch {\n // Ignore invalid tool JSON\n } finally {\n activeTool = null\n }\n }\n\n activeTool = {\n name: event.content_block.name,\n id: event.content_block.id,\n json: \"\",\n }\n yield { type: \"tool_use_start\", name: activeTool.name, id: activeTool.id }\n }\n }\n\n if (event.type === \"content_block_delta\" && event.delta?.type === \"text_delta\") {\n content += event.delta.text\n yield { type: \"text_delta\", text: event.delta.text }\n }\n if (event.type === \"content_block_delta\" && event.delta?.type === \"input_json_delta\") {\n if (activeTool) activeTool.json += event.delta.partial_json || \"\"\n yield { type: \"tool_use_delta\", json: event.delta.partial_json }\n }\n if (event.type === \"content_block_stop\") {\n if (activeTool) {\n yield { type: \"tool_use_end\", name: activeTool.name }\n try {\n const input = JSON.parse(activeTool.json || \"{}\") as any\n if (activeTool.name === \"create_files\" && input) {\n if (Array.isArray(input.files)) {\n files.push(...(input.files as GeneratedFile[]))\n }\n if (typeof input.summary === \"string\" && input.summary.trim()) {\n content += `\\n${input.summary}`\n }\n }\n if (activeTool.name === \"ask_user\" && input) {\n if (typeof input.question === \"string\" && input.question.trim()) {\n followUp = input.question\n if (Array.isArray(input.options) && input.options.length) {\n followUp += `\\nOptions: ${input.options.join(\", \")}`\n }\n }\n }\n } catch {\n // Ignore invalid tool JSON\n } finally {\n activeTool = null\n }\n }\n }\n if (event.type === \"message_delta\" && event.usage) {\n tokensUsed = (event.usage.input_tokens || 0) + (event.usage.output_tokens || 0)\n }\n } catch {\n // Skip\n }\n }\n }\n } finally {\n reader.releaseLock()\n }\n\n // Flush any trailing tool input.\n if (activeTool) {\n yield { type: \"tool_use_end\", name: activeTool.name }\n try {\n const input = JSON.parse(activeTool.json || \"{}\") as any\n if (activeTool.name === \"create_files\" && input) {\n if (Array.isArray(input.files)) {\n files.push(...(input.files as GeneratedFile[]))\n }\n if (typeof input.summary === \"string\" && input.summary.trim()) {\n content += `\\n${input.summary}`\n }\n }\n if (activeTool.name === \"ask_user\" && input) {\n if (typeof input.question === \"string\" && input.question.trim()) {\n followUp = input.question\n if (Array.isArray(input.options) && input.options.length) {\n followUp += `\\nOptions: ${input.options.join(\", \")}`\n }\n }\n }\n } catch {\n // Ignore\n }\n activeTool = null\n }\n\n // If the model didn't use tools (or we couldn't parse them), fall back to fenced-code extraction.\n if (files.length === 0) {\n files.push(...this.extractFilesFromText(content))\n }\n if (!followUp && files.length === 0) {\n followUp = this.inferFollowUpFromText(content)\n }\n yield {\n type: \"done\",\n result: { content, files, followUp, tokensUsed },\n }\n }\n\n /**\n * Parse JSON output from the `claude` CLI.\n */\n private parseCliOutput(stdout: string): GenerationResult {\n let parsed: any\n try {\n parsed = JSON.parse(stdout)\n } catch {\n // CLI returned plain text\n const inferred = this.inferFollowUpFromText(stdout.trim())\n return {\n content: stdout.trim(),\n files: [],\n followUp: inferred,\n tokensUsed: 0,\n }\n }\n\n // Claude CLI JSON format: { result: \"...\", session_id: \"...\", ... }\n const text = parsed.result || parsed.text || parsed.content || \"\"\n\n // Extract files from the text if it contains code blocks with file paths\n const files = this.extractFilesFromText(text)\n const followUp = files.length === 0 ? this.inferFollowUpFromText(text) : undefined\n\n return {\n content: text,\n files,\n followUp,\n tokensUsed: parsed.usage\n ? (parsed.usage.input_tokens || 0) + (parsed.usage.output_tokens || 0)\n : 0,\n }\n }\n\n /**\n * Extract file blocks from CLI text output.\n * Looks for patterns like: ```path/to/file.ts ... ```\n */\n private extractFilesFromText(text: string): GeneratedFile[] {\n const files: GeneratedFile[] = []\n // Match fenced code blocks with a file path hint on the opening line\n const pattern = /```[\\w]*\\s*([\\w/._-]+\\.\\w+)\\n([\\s\\S]*?)```/g\n let match: RegExpExecArray | null\n while ((match = pattern.exec(text)) !== null) {\n const filePath = match[1]\n const content = match[2]\n if (filePath && content) {\n files.push({ path: filePath, content: content.trimEnd() })\n }\n }\n return files\n }\n\n /**\n * Claude CLI (OAuth/subscription) doesn't always emit structured ask_user tool blocks.\n * When it's obviously asking for clarification, infer a follow-up question from the tail.\n */\n private inferFollowUpFromText(text: string): string | undefined {\n const cleaned = (text || \"\").trim()\n if (!cleaned) return undefined\n\n // If it looks like it produced file blocks, don't treat it as a follow-up.\n if (cleaned.includes(\"```\")) return undefined\n\n const lines = cleaned.replace(/\\r\\n/g, \"\\n\").split(\"\\n\")\n const tail = lines.slice(Math.max(0, lines.length - 20))\n\n const tailText = tail.join(\"\\n\")\n const looksLikePlanApproval =\n /\\b(plan|proposal)\\b/i.test(tailText) &&\n /(ready for your review|review (the )?plan|requesting plan approval|awaiting approval|waiting for (your )?approval|approve (the )?plan|approval to proceed)/i.test(\n tailText\n )\n\n if (looksLikePlanApproval) {\n return (\n \"The provider is requesting plan approval.\\n\" +\n \"Reply with:\\n\" +\n \"- approve\\n\" +\n \"- revise: <what to change>\\n\" +\n \"- cancel\"\n )\n }\n\n const isIntro = (l: string) =>\n /^(question|clarification|clarify|i need|need more|before i proceed|to proceed|please (confirm|clarify)|which|what|where|when|how|do you)/i.test(\n l.trim()\n )\n\n // Find the last strong candidate line.\n let startIdx = -1\n for (let i = tail.length - 1; i >= 0; i--) {\n const l = tail[i].trim()\n if (!l) continue\n if (isIntro(l) || l.includes(\"?\")) {\n startIdx = i\n break\n }\n }\n if (startIdx === -1) return undefined\n\n // Collect the question + a small option/list block that follows it.\n const out: string[] = []\n for (let i = startIdx; i < tail.length && out.length < 8; i++) {\n const l = tail[i]\n const t = l.trim()\n if (out.length > 0 && !t) break\n\n if (\n out.length > 0 &&\n !/^(options?:|[-*]\\s|\\d+[\\).]\\s)/i.test(t) &&\n !t.includes(\"?\")\n ) {\n break\n }\n\n out.push(l.trimEnd())\n }\n\n const candidate = out.join(\"\\n\").trim()\n if (candidate.length < 5) return undefined\n if (candidate.length > 800) return candidate.slice(0, 800).trimEnd()\n return candidate\n }\n\n /**\n * Parse Anthropic API response (tool-use format).\n */\n private parseApiResponse(response: AnthropicResponse): GenerationResult {\n const files: GeneratedFile[] = []\n let content = \"\"\n let followUp: string | undefined\n\n for (const block of response.content) {\n if (block.type === \"text\") {\n content += block.text || \"\"\n }\n\n if (block.type === \"tool_use\") {\n if (block.name === \"create_files\" && block.input) {\n const input = block.input as {\n files: GeneratedFile[]\n summary?: string\n }\n files.push(...(input.files || []))\n if (input.summary) {\n content += `\\n${input.summary}`\n }\n }\n\n if (block.name === \"ask_user\" && block.input) {\n const input = block.input as { question: string; options?: string[] }\n followUp = input.question\n if (input.options?.length) {\n followUp += `\\nOptions: ${input.options.join(\", \")}`\n }\n }\n }\n }\n\n return {\n content,\n files,\n followUp,\n tokensUsed: response.usage.input_tokens + response.usage.output_tokens,\n }\n }\n}\n","import type {\n AgentProvider,\n GenerationMessage,\n GenerationResult,\n GeneratedFile,\n ProviderOptions,\n StreamEvent,\n AnthropicMessage,\n RawGenerationResult,\n RawStreamEvent,\n ContentBlock,\n} from \"./types\"\nimport { getLegacyTools } from \"../tools/definitions\"\n\n// --- OpenAI-compatible provider (OpenAI, DeepSeek, OpenRouter, Together,\n// vLLM, llama.cpp, anything that speaks the Chat Completions API).\n//\n// Zero new deps — uses raw `fetch` to mirror the ClaudeProvider pattern.\n// Routes through OPENAI_BASE_URL so the same class works for every\n// OpenAI-shape backend; defaults to api.openai.com/v1.\n//\n// Environment knobs:\n// OPENAI_BASE_URL e.g. https://api.deepseek.com/v1 (defaults to OpenAI)\n// OPENAI_API_KEY bearer token for the upstream\n// OPENAI_MODEL default model id (per-call override via options.model)\n//\n// The agentx-side tool catalog uses Anthropic's `input_schema` shape and\n// the rest of the runtime expects RawGenerationResult in Anthropic shape\n// (ContentBlock[] with stop_reason: \"end_turn\"|\"tool_use\"|…). We translate\n// at the boundary so the tool/agentic loop above is provider-agnostic.\n\nconst DEFAULT_MODEL = \"gpt-4o-mini\"\nconst DEFAULT_MAX_TOKENS = 8192\n\ninterface OpenAIToolCall {\n id: string\n type: \"function\"\n function: { name: string; arguments: string }\n}\n\ninterface OpenAIResponseMessage {\n role: \"assistant\"\n content: string | null\n tool_calls?: OpenAIToolCall[]\n // DeepSeek V4 reasoning output (\"thinking mode\"). When present, MUST\n // be echoed back on subsequent requests of the same turn or DeepSeek\n // 400s with \"The reasoning_content in the thinking mode must be\n // passed back to the API.\" We surface it as a {type:\"reasoning\"}\n // ContentBlock so the agentic loop carries it through.\n reasoning_content?: string\n}\n\ninterface OpenAIChatResponse {\n id: string\n model: string\n choices: Array<{\n index: number\n message: OpenAIResponseMessage\n finish_reason: \"stop\" | \"length\" | \"tool_calls\" | \"content_filter\" | \"function_call\" | null\n }>\n usage?: { prompt_tokens?: number; completion_tokens?: number; total_tokens?: number }\n}\n\nexport interface OpenAIProviderOptions {\n /** Toggle \"thinking mode\" on backends that support it (DeepSeek V4\n * `reasoning_content`). Default `true` for DeepSeek baseUrls so the\n * agent surfaces its reasoning live in the dashboard; set to `false`\n * via `providers.<name>.thinking` in agentx.json if a particular\n * agent wants the extra latency / cost back. Ignored on backends\n * that don't speak the thinking-mode protocol (vanilla OpenAI,\n * vLLM, Together, …). */\n thinking?: boolean\n}\n\nexport class OpenAIProvider implements AgentProvider {\n name = \"openai\"\n private apiKey: string\n private baseUrl: string\n /** Resolved thinking flag — null when the backend isn't a known\n * thinking-mode endpoint and the option is irrelevant. */\n private thinkingEnabled: boolean | null\n\n constructor(apiKey?: string, baseUrl?: string, opts: OpenAIProviderOptions = {}) {\n this.apiKey = apiKey || process.env.OPENAI_API_KEY || \"\"\n this.baseUrl = (\n baseUrl ||\n process.env.OPENAI_BASE_URL ||\n \"https://api.openai.com/v1\"\n ).replace(/\\/$/, \"\")\n // DeepSeek defaults to thinking ON — that's the model's own default\n // behavior. Operator can flip it off via providers.<name>.thinking=false.\n // Non-DeepSeek backends ignore the flag entirely.\n const isDeepseek = this.baseUrl.includes(\"deepseek.com\")\n this.thinkingEnabled = isDeepseek\n ? (opts.thinking === false ? false : true)\n : null\n if (!this.apiKey) {\n throw new Error(\n \"OpenAI-compatible API key required. Set OPENAI_API_KEY (or pass --api-key). \" +\n \"For DeepSeek, also set OPENAI_BASE_URL=https://api.deepseek.com/v1.\",\n )\n }\n }\n\n async generate(\n messages: GenerationMessage[],\n options?: ProviderOptions,\n ): Promise<GenerationResult> {\n const model = options?.model || process.env.OPENAI_MODEL || DEFAULT_MODEL\n const maxTokens = options?.maxTokens || DEFAULT_MAX_TOKENS\n\n // OpenAI takes system as just another message with role:\"system\" at the top.\n const oaMessages = messages.map((m) => ({ role: m.role, content: m.content }))\n\n const body: Record<string, unknown> = {\n model,\n max_tokens: maxTokens,\n messages: oaMessages,\n tools: this.legacyToolsAsOpenAI(),\n }\n if (options?.temperature !== undefined) body.temperature = options.temperature\n\n const data = await this.callApi(body)\n return this.parseHighLevelResponse(data)\n }\n\n async generateRaw(\n messages: AnthropicMessage[],\n systemPrompt: string,\n tools: Array<{ name: string; description: string; input_schema: Record<string, unknown> }>,\n options?: ProviderOptions,\n ): Promise<RawGenerationResult> {\n const body = this.buildRawBody(messages, systemPrompt, tools, options)\n const data = await this.callApi(body, options?.abortSignal)\n return this.parseRawResponse(data)\n }\n\n /**\n * Streaming variant of generateRaw. Yields text_delta and thinking_delta\n * events as the model speaks, then a terminal raw_result with the full\n * content blocks (text, tool_use, and — for DeepSeek thinking mode —\n * a `reasoning` block at the head). The agentic loop's tool-dispatch\n * and reasoning-round-trip logic then operates on identical data to\n * the non-streaming path.\n */\n async *generateRawStream(\n messages: AnthropicMessage[],\n systemPrompt: string,\n tools: Array<{ name: string; description: string; input_schema: Record<string, unknown> }>,\n options?: ProviderOptions,\n ): AsyncIterable<RawStreamEvent> {\n const body = { ...this.buildRawBody(messages, systemPrompt, tools, options), stream: true, stream_options: { include_usage: true } }\n\n let res: Response\n try {\n res = await fetch(`${this.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", Authorization: `Bearer ${this.apiKey}` },\n body: JSON.stringify(this.maybeDeepseekExtras(body)),\n // Forward operator cancel down to the HTTP layer so Stop\n // actually terminates the in-flight request. Without this,\n // the abort fires in the registry but fetch keeps draining\n // tokens.\n signal: options?.abortSignal as any,\n })\n } catch (err: any) {\n // AbortError surfaces here when the operator cancelled before\n // the connection completed. Treat as cancelled, not a real\n // error — the registry's outer handler already records the\n // cancellation.\n if (err?.name === \"AbortError\" || options?.abortSignal?.aborted) {\n yield { type: \"error\", error: \"cancelled\" }\n return\n }\n yield { type: \"error\", error: `OpenAI-compat raw stream init failed: ${err?.message ?? err}` }\n return\n }\n if (!res.ok) {\n const errText = await res.text().catch(() => \"\")\n yield { type: \"error\", error: `OpenAI-compat API error (${res.status}): ${errText.slice(0, 500)}` }\n return\n }\n const reader = res.body?.getReader()\n if (!reader) { yield { type: \"error\", error: \"No response body on OpenAI-compat raw stream\" }; return }\n\n // Wire the operator's abort signal into reader.cancel() so an abort\n // mid-stream actually closes the underlying TCP socket. Without this,\n // undici sometimes keeps reader.read() pending forever even after\n // fetch's signal aborts — DeepSeek's reasoning_content can stream for\n // many minutes, and the orchestrator's wall-clock timer fired into a\n // signal that no one was actually watching here. Production saw 58+\n // min hangs past the 15-min maxExecutionMinutes cap on acme-public.\n const onAbortCancelReader = () => {\n reader.cancel(new Error(\"aborted\")).catch(() => { /* already closed */ })\n }\n if (options?.abortSignal) {\n if (options.abortSignal.aborted) onAbortCancelReader()\n else options.abortSignal.addEventListener(\"abort\", onAbortCancelReader, { once: true })\n }\n\n const decoder = new TextDecoder()\n let buffer = \"\"\n let textOut = \"\"\n let reasoningOut = \"\"\n let inputTokens = 0\n let outputTokens = 0\n let finishReason: string | null = null\n interface ToolAcc { id: string; name: string; argumentsRaw: string }\n const toolAcc: Record<number, ToolAcc> = {}\n\n try {\n while (true) {\n // Belt-and-braces: bail between chunks too, in case reader.cancel()\n // didn't unblock the pending read (some SSE proxies hold the\n // connection open even after upstream close).\n if (options?.abortSignal?.aborted) {\n yield { type: \"error\", error: \"cancelled\" }\n return\n }\n const { done, value } = await reader.read()\n if (done) break\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split(\"\\n\")\n buffer = lines.pop() || \"\"\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) continue\n const data = line.slice(6).trim()\n if (!data || data === \"[DONE]\") continue\n let chunk: any\n try { chunk = JSON.parse(data) } catch { continue }\n const choice = chunk.choices?.[0]\n const delta = choice?.delta\n if (choice?.finish_reason) finishReason = choice.finish_reason\n\n if (typeof delta?.reasoning_content === \"string\" && delta.reasoning_content) {\n reasoningOut += delta.reasoning_content\n yield { type: \"thinking_delta\", text: delta.reasoning_content }\n }\n if (typeof delta?.content === \"string\" && delta.content) {\n textOut += delta.content\n yield { type: \"text_delta\", text: delta.content }\n }\n if (Array.isArray(delta?.tool_calls)) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index\n if (idx == null) continue\n const acc = (toolAcc[idx] ||= { id: \"\", name: \"\", argumentsRaw: \"\" })\n if (tc.id) acc.id = tc.id\n if (tc.function?.name) acc.name = tc.function.name\n if (tc.function?.arguments) acc.argumentsRaw += tc.function.arguments\n }\n }\n if (chunk.usage) {\n inputTokens = chunk.usage.prompt_tokens || 0\n outputTokens = chunk.usage.completion_tokens || 0\n }\n }\n }\n } catch (err: any) {\n if (err?.name === \"AbortError\" || options?.abortSignal?.aborted) {\n yield { type: \"error\", error: \"cancelled\" }\n return\n }\n yield { type: \"error\", error: `OpenAI-compat raw stream read failed: ${err?.message ?? err}` }\n return\n } finally {\n if (options?.abortSignal) {\n options.abortSignal.removeEventListener(\"abort\", onAbortCancelReader)\n }\n }\n\n // Assemble blocks in the same order parseRawResponse uses so the\n // agentic loop's round-trip stays consistent.\n const blocks: ContentBlock[] = []\n if (reasoningOut) blocks.push({ type: \"reasoning\", text: reasoningOut })\n if (textOut) blocks.push({ type: \"text\", text: textOut })\n for (const acc of Object.values(toolAcc)) {\n if (!acc.id || !acc.name) continue\n let input: Record<string, unknown> = {}\n try { input = acc.argumentsRaw ? JSON.parse(acc.argumentsRaw) : {} } catch { /* keep empty input */ }\n blocks.push({ type: \"tool_use\", id: acc.id, name: acc.name, input })\n }\n\n let stop_reason: RawGenerationResult[\"stop_reason\"] = \"end_turn\"\n switch (finishReason) {\n case \"tool_calls\":\n case \"function_call\":\n stop_reason = \"tool_use\"; break\n case \"length\":\n stop_reason = \"max_tokens\"; break\n }\n\n yield {\n type: \"raw_result\",\n result: { content: blocks, stop_reason, usage: { input_tokens: inputTokens, output_tokens: outputTokens } },\n }\n }\n\n /** Shared request-body builder for generateRaw / generateRawStream — both\n * need the same message translation, tool list, and provider extras. */\n private buildRawBody(\n messages: AnthropicMessage[],\n systemPrompt: string,\n tools: Array<{ name: string; description: string; input_schema: Record<string, unknown> }>,\n options?: ProviderOptions,\n ): Record<string, unknown> {\n const model = options?.model || process.env.OPENAI_MODEL || DEFAULT_MODEL\n const maxTokens = options?.maxTokens || DEFAULT_MAX_TOKENS\n\n // Translate Anthropic-shape messages (with tool_use / tool_result content blocks)\n // into OpenAI Chat Completions message shape (with role:\"tool\" turns and\n // assistant.tool_calls). System prompt goes in as messages[0].\n const oaMessages: any[] = systemPrompt\n ? [{ role: \"system\", content: systemPrompt }]\n : []\n\n for (const m of messages) {\n const blocks = Array.isArray(m.content) ? m.content : [{ type: \"text\" as const, text: m.content }]\n if (m.role === \"user\") {\n const toolResults = blocks.filter((b) => (b as any).type === \"tool_result\") as Array<{\n type: \"tool_result\"; tool_use_id: string; content: string; is_error?: boolean;\n }>\n const textParts = blocks\n .filter((b) => (b as any).type === \"text\")\n .map((b) => (b as any).text)\n .join(\"\")\n for (const tr of toolResults) {\n oaMessages.push({\n role: \"tool\",\n tool_call_id: tr.tool_use_id,\n content: tr.is_error ? `[error] ${tr.content}` : tr.content,\n })\n }\n if (textParts) {\n oaMessages.push({ role: \"user\", content: textParts })\n } else if (toolResults.length === 0) {\n oaMessages.push({ role: \"user\", content: m.content as any })\n }\n } else {\n // Assistant turns may have text + tool_use + reasoning blocks;\n // OpenAI wants `content` + `tool_calls` on a single message,\n // and DeepSeek V4 also wants the prior `reasoning_content` so\n // thinking-mode round-trip works.\n const toolUses = blocks.filter((b) => (b as any).type === \"tool_use\") as Array<{\n type: \"tool_use\"; id: string; name: string; input: Record<string, unknown>;\n }>\n const text = blocks\n .filter((b) => (b as any).type === \"text\")\n .map((b) => (b as any).text)\n .join(\"\")\n const reasoning = blocks\n .filter((b) => (b as any).type === \"reasoning\")\n .map((b) => (b as any).text)\n .join(\"\")\n const msg: any = { role: \"assistant\", content: text || null }\n if (toolUses.length > 0) {\n msg.tool_calls = toolUses.map((tu) => ({\n id: tu.id,\n type: \"function\" as const,\n function: { name: tu.name, arguments: JSON.stringify(tu.input || {}) },\n }))\n }\n if (reasoning) {\n msg.reasoning_content = reasoning\n }\n oaMessages.push(msg)\n }\n }\n\n const body: Record<string, unknown> = {\n model,\n max_tokens: maxTokens,\n messages: oaMessages,\n tools: tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.input_schema,\n },\n })),\n tool_choice: \"auto\",\n }\n if (options?.temperature !== undefined) body.temperature = options.temperature\n if (options?.toolChoice) {\n body.tool_choice = { type: \"function\", function: { name: options.toolChoice.name } }\n }\n if (options?.responseFormat) {\n body.response_format = {\n type: \"json_schema\",\n json_schema: {\n name: options.responseFormat.name,\n schema: options.responseFormat.schema,\n strict: true,\n },\n }\n }\n if (options?.logprobs?.enabled) {\n body.logprobs = true\n body.top_logprobs = options.logprobs.topK\n }\n return body\n }\n\n async *stream(\n messages: GenerationMessage[],\n options?: ProviderOptions,\n ): AsyncIterable<StreamEvent> {\n const model = options?.model || process.env.OPENAI_MODEL || DEFAULT_MODEL\n const maxTokens = options?.maxTokens || DEFAULT_MAX_TOKENS\n\n const oaMessages = messages.map((m) => ({ role: m.role, content: m.content }))\n\n const body: Record<string, unknown> = {\n model,\n max_tokens: maxTokens,\n messages: oaMessages,\n tools: this.legacyToolsAsOpenAI(),\n stream: true,\n stream_options: { include_usage: true },\n }\n if (options?.temperature !== undefined) body.temperature = options.temperature\n\n let res: Response\n try {\n res = await fetch(`${this.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(this.maybeDeepseekExtras(body)),\n })\n } catch (err: any) {\n yield { type: \"error\", error: `OpenAI-compat stream init failed: ${err.message}` }\n return\n }\n\n if (!res.ok) {\n const errText = await res.text().catch(() => \"\")\n yield {\n type: \"error\",\n error: `OpenAI-compat API error (${res.status}): ${errText.slice(0, 500)}`,\n }\n return\n }\n\n const reader = res.body?.getReader()\n if (!reader) {\n yield { type: \"error\", error: \"No response body on OpenAI-compat stream\" }\n return\n }\n\n // Same SSE parsing approach as ClaudeProvider.stream — read chunks, split\n // on lines, accumulate tool_calls by index. Tool args arrive as\n // many small string fragments and must be joined before JSON.parse.\n const decoder = new TextDecoder()\n let buffer = \"\"\n let content = \"\"\n let followUp: string | undefined\n let tokensUsed = 0\n const files: GeneratedFile[] = []\n interface ToolAcc { id: string; name: string; argumentsRaw: string }\n const toolAcc: Record<number, ToolAcc> = {}\n let activeToolEmittedIdx: Record<number, boolean> = {}\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split(\"\\n\")\n buffer = lines.pop() || \"\"\n\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) continue\n const data = line.slice(6).trim()\n if (data === \"[DONE]\") continue\n\n let chunk: any\n try { chunk = JSON.parse(data) } catch { continue }\n const choice = chunk.choices?.[0]\n const delta = choice?.delta\n\n // Reasoning deltas (DeepSeek V4 thinking mode). Emit as a\n // separate event so the consumer can render them inline as\n // the agent thinks, without polluting `content`. The high-\n // level stream() path doesn't carry reasoning into the\n // final `GenerationResult` (it's not part of the visible\n // answer) — only generateRawStream does, so the agentic\n // round-trip can echo it back.\n if (typeof delta?.reasoning_content === \"string\" && delta.reasoning_content) {\n yield { type: \"thinking_delta\", text: delta.reasoning_content }\n }\n\n // Text deltas — stream to caller and accumulate.\n if (typeof delta?.content === \"string\" && delta.content) {\n content += delta.content\n yield { type: \"text_delta\", text: delta.content }\n }\n\n // Tool call deltas — accumulate per index. Emit start once per\n // tool, emit delta fragments as input_json comes in.\n if (Array.isArray(delta?.tool_calls)) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index\n if (idx == null) continue\n const acc = (toolAcc[idx] ||= { id: \"\", name: \"\", argumentsRaw: \"\" })\n if (tc.id) acc.id = tc.id\n if (tc.function?.name) acc.name = tc.function.name\n if (tc.function?.arguments) acc.argumentsRaw += tc.function.arguments\n\n if (acc.id && acc.name && !activeToolEmittedIdx[idx]) {\n activeToolEmittedIdx[idx] = true\n yield { type: \"tool_use_start\", name: acc.name, id: acc.id }\n }\n if (activeToolEmittedIdx[idx] && tc.function?.arguments) {\n yield { type: \"tool_use_delta\", json: tc.function.arguments }\n }\n }\n }\n\n // Usage chunk (OpenAI sends a final chunk with `usage` when\n // stream_options.include_usage=true; DeepSeek/others may not).\n if (chunk.usage) {\n tokensUsed =\n (chunk.usage.prompt_tokens || 0) + (chunk.usage.completion_tokens || 0)\n }\n }\n }\n } catch (err: any) {\n yield { type: \"error\", error: `OpenAI-compat stream read failed: ${err.message}` }\n return\n }\n\n // Finalize tool_calls: parse the joined arguments JSON and map\n // create_files / ask_user the same way ClaudeProvider does.\n for (const acc of Object.values(toolAcc)) {\n if (!acc.name) continue\n yield { type: \"tool_use_end\", name: acc.name }\n try {\n const input = acc.argumentsRaw ? JSON.parse(acc.argumentsRaw) : {}\n if (acc.name === \"create_files\" && Array.isArray(input.files)) {\n files.push(...(input.files as GeneratedFile[]))\n if (typeof input.summary === \"string\" && input.summary.trim()) {\n content += (content ? \"\\n\" : \"\") + input.summary\n }\n } else if (acc.name === \"ask_user\" && typeof input.question === \"string\") {\n followUp = input.question\n if (Array.isArray(input.options) && input.options.length) {\n followUp += `\\nOptions: ${input.options.join(\", \")}`\n }\n }\n } catch {\n // Malformed tool args — surface as missing, don't crash the stream.\n }\n }\n\n yield { type: \"done\", result: { content, files, followUp, tokensUsed } }\n }\n\n // --- helpers ---\n\n private async callApi(body: Record<string, unknown>, abortSignal?: AbortSignal): Promise<OpenAIChatResponse> {\n const res = await fetch(`${this.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(this.maybeDeepseekExtras(body)),\n signal: abortSignal as any,\n })\n if (!res.ok) {\n const errorText = await res.text().catch(() => \"\")\n throw new Error(`OpenAI-compatible API error (${res.status}) ${this.baseUrl}: ${errorText.slice(0, 500)}`)\n }\n return (await res.json()) as OpenAIChatResponse\n }\n\n /**\n * DeepSeek v4 enables \"thinking mode\" by default — the model emits a\n * `reasoning_content` block that the API expects to be echoed back on\n * the next request. The agentic loop now handles that round-trip\n * (assistant turns with a `reasoning` content block get folded into\n * `msg.reasoning_content` in the next request), so we no longer need\n * to globally disable it. Operator can still opt out per provider via\n * `providers.<name>.thinking: false` in agentx.json — the constructor\n * resolves `this.thinkingEnabled` and we only emit `enable_thinking:\n * false` when explicitly disabled.\n */\n private maybeDeepseekExtras(body: Record<string, unknown>): Record<string, unknown> {\n if (this.thinkingEnabled === null) return body // not a thinking-mode backend\n if (this.thinkingEnabled === false) return { ...body, enable_thinking: false }\n return body // thinking ON — DeepSeek's default, no extra flag needed\n }\n\n private parseHighLevelResponse(response: OpenAIChatResponse): GenerationResult {\n const choice = response.choices?.[0]\n const message = choice?.message\n const files: GeneratedFile[] = []\n let content = message?.content || \"\"\n let followUp: string | undefined\n\n // Map legacy tools (create_files, ask_user) the same way ClaudeProvider\n // does — these are the only tools getLegacyTools() exposes today.\n for (const tc of message?.tool_calls || []) {\n let parsedArgs: any = {}\n try {\n parsedArgs = JSON.parse(tc.function.arguments || \"{}\")\n } catch {\n /* ignore malformed tool args */\n }\n if (tc.function.name === \"create_files\" && Array.isArray(parsedArgs.files)) {\n files.push(...parsedArgs.files)\n if (typeof parsedArgs.summary === \"string\" && parsedArgs.summary.trim()) {\n content += (content ? \"\\n\" : \"\") + parsedArgs.summary\n }\n } else if (tc.function.name === \"ask_user\" && typeof parsedArgs.question === \"string\") {\n followUp = parsedArgs.question\n if (Array.isArray(parsedArgs.options) && parsedArgs.options.length) {\n followUp += `\\nOptions: ${parsedArgs.options.join(\", \")}`\n }\n }\n }\n\n const usage = response.usage\n return {\n content,\n files,\n followUp,\n tokensUsed: usage ? (usage.prompt_tokens || 0) + (usage.completion_tokens || 0) : undefined,\n }\n }\n\n private parseRawResponse(response: OpenAIChatResponse): RawGenerationResult {\n const choice = response.choices?.[0]\n const message = choice?.message\n const blocks: ContentBlock[] = []\n\n // Reasoning_content goes FIRST so the order matches what the\n // upstream returned (DeepSeek emits reasoning then content). The\n // agentic loop preserves block order when round-tripping.\n if (message?.reasoning_content) {\n blocks.push({ type: \"reasoning\", text: message.reasoning_content })\n }\n if (message?.content) {\n blocks.push({ type: \"text\", text: message.content })\n }\n for (const tc of message?.tool_calls || []) {\n let input: Record<string, unknown> = {}\n try {\n input = tc.function.arguments ? JSON.parse(tc.function.arguments) : {}\n } catch {\n // Malformed JSON — surface as empty input rather than crashing the loop.\n }\n blocks.push({ type: \"tool_use\", id: tc.id, name: tc.function.name, input })\n }\n\n // Translate OpenAI finish_reason → Anthropic stop_reason vocabulary.\n let stop_reason: RawGenerationResult[\"stop_reason\"] = \"end_turn\"\n switch (choice?.finish_reason) {\n case \"tool_calls\":\n case \"function_call\":\n stop_reason = \"tool_use\"\n break\n case \"length\":\n stop_reason = \"max_tokens\"\n break\n case \"stop\":\n case null:\n case undefined:\n default:\n stop_reason = \"end_turn\"\n }\n\n const usage = response.usage\n return {\n content: blocks,\n stop_reason,\n usage: {\n input_tokens: usage?.prompt_tokens || 0,\n output_tokens: usage?.completion_tokens || 0,\n },\n }\n }\n\n private legacyToolsAsOpenAI() {\n // ClaudeProvider passes Anthropic-shaped legacy tools; translate to OpenAI's\n // function-tool shape so generate() still surfaces create_files / ask_user.\n return getLegacyTools().map((t: any) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.input_schema,\n },\n }))\n }\n}\n","// --- Demo provider: canned replies, real protocol ---\n//\n// Powers `agentx demo` — a zero-key walkthrough where every daemon,\n// mesh hop, ledger row, and dashboard view is real and only the LLM is\n// replaced by a scripted transcript. The provider reads a script file\n// (path in AGENTX_DEMO_SCRIPT) and answers each request with the first\n// step whose `match` regex hits the latest user message, streamed with\n// human-ish pacing so the live views have something to show.\n//\n// Deliberately boring: no tools, no files, one text block per turn.\n// The point of the demo is the plumbing around the model, not the model.\n\nimport { readFileSync } from \"fs\"\nimport type {\n AgentProvider,\n GenerationMessage,\n GenerationResult,\n ProviderOptions,\n StreamEvent,\n AnthropicMessage,\n RawGenerationResult,\n RawStreamEvent,\n} from \"./types\"\n\ninterface DemoStep {\n /** Regex tested (case-insensitive) against the latest user message. */\n match: string\n /** Optional \"thinking\" text streamed as thinking_delta before the reply. */\n thinking?: string\n reply: string\n /** Pause before the first token. Default 700ms. */\n delayMs?: number\n /** Pause between streamed chunks. Default 35ms. */\n chunkMs?: number\n}\n\ninterface DemoScript {\n steps: DemoStep[]\n fallback?: Pick<DemoStep, \"reply\" | \"thinking\" | \"delayMs\" | \"chunkMs\">\n}\n\nconst DEFAULT_FALLBACK: DemoScript[\"fallback\"] = {\n reply:\n \"This is demo mode — I answer from a script, not a live model. \" +\n \"Run `agentx setup` to connect a real provider.\",\n}\n\nfunction loadScript(): DemoScript {\n const path = process.env.AGENTX_DEMO_SCRIPT\n if (!path) return { steps: [], fallback: DEFAULT_FALLBACK }\n try {\n const parsed = JSON.parse(readFileSync(path, \"utf-8\")) as DemoScript\n return {\n steps: Array.isArray(parsed.steps) ? parsed.steps : [],\n fallback: parsed.fallback || DEFAULT_FALLBACK,\n }\n } catch (e: any) {\n return {\n steps: [],\n fallback: { reply: `Demo script unreadable (${e.message}) — check AGENTX_DEMO_SCRIPT.` },\n }\n }\n}\n\nfunction latestUserText(messages: Array<{ role: string; content: unknown }>): string {\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].role !== \"user\") continue\n const c = messages[i].content\n if (typeof c === \"string\") return c\n if (Array.isArray(c)) {\n return c\n .map((b: any) => (b?.type === \"text\" ? b.text : b?.type === \"tool_result\" ? b.content : \"\"))\n .filter(Boolean)\n .join(\"\\n\")\n }\n }\n return \"\"\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) return reject(new Error(\"aborted\"))\n const t = setTimeout(resolve, ms)\n signal?.addEventListener(\"abort\", () => { clearTimeout(t); reject(new Error(\"aborted\")) }, { once: true })\n })\n}\n\n/** Split into word-ish chunks so streaming looks like generation, not a paste. */\nfunction chunks(text: string): string[] {\n return text.match(/\\S+\\s*/g) || [text]\n}\n\nconst approxTokens = (s: string) => Math.max(1, Math.round(s.length / 4))\n\nexport class DemoProvider implements AgentProvider {\n name = \"demo\"\n private script: DemoScript\n\n constructor() {\n this.script = loadScript()\n }\n\n private pick(userText: string): Required<Pick<DemoStep, \"reply\" | \"delayMs\" | \"chunkMs\">> & Pick<DemoStep, \"thinking\"> {\n // The orchestrator prepends conversation history to the task text, so\n // an early scene's trigger phrase stays present in every later turn.\n // Prefer the step whose regex matches LATEST in the text — the newest\n // part of the conversation wins, which is how a real model would read it.\n let best: DemoStep | undefined\n let bestIndex = -1\n for (const step of this.script.steps) {\n try {\n const re = new RegExp(step.match, \"ig\")\n let m: RegExpExecArray | null\n let last = -1\n while ((m = re.exec(userText)) !== null) {\n last = m.index\n if (m.index === re.lastIndex) re.lastIndex++ // zero-width guard\n }\n if (last > bestIndex) {\n bestIndex = last\n best = step\n }\n } catch { /* bad regex in a step — skip it */ }\n }\n if (best) {\n return { reply: best.reply, thinking: best.thinking, delayMs: best.delayMs ?? 700, chunkMs: best.chunkMs ?? 35 }\n }\n const f = this.script.fallback || DEFAULT_FALLBACK\n return { reply: f!.reply, thinking: f!.thinking, delayMs: f!.delayMs ?? 700, chunkMs: f!.chunkMs ?? 35 }\n }\n\n async generate(messages: GenerationMessage[], options?: ProviderOptions): Promise<GenerationResult> {\n const step = this.pick(latestUserText(messages))\n await sleep(step.delayMs, options?.abortSignal)\n return { content: step.reply, files: [], tokensUsed: approxTokens(step.reply) }\n }\n\n async *stream(messages: GenerationMessage[], options?: ProviderOptions): AsyncIterable<StreamEvent> {\n const step = this.pick(latestUserText(messages))\n await sleep(step.delayMs, options?.abortSignal)\n if (step.thinking) {\n for (const c of chunks(step.thinking)) {\n yield { type: \"thinking_delta\", text: c }\n await sleep(step.chunkMs, options?.abortSignal)\n }\n }\n for (const c of chunks(step.reply)) {\n yield { type: \"text_delta\", text: c }\n await sleep(step.chunkMs, options?.abortSignal)\n }\n yield { type: \"done\", result: { content: step.reply, files: [], tokensUsed: approxTokens(step.reply) } }\n }\n\n async generateRaw(\n messages: AnthropicMessage[],\n _systemPrompt: string,\n _tools: Array<{ name: string; description: string; input_schema: Record<string, unknown> }>,\n options?: ProviderOptions,\n ): Promise<RawGenerationResult> {\n const step = this.pick(latestUserText(messages))\n await sleep(step.delayMs, options?.abortSignal)\n return {\n content: [{ type: \"text\", text: step.reply }],\n stop_reason: \"end_turn\",\n usage: { input_tokens: approxTokens(latestUserText(messages)), output_tokens: approxTokens(step.reply) },\n }\n }\n\n async *generateRawStream(\n messages: AnthropicMessage[],\n _systemPrompt: string,\n _tools: Array<{ name: string; description: string; input_schema: Record<string, unknown> }>,\n options?: ProviderOptions,\n ): AsyncIterable<RawStreamEvent> {\n const step = this.pick(latestUserText(messages))\n await sleep(step.delayMs, options?.abortSignal)\n if (step.thinking) {\n for (const c of chunks(step.thinking)) {\n yield { type: \"thinking_delta\", text: c }\n await sleep(step.chunkMs, options?.abortSignal)\n }\n }\n for (const c of chunks(step.reply)) {\n yield { type: \"text_delta\", text: c }\n await sleep(step.chunkMs, options?.abortSignal)\n }\n yield {\n type: \"raw_result\",\n result: {\n content: [{ type: \"text\", text: step.reply }],\n stop_reason: \"end_turn\",\n usage: { input_tokens: approxTokens(latestUserText(messages)), output_tokens: approxTokens(step.reply) },\n },\n }\n }\n}\n","import type { AgentProvider } from \"./types\"\nimport { ClaudeProvider } from \"./claude\"\nimport { ClaudeCodeProvider } from \"./claude-code\"\nimport { OpenAIProvider } from \"./openai\"\nimport { DemoProvider } from \"./demo\"\nimport { loadAuthConfig } from \"@/utils/auth-store\"\n\n// `deepseek` is a label on top of the OpenAI-compatible provider — it\n// resolves to OpenAIProvider with the DeepSeek baseUrl + DEEPSEEK_API_KEY\n// so users can declare `provider: \"deepseek\"` on an agent without having to\n// also fiddle with OPENAI_BASE_URL. Same pattern for any other preset.\nexport type ProviderName = \"claude-code\" | \"claude\" | \"openai\" | \"deepseek\" | \"ollama\" | \"demo\" | \"custom\"\n\nconst DEEPSEEK_PRESET = {\n baseUrl: \"https://api.deepseek.com/v1\",\n envKey: \"DEEPSEEK_API_KEY\",\n}\n\nexport interface CreateProviderOptions {\n /** Toggle DeepSeek thinking-mode (`reasoning_content` blocks). Default\n * `true` for DeepSeek baseUrls. Wire this from\n * `providers.<name>.thinking` in agentx.json. */\n thinking?: boolean\n}\n\nexport function createProvider(\n name: ProviderName = \"claude-code\",\n apiKey?: string,\n opts: CreateProviderOptions = {},\n): AgentProvider {\n // Auto-detect provider from stored config when using the default\n let resolvedName = name\n if (name === \"claude-code\" && !apiKey) {\n const stored = loadAuthConfig()\n if (stored) {\n resolvedName = stored.provider\n }\n }\n\n switch (resolvedName) {\n case \"claude-code\":\n return new ClaudeCodeProvider()\n case \"claude\":\n return new ClaudeProvider(apiKey)\n case \"openai\":\n // OpenAI-compatible. Defaults to api.openai.com/v1 + OPENAI_API_KEY;\n // override the host via OPENAI_BASE_URL so the same class talks to\n // any compatible backend (vLLM, OpenRouter, Together, llama.cpp).\n return new OpenAIProvider(apiKey, undefined, { thinking: opts.thinking })\n case \"deepseek\":\n // Convenience preset — forces the DeepSeek baseUrl and pulls the key\n // from DEEPSEEK_API_KEY (falls back to apiKey arg or OPENAI_API_KEY).\n return new OpenAIProvider(\n apiKey || process.env[DEEPSEEK_PRESET.envKey] || process.env.OPENAI_API_KEY,\n DEEPSEEK_PRESET.baseUrl,\n { thinking: opts.thinking },\n )\n case \"demo\":\n // Scripted provider behind `agentx demo` — canned replies, real\n // daemons/mesh/ledger. Never selected implicitly.\n return new DemoProvider()\n case \"ollama\":\n throw new Error(\n \"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\",\n )\n default:\n throw new Error(`Unknown provider: ${resolvedName}. Supported: claude-code, claude, openai, deepseek`)\n }\n}\n\nexport { ClaudeProvider } from \"./claude\"\nexport { ClaudeCodeProvider } from \"./claude-code\"\nexport { OpenAIProvider } from \"./openai\"\nexport type {\n AgentProvider,\n GenerationMessage,\n GenerationResult,\n GeneratedFile,\n ProviderOptions,\n StreamEvent,\n AnthropicMessage,\n ContentBlock,\n RawGenerationResult,\n} from \"./types\"\n"],"mappings":"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QACN,MAAO,CACL,KAAM,SACN,WAAY,CACV,KAAM,CACJ,KAAM,SACN,YACE,wEACJ,EACA,QAAS,CACP,KAAM,SACN,YAAa,8BACf,EACA,SAAU,CACR,KAAM,SACN,YAAa,mCACf,EACA,YAAa,CACX,KAAM,SACN,YAAa,0CACf,CACF,EACA,SAAU,CAAC,OAAQ,SAAS,CAC9B,CACF,EACA,QAAS,CACP,KAAM,SACN,YAAa,sCACf,CACF,EACA,SAAU,CAAC,OAAO,CACpB,EACA,WAAY,YACd,EACA,CACE,KAAM,WACN,YACE,mKACF,aAAc,CACZ,KAAM,SACN,WAAY,CACV,SAAU,CACR,KAAM,SACN,YAAa,8BACf,EACA,QAAS,CACP,KAAM,QACN,MAAO,CAAE,KAAM,QAAS,EACxB,YAAa,uCACf,CACF,EACA,SAAU,CAAC,UAAU,CACvB,EACA,WAAY,MACd,EACA,CACE,KAAM,YACN,YACE,wJACF,aAAc,CACZ,KAAM,SACN,WAAY,CACV,KAAM,CACJ,KAAM,SACN,YAAa,sCACf,EACA,UAAW,CACT,KAAM,SACN,YACE,wEACJ,CACF,EACA,SAAU,CAAC,MAAM,CACnB,EACA,WAAY,WACd,EACA,CACE,KAAM,eACN,YACE,mLACF,aAAc,CACZ,KAAM,SACN,WAAY,CACV,QAAS,CACP,KAAM,SACN,YACE,6DACJ,EACA,cAAe,CACb,KAAM,SACN,YACE,wEACJ,EACA,YAAa,CACX,KAAM,SACN,YAAa,mDACf,CACF,EACA,SAAU,CAAC,SAAS,CACtB,EACA,WAAY,MACd,EACA,CACE,KAAM,iBACN,YACE,qFACF,aAAc,CACZ,KAAM,SACN,WAAY,CACV,KAAM,CACJ,KAAM,SACN,YACE,oEACJ,EACA,UAAW,CACT,KAAM,UACN,YAAa,mCACf,EACA,UAAW,CACT,KAAM,SACN,YAAa,kDACf,CACF,CACF,EACA,WAAY,MACd,EACA,CACE,KAAM,cACN,YACE,wJACF,aAAc,CACZ,KAAM,SACN,WAAY,CACV,QAAS,CACP,KAAM,SACN,YAAa,8BACf,EACA,QAAS,CACP,KAAM,SACN,YACE,uDACJ,C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","names":["existsSync","readFileSync","writeFileSync","mkdirSync","path","os","chalk","prompts","loadAuthConfig","AUTH_FILE","data","saveAuthConfig","config","AUTH_DIR","resolveToken","explicitKey","type","envOAuth","envClaudeCodeOAuth","envApiKey","stored","homeDir","storePaths","t","readTokenFromAuthProfiles","filePath","fallbackToken","id","cred","handleApiKey","envKey","preview","useExisting","apiKey","v","handleSetupToken","logger","boxWidth","line1","line2","token","tokenName","selectAuthMethod","provider","method","selectModel","choices","ANTHROPIC_MODELS","m","current","label","modelId","runModelSetup","auth","ensureCredentials","init_auth_store","__esmMin","init_logger","getAnthropicTools","enabledTools","TOOL_DEFINITIONS","name","description","input_schema","getLegacyTools","formatToolsForSystemPrompt","agenticTools","lines","tool","ALL_TOOL_NAMES","init_definitions","__esmMin","t","wrapSystemForCache","systemPrompt","CACHE_MIN_CHARS","DEFAULT_MODEL","DEFAULT_MAX_TOKENS","ClaudeProvider","init_claude","__esmMin","init_auth_store","init_definitions","apiKey","resolved","resolveToken","messages","options","model","maxTokens","systemMsg","m","conversationMsgs","body","getLegacyTools","response","tools","block","headers","res","errorText","reader","decoder","buffer","files","content","followUp","tokensUsed","activeTool","inferFollowUpFromText","text","cleaned","lines","tail","tailText","isIntro","l","startIdx","i","out","t","candidate","done","value","line","data","event","input","err","errText","blocks","activeBlockIdx","stopReason","inputTokens","outputTokens","cb","raw","execa","DEFAULT_MODEL","DEFAULT_MAX_TOKENS","CLI_MODEL_ALIASES","ClaudeCodeProvider","init_claude_code","__esmMin","init_auth_store","init_definitions","stored","loadAuthConfig","resolved","resolveToken","messages","options","systemPrompt","tools","model","maxTokens","body","headers","res","errorText","response","block","cliModel","systemMsg","m","prompt","args","env","result","err","output","json","e","conversationMsgs","getLegacyTools","child","fullContent","stderr","fatalError","chunk","decoder","readable","lines","line","event","files","followUp","reader","buffer","content","tokensUsed","activeTool","done","value","data","input","stdout","parsed","inferred","text","pattern","match","filePath","cleaned","tail","tailText","isIntro","l","startIdx","i","out","t","candidate","DEFAULT_MODEL","DEFAULT_MAX_TOKENS","OpenAIProvider","init_openai","__esmMin","init_definitions","apiKey","baseUrl","opts","isDeepseek","messages","options","model","maxTokens","oaMessages","body","data","systemPrompt","tools","res","err","errText","reader","onAbortCancelReader","decoder","buffer","textOut","reasoningOut","inputTokens","outputTokens","finishReason","toolAcc","done","value","lines","line","chunk","choice","delta","tc","idx","acc","blocks","input","stop_reason","m","toolResults","b","textParts","tr","toolUses","text","reasoning","msg","tu","t","content","followUp","tokensUsed","files","activeToolEmittedIdx","abortSignal","errorText","response","message","parsedArgs","usage","getLegacyTools","readFileSync","loadScript","path","DEFAULT_FALLBACK","parsed","latestUserText","messages","i","c","b","sleep","ms","signal","resolve","reject","t","chunks","text","approxTokens","DemoProvider","init_demo","__esmMin","s","userText","best","bestIndex","step","re","m","last","f","options","_systemPrompt","_tools","createProvider","name","apiKey","opts","resolvedName","stored","loadAuthConfig","ClaudeCodeProvider","ClaudeProvider","OpenAIProvider","DEEPSEEK_PRESET","DemoProvider","init_providers","__esmMin","init_claude","init_claude_code","init_openai","init_demo","init_auth_store"]}
|