@vpxa/aikit 0.1.360 → 0.1.361

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 (61) hide show
  1. package/README.md +442 -442
  2. package/package.json +3 -1
  3. package/packages/claude-desktop/dist/manifest.json +31 -0
  4. package/packages/claude-desktop/dist/mcp-source.json +16 -0
  5. package/packages/cli/dist/index.js +14 -14
  6. package/packages/cli/dist/init-JfM6gnAO.js +7 -0
  7. package/packages/cli/dist/mcp-entry.json +8 -0
  8. package/packages/cli/dist/{templates-DUUaYk_d.js → templates-CNDa9H4e.js} +25 -25
  9. package/packages/core/dist/index.d.ts +4 -2
  10. package/packages/core/dist/index.js +1 -1
  11. package/packages/flows/dist/index.d.ts +1 -1
  12. package/packages/flows/dist/index.js +1 -1
  13. package/packages/server/dist/bin.js +1 -1
  14. package/packages/server/dist/config-B4klhHVp.js +2 -0
  15. package/packages/server/dist/config-D3rRPB9X.js +1 -0
  16. package/packages/server/dist/index.js +1 -1
  17. package/packages/server/dist/prelude-BIJWSWyX.js +2 -0
  18. package/packages/server/dist/prelude-Dxc3G0Q2.js +1 -0
  19. package/packages/server/dist/routes-Ct7q5jrL.js +6 -0
  20. package/packages/server/dist/routes-DsSm9ea0.js +5 -0
  21. package/packages/server/dist/sampling-BX1qQuXx.js +2 -0
  22. package/packages/server/dist/sampling-QHtj6UuO.js +1 -0
  23. package/packages/server/dist/{server-C2n9kQMF.js → server-CiPwrtSl.js} +185 -179
  24. package/packages/server/dist/{server-CizTllz1.js → server-e0mFUKvp.js} +185 -179
  25. package/packages/server/dist/{server-http-BaMUtb5Y.js → server-http-B3dZd6bx.js} +1 -1
  26. package/packages/server/dist/{server-http-Dd2uCMBi.js → server-http-CzScS-EZ.js} +1 -1
  27. package/packages/server/dist/{server-stdio-B5rk-PAI.js → server-stdio-COkJ2pX9.js} +1 -1
  28. package/packages/server/dist/{server-stdio-CtR4QNT3.js → server-stdio-DmsOjBSR.js} +1 -1
  29. package/packages/server/viewers/architecture-static.html +794 -794
  30. package/packages/server/viewers/report-template.html +11 -11
  31. package/packages/server/viewers/tour-viewer.html +26 -26
  32. package/packages/settings-ui/dist/index.html +12 -12
  33. package/packages/tools/dist/index.d.ts +109 -14
  34. package/packages/tools/dist/index.js +118 -98
  35. package/scaffold/definitions/mcp-entry.json +1 -1
  36. package/scaffold/dist/adapters/claude-code.mjs +5 -5
  37. package/scaffold/dist/adapters/claude-desktop.mjs +6 -6
  38. package/scaffold/dist/adapters/copilot.mjs +1 -1
  39. package/scaffold/dist/adapters/gemini.mjs +2 -2
  40. package/scaffold/dist/adapters/hermes-agent.mjs +1 -1
  41. package/scaffold/dist/adapters/hermes.mjs +1 -1
  42. package/scaffold/dist/adapters/opencode.mjs +2 -2
  43. package/scaffold/dist/adapters/zed.mjs +1 -1
  44. package/scaffold/dist/definitions/flows.mjs +40 -162
  45. package/scaffold/dist/definitions/mcp-entry.json +1 -1
  46. package/scaffold/dist/definitions/platform-capabilities.mjs +1 -1
  47. package/scaffold/dist/definitions/protocols.mjs +22 -19
  48. package/scaffold/dist/definitions/skills/adr-skill.mjs +1 -1
  49. package/scaffold/dist/definitions/skills/docs.mjs +51 -1
  50. package/scaffold/dist/definitions/skills/lesson-learned.mjs +21 -0
  51. package/scaffold/vitest.config.mjs +1 -0
  52. package/packages/cli/dist/init-C_WzeMTD.js +0 -7
  53. package/packages/server/dist/config-4M54ZAT8.js +0 -2
  54. package/packages/server/dist/config-BXd38nVn.js +0 -1
  55. package/packages/server/dist/prelude-CNOjd5qt.js +0 -2
  56. package/packages/server/dist/prelude-Dki25eYn.js +0 -1
  57. package/packages/server/dist/routes-9KnBpwfe.js +0 -6
  58. package/packages/server/dist/routes-B8hTXXR8.js +0 -5
  59. package/packages/server/dist/sampling-B8NwOv_z.js +0 -1
  60. package/packages/server/dist/sampling-DOOgTH1B.js +0 -2
  61. package/scaffold/AUTOMATION-BOUNDARY-ANALYSIS.md +0 -78
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ import{DEFAULT_SERVER_NAME as e,getGlobalDataDir as t,isUserInstalled as n,safeCwdOrHome as r}from"../../core/dist/index.js";import{existsSync as i,mkdirSync as a,readFileSync as o,renameSync as s,writeFileSync as c}from"node:fs";import{dirname as l,resolve as u}from"node:path";import{z as d}from"zod";import{Router as f}from"express";const p=[{key:`serverName`,type:`string`,default:e,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`}],m=[{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 h(e){return m.find(t=>t.key===e)}function g(e){let t=h(e);return t?t.type===`secret`:/(_KEY|_TOKEN|_SECRET|_PASSWORD|_PASS|_PWD)$/i.test(e)}const _=/^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=(.*)$/;function v(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 y(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 b(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(_);if(!n){t.push({kind:`raw`,text:e});continue}let r=n[1],{value:i,quoted:a,inlineComment:o}=v(n[2]);t.push({kind:`assign`,key:r,value:i,quoted:a,inlineComment:o})}return{lines:t}}function x(e){return`${e.lines.map(e=>e.kind===`assign`?y(e):e.text).join(`
6
+ `)}\n`}function S(e){let t={};for(let n of e.lines)n.kind===`assign`&&(t[n.key]=n.value);return t}function C(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 w(e,t){return{lines:e.lines.filter(e=>!(e.kind===`assign`&&e.key===t))}}function T(e){return u(e,`.env`)}function E(){return u(t(),`global.env`)}function D(e,t){return e===`workspace`?T(t):E()}function O(e){return i(e)?b(o(e,`utf-8`)):{lines:[]}}function k(e,t){let n=l(e);i(n)||a(n,{recursive:!0});let r=`${e}.${process.pid}.${Date.now()}.tmp`;c(r,x(t),{encoding:`utf-8`,mode:384}),s(r,e)}function A(e,t,n={}){let r=D(e,t),a=i(r),o=S(O(r)),s={};for(let[e,t]of Object.entries(o))s[e]=n.reveal||!g(e)?t:j(t);return{scope:e,path:r,exists:a,vars:s}}function j(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 M(){return process.env.AIKIT_WORKSPACE_ROOT??r()}function N(){return n()?`user`:`workspace`}function P(){let e=t();return i(e)||a(e,{recursive:!0}),e}var F=class extends Error{details;constructor(e,t){super(e),this.name=`ConfigValidationError`,this.details=t}};function I(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function L(e=M()){let t=process.env.AIKIT_CONFIG_PATH;return t?u(t):u(e,`aikit.config.json`)}function R(e){if(!i(e))return null;let t=o(e,`utf-8`),n=JSON.parse(t);if(!I(n))throw new F(`config-not-object`,[`Config file must contain a JSON object at the root.`]);return n}function z(e,t){let n=l(e);i(n)||a(n,{recursive:!0});let r=`${JSON.stringify(t,null,2)}\n`,o=`${e}.${process.pid}.${Date.now()}.tmp`;c(o,r,{encoding:`utf-8`}),s(o,e)}function B(e){return e.length===0?[]:e.split(`.`)}function V(e,t,n){let r=B(t);if(r.length===0)throw new F(`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 F(`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=I(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=I(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 F(`invalid-path`,[`Path segment "${o}" must be an integer index for array.`]);a[e]=n}else a[o]=n;return i}function H(e,t){let n=B(t);if(n.length===0)throw new F(`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(!I(n)&&!Array.isArray(n))return r;let a=Array.isArray(n)?[...n]:{...n};i[e]=a,i=a;continue}let a=i[t];if(!I(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 U(e,t){let n=e;for(let e of t)n=e.op===`set`?V(n,e.path,e.value):H(n,e.path);return n}function W(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(!I(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&&(I(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 G=d.object({ops:d.array(d.object({op:d.enum([`set`,`unset`]),path:d.string().min(1),value:d.unknown().optional()})).min(1)}),K=d.string().min(1).regex(/^[A-Za-z_][A-Za-z0-9_]*$/,`Invalid env key`),q=d.object({value:d.string(),scope:d.enum([`workspace`,`global`])}),J=d.enum([`workspace`,`global`]);function Y(e,t,n,r){e.status(t).json({error:n,details:r})}function X(e){let t=f(),n=e.workspaceRoot??M;return t.get(`/status`,(t,r)=>{let a=n(),o=L(a);r.json({mode:N(),cwd:(()=>{try{return process.cwd()}catch{return`<unavailable>`}})(),workspaceRoot:a,configPath:o,configExists:i(o),globalDataDir:P(),envPaths:{workspace:T(a),global:E()},mcp:e.mcpInfo?.()??{transport:`http`,pid:process.pid,startedAt:new Date(0).toISOString()}})}),t.get(`/schema`,(e,t)=>{t.json({config:p,env:m})}),t.get(`/config`,(e,t)=>{let r=L(n());try{let e=R(r);t.json({path:r,exists:e!==null,content:e??{}})}catch(e){if(e instanceof F){Y(t,400,e.message,e.details);return}Y(t,500,`config-read-failed`,e instanceof Error?e.message:String(e))}}),t.patch(`/config`,(t,r)=>{let i=G.safeParse(t.body);if(!i.success){Y(r,400,`invalid-body`,i.error.issues);return}let a=L(n()),o;try{o=R(a)??{}}catch(e){if(e instanceof F){Y(r,400,e.message,e.details);return}Y(r,500,`config-read-failed`,e instanceof Error?e.message:String(e));return}let s;try{s=U(o,i.data.ops)}catch(e){if(e instanceof F){Y(r,400,e.message,e.details);return}Y(r,400,`patch-failed`,e instanceof Error?e.message:String(e));return}let c=W(s);if(c.length>0){Y(r,400,`invalid-config`,c);return}try{z(a,s)}catch(e){Y(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:A(`workspace`,a,{reveal:i}),global:A(`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=K.safeParse(t.params.key);if(!i.success){Y(r,400,`invalid-key`,i.error.issues);return}let a=q.safeParse(t.body);if(!a.success){Y(r,400,`invalid-body`,a.error.issues);return}let o=a.data.scope,s=D(o,n());try{k(s,C(O(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){Y(r,500,`env-write-failed`,e instanceof Error?e.message:String(e))}}),t.delete(`/env/:key`,(t,r)=>{let i=K.safeParse(t.params.key);if(!i.success){Y(r,400,`invalid-key`,i.error.issues);return}let a=J.safeParse(t.query.scope);if(!a.success){Y(r,400,`invalid-scope`,a.error.issues);return}let o=a.data,s=D(o,n());try{k(s,w(O(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){Y(r,500,`env-write-failed`,e instanceof Error?e.message:String(e))}}),t}export{X as createSettingsRouter};
@@ -0,0 +1,5 @@
1
+ import{DEFAULT_SERVER_NAME as e,getGlobalDataDir as t,isUserInstalled as n,safeCwdOrHome as r}from"../../core/dist/index.js";import{existsSync as i,mkdirSync as a,readFileSync as o,renameSync as s,writeFileSync as c}from"node:fs";import{dirname as l,resolve as u}from"node:path";import{z as d}from"zod";import{Router as f}from"express";const p=[{key:`serverName`,type:`string`,default:e,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`}],m=[{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 h(e){return m.find(t=>t.key===e)}function g(e){let t=h(e);return t?t.type===`secret`:/(_KEY|_TOKEN|_SECRET|_PASSWORD|_PASS|_PWD)$/i.test(e)}const _=/^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=(.*)$/;function v(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 y(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 b(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(_);if(!n){t.push({kind:`raw`,text:e});continue}let r=n[1],{value:i,quoted:a,inlineComment:o}=v(n[2]);t.push({kind:`assign`,key:r,value:i,quoted:a,inlineComment:o})}return{lines:t}}function x(e){return`${e.lines.map(e=>e.kind===`assign`?y(e):e.text).join(`
5
+ `)}\n`}function S(e){let t={};for(let n of e.lines)n.kind===`assign`&&(t[n.key]=n.value);return t}function C(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 w(e,t){return{lines:e.lines.filter(e=>!(e.kind===`assign`&&e.key===t))}}function T(e){return u(e,`.env`)}function E(){return u(t(),`global.env`)}function D(e,t){return e===`workspace`?T(t):E()}function O(e){return i(e)?b(o(e,`utf-8`)):{lines:[]}}function k(e,t){let n=l(e);i(n)||a(n,{recursive:!0});let r=`${e}.${process.pid}.${Date.now()}.tmp`;c(r,x(t),{encoding:`utf-8`,mode:384}),s(r,e)}function A(e,t,n={}){let r=D(e,t),a=i(r),o=S(O(r)),s={};for(let[e,t]of Object.entries(o))s[e]=n.reveal||!g(e)?t:j(t);return{scope:e,path:r,exists:a,vars:s}}function j(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 M(){return process.env.AIKIT_WORKSPACE_ROOT??r()}function N(){return n()?`user`:`workspace`}function P(){let e=t();return i(e)||a(e,{recursive:!0}),e}var F=class extends Error{details;constructor(e,t){super(e),this.name=`ConfigValidationError`,this.details=t}};function I(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function L(e=M()){let t=process.env.AIKIT_CONFIG_PATH;return t?u(t):u(e,`aikit.config.json`)}function R(e){if(!i(e))return null;let t=o(e,`utf-8`),n=JSON.parse(t);if(!I(n))throw new F(`config-not-object`,[`Config file must contain a JSON object at the root.`]);return n}function z(e,t){let n=l(e);i(n)||a(n,{recursive:!0});let r=`${JSON.stringify(t,null,2)}\n`,o=`${e}.${process.pid}.${Date.now()}.tmp`;c(o,r,{encoding:`utf-8`}),s(o,e)}function B(e){return e.length===0?[]:e.split(`.`)}function V(e,t,n){let r=B(t);if(r.length===0)throw new F(`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 F(`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=I(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=I(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 F(`invalid-path`,[`Path segment "${o}" must be an integer index for array.`]);a[e]=n}else a[o]=n;return i}function H(e,t){let n=B(t);if(n.length===0)throw new F(`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(!I(n)&&!Array.isArray(n))return r;let a=Array.isArray(n)?[...n]:{...n};i[e]=a,i=a;continue}let a=i[t];if(!I(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 U(e,t){let n=e;for(let e of t)n=e.op===`set`?V(n,e.path,e.value):H(n,e.path);return n}function W(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(!I(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&&(I(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 G=d.object({ops:d.array(d.object({op:d.enum([`set`,`unset`]),path:d.string().min(1),value:d.unknown().optional()})).min(1)}),K=d.string().min(1).regex(/^[A-Za-z_][A-Za-z0-9_]*$/,`Invalid env key`),q=d.object({value:d.string(),scope:d.enum([`workspace`,`global`])}),J=d.enum([`workspace`,`global`]);function Y(e,t,n,r){e.status(t).json({error:n,details:r})}function X(e){let t=f(),n=e.workspaceRoot??M;return t.get(`/status`,(t,r)=>{let a=n(),o=L(a);r.json({mode:N(),cwd:(()=>{try{return process.cwd()}catch{return`<unavailable>`}})(),workspaceRoot:a,configPath:o,configExists:i(o),globalDataDir:P(),envPaths:{workspace:T(a),global:E()},mcp:e.mcpInfo?.()??{transport:`http`,pid:process.pid,startedAt:new Date(0).toISOString()}})}),t.get(`/schema`,(e,t)=>{t.json({config:p,env:m})}),t.get(`/config`,(e,t)=>{let r=L(n());try{let e=R(r);t.json({path:r,exists:e!==null,content:e??{}})}catch(e){if(e instanceof F){Y(t,400,e.message,e.details);return}Y(t,500,`config-read-failed`,e instanceof Error?e.message:String(e))}}),t.patch(`/config`,(t,r)=>{let i=G.safeParse(t.body);if(!i.success){Y(r,400,`invalid-body`,i.error.issues);return}let a=L(n()),o;try{o=R(a)??{}}catch(e){if(e instanceof F){Y(r,400,e.message,e.details);return}Y(r,500,`config-read-failed`,e instanceof Error?e.message:String(e));return}let s;try{s=U(o,i.data.ops)}catch(e){if(e instanceof F){Y(r,400,e.message,e.details);return}Y(r,400,`patch-failed`,e instanceof Error?e.message:String(e));return}let c=W(s);if(c.length>0){Y(r,400,`invalid-config`,c);return}try{z(a,s)}catch(e){Y(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:A(`workspace`,a,{reveal:i}),global:A(`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=K.safeParse(t.params.key);if(!i.success){Y(r,400,`invalid-key`,i.error.issues);return}let a=q.safeParse(t.body);if(!a.success){Y(r,400,`invalid-body`,a.error.issues);return}let o=a.data.scope,s=D(o,n());try{k(s,C(O(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){Y(r,500,`env-write-failed`,e instanceof Error?e.message:String(e))}}),t.delete(`/env/:key`,(t,r)=>{let i=K.safeParse(t.params.key);if(!i.success){Y(r,400,`invalid-key`,i.error.issues);return}let a=J.safeParse(t.query.scope);if(!a.success){Y(r,400,`invalid-scope`,a.error.issues);return}let o=a.data,s=D(o,n());try{k(s,w(O(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){Y(r,500,`env-write-failed`,e instanceof Error?e.message:String(e))}}),t}export{X as createSettingsRouter};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import{r as e}from"./server-e0mFUKvp.js";export{e as createSamplingClient};
@@ -0,0 +1 @@
1
+ import{r as e}from"./server-CiPwrtSl.js";export{e as createSamplingClient};