agentix-cli 0.17.0 → 0.19.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 +75 -27
- package/dist/agent-57MG4LBM.js +2 -0
- package/dist/audit-JU3HWISB.js +3 -0
- package/dist/audit-JU3HWISB.js.map +1 -0
- package/dist/{board-dashboard-CXIVJKDP.js → board-dashboard-HXDOYGIG.js} +2237 -69
- package/dist/board-dashboard-HXDOYGIG.js.map +1 -0
- package/dist/chunk-23AUU4S2.js +102 -0
- package/dist/chunk-23AUU4S2.js.map +1 -0
- package/dist/{chunk-EKTPCSN4.js → chunk-4ITQP3XL.js} +2 -2
- package/dist/chunk-4MREHZP5.js +111 -0
- package/dist/chunk-4MREHZP5.js.map +1 -0
- package/dist/chunk-4YCH6IZV.js +2 -0
- package/dist/chunk-53NRX2NA.js +2 -0
- package/dist/chunk-53NRX2NA.js.map +1 -0
- package/dist/chunk-6B74TO2J.js +743 -0
- package/dist/chunk-6B74TO2J.js.map +1 -0
- package/dist/chunk-7P5QRX5W.js +108 -0
- package/dist/chunk-7P5QRX5W.js.map +1 -0
- package/dist/chunk-A6BKSZQA.js +3 -0
- package/dist/chunk-A6BKSZQA.js.map +1 -0
- package/dist/{chunk-6PPIFDOQ.js → chunk-CNNLREHD.js} +67 -22
- package/dist/{chunk-6PPIFDOQ.js.map → chunk-CNNLREHD.js.map} +1 -1
- package/dist/chunk-DJEZ2HVU.js +5 -0
- package/dist/chunk-DJEZ2HVU.js.map +1 -0
- package/dist/chunk-DLVOHCTA.js +5 -0
- package/dist/{chunk-MBEQASP3.js.map → chunk-DLVOHCTA.js.map} +1 -1
- package/dist/chunk-E4ZZILAK.js +15 -0
- package/dist/chunk-E4ZZILAK.js.map +1 -0
- package/dist/{chunk-63UYRJIC.js → chunk-IKBHHTIT.js} +2 -2
- package/dist/chunk-JGXE2YNV.js +46 -0
- package/dist/chunk-JGXE2YNV.js.map +1 -0
- package/dist/chunk-JTJIPNXY.js +2 -0
- package/dist/chunk-JTJIPNXY.js.map +1 -0
- package/dist/chunk-MBOLXKA2.js +6 -0
- package/dist/chunk-MBOLXKA2.js.map +1 -0
- package/dist/{inbox-L5ZZ623Y.js → chunk-MTRWXRFF.js} +69 -4
- package/dist/chunk-MTRWXRFF.js.map +1 -0
- package/dist/{processes-XF5CV4LK.js → chunk-NOF4HSGK.js} +3 -3
- package/dist/{processes-XF5CV4LK.js.map → chunk-NOF4HSGK.js.map} +1 -1
- package/dist/chunk-QW2OYR3N.js +7 -0
- package/dist/chunk-QW2OYR3N.js.map +1 -0
- package/dist/chunk-SR3X25TN.js +3 -0
- package/dist/chunk-SR3X25TN.js.map +1 -0
- package/dist/chunk-SV3I4CI7.js +440 -0
- package/dist/chunk-SV3I4CI7.js.map +1 -0
- package/dist/{chunk-TT2Q7YMZ.js → chunk-TC3BSUP7.js} +6 -6
- package/dist/{chunk-TT2Q7YMZ.js.map → chunk-TC3BSUP7.js.map} +1 -1
- package/dist/chunk-VJUTQAPJ.js +2 -0
- package/dist/chunk-VJUTQAPJ.js.map +1 -0
- package/dist/chunk-VWTBHLMX.js +1 -0
- package/dist/chunk-WFHIIVLL.js +719 -0
- package/dist/chunk-WFHIIVLL.js.map +1 -0
- package/dist/chunk-WPPUOTY6.js +6 -0
- package/dist/chunk-WPPUOTY6.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/{compaction-X46EQEPS.js → compaction-BTUJJ3LJ.js} +4 -4
- package/dist/config-QXWKEQON.js +2 -0
- package/dist/config-mutator-53XGR2NT.js +2 -0
- package/dist/conflict-detector-D7VIYPDI.js +2 -0
- package/dist/conflict-detector-D7VIYPDI.js.map +1 -0
- package/dist/{context-planner-G2J7FNNU.js → context-planner-I7ID7XF3.js} +3 -3
- package/dist/debug-N3B5NVJU.js +2 -0
- package/dist/discover-XJXQXXIO.js +4 -0
- package/dist/discover-XJXQXXIO.js.map +1 -0
- package/dist/doctor-SEOUFHSL.js +2 -0
- package/dist/{editor-chat-R54E65W5.js → editor-chat-RVLCKKB7.js} +2 -2
- package/dist/heal-YEQYWX2L.js +2 -0
- package/dist/inbox-BIN2S5XN.js +2 -0
- package/dist/index.d.ts +1292 -122
- package/dist/index.js +8 -8
- package/dist/index.js.map +1 -1
- package/dist/{ingest-whatsapp-NS4OWDOU.js → ingest-whatsapp-LZE62INA.js} +2 -2
- package/dist/loader-5CA3O5GM.js +2 -0
- package/dist/loader-6IHUCPVO.js +2 -0
- package/dist/memory-extract-KRCHD3OP.js +2 -0
- package/dist/migrate-v2-QO7SLKIM.js +4 -0
- package/dist/migrate-v2-QO7SLKIM.js.map +1 -0
- package/dist/processes-RJ6RDP32.js +2 -0
- package/dist/program-SASDC2GV.js +2 -0
- package/dist/providers-WVCMIW67.js +2 -0
- package/dist/query-HZYYRCLU.js +2 -0
- package/dist/recipes-EPLE2SNT.js +2 -0
- package/dist/registry-HM4ELSXS.js +2 -0
- package/dist/rotation-memo-GMTZPMNE.js +13 -0
- package/dist/rotation-memo-GMTZPMNE.js.map +1 -0
- package/dist/scheduler-XVFIK4XH.js +2 -0
- package/dist/{slack-PSQLVTGB.js → slack-6P7ZJ32Y.js} +2 -2
- package/dist/store-BAPDZHXE.js +2 -0
- package/dist/{subagent-2SJHSSJS.js → subagent-WV7QKQ3L.js} +2 -2
- package/dist/{task-store-NM7VKNLE.js → task-store-RHISEU6V.js} +2 -2
- package/dist/task-store-RHISEU6V.js.map +1 -0
- package/dist/{telegram-W4SLFMNY.js → telegram-PIYDRM46.js} +2 -2
- package/dist/timers-5LPZN55J.js +2 -0
- package/dist/timers-5LPZN55J.js.map +1 -0
- package/dist/types-VECTMYTO.js +2 -0
- package/dist/types-VECTMYTO.js.map +1 -0
- package/dist/types-ZRLHHCGB.js +2 -0
- package/dist/types-ZRLHHCGB.js.map +1 -0
- package/dist/web/activity-graph.global.js +654 -0
- package/dist/web/activity-graph.global.js.map +1 -0
- package/dist/web/workflow-editor.global.js +35 -12
- package/dist/web/workflow-editor.global.js.map +1 -1
- package/dist/{whatsapp-DCHRBRVV.js → whatsapp-PFRDMUMT.js} +2 -2
- package/dist/{whatsapp-state-6D6FHHD2.js → whatsapp-state-XMTCSRXU.js} +2 -2
- package/dist/wiki-53W5NLZV.js +2 -0
- package/dist/wiki-53W5NLZV.js.map +1 -0
- package/dist/workspace-setup-FPGN5VNY.js +2 -0
- package/dist/workspace-setup-FPGN5VNY.js.map +1 -0
- package/package.json +13 -2
- package/dist/agent-4AOMVXRJ.js +0 -2
- package/dist/board-dashboard-CXIVJKDP.js.map +0 -1
- package/dist/chunk-34NG7UDX.js +0 -11
- package/dist/chunk-34NG7UDX.js.map +0 -1
- package/dist/chunk-4HP6UC2X.js +0 -13
- package/dist/chunk-4HP6UC2X.js.map +0 -1
- package/dist/chunk-5WNGHDFC.js +0 -164
- package/dist/chunk-5WNGHDFC.js.map +0 -1
- package/dist/chunk-ABCHHNG6.js +0 -625
- package/dist/chunk-ABCHHNG6.js.map +0 -1
- package/dist/chunk-FIOB3MEX.js +0 -2
- package/dist/chunk-HCFSHGK4.js +0 -46
- package/dist/chunk-HCFSHGK4.js.map +0 -1
- package/dist/chunk-HHJGKD5B.js +0 -71
- package/dist/chunk-HHJGKD5B.js.map +0 -1
- package/dist/chunk-LEIYC3BF.js +0 -104
- package/dist/chunk-LEIYC3BF.js.map +0 -1
- package/dist/chunk-MBEQASP3.js +0 -5
- package/dist/chunk-MCJUAE6V.js +0 -6
- package/dist/chunk-MCJUAE6V.js.map +0 -1
- package/dist/chunk-SRHLXZRF.js +0 -7
- package/dist/chunk-SRHLXZRF.js.map +0 -1
- package/dist/chunk-WZEYII2S.js +0 -6
- package/dist/chunk-WZEYII2S.js.map +0 -1
- package/dist/chunk-XDJSYQST.js +0 -6
- package/dist/chunk-XDJSYQST.js.map +0 -1
- package/dist/chunk-YPOELN6Z.js +0 -798
- package/dist/chunk-YPOELN6Z.js.map +0 -1
- package/dist/config-KCYHMKCT.js +0 -2
- package/dist/config-mutator-QP4GLBOE.js +0 -2
- package/dist/debug-3MEUO2P2.js +0 -2
- package/dist/heal-JDXUPRET.js +0 -2
- package/dist/inbox-L5ZZ623Y.js.map +0 -1
- package/dist/loader-PTCXLJEX.js +0 -2
- package/dist/memory-extract-WH4FZ456.js +0 -2
- package/dist/program-FFWEILAS.js +0 -2
- package/dist/providers-AKQ4HTB4.js +0 -2
- package/dist/query-PKGYE5HR.js +0 -2
- package/dist/registry-IFMDJWQ7.js +0 -2
- package/dist/scheduler-63D5KFO7.js +0 -2
- package/dist/store-5MJOO74U.js +0 -2
- package/dist/timers-PCB4ZIBD.js +0 -2
- package/dist/types-C7IFH42Z.js +0 -2
- package/dist/types-OIFU3KSQ.js +0 -2
- package/dist/usage-dashboard-AXPXB2KP.js +0 -803
- package/dist/usage-dashboard-AXPXB2KP.js.map +0 -1
- package/dist/wiki-UDPYFJBL.js +0 -2
- package/dist/workspace-setup-C4VB3QZV.js +0 -2
- /package/dist/{agent-4AOMVXRJ.js.map → agent-57MG4LBM.js.map} +0 -0
- /package/dist/{chunk-EKTPCSN4.js.map → chunk-4ITQP3XL.js.map} +0 -0
- /package/dist/{chunk-FIOB3MEX.js.map → chunk-4YCH6IZV.js.map} +0 -0
- /package/dist/{chunk-63UYRJIC.js.map → chunk-IKBHHTIT.js.map} +0 -0
- /package/dist/{config-KCYHMKCT.js.map → chunk-VWTBHLMX.js.map} +0 -0
- /package/dist/{compaction-X46EQEPS.js.map → compaction-BTUJJ3LJ.js.map} +0 -0
- /package/dist/{config-mutator-QP4GLBOE.js.map → config-QXWKEQON.js.map} +0 -0
- /package/dist/{debug-3MEUO2P2.js.map → config-mutator-53XGR2NT.js.map} +0 -0
- /package/dist/{context-planner-G2J7FNNU.js.map → context-planner-I7ID7XF3.js.map} +0 -0
- /package/dist/{heal-JDXUPRET.js.map → debug-N3B5NVJU.js.map} +0 -0
- /package/dist/{loader-PTCXLJEX.js.map → doctor-SEOUFHSL.js.map} +0 -0
- /package/dist/{editor-chat-R54E65W5.js.map → editor-chat-RVLCKKB7.js.map} +0 -0
- /package/dist/{memory-extract-WH4FZ456.js.map → heal-YEQYWX2L.js.map} +0 -0
- /package/dist/{program-FFWEILAS.js.map → inbox-BIN2S5XN.js.map} +0 -0
- /package/dist/{ingest-whatsapp-NS4OWDOU.js.map → ingest-whatsapp-LZE62INA.js.map} +0 -0
- /package/dist/{providers-AKQ4HTB4.js.map → loader-5CA3O5GM.js.map} +0 -0
- /package/dist/{query-PKGYE5HR.js.map → loader-6IHUCPVO.js.map} +0 -0
- /package/dist/{registry-IFMDJWQ7.js.map → memory-extract-KRCHD3OP.js.map} +0 -0
- /package/dist/{scheduler-63D5KFO7.js.map → processes-RJ6RDP32.js.map} +0 -0
- /package/dist/{store-5MJOO74U.js.map → program-SASDC2GV.js.map} +0 -0
- /package/dist/{task-store-NM7VKNLE.js.map → providers-WVCMIW67.js.map} +0 -0
- /package/dist/{timers-PCB4ZIBD.js.map → query-HZYYRCLU.js.map} +0 -0
- /package/dist/{types-C7IFH42Z.js.map → recipes-EPLE2SNT.js.map} +0 -0
- /package/dist/{types-OIFU3KSQ.js.map → registry-HM4ELSXS.js.map} +0 -0
- /package/dist/{wiki-UDPYFJBL.js.map → scheduler-XVFIK4XH.js.map} +0 -0
- /package/dist/{slack-PSQLVTGB.js.map → slack-6P7ZJ32Y.js.map} +0 -0
- /package/dist/{workspace-setup-C4VB3QZV.js.map → store-BAPDZHXE.js.map} +0 -0
- /package/dist/{subagent-2SJHSSJS.js.map → subagent-WV7QKQ3L.js.map} +0 -0
- /package/dist/{telegram-W4SLFMNY.js.map → telegram-PIYDRM46.js.map} +0 -0
- /package/dist/{whatsapp-DCHRBRVV.js.map → whatsapp-PFRDMUMT.js.map} +0 -0
- /package/dist/{whatsapp-state-6D6FHHD2.js.map → whatsapp-state-XMTCSRXU.js.map} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import"./chunk-
|
|
1
|
+
import"./chunk-4YCH6IZV.js";var S="claude-haiku-4-5-20251001",x=`You are a context planner for an AI agent. Given the user's current message and recent conversation tail, decide what historical context the agent needs.
|
|
2
2
|
|
|
3
3
|
Output ONE JSON object on one line, no prose, no fences:
|
|
4
4
|
{ "recentTurns": number, "memory": { "include": boolean, "query": string }, "crossChat": boolean, "reasoning": string }
|
|
@@ -11,7 +11,7 @@ Rules:
|
|
|
11
11
|
|
|
12
12
|
Be conservative \u2014 unneeded context costs tokens. When in doubt, exclude.`;async function N(e){let s=Date.now(),o=e.timeoutMs??8e3,r=I(e.sessions,e.agentId,e.channel,e.chatId,4),t=[`Agent: ${e.agentId}`,`Channel: ${e.channel}`,r?`Recent conversation:
|
|
13
13
|
${r}`:"Recent conversation: (none \u2014 first message)","",`Current message: ${e.message.slice(0,1500)}`].join(`
|
|
14
|
-
`),n;try{let{createProvider:l}=await import("./providers-
|
|
14
|
+
`),n;try{let{createProvider:l}=await import("./providers-WVCMIW67.js"),y=l("claude"),f=new AbortController,p=setTimeout(()=>f.abort(),o);try{let b=await y.generate([{role:"system",content:x},{role:"user",content:t}],{model:S,maxTokens:256});n=w(b.content)}finally{clearTimeout(p)}}catch(l){return process.env.AGENTX_PLANNER_DEBUG&&console.error(`[planner] error: ${l?.message??l}`),null}if(!n||typeof n!="object")return null;let m=M(n.recentTurns,0,6,3),a=!!n.memory?.include,c=typeof n.memory?.query=="string"?n.memory.query:"",i=!!n.crossChat,u=typeof n.reasoning=="string"?n.reasoning:void 0,d=C(e.sessions,e.agentId,e.channel,e.chatId,m),g="";if(a&&c)try{let l=e.memoryStore.findRelevant(c,e.agentId,5);g=e.memoryStore.buildContext(l)}catch{}let h="";return i&&(h=e.sessions.getCrossSessionSummary(e.agentId,e.channel,e.chatId,"")),{sessionHistory:d,memoryContext:g,crossChatContext:h,debug:{recentTurns:m,memoryIncluded:a,memoryQuery:c||void 0,crossChatIncluded:i,reasoning:u,planLatencyMs:Date.now()-s}}}function C(e,s,o,r,t){if(t<=0)return"";let n=e.getSession(s,o,r);if(n.messages.length===0)return"";let m=Math.min(n.messages.length,t*2),a=n.messages.slice(-m),c=[`[Recent exchange \u2014 last ${a.length} messages]`];for(let i of a){let u=i.name||(i.role==="user"?"User":"Agent");c.push(`${u}: ${i.content}`)}return c.push("[End recent exchange \u2014 respond to the latest message above]"),c.push(""),c.join(`
|
|
15
15
|
`)}function I(e,s,o,r,t){let n=e.getSession(s,o,r);return n.messages.length===0?"":n.messages.slice(-t).map(a=>{let c=a.name||(a.role==="user"?"User":"Agent"),i=a.content.length>200?a.content.slice(0,200)+"\u2026":a.content;return` ${c}: ${i}`}).join(`
|
|
16
16
|
`)}function w(e){if(!e)return null;let s=e.trim();try{return JSON.parse(s)}catch{}let o=s.indexOf("{");if(o<0)return null;let r=0;for(let t=o;t<s.length;t++)if(s[t]==="{")r++;else if(s[t]==="}"&&(r--,r===0))try{return JSON.parse(s.slice(o,t+1))}catch{return null}return null}function M(e,s,o,r){let t=typeof e=="number"?Math.floor(e):Number.parseInt(String(e??""),10);return Number.isFinite(t)?Math.min(o,Math.max(s,t)):r}export{N as planContext};
|
|
17
|
-
//# sourceMappingURL=context-planner-
|
|
17
|
+
//# sourceMappingURL=context-planner-I7ID7XF3.js.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import"./chunk-4YCH6IZV.js";var $=/\bssh\s+(?:-i\s+(\S+)\s+)?([a-z_][a-z0-9_-]*)@([a-z0-9][a-z0-9.-]+|\d{1,3}(?:\.\d{1,3}){3})/gi,R=/\b(?:\d{1,3}\.){3}\d{1,3}\b/g,y=/\b([a-z0-9][a-z0-9._-]*)@([a-z0-9][a-z0-9.-]+\.[a-z]{2,})\b/gi;var k=/groups\/([a-z0-9][a-z0-9._-]+)[^\n|]*\(?\s*ID:?\s*(\d+)\s*\)?/gi,_=/(\/Users\/[^\s)`'"\]]+|\/home\/[^\s)`'"\]]+|\/var\/www\/[^\s)`'"\]]+|\/etc\/[^\s)`'"\]]+)/g,v=/(\+\d{1,3}[\s.-]?(?:\(\d+\)[\s.-]?)?\d[\s.\d-]{6,}\d)/g,z=/^(?:127\.|10\.|192\.168\.|172\.(?:1[6-9]|2\d|3[01])\.)/;function x(i,r){let s={byKind:{ssh:[],gitlab:[],path:[],contact:[]},scannedSkills:[],diagnostics:[]},c=new Set;for(let a of i){let e=a.frontmatter,n=a.instructions??"";if(r.filter?.length){let t=[e.name,e.description,...e.tags??[],e.category??"",a.path??"",n.slice(0,500)].join(" ").toLowerCase();if(!r.filter.some(u=>t.includes(u.toLowerCase())))continue}s.scannedSkills.push(e.name);let o=e.name;for(let t of w(n,r.namespace,o))m(s,t,"ssh",c)&&s.diagnostics.push({skill:e.name,kind:"ssh",id:t.id});for(let t of E(n,r.namespace,r.gitlabHost))m(s,t,"gitlab",c)&&s.diagnostics.push({skill:e.name,kind:"gitlab",id:t.id});for(let t of I(n,r.namespace))m(s,t,"path",c)&&s.diagnostics.push({skill:e.name,kind:"path",id:t.id});for(let t of j(n,r.namespace))m(s,t,"contact",c)&&s.diagnostics.push({skill:e.name,kind:"contact",id:t.id})}return s}function m(i,r,s,c){return c.has(r.id)?!1:(c.add(r.id),i.byKind[s].push(r),!0)}function w(i,r,s){let c=[];for(let e of i.matchAll($)){let[,n,o,t]=e;if(!o||!t)continue;let d=g(`${o}-${t.replace(/[^a-z0-9-]/gi,"-")}`);c.push({id:`${r}.ssh.${d}`,kind:"ssh",summary:`SSH ${o}@${t}`,fields:D({user:o,host:t,key:n}),tags:["discovered"],ownerAgent:s})}let a=new Set(c.flatMap(e=>Object.values(e.fields)));for(let e of i.matchAll(R)){let n=e[0];if(a.has(n)||z.test(n))continue;let o=g(`host-${n.replace(/\./g,"-")}`);c.push({id:`${r}.ssh.${o}`,kind:"ssh",summary:`Host ${n} (user not detected \u2014 fill in)`,fields:{host:n},tags:["discovered","needs-review"],ownerAgent:s}),a.add(n)}return c}var C=/\b([a-z0-9][a-z0-9._-]{1,40})\/([a-z0-9][a-z0-9._-]{1,40})\b/i,A=/\b(\d{1,8})\b/g;function E(i,r,s){let c=[];if(s&&!i.includes(s.replace(/^https?:\/\//,"")))return c;for(let e of i.matchAll(k)){let[,n,o]=e;!n||!o||c.push({id:`${r}.gitlab.group.${g(n)}`,kind:"gitlab",summary:`GitLab group ${n}`,fields:{groupId:Number(o),path:n},tags:["discovered"]})}let a=new RegExp(C.source,"gi");for(let e of i.split(/\r?\n/)){if(!/^\s*\|.+\|/.test(e)&&!/\bID[:\s]/i.test(e)&&!/gitlab/i.test(e))continue;let o,t,d=e.match(/https?:\/\/[^\s)]*gitlab[^\s)]*?\/([a-z0-9][a-z0-9._-]+)\/([a-z0-9][a-z0-9._-]+)/i);if(d&&d[1]&&d[2])o=d[1],t=d[2].replace(/[).,;:]+$/,"");else for(let f of e.matchAll(a)){let p=f[1],h=f[2];!p||!h||p==="wp-content"||h==="wp-content"||p.includes(".")||S(h)||(o=p,t=h)}if(!o||!t)continue;let l=[...e.matchAll(A)].map(f=>Number(f[1])).find(f=>f>=10&&f<=9999999);l&&c.push({id:`${r}.gitlab.project.${g(t)}`,kind:"gitlab",summary:`GitLab project ${o}/${t}`,fields:{projectId:l,path:`${o}/${t}`},tags:["discovered"]})}return c}function S(i){return/\.(md|ya?ml|json|ts|tsx|js|jsx|py|sh|conf|env)$/i.test(i)}function I(i,r){let s=[];for(let c of i.matchAll(_)){let a=c[1].replace(/[.,;:)]+$/,"");if(a.length<4)continue;let e=g(a.replace(/^\//,"").replace(/[/.]/g,"-"));s.push({id:`${r}.paths.${e}`,kind:"path",summary:a,fields:{path:a},tags:["discovered"]})}return s}function j(i,r){let s=[];for(let a of i.matchAll(y)){let[,e,n]=a;if(n.endsWith(".png")||n.endsWith(".jpg"))continue;let o=g(e);s.push({id:`${r}.contacts.${o}`,kind:"contact",summary:`${e}@${n}`,fields:{email:`${e}@${n}`},tags:["discovered"]})}let c=[...i.matchAll(v)].map(a=>a[1].trim());for(let a of c){let e=g(`phone-${a.replace(/\D+/g,"")}`);s.push({id:`${r}.contacts.${e}`,kind:"contact",summary:`Phone ${a}`,fields:{mobile:a},tags:["discovered","needs-review"]})}return s}function D(i){let r={};for(let[s,c]of Object.entries(i))c===void 0||c===""||(r[s]=c);return r}function g(i){return i.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,60)||"x"}function L(i,r){let s={},c={ssh:"ssh.yaml",gitlab:"gitlab.yaml",path:"paths.yaml",contact:"contacts.yaml"};for(let[a,e]of Object.entries(i.byKind)){if(e.length===0)continue;let n=`${r}.${a==="path"?"paths":a==="contact"?"contacts":a}`,o=["# Discovered automatically by 'agentx references discover'.",'# Review every card \u2014 flagged ones (tags include "needs-review") are',"# best-effort guesses. Set lastVerified once you've confirmed.",`namespace: ${n}`,"cards:"];for(let t of e){let d=t.id.startsWith(`${n}.`)?t.id.slice(n.length+1):t.id;o.push(` - id: ${d}`),o.push(` kind: ${t.kind}`),o.push(` summary: ${b(t.summary)}`),o.push(" fields:");for(let[u,l]of Object.entries(t.fields))o.push(` ${u}: ${typeof l=="number"||typeof l=="boolean"?l:b(String(l))}`);o.push(` tags: [${t.tags.join(", ")}]`),t.ownerAgent&&o.push(` ownerAgent: ${t.ownerAgent}`)}s[c[a]]=o.join(`
|
|
2
|
+
`)+`
|
|
3
|
+
`}return s}function b(i){return/^[A-Za-z0-9_./@+:-]+$/.test(i)&&!/^\d/.test(i)?i:`"${i.replace(/"/g,'\\"')}"`}export{x as discoverFromSkills,L as renderDiscovery};
|
|
4
|
+
//# sourceMappingURL=discover-XJXQXXIO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/agents/references/discover.ts"],"sourcesContent":["import type { Skill } from \"@/agent/skills/types\"\nimport type { ReferenceCard, ReferenceKind } from \"./types\"\n\n// --- References discovery ---\n//\n// Pure extractor: given a namespace and a bag of source skills, walk their\n// markdown bodies and pull out structured facts (SSH hosts, GitLab project\n// IDs, filesystem paths, contacts) as ReferenceCard[]. Deterministic regex —\n// no LLM in the loop. Operator reviews the output and edits before flipping\n// `contextReferences: true` on the agents.\n\nconst SSH_LINE_RE = /\\bssh\\s+(?:-i\\s+(\\S+)\\s+)?([a-z_][a-z0-9_-]*)@([a-z0-9][a-z0-9.-]+|\\d{1,3}(?:\\.\\d{1,3}){3})/gi\nconst IP_RE = /\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b/g\nconst EMAIL_RE = /\\b([a-z0-9][a-z0-9._-]*)@([a-z0-9][a-z0-9.-]+\\.[a-z]{2,})\\b/gi\nconst GITLAB_PROJECT_LINE_RE = /([a-z0-9][a-z0-9._-]+)\\/([a-z0-9][a-z0-9._-]+)[^\\n|]*\\(?\\s*ID:?\\s*(\\d+)\\s*\\)?/gi\nconst GITLAB_GROUP_RE = /groups\\/([a-z0-9][a-z0-9._-]+)[^\\n|]*\\(?\\s*ID:?\\s*(\\d+)\\s*\\)?/gi\nconst PATH_RE = /(\\/Users\\/[^\\s)`'\"\\]]+|\\/home\\/[^\\s)`'\"\\]]+|\\/var\\/www\\/[^\\s)`'\"\\]]+|\\/etc\\/[^\\s)`'\"\\]]+)/g\nconst PHONE_RE = /(\\+\\d{1,3}[\\s.-]?(?:\\(\\d+\\)[\\s.-]?)?\\d[\\s.\\d-]{6,}\\d)/g\nconst PRIVATE_IP_RE = /^(?:127\\.|10\\.|192\\.168\\.|172\\.(?:1[6-9]|2\\d|3[01])\\.)/\n\nexport interface DiscoveryResult {\n /** Cards keyed by kind (ssh, gitlab, path, contact). */\n byKind: Record<string, ReferenceCard[]>\n /** Skills that were scanned. */\n scannedSkills: string[]\n /** Per-source diagnostics — what was found in which skill. */\n diagnostics: Array<{ skill: string; kind: string; id: string }>\n}\n\nexport interface DiscoveryOptions {\n /** Namespace prefix applied to every generated card id. */\n namespace: string\n /** Include only skills whose name OR tags contain any of these substrings.\n * Empty = scan every skill. */\n filter?: string[]\n /** Optional GitLab host to validate project URLs against (e.g.\n * https://gitlab.noqta.tn). When set, project URLs from other hosts are\n * ignored — keeps stray GitHub mentions out of a self-hosted registry. */\n gitlabHost?: string\n}\n\nexport function discoverFromSkills(skills: Skill[], opts: DiscoveryOptions): DiscoveryResult {\n const result: DiscoveryResult = {\n byKind: { ssh: [], gitlab: [], path: [], contact: [] },\n scannedSkills: [],\n diagnostics: [],\n }\n const seen = new Set<string>() // id de-dup across skills\n\n for (const skill of skills) {\n const fm = skill.frontmatter\n const body = skill.instructions ?? \"\"\n if (opts.filter?.length) {\n const hay = [\n fm.name,\n fm.description,\n ...(fm.tags ?? []),\n (fm as any).category ?? \"\",\n skill.path ?? \"\",\n body.slice(0, 500), // first ~125 tokens of body, enough for a \"MTGL Odoo Server\" header\n ].join(\" \").toLowerCase()\n const hit = opts.filter.some(f => hay.includes(f.toLowerCase()))\n if (!hit) continue\n }\n result.scannedSkills.push(fm.name)\n\n const ownerHint = fm.name\n\n for (const card of extractSshCards(body, opts.namespace, ownerHint)) {\n if (push(result, card, \"ssh\", seen)) result.diagnostics.push({ skill: fm.name, kind: \"ssh\", id: card.id })\n }\n for (const card of extractGitlabCards(body, opts.namespace, opts.gitlabHost)) {\n if (push(result, card, \"gitlab\", seen)) result.diagnostics.push({ skill: fm.name, kind: \"gitlab\", id: card.id })\n }\n for (const card of extractPathCards(body, opts.namespace)) {\n if (push(result, card, \"path\", seen)) result.diagnostics.push({ skill: fm.name, kind: \"path\", id: card.id })\n }\n for (const card of extractContactCards(body, opts.namespace)) {\n if (push(result, card, \"contact\", seen)) result.diagnostics.push({ skill: fm.name, kind: \"contact\", id: card.id })\n }\n }\n\n return result\n}\n\nfunction push(\n result: DiscoveryResult,\n card: ReferenceCard,\n kind: ReferenceKind,\n seen: Set<string>,\n): boolean {\n if (seen.has(card.id)) return false\n seen.add(card.id)\n result.byKind[kind].push(card)\n return true\n}\n\n// ---- Extractors ----\n\nfunction extractSshCards(body: string, ns: string, owner: string): ReferenceCard[] {\n const cards: ReferenceCard[] = []\n for (const m of body.matchAll(SSH_LINE_RE)) {\n const [, key, user, host] = m\n if (!user || !host) continue\n const slug = slugify(`${user}-${host.replace(/[^a-z0-9-]/gi, \"-\")}`)\n cards.push({\n id: `${ns}.ssh.${slug}`,\n kind: \"ssh\",\n summary: `SSH ${user}@${host}`,\n fields: cleanFields({ user, host, key }),\n tags: [\"discovered\"],\n ownerAgent: owner,\n })\n }\n // Catch IPs not already paired with a user\n const claimed = new Set(cards.flatMap(c => Object.values(c.fields)))\n for (const m of body.matchAll(IP_RE)) {\n const ip = m[0]\n if (claimed.has(ip)) continue\n if (PRIVATE_IP_RE.test(ip)) continue\n const slug = slugify(`host-${ip.replace(/\\./g, \"-\")}`)\n cards.push({\n id: `${ns}.ssh.${slug}`,\n kind: \"ssh\",\n summary: `Host ${ip} (user not detected — fill in)`,\n fields: { host: ip },\n tags: [\"discovered\", \"needs-review\"],\n ownerAgent: owner,\n })\n claimed.add(ip)\n }\n return cards\n}\n\nconst PROJECT_LINE_RE = /\\b([a-z0-9][a-z0-9._-]{1,40})\\/([a-z0-9][a-z0-9._-]{1,40})\\b/i\nconst ID_NUM_RE = /\\b(\\d{1,8})\\b/g\n\nfunction extractGitlabCards(body: string, ns: string, gitlabHost?: string): ReferenceCard[] {\n const cards: ReferenceCard[] = []\n if (gitlabHost && !body.includes(gitlabHost.replace(/^https?:\\/\\//, \"\"))) return cards\n // Group lines anywhere\n for (const m of body.matchAll(GITLAB_GROUP_RE)) {\n const [, slug, id] = m\n if (!slug || !id) continue\n cards.push({\n id: `${ns}.gitlab.group.${slugify(slug)}`,\n kind: \"gitlab\",\n summary: `GitLab group ${slug}`,\n fields: { groupId: Number(id), path: slug },\n tags: [\"discovered\"],\n })\n }\n // Project lines: walk line-by-line so table rows (\"| g/p | 269 |\") are\n // handled the same way as prose (\"g/p (ID: 269)\"). For each line that\n // mentions <group>/<project>, take the rightmost plausible numeric ID.\n const projectGlobalRe = new RegExp(PROJECT_LINE_RE.source, \"gi\")\n for (const line of body.split(/\\r?\\n/)) {\n // Skip lines that look like prose mentioning a path, not a GitLab project.\n // Real GitLab callouts almost always include \"ID:\" or a gitlab.* hostname\n // in the same line, or appear inside a markdown table row. Without one of\n // those, the noise rate is too high.\n const isTableRow = /^\\s*\\|.+\\|/.test(line)\n if (!isTableRow && !/\\bID[:\\s]/i.test(line) && !/gitlab/i.test(line)) continue\n // Two-pass: prefer a GitLab URL (https://gitlab.<host>/<group>/<repo>)\n // when present on the line, otherwise fall back to the rightmost\n // <group>/<repo> token that doesn't have a hostname-shaped group.\n let group: string | undefined\n let repo: string | undefined\n const urlMatch = line.match(/https?:\\/\\/[^\\s)]*gitlab[^\\s)]*?\\/([a-z0-9][a-z0-9._-]+)\\/([a-z0-9][a-z0-9._-]+)/i)\n if (urlMatch && urlMatch[1] && urlMatch[2]) {\n group = urlMatch[1]\n repo = urlMatch[2].replace(/[).,;:]+$/, \"\")\n } else {\n // Walk every <a>/<b> on the line and keep the last one that looks like\n // a real group/repo (no dots in group, not a wp-content path, not a file).\n for (const m of line.matchAll(projectGlobalRe)) {\n const g = m[1]\n const r = m[2]\n if (!g || !r) continue\n if (g === \"wp-content\" || r === \"wp-content\") continue\n if (g.includes(\".\")) continue\n if (looksLikeFile(r)) continue\n group = g\n repo = r\n }\n }\n if (!group || !repo) continue\n const ids = [...line.matchAll(ID_NUM_RE)].map(m => Number(m[1]))\n const id = ids.find(n => n >= 10 && n <= 9_999_999)\n if (!id) continue\n cards.push({\n id: `${ns}.gitlab.project.${slugify(repo)}`,\n kind: \"gitlab\",\n summary: `GitLab project ${group}/${repo}`,\n fields: { projectId: id, path: `${group}/${repo}` },\n tags: [\"discovered\"],\n })\n }\n return cards\n}\n\nfunction looksLikeFile(s: string): boolean {\n return /\\.(md|ya?ml|json|ts|tsx|js|jsx|py|sh|conf|env)$/i.test(s)\n}\n\nfunction extractPathCards(body: string, ns: string): ReferenceCard[] {\n const cards: ReferenceCard[] = []\n for (const m of body.matchAll(PATH_RE)) {\n let p = m[1].replace(/[.,;:)]+$/, \"\") // strip trailing punctuation\n if (p.length < 4) continue\n const slug = slugify(p.replace(/^\\//, \"\").replace(/[/.]/g, \"-\"))\n cards.push({\n id: `${ns}.paths.${slug}`,\n kind: \"path\",\n summary: p,\n fields: { path: p },\n tags: [\"discovered\"],\n })\n }\n return cards\n}\n\nfunction extractContactCards(body: string, ns: string): ReferenceCard[] {\n const cards: ReferenceCard[] = []\n for (const m of body.matchAll(EMAIL_RE)) {\n const [, local, domain] = m\n if (domain.endsWith(\".png\") || domain.endsWith(\".jpg\")) continue // junk filter\n const slug = slugify(local)\n cards.push({\n id: `${ns}.contacts.${slug}`,\n kind: \"contact\",\n summary: `${local}@${domain}`,\n fields: { email: `${local}@${domain}` },\n tags: [\"discovered\"],\n })\n }\n // Best-effort: if a phone appears on the same line as a known contact email\n // we already picked, attach it. Otherwise drop a standalone phone card.\n const phones = [...body.matchAll(PHONE_RE)].map(m => m[1].trim())\n for (const phone of phones) {\n const slug = slugify(`phone-${phone.replace(/\\D+/g, \"\")}`)\n cards.push({\n id: `${ns}.contacts.${slug}`,\n kind: \"contact\",\n summary: `Phone ${phone}`,\n fields: { mobile: phone },\n tags: [\"discovered\", \"needs-review\"],\n })\n }\n return cards\n}\n\n// ---- Helpers ----\n\nfunction cleanFields(fields: Record<string, string | number | boolean | undefined>): Record<string, string | number | boolean> {\n const out: Record<string, string | number | boolean> = {}\n for (const [k, v] of Object.entries(fields)) {\n if (v === undefined || v === \"\") continue\n out[k] = v\n }\n return out\n}\n\nfunction slugify(input: string): string {\n return input\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 60) || \"x\"\n}\n\n/**\n * Render a discovery result as YAML-ready file contents, one per kind.\n * Output is a complete `ReferenceFile`-shaped payload, ready to write to\n * `.agentx/references/<ns>/{ssh,gitlab,paths,contacts}.yaml`.\n */\nexport function renderDiscovery(result: DiscoveryResult, namespace: string): Record<string, string> {\n const out: Record<string, string> = {}\n const fileMap: Record<string, string> = {\n ssh: \"ssh.yaml\",\n gitlab: \"gitlab.yaml\",\n path: \"paths.yaml\",\n contact: \"contacts.yaml\",\n }\n for (const [kind, cards] of Object.entries(result.byKind)) {\n if (cards.length === 0) continue\n const ns = `${namespace}.${kind === \"path\" ? \"paths\" : kind === \"contact\" ? \"contacts\" : kind}`\n const lines = [\n `# Discovered automatically by 'agentx references discover'.`,\n `# Review every card — flagged ones (tags include \"needs-review\") are`,\n `# best-effort guesses. Set lastVerified once you've confirmed.`,\n `namespace: ${ns}`,\n `cards:`,\n ]\n for (const card of cards) {\n // Strip the namespace from the id so the file's `namespace:` doesn't\n // double-apply it on load.\n const localId = card.id.startsWith(`${ns}.`) ? card.id.slice(ns.length + 1) : card.id\n lines.push(` - id: ${localId}`)\n lines.push(` kind: ${card.kind}`)\n lines.push(` summary: ${quote(card.summary)}`)\n lines.push(` fields:`)\n for (const [k, v] of Object.entries(card.fields)) {\n lines.push(` ${k}: ${typeof v === \"number\" || typeof v === \"boolean\" ? v : quote(String(v))}`)\n }\n lines.push(` tags: [${card.tags.join(\", \")}]`)\n if (card.ownerAgent) lines.push(` ownerAgent: ${card.ownerAgent}`)\n }\n out[fileMap[kind]] = lines.join(\"\\n\") + \"\\n\"\n }\n return out\n}\n\nfunction quote(s: string): string {\n if (/^[A-Za-z0-9_./@+:-]+$/.test(s) && !/^\\d/.test(s)) return s\n return `\"${s.replace(/\"/g, '\\\\\"')}\"`\n}\n"],"mappings":"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","names":["SSH_LINE_RE","IP_RE","EMAIL_RE","GITLAB_GROUP_RE","PATH_RE","PHONE_RE","PRIVATE_IP_RE","discoverFromSkills","skills","opts","result","seen","skill","fm","body","hay","f","ownerHint","card","extractSshCards","push","extractGitlabCards","extractPathCards","extractContactCards","kind","ns","owner","cards","m","SSH_LINE_RE","key","user","host","slug","slugify","cleanFields","claimed","c","IP_RE","ip","PROJECT_LINE_RE","ID_NUM_RE","gitlabHost","id","projectGlobalRe","line","group","repo","urlMatch","g","r","looksLikeFile","n","s","p","EMAIL_RE","local","domain","phones","phone","fields","out","k","v","input","renderDiscovery","namespace","fileMap","lines","localId","quote"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import"./chunk-
|
|
1
|
+
import"./chunk-4YCH6IZV.js";function u(o){let r=o.store.list().map(t=>({id:t.id,title:t.title})),s=o.actors.listActors().map(t=>t.id),n=o.actors.listRoles().map(t=>t.id),e=[];if(e.push(i),e.push(""),e.push(l),e.push(""),e.push("# Environment \u2014 only reference values that exist"),e.push(""),e.push("## Available agents (for `agent` nodes)"),o.availableAgents.length===0)e.push(" (none registered \u2014 the user must add an agent first for `agent` nodes to work)");else for(let t of o.availableAgents)e.push(` - \`${t.id}\`${t.description?` \u2014 ${t.description}`:""}`);if(e.push(""),e.push("## Available actors (for `userTask.assignTo`)"),s.length===0)e.push(" (none \u2014 user must register actors with `agentx actor add <id> \u2026` before workflows can use `userTask`)");else for(let t of s)e.push(` - \`${t}\``);if(e.push(""),e.push("## Available roles (for `userTask.assignTo`)"),n.length===0)e.push(" (none)");else for(let t of n)e.push(` - \`${t}\``);if(e.push(""),e.push("## Available channels (for `action.*` and `trigger.channel`)"),e.push(` ${o.availableChannels.length?o.availableChannels.map(t=>`\`${t}\``).join(", "):"(none live on this node)"}`),e.push(""),e.push("## Existing workflows (for `subProcess.workflowId`)"),r.length===0)e.push(" (no other workflows defined)");else for(let t of r)e.push(` - \`${t.id}\` \u2014 ${t.title}`);e.push(""),o.currentWorkflow&&(e.push("# Current workflow on canvas"),e.push(""),e.push("The user is editing this workflow. Build on it \u2014 do NOT replace it unless they explicitly ask."),e.push(""),e.push("```json"),e.push(JSON.stringify(o.currentWorkflow,null,2)),e.push("```"),e.push("")),e.push("# Conversation"),e.push("");for(let t of o.messages){let a=t.role==="user"?"USER":"ASSISTANT";e.push(`${a}: ${t.content}`),e.push("")}return e.push(c),e.join(`
|
|
2
2
|
`)}function d(o){let r=/```(?:json)?\s*\n([\s\S]*?)```/.exec(o),s=[];r&&s.push(r[1]);let n=o.match(/\{[\s\S]*\}/);n&&s.push(n[0]);for(let e of s)try{let t=JSON.parse(e);if(t&&typeof t=="object"&&"id"in t&&"nodes"in t)return t}catch{}return null}var i=`You are AgentX's workflow author. The user describes a business process in
|
|
3
3
|
plain language; you return a valid V2 workflow JSON that implements it.
|
|
4
4
|
|
|
@@ -134,4 +134,4 @@ Only reference agent ids, actor ids, role ids, and channel names that
|
|
|
134
134
|
appear in the Environment section above. If the user asks for an agent
|
|
135
135
|
that doesn't exist, tell them which agent to register first. Never
|
|
136
136
|
invent workflowIds for subProcess that aren't in the existing list.`;export{u as buildWorkflowAuthorPrompt,d as extractWorkflowJson};
|
|
137
|
-
//# sourceMappingURL=editor-chat-
|
|
137
|
+
//# sourceMappingURL=editor-chat-RVLCKKB7.js.map
|