@vpxa/aikit 0.1.348 → 0.1.349

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.
Files changed (52) hide show
  1. package/package.json +1 -1
  2. package/packages/cli/dist/index.js +19 -19
  3. package/packages/cli/dist/{init-DAzYmzd4.js → init-D5TsG2R6.js} +1 -1
  4. package/packages/cli/dist/{templates-CNqAE336.js → templates-CztsaGb2.js} +23 -23
  5. package/packages/core/dist/index.d.ts +17 -1
  6. package/packages/core/dist/index.js +1 -1
  7. package/packages/server/dist/bin.js +6 -6
  8. package/packages/server/dist/config-4M54ZAT8.js +2 -0
  9. package/packages/server/dist/config-BXd38nVn.js +1 -0
  10. package/packages/server/dist/index.js +2 -2
  11. package/packages/server/dist/prelude-DpX0QnqF.js +2 -0
  12. package/packages/server/dist/prelude-pJPHXvnQ.js +1 -0
  13. package/packages/server/dist/proxy.js +7 -7
  14. package/packages/server/dist/routes-9KnBpwfe.js +6 -0
  15. package/packages/server/dist/routes-B8hTXXR8.js +5 -0
  16. package/packages/server/dist/sampling-9GcILoHr.js +2 -0
  17. package/packages/server/dist/sampling-DuXB6-rK.js +1 -0
  18. package/packages/server/dist/{server-CtQIpb5U.js → server-BYZo2XjK.js} +158 -163
  19. package/packages/server/dist/{server-BxwVJZm4.js → server-BtRv0mbH.js} +158 -163
  20. package/packages/server/dist/{server-http-B-04m9Cc.js → server-http-CatdRS-N.js} +1 -1
  21. package/packages/server/dist/{server-http-CIaF7SHf.js → server-http-L_WQ9v_b.js} +1 -1
  22. package/packages/server/dist/{server-stdio-BbBfvNHd.js → server-stdio-CZuGZR4e.js} +1 -1
  23. package/packages/server/dist/{server-stdio-C2-A9bzn.js → server-stdio-avLmmdEi.js} +1 -1
  24. package/packages/server/dist/version-check-B6bui-YI.js +1 -0
  25. package/packages/server/dist/version-check-CZ5hY6R2.js +2 -0
  26. package/packages/server/dist/workspace-bootstrap-B57Oz40_.js +1 -0
  27. package/packages/tools/dist/index.d.ts +64 -27
  28. package/packages/tools/dist/index.js +95 -97
  29. package/scaffold/dist/adapters/hermes-agent.mjs +1 -1
  30. package/scaffold/dist/adapters/hermes.mjs +1 -1
  31. package/scaffold/dist/definitions/agents.mjs +1 -1
  32. package/scaffold/dist/definitions/bodies.mjs +38 -34
  33. package/scaffold/dist/definitions/flows.mjs +7 -7
  34. package/scaffold/dist/definitions/prompts.mjs +7 -7
  35. package/scaffold/dist/definitions/protocols.mjs +7 -7
  36. package/scaffold/dist/definitions/skills/aikit.mjs +14 -14
  37. package/scaffold/dist/definitions/skills/c4-architecture.mjs +1 -1
  38. package/scaffold/dist/definitions/skills/docs.mjs +5 -5
  39. package/scaffold/dist/definitions/skills/multi-agents-development.mjs +9 -9
  40. package/scaffold/dist/definitions/tools.mjs +1 -1
  41. package/scaffold/general/hooks/scripts/subagent-context.mjs +1 -1
  42. package/packages/server/dist/config-BsS-77rp.js +0 -2
  43. package/packages/server/dist/config-Ds28Hvip.js +0 -1
  44. package/packages/server/dist/prelude-C4WQMZGB.js +0 -2
  45. package/packages/server/dist/prelude-Dl1tjmFb.js +0 -1
  46. package/packages/server/dist/routes-C7bDyCOW.js +0 -5
  47. package/packages/server/dist/routes-CfG5gdSR.js +0 -6
  48. package/packages/server/dist/sampling-B8VsI_pG.js +0 -2
  49. package/packages/server/dist/sampling-CGZYd3sT.js +0 -1
  50. package/packages/server/dist/version-check-BjFqR01r.js +0 -1
  51. package/packages/server/dist/version-check-_2wmedTl.js +0 -2
  52. package/packages/server/dist/workspace-bootstrap-BJloolzr.js +0 -1
@@ -1,4 +1,4 @@
1
- import{a as e,i as t,n,r,t as i}from"./server-utils-De-aZNQa.js";import{n as a,r as o,t as s}from"./workspace-bootstrap-BJloolzr.js";import{t as c}from"./curated-manager-CBKTmAjM.js";import{pathToFileURL as l}from"node:url";import{parseArgs as u}from"node:util";import{createLogger as d,serializeError as f}from"../../core/dist/index.js";import{join as p,resolve as m}from"node:path";import{mkdir as h,writeFile as g}from"node:fs/promises";function _(e){if(!e.meta?.title)return`# Diagram
1
+ import{a as e,i as t,n,r,t as i}from"./server-utils-De-aZNQa.js";import{n as a,r as o,t as s}from"./workspace-bootstrap-B57Oz40_.js";import{t as c}from"./curated-manager-CBKTmAjM.js";import{pathToFileURL as l}from"node:url";import{parseArgs as u}from"node:util";import{createLogger as d,serializeError as f}from"../../core/dist/index.js";import{join as p,resolve as m}from"node:path";import{mkdir as h,writeFile as g}from"node:fs/promises";function _(e){if(!e.meta?.title)return`# Diagram
2
2
 
3
3
  *Missing metadata*
4
4
  `;if(!e.diagram_type)return`# Diagram
@@ -172,4 +172,4 @@ svg .edge-label{fill:var(--text-muted)}
172
172
  </div>
173
173
  </body>
174
174
  </html>`}const H=`<!-- DIAGRAM:SVG -->`;function U(e){let t=e.indexOf(H);if(t===-1)return null;let n=t+20,r=e.indexOf(H,n);if(r===-1)return null;let i=e.slice(n,r).trim();if(i.startsWith(`<svg`))return i;let a=e.slice(Math.max(0,t),r+20),o=a.match(/viewBox="([^"]+)"/),s=o?o[1]:`0 0 1200 800`,c=a.match(/width="(\d+)"/),l=c?c[1]:`1200`,u=a.match(/height="(\d+)"/);return[`<svg xmlns="http://www.w3.org/2000/svg" viewBox="${s}" width="${l}" height="${u?u[1]:`800`}">`,` <defs>`,` <style>`,` text { font-family: system-ui, -apple-system, sans-serif; }`,` .title { font-size: 20px; font-weight: 600; fill: #fff; }`,` .subtitle { font-size: 14px; fill: #94a3b8; }`,` </style>`,` </defs>`,i,`</svg>`].join(`
175
- `)}function ge(e){let t=e.match(/<title>([^<]+)<\/title>/);return t?t[1]:`diagram`}async function _e(e,t,n){let r=m(n);await h(r,{recursive:!0});let i=ge(e).replace(/[^a-zA-Z0-9\s-]/g,``).replace(/\s+/g,`-`).replace(/-+/g,`-`).replace(/^-|-$/g,``).toLowerCase().slice(0,80)||`diagram`,a=p(r,`${i}.html`);await g(a,e,`utf-8`);let o=null,s=U(e);s&&(o=p(r,`${i}.svg`),await g(o,s,`utf-8`));let c=null;return t&&(c=p(r,`${i}.md`),await g(c,t,`utf-8`)),{htmlPath:a,svgPath:o,mdPath:c}}const W=10*1024*1024,G=2e3;function ve(e){switch(e.diagram_type){case`architecture`:return oe(e);case`workflow`:return V(e);case`sequence`:return L(e);case`dataflow`:return le(e);case`lifecycle`:return N(e)}}function K(e,t={}){Y(e);let n=J(e);if(n.length>0)throw Error(`Diagram validation failed: ${n.join(`; `)}`);let r=t.title??e.meta.title,i=t.subtitle??e.meta.subtitle,a=t.dualOutput??!0,{svg:o,cardsHtml:s}=ve(e),c=(e.meta??{}).palette===`warm`?`warm`:`technical`;return{html:he().replaceAll(`[TITLE]`,X(r)).replaceAll(`[SUBTITLE]`,X(i??``)).replaceAll(`[PALETTE]`,c===`warm`?` data-palette="warm"`:``).replaceAll(`<!-- DIAGRAM:SVG -->`,o).replaceAll(`<!-- DIAGRAM:CARDS -->`,s),markdown:a?_(e):void 0}}function q(e,t={}){return K(e,{...t,dualOutput:!1}).html}function ye(e){return _(e)}function be(e){try{return Y(e),J(e)}catch(e){return[e.message]}}function J(e){if(!e||typeof e!=`object`)return[`Input must be an object`];if(!e.diagram_type)return[`Missing diagram_type`];if(!e.meta?.title)return[`meta.title is required`];if(e.schema_version!==1)return[`schema_version must be 1`];let t=e.diagram_type,n=e,r=n.components??n.nodes??n.participants??n.states??[],i=n.connections??n.edges??n.messages??n.flows??n.transitions??[],a=new Set(r.map(e=>e.id));if(a.size!==r.length)return[`${t}: Node/component IDs must be unique`];for(let e of i){if(e.from&&!a.has(e.from))return[`${t}: Edge references unknown source "${e.from}"`];if(e.to&&!a.has(e.to))return[`${t}: Edge references unknown target "${e.to}"`]}return[]}function Y(e){let t=JSON.stringify(e),n=Buffer.byteLength(t,`utf-8`);if(n>W)throw Error(`Input too large: ${(n/1024/1024).toFixed(1)}MB (max ${W/1024/1024}MB)`);let r=e,i=r.components??r.nodes??r.participants??[];if(i.length>500)throw Error(`Too many components/nodes: ${i.length} (max 500)`);let a=r.connections??r.edges??r.messages??r.flows??r.transitions??[];if(a.length>G)throw Error(`Too many edges/connections: ${a.length} (max ${G})`)}function xe(e){return e.replace(/[^a-zA-Z0-9-_]/g,`_`).toLowerCase().slice(0,120)}function X(e){let t={"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`};return String(e??``).replace(/[&<>"']/g,e=>t[e]??e)}const Z=d(`server`);function Q(e,t){return t?{version:e,...f(t)}:{version:e}}function $(){return process.env.AIKIT_TRANSPORT?process.env.AIKIT_TRANSPORT:process.stdin.isTTY?`http`:`stdio`}function Se(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===l(e).href}catch{return!1}}function Ce(){return Se()?u({allowPositionals:!0,options:{transport:{type:`string`,default:$()},port:{type:`string`,default:process.env.AIKIT_PORT??`3210`}}}).values:{transport:$(),port:process.env.AIKIT_PORT??`3210`}}async function we(){let e=t=>{t.name===`ExperimentalWarning`&&t.message.includes(`SQLite`)||(process.off(`warning`,e),process.emitWarning(t),process.on(`warning`,e))};process.on(`warning`,e);let n=t(),r=Ce();if(process.on(`unhandledRejection`,e=>{Z.error(`Unhandled rejection`,Q(n,e))}),process.on(`uncaughtException`,e=>{Z.error(`Uncaught exception — exiting`,Q(n,e)),process.exit(1)}),Z.info(`Starting MCP AI Kit server`,{version:n}),r.transport===`http`){let{startHttpMode:e}=await import(`./server-http-CIaF7SHf.js`);await e(n,r.port)}else{let{startStdioMode:e}=await import(`./server-stdio-BbBfvNHd.js`);await e(n)}}export{c as CuratedKnowledgeManager,s as applyWorkspaceRoots,a as bootstrapWorkspaceRoots,i as createSlidingWindowRateLimiter,_e as exportDiagram,U as extractSvg,n as getSessionIdHeader,we as main,r as readPositiveIntEnv,t as readVersion,q as renderHtml,ye as renderMd,K as renderToResult,e as resolveCorsOrigin,xe as sanitizeTitle,o as selectWorkspaceRoot,be as validate};
175
+ `)}function ge(e){let t=e.match(/<title>([^<]+)<\/title>/);return t?t[1]:`diagram`}async function _e(e,t,n){let r=m(n);await h(r,{recursive:!0});let i=ge(e).replace(/[^a-zA-Z0-9\s-]/g,``).replace(/\s+/g,`-`).replace(/-+/g,`-`).replace(/^-|-$/g,``).toLowerCase().slice(0,80)||`diagram`,a=p(r,`${i}.html`);await g(a,e,`utf-8`);let o=null,s=U(e);s&&(o=p(r,`${i}.svg`),await g(o,s,`utf-8`));let c=null;return t&&(c=p(r,`${i}.md`),await g(c,t,`utf-8`)),{htmlPath:a,svgPath:o,mdPath:c}}const W=10*1024*1024,G=2e3;function ve(e){switch(e.diagram_type){case`architecture`:return oe(e);case`workflow`:return V(e);case`sequence`:return L(e);case`dataflow`:return le(e);case`lifecycle`:return N(e)}}function K(e,t={}){Y(e);let n=J(e);if(n.length>0)throw Error(`Diagram validation failed: ${n.join(`; `)}`);let r=t.title??e.meta.title,i=t.subtitle??e.meta.subtitle,a=t.dualOutput??!0,{svg:o,cardsHtml:s}=ve(e),c=(e.meta??{}).palette===`warm`?`warm`:`technical`;return{html:he().replaceAll(`[TITLE]`,X(r)).replaceAll(`[SUBTITLE]`,X(i??``)).replaceAll(`[PALETTE]`,c===`warm`?` data-palette="warm"`:``).replaceAll(`<!-- DIAGRAM:SVG -->`,o).replaceAll(`<!-- DIAGRAM:CARDS -->`,s),markdown:a?_(e):void 0}}function q(e,t={}){return K(e,{...t,dualOutput:!1}).html}function ye(e){return _(e)}function be(e){try{return Y(e),J(e)}catch(e){return[e.message]}}function J(e){if(!e||typeof e!=`object`)return[`Input must be an object`];if(!e.diagram_type)return[`Missing diagram_type`];if(!e.meta?.title)return[`meta.title is required`];if(e.schema_version!==1)return[`schema_version must be 1`];let t=e.diagram_type,n=e,r=n.components??n.nodes??n.participants??n.states??[],i=n.connections??n.edges??n.messages??n.flows??n.transitions??[],a=new Set(r.map(e=>e.id));if(a.size!==r.length)return[`${t}: Node/component IDs must be unique`];for(let e of i){if(e.from&&!a.has(e.from))return[`${t}: Edge references unknown source "${e.from}"`];if(e.to&&!a.has(e.to))return[`${t}: Edge references unknown target "${e.to}"`]}return[]}function Y(e){let t=JSON.stringify(e),n=Buffer.byteLength(t,`utf-8`);if(n>W)throw Error(`Input too large: ${(n/1024/1024).toFixed(1)}MB (max ${W/1024/1024}MB)`);let r=e,i=r.components??r.nodes??r.participants??[];if(i.length>500)throw Error(`Too many components/nodes: ${i.length} (max 500)`);let a=r.connections??r.edges??r.messages??r.flows??r.transitions??[];if(a.length>G)throw Error(`Too many edges/connections: ${a.length} (max ${G})`)}function xe(e){return e.replace(/[^a-zA-Z0-9-_]/g,`_`).toLowerCase().slice(0,120)}function X(e){let t={"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`};return String(e??``).replace(/[&<>"']/g,e=>t[e]??e)}const Z=d(`server`);function Q(e,t){return t?{version:e,...f(t)}:{version:e}}function $(){return process.env.AIKIT_TRANSPORT?process.env.AIKIT_TRANSPORT:process.stdin.isTTY?`http`:`stdio`}function Se(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===l(e).href}catch{return!1}}function Ce(){return Se()?u({allowPositionals:!0,options:{transport:{type:`string`,default:$()},port:{type:`string`,default:process.env.AIKIT_PORT??`3210`}}}).values:{transport:$(),port:process.env.AIKIT_PORT??`3210`}}async function we(){let e=t=>{t.name===`ExperimentalWarning`&&t.message.includes(`SQLite`)||(process.off(`warning`,e),process.emitWarning(t),process.on(`warning`,e))};process.on(`warning`,e);let n=t(),r=Ce();if(process.on(`unhandledRejection`,e=>{Z.error(`Unhandled rejection`,Q(n,e))}),process.on(`uncaughtException`,e=>{Z.error(`Uncaught exception — exiting`,Q(n,e)),process.exit(1)}),Z.info(`Starting MCP AI Kit server`,{version:n}),r.transport===`http`){let{startHttpMode:e}=await import(`./server-http-L_WQ9v_b.js`);await e(n,r.port)}else{let{startStdioMode:e}=await import(`./server-stdio-CZuGZR4e.js`);await e(n)}}export{c as CuratedKnowledgeManager,s as applyWorkspaceRoots,a as bootstrapWorkspaceRoots,i as createSlidingWindowRateLimiter,_e as exportDiagram,U as extractSvg,n as getSessionIdHeader,we as main,r as readPositiveIntEnv,t as readVersion,q as renderHtml,ye as renderMd,K as renderToResult,e as resolveCorsOrigin,xe as sanitizeTitle,o as selectWorkspaceRoot,be as validate};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import{n as e,t}from"./server-BtRv0mbH.js";export{t as buildPreludeInjection,e as generatePrelude};
@@ -0,0 +1 @@
1
+ import{n as e,t}from"./server-BYZo2XjK.js";export{t as buildPreludeInjection,e as generatePrelude};
@@ -1,12 +1,12 @@
1
- import{n as e}from"./auth-7LFAZQBu.js";import{fileURLToPath as t}from"node:url";import{spawn as n}from"node:child_process";import{createInterface as r}from"node:readline";function i(e){let t=[],n=e.replace(/\r\n/g,`
1
+ import{n as e}from"./auth-7LFAZQBu.js";import{fileURLToPath as t}from"node:url";import{spawn as n}from"node:child_process";import{homedir as r}from"node:os";import{createInterface as i}from"node:readline";function a(e){let t=[],n=e.replace(/\r\n/g,`
2
2
  `);for(let e of n.split(`
3
- `))e.startsWith(`data: `)?t.push(e.slice(6)):e.startsWith(`data:`)&&t.push(e.slice(5));return t}const a={input:process.stdin,output:process.stdout,error:process.stderr,fetchImpl:globalThis.fetch,spawnImpl:n,readTokenImpl:e,sleep:e=>new Promise(t=>setTimeout(t,e))};async function o(e={},t={}){let n={...a,...t},o=c(e.port),l=`http://127.0.0.1:${o}`,g=await s(l,n.fetchImpl);if(!g&&e.autoStart!==!1)try{u(o,n),await d(l,3e4,n),g=!0}catch(e){n.error.write(`[aikit-proxy] ${h(e)}\n`)}else g||n.error.write(`[aikit-proxy] Daemon not running and autoStart=false
4
- `);let _=n.readTokenImpl();if(!_){n.error.write(`[aikit-proxy] No token found at ~/.aikit/token
5
- `);return}let v=r({input:n.input,crlfDelay:1/0}),y,b=Promise.resolve(),x=(e,t)=>{b=b.then(()=>p(e,t)).catch(e=>{n.error.write(`[aikit-proxy] Write error: ${h(e)}\n`)})},S=new Map,C=new AbortController;v.on(`close`,()=>C.abort());let w=async e=>{let t=S.get(e);t&&(t.abort(),S.delete(e));let r=new AbortController;S.set(e,r);let a=AbortSignal.any([r.signal,C.signal]);try{let t=await n.fetchImpl(`${l}/mcp`,{method:`GET`,headers:f(_,e),signal:a});if(!(t.headers.get(`content-type`)??``).includes(`text/event-stream`))return;let r=t.body?.getReader();if(!r)return;let o=``,s=new TextDecoder;for(;;){let{done:e,value:t}=await r.read();if(e){if(o.trim())for(let e of i(o))x(n.output,e);break}o+=s.decode(t,{stream:!0});let a=o.replace(/\r\n/g,`
3
+ `))e.startsWith(`data: `)?t.push(e.slice(6)):e.startsWith(`data:`)&&t.push(e.slice(5));return t}const o={input:process.stdin,output:process.stdout,error:process.stderr,fetchImpl:globalThis.fetch,spawnImpl:n,readTokenImpl:e,sleep:e=>new Promise(t=>setTimeout(t,e))};async function s(e={},t={}){let n={...o,...t},s=l(e.port),u=`http://127.0.0.1:${s}`,_=await c(u,n.fetchImpl);if(!_&&e.autoStart!==!1)try{d(s,n),await f(u,3e4,n),_=!0}catch(e){n.error.write(`[aikit-proxy] ${g(e)}\n`)}else _||n.error.write(`[aikit-proxy] Daemon not running and autoStart=false
4
+ `);let v=n.readTokenImpl();if(!v){n.error.write(`[aikit-proxy] No token found at ~/.aikit/token
5
+ `);return}let y=i({input:n.input,crlfDelay:1/0}),b,x=Promise.resolve(),S=(e,t)=>{x=x.then(()=>m(e,t)).catch(e=>{n.error.write(`[aikit-proxy] Write error: ${g(e)}\n`)})},C=new Map,w=new AbortController;y.on(`close`,()=>w.abort());let T=async e=>{let t=C.get(e);t&&(t.abort(),C.delete(e));let r=new AbortController;C.set(e,r);let i=AbortSignal.any([r.signal,w.signal]);try{let t=await n.fetchImpl(`${u}/mcp`,{method:`GET`,headers:p(v,e),signal:i});if(!(t.headers.get(`content-type`)??``).includes(`text/event-stream`))return;let r=t.body?.getReader();if(!r)return;let o=``,s=new TextDecoder;for(;;){let{done:e,value:t}=await r.read();if(e){if(o.trim())for(let e of a(o))S(n.output,e);break}o+=s.decode(t,{stream:!0});let i=o.replace(/\r\n/g,`
6
6
  `).split(`
7
7
 
8
- `);o=a.pop()??``;for(let e of a)if(e.trim())for(let t of i(e))x(n.output,t)}}catch(e){if(e instanceof Error&&e.name===`AbortError`)return;n.error.write(`[aikit-proxy] GET event stream error: ${h(e)}\n`)}finally{S.delete(e)}},T=process.cwd();for await(let e of v)if(e.trim())try{let t=await n.fetchImpl(`${l}/mcp`,{method:`POST`,headers:{...f(_,y),"X-Workspace-Root":T},body:e}),r=t.headers.get(`mcp-session-id`);r&&(y=r,w(y).catch(()=>{}));let a=await t.text();if(a)if((t.headers.get(`content-type`)??``).includes(`text/event-stream`)){let e=a.replace(/\r\n/g,`
8
+ `);o=i.pop()??``;for(let e of i)if(e.trim())for(let t of a(e))S(n.output,t)}}catch(e){if(e instanceof Error&&e.name===`AbortError`)return;n.error.write(`[aikit-proxy] GET event stream error: ${g(e)}\n`)}finally{C.delete(e)}},E;try{E=process.cwd()}catch{E=r()}for await(let e of y)if(e.trim())try{let t=await n.fetchImpl(`${u}/mcp`,{method:`POST`,headers:{...p(v,b),"X-Workspace-Root":E},body:e}),r=t.headers.get(`mcp-session-id`);r&&(b=r,T(b).catch(()=>{}));let i=await t.text();if(i)if((t.headers.get(`content-type`)??``).includes(`text/event-stream`)){let e=i.replace(/\r\n/g,`
9
9
  `);for(let t of e.split(`
10
10
 
11
- `))if(t.trim())for(let e of i(t))x(n.output,e)}else x(n.output,a)}catch(t){x(n.output,m(e,t))}}async function s(e,t=globalThis.fetch){try{return(await t(`${e}/health`,{method:`GET`,signal:AbortSignal.timeout(2e3)})).ok}catch{return!1}}function c(e){if(typeof e==`number`&&Number.isFinite(e)&&e>0)return e;let t=Number.parseInt(process.env.AIKIT_PORT??``,10);return Number.isFinite(t)&&t>0?t:3210}function l(){return t(new URL(`./bin.js`,import.meta.url))}function u(e,t){let n=t.spawnImpl(process.execPath,[l(),`--transport`,`http`,`--port`,String(e)],{env:{...process.env,AIKIT_TRANSPORT:`http`,AIKIT_PORT:String(e)},detached:!0,windowsHide:!0,stdio:[`ignore`,`ignore`,`pipe`]});n.stderr?.pipe(t.error),n.unref()}async function d(e,t,n){let r=Date.now();for(;Date.now()-r<t;){if(await s(e,n.fetchImpl))return;await n.sleep(200)}throw Error(`Daemon did not start within ${t}ms`)}function f(e,t){return{"Content-Type":`application/json`,Accept:`application/json, text/event-stream`,Authorization:`Bearer ${e}`,"Mcp-Protocol-Version":`2024-11-05`,...t?{"Mcp-Session-Id":t}:{}}}function p(e,t){e.write(t.endsWith(`
12
- `)?t:`${t}\n`)}function m(e,t){let n=null;try{n=JSON.parse(e).id??null}catch{n=null}return JSON.stringify({jsonrpc:`2.0`,id:n,error:{code:-32603,message:`Proxy error: ${h(t)}`}})}function h(e){return e instanceof Error?e.message:`Unknown error`}export{s as isDaemonAlive,o as runProxy};
11
+ `))if(t.trim())for(let e of a(t))S(n.output,e)}else S(n.output,i)}catch(t){S(n.output,h(e,t))}}async function c(e,t=globalThis.fetch){try{return(await t(`${e}/health`,{method:`GET`,signal:AbortSignal.timeout(2e3)})).ok}catch{return!1}}function l(e){if(typeof e==`number`&&Number.isFinite(e)&&e>0)return e;let t=Number.parseInt(process.env.AIKIT_PORT??``,10);return Number.isFinite(t)&&t>0?t:3210}function u(){return t(new URL(`./bin.js`,import.meta.url))}function d(e,t){let n=t.spawnImpl(process.execPath,[u(),`--transport`,`http`,`--port`,String(e)],{cwd:r(),env:{...process.env,AIKIT_TRANSPORT:`http`,AIKIT_PORT:String(e)},detached:!0,windowsHide:!0,stdio:[`ignore`,`ignore`,`pipe`]});n.stderr?.pipe(t.error),n.unref()}async function f(e,t,n){let r=Date.now();for(;Date.now()-r<t;){if(await c(e,n.fetchImpl))return;await n.sleep(200)}throw Error(`Daemon did not start within ${t}ms`)}function p(e,t){return{"Content-Type":`application/json`,Accept:`application/json, text/event-stream`,Authorization:`Bearer ${e}`,"Mcp-Protocol-Version":`2024-11-05`,...t?{"Mcp-Session-Id":t}:{}}}function m(e,t){e.write(t.endsWith(`
12
+ `)?t:`${t}\n`)}function h(e,t){let n=null;try{n=JSON.parse(e).id??null}catch{n=null}return JSON.stringify({jsonrpc:`2.0`,id:n,error:{code:-32603,message:`Proxy error: ${g(t)}`}})}function g(e){return e instanceof Error?e.message:`Unknown error`}export{c as isDaemonAlive,s as runProxy};
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ import{getGlobalDataDir as e,isUserInstalled as t,safeCwdOrHome as n}from"../../core/dist/index.js";import{existsSync as r,mkdirSync as i,readFileSync as a,renameSync as o,writeFileSync as s}from"node:fs";import{dirname as c,resolve as l}from"node:path";import{z as u}from"zod";import{Router as d}from"express";const f=[{key:`serverName`,type:`string`,default:`aikit`,description:`MCP server name advertised to clients.`,group:`general`,requiresRestart:!0},{key:`toolPrefix`,type:`string`,default:``,description:`Prefix prepended to every MCP tool name (e.g. "aikit_").`,group:`general`,requiresRestart:!0},{key:`toolProfile`,type:`string`,default:`full`,description:`Active tool profile.`,group:`general`,enum:[`full`,`safe`,`research`,`minimal`,`discovery`],requiresRestart:!0},{key:`autoIndex`,type:`boolean`,default:!1,description:`Deprecated. Prefer indexMode. true → auto, false → manual.`,group:`indexing`},{key:`indexMode`,type:`string`,default:`smart`,description:`Indexing strategy. auto = full on startup, manual = on demand, smart = on-demand + idle.`,group:`indexing`,enum:[`auto`,`manual`,`smart`]},{key:`sources`,type:`array`,description:`Source roots to index. Each entry has { path, excludePatterns }.`,group:`indexing`,requiresRestart:!0},{key:`indexing.chunkSize`,type:`number`,default:1500,description:`Maximum chunk size in characters.`,group:`indexing`},{key:`indexing.chunkOverlap`,type:`number`,default:200,description:`Overlap between adjacent chunks.`,group:`indexing`},{key:`indexing.minChunkSize`,type:`number`,default:100,description:`Minimum chunk size before merging into the next chunk.`,group:`indexing`},{key:`indexing.concurrency`,type:`number`,description:`Max files processed concurrently. Defaults to half of CPU cores.`,group:`indexing`},{key:`embedding.model`,type:`string`,default:`mixedbread-ai/mxbai-embed-large-v1`,description:`Embedding model identifier.`,group:`embedding`,requiresRestart:!0},{key:`embedding.dimensions`,type:`number`,default:1024,description:`Embedding vector dimensions. Must match the model.`,group:`embedding`,requiresRestart:!0},{key:`store.backend`,type:`string`,default:`sqlite-vec`,description:`Vector store backend (sqlite-vec | lancedb).`,group:`store`,requiresRestart:!0},{key:`store.path`,type:`string`,description:`Filesystem path for the vector store.`,group:`store`,requiresRestart:!0},{key:`curated.path`,type:`string`,description:`Path to curated knowledge directory.`,group:`store`,requiresRestart:!0},{key:`onboardDir`,type:`string`,description:`Directory for onboard / produce_knowledge output.`,group:`store`,requiresRestart:!0},{key:`stateDir`,type:`string`,description:`Directory for session state (stash, checkpoints, etc.).`,group:`store`,requiresRestart:!0},{key:`er.enabled`,type:`boolean`,default:!1,description:`Enable enterprise RAG bridge integration.`,group:`enterprise-bridge`,requiresRestart:!0},{key:`er.baseUrl`,type:`string`,description:`Base URL of the ER API.`,group:`enterprise-bridge`,requiresRestart:!0},{key:`er.timeoutMs`,type:`number`,default:5e3,description:`ER request timeout in milliseconds.`,group:`enterprise-bridge`},{key:`er.fallbackThreshold`,type:`number`,default:.45,description:`Vector similarity threshold below which ER fallback triggers.`,group:`enterprise-bridge`}],p=[{key:`AIKIT_TRANSPORT`,type:`string`,default:`stdio`,description:`MCP transport mode.`,group:`transport`,enum:[`stdio`,`http`],defaultScope:`workspace`},{key:`AIKIT_PORT`,type:`string`,default:`3210`,description:`HTTP port when transport = http.`,group:`transport`,defaultScope:`workspace`},{key:`AIKIT_CORS_ORIGIN`,type:`string`,description:`CORS Access-Control-Allow-Origin header for HTTP mode.`,group:`transport`,defaultScope:`workspace`},{key:`AIKIT_CONFIG_PATH`,type:`string`,description:`Override path to aikit.config.json.`,group:`paths`,defaultScope:`workspace`},{key:`AIKIT_WORKSPACE_ROOT`,type:`string`,description:`Override workspace root used when no config file is present.`,group:`paths`,defaultScope:`workspace`},{key:`AIKIT_GLOBAL_DATA_DIR`,type:`string`,description:`Override global data directory (default: ~/.aikit).`,group:`paths`,defaultScope:`global`},{key:`AIKIT_INDEX_MODE`,type:`string`,description:`Override config indexMode.`,group:`indexing`,enum:[`auto`,`manual`,`smart`],defaultScope:`workspace`},{key:`AIKIT_AUTO_INDEX`,type:`string`,description:`Legacy boolean override. Prefer AIKIT_INDEX_MODE.`,group:`indexing`,enum:[`true`,`false`],defaultScope:`workspace`},{key:`AIKIT_TOOLSET`,type:`string`,description:`Override active tool profile.`,group:`general`,defaultScope:`workspace`},{key:`AIKIT_BROWSER_DEFAULT_MODE`,type:`string`,default:`ui`,description:`Default browser launch mode for browser_* tools.`,group:`browser`,enum:[`ui`,`headless`,`panel`],defaultScope:`workspace`},{key:`AIKIT_BROWSER_PATH`,type:`string`,description:`Optional Playwright browser download path override.`,group:`browser`,defaultScope:`workspace`},{key:`AIKIT_BROWSER_IDLE_MINUTES`,type:`string`,default:`10`,description:`Idle shutdown timeout in minutes for the shared browser runtime.`,group:`browser`,defaultScope:`workspace`},{key:`AIKIT_BROWSER_EVAL_TIMEOUT_MS`,type:`string`,default:`5000`,description:`Default browser_eval timeout in milliseconds.`,group:`browser`,defaultScope:`workspace`},{key:`AIKIT_SEARCH_DEADLINE_MS`,type:`string`,default:`10000`,description:`Multi-provider web search deadline (milliseconds).`,group:`search-providers`,defaultScope:`global`},{key:`SEARXNG_URL`,type:`string`,description:`Optional SearXNG instance URL for the web_search tool.`,group:`search-providers`,defaultScope:`global`},{key:`GOOGLE_API_KEY`,type:`secret`,description:`Google Custom Search API key.`,group:`search-providers`,defaultScope:`global`},{key:`GOOGLE_CSE_ID`,type:`string`,description:`Google Custom Search Engine ID.`,group:`search-providers`,defaultScope:`global`},{key:`BRAVE_API_KEY`,type:`secret`,description:`Brave Search API key.`,group:`search-providers`,defaultScope:`global`},{key:`BING_API_KEY`,type:`secret`,description:`Bing Web Search API key.`,group:`search-providers`,defaultScope:`global`}];function m(e){return p.find(t=>t.key===e)}function h(e){let t=m(e);return t?t.type===`secret`:/(_KEY|_TOKEN|_SECRET|_PASSWORD|_PASS|_PWD)$/i.test(e)}const g=/^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=(.*)$/;function _(e){let t=e.replace(/^\s+/,``);if(t.startsWith(`"`)){let e=1,n=``;for(;e<t.length;){let r=t[e];if(r===`\\`&&e+1<t.length){let r=t[e+1];r===`n`?n+=`
3
+ `:r===`r`?n+=`\r`:r===`t`?n+=` `:n+=r,e+=2;continue}if(r===`"`){let r=t.slice(e+1),i=r.indexOf(`#`),a=i===-1?``:r.slice(i);return{value:n,quoted:!0,inlineComment:a}}n+=r,e+=1}return{value:t.slice(1),quoted:!0,inlineComment:``}}let n=t.match(/(\s+#.*)$/);return n&&n.index!==void 0?{value:t.slice(0,n.index).trimEnd(),quoted:!1,inlineComment:n[1].trimStart()}:{value:t.trimEnd(),quoted:!1,inlineComment:``}}function v(e){let t;t=e.quoted||/[\s#"']/.test(e.value)||e.value.includes(`
4
+ `)||e.value.length===0?`"${e.value.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`).replace(/\n/g,`\\n`).replace(/\r/g,`\\r`).replace(/\t/g,`\\t`)}"`:e.value;let n=e.inlineComment?` ${e.inlineComment}`:``;return`${e.key}=${t}${n}`}function y(e){let t=[],n=e.split(/\r?\n/),r=e.endsWith(`
5
+ `)?n.slice(0,-1):n;for(let e of r){let n=e.match(g);if(!n){t.push({kind:`raw`,text:e});continue}let r=n[1],{value:i,quoted:a,inlineComment:o}=_(n[2]);t.push({kind:`assign`,key:r,value:i,quoted:a,inlineComment:o})}return{lines:t}}function b(e){return`${e.lines.map(e=>e.kind===`assign`?v(e):e.text).join(`
6
+ `)}\n`}function x(e){let t={};for(let n of e.lines)n.kind===`assign`&&(t[n.key]=n.value);return t}function S(e,t,n){let r=e.lines.map(e=>e.kind===`assign`&&e.key===t?{...e,value:n}:e);return e.lines.some(e=>e.kind===`assign`&&e.key===t)||r.push({kind:`assign`,key:t,value:n,quoted:!1,inlineComment:``}),{lines:r}}function C(e,t){return{lines:e.lines.filter(e=>!(e.kind===`assign`&&e.key===t))}}function w(e){return l(e,`.env`)}function T(){return l(e(),`global.env`)}function E(e,t){return e===`workspace`?w(t):T()}function D(e){return r(e)?y(a(e,`utf-8`)):{lines:[]}}function O(e,t){let n=c(e);r(n)||i(n,{recursive:!0});let a=`${e}.${process.pid}.${Date.now()}.tmp`;s(a,b(t),{encoding:`utf-8`,mode:384}),o(a,e)}function k(e,t,n={}){let i=E(e,t),a=r(i),o=x(D(i)),s={};for(let[e,t]of Object.entries(o))s[e]=n.reveal||!h(e)?t:A(t);return{scope:e,path:i,exists:a,vars:s}}function A(e){return e.length===0?``:e.length<=4?`•`.repeat(e.length):`${e.slice(0,2)}${`•`.repeat(Math.min(e.length-4,12))}${e.slice(-2)}`}function j(){return process.env.AIKIT_WORKSPACE_ROOT??n()}function M(){return t()?`user`:`workspace`}function N(){let t=e();return r(t)||i(t,{recursive:!0}),t}var P=class extends Error{details;constructor(e,t){super(e),this.name=`ConfigValidationError`,this.details=t}};function F(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function I(e=j()){let t=process.env.AIKIT_CONFIG_PATH;return t?l(t):l(e,`aikit.config.json`)}function L(e){if(!r(e))return null;let t=a(e,`utf-8`),n=JSON.parse(t);if(!F(n))throw new P(`config-not-object`,[`Config file must contain a JSON object at the root.`]);return n}function R(e,t){let n=c(e);r(n)||i(n,{recursive:!0});let a=`${JSON.stringify(t,null,2)}\n`,l=`${e}.${process.pid}.${Date.now()}.tmp`;s(l,a,{encoding:`utf-8`}),o(l,e)}function z(e){return e.length===0?[]:e.split(`.`)}function B(e,t,n){let r=z(t);if(r.length===0)throw new P(`invalid-path`,[`Patch path must not be empty.`]);let i={...e},a=i;for(let e=0;e<r.length-1;e+=1){let t=r[e],n=r[e+1],i=/^\d+$/.test(n);if(Array.isArray(a)){let n=Number(t);if(!Number.isInteger(n))throw new P(`invalid-path`,[`Path segment "${t}" must be an integer index for array at depth ${e}.`]);let r=a[n];if(i){let e=Array.isArray(r)?[...r]:[];a[n]=e,a=e}else{let e=F(r)?{...r}:{};a[n]=e,a=e}continue}let o=a[t];if(i){let e=Array.isArray(o)?[...o]:[];a[t]=e,a=e}else{let e=F(o)?{...o}:{};a[t]=e,a=e}}let o=r[r.length-1];if(Array.isArray(a)){let e=Number(o);if(!Number.isInteger(e))throw new P(`invalid-path`,[`Path segment "${o}" must be an integer index for array.`]);a[e]=n}else a[o]=n;return i}function V(e,t){let n=z(t);if(n.length===0)throw new P(`invalid-path`,[`Patch path must not be empty.`]);let r={...e},i=r;for(let e=0;e<n.length-1;e+=1){let t=n[e];if(Array.isArray(i)){let e=Number(t);if(!Number.isInteger(e))return r;let n=i[e];if(!F(n)&&!Array.isArray(n))return r;let a=Array.isArray(n)?[...n]:{...n};i[e]=a,i=a;continue}let a=i[t];if(!F(a)&&!Array.isArray(a))return r;let o=Array.isArray(a)?[...a]:{...a};i[t]=o,i=o}let a=n[n.length-1];if(Array.isArray(i)){let e=Number(a);Number.isInteger(e)&&i.splice(e,1)}else delete i[a];return r}function H(e,t){let n=e;for(let e of t)n=e.op===`set`?B(n,e.path,e.value):V(n,e.path);return n}function U(e){let t=[];if(`autoIndex`in e&&e.autoIndex!==void 0&&typeof e.autoIndex!=`boolean`&&t.push(`autoIndex must be a boolean.`),`serverName`in e&&e.serverName!==void 0&&typeof e.serverName!=`string`&&t.push(`serverName must be a string.`),`toolPrefix`in e&&e.toolPrefix!==void 0&&typeof e.toolPrefix!=`string`&&t.push(`toolPrefix must be a string.`),`indexMode`in e&&e.indexMode!==void 0&&![`auto`,`manual`,`smart`].includes(e.indexMode)&&t.push(`indexMode must be one of: auto, manual, smart.`),(!Array.isArray(e.sources)||e.sources.length===0)&&t.push(`sources must be a non-empty array.`),`indexing`in e&&e.indexing!==void 0)if(!F(e.indexing))t.push(`indexing must be an object.`);else for(let n of[`chunkSize`,`chunkOverlap`,`minChunkSize`,`concurrency`]){let r=e.indexing[n];r!==void 0&&(typeof r!=`number`||!Number.isFinite(r)||r<=0)&&t.push(`indexing.${n} must be a positive number.`)}return`store`in e&&e.store!==void 0&&(F(e.store)?(typeof e.store.backend!=`string`&&t.push(`store.backend must be a string.`),typeof e.store.path!=`string`&&t.push(`store.path must be a string.`)):t.push(`store must be an object.`)),t}const W=u.object({ops:u.array(u.object({op:u.enum([`set`,`unset`]),path:u.string().min(1),value:u.unknown().optional()})).min(1)}),G=u.string().min(1).regex(/^[A-Za-z_][A-Za-z0-9_]*$/,`Invalid env key`),K=u.object({value:u.string(),scope:u.enum([`workspace`,`global`])}),q=u.enum([`workspace`,`global`]);function J(e,t,n,r){e.status(t).json({error:n,details:r})}function Y(e){let t=d(),n=e.workspaceRoot??j;return t.get(`/status`,(t,i)=>{let a=n(),o=I(a);i.json({mode:M(),cwd:(()=>{try{return process.cwd()}catch{return`<unavailable>`}})(),workspaceRoot:a,configPath:o,configExists:r(o),globalDataDir:N(),envPaths:{workspace:w(a),global:T()},mcp:e.mcpInfo?.()??{transport:`http`,pid:process.pid,startedAt:new Date(0).toISOString()}})}),t.get(`/schema`,(e,t)=>{t.json({config:f,env:p})}),t.get(`/config`,(e,t)=>{let r=I(n());try{let e=L(r);t.json({path:r,exists:e!==null,content:e??{}})}catch(e){if(e instanceof P){J(t,400,e.message,e.details);return}J(t,500,`config-read-failed`,e instanceof Error?e.message:String(e))}}),t.patch(`/config`,(t,r)=>{let i=W.safeParse(t.body);if(!i.success){J(r,400,`invalid-body`,i.error.issues);return}let a=I(n()),o;try{o=L(a)??{}}catch(e){if(e instanceof P){J(r,400,e.message,e.details);return}J(r,500,`config-read-failed`,e instanceof Error?e.message:String(e));return}let s;try{s=H(o,i.data.ops)}catch(e){if(e instanceof P){J(r,400,e.message,e.details);return}J(r,400,`patch-failed`,e instanceof Error?e.message:String(e));return}let c=U(s);if(c.length>0){J(r,400,`invalid-config`,c);return}try{R(a,s)}catch(e){J(r,500,`config-write-failed`,e instanceof Error?e.message:String(e));return}e.log.info(`Settings: config updated`,{path:a,ops:i.data.ops.length}),r.json({path:a,content:s,restartRecommended:!0})}),t.get(`/env`,(t,r)=>{let i=t.query.reveal===`true`||t.query.reveal===`1`;i&&e.log.warn(`Settings: env values revealed`,{ip:t.ip??`unknown`});let a=n();r.json({workspace:k(`workspace`,a,{reveal:i}),global:k(`global`,a,{reveal:i}),processOverrides:Object.keys(process.env).filter(e=>e.startsWith(`AIKIT_`)||/^(SEARXNG_URL|GOOGLE_|BRAVE_|BING_)/.test(e)).sort()})}),t.put(`/env/:key`,(t,r)=>{let i=G.safeParse(t.params.key);if(!i.success){J(r,400,`invalid-key`,i.error.issues);return}let a=K.safeParse(t.body);if(!a.success){J(r,400,`invalid-body`,a.error.issues);return}let o=a.data.scope,s=E(o,n());try{O(s,S(D(s),i.data,a.data.value)),e.log.info(`Settings: env set`,{key:i.data,scope:o,path:s}),r.json({ok:!0,scope:o,path:s,restartRecommended:!0})}catch(e){J(r,500,`env-write-failed`,e instanceof Error?e.message:String(e))}}),t.delete(`/env/:key`,(t,r)=>{let i=G.safeParse(t.params.key);if(!i.success){J(r,400,`invalid-key`,i.error.issues);return}let a=q.safeParse(t.query.scope);if(!a.success){J(r,400,`invalid-scope`,a.error.issues);return}let o=a.data,s=E(o,n());try{O(s,C(D(s),i.data)),e.log.info(`Settings: env unset`,{key:i.data,scope:o,path:s}),r.json({ok:!0,scope:o,path:s,restartRecommended:!0})}catch(e){J(r,500,`env-write-failed`,e instanceof Error?e.message:String(e))}}),t}export{Y as createSettingsRouter};
@@ -0,0 +1,5 @@
1
+ import{getGlobalDataDir as e,isUserInstalled as t,safeCwdOrHome as n}from"../../core/dist/index.js";import{existsSync as r,mkdirSync as i,readFileSync as a,renameSync as o,writeFileSync as s}from"node:fs";import{dirname as c,resolve as l}from"node:path";import{z as u}from"zod";import{Router as d}from"express";const f=[{key:`serverName`,type:`string`,default:`aikit`,description:`MCP server name advertised to clients.`,group:`general`,requiresRestart:!0},{key:`toolPrefix`,type:`string`,default:``,description:`Prefix prepended to every MCP tool name (e.g. "aikit_").`,group:`general`,requiresRestart:!0},{key:`toolProfile`,type:`string`,default:`full`,description:`Active tool profile.`,group:`general`,enum:[`full`,`safe`,`research`,`minimal`,`discovery`],requiresRestart:!0},{key:`autoIndex`,type:`boolean`,default:!1,description:`Deprecated. Prefer indexMode. true → auto, false → manual.`,group:`indexing`},{key:`indexMode`,type:`string`,default:`smart`,description:`Indexing strategy. auto = full on startup, manual = on demand, smart = on-demand + idle.`,group:`indexing`,enum:[`auto`,`manual`,`smart`]},{key:`sources`,type:`array`,description:`Source roots to index. Each entry has { path, excludePatterns }.`,group:`indexing`,requiresRestart:!0},{key:`indexing.chunkSize`,type:`number`,default:1500,description:`Maximum chunk size in characters.`,group:`indexing`},{key:`indexing.chunkOverlap`,type:`number`,default:200,description:`Overlap between adjacent chunks.`,group:`indexing`},{key:`indexing.minChunkSize`,type:`number`,default:100,description:`Minimum chunk size before merging into the next chunk.`,group:`indexing`},{key:`indexing.concurrency`,type:`number`,description:`Max files processed concurrently. Defaults to half of CPU cores.`,group:`indexing`},{key:`embedding.model`,type:`string`,default:`mixedbread-ai/mxbai-embed-large-v1`,description:`Embedding model identifier.`,group:`embedding`,requiresRestart:!0},{key:`embedding.dimensions`,type:`number`,default:1024,description:`Embedding vector dimensions. Must match the model.`,group:`embedding`,requiresRestart:!0},{key:`store.backend`,type:`string`,default:`sqlite-vec`,description:`Vector store backend (sqlite-vec | lancedb).`,group:`store`,requiresRestart:!0},{key:`store.path`,type:`string`,description:`Filesystem path for the vector store.`,group:`store`,requiresRestart:!0},{key:`curated.path`,type:`string`,description:`Path to curated knowledge directory.`,group:`store`,requiresRestart:!0},{key:`onboardDir`,type:`string`,description:`Directory for onboard / produce_knowledge output.`,group:`store`,requiresRestart:!0},{key:`stateDir`,type:`string`,description:`Directory for session state (stash, checkpoints, etc.).`,group:`store`,requiresRestart:!0},{key:`er.enabled`,type:`boolean`,default:!1,description:`Enable enterprise RAG bridge integration.`,group:`enterprise-bridge`,requiresRestart:!0},{key:`er.baseUrl`,type:`string`,description:`Base URL of the ER API.`,group:`enterprise-bridge`,requiresRestart:!0},{key:`er.timeoutMs`,type:`number`,default:5e3,description:`ER request timeout in milliseconds.`,group:`enterprise-bridge`},{key:`er.fallbackThreshold`,type:`number`,default:.45,description:`Vector similarity threshold below which ER fallback triggers.`,group:`enterprise-bridge`}],p=[{key:`AIKIT_TRANSPORT`,type:`string`,default:`stdio`,description:`MCP transport mode.`,group:`transport`,enum:[`stdio`,`http`],defaultScope:`workspace`},{key:`AIKIT_PORT`,type:`string`,default:`3210`,description:`HTTP port when transport = http.`,group:`transport`,defaultScope:`workspace`},{key:`AIKIT_CORS_ORIGIN`,type:`string`,description:`CORS Access-Control-Allow-Origin header for HTTP mode.`,group:`transport`,defaultScope:`workspace`},{key:`AIKIT_CONFIG_PATH`,type:`string`,description:`Override path to aikit.config.json.`,group:`paths`,defaultScope:`workspace`},{key:`AIKIT_WORKSPACE_ROOT`,type:`string`,description:`Override workspace root used when no config file is present.`,group:`paths`,defaultScope:`workspace`},{key:`AIKIT_GLOBAL_DATA_DIR`,type:`string`,description:`Override global data directory (default: ~/.aikit).`,group:`paths`,defaultScope:`global`},{key:`AIKIT_INDEX_MODE`,type:`string`,description:`Override config indexMode.`,group:`indexing`,enum:[`auto`,`manual`,`smart`],defaultScope:`workspace`},{key:`AIKIT_AUTO_INDEX`,type:`string`,description:`Legacy boolean override. Prefer AIKIT_INDEX_MODE.`,group:`indexing`,enum:[`true`,`false`],defaultScope:`workspace`},{key:`AIKIT_TOOLSET`,type:`string`,description:`Override active tool profile.`,group:`general`,defaultScope:`workspace`},{key:`AIKIT_BROWSER_DEFAULT_MODE`,type:`string`,default:`ui`,description:`Default browser launch mode for browser_* tools.`,group:`browser`,enum:[`ui`,`headless`,`panel`],defaultScope:`workspace`},{key:`AIKIT_BROWSER_PATH`,type:`string`,description:`Optional Playwright browser download path override.`,group:`browser`,defaultScope:`workspace`},{key:`AIKIT_BROWSER_IDLE_MINUTES`,type:`string`,default:`10`,description:`Idle shutdown timeout in minutes for the shared browser runtime.`,group:`browser`,defaultScope:`workspace`},{key:`AIKIT_BROWSER_EVAL_TIMEOUT_MS`,type:`string`,default:`5000`,description:`Default browser_eval timeout in milliseconds.`,group:`browser`,defaultScope:`workspace`},{key:`AIKIT_SEARCH_DEADLINE_MS`,type:`string`,default:`10000`,description:`Multi-provider web search deadline (milliseconds).`,group:`search-providers`,defaultScope:`global`},{key:`SEARXNG_URL`,type:`string`,description:`Optional SearXNG instance URL for the web_search tool.`,group:`search-providers`,defaultScope:`global`},{key:`GOOGLE_API_KEY`,type:`secret`,description:`Google Custom Search API key.`,group:`search-providers`,defaultScope:`global`},{key:`GOOGLE_CSE_ID`,type:`string`,description:`Google Custom Search Engine ID.`,group:`search-providers`,defaultScope:`global`},{key:`BRAVE_API_KEY`,type:`secret`,description:`Brave Search API key.`,group:`search-providers`,defaultScope:`global`},{key:`BING_API_KEY`,type:`secret`,description:`Bing Web Search API key.`,group:`search-providers`,defaultScope:`global`}];function m(e){return p.find(t=>t.key===e)}function h(e){let t=m(e);return t?t.type===`secret`:/(_KEY|_TOKEN|_SECRET|_PASSWORD|_PASS|_PWD)$/i.test(e)}const g=/^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=(.*)$/;function _(e){let t=e.replace(/^\s+/,``);if(t.startsWith(`"`)){let e=1,n=``;for(;e<t.length;){let r=t[e];if(r===`\\`&&e+1<t.length){let r=t[e+1];r===`n`?n+=`
2
+ `:r===`r`?n+=`\r`:r===`t`?n+=` `:n+=r,e+=2;continue}if(r===`"`){let r=t.slice(e+1),i=r.indexOf(`#`),a=i===-1?``:r.slice(i);return{value:n,quoted:!0,inlineComment:a}}n+=r,e+=1}return{value:t.slice(1),quoted:!0,inlineComment:``}}let n=t.match(/(\s+#.*)$/);return n&&n.index!==void 0?{value:t.slice(0,n.index).trimEnd(),quoted:!1,inlineComment:n[1].trimStart()}:{value:t.trimEnd(),quoted:!1,inlineComment:``}}function v(e){let t;t=e.quoted||/[\s#"']/.test(e.value)||e.value.includes(`
3
+ `)||e.value.length===0?`"${e.value.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`).replace(/\n/g,`\\n`).replace(/\r/g,`\\r`).replace(/\t/g,`\\t`)}"`:e.value;let n=e.inlineComment?` ${e.inlineComment}`:``;return`${e.key}=${t}${n}`}function y(e){let t=[],n=e.split(/\r?\n/),r=e.endsWith(`
4
+ `)?n.slice(0,-1):n;for(let e of r){let n=e.match(g);if(!n){t.push({kind:`raw`,text:e});continue}let r=n[1],{value:i,quoted:a,inlineComment:o}=_(n[2]);t.push({kind:`assign`,key:r,value:i,quoted:a,inlineComment:o})}return{lines:t}}function b(e){return`${e.lines.map(e=>e.kind===`assign`?v(e):e.text).join(`
5
+ `)}\n`}function x(e){let t={};for(let n of e.lines)n.kind===`assign`&&(t[n.key]=n.value);return t}function S(e,t,n){let r=e.lines.map(e=>e.kind===`assign`&&e.key===t?{...e,value:n}:e);return e.lines.some(e=>e.kind===`assign`&&e.key===t)||r.push({kind:`assign`,key:t,value:n,quoted:!1,inlineComment:``}),{lines:r}}function C(e,t){return{lines:e.lines.filter(e=>!(e.kind===`assign`&&e.key===t))}}function w(e){return l(e,`.env`)}function T(){return l(e(),`global.env`)}function E(e,t){return e===`workspace`?w(t):T()}function D(e){return r(e)?y(a(e,`utf-8`)):{lines:[]}}function O(e,t){let n=c(e);r(n)||i(n,{recursive:!0});let a=`${e}.${process.pid}.${Date.now()}.tmp`;s(a,b(t),{encoding:`utf-8`,mode:384}),o(a,e)}function k(e,t,n={}){let i=E(e,t),a=r(i),o=x(D(i)),s={};for(let[e,t]of Object.entries(o))s[e]=n.reveal||!h(e)?t:A(t);return{scope:e,path:i,exists:a,vars:s}}function A(e){return e.length===0?``:e.length<=4?`•`.repeat(e.length):`${e.slice(0,2)}${`•`.repeat(Math.min(e.length-4,12))}${e.slice(-2)}`}function j(){return process.env.AIKIT_WORKSPACE_ROOT??n()}function M(){return t()?`user`:`workspace`}function N(){let t=e();return r(t)||i(t,{recursive:!0}),t}var P=class extends Error{details;constructor(e,t){super(e),this.name=`ConfigValidationError`,this.details=t}};function F(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function I(e=j()){let t=process.env.AIKIT_CONFIG_PATH;return t?l(t):l(e,`aikit.config.json`)}function L(e){if(!r(e))return null;let t=a(e,`utf-8`),n=JSON.parse(t);if(!F(n))throw new P(`config-not-object`,[`Config file must contain a JSON object at the root.`]);return n}function R(e,t){let n=c(e);r(n)||i(n,{recursive:!0});let a=`${JSON.stringify(t,null,2)}\n`,l=`${e}.${process.pid}.${Date.now()}.tmp`;s(l,a,{encoding:`utf-8`}),o(l,e)}function z(e){return e.length===0?[]:e.split(`.`)}function B(e,t,n){let r=z(t);if(r.length===0)throw new P(`invalid-path`,[`Patch path must not be empty.`]);let i={...e},a=i;for(let e=0;e<r.length-1;e+=1){let t=r[e],n=r[e+1],i=/^\d+$/.test(n);if(Array.isArray(a)){let n=Number(t);if(!Number.isInteger(n))throw new P(`invalid-path`,[`Path segment "${t}" must be an integer index for array at depth ${e}.`]);let r=a[n];if(i){let e=Array.isArray(r)?[...r]:[];a[n]=e,a=e}else{let e=F(r)?{...r}:{};a[n]=e,a=e}continue}let o=a[t];if(i){let e=Array.isArray(o)?[...o]:[];a[t]=e,a=e}else{let e=F(o)?{...o}:{};a[t]=e,a=e}}let o=r[r.length-1];if(Array.isArray(a)){let e=Number(o);if(!Number.isInteger(e))throw new P(`invalid-path`,[`Path segment "${o}" must be an integer index for array.`]);a[e]=n}else a[o]=n;return i}function V(e,t){let n=z(t);if(n.length===0)throw new P(`invalid-path`,[`Patch path must not be empty.`]);let r={...e},i=r;for(let e=0;e<n.length-1;e+=1){let t=n[e];if(Array.isArray(i)){let e=Number(t);if(!Number.isInteger(e))return r;let n=i[e];if(!F(n)&&!Array.isArray(n))return r;let a=Array.isArray(n)?[...n]:{...n};i[e]=a,i=a;continue}let a=i[t];if(!F(a)&&!Array.isArray(a))return r;let o=Array.isArray(a)?[...a]:{...a};i[t]=o,i=o}let a=n[n.length-1];if(Array.isArray(i)){let e=Number(a);Number.isInteger(e)&&i.splice(e,1)}else delete i[a];return r}function H(e,t){let n=e;for(let e of t)n=e.op===`set`?B(n,e.path,e.value):V(n,e.path);return n}function U(e){let t=[];if(`autoIndex`in e&&e.autoIndex!==void 0&&typeof e.autoIndex!=`boolean`&&t.push(`autoIndex must be a boolean.`),`serverName`in e&&e.serverName!==void 0&&typeof e.serverName!=`string`&&t.push(`serverName must be a string.`),`toolPrefix`in e&&e.toolPrefix!==void 0&&typeof e.toolPrefix!=`string`&&t.push(`toolPrefix must be a string.`),`indexMode`in e&&e.indexMode!==void 0&&![`auto`,`manual`,`smart`].includes(e.indexMode)&&t.push(`indexMode must be one of: auto, manual, smart.`),(!Array.isArray(e.sources)||e.sources.length===0)&&t.push(`sources must be a non-empty array.`),`indexing`in e&&e.indexing!==void 0)if(!F(e.indexing))t.push(`indexing must be an object.`);else for(let n of[`chunkSize`,`chunkOverlap`,`minChunkSize`,`concurrency`]){let r=e.indexing[n];r!==void 0&&(typeof r!=`number`||!Number.isFinite(r)||r<=0)&&t.push(`indexing.${n} must be a positive number.`)}return`store`in e&&e.store!==void 0&&(F(e.store)?(typeof e.store.backend!=`string`&&t.push(`store.backend must be a string.`),typeof e.store.path!=`string`&&t.push(`store.path must be a string.`)):t.push(`store must be an object.`)),t}const W=u.object({ops:u.array(u.object({op:u.enum([`set`,`unset`]),path:u.string().min(1),value:u.unknown().optional()})).min(1)}),G=u.string().min(1).regex(/^[A-Za-z_][A-Za-z0-9_]*$/,`Invalid env key`),K=u.object({value:u.string(),scope:u.enum([`workspace`,`global`])}),q=u.enum([`workspace`,`global`]);function J(e,t,n,r){e.status(t).json({error:n,details:r})}function Y(e){let t=d(),n=e.workspaceRoot??j;return t.get(`/status`,(t,i)=>{let a=n(),o=I(a);i.json({mode:M(),cwd:(()=>{try{return process.cwd()}catch{return`<unavailable>`}})(),workspaceRoot:a,configPath:o,configExists:r(o),globalDataDir:N(),envPaths:{workspace:w(a),global:T()},mcp:e.mcpInfo?.()??{transport:`http`,pid:process.pid,startedAt:new Date(0).toISOString()}})}),t.get(`/schema`,(e,t)=>{t.json({config:f,env:p})}),t.get(`/config`,(e,t)=>{let r=I(n());try{let e=L(r);t.json({path:r,exists:e!==null,content:e??{}})}catch(e){if(e instanceof P){J(t,400,e.message,e.details);return}J(t,500,`config-read-failed`,e instanceof Error?e.message:String(e))}}),t.patch(`/config`,(t,r)=>{let i=W.safeParse(t.body);if(!i.success){J(r,400,`invalid-body`,i.error.issues);return}let a=I(n()),o;try{o=L(a)??{}}catch(e){if(e instanceof P){J(r,400,e.message,e.details);return}J(r,500,`config-read-failed`,e instanceof Error?e.message:String(e));return}let s;try{s=H(o,i.data.ops)}catch(e){if(e instanceof P){J(r,400,e.message,e.details);return}J(r,400,`patch-failed`,e instanceof Error?e.message:String(e));return}let c=U(s);if(c.length>0){J(r,400,`invalid-config`,c);return}try{R(a,s)}catch(e){J(r,500,`config-write-failed`,e instanceof Error?e.message:String(e));return}e.log.info(`Settings: config updated`,{path:a,ops:i.data.ops.length}),r.json({path:a,content:s,restartRecommended:!0})}),t.get(`/env`,(t,r)=>{let i=t.query.reveal===`true`||t.query.reveal===`1`;i&&e.log.warn(`Settings: env values revealed`,{ip:t.ip??`unknown`});let a=n();r.json({workspace:k(`workspace`,a,{reveal:i}),global:k(`global`,a,{reveal:i}),processOverrides:Object.keys(process.env).filter(e=>e.startsWith(`AIKIT_`)||/^(SEARXNG_URL|GOOGLE_|BRAVE_|BING_)/.test(e)).sort()})}),t.put(`/env/:key`,(t,r)=>{let i=G.safeParse(t.params.key);if(!i.success){J(r,400,`invalid-key`,i.error.issues);return}let a=K.safeParse(t.body);if(!a.success){J(r,400,`invalid-body`,a.error.issues);return}let o=a.data.scope,s=E(o,n());try{O(s,S(D(s),i.data,a.data.value)),e.log.info(`Settings: env set`,{key:i.data,scope:o,path:s}),r.json({ok:!0,scope:o,path:s,restartRecommended:!0})}catch(e){J(r,500,`env-write-failed`,e instanceof Error?e.message:String(e))}}),t.delete(`/env/:key`,(t,r)=>{let i=G.safeParse(t.params.key);if(!i.success){J(r,400,`invalid-key`,i.error.issues);return}let a=q.safeParse(t.query.scope);if(!a.success){J(r,400,`invalid-scope`,a.error.issues);return}let o=a.data,s=E(o,n());try{O(s,C(D(s),i.data)),e.log.info(`Settings: env unset`,{key:i.data,scope:o,path:s}),r.json({ok:!0,scope:o,path:s,restartRecommended:!0})}catch(e){J(r,500,`env-write-failed`,e instanceof Error?e.message:String(e))}}),t}export{Y as createSettingsRouter};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import{r as e}from"./server-BtRv0mbH.js";export{e as createSamplingClient};
@@ -0,0 +1 @@
1
+ import{r as e}from"./server-BYZo2XjK.js";export{e as createSamplingClient};