@vpxa/aikit 0.1.359 → 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.
- package/README.md +442 -442
- package/package.json +3 -1
- package/packages/analyzers/dist/index.d.ts +1 -1
- package/packages/claude-desktop/dist/manifest.json +31 -0
- package/packages/claude-desktop/dist/mcp-source.json +16 -0
- package/packages/cli/dist/index.js +14 -14
- package/packages/cli/dist/init-JfM6gnAO.js +7 -0
- package/packages/cli/dist/mcp-entry.json +8 -0
- package/packages/cli/dist/{templates-d2UQHjpi.js → templates-CNDa9H4e.js} +25 -25
- package/packages/core/dist/index.d.ts +46 -3
- package/packages/core/dist/index.js +1 -1
- package/packages/flows/dist/index.d.ts +1 -1
- package/packages/flows/dist/index.js +1 -1
- package/packages/present/dist/annotation-layer.js +10 -10
- package/packages/server/dist/bin.js +1 -1
- package/packages/server/dist/config-B4klhHVp.js +2 -0
- package/packages/server/dist/config-D3rRPB9X.js +1 -0
- package/packages/server/dist/index.js +1 -1
- package/packages/server/dist/observations-CfglxBMB.js +6 -0
- package/packages/server/dist/observations-CrQU_HVm.js +5 -0
- package/packages/server/dist/prelude-BIJWSWyX.js +2 -0
- package/packages/server/dist/prelude-Dxc3G0Q2.js +1 -0
- package/packages/server/dist/routes-Ct7q5jrL.js +6 -0
- package/packages/server/dist/routes-DsSm9ea0.js +5 -0
- package/packages/server/dist/sampling-BX1qQuXx.js +2 -0
- package/packages/server/dist/sampling-QHtj6UuO.js +1 -0
- package/packages/server/dist/{server-CICqmfQ_.js → server-CiPwrtSl.js} +171 -171
- package/packages/server/dist/{server-BZVPmRGV.js → server-e0mFUKvp.js} +172 -170
- package/packages/server/dist/{server-http-CPU9_eVT.js → server-http-B3dZd6bx.js} +1 -1
- package/packages/server/dist/{server-http-D3DK1H19.js → server-http-CzScS-EZ.js} +1 -1
- package/packages/server/dist/{server-stdio-BRKxFWyO.js → server-stdio-COkJ2pX9.js} +1 -1
- package/packages/server/dist/{server-stdio-l8I0RW4l.js → server-stdio-DmsOjBSR.js} +1 -1
- package/packages/server/viewers/architecture-static.html +794 -794
- package/packages/server/viewers/report-template.html +11 -11
- package/packages/server/viewers/tour-viewer.html +26 -26
- package/packages/settings-ui/dist/index.html +12 -12
- package/packages/tools/dist/index.d.ts +109 -14
- package/packages/tools/dist/index.js +118 -98
- package/scaffold/definitions/mcp-entry.json +1 -1
- package/scaffold/dist/adapters/_shared.mjs +7 -6
- package/scaffold/dist/adapters/claude-code.mjs +7 -7
- package/scaffold/dist/adapters/claude-desktop.mjs +7 -0
- package/scaffold/dist/adapters/copilot.mjs +1 -1
- package/scaffold/dist/adapters/gemini.mjs +6 -6
- package/scaffold/dist/adapters/hermes-agent.mjs +1 -1
- package/scaffold/dist/adapters/hermes.mjs +5 -5
- package/scaffold/dist/adapters/hooks.mjs +1 -1
- package/scaffold/dist/adapters/opencode.mjs +7 -7
- package/scaffold/dist/adapters/zed.mjs +1 -1
- package/scaffold/dist/definitions/exec-hooks.mjs +1 -1
- package/scaffold/dist/definitions/flows.mjs +40 -162
- package/scaffold/dist/definitions/mcp-entry.json +1 -1
- package/scaffold/dist/definitions/platform-capabilities.mjs +1 -0
- package/scaffold/dist/definitions/protocols.mjs +22 -19
- package/scaffold/dist/definitions/skills/adr-skill.mjs +1 -1
- package/scaffold/dist/definitions/skills/docs.mjs +51 -1
- package/scaffold/dist/definitions/skills/lesson-learned.mjs +21 -0
- package/scaffold/vitest.config.mjs +1 -0
- package/packages/cli/dist/init-Cvys5TD4.js +0 -7
- package/packages/server/dist/config-4M54ZAT8.js +0 -2
- package/packages/server/dist/config-BXd38nVn.js +0 -1
- package/packages/server/dist/prelude-CfXBHLpw.js +0 -1
- package/packages/server/dist/prelude-D33q42vQ.js +0 -2
- package/packages/server/dist/routes-9KnBpwfe.js +0 -6
- package/packages/server/dist/routes-B8hTXXR8.js +0 -5
- package/packages/server/dist/sampling-Cs9MoNYX.js +0 -2
- package/packages/server/dist/sampling-DFogBKrL.js +0 -1
|
@@ -155,6 +155,27 @@ Extract durable engineering lessons from actual work. Lessons are not summaries;
|
|
|
155
155
|
|
|
156
156
|
Run after implementation, refactor, debugging, or review. Skip pure formatting/config churn unless it revealed a reusable process lesson.
|
|
157
157
|
|
|
158
|
+
### Condition Check (epilogue gate)
|
|
159
|
+
|
|
160
|
+
When invoked from a \`_lesson-learned\` epilogue step, evaluate before extracting:
|
|
161
|
+
|
|
162
|
+
**Skip when ALL are true:**
|
|
163
|
+
- Flow was Floor-tier (trivial change)
|
|
164
|
+
- blast_radius ≤ 2 for all changes
|
|
165
|
+
- Flow completed in a single batch with no iteration
|
|
166
|
+
- No agent returned BLOCKED or DONE_WITH_CONCERNS
|
|
167
|
+
- evidence_map never reached HOLD state
|
|
168
|
+
|
|
169
|
+
**Proceed when ANY are true:**
|
|
170
|
+
- An agent returned BLOCKED or DONE_WITH_CONCERNS during the flow
|
|
171
|
+
- evidence_map had HOLD before reaching YIELD (required iteration to pass)
|
|
172
|
+
- Multi-model decision protocol was invoked
|
|
173
|
+
- blast_radius > 5 (complex change with systemic implications)
|
|
174
|
+
- A novel pattern or anti-pattern was discovered
|
|
175
|
+
- A debugging session revealed non-obvious root cause
|
|
176
|
+
|
|
177
|
+
If skip condition is met (epilogue context) → \`flow({ action: 'step', advance: 'skip' })\` with note: "No lesson signals detected."
|
|
178
|
+
|
|
158
179
|
## Flow
|
|
159
180
|
|
|
160
181
|
1. Inspect diff and verification results.
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import{c as e,l as t,n,o as r,r as i,t as a}from"./scaffold-BNPHP-QC.js";import{_ as o,a as s,c,i as l,n as u,o as d,r as f,t as p}from"./templates-d2UQHjpi.js";import{appendFileSync as m,existsSync as h,mkdirSync as g,readFileSync as _,unlinkSync as v,writeFileSync as y}from"node:fs";import{basename as b,dirname as x,resolve as S}from"node:path";import{homedir as C}from"node:os";import{AIKIT_PATHS as w,EMBEDDING_DEFAULTS as T,isUserInstalled as E}from"../../core/dist/index.js";function D(e){return h(S(e,`.cursor`))?`cursor`:h(S(e,`.claude`))?`claude-code`:h(S(e,`.windsurf`))?`windsurf`:h(S(e,`.zed`))?`zed`:h(S(e,`.idea`))?`intellij`:h(S(e,`.opencode`))?`opencode`:h(S(e,`AGENTS.md`))?`hermes`:`copilot`}function O(e){let t=[];return h(S(e,`.cursor`))&&t.push(`cursor`),(h(S(e,`.claude`))||h(S(e,`CLAUDE.md`)))&&t.push(`claude-code`),h(S(e,`.windsurf`))&&t.push(`windsurf`),h(S(e,`.zed`))&&t.push(`zed`),h(S(e,`.idea`))&&t.push(`intellij`),h(S(e,`.gemini`))&&t.push(`gemini-cli`),(h(S(e,`.codex`))||h(S(e,`codex.md`)))&&t.push(`codex-cli`),(h(S(e,`.opencode`))||h(S(e,`OPENCODE.md`)))&&t.push(`opencode`),t.push(`copilot`),t.push(`hermes`),[...new Set(t)]}function k(e){return{servers:{[e]:{...l}}}}function A(e){let{type:t,...n}=l;return{mcpServers:{[e]:n}}}function j(e){let{type:t,...n}=l;return{context_servers:{[e]:{...n}}}}function M(e){let{type:t,...n}=l;return{mcp:{[e]:{type:`local`,command:[n.command,...n.args]}}}}const N={scaffoldDir:`general`,writeMcpConfig(e,t){let n=S(e,`.vscode`),r=S(n,`mcp.json`);h(r)||(g(n,{recursive:!0}),y(r,`${JSON.stringify(k(t),null,2)}\n`,`utf-8`),console.log(` Created .vscode/mcp.json`))},writeInstructions(e,t){let n=S(e,`.github`),r=S(n,`copilot-instructions.md`);g(n,{recursive:!0}),y(r,u(b(e),t),`utf-8`),console.log(` Updated .github/copilot-instructions.md`)},writeAgentsMd(e,t){y(S(e,`AGENTS.md`),p(b(e),t),`utf-8`),console.log(` Updated AGENTS.md`)}},P=`Orchestrator`;function F(e){let{command:t,args:n}=l;return{[e]:{command:t,args:[...n],type:`stdio`,env:{}}}}function I(e,t){let n=t??S(C(),`.claude`),r=S(n,`settings.json`),i=S(n,`..`,`.claude.json`),a=F(e),o;if(!h(i))o={};else try{o=JSON.parse(_(i,`utf-8`))}catch{console.warn(` ⚠ ${i} invalid JSON — overwriting`),o={}}g(x(i),{recursive:!0}),o.mcpServers={...o.mcpServers||{},...a},y(i,`${JSON.stringify(o,null,2)}\n`,`utf-8`),console.log(` Updated ${i} — ${e} MCP server`);let s;if(!h(r))g(n,{recursive:!0}),s={agent:P};else{try{s=JSON.parse(_(r,`utf-8`))}catch{console.warn(` ⚠ ${r} invalid JSON — overwriting`),s={}}delete s.mcpServers}s.agent=P;let l=S(n,`hooks`,`scripts`).replace(/\\/g,`/`);try{let e=c(`claude`,l);e.hooks&&Object.keys(e.hooks).length>0&&(s.hooks=e.hooks)}catch{console.warn(` ⚠ Failed to generate hooks block`)}y(r,`${JSON.stringify(s,null,2)}\n`,`utf-8`),console.log(` Updated ${r} — default agent + hooks`)}const L={scaffoldDir:`general`,writeMcpConfig(e,t){I(t);let n=S(e,`.mcp.json`);h(n)||(y(n,`${JSON.stringify(A(t),null,2)}\n`,`utf-8`),console.log(` Created .mcp.json`))},writeInstructions(e,t){let n=S(e,`CLAUDE.md`),r=b(e);y(n,`${u(r,t)}\n---\n\n${p(r,t)}`,`utf-8`),console.log(` Updated CLAUDE.md`)},writeAgentsMd(e,t){}},R={scaffoldDir:`general`,writeMcpConfig(e,t){let n=S(e,`.cursor`),r=S(n,`mcp.json`);h(r)||(g(n,{recursive:!0}),y(r,`${JSON.stringify(A(t),null,2)}\n`,`utf-8`),console.log(` Created .cursor/mcp.json`))},writeInstructions(e,t){let n=S(e,`.cursor`,`rules`),r=S(n,`aikit.mdc`);g(n,{recursive:!0});let i=b(e);y(r,`${u(i,t)}\n---\n\n${p(i,t)}`,`utf-8`),console.log(` Updated .cursor/rules/aikit.mdc`);let a=S(n,`kb.mdc`);h(a)&&a!==r&&(v(a),console.log(` Removed legacy .cursor/rules/kb.mdc`))},writeAgentsMd(e,t){}},z={scaffoldDir:`general`,writeMcpConfig(e,t){let n=S(e,`.vscode`),r=S(n,`mcp.json`);h(r)||(g(n,{recursive:!0}),y(r,`${JSON.stringify(k(t),null,2)}\n`,`utf-8`),console.log(` Created .vscode/mcp.json (Windsurf-compatible)`))},writeInstructions(e,t){let n=S(e,`.windsurfrules`),r=b(e);y(n,`${u(r,t)}\n---\n\n${p(r,t)}`,`utf-8`),console.log(` Updated .windsurfrules`)},writeAgentsMd(e,t){}},B={scaffoldDir:`general`,writeMcpConfig(e,t){let n=S(e,`.zed`),r=S(n,`settings.json`);if(g(n,{recursive:!0}),!h(r))y(r,`${JSON.stringify(j(t),null,2)}\n`,`utf-8`),console.log(` Created .zed/settings.json`);else{let e;try{e=JSON.parse(_(r,`utf-8`))}catch{console.warn(` ⚠ .zed/settings.json contains invalid JSON — skipping MCP config merge`);return}e.context_servers?.[t]||(e.context_servers={...e.context_servers,...j(t).context_servers},y(r,`${JSON.stringify(e,null,2)}\n`,`utf-8`),console.log(` Updated .zed/settings.json with context_servers`))}},writeInstructions(e,t){let n=S(e,`.rules`),r=b(e);y(n,`${u(r,t)}\n---\n\n${p(r,t)}`,`utf-8`),console.log(` Updated .rules`)},writeAgentsMd(e,t){}},V={scaffoldDir:`general`,writeMcpConfig(e,t){let n=S(e,`mcp.json`);h(n)||(y(n,`${JSON.stringify(A(t),null,2)}\n`,`utf-8`),console.log(` Created mcp.json`))},writeInstructions(e,t){let n=S(e,`.aiassistant`,`rules`),r=S(n,`aikit.md`);g(n,{recursive:!0});let i=b(e);y(r,`${u(i,t)}\n---\n\n${p(i,t)}`,`utf-8`),console.log(` Updated .aiassistant/rules/aikit.md`)},writeAgentsMd(e,t){}},H={scaffoldDir:`general`,writeMcpConfig(e,t){let n=S(e,`.opencode`),r=S(n,`opencode.json`);h(r)||(g(n,{recursive:!0}),y(r,`${JSON.stringify(M(t),null,2)}\n`,`utf-8`),console.log(` Created .opencode/opencode.json`))},writeInstructions(e,t){let n=S(e,`OPENCODE.md`),r=b(e);y(n,`${u(r,t)}\n---\n\n${p(r,t)}`,`utf-8`),console.log(` Updated OPENCODE.md`)},writeAgentsMd(e,t){}},U={scaffoldDir:`general`,writeMcpConfig(e,t){},writeInstructions(e,t){let n=S(e,`AGENTS.md`),r=b(e);y(n,`${u(r,t)}\n---\n\n${p(r,t)}`,`utf-8`),console.log(` Updated AGENTS.md (Hermes)`)},writeAgentsMd(e,t){}};function W(e){switch(e){case`copilot`:return N;case`claude-code`:return L;case`cursor`:return R;case`windsurf`:return z;case`zed`:return B;case`intellij`:return V;case`opencode`:return H;case`hermes`:return U;case`gemini-cli`:case`codex-cli`:return N}}const G={serverName:s,sources:[{path:`.`,excludePatterns:[`**/node_modules/**`,`**/dist/**`,`**/build/**`,`**/.git/**`,`**/${w.data}/**`,`**/coverage/**`,`**/*.min.js`,`**/package-lock.json`,`**/pnpm-lock.yaml`]}],indexing:{chunkSize:1500,chunkOverlap:200,minChunkSize:100},embedding:{model:T.model,dimensions:T.dimensions},store:{backend:`sqlite-vec`,path:w.data},curated:{path:w.aiCurated}};function K(e,t){let n=S(e,`aikit.config.json`);return h(n)&&!t?(console.log(`aikit.config.json already exists. Use --force to overwrite.`),!1):(y(n,`${JSON.stringify(G,null,2)}\n`,`utf-8`),console.log(` Created aikit.config.json`),!0)}function q(e){let t=S(e,`.gitignore`),n=[{dir:`.flows/`,label:`AI Kit flow runs`}];if(h(t)){let e=_(t,`utf-8`),r=n.filter(t=>!e.includes(t.dir));r.length>0&&(m(t,`\n${r.map(e=>`# ${e.label}\n${e.dir}`).join(`
|
|
2
|
-
`)}\n`,`utf-8`),console.log(` Added ${r.map(e=>e.dir).join(`, `)} to .gitignore`))}else y(t,`${n.map(e=>`# ${e.label}\n${e.dir}`).join(`
|
|
3
|
-
`)}\n`,`utf-8`),console.log(` Created .gitignore with AI Kit entries`)}function J(){return G.serverName}const Y=[`decisions`,`patterns`,`conventions`,`troubleshooting`];function X(e){let t=S(e,`.ai`,`curated`);h(t)||(g(t,{recursive:!0}),console.log(` Created .ai/curated/`));for(let e of Y){let n=S(t,e);h(n)||g(n,{recursive:!0})}console.log(` Created .ai/curated/{${Y.join(`,`)}}/`)}function Z(e){switch(e){case`zed`:return`zed`;case`intellij`:return`intellij`;case`claude-code`:return`claude-code`;case`gemini-cli`:return`gemini`;case`codex-cli`:return`codex`;case`opencode`:return`opencode`;case`hermes`:return`hermes`;default:return`copilot`}}async function Q(n){let i=process.cwd();if(S(i)===S(C())){console.log(` Skipping workspace init: cannot scaffold the home directory.`),console.log(" Use `aikit init` (without --workspace) for user-level setup.");return}if(!K(i,n.force))return;q(i);let a=J(),s=W(D(i));s.writeMcpConfig(i,a),s.writeInstructions(i,a),s.writeAgentsMd(i,a);let c=o(),l=JSON.parse(_(S(c,`package.json`),`utf-8`)).version;await t(i,c,[...d],l,n.force),await r(i,c,[...f],l,n.force);let u=O(i),p=new Set;for(let t of u){let r=Z(t);p.has(r)||(p.add(r),await e(i,c,r,l,n.force))}X(i),console.log(`
|
|
4
|
-
AI Kit initialized! Next steps:`),console.log(` aikit reindex Index your codebase`),console.log(` aikit search Search indexed content`),console.log(` aikit serve Start MCP server for IDE integration`),E()&&console.log(`
|
|
5
|
-
Note: User-level AI Kit is also installed. This workspace uses its own local data store.`)}async function ee(e){E()?await $(e):await Q(e)}async function $(t){let n=process.cwd();if(S(n)===S(C())){console.log(` Skipping workspace scaffold: cannot scaffold the home directory.`);return}let i=J(),a=W(D(n));a.writeInstructions(n,i),a.writeAgentsMd(n,i);let s=o(),c=JSON.parse(_(S(s,`package.json`),`utf-8`)).version,l=O(n),u=new Set;for(let r of l){let i=Z(r);u.has(i)||(u.add(i),await e(n,s,i,c,t.force))}await r(n,s,[...f],c,t.force),X(n),q(n),console.log(`
|
|
6
|
-
Workspace scaffolded for user-level AI Kit! Files added:`),console.log(` Instruction files (AGENTS.md, copilot-instructions.md, etc.)`),console.log(` .ai/curated/ directories`),console.log(` .github/agents/ & .github/prompts/`),console.log(`
|
|
7
|
-
The user-level AI Kit server will auto-index this workspace when opened in your IDE.`)}async function te(){let e=process.cwd(),t=O(e),r=o(),s=[...await i(e,r,[...d])],c=new Set;for(let i of t){let t=Z(i);c.has(t)||(c.add(t),s.push(...await n(e,r,t)))}s.push(...await a(e,r,[...f]));let l={summary:{total:s.length,new:s.filter(e=>e.status===`new`).length,outdated:s.filter(e=>e.status===`outdated`).length,current:s.filter(e=>e.status===`current`).length},files:s};console.log(JSON.stringify(l,null,2))}export{te as guideProject,Q as initProject,$ as initScaffoldOnly,ee as initSmart};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import{o as e,t}from"./supersession-DO_ZROFl.js";import{fileURLToPath as n}from"node:url";import{AIKIT_RUNTIME_PATHS as r,EMBEDDING_DEFAULTS as i,computePartitionKey as a,createLogger as o,getPartitionDir as s,migrateLegacyWorkspaceLayout as c,safeCwd as l,serializeError as u}from"../../core/dist/index.js";import{existsSync as d,mkdirSync as f,readFileSync as p,writeFileSync as m}from"node:fs";import{dirname as h,isAbsolute as g,relative as _,resolve as v}from"node:path";import{homedir as y}from"node:os";const b={workingToEpisodicAccesses:2,episodicToSemanticReferences:3,semanticToProceduralVerifications:5},x={working:1,episodic:2,semantic:4,procedural:12};function S(e,t=b){switch(e.tier){case`working`:if(e.accessCount>=t.workingToEpisodicAccesses)return`episodic`;break;case`episodic`:if(e.accessCount>=t.workingToEpisodicAccesses+t.episodicToSemanticReferences)return`semantic`;break;case`semantic`:if(e.accessCount>=t.workingToEpisodicAccesses+t.episodicToSemanticReferences+t.semanticToProceduralVerifications)return`procedural`;break;case`procedural`:break;default:break}}function C(e,t,n){e.memoryMetaUpdateTier(t,n)}const w={stabilityHours:168,accessMultiplier:1.5,flagThreshold:.1,maxStabilityHours:8760};function T(e){return{...w,...e}}function E(e,t){if(!e)return t;let n=Date.parse(e);return Number.isNaN(n)?t:n}function D(e){return e&&e in x?e:`working`}function O(e,t,n,r=w,i){let a=typeof r==`string`?D(r):`working`,o=T(typeof r==`string`?i:r),s=E(e,E(n,Date.now())),c=Math.max(0,Date.now()-s)/(1e3*60*60),l=Math.min(o.stabilityHours*x[a]*o.accessMultiplier**Math.max(0,t),o.maxStabilityHours);return Math.exp(-c/l)}function k(e,t,n){let r=e.memoryMetaGet(t);if(!r)return;let i=O(r.lastAccessedAt,r.accessCount,r.createdAt,r.tier,n);return r.retentionScore!==i&&e.memoryMetaUpdateScore(t,i),e.memoryMetaGet(t)??{...r,retentionScore:i}}function A(e,t,n){e.memoryMetaGet(t)||e.memoryMetaCreate(t),e.memoryMetaTouch(t);let r=e.memoryMetaGet(t);if(!r)return 1;let i=O(r.lastAccessedAt,r.accessCount,r.createdAt,r.tier,n);return e.memoryMetaUpdateScore(t,i),i}function j(e,t){let n=T(t);return e.memoryMetaList().map(t=>k(e,t.entryId,n)??t).filter(e=>e.retentionScore<n.flagThreshold).sort((e,t)=>e.retentionScore-t.retentionScore)}const M=h(n(import.meta.url)),N=o(`server`),P=[`auto`,`manual`,`smart`],F={model:i.model,dimensions:i.dimensions,childProcess:!0,idleTimeoutMs:3e5};function I(e){return typeof e==`string`&&P.includes(e)}function L(e,t,n){let r=v(e),i=_(v(t),r);if(i.startsWith(`..`)||g(i))throw Error(`Config ${n} path escapes allowed root: ${e} is not under ${t}`);return r}function R(e,t){let n=v(e),r=_(v(t),n);return!(r.startsWith(`..`)||g(r))}function z(e){return s(a(e))}function B(e,t,n,r,i){let a=r?v(t,r):t;if(!n)return L(a,t,i);let o=v(e,n);return R(o,t)?r&&v(o)===v(t)?L(a,t,i):L(o,t,i):L(a,t,i)}function V(e){let t=[e.store?.path,e.curated?.path,e.onboardDir,e.stateDir,e.l0CardDir];for(let e of t)e&&f(e,{recursive:!0})}function H(e,t){c(t);let n=z(t);e.store={...e.store,path:B(t,n,e.store?.path,r.data,`store`)},e.curated={...e.curated,path:B(t,n,e.curated?.path,r.curated,`curated`)},e.onboardDir=B(t,n,e.onboardDir,r.onboard,`onboard`),e.stateDir=B(t,n,e.stateDir,r.state,`state`),e.l0CardDir=B(t,n,e.l0CardDir,r.l0Cards,`l0CardDir`)}function U(e){let t=process.env.AIKIT_INDEX_MODE;if(I(t))return t;if(e.indexMode)return e.indexMode;let n=process.env.AIKIT_AUTO_INDEX;return n===void 0?e.autoIndex===void 0?`smart`:e.autoIndex?`auto`:`manual`:n===`true`?`auto`:`manual`}function W(){let n=l(),r=process.env.AIKIT_CONFIG_PATH??(n&&d(v(n,`aikit.config.json`))?v(n,`aikit.config.json`):v(M,`..`,`..`,`..`,`aikit.config.json`));try{if(!d(r))return N.info(`No config file found, using defaults`,{configPath:r}),K();let n=p(r,`utf-8`),i=JSON.parse(n),a={...F,...i.embedding};if(i.embedding=a,i.memory={retention:{...w,...i.memory?.retention},lessons:{...e,...i.memory?.lessons},consolidation:{...b,...i.memory?.consolidation},supersession:{...t,...i.memory?.supersession}},i.logging?.errorDetails!==void 0&&typeof i.logging.errorDetails!=`boolean`)throw Error(`Config logging.errorDetails must be a boolean`);if(i.logging={errorDetails:i.logging?.errorDetails===!0},!i.sources||!Array.isArray(i.sources)||i.sources.length===0)throw Error(`Config must have at least one source`);if(!i.store?.path)throw Error(`Config must specify store.path`);if(i.autoIndex!==void 0&&typeof i.autoIndex!=`boolean`)throw Error(`Config autoIndex must be a boolean`);if(i.indexMode!==void 0&&!I(i.indexMode))throw Error(`Config indexMode must be one of: ${P.join(`, `)}`);if(typeof a.model!=`string`||a.model.trim()===``)throw Error(`Config embedding.model must be a non-empty string`);if(a.nativeDim!==void 0&&(!Number.isInteger(a.nativeDim)||a.nativeDim<=0))throw Error(`Config embedding.nativeDim must be a positive integer`);if(a.dimensions!==void 0&&(!Number.isInteger(a.dimensions)||a.dimensions<=0))throw Error(`Config embedding.dimensions must be a positive integer`);if(a.dimensions!==void 0&&a.nativeDim!==void 0&&a.dimensions>a.nativeDim)throw Error(`Config embedding.dimensions must not exceed embedding.nativeDim`);if(a.queryPrefix!==void 0&&typeof a.queryPrefix!=`string`)throw Error(`Config embedding.queryPrefix must be a string`);let o=h(r);return i.sources=i.sources.map(e=>({...e,path:L(v(o,e.path),o,`source`)})),q(i,r),H(i,o),i.layeredKnowledge===void 0&&(i.layeredKnowledge=process.env.AIKIT_LAYERED_KNOWLEDGE===`true`),i.indexMode=U(i),i}catch(e){let t=`Failed to load config from ${r}. ${e instanceof Error?e.message:String(e)}`;console.error(`\n ⚠ CONFIG ERROR — ${t}\n Check that the file exists, is valid JSON, and all required fields are present.\n`),N.error(`Failed to load config`,{configPath:r,...u(e)}),N.warn(`Falling back to default configuration`,{configPath:r});let n=K();return n.configError=t,n}}const G=[`.git/**`,`**/node_modules/**`,`*.lock`,`pnpm-lock.yaml`,`package-lock.json`,`**/dist/**`,`**/build/**`,`**/out/**`,`**/.output/**`,`**/cdk.out/**`,`**/.next/**`,`**/.nuxt/**`,`**/.vercel/**`,`**/.serverless/**`,`**/.turbo/**`,`**/.cache/**`,`**/.parcel-cache/**`,`**/coverage/**`,`**/.terraform/**`,`**/__pycache__/**`,`**/.venv/**`,`**/.docusaurus/**`,`**/.temp/**`,`**/tmp/**`];function K(){let n=process.env.AIKIT_WORKSPACE_ROOT??l()??y(),i=z(n),a={sources:[{path:n,excludePatterns:[...G]}],serverName:`aikit`,indexing:{chunkSize:800,chunkOverlap:150,minChunkSize:100},embedding:{...F},store:{backend:`sqlite-vec`,path:v(i,r.data)},curated:{path:v(i,r.curated)},memory:{retention:{...w},lessons:{...e},consolidation:{...b},supersession:{...t}},logging:{errorDetails:!1},onboardDir:v(i,r.onboard),stateDir:v(i,r.state)};return a.indexMode=U(a),a}function q(e,t){let n=e.configVersion??0;if(n>=1)return e;if(n<1)for(let t of e.sources){t.excludePatterns=t.excludePatterns??[];let e=new Set(t.excludePatterns);for(let n of G)e.has(n)||t.excludePatterns.push(n)}e.configVersion=1;try{m(t,`${JSON.stringify(e,null,2)}\n`,`utf-8`),N.info(`Config auto-upgraded`,{from:n,to:1,configPath:t})}catch(e){N.warn(`Failed to write upgraded config`,{configPath:t,...u(e)})}return e}function J(e,t){if(!d(t))throw Error(`Workspace root does not exist: ${t}`);c(t),N.debug(`Reconfiguring for workspace root`,{workspaceRoot:t});try{process.chdir(t),N.debug(`Changed process cwd to workspace root`,{cwd:process.cwd()})}catch(e){N.warn(`Failed to chdir to workspace root`,{workspaceRoot:t,...u(e)})}e.sources=[{path:t,excludePatterns:e.sources[0]?.excludePatterns??[`node_modules/**`,`dist/**`,`.git/**`,`coverage/**`,`*.lock`,`pnpm-lock.yaml`]}],H(e,t),V(e)}export{G as DEFAULT_EXCLUDE_PATTERNS,S as a,b as i,W as loadConfig,k as n,C as o,A as r,J as reconfigureForWorkspace,U as resolveIndexMode,j as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{o as e,t}from"./supersession-CWEne3av.js";import{fileURLToPath as n}from"node:url";import{AIKIT_RUNTIME_PATHS as r,EMBEDDING_DEFAULTS as i,computePartitionKey as a,createLogger as o,getPartitionDir as s,migrateLegacyWorkspaceLayout as c,safeCwd as l,serializeError as u}from"../../core/dist/index.js";import{existsSync as d,mkdirSync as f,readFileSync as p,writeFileSync as m}from"node:fs";import{dirname as h,isAbsolute as g,relative as _,resolve as v}from"node:path";import{homedir as y}from"node:os";const b={workingToEpisodicAccesses:2,episodicToSemanticReferences:3,semanticToProceduralVerifications:5},x={working:1,episodic:2,semantic:4,procedural:12};function S(e,t=b){switch(e.tier){case`working`:if(e.accessCount>=t.workingToEpisodicAccesses)return`episodic`;break;case`episodic`:if(e.accessCount>=t.workingToEpisodicAccesses+t.episodicToSemanticReferences)return`semantic`;break;case`semantic`:if(e.accessCount>=t.workingToEpisodicAccesses+t.episodicToSemanticReferences+t.semanticToProceduralVerifications)return`procedural`;break;case`procedural`:break;default:break}}function C(e,t,n){e.memoryMetaUpdateTier(t,n)}const w={stabilityHours:168,accessMultiplier:1.5,flagThreshold:.1,maxStabilityHours:8760};function T(e){return{...w,...e}}function E(e,t){if(!e)return t;let n=Date.parse(e);return Number.isNaN(n)?t:n}function D(e){return e&&e in x?e:`working`}function O(e,t,n,r=w,i){let a=typeof r==`string`?D(r):`working`,o=T(typeof r==`string`?i:r),s=E(e,E(n,Date.now())),c=Math.max(0,Date.now()-s)/(1e3*60*60),l=Math.min(o.stabilityHours*x[a]*o.accessMultiplier**Math.max(0,t),o.maxStabilityHours);return Math.exp(-c/l)}function k(e,t,n){let r=e.memoryMetaGet(t);if(!r)return;let i=O(r.lastAccessedAt,r.accessCount,r.createdAt,r.tier,n);return r.retentionScore!==i&&e.memoryMetaUpdateScore(t,i),e.memoryMetaGet(t)??{...r,retentionScore:i}}function A(e,t,n){e.memoryMetaGet(t)||e.memoryMetaCreate(t),e.memoryMetaTouch(t);let r=e.memoryMetaGet(t);if(!r)return 1;let i=O(r.lastAccessedAt,r.accessCount,r.createdAt,r.tier,n);return e.memoryMetaUpdateScore(t,i),i}function j(e,t){let n=T(t);return e.memoryMetaList().map(t=>k(e,t.entryId,n)??t).filter(e=>e.retentionScore<n.flagThreshold).sort((e,t)=>e.retentionScore-t.retentionScore)}const M=h(n(import.meta.url)),N=o(`server`),P=[`auto`,`manual`,`smart`],F={model:i.model,dimensions:i.dimensions,childProcess:!0,idleTimeoutMs:3e5};function I(e){return typeof e==`string`&&P.includes(e)}function L(e,t,n){let r=v(e),i=_(v(t),r);if(i.startsWith(`..`)||g(i))throw Error(`Config ${n} path escapes allowed root: ${e} is not under ${t}`);return r}function R(e,t){let n=v(e),r=_(v(t),n);return!(r.startsWith(`..`)||g(r))}function z(e){return s(a(e))}function B(e,t,n,r,i){let a=r?v(t,r):t;if(!n)return L(a,t,i);let o=v(e,n);return R(o,t)?r&&v(o)===v(t)?L(a,t,i):L(o,t,i):L(a,t,i)}function V(e){let t=[e.store?.path,e.curated?.path,e.onboardDir,e.stateDir,e.l0CardDir];for(let e of t)e&&f(e,{recursive:!0})}function H(e,t){c(t);let n=z(t);e.store={...e.store,path:B(t,n,e.store?.path,r.data,`store`)},e.curated={...e.curated,path:B(t,n,e.curated?.path,r.curated,`curated`)},e.onboardDir=B(t,n,e.onboardDir,r.onboard,`onboard`),e.stateDir=B(t,n,e.stateDir,r.state,`state`),e.l0CardDir=B(t,n,e.l0CardDir,r.l0Cards,`l0CardDir`)}function U(e){let t=process.env.AIKIT_INDEX_MODE;if(I(t))return t;if(e.indexMode)return e.indexMode;let n=process.env.AIKIT_AUTO_INDEX;return n===void 0?e.autoIndex===void 0?`smart`:e.autoIndex?`auto`:`manual`:n===`true`?`auto`:`manual`}function W(){let n=l(),r=process.env.AIKIT_CONFIG_PATH??(n&&d(v(n,`aikit.config.json`))?v(n,`aikit.config.json`):v(M,`..`,`..`,`..`,`aikit.config.json`));try{if(!d(r))return N.info(`No config file found, using defaults`,{configPath:r}),K();let n=p(r,`utf-8`),i=JSON.parse(n),a={...F,...i.embedding};if(i.embedding=a,i.memory={retention:{...w,...i.memory?.retention},lessons:{...e,...i.memory?.lessons},consolidation:{...b,...i.memory?.consolidation},supersession:{...t,...i.memory?.supersession}},i.logging?.errorDetails!==void 0&&typeof i.logging.errorDetails!=`boolean`)throw Error(`Config logging.errorDetails must be a boolean`);if(i.logging={errorDetails:i.logging?.errorDetails===!0},!i.sources||!Array.isArray(i.sources)||i.sources.length===0)throw Error(`Config must have at least one source`);if(!i.store?.path)throw Error(`Config must specify store.path`);if(i.autoIndex!==void 0&&typeof i.autoIndex!=`boolean`)throw Error(`Config autoIndex must be a boolean`);if(i.indexMode!==void 0&&!I(i.indexMode))throw Error(`Config indexMode must be one of: ${P.join(`, `)}`);if(typeof a.model!=`string`||a.model.trim()===``)throw Error(`Config embedding.model must be a non-empty string`);if(a.nativeDim!==void 0&&(!Number.isInteger(a.nativeDim)||a.nativeDim<=0))throw Error(`Config embedding.nativeDim must be a positive integer`);if(a.dimensions!==void 0&&(!Number.isInteger(a.dimensions)||a.dimensions<=0))throw Error(`Config embedding.dimensions must be a positive integer`);if(a.dimensions!==void 0&&a.nativeDim!==void 0&&a.dimensions>a.nativeDim)throw Error(`Config embedding.dimensions must not exceed embedding.nativeDim`);if(a.queryPrefix!==void 0&&typeof a.queryPrefix!=`string`)throw Error(`Config embedding.queryPrefix must be a string`);let o=h(r);return i.sources=i.sources.map(e=>({...e,path:L(v(o,e.path),o,`source`)})),q(i,r),H(i,o),i.layeredKnowledge===void 0&&(i.layeredKnowledge=process.env.AIKIT_LAYERED_KNOWLEDGE===`true`),i.indexMode=U(i),i}catch(e){let t=`Failed to load config from ${r}. ${e instanceof Error?e.message:String(e)}`;console.error(`\n ⚠ CONFIG ERROR — ${t}\n Check that the file exists, is valid JSON, and all required fields are present.\n`),N.error(`Failed to load config`,{configPath:r,...u(e)}),N.warn(`Falling back to default configuration`,{configPath:r});let n=K();return n.configError=t,n}}const G=[`.git/**`,`**/node_modules/**`,`*.lock`,`pnpm-lock.yaml`,`package-lock.json`,`**/dist/**`,`**/build/**`,`**/out/**`,`**/.output/**`,`**/cdk.out/**`,`**/.next/**`,`**/.nuxt/**`,`**/.vercel/**`,`**/.serverless/**`,`**/.turbo/**`,`**/.cache/**`,`**/.parcel-cache/**`,`**/coverage/**`,`**/.terraform/**`,`**/__pycache__/**`,`**/.venv/**`,`**/.docusaurus/**`,`**/.temp/**`,`**/tmp/**`];function K(){let n=process.env.AIKIT_WORKSPACE_ROOT??l()??y(),i=z(n),a={sources:[{path:n,excludePatterns:[...G]}],serverName:`aikit`,indexing:{chunkSize:800,chunkOverlap:150,minChunkSize:100},embedding:{...F},store:{backend:`sqlite-vec`,path:v(i,r.data)},curated:{path:v(i,r.curated)},memory:{retention:{...w},lessons:{...e},consolidation:{...b},supersession:{...t}},logging:{errorDetails:!1},onboardDir:v(i,r.onboard),stateDir:v(i,r.state)};return a.indexMode=U(a),a}function q(e,t){let n=e.configVersion??0;if(n>=1)return e;if(n<1)for(let t of e.sources){t.excludePatterns=t.excludePatterns??[];let e=new Set(t.excludePatterns);for(let n of G)e.has(n)||t.excludePatterns.push(n)}e.configVersion=1;try{m(t,`${JSON.stringify(e,null,2)}\n`,`utf-8`),N.info(`Config auto-upgraded`,{from:n,to:1,configPath:t})}catch(e){N.warn(`Failed to write upgraded config`,{configPath:t,...u(e)})}return e}function J(e,t){if(!d(t))throw Error(`Workspace root does not exist: ${t}`);c(t),N.debug(`Reconfiguring for workspace root`,{workspaceRoot:t});try{process.chdir(t),N.debug(`Changed process cwd to workspace root`,{cwd:process.cwd()})}catch(e){N.warn(`Failed to chdir to workspace root`,{workspaceRoot:t,...u(e)})}e.sources=[{path:t,excludePatterns:e.sources[0]?.excludePatterns??[`node_modules/**`,`dist/**`,`.git/**`,`coverage/**`,`*.lock`,`pnpm-lock.yaml`]}],H(e,t),V(e)}export{G as DEFAULT_EXCLUDE_PATTERNS,S as a,b as i,W as loadConfig,k as n,C as o,A as r,J as reconfigureForWorkspace,U as resolveIndexMode,j as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e,t}from"./server-BZVPmRGV.js";export{t as buildPreludeInjection,e as generatePrelude};
|
|
@@ -1,6 +0,0 @@
|
|
|
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};
|
|
@@ -1,5 +0,0 @@
|
|
|
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};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./server-BZVPmRGV.js";export{e as createSamplingClient};
|