agentix-cli 0.68.1 → 0.69.1
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/{agent-32KAOR6W.js → agent-K7EPLYCP.js} +2 -2
- package/dist/{board-dashboard-DJXGWM4G.js → board-dashboard-BWB2FLOA.js} +186 -186
- package/dist/board-dashboard-BWB2FLOA.js.map +1 -0
- package/dist/chunk-37P3DKSX.js +649 -0
- package/dist/chunk-37P3DKSX.js.map +1 -0
- package/dist/{chunk-XFI63BEM.js → chunk-3XEN24B7.js} +7 -7
- package/dist/chunk-3XEN24B7.js.map +1 -0
- package/dist/{chunk-RX5VVHT4.js → chunk-ART666G6.js} +2 -2
- package/dist/{chunk-FZSEHYYU.js → chunk-CUZWGTXT.js} +2 -2
- package/dist/{chunk-G5JUY265.js → chunk-F2DEKA2Q.js} +2 -2
- package/dist/chunk-GQ76J72O.js +3 -0
- package/dist/chunk-GQ76J72O.js.map +1 -0
- package/dist/{chunk-DXOLLHVZ.js → chunk-HEJOWP7O.js} +2 -2
- package/dist/chunk-ILEC3IAV.js +3 -0
- package/dist/chunk-ILEC3IAV.js.map +1 -0
- package/dist/chunk-KA2UIZXG.js +3 -0
- package/dist/chunk-KA2UIZXG.js.map +1 -0
- package/dist/{chunk-7R334NQ5.js → chunk-KSDVKLHN.js} +2 -2
- package/dist/{chunk-LP4DLIZ5.js → chunk-KSUCHOH2.js} +19 -18
- package/dist/chunk-KSUCHOH2.js.map +1 -0
- package/dist/chunk-KXR6GVL7.js +5 -0
- package/dist/chunk-KXR6GVL7.js.map +1 -0
- package/dist/chunk-NMFXY3QU.js +2 -0
- package/dist/chunk-NMFXY3QU.js.map +1 -0
- package/dist/{chunk-HMW5CVOT.js → chunk-PDGPHE35.js} +2 -2
- package/dist/{chunk-FGRD3JAX.js → chunk-Q2WW2HF4.js} +2 -2
- package/dist/chunk-S4ASFOJU.js +2 -0
- package/dist/chunk-S4ASFOJU.js.map +1 -0
- package/dist/{chunk-NRSXMPFM.js → chunk-USTQPX4Y.js} +205 -205
- package/dist/chunk-USTQPX4Y.js.map +1 -0
- package/dist/{chunk-TX7MWUC4.js → chunk-VOS2IW4V.js} +2 -2
- package/dist/{chunk-REFLUAXH.js → chunk-X5BWHPR7.js} +2 -2
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/fact-proposals-LZWS5KFO.js +2 -0
- package/dist/{facts-72AFTTDG.js → facts-X44PF73W.js} +2 -2
- package/dist/index.d.ts +40 -12
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/ledger-CH7R756S.js +2 -0
- package/dist/memory-migrate-ED37IBEL.js +2 -0
- package/dist/memory-migrate-ED37IBEL.js.map +1 -0
- package/dist/program-44FEGUCB.js +2 -0
- package/dist/{promote-FDEKCVAE.js → promote-XRKH73IB.js} +2 -2
- package/dist/query-6272PJPD.js +2 -0
- package/dist/questions-ZATLU5AW.js +2 -0
- package/dist/registry-HMVIS6QJ.js +2 -0
- package/dist/{request-planner-KQLWWR3U.js → request-planner-73Y5GI3D.js} +2 -2
- package/dist/{review-candidates-A6CLXAFS.js → review-candidates-VF5IWP5P.js} +2 -2
- package/dist/rotation-memo-store-A4YW6FSK.js +2 -0
- package/dist/rotation-memo-store-A4YW6FSK.js.map +1 -0
- package/dist/routing-T24BMMLM.js +2 -0
- package/dist/routing-T24BMMLM.js.map +1 -0
- package/dist/{seat-W3ZTOJUT.js → seat-XNA2O6EO.js} +2 -2
- package/dist/seat-XNA2O6EO.js.map +1 -0
- package/dist/{select-VPOWFRSN.js → select-WOUZIR3Y.js} +2 -2
- package/dist/web/activity-graph.global.js +75 -11
- package/dist/web/activity-graph.global.js.map +1 -1
- package/dist/wiki-W6WI6HL3.js +2 -0
- package/dist/wiki-W6WI6HL3.js.map +1 -0
- package/package.json +1 -1
- package/dist/board-dashboard-DJXGWM4G.js.map +0 -1
- package/dist/chunk-5V6HNNFY.js +0 -2
- package/dist/chunk-5V6HNNFY.js.map +0 -1
- package/dist/chunk-HNR6GLNV.js +0 -648
- package/dist/chunk-HNR6GLNV.js.map +0 -1
- package/dist/chunk-L52X3YGH.js +0 -2
- package/dist/chunk-L52X3YGH.js.map +0 -1
- package/dist/chunk-LP4DLIZ5.js.map +0 -1
- package/dist/chunk-NRSXMPFM.js.map +0 -1
- package/dist/chunk-XFI63BEM.js.map +0 -1
- package/dist/program-7QBU5CYO.js +0 -2
- package/dist/query-PJG52OHP.js +0 -2
- package/dist/questions-2V2VGIT4.js +0 -3
- package/dist/questions-2V2VGIT4.js.map +0 -1
- package/dist/registry-BVOLZUYL.js +0 -2
- package/dist/routing-5G22WTPR.js +0 -2
- package/dist/wiki-ZM6BEOFX.js +0 -2
- /package/dist/{agent-32KAOR6W.js.map → agent-K7EPLYCP.js.map} +0 -0
- /package/dist/{chunk-RX5VVHT4.js.map → chunk-ART666G6.js.map} +0 -0
- /package/dist/{chunk-FZSEHYYU.js.map → chunk-CUZWGTXT.js.map} +0 -0
- /package/dist/{chunk-G5JUY265.js.map → chunk-F2DEKA2Q.js.map} +0 -0
- /package/dist/{chunk-DXOLLHVZ.js.map → chunk-HEJOWP7O.js.map} +0 -0
- /package/dist/{chunk-7R334NQ5.js.map → chunk-KSDVKLHN.js.map} +0 -0
- /package/dist/{chunk-HMW5CVOT.js.map → chunk-PDGPHE35.js.map} +0 -0
- /package/dist/{chunk-FGRD3JAX.js.map → chunk-Q2WW2HF4.js.map} +0 -0
- /package/dist/{chunk-TX7MWUC4.js.map → chunk-VOS2IW4V.js.map} +0 -0
- /package/dist/{chunk-REFLUAXH.js.map → chunk-X5BWHPR7.js.map} +0 -0
- /package/dist/{program-7QBU5CYO.js.map → fact-proposals-LZWS5KFO.js.map} +0 -0
- /package/dist/{facts-72AFTTDG.js.map → facts-X44PF73W.js.map} +0 -0
- /package/dist/{promote-FDEKCVAE.js.map → ledger-CH7R756S.js.map} +0 -0
- /package/dist/{query-PJG52OHP.js.map → program-44FEGUCB.js.map} +0 -0
- /package/dist/{registry-BVOLZUYL.js.map → promote-XRKH73IB.js.map} +0 -0
- /package/dist/{routing-5G22WTPR.js.map → query-6272PJPD.js.map} +0 -0
- /package/dist/{seat-W3ZTOJUT.js.map → questions-ZATLU5AW.js.map} +0 -0
- /package/dist/{wiki-ZM6BEOFX.js.map → registry-HMVIS6QJ.js.map} +0 -0
- /package/dist/{request-planner-KQLWWR3U.js.map → request-planner-73Y5GI3D.js.map} +0 -0
- /package/dist/{review-candidates-A6CLXAFS.js.map → review-candidates-VF5IWP5P.js.map} +0 -0
- /package/dist/{select-VPOWFRSN.js.map → select-WOUZIR3Y.js.map} +0 -0
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{a as d,c as F}from"./chunk-KA2UIZXG.js";import{c as u,j as g,k as f}from"./chunk-GQ76J72O.js";import{a as l}from"./chunk-ILEC3IAV.js";import{createHash as w}from"crypto";var m=(t,r)=>"fp-"+w("sha1").update(`${t}\0${r.toLowerCase().replace(/\s+/g," ").trim()}`).digest("hex").slice(0,10);function b(t){let r=t.replace(/^[-*•]\s*/,"").replace(/\s*\((?:[^)]*)\)\s*$/,"").trim(),s=r.match(/^(.{2,60}?)\s+(?:is|are|was|were|has been|went|got)\s+(.{1,80})$/i);if(!s)return{};let a=u(r);return{subject:s[1].trim(),attribute:a==="stable"?"state":`${a} status`,value:s[2].trim()}}function y(t,r,s){let a=t.at??new Date().toISOString(),e=f(s),o=u(s);return{id:r,status:"pending",claim:s,...b(s),volatility:o==="stable"?"work-state":o,source:e?.source??`${t.origin} (unchecked summary)`,verifiedAt:e?.verifiedAt??a,verifiedBy:t.agentId,origin:t.origin,agentId:t.agentId,...t.chat?{chat:t.chat}:{},createdAt:a}}function I(t,r){return r.length===0?[]:t.update(s=>{let a=[],e=!1;for(let o of r){let i=o.claim.replace(/^[-*•]\s*/,"").trim();if(!i)continue;let c=m(o.agentId,i),n=s.proposals.find(v=>v.id===c);if(n){a.push(n);continue}let p=y(o,c,i);s.proposals.push(p),a.push(p),e=!0}return{save:e,result:a}})}function A(t,r){return t.load().proposals.filter(s=>!r||s.status===r)}var P=(t,r)=>t.id===r||r.length>=6&&t.id.startsWith(r);function j(t,r){return t.load().proposals.find(s=>P(s,r))}function h(t,r,s){return t.update(a=>{let e=a.proposals.find(o=>P(o,r));if(!e)throw new Error(`no fact proposal "${r}"`);if(e.status!=="pending")throw new Error(`proposal ${e.id} is already ${e.status}`);return Object.assign(e,s),{save:!0,result:e}})}function B(t,r,s,a={}){return l("approve a fact proposal"),d(t.file,()=>$(t,r,s,a))}function $(t,r,s,a){let e=j(t,r);if(!e)throw new Error(`no fact proposal "${r}"`);if(e.status!=="pending")throw new Error(`proposal ${e.id} is already ${e.status}`);let o=a.subject??e.subject,i=a.attribute??e.attribute,c=a.value??e.value;if(!o||!i||!c)throw new Error("could not read a subject, attribute and value from the claim; pass --subject, --attribute and --value");let n=t.write({subject:o,attribute:i,value:c,source:a.source??e.source,verifiedBy:e.verifiedBy,verifiedAt:e.verifiedAt,volatility:e.volatility},{confirmedBy:s});return{proposal:h(t,e.id,{status:"approved",decidedAt:new Date().toISOString(),decidedBy:s}),write:n}}function E(t,r,s,a){return l("reject a fact proposal"),h(t,r,{status:"rejected",decidedAt:new Date().toISOString(),decidedBy:s,...a?{reason:a}:{}})}function C(t,r,s){let{workState:a,claims:e}=g(r);if(e.length===0)return{workState:a.join(`
|
|
2
|
+
`),pinned:r,proposals:[]};let o=[],i;try{o=I(new F(t),e.map(n=>({claim:n,...s})))}catch(n){i=String(n?.message??n)}let c=e.map((n,p)=>`- UNVERIFIED claim (${o[p]?`wiki proposal ${o[p].id}`:"not checked"}): ${n.replace(/^[-*•]\s*/,"")}`);return{workState:a.join(`
|
|
3
|
+
`),pinned:[...a,...c].join(`
|
|
4
|
+
`),proposals:o,...i?{error:i}:{}}}export{b as a,I as b,A as c,B as d,E as e,C as f};
|
|
5
|
+
//# sourceMappingURL=chunk-KXR6GVL7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/wiki/facts/fact-proposals.ts"],"sourcesContent":["import { createHash } from \"crypto\"\nimport { citedCheck, classifyFact, splitMemo, type FactClass } from \"@/agents/fact-freshness\"\nimport { assertPerson, FactLedger, type FactInput, type WriteResult } from \"./ledger\"\nimport { withLock } from \"./ledger-file\"\n\n// --- Fact proposals: what a session summary claims, waiting for a check ---\n//\n// A rotation or continuity memo is a model's summary of a session. When it\n// says \"the vendor account is past due\", that is a claim nobody checked in\n// this form, and storing it as memory is how a stale note became a stated\n// fact (#273). So memo claims about outside systems come here instead,\n// with where they came from. They reach the ledger only when a person\n// approves one (a confirmation), never on their own.\n\nexport type FactProposalStatus = \"pending\" | \"approved\" | \"rejected\"\n\nexport interface FactProposal {\n id: string\n status: FactProposalStatus\n /** The line as the memo stated it. */\n claim: string\n /** Best guess at the structured fact, editable on approval. */\n subject?: string\n attribute?: string\n value?: string\n volatility: FactClass\n /** The check the memo cited, or where the claim came from. */\n source: string\n /** When that check happened, or when the memo was written. */\n verifiedAt: string\n verifiedBy: string\n /** e.g. \"rotation-memo:tier-2\" or \"continuity-memo\". */\n origin: string\n agentId: string\n chat?: string\n createdAt: string\n decidedAt?: string\n decidedBy?: string\n reason?: string\n}\n\nexport interface ProposalInput {\n claim: string\n agentId: string\n origin: string\n chat?: string\n at?: string\n}\n\nconst proposalId = (agentId: string, claim: string) =>\n \"fp-\" + createHash(\"sha1\").update(`${agentId}\\u0000${claim.toLowerCase().replace(/\\s+/g, \" \").trim()}`).digest(\"hex\").slice(0, 10)\n\n/** \"X is Y\" → subject X, value Y, attribute named after the class. */\nexport function parseClaim(claim: string): { subject?: string; attribute?: string; value?: string } {\n const text = claim.replace(/^[-*•]\\s*/, \"\").replace(/\\s*\\((?:[^)]*)\\)\\s*$/, \"\").trim()\n const m = text.match(/^(.{2,60}?)\\s+(?:is|are|was|were|has been|went|got)\\s+(.{1,80})$/i)\n if (!m) return {}\n const cls = classifyFact(text)\n return { subject: m[1].trim(), attribute: cls === \"stable\" ? \"state\" : `${cls} status`, value: m[2].trim() }\n}\n\nfunction newProposal(it: ProposalInput, id: string, claim: string): FactProposal {\n const at = it.at ?? new Date().toISOString()\n const cited = citedCheck(claim)\n const cls = classifyFact(claim)\n return {\n id, status: \"pending\", claim, ...parseClaim(claim),\n // A summary's claim is never stable: at best it was true that day.\n volatility: cls === \"stable\" ? \"work-state\" : cls,\n source: cited?.source ?? `${it.origin} (unchecked summary)`,\n verifiedAt: cited?.verifiedAt ?? at,\n verifiedBy: it.agentId,\n origin: it.origin, agentId: it.agentId,\n ...(it.chat ? { chat: it.chat } : {}),\n createdAt: at,\n }\n}\n\n/** Queue claims, under the ledger's lock. The same claim from the same\n * agent is kept once. Throws on an unreadable ledger rather than\n * writing over it. */\nexport function proposeFacts(ledger: FactLedger, items: ProposalInput[]): FactProposal[] {\n if (items.length === 0) return []\n return ledger.update((data) => {\n const out: FactProposal[] = []\n let added = false\n for (const it of items) {\n const claim = it.claim.replace(/^[-*•]\\s*/, \"\").trim()\n if (!claim) continue\n const id = proposalId(it.agentId, claim)\n const seen = data.proposals.find((p) => p.id === id)\n if (seen) { out.push(seen); continue }\n const p = newProposal(it, id, claim)\n data.proposals.push(p)\n out.push(p)\n added = true\n }\n return { save: added, result: out }\n })\n}\n\nexport function listFactProposals(ledger: FactLedger, status?: FactProposalStatus): FactProposal[] {\n return ledger.load().proposals.filter((p) => !status || p.status === status)\n}\n\nconst matches = (x: FactProposal, id: string) => x.id === id || (id.length >= 6 && x.id.startsWith(id))\n\nfunction findProposal(ledger: FactLedger, id: string): FactProposal | undefined {\n return ledger.load().proposals.find((x) => matches(x, id))\n}\n\n/** Decide a pending proposal under the ledger's lock. */\nfunction decide(ledger: FactLedger, id: string, fields: Partial<FactProposal>): FactProposal {\n return ledger.update((data) => {\n const p = data.proposals.find((x) => matches(x, id))\n if (!p) throw new Error(`no fact proposal \"${id}\"`)\n if (p.status !== \"pending\") throw new Error(`proposal ${p.id} is already ${p.status}`)\n Object.assign(p, fields)\n return { save: true, result: p }\n })\n}\n\n/**\n * Approve a claim: a person confirms it, so it is written to the ledger\n * with their name, even over a newer-dated value.\n */\nexport function approveFactProposal(\n ledger: FactLedger, id: string, by: string,\n edit: Partial<Pick<FactInput, \"subject\" | \"attribute\" | \"value\" | \"source\">> = {},\n): { proposal: FactProposal; write: WriteResult } {\n assertPerson(\"approve a fact proposal\")\n // One lock for the whole approval: the fact write and the decision\n // land together, or neither does (both re-enter this lock).\n return withLock(ledger.file, () => approveLocked(ledger, id, by, edit))\n}\n\nfunction approveLocked(\n ledger: FactLedger, id: string, by: string,\n edit: Partial<Pick<FactInput, \"subject\" | \"attribute\" | \"value\" | \"source\">>,\n): { proposal: FactProposal; write: WriteResult } {\n const p = findProposal(ledger, id)\n if (!p) throw new Error(`no fact proposal \"${id}\"`)\n if (p.status !== \"pending\") throw new Error(`proposal ${p.id} is already ${p.status}`)\n const subject = edit.subject ?? p.subject\n const attribute = edit.attribute ?? p.attribute\n const value = edit.value ?? p.value\n if (!subject || !attribute || !value) {\n throw new Error(\"could not read a subject, attribute and value from the claim; pass --subject, --attribute and --value\")\n }\n const write = ledger.write(\n { subject, attribute, value, source: edit.source ?? p.source, verifiedBy: p.verifiedBy, verifiedAt: p.verifiedAt, volatility: p.volatility },\n { confirmedBy: by },\n )\n const proposal = decide(ledger, p.id, { status: \"approved\", decidedAt: new Date().toISOString(), decidedBy: by })\n return { proposal, write }\n}\n\nexport function rejectFactProposal(ledger: FactLedger, id: string, by: string, reason?: string): FactProposal {\n assertPerson(\"reject a fact proposal\")\n return decide(ledger, id, { status: \"rejected\", decidedAt: new Date().toISOString(), decidedBy: by, ...(reason ? { reason } : {}) })\n}\n\n/**\n * Route a session memo: claims about outside systems become proposals;\n * the rest is work state. `pinned` is what the next fresh session reads,\n * with each claim marked unverified and pointing at its proposal.\n */\nexport function routeMemo(\n wikiDir: string, memo: string, ctx: { agentId: string; origin: string; chat?: string },\n): { workState: string; pinned: string; proposals: FactProposal[]; error?: string } {\n const { workState, claims } = splitMemo(memo)\n if (claims.length === 0) return { workState: workState.join(\"\\n\"), pinned: memo, proposals: [] }\n let proposals: FactProposal[] = []\n let error: string | undefined\n try {\n proposals = proposeFacts(new FactLedger(wikiDir), claims.map((claim) => ({ claim, ...ctx })))\n } catch (e) {\n // An unwritable wiki must not lose the memo: claims stay out of\n // memory and are pinned for this chat only, still marked.\n error = String((e as Error)?.message ?? e)\n }\n const flagged = claims.map((c, i) =>\n `- UNVERIFIED claim (${proposals[i] ? `wiki proposal ${proposals[i].id}` : \"not checked\"}): ${c.replace(/^[-*•]\\s*/, \"\")}`)\n return { workState: workState.join(\"\\n\"), pinned: [...workState, ...flagged].join(\"\\n\"), proposals, ...(error ? { error } : {}) }\n}\n"],"mappings":"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","names":["createHash","proposalId","agentId","claim","createHash","parseClaim","text","m","cls","classifyFact","newProposal","it","id","at","cited","citedCheck","proposeFacts","ledger","items","data","out","added","seen","p","listFactProposals","status","matches","x","findProposal","decide","fields","approveFactProposal","by","edit","assertPerson","withLock","approveLocked","subject","attribute","value","write","rejectFactProposal","reason","routeMemo","wikiDir","memo","ctx","workState","claims","splitMemo","proposals","error","FactLedger","e","flagged","c","i"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var a=new Set(["telegram","whatsapp","slack","discord","gitlab","github","app","voice","dashboard","webrtc"]),s=new Set(["a2a","mcp","mesh","api","cron","workflow","events","reminder","heartbeat","system","internal","business"]),l=["agent:","cron:","workflow:","mesh:","system:","internal:"];function r(n){if(!n||typeof n!="object")return null;let t=n;if(t.kind!=="human"&&t.kind!=="agent"||typeof t.channel!="string"||!t.channel)return null;let e={kind:t.kind,channel:t.channel.slice(0,40)};return typeof t.chatId=="string"&&(e.chatId=t.chatId.slice(0,200)),typeof t.sender=="string"&&(e.sender=t.sender.slice(0,120)),typeof t.agentId=="string"&&(e.agentId=t.agentId.slice(0,80)),e}function f(n){return r(n?.initiator)}function u(n){if(typeof n!="string")return!1;let t=n.trim().toLowerCase();return t==="agent"||l.some(e=>t.startsWith(e))}function o(n){let t=r(n?.initiator);if(t)return t.kind;let e=(n?.channel||"api").toLowerCase();return s.has(e)||u(n?.sender)?"agent":a.has(e)?"human":"agent"}function c(n,t){let e=r(n?.initiator);if(e)return e;let i={kind:o(n),channel:n?.channel||"api"};return n?.chatId&&(i.chatId=String(n.chatId)),n?.sender&&(i.sender=String(n.sender)),t&&(i.agentId=t),i}function d(n){return n?r(n.initiator)!==null||!!n.delegation:!1}function g(n){return!n||d(n)?!1:o(n)==="human"}export{f as a,u as b,c,d,g as e};
|
|
2
|
+
//# sourceMappingURL=chunk-NMFXY3QU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/a2a/initiator.ts"],"sourcesContent":["// --- Who started this work: a person or an agent ---\n//\n// One place answers \"is the root of this chain a human?\" so every caller\n// (A2A delegation today, the activity graph and ledger next) agrees. Keep\n// all human-vs-agent detection here; do not re-derive it from\n// `senderAgentId` at call sites, because relays such as the phone app set\n// fields that look agent-shaped for a turn a person started.\n//\n// The rules, in order:\n// 1. A propagated root (`context.initiator`) wins. It is stamped on the\n// first hop of a delegation and travels with the context, including\n// across mesh peers (sendTask forwards the context verbatim).\n// 2. Machine channels (cron, workflow, a2a, mcp, mesh, api, ...) are agent.\n// 3. A machine-shaped sender (\"agent:x\", \"cron:y\", ...) is agent. This is\n// how router bot-to-bot chains and callback turns are marked, and how\n// the GitHub/GitLab adapters mark an agent's comment posted with a\n// person's account (forgeSender in channels/outbound-marker.ts).\n// 4. Channels a person types or speaks on are human.\n// 5. Anything else is agent: unknown traffic keeps today's behaviour.\n\nexport type InitiatorKind = \"human\" | \"agent\"\n\n/** The root of a chain, carried in `context.initiator` on every hop after\n * the first. Only small identifying fields: it crosses the mesh. */\nexport interface RootInitiator {\n kind: InitiatorKind\n /** Channel the root turn arrived on (telegram, app, cron, ...). */\n channel: string\n chatId?: string\n sender?: string\n /** The agent that was talking to the person when the chain started. */\n agentId?: string\n}\n\n/** The subset of AgentTask.context this module reads. */\nexport interface InitiatorContext {\n channel?: string\n chatId?: string\n sender?: string\n initiator?: unknown\n delegation?: unknown\n [k: string]: unknown\n}\n\n/** Channels a person writes or speaks on. */\nexport const HUMAN_CHANNELS: ReadonlySet<string> = new Set([\n \"telegram\", \"whatsapp\", \"slack\", \"discord\",\n \"gitlab\", \"github\",\n \"app\", \"voice\", \"dashboard\", \"webrtc\",\n])\n\n/** Channels only software writes on. `api` is here on purpose: a bare API\n * call has no conversation to come back to. */\nexport const AGENT_CHANNELS: ReadonlySet<string> = new Set([\n \"a2a\", \"mcp\", \"mesh\", \"api\",\n \"cron\", \"workflow\", \"events\", \"reminder\", \"heartbeat\",\n \"system\", \"internal\", \"business\",\n])\n\nconst AGENT_SENDER_PREFIXES = [\"agent:\", \"cron:\", \"workflow:\", \"mesh:\", \"system:\", \"internal:\"]\n\nfunction validRoot(v: unknown): RootInitiator | null {\n if (!v || typeof v !== \"object\") return null\n const o = v as Record<string, unknown>\n if (o.kind !== \"human\" && o.kind !== \"agent\") return null\n if (typeof o.channel !== \"string\" || !o.channel) return null\n const root: RootInitiator = { kind: o.kind, channel: o.channel.slice(0, 40) }\n if (typeof o.chatId === \"string\") root.chatId = o.chatId.slice(0, 200)\n if (typeof o.sender === \"string\") root.sender = o.sender.slice(0, 120)\n if (typeof o.agentId === \"string\") root.agentId = o.agentId.slice(0, 80)\n return root\n}\n\n/** The root a delegated hop carries in `context.initiator`, or null on a\n * turn that is itself a root (read-only views such as the activity map). */\nexport function propagatedRootOf(ctx: InitiatorContext | undefined | null): RootInitiator | null {\n return validRoot(ctx?.initiator)\n}\n\n/** True for senders that name software rather than a person. */\nexport function isAgentSender(sender: unknown): boolean {\n if (typeof sender !== \"string\") return false\n const s = sender.trim().toLowerCase()\n return s === \"agent\" || AGENT_SENDER_PREFIXES.some((p) => s.startsWith(p))\n}\n\n/** Human or agent, for the chain this turn belongs to. */\nexport function classifyInitiator(ctx: InitiatorContext | undefined | null): InitiatorKind {\n const root = validRoot(ctx?.initiator)\n if (root) return root.kind\n const channel = (ctx?.channel || \"api\").toLowerCase()\n if (AGENT_CHANNELS.has(channel)) return \"agent\"\n if (isAgentSender(ctx?.sender)) return \"agent\"\n if (HUMAN_CHANNELS.has(channel)) return \"human\"\n return \"agent\"\n}\n\n/** The root to stamp on the next hop. An existing root is passed on\n * unchanged; otherwise this turn is the root. */\nexport function rootInitiatorOf(ctx: InitiatorContext | undefined | null, agentId?: string): RootInitiator {\n const existing = validRoot(ctx?.initiator)\n if (existing) return existing\n const root: RootInitiator = { kind: classifyInitiator(ctx), channel: ctx?.channel || \"api\" }\n if (ctx?.chatId) root.chatId = String(ctx.chatId)\n if (ctx?.sender) root.sender = String(ctx.sender)\n if (agentId) root.agentId = agentId\n return root\n}\n\n/** True for a delegated hop (it carries a valid root) or a callback turn\n * (it carries `delegation`). Neither may hand work off asynchronously:\n * a hop has a caller waiting on its answer, and a callback must not fan\n * out into another callback. */\nexport function isInsideDelegation(ctx: InitiatorContext | undefined | null): boolean {\n if (!ctx) return false\n return validRoot(ctx.initiator) !== null || !!ctx.delegation\n}\n\n/** Is this turn the one talking to the person? Only that turn may hand\n * work off and end: a delegated turn (it carries a root) has a caller\n * waiting on its answer, and a callback turn (it carries `delegation`)\n * must not fan out again. */\nexport function isHumanFacingTurn(ctx: InitiatorContext | undefined | null): boolean {\n if (!ctx || isInsideDelegation(ctx)) return false\n return classifyInitiator(ctx) === \"human\"\n}\n"],"mappings":"AA6CO,IAAMA,EAAsC,IAAI,IAAI,CACzD,WAAY,WAAY,QAAS,UACjC,SAAU,SACV,MAAO,QAAS,YAAa,QAC/B,CAAC,EAIYC,EAAsC,IAAI,IAAI,CACzD,MAAO,MAAO,OAAQ,MACtB,OAAQ,WAAY,SAAU,WAAY,YAC1C,SAAU,WAAY,UACxB,CAAC,EAEKC,EAAwB,CAAC,SAAU,QAAS,YAAa,QAAS,UAAW,WAAW,EAE9F,SAASC,EAAUC,EAAkC,CACnD,GAAI,CAACA,GAAK,OAAOA,GAAM,SAAU,OAAO,KACxC,IAAMC,EAAID,EAEV,GADIC,EAAE,OAAS,SAAWA,EAAE,OAAS,SACjC,OAAOA,EAAE,SAAY,UAAY,CAACA,EAAE,QAAS,OAAO,KACxD,IAAMC,EAAsB,CAAE,KAAMD,EAAE,KAAM,QAASA,EAAE,QAAQ,MAAM,EAAG,EAAE,CAAE,EAC5E,OAAI,OAAOA,EAAE,QAAW,WAAUC,EAAK,OAASD,EAAE,OAAO,MAAM,EAAG,GAAG,GACjE,OAAOA,EAAE,QAAW,WAAUC,EAAK,OAASD,EAAE,OAAO,MAAM,EAAG,GAAG,GACjE,OAAOA,EAAE,SAAY,WAAUC,EAAK,QAAUD,EAAE,QAAQ,MAAM,EAAG,EAAE,GAChEC,CACT,CAIO,SAASC,EAAiBC,EAAgE,CAC/F,OAAOL,EAAUK,GAAK,SAAS,CACjC,CAGO,SAASC,EAAcC,EAA0B,CACtD,GAAI,OAAOA,GAAW,SAAU,MAAO,GACvC,IAAMC,EAAID,EAAO,KAAK,EAAE,YAAY,EACpC,OAAOC,IAAM,SAAWT,EAAsB,KAAMU,GAAMD,EAAE,WAAWC,CAAC,CAAC,CAC3E,CAGO,SAASC,EAAkBL,EAAyD,CACzF,IAAMF,EAAOH,EAAUK,GAAK,SAAS,EACrC,GAAIF,EAAM,OAAOA,EAAK,KACtB,IAAMQ,GAAWN,GAAK,SAAW,OAAO,YAAY,EAEpD,OADIP,EAAe,IAAIa,CAAO,GAC1BL,EAAcD,GAAK,MAAM,EAAU,QACnCR,EAAe,IAAIc,CAAO,EAAU,QACjC,OACT,CAIO,SAASC,EAAgBP,EAA0CQ,EAAiC,CACzG,IAAMC,EAAWd,EAAUK,GAAK,SAAS,EACzC,GAAIS,EAAU,OAAOA,EACrB,IAAMX,EAAsB,CAAE,KAAMO,EAAkBL,CAAG,EAAG,QAASA,GAAK,SAAW,KAAM,EAC3F,OAAIA,GAAK,SAAQF,EAAK,OAAS,OAAOE,EAAI,MAAM,GAC5CA,GAAK,SAAQF,EAAK,OAAS,OAAOE,EAAI,MAAM,GAC5CQ,IAASV,EAAK,QAAUU,GACrBV,CACT,CAMO,SAASY,EAAmBV,EAAmD,CACpF,OAAKA,EACEL,EAAUK,EAAI,SAAS,IAAM,MAAQ,CAAC,CAACA,EAAI,WADjC,EAEnB,CAMO,SAASW,EAAkBX,EAAmD,CACnF,MAAI,CAACA,GAAOU,EAAmBV,CAAG,EAAU,GACrCK,EAAkBL,CAAG,IAAM,OACpC","names":["HUMAN_CHANNELS","AGENT_CHANNELS","AGENT_SENDER_PREFIXES","validRoot","v","o","root","propagatedRootOf","ctx","isAgentSender","sender","s","p","classifyInitiator","channel","rootInitiatorOf","agentId","existing","isInsideDelegation","isHumanFacingTurn"]}
|
|
@@ -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-HMVIS6QJ.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-PDGPHE35.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{v as l,w}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{v as l,w}from"./chunk-VOS2IW4V.js";import{a as i,f as p}from"./chunk-72SZI2UW.js";w();p();var d="task-tier";function u(e){return{task:f(e.message,2e3),agent:e.agent,channel:e.channel??null,continuesExistingSession:e.isFollowUp??!1,...e.toolsAvailable?{toolsAvailable:e.toolsAvailable}:{}}}var c={needsFlagship:i("This task needs the strongest available model to be done correctly.",{true:"Doing it well takes real reasoning: writing or reviewing code, diagnosing a failure, planning work across several steps, weighing a judgement, handling money, touching production or anything irreversible, following a long or ambiguous instruction, or work where being subtly wrong would not be noticed. Anything where a weaker model would produce something that LOOKS right belongs here.",false:"It is mechanical and its result is obvious on sight: acknowledging or confirming a message, restating or formatting something already written, a greeting, a status echo, reading one file and reporting what it says, a lookup with one right answer, a scheduled heartbeat with nothing to decide."})};function g(e){return e.needsFlagship.noul}function f(e,n){return e.length>n?`${e.slice(0,n)}\u2026`:e}var h=.2,m=60*60*1e3;function F(e,n){if(e==="claude-code"){let t=n?.cheapModels?.[e]??n?.cheapModel;return t&&/^(claude-|haiku$|sonnet$|opus$)/.test(t)?t:void 0}if(e==="codex-cli"){let t=n?.cheapModels?.[e];return t&&/^(gpt-|o\d)/.test(t)?t:void 0}}async function M(e){let n=(o,r=null)=>({downgraded:!1,needsFlagship:r,reason:o});if(e.channel==="voice"||e.channel==="desktop"||e.channel==="opencode")return n(`${e.channel} requests retain the configured model`);if(!e.cheapModel)return n("no cheaper model configured");if(e.isFollowUp){let o=e.sessionIdleMs??0,r=e.cacheTtlMs??m;if(o<r)return n(`follow-up on a warm cache (idle ${Math.round(o/1e3)}s) \u2014 swapping would cost more than it saves`)}let t;try{t=await l(d,u(e),c,{incumbent:{needsFlagship:1},features:{agent:e.agent,channel:e.channel??"unknown"}})}catch{return n("routing seat threw \u2014 keeping the flagship")}if(!t)return n("routing seat unavailable \u2014 keeping the flagship");let s=g(t.answers);if(t.mode!=="active")return n(`shadow \u2014 would ${s<(e.threshold??h)?"downgrade":"keep"} (${s.toFixed(2)})`,s);let a=e.threshold??h;return s>=a?n(`needs the flagship (${s.toFixed(2)})`,s):{model:e.cheapModel,downgraded:!0,needsFlagship:s,reason:`mechanical task (${s.toFixed(2)} below ${a}) \u2192 ${e.cheapModel}`}}export{F as a,M as b};
|
|
2
|
+
//# sourceMappingURL=chunk-Q2WW2HF4.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{e as o}from"./chunk-CUZWGTXT.js";import{resolve as a}from"path";import{existsSync as d,readdirSync as c,mkdirSync as l}from"fs";var g=class{baseDir;agentsDir;mode;sharedStore;agentStores=new Map;log;constructor(t=a(process.cwd(),".agentx/wiki"),e=console.error.bind(console,"[wiki-hub]"),r="graph"){this.baseDir=t,this.agentsDir=a(t,"agents"),this.mode=r,this.log=e,l(this.agentsDir,{recursive:!0}),this.sharedStore=new o(t,e)}getMode(){return this.mode}getAgentWiki(t){let e=`${t}:${this.mode}`;if(this.agentStores.has(e))return this.agentStores.get(e);let r=a(this.agentsDir,t,this.mode),i=new o(r,this.log);return this.agentStores.set(e,i),i}getBaseDir(){return this.baseDir}getSharedStore(){return this.sharedStore}listAgents(){let t=new Set,e=this.sharedStore.listEntries();for(let r of e)t.add(r.agentId);if(d(this.agentsDir))for(let r of c(this.agentsDir))!r.startsWith("_")&&!r.startsWith(".")&&t.add(r);return[...t].sort()}getAgentEntries(t){return this.sharedStore.listEntries({agentId:t})}getUnabsorbedEntries(t){let e=this.getAgentWiki(t),r=this.getAgentEntries(t),i=new Set,n=e.rebuildIndex();for(let s of n.articles)if(s.sources)for(let h of s.sources)i.add(h);return r.filter(s=>!i.has(s.id))}summary(){return this.listAgents().map(e=>{let r=this.getAgentEntries(e),n=this.getAgentWiki(e).rebuildIndex(),s=this.getUnabsorbedEntries(e);return{agentId:e,totalEntries:r.length,totalArticles:n.articles.length,unabsorbed:s.length,articles:n.articles}})}};export{g as a};
|
|
2
|
+
//# sourceMappingURL=chunk-S4ASFOJU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/wiki/hub.ts"],"sourcesContent":["import { WikiStore } from \"./store\"\nimport { resolve } from \"path\"\nimport { existsSync, readdirSync, mkdirSync } from \"fs\"\nimport type { WikiEntry } from \"./types\"\n\nexport type WikiMode = \"flat\" | \"graph\" | \"unified\"\n\n/**\n * WikiHub: manages per-agent wikis with a shared raw entry pool.\n * Supports two compilation modes:\n * - flat: Karpathy pattern — tags, LLM-chosen paths, worldview, gap detection\n * - graph: Knowledge graph — kind, parent, hierarchy, events, entities\n *\n * Both modes share the same raw entries. Articles stored separately:\n * agents/<id>/flat/ ← Karpathy compilation\n * agents/<id>/graph/ ← Knowledge graph compilation\n */\nexport class WikiHub {\n private baseDir: string\n private agentsDir: string\n private mode: WikiMode\n private sharedStore: WikiStore\n private agentStores: Map<string, WikiStore> = new Map()\n private log: (...args: unknown[]) => void\n\n constructor(\n baseDir: string = resolve(process.cwd(), \".agentx/wiki\"),\n log: (...args: unknown[]) => void = console.error.bind(console, \"[wiki-hub]\"),\n mode: WikiMode = \"graph\",\n ) {\n this.baseDir = baseDir\n this.agentsDir = resolve(baseDir, \"agents\")\n this.mode = mode\n this.log = log\n\n mkdirSync(this.agentsDir, { recursive: true })\n this.sharedStore = new WikiStore(baseDir, log)\n }\n\n getMode(): WikiMode { return this.mode }\n\n /**\n * Get or create the wiki store for a specific agent (mode-aware).\n * flat: agents/<id>/flat/\n * graph: agents/<id>/graph/\n */\n getAgentWiki(agentId: string): WikiStore {\n const key = `${agentId}:${this.mode}`\n if (this.agentStores.has(key)) return this.agentStores.get(key)!\n\n const agentDir = resolve(this.agentsDir, agentId, this.mode)\n const store = new WikiStore(agentDir, this.log)\n this.agentStores.set(key, store)\n return store\n }\n\n /** The wiki root: shared sidecars (_facts.json, _questions.json) live here. */\n getBaseDir(): string {\n return this.baseDir\n }\n\n getSharedStore(): WikiStore {\n return this.sharedStore\n }\n\n listAgents(): string[] {\n const agents = new Set<string>()\n\n const entries = this.sharedStore.listEntries()\n for (const e of entries) agents.add(e.agentId)\n\n if (existsSync(this.agentsDir)) {\n for (const dir of readdirSync(this.agentsDir)) {\n if (!dir.startsWith(\"_\") && !dir.startsWith(\".\")) {\n agents.add(dir)\n }\n }\n }\n\n return [...agents].sort()\n }\n\n getAgentEntries(agentId: string): WikiEntry[] {\n return this.sharedStore.listEntries({ agentId })\n }\n\n getUnabsorbedEntries(agentId: string): WikiEntry[] {\n const agentWiki = this.getAgentWiki(agentId)\n const agentEntries = this.getAgentEntries(agentId)\n\n const absorbedIds = new Set<string>()\n const index = agentWiki.rebuildIndex()\n for (const article of index.articles) {\n if (article.sources) {\n for (const s of article.sources) absorbedIds.add(s)\n }\n }\n\n return agentEntries.filter(e => !absorbedIds.has(e.id))\n }\n\n summary(): AgentWikiSummary[] {\n const agents = this.listAgents()\n return agents.map(agentId => {\n const entries = this.getAgentEntries(agentId)\n const wiki = this.getAgentWiki(agentId)\n const index = wiki.rebuildIndex()\n const unabsorbed = this.getUnabsorbedEntries(agentId)\n\n return {\n agentId,\n totalEntries: entries.length,\n totalArticles: index.articles.length,\n unabsorbed: unabsorbed.length,\n articles: index.articles,\n }\n })\n }\n}\n\nexport interface AgentWikiSummary {\n agentId: string\n totalEntries: number\n totalArticles: number\n unabsorbed: number\n articles: Array<{ title: string; path: string; tags?: string[] }>\n}\n"],"mappings":"wCACA,OAAS,WAAAA,MAAe,OACxB,OAAS,cAAAC,EAAY,eAAAC,EAAa,aAAAC,MAAiB,KAe5C,IAAMC,EAAN,KAAc,CACX,QACA,UACA,KACA,YACA,YAAsC,IAAI,IAC1C,IAER,YACEC,EAAkBL,EAAQ,QAAQ,IAAI,EAAG,cAAc,EACvDM,EAAoC,QAAQ,MAAM,KAAK,QAAS,YAAY,EAC5EC,EAAiB,QACjB,CACA,KAAK,QAAUF,EACf,KAAK,UAAYL,EAAQK,EAAS,QAAQ,EAC1C,KAAK,KAAOE,EACZ,KAAK,IAAMD,EAEXH,EAAU,KAAK,UAAW,CAAE,UAAW,EAAK,CAAC,EAC7C,KAAK,YAAc,IAAIK,EAAUH,EAASC,CAAG,CAC/C,CAEA,SAAoB,CAAE,OAAO,KAAK,IAAK,CAOvC,aAAaG,EAA4B,CACvC,IAAMC,EAAM,GAAGD,KAAW,KAAK,OAC/B,GAAI,KAAK,YAAY,IAAIC,CAAG,EAAG,OAAO,KAAK,YAAY,IAAIA,CAAG,EAE9D,IAAMC,EAAWX,EAAQ,KAAK,UAAWS,EAAS,KAAK,IAAI,EACrDG,EAAQ,IAAIJ,EAAUG,EAAU,KAAK,GAAG,EAC9C,YAAK,YAAY,IAAID,EAAKE,CAAK,EACxBA,CACT,CAGA,YAAqB,CACnB,OAAO,KAAK,OACd,CAEA,gBAA4B,CAC1B,OAAO,KAAK,WACd,CAEA,YAAuB,CACrB,IAAMC,EAAS,IAAI,IAEbC,EAAU,KAAK,YAAY,YAAY,EAC7C,QAAWC,KAAKD,EAASD,EAAO,IAAIE,EAAE,OAAO,EAE7C,GAAId,EAAW,KAAK,SAAS,EAC3B,QAAWe,KAAOd,EAAY,KAAK,SAAS,EACtC,CAACc,EAAI,WAAW,GAAG,GAAK,CAACA,EAAI,WAAW,GAAG,GAC7CH,EAAO,IAAIG,CAAG,EAKpB,MAAO,CAAC,GAAGH,CAAM,EAAE,KAAK,CAC1B,CAEA,gBAAgBJ,EAA8B,CAC5C,OAAO,KAAK,YAAY,YAAY,CAAE,QAAAA,CAAQ,CAAC,CACjD,CAEA,qBAAqBA,EAA8B,CACjD,IAAMQ,EAAY,KAAK,aAAaR,CAAO,EACrCS,EAAe,KAAK,gBAAgBT,CAAO,EAE3CU,EAAc,IAAI,IAClBC,EAAQH,EAAU,aAAa,EACrC,QAAWI,KAAWD,EAAM,SAC1B,GAAIC,EAAQ,QACV,QAAWC,KAAKD,EAAQ,QAASF,EAAY,IAAIG,CAAC,EAItD,OAAOJ,EAAa,OAAOH,GAAK,CAACI,EAAY,IAAIJ,EAAE,EAAE,CAAC,CACxD,CAEA,SAA8B,CAE5B,OADe,KAAK,WAAW,EACjB,IAAIN,GAAW,CAC3B,IAAMK,EAAU,KAAK,gBAAgBL,CAAO,EAEtCW,EADO,KAAK,aAAaX,CAAO,EACnB,aAAa,EAC1Bc,EAAa,KAAK,qBAAqBd,CAAO,EAEpD,MAAO,CACL,QAAAA,EACA,aAAcK,EAAQ,OACtB,cAAeM,EAAM,SAAS,OAC9B,WAAYG,EAAW,OACvB,SAAUH,EAAM,QAClB,CACF,CAAC,CACH,CACF","names":["resolve","existsSync","readdirSync","mkdirSync","WikiHub","baseDir","log","mode","WikiStore","agentId","key","agentDir","store","agents","entries","e","dir","agentWiki","agentEntries","absorbedIds","index","article","s","unabsorbed"]}
|