agentix-cli 0.130.0 → 0.132.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-DWSHIDN6.js → App-VPYWOTTH.js} +2 -2
- package/dist/{ChatApp-CROSI7JM.js → ChatApp-SNED4KJB.js} +2 -2
- package/dist/absorb-eval-WGO4JWTO.js +2 -0
- package/dist/{agent-4AQOFPRD.js → agent-HXQYYLWZ.js} +2 -2
- package/dist/article-sync-4NOPOQU7.js +2 -0
- package/dist/{board-dashboard-54A3XTV5.js → board-dashboard-44JPXA7J.js} +330 -235
- package/dist/board-dashboard-44JPXA7J.js.map +1 -0
- package/dist/{builtin-W6KNX7RS.js → builtin-YD7MC572.js} +2 -2
- package/dist/chunk-2ZDV3DCT.js +52 -0
- package/dist/chunk-2ZDV3DCT.js.map +1 -0
- package/dist/{chunk-QXZLYCEZ.js → chunk-3K35L73A.js} +3 -3
- package/dist/chunk-3K35L73A.js.map +1 -0
- package/dist/chunk-3UOTLMXD.js +4 -0
- package/dist/chunk-3UOTLMXD.js.map +1 -0
- package/dist/{chunk-LJWEJ6UZ.js → chunk-3WYLK3SX.js} +2 -2
- package/dist/chunk-5BI2T3WD.js +3 -0
- package/dist/chunk-5BI2T3WD.js.map +1 -0
- package/dist/{chunk-UBA2QJCY.js → chunk-62NXS7PT.js} +272 -247
- package/dist/chunk-62NXS7PT.js.map +1 -0
- package/dist/chunk-6TURWSMN.js +3 -0
- package/dist/{chunk-VD7IO653.js.map → chunk-6TURWSMN.js.map} +1 -1
- package/dist/{chunk-I4GT27UO.js → chunk-724IBN5Y.js} +2 -2
- package/dist/{chunk-NR7WLMNI.js → chunk-74LPAKQY.js} +2 -2
- package/dist/chunk-7D3RJSN4.js +156 -0
- package/dist/chunk-7D3RJSN4.js.map +1 -0
- package/dist/{chunk-BGG3ZSMW.js → chunk-7LN4VKDU.js} +14 -16
- package/dist/chunk-7LN4VKDU.js.map +1 -0
- package/dist/chunk-7VLLZQ3N.js +2 -0
- package/dist/chunk-7VLLZQ3N.js.map +1 -0
- package/dist/{chunk-LLLBH2HH.js → chunk-A6QJ4VFT.js} +2 -2
- package/dist/{chunk-SCJ5ZXEN.js → chunk-B2QYMUTD.js} +2 -2
- package/dist/{chunk-SCJ5ZXEN.js.map → chunk-B2QYMUTD.js.map} +1 -1
- package/dist/chunk-BIJHMWXK.js +21 -0
- package/dist/chunk-BIJHMWXK.js.map +1 -0
- package/dist/{chunk-4VDA4UM7.js → chunk-BKHIR2YJ.js} +2 -2
- package/dist/{chunk-5VKFIBXY.js → chunk-CM74OUXW.js} +2 -2
- package/dist/chunk-EQ33PFXP.js +55 -0
- package/dist/chunk-EQ33PFXP.js.map +1 -0
- package/dist/chunk-HF5EF335.js +8 -0
- package/dist/chunk-HF5EF335.js.map +1 -0
- package/dist/chunk-IMLAPB7G.js +4 -0
- package/dist/chunk-IMLAPB7G.js.map +1 -0
- package/dist/{chunk-U2EHJZAZ.js → chunk-JNKATLF7.js} +2 -2
- package/dist/{chunk-3PGPN323.js → chunk-JP5OAMWQ.js} +1 -1
- package/dist/chunk-JP5OAMWQ.js.map +1 -0
- package/dist/chunk-JRVJXAVC.js +861 -0
- package/dist/chunk-JRVJXAVC.js.map +1 -0
- package/dist/{chunk-J4I5ZJ2V.js → chunk-KDQI5S7F.js} +2 -2
- package/dist/chunk-KFIJDLQ5.js +3 -0
- package/dist/chunk-KFIJDLQ5.js.map +1 -0
- package/dist/{chunk-MZJY26FW.js → chunk-KKQPV6SO.js} +2 -2
- package/dist/{chunk-WX67I2KN.js → chunk-KQH4LPYC.js} +2 -2
- package/dist/chunk-MCBTVNPX.js +152 -0
- package/dist/chunk-MCBTVNPX.js.map +1 -0
- package/dist/{chunk-YHCPBMRH.js → chunk-MDGYSHO5.js} +2 -2
- package/dist/chunk-MRIVENBY.js +2 -0
- package/dist/{article-sync-TLZTHRZB.js.map → chunk-MRIVENBY.js.map} +1 -1
- package/dist/{chunk-242MPMJX.js → chunk-QNKSRROH.js} +2 -2
- package/dist/{chunk-GLQLCBJS.js → chunk-QSKG754X.js} +6 -3
- package/dist/chunk-QSKG754X.js.map +1 -0
- package/dist/{chunk-HF4OXA5L.js → chunk-RH3J4LCP.js} +3 -3
- package/dist/{chunk-QPYN2UTV.js → chunk-RYGVTAP4.js} +2 -2
- package/dist/chunk-S2RRPTS3.js +54 -0
- package/dist/chunk-S2RRPTS3.js.map +1 -0
- package/dist/{chunk-5KKXJZZ4.js → chunk-UDMI4TYM.js} +2 -2
- package/dist/{chunk-TJDNS5G6.js → chunk-VCQVF44A.js} +2 -2
- package/dist/{chunk-TN5A7PLU.js → chunk-WWNZL7XB.js} +2 -2
- package/dist/{chunk-Q5FEWCS5.js → chunk-XWVBLISN.js} +2 -2
- package/dist/{chunk-AD4QZZVN.js → chunk-YXFTUOZR.js} +2 -2
- package/dist/{chunk-RKB7FQJF.js → chunk-Z7RJ3K3J.js} +2 -2
- package/dist/{chunk-N2YSVZML.js → chunk-ZG4G6BFP.js} +2 -2
- package/dist/cli.js +1 -1
- package/dist/{client-KGWYROLX.js → client-TXZF32NO.js} +2 -2
- package/dist/config-ZIXIH23X.js +2 -0
- package/dist/{config-mutate-7BLOYRZF.js → config-mutate-KDBXIN7R.js} +2 -2
- package/dist/config-mutator-HKFGPJMG.js +2 -0
- package/dist/{contributions-DLUQEAGL.js → contributions-FBVULRR4.js} +2 -2
- package/dist/{contributions-DLUQEAGL.js.map → contributions-FBVULRR4.js.map} +1 -1
- package/dist/{doctor-32YP26SJ.js → doctor-NBWYG743.js} +2 -2
- package/dist/enrich-NH3WHKD6.js +16 -0
- package/dist/enrich-NH3WHKD6.js.map +1 -0
- package/dist/{failure-candidates-JNGUVBDG.js → failure-candidates-XZSZP4HT.js} +2 -2
- package/dist/{follow-up-tool-AQ7NYZZR.js → follow-up-tool-E5XKSPKA.js} +2 -2
- package/dist/graph-EXDH7EPZ.js +2 -0
- package/dist/hub-3QTJ7E3O.js +2 -0
- package/dist/index.d.ts +577 -3
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/load-5DNMGHFW.js +2 -0
- package/dist/model-call-BGTDPWZD.js +2 -0
- package/dist/notes-WJJEJ4CJ.js +2 -0
- package/dist/processes-M3N3S7V5.js +2 -0
- package/dist/program-SA5O6IQ3.js +776 -0
- package/dist/program-SA5O6IQ3.js.map +1 -0
- package/dist/{promote-R7FKN5SY.js → promote-4XHYWHLA.js} +2 -2
- package/dist/query-ZGD32CE2.js +2 -0
- package/dist/query-settings-BSDXFS3V.js +3 -0
- package/dist/query-settings-BSDXFS3V.js.map +1 -0
- package/dist/registry-LM35AE2P.js +2 -0
- package/dist/{request-planner-LEUMSI2K.js → request-planner-4BAAOUBH.js} +2 -2
- package/dist/{review-candidates-MOSGA4IS.js → review-candidates-TM53WR7G.js} +2 -2
- package/dist/roster-IRXP32XF.js +2 -0
- package/dist/{rotation-memo-7VLREGS6.js → rotation-memo-2G6N3VF3.js} +2 -2
- package/dist/{routing-FSJ42RZH.js → routing-QLS6UMLM.js} +2 -2
- package/dist/schedule-tool-TTCWBAQ4.js +2 -0
- package/dist/{scheduler-6AQDHQI4.js → scheduler-PVXLF2VJ.js} +2 -2
- package/dist/scheduler-PVXLF2VJ.js.map +1 -0
- package/dist/{seat-O37EQRHE.js → seat-OUUN3F45.js} +2 -2
- package/dist/seat-OUUN3F45.js.map +1 -0
- package/dist/{select-XO2STSQN.js → select-D7UUSODY.js} +2 -2
- package/dist/{set-enabled-ZNEPEFGF.js → set-enabled-FDNS6KW6.js} +2 -2
- package/dist/summaries-BIRSNWGH.js +2 -0
- package/dist/summaries-BIRSNWGH.js.map +1 -0
- package/dist/{tool-PH45YCO5.js → tool-J5FM3OPM.js} +2 -2
- package/dist/{tool-6KMEAY4U.js → tool-SCBQYDI3.js} +2 -2
- package/dist/wiki-IGRRQL6H.js +2 -0
- package/dist/wiki-IGRRQL6H.js.map +1 -0
- package/dist/workspace-env-ROH45HXN.js +2 -0
- package/dist/workspace-env-ROH45HXN.js.map +1 -0
- package/package.json +1 -1
- package/dist/absorb-eval-MNGQ752C.js +0 -2
- package/dist/article-sync-TLZTHRZB.js +0 -2
- package/dist/board-dashboard-54A3XTV5.js.map +0 -1
- package/dist/chunk-3PGPN323.js.map +0 -1
- package/dist/chunk-76Z4VHDX.js +0 -8
- package/dist/chunk-76Z4VHDX.js.map +0 -1
- package/dist/chunk-AERIU4AH.js +0 -892
- package/dist/chunk-AERIU4AH.js.map +0 -1
- package/dist/chunk-BGG3ZSMW.js.map +0 -1
- package/dist/chunk-EO4DEEXL.js +0 -2
- package/dist/chunk-EO4DEEXL.js.map +0 -1
- package/dist/chunk-GLQLCBJS.js.map +0 -1
- package/dist/chunk-I4OQQRY2.js +0 -55
- package/dist/chunk-I4OQQRY2.js.map +0 -1
- package/dist/chunk-JE5EJGGD.js +0 -4
- package/dist/chunk-JE5EJGGD.js.map +0 -1
- package/dist/chunk-QX2B4TJU.js +0 -3
- package/dist/chunk-QX2B4TJU.js.map +0 -1
- package/dist/chunk-QXZLYCEZ.js.map +0 -1
- package/dist/chunk-UBA2QJCY.js.map +0 -1
- package/dist/chunk-UUFJQMHE.js +0 -54
- package/dist/chunk-UUFJQMHE.js.map +0 -1
- package/dist/chunk-VD7IO653.js +0 -3
- package/dist/chunk-W2HEJKJR.js +0 -156
- package/dist/chunk-W2HEJKJR.js.map +0 -1
- package/dist/config-FNTLKUGA.js +0 -2
- package/dist/config-mutator-NCLHYPJ3.js +0 -2
- package/dist/graph-5ZJ7YACP.js +0 -2
- package/dist/hub-Q3I4ALQ2.js +0 -2
- package/dist/load-NK3MIYXP.js +0 -2
- package/dist/notes-TMAGEDUS.js +0 -2
- package/dist/processes-5MP32QZT.js +0 -2
- package/dist/program-FESSM5TY.js +0 -766
- package/dist/program-FESSM5TY.js.map +0 -1
- package/dist/query-YTKTNXCQ.js +0 -2
- package/dist/registry-7L4RUATA.js +0 -2
- package/dist/schedule-tool-4T2VZIDW.js +0 -2
- package/dist/wiki-4HD4FZ4W.js +0 -2
- /package/dist/{App-DWSHIDN6.js.map → App-VPYWOTTH.js.map} +0 -0
- /package/dist/{ChatApp-CROSI7JM.js.map → ChatApp-SNED4KJB.js.map} +0 -0
- /package/dist/{absorb-eval-MNGQ752C.js.map → absorb-eval-WGO4JWTO.js.map} +0 -0
- /package/dist/{agent-4AQOFPRD.js.map → agent-HXQYYLWZ.js.map} +0 -0
- /package/dist/{builtin-W6KNX7RS.js.map → article-sync-4NOPOQU7.js.map} +0 -0
- /package/dist/{client-KGWYROLX.js.map → builtin-YD7MC572.js.map} +0 -0
- /package/dist/{chunk-LJWEJ6UZ.js.map → chunk-3WYLK3SX.js.map} +0 -0
- /package/dist/{chunk-I4GT27UO.js.map → chunk-724IBN5Y.js.map} +0 -0
- /package/dist/{chunk-NR7WLMNI.js.map → chunk-74LPAKQY.js.map} +0 -0
- /package/dist/{chunk-LLLBH2HH.js.map → chunk-A6QJ4VFT.js.map} +0 -0
- /package/dist/{chunk-4VDA4UM7.js.map → chunk-BKHIR2YJ.js.map} +0 -0
- /package/dist/{chunk-5VKFIBXY.js.map → chunk-CM74OUXW.js.map} +0 -0
- /package/dist/{chunk-U2EHJZAZ.js.map → chunk-JNKATLF7.js.map} +0 -0
- /package/dist/{chunk-J4I5ZJ2V.js.map → chunk-KDQI5S7F.js.map} +0 -0
- /package/dist/{chunk-MZJY26FW.js.map → chunk-KKQPV6SO.js.map} +0 -0
- /package/dist/{chunk-WX67I2KN.js.map → chunk-KQH4LPYC.js.map} +0 -0
- /package/dist/{chunk-YHCPBMRH.js.map → chunk-MDGYSHO5.js.map} +0 -0
- /package/dist/{chunk-242MPMJX.js.map → chunk-QNKSRROH.js.map} +0 -0
- /package/dist/{chunk-HF4OXA5L.js.map → chunk-RH3J4LCP.js.map} +0 -0
- /package/dist/{chunk-QPYN2UTV.js.map → chunk-RYGVTAP4.js.map} +0 -0
- /package/dist/{chunk-5KKXJZZ4.js.map → chunk-UDMI4TYM.js.map} +0 -0
- /package/dist/{chunk-TJDNS5G6.js.map → chunk-VCQVF44A.js.map} +0 -0
- /package/dist/{chunk-TN5A7PLU.js.map → chunk-WWNZL7XB.js.map} +0 -0
- /package/dist/{chunk-Q5FEWCS5.js.map → chunk-XWVBLISN.js.map} +0 -0
- /package/dist/{chunk-AD4QZZVN.js.map → chunk-YXFTUOZR.js.map} +0 -0
- /package/dist/{chunk-RKB7FQJF.js.map → chunk-Z7RJ3K3J.js.map} +0 -0
- /package/dist/{chunk-N2YSVZML.js.map → chunk-ZG4G6BFP.js.map} +0 -0
- /package/dist/{config-FNTLKUGA.js.map → client-TXZF32NO.js.map} +0 -0
- /package/dist/{config-mutate-7BLOYRZF.js.map → config-ZIXIH23X.js.map} +0 -0
- /package/dist/{config-mutator-NCLHYPJ3.js.map → config-mutate-KDBXIN7R.js.map} +0 -0
- /package/dist/{doctor-32YP26SJ.js.map → config-mutator-HKFGPJMG.js.map} +0 -0
- /package/dist/{failure-candidates-JNGUVBDG.js.map → doctor-NBWYG743.js.map} +0 -0
- /package/dist/{graph-5ZJ7YACP.js.map → failure-candidates-XZSZP4HT.js.map} +0 -0
- /package/dist/{follow-up-tool-AQ7NYZZR.js.map → follow-up-tool-E5XKSPKA.js.map} +0 -0
- /package/dist/{hub-Q3I4ALQ2.js.map → graph-EXDH7EPZ.js.map} +0 -0
- /package/dist/{load-NK3MIYXP.js.map → hub-3QTJ7E3O.js.map} +0 -0
- /package/dist/{notes-TMAGEDUS.js.map → load-5DNMGHFW.js.map} +0 -0
- /package/dist/{processes-5MP32QZT.js.map → model-call-BGTDPWZD.js.map} +0 -0
- /package/dist/{promote-R7FKN5SY.js.map → notes-WJJEJ4CJ.js.map} +0 -0
- /package/dist/{query-YTKTNXCQ.js.map → processes-M3N3S7V5.js.map} +0 -0
- /package/dist/{registry-7L4RUATA.js.map → promote-4XHYWHLA.js.map} +0 -0
- /package/dist/{routing-FSJ42RZH.js.map → query-ZGD32CE2.js.map} +0 -0
- /package/dist/{schedule-tool-4T2VZIDW.js.map → registry-LM35AE2P.js.map} +0 -0
- /package/dist/{request-planner-LEUMSI2K.js.map → request-planner-4BAAOUBH.js.map} +0 -0
- /package/dist/{review-candidates-MOSGA4IS.js.map → review-candidates-TM53WR7G.js.map} +0 -0
- /package/dist/{scheduler-6AQDHQI4.js.map → roster-IRXP32XF.js.map} +0 -0
- /package/dist/{rotation-memo-7VLREGS6.js.map → rotation-memo-2G6N3VF3.js.map} +0 -0
- /package/dist/{seat-O37EQRHE.js.map → routing-QLS6UMLM.js.map} +0 -0
- /package/dist/{wiki-4HD4FZ4W.js.map → schedule-tool-TTCWBAQ4.js.map} +0 -0
- /package/dist/{select-XO2STSQN.js.map → select-D7UUSODY.js.map} +0 -0
- /package/dist/{set-enabled-ZNEPEFGF.js.map → set-enabled-FDNS6KW6.js.map} +0 -0
- /package/dist/{tool-PH45YCO5.js.map → tool-J5FM3OPM.js.map} +0 -0
- /package/dist/{tool-6KMEAY4U.js.map → tool-SCBQYDI3.js.map} +0 -0
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{readFileSync as f,existsSync as a}from"fs";import{resolve as d}from"path";function p(e){let n=[];for(let r of e.split(`
|
|
2
|
+
`)){let t=r.trim();if(!t||t.startsWith("#"))continue;let s=t.startsWith("export ")?t.slice(7).trim():t,i=s.indexOf("=");if(i===-1)continue;let c=s.slice(0,i).trim(),o=s.slice(i+1).trim();o.length>=2&&(o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'"))&&(o=o.slice(1,-1)),c&&n.push([c,o])}return n}function E(e){let n={};for(let r of[".env",".env.gitlab"]){let t=d(e,r);if(a(t))try{for(let[s,i]of p(f(t,"utf-8")))n[s]=i}catch{}}return n}var l=new Map;function g(e=process.cwd()){let n=l.get(e);if(n)return n;let r=d(e,".env"),t;if(!a(r))t=new Set;else try{t=new Set(p(f(r,"utf-8")).map(([s])=>s))}catch{t=new Set}return l.set(e,t),t}function A(){l.clear()}function m(e,n=process.env,r=process.cwd()){let t=E(e),s=g(r),i={...n};for(let c of s)c in t||delete i[c];for(let[c,o]of Object.entries(t))i[c]=o;return i}function u(e){return delete e.ANTHROPIC_API_KEY,delete e.ANTHROPIC_API_KEY_OLD,e}function v(e){let n=e.HOME||process.env.HOME,r=[e.PATH||"",n?`${n}/.local/bin`:"","/opt/homebrew/bin","/usr/local/bin"];return e.PATH=Array.from(new Set(r.flatMap(t=>t.split(":")).filter(Boolean))).join(":"),e}function S(){let e=v(u({...process.env}));return delete e.CLAUDECODE,e}function y(e,n="subscription"){if(n!=="api")return u(e);if(!e.ANTHROPIC_API_KEY)throw new Error(`billing "api" needs ANTHROPIC_API_KEY in the agent's environment`);return delete e.ANTHROPIC_API_KEY_OLD,delete e.CLAUDE_CODE_OAUTH_TOKEN,e}function N(e){if(a(e))for(let[n,r]of p(f(e,"utf-8")))process.env[n]===void 0&&(process.env[n]=r)}export{E as a,g as b,A as c,m as d,u as e,v as f,S as g,y as h,N as i};
|
|
3
|
+
//# sourceMappingURL=chunk-6TURWSMN.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/workspace-env.ts"],"sourcesContent":["import { readFileSync, existsSync } from \"fs\"\nimport { resolve } from \"path\"\n\n// Loads per-agent secrets from the agent's workspace and tells the runtime\n// which keys the daemon's own .env injected, so we can strip those before\n// spawning the agent's claude process. Without this, every agent inherits\n// the daemon's GITLAB_TOKEN regardless of whether their workspace has its\n// own .env.gitlab — defeating per-agent identity boundaries (each agent\n// should commit/push as itself, not as the daemon's account).\n\n/**\n * Parse a dotenv-style file. Tolerates the `export KEY=VALUE` form used by\n * shell-sourced files like .env.gitlab on peer-server.\n */\nfunction parseDotEnv(content: string): Array<[string, string]> {\n const out: Array<[string, string]> = []\n for (const raw of content.split(\"\\n\")) {\n const trimmed = raw.trim()\n if (!trimmed || trimmed.startsWith(\"#\")) continue\n const stripped = trimmed.startsWith(\"export \") ? trimmed.slice(7).trim() : trimmed\n const eq = stripped.indexOf(\"=\")\n if (eq === -1) continue\n const key = stripped.slice(0, eq).trim()\n let value = stripped.slice(eq + 1).trim()\n if (value.length >= 2 && ((value.startsWith('\"') && value.endsWith('\"')) || (value.startsWith(\"'\") && value.endsWith(\"'\")))) {\n value = value.slice(1, -1)\n }\n if (key) out.push([key, value])\n }\n return out\n}\n\n/**\n * Read .env then .env.gitlab from a workspace and return their merged keys.\n * .env.gitlab wins on collision — it's the more specific per-channel file.\n */\nexport function loadWorkspaceEnv(workspace: string): Record<string, string> {\n const merged: Record<string, string> = {}\n for (const fname of [\".env\", \".env.gitlab\"]) {\n const path = resolve(workspace, fname)\n if (!existsSync(path)) continue\n try {\n for (const [k, v] of parseDotEnv(readFileSync(path, \"utf-8\"))) {\n merged[k] = v\n }\n } catch { /* best-effort */ }\n }\n return merged\n}\n\n/**\n * Keys defined in the daemon's own .env file, cached per daemonCwd. The\n * runtime uses this to strip those keys from the child env before adding\n * the workspace overrides — so a daemon-level GITLAB_TOKEN never leaks to\n * an agent that hasn't put one in its own workspace.\n */\nconst daemonEnvKeysCache = new Map<string, Set<string>>()\n\nexport function getDaemonEnvKeys(daemonCwd: string = process.cwd()): Set<string> {\n const cached = daemonEnvKeysCache.get(daemonCwd)\n if (cached) return cached\n const path = resolve(daemonCwd, \".env\")\n let keys: Set<string>\n if (!existsSync(path)) {\n keys = new Set()\n } else {\n try {\n keys = new Set(parseDotEnv(readFileSync(path, \"utf-8\")).map(([k]) => k))\n } catch {\n keys = new Set()\n }\n }\n daemonEnvKeysCache.set(daemonCwd, keys)\n return keys\n}\n\n/** Test-only: clear the cache so a different daemonCwd is re-read. */\nexport function _resetDaemonEnvKeysCache(): void {\n daemonEnvKeysCache.clear()\n}\n\n/**\n * Build the env object passed to a spawned agent process. Starts from\n * parentEnv (default process.env), removes any keys that came from the\n * daemon's own .env (so daemon-level secrets don't leak), then layers in\n * workspace .env / .env.gitlab.\n *\n * - System env (PATH, HOME, USER, …) survives untouched.\n * - Daemon-level secrets (e.g. GITLAB_TOKEN in /home/peer/agentx/.env) are\n * stripped UNLESS the workspace provides its own value for that key.\n * - Workspace env (per-agent .env / .env.gitlab) wins on the final merge.\n */\nexport function buildAgentEnv(\n workspace: string,\n parentEnv: NodeJS.ProcessEnv = process.env,\n daemonCwd: string = process.cwd(),\n): NodeJS.ProcessEnv {\n const workspaceEnv = loadWorkspaceEnv(workspace)\n const daemonOwnedKeys = getDaemonEnvKeys(daemonCwd)\n const child: NodeJS.ProcessEnv = { ...parentEnv }\n for (const k of daemonOwnedKeys) {\n if (!(k in workspaceEnv)) delete child[k]\n }\n for (const [k, v] of Object.entries(workspaceEnv)) {\n child[k] = v\n }\n return child\n}\n\n// Force the `claude` CLI to use OAuth/subscription billing. When\n// ANTHROPIC_API_KEY is present (env, systemd EnvironmentFile, daemon .env not\n// stripped because the workspace also defines it), the CLI silently switches\n// to the API-key path and any usage caps on that key surface as\n// \"You have reached your specified API usage limits...\". This caused\n// claude-code-tier agents to bypass the user's subscription. The same\n// stripping pattern lives in src/agent/providers/claude-code.ts for the\n// in-process provider — keep them in sync.\nexport function stripAnthropicApiKey(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n delete env.ANTHROPIC_API_KEY\n delete env.ANTHROPIC_API_KEY_OLD\n return env\n}\n\n/** `env` with the folders the fleet's CLIs install to added to PATH. A\n * process started by launchd, or the MCP server Claude Code starts, does\n * not get a login shell's PATH, and `claude` usually lives in\n * ~/.local/bin. */\nexport function withToolPath(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const home = env.HOME || process.env.HOME\n const parts = [\n env.PATH || \"\",\n home ? `${home}/.local/bin` : \"\",\n \"/opt/homebrew/bin\",\n \"/usr/local/bin\",\n ]\n env.PATH = Array.from(new Set(parts.flatMap((p) => p.split(\":\")).filter(Boolean))).join(\":\")\n return env\n}\n\n/** The env for a one-shot `claude -p` call: subscription billing, a\n * PATH that can find the CLI, and no CLAUDECODE marker. Inside an\n * agent's session (the MCP server, an agent's own shell) the marker is\n * inherited and the CLI refuses to start a nested session, which is how\n * `agentx_wiki_patch` and `agentx_wiki_interview` failed at `claude -p`\n * (#824). session-monitor and talk-model drop it for the same reason. */\nexport function claudeCliEnv(): NodeJS.ProcessEnv {\n const env = withToolPath(stripAnthropicApiKey({ ...process.env }))\n delete env.CLAUDECODE\n return env\n}\n\n/** How an agent's `claude` CLI is billed. \"subscription\" (the default) is\n * the OAuth login shared by the fleet. \"api\" bills ANTHROPIC_API_KEY\n * instead, for agents that must not draw on that shared quota, such as\n * benchmark runs. */\nexport type ClaudeBilling = \"subscription\" | \"api\"\n\n/** Shape a `claude` spawn env for the agent's billing. Each mode removes the\n * other's credential, because the CLI silently uses whichever it finds. An\n * \"api\" agent with no key throws rather than falling back to the\n * subscription. */\nexport function claudeBillingEnv(\n env: NodeJS.ProcessEnv,\n billing: ClaudeBilling = \"subscription\",\n): NodeJS.ProcessEnv {\n if (billing !== \"api\") return stripAnthropicApiKey(env)\n if (!env.ANTHROPIC_API_KEY) {\n throw new Error('billing \"api\" needs ANTHROPIC_API_KEY in the agent\\'s environment')\n }\n delete env.ANTHROPIC_API_KEY_OLD\n delete env.CLAUDE_CODE_OAUTH_TOKEN\n return env\n}\n\n/**\n * Load a dotenv file into process.env for the CURRENT process. Variables\n * already present win, so a systemd/launchd override always beats the file.\n *\n * `agentx daemon start` has always done this; `agentx board serve` did not,\n * so `${MESH_TOKEN}` in agentx.json expanded to \"\" inside the dashboard and\n * every proxied mesh call went out with an empty Bearer (401 from peers).\n */\nexport function loadEnvFileIntoProcess(path: string): void {\n if (!existsSync(path)) return\n for (const [key, value] of parseDotEnv(readFileSync(path, \"utf-8\"))) {\n if (process.env[key] === undefined) process.env[key] = value\n }\n}\n"],"mappings":"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","names":["readFileSync","existsSync","resolve","parseDotEnv","content","out","raw","trimmed","stripped","eq","key","value","loadWorkspaceEnv","workspace","merged","fname","path","k","v","daemonEnvKeysCache","getDaemonEnvKeys","daemonCwd","cached","keys","buildAgentEnv","workspace","parentEnv","daemonCwd","workspaceEnv","loadWorkspaceEnv","daemonOwnedKeys","getDaemonEnvKeys","child","k","v","stripAnthropicApiKey","env","withToolPath","home","parts","p","claudeCliEnv","claudeBillingEnv","billing","loadEnvFileIntoProcess","path","existsSync","key","value","parseDotEnv","readFileSync"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/workspace-env.ts"],"sourcesContent":["import { readFileSync, existsSync } from \"fs\"\nimport { resolve } from \"path\"\n\n// Loads per-agent secrets from the agent's workspace and tells the runtime\n// which keys the daemon's own .env injected, so we can strip those before\n// spawning the agent's claude process. Without this, every agent inherits\n// the daemon's GITLAB_TOKEN regardless of whether their workspace has its\n// own .env.gitlab — defeating per-agent identity boundaries (each agent\n// should commit/push as itself, not as the daemon's account).\n\n/**\n * Parse a dotenv-style file. Tolerates the `export KEY=VALUE` form used by\n * shell-sourced files like .env.gitlab on peer-server.\n */\nfunction parseDotEnv(content: string): Array<[string, string]> {\n const out: Array<[string, string]> = []\n for (const raw of content.split(\"\\n\")) {\n const trimmed = raw.trim()\n if (!trimmed || trimmed.startsWith(\"#\")) continue\n const stripped = trimmed.startsWith(\"export \") ? trimmed.slice(7).trim() : trimmed\n const eq = stripped.indexOf(\"=\")\n if (eq === -1) continue\n const key = stripped.slice(0, eq).trim()\n let value = stripped.slice(eq + 1).trim()\n if (value.length >= 2 && ((value.startsWith('\"') && value.endsWith('\"')) || (value.startsWith(\"'\") && value.endsWith(\"'\")))) {\n value = value.slice(1, -1)\n }\n if (key) out.push([key, value])\n }\n return out\n}\n\n/**\n * Read .env then .env.gitlab from a workspace and return their merged keys.\n * .env.gitlab wins on collision — it's the more specific per-channel file.\n */\nexport function loadWorkspaceEnv(workspace: string): Record<string, string> {\n const merged: Record<string, string> = {}\n for (const fname of [\".env\", \".env.gitlab\"]) {\n const path = resolve(workspace, fname)\n if (!existsSync(path)) continue\n try {\n for (const [k, v] of parseDotEnv(readFileSync(path, \"utf-8\"))) {\n merged[k] = v\n }\n } catch { /* best-effort */ }\n }\n return merged\n}\n\n/**\n * Keys defined in the daemon's own .env file, cached per daemonCwd. The\n * runtime uses this to strip those keys from the child env before adding\n * the workspace overrides — so a daemon-level GITLAB_TOKEN never leaks to\n * an agent that hasn't put one in its own workspace.\n */\nconst daemonEnvKeysCache = new Map<string, Set<string>>()\n\nexport function getDaemonEnvKeys(daemonCwd: string = process.cwd()): Set<string> {\n const cached = daemonEnvKeysCache.get(daemonCwd)\n if (cached) return cached\n const path = resolve(daemonCwd, \".env\")\n let keys: Set<string>\n if (!existsSync(path)) {\n keys = new Set()\n } else {\n try {\n keys = new Set(parseDotEnv(readFileSync(path, \"utf-8\")).map(([k]) => k))\n } catch {\n keys = new Set()\n }\n }\n daemonEnvKeysCache.set(daemonCwd, keys)\n return keys\n}\n\n/** Test-only: clear the cache so a different daemonCwd is re-read. */\nexport function _resetDaemonEnvKeysCache(): void {\n daemonEnvKeysCache.clear()\n}\n\n/**\n * Build the env object passed to a spawned agent process. Starts from\n * parentEnv (default process.env), removes any keys that came from the\n * daemon's own .env (so daemon-level secrets don't leak), then layers in\n * workspace .env / .env.gitlab.\n *\n * - System env (PATH, HOME, USER, …) survives untouched.\n * - Daemon-level secrets (e.g. GITLAB_TOKEN in /home/peer/agentx/.env) are\n * stripped UNLESS the workspace provides its own value for that key.\n * - Workspace env (per-agent .env / .env.gitlab) wins on the final merge.\n */\nexport function buildAgentEnv(\n workspace: string,\n parentEnv: NodeJS.ProcessEnv = process.env,\n daemonCwd: string = process.cwd(),\n): NodeJS.ProcessEnv {\n const workspaceEnv = loadWorkspaceEnv(workspace)\n const daemonOwnedKeys = getDaemonEnvKeys(daemonCwd)\n const child: NodeJS.ProcessEnv = { ...parentEnv }\n for (const k of daemonOwnedKeys) {\n if (!(k in workspaceEnv)) delete child[k]\n }\n for (const [k, v] of Object.entries(workspaceEnv)) {\n child[k] = v\n }\n return child\n}\n\n// Force the `claude` CLI to use OAuth/subscription billing. When\n// ANTHROPIC_API_KEY is present (env, systemd EnvironmentFile, daemon .env not\n// stripped because the workspace also defines it), the CLI silently switches\n// to the API-key path and any usage caps on that key surface as\n// \"You have reached your specified API usage limits...\". This caused\n// claude-code-tier agents to bypass the user's subscription. The same\n// stripping pattern lives in src/agent/providers/claude-code.ts for the\n// in-process provider — keep them in sync.\nexport function stripAnthropicApiKey(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n delete env.ANTHROPIC_API_KEY\n delete env.ANTHROPIC_API_KEY_OLD\n return env\n}\n\n/** `env` with the folders the fleet's CLIs install to added to PATH. A\n * process started by launchd, or the MCP server Claude Code starts, does\n * not get a login shell's PATH, and `claude` usually lives in\n * ~/.local/bin. */\nexport function withToolPath(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const home = env.HOME || process.env.HOME\n const parts = [\n env.PATH || \"\",\n home ? `${home}/.local/bin` : \"\",\n \"/opt/homebrew/bin\",\n \"/usr/local/bin\",\n ]\n env.PATH = Array.from(new Set(parts.flatMap((p) => p.split(\":\")).filter(Boolean))).join(\":\")\n return env\n}\n\n/** The env for a one-shot `claude -p` call: subscription billing, a\n * PATH that can find the CLI, and no CLAUDECODE marker. Inside an\n * agent's session (the MCP server, an agent's own shell) the marker is\n * inherited and the CLI refuses to start a nested session, which is how\n * `agentx_wiki_patch` and `agentx_wiki_interview` failed at `claude -p`\n * (#824). session-monitor and talk-model drop it for the same reason. */\nexport function claudeCliEnv(): NodeJS.ProcessEnv {\n const env = withToolPath(stripAnthropicApiKey({ ...process.env }))\n delete env.CLAUDECODE\n return env\n}\n\n/** How an agent's `claude` CLI is billed. \"subscription\" (the default) is\n * the OAuth login shared by the fleet. \"api\" bills ANTHROPIC_API_KEY\n * instead, for agents that must not draw on that shared quota, such as\n * benchmark runs. */\nexport type ClaudeBilling = \"subscription\" | \"api\"\n\n/** Shape a `claude` spawn env for the agent's billing. Each mode removes the\n * other's credential, because the CLI silently uses whichever it finds. An\n * \"api\" agent with no key throws rather than falling back to the\n * subscription. */\nexport function claudeBillingEnv(\n env: NodeJS.ProcessEnv,\n billing: ClaudeBilling = \"subscription\",\n): NodeJS.ProcessEnv {\n if (billing !== \"api\") return stripAnthropicApiKey(env)\n if (!env.ANTHROPIC_API_KEY) {\n throw new Error('billing \"api\" needs ANTHROPIC_API_KEY in the agent\\'s environment')\n }\n delete env.ANTHROPIC_API_KEY_OLD\n delete env.CLAUDE_CODE_OAUTH_TOKEN\n return env\n}\n\n/**\n * Load a dotenv file into process.env for the CURRENT process. Variables\n * already present win, so a systemd/launchd override always beats the file.\n *\n * `agentx daemon start` has always done this; `agentx board serve` did not,\n * so `${MESH_TOKEN}` in agentx.json expanded to \"\" inside the dashboard and\n * every proxied mesh call went out with an empty Bearer (401 from peers).\n */\nexport function loadEnvFileIntoProcess(path: string): void {\n if (!existsSync(path)) return\n for (const [key, value] of parseDotEnv(readFileSync(path, \"utf-8\"))) {\n if (process.env[key] === undefined) process.env[key] = value\n }\n}\n"],"mappings":"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","names":["readFileSync","existsSync","resolve","parseDotEnv","content","out","raw","trimmed","stripped","eq","key","value","loadWorkspaceEnv","workspace","merged","fname","path","k","v","daemonEnvKeysCache","getDaemonEnvKeys","daemonCwd","cached","keys","_resetDaemonEnvKeysCache","buildAgentEnv","parentEnv","workspaceEnv","daemonOwnedKeys","child","stripAnthropicApiKey","env","withToolPath","home","parts","p","claudeCliEnv","claudeBillingEnv","billing","loadEnvFileIntoProcess"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as rt,b as ot,c as st,d as x,e as A,f as v}from"./chunk-72SZI2UW.js";import{a as ne,b as et}from"./chunk-FCPTN6NF.js";import{a as Te,b as ht}from"./chunk-MCI3DIWW.js";import{o as we,p as Ze}from"./chunk-2PJKGZWP.js";import{
|
|
1
|
+
import{a as rt,b as ot,c as st,d as x,e as A,f as v}from"./chunk-72SZI2UW.js";import{a as ne,b as et}from"./chunk-FCPTN6NF.js";import{a as Te,b as ht}from"./chunk-MCI3DIWW.js";import{o as we,p as Ze}from"./chunk-2PJKGZWP.js";import{va as tt,wa as nt}from"./chunk-S2RRPTS3.js";import{a as it,b as at,c as ct,d as ut,e as lt,f as dt,g as pt,h as mt,i as bt,j as ft,k as gt,l as yt}from"./chunk-RGDKHYY2.js";import{a as E,b as We,c as he}from"./chunk-QIJLFPWE.js";function R(e,t){$.set(e,t),X.delete(e)}function D(e){let t=X.get(e);if(t)return t;let r=$.get(e);if(!r){let o=Ee();throw new Error(`unknown decision backend "${e}"`+(o.length>0?` \u2014 registered: ${o.join(", ")}`:" \u2014 none registered"))}let n=r();return X.set(e,n),n}function Ee(){return[...$.keys()].sort()}function wt(){$.clear(),X.clear()}var $,X,C=E(()=>{"use strict";$=new Map,X=new Map});import Tt from"better-sqlite3";import{createHash as Et}from"crypto";import{mkdirSync as kt}from"fs";import{dirname as St,resolve as xt}from"path";function Q(e){if(e.type==="noul"){let r=e.noul,n={yes:r,no:1-r},o=r>=.5?"yes":"no",s=Math.abs(r-.5)*2;return{predicted:o,confidence:s,probabilities:n,topLabel:o,topProb:Math.max(r,1-r),expectedScore:null,pMax:Math.max(r,1-r),negEntropy:s}}if(e.type==="choice")return{predicted:e.choice,confidence:e.confidence,probabilities:{...e.probabilities},topLabel:e.choice,topProb:e.probabilities[e.choice]??0,expectedScore:null,pMax:e.pMax,negEntropy:e.negEntropy};let t=String(Math.round(e.score));return{predicted:t,confidence:e.confidence,probabilities:{...e.probabilities},topLabel:t,topProb:e.probabilities[t]??0,expectedScore:e.score,pMax:e.pMax,negEntropy:e.negEntropy}}function At(e){if(typeof e!="string"||e.length===0)return{};try{let t=JSON.parse(e);return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return{}}}function Rt(e){e.exec("CREATE TABLE IF NOT EXISTS schema_version (v INTEGER PRIMARY KEY);");let t=e.prepare("SELECT MAX(v) AS v FROM schema_version").get().v??0;t<1&&vt(e),t<2&&Ot(e),t<3&&_t(e)}function _t(e){e.exec(`
|
|
2
2
|
ALTER TABLE decision_calls ADD COLUMN features_json TEXT;
|
|
3
3
|
INSERT INTO schema_version (v) VALUES (3);
|
|
4
4
|
`)}function Ot(e){e.exec(`
|
|
@@ -111,4 +111,4 @@ import{a as rt,b as ot,c as st,d as x,e as A,f as v}from"./chunk-72SZI2UW.js";im
|
|
|
111
111
|
`)}if(!m)throw new Error(`local decision backend could not get a valid answer after ${f+1} attempt(s): ${w}`);let M={},L=!1;for(let[k,q]of Object.entries(s.questions)){let S=_(q,m[k],{normalize:e.normalizeProbabilities??!0});M[k]=S.answer,S.repaired&&(L=!0)}return{model:a,answers:M,usage:h,meta:{backend:"local",structureMode:c,answerMode:"probabilities",repaired:L,retries:f,stateTruncated:l.truncated,latencyMs:Date.now()-i}}}finally{b()}}}}async function Jt(e,t,r,n,o){if(!e.generateRaw)throw new Error(`provider "${e.name}" has no generateRaw(); use structureMode "text"`);let s=[{role:"user",content:r},...n?[{role:"user",content:n}]:[]],i=await e.generateRaw(s,J,[{name:F,description:"Report a probability distribution for every question.",input_schema:se(t)}],{...o,toolChoice:{type:"tool",name:F}}),a=i.content.find(c=>c.type==="tool_use"&&c.name===F),u=a&&a.type==="tool_use"?a.input:null;return{answers:Be(u),usage:{inputTokens:i.usage.input_tokens,outputTokens:i.usage.output_tokens}}}async function Gt(e,t,r,n,o){let s=[r,ae(t)].join(`
|
|
112
112
|
`),i=[{role:"system",content:J},{role:"user",content:s},...n?[{role:"user",content:n}]:[]],a=await e.generate(i,o);return{answers:Be(Te(a.content??"")),usage:{inputTokens:0,outputTokens:a.tokensUsed??0}}}function Be(e){if(e&&typeof e=="object"&&!Array.isArray(e)){let t=e;if(t.answers&&typeof t.answers=="object")return t.answers}return e}function Yt(e,t){return e!=="auto"?e:t.generateRaw&&me[t.name]?.structuredOutput?"tool":"text"}function Kt(e,t){let r=new AbortController,n=setTimeout(()=>r.abort(new Error(`decision timed out after ${t}ms`)),t),o=()=>r.abort(e?.reason);return e&&(e.aborted?o():e.addEventListener("abort",o,{once:!0})),{signal:r.signal,dispose:()=>{clearTimeout(n),e?.removeEventListener("abort",o)}}}var Xt,$t,Vt,Fe,zt,be=E(()=>{"use strict";Ze();Ue();ht();j();Y();v();z();Xt="claude-code",$t="claude-haiku-4-5-20251001",Vt=24e3,Fe=2e3,zt=3e4});import{readFileSync as Ht}from"fs";import{homedir as Wt}from"os";import{join as Zt}from"path";function N(e={}){let t=(e.baseUrl??en).replace(/\/+$/,""),r=e.path??"/classifier",n=e.name??"simple-jev",o=e.maxStateChars??nn,s=e.maxChoiceOptions??rn,i={probabilitySource:e.probabilitySource??"logits",calibratedProbabilities:!1,maxChoiceOptions:s,maxStateChars:o,parallelQuestions:!0,images:!1};return{name:n,capabilities:i,async decide(a){A(a.questions),cn(a.questions,s);let u=Date.now(),c=a.model??e.model;if(!c)throw new Error("simple-jev backend needs a model id");let l=G(a.state,o),p=e.fetchImpl??fetch,{signal:g,dispose:d}=un(a.abortSignal,a.timeoutMs??e.timeoutMs??tn);try{let b={"Content-Type":"application/json"},h=an(e.apiKeyEnv,e.apiKeyFile);h&&(b.Authorization=`Bearer ${h}`);let T=await qe(p(`${t}${r}`,{method:"POST",headers:b,body:JSON.stringify({model:c,state:l.text,questions:sn(a.questions)}),signal:g}),g);if(!T.ok){let k=await T.text().catch(()=>"");throw new Error(`${n} ${T.status}: ${k.slice(0,300)}`)}let f=await qe(T.json(),g),m=P(a.questions).safeParse(f.answers);if(!m.success)throw new Error(`${n} returned a response that does not match the requested questions (contract drift, not a model slip \u2014 retrying will not help):
|
|
113
113
|
${U(m.error)}`);let w=m.data,M={},L=!1;for(let[k,q]of Object.entries(a.questions)){let S=_(q,w[k]);M[k]=S.answer,S.repaired&&(L=!0)}return{model:f.model??c,answers:M,usage:{inputTokens:f.usage?.input_tokens??0,outputTokens:f.usage?.output_tokens??0},meta:{backend:n,structureMode:i.probabilitySource==="native"?"native":"logprobs",answerMode:"probabilities",repaired:L,retries:0,stateTruncated:l.truncated,latencyMs:Date.now()-u}}}finally{d()}}}}function sn(e){let t={};for(let[r,n]of Object.entries(e))t[r]=n.instructions?n:{...n,instructions:on[n.type]};return t}function an(e,t){let r=e?process.env[e]:void 0;if(r)return r;if(!t)return;let n=t.startsWith("~/")?Zt(Wt(),t.slice(2)):t;if(!Z.has(n))try{let o=Ht(n,"utf-8").trim();Z.set(n,o.length>0?o:null)}catch{Z.set(n,null)}return Z.get(n)??void 0}function cn(e,t){for(let[r,n]of Object.entries(e))if(n.type==="choice"){let o=Object.keys(n.criteria).length;if(o>t)throw new Error(`question "${r}": accepts at most ${t} choice options, got ${o}`)}else if(n.type==="score"&&n.criteria.length>t)throw new Error(`question "${r}": accepts at most ${t} score levels, got ${n.criteria.length}`)}function qe(e,t){return t.aborted?Promise.reject(t.reason??new Error("aborted")):new Promise((r,n)=>{let o=()=>n(t.reason??new Error("aborted"));t.addEventListener("abort",o,{once:!0}),e.then(s=>{t.removeEventListener("abort",o),r(s)},s=>{t.removeEventListener("abort",o),n(s)})})}function un(e,t){let r=new AbortController,n=setTimeout(()=>r.abort(new Error(`decision timed out after ${t}ms`)),t),o=()=>r.abort(e?.reason);return e&&(e.aborted?o():e.addEventListener("abort",o,{once:!0})),{signal:r.signal,dispose:()=>{clearTimeout(n),e?.removeEventListener("abort",o)}}}var en,tn,nn,rn,on,Z,fe=E(()=>{"use strict";j();v();z();Y();en="http://127.0.0.1:8000/v1",tn=3e4,nn=6e3,rn=50;on={choice:"Which option best fits?",score:"Which level best fits?",noul:"Is this true of the state?"};Z=new Map});var Xe={};We(Xe,{DEFAULT_SEAT_TIMEOUT_MS:()=>Ve,DecisionStore:()=>I,MAX_CHOICE_OPTIONS:()=>MAX_CHOICE_OPTIONS,SYSTEM_PROMPT:()=>J,TOOL_NAME:()=>F,UNCERTAINTY_HIGH:()=>Ce,UNCERTAINTY_LOW:()=>De,_resetDecisionBackendsForTesting:()=>wt,agreement:()=>it,answerView:()=>Q,applyRecalibrator:()=>ue,applyTemperature:()=>mt,askSeat:()=>yn,band:()=>Ie,bootstrapInterval:()=>ft,brier:()=>lt,buildDesign:()=>ve,calibrationReport:()=>gt,choice:()=>ot,compareCalibrators:()=>It,confidenceFor:()=>re,configureDecisions:()=>pn,configuredSeatTimeout:()=>dn,coverageCurve:()=>pt,createLocalDecisionBackend:()=>W,createMockDecisionBackend:()=>H,createSimpleJevBackend:()=>N,decisionsRuntime:()=>bn,describeIssues:()=>U,ece:()=>ct,expectedScore:()=>Ae,finalizeAnswer:()=>_,fitLogistic:()=>Ne,fitRecalibrator:()=>B,fitTemperature:()=>bt,getDecisionBackend:()=>D,getSeatMode:()=>Je,labelSeatCall:()=>fn,labelsOf:()=>x,listDecisionBackends:()=>Ee,logLoss:()=>dt,logit:()=>le,mce:()=>ut,measureConsistency:()=>Ut,normalizeDistribution:()=>Se,normalizedNegEntropy:()=>oe,noul:()=>rt,pMax:()=>xe,parseSeatMode:()=>ge,rawAnswerSchema:()=>Re,rawAnswersSchema:()=>P,recordSeatOutcome:()=>gn,registerBuiltinDecisionBackends:()=>ln,registerDecisionBackend:()=>R,reliabilityBins:()=>at,renderQuestions:()=>_e,renderShapeInstructions:()=>ae,renderState:()=>G,renderUserPrompt:()=>ie,resetDecisionsRuntime:()=>mn,score:()=>st,seatEnvVar:()=>ze,sigmoid:()=>de,toolInputSchema:()=>se,validateQuestions:()=>A,withUid:()=>Qe});function ln(e={},t={},r={},n={}){R("mock",()=>H()),R("local",()=>W(e)),R("simple-jev",()=>N(t)),R("jev",()=>N({name:"jev",baseUrl:"https://openrouter.ai/api/alpha",path:"/decisions",model:"jev-latest",apiKeyEnv:"OPENROUTER_API_KEY",apiKeyFile:"~/.agentx/openrouter-key.txt",probabilitySource:"native",maxChoiceOptions:255,maxStateChars:9e4,...r})),R("typesafe",()=>N({name:"typesafe",baseUrl:"https://api.typesafe.ai/v1",path:"/systemone",model:"jev-latest",apiKeyEnv:"TYPESAFE_API_KEY",apiKeyFile:"~/.agentx/typesafe-key.txt",probabilitySource:"native",maxChoiceOptions:255,maxStateChars:9e4,...n}))}var $e=E(()=>{"use strict";ke();v();j();z();C();Y();V();yt();Me();je();Ge();pe();be();fe();C();pe();be();fe()});function dn(e){return Ke(),y.seats[e]?.timeoutMs}function pn(e){y={...ye,...y,...e},ee=!0}function mn(){y={...ye,seats:{}},ee=!1}function Ke(){if(!ee){ee=!0;try{let{loadDaemonConfig:e}=(nt(),he(tt)),t=e()?.decisions;if(!t?.enabled)return;let{registerBuiltinDecisionBackends:r}=($e(),he(Xe)),n=t.backends??{};r(n.local,n.simpleJev,n.jev,n.typesafe);let o=null;try{o=new I({path:t.dbPath})}catch{}y={enabled:!0,defaultBackend:t.defaultBackend,store:o,seats:Object.fromEntries(Object.entries(t.seats??{}).map(([s,i])=>[s,{...i,redactState:t.redactState,keepStateRows:t.keepStateRows}]))}}catch{}}}function bn(){return y}function ge(e){if(typeof e!="string")return null;let t=e.trim().toLowerCase();return hn.includes(t)?t:null}function ze(e){return`AGENTX_DECISION_SEAT_${e.toUpperCase().replace(/[^A-Z0-9]+/g,"_")}`}function Je(e,t=process.env){Ke();let r=ge(t[ze(e)]);return r||(y.enabled?ge(y.seats[e]?.mode)??"off":"off")}function fn(e,t,r,n={}){if(!(!e||!y.store))try{y.store.label(e,t,r,n)}catch{}}function gn(e,t,r=!1){if(!(!e||!y.store))try{y.store.recordOutcome(e,t,r)}catch{}}async function yn(e,t,r,n={}){let o=Je(e);if(o==="off")return null;let s=y.seats[e]??{mode:o},i=n.backend??s.backend??y.defaultBackend,a=Date.now();try{let c=await D(i).decide({state:t,questions:r,model:n.model??s.model,abortSignal:n.signal,timeoutMs:n.timeoutMs??s.timeoutMs??(y.seats[e]?Ve:void 0)}),l=wn(e,o,t,r,c,n,s);return{answers:c.answers,callId:l,mode:o}}catch(u){return Tn(e,o,t,r,i,n,s,a,u),En(e,i,u),null}}function wn(e,t,r,n,o,s,i){if(!y.store)return null;try{return y.store.recordCall({seat:e,mode:t,backend:o.meta.backend,model:o.model,meta:o.meta,state:r,questions:n,answers:o.answers,usage:o.usage,incumbent:He(s.incumbent),links:s.links,features:s.features,keepState:!i.redactState})}catch{return null}}function Tn(e,t,r,n,o,s,i,a,u){if(y.store)try{y.store.recordCall({seat:e,mode:t,backend:o,model:s.model??i.model??"unknown",meta:{structureMode:"text",answerMode:"probabilities",retries:0,stateTruncated:!1,latencyMs:Date.now()-a},state:r,questions:n,answers:{},incumbent:He(s.incumbent),links:s.links,features:s.features,error:String(u?.message??u).slice(0,500),keepState:!i.redactState})}catch{}}function He(e){if(!e)return;let t={};for(let[r,n]of Object.entries(e))n!==void 0&&(t[r]={value:n});return t}function En(e,t,r){let n=Date.now();n-Ye<6e4||(Ye=n,console.warn(`[decisions] seat "${e}" on backend "${t}" failed: ${r?.message??r}`))}var Ve,ye,y,ee,hn,Ye,Ge=E(()=>{C();V();Ve=1e4;ye={enabled:!1,defaultBackend:"local",seats:{},store:null},y={...ye},ee=!1;hn=["off","shadow","active"];Ye=0});export{D as a,Ee as b,C as c,I as d,V as e,It as f,Me as g,Ut as h,je as i,me as j,Xn as k,Ue as l,ln as m,$e as n,Ve as o,dn as p,pn as q,mn as r,bn as s,ge as t,ze as u,Je as v,fn as w,gn as x,yn as y,Ge as z};
|
|
114
|
-
//# sourceMappingURL=chunk-
|
|
114
|
+
//# sourceMappingURL=chunk-724IBN5Y.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as O}from"./chunk-
|
|
1
|
+
import{a as O}from"./chunk-JP5OAMWQ.js";import{b as L}from"./chunk-4VVHGR7H.js";import{a as I,b as R,c as j,d as M,e as E,j as T}from"./chunk-ZG4G6BFP.js";import{y as C,z as N}from"./chunk-724IBN5Y.js";import{c as _,d as x}from"./chunk-QOYAX2FT.js";import{readFileSync as W,writeFileSync as k,appendFileSync as B,existsSync as w,mkdirSync as S,readdirSync as D,statSync as U}from"fs";import{resolve as u,join as K,relative as y,dirname as J}from"path";N();function V(A){return O.includes(A)}function F(A){if(!A)return;let t;try{t=JSON.parse(A)}catch{return}if(!Array.isArray(t))return;let e=t.filter(r=>typeof r=="object"&&r!==null&&typeof r.property=="string"&&r.property!==""&&typeof r.value=="string"&&r.value!=="");return e.length?e:void 0}var P=class{baseDir;rawDir;log;constructor(t=u(process.cwd(),".agentx/wiki"),e=console.error.bind(console,"[wiki]")){this.baseDir=t,this.rawDir=u(t,"raw/entries"),this.log=e,S(this.rawDir,{recursive:!0}),S(u(t,"raw"),{recursive:!0}),this.ensureSchema()}canRead(t,e){return t.access==="public"?!0:e?!!(t.owner===e||t.access==="shared"&&t.sharedWith?.includes(e)):!1}canWrite(t,e){return t.owner===e}addEntry(t){let e=`${t.date}_${t.id}.md`,r=u(this.rawDir,e),n=["---",`id: ${t.id}`,`date: ${t.date}`,`agent: ${t.agentId}`,`source: ${t.source}`];if(t.sourceContext&&n.push(`context: ${t.sourceContext}`),t.meta)for(let[o,s]of Object.entries(t.meta))n.push(`${o}: ${JSON.stringify(s)}`);return n.push("---","",t.content),k(r,n.join(`
|
|
2
2
|
`)),this.appendLog("ingest",`${t.id} from ${t.agentId} via ${t.source}`),e}readEntries(t){if(t.length===0||!w(this.rawDir))return[];let e=new Set(t),r=[];for(let n of D(this.rawDir)){let o=n.replace(/\.md$/,"").replace(/^\d{4}-\d{2}-\d{2}_/,"");if(!e.has(o))continue;let s=this.parseEntry(W(u(this.rawDir,n),"utf-8"),n);s&&r.push(s)}return r}listEntries(t){if(!w(this.rawDir))return[];let e=D(this.rawDir).filter(n=>n.endsWith(".md")).sort(),r=[];for(let n of e){let o=W(u(this.rawDir,n),"utf-8"),s=this.parseEntry(o,n);s&&(t?.agentId&&s.agentId!==t.agentId||t?.after&&s.date<t.after||t?.before&&s.date>t.before||r.push(s))}return r}parseEntry(t,e){let r=t.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);if(!r)return null;let n=r[1],o=r[2].trim(),s=c=>n.match(new RegExp(`^${c}:\\s*(.+)$`,"m"))?.[1]?.trim()||"",a=new Set(["id","date","agent","source","context"]),i={};for(let c of n.split(`
|
|
3
3
|
`)){let l=c.match(/^(\w+):\s*(.+)$/);if(!(!l||a.has(l[1])))try{i[l[1]]=JSON.parse(l[2])}catch{i[l[1]]=l[2].trim()}}return{id:s("id")||e.replace(".md",""),date:s("date"),agentId:s("agent"),source:s("source"),sourceContext:s("context")||void 0,content:o,meta:Object.keys(i).length>0?i:void 0}}writeArticle(t,e,r,n){let o=this.readArticle(t);if(o&&!this.canWrite(o.meta,n))return this.log(`Permission denied: "${n}" cannot write "${t}" (owner: ${o.meta.owner})`),!1;e.type&&!L(e.type)&&(this.log(`Dropping invalid article type "${e.type}" for "${t}" \u2014 enum is [person, project, place, concept, event, decision, pattern]`),e={...e,type:void 0});let s=u(this.baseDir,t);o&&this.saveVersion(t,s),S(J(s),{recursive:!0});let a=["---",`title: "${e.title}"`];e.type&&a.push(`type: ${e.type}`),e.related?.length&&a.push(`related: [${e.related.map(c=>`"${c}"`).join(", ")}]`),a.push(`tags: [${(e.tags||[]).map(c=>`"${c}"`).join(", ")}]`,`owner: ${e.owner}`,`access: ${e.access}`),e.sharedWith?.length&&a.push(`shared_with: [${e.sharedWith.map(c=>`"${c}"`).join(", ")}]`),a.push(`created: ${e.created}`,`last_updated: ${e.lastUpdated}`,`sources: [${e.sources.map(c=>`"${c}"`).join(", ")}]`),e.graphPath?.length&&a.push(`graph_path: [${e.graphPath.map(c=>`"${c}"`).join(", ")}]`),e.class&&a.push(`class: ${e.class}`),e.importance&&a.push(`importance: ${e.importance}`),e.date&&a.push(`date: ${e.date}`),e.rolledUpInto&&a.push(`rolled_up_into: ${JSON.stringify(e.rolledUpInto)}`),e.aliases?.length&&a.push(`aliases: ${JSON.stringify(e.aliases)}`),e.statements?.length&&a.push(`statements: ${JSON.stringify(e.statements)}`),a.push("---","",r),k(s,a.join(`
|
|
4
4
|
`));let i=o?"update":"create";return this.appendLog(i,`${e.title} [${(e.tags||[]).slice(0,5).join(", ")}] by ${n} at ${t}`),!0}saveVersion(t,e){try{if(!w(e))return;let r=W(e,"utf-8"),n=new Date().toISOString().replace(/[:.]/g,"-"),o=u(this.baseDir,"_versions",t.replace(/\.md$/,""));S(o,{recursive:!0}),k(u(o,`${n}.md`),r)}catch{}}getVersions(t){let e=u(this.baseDir,"_versions",t.replace(/\.md$/,""));if(!w(e))return[];try{return D(e).filter(r=>r.endsWith(".md")).sort().reverse().map(r=>({timestamp:r.replace(/\.md$/,"").replace(/-/g,(n,o)=>o<19?o===10?"T":o===13||o===16?":":"-":n),path:u(e,r)}))}catch{return[]}}restoreVersion(t,e){let n=this.getVersions(t).find(o=>o.timestamp.startsWith(e));if(!n)return!1;try{let o=W(n.path,"utf-8"),s=u(this.baseDir,t);return this.saveVersion(t,s),k(s,o),this.appendLog("restore",`${t} restored to ${e}`),!0}catch{return!1}}readArticle(t){let e=u(this.baseDir,t);if(!w(e))return null;let r=W(e,"utf-8");return this.parseArticle(r,t)}readArticleAs(t,e){let r=this.readArticle(t);return!r||!this.canRead(r.meta,e)?null:r}parseArticle(t,e){let r=t.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);if(!r)return null;let n=r[1],o=r[2].trim(),s=f=>n.match(new RegExp(`^${f}:\\s*(.+)$`,"m"))?.[1]?.trim().replace(/^"(.*)"$/,"$1")||"",a=f=>{let $=n.match(new RegExp(`^${f}:\\s*\\[(.*)\\]$`,"m"));return $?[...$[1].matchAll(/\s*(?:"(.*?)"(?=\s*(?:,|$))|([^,]+))/g)].map(v=>(v[1]??v[2]).trim()).filter(Boolean):[]},i=s("type")||s("kind"),l=new Set(["person","project","place","concept","event","decision","pattern"]).has(i)?i:void 0,g=a("tags").filter((f,$,v)=>f&&v.indexOf(f)===$),d=a("related"),p=a("graph_path"),m=a("aliases"),h=s("importance"),b=s("date");return{meta:{title:s("title"),type:l,related:d.length?d:void 0,tags:g,owner:s("owner"),access:s("access")||"public",sharedWith:a("shared_with"),created:s("created"),lastUpdated:s("last_updated"),sources:a("sources"),graphPath:p.length?p:void 0,class:/^[a-z][a-z0-9_]*$/.test(s("class"))?s("class"):void 0,importance:V(h)?h:void 0,date:/^\d{4}-\d{2}-\d{2}/.test(b)?b.slice(0,10):void 0,rolledUpInto:s("rolled_up_into")||void 0,aliases:m.length?m:void 0,statements:F(s("statements"))},content:o,path:e}}listCache=new Map;listArticles(t){return this.listCached(t)}listAllArticles(){return this.listCached(null)}listCached(t){let e=[],r=[];this.walkDir(this.baseDir,(i,c)=>{if(!i.endsWith(".md"))return;let l=y(this.baseDir,i);l.startsWith("raw/")||l.startsWith("_")||(e.push(l),r.push(`${l}:${c?.mtimeMs??"?"}:${c?.size??"?"}`))});let n=r.join("|"),o=t??"\0all",s=this.listCache.get(o);if(s&&s.signature===n)return s.articles.slice();let a=[];for(let i of e){let c=this.readArticle(i);c&&(t===null||this.canRead(c.meta,t))&&a.push(c)}return this.listCache.set(o,{signature:n,articles:a}),a.slice()}search(t,e,r=10){let n=t.toLowerCase(),o=[];if(this.walkDir(this.baseDir,d=>{if(!d.endsWith(".md"))return;let p=y(this.baseDir,d);if(p.startsWith("raw/")||p.startsWith("_"))return;let m=this.readArticle(p);!m||!this.canRead(m.meta,e)||o.push(m)}),o.length===0)return[];let s=o.map(d=>d.content),a=u(this.baseDir,"_bm25_cache.json"),i=x(s,a),c=_(t,i),l=new Map(c.map(d=>[d.docIndex,d.score]));return o.map((d,p)=>{let m=l.get(p)??0;return d.meta.title.toLowerCase().includes(n)&&(m+=10),d.meta.tags?.some(h=>h.toLowerCase().includes(n))&&(m+=5),{article:d,score:m}}).filter(d=>d.score>0).sort((d,p)=>p.score-d.score).slice(0,r).map(d=>d.article)}async findRelevantReranked(t,e,r=10,n={}){let o=Math.max(r,n.shortlist??R),s=this.findRelevant(t,e,o);if(s.length<2)return s.slice(0,r);let a=s.map((l,g)=>({id:`c${g}`,title:l.meta.title||`(untitled ${g})`,tags:l.meta.tags,excerpt:l.content})),i=await C(I,j({query:t,candidates:a,excerptChars:n.excerptChars}),M(a),{incumbent:{best:a[0].id},features:{agent:e??"unknown"}});return!i||i.mode!=="active"?s.slice(0,r):E(i.answers,a).ranked.map(l=>s[Number(l.slice(1))]).filter(l=>!!l).slice(0,r)}findRelevant(t,e,r=3,n,o={graph:.6,bm25:.4}){let s=[];if(this.walkDir(this.baseDir,h=>{if(!h.endsWith(".md"))return;let b=y(this.baseDir,h);if(b.startsWith("raw/")||b.startsWith("_"))return;let f=this.readArticle(b);!f||!this.canRead(f.meta,e)||s.push(f)}),s.length===0)return[];let a=s.map(h=>`${h.meta.title} ${(h.meta.tags||[]).join(" ")} ${h.content}`),i=u(this.baseDir,"_bm25_relevance_cache.json"),c=x(a,i),l=_(t,c),g=l.reduce((h,b)=>Math.max(h,b.score),0)||1,d=new Map(l.map(h=>[h.docIndex,h.score/g])),p=!!(n&&n.length>0);return s.map((h,b)=>{let f=d.get(b)??0,$=0;p&&h.meta.graphPath?.length&&($=T(n,h.meta.graphPath));let v=p?o.graph*$+o.bm25*f:f;return{article:h,score:v}}).filter(h=>h.score>0).sort((h,b)=>b.score-h.score).slice(0,r).map(h=>h.article)}buildContext(t,e=4e3){if(t.length===0)return"";let r=["[Wiki Knowledge]"],n=0;for(let o of t){let s=`
|
|
@@ -102,4 +102,4 @@ We use GitLab for version control.
|
|
|
102
102
|
There are ${e.length} unprocessed entries. Read each, understand what it means, and create or update wiki articles.
|
|
103
103
|
|
|
104
104
|
${r}`}walkDir(t,e){if(w(t))for(let r of D(t)){let n=K(t,r),o=U(n);o.isDirectory()?this.walkDir(n,e):e(n,o)}}};export{P as a};
|
|
105
|
-
//# sourceMappingURL=chunk-
|
|
105
|
+
//# sourceMappingURL=chunk-74LPAKQY.js.map
|