agentix-cli 0.127.0 → 0.129.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/dist/{App-FF66N2KH.js → App-G37JNRBW.js} +2 -2
- package/dist/{ChatApp-HMHQZVVD.js → ChatApp-NCKC7C3L.js} +2 -2
- package/dist/absorb-eval-ZCWHWKAD.js +2 -0
- package/dist/{agent-UAWDO3I2.js → agent-LJ4SUQCC.js} +2 -2
- package/dist/{board-dashboard-Y2OECKDG.js → board-dashboard-LZJT4YWV.js} +251 -235
- package/dist/board-dashboard-LZJT4YWV.js.map +1 -0
- package/dist/{chunk-NUSROFTJ.js → chunk-4FMZTM3W.js} +2 -2
- package/dist/chunk-4O4GZBKZ.js +4 -0
- package/dist/chunk-4O4GZBKZ.js.map +1 -0
- package/dist/{chunk-I4DGMFQG.js → chunk-4ZFLYY5P.js} +2 -2
- package/dist/chunk-A347YHEW.js +4 -0
- package/dist/chunk-A347YHEW.js.map +1 -0
- package/dist/chunk-AMW2R676.js +36 -0
- package/dist/chunk-AMW2R676.js.map +1 -0
- package/dist/{chunk-HNBW5Q47.js → chunk-AOFTTIZZ.js} +2 -2
- package/dist/{chunk-O6FP3LPC.js → chunk-ARSVKSC4.js} +2 -2
- package/dist/{chunk-EHLTZ6IB.js → chunk-BCUR2TJ7.js} +2 -2
- package/dist/{chunk-PH43FUU7.js → chunk-BWSB7NOX.js} +2 -2
- package/dist/{chunk-QWQOI4G4.js → chunk-CDLJOGVZ.js} +31 -31
- package/dist/chunk-CDLJOGVZ.js.map +1 -0
- package/dist/{chunk-COWAAE54.js → chunk-CPMQZ6Z7.js} +2 -2
- package/dist/{chunk-YV22EOGL.js → chunk-DVR6PFCJ.js} +2 -2
- package/dist/chunk-EOLEKSN6.js +54 -0
- package/dist/chunk-EOLEKSN6.js.map +1 -0
- package/dist/{chunk-VBJTGTF5.js → chunk-I3RAUJCD.js} +2 -2
- package/dist/chunk-M7IJVOJA.js +55 -0
- package/dist/chunk-M7IJVOJA.js.map +1 -0
- package/dist/{chunk-6W74CHNW.js → chunk-MEFPXHQJ.js} +13 -13
- package/dist/chunk-MEFPXHQJ.js.map +1 -0
- package/dist/chunk-PVUNDNT3.js +17 -0
- package/dist/chunk-PVUNDNT3.js.map +1 -0
- package/dist/{chunk-3KYZOC7N.js → chunk-R6UCPHUD.js} +2 -2
- package/dist/{chunk-CKYPQMUD.js → chunk-SCC7HBFZ.js} +2 -2
- package/dist/{chunk-56KNKUFF.js → chunk-VD7IO653.js} +3 -3
- package/dist/{chunk-56KNKUFF.js.map → chunk-VD7IO653.js.map} +1 -1
- package/dist/{chunk-XYT6XY7G.js → chunk-VJRITDSQ.js} +2 -2
- package/dist/chunk-X5JTG52Q.js +6 -0
- package/dist/chunk-X5JTG52Q.js.map +1 -0
- package/dist/{chunk-LTH3AYXC.js → chunk-XIA2ACKX.js} +2 -2
- package/dist/{chunk-73WQ42PO.js → chunk-XOQNDWVW.js} +2 -2
- package/dist/{chunk-XX5QKBX4.js → chunk-XZN7QBRH.js} +2 -2
- package/dist/{chunk-HYRBBH6T.js → chunk-YHD4PHFX.js} +240 -240
- package/dist/chunk-YHD4PHFX.js.map +1 -0
- package/dist/{chunk-4WZGZ2Z6.js → chunk-Z5CBUZIW.js} +2 -2
- package/dist/{chunk-EJT3F6QM.js → chunk-ZF5U5KPB.js} +13 -13
- package/dist/chunk-ZF5U5KPB.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/{client-2VVRJ3UF.js → client-A5OK3IFO.js} +2 -2
- package/dist/config-DQ5SILHX.js +2 -0
- package/dist/{config-mutate-47WZDZBO.js → config-mutate-62FCJ3S6.js} +2 -2
- package/dist/config-mutator-3ZL5YQSO.js +2 -0
- package/dist/contributions-L2YS4AH2.js +57 -0
- package/dist/contributions-L2YS4AH2.js.map +1 -0
- package/dist/{doctor-Q3QNZVLC.js → doctor-7TPSMMFA.js} +2 -2
- package/dist/{follow-up-tool-GKZVG4L2.js → follow-up-tool-FKWIRFPW.js} +2 -2
- package/dist/{hub-DNPINTIF.js → hub-EU5ECAJB.js} +2 -2
- package/dist/index.d.ts +301 -0
- package/dist/index.js +1 -1
- package/dist/note-reader-LPPIYYLT.js +8 -0
- package/dist/note-reader-LPPIYYLT.js.map +1 -0
- package/dist/{notes-YLTNRMB5.js → notes-2VC47RCK.js} +2 -2
- package/dist/program-UTSXNAHM.js +743 -0
- package/dist/program-UTSXNAHM.js.map +1 -0
- package/dist/{promote-PETKX7KR.js → promote-XBDWCHLU.js} +2 -2
- package/dist/query-UI6GQEL7.js +2 -0
- package/dist/{registry-2XDO53AJ.js → registry-JW6ETTBA.js} +2 -2
- package/dist/{request-planner-A3WJNPXO.js → request-planner-SEXYQN7D.js} +2 -2
- package/dist/{review-candidates-A6ID2RDX.js → review-candidates-PIJWPPHQ.js} +2 -2
- package/dist/{rotation-memo-6UW6DTBQ.js → rotation-memo-7VLREGS6.js} +2 -2
- package/dist/{routing-NPP3MEUW.js → routing-2V3Y6ZR5.js} +2 -2
- package/dist/schedule-tool-KFZ27JTH.js +2 -0
- package/dist/{scheduler-T6VLBM3U.js → scheduler-SVZKDKJV.js} +2 -2
- package/dist/score-KDNIUTNV.js +3 -0
- package/dist/score-KDNIUTNV.js.map +1 -0
- package/dist/{seat-D3DBYTSC.js → seat-C6TMCJWI.js} +2 -2
- package/dist/{select-RFY64RY7.js → select-DP64KWO4.js} +2 -2
- package/dist/{set-enabled-AU66DR5C.js → set-enabled-WCH6FU4N.js} +2 -2
- package/dist/{tool-PCHIVR27.js → tool-TWQRBV4Y.js} +2 -2
- package/dist/{tool-F3YA2ZZQ.js → tool-WUK3ZOWG.js} +2 -2
- package/dist/wiki-4LAJ36XR.js +2 -0
- package/package.json +1 -1
- package/dist/absorb-eval-ERKVVTGG.js +0 -2
- package/dist/board-dashboard-Y2OECKDG.js.map +0 -1
- package/dist/chunk-52SIHG45.js +0 -4
- package/dist/chunk-52SIHG45.js.map +0 -1
- package/dist/chunk-6W74CHNW.js.map +0 -1
- package/dist/chunk-EJT3F6QM.js.map +0 -1
- package/dist/chunk-HYRBBH6T.js.map +0 -1
- package/dist/chunk-PLIT25TH.js +0 -51
- package/dist/chunk-PLIT25TH.js.map +0 -1
- package/dist/chunk-QWQOI4G4.js.map +0 -1
- package/dist/chunk-TJ4P4WW2.js +0 -4
- package/dist/chunk-TJ4P4WW2.js.map +0 -1
- package/dist/chunk-UJXS4MS3.js +0 -49
- package/dist/chunk-UJXS4MS3.js.map +0 -1
- package/dist/chunk-Y27RUOD2.js +0 -54
- package/dist/chunk-Y27RUOD2.js.map +0 -1
- package/dist/config-YSKHOV44.js +0 -2
- package/dist/config-mutator-7DIEQUB5.js +0 -2
- package/dist/program-4QWUOJE3.js +0 -739
- package/dist/program-4QWUOJE3.js.map +0 -1
- package/dist/query-D44BUTH3.js +0 -2
- package/dist/schedule-tool-ZECUQMQK.js +0 -2
- package/dist/wiki-NI3ZPUZS.js +0 -2
- /package/dist/{App-FF66N2KH.js.map → App-G37JNRBW.js.map} +0 -0
- /package/dist/{ChatApp-HMHQZVVD.js.map → ChatApp-NCKC7C3L.js.map} +0 -0
- /package/dist/{absorb-eval-ERKVVTGG.js.map → absorb-eval-ZCWHWKAD.js.map} +0 -0
- /package/dist/{agent-UAWDO3I2.js.map → agent-LJ4SUQCC.js.map} +0 -0
- /package/dist/{chunk-NUSROFTJ.js.map → chunk-4FMZTM3W.js.map} +0 -0
- /package/dist/{chunk-I4DGMFQG.js.map → chunk-4ZFLYY5P.js.map} +0 -0
- /package/dist/{chunk-HNBW5Q47.js.map → chunk-AOFTTIZZ.js.map} +0 -0
- /package/dist/{chunk-O6FP3LPC.js.map → chunk-ARSVKSC4.js.map} +0 -0
- /package/dist/{chunk-EHLTZ6IB.js.map → chunk-BCUR2TJ7.js.map} +0 -0
- /package/dist/{chunk-PH43FUU7.js.map → chunk-BWSB7NOX.js.map} +0 -0
- /package/dist/{chunk-COWAAE54.js.map → chunk-CPMQZ6Z7.js.map} +0 -0
- /package/dist/{chunk-YV22EOGL.js.map → chunk-DVR6PFCJ.js.map} +0 -0
- /package/dist/{chunk-VBJTGTF5.js.map → chunk-I3RAUJCD.js.map} +0 -0
- /package/dist/{chunk-3KYZOC7N.js.map → chunk-R6UCPHUD.js.map} +0 -0
- /package/dist/{chunk-CKYPQMUD.js.map → chunk-SCC7HBFZ.js.map} +0 -0
- /package/dist/{chunk-XYT6XY7G.js.map → chunk-VJRITDSQ.js.map} +0 -0
- /package/dist/{chunk-LTH3AYXC.js.map → chunk-XIA2ACKX.js.map} +0 -0
- /package/dist/{chunk-73WQ42PO.js.map → chunk-XOQNDWVW.js.map} +0 -0
- /package/dist/{chunk-XX5QKBX4.js.map → chunk-XZN7QBRH.js.map} +0 -0
- /package/dist/{chunk-4WZGZ2Z6.js.map → chunk-Z5CBUZIW.js.map} +0 -0
- /package/dist/{client-2VVRJ3UF.js.map → client-A5OK3IFO.js.map} +0 -0
- /package/dist/{config-YSKHOV44.js.map → config-DQ5SILHX.js.map} +0 -0
- /package/dist/{config-mutate-47WZDZBO.js.map → config-mutate-62FCJ3S6.js.map} +0 -0
- /package/dist/{config-mutator-7DIEQUB5.js.map → config-mutator-3ZL5YQSO.js.map} +0 -0
- /package/dist/{doctor-Q3QNZVLC.js.map → doctor-7TPSMMFA.js.map} +0 -0
- /package/dist/{follow-up-tool-GKZVG4L2.js.map → follow-up-tool-FKWIRFPW.js.map} +0 -0
- /package/dist/{hub-DNPINTIF.js.map → hub-EU5ECAJB.js.map} +0 -0
- /package/dist/{notes-YLTNRMB5.js.map → notes-2VC47RCK.js.map} +0 -0
- /package/dist/{promote-PETKX7KR.js.map → promote-XBDWCHLU.js.map} +0 -0
- /package/dist/{query-D44BUTH3.js.map → query-UI6GQEL7.js.map} +0 -0
- /package/dist/{registry-2XDO53AJ.js.map → registry-JW6ETTBA.js.map} +0 -0
- /package/dist/{request-planner-A3WJNPXO.js.map → request-planner-SEXYQN7D.js.map} +0 -0
- /package/dist/{review-candidates-A6ID2RDX.js.map → review-candidates-PIJWPPHQ.js.map} +0 -0
- /package/dist/{rotation-memo-6UW6DTBQ.js.map → rotation-memo-7VLREGS6.js.map} +0 -0
- /package/dist/{routing-NPP3MEUW.js.map → routing-2V3Y6ZR5.js.map} +0 -0
- /package/dist/{schedule-tool-ZECUQMQK.js.map → schedule-tool-KFZ27JTH.js.map} +0 -0
- /package/dist/{scheduler-T6VLBM3U.js.map → scheduler-SVZKDKJV.js.map} +0 -0
- /package/dist/{seat-D3DBYTSC.js.map → seat-C6TMCJWI.js.map} +0 -0
- /package/dist/{select-RFY64RY7.js.map → select-DP64KWO4.js.map} +0 -0
- /package/dist/{set-enabled-AU66DR5C.js.map → set-enabled-WCH6FU4N.js.map} +0 -0
- /package/dist/{tool-PCHIVR27.js.map → tool-TWQRBV4Y.js.map} +0 -0
- /package/dist/{tool-F3YA2ZZQ.js.map → tool-WUK3ZOWG.js.map} +0 -0
- /package/dist/{wiki-NI3ZPUZS.js.map → wiki-4LAJ36XR.js.map} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{b as S,c as O}from"./chunk-
|
|
1
|
+
import{b as S,c as O}from"./chunk-BWSB7NOX.js";import{g as B,i as J}from"./chunk-A347YHEW.js";import{a as I,b as P}from"./chunk-FCPTN6NF.js";import{a as X,b as ue}from"./chunk-7I7IEX4S.js";import{d as F}from"./chunk-QIJLFPWE.js";import{execFile as Ae}from"child_process";import{writeFileSync as ie,mkdirSync as x,existsSync as b,readFileSync as ke}from"fs";import{resolve as v}from"path";var le=["off","shadow","authoritative"],ge={telegram:"INTENT_LEDGER_MODE_TELEGRAM",slack:"INTENT_LEDGER_MODE_SLACK",whatsapp:"INTENT_LEDGER_MODE_WHATSAPP",discord:"INTENT_LEDGER_MODE_DISCORD",gitlab:"INTENT_LEDGER_MODE_GITLAB",github:"INTENT_LEDGER_MODE_GITHUB",workflow:"INTENT_LEDGER_MODE_WORKFLOW",cron:"INTENT_LEDGER_MODE_CRON",mesh:"INTENT_LEDGER_MODE_MESH"},me="INTENT_LEDGER_MODE";function G(i,e=process.env){let t=U(e[ge[i]]);if(t)return t;let n=U(e[me]);return n||"off"}function U(i){if(typeof i!="string")return null;let e=i.trim().toLowerCase();return le.includes(e)?e:null}P();import he from"better-sqlite3";import{existsSync as Ue,mkdirSync as fe}from"fs";import{dirname as pe,resolve as Ee}from"path";var T=class{db;path;constructor(e={}){this.path=Ee(process.cwd(),e.path??".agentx/intent/ledger.sqlite"),fe(pe(this.path),{recursive:!0}),this.db=new he(this.path),this.db.pragma("journal_mode = WAL"),this.db.pragma("synchronous = NORMAL"),this.db.pragma("foreign_keys = ON"),ye(this.db)}close(){this.db.close()}schemaVersion(){return this.db.prepare("SELECT MAX(v) AS v FROM schema_version").get().v??0}recordEvent(e){if(e.sourceEventId!==null){let n=this.findEventBySourceId(e.source,e.sourceEventId);if(n)return n}let t={id:e.id??I(e.ts),ts:e.ts,source:e.source,sourceEventId:e.sourceEventId,project:e.project,subject:e.subject,intent:e.intent,rawJson:e.rawJson};return this.db.prepare(`INSERT INTO intent_events (id, ts, source, source_event_id, project, subject, intent, raw_json)
|
|
2
2
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(t.id,t.ts,t.source,t.sourceEventId,t.project,t.subject,t.intent,t.rawJson),t}findEventBySourceId(e,t){let n=this.db.prepare(`SELECT id, ts, source, source_event_id, project, subject, intent, raw_json
|
|
3
3
|
FROM intent_events WHERE source = ? AND source_event_id = ?`).get(e,t);return n?Y(n):null}getEventById(e){let t=this.db.prepare(`SELECT id, ts, source, source_event_id, project, subject, intent, raw_json
|
|
4
4
|
FROM intent_events WHERE id = ?`).get(e);return t?Y(t):null}recordDecision(e){this.db.prepare(`INSERT INTO intent_decisions (event_id, decided_at, decided_by, agent_id, outcome, reason)
|
|
@@ -125,4 +125,4 @@ ${se(o.block,r.prompt)}`,r.maxOutputTokens),agentId:r.agent,autonomy:r.autonomy,
|
|
|
125
125
|
`);return t.length<=e?t.join(`
|
|
126
126
|
`):t.slice(-e).join(`
|
|
127
127
|
`)}function Xe(i,e,t){return new Promise((n,r)=>{Ae("/bin/sh",["-c",i],{timeout:e,maxBuffer:8*1024*1024,...t?{env:t}:{}},(s,a,o)=>{if(s&&s.killed){r(new Error(`command timed out after ${Math.round(e/1e3)}s`));return}n({stdout:String(a??""),stderr:String(o??""),code:s?typeof s.code=="number"?s.code:1:0})})})}export{T as a,V as b,ot as c,we as d,at as e,ct as f,$ as g,ee as h,G as i,We as j,z as k,Q as l,lt as m,Ce as n,oe as o,ae as p,ce as q,C as r,M as s};
|
|
128
|
-
//# sourceMappingURL=chunk-
|
|
128
|
+
//# sourceMappingURL=chunk-CPMQZ6Z7.js.map
|
|
@@ -48,7 +48,7 @@ The "modified" field is optional and can contain updated values to pass forward.
|
|
|
48
48
|
... (output truncated)`:i;return s.exitCode!==0?{tool_use_id:e.id,content:`Command exited with code ${s.exitCode}:
|
|
49
49
|
${c}`,is_error:!0}:{tool_use_id:e.id,content:c||"(no output)"}}async editFile(e){let t=String(e.input.path||""),o=e.input.edits,n=ge.resolve(this.cwd,t);if(!o||o.length===0)return{tool_use_id:e.id,content:"No edits provided.",is_error:!0};let s=await W.checkFileWrite(t);if(s==="deny")return{tool_use_id:e.id,content:`File write blocked by permissions: ${t}`,is_error:!0};if(s==="skip")return{tool_use_id:e.id,content:`File write skipped (plan mode): ${t}`};if(f.has("pre:file-write")){let a=await f.execute("pre:file-write",{event:"pre:file-write",file:n,cwd:this.cwd});if(a.blocked)return{tool_use_id:e.id,content:a.message||`File edit blocked by pre:file-write hook: ${t}`,is_error:!0}}let i=await re.readFile(n,"utf8"),c=[];for(let a of o)i.includes(a.old_text)?(i=i.replace(a.old_text,a.new_text),c.push(`Replaced: "${a.old_text.slice(0,40)}..."`)):c.push(`Not found: "${a.old_text.slice(0,40)}..."`);return this.options.dryRun||await re.writeFile(n,i,"utf8"),f.has("post:file-write")&&await f.execute("post:file-write",{event:"post:file-write",file:n,fileContent:i,cwd:this.cwd}),{tool_use_id:e.id,content:`Edited ${t}:
|
|
50
50
|
${c.join(`
|
|
51
|
-
`)}`}}async createFiles(e){let t=e.input,o=t.files||[];return{tool_use_id:e.id,content:t.summary||`Queued ${o.length} file(s) for creation.`,files:o}}async spawnAgent(e){let t=String(e.input.agent_id||""),o=String(e.input.prompt||""),n=Number(e.input.timeout_seconds)||300;if(!t||!o)return{tool_use_id:e.id,content:"agent_id and prompt are required.",is_error:!0};try{let{SubAgentManager:s}=await import("./subagent-XY5N7TUU.js"),{getGlobalRegistry:i}=await import("./registry-
|
|
51
|
+
`)}`}}async createFiles(e){let t=e.input,o=t.files||[];return{tool_use_id:e.id,content:t.summary||`Queued ${o.length} file(s) for creation.`,files:o}}async spawnAgent(e){let t=String(e.input.agent_id||""),o=String(e.input.prompt||""),n=Number(e.input.timeout_seconds)||300;if(!t||!o)return{tool_use_id:e.id,content:"agent_id and prompt are required.",is_error:!0};try{let{SubAgentManager:s}=await import("./subagent-XY5N7TUU.js"),{getGlobalRegistry:i}=await import("./registry-JW6ETTBA.js"),c=i();if(!c)return{tool_use_id:e.id,content:"Sub-agent spawning requires the daemon to be running.",is_error:!0};let p=await new s(c).spawn({targetAgentId:t,prompt:o,parentAgentId:"orchestrator",timeout:n*1e3});return p.success?{tool_use_id:e.id,content:`Sub-agent "${t}" completed (${Math.round(p.duration/1e3)}s):
|
|
52
52
|
|
|
53
53
|
${p.content}`}:{tool_use_id:e.id,content:`Sub-agent "${t}" failed: ${p.error}`,is_error:!0}}catch(s){return{tool_use_id:e.id,content:`Failed to spawn sub-agent: ${s.message}`,is_error:!0}}}async askUser(e){let t=String(e.input.question||""),o=e.input.options,n=t;return o?.length&&(n+=`
|
|
54
54
|
Options: ${o.join(", ")}`),{tool_use_id:e.id,content:"Question sent to user.",followUp:n}}};async function Ae(r){let{provider:e,systemPrompt:t,messages:o,providerOptions:n,cwd:s,maxIterations:i=20,enabledTools:c,interactive:a=!0,overwrite:p=!1,dryRun:l=!1,onProgress:d,abortSignal:u}=r,m=u?{...n,abortSignal:u}:n;if(!e.generateRaw)return dt(r);let I=new se(s,{interactive:a,overwrite:p,dryRun:l,acmeContext:r.acmeContext,abortSignal:u}),D=be(c);if(r.acmeContext)for(let g of at)D.push({name:g.name,description:g.description,input_schema:g.input_schema});let E=new Set;if(r.mcpTools?.length)for(let g of r.mcpTools)D.push({name:g.name,description:g.description,input_schema:g.input_schema}),E.add(g.name);let C=o.filter(g=>g.role!=="system").map(g=>({role:g.role,content:g.content})),B=[],G=0,F=0,A=0,O="",j,_=0;for(;_<i;){if(_++,u?.aborted)throw new Error("cancelled");d?.({type:"iteration_start",iteration:_}),b.step(_,`Agentic loop iteration (${D.length} tools available)`);let g,M=!!e.generateRawStream&&!!d;try{if(M){let T=null,U=null,v="";for await(let x of e.generateRawStream(C,t,D,m))x.type==="text_delta"?(v+=x.text,d?.({type:"text_delta",text:x.text})):x.type==="thinking_delta"?d?.({type:"thinking_delta",text:x.text}):x.type==="raw_result"?T=x.result:x.type==="error"&&(U=x.error);if(U&&!T)throw new Error(U);if(!T)throw new Error("generateRawStream returned no raw_result event");g=T,g._streamedText=v}else g=await e.generateRaw(C,t,D,m)}catch(T){if(T.message?.includes("not available"))return dt(r);throw T}G+=g.usage.input_tokens+g.usage.output_tokens,F+=g.usage.input_tokens,A+=g.usage.output_tokens;let P=g._streamedText;for(let T of g.content)T.type==="text"&&(O+=T.text,P===void 0&&d?.({type:"text_delta",text:T.text}));if(P!==void 0&&delete g._streamedText,g.stop_reason==="end_turn"||g.stop_reason==="max_tokens")break;if(g.stop_reason==="tool_use"){let T=g.content.filter(v=>v.type==="tool_use");if(T.length===0)break;C.push({role:"assistant",content:g.content});let U=[];for(let v of T){d?.({type:"tool_call",name:v.name,id:v.id,input:v.input}),b.step(_,`Tool call: ${v.name}`);let x;if(E.has(v.name)&&r.mcpDispatch){let h=await r.mcpDispatch(v.name,v.input);x={tool_use_id:v.id,content:h.content,is_error:h.isError}}else x=await I.execute({name:v.name,id:v.id,input:v.input});d?.({type:"tool_result",name:v.name,id:v.id,content:x.content.slice(0,200),is_error:x.is_error}),x.files?.length&&(B.push(...x.files),d?.({type:"files_created",files:x.files})),x.followUp&&(j=x.followUp),U.push({type:"tool_result",tool_use_id:x.tool_use_id,content:x.content,is_error:x.is_error})}if(C.push({role:"user",content:U}),j)break;continue}break}return d?.({type:"complete",iterations:_,totalTokens:G}),{files:B,content:O,followUp:j,tokensUsed:G,inputTokens:F||void 0,outputTokens:A||void 0,iterations:_}}async function dt(r){let{provider:e,systemPrompt:t,messages:o,providerOptions:n,maxIterations:s=5}=r,c=[{role:"system",content:t+`
|
|
@@ -123,4 +123,4 @@ ${r.projectInstructions}`),r.memoryContext&&o.push(r.memoryContext),o.push(`# Ou
|
|
|
123
123
|
Generate output appropriate for: ${e}. Use the \`create_files\` tool to output all files.`),o.join(`
|
|
124
124
|
|
|
125
125
|
`)}export{qe as a,Vt as b,Yt as c,We as d,ze as e,Ve as f,Ye as g,Pe as h,ee as i,Re as j,le as k,te as l,Tt as m,oe as n,Mt as o,f as p,et as q,tt as r,Me as s,de as t,W as u,ne as v,it as w,Ee as x,$e as y,se as z,mt as A,Zn as B,er as C};
|
|
126
|
-
//# sourceMappingURL=chunk-
|
|
126
|
+
//# sourceMappingURL=chunk-DVR6PFCJ.js.map
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import{b as M,d as B,h as Ge}from"./chunk-BRK6M6LA.js";import{l as U,m as F,n as Ye}from"./chunk-UIBUZ2N3.js";import{a as D,e as Ze}from"./chunk-2QNT5JDS.js";import{a as g,b as Xe}from"./chunk-QIJLFPWE.js";import{z as s}from"zod";var Ve,Je,Qe,et,tt,nt,at,rt,ot,z,H=g(()=>{"use strict";Ve=s.enum(["mon","tue","wed","thu","fri","sat","sun"]),Je=s.object({days:s.array(Ve).default(["mon","tue","wed","thu","fri"]),start:s.string().regex(/^\d{2}:\d{2}$/),end:s.string().regex(/^\d{2}:\d{2}$/),lunch:s.object({start:s.string().regex(/^\d{2}:\d{2}$/),end:s.string().regex(/^\d{2}:\d{2}$/)}).optional()}),Qe=s.object({title:s.string(),responsibilities:s.array(s.string()).default([]),sopPath:s.string().optional(),kpis:s.array(s.string()).default([])}),et=s.object({role:s.string(),reportsTo:s.string().optional(),schedule:Je,utilizationTarget:s.number().min(0).max(1).default(.8)}),tt=s.object({channel:s.string(),chatId:s.string(),accountId:s.string().optional()}),nt=s.discriminatedUnion("type",[s.object({type:s.literal("backlog"),path:s.string().default(".agentx/backlog.md")}),s.object({type:s.literal("gitlab"),projects:s.array(s.string()).default([])}),s.object({type:s.literal("wiki"),path:s.string(),glob:s.string().default("**/*.md")})]),at=s.object({id:s.string(),pm:s.string().optional(),client:s.string().optional()}),rt=s.object({channel:s.string().optional(),chatId:s.string().optional(),username:s.string().optional(),senderId:s.string().optional(),client:s.string(),project:s.string().optional(),displayName:s.string().optional()}),ot=s.object({name:s.string().optional(),kind:s.enum(["client","internal","own"]).optional(),respondWithin:s.string().optional(),standing:s.array(s.string()).default([])}),z=s.object({enabled:s.boolean().default(!1),timezone:s.string().default("UTC"),mainChannel:tt,workSource:nt,roles:s.record(s.string(),Qe).default({}),orgChart:s.record(s.string(),et).default({}),projects:s.array(at).default([]),contactMap:s.array(rt).default([]),clients:s.record(s.string(),ot).default({}),workTickMinutes:s.number().int().min(1).max(60).default(15),idleQueueThreshold:s.number().int().min(0).default(0),standup:s.object({enabled:s.boolean().default(!0),plansDir:s.string().default(".agentx/plans"),maxAgentsPerDay:s.number().int().min(1).max(100).default(20),dryRun:s.boolean().default(!1)}).default({})})});import{z as d}from"zod";function Cn(a,n){let t=new Set(a.labels||[]);if(a.state==="closed"){let o=n.find(i=>i.kind==="closed");if(o)return o.id}for(let o of n)if(o.kind==="scoped-label"&&o.scopedLabel&&t.has(o.scopedLabel))return o.id;for(let o of n)if(o.kind==="label"&&o.mapsToLabel&&t.has(o.mapsToLabel))return o.id;let r=n.find(o=>o.kind==="open-backlog");if(r){let o=r.scopedPrefix+"::";return[...t].some(l=>l.startsWith(o))?null:r.id}return n[0]?.id??null}function On(a,n){let t=[],r=[],o=!1,i=!1;return n.kind==="scoped-label"&&n.scopedLabel?t.push(n.scopedLabel):n.kind==="label"&&n.mapsToLabel?t.push(n.mapsToLabel):n.kind==="closed"&&(o=!0),a&&(a.kind==="scoped-label"&&a.scopedLabel?r.push(a.scopedLabel):a.kind==="label"&&a.mapsToLabel?r.push(a.mapsToLabel):a.kind==="closed"&&n.kind!=="closed"&&(i=!0)),{addLabels:t.length?t:void 0,removeLabels:r.length?r:void 0,closeIssue:o||void 0,reopen:i||void 0}}var it,st,lt,dt,ut,ct,W,mt,K,X=g(()=>{"use strict";it=d.object({name:d.string(),color:d.string().regex(/^#[0-9a-f]{6}$/i).default("#6366f1"),description:d.string().optional()}),st=d.object({id:d.string().regex(/^[a-z0-9_-]+$/,"column id must be lowercase slug"),title:d.string(),kind:d.enum(["open-backlog","scoped-label","closed","label"]).default("label"),mapsToLabel:d.string().optional(),scopedLabel:d.string().optional(),scopedPrefix:d.string().default("Status"),accent:d.string().optional()}),lt=d.object({enabled:d.boolean().default(!0),staleDoingMinutes:d.number().int().min(1).default(45),respectLunchBreak:d.boolean().default(!0),respectSchedule:d.boolean().default(!0),action:d.enum(["badge","notify"]).default("badge")}),dt=d.discriminatedUnion("type",[d.object({type:d.literal("gitlab"),projects:d.array(d.string()).min(1)})]),ut=[{id:"open",title:"Open",kind:"open-backlog",scopedPrefix:"Status",accent:"#6b7280"},{id:"todo",title:"To Do",kind:"scoped-label",scopedLabel:"Status::To Do",scopedPrefix:"Status",accent:"#fb7a35"},{id:"doing",title:"Doing",kind:"scoped-label",scopedLabel:"Status::Doing",scopedPrefix:"Status",accent:"#22c55e"},{id:"onhold",title:"On Hold",kind:"scoped-label",scopedLabel:"Status::On Hold",scopedPrefix:"Status",accent:"#f59e0b"},{id:"review",title:"Review",kind:"scoped-label",scopedLabel:"Status::Review",scopedPrefix:"Status",accent:"#3b82f6"},{id:"closed",title:"Closed",kind:"closed",scopedPrefix:"Status",accent:"#6b7280"}],ct=d.object({id:d.string().regex(/^[a-z0-9_-]+$/,"board id must be lowercase slug"),name:d.string(),source:dt,primaryToolLabel:d.string().optional(),labels:d.array(it).default([]),columns:d.array(st).min(1).default(ut),timeRangeDays:d.number().int().min(1).max(365).default(30),closedWindowDays:d.number().int().min(1).max(365).default(30),reconciliation:lt.default({})}),W=d.array(ct).default([]),mt=d.object({name:d.string(),url:d.string(),dashboardUrl:d.string().optional(),token:d.string().optional(),dashboardToken:d.string().optional()}),K=d.object({enabled:d.boolean().default(!1),port:d.number().int().default(4202),bind:d.string().default("127.0.0.1"),token:d.string().optional(),daemonUrl:d.string().default("http://localhost:18800"),daemons:d.array(mt).default([]),draftAgent:d.string().optional()}).default({})});function xt(a){let n=String(a??"").trim().toLowerCase();if(!n)return{ok:!1,error:"is empty"};let t=n.split("+").map(i=>i.trim());if(t.some(i=>!i))return{ok:!1,error:`"${a}" has an empty part; write it like opt+space`};let r=bt[t[t.length-1]]??t[t.length-1],o=new Set;for(let i of t.slice(0,-1)){let l=gt[i];if(!l)return{ok:!1,error:`"${i}" is not a modifier; use ctrl, opt, shift or cmd`};if(o.has(l))return{ok:!1,error:`"${a}" names ${l} twice`};o.add(l)}return ht(r)?!Z(r)&&!["ctrl","opt","cmd"].some(i=>o.has(i))?{ok:!1,error:`"${a}" needs ctrl, opt or cmd, or it would take that key away from your typing`}:{ok:!0,value:[...ft.filter(i=>o.has(i)),r].join("+")}:{ok:!1,error:`"${r}" is not a key AgentX Voice can use; use a letter, a digit, f1 to f20, or space, period, comma, slash, return, tab`}}function G(a){let n=xt(a);return n.ok?void 0:n.error}function Ln(a){let n={ctrl:"\u2303",opt:"\u2325",shift:"\u21E7",cmd:"\u2318"},t={space:"Space",period:".",comma:",",slash:"/",semicolon:";",quote:"'",minus:"-",equal:"=",leftbracket:"[",rightbracket:"]",backslash:"\\",grave:"`",return:"Return",tab:"Tab"},r=a.split("+"),o=r.pop()??"";return r.map(i=>n[i]??i).join("")+(t[o]??o.toUpperCase())}var gt,ft,pt,bt,Z,ht,w,Y=g(()=>{"use strict";gt={ctrl:"ctrl",control:"ctrl",opt:"opt",option:"opt",alt:"opt",shift:"shift",cmd:"cmd",command:"cmd"},ft=["ctrl","opt","shift","cmd"],pt=["space","period","comma","slash","semicolon","quote","minus","equal","leftbracket","rightbracket","backslash","grave","return","tab"],bt={".":"period",",":"comma","/":"slash",";":"semicolon","'":"quote","-":"minus","=":"equal","`":"grave",enter:"return"},Z=a=>/^f([1-9]|1[0-9]|20)$/.test(a),ht=a=>/^[a-z0-9]$/.test(a)||pt.includes(a)||Z(a);w={talk:"opt+space",stop:"cmd+opt+period",paste:"cmd+opt+v"}});function Q(a){let n=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(a);if(!n)return null;let[t,r,o]=n.slice(1).map(b=>parseInt(b,16)/255),i=Math.max(t,r,o),l=Math.min(t,r,o),u=i-l;return u<.04?null:((i===t?(r-o)/u%6:i===r?(o-t)/u+2:(t-r)/u+4)*60+360)%360}function yt(a){let n=Q(a);if(n===null)return S.find(o=>o.id==="lagoon");let t=S[0],r=360;for(let o of S){let i=Math.abs(o.hue-n),l=Math.min(i,360-i);l<r&&(t=o,r=l)}return t}function $n(a,n=_){let t=l=>S.find(u=>u.id===l),r=t(a?.palette);if(r)return{...r,set:!0};let o=a?.color;return{...o&&Q(o)!==null?yt(o):t(n)??t(_),set:!1}}var S,V,J,O,_,ee=g(()=>{"use strict";S=[{id:"sunrise",label:"Sunrise",hue:18,colors:["#E8505B","#F2726F","#F79A5A","#FBBF4A","#FFE3A3"]},{id:"desert",label:"Desert",hue:36,colors:["#A4492C","#C8683E","#D9905E","#E7B98A","#F6E3C4"]},{id:"forest",label:"Forest",hue:100,colors:["#2F5D34","#4C7D3A","#6FA046","#9CC25E","#D5EBA4"]},{id:"lagoon",label:"Lagoon",hue:172,colors:["#0B6E73","#0E9594","#1FBFB2","#56DCCB","#B8F4EA"]},{id:"ocean",label:"Ocean",hue:205,colors:["#15457E","#1C6BA8","#2B93CF","#5DBBE8","#BFE6FA"]},{id:"dusk",label:"Dusk",hue:268,colors:["#2E2A7A","#5B3E9E","#8C4FB0","#C8649E","#F4A7B9"]},{id:"blossom",label:"Blossom",hue:330,colors:["#A3245B","#CF3F78","#E8699A","#F49BB8","#FFD6E0"]}],V=["orb","character"],J=["off","rarely","sometimes","often"],O=S.map(a=>a.id);_="lagoon"});function te(a){let n=(a.match(/[-ۿ]/g)??[]).length,t=(a.match(/[a-zA-ZÀ-ÿ]/g)??[]).length;if(n&&n>=t)return"ar";let r=0,o=0;for(let i of a.toLowerCase().replace(/[’]/g,"'").match(/[a-zà-ÿœ']+/g)??[])St.has(i)&&r++,kt.has(i)||i.startsWith("l'")||i.startsWith("d'")||i.startsWith("qu'")?o++:wt.test(i)&&(o+=.5);return r===o?null:r>o?"en":"fr"}var St,kt,wt,ne=g(()=>{"use strict";St=new Set("the and is are was were i you he she we they it this that to of in for with not but yes what have has will would can your my".split(" ")),kt=new Set("le la les des du de un une et est sont je tu il elle nous vous ils elles ce cette c'est pas pour que qui avec dans sur au aux mais tr\xE8s oui non merci bonjour votre mon".split(" ")),wt=/[éèêëàâçùûîïôœ]/});function Mn(a,n=j){let t=a;if(t=t.replace(/```[\s\S]*?```/g,". "),t=t.replace(/`[^`]*`/g,""),t=t.replace(/\*\*(.*?)\*\*/g,"$1"),t=t.replace(/__(.*?)__/g,"$1"),t=t.replace(/\*([^*]+)\*/g,"$1"),t=t.replace(/_([^_]+)_/g,"$1"),t=t.replace(/~~(.*?)~~/g,"$1"),t=t.replace(/\[([^\]]+)\]\([^)]+\)/g,"$1"),t=t.replace(/!\[([^\]]*)\]\([^)]+\)/g,"image$1 "),t=t.replace(/^#{1,6}\s+/gm,""),t=t.replace(/^[\s]*[-*+]\s+/gm,". "),t=t.replace(/^[\s]*\d+\.\s+/gm,". "),t=t.replace(/^[-=_]{3,}$/gm,""),t=t.replace(/^>\s*/gm,""),t=t.replace(/https?:\/\/\S+/g,"link"),t=t.replace(/\/\w+(\/\w+)+/g,r=>r.split("/").filter(Boolean).join(" slash ")),t=t.replace(/&/g," and "),t=t.replace(/@/g," at "),t=t.replace(/=>/g," returns "),t=t.replace(/->/g," to "),t=t.replace(/\|/g," or "),t=t.replace(/\be\.g\./gi,"for example"),t=t.replace(/\bi\.e\./gi,"that is"),t=t.replace(/\betc\./gi,"etcetera"),t=t.replace(/\bvs\.?\b/gi,"versus"),t=t.replace(/\n{2,}/g,". "),t=t.replace(/\n/g," "),t=t.replace(/\s+/g," "),t=t.replace(/\.\s*\./g,"."),t=t.replace(/\s+([.,!?])/g,"$1"),t=t.trim().replace(/^[.,:;]+\s*/,""),t.length>n){let r=t.slice(0,n),o=([...t.slice(0,n+1).matchAll(/[.!?؟](?=\s)/g)].at(-1)?.index??-1)+1;t=(o>=n/2?r.slice(0,o):r.replace(/\s+\S*$/,"")+"...")+" "+_t[te(r)??"en"]}return t}var j,_t,ae=g(()=>{"use strict";ne();j=500,_t={en:"The rest is on screen.",fr:"La suite est \xE0 l'\xE9cran.",ar:"\u0627\u0644\u0628\u0627\u0642\u064A \u0639\u0644\u0649 \u0627\u0644\u0634\u0627\u0634\u0629."}});function Fn(a,n=L){let t=new Set(n.map(re)),r=a.replace(/\[([^\][]*)\]|\(([^()]*)\)/g,(o,i,l)=>t.has(re(i??l))?"":o);return!/[\p{L}\p{N}]/u.test(r)}var L,Un,re,oe=g(()=>{"use strict";L=["background noise","noise","mumbling","babbling","unintelligible","inaudible","muffled speech","pause","silence","music","outro jingle","blank audio"],Un="I didn't catch that.",re=a=>a.toLowerCase().replace(/[_\s]+/g," ").trim()});import{z as c}from"zod";var ie,Et,se,le=g(()=>{"use strict";ie=c.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour"),Et=c.object({id:c.string().regex(/^[a-z0-9][a-z0-9_-]{0,63}$/,"lowercase letters, digits, - and _"),enabled:c.boolean().default(!0),chats:c.array(c.string().min(1)).default([]),senders:c.array(c.string().min(1)).default([]),agent:c.string().min(1),prompt:c.string().max(4e3).optional(),quietHours:c.object({start:ie,end:ie}).optional(),autoAck:c.boolean().default(!1)}).refine(a=>a.chats.length>0||a.senders.length>0,{message:"a rule needs at least one chat or sender"}),se=c.object({enabled:c.boolean().default(!1),secretEnv:c.string().regex(/^[A-Z_][A-Z0-9_]*$/).default("WACLI_WEBHOOK_SECRET"),batchSeconds:c.number().int().min(0).max(600).default(20),timezone:c.string().optional(),allowAutoAck:c.boolean().default(!1),describeMedia:c.boolean().default(!0),wacli:c.object({bin:c.string().default("wacli"),account:c.string().optional(),store:c.string().optional()}).default({}),rules:c.array(Et).default([])}).default({})});function Tt(a){a.exec(`
|
|
2
|
+
CREATE TABLE IF NOT EXISTS requests (
|
|
3
|
+
id TEXT PRIMARY KEY,
|
|
4
|
+
state TEXT NOT NULL,
|
|
5
|
+
channel TEXT NOT NULL,
|
|
6
|
+
chat_id TEXT NOT NULL,
|
|
7
|
+
sender TEXT,
|
|
8
|
+
agent_id TEXT NOT NULL,
|
|
9
|
+
text TEXT NOT NULL,
|
|
10
|
+
created_at INTEGER NOT NULL,
|
|
11
|
+
updated_at INTEGER NOT NULL,
|
|
12
|
+
attention_reason TEXT,
|
|
13
|
+
notified_at INTEGER,
|
|
14
|
+
question TEXT,
|
|
15
|
+
closed_at INTEGER,
|
|
16
|
+
evidence TEXT,
|
|
17
|
+
close_reason TEXT
|
|
18
|
+
);
|
|
19
|
+
CREATE INDEX IF NOT EXISTS idx_requests_state_created ON requests(state, created_at);
|
|
20
|
+
CREATE INDEX IF NOT EXISTS idx_requests_chat ON requests(agent_id, channel, chat_id, created_at);
|
|
21
|
+
CREATE TABLE IF NOT EXISTS request_links (
|
|
22
|
+
request_id TEXT NOT NULL,
|
|
23
|
+
kind TEXT NOT NULL,
|
|
24
|
+
ref TEXT NOT NULL,
|
|
25
|
+
at INTEGER NOT NULL,
|
|
26
|
+
PRIMARY KEY (kind, ref),
|
|
27
|
+
FOREIGN KEY (request_id) REFERENCES requests(id) ON DELETE CASCADE
|
|
28
|
+
);
|
|
29
|
+
CREATE INDEX IF NOT EXISTS idx_request_links_request ON request_links(request_id);
|
|
30
|
+
`),F(a,"requests",U);let n=a.prepare("PRAGMA table_info(requests)").all();for(let[t,r]of[["pickup_at","INTEGER"],["owner_note","TEXT"],["note_said","INTEGER"],["asked_agent","TEXT"]])if(!n.some(o=>o.name===t))try{a.exec(`ALTER TABLE requests ADD COLUMN ${t} ${r}`)}catch(o){if(!/duplicate column name/i.test(String(o?.message)))throw o}}function Xn(a){return!!a.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'requests'").get()}function h(a){return{id:a.id,state:a.state,channel:a.channel,chatId:a.chat_id,sender:a.sender??null,person:a.person??null,agentId:a.agent_id,text:a.text,createdAt:a.created_at,updatedAt:a.updated_at,attentionReason:a.attention_reason??null,notifiedAt:a.notified_at??null,question:a.question??null,closedAt:a.closed_at??null,evidence:a.evidence??null,closeReason:a.close_reason??null,ownerNote:a.owner_note??null,noteSaid:!!a.note_said,askedAgent:a.asked_agent??null}}var x,f,N,$,p,de,ue=g(()=>{"use strict";Ye();x=["in_progress","waiting_owner","waiting_other","needs_attention"],f=["done","declined","dropped"],N=4e3,$=500;p=a=>Array(a).fill("?").join(","),de=class{constructor(n){this.db=n;Tt(n),n.pragma("foreign_keys = ON")}addCandidate(n){this.db.prepare(`INSERT OR IGNORE INTO requests (id, state, channel, chat_id, sender, person, agent_id, text, created_at, updated_at)
|
|
31
|
+
VALUES (?, 'candidate', ?, ?, ?, ?, ?, ?, ?, ?)`).run(n.id,n.channel,n.chatId,n.sender??null,n.person??null,n.agentId,n.text.slice(0,N),n.now,n.now),this.link(n.id,"run",n.runId,n.now)}get(n){let t=this.db.prepare("SELECT * FROM requests WHERE id = ?").get(n);return t?h(t):null}byLink(n,t){let r=this.db.prepare("SELECT r.* FROM requests r JOIN request_links l ON l.request_id = r.id WHERE l.kind = ? AND l.ref = ?").get(n,t);return r?h(r):null}link(n,t,r,o){this.db.prepare("INSERT OR IGNORE INTO request_links (request_id, kind, ref, at) VALUES (?, ?, ?, ?)").run(n,t,r,o)}links(n){return this.db.prepare("SELECT kind, ref, at FROM request_links WHERE request_id = ? ORDER BY at, rowid").all(n)}lastAnswer(n){try{return this.db.prepare(`SELECT t.agent_id AS agentId, t.final_response AS text, COALESCE(t.finished_at, t.started_at) AS at
|
|
32
|
+
FROM request_links l JOIN task_traces t ON t.task_id = l.ref
|
|
33
|
+
WHERE l.request_id = ? AND l.kind = 'run' AND t.final_response IS NOT NULL AND t.final_response != ''
|
|
34
|
+
ORDER BY t.started_at DESC LIMIT 1`).get(n)??null}catch{return null}}touch(n,t){this.db.prepare("UPDATE requests SET updated_at = ? WHERE id = ?").run(t,n)}progress(n,t,r="in_progress"){this.db.prepare(`UPDATE requests SET state = ?, updated_at = ?, attention_reason = NULL, notified_at = NULL, question = NULL
|
|
35
|
+
WHERE id = ? AND state NOT IN (${p(f.length)})`).run(r,t,n,...f)}waitOnOwner(n,t,r){this.db.prepare(`UPDATE requests SET state = 'waiting_owner', updated_at = ?, question = ?, attention_reason = NULL, notified_at = NULL
|
|
36
|
+
WHERE id = ? AND state NOT IN (${p(f.length)})`).run(r,t.slice(0,N),n,...f)}needsAttention(n,t,r){return this.db.prepare(`UPDATE requests SET state = 'needs_attention', updated_at = ?, attention_reason = ?, notified_at = NULL
|
|
37
|
+
WHERE id = ? AND state NOT IN ('needs_attention', ${p(f.length)})`).run(r,t.replace(/\s+/g," ").trim().slice(0,$),n,...f).changes>0}close(n,t,r,o){let i=r.trim();if(!i)throw new Error(t==="done"?"a finished request needs a link to the evidence":`a ${t} request needs a reason`);return this.db.prepare(`UPDATE requests SET state = ?, closed_at = ?, updated_at = ?, evidence = ?, close_reason = ?
|
|
38
|
+
WHERE id = ? AND state NOT IN (${p(f.length)})`).run(t,o,o,t==="done"?i.slice(0,$):null,t==="done"?null:i.slice(0,$),n,...f).changes>0}discardCandidate(n){return this.db.prepare("DELETE FROM requests WHERE id = ? AND state = 'candidate'").run(n).changes>0}listOpen(){return this.db.prepare(`SELECT * FROM requests WHERE state IN (${p(x.length)}) ORDER BY created_at, rowid`).all(...x).map(h)}quietSince(n,t){return this.db.prepare(`SELECT * FROM requests WHERE state IN (${p(n.length)}) AND updated_at < ? ORDER BY created_at, rowid`).all(...n,t).map(h)}awaitingNotice(){return this.db.prepare("SELECT * FROM requests WHERE state = 'needs_attention' AND notified_at IS NULL ORDER BY created_at, rowid").all().map(h)}markNotified(n,t){this.db.prepare("UPDATE requests SET notified_at = ? WHERE id = ?").run(t,n)}listByState(n){return this.db.prepare("SELECT * FROM requests WHERE state = ? ORDER BY created_at, rowid").all(n).map(h)}requestPickup(n,t){return this.db.prepare(`UPDATE requests SET state = 'in_progress', updated_at = ?, attention_reason = NULL, notified_at = NULL, pickup_at = ?
|
|
39
|
+
WHERE id = ? AND state = 'needs_attention'`).run(t,t,n).changes>0}handOff(n,t,r,o){return this.db.prepare(`UPDATE requests SET agent_id = ?, state = 'in_progress', updated_at = ?, attention_reason = NULL, notified_at = NULL,
|
|
40
|
+
question = NULL, pickup_at = ?, owner_note = ?, note_said = NULL, asked_agent = COALESCE(asked_agent, agent_id)
|
|
41
|
+
WHERE id = ? AND state IN (${p(x.length)})`).run(t,o,o,r.trim().slice(0,N)||null,n,...x).changes>0}setNoteSaid(n,t,r){this.db.prepare(`UPDATE requests SET note_said = ? WHERE id = ? AND owner_note = ?${r?" AND pickup_at IS NULL":""}`).run(r?1:null,n,t)}takePickups(){return this.db.prepare("UPDATE requests SET pickup_at = NULL WHERE pickup_at IS NOT NULL RETURNING *").all().map(h).filter(n=>n.state==="in_progress").sort((n,t)=>n.createdAt-t.createdAt)}pruneClosed(n){return this.db.prepare(`DELETE FROM requests WHERE state IN (${p(f.length)}) AND closed_at < ?`).run(...f,n).changes}}});function Yn(a){return Object.assign({channel:ge,chatId:a,sender:"operator"},{[fe]:!0})}function Vn(a){return!!a&&a[fe]===!0}function vt(a,n,t,r=!1){let o=E(n);if(a.channels.length&&!a.channels.map(E).includes(o))return!1;if(T.has(o))return r&&!At.has((t?.name??"").toLowerCase());let i=Rt.has(o)?t?.username:t?.id,l=i?ce(o,i):"";return l?a.from.some(u=>{let m=u.trim().toLowerCase(),b=m.indexOf(":");return b>0&&m.slice(0,b)===o&&ce(o,m.slice(b+1))===l}):!1}function Jn(a){if(!a)return;let n=r=>typeof r=="string"&&r?r.slice(0,120):void 0,t={name:n(a.sender),id:n(a.senderId),username:n(a.senderUsername)};return t.name||t.id||t.username?t:void 0}function It(a){return/\btimed? ?out\b|timeout/i.test(a)?"timed out":"failed"}var ge,fe,T,At,E,Rt,ce,y,k,me,pe=g(()=>{"use strict";ue();ge="requests",fe=Symbol("requests.pickup");T=new Set(["voice","app","dashboard","webrtc"]),At=new Set(["camera"]),E=a=>a.toLowerCase().split("@")[0],Rt=new Set(["github","gitlab"]),ce=(a,n)=>a==="whatsapp"?n.replace(/@.*$/,"").replace(/\D/g,""):n.trim().toLowerCase().replace(/^@/,"");y=(a,n=200)=>{let t=a.replace(/\s+/g," ").trim();return t.length>n?`${t.slice(0,n-1)}\u2026`:t},k=(a,n,t)=>`${a}\0${n}\0${t}`,me=class{constructor(n,t,r,o=Date.now){this.store=n;this.settings=t;this.log=r;this.now=o}live=new Map;guard(n,t){try{t()}catch(r){this.log(`[requests] ${n} failed: ${r?.message??r}`)}}isListedOwner(n){let t=E(n.channel),r=this.settings().channels;return r.length&&!r.map(E).includes(t)?!1:n.person?.role==="owner"&&!T.has(t)}liveRequestId(n,t,r){return this.live.get(k(n,t,r))?.requestId??null}taskStarted(n){n.taskId&&this.guard("capture",()=>{if(!this.settings().enabled)return;let t=this.now(),r=n.resumedFrom?this.store.byLink("run",n.resumedFrom):null,o=k(n.agentId,n.channel,n.chatId);if(r){this.store.link(r.id,"run",n.taskId,t),r.state==="candidate"?this.store.touch(r.id,t):this.store.progress(r.id,t),this.live.set(o,{requestId:r.id,runId:n.taskId});return}let i=n.pickup&&n.channel===ge?this.store.get(n.chatId):null;if(i&&i.agentId===n.agentId){this.store.link(i.id,"run",n.taskId,t),this.store.touch(i.id,t),this.live.set(o,{requestId:i.id,runId:n.taskId});return}!n.humanRoot||!(vt(this.settings(),n.channel,n.sender,n.operator===!0)||this.isListedOwner(n))||(this.live.set(o,{requestId:`req-${n.taskId}`,runId:n.taskId}),this.store.addCandidate({id:`req-${n.taskId}`,runId:n.taskId,channel:n.channel,chatId:n.chatId,sender:n.sender?.name??n.sender?.username??n.sender?.id??null,person:n.person?.id??null,agentId:n.agentId,text:n.requestText??n.fullMessage??n.messagePreview,now:t}))})}taskCompleted(n){n.taskId&&this.guard("run end",()=>{let t=k(n.agentId,n.channel,n.chatId);this.live.get(t)?.runId===n.taskId&&this.live.delete(t);let r=this.store.byLink("run",n.taskId);if(!r)return;let o=this.now();if(!n.interrupted){if(n.error&&n.errorKind!=="cancelled"){let i=It(n.error);this.store.needsAttention(r.id,`${n.agentId} ${i}: ${y(n.error)}`,o)&&this.log(`[requests] ${r.id} needs attention: run ${n.taskId} ${i}`);return}r.state==="candidate"?this.store.discardCandidate(r.id):this.store.touch(r.id,o)}})}delegationStarted(n){this.guard("delegation start",()=>{if(!this.settings().enabled)return;let t=this.live.get(k(n.caller,n.origin.channel,n.origin.chatId));if(!t)return;let r=this.now();this.store.link(t.requestId,"delegation",n.id,r),this.store.progress(t.requestId,r,"waiting_other")})}delegationDone(n,t,r){this.guard("delegation end",()=>{let o=this.store.byLink("delegation",n.id);if(!o)return;let i=this.now(),l=n.peer?`${n.callee} on ${n.peer}`:n.callee;if(t==="done"){this.store.progress(o.id,i);return}let u={error:"failed",timeout:"did not answer in time",lost:"was lost in a restart"}[t];this.store.needsAttention(o.id,`The work handed to ${l} ${u}: ${y(r)}`,i)&&this.log(`[requests] ${o.id} needs attention: delegation ${n.id} ${t}`)})}relayFailed(n,t,r){this.guard("delegation relay",()=>{let o=this.store.byLink("delegation",n.id);if(!o)return;let i=n.peer?`${n.callee} on ${n.peer}`:n.callee;this.store.needsAttention(o.id,`The answer from ${i} was not passed on after a restart (${y(r)}). It said: ${y(t)}`,this.now())&&this.log(`[requests] ${o.id} needs attention: delegation ${n.id} answer not relayed`)})}cardRaised(n,t){t&&this.guard("card",()=>{if(!this.settings().enabled)return;let r=this.live.get(k(n.raised_by,t.channel,t.chatId))?.requestId;if(!r)return;let o=this.now();this.store.link(r,"card",n.id,o),this.store.waitOnOwner(r,n.ask,o)})}cardResolved(n){this.guard("card result",()=>{let t=this.store.byLink("card",n.id);if(!t)return;let r=this.now(),o=n.outcome??n.if_silent;n.status==="decided"?t.state==="waiting_owner"&&this.store.progress(t.id,r):this.store.needsAttention(t.id,`Your answer did not come before the card expired (${y(n.ask)}); "${o}" was applied`,r)&&this.log(`[requests] ${t.id} needs attention: card ${n.id} expired unanswered`)})}closingNote(n){try{let t=this.store.byLink("delegation",n);return!t||!x.includes(t.state)?void 0:`This is part of the owner's open request ${t.id}. It stays on their list until it is closed. If it is finished now, close it with agentx_request: {action:"done", id:"${t.id}", evidence:"<link to the proof>"}. If you will not do it, use decline with the reason. If work goes on, leave it open.`}catch{return}}resumeOutcome(n){this.guard("restart",()=>{let t=this.store.byLink("run",n.taskId);if(!t)return;let r=this.now();n.decision==="resumed"?t.state==="candidate"?this.store.touch(t.id,r):this.store.progress(t.id,r):(n.decision==="reported"||n.decision==="resume-failed"||n.decision==="skipped")&&this.store.needsAttention(t.id,`Cut off by a restart and not picked up again (${y(n.reason)})`,r)&&this.log(`[requests] ${t.id} needs attention: run ${n.taskId} cut off by a restart`)})}}});import{randomBytes as Ct,timingSafeEqual as he}from"crypto";import{chmodSync as Ot,existsSync as jt,mkdirSync as Lt,readFileSync as Nt,writeFileSync as $t}from"fs";import{networkInterfaces as qt}from"os";import{dirname as Pt,resolve as Dt}from"path";function ra(a){return Object.assign(a,{[xe]:!0})}function ye(a){return!!a&&a[xe]===!0}function Bt(a=process.cwd()){return Dt(a,".agentx","operator.key")}function oa(a=process.cwd(),n={}){let t=Bt(a);try{if(jt(t)){let o=Nt(t,"utf-8").trim();if(o)return o}if(!n.create)return null;let r=Ct(32).toString("hex");return Lt(Pt(t),{recursive:!0}),$t(t,r+`
|
|
42
|
+
`,{mode:384}),Ot(t,384),r}catch{return null}}function Ut(a,n){let t=Array.isArray(n)?n[0]:n;if(!a||!t)return!1;let r=Buffer.from(a),o=Buffer.from(t.trim());return r.length===o.length&&he(r,o)}function zt(a,n,t,r){if(!a||typeof a!="object")return!1;let o=String(a.channel??"").toLowerCase().split("@")[0];return r.has(o)?Ut(t,n[Mt]):!1}function Ht(a,n){let t=a[Ft];if((Array.isArray(t)?t[0]:t)!=="1")return!1;let r=a.authorization,o=(Array.isArray(r)?r[0]:r)||"",i=o.toLowerCase().startsWith("bearer ")?o.slice(7).trim():"";if(!i)return!1;let l=Buffer.from(i);for(let u of n){if(!u)continue;let m=Buffer.from(u);if(m.length===l.length&&he(m,l))return!0}return!1}function Wt(a,n=Kt()){let t=be(a??"");if(!t||t==="::1"||t.startsWith("127."))return!0;for(let r of n)if(be(r)===t)return!0;return!1}function Kt(){return Object.values(qt()).flatMap(a=>(a??[]).map(n=>n.address))}function ia(a,n,t){if(zt(a,n.headers,t.key,t.operatorChannels))return!0;if(!a||typeof a!="object")return!1;let r=String(a.channel??"").toLowerCase().split("@")[0];return!t.operatorChannels.has(r)||Wt(n.remoteAddress,t.ownAddresses)?!1:Ht(n.headers,t.peerTokens)}var Mt,xe,Ft,be,Se=g(()=>{"use strict";Mt="x-agentx-operator",xe=Symbol("requests.operator");Ft="x-agentx-operator-vouch";be=a=>a.toLowerCase().replace(/^::ffff:/,"").replace(/%.*$/,"")});function ma(a,n){return a.find(t=>t.id===n)?.name??(n===A?"Owner":n)}function ke(a,n){let t=n.trim().toLowerCase();return a==="whatsapp"?t.replace(/@.*$/,"").replace(/\D/g,""):t.replace(/^@/,"")}function we(a){let n=a.indexOf(":");if(n<=0||n===a.length-1)return null;let t=q(a.slice(0,n).trim()),r=ke(t,a.slice(n+1));return r?{channel:t,value:r}:null}function _e(a){let n=new Set,t=new Map;for(let r of a){if(n.has(r.id))return`person "${r.id}" is listed twice`;if(n.add(r.id),r.id===A&&r.role!=="owner")return`the id "${A}" is kept for a person with the owner role`;for(let o of r.identities){let i=we(o);if(!i)return`identity "${o}" of "${r.id}" must be written channel:id`;let l=`${i.channel}:${i.value}`,u=t.get(l);if(u&&u!==r.id)return`identity "${o}" belongs to both "${u}" and "${r.id}"`;t.set(l,r.id)}}return null}function Xt(a,n,t){let r=q(n),i=(r==="whatsapp"?[t?.id]:[t?.id,t?.username]).filter(l=>typeof l=="string"&&!!l).map(l=>ke(r,l)).filter(Boolean);return i.length?a.find(l=>l.identities.some(u=>{let m=we(u);return!!m&&m.channel===r&&i.includes(m.value)}))??null:null}function Zt(a){let n=a.filter(t=>t.role==="owner");return n.length===0?{id:A,role:"owner"}:n.length===1?{id:n[0].id,role:"owner"}:null}function Ee(a,n){let t=M(n);if(t)return t.person?{id:t.person}:null;if(!n||B(n)!=="human")return null;let r=String(n.channel??"");if(T.has(q(r)))return ye(n)?Zt(a):null;let o=l=>typeof l=="string"?l:void 0,i=Xt(a,r,{id:o(n.senderId),username:o(n.senderUsername)});return i?{id:i.id,role:i.role}:null}function Gt(a,n){let t=a.agents??[];return a.role==="owner"||t.length===0||t.includes(n)}function ga(a,n,t){let r=Ee(a,t);if(!r)return null;let o=a.find(l=>l.id===r.id);if(!o||Gt(o,n))return null;let i=(o.agents??[]).join(", ");return{person:o,note:`${o.name}, you can reach ${i} here, not ${n}. Ask the owner if you need ${n}.`}}function fa(a,n){let t=a.trim().split("*").map(r=>r.replace(/[.+?^${}()|[\]\\]/g,"\\$&")).join(".*");return new RegExp(`^${t}$`,"i").test(n.trim())}function pa(a,n){let t=Ee(a,n);if(!t)return null;let r=a.find(l=>l.id===t.id);if(!r||r.role==="owner")return null;let o=r.deny?.tools??[],i=r.deny?.skills??[];return!o.length&&!i.length?null:{personId:r.id,name:r.name,tools:[...o],skills:[...i]}}var ca,A,q,Te=g(()=>{"use strict";Ge();pe();Se();ca=["owner","member","client","guest"],A="owner";q=a=>a.toLowerCase().split("@")[0]});function xa(a){return typeof a=="string"&&Vt.includes(a)}function Ae(a){let n=new Set(Yt);return a.map(t=>t.trim()).filter(t=>t&&!n.has(t))}var Yt,Vt,ha,Re=g(()=>{"use strict";Yt=["agentx_generate","agentx_inspect","agentx_skill_match","agentx_detect_output_type","agentx_channel_reply","agentx_channel_label","agentx_send","agentx_send_agent","agentx_recent","agentx_events","agentx_send_contact","agentx_task","agentx_agents","agentx_voice_queue","agentx_call_owner","agentx_camera_ask","agentx_camera_look","agentx_health","agentx_attach_next","agentx_attach_answer","agentx_crons","agentx_schedule","agentx_approval","agentx_request","agentx_workflow","agentx_debug","agentx_wiki_query","agentx_wiki_patch","agentx_wiki_interview","agentx_graph_review"],Vt=["read","full"],ha=["agentx_inspect","agentx_skill_match","agentx_detect_output_type","agentx_recent","agentx_events","agentx_agents","agentx_voice_queue","agentx_health","agentx_crons","agentx_wiki_query"]});var Tn={};Xe(Tn,{INTEGRATION_KINDS:()=>on,WIKI_CONTRIBUTE_JOB:()=>He,WIKI_CONTRIBUTE_MERGE_JOB:()=>We,approvalsConfigSchema:()=>Fe,callsSchema:()=>qe,cameraBotSchema:()=>Ne,daemonConfigSchema:()=>ze,eventSubscriptionSchema:()=>Le,expandEnvVars:()=>C,loadDaemonConfig:()=>wn,membersConfigSchema:()=>Be,peopleConfigSchema:()=>Me,personSchema:()=>De,requestStatusConfigSchema:()=>Ue,requestsConfigSchema:()=>Pe,validateWorkspaces:()=>_n,withContributionJobs:()=>Ke});import{z as e}from"zod";import{readFileSync as Ie,existsSync as v}from"fs";import{resolve as I}from"path";function Jt(a){let n=I(a,".env");if(!v(n))return;let t=Ie(n,"utf-8");for(let r of t.split(`
|
|
43
|
+
`)){let o=r.trim();if(!o||o.startsWith("#"))continue;let i=o.indexOf("=");if(i===-1)continue;let l=o.slice(0,i).trim(),u=o.slice(i+1).trim();process.env[l]||(process.env[l]=u)}}function C(a){if(typeof a=="string")return a.replace(/\$\{(\w+)\}/g,(n,t)=>process.env[t]||"");if(Array.isArray(a))return a.map(C);if(a!==null&&typeof a=="object"){let n={};for(let[t,r]of Object.entries(a))n[t]=C(r);return n}return a}function kn(a,n){let t=[],r=new Set;for(let o of a){let i=o.path.join("."),l=/^channels\.telegram\.accounts\.([^.]+)\.token$/.exec(i);if(l&&o.message.toLowerCase().includes("required")){let u=l[1],m=`tg:${u}`;if(r.has(m))continue;r.add(m),t.push(`Hint: Telegram account "${u}" is enabled but has no bot token.
|
|
44
|
+
Either:
|
|
45
|
+
A) Open ${n} and set channels.telegram.accounts.${u}.token to your bot token (or "\${TG_${u.toUpperCase()}_BOT_TOKEN}" + the matching .env entry).
|
|
46
|
+
B) If you don't need Telegram on this instance, remove the entire "telegram" block under "channels" (or set channels.telegram.enabled to false AND drop accounts.${u}).`)}}return t}function wn(a){let n=a?[a]:[I(process.cwd(),"agentx.json"),I(process.cwd(),".agentx/config.json")];Jt(process.cwd());let t,r;for(let u of n)if(v(u)){t=Ie(u,"utf-8"),r=u;break}if(!t||!r)throw new Error(`No config found. Create agentx.json or .agentx/config.json
|
|
47
|
+
Searched: ${n.join(", ")}`);let o;try{o=JSON.parse(t)}catch(u){throw new Error(`Invalid JSON in ${r}: ${u.message}`)}let i=C(o),l=ze.safeParse(i);if(!l.success){let u=l.error.issues.map(P=>` ${P.path.join(".")}: ${P.message}`).join(`
|
|
48
|
+
`),m=kn(l.error.issues,r),b=m.length?`
|
|
49
|
+
|
|
50
|
+
${m.join(`
|
|
51
|
+
|
|
52
|
+
`)}`:"";throw new Error(`Config validation failed (${r}):
|
|
53
|
+
${u}${b}`)}return Ke(l.data)}function _n(a){let n=[];for(let[t,r]of Object.entries(a.agents)){if(!v(r.workspace)){n.push(`Agent "${t}": workspace not found at ${r.workspace}`);continue}if(r.tier==="claude-code"){let l=I(r.workspace,".claude");v(l)||n.push(`Agent "${t}": no .claude/ directory in workspace ${r.workspace}. Claude Code native features (hooks, MCP, skills) won't be available.`)}let o=r.provider||"claude",i=a.providers[o];!["claude-code","codex-cli","opencode"].includes(r.tier)&&(!i||!i.apiKey)&&n.push(`Agent "${t}": provider "${o}" has no API key configured. Set providers.${o}.apiKey in config or use a CLI-backed tier ("claude-code", "codex-cli", or "opencode").`)}for(let[t,r]of Object.entries(a.crons))a.agents[r.agent]||n.push(`Cron "${t}": references unknown agent "${r.agent}"`);if(a.channels.telegram.enabled)for(let[t,r]of Object.entries(a.channels.telegram.accounts))a.agents[r.agentBinding]||n.push(`Telegram account "${t}": references unknown agent "${r.agentBinding}"`);return n}function Ke(a,n=En()){let t=Object.entries(a.agents).filter(([,l])=>l.wiki?.contribute?.enabled).map(([l])=>l).sort();if(t.length===0)return a;let r=a.wiki.contributions,o=(l,u)=>$e.parse({schedule:l,timezone:r.timezone,agent:t[0],command:u,timeout:3600,onError:"log"}),i={[He]:o(r.schedule,`${n} wiki contribute --all`),[We]:o(r.mergeSchedule,`${n} wiki contributions merge`)};return{...a,crons:{...i,...a.crons}}}function En(){let a=process.argv[1]??"";return/[\\/]cli\.(?:c|m)?js$/.test(a)?`"${process.execPath}" "${a}"`:"agentx"}var ve,Qt,en,tn,nn,an,rn,on,Ce,Oe,R,je,Le,sn,ln,Ne,dn,$e,un,cn,mn,gn,fn,pn,bn,hn,qe,xn,yn,Sn,Pe,De,Me,Be,Ue,Fe,ze,He,We,An=g(()=>{H();X();Ze();Y();ee();ae();oe();le();Te();Re();ve=e.array(e.string().min(1)).superRefine((a,n)=>{let t=Ae(a);t.length&&n.addIssue({code:e.ZodIssueCode.custom,message:`not an agentx tool: ${t.join(", ")}. Use the names the agentx server lists, without "mcp__agentx__".`})}),Qt=e.object({apiKey:e.string().optional(),defaultModel:e.string().optional(),baseUrl:e.string().optional(),thinking:e.boolean().optional()}),en=e.object({type:e.literal("stdio").optional(),command:e.string(),args:e.array(e.string()).default([]),env:e.record(e.string(),e.string()).optional()}),tn=e.object({type:e.literal("http"),url:e.string().url(),headers:e.record(e.string(),e.string()).optional()}),nn=e.union([tn,en]),an=e.object({tokenEnv:e.string().regex(/^[A-Z][A-Z0-9_]*$/).optional(),privateAppTokenEnv:e.string().regex(/^[A-Z][A-Z0-9_]*$/).optional(),apiKeyEnv:e.string().regex(/^[A-Z][A-Z0-9_]*$/).optional(),refreshTokenEnv:e.string().regex(/^[A-Z][A-Z0-9_]*$/).optional(),clientIdEnv:e.string().regex(/^[A-Z][A-Z0-9_]*$/).optional(),clientSecretEnv:e.string().regex(/^[A-Z][A-Z0-9_]*$/).optional(),auth:e.literal("keyring").optional(),sessionDir:e.string().optional()}).strict(),rn=e.object({kind:e.string().min(1),label:e.string().min(1),credentials:an.default({}),metadata:e.record(e.string(),e.union([e.string(),e.number(),e.boolean()])).default({}),enabled:e.boolean().default(!0)}),on=["telegram-bot","whatsapp","gitlab-user","github-user","gmail","hotmail","smtp","hubspot","salesforce","pipedrive","odoo","trello","linear","asana","jira","notion","stripe","sentry","vercel","twilio","custom"],Ce=e.enum(["system","elevenlabs"]),Oe=e.union([e.string(),e.record(e.string(),e.string())]),R=e.string().superRefine((a,n)=>{let t=G(a);t&&n.addIssue({code:e.ZodIssueCode.custom,message:`shortcut ${t}`})}),je=e.object({provider:Ce.optional(),system:Oe.optional(),fallbacks:e.array(e.string().min(1)).optional(),elevenlabsVoiceId:e.string().optional(),gender:e.enum(["female","male","neutral"]).optional(),style:e.string().optional(),intro:e.string().optional(),narrate:e.enum(["off","on","all"]).optional(),rate:e.number().min(.75).max(1.5).optional(),priority:e.enum(["high","normal","low"]).optional(),hotkey:R.optional()}),Le=e.object({kinds:e.array(e.string().min(1)).min(1),agents:e.array(e.string().min(1)).optional(),nodes:e.array(e.string().min(1)).optional(),match:e.string().min(1).optional(),delivery:e.enum(["pull","digest","wake"]).default("pull"),maxPerHour:e.number().int().min(1).max(60).default(4)}),sn=e.object({name:e.string(),workspace:e.string(),tier:e.enum(["claude-code","codex-cli","opencode","sdk","orchestrator"]).default("claude-code"),provider:e.string().optional(),model:e.string().optional(),systemPrompt:e.string().optional(),mentions:e.array(e.string()).default([]),intents:e.array(e.string()).default([]),maxDelegationDepth:e.number().int().min(0).max(50).default(5),mcp:e.record(e.string(),nn).optional(),codegraph:e.boolean().default(!1),contextStrategy:e.enum(["layered","planner"]).optional(),contextReferences:e.boolean().default(!1),richMessages:e.boolean().default(!0),maxConcurrent:e.number().default(1),maxExecutionMinutes:e.number().int().min(1).max(240).default(20),preSpawnTimeoutSec:e.number().int().min(10).max(3600).default(300),drainTimeoutSeconds:e.number().int().min(0).max(86400).optional(),wiki:e.object({contribute:e.object({enabled:e.boolean().default(!1),maxPatches:e.number().int().min(1).max(200).default(30),maxCostUsd:e.number().min(0).max(20).optional(),model:e.string().optional()}).default({}),absorb:e.object({enabled:e.boolean().default(!0)}).default({})}).optional(),permissionMode:e.string().default("default"),billing:e.enum(["subscription","api"]).default("subscription"),cloudSessions:e.object({enabled:e.boolean().default(!1),maxPerDay:e.number().int().min(0).default(0),openHours:e.number().min(1).max(168).default(24),launchTimeoutSeconds:e.number().int().min(10).max(600).default(120)}).default({}),toolUseRequired:e.array(e.string()).default([]),gitlabAutoReply:e.boolean().optional(),persistentProcess:e.boolean().default(!1),queueMode:e.enum(["collect","followup","drop"]).default("collect"),heartbeat:e.object({enabled:e.boolean().default(!1),intervalMinutes:e.number().default(30),prompt:e.string().default("Check inbox, pending tasks, and system health. Report anything that needs attention."),channel:e.string().default("heartbeat")}).default({}),access:e.enum(["private","public"]).default("private"),admin:e.boolean().optional(),subscriptions:e.array(Le).default([]),integrations:e.array(rn).default([]),voice:je.optional(),presence:e.object({color:e.string().regex(/^#[0-9a-fA-F]{6}$/).optional(),palette:e.enum(O).optional(),initial:e.string().max(2).optional(),label:e.string().optional(),allowActions:e.boolean().optional()}).optional()}),ln=e.object({token:e.string(),agentBinding:e.string(),allowFrom:e.array(e.string()).optional(),pollInbound:e.boolean().default(!0)}),Ne=e.object({frameIntervalSeconds:e.number().int().min(0).max(3600).default(0),maxSessionMinutes:e.number().int().min(1).max(240).default(10),maxFrameEdge:e.number().int().min(160).max(3840).default(1024),keepFrames:e.boolean().default(!1),streamFrameSeconds:e.number().int().min(2).max(60).default(5),streamMaxSeconds:e.number().int().min(10).max(600).default(60)}).default({}),dn=e.object({telegram:e.object({enabled:e.boolean().default(!1),accounts:e.record(e.string(),ln).default({}),policy:e.object({dm:e.enum(["pair","block"]).default("pair"),group:e.enum(["mention-required","all"]).default("mention-required"),allowFrom:e.array(e.string()).optional()}).default({})}).default({}),whatsapp:e.object({enabled:e.boolean().default(!1),sessionDir:e.string().default(".agentx/whatsapp-sessions"),defaultAgent:e.string().optional(),allowFrom:e.array(e.string()).optional(),routes:e.array(e.object({contact:e.string().optional(),group:e.string().optional(),agent:e.string()})).default([]),ingest:e.object({enabled:e.boolean().default(!1),mode:e.enum(["metadata-only","messages"]).default("metadata-only"),allowContacts:e.array(e.string()).default([]),allowGroups:e.array(e.string()).default([]),denyContacts:e.array(e.string()).default([]),denyGroups:e.array(e.string()).default([]),messageCap:e.number().int().min(1).max(500).default(50),historyDays:e.number().int().min(1).max(365).default(30),contactRefreshDays:e.number().int().min(1).max(90).default(7),throttle:e.object({minMsBetweenCalls:e.number().int().min(100).default(1500),maxCallsPerMinute:e.number().int().min(1).default(20),maxChatsPerSweep:e.number().int().min(1).default(25)}).default({}),retentionDays:e.number().int().min(0).default(0)}).default({})}).default({}),gitlab:e.object({enabled:e.boolean().default(!1),webhookPort:e.number().default(18810),webhookSecret:e.string().optional(),host:e.string().default("https://gitlab.com"),token:e.string().optional(),autoReplyLegacy:e.boolean().default(!0),routes:e.array(e.object({project:e.string(),agent:e.string()})).default([]),agentMappings:e.array(e.object({agentId:e.string(),gitlabUsernames:e.array(e.string()).default([]),keywords:e.array(e.string()).default([]),token:e.string().optional(),node:e.string().optional()})).default([]),agentUsernamePrefixes:e.array(e.string().min(1)).default([])}).default({}),github:e.object({enabled:e.boolean().default(!1),autoReplyLegacy:e.boolean().default(!0),cloudSessions:e.boolean().default(!1),token:e.string().optional(),tokenFile:e.string().optional(),appId:e.number().optional(),clientId:e.string().optional(),privateKeyFile:e.string().optional(),webhookSecret:e.string().optional(),routes:e.array(e.object({repo:e.string(),agent:e.string()})).default([]),agentMappings:e.array(e.object({agentId:e.string(),githubUsernames:e.array(e.string()).default([]),token:e.string().optional(),tokenFile:e.string().optional(),node:e.string().optional()})).default([]),issueActions:e.array(e.string().min(1)).default(["opened","reopened","assigned"]),pullRequestActions:e.array(e.string().min(1)).default(["opened","reopened","ready_for_review"]),ignoreOwnChanges:e.boolean().default(!0),debounceSeconds:e.number().min(0).max(3600).default(30)}).default({}),ntfy:e.object({enabled:e.boolean().default(!1),server:e.string().default("https://ntfy.sh"),topic:e.string().optional(),token:e.string().optional(),defaultPriority:e.number().int().min(1).max(5).default(3),defaultTitle:e.string().optional()}).default({}),push:e.object({enabled:e.boolean().default(!1),keysFile:e.string().default(".agentx/push-keys.json"),subject:e.string().regex(/^(mailto:|https:\/\/)/,"must start with mailto: or https://").optional(),relayTo:e.string().optional(),ttlSeconds:e.number().int().min(0).max(2419200).default(86400),keepRecent:e.number().int().min(0).max(1e3).default(50),allowedHosts:e.array(e.string().min(1)).default(["fcm.googleapis.com","push.services.mozilla.com","push.apple.com","notify.windows.com"])}).default({}),webrtc:e.object({enabled:e.boolean().default(!1),stunServers:e.array(e.string()).default(["stun:stun.l.google.com:19302"]),turnServers:e.array(e.object({urls:e.string(),username:e.string().optional(),credential:e.string().optional()})).default([]),allowedCallers:e.array(e.string()).default([]),ringNotify:e.array(e.object({channel:e.string(),chatId:e.string(),accountId:e.string().optional()})).default([]),callUrlBase:e.string().optional(),bot:e.object({enabled:e.boolean().default(!1),defaultAgentId:e.string().optional(),whisperBackend:e.enum(["auto","mlx","openai"]).default("auto"),whisperModel:e.string().optional(),whisperLanguage:e.string().default("auto"),mlxBinary:e.string().optional(),transcriptChannel:e.object({channel:e.string(),chatId:e.string(),accountId:e.string().optional()}).optional(),maxCallMinutes:e.number().int().min(1).max(240).default(30)}).default({}),camera:e.object({width:e.number().int().min(160).max(3840).default(1280),height:e.number().int().min(120).max(2160).default(720),frameRate:e.number().int().min(1).max(60).default(15),maxSeconds:e.number().int().min(10).max(7200).default(600),voiceInput:e.boolean().default(!0),speakAnswers:e.boolean().default(!0),bot:Ne}).default({})}).default({})}),$e=e.object({enabled:e.boolean().default(!0),schedule:e.string(),timezone:e.string().default("UTC"),agent:e.string(),prompt:e.string().default(""),command:e.string().optional(),timeout:e.number().default(600),model:e.string().optional(),maxOutputTokens:e.number().int().min(50).max(8e3).optional(),autonomy:D.optional(),onError:e.union([e.enum(["log","notify","disable"]),e.array(e.enum(["log","notify","disable"]))]).default("log").transform(a=>Array.isArray(a)?a:[a]),notify:e.object({channel:e.string(),chatId:e.string(),accountId:e.string().optional()}).optional(),deliverResult:e.boolean().optional(),fireToken:e.string().optional(),createdBy:e.string().optional(),approval:e.object({action:e.enum(["create","delete"]),requestedBy:e.string(),requestedAt:e.string()}).optional()}).refine(a=>!!(a.command?.trim()||a.prompt?.trim()),{message:"a cron needs either a prompt (dispatch an agent) or a command (run it directly)"}).refine(a=>!(a.command?.trim()&&a.autonomy&&a.autonomy!=="act"),{message:"autonomy applies to agent routines; a command cron runs no agent (remove autonomy or the command)"}),un=e.object({enabled:e.boolean().default(!1),inbox:e.string().min(1).optional(),crons:e.array(e.string().min(1)).default([]),maxNotesPerRun:e.number().int().min(1).max(100).default(20),maxDeferrals:e.number().int().min(1).max(20).default(3)}).refine(a=>!a.enabled||!!a.inbox,{message:"wikiNotes.enabled needs wikiNotes.inbox: the agent that runs the wiki observe/sweep schedule"}),cn=e.object({name:e.string(),triggers:e.array(e.object({pattern:e.string(),channel:e.string().optional()})),allowedContacts:e.array(e.string()).optional(),agent:e.string(),prompt:e.string(),schedule:e.string().optional(),timezone:e.string().default("UTC"),notify:e.object({channel:e.string(),chatId:e.string(),accountId:e.string().optional()}).optional()}),mn=e.object({url:e.string(),name:e.string(),token:e.string().optional()}),gn=e.object({name:e.string(),agent:e.string(),enabled:e.boolean().default(!0)}),fn=e.object({enabled:e.boolean().default(!1),peers:e.array(mn).default([]),inboxes:e.array(gn).default([]),discovery:e.enum(["static","mdns"]).default("static"),healthCheck:e.object({interval:e.number().default(60),timeout:e.number().default(10)}).default({}),feed:e.object({enabled:e.boolean().default(!0),skipTypes:e.array(e.string().min(1)).default(["task:step"])}).default({}),delegation:e.object({asyncWhenHuman:e.boolean().default(!0),timeoutMinutes:e.number().int().min(1).max(240).default(30),requeueRelayOnRestart:e.boolean().default(!0)}).default({})}),pn=e.object({enabled:e.boolean().default(!1),baseDir:e.string().default(".agentx/graph"),draftAgent:e.string().optional(),reviewAgent:e.string().optional(),autoApproveStructure:e.enum(["strict","extend-leaves","any"]).default("extend-leaves"),autoApproveConfidence:e.number().min(0).max(1).default(1),classifierModel:e.string().default("claude-haiku-4-5-20251001"),retrievalWeights:e.object({graph:e.number().min(0).default(.6),bm25:e.number().min(0).default(.4)}).default({})}).default({}),bn=e.object({mode:e.enum(["off","shadow","active"]).default("off"),backend:e.string().optional(),model:e.string().optional(),timeoutMs:e.number().int().min(100).optional(),temperature:e.number().min(.01).default(1),explore:e.number().min(0).max(1).default(.15),holdout:e.number().min(0).max(1).optional()}).default({}),hn=e.object({enabled:e.boolean().default(!1),dbPath:e.string().default(".agentx/decisions/decisions.sqlite"),redactState:e.boolean().default(!1),keepStateRows:e.number().int().min(0).default(2e3),defaultBackend:e.string().default("local"),backends:e.object({local:e.object({provider:e.string().default("claude-code"),model:e.string().default("claude-haiku-4-5-20251001"),structureMode:e.enum(["auto","tool","text"]).default("auto"),normalizeProbabilities:e.boolean().default(!0),nRetryMalformedStructure:e.number().int().min(0).max(3).default(1),maxStateChars:e.number().int().min(500).default(24e3)}).default({}),simpleJev:e.object({baseUrl:e.string().default("http://127.0.0.1:8000/v1"),model:e.string().optional(),apiKeyEnv:e.string().optional(),timeoutMs:e.number().int().min(100).default(3e4),maxStateChars:e.number().int().min(500).default(6e3),maxChoiceOptions:e.number().int().min(2).max(255).default(50)}).default({}),jev:e.object({baseUrl:e.string().default("https://openrouter.ai/api/alpha"),path:e.string().default("/decisions"),model:e.string().default("jev-latest"),apiKeyEnv:e.string().default("OPENROUTER_API_KEY"),timeoutMs:e.number().int().min(100).default(3e4),maxStateChars:e.number().int().min(500).default(9e4),maxChoiceOptions:e.number().int().min(2).max(255).default(255)}).default({}),typesafe:e.object({baseUrl:e.string().default("https://api.typesafe.ai/v1"),path:e.string().default("/systemone"),model:e.string().default("jev-latest"),apiKeyEnv:e.string().default("TYPESAFE_API_KEY"),timeoutMs:e.number().int().min(100).default(3e4),maxStateChars:e.number().int().min(500).default(9e4),maxChoiceOptions:e.number().int().min(2).max(255).default(255)}).default({})}).default({}),seats:e.record(e.string(),bn).default({}),routing:e.object({cheapModel:e.string().optional(),cheapModels:e.object({"claude-code":e.string().optional(),"codex-cli":e.string().optional()}).optional()}).default({})}).default({}),qe=e.object({allow:e.array(e.string()).default([]),maxPerHour:e.number().int().min(1).max(60).default(3),ringSeconds:e.number().int().min(10).max(300).default(45),maxCallMinutes:e.number().int().min(1).max(240).default(30),ringSound:e.string().regex(/^[\w -]+$/).default("Submarine"),summary:e.boolean().default(!0)}).default({}),xn=e.object({longTaskThreshold:e.number().default(30),destination:e.object({channel:e.string(),chatId:e.string(),accountId:e.string().optional()}).optional(),channel:e.string().optional(),on:e.object({taskComplete:e.boolean().default(!0),taskError:e.boolean().default(!0),taskQueued:e.boolean().default(!1)}).default({}),local:e.object({banner:e.boolean().default(!0),sound:e.boolean().default(!0),soundName:e.string().regex(/^[\w -]+$/).default("Glass"),volume:e.number().min(0).max(1).default(.4),icon:e.string().optional()}).default({})}).default({}),yn=e.object({x:e.number(),y:e.number(),width:e.number().positive(),height:e.number().positive()}),Sn=e.object({maxPixels:e.number().int().positive().default(12e5),timeoutMs:e.number().int().positive().default(5e3),intervalMs:e.number().int().positive().default(100),changeThreshold:e.number().min(0).max(1).default(.015),stableMs:e.number().int().nonnegative().default(400),regions:e.record(e.string().regex(/^[a-z][\w-]*$/),yn).default({}),buffer:e.object({enabled:e.boolean().default(!1),seconds:e.number().positive().max(120).default(10),fps:e.number().positive().max(10).default(2),region:e.string().default("screen"),maxPixels:e.number().int().positive().default(3e5)}).default({})}).default({}),Pe=e.object({enabled:e.boolean().default(!1),channels:e.array(e.string().min(1)).default([]),from:e.array(e.string().regex(/^[a-z0-9_-]+:\S+$/i,"use channel:id, for example telegram:123456789")).default([]),staleAfterHours:e.number().positive().max(24*365).default(24),retentionDays:e.number().positive().max(3650).default(90),plans:e.object({enabled:e.boolean().default(!0),stallMinutes:e.number().positive().max(7*24*60).default(30),maxNudges:e.number().int().min(0).max(20).default(3),approveKinds:e.array(e.string().regex(/^[a-z][a-z0-9_-]{0,30}$/,"a step kind: a short lower-case word")).default(["message"]),disabledAgents:e.array(e.string().min(1)).default([])}).default({})}).default({}),De=e.object({id:e.string().regex(/^[a-z0-9][a-z0-9_-]{0,39}$/,"lower-case letters, digits, - and _"),name:e.string().min(1).max(80),say:e.string().trim().min(1).max(120).optional(),role:e.enum(["owner","member","client","guest"]).default("member"),identities:e.array(e.string().regex(/^[A-Za-z][\w-]*:\S.*$/,"write it as channel:id")).default([]),agents:e.array(e.string().min(1)).default([]),deny:e.object({tools:e.array(e.string().min(1)).default([]),skills:e.array(e.string().min(1)).default([])}).strict().default({})}),Me=e.array(De).default([]).superRefine((a,n)=>{let t=_e(a);t&&n.addIssue({code:e.ZodIssueCode.custom,message:t})}),Be=e.object({logRetentionDays:e.number().int().min(1).max(3650).default(90)}).default({}),Ue=e.object({channels:e.array(e.string().min(1)).default([])}).default({}),Fe=e.object({defaultExpiryDays:e.number().positive().max(365).default(3),maxExpiryDays:e.number().positive().max(365).default(30),laterHours:e.number().positive().max(24*30).default(24),notifyAgent:e.boolean().default(!0),forwardTo:e.string().min(1).optional(),digest:e.object({enabled:e.boolean().default(!0),time:e.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour").default("09:00"),timezone:e.string().refine(a=>{try{return new Intl.DateTimeFormat("en-US",{timeZone:a}),!0}catch{return!1}},"unknown timezone").optional(),destination:e.object({channel:e.string(),chatId:e.string(),accountId:e.string().optional()}).optional()}).default({}),popup:e.object({enabled:e.boolean().default(!1),style:e.enum(["card","dialog"]).default("card"),theme:e.enum(["system","light","dark"]).default("system"),speak:e.boolean().default(!0),voice:e.string().regex(/^[\w .()-]+$/,"a voice name, as `say -v '?'` lists them").optional(),sound:e.string().regex(/^[\w -]*$/,"a sound name, like chime or Glass").default("chime"),volume:e.number().min(0).max(1).default(.4),timeoutSeconds:e.number().int().min(10).max(3600).default(600)}).default({}),checkin:e.object({enabled:e.boolean().default(!1),times:e.array(e.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour")).default(["11:00","14:00","17:00"]),dailyAt:e.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/,"use HH:MM, 24-hour").default("09:00"),timezone:e.string().refine(a=>{try{return new Intl.DateTimeFormat("en-US",{timeZone:a}),!0}catch{return!1}},"unknown timezone").optional(),lists:e.array(e.string().min(1)).default(["Reminders"]),agent:e.string().min(1).optional(),dueWithinHours:e.number().positive().max(24*30).default(24),maxAsksPerPass:e.number().int().min(1).max(20).default(5),composeTimeoutSeconds:e.number().int().min(30).max(3600).default(300)}).default({})}).default({}),ze=e.object({node:e.object({id:e.string(),name:e.string(),bind:e.string().default("127.0.0.1:18800"),defaultAgent:e.string().optional()}),providers:e.record(e.string(),Qt).default({}),agents:e.record(e.string(),sn).default({}),wiki:e.object({contributions:e.object({schedule:e.string().default("40 22 * * *"),mergeSchedule:e.string().default("20 23 * * *"),timezone:e.string().default("UTC"),maxCostUsd:e.number().min(0).max(20).default(.5),model:e.string().default("sonnet")}).default({}),query:e.object({shared:e.boolean().default(!0)}).default({})}).default({}),channels:dn.default({}),crons:e.record(e.string(),$e).default({}),wikiNotes:un.default({}),services:e.record(e.string(),cn).default({}),notifications:xn,calls:qe,whatsappTriage:se,approvals:Fe,shutdown:e.object({drainTimeoutSeconds:e.number().int().min(0).max(86400).optional(),restart:e.object({allowBy:e.string().optional(),window:e.string().regex(/^\d{1,2}:\d{2}$/,"window must be HH:MM").optional(),windowWaitMinutes:e.number().int().min(1).max(1440).default(180),forbidOnTimeoutRestart:e.boolean().default(!1)}).default({})}).default({}),resume:e.object({enabled:e.boolean().default(!0),maxAgeMinutes:e.number().int().positive().default(30),maxAttempts:e.number().int().min(0).default(1),reportOnlyChannels:e.array(e.string()).default([]),directChannels:e.array(e.string()).default([]),crashLoop:e.object({restarts:e.number().int().positive().default(3),windowMinutes:e.number().positive().default(10)}).default({})}).default({}),requests:Pe,people:Me,members:Be,requestStatus:Ue,reminders:e.object({enabled:e.boolean().default(!1),lists:e.array(e.string().min(1)).default(["AgentX"]),pollSeconds:e.number().int().min(15).default(60),lookbackHours:e.number().positive().default(24),command:e.string().min(1).default("remindctl")}).default({}),app:e.object({android:e.object({packageName:e.string().regex(/^[a-zA-Z][\w]*(\.[a-zA-Z][\w]*)+$/,"must look like com.example.app").default("dev.agentx.phone"),certFingerprints:e.array(e.string().regex(/^([0-9A-Fa-f]{2}:){31}[0-9A-Fa-f]{2}$/,"must be 32 hex pairs separated by colons")).default([])}).default({}),places:e.object({enabled:e.boolean().default(!0),file:e.string().min(1).default(".agentx/places.json"),defaultRadiusMeters:e.number().int().min(50).max(5e4).default(150),minRadiusMeters:e.number().int().min(50).max(5e4).default(100),maxRadiusMeters:e.number().int().min(50).max(5e4).default(5e3),maxPlaces:e.number().int().min(1).max(100).default(50),maxRulesPerPlace:e.number().int().min(1).max(50).default(10),cooldownMinutes:e.number().int().min(0).max(1440).default(10),maxEventAgeMinutes:e.number().int().min(1).max(1440).default(30),syncMinutes:e.number().int().min(15).max(1440).default(60)}).default({})}).default({}),demo:e.object({startupTimeoutSeconds:e.number().int().positive().max(3600).optional()}).default({}),events:e.object({ringSize:e.number().int().min(1).max(1e5).default(1e3)}).default({}),screen:Sn,mesh:fn.default({}),meshVoices:e.record(e.string(),je.omit({rate:!0,priority:!0,hotkey:!0}).extend({name:e.string().optional()})).default({}),voice:e.object({provider:Ce.default("system"),fallback:e.enum(["system","none"]).default("system"),system:Oe.optional(),locale:e.string().default("en"),listener:e.string().optional(),pronunciations:e.array(e.object({written:e.string().trim().min(1).max(80),spoken:e.string().trim().min(1).max(120),languages:e.array(e.enum(["en","fr","ar"])).optional()}).strict()).max(200).default([]),pointer:e.boolean().default(!0),stt:e.enum(["auto","elevenlabs","local"]).default("auto"),allowUnmeasured:e.boolean().default(!1),spokenMaxChars:e.number().int().min(300).max(1500).default(j),noiseFilter:e.object({enabled:e.boolean().default(!0),markers:e.array(e.string()).default(L)}).default({}),localStt:e.enum(["mlx-whisper","parakeet"]).default("mlx-whisper"),endOfTurn:e.enum(["vad","volume"]).default("vad"),hotkeys:e.object({talk:R.default(w.talk),stop:R.default(w.stop),paste:R.default(w.paste)}).default({}),look:e.enum(V).default("orb"),startReduced:e.boolean().default(!1),stroll:e.boolean().default(!1),animations:e.enum(J).default("sometimes"),palette:e.enum(O).default(_),card:e.object({timeout:e.number().min(0).max(600).default(30),maxHeight:e.number().min(120).max(800).default(320)}).default({})}).default({}),business:z.optional(),boards:W,dashboard:K,graph:pn,decisions:hn,workflows:e.object({enabled:e.boolean().default(!1),dir:e.string().default(".agentx/workflows"),n8n:e.object({baseUrl:e.string().default(""),apiKey:e.string().default("")}).default({baseUrl:"",apiKey:""}),matching:e.object({enabled:e.boolean().default(!1),mode:e.enum(["suggest","auto"]).default("suggest"),autoRunThreshold:e.number().min(0).max(1).default(.85),suggestThreshold:e.number().min(0).max(1).default(.65)}).default({}),followUp:e.object({enabled:e.boolean().default(!0),agents:e.record(e.boolean()).default({}),stallMinutes:e.number().positive().max(7*24*60).default(30),maxNudges:e.number().int().min(0).max(20).default(2),approval:e.enum(["start","step"]).default("step")}).default({}),editor:e.enum(["disabled","readonly","edit"]).default("edit")}).default({}),procedures:e.object({enabled:e.boolean().default(!0),dir:e.string().default(".agentx/procedures"),extraction:e.object({enabled:e.boolean().default(!1),onTaskCompletion:e.boolean().default(!1),minOccurrences:e.number().int().min(2).default(3),sinceDays:e.number().int().min(1).default(7),maxClusters:e.number().int().min(1).default(5),via:e.string().optional()}).default({}),injection:e.object({enabled:e.boolean().default(!0),maxProcedures:e.number().int().min(1).default(2),minScore:e.number().min(0).max(1).default(.5)}).default({})}).default({}),webhooks:e.array(e.object({id:e.string().regex(/^[a-z0-9][a-z0-9_-]*$/,"webhook id must be lowercase slug"),source:e.string().min(1),agentId:e.string(),secretEnv:e.string().optional(),description:e.string().optional(),enabled:e.boolean().default(!0),node:e.string().optional(),triggers:e.record(e.string(),e.string()).optional(),defaultWorkflow:e.string().optional()})).default([]),session:e.object({staleMinutes:e.number().int().min(1).max(1440).default(720),maxTurnsPerSession:e.number().int().min(2).max(200).default(40),tierTwoThresholdTokens:e.number().int().min(5e4).max(2e5).default(18e4),tierTwoThresholdTokensByChannel:e.record(e.number().int().min(5e4).max(2e5)).default({}),contextStrategy:e.enum(["layered","planner"]).default("layered"),maxClaudeCodeDispatchesPerHour:e.number().int().min(0).max(1e4).optional(),maxClaudeCodeDispatchesPer5h:e.number().int().min(0).max(5e4).optional(),continuityStateTurns:e.number().int().min(0).max(5).default(0),profileByChannel:e.record(e.enum(["full","lean"])).default({}),lean:e.object({mcpServers:e.array(e.string().min(1)).default(["agentx"]),settingSources:e.array(e.enum(["user","project","local"])).default(["project","local"]),contextOnDemand:e.boolean().default(!0),tools:e.array(e.string().min(1)).default([]),toolsByChannel:e.record(e.array(e.string().min(1))).default({}),agentxTools:ve.default([]),agentxToolsByChannel:e.record(ve).default({})}).default({}),triage:e.object({models:e.object({"claude-code":e.string().min(1).optional(),"codex-cli":e.string().min(1).optional()}).default({}),actions:e.array(e.string().min(1)).default(["labeled","unlabeled","closed"])}).default({}),memoryIndexMaxChars:e.number().int().min(0).max(2e5).default(0),resumeGate:e.object({mode:e.enum(["off","shadow","active"]).default("off"),freshTokens:e.number().int().min(1e3).max(2e5).default(3e4),cacheTtlMinutes:e.number().int().min(1).max(1440).default(60),cacheWriteFactor:e.number().min(1).max(4).default(2),margin:e.number().min(1).max(10).default(1.5)}).default({}),observationPack:e.object({enabled:e.boolean().default(!1),limitBytes:e.number().int().min(1024).max(1048576).default(10240),headBytes:e.number().int().min(0).max(65536).default(1024),tailBytes:e.number().int().min(0).max(65536).default(1024),tools:e.array(e.string().min(1)).default(["Bash","Grep","Read","WebFetch","mcp__.*"]),retentionDays:e.number().int().min(0).max(3650).default(0)}).default({})}).default({}),plugins:e.array(e.string()).default([]),processPool:e.object({maxIdleSeconds:e.number().int().min(5).max(86400).default(30),maxAgeSeconds:e.number().int().min(60).max(86400).default(2700),sweepIntervalSeconds:e.number().int().min(1).max(300).default(5)}).default({})});He="wiki-contribute",We="wiki-contribute-merge"});export{Cn as a,On as b,X as c,xt as d,Ln as e,w as f,Y as g,S as h,V as i,J as j,O as k,$n as l,ee as m,te as n,ne as o,Mn as p,ae as q,Un as r,Fn as s,oe as t,se as u,le as v,x as w,f as x,N as y,Xn as z,de as A,ue as B,Yn as C,Vn as D,T as E,Jn as F,me as G,pe as H,Mt as I,ra as J,ye as K,oa as L,zt as M,ia as N,Se as O,ca as P,A as Q,ma as R,we as S,Xt as T,Zt as U,Ee as V,ga as W,fa as X,pa as Y,Te as Z,Vt as _,ha as $,xa as aa,Re as ba,on as ca,Le as da,Ne as ea,qe as fa,Pe as ga,De as ha,Me as ia,Be as ja,Ue as ka,Fe as la,ze as ma,C as na,wn as oa,_n as pa,He as qa,We as ra,Ke as sa,Tn as ta,An as ua};
|
|
54
|
+
//# sourceMappingURL=chunk-EOLEKSN6.js.map
|