@vpxa/aikit 0.1.383 → 0.1.384

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 (21) hide show
  1. package/package.json +1 -1
  2. package/packages/claude-desktop/dist/manifest.json +1 -1
  3. package/packages/server/dist/bin.js +1 -1
  4. package/packages/server/dist/{config-CQKoGfwD.js → config-BS9mkd50.js} +1 -1
  5. package/packages/server/dist/{config-DX1KYSbN.js → config-CkXCQx7E.js} +1 -1
  6. package/packages/server/dist/{dashboard-static-DdsIJd-u.js → dashboard-static-CVRj5Cbv.js} +1 -1
  7. package/packages/server/dist/{dashboard-static-C6RP0VA7.js → dashboard-static-q97RHnd3.js} +1 -1
  8. package/packages/server/dist/index.js +1 -1
  9. package/packages/server/dist/{register-tools-BGFt0C77.js → register-tools-CCDtIMgE.js} +2 -2
  10. package/packages/server/dist/{register-tools-RwhtWli2.js → register-tools-DLj1eMq3.js} +2 -2
  11. package/packages/server/dist/{server-CJw04C9E.js → server-B6YroA9y.js} +2 -2
  12. package/packages/server/dist/{server-DxiekvQV.js → server-QCZQCfjf.js} +2 -2
  13. package/packages/server/dist/{server-http-CpGB2imV.js → server-http-agZcmQoQ.js} +1 -1
  14. package/packages/server/dist/{server-http-DjE5LRrG.js → server-http-tJ-qTrTX.js} +1 -1
  15. package/packages/server/dist/{server-stdio-BN_gzRqw.js → server-stdio-B0CPUULy.js} +1 -1
  16. package/packages/server/dist/{server-stdio-DTcX2U0-.js → server-stdio-BpzUm6FP.js} +1 -1
  17. package/packages/server/dist/{settings-static-C0oT3Ctk.js → settings-static-HY0egyKG.js} +1 -1
  18. package/packages/server/dist/{settings-static-DVMG47Oh.js → settings-static-VnUkp9iU.js} +1 -1
  19. package/packages/server/dist/startup-maintenance-D7tKqECM.js +21 -0
  20. package/packages/server/dist/{startup-maintenance-kHH8tjds.js → startup-maintenance-QrloHssd.js} +6 -6
  21. package/packages/server/dist/startup-maintenance-cbRSFMY5.js +0 -21
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vpxa/aikit",
3
- "version": "0.1.383",
3
+ "version": "0.1.384",
4
4
  "type": "module",
5
5
  "description": "Local-first AI developer toolkit — knowledge base, code analysis, context management, and developer tools for LLM agents",
6
6
  "license": "MIT",
@@ -2,7 +2,7 @@
2
2
  "manifest_version": "0.3",
3
3
  "name": "aikit",
4
4
  "display_name": "AI Kit",
5
- "version": "0.1.383",
5
+ "version": "0.1.384",
6
6
  "description": "Local-first AI developer toolkit — knowledge base, code analysis, context management, and developer tools for LLM agents",
7
7
  "author": {
8
8
  "name": "AnVPX",
@@ -5,4 +5,4 @@ import{fileURLToPath as e,pathToFileURL as t}from"node:url";import{parseArgs as
5
5
  `).length,fileHash:this.hash(e.content),indexedAt:t,origin:`curated`,tags:e.frontmatter.tags,category:e.frontmatter.category,version:e.frontmatter.version}});try{return await this.store.upsert(i,r),e.length}catch(t){z.error(`Failed to upsert curated batch`,{batchSize:e.length,...o(t)});for(let t of e)n.push(`${t.relativePath}: upsert failed`);return 0}}catch(r){if(e.length===1)return z.error(`Failed to embed curated item`,{relativePath:e[0].relativePath,...o(r)}),n.push(`${e[0].relativePath}: reindex failed`),0;z.warn(`Curated embed batch failed, retrying with smaller chunks`,{batchSize:e.length,...o(r)});let i=Math.ceil(e.length/2),a=e.slice(0,i),s=e.slice(i);return await this.embedAndUpsertBatch(a,t,n)+await this.embedAndUpsertBatch(s,t,n)}}gitCommitKnowledge(e,t,n){try{if(!b(this.curatedDir))return;let r=this.knowledgeRefForPath(e);if(!r)return;x(r,`entry.md`,t,n,this.curatedDir)}catch{}}gitDeleteKnowledgeRef(e){try{if(!b(this.curatedDir))return;let t=this.knowledgeRefForPath(e);if(!t)return;S([`update-ref`,`-d`,t],this.curatedDir)}catch{}}knowledgeRefForPath(e){let t=e.replace(/\.md$/,``).split(`/`).map(e=>C(e)).join(`/`);return t.split(`/`).every(e=>y.test(e))?`${R}/${t}`:null}async indexCuratedFile(e,t,n){let r=await this.embedder.embed(t),i=`.ai/curated/${e}`,a=new Date().toISOString(),o={id:this.hashId(i,0),content:t,sourcePath:i,contentType:`curated-knowledge`,headingPath:n.title,chunkIndex:0,totalChunks:1,startLine:1,endLine:t.split(`
6
6
  `).length,fileHash:this.hash(t),indexedAt:a,origin:`curated`,tags:n.tags,category:n.category,version:n.version};await this.store.upsert([o],[r])}async indexCuratedFileBestEffort(e,t,n,i){if(r.instance().isDegraded(`embedder`)){z.debug(`Skipping vector indexing — embedder degraded`,{relativePath:e,operation:i,subsystem:`embedder`});return}try{await this.indexCuratedFile(e,t,n)}catch(t){z.warn(`Curated file persisted but vector indexing deferred`,{relativePath:e,operation:i,...o(t)})}}async discoverCategories(){return this.adapter.listDirectories()}guardPath(e){let t=e.replace(/^\.ai\/curated\//,``);if(t.endsWith(`.md`)||(t+=`.md`),t.includes(`..`)||l(t))throw Error(`Invalid path: ${t}. Must be relative within .ai/curated/ directory.`);let n=t.split(`/`)[0];return this.validateCategoryName(n),t}validateCategoryName(e){if(!/^[a-z][a-z0-9-]*$/.test(e))throw Error(`Invalid category name: "${e}". Must be lowercase kebab-case (e.g., "decisions", "api-contracts").`)}validateContentSize(e){if(Buffer.byteLength(e,`utf-8`)>L)throw Error(`Content exceeds maximum size of ${L/1024}KB`)}slugify(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-|-$/g,``).slice(0,80)}normalizeTags(e){return[...new Set(e.map(e=>e.trim()).filter(Boolean))]}sameTags(e,t){if(e.length!==t.length)return!1;let n=new Set(e);return t.every(e=>n.has(e))}ensureCategoryPath(e,t){if(!e.startsWith(`${t}/`))throw Error(`Curated path "${e}" must stay within category "${t}"`)}async uniqueRelativePath(e,t){let n=`${e}/${t}.md`;if(!await this.adapter.exists(n))return n;for(let n=2;n<=100;n++){let r=`${e}/${t}-${n}.md`;if(!await this.adapter.exists(r))return r}throw Error(`Too many entries with slug "${t}" in category "${e}"`)}hash(e){return v(`sha256`).update(e).digest(`hex`).slice(0,16)}hashId(e,t){return this.hash(`${e}::${t}`)}serializeFile(e,t){return`${[`---`,`title: "${t.title.replace(/"/g,`\\"`)}"`,`category: ${t.category}`,`tags: [${t.tags.map(e=>`"${e}"`).join(`, `)}]`,`created: ${t.created}`,`updated: ${t.updated}`,`version: ${t.version}`,`origin: ${t.origin}`,`changelog:`,...t.changelog.map(e=>` - version: ${e.version}\n date: ${e.date}\n reason: "${e.reason.replace(/"/g,`\\"`)}"`),`---`].join(`
7
7
  `)}\n\n${e}\n`}parseFile(e){let t=e.match(/^---\n([\s\S]*?)\n---\n\n?([\s\S]*)$/);if(!t)return{frontmatter:{title:`Untitled`,category:`notes`,tags:[],created:``,updated:``,version:1,origin:`curated`,changelog:[]},content:e};let n=t[1],r=t[2].trim(),i={},a=[],o=n.split(`
8
- `),s=!1,c={};for(let e of o){if(/^changelog:\s*$/.test(e)){s=!0;continue}if(s){let t=e.match(/^\s+-\s+version:\s*(\d+)$/);if(t){c.version!=null&&a.push(c),c={version:parseInt(t[1],10)};continue}let n=e.match(/^\s+date:\s*(.+)$/);if(n){c.date=n[1].trim();continue}let r=e.match(/^\s+reason:\s*"?(.*?)"?\s*$/);if(r){c.reason=r[1];continue}/^\w/.test(e)&&(s=!1,c.version!=null&&a.push(c),c={});continue}let t=e.match(/^(\w+):\s*(.*)$/);if(t){let e=t[1],n=t[2];typeof n==`string`&&n.startsWith(`[`)&&n.endsWith(`]`)?n=n.slice(1,-1).split(`,`).map(e=>e.trim().replace(/^"|"$/g,``)).filter(e=>e.length>0):typeof n==`string`&&/^\d+$/.test(n)?n=parseInt(n,10):typeof n==`string`&&n.startsWith(`"`)&&n.endsWith(`"`)&&(n=n.slice(1,-1)),i[e]=n}}return c.version!=null&&a.push(c),{frontmatter:{title:i.title??`Untitled`,category:i.category??`notes`,tags:i.tags??[],created:i.created??``,updated:i.updated??``,version:i.version??1,origin:`curated`,changelog:a},content:r}}};const V=i(`server`);function H(e,t){return t?{version:e,...o(t)}:{version:e}}function U(){return process.env.AIKIT_TRANSPORT?process.env.AIKIT_TRANSPORT:process.stdin.isTTY?`http`:`stdio`}function W(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===t(e).href}catch{return!1}}function G(){return W()?n({allowPositionals:!0,options:{transport:{type:`string`,default:U()},port:{type:`string`,default:process.env.AIKIT_PORT??`3210`}}}).values:{transport:U(),port:process.env.AIKIT_PORT??`3210`}}async function K(){let e=t=>{t.name===`ExperimentalWarning`&&t.message.includes(`SQLite`)||(process.off(`warning`,e),process.emitWarning(t),process.on(`warning`,e))};process.on(`warning`,e);let t=w(),n=G();if(process.on(`unhandledRejection`,e=>{V.error(`Unhandled rejection`,H(t,e))}),process.on(`uncaughtException`,e=>{V.error(`Uncaught exception — exiting`,H(t,e)),process.exit(1)}),V.info(`Starting MCP AI Kit server`,{version:t}),n.transport===`http`){let{startHttpMode:e}=await import(`./server-http-DjE5LRrG.js`);await e(t,n.port)}else{let{startStdioMode:e}=await import(`./server-stdio-BN_gzRqw.js`);await e(t)}}K();export{T as a,k as i,I as n,E as o,F as r,O as s,B as t};
8
+ `),s=!1,c={};for(let e of o){if(/^changelog:\s*$/.test(e)){s=!0;continue}if(s){let t=e.match(/^\s+-\s+version:\s*(\d+)$/);if(t){c.version!=null&&a.push(c),c={version:parseInt(t[1],10)};continue}let n=e.match(/^\s+date:\s*(.+)$/);if(n){c.date=n[1].trim();continue}let r=e.match(/^\s+reason:\s*"?(.*?)"?\s*$/);if(r){c.reason=r[1];continue}/^\w/.test(e)&&(s=!1,c.version!=null&&a.push(c),c={});continue}let t=e.match(/^(\w+):\s*(.*)$/);if(t){let e=t[1],n=t[2];typeof n==`string`&&n.startsWith(`[`)&&n.endsWith(`]`)?n=n.slice(1,-1).split(`,`).map(e=>e.trim().replace(/^"|"$/g,``)).filter(e=>e.length>0):typeof n==`string`&&/^\d+$/.test(n)?n=parseInt(n,10):typeof n==`string`&&n.startsWith(`"`)&&n.endsWith(`"`)&&(n=n.slice(1,-1)),i[e]=n}}return c.version!=null&&a.push(c),{frontmatter:{title:i.title??`Untitled`,category:i.category??`notes`,tags:i.tags??[],created:i.created??``,updated:i.updated??``,version:i.version??1,origin:`curated`,changelog:a},content:r}}};const V=i(`server`);function H(e,t){return t?{version:e,...o(t)}:{version:e}}function U(){return process.env.AIKIT_TRANSPORT?process.env.AIKIT_TRANSPORT:process.stdin.isTTY?`http`:`stdio`}function W(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===t(e).href}catch{return!1}}function G(){return W()?n({allowPositionals:!0,options:{transport:{type:`string`,default:U()},port:{type:`string`,default:process.env.AIKIT_PORT??`3210`}}}).values:{transport:U(),port:process.env.AIKIT_PORT??`3210`}}async function K(){let e=t=>{t.name===`ExperimentalWarning`&&t.message.includes(`SQLite`)||(process.off(`warning`,e),process.emitWarning(t),process.on(`warning`,e))};process.on(`warning`,e);let t=w(),n=G();if(process.on(`unhandledRejection`,e=>{V.error(`Unhandled rejection`,H(t,e))}),process.on(`uncaughtException`,e=>{V.error(`Uncaught exception — exiting`,H(t,e)),process.exit(1)}),V.info(`Starting MCP AI Kit server`,{version:t}),n.transport===`http`){let{startHttpMode:e}=await import(`./server-http-tJ-qTrTX.js`);await e(t,n.port)}else{let{startStdioMode:e}=await import(`./server-stdio-B0CPUULy.js`);await e(t)}}K();export{T as a,k as i,I as n,E as o,F as r,O as s,B as t};
@@ -1 +1 @@
1
- import{D as e,I as t,K as n,M as r}from"./startup-maintenance-kHH8tjds.js";import{fileURLToPath as i}from"node:url";import{AIKIT_RUNTIME_PATHS as a,DEFAULT_SERVER_NAME as o,EMBEDDING_DEFAULTS as s,computePartitionKey as c,createLogger as l,getPartitionDir as u,migrateLegacyWorkspaceLayout as d,safeCwd as f,serializeError as p}from"../../core/dist/index.js";import{existsSync as m,mkdirSync as h,readFileSync as g,writeFileSync as _}from"node:fs";import{dirname as v,isAbsolute as y,relative as b,resolve as x}from"node:path";import{homedir as S}from"node:os";const C=v(i(import.meta.url)),w=l(`server`),T=[`auto`,`manual`,`smart`],E={model:s.model,dimensions:s.dimensions,childProcess:!0,idleTimeoutMs:3e5};function D(e){return typeof e==`string`&&T.includes(e)}function O(e,t,n){let r=x(e),i=b(x(t),r);if(i.startsWith(`..`)||y(i))throw Error(`Config ${n} path escapes allowed root: ${e} is not under ${t}`);return r}function k(e,t){let n=x(e),r=b(x(t),n);return!(r.startsWith(`..`)||y(r))}function A(e){return u(c(e))}function j(e,t,n,r,i){let a=r?x(t,r):t;if(!n)return O(a,t,i);let o=x(e,n);return k(o,t)?r&&x(o)===x(t)?O(a,t,i):O(o,t,i):O(a,t,i)}function M(e){let t=[e.store?.path,e.curated?.path,e.onboardDir,e.stateDir,e.skillDir];for(let e of t)e&&h(e,{recursive:!0})}function N(e,t){d(t);let n=A(t);e.store={...e.store,path:j(t,n,e.store?.path,a.data,`store`)},e.curated={...e.curated,path:j(t,n,e.curated?.path,a.curated,`curated`)},e.onboardDir=j(t,n,e.onboardDir,a.onboard,`onboard`),e.stateDir=j(t,n,e.stateDir,a.state,`state`),e.skillDir=j(t,n,e.skillDir,a.skills,`skillDir`)}function P(e){let t=process.env.AIKIT_INDEX_MODE;if(D(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 F(){let i=f(),a=process.env.AIKIT_CONFIG_PATH??(i&&m(x(i,`aikit.config.json`))?x(i,`aikit.config.json`):x(C,`..`,`..`,`..`,`aikit.config.json`));try{if(!m(a))return w.info(`No config file found, using defaults`,{configPath:a}),L();let i=g(a,`utf-8`),o=JSON.parse(i),s={...E,...o.embedding};if(o.embedding=s,o.memory={retention:{...r,...o.memory?.retention},lessons:{...t,...o.memory?.lessons},consolidation:{...n,...o.memory?.consolidation},supersession:{...e,...o.memory?.supersession}},o.logging?.errorDetails!==void 0&&typeof o.logging.errorDetails!=`boolean`)throw Error(`Config logging.errorDetails must be a boolean`);if(o.logging={errorDetails:o.logging?.errorDetails===!0},!o.sources||!Array.isArray(o.sources)||o.sources.length===0)throw Error(`Config must have at least one source`);if(!o.store?.path)throw Error(`Config must specify store.path`);if(o.autoIndex!==void 0&&typeof o.autoIndex!=`boolean`)throw Error(`Config autoIndex must be a boolean`);if(o.indexMode!==void 0&&!D(o.indexMode))throw Error(`Config indexMode must be one of: ${T.join(`, `)}`);if(typeof s.model!=`string`||s.model.trim()===``)throw Error(`Config embedding.model must be a non-empty string`);if(s.nativeDim!==void 0&&(!Number.isInteger(s.nativeDim)||s.nativeDim<=0))throw Error(`Config embedding.nativeDim must be a positive integer`);if(s.dimensions!==void 0&&(!Number.isInteger(s.dimensions)||s.dimensions<=0))throw Error(`Config embedding.dimensions must be a positive integer`);if(s.dimensions!==void 0&&s.nativeDim!==void 0&&s.dimensions>s.nativeDim)throw Error(`Config embedding.dimensions must not exceed embedding.nativeDim`);if(s.queryPrefix!==void 0&&typeof s.queryPrefix!=`string`)throw Error(`Config embedding.queryPrefix must be a string`);let c=v(a);return o.sources=o.sources.map(e=>({...e,path:O(x(c,e.path),c,`source`)})),R(o,a),N(o,c),o.layeredKnowledge===void 0&&(o.layeredKnowledge=process.env.AIKIT_LAYERED_KNOWLEDGE===`true`),o.indexMode=P(o),o}catch(e){let t=`Failed to load config from ${a}. ${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`),w.error(`Failed to load config`,{configPath:a,...p(e)}),w.warn(`Falling back to default configuration`,{configPath:a});let n=L();return n.configError=t,n}}const I=[`.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 L(){let i=process.env.AIKIT_WORKSPACE_ROOT??f()??S(),s=A(i),c={sources:[{path:i,excludePatterns:[...I]}],serverName:o,indexing:{chunkSize:800,chunkOverlap:150,minChunkSize:100},embedding:{...E},store:{backend:`sqlite-vec`,path:x(s,a.data)},curated:{path:x(s,a.curated)},memory:{retention:{...r},lessons:{...t},consolidation:{...n},supersession:{...e}},logging:{errorDetails:!1},onboardDir:x(s,a.onboard),stateDir:x(s,a.state)};return c.indexMode=P(c),c}function R(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 I)e.has(n)||t.excludePatterns.push(n)}e.configVersion=1;try{_(t,`${JSON.stringify(e,null,2)}\n`,`utf-8`),w.info(`Config auto-upgraded`,{from:n,to:1,configPath:t})}catch(e){w.warn(`Failed to write upgraded config`,{configPath:t,...p(e)})}return e}function z(e,t){if(!m(t))throw Error(`Workspace root does not exist: ${t}`);d(t),w.debug(`Reconfiguring for workspace root`,{workspaceRoot:t});try{process.chdir(t),w.debug(`Changed process cwd to workspace root`,{cwd:process.cwd()})}catch(e){w.warn(`Failed to chdir to workspace root`,{workspaceRoot:t,...p(e)})}e.sources=[{path:t,excludePatterns:e.sources[0]?.excludePatterns??[`node_modules/**`,`dist/**`,`.git/**`,`coverage/**`,`*.lock`,`pnpm-lock.yaml`]}],N(e,t),M(e)}export{I as DEFAULT_EXCLUDE_PATTERNS,F as loadConfig,z as reconfigureForWorkspace,P as resolveIndexMode};
1
+ import{D as e,I as t,K as n,M as r}from"./startup-maintenance-QrloHssd.js";import{fileURLToPath as i}from"node:url";import{AIKIT_RUNTIME_PATHS as a,DEFAULT_SERVER_NAME as o,EMBEDDING_DEFAULTS as s,computePartitionKey as c,createLogger as l,getPartitionDir as u,migrateLegacyWorkspaceLayout as d,safeCwd as f,serializeError as p}from"../../core/dist/index.js";import{existsSync as m,mkdirSync as h,readFileSync as g,writeFileSync as _}from"node:fs";import{dirname as v,isAbsolute as y,relative as b,resolve as x}from"node:path";import{homedir as S}from"node:os";const C=v(i(import.meta.url)),w=l(`server`),T=[`auto`,`manual`,`smart`],E={model:s.model,dimensions:s.dimensions,childProcess:!0,idleTimeoutMs:3e5};function D(e){return typeof e==`string`&&T.includes(e)}function O(e,t,n){let r=x(e),i=b(x(t),r);if(i.startsWith(`..`)||y(i))throw Error(`Config ${n} path escapes allowed root: ${e} is not under ${t}`);return r}function k(e,t){let n=x(e),r=b(x(t),n);return!(r.startsWith(`..`)||y(r))}function A(e){return u(c(e))}function j(e,t,n,r,i){let a=r?x(t,r):t;if(!n)return O(a,t,i);let o=x(e,n);return k(o,t)?r&&x(o)===x(t)?O(a,t,i):O(o,t,i):O(a,t,i)}function M(e){let t=[e.store?.path,e.curated?.path,e.onboardDir,e.stateDir,e.skillDir];for(let e of t)e&&h(e,{recursive:!0})}function N(e,t){d(t);let n=A(t);e.store={...e.store,path:j(t,n,e.store?.path,a.data,`store`)},e.curated={...e.curated,path:j(t,n,e.curated?.path,a.curated,`curated`)},e.onboardDir=j(t,n,e.onboardDir,a.onboard,`onboard`),e.stateDir=j(t,n,e.stateDir,a.state,`state`),e.skillDir=j(t,n,e.skillDir,a.skills,`skillDir`)}function P(e){let t=process.env.AIKIT_INDEX_MODE;if(D(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 F(){let i=f(),a=process.env.AIKIT_CONFIG_PATH??(i&&m(x(i,`aikit.config.json`))?x(i,`aikit.config.json`):x(C,`..`,`..`,`..`,`aikit.config.json`));try{if(!m(a))return w.info(`No config file found, using defaults`,{configPath:a}),L();let i=g(a,`utf-8`),o=JSON.parse(i),s={...E,...o.embedding};if(o.embedding=s,o.memory={retention:{...r,...o.memory?.retention},lessons:{...t,...o.memory?.lessons},consolidation:{...n,...o.memory?.consolidation},supersession:{...e,...o.memory?.supersession}},o.logging?.errorDetails!==void 0&&typeof o.logging.errorDetails!=`boolean`)throw Error(`Config logging.errorDetails must be a boolean`);if(o.logging={errorDetails:o.logging?.errorDetails===!0},!o.sources||!Array.isArray(o.sources)||o.sources.length===0)throw Error(`Config must have at least one source`);if(!o.store?.path)throw Error(`Config must specify store.path`);if(o.autoIndex!==void 0&&typeof o.autoIndex!=`boolean`)throw Error(`Config autoIndex must be a boolean`);if(o.indexMode!==void 0&&!D(o.indexMode))throw Error(`Config indexMode must be one of: ${T.join(`, `)}`);if(typeof s.model!=`string`||s.model.trim()===``)throw Error(`Config embedding.model must be a non-empty string`);if(s.nativeDim!==void 0&&(!Number.isInteger(s.nativeDim)||s.nativeDim<=0))throw Error(`Config embedding.nativeDim must be a positive integer`);if(s.dimensions!==void 0&&(!Number.isInteger(s.dimensions)||s.dimensions<=0))throw Error(`Config embedding.dimensions must be a positive integer`);if(s.dimensions!==void 0&&s.nativeDim!==void 0&&s.dimensions>s.nativeDim)throw Error(`Config embedding.dimensions must not exceed embedding.nativeDim`);if(s.queryPrefix!==void 0&&typeof s.queryPrefix!=`string`)throw Error(`Config embedding.queryPrefix must be a string`);let c=v(a);return o.sources=o.sources.map(e=>({...e,path:O(x(c,e.path),c,`source`)})),R(o,a),N(o,c),o.layeredKnowledge===void 0&&(o.layeredKnowledge=process.env.AIKIT_LAYERED_KNOWLEDGE===`true`),o.indexMode=P(o),o}catch(e){let t=`Failed to load config from ${a}. ${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`),w.error(`Failed to load config`,{configPath:a,...p(e)}),w.warn(`Falling back to default configuration`,{configPath:a});let n=L();return n.configError=t,n}}const I=[`.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 L(){let i=process.env.AIKIT_WORKSPACE_ROOT??f()??S(),s=A(i),c={sources:[{path:i,excludePatterns:[...I]}],serverName:o,indexing:{chunkSize:800,chunkOverlap:150,minChunkSize:100},embedding:{...E},store:{backend:`sqlite-vec`,path:x(s,a.data)},curated:{path:x(s,a.curated)},memory:{retention:{...r},lessons:{...t},consolidation:{...n},supersession:{...e}},logging:{errorDetails:!1},onboardDir:x(s,a.onboard),stateDir:x(s,a.state)};return c.indexMode=P(c),c}function R(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 I)e.has(n)||t.excludePatterns.push(n)}e.configVersion=1;try{_(t,`${JSON.stringify(e,null,2)}\n`,`utf-8`),w.info(`Config auto-upgraded`,{from:n,to:1,configPath:t})}catch(e){w.warn(`Failed to write upgraded config`,{configPath:t,...p(e)})}return e}function z(e,t){if(!m(t))throw Error(`Workspace root does not exist: ${t}`);d(t),w.debug(`Reconfiguring for workspace root`,{workspaceRoot:t});try{process.chdir(t),w.debug(`Changed process cwd to workspace root`,{cwd:process.cwd()})}catch(e){w.warn(`Failed to chdir to workspace root`,{workspaceRoot:t,...p(e)})}e.sources=[{path:t,excludePatterns:e.sources[0]?.excludePatterns??[`node_modules/**`,`dist/**`,`.git/**`,`coverage/**`,`*.lock`,`pnpm-lock.yaml`]}],N(e,t),M(e)}export{I as DEFAULT_EXCLUDE_PATTERNS,F as loadConfig,z as reconfigureForWorkspace,P as resolveIndexMode};
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{D as e,I as t,K as n,M as r}from"./startup-maintenance-cbRSFMY5.js";import{fileURLToPath as i}from"node:url";import{AIKIT_RUNTIME_PATHS as a,DEFAULT_SERVER_NAME as o,EMBEDDING_DEFAULTS as s,computePartitionKey as c,createLogger as l,getPartitionDir as u,migrateLegacyWorkspaceLayout as d,safeCwd as f,serializeError as p}from"../../core/dist/index.js";import{existsSync as m,mkdirSync as h,readFileSync as g,writeFileSync as _}from"node:fs";import{dirname as v,isAbsolute as y,relative as b,resolve as x}from"node:path";import{homedir as S}from"node:os";const C=v(i(import.meta.url)),w=l(`server`),T=[`auto`,`manual`,`smart`],E={model:s.model,dimensions:s.dimensions,childProcess:!0,idleTimeoutMs:3e5};function D(e){return typeof e==`string`&&T.includes(e)}function O(e,t,n){let r=x(e),i=b(x(t),r);if(i.startsWith(`..`)||y(i))throw Error(`Config ${n} path escapes allowed root: ${e} is not under ${t}`);return r}function k(e,t){let n=x(e),r=b(x(t),n);return!(r.startsWith(`..`)||y(r))}function A(e){return u(c(e))}function j(e,t,n,r,i){let a=r?x(t,r):t;if(!n)return O(a,t,i);let o=x(e,n);return k(o,t)?r&&x(o)===x(t)?O(a,t,i):O(o,t,i):O(a,t,i)}function M(e){let t=[e.store?.path,e.curated?.path,e.onboardDir,e.stateDir,e.skillDir];for(let e of t)e&&h(e,{recursive:!0})}function N(e,t){d(t);let n=A(t);e.store={...e.store,path:j(t,n,e.store?.path,a.data,`store`)},e.curated={...e.curated,path:j(t,n,e.curated?.path,a.curated,`curated`)},e.onboardDir=j(t,n,e.onboardDir,a.onboard,`onboard`),e.stateDir=j(t,n,e.stateDir,a.state,`state`),e.skillDir=j(t,n,e.skillDir,a.skills,`skillDir`)}function P(e){let t=process.env.AIKIT_INDEX_MODE;if(D(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 F(){let i=f(),a=process.env.AIKIT_CONFIG_PATH??(i&&m(x(i,`aikit.config.json`))?x(i,`aikit.config.json`):x(C,`..`,`..`,`..`,`aikit.config.json`));try{if(!m(a))return w.info(`No config file found, using defaults`,{configPath:a}),L();let i=g(a,`utf-8`),o=JSON.parse(i),s={...E,...o.embedding};if(o.embedding=s,o.memory={retention:{...r,...o.memory?.retention},lessons:{...t,...o.memory?.lessons},consolidation:{...n,...o.memory?.consolidation},supersession:{...e,...o.memory?.supersession}},o.logging?.errorDetails!==void 0&&typeof o.logging.errorDetails!=`boolean`)throw Error(`Config logging.errorDetails must be a boolean`);if(o.logging={errorDetails:o.logging?.errorDetails===!0},!o.sources||!Array.isArray(o.sources)||o.sources.length===0)throw Error(`Config must have at least one source`);if(!o.store?.path)throw Error(`Config must specify store.path`);if(o.autoIndex!==void 0&&typeof o.autoIndex!=`boolean`)throw Error(`Config autoIndex must be a boolean`);if(o.indexMode!==void 0&&!D(o.indexMode))throw Error(`Config indexMode must be one of: ${T.join(`, `)}`);if(typeof s.model!=`string`||s.model.trim()===``)throw Error(`Config embedding.model must be a non-empty string`);if(s.nativeDim!==void 0&&(!Number.isInteger(s.nativeDim)||s.nativeDim<=0))throw Error(`Config embedding.nativeDim must be a positive integer`);if(s.dimensions!==void 0&&(!Number.isInteger(s.dimensions)||s.dimensions<=0))throw Error(`Config embedding.dimensions must be a positive integer`);if(s.dimensions!==void 0&&s.nativeDim!==void 0&&s.dimensions>s.nativeDim)throw Error(`Config embedding.dimensions must not exceed embedding.nativeDim`);if(s.queryPrefix!==void 0&&typeof s.queryPrefix!=`string`)throw Error(`Config embedding.queryPrefix must be a string`);let c=v(a);return o.sources=o.sources.map(e=>({...e,path:O(x(c,e.path),c,`source`)})),R(o,a),N(o,c),o.layeredKnowledge===void 0&&(o.layeredKnowledge=process.env.AIKIT_LAYERED_KNOWLEDGE===`true`),o.indexMode=P(o),o}catch(e){let t=`Failed to load config from ${a}. ${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`),w.error(`Failed to load config`,{configPath:a,...p(e)}),w.warn(`Falling back to default configuration`,{configPath:a});let n=L();return n.configError=t,n}}const I=[`.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 L(){let i=process.env.AIKIT_WORKSPACE_ROOT??f()??S(),s=A(i),c={sources:[{path:i,excludePatterns:[...I]}],serverName:o,indexing:{chunkSize:800,chunkOverlap:150,minChunkSize:100},embedding:{...E},store:{backend:`sqlite-vec`,path:x(s,a.data)},curated:{path:x(s,a.curated)},memory:{retention:{...r},lessons:{...t},consolidation:{...n},supersession:{...e}},logging:{errorDetails:!1},onboardDir:x(s,a.onboard),stateDir:x(s,a.state)};return c.indexMode=P(c),c}function R(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 I)e.has(n)||t.excludePatterns.push(n)}e.configVersion=1;try{_(t,`${JSON.stringify(e,null,2)}\n`,`utf-8`),w.info(`Config auto-upgraded`,{from:n,to:1,configPath:t})}catch(e){w.warn(`Failed to write upgraded config`,{configPath:t,...p(e)})}return e}function z(e,t){if(!m(t))throw Error(`Workspace root does not exist: ${t}`);d(t),w.debug(`Reconfiguring for workspace root`,{workspaceRoot:t});try{process.chdir(t),w.debug(`Changed process cwd to workspace root`,{cwd:process.cwd()})}catch(e){w.warn(`Failed to chdir to workspace root`,{workspaceRoot:t,...p(e)})}e.sources=[{path:t,excludePatterns:e.sources[0]?.excludePatterns??[`node_modules/**`,`dist/**`,`.git/**`,`coverage/**`,`*.lock`,`pnpm-lock.yaml`]}],N(e,t),M(e)}export{I as DEFAULT_EXCLUDE_PATTERNS,F as loadConfig,z as reconfigureForWorkspace,P as resolveIndexMode};
2
+ import{D as e,I as t,K as n,M as r}from"./startup-maintenance-D7tKqECM.js";import{fileURLToPath as i}from"node:url";import{AIKIT_RUNTIME_PATHS as a,DEFAULT_SERVER_NAME as o,EMBEDDING_DEFAULTS as s,computePartitionKey as c,createLogger as l,getPartitionDir as u,migrateLegacyWorkspaceLayout as d,safeCwd as f,serializeError as p}from"../../core/dist/index.js";import{existsSync as m,mkdirSync as h,readFileSync as g,writeFileSync as _}from"node:fs";import{dirname as v,isAbsolute as y,relative as b,resolve as x}from"node:path";import{homedir as S}from"node:os";const C=v(i(import.meta.url)),w=l(`server`),T=[`auto`,`manual`,`smart`],E={model:s.model,dimensions:s.dimensions,childProcess:!0,idleTimeoutMs:3e5};function D(e){return typeof e==`string`&&T.includes(e)}function O(e,t,n){let r=x(e),i=b(x(t),r);if(i.startsWith(`..`)||y(i))throw Error(`Config ${n} path escapes allowed root: ${e} is not under ${t}`);return r}function k(e,t){let n=x(e),r=b(x(t),n);return!(r.startsWith(`..`)||y(r))}function A(e){return u(c(e))}function j(e,t,n,r,i){let a=r?x(t,r):t;if(!n)return O(a,t,i);let o=x(e,n);return k(o,t)?r&&x(o)===x(t)?O(a,t,i):O(o,t,i):O(a,t,i)}function M(e){let t=[e.store?.path,e.curated?.path,e.onboardDir,e.stateDir,e.skillDir];for(let e of t)e&&h(e,{recursive:!0})}function N(e,t){d(t);let n=A(t);e.store={...e.store,path:j(t,n,e.store?.path,a.data,`store`)},e.curated={...e.curated,path:j(t,n,e.curated?.path,a.curated,`curated`)},e.onboardDir=j(t,n,e.onboardDir,a.onboard,`onboard`),e.stateDir=j(t,n,e.stateDir,a.state,`state`),e.skillDir=j(t,n,e.skillDir,a.skills,`skillDir`)}function P(e){let t=process.env.AIKIT_INDEX_MODE;if(D(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 F(){let i=f(),a=process.env.AIKIT_CONFIG_PATH??(i&&m(x(i,`aikit.config.json`))?x(i,`aikit.config.json`):x(C,`..`,`..`,`..`,`aikit.config.json`));try{if(!m(a))return w.info(`No config file found, using defaults`,{configPath:a}),L();let i=g(a,`utf-8`),o=JSON.parse(i),s={...E,...o.embedding};if(o.embedding=s,o.memory={retention:{...r,...o.memory?.retention},lessons:{...t,...o.memory?.lessons},consolidation:{...n,...o.memory?.consolidation},supersession:{...e,...o.memory?.supersession}},o.logging?.errorDetails!==void 0&&typeof o.logging.errorDetails!=`boolean`)throw Error(`Config logging.errorDetails must be a boolean`);if(o.logging={errorDetails:o.logging?.errorDetails===!0},!o.sources||!Array.isArray(o.sources)||o.sources.length===0)throw Error(`Config must have at least one source`);if(!o.store?.path)throw Error(`Config must specify store.path`);if(o.autoIndex!==void 0&&typeof o.autoIndex!=`boolean`)throw Error(`Config autoIndex must be a boolean`);if(o.indexMode!==void 0&&!D(o.indexMode))throw Error(`Config indexMode must be one of: ${T.join(`, `)}`);if(typeof s.model!=`string`||s.model.trim()===``)throw Error(`Config embedding.model must be a non-empty string`);if(s.nativeDim!==void 0&&(!Number.isInteger(s.nativeDim)||s.nativeDim<=0))throw Error(`Config embedding.nativeDim must be a positive integer`);if(s.dimensions!==void 0&&(!Number.isInteger(s.dimensions)||s.dimensions<=0))throw Error(`Config embedding.dimensions must be a positive integer`);if(s.dimensions!==void 0&&s.nativeDim!==void 0&&s.dimensions>s.nativeDim)throw Error(`Config embedding.dimensions must not exceed embedding.nativeDim`);if(s.queryPrefix!==void 0&&typeof s.queryPrefix!=`string`)throw Error(`Config embedding.queryPrefix must be a string`);let c=v(a);return o.sources=o.sources.map(e=>({...e,path:O(x(c,e.path),c,`source`)})),R(o,a),N(o,c),o.layeredKnowledge===void 0&&(o.layeredKnowledge=process.env.AIKIT_LAYERED_KNOWLEDGE===`true`),o.indexMode=P(o),o}catch(e){let t=`Failed to load config from ${a}. ${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`),w.error(`Failed to load config`,{configPath:a,...p(e)}),w.warn(`Falling back to default configuration`,{configPath:a});let n=L();return n.configError=t,n}}const I=[`.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 L(){let i=process.env.AIKIT_WORKSPACE_ROOT??f()??S(),s=A(i),c={sources:[{path:i,excludePatterns:[...I]}],serverName:o,indexing:{chunkSize:800,chunkOverlap:150,minChunkSize:100},embedding:{...E},store:{backend:`sqlite-vec`,path:x(s,a.data)},curated:{path:x(s,a.curated)},memory:{retention:{...r},lessons:{...t},consolidation:{...n},supersession:{...e}},logging:{errorDetails:!1},onboardDir:x(s,a.onboard),stateDir:x(s,a.state)};return c.indexMode=P(c),c}function R(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 I)e.has(n)||t.excludePatterns.push(n)}e.configVersion=1;try{_(t,`${JSON.stringify(e,null,2)}\n`,`utf-8`),w.info(`Config auto-upgraded`,{from:n,to:1,configPath:t})}catch(e){w.warn(`Failed to write upgraded config`,{configPath:t,...p(e)})}return e}function z(e,t){if(!m(t))throw Error(`Workspace root does not exist: ${t}`);d(t),w.debug(`Reconfiguring for workspace root`,{workspaceRoot:t});try{process.chdir(t),w.debug(`Changed process cwd to workspace root`,{cwd:process.cwd()})}catch(e){w.warn(`Failed to chdir to workspace root`,{workspaceRoot:t,...p(e)})}e.sources=[{path:t,excludePatterns:e.sources[0]?.excludePatterns??[`node_modules/**`,`dist/**`,`.git/**`,`coverage/**`,`*.lock`,`pnpm-lock.yaml`]}],N(e,t),M(e)}export{I as DEFAULT_EXCLUDE_PATTERNS,F as loadConfig,z as reconfigureForWorkspace,P as resolveIndexMode};
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{w as e}from"./startup-maintenance-cbRSFMY5.js";import{fileURLToPath as t}from"node:url";import{createReadStream as n,existsSync as r,statSync as i}from"node:fs";import{dirname as a,extname as o,join as s,resolve as c,sep as l}from"node:path";const u=import.meta.dirname??a(t(import.meta.url)),d={".html":`text/html`,".js":`application/javascript`,".css":`text/css`,".json":`application/json`,".png":`image/png`,".svg":`image/svg+xml`,".ico":`image/x-icon`,".woff":`font/woff`,".woff2":`font/woff2`};function f(t){return t?s(t,`..`,`..`,`dashboard`,`dist`):e(`dashboard`)??s(u,`..`,`..`,`dashboard`,`dist`)}function p(e,t){let n=t.replace(/^\/_dashboard\/?/,``)||`index.html`;try{n=decodeURIComponent(n)}catch{}let a=c(e,n);if(!(a===e||a.startsWith(`${e}${l}`)))return{kind:`forbidden`};try{if(i(a).isFile())return{kind:`file`,path:a,contentType:d[o(a)]??`application/octet-stream`}}catch{}let u=s(e,`index.html`);return r(u)?{kind:`spa`,path:u,contentType:`text/html`}:{kind:`not-found`}}function m(e,t,i){return r(t)?(e.get(`/_dashboard{/*path}`,(e,r)=>{let i=p(t,e.path);if(i.kind===`forbidden`){r.status(403).end(`Forbidden`);return}if(i.kind===`not-found`){r.status(404).end(`Not found`);return}r.setHeader(`Content-Type`,i.contentType),i.kind===`file`&&/\.[a-f0-9]{8,}\.(js|css)$/i.test(i.path)?r.setHeader(`Cache-Control`,`public, max-age=31536000, immutable`):r.setHeader(`Cache-Control`,`no-cache`),n(i.path).pipe(r)}),i.info(`Dashboard available`,{url:`/_dashboard/`,dir:t}),!0):!1}export{m as registerDashboardRoutes,f as resolveDashboardDir,p as resolveDashboardRequest};
2
+ import{w as e}from"./startup-maintenance-D7tKqECM.js";import{fileURLToPath as t}from"node:url";import{createReadStream as n,existsSync as r,statSync as i}from"node:fs";import{dirname as a,extname as o,join as s,resolve as c,sep as l}from"node:path";const u=import.meta.dirname??a(t(import.meta.url)),d={".html":`text/html`,".js":`application/javascript`,".css":`text/css`,".json":`application/json`,".png":`image/png`,".svg":`image/svg+xml`,".ico":`image/x-icon`,".woff":`font/woff`,".woff2":`font/woff2`};function f(t){return t?s(t,`..`,`..`,`dashboard`,`dist`):e(`dashboard`)??s(u,`..`,`..`,`dashboard`,`dist`)}function p(e,t){let n=t.replace(/^\/_dashboard\/?/,``)||`index.html`;try{n=decodeURIComponent(n)}catch{}let a=c(e,n);if(!(a===e||a.startsWith(`${e}${l}`)))return{kind:`forbidden`};try{if(i(a).isFile())return{kind:`file`,path:a,contentType:d[o(a)]??`application/octet-stream`}}catch{}let u=s(e,`index.html`);return r(u)?{kind:`spa`,path:u,contentType:`text/html`}:{kind:`not-found`}}function m(e,t,i){return r(t)?(e.get(`/_dashboard{/*path}`,(e,r)=>{let i=p(t,e.path);if(i.kind===`forbidden`){r.status(403).end(`Forbidden`);return}if(i.kind===`not-found`){r.status(404).end(`Not found`);return}r.setHeader(`Content-Type`,i.contentType),i.kind===`file`&&/\.[a-f0-9]{8,}\.(js|css)$/i.test(i.path)?r.setHeader(`Cache-Control`,`public, max-age=31536000, immutable`):r.setHeader(`Cache-Control`,`no-cache`),n(i.path).pipe(r)}),i.info(`Dashboard available`,{url:`/_dashboard/`,dir:t}),!0):!1}export{m as registerDashboardRoutes,f as resolveDashboardDir,p as resolveDashboardRequest};
@@ -1 +1 @@
1
- import{w as e}from"./startup-maintenance-kHH8tjds.js";import{fileURLToPath as t}from"node:url";import{createReadStream as n,existsSync as r,statSync as i}from"node:fs";import{dirname as a,extname as o,join as s,resolve as c,sep as l}from"node:path";const u=import.meta.dirname??a(t(import.meta.url)),d={".html":`text/html`,".js":`application/javascript`,".css":`text/css`,".json":`application/json`,".png":`image/png`,".svg":`image/svg+xml`,".ico":`image/x-icon`,".woff":`font/woff`,".woff2":`font/woff2`};function f(t){return t?s(t,`..`,`..`,`dashboard`,`dist`):e(`dashboard`)??s(u,`..`,`..`,`dashboard`,`dist`)}function p(e,t){let n=t.replace(/^\/_dashboard\/?/,``)||`index.html`;try{n=decodeURIComponent(n)}catch{}let a=c(e,n);if(!(a===e||a.startsWith(`${e}${l}`)))return{kind:`forbidden`};try{if(i(a).isFile())return{kind:`file`,path:a,contentType:d[o(a)]??`application/octet-stream`}}catch{}let u=s(e,`index.html`);return r(u)?{kind:`spa`,path:u,contentType:`text/html`}:{kind:`not-found`}}function m(e,t,i){return r(t)?(e.get(`/_dashboard{/*path}`,(e,r)=>{let i=p(t,e.path);if(i.kind===`forbidden`){r.status(403).end(`Forbidden`);return}if(i.kind===`not-found`){r.status(404).end(`Not found`);return}r.setHeader(`Content-Type`,i.contentType),i.kind===`file`&&/\.[a-f0-9]{8,}\.(js|css)$/i.test(i.path)?r.setHeader(`Cache-Control`,`public, max-age=31536000, immutable`):r.setHeader(`Cache-Control`,`no-cache`),n(i.path).pipe(r)}),i.info(`Dashboard available`,{url:`/_dashboard/`,dir:t}),!0):!1}export{m as registerDashboardRoutes,f as resolveDashboardDir,p as resolveDashboardRequest};
1
+ import{w as e}from"./startup-maintenance-QrloHssd.js";import{fileURLToPath as t}from"node:url";import{createReadStream as n,existsSync as r,statSync as i}from"node:fs";import{dirname as a,extname as o,join as s,resolve as c,sep as l}from"node:path";const u=import.meta.dirname??a(t(import.meta.url)),d={".html":`text/html`,".js":`application/javascript`,".css":`text/css`,".json":`application/json`,".png":`image/png`,".svg":`image/svg+xml`,".ico":`image/x-icon`,".woff":`font/woff`,".woff2":`font/woff2`};function f(t){return t?s(t,`..`,`..`,`dashboard`,`dist`):e(`dashboard`)??s(u,`..`,`..`,`dashboard`,`dist`)}function p(e,t){let n=t.replace(/^\/_dashboard\/?/,``)||`index.html`;try{n=decodeURIComponent(n)}catch{}let a=c(e,n);if(!(a===e||a.startsWith(`${e}${l}`)))return{kind:`forbidden`};try{if(i(a).isFile())return{kind:`file`,path:a,contentType:d[o(a)]??`application/octet-stream`}}catch{}let u=s(e,`index.html`);return r(u)?{kind:`spa`,path:u,contentType:`text/html`}:{kind:`not-found`}}function m(e,t,i){return r(t)?(e.get(`/_dashboard{/*path}`,(e,r)=>{let i=p(t,e.path);if(i.kind===`forbidden`){r.status(403).end(`Forbidden`);return}if(i.kind===`not-found`){r.status(404).end(`Not found`);return}r.setHeader(`Content-Type`,i.contentType),i.kind===`file`&&/\.[a-f0-9]{8,}\.(js|css)$/i.test(i.path)?r.setHeader(`Cache-Control`,`public, max-age=31536000, immutable`):r.setHeader(`Cache-Control`,`no-cache`),n(i.path).pipe(r)}),i.info(`Dashboard available`,{url:`/_dashboard/`,dir:t}),!0):!1}export{m as registerDashboardRoutes,f as resolveDashboardDir,p as resolveDashboardRequest};
@@ -351,4 +351,4 @@ svg text{fill:var(--body);font-family:var(--sans);font-size:12px}
351
351
  <\/script>
352
352
  </body>
353
353
  </html>`}const U=`<!-- DIAGRAM:SVG -->`;function W(e){let t=e.indexOf(U);if(t===-1)return null;let n=t+20,r=e.indexOf(U,n);if(r===-1)return null;let i=e.slice(n,r).trim();if(i.startsWith(`<svg`))return i;let a=e.slice(Math.max(0,t),r+20),o=a.match(/viewBox="([^"]+)"/),s=o?o[1]:`0 0 1200 800`,c=a.match(/width="(\d+)"/),l=c?c[1]:`1200`,u=a.match(/height="(\d+)"/);return[`<svg xmlns="http://www.w3.org/2000/svg" viewBox="${s}" width="${l}" height="${u?u[1]:`800`}">`,` <defs>`,` <style>`,` text { font-family: system-ui, -apple-system, sans-serif; }`,` .title { font-size: 20px; font-weight: 600; fill: #fff; }`,` .subtitle { font-size: 14px; fill: #94a3b8; }`,` </style>`,` </defs>`,i,`</svg>`].join(`
354
- `)}function he(e){let t=e.match(/<title>([^<]+)<\/title>/);return t?t[1]:`diagram`}async function ge(e,t,n){let r=m(n);await h(r,{recursive:!0});let i=he(e).replace(/[^a-zA-Z0-9\s-]/g,``).replace(/\s+/g,`-`).replace(/-+/g,`-`).replace(/^-|-$/g,``).toLowerCase().slice(0,80)||`diagram`,a=p(r,`${i}.html`);await g(a,e,`utf-8`);let o=null,s=W(e);s&&(o=p(r,`${i}.svg`),await g(o,s,`utf-8`));let c=null;return t&&(c=p(r,`${i}.md`),await g(c,t,`utf-8`)),{htmlPath:a,svgPath:o,mdPath:c}}const G=10*1024*1024,K=2e3;function _e(e){try{return JSON.stringify(e)}catch{return``}}function ve(e){switch(e.diagram_type){case`architecture`:return ae(e);case`workflow`:return H(e);case`sequence`:return R(e);case`dataflow`:return ce(e);case`lifecycle`:return P(e)}}function q(e,t={}){Y(e);let n=J(e);if(n.length>0)throw Error(`Diagram validation failed: ${n.join(`; `)}`);let r=t.title??e.meta.title,i=t.subtitle??e.meta.subtitle,a=t.dualOutput??!0,{svg:o,cardsHtml:s,detailData:c}=ve(e),l=c&&Object.keys(c).length>0?`\n<script id="diagram-node-data" type="application/json">${_e(c)}<\/script>`:``,u=e.meta?.palette===`warm`?`warm`:`technical`;return{html:me().replaceAll(`[TITLE]`,X(r)).replaceAll(`[SUBTITLE]`,X(i??``)).replaceAll(`[PALETTE]`,u===`warm`?` data-palette="warm"`:``).replaceAll(`<!-- DIAGRAM:SVG -->`,o).replaceAll(`<!-- DIAGRAM:CARDS -->`,s).replace(`</body>`,`${l}\n</body>`),markdown:a?_(e):void 0}}function ye(e,t={}){return q(e,{...t,dualOutput:!1}).html}function be(e){return _(e)}function xe(e){try{return Y(e),J(e)}catch(e){return[e.message]}}function J(e){if(!e||typeof e!=`object`)return[`Input must be an object`];if(!e.diagram_type)return[`Missing diagram_type`];if(!e.meta?.title)return[`meta.title is required`];if(e.schema_version!==1)return[`schema_version must be 1`];let t=e.diagram_type,n=e,r=n.components??n.nodes??n.participants??n.states??[],i=n.connections??n.edges??n.messages??n.flows??n.transitions??[],a=new Set(r.map(e=>e.id));if(a.size!==r.length)return[`${t}: Node/component IDs must be unique`];for(let e of i){if(e.from&&!a.has(e.from))return[`${t}: Edge references unknown source "${e.from}"`];if(e.to&&!a.has(e.to))return[`${t}: Edge references unknown target "${e.to}"`]}return[]}function Y(e){let t=JSON.stringify(e),n=Buffer.byteLength(t,`utf-8`);if(n>G)throw Error(`Input too large: ${(n/1024/1024).toFixed(1)}MB (max ${G/1024/1024}MB)`);let r=e,i=r.components??r.nodes??r.participants??[];if(i.length>500)throw Error(`Too many components/nodes: ${i.length} (max 500)`);let a=r.connections??r.edges??r.messages??r.flows??r.transitions??[];if(a.length>K)throw Error(`Too many edges/connections: ${a.length} (max ${K})`)}function Se(e){return e.replace(/[^a-zA-Z0-9-_]/g,`_`).toLowerCase().slice(0,120)}function X(e){let t={"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`};return String(e??``).replace(/[&<>"']/g,e=>t[e]??e)}const Z=d(`server`);function Q(e,t){return t?{version:e,...f(t)}:{version:e}}function $(){return process.env.AIKIT_TRANSPORT?process.env.AIKIT_TRANSPORT:process.stdin.isTTY?`http`:`stdio`}function Ce(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===l(e).href}catch{return!1}}function we(){return Ce()?u({allowPositionals:!0,options:{transport:{type:`string`,default:$()},port:{type:`string`,default:process.env.AIKIT_PORT??`3210`}}}).values:{transport:$(),port:process.env.AIKIT_PORT??`3210`}}async function Te(){let e=t=>{t.name===`ExperimentalWarning`&&t.message.includes(`SQLite`)||(process.off(`warning`,e),process.emitWarning(t),process.on(`warning`,e))};process.on(`warning`,e);let n=t(),r=we();if(process.on(`unhandledRejection`,e=>{Z.error(`Unhandled rejection`,Q(n,e))}),process.on(`uncaughtException`,e=>{Z.error(`Uncaught exception — exiting`,Q(n,e)),process.exit(1)}),Z.info(`Starting MCP AI Kit server`,{version:n}),r.transport===`http`){let{startHttpMode:e}=await import(`./server-http-CpGB2imV.js`);await e(n,r.port)}else{let{startStdioMode:e}=await import(`./server-stdio-DTcX2U0-.js`);await e(n)}}export{c as CuratedKnowledgeManager,s as applyWorkspaceRoots,a as bootstrapWorkspaceRoots,i as createSlidingWindowRateLimiter,ge as exportDiagram,W as extractSvg,n as getSessionIdHeader,Te as main,r as readPositiveIntEnv,t as readVersion,ye as renderHtml,be as renderMd,q as renderToResult,e as resolveCorsOrigin,Se as sanitizeTitle,o as selectWorkspaceRoot,xe as validate};
354
+ `)}function he(e){let t=e.match(/<title>([^<]+)<\/title>/);return t?t[1]:`diagram`}async function ge(e,t,n){let r=m(n);await h(r,{recursive:!0});let i=he(e).replace(/[^a-zA-Z0-9\s-]/g,``).replace(/\s+/g,`-`).replace(/-+/g,`-`).replace(/^-|-$/g,``).toLowerCase().slice(0,80)||`diagram`,a=p(r,`${i}.html`);await g(a,e,`utf-8`);let o=null,s=W(e);s&&(o=p(r,`${i}.svg`),await g(o,s,`utf-8`));let c=null;return t&&(c=p(r,`${i}.md`),await g(c,t,`utf-8`)),{htmlPath:a,svgPath:o,mdPath:c}}const G=10*1024*1024,K=2e3;function _e(e){try{return JSON.stringify(e)}catch{return``}}function ve(e){switch(e.diagram_type){case`architecture`:return ae(e);case`workflow`:return H(e);case`sequence`:return R(e);case`dataflow`:return ce(e);case`lifecycle`:return P(e)}}function q(e,t={}){Y(e);let n=J(e);if(n.length>0)throw Error(`Diagram validation failed: ${n.join(`; `)}`);let r=t.title??e.meta.title,i=t.subtitle??e.meta.subtitle,a=t.dualOutput??!0,{svg:o,cardsHtml:s,detailData:c}=ve(e),l=c&&Object.keys(c).length>0?`\n<script id="diagram-node-data" type="application/json">${_e(c)}<\/script>`:``,u=e.meta?.palette===`warm`?`warm`:`technical`;return{html:me().replaceAll(`[TITLE]`,X(r)).replaceAll(`[SUBTITLE]`,X(i??``)).replaceAll(`[PALETTE]`,u===`warm`?` data-palette="warm"`:``).replaceAll(`<!-- DIAGRAM:SVG -->`,o).replaceAll(`<!-- DIAGRAM:CARDS -->`,s).replace(`</body>`,`${l}\n</body>`),markdown:a?_(e):void 0}}function ye(e,t={}){return q(e,{...t,dualOutput:!1}).html}function be(e){return _(e)}function xe(e){try{return Y(e),J(e)}catch(e){return[e.message]}}function J(e){if(!e||typeof e!=`object`)return[`Input must be an object`];if(!e.diagram_type)return[`Missing diagram_type`];if(!e.meta?.title)return[`meta.title is required`];if(e.schema_version!==1)return[`schema_version must be 1`];let t=e.diagram_type,n=e,r=n.components??n.nodes??n.participants??n.states??[],i=n.connections??n.edges??n.messages??n.flows??n.transitions??[],a=new Set(r.map(e=>e.id));if(a.size!==r.length)return[`${t}: Node/component IDs must be unique`];for(let e of i){if(e.from&&!a.has(e.from))return[`${t}: Edge references unknown source "${e.from}"`];if(e.to&&!a.has(e.to))return[`${t}: Edge references unknown target "${e.to}"`]}return[]}function Y(e){let t=JSON.stringify(e),n=Buffer.byteLength(t,`utf-8`);if(n>G)throw Error(`Input too large: ${(n/1024/1024).toFixed(1)}MB (max ${G/1024/1024}MB)`);let r=e,i=r.components??r.nodes??r.participants??[];if(i.length>500)throw Error(`Too many components/nodes: ${i.length} (max 500)`);let a=r.connections??r.edges??r.messages??r.flows??r.transitions??[];if(a.length>K)throw Error(`Too many edges/connections: ${a.length} (max ${K})`)}function Se(e){return e.replace(/[^a-zA-Z0-9-_]/g,`_`).toLowerCase().slice(0,120)}function X(e){let t={"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`};return String(e??``).replace(/[&<>"']/g,e=>t[e]??e)}const Z=d(`server`);function Q(e,t){return t?{version:e,...f(t)}:{version:e}}function $(){return process.env.AIKIT_TRANSPORT?process.env.AIKIT_TRANSPORT:process.stdin.isTTY?`http`:`stdio`}function Ce(){let e=process.argv[1];if(!e)return!1;try{return import.meta.url===l(e).href}catch{return!1}}function we(){return Ce()?u({allowPositionals:!0,options:{transport:{type:`string`,default:$()},port:{type:`string`,default:process.env.AIKIT_PORT??`3210`}}}).values:{transport:$(),port:process.env.AIKIT_PORT??`3210`}}async function Te(){let e=t=>{t.name===`ExperimentalWarning`&&t.message.includes(`SQLite`)||(process.off(`warning`,e),process.emitWarning(t),process.on(`warning`,e))};process.on(`warning`,e);let n=t(),r=we();if(process.on(`unhandledRejection`,e=>{Z.error(`Unhandled rejection`,Q(n,e))}),process.on(`uncaughtException`,e=>{Z.error(`Uncaught exception — exiting`,Q(n,e)),process.exit(1)}),Z.info(`Starting MCP AI Kit server`,{version:n}),r.transport===`http`){let{startHttpMode:e}=await import(`./server-http-agZcmQoQ.js`);await e(n,r.port)}else{let{startStdioMode:e}=await import(`./server-stdio-BpzUm6FP.js`);await e(n)}}export{c as CuratedKnowledgeManager,s as applyWorkspaceRoots,a as bootstrapWorkspaceRoots,i as createSlidingWindowRateLimiter,ge as exportDiagram,W as extractSvg,n as getSessionIdHeader,Te as main,r as readPositiveIntEnv,t as readVersion,ye as renderHtml,be as renderMd,q as renderToResult,e as resolveCorsOrigin,Se as sanitizeTitle,o as selectWorkspaceRoot,xe as validate};
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{A as e,B as t,C as n,E as r,F as i,G as a,H as o,I as s,J as c,K as l,L as u,N as d,O as f,P as p,R as m,S as h,T as g,U as _,V as v,W as y,_ as b,b as x,c as S,d as C,g as w,h as T,i as E,j as D,k as ee,l as O,o as te,p as ne,q as re,r as ie,v as k,y as ae,z as oe}from"./startup-maintenance-cbRSFMY5.js";import{t as se}from"./bin.js";import{createRequire as ce}from"node:module";import{fileURLToPath as le}from"node:url";import{promisify as ue}from"node:util";import{AIKIT_GLOBAL_PATHS as de,AIKIT_RUNTIME_PATHS as fe,CONTENT_TYPES as pe,CircuitBreaker as me,HealthBus as he,KNOWLEDGE_ORIGINS as ge,SOURCE_TYPES as _e,TOKEN_BUDGETS as ve,computePartitionKey as ye,createLogger as A,getGlobalDataDir as be,getPartitionDir as xe,hashPath as Se,isUserInstalled as Ce,listWorkspaces as we,safeCwd as j,safeCwdOrHome as Te,serializeError as M}from"../../core/dist/index.js";import{copyFileSync as Ee,existsSync as N,mkdirSync as De,readFileSync as P,readdirSync as Oe,renameSync as ke,rmSync as Ae,statSync as je,unlinkSync as Me,writeFileSync as Ne}from"node:fs";import{basename as Pe,dirname as Fe,isAbsolute as Ie,join as F,relative as Le,resolve as I,sep as Re}from"node:path";import{mkdir as ze,readFile as Be,readdir as Ve,rm as He,stat as Ue,unlink as We,writeFile as Ge}from"node:fs/promises";import{createHash as Ke,randomBytes as qe,randomUUID as Je,timingSafeEqual as Ye}from"node:crypto";import{WORKSPACE_SKILL_FILENAME as Xe,acquireLease as Ze,addToWorkset as Qe,audit as $e,bookendReorder as et,buildNodeNameMap as tt,changelog as nt,check as rt,checkpointDiff as it,checkpointGC as at,checkpointHistory as ot,checkpointLatest as st,checkpointList as ct,checkpointLoad as lt,checkpointSave as ut,codemod as dt,compressTerminalOutput as ft,computeSourceHash as pt,createRestorePoint as mt,createSearchSuccessResponse as ht,delegate as gt,delegateListModels as _t,deleteWorkset as vt,diffParse as yt,digest as bt,envInfo as xt,evaluate as St,evidenceMap as Ct,fileSummaryTool as wt,find as Tt,findExamples as Et,forgeGround as Dt,generateFlowBriefing as Ot,generateWorkspaceSkill as kt,getRefTelemetry as At,getWorkset as jt,gitContext as Mt,graphAugmentSearch as Nt,graphQuery as Pt,isSkillStale as Ft,laneCreate as It,laneDiff as Lt,laneDiscard as Rt,laneList as zt,laneMerge as Bt,laneStatus as Vt,listActiveLeases as Ht,listRestorePoints as Ut,listWorksets as Wt,measure as Gt,normalizeSkillInput as Kt,onboard as qt,parseOutput as Jt,processList as Yt,processLogs as Xt,processStart as Zt,processStatus as Qt,processStop as $t,queueClear as en,queueCreate as tn,queueDag as nn,queueDelete as rn,queueDone as an,queueFail as on,queueGet as sn,queueList as cn,queueNext as ln,queuePush as un,releaseLease as dn,removeFromWorkset as fn,rename as pn,replayClear as mn,replayList as hn,replayTrim as gn,resolveNodeName as _n,resolveSkillDir as vn,resolveWorkspaceDir as yn,restoreFromPoint as bn,saveWorkset as xn,schemaValidate as Sn,scopeMap as Cn,scoreCompliance as wn,sessionDigest as Tn,sessionDigestSampling as En,stashClear as Dn,stashDelete as On,stashGet as kn,stashList as An,stashSet as jn,storeReversibleContext as Mn,summarizeCheckResult as Nn,symbol as Pn,testRun as Fn,trace as In,truncateToTokenBudget as Ln,watchList as Rn,webFetch as zn,webSearch as Bn}from"../../tools/dist/index.js";import{homedir as Vn,tmpdir as Hn}from"node:os";import{getEngine as Un,registerBrowserTools as Wn}from"../../browser/dist/index.js";import{ResourceTemplate as Gn}from"@modelcontextprotocol/sdk/server/mcp.js";import{BlastRadiusAnalyzer as Kn,DependencyAnalyzer as qn,DiagramGenerator as Jn,EntryPointAnalyzer as Yn,KnowledgeProducer as Xn,PatternAnalyzer as Zn,StructureAnalyzer as Qn,SymbolAnalyzer as $n}from"../../analyzers/dist/index.js";import{WasmDiagnostics as er,WasmRuntime as tr}from"../../chunker/dist/index.js";import{z as L}from"zod";import{ERCache as nr,ERClient as rr,PushAdapter as ir,mergeResults as ar}from"../../enterprise-bridge/dist/index.js";import{RESOURCE_MIME_TYPE as or,getUiCapability as sr,registerAppResource as cr,registerAppTool as lr}from"@modelcontextprotocol/ext-apps/server";import{createStore as ur}from"../../store/dist/index.js";import{exec as dr,execFile as fr,execSync as pr}from"node:child_process";import{buildSnapshot as mr,createOwnerCapability as hr,rotateOwnerCapability as gr,validateToken as _r}from"../../flows/dist/index.js";import{TemplateRegistry as vr,buildShell as yr,dashboardTemplateDefinition as br,defaultRegistry as xr,flameGraphTemplateDefinition as Sr,isError as Cr,isResult as wr,kanbanTemplateDefinition as Tr,listSortTemplateDefinition as Er,renderSurface as Dr}from"../../blocks-core/dist/index.mjs";import{createServer as Or}from"node:http";import"../../tool-routing/dist/index.mjs";const kr={enabled:!0,batchSize:10,debounceMs:5e3,maxFactsPerSession:50,minQuality:.3};function R(e){return(e.content??[]).filter(e=>e.type===`text`&&typeof e.text==`string`).map(e=>e.text??``).join(`
2
+ import{A as e,B as t,C as n,E as r,F as i,G as a,H as o,I as s,J as c,K as l,L as u,N as d,O as f,P as p,R as m,S as h,T as g,U as _,V as v,W as y,_ as b,b as x,c as S,d as C,g as w,h as T,i as E,j as D,k as ee,l as O,o as te,p as ne,q as re,r as ie,v as k,y as ae,z as oe}from"./startup-maintenance-D7tKqECM.js";import{t as se}from"./bin.js";import{createRequire as ce}from"node:module";import{fileURLToPath as le}from"node:url";import{promisify as ue}from"node:util";import{AIKIT_GLOBAL_PATHS as de,AIKIT_RUNTIME_PATHS as fe,CONTENT_TYPES as pe,CircuitBreaker as me,HealthBus as he,KNOWLEDGE_ORIGINS as ge,SOURCE_TYPES as _e,TOKEN_BUDGETS as ve,computePartitionKey as ye,createLogger as A,getGlobalDataDir as be,getPartitionDir as xe,hashPath as Se,isUserInstalled as Ce,listWorkspaces as we,safeCwd as j,safeCwdOrHome as Te,serializeError as M}from"../../core/dist/index.js";import{copyFileSync as Ee,existsSync as N,mkdirSync as De,readFileSync as P,readdirSync as Oe,renameSync as ke,rmSync as Ae,statSync as je,unlinkSync as Me,writeFileSync as Ne}from"node:fs";import{basename as Pe,dirname as Fe,isAbsolute as Ie,join as F,relative as Le,resolve as I,sep as Re}from"node:path";import{mkdir as ze,readFile as Be,readdir as Ve,rm as He,stat as Ue,unlink as We,writeFile as Ge}from"node:fs/promises";import{createHash as Ke,randomBytes as qe,randomUUID as Je,timingSafeEqual as Ye}from"node:crypto";import{WORKSPACE_SKILL_FILENAME as Xe,acquireLease as Ze,addToWorkset as Qe,audit as $e,bookendReorder as et,buildNodeNameMap as tt,changelog as nt,check as rt,checkpointDiff as it,checkpointGC as at,checkpointHistory as ot,checkpointLatest as st,checkpointList as ct,checkpointLoad as lt,checkpointSave as ut,codemod as dt,compressTerminalOutput as ft,computeSourceHash as pt,createRestorePoint as mt,createSearchSuccessResponse as ht,delegate as gt,delegateListModels as _t,deleteWorkset as vt,diffParse as yt,digest as bt,envInfo as xt,evaluate as St,evidenceMap as Ct,fileSummaryTool as wt,find as Tt,findExamples as Et,forgeGround as Dt,generateFlowBriefing as Ot,generateWorkspaceSkill as kt,getRefTelemetry as At,getWorkset as jt,gitContext as Mt,graphAugmentSearch as Nt,graphQuery as Pt,isSkillStale as Ft,laneCreate as It,laneDiff as Lt,laneDiscard as Rt,laneList as zt,laneMerge as Bt,laneStatus as Vt,listActiveLeases as Ht,listRestorePoints as Ut,listWorksets as Wt,measure as Gt,normalizeSkillInput as Kt,onboard as qt,parseOutput as Jt,processList as Yt,processLogs as Xt,processStart as Zt,processStatus as Qt,processStop as $t,queueClear as en,queueCreate as tn,queueDag as nn,queueDelete as rn,queueDone as an,queueFail as on,queueGet as sn,queueList as cn,queueNext as ln,queuePush as un,releaseLease as dn,removeFromWorkset as fn,rename as pn,replayClear as mn,replayList as hn,replayTrim as gn,resolveNodeName as _n,resolveSkillDir as vn,resolveWorkspaceDir as yn,restoreFromPoint as bn,saveWorkset as xn,schemaValidate as Sn,scopeMap as Cn,scoreCompliance as wn,sessionDigest as Tn,sessionDigestSampling as En,stashClear as Dn,stashDelete as On,stashGet as kn,stashList as An,stashSet as jn,storeReversibleContext as Mn,summarizeCheckResult as Nn,symbol as Pn,testRun as Fn,trace as In,truncateToTokenBudget as Ln,watchList as Rn,webFetch as zn,webSearch as Bn}from"../../tools/dist/index.js";import{homedir as Vn,tmpdir as Hn}from"node:os";import{getEngine as Un,registerBrowserTools as Wn}from"../../browser/dist/index.js";import{ResourceTemplate as Gn}from"@modelcontextprotocol/sdk/server/mcp.js";import{BlastRadiusAnalyzer as Kn,DependencyAnalyzer as qn,DiagramGenerator as Jn,EntryPointAnalyzer as Yn,KnowledgeProducer as Xn,PatternAnalyzer as Zn,StructureAnalyzer as Qn,SymbolAnalyzer as $n}from"../../analyzers/dist/index.js";import{WasmDiagnostics as er,WasmRuntime as tr}from"../../chunker/dist/index.js";import{z as L}from"zod";import{ERCache as nr,ERClient as rr,PushAdapter as ir,mergeResults as ar}from"../../enterprise-bridge/dist/index.js";import{RESOURCE_MIME_TYPE as or,getUiCapability as sr,registerAppResource as cr,registerAppTool as lr}from"@modelcontextprotocol/ext-apps/server";import{createStore as ur}from"../../store/dist/index.js";import{exec as dr,execFile as fr,execSync as pr}from"node:child_process";import{buildSnapshot as mr,createOwnerCapability as hr,rotateOwnerCapability as gr,validateToken as _r}from"../../flows/dist/index.js";import{TemplateRegistry as vr,buildShell as yr,dashboardTemplateDefinition as br,defaultRegistry as xr,flameGraphTemplateDefinition as Sr,isError as Cr,isResult as wr,kanbanTemplateDefinition as Tr,listSortTemplateDefinition as Er,renderSurface as Dr}from"../../blocks-core/dist/index.mjs";import{createServer as Or}from"node:http";import"../../tool-routing/dist/index.mjs";const kr={enabled:!0,batchSize:10,debounceMs:5e3,maxFactsPerSession:50,minQuality:.3};function R(e){return(e.content??[]).filter(e=>e.type===`text`&&typeof e.text==`string`).map(e=>e.text??``).join(`
3
3
  `)}function z(e){return Ke(`sha256`).update(e).digest(`hex`).slice(0,16)}function Ar(e){let t=0;return e.length>=50&&(t+=.2),e.length>=150&&(t+=.1),/[a-zA-Z]\w+\.\w+/.test(e)&&(t+=.15),/[:=]|^[-*]|\n[-*]|```/.test(e)&&(t+=.15),/\b(use|should|must|always|never|prefer|avoid|requires?|detected|confirmed|verified)\b/i.test(e)&&(t+=.2),/^(Error|TypeError|ReferenceError):/m.test(e)&&e.length<100&&(t-=.2),Math.max(0,Math.min(1,t))}const jr={enabled:!0,batchThreshold:20,cooldownMs:3e5,maxCandidatesPerSession:5,initialConfidence:40,excludeTools:[`knowledge`,`replay`,`stash`,`checkpoint`,`session_digest`,`reindex`,`status`,`flow`,`evidence_map`,`present`]},Mr=new Set([`search`,`find`,`symbol`,`grep_search`,`semantic_search`]),Nr=new Set([`replace_string_in_file`,`editfiles`,`create_file`,`apply_patch`]),Pr=new Set([`check`,`test_run`]),Fr=new Set(`action.and.args.auto.buffer.category.content.create.cwd.false.file.files.find.grep.json.knowledge.list.path.query.read.replace.search.semantic.subaction.symbol.test.tool.true.update`.split(`.`));function Ir(e){let t=e.toLowerCase().match(/[a-z0-9]{2,}/g)??[];return new Set(t)}function Lr(e,t){let n=Ir(e),r=Ir(t);if(n.size===0&&r.size===0)return 1;if(n.size===0||r.size===0)return 0;let i=new Set([...n].filter(e=>r.has(e))),a=new Set([...n,...r]);return i.size/a.size}function Rr(e,t){return e.length<=t?e:`${e.slice(0,Math.max(0,t-1))}...`}function zr(e){try{return JSON.stringify(e)}catch{return`[unserializable args]`}}function Br(e){return e.replace(/^mcp_[^_]+_/,``).toLowerCase()}function Vr(e){return[...new Set(e.filter(e=>e.length>0))]}function Hr(e,t){return{...t,confidence:jr.initialConfidence,tags:[`auto-observed`,`detector:${e}`],detector:e}}function Ur(e,t){let n=new Map;for(let t of e)for(let e of Ir(t))Fr.has(e)||n.set(e,(n.get(e)??0)+1);let r=[...n.entries()].filter(([,e])=>e>=t).sort((e,t)=>t[1]-e[1]||e[0].localeCompare(t[0])).map(([e])=>e);return r.length>0?r.slice(0,4):[...n.entries()].sort((e,t)=>t[1]-e[1]||e[0].localeCompare(t[0])).slice(0,4).map(([e])=>e)}function Wr(e){return e.length>0?e.join(`, `):`similar tasks`}function Gr(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.ts==`number`&&Number.isFinite(t.ts)&&typeof t.tool==`string`&&typeof t.input==`string`&&(t.output===void 0||typeof t.output==`string`)&&Array.isArray(t.files)&&t.files.every(e=>typeof e==`string`)}function Kr(e){let t=[];for(let n of e)t.some(e=>Lr(e.title,n.title)>.8)||t.push(n);return t}function qr(e){return typeof e==`string`?[e]:Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function Jr(e){return typeof e==`string`?[...e.matchAll(/^\*\*\* (?:Add|Delete|Update) File: (.+)$/gm)].map(e=>e[1]?.trim()??``).filter(Boolean):[]}function Yr(e){let t=[],n=e=>{if(!(typeof e!=`object`||!e)){if(Array.isArray(e)){for(let t of e)n(t);return}for(let[r,i]of Object.entries(e))(r===`path`||r===`filePath`||r===`files`)&&t.push(...qr(i)),n(i)}};return n(e),t.push(...Jr(e.input)),Vr(t)}function Xr(e){return{tool:e.toolName,input:Rr(zr(e.args),200),output:Rr(R(e.result),500),files:Yr(e.args),ts:Date.now()}}function Zr(e){return{title:e.title,content:`${e.context}\n\n${e.insight}\n\nEvidence:\n${e.evidence}`,category:`conventions`,tags:Vr([`auto-observed`,`detector:${e.detector}`,...e.tags]),hash:Ke(`sha256`).update(`${e.detector}:${e.title}`).digest(`hex`).slice(0,16),quality:Math.max(0,Math.min(1,e.confidence/100)),source:`behavioral:${e.detector}`}}function Qr(e){let t=new Map;for(let n of e){let e=Br(n.tool),r=t.get(e)??[];r.push(n),t.set(e,r)}return[...t.entries()].filter(([,e])=>e.length>=5).map(([e,t])=>{let n=Wr(Ur(t.map(e=>e.input),Math.max(2,Math.ceil(t.length/2))));return Hr(`tool-preference`,{title:`Preferred tool: ${e} for ${n}`,context:`Observed ${t.length} ${e} calls with recurring inputs around ${n}.`,insight:`Use ${e} when working with ${n}.`,evidence:t.slice(0,5).map(e=>`${e.tool}: ${e.input}`).join(`
4
4
  `)})})}function $r(e){let t=new Map;for(let n=0;n<e.length;n+=1){let r=e[n];if(Mr.has(Br(r.tool)))for(let i=n+1;i<e.length&&i<=n+5;i+=1){let n=e[i];if(!(!Nr.has(Br(n.tool))||n.files.length===0))for(let e of Vr(n.files)){let i=t.get(e)??{count:0,queries:[],evidence:[]};i.count+=1,i.queries.push(r.input),i.evidence.push(`${r.tool}: ${r.input} -> ${n.tool}: ${e}`),t.set(e,i)}}}return[...t.entries()].filter(([,e])=>e.count>=3).map(([e,t])=>{let n=Wr(Ur(t.queries,Math.max(2,Math.ceil(t.count/2))));return Hr(`search-action`,{title:`Check ${e} when searching for ${n}`,context:`Searches related to ${n} were followed by edits to ${e} ${t.count} times within five tool calls.`,insight:`When working on ${n}, check ${e} early because searches repeatedly led there.`,evidence:t.evidence.slice(0,5).join(`
5
5
  `)})})}function ei(e){let t=new Map;for(let n=0;n<e.length-2;n+=1){let r=e[n];if(!Pr.has(Br(r.tool)))continue;let i=new Set,a=!1;for(let o=n+1;o<e.length;o+=1){let n=e[o],s=Br(n.tool);if(Nr.has(s)){a=!0;for(let e of n.files)i.add(e);continue}if(Pr.has(s)){if(!a||i.size===0)break;let e=[...i].sort(),o=e.join(`|`),s=t.get(o)??{count:0,evidence:[]};s.count+=1,s.evidence.push(`${r.tool} -> edit(${e.join(`, `)}) -> ${n.tool}`),t.set(o,s);break}if(!a)break}}return[...t.entries()].filter(([,e])=>e.count>=2).map(([e,t])=>{let n=e.split(`|`);return Hr(`error-fix-cycle`,{title:`Repeated validation-edit loop in ${n.length===1?n[0]:`${n[0]} and related files`}`,context:`Observed ${t.count} validation cycles touching ${n.join(`, `)}.`,insight:`Common fix pattern in ${n.join(`, `)}: check -> edit -> recheck.`,evidence:t.evidence.slice(0,5).join(`
@@ -188,7 +188,7 @@ Output ONLY the README.md content, nothing else.`;if(t.available)try{let i=(awai
188
188
 
189
189
  `).trim();r=t?yu(t):null}let i=Array.from(e.matchAll(/^##\s+.*$/gm)),a=[];for(let[t,n]of i.entries()){let r=n[0];if(!_u.test(r))continue;let o=n.index??0,s=i[t+1]?.index??e.length;a.push(e.slice(o,s).replace(/\s+$/,``))}return{brief:r,pins:a.length>0?a.join(`
190
190
 
191
- `):null}}function xu(e,t){return t(e)}async function Su(e){let{context:t,entry:n,state:r,activeRoot:i,primaryRoot:a,roots:o}=e,{instructionPath:s,description:c}=t.resolveCurrentStepInfo(n,r.currentStep,i),l=xu(n,t.getStepSequence),u=await ou({entry:n,stepId:r.currentStep,runDir:r.runDir,slug:r.slug,primaryRoot:a,roots:o,activeRoot:i,resolveInstructionPath:t.resolveInstructionPath,resolveEpilogueInstructionPath:t.resolveEpilogueInstructionPath}),{brief:d,pins:f}=bu(u),p=d;if(d&&r.currentStep){let e=n.manifest.steps.find(e=>e.id===r.currentStep),a={stepId:r.currentStep,flowName:r.flow,flowSlug:r.slug,phase:`flow`,runDir:r.runDir,artifactsPath:F(r.runDir,n.manifest.artifacts_dir).replaceAll(`\\`,`/`),completedSteps:r.completedSteps??[],stepDescription:e?.description??c??void 0,agents:e?.agents??[],mode:`brief`,topic:r.topic??``,activeRoot:i};p=await t.stepPipeline.enrich(d,a,n.manifest.hooks)}return{artifactsPath:F(r.runDir,n.manifest.artifacts_dir).replaceAll(`\\`,`/`),currentStepInstruction:s,currentStepDescription:c,currentStepContent:u,currentStepBrief:p,currentStepPins:f,stepSequence:l}}function Cu(e){let{state:t,data:n,started:r,includeStatus:i,action:a,includeInstructionPath:o}=e,s={};return r&&(s.started=!0),s.flow=t.flow,t.flowOrigin&&(s.flowOrigin=t.flowOrigin),i&&(s.status=t.status),a&&(s.action=a),s.slug=t.slug,s.topic=t.topic,s.runDir=t.runDir,s.artifactsPath=n.artifactsPath,s.currentStep=t.currentStep,s.currentStepInstruction=n.currentStepInstruction,o&&(s.instructionPath=n.currentStepInstruction),s.currentStepDescription=n.currentStepDescription,s.currentStepContent=n.currentStepContent,s.currentStepContentHash=n.currentStepContent?mu(n.currentStepContent):null,s.currentStepBrief=n.currentStepBrief,s.currentStepPins=n.currentStepPins,s.fullContentHint=`Call flow({ action: 'read' }) for the complete step instructions.`,s}function wu(e){return e.sourceType===`local`?{source:`local`,sourceType:e.sourceType,format:e.format,...e.commitSha?{commitSha:e.commitSha}:{}}:{source:e.source,sourceType:e.sourceType,format:e.format,...e.commitSha?{commitSha:e.commitSha}:{}}}async function Tu(e,t){let{getAllRoots:n,getFlows:r,getWorkspaceRoot:i,isValidFlowRoot:a,log:o,patchMetaRoots:s,stateDir:c,toErrorText:l,toTextResponse:u}=t,{flow:d,topic:f,roots:p,objective:m,acceptanceCriteria:h,scope:g,exclusions:_}=e;try{if(p&&p.length>0){let e=n().map(e=>e.replaceAll(`\\`,`/`)),t=p.filter(e=>!a(e));if(t.length>0)return u(`Invalid roots — not part of the workspace or a recognized sub-repository: ${t.join(`, `)}. Available roots: ${e.join(`, `)}`)}let e=n(),o=e.map(e=>e.replaceAll(`\\`,`/`)),l=i(),v=e.length>1,y=!p&&v,b=p?.[0]??l,{registry:x,stateMachine:S}=await r(b),C=x.get(d);if(!C)throw new iu(`UNKNOWN_FLOW`,`Flow "${d}" not found. Use flow({ action: "list" }) to see available flows.`);let w=S.start(C.name,C.manifest,f,wu(C),{objective:m,acceptanceCriteria:h,scope:g,exclusions:_});if(!w.success||!w.data){let e=w.error??`Unknown flow start error.`;return e.includes(`already active`)?u(`Cannot start: ${new iu(`FLOW_ALREADY_ACTIVE`,e).message}`):u(`Cannot start: ${e}`)}let T=w.data;t.eventBus&&t.eventBus.emit({type:`flow:step:eventbus`,flowName:T.flow,flowSlug:T.slug,stepId:T.currentStep??``,status:`start`,action:`started`,phase:T.phase??`flow`,completedSteps:[],totalSteps:C.manifest.steps.length,timestamp:Date.now(),eventId:`flow-start-${T.slug}-${Date.now()}`,workspaceId:T.slug,source:`flow-tools`});let E;if(t.config.layeredKnowledge){let e=hr(),t=S.setOwnerCapability({ownerTokenSalt:e.salt,ownerTokenHash:e.hash,ownerTokenVersion:e.version});if(!t.success)return u(`Cannot start in layered mode: failed to persist owner capability — ${t.error??`unknown error`}`);E=e.rawToken}if(p&&p.length>1)try{s(T.slug,b,p),t.syncMetaToRoots(T.slug,b)}catch(e){return S.reset(),u(`Flow created but failed to sync to secondary roots — rolled back. Error: ${e instanceof Error?e.message:String(e)}`)}let D=F(c,`flow-context`),ee=typeof Ve==`function`?await Ve(D).catch(()=>[]):[];for(let e of ee)e!==T.slug&&typeof He==`function`&&await He(F(D,e),{recursive:!0,force:!0}).catch(()=>{});if(typeof ze==`function`)try{await ze(F(D,T.slug),{recursive:!0})}catch{}let O=await Su({context:t,entry:C,state:T,activeRoot:b,primaryRoot:null,roots:p??null}),te=mr(T,C.manifest,{objective:m,acceptanceCriteria:h,scope:g,exclusions:_}),ne={...Cu({state:T,data:O,started:!0}),phase:T.phase,isEpilogue:T.isEpilogue,totalSteps:O.stepSequence.length,stepSequence:O.stepSequence,artifactsDir:C.manifest.artifacts_dir,roots:p??[b.replaceAll(`\\`,`/`)],snapshot:te,_hint:hu,...y?{multiRootWarning:`No roots specified in multi-root workspace. Flow created at workspace root. Pass roots parameter with target repo for precise placement.`,availableRoots:o}:{},...E?{_ownerToken:E}:{}};return u(JSON.stringify(ne,null,2))}catch(e){return au(e)?u(e.message):(o.error(`flow action start failed`,M(e)),u(`Error: ${l(e)}`))}}async function Eu(e,t){let{getFlows:n,log:r,resolveFlowRoot:i,syncMetaToRoots:a,toErrorText:o,toTextResponse:s}=t,{targetStep:c,lifecycleOwnerToken:l,currentToken:u}=e;try{let e=await i(),{registry:r,stateMachine:o}=await n(e),d=o.getStatus();if(!d.success||!d.data)return s(`No active flow. Use flow({ action: "start", name: "<flow>" }) first.`);let f=d.data,p=r.get(f.flow);if(!p)return s(`Flow "${f.flow}" not found in registry.`);if(t.config.layeredKnowledge){if(!l)return s(`lifecycleOwnerToken required in layered mode.`);let e=f,t=e.ownerTokenSalt,n=e.ownerTokenHash;if(!t||!n)return s(`Flow has no owner capability — cannot backtrack.`);if(!_r(l,t,n))return s(`Invalid lifecycleOwnerToken — backtrack denied.`);if(u&&u!==f.currentToken)return s(`Invalid currentToken — flow state changed since last status.`)}let m=o.backtrack(c,p.manifest);if(!m.success||!m.data)return s(`Cannot backtrack: ${m.error}`);a(m.data.slug,e);let h=m.data,g=await Su({context:t,entry:p,state:h,activeRoot:e,primaryRoot:h.primaryRoot,roots:h.roots}),_={...Cu({state:h,data:g,includeStatus:!0,action:`backtrack`}),_hint:h.currentStep?hu:void 0,phase:h.phase,isEpilogue:h.isEpilogue,completedSteps:h.completedSteps,skippedSteps:h.skippedSteps,totalSteps:g.stepSequence.length};return s(JSON.stringify(_,null,2))}catch(e){return au(e)?s(e.message):(r.error(`flow action backtrack failed`,M(e)),s(`Error: ${o(e)}`))}}async function Du(e,t){let{getFlows:n,log:r,resolveFlowRoot:i,syncMetaToRoots:a,toErrorText:o,toTextResponse:s}=t,{currentToken:c}=e;try{let e=await i(),{stateMachine:r}=await n(e),o=r.getStatus();if(!o.success||!o.data)return s(`No active flow. Use flow({ action: "start", name: "<flow>" }) first.`);let l=o.data;if(c&&c!==l.currentToken)return s(`Invalid currentToken — claim denied.`);if(!t.config.layeredKnowledge)return s(`Claim requires layeredKnowledge mode.`);let u=t.server?(await import(`./startup-maintenance-cbRSFMY5.js`).then(e=>e.m)).createSamplingClient(t.server):null;if(u?.available){if((await u.createMessage({prompt:`You have been asked to transfer flow ownership. Do you confirm?`,systemPrompt:`Respond with "yes" to confirm or anything else to decline.`,maxTokens:16,modelPreferences:{intelligencePriority:.2,speedPriority:.9,costPriority:.9}})).text.trim().toLowerCase()!==`yes`)return s(`Ownership transfer declined by user.`)}else return s(`Cannot verify ownership transfer — no elicitor available.`);let d=gr(l.ownerTokenVersion??1),f=r.setOwnerCapability({ownerTokenSalt:d.salt,ownerTokenHash:d.hash,ownerTokenVersion:d.version});if(!f.success)return s(`Claim failed: ${f.error}`);let p=r.getStatus();if(p.success&&p.data){let t=p.data;a(t.slug,e)}let m={success:!0,_ownerToken:d.rawToken,version:d.version,message:`Ownership transferred successfully.`};return s(JSON.stringify(m,null,2))}catch(e){return au(e)?s(e.message):(r.error(`flow action claim failed`,M(e)),s(`Error: ${o(e)}`))}}async function Ou(e){let{getFlows:t,log:n,resolveFlowRoot:r,resolveRoots:i,toErrorText:a,toTextResponse:o}=e;try{let n=await r(),{registry:a,stateMachine:s}=await t(n),c=s.getStatus();if(!c.success||!c.data)throw new iu(`NO_ACTIVE_FLOW`,`No active flow. Use flow({ action: "start", name: "<flow>" }) to begin one, or flow({ action: "list" }) to see available flows.`);let l=c.data,u=a.get(l.flow),d=u?await Su({context:e,entry:u,state:l,activeRoot:n,primaryRoot:l.primaryRoot,roots:l.roots}):vu(),f={...Cu({state:l,data:d,includeStatus:!0,includeInstructionPath:!0}),_hint:l.currentStep?hu:void 0,phase:l.phase,isEpilogue:l.isEpilogue,completedSteps:l.completedSteps,skippedSteps:l.skippedSteps,artifacts:l.artifacts,startedAt:l.startedAt,updatedAt:l.updatedAt,totalSteps:d.stepSequence.length,progress:u?`${l.completedSteps.length+l.skippedSteps.length}/${d.stepSequence.length}`:`unknown`,decisions:await e.loadFlowDecisions(l.slug),briefing:{workspace_core:e.skillCompiler?.readCurrentSkill()??null,active_flow:e.skillCompiler?.readFlowBriefing(l.slug)??null},skill_warnings:e.skillCompiler?.getWarnings(l.slug)??[],workspaceRoot:n.replaceAll(`\\`,`/`),primaryRoot:(l.primaryRoot??n).replaceAll(`\\`,`/`),roots:l.roots??[n.replaceAll(`\\`,`/`)],allRoots:i().normalizedAllRoots,discoveredRepos:i().discoveredRepos};return o(JSON.stringify(f,null,2))}catch(e){return au(e)?o(e.message):(n.error(`flow action status failed`,M(e)),o(`Error: ${a(e)}`))}}async function ku(e){let{getFlows:t,log:n,resolveFlowRoot:r,stateDir:i,syncMetaToRoots:a,toErrorText:o,toTextResponse:s}=e;try{let n=await r(),{stateMachine:o}=await t(n),c=o.getStatus();if(c.success&&c.data){if(e.eventBus){let t=c.data.slug,n=typeof c.data.startedAt==`number`?c.data.startedAt:Date.now();e.eventBus.emit({type:`flow:abandon`,flowName:c.data.flow,flowSlug:t,completedCount:c.data.completedSteps?.length??0,skippedCount:c.data.skippedSteps?.length??0,durationMs:Date.now()-n,timestamp:Date.now(),eventId:`flow-abandon-${t}-${Date.now()}`,workspaceId:t,source:`flow-tools`})}a(c.data.slug,n)}let l=o.reset();if(!l.success)return s(`Reset failed: ${l.error}`);if(c.success&&c.data?.slug)try{await He(F(i,`flow-context`,c.data.slug),{recursive:!0,force:!0})}catch{}return s(`Flow abandoned. Use flow({ action: "start", name: "<flow>" }) to begin a new flow.`)}catch(e){return n.error(`flow action reset failed`,M(e)),s(`Error: ${o(e)}`)}}async function Au(e,t){let{getFlows:n,log:r,resolveFlowRoot:i,syncMetaToRoots:a,toErrorText:o,toTextResponse:s}=t,{action:c,targetStep:l,lifecycleOwnerToken:u,currentToken:d}=e;if(c===`backtrack`)return l?Eu({targetStep:l,lifecycleOwnerToken:u,currentToken:d},t):s(`Missing required parameter: targetStep for backtrack action.`);try{let e=await i(),{registry:r,stateMachine:o}=await n(e),l=o.getStatus();if(!l.success||!l.data)throw new iu(`NO_ACTIVE_FLOW`,`No active flow. Use flow({ action: "start", name: "<flow>" }) first.`);let u=r.get(l.data.flow);if(!u)throw new iu(`FLOW_NOT_FOUND`,`Flow "${l.data.flow}" not found in registry.`);let d=o.step(c,u.manifest);if(!d.success||!d.data)return s(`Cannot ${c}: ${d.error}`);a(d.data.slug,e);let f=d.data;if(t.eventBus&&(t.eventBus.emit({type:`flow:step:eventbus`,flowName:f.flow,flowSlug:f.slug,stepId:f.currentStep??f.completedSteps[f.completedSteps.length-1]??``,status:{next:`complete`,skip:`complete`,redo:`start`}[c]??`complete`,action:{next:`completed`,skip:`skipped`,redo:`redo`}[c]??`completed`,phase:f.phase??`flow`,completedSteps:[...f.completedSteps,...f.skippedSteps],totalSteps:u.manifest.steps.length,timestamp:Date.now(),eventId:`flow-step-${f.slug}-${Date.now()}`,workspaceId:f.slug,source:`flow-tools`}),f.status===`completed`)){let e=typeof f.startedAt==`number`?f.startedAt:Date.now();t.eventBus.emit({type:`flow:complete:eventbus`,flowName:f.flow,flowSlug:f.slug,outcome:`success`,stepCount:u.manifest.steps.length,completedCount:f.completedSteps.length,skippedCount:f.skippedSteps.length,durationMs:Date.now()-e,timestamp:Date.now(),eventId:`flow-complete-${f.slug}-${Date.now()}`,workspaceId:f.slug,source:`flow-tools`})}let p=[];if(f.status===`completed`){let e=F(t.stateDir,`flow-context`,f.slug);for(let t of[`decision`,`pattern`]){let n=F(e,t);try{let e=await Ve(n);for(let r of e){if(!r.endsWith(`.md`))continue;let e=await Be(F(n,r),`utf-8`);e.length>100&&p.push({type:t,title:r.replace(/\.md$/,``).replace(/-/g,` `),content:e.length>500?`${e.slice(0,497)}...`:e})}}catch{}}typeof He==`function`&&await He(e,{recursive:!0,force:!0}).catch(()=>{})}let m=await Su({context:t,entry:u,state:f,activeRoot:e,primaryRoot:f.primaryRoot,roots:f.roots}),h={...Cu({state:f,data:m,includeStatus:!0,action:c}),_hint:f.currentStep?hu:void 0,phase:f.phase,isEpilogue:f.isEpilogue,completedSteps:f.completedSteps,skippedSteps:f.skippedSteps,totalSteps:m.stepSequence.length,remaining:m.stepSequence.filter(e=>!f.completedSteps.includes(e)&&!f.skippedSteps.includes(e)&&e!==f.currentStep),...p.length>0?{promotionCandidates:p}:{}};return s(JSON.stringify(h,null,2))}catch(e){return au(e)?s(e.message):(r.error(`flow action step failed`,M(e)),s(`Error: ${o(e)}`))}}async function ju(e){let{getFlows:t,log:n,resolveFlowRoot:r,resolveRoots:i,toErrorText:a,toTextResponse:o}=e;try{let{registry:e,stateMachine:n,installer:a}=await t(await r()),s=e.list(),c=n.getStatus(),l={flows:s.map(e=>{let t={name:e.name,version:e.version,source:e.source,sourceType:e.sourceType,format:e.format,steps:e.manifest.steps.map(e=>e.id)};if(e.sourceType===`git`&&e.commitSha){let n=a.hasUpdates(e.installPath);return{...t,commitSha:e.commitSha,updateAvailable:n.success&&n.data?n.data.hasUpdates:void 0}}return t}),activeFlow:c.success&&c.data?{flow:c.data.flow,flowOrigin:c.data.flowOrigin,status:c.data.status,currentStep:c.data.currentStep,slug:c.data.slug,topic:c.data.topic,runDir:c.data.runDir}:null,allRoots:i().normalizedAllRoots,discoveredRepos:i().discoveredRepos};return o(JSON.stringify(l,null,2))}catch(e){return n.error(`flow action list failed`,M(e)),o(`Error: ${a(e)}`)}}async function Mu(e,t){let{getFlows:n,log:r,resolveInstallPath:i,resolveInstructionPath:a,toErrorText:o,toTextResponse:s}=t,{name:c}=e;try{let{registry:e,installer:t}=await n(),r=e.get(c);if(!r)throw new iu(`UNKNOWN_FLOW`,`Flow "${c}" not found. Use flow({ action: "list" }) to see available flows.`);let o=r.commitSha??null,l;if(r.sourceType===`git`&&r.installPath){let e=t.hasUpdates(r.installPath);l=e.success&&e.data?e.data.hasUpdates:void 0}let u={name:r.name,version:r.version,description:r.manifest.description,source:r.source,sourceType:r.sourceType,format:r.format,commitSha:o,updateAvailable:l,installPath:i(r.name,r),registeredAt:r.registeredAt,updatedAt:r.updatedAt,steps:r.manifest.steps.map(e=>({id:e.id,name:e.name,instruction:a(r,e.instruction),produces:e.produces,requires:e.requires,description:e.description})),agents:r.manifest.agents,artifactsDir:r.manifest.artifacts_dir,install:r.manifest.install};return s(JSON.stringify(u,null,2))}catch(e){return au(e)?s(e.message):(r.error(`flow action info failed`,M(e)),s(`Error: ${o(e)}`))}}async function Nu(e,t){let{getAllRoots:n,getFlows:r,log:i,toErrorText:a,toTextResponse:o}=t,{flow:s,status:c,limit:l=50}=e,u=e=>{for(let t of[`updatedAt`,`startedAt`,`createdAt`]){let n=e[t];if(typeof n==`number`&&Number.isFinite(n))return n;if(typeof n==`string`){let e=Date.parse(n);if(!Number.isNaN(e))return e}}return null};try{let e=n(),t=[];for(let n of e){let{stateMachine:e}=await r(n),i=e.listRuns({flow:s,status:c});for(let e of i)t.push({...JSON.parse(JSON.stringify(e)),root:n.replaceAll(`\\`,`/`)})}let i=new Set,a=t.filter(e=>{let t=e.id;return i.has(t)?!1:(i.add(t),!0)});if(a.length===0)return o(`No flow runs found.`);let d=a.map((e,t)=>({run:e,index:t,recency:u(e)})).sort((e,t)=>e.recency==null&&t.recency==null?e.index-t.index:e.recency==null?1:t.recency==null?-1:t.recency===e.recency?e.index-t.index:t.recency-e.recency).map(({run:e})=>e).slice(0,l);return o(JSON.stringify({total:a.length,returned:d.length,truncated:a.length>d.length,runs:d},null,2))}catch(e){return i.error(`flow action runs failed`,M(e)),o(`Error: ${a(e)}`)}}function Pu(e){let t=e.content?.find(e=>e.type===`text`)?.text??``;if(!t)return null;try{let e=JSON.parse(t);if(typeof e.slug==`string`&&e.slug.length>0)return e.slug}catch{}return t.match(/[Ss]lug[:\s]*`?([^`\s,]+)`?/)?.[1]??null}function Fu(e,t,n,r){let i=n&&typeof n!=`function`?n:void 0,a=typeof n==`function`?n:r,o=ru(e,t,i,i?.curated,i?.eventBus,i?.skillCompiler),s=W(`flow`);e.registerTool(`flow`,{title:s.title,description:`Manage development flows — list available flows, start/stop runs, navigate steps, read instructions, and install/remove/update flows. Use action parameter to select operation.`,annotations:s.annotations,inputSchema:{action:L.enum([`list`,`info`,`start`,`step`,`status`,`reset`,`read`,`runs`,`add`,`remove`,`update`,`backtrack`,`claim`]).describe(`The flow operation to perform.`),name:L.string().optional().describe(`Flow name — required for info, start, remove, update. Optional override for add.`),topic:L.string().optional().describe(`Human-readable topic for the run (used by start).`),objective:L.string().optional().describe(`L1 snapshot objective — the goal of this flow run. Falls back to topic when absent.`),acceptanceCriteria:L.array(L.string()).optional().describe(`L1 snapshot acceptance criteria (used by start).`),scope:L.array(L.string()).optional().describe(`L1 snapshot scope boundaries (used by start). Falls back to roots when absent.`),exclusions:L.array(L.string()).optional().describe(`L1 snapshot exclusions — what is out of scope (used by start).`),roots:L.array(L.string()).optional().describe(`Workspace roots participating in this flow (used by start).`),advance:L.enum([`next`,`skip`,`redo`,`backtrack`]).optional().describe(`Step navigation action — required for step.`),lifecycleOwnerToken:L.string().optional().describe(`Owner capability token for layered lifecycle mutations (required in layered mode for step/backtrack/claim/reset).`),currentToken:L.string().optional().describe(`Current step execution token from status response for optimistic concurrency.`),targetStep:L.string().optional().describe(`Target step ID for backtrack action — must be a completed prior step.`),step:L.string().optional().describe(`Step id or name to read (used by read). Defaults to current step.`),source:L.string().optional().describe(`Git URL, local path, or "openspec" shorthand — required for add.`),token:L.string().optional().describe(`Auth token for private repos (used by add).`),filter_flow:L.string().optional().describe(`Filter runs by flow name (used by runs).`),filter_status:L.string().optional().describe(`Filter runs by status: active, completed, abandoned (used by runs).`),limit:L.number().int().positive().optional().describe(`Max runs to return (default 50).`)}},Y(`flow`,async e=>{switch(e.action){case`list`:return ju(o);case`info`:return e.name?Mu({name:e.name},o):o.toTextResponse(`Missing required parameter: name`);case`start`:{if(!e.name)return o.toTextResponse(`Missing required parameter: name (flow to start)`);let t=await Tu({flow:e.name,topic:e.topic,roots:e.roots,objective:e.objective,acceptanceCriteria:e.acceptanceCriteria,scope:e.scope,exclusions:e.exclusions},o),n=Pu(t);return n&&a&&a(n),t}case`step`:return e.advance?Au({action:e.advance,targetStep:e.targetStep,lifecycleOwnerToken:e.lifecycleOwnerToken,currentToken:e.currentToken},o):o.toTextResponse(`Missing required parameter: advance (next/skip/redo/backtrack)`);case`status`:{let e=await Ou(o);return a&&a(Pu(e)),e}case`reset`:{let e=await ku(o);return a&&a(null),e}case`read`:return su({step:e.step},o);case`runs`:return Nu({flow:e.filter_flow,status:e.filter_status,limit:e.limit},o);case`add`:return e.source?du({source:e.source,name:e.name,token:e.token},o):o.toTextResponse(`Missing required parameter: source`);case`remove`:return e.name?fu({name:e.name},o):o.toTextResponse(`Missing required parameter: name`);case`update`:return e.name?pu({name:e.name},o):o.toTextResponse(`Missing required parameter: name`);case`backtrack`:return e.targetStep?Eu({targetStep:e.targetStep,lifecycleOwnerToken:e.lifecycleOwnerToken,currentToken:e.currentToken},o):o.toTextResponse(`Missing required parameter: targetStep for backtrack action`);case`claim`:return Du({currentToken:e.currentToken},o);default:return o.toTextResponse(`Unknown action: ${e.action}`)}}))}const Iu=A(`tools`);function Lu(e){let t=W(`evidence_map`);e.registerTool(`evidence_map`,{title:t.title,description:`Track verified/assumed/unresolved claims for complex tasks. Gate readiness: YIELD (proceed), HOLD (unknowns), HARD_BLOCK (critical gaps). Persists across calls.`,inputSchema:{action:L.enum([`create`,`add`,`update`,`get`,`gate`,`list`,`delete`]).describe(`Operation to perform`),task_id:L.string().optional().describe(`Task identifier (required for all except list)`),tier:L.enum([`floor`,`standard`,`critical`]).optional().describe(`FORGE tier (required for create)`),claim:L.string().optional().describe(`Critical-path claim text (for add)`),status:L.enum([`V`,`A`,`U`]).optional().describe(`Evidence status: V=Verified, A=Assumed, U=Unresolved`),receipt:L.string().optional().describe(`Evidence receipt: tool→ref for V, reasoning for A, attempts for U`),id:L.number().optional().describe(`Entry ID (for update)`),critical_path:L.boolean().default(!0).describe(`Whether this claim is on the critical path`),unknown_type:L.enum([`contract`,`convention`,`freshness`,`runtime`,`data-flow`,`impact`]).optional().describe(`Typed unknown classification`),safety_gate:L.enum([`provenance`,`commitment`,`coverage`]).optional().describe(`Safety gate tag: provenance (claim→evidence), commitment (user-approved), coverage (nothing dropped)`),retry_count:L.number().default(0).describe(`Retry count for gate evaluation (0 = first attempt)`),max_retries:L.number().int().min(0).optional().describe(`Maximum retries before escalating. Default: 3`),timeout_action:L.enum([`iterate`,`retry`,`manual`,`terminate`]).optional().describe(`Action to take when gate retries are exhausted. Default: manual`),cwd:L.string().optional().describe(`Working directory for evidence map storage (default: server cwd). Use root_path from forge_ground to match.`)},annotations:t.annotations},Y(`evidence_map`,async({action:e,task_id:t,tier:n,claim:r,status:i,receipt:a,id:o,critical_path:s,unknown_type:c,safety_gate:l,retry_count:u,max_retries:d,timeout_action:f,cwd:p})=>{try{switch(e){case`create`:if(!t)throw Error(`task_id required for create`);if(!n)throw Error(`tier required for create`);return Ct({action:`create`,taskId:t,tier:n},p),{content:[{type:`text`,text:`Created evidence map "${t}" (tier: ${n}).\n\n---\n_Next: Use \`evidence_map\` with action "add" to record critical-path claims._`}]};case`add`:{if(!t)throw Error(`task_id required for add`);if(!r)throw Error(`claim required for add`);if(!i)throw Error(`status required for add`);let e=Ct({action:`add`,taskId:t,claim:r,status:i,receipt:a??``,criticalPath:s,unknownType:c,safetyGate:l},p),n=e.autoCreated?[`⚠️ Evidence map "${t}" was auto-created with tier "standard". Use \`create\` action to set a specific tier.`,``,`Added entry #${e.entry?.id} to "${t}": [${i}] ${r}`]:[`Added entry #${e.entry?.id} to "${t}": [${i}] ${r}`];return e.summary&&n.push(``,e.summary),{content:[{type:`text`,text:n.join(`
191
+ `):null}}function xu(e,t){return t(e)}async function Su(e){let{context:t,entry:n,state:r,activeRoot:i,primaryRoot:a,roots:o}=e,{instructionPath:s,description:c}=t.resolveCurrentStepInfo(n,r.currentStep,i),l=xu(n,t.getStepSequence),u=await ou({entry:n,stepId:r.currentStep,runDir:r.runDir,slug:r.slug,primaryRoot:a,roots:o,activeRoot:i,resolveInstructionPath:t.resolveInstructionPath,resolveEpilogueInstructionPath:t.resolveEpilogueInstructionPath}),{brief:d,pins:f}=bu(u),p=d;if(d&&r.currentStep){let e=n.manifest.steps.find(e=>e.id===r.currentStep),a={stepId:r.currentStep,flowName:r.flow,flowSlug:r.slug,phase:`flow`,runDir:r.runDir,artifactsPath:F(r.runDir,n.manifest.artifacts_dir).replaceAll(`\\`,`/`),completedSteps:r.completedSteps??[],stepDescription:e?.description??c??void 0,agents:e?.agents??[],mode:`brief`,topic:r.topic??``,activeRoot:i};p=await t.stepPipeline.enrich(d,a,n.manifest.hooks)}return{artifactsPath:F(r.runDir,n.manifest.artifacts_dir).replaceAll(`\\`,`/`),currentStepInstruction:s,currentStepDescription:c,currentStepContent:u,currentStepBrief:p,currentStepPins:f,stepSequence:l}}function Cu(e){let{state:t,data:n,started:r,includeStatus:i,action:a,includeInstructionPath:o}=e,s={};return r&&(s.started=!0),s.flow=t.flow,t.flowOrigin&&(s.flowOrigin=t.flowOrigin),i&&(s.status=t.status),a&&(s.action=a),s.slug=t.slug,s.topic=t.topic,s.runDir=t.runDir,s.artifactsPath=n.artifactsPath,s.currentStep=t.currentStep,s.currentStepInstruction=n.currentStepInstruction,o&&(s.instructionPath=n.currentStepInstruction),s.currentStepDescription=n.currentStepDescription,s.currentStepContent=n.currentStepContent,s.currentStepContentHash=n.currentStepContent?mu(n.currentStepContent):null,s.currentStepBrief=n.currentStepBrief,s.currentStepPins=n.currentStepPins,s.fullContentHint=`Call flow({ action: 'read' }) for the complete step instructions.`,s}function wu(e){return e.sourceType===`local`?{source:`local`,sourceType:e.sourceType,format:e.format,...e.commitSha?{commitSha:e.commitSha}:{}}:{source:e.source,sourceType:e.sourceType,format:e.format,...e.commitSha?{commitSha:e.commitSha}:{}}}async function Tu(e,t){let{getAllRoots:n,getFlows:r,getWorkspaceRoot:i,isValidFlowRoot:a,log:o,patchMetaRoots:s,stateDir:c,toErrorText:l,toTextResponse:u}=t,{flow:d,topic:f,roots:p,objective:m,acceptanceCriteria:h,scope:g,exclusions:_}=e;try{if(p&&p.length>0){let e=n().map(e=>e.replaceAll(`\\`,`/`)),t=p.filter(e=>!a(e));if(t.length>0)return u(`Invalid roots — not part of the workspace or a recognized sub-repository: ${t.join(`, `)}. Available roots: ${e.join(`, `)}`)}let e=n(),o=e.map(e=>e.replaceAll(`\\`,`/`)),l=i(),v=e.length>1,y=!p&&v,b=p?.[0]??l,{registry:x,stateMachine:S}=await r(b),C=x.get(d);if(!C)throw new iu(`UNKNOWN_FLOW`,`Flow "${d}" not found. Use flow({ action: "list" }) to see available flows.`);let w=S.start(C.name,C.manifest,f,wu(C),{objective:m,acceptanceCriteria:h,scope:g,exclusions:_});if(!w.success||!w.data){let e=w.error??`Unknown flow start error.`;return e.includes(`already active`)?u(`Cannot start: ${new iu(`FLOW_ALREADY_ACTIVE`,e).message}`):u(`Cannot start: ${e}`)}let T=w.data;t.eventBus&&t.eventBus.emit({type:`flow:step:eventbus`,flowName:T.flow,flowSlug:T.slug,stepId:T.currentStep??``,status:`start`,action:`started`,phase:T.phase??`flow`,completedSteps:[],totalSteps:C.manifest.steps.length,timestamp:Date.now(),eventId:`flow-start-${T.slug}-${Date.now()}`,workspaceId:T.slug,source:`flow-tools`});let E;if(t.config.layeredKnowledge){let e=hr(),t=S.setOwnerCapability({ownerTokenSalt:e.salt,ownerTokenHash:e.hash,ownerTokenVersion:e.version});if(!t.success)return u(`Cannot start in layered mode: failed to persist owner capability — ${t.error??`unknown error`}`);E=e.rawToken}if(p&&p.length>1)try{s(T.slug,b,p),t.syncMetaToRoots(T.slug,b)}catch(e){return S.reset(),u(`Flow created but failed to sync to secondary roots — rolled back. Error: ${e instanceof Error?e.message:String(e)}`)}let D=F(c,`flow-context`),ee=typeof Ve==`function`?await Ve(D).catch(()=>[]):[];for(let e of ee)e!==T.slug&&typeof He==`function`&&await He(F(D,e),{recursive:!0,force:!0}).catch(()=>{});if(typeof ze==`function`)try{await ze(F(D,T.slug),{recursive:!0})}catch{}let O=await Su({context:t,entry:C,state:T,activeRoot:b,primaryRoot:null,roots:p??null}),te=mr(T,C.manifest,{objective:m,acceptanceCriteria:h,scope:g,exclusions:_}),ne={...Cu({state:T,data:O,started:!0}),phase:T.phase,isEpilogue:T.isEpilogue,totalSteps:O.stepSequence.length,stepSequence:O.stepSequence,artifactsDir:C.manifest.artifacts_dir,roots:p??[b.replaceAll(`\\`,`/`)],snapshot:te,_hint:hu,...y?{multiRootWarning:`No roots specified in multi-root workspace. Flow created at workspace root. Pass roots parameter with target repo for precise placement.`,availableRoots:o}:{},...E?{_ownerToken:E}:{}};return u(JSON.stringify(ne,null,2))}catch(e){return au(e)?u(e.message):(o.error(`flow action start failed`,M(e)),u(`Error: ${l(e)}`))}}async function Eu(e,t){let{getFlows:n,log:r,resolveFlowRoot:i,syncMetaToRoots:a,toErrorText:o,toTextResponse:s}=t,{targetStep:c,lifecycleOwnerToken:l,currentToken:u}=e;try{let e=await i(),{registry:r,stateMachine:o}=await n(e),d=o.getStatus();if(!d.success||!d.data)return s(`No active flow. Use flow({ action: "start", name: "<flow>" }) first.`);let f=d.data,p=r.get(f.flow);if(!p)return s(`Flow "${f.flow}" not found in registry.`);if(t.config.layeredKnowledge){if(!l)return s(`lifecycleOwnerToken required in layered mode.`);let e=f,t=e.ownerTokenSalt,n=e.ownerTokenHash;if(!t||!n)return s(`Flow has no owner capability — cannot backtrack.`);if(!_r(l,t,n))return s(`Invalid lifecycleOwnerToken — backtrack denied.`);if(u&&u!==f.currentToken)return s(`Invalid currentToken — flow state changed since last status.`)}let m=o.backtrack(c,p.manifest);if(!m.success||!m.data)return s(`Cannot backtrack: ${m.error}`);a(m.data.slug,e);let h=m.data,g=await Su({context:t,entry:p,state:h,activeRoot:e,primaryRoot:h.primaryRoot,roots:h.roots}),_={...Cu({state:h,data:g,includeStatus:!0,action:`backtrack`}),_hint:h.currentStep?hu:void 0,phase:h.phase,isEpilogue:h.isEpilogue,completedSteps:h.completedSteps,skippedSteps:h.skippedSteps,totalSteps:g.stepSequence.length};return s(JSON.stringify(_,null,2))}catch(e){return au(e)?s(e.message):(r.error(`flow action backtrack failed`,M(e)),s(`Error: ${o(e)}`))}}async function Du(e,t){let{getFlows:n,log:r,resolveFlowRoot:i,syncMetaToRoots:a,toErrorText:o,toTextResponse:s}=t,{currentToken:c}=e;try{let e=await i(),{stateMachine:r}=await n(e),o=r.getStatus();if(!o.success||!o.data)return s(`No active flow. Use flow({ action: "start", name: "<flow>" }) first.`);let l=o.data;if(c&&c!==l.currentToken)return s(`Invalid currentToken — claim denied.`);if(!t.config.layeredKnowledge)return s(`Claim requires layeredKnowledge mode.`);let u=t.server?(await import(`./startup-maintenance-D7tKqECM.js`).then(e=>e.m)).createSamplingClient(t.server):null;if(u?.available){if((await u.createMessage({prompt:`You have been asked to transfer flow ownership. Do you confirm?`,systemPrompt:`Respond with "yes" to confirm or anything else to decline.`,maxTokens:16,modelPreferences:{intelligencePriority:.2,speedPriority:.9,costPriority:.9}})).text.trim().toLowerCase()!==`yes`)return s(`Ownership transfer declined by user.`)}else return s(`Cannot verify ownership transfer — no elicitor available.`);let d=gr(l.ownerTokenVersion??1),f=r.setOwnerCapability({ownerTokenSalt:d.salt,ownerTokenHash:d.hash,ownerTokenVersion:d.version});if(!f.success)return s(`Claim failed: ${f.error}`);let p=r.getStatus();if(p.success&&p.data){let t=p.data;a(t.slug,e)}let m={success:!0,_ownerToken:d.rawToken,version:d.version,message:`Ownership transferred successfully.`};return s(JSON.stringify(m,null,2))}catch(e){return au(e)?s(e.message):(r.error(`flow action claim failed`,M(e)),s(`Error: ${o(e)}`))}}async function Ou(e){let{getFlows:t,log:n,resolveFlowRoot:r,resolveRoots:i,toErrorText:a,toTextResponse:o}=e;try{let n=await r(),{registry:a,stateMachine:s}=await t(n),c=s.getStatus();if(!c.success||!c.data)throw new iu(`NO_ACTIVE_FLOW`,`No active flow. Use flow({ action: "start", name: "<flow>" }) to begin one, or flow({ action: "list" }) to see available flows.`);let l=c.data,u=a.get(l.flow),d=u?await Su({context:e,entry:u,state:l,activeRoot:n,primaryRoot:l.primaryRoot,roots:l.roots}):vu(),f={...Cu({state:l,data:d,includeStatus:!0,includeInstructionPath:!0}),_hint:l.currentStep?hu:void 0,phase:l.phase,isEpilogue:l.isEpilogue,completedSteps:l.completedSteps,skippedSteps:l.skippedSteps,artifacts:l.artifacts,startedAt:l.startedAt,updatedAt:l.updatedAt,totalSteps:d.stepSequence.length,progress:u?`${l.completedSteps.length+l.skippedSteps.length}/${d.stepSequence.length}`:`unknown`,decisions:await e.loadFlowDecisions(l.slug),briefing:{workspace_core:e.skillCompiler?.readCurrentSkill()??null,active_flow:e.skillCompiler?.readFlowBriefing(l.slug)??null},skill_warnings:e.skillCompiler?.getWarnings(l.slug)??[],workspaceRoot:n.replaceAll(`\\`,`/`),primaryRoot:(l.primaryRoot??n).replaceAll(`\\`,`/`),roots:l.roots??[n.replaceAll(`\\`,`/`)],allRoots:i().normalizedAllRoots,discoveredRepos:i().discoveredRepos};return o(JSON.stringify(f,null,2))}catch(e){return au(e)?o(e.message):(n.error(`flow action status failed`,M(e)),o(`Error: ${a(e)}`))}}async function ku(e){let{getFlows:t,log:n,resolveFlowRoot:r,stateDir:i,syncMetaToRoots:a,toErrorText:o,toTextResponse:s}=e;try{let n=await r(),{stateMachine:o}=await t(n),c=o.getStatus();if(c.success&&c.data){if(e.eventBus){let t=c.data.slug,n=typeof c.data.startedAt==`number`?c.data.startedAt:Date.now();e.eventBus.emit({type:`flow:abandon`,flowName:c.data.flow,flowSlug:t,completedCount:c.data.completedSteps?.length??0,skippedCount:c.data.skippedSteps?.length??0,durationMs:Date.now()-n,timestamp:Date.now(),eventId:`flow-abandon-${t}-${Date.now()}`,workspaceId:t,source:`flow-tools`})}a(c.data.slug,n)}let l=o.reset();if(!l.success)return s(`Reset failed: ${l.error}`);if(c.success&&c.data?.slug)try{await He(F(i,`flow-context`,c.data.slug),{recursive:!0,force:!0})}catch{}return s(`Flow abandoned. Use flow({ action: "start", name: "<flow>" }) to begin a new flow.`)}catch(e){return n.error(`flow action reset failed`,M(e)),s(`Error: ${o(e)}`)}}async function Au(e,t){let{getFlows:n,log:r,resolveFlowRoot:i,syncMetaToRoots:a,toErrorText:o,toTextResponse:s}=t,{action:c,targetStep:l,lifecycleOwnerToken:u,currentToken:d}=e;if(c===`backtrack`)return l?Eu({targetStep:l,lifecycleOwnerToken:u,currentToken:d},t):s(`Missing required parameter: targetStep for backtrack action.`);try{let e=await i(),{registry:r,stateMachine:o}=await n(e),l=o.getStatus();if(!l.success||!l.data)throw new iu(`NO_ACTIVE_FLOW`,`No active flow. Use flow({ action: "start", name: "<flow>" }) first.`);let u=r.get(l.data.flow);if(!u)throw new iu(`FLOW_NOT_FOUND`,`Flow "${l.data.flow}" not found in registry.`);let d=o.step(c,u.manifest);if(!d.success||!d.data)return s(`Cannot ${c}: ${d.error}`);a(d.data.slug,e);let f=d.data;if(t.eventBus&&(t.eventBus.emit({type:`flow:step:eventbus`,flowName:f.flow,flowSlug:f.slug,stepId:f.currentStep??f.completedSteps[f.completedSteps.length-1]??``,status:{next:`complete`,skip:`complete`,redo:`start`}[c]??`complete`,action:{next:`completed`,skip:`skipped`,redo:`redo`}[c]??`completed`,phase:f.phase??`flow`,completedSteps:[...f.completedSteps,...f.skippedSteps],totalSteps:u.manifest.steps.length,timestamp:Date.now(),eventId:`flow-step-${f.slug}-${Date.now()}`,workspaceId:f.slug,source:`flow-tools`}),f.status===`completed`)){let e=typeof f.startedAt==`number`?f.startedAt:Date.now();t.eventBus.emit({type:`flow:complete:eventbus`,flowName:f.flow,flowSlug:f.slug,outcome:`success`,stepCount:u.manifest.steps.length,completedCount:f.completedSteps.length,skippedCount:f.skippedSteps.length,durationMs:Date.now()-e,timestamp:Date.now(),eventId:`flow-complete-${f.slug}-${Date.now()}`,workspaceId:f.slug,source:`flow-tools`})}let p=[];if(f.status===`completed`){let e=F(t.stateDir,`flow-context`,f.slug);for(let t of[`decision`,`pattern`]){let n=F(e,t);try{let e=await Ve(n);for(let r of e){if(!r.endsWith(`.md`))continue;let e=await Be(F(n,r),`utf-8`);e.length>100&&p.push({type:t,title:r.replace(/\.md$/,``).replace(/-/g,` `),content:e.length>500?`${e.slice(0,497)}...`:e})}}catch{}}typeof He==`function`&&await He(e,{recursive:!0,force:!0}).catch(()=>{})}let m=await Su({context:t,entry:u,state:f,activeRoot:e,primaryRoot:f.primaryRoot,roots:f.roots}),h={...Cu({state:f,data:m,includeStatus:!0,action:c}),_hint:f.currentStep?hu:void 0,phase:f.phase,isEpilogue:f.isEpilogue,completedSteps:f.completedSteps,skippedSteps:f.skippedSteps,totalSteps:m.stepSequence.length,remaining:m.stepSequence.filter(e=>!f.completedSteps.includes(e)&&!f.skippedSteps.includes(e)&&e!==f.currentStep),...p.length>0?{promotionCandidates:p}:{}};return s(JSON.stringify(h,null,2))}catch(e){return au(e)?s(e.message):(r.error(`flow action step failed`,M(e)),s(`Error: ${o(e)}`))}}async function ju(e){let{getFlows:t,log:n,resolveFlowRoot:r,resolveRoots:i,toErrorText:a,toTextResponse:o}=e;try{let{registry:e,stateMachine:n,installer:a}=await t(await r()),s=e.list(),c=n.getStatus(),l={flows:s.map(e=>{let t={name:e.name,version:e.version,source:e.source,sourceType:e.sourceType,format:e.format,steps:e.manifest.steps.map(e=>e.id)};if(e.sourceType===`git`&&e.commitSha){let n=a.hasUpdates(e.installPath);return{...t,commitSha:e.commitSha,updateAvailable:n.success&&n.data?n.data.hasUpdates:void 0}}return t}),activeFlow:c.success&&c.data?{flow:c.data.flow,flowOrigin:c.data.flowOrigin,status:c.data.status,currentStep:c.data.currentStep,slug:c.data.slug,topic:c.data.topic,runDir:c.data.runDir}:null,allRoots:i().normalizedAllRoots,discoveredRepos:i().discoveredRepos};return o(JSON.stringify(l,null,2))}catch(e){return n.error(`flow action list failed`,M(e)),o(`Error: ${a(e)}`)}}async function Mu(e,t){let{getFlows:n,log:r,resolveInstallPath:i,resolveInstructionPath:a,toErrorText:o,toTextResponse:s}=t,{name:c}=e;try{let{registry:e,installer:t}=await n(),r=e.get(c);if(!r)throw new iu(`UNKNOWN_FLOW`,`Flow "${c}" not found. Use flow({ action: "list" }) to see available flows.`);let o=r.commitSha??null,l;if(r.sourceType===`git`&&r.installPath){let e=t.hasUpdates(r.installPath);l=e.success&&e.data?e.data.hasUpdates:void 0}let u={name:r.name,version:r.version,description:r.manifest.description,source:r.source,sourceType:r.sourceType,format:r.format,commitSha:o,updateAvailable:l,installPath:i(r.name,r),registeredAt:r.registeredAt,updatedAt:r.updatedAt,steps:r.manifest.steps.map(e=>({id:e.id,name:e.name,instruction:a(r,e.instruction),produces:e.produces,requires:e.requires,description:e.description})),agents:r.manifest.agents,artifactsDir:r.manifest.artifacts_dir,install:r.manifest.install};return s(JSON.stringify(u,null,2))}catch(e){return au(e)?s(e.message):(r.error(`flow action info failed`,M(e)),s(`Error: ${o(e)}`))}}async function Nu(e,t){let{getAllRoots:n,getFlows:r,log:i,toErrorText:a,toTextResponse:o}=t,{flow:s,status:c,limit:l=50}=e,u=e=>{for(let t of[`updatedAt`,`startedAt`,`createdAt`]){let n=e[t];if(typeof n==`number`&&Number.isFinite(n))return n;if(typeof n==`string`){let e=Date.parse(n);if(!Number.isNaN(e))return e}}return null};try{let e=n(),t=[];for(let n of e){let{stateMachine:e}=await r(n),i=e.listRuns({flow:s,status:c});for(let e of i)t.push({...JSON.parse(JSON.stringify(e)),root:n.replaceAll(`\\`,`/`)})}let i=new Set,a=t.filter(e=>{let t=e.id;return i.has(t)?!1:(i.add(t),!0)});if(a.length===0)return o(`No flow runs found.`);let d=a.map((e,t)=>({run:e,index:t,recency:u(e)})).sort((e,t)=>e.recency==null&&t.recency==null?e.index-t.index:e.recency==null?1:t.recency==null?-1:t.recency===e.recency?e.index-t.index:t.recency-e.recency).map(({run:e})=>e).slice(0,l);return o(JSON.stringify({total:a.length,returned:d.length,truncated:a.length>d.length,runs:d},null,2))}catch(e){return i.error(`flow action runs failed`,M(e)),o(`Error: ${a(e)}`)}}function Pu(e){let t=e.content?.find(e=>e.type===`text`)?.text??``;if(!t)return null;try{let e=JSON.parse(t);if(typeof e.slug==`string`&&e.slug.length>0)return e.slug}catch{}return t.match(/[Ss]lug[:\s]*`?([^`\s,]+)`?/)?.[1]??null}function Fu(e,t,n,r){let i=n&&typeof n!=`function`?n:void 0,a=typeof n==`function`?n:r,o=ru(e,t,i,i?.curated,i?.eventBus,i?.skillCompiler),s=W(`flow`);e.registerTool(`flow`,{title:s.title,description:`Manage development flows — list available flows, start/stop runs, navigate steps, read instructions, and install/remove/update flows. Use action parameter to select operation.`,annotations:s.annotations,inputSchema:{action:L.enum([`list`,`info`,`start`,`step`,`status`,`reset`,`read`,`runs`,`add`,`remove`,`update`,`backtrack`,`claim`]).describe(`The flow operation to perform.`),name:L.string().optional().describe(`Flow name — required for info, start, remove, update. Optional override for add.`),topic:L.string().optional().describe(`Human-readable topic for the run (used by start).`),objective:L.string().optional().describe(`L1 snapshot objective — the goal of this flow run. Falls back to topic when absent.`),acceptanceCriteria:L.array(L.string()).optional().describe(`L1 snapshot acceptance criteria (used by start).`),scope:L.array(L.string()).optional().describe(`L1 snapshot scope boundaries (used by start). Falls back to roots when absent.`),exclusions:L.array(L.string()).optional().describe(`L1 snapshot exclusions — what is out of scope (used by start).`),roots:L.array(L.string()).optional().describe(`Workspace roots participating in this flow (used by start).`),advance:L.enum([`next`,`skip`,`redo`,`backtrack`]).optional().describe(`Step navigation action — required for step.`),lifecycleOwnerToken:L.string().optional().describe(`Owner capability token for layered lifecycle mutations (required in layered mode for step/backtrack/claim/reset).`),currentToken:L.string().optional().describe(`Current step execution token from status response for optimistic concurrency.`),targetStep:L.string().optional().describe(`Target step ID for backtrack action — must be a completed prior step.`),step:L.string().optional().describe(`Step id or name to read (used by read). Defaults to current step.`),source:L.string().optional().describe(`Git URL, local path, or "openspec" shorthand — required for add.`),token:L.string().optional().describe(`Auth token for private repos (used by add).`),filter_flow:L.string().optional().describe(`Filter runs by flow name (used by runs).`),filter_status:L.string().optional().describe(`Filter runs by status: active, completed, abandoned (used by runs).`),limit:L.number().int().positive().optional().describe(`Max runs to return (default 50).`)}},Y(`flow`,async e=>{switch(e.action){case`list`:return ju(o);case`info`:return e.name?Mu({name:e.name},o):o.toTextResponse(`Missing required parameter: name`);case`start`:{if(!e.name)return o.toTextResponse(`Missing required parameter: name (flow to start)`);let t=await Tu({flow:e.name,topic:e.topic,roots:e.roots,objective:e.objective,acceptanceCriteria:e.acceptanceCriteria,scope:e.scope,exclusions:e.exclusions},o),n=Pu(t);return n&&a&&a(n),t}case`step`:return e.advance?Au({action:e.advance,targetStep:e.targetStep,lifecycleOwnerToken:e.lifecycleOwnerToken,currentToken:e.currentToken},o):o.toTextResponse(`Missing required parameter: advance (next/skip/redo/backtrack)`);case`status`:{let e=await Ou(o);return a&&a(Pu(e)),e}case`reset`:{let e=await ku(o);return a&&a(null),e}case`read`:return su({step:e.step},o);case`runs`:return Nu({flow:e.filter_flow,status:e.filter_status,limit:e.limit},o);case`add`:return e.source?du({source:e.source,name:e.name,token:e.token},o):o.toTextResponse(`Missing required parameter: source`);case`remove`:return e.name?fu({name:e.name},o):o.toTextResponse(`Missing required parameter: name`);case`update`:return e.name?pu({name:e.name},o):o.toTextResponse(`Missing required parameter: name`);case`backtrack`:return e.targetStep?Eu({targetStep:e.targetStep,lifecycleOwnerToken:e.lifecycleOwnerToken,currentToken:e.currentToken},o):o.toTextResponse(`Missing required parameter: targetStep for backtrack action`);case`claim`:return Du({currentToken:e.currentToken},o);default:return o.toTextResponse(`Unknown action: ${e.action}`)}}))}const Iu=A(`tools`);function Lu(e){let t=W(`evidence_map`);e.registerTool(`evidence_map`,{title:t.title,description:`Track verified/assumed/unresolved claims for complex tasks. Gate readiness: YIELD (proceed), HOLD (unknowns), HARD_BLOCK (critical gaps). Persists across calls.`,inputSchema:{action:L.enum([`create`,`add`,`update`,`get`,`gate`,`list`,`delete`]).describe(`Operation to perform`),task_id:L.string().optional().describe(`Task identifier (required for all except list)`),tier:L.enum([`floor`,`standard`,`critical`]).optional().describe(`FORGE tier (required for create)`),claim:L.string().optional().describe(`Critical-path claim text (for add)`),status:L.enum([`V`,`A`,`U`]).optional().describe(`Evidence status: V=Verified, A=Assumed, U=Unresolved`),receipt:L.string().optional().describe(`Evidence receipt: tool→ref for V, reasoning for A, attempts for U`),id:L.number().optional().describe(`Entry ID (for update)`),critical_path:L.boolean().default(!0).describe(`Whether this claim is on the critical path`),unknown_type:L.enum([`contract`,`convention`,`freshness`,`runtime`,`data-flow`,`impact`]).optional().describe(`Typed unknown classification`),safety_gate:L.enum([`provenance`,`commitment`,`coverage`]).optional().describe(`Safety gate tag: provenance (claim→evidence), commitment (user-approved), coverage (nothing dropped)`),retry_count:L.number().default(0).describe(`Retry count for gate evaluation (0 = first attempt)`),max_retries:L.number().int().min(0).optional().describe(`Maximum retries before escalating. Default: 3`),timeout_action:L.enum([`iterate`,`retry`,`manual`,`terminate`]).optional().describe(`Action to take when gate retries are exhausted. Default: manual`),cwd:L.string().optional().describe(`Working directory for evidence map storage (default: server cwd). Use root_path from forge_ground to match.`)},annotations:t.annotations},Y(`evidence_map`,async({action:e,task_id:t,tier:n,claim:r,status:i,receipt:a,id:o,critical_path:s,unknown_type:c,safety_gate:l,retry_count:u,max_retries:d,timeout_action:f,cwd:p})=>{try{switch(e){case`create`:if(!t)throw Error(`task_id required for create`);if(!n)throw Error(`tier required for create`);return Ct({action:`create`,taskId:t,tier:n},p),{content:[{type:`text`,text:`Created evidence map "${t}" (tier: ${n}).\n\n---\n_Next: Use \`evidence_map\` with action "add" to record critical-path claims._`}]};case`add`:{if(!t)throw Error(`task_id required for add`);if(!r)throw Error(`claim required for add`);if(!i)throw Error(`status required for add`);let e=Ct({action:`add`,taskId:t,claim:r,status:i,receipt:a??``,criticalPath:s,unknownType:c,safetyGate:l},p),n=e.autoCreated?[`⚠️ Evidence map "${t}" was auto-created with tier "standard". Use \`create\` action to set a specific tier.`,``,`Added entry #${e.entry?.id} to "${t}": [${i}] ${r}`]:[`Added entry #${e.entry?.id} to "${t}": [${i}] ${r}`];return e.summary&&n.push(``,e.summary),{content:[{type:`text`,text:n.join(`
192
192
  `)}]}}case`update`:{if(!t)throw Error(`task_id required for update`);if(o===void 0)throw Error(`id required for update`);if(!i)throw Error(`status required for update`);let e=Ct({action:`update`,taskId:t,id:o,status:i,receipt:a??``},p),n=[`Updated entry #${o} in "${t}" → ${i}`];return e.summary&&n.push(``,e.summary),{content:[{type:`text`,text:n.join(`
193
193
  `)}]}}case`get`:{if(!t)throw Error(`task_id required for get`);let e=Ct({action:`get`,taskId:t},p);return e.state?{content:[{type:`text`,text:[`## Evidence Map: ${t} (${e.state.tier})`,``,e.formattedMap??`No entries.`,``,`_${e.state.entries.length} entries — created ${e.state.createdAt}_`].join(`
194
194
  `)}]}:{content:[{type:`text`,text:`Evidence map "${t}" not found.`}]}}case`gate`:{if(!t)throw Error(`task_id required for gate`);let e=Ct({action:`gate`,taskId:t,retryCount:u,maxRetries:d,timeoutAction:f},p);if(!e.gate)return{content:[{type:`text`,text:`Evidence map "${t}" not found.`}]};let n=e.gate,r=[`## FORGE Gate: **${n.verdict}**`,``,`**Reason:** ${n.reason}`,``,`**Stats:** ${n.stats.verified}V / ${n.stats.assumed}A / ${n.stats.unresolved}U (${n.stats.total} total)`];return n.action&&r.push(``,`**Recommended action:** ${n.action}`),n.retriesRemaining!==void 0&&r.push(`**Retries remaining:** ${n.retriesRemaining}`),n.summary&&r.push(``,`**Summary:** ${n.summary}`),n.warnings.length>0&&r.push(``,`**Warnings:**`,...n.warnings.map(e=>`- ⚠️ ${e}`)),n.unresolvedCritical.length>0&&r.push(``,`**Blocking entries:**`,...n.unresolvedCritical.map(e=>`- #${e.id}: ${e.claim} [${e.unknownType??`untyped`}]`)),n.safetyGates&&(r.push(``,`**Safety Gates:**`,`- Provenance: ${n.safetyGates.provenance}`,`- Commitment: ${n.safetyGates.commitment}`,`- Coverage: ${n.safetyGates.coverage}`),n.safetyGates.failures.length>0&&r.push(``,`**Safety failures:**`,...n.safetyGates.failures.map(e=>`- \u{1F6D1} ${e}`))),n.annotation&&r.push(``,`**Annotation:**`,n.annotation),e.formattedMap&&r.push(``,`---`,``,e.formattedMap),r.push(``,`---`,`_Next: ${n.verdict===`YIELD`?`Proceed to implementation.`:n.action===`iterate`?`Re-run the build loop, then evaluate the gate again.`:n.action===`retry`?`Re-evaluate the gate after refreshing evidence.`:n.action===`manual`?`Ask for human review before proceeding.`:`Abort the current path and terminate the task.`}_`),{content:[{type:`text`,text:r.join(`
@@ -1,4 +1,4 @@
1
- import{t as e}from"./curated-manager-D4MOFQ-t.js";import{A as t,B as n,C as r,E as i,F as a,G as o,H as s,I as c,J as l,K as u,L as d,N as f,O as p,P as m,R as h,S as g,T as _,U as v,V as y,W as b,_ as x,b as S,c as C,d as w,g as T,h as E,i as ee,j as te,k as D,l as ne,o as re,p as ie,q as O,r as ae,v as oe,y as se,z as ce}from"./startup-maintenance-kHH8tjds.js";import{createRequire as le}from"node:module";import{fileURLToPath as ue}from"node:url";import{promisify as de}from"node:util";import{AIKIT_GLOBAL_PATHS as fe,AIKIT_RUNTIME_PATHS as pe,CONTENT_TYPES as me,CircuitBreaker as he,HealthBus as ge,KNOWLEDGE_ORIGINS as _e,SOURCE_TYPES as ve,TOKEN_BUDGETS as ye,computePartitionKey as be,createLogger as k,getGlobalDataDir as xe,getPartitionDir as Se,hashPath as Ce,isUserInstalled as we,listWorkspaces as Te,safeCwd as A,safeCwdOrHome as Ee,serializeError as j}from"../../core/dist/index.js";import{copyFileSync as De,existsSync as M,mkdirSync as Oe,readFileSync as N,readdirSync as ke,renameSync as Ae,rmSync as je,statSync as Me,unlinkSync as Ne,writeFileSync as Pe}from"node:fs";import{basename as Fe,dirname as Ie,isAbsolute as Le,join as P,relative as Re,resolve as F,sep as ze}from"node:path";import{mkdir as Be,readFile as Ve,readdir as He,rm as Ue,stat as We,unlink as Ge,writeFile as Ke}from"node:fs/promises";import{createHash as qe,randomBytes as Je,randomUUID as Ye,timingSafeEqual as Xe}from"node:crypto";import{WORKSPACE_SKILL_FILENAME as Ze,acquireLease as Qe,addToWorkset as $e,audit as et,bookendReorder as tt,buildNodeNameMap as nt,changelog as rt,check as it,checkpointDiff as at,checkpointGC as ot,checkpointHistory as st,checkpointLatest as ct,checkpointList as lt,checkpointLoad as ut,checkpointSave as dt,codemod as ft,compressTerminalOutput as pt,computeSourceHash as mt,createRestorePoint as ht,createSearchSuccessResponse as gt,delegate as _t,delegateListModels as vt,deleteWorkset as yt,diffParse as bt,digest as xt,envInfo as St,evaluate as Ct,evidenceMap as wt,fileSummaryTool as Tt,find as Et,findExamples as Dt,forgeGround as Ot,generateFlowBriefing as kt,generateWorkspaceSkill as At,getRefTelemetry as jt,getWorkset as Mt,gitContext as Nt,graphAugmentSearch as Pt,graphQuery as Ft,isSkillStale as It,laneCreate as Lt,laneDiff as Rt,laneDiscard as zt,laneList as Bt,laneMerge as Vt,laneStatus as Ht,listActiveLeases as Ut,listRestorePoints as Wt,listWorksets as Gt,measure as Kt,normalizeSkillInput as qt,onboard as Jt,parseOutput as Yt,processList as Xt,processLogs as Zt,processStart as Qt,processStatus as $t,processStop as en,queueClear as tn,queueCreate as nn,queueDag as rn,queueDelete as an,queueDone as on,queueFail as sn,queueGet as cn,queueList as ln,queueNext as un,queuePush as dn,releaseLease as fn,removeFromWorkset as pn,rename as mn,replayClear as hn,replayList as gn,replayTrim as _n,resolveNodeName as vn,resolveSkillDir as yn,resolveWorkspaceDir as bn,restoreFromPoint as xn,saveWorkset as Sn,schemaValidate as Cn,scopeMap as wn,scoreCompliance as Tn,sessionDigest as En,sessionDigestSampling as Dn,stashClear as On,stashDelete as kn,stashGet as An,stashList as jn,stashSet as Mn,storeReversibleContext as Nn,summarizeCheckResult as Pn,symbol as Fn,testRun as In,trace as Ln,truncateToTokenBudget as Rn,watchList as zn,webFetch as Bn,webSearch as Vn}from"../../tools/dist/index.js";import{exec as Hn,execFile as Un,execSync as Wn}from"node:child_process";import{homedir as Gn,tmpdir as Kn}from"node:os";import{getEngine as qn,registerBrowserTools as Jn}from"../../browser/dist/index.js";import{ResourceTemplate as Yn}from"@modelcontextprotocol/sdk/server/mcp.js";import{BlastRadiusAnalyzer as Xn,DependencyAnalyzer as Zn,DiagramGenerator as Qn,EntryPointAnalyzer as $n,KnowledgeProducer as er,PatternAnalyzer as tr,StructureAnalyzer as nr,SymbolAnalyzer as rr}from"../../analyzers/dist/index.js";import{WasmDiagnostics as ir,WasmRuntime as ar}from"../../chunker/dist/index.js";import{z as I}from"zod";import{ERCache as or,ERClient as sr,PushAdapter as cr,mergeResults as lr}from"../../enterprise-bridge/dist/index.js";import{RESOURCE_MIME_TYPE as ur,getUiCapability as dr,registerAppResource as fr,registerAppTool as pr}from"@modelcontextprotocol/ext-apps/server";import{createStore as mr}from"../../store/dist/index.js";import{buildSnapshot as hr,createOwnerCapability as gr,rotateOwnerCapability as _r,validateToken as vr}from"../../flows/dist/index.js";import{TemplateRegistry as yr,buildShell as br,dashboardTemplateDefinition as xr,defaultRegistry as Sr,flameGraphTemplateDefinition as Cr,isError as wr,isResult as Tr,kanbanTemplateDefinition as Er,listSortTemplateDefinition as Dr,renderSurface as Or}from"../../blocks-core/dist/index.mjs";import{createServer as kr}from"node:http";import"../../tool-routing/dist/index.mjs";const Ar={enabled:!0,batchSize:10,debounceMs:5e3,maxFactsPerSession:50,minQuality:.3};function L(e){return(e.content??[]).filter(e=>e.type===`text`&&typeof e.text==`string`).map(e=>e.text??``).join(`
1
+ import{t as e}from"./curated-manager-D4MOFQ-t.js";import{A as t,B as n,C as r,E as i,F as a,G as o,H as s,I as c,J as l,K as u,L as d,N as f,O as p,P as m,R as h,S as g,T as _,U as v,V as y,W as b,_ as x,b as S,c as C,d as w,g as T,h as E,i as ee,j as te,k as D,l as ne,o as re,p as ie,q as O,r as ae,v as oe,y as se,z as ce}from"./startup-maintenance-QrloHssd.js";import{createRequire as le}from"node:module";import{fileURLToPath as ue}from"node:url";import{promisify as de}from"node:util";import{AIKIT_GLOBAL_PATHS as fe,AIKIT_RUNTIME_PATHS as pe,CONTENT_TYPES as me,CircuitBreaker as he,HealthBus as ge,KNOWLEDGE_ORIGINS as _e,SOURCE_TYPES as ve,TOKEN_BUDGETS as ye,computePartitionKey as be,createLogger as k,getGlobalDataDir as xe,getPartitionDir as Se,hashPath as Ce,isUserInstalled as we,listWorkspaces as Te,safeCwd as A,safeCwdOrHome as Ee,serializeError as j}from"../../core/dist/index.js";import{copyFileSync as De,existsSync as M,mkdirSync as Oe,readFileSync as N,readdirSync as ke,renameSync as Ae,rmSync as je,statSync as Me,unlinkSync as Ne,writeFileSync as Pe}from"node:fs";import{basename as Fe,dirname as Ie,isAbsolute as Le,join as P,relative as Re,resolve as F,sep as ze}from"node:path";import{mkdir as Be,readFile as Ve,readdir as He,rm as Ue,stat as We,unlink as Ge,writeFile as Ke}from"node:fs/promises";import{createHash as qe,randomBytes as Je,randomUUID as Ye,timingSafeEqual as Xe}from"node:crypto";import{WORKSPACE_SKILL_FILENAME as Ze,acquireLease as Qe,addToWorkset as $e,audit as et,bookendReorder as tt,buildNodeNameMap as nt,changelog as rt,check as it,checkpointDiff as at,checkpointGC as ot,checkpointHistory as st,checkpointLatest as ct,checkpointList as lt,checkpointLoad as ut,checkpointSave as dt,codemod as ft,compressTerminalOutput as pt,computeSourceHash as mt,createRestorePoint as ht,createSearchSuccessResponse as gt,delegate as _t,delegateListModels as vt,deleteWorkset as yt,diffParse as bt,digest as xt,envInfo as St,evaluate as Ct,evidenceMap as wt,fileSummaryTool as Tt,find as Et,findExamples as Dt,forgeGround as Ot,generateFlowBriefing as kt,generateWorkspaceSkill as At,getRefTelemetry as jt,getWorkset as Mt,gitContext as Nt,graphAugmentSearch as Pt,graphQuery as Ft,isSkillStale as It,laneCreate as Lt,laneDiff as Rt,laneDiscard as zt,laneList as Bt,laneMerge as Vt,laneStatus as Ht,listActiveLeases as Ut,listRestorePoints as Wt,listWorksets as Gt,measure as Kt,normalizeSkillInput as qt,onboard as Jt,parseOutput as Yt,processList as Xt,processLogs as Zt,processStart as Qt,processStatus as $t,processStop as en,queueClear as tn,queueCreate as nn,queueDag as rn,queueDelete as an,queueDone as on,queueFail as sn,queueGet as cn,queueList as ln,queueNext as un,queuePush as dn,releaseLease as fn,removeFromWorkset as pn,rename as mn,replayClear as hn,replayList as gn,replayTrim as _n,resolveNodeName as vn,resolveSkillDir as yn,resolveWorkspaceDir as bn,restoreFromPoint as xn,saveWorkset as Sn,schemaValidate as Cn,scopeMap as wn,scoreCompliance as Tn,sessionDigest as En,sessionDigestSampling as Dn,stashClear as On,stashDelete as kn,stashGet as An,stashList as jn,stashSet as Mn,storeReversibleContext as Nn,summarizeCheckResult as Pn,symbol as Fn,testRun as In,trace as Ln,truncateToTokenBudget as Rn,watchList as zn,webFetch as Bn,webSearch as Vn}from"../../tools/dist/index.js";import{exec as Hn,execFile as Un,execSync as Wn}from"node:child_process";import{homedir as Gn,tmpdir as Kn}from"node:os";import{getEngine as qn,registerBrowserTools as Jn}from"../../browser/dist/index.js";import{ResourceTemplate as Yn}from"@modelcontextprotocol/sdk/server/mcp.js";import{BlastRadiusAnalyzer as Xn,DependencyAnalyzer as Zn,DiagramGenerator as Qn,EntryPointAnalyzer as $n,KnowledgeProducer as er,PatternAnalyzer as tr,StructureAnalyzer as nr,SymbolAnalyzer as rr}from"../../analyzers/dist/index.js";import{WasmDiagnostics as ir,WasmRuntime as ar}from"../../chunker/dist/index.js";import{z as I}from"zod";import{ERCache as or,ERClient as sr,PushAdapter as cr,mergeResults as lr}from"../../enterprise-bridge/dist/index.js";import{RESOURCE_MIME_TYPE as ur,getUiCapability as dr,registerAppResource as fr,registerAppTool as pr}from"@modelcontextprotocol/ext-apps/server";import{createStore as mr}from"../../store/dist/index.js";import{buildSnapshot as hr,createOwnerCapability as gr,rotateOwnerCapability as _r,validateToken as vr}from"../../flows/dist/index.js";import{TemplateRegistry as yr,buildShell as br,dashboardTemplateDefinition as xr,defaultRegistry as Sr,flameGraphTemplateDefinition as Cr,isError as wr,isResult as Tr,kanbanTemplateDefinition as Er,listSortTemplateDefinition as Dr,renderSurface as Or}from"../../blocks-core/dist/index.mjs";import{createServer as kr}from"node:http";import"../../tool-routing/dist/index.mjs";const Ar={enabled:!0,batchSize:10,debounceMs:5e3,maxFactsPerSession:50,minQuality:.3};function L(e){return(e.content??[]).filter(e=>e.type===`text`&&typeof e.text==`string`).map(e=>e.text??``).join(`
2
2
  `)}function R(e){return qe(`sha256`).update(e).digest(`hex`).slice(0,16)}function jr(e){let t=0;return e.length>=50&&(t+=.2),e.length>=150&&(t+=.1),/[a-zA-Z]\w+\.\w+/.test(e)&&(t+=.15),/[:=]|^[-*]|\n[-*]|```/.test(e)&&(t+=.15),/\b(use|should|must|always|never|prefer|avoid|requires?|detected|confirmed|verified)\b/i.test(e)&&(t+=.2),/^(Error|TypeError|ReferenceError):/m.test(e)&&e.length<100&&(t-=.2),Math.max(0,Math.min(1,t))}const Mr={enabled:!0,batchThreshold:20,cooldownMs:3e5,maxCandidatesPerSession:5,initialConfidence:40,excludeTools:[`knowledge`,`replay`,`stash`,`checkpoint`,`session_digest`,`reindex`,`status`,`flow`,`evidence_map`,`present`]},Nr=new Set([`search`,`find`,`symbol`,`grep_search`,`semantic_search`]),Pr=new Set([`replace_string_in_file`,`editfiles`,`create_file`,`apply_patch`]),Fr=new Set([`check`,`test_run`]),Ir=new Set(`action.and.args.auto.buffer.category.content.create.cwd.false.file.files.find.grep.json.knowledge.list.path.query.read.replace.search.semantic.subaction.symbol.test.tool.true.update`.split(`.`));function Lr(e){let t=e.toLowerCase().match(/[a-z0-9]{2,}/g)??[];return new Set(t)}function Rr(e,t){let n=Lr(e),r=Lr(t);if(n.size===0&&r.size===0)return 1;if(n.size===0||r.size===0)return 0;let i=new Set([...n].filter(e=>r.has(e))),a=new Set([...n,...r]);return i.size/a.size}function zr(e,t){return e.length<=t?e:`${e.slice(0,Math.max(0,t-1))}...`}function Br(e){try{return JSON.stringify(e)}catch{return`[unserializable args]`}}function Vr(e){return e.replace(/^mcp_[^_]+_/,``).toLowerCase()}function Hr(e){return[...new Set(e.filter(e=>e.length>0))]}function Ur(e,t){return{...t,confidence:Mr.initialConfidence,tags:[`auto-observed`,`detector:${e}`],detector:e}}function Wr(e,t){let n=new Map;for(let t of e)for(let e of Lr(t))Ir.has(e)||n.set(e,(n.get(e)??0)+1);let r=[...n.entries()].filter(([,e])=>e>=t).sort((e,t)=>t[1]-e[1]||e[0].localeCompare(t[0])).map(([e])=>e);return r.length>0?r.slice(0,4):[...n.entries()].sort((e,t)=>t[1]-e[1]||e[0].localeCompare(t[0])).slice(0,4).map(([e])=>e)}function Gr(e){return e.length>0?e.join(`, `):`similar tasks`}function Kr(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.ts==`number`&&Number.isFinite(t.ts)&&typeof t.tool==`string`&&typeof t.input==`string`&&(t.output===void 0||typeof t.output==`string`)&&Array.isArray(t.files)&&t.files.every(e=>typeof e==`string`)}function qr(e){let t=[];for(let n of e)t.some(e=>Rr(e.title,n.title)>.8)||t.push(n);return t}function Jr(e){return typeof e==`string`?[e]:Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function Yr(e){return typeof e==`string`?[...e.matchAll(/^\*\*\* (?:Add|Delete|Update) File: (.+)$/gm)].map(e=>e[1]?.trim()??``).filter(Boolean):[]}function Xr(e){let t=[],n=e=>{if(!(typeof e!=`object`||!e)){if(Array.isArray(e)){for(let t of e)n(t);return}for(let[r,i]of Object.entries(e))(r===`path`||r===`filePath`||r===`files`)&&t.push(...Jr(i)),n(i)}};return n(e),t.push(...Yr(e.input)),Hr(t)}function Zr(e){return{tool:e.toolName,input:zr(Br(e.args),200),output:zr(L(e.result),500),files:Xr(e.args),ts:Date.now()}}function Qr(e){return{title:e.title,content:`${e.context}\n\n${e.insight}\n\nEvidence:\n${e.evidence}`,category:`conventions`,tags:Hr([`auto-observed`,`detector:${e.detector}`,...e.tags]),hash:qe(`sha256`).update(`${e.detector}:${e.title}`).digest(`hex`).slice(0,16),quality:Math.max(0,Math.min(1,e.confidence/100)),source:`behavioral:${e.detector}`}}function $r(e){let t=new Map;for(let n of e){let e=Vr(n.tool),r=t.get(e)??[];r.push(n),t.set(e,r)}return[...t.entries()].filter(([,e])=>e.length>=5).map(([e,t])=>{let n=Gr(Wr(t.map(e=>e.input),Math.max(2,Math.ceil(t.length/2))));return Ur(`tool-preference`,{title:`Preferred tool: ${e} for ${n}`,context:`Observed ${t.length} ${e} calls with recurring inputs around ${n}.`,insight:`Use ${e} when working with ${n}.`,evidence:t.slice(0,5).map(e=>`${e.tool}: ${e.input}`).join(`
3
3
  `)})})}function ei(e){let t=new Map;for(let n=0;n<e.length;n+=1){let r=e[n];if(Nr.has(Vr(r.tool)))for(let i=n+1;i<e.length&&i<=n+5;i+=1){let n=e[i];if(!(!Pr.has(Vr(n.tool))||n.files.length===0))for(let e of Hr(n.files)){let i=t.get(e)??{count:0,queries:[],evidence:[]};i.count+=1,i.queries.push(r.input),i.evidence.push(`${r.tool}: ${r.input} -> ${n.tool}: ${e}`),t.set(e,i)}}}return[...t.entries()].filter(([,e])=>e.count>=3).map(([e,t])=>{let n=Gr(Wr(t.queries,Math.max(2,Math.ceil(t.count/2))));return Ur(`search-action`,{title:`Check ${e} when searching for ${n}`,context:`Searches related to ${n} were followed by edits to ${e} ${t.count} times within five tool calls.`,insight:`When working on ${n}, check ${e} early because searches repeatedly led there.`,evidence:t.evidence.slice(0,5).join(`
4
4
  `)})})}function ti(e){let t=new Map;for(let n=0;n<e.length-2;n+=1){let r=e[n];if(!Fr.has(Vr(r.tool)))continue;let i=new Set,a=!1;for(let o=n+1;o<e.length;o+=1){let n=e[o],s=Vr(n.tool);if(Pr.has(s)){a=!0;for(let e of n.files)i.add(e);continue}if(Fr.has(s)){if(!a||i.size===0)break;let e=[...i].sort(),o=e.join(`|`),s=t.get(o)??{count:0,evidence:[]};s.count+=1,s.evidence.push(`${r.tool} -> edit(${e.join(`, `)}) -> ${n.tool}`),t.set(o,s);break}if(!a)break}}return[...t.entries()].filter(([,e])=>e.count>=2).map(([e,t])=>{let n=e.split(`|`);return Ur(`error-fix-cycle`,{title:`Repeated validation-edit loop in ${n.length===1?n[0]:`${n[0]} and related files`}`,context:`Observed ${t.count} validation cycles touching ${n.join(`, `)}.`,insight:`Common fix pattern in ${n.join(`, `)}: check -> edit -> recheck.`,evidence:t.evidence.slice(0,5).join(`
@@ -187,7 +187,7 @@ Output ONLY the README.md content, nothing else.`;if(t.available)try{let i=(awai
187
187
 
188
188
  `).trim();r=t?yu(t):null}let i=Array.from(e.matchAll(/^##\s+.*$/gm)),a=[];for(let[t,n]of i.entries()){let r=n[0];if(!_u.test(r))continue;let o=n.index??0,s=i[t+1]?.index??e.length;a.push(e.slice(o,s).replace(/\s+$/,``))}return{brief:r,pins:a.length>0?a.join(`
189
189
 
190
- `):null}}function xu(e,t){return t(e)}async function Su(e){let{context:t,entry:n,state:r,activeRoot:i,primaryRoot:a,roots:o}=e,{instructionPath:s,description:c}=t.resolveCurrentStepInfo(n,r.currentStep,i),l=xu(n,t.getStepSequence),u=await ou({entry:n,stepId:r.currentStep,runDir:r.runDir,slug:r.slug,primaryRoot:a,roots:o,activeRoot:i,resolveInstructionPath:t.resolveInstructionPath,resolveEpilogueInstructionPath:t.resolveEpilogueInstructionPath}),{brief:d,pins:f}=bu(u),p=d;if(d&&r.currentStep){let e=n.manifest.steps.find(e=>e.id===r.currentStep),a={stepId:r.currentStep,flowName:r.flow,flowSlug:r.slug,phase:`flow`,runDir:r.runDir,artifactsPath:P(r.runDir,n.manifest.artifacts_dir).replaceAll(`\\`,`/`),completedSteps:r.completedSteps??[],stepDescription:e?.description??c??void 0,agents:e?.agents??[],mode:`brief`,topic:r.topic??``,activeRoot:i};p=await t.stepPipeline.enrich(d,a,n.manifest.hooks)}return{artifactsPath:P(r.runDir,n.manifest.artifacts_dir).replaceAll(`\\`,`/`),currentStepInstruction:s,currentStepDescription:c,currentStepContent:u,currentStepBrief:p,currentStepPins:f,stepSequence:l}}function Cu(e){let{state:t,data:n,started:r,includeStatus:i,action:a,includeInstructionPath:o}=e,s={};return r&&(s.started=!0),s.flow=t.flow,t.flowOrigin&&(s.flowOrigin=t.flowOrigin),i&&(s.status=t.status),a&&(s.action=a),s.slug=t.slug,s.topic=t.topic,s.runDir=t.runDir,s.artifactsPath=n.artifactsPath,s.currentStep=t.currentStep,s.currentStepInstruction=n.currentStepInstruction,o&&(s.instructionPath=n.currentStepInstruction),s.currentStepDescription=n.currentStepDescription,s.currentStepContent=n.currentStepContent,s.currentStepContentHash=n.currentStepContent?mu(n.currentStepContent):null,s.currentStepBrief=n.currentStepBrief,s.currentStepPins=n.currentStepPins,s.fullContentHint=`Call flow({ action: 'read' }) for the complete step instructions.`,s}function wu(e){return e.sourceType===`local`?{source:`local`,sourceType:e.sourceType,format:e.format,...e.commitSha?{commitSha:e.commitSha}:{}}:{source:e.source,sourceType:e.sourceType,format:e.format,...e.commitSha?{commitSha:e.commitSha}:{}}}async function Tu(e,t){let{getAllRoots:n,getFlows:r,getWorkspaceRoot:i,isValidFlowRoot:a,log:o,patchMetaRoots:s,stateDir:c,toErrorText:l,toTextResponse:u}=t,{flow:d,topic:f,roots:p,objective:m,acceptanceCriteria:h,scope:g,exclusions:_}=e;try{if(p&&p.length>0){let e=n().map(e=>e.replaceAll(`\\`,`/`)),t=p.filter(e=>!a(e));if(t.length>0)return u(`Invalid roots — not part of the workspace or a recognized sub-repository: ${t.join(`, `)}. Available roots: ${e.join(`, `)}`)}let e=n(),o=e.map(e=>e.replaceAll(`\\`,`/`)),l=i(),v=e.length>1,y=!p&&v,b=p?.[0]??l,{registry:x,stateMachine:S}=await r(b),C=x.get(d);if(!C)throw new iu(`UNKNOWN_FLOW`,`Flow "${d}" not found. Use flow({ action: "list" }) to see available flows.`);let w=S.start(C.name,C.manifest,f,wu(C),{objective:m,acceptanceCriteria:h,scope:g,exclusions:_});if(!w.success||!w.data){let e=w.error??`Unknown flow start error.`;return e.includes(`already active`)?u(`Cannot start: ${new iu(`FLOW_ALREADY_ACTIVE`,e).message}`):u(`Cannot start: ${e}`)}let T=w.data;t.eventBus&&t.eventBus.emit({type:`flow:step:eventbus`,flowName:T.flow,flowSlug:T.slug,stepId:T.currentStep??``,status:`start`,action:`started`,phase:T.phase??`flow`,completedSteps:[],totalSteps:C.manifest.steps.length,timestamp:Date.now(),eventId:`flow-start-${T.slug}-${Date.now()}`,workspaceId:T.slug,source:`flow-tools`});let E;if(t.config.layeredKnowledge){let e=gr(),t=S.setOwnerCapability({ownerTokenSalt:e.salt,ownerTokenHash:e.hash,ownerTokenVersion:e.version});if(!t.success)return u(`Cannot start in layered mode: failed to persist owner capability — ${t.error??`unknown error`}`);E=e.rawToken}if(p&&p.length>1)try{s(T.slug,b,p),t.syncMetaToRoots(T.slug,b)}catch(e){return S.reset(),u(`Flow created but failed to sync to secondary roots — rolled back. Error: ${e instanceof Error?e.message:String(e)}`)}let ee=P(c,`flow-context`),te=typeof He==`function`?await He(ee).catch(()=>[]):[];for(let e of te)e!==T.slug&&typeof Ue==`function`&&await Ue(P(ee,e),{recursive:!0,force:!0}).catch(()=>{});if(typeof Be==`function`)try{await Be(P(ee,T.slug),{recursive:!0})}catch{}let D=await Su({context:t,entry:C,state:T,activeRoot:b,primaryRoot:null,roots:p??null}),ne=hr(T,C.manifest,{objective:m,acceptanceCriteria:h,scope:g,exclusions:_}),re={...Cu({state:T,data:D,started:!0}),phase:T.phase,isEpilogue:T.isEpilogue,totalSteps:D.stepSequence.length,stepSequence:D.stepSequence,artifactsDir:C.manifest.artifacts_dir,roots:p??[b.replaceAll(`\\`,`/`)],snapshot:ne,_hint:hu,...y?{multiRootWarning:`No roots specified in multi-root workspace. Flow created at workspace root. Pass roots parameter with target repo for precise placement.`,availableRoots:o}:{},...E?{_ownerToken:E}:{}};return u(JSON.stringify(re,null,2))}catch(e){return au(e)?u(e.message):(o.error(`flow action start failed`,j(e)),u(`Error: ${l(e)}`))}}async function Eu(e,t){let{getFlows:n,log:r,resolveFlowRoot:i,syncMetaToRoots:a,toErrorText:o,toTextResponse:s}=t,{targetStep:c,lifecycleOwnerToken:l,currentToken:u}=e;try{let e=await i(),{registry:r,stateMachine:o}=await n(e),d=o.getStatus();if(!d.success||!d.data)return s(`No active flow. Use flow({ action: "start", name: "<flow>" }) first.`);let f=d.data,p=r.get(f.flow);if(!p)return s(`Flow "${f.flow}" not found in registry.`);if(t.config.layeredKnowledge){if(!l)return s(`lifecycleOwnerToken required in layered mode.`);let e=f,t=e.ownerTokenSalt,n=e.ownerTokenHash;if(!t||!n)return s(`Flow has no owner capability — cannot backtrack.`);if(!vr(l,t,n))return s(`Invalid lifecycleOwnerToken — backtrack denied.`);if(u&&u!==f.currentToken)return s(`Invalid currentToken — flow state changed since last status.`)}let m=o.backtrack(c,p.manifest);if(!m.success||!m.data)return s(`Cannot backtrack: ${m.error}`);a(m.data.slug,e);let h=m.data,g=await Su({context:t,entry:p,state:h,activeRoot:e,primaryRoot:h.primaryRoot,roots:h.roots}),_={...Cu({state:h,data:g,includeStatus:!0,action:`backtrack`}),_hint:h.currentStep?hu:void 0,phase:h.phase,isEpilogue:h.isEpilogue,completedSteps:h.completedSteps,skippedSteps:h.skippedSteps,totalSteps:g.stepSequence.length};return s(JSON.stringify(_,null,2))}catch(e){return au(e)?s(e.message):(r.error(`flow action backtrack failed`,j(e)),s(`Error: ${o(e)}`))}}async function Du(e,t){let{getFlows:n,log:r,resolveFlowRoot:i,syncMetaToRoots:a,toErrorText:o,toTextResponse:s}=t,{currentToken:c}=e;try{let e=await i(),{stateMachine:r}=await n(e),o=r.getStatus();if(!o.success||!o.data)return s(`No active flow. Use flow({ action: "start", name: "<flow>" }) first.`);let l=o.data;if(c&&c!==l.currentToken)return s(`Invalid currentToken — claim denied.`);if(!t.config.layeredKnowledge)return s(`Claim requires layeredKnowledge mode.`);let u=t.server?(await import(`./startup-maintenance-kHH8tjds.js`).then(e=>e.m)).createSamplingClient(t.server):null;if(u?.available){if((await u.createMessage({prompt:`You have been asked to transfer flow ownership. Do you confirm?`,systemPrompt:`Respond with "yes" to confirm or anything else to decline.`,maxTokens:16,modelPreferences:{intelligencePriority:.2,speedPriority:.9,costPriority:.9}})).text.trim().toLowerCase()!==`yes`)return s(`Ownership transfer declined by user.`)}else return s(`Cannot verify ownership transfer — no elicitor available.`);let d=_r(l.ownerTokenVersion??1),f=r.setOwnerCapability({ownerTokenSalt:d.salt,ownerTokenHash:d.hash,ownerTokenVersion:d.version});if(!f.success)return s(`Claim failed: ${f.error}`);let p=r.getStatus();if(p.success&&p.data){let t=p.data;a(t.slug,e)}let m={success:!0,_ownerToken:d.rawToken,version:d.version,message:`Ownership transferred successfully.`};return s(JSON.stringify(m,null,2))}catch(e){return au(e)?s(e.message):(r.error(`flow action claim failed`,j(e)),s(`Error: ${o(e)}`))}}async function Ou(e){let{getFlows:t,log:n,resolveFlowRoot:r,resolveRoots:i,toErrorText:a,toTextResponse:o}=e;try{let n=await r(),{registry:a,stateMachine:s}=await t(n),c=s.getStatus();if(!c.success||!c.data)throw new iu(`NO_ACTIVE_FLOW`,`No active flow. Use flow({ action: "start", name: "<flow>" }) to begin one, or flow({ action: "list" }) to see available flows.`);let l=c.data,u=a.get(l.flow),d=u?await Su({context:e,entry:u,state:l,activeRoot:n,primaryRoot:l.primaryRoot,roots:l.roots}):vu(),f={...Cu({state:l,data:d,includeStatus:!0,includeInstructionPath:!0}),_hint:l.currentStep?hu:void 0,phase:l.phase,isEpilogue:l.isEpilogue,completedSteps:l.completedSteps,skippedSteps:l.skippedSteps,artifacts:l.artifacts,startedAt:l.startedAt,updatedAt:l.updatedAt,totalSteps:d.stepSequence.length,progress:u?`${l.completedSteps.length+l.skippedSteps.length}/${d.stepSequence.length}`:`unknown`,decisions:await e.loadFlowDecisions(l.slug),briefing:{workspace_core:e.skillCompiler?.readCurrentSkill()??null,active_flow:e.skillCompiler?.readFlowBriefing(l.slug)??null},skill_warnings:e.skillCompiler?.getWarnings(l.slug)??[],workspaceRoot:n.replaceAll(`\\`,`/`),primaryRoot:(l.primaryRoot??n).replaceAll(`\\`,`/`),roots:l.roots??[n.replaceAll(`\\`,`/`)],allRoots:i().normalizedAllRoots,discoveredRepos:i().discoveredRepos};return o(JSON.stringify(f,null,2))}catch(e){return au(e)?o(e.message):(n.error(`flow action status failed`,j(e)),o(`Error: ${a(e)}`))}}async function ku(e){let{getFlows:t,log:n,resolveFlowRoot:r,stateDir:i,syncMetaToRoots:a,toErrorText:o,toTextResponse:s}=e;try{let n=await r(),{stateMachine:o}=await t(n),c=o.getStatus();if(c.success&&c.data){if(e.eventBus){let t=c.data.slug,n=typeof c.data.startedAt==`number`?c.data.startedAt:Date.now();e.eventBus.emit({type:`flow:abandon`,flowName:c.data.flow,flowSlug:t,completedCount:c.data.completedSteps?.length??0,skippedCount:c.data.skippedSteps?.length??0,durationMs:Date.now()-n,timestamp:Date.now(),eventId:`flow-abandon-${t}-${Date.now()}`,workspaceId:t,source:`flow-tools`})}a(c.data.slug,n)}let l=o.reset();if(!l.success)return s(`Reset failed: ${l.error}`);if(c.success&&c.data?.slug)try{await Ue(P(i,`flow-context`,c.data.slug),{recursive:!0,force:!0})}catch{}return s(`Flow abandoned. Use flow({ action: "start", name: "<flow>" }) to begin a new flow.`)}catch(e){return n.error(`flow action reset failed`,j(e)),s(`Error: ${o(e)}`)}}async function Au(e,t){let{getFlows:n,log:r,resolveFlowRoot:i,syncMetaToRoots:a,toErrorText:o,toTextResponse:s}=t,{action:c,targetStep:l,lifecycleOwnerToken:u,currentToken:d}=e;if(c===`backtrack`)return l?Eu({targetStep:l,lifecycleOwnerToken:u,currentToken:d},t):s(`Missing required parameter: targetStep for backtrack action.`);try{let e=await i(),{registry:r,stateMachine:o}=await n(e),l=o.getStatus();if(!l.success||!l.data)throw new iu(`NO_ACTIVE_FLOW`,`No active flow. Use flow({ action: "start", name: "<flow>" }) first.`);let u=r.get(l.data.flow);if(!u)throw new iu(`FLOW_NOT_FOUND`,`Flow "${l.data.flow}" not found in registry.`);let d=o.step(c,u.manifest);if(!d.success||!d.data)return s(`Cannot ${c}: ${d.error}`);a(d.data.slug,e);let f=d.data;if(t.eventBus&&(t.eventBus.emit({type:`flow:step:eventbus`,flowName:f.flow,flowSlug:f.slug,stepId:f.currentStep??f.completedSteps[f.completedSteps.length-1]??``,status:{next:`complete`,skip:`complete`,redo:`start`}[c]??`complete`,action:{next:`completed`,skip:`skipped`,redo:`redo`}[c]??`completed`,phase:f.phase??`flow`,completedSteps:[...f.completedSteps,...f.skippedSteps],totalSteps:u.manifest.steps.length,timestamp:Date.now(),eventId:`flow-step-${f.slug}-${Date.now()}`,workspaceId:f.slug,source:`flow-tools`}),f.status===`completed`)){let e=typeof f.startedAt==`number`?f.startedAt:Date.now();t.eventBus.emit({type:`flow:complete:eventbus`,flowName:f.flow,flowSlug:f.slug,outcome:`success`,stepCount:u.manifest.steps.length,completedCount:f.completedSteps.length,skippedCount:f.skippedSteps.length,durationMs:Date.now()-e,timestamp:Date.now(),eventId:`flow-complete-${f.slug}-${Date.now()}`,workspaceId:f.slug,source:`flow-tools`})}let p=[];if(f.status===`completed`){let e=P(t.stateDir,`flow-context`,f.slug);for(let t of[`decision`,`pattern`]){let n=P(e,t);try{let e=await He(n);for(let r of e){if(!r.endsWith(`.md`))continue;let e=await Ve(P(n,r),`utf-8`);e.length>100&&p.push({type:t,title:r.replace(/\.md$/,``).replace(/-/g,` `),content:e.length>500?`${e.slice(0,497)}...`:e})}}catch{}}typeof Ue==`function`&&await Ue(e,{recursive:!0,force:!0}).catch(()=>{})}let m=await Su({context:t,entry:u,state:f,activeRoot:e,primaryRoot:f.primaryRoot,roots:f.roots}),h={...Cu({state:f,data:m,includeStatus:!0,action:c}),_hint:f.currentStep?hu:void 0,phase:f.phase,isEpilogue:f.isEpilogue,completedSteps:f.completedSteps,skippedSteps:f.skippedSteps,totalSteps:m.stepSequence.length,remaining:m.stepSequence.filter(e=>!f.completedSteps.includes(e)&&!f.skippedSteps.includes(e)&&e!==f.currentStep),...p.length>0?{promotionCandidates:p}:{}};return s(JSON.stringify(h,null,2))}catch(e){return au(e)?s(e.message):(r.error(`flow action step failed`,j(e)),s(`Error: ${o(e)}`))}}async function ju(e){let{getFlows:t,log:n,resolveFlowRoot:r,resolveRoots:i,toErrorText:a,toTextResponse:o}=e;try{let{registry:e,stateMachine:n,installer:a}=await t(await r()),s=e.list(),c=n.getStatus(),l={flows:s.map(e=>{let t={name:e.name,version:e.version,source:e.source,sourceType:e.sourceType,format:e.format,steps:e.manifest.steps.map(e=>e.id)};if(e.sourceType===`git`&&e.commitSha){let n=a.hasUpdates(e.installPath);return{...t,commitSha:e.commitSha,updateAvailable:n.success&&n.data?n.data.hasUpdates:void 0}}return t}),activeFlow:c.success&&c.data?{flow:c.data.flow,flowOrigin:c.data.flowOrigin,status:c.data.status,currentStep:c.data.currentStep,slug:c.data.slug,topic:c.data.topic,runDir:c.data.runDir}:null,allRoots:i().normalizedAllRoots,discoveredRepos:i().discoveredRepos};return o(JSON.stringify(l,null,2))}catch(e){return n.error(`flow action list failed`,j(e)),o(`Error: ${a(e)}`)}}async function Mu(e,t){let{getFlows:n,log:r,resolveInstallPath:i,resolveInstructionPath:a,toErrorText:o,toTextResponse:s}=t,{name:c}=e;try{let{registry:e,installer:t}=await n(),r=e.get(c);if(!r)throw new iu(`UNKNOWN_FLOW`,`Flow "${c}" not found. Use flow({ action: "list" }) to see available flows.`);let o=r.commitSha??null,l;if(r.sourceType===`git`&&r.installPath){let e=t.hasUpdates(r.installPath);l=e.success&&e.data?e.data.hasUpdates:void 0}let u={name:r.name,version:r.version,description:r.manifest.description,source:r.source,sourceType:r.sourceType,format:r.format,commitSha:o,updateAvailable:l,installPath:i(r.name,r),registeredAt:r.registeredAt,updatedAt:r.updatedAt,steps:r.manifest.steps.map(e=>({id:e.id,name:e.name,instruction:a(r,e.instruction),produces:e.produces,requires:e.requires,description:e.description})),agents:r.manifest.agents,artifactsDir:r.manifest.artifacts_dir,install:r.manifest.install};return s(JSON.stringify(u,null,2))}catch(e){return au(e)?s(e.message):(r.error(`flow action info failed`,j(e)),s(`Error: ${o(e)}`))}}async function Nu(e,t){let{getAllRoots:n,getFlows:r,log:i,toErrorText:a,toTextResponse:o}=t,{flow:s,status:c,limit:l=50}=e,u=e=>{for(let t of[`updatedAt`,`startedAt`,`createdAt`]){let n=e[t];if(typeof n==`number`&&Number.isFinite(n))return n;if(typeof n==`string`){let e=Date.parse(n);if(!Number.isNaN(e))return e}}return null};try{let e=n(),t=[];for(let n of e){let{stateMachine:e}=await r(n),i=e.listRuns({flow:s,status:c});for(let e of i)t.push({...JSON.parse(JSON.stringify(e)),root:n.replaceAll(`\\`,`/`)})}let i=new Set,a=t.filter(e=>{let t=e.id;return i.has(t)?!1:(i.add(t),!0)});if(a.length===0)return o(`No flow runs found.`);let d=a.map((e,t)=>({run:e,index:t,recency:u(e)})).sort((e,t)=>e.recency==null&&t.recency==null?e.index-t.index:e.recency==null?1:t.recency==null?-1:t.recency===e.recency?e.index-t.index:t.recency-e.recency).map(({run:e})=>e).slice(0,l);return o(JSON.stringify({total:a.length,returned:d.length,truncated:a.length>d.length,runs:d},null,2))}catch(e){return i.error(`flow action runs failed`,j(e)),o(`Error: ${a(e)}`)}}function Pu(e){let t=e.content?.find(e=>e.type===`text`)?.text??``;if(!t)return null;try{let e=JSON.parse(t);if(typeof e.slug==`string`&&e.slug.length>0)return e.slug}catch{}return t.match(/[Ss]lug[:\s]*`?([^`\s,]+)`?/)?.[1]??null}function Fu(e,t,n,r){let i=n&&typeof n!=`function`?n:void 0,a=typeof n==`function`?n:r,o=ru(e,t,i,i?.curated,i?.eventBus,i?.skillCompiler),s=W(`flow`);e.registerTool(`flow`,{title:s.title,description:`Manage development flows — list available flows, start/stop runs, navigate steps, read instructions, and install/remove/update flows. Use action parameter to select operation.`,annotations:s.annotations,inputSchema:{action:I.enum([`list`,`info`,`start`,`step`,`status`,`reset`,`read`,`runs`,`add`,`remove`,`update`,`backtrack`,`claim`]).describe(`The flow operation to perform.`),name:I.string().optional().describe(`Flow name — required for info, start, remove, update. Optional override for add.`),topic:I.string().optional().describe(`Human-readable topic for the run (used by start).`),objective:I.string().optional().describe(`L1 snapshot objective — the goal of this flow run. Falls back to topic when absent.`),acceptanceCriteria:I.array(I.string()).optional().describe(`L1 snapshot acceptance criteria (used by start).`),scope:I.array(I.string()).optional().describe(`L1 snapshot scope boundaries (used by start). Falls back to roots when absent.`),exclusions:I.array(I.string()).optional().describe(`L1 snapshot exclusions — what is out of scope (used by start).`),roots:I.array(I.string()).optional().describe(`Workspace roots participating in this flow (used by start).`),advance:I.enum([`next`,`skip`,`redo`,`backtrack`]).optional().describe(`Step navigation action — required for step.`),lifecycleOwnerToken:I.string().optional().describe(`Owner capability token for layered lifecycle mutations (required in layered mode for step/backtrack/claim/reset).`),currentToken:I.string().optional().describe(`Current step execution token from status response for optimistic concurrency.`),targetStep:I.string().optional().describe(`Target step ID for backtrack action — must be a completed prior step.`),step:I.string().optional().describe(`Step id or name to read (used by read). Defaults to current step.`),source:I.string().optional().describe(`Git URL, local path, or "openspec" shorthand — required for add.`),token:I.string().optional().describe(`Auth token for private repos (used by add).`),filter_flow:I.string().optional().describe(`Filter runs by flow name (used by runs).`),filter_status:I.string().optional().describe(`Filter runs by status: active, completed, abandoned (used by runs).`),limit:I.number().int().positive().optional().describe(`Max runs to return (default 50).`)}},Y(`flow`,async e=>{switch(e.action){case`list`:return ju(o);case`info`:return e.name?Mu({name:e.name},o):o.toTextResponse(`Missing required parameter: name`);case`start`:{if(!e.name)return o.toTextResponse(`Missing required parameter: name (flow to start)`);let t=await Tu({flow:e.name,topic:e.topic,roots:e.roots,objective:e.objective,acceptanceCriteria:e.acceptanceCriteria,scope:e.scope,exclusions:e.exclusions},o),n=Pu(t);return n&&a&&a(n),t}case`step`:return e.advance?Au({action:e.advance,targetStep:e.targetStep,lifecycleOwnerToken:e.lifecycleOwnerToken,currentToken:e.currentToken},o):o.toTextResponse(`Missing required parameter: advance (next/skip/redo/backtrack)`);case`status`:{let e=await Ou(o);return a&&a(Pu(e)),e}case`reset`:{let e=await ku(o);return a&&a(null),e}case`read`:return su({step:e.step},o);case`runs`:return Nu({flow:e.filter_flow,status:e.filter_status,limit:e.limit},o);case`add`:return e.source?du({source:e.source,name:e.name,token:e.token},o):o.toTextResponse(`Missing required parameter: source`);case`remove`:return e.name?fu({name:e.name},o):o.toTextResponse(`Missing required parameter: name`);case`update`:return e.name?pu({name:e.name},o):o.toTextResponse(`Missing required parameter: name`);case`backtrack`:return e.targetStep?Eu({targetStep:e.targetStep,lifecycleOwnerToken:e.lifecycleOwnerToken,currentToken:e.currentToken},o):o.toTextResponse(`Missing required parameter: targetStep for backtrack action`);case`claim`:return Du({currentToken:e.currentToken},o);default:return o.toTextResponse(`Unknown action: ${e.action}`)}}))}const Iu=k(`tools`);function Lu(e){let t=W(`evidence_map`);e.registerTool(`evidence_map`,{title:t.title,description:`Track verified/assumed/unresolved claims for complex tasks. Gate readiness: YIELD (proceed), HOLD (unknowns), HARD_BLOCK (critical gaps). Persists across calls.`,inputSchema:{action:I.enum([`create`,`add`,`update`,`get`,`gate`,`list`,`delete`]).describe(`Operation to perform`),task_id:I.string().optional().describe(`Task identifier (required for all except list)`),tier:I.enum([`floor`,`standard`,`critical`]).optional().describe(`FORGE tier (required for create)`),claim:I.string().optional().describe(`Critical-path claim text (for add)`),status:I.enum([`V`,`A`,`U`]).optional().describe(`Evidence status: V=Verified, A=Assumed, U=Unresolved`),receipt:I.string().optional().describe(`Evidence receipt: tool→ref for V, reasoning for A, attempts for U`),id:I.number().optional().describe(`Entry ID (for update)`),critical_path:I.boolean().default(!0).describe(`Whether this claim is on the critical path`),unknown_type:I.enum([`contract`,`convention`,`freshness`,`runtime`,`data-flow`,`impact`]).optional().describe(`Typed unknown classification`),safety_gate:I.enum([`provenance`,`commitment`,`coverage`]).optional().describe(`Safety gate tag: provenance (claim→evidence), commitment (user-approved), coverage (nothing dropped)`),retry_count:I.number().default(0).describe(`Retry count for gate evaluation (0 = first attempt)`),max_retries:I.number().int().min(0).optional().describe(`Maximum retries before escalating. Default: 3`),timeout_action:I.enum([`iterate`,`retry`,`manual`,`terminate`]).optional().describe(`Action to take when gate retries are exhausted. Default: manual`),cwd:I.string().optional().describe(`Working directory for evidence map storage (default: server cwd). Use root_path from forge_ground to match.`)},annotations:t.annotations},Y(`evidence_map`,async({action:e,task_id:t,tier:n,claim:r,status:i,receipt:a,id:o,critical_path:s,unknown_type:c,safety_gate:l,retry_count:u,max_retries:d,timeout_action:f,cwd:p})=>{try{switch(e){case`create`:if(!t)throw Error(`task_id required for create`);if(!n)throw Error(`tier required for create`);return wt({action:`create`,taskId:t,tier:n},p),{content:[{type:`text`,text:`Created evidence map "${t}" (tier: ${n}).\n\n---\n_Next: Use \`evidence_map\` with action "add" to record critical-path claims._`}]};case`add`:{if(!t)throw Error(`task_id required for add`);if(!r)throw Error(`claim required for add`);if(!i)throw Error(`status required for add`);let e=wt({action:`add`,taskId:t,claim:r,status:i,receipt:a??``,criticalPath:s,unknownType:c,safetyGate:l},p),n=e.autoCreated?[`⚠️ Evidence map "${t}" was auto-created with tier "standard". Use \`create\` action to set a specific tier.`,``,`Added entry #${e.entry?.id} to "${t}": [${i}] ${r}`]:[`Added entry #${e.entry?.id} to "${t}": [${i}] ${r}`];return e.summary&&n.push(``,e.summary),{content:[{type:`text`,text:n.join(`
190
+ `):null}}function xu(e,t){return t(e)}async function Su(e){let{context:t,entry:n,state:r,activeRoot:i,primaryRoot:a,roots:o}=e,{instructionPath:s,description:c}=t.resolveCurrentStepInfo(n,r.currentStep,i),l=xu(n,t.getStepSequence),u=await ou({entry:n,stepId:r.currentStep,runDir:r.runDir,slug:r.slug,primaryRoot:a,roots:o,activeRoot:i,resolveInstructionPath:t.resolveInstructionPath,resolveEpilogueInstructionPath:t.resolveEpilogueInstructionPath}),{brief:d,pins:f}=bu(u),p=d;if(d&&r.currentStep){let e=n.manifest.steps.find(e=>e.id===r.currentStep),a={stepId:r.currentStep,flowName:r.flow,flowSlug:r.slug,phase:`flow`,runDir:r.runDir,artifactsPath:P(r.runDir,n.manifest.artifacts_dir).replaceAll(`\\`,`/`),completedSteps:r.completedSteps??[],stepDescription:e?.description??c??void 0,agents:e?.agents??[],mode:`brief`,topic:r.topic??``,activeRoot:i};p=await t.stepPipeline.enrich(d,a,n.manifest.hooks)}return{artifactsPath:P(r.runDir,n.manifest.artifacts_dir).replaceAll(`\\`,`/`),currentStepInstruction:s,currentStepDescription:c,currentStepContent:u,currentStepBrief:p,currentStepPins:f,stepSequence:l}}function Cu(e){let{state:t,data:n,started:r,includeStatus:i,action:a,includeInstructionPath:o}=e,s={};return r&&(s.started=!0),s.flow=t.flow,t.flowOrigin&&(s.flowOrigin=t.flowOrigin),i&&(s.status=t.status),a&&(s.action=a),s.slug=t.slug,s.topic=t.topic,s.runDir=t.runDir,s.artifactsPath=n.artifactsPath,s.currentStep=t.currentStep,s.currentStepInstruction=n.currentStepInstruction,o&&(s.instructionPath=n.currentStepInstruction),s.currentStepDescription=n.currentStepDescription,s.currentStepContent=n.currentStepContent,s.currentStepContentHash=n.currentStepContent?mu(n.currentStepContent):null,s.currentStepBrief=n.currentStepBrief,s.currentStepPins=n.currentStepPins,s.fullContentHint=`Call flow({ action: 'read' }) for the complete step instructions.`,s}function wu(e){return e.sourceType===`local`?{source:`local`,sourceType:e.sourceType,format:e.format,...e.commitSha?{commitSha:e.commitSha}:{}}:{source:e.source,sourceType:e.sourceType,format:e.format,...e.commitSha?{commitSha:e.commitSha}:{}}}async function Tu(e,t){let{getAllRoots:n,getFlows:r,getWorkspaceRoot:i,isValidFlowRoot:a,log:o,patchMetaRoots:s,stateDir:c,toErrorText:l,toTextResponse:u}=t,{flow:d,topic:f,roots:p,objective:m,acceptanceCriteria:h,scope:g,exclusions:_}=e;try{if(p&&p.length>0){let e=n().map(e=>e.replaceAll(`\\`,`/`)),t=p.filter(e=>!a(e));if(t.length>0)return u(`Invalid roots — not part of the workspace or a recognized sub-repository: ${t.join(`, `)}. Available roots: ${e.join(`, `)}`)}let e=n(),o=e.map(e=>e.replaceAll(`\\`,`/`)),l=i(),v=e.length>1,y=!p&&v,b=p?.[0]??l,{registry:x,stateMachine:S}=await r(b),C=x.get(d);if(!C)throw new iu(`UNKNOWN_FLOW`,`Flow "${d}" not found. Use flow({ action: "list" }) to see available flows.`);let w=S.start(C.name,C.manifest,f,wu(C),{objective:m,acceptanceCriteria:h,scope:g,exclusions:_});if(!w.success||!w.data){let e=w.error??`Unknown flow start error.`;return e.includes(`already active`)?u(`Cannot start: ${new iu(`FLOW_ALREADY_ACTIVE`,e).message}`):u(`Cannot start: ${e}`)}let T=w.data;t.eventBus&&t.eventBus.emit({type:`flow:step:eventbus`,flowName:T.flow,flowSlug:T.slug,stepId:T.currentStep??``,status:`start`,action:`started`,phase:T.phase??`flow`,completedSteps:[],totalSteps:C.manifest.steps.length,timestamp:Date.now(),eventId:`flow-start-${T.slug}-${Date.now()}`,workspaceId:T.slug,source:`flow-tools`});let E;if(t.config.layeredKnowledge){let e=gr(),t=S.setOwnerCapability({ownerTokenSalt:e.salt,ownerTokenHash:e.hash,ownerTokenVersion:e.version});if(!t.success)return u(`Cannot start in layered mode: failed to persist owner capability — ${t.error??`unknown error`}`);E=e.rawToken}if(p&&p.length>1)try{s(T.slug,b,p),t.syncMetaToRoots(T.slug,b)}catch(e){return S.reset(),u(`Flow created but failed to sync to secondary roots — rolled back. Error: ${e instanceof Error?e.message:String(e)}`)}let ee=P(c,`flow-context`),te=typeof He==`function`?await He(ee).catch(()=>[]):[];for(let e of te)e!==T.slug&&typeof Ue==`function`&&await Ue(P(ee,e),{recursive:!0,force:!0}).catch(()=>{});if(typeof Be==`function`)try{await Be(P(ee,T.slug),{recursive:!0})}catch{}let D=await Su({context:t,entry:C,state:T,activeRoot:b,primaryRoot:null,roots:p??null}),ne=hr(T,C.manifest,{objective:m,acceptanceCriteria:h,scope:g,exclusions:_}),re={...Cu({state:T,data:D,started:!0}),phase:T.phase,isEpilogue:T.isEpilogue,totalSteps:D.stepSequence.length,stepSequence:D.stepSequence,artifactsDir:C.manifest.artifacts_dir,roots:p??[b.replaceAll(`\\`,`/`)],snapshot:ne,_hint:hu,...y?{multiRootWarning:`No roots specified in multi-root workspace. Flow created at workspace root. Pass roots parameter with target repo for precise placement.`,availableRoots:o}:{},...E?{_ownerToken:E}:{}};return u(JSON.stringify(re,null,2))}catch(e){return au(e)?u(e.message):(o.error(`flow action start failed`,j(e)),u(`Error: ${l(e)}`))}}async function Eu(e,t){let{getFlows:n,log:r,resolveFlowRoot:i,syncMetaToRoots:a,toErrorText:o,toTextResponse:s}=t,{targetStep:c,lifecycleOwnerToken:l,currentToken:u}=e;try{let e=await i(),{registry:r,stateMachine:o}=await n(e),d=o.getStatus();if(!d.success||!d.data)return s(`No active flow. Use flow({ action: "start", name: "<flow>" }) first.`);let f=d.data,p=r.get(f.flow);if(!p)return s(`Flow "${f.flow}" not found in registry.`);if(t.config.layeredKnowledge){if(!l)return s(`lifecycleOwnerToken required in layered mode.`);let e=f,t=e.ownerTokenSalt,n=e.ownerTokenHash;if(!t||!n)return s(`Flow has no owner capability — cannot backtrack.`);if(!vr(l,t,n))return s(`Invalid lifecycleOwnerToken — backtrack denied.`);if(u&&u!==f.currentToken)return s(`Invalid currentToken — flow state changed since last status.`)}let m=o.backtrack(c,p.manifest);if(!m.success||!m.data)return s(`Cannot backtrack: ${m.error}`);a(m.data.slug,e);let h=m.data,g=await Su({context:t,entry:p,state:h,activeRoot:e,primaryRoot:h.primaryRoot,roots:h.roots}),_={...Cu({state:h,data:g,includeStatus:!0,action:`backtrack`}),_hint:h.currentStep?hu:void 0,phase:h.phase,isEpilogue:h.isEpilogue,completedSteps:h.completedSteps,skippedSteps:h.skippedSteps,totalSteps:g.stepSequence.length};return s(JSON.stringify(_,null,2))}catch(e){return au(e)?s(e.message):(r.error(`flow action backtrack failed`,j(e)),s(`Error: ${o(e)}`))}}async function Du(e,t){let{getFlows:n,log:r,resolveFlowRoot:i,syncMetaToRoots:a,toErrorText:o,toTextResponse:s}=t,{currentToken:c}=e;try{let e=await i(),{stateMachine:r}=await n(e),o=r.getStatus();if(!o.success||!o.data)return s(`No active flow. Use flow({ action: "start", name: "<flow>" }) first.`);let l=o.data;if(c&&c!==l.currentToken)return s(`Invalid currentToken — claim denied.`);if(!t.config.layeredKnowledge)return s(`Claim requires layeredKnowledge mode.`);let u=t.server?(await import(`./startup-maintenance-QrloHssd.js`).then(e=>e.m)).createSamplingClient(t.server):null;if(u?.available){if((await u.createMessage({prompt:`You have been asked to transfer flow ownership. Do you confirm?`,systemPrompt:`Respond with "yes" to confirm or anything else to decline.`,maxTokens:16,modelPreferences:{intelligencePriority:.2,speedPriority:.9,costPriority:.9}})).text.trim().toLowerCase()!==`yes`)return s(`Ownership transfer declined by user.`)}else return s(`Cannot verify ownership transfer — no elicitor available.`);let d=_r(l.ownerTokenVersion??1),f=r.setOwnerCapability({ownerTokenSalt:d.salt,ownerTokenHash:d.hash,ownerTokenVersion:d.version});if(!f.success)return s(`Claim failed: ${f.error}`);let p=r.getStatus();if(p.success&&p.data){let t=p.data;a(t.slug,e)}let m={success:!0,_ownerToken:d.rawToken,version:d.version,message:`Ownership transferred successfully.`};return s(JSON.stringify(m,null,2))}catch(e){return au(e)?s(e.message):(r.error(`flow action claim failed`,j(e)),s(`Error: ${o(e)}`))}}async function Ou(e){let{getFlows:t,log:n,resolveFlowRoot:r,resolveRoots:i,toErrorText:a,toTextResponse:o}=e;try{let n=await r(),{registry:a,stateMachine:s}=await t(n),c=s.getStatus();if(!c.success||!c.data)throw new iu(`NO_ACTIVE_FLOW`,`No active flow. Use flow({ action: "start", name: "<flow>" }) to begin one, or flow({ action: "list" }) to see available flows.`);let l=c.data,u=a.get(l.flow),d=u?await Su({context:e,entry:u,state:l,activeRoot:n,primaryRoot:l.primaryRoot,roots:l.roots}):vu(),f={...Cu({state:l,data:d,includeStatus:!0,includeInstructionPath:!0}),_hint:l.currentStep?hu:void 0,phase:l.phase,isEpilogue:l.isEpilogue,completedSteps:l.completedSteps,skippedSteps:l.skippedSteps,artifacts:l.artifacts,startedAt:l.startedAt,updatedAt:l.updatedAt,totalSteps:d.stepSequence.length,progress:u?`${l.completedSteps.length+l.skippedSteps.length}/${d.stepSequence.length}`:`unknown`,decisions:await e.loadFlowDecisions(l.slug),briefing:{workspace_core:e.skillCompiler?.readCurrentSkill()??null,active_flow:e.skillCompiler?.readFlowBriefing(l.slug)??null},skill_warnings:e.skillCompiler?.getWarnings(l.slug)??[],workspaceRoot:n.replaceAll(`\\`,`/`),primaryRoot:(l.primaryRoot??n).replaceAll(`\\`,`/`),roots:l.roots??[n.replaceAll(`\\`,`/`)],allRoots:i().normalizedAllRoots,discoveredRepos:i().discoveredRepos};return o(JSON.stringify(f,null,2))}catch(e){return au(e)?o(e.message):(n.error(`flow action status failed`,j(e)),o(`Error: ${a(e)}`))}}async function ku(e){let{getFlows:t,log:n,resolveFlowRoot:r,stateDir:i,syncMetaToRoots:a,toErrorText:o,toTextResponse:s}=e;try{let n=await r(),{stateMachine:o}=await t(n),c=o.getStatus();if(c.success&&c.data){if(e.eventBus){let t=c.data.slug,n=typeof c.data.startedAt==`number`?c.data.startedAt:Date.now();e.eventBus.emit({type:`flow:abandon`,flowName:c.data.flow,flowSlug:t,completedCount:c.data.completedSteps?.length??0,skippedCount:c.data.skippedSteps?.length??0,durationMs:Date.now()-n,timestamp:Date.now(),eventId:`flow-abandon-${t}-${Date.now()}`,workspaceId:t,source:`flow-tools`})}a(c.data.slug,n)}let l=o.reset();if(!l.success)return s(`Reset failed: ${l.error}`);if(c.success&&c.data?.slug)try{await Ue(P(i,`flow-context`,c.data.slug),{recursive:!0,force:!0})}catch{}return s(`Flow abandoned. Use flow({ action: "start", name: "<flow>" }) to begin a new flow.`)}catch(e){return n.error(`flow action reset failed`,j(e)),s(`Error: ${o(e)}`)}}async function Au(e,t){let{getFlows:n,log:r,resolveFlowRoot:i,syncMetaToRoots:a,toErrorText:o,toTextResponse:s}=t,{action:c,targetStep:l,lifecycleOwnerToken:u,currentToken:d}=e;if(c===`backtrack`)return l?Eu({targetStep:l,lifecycleOwnerToken:u,currentToken:d},t):s(`Missing required parameter: targetStep for backtrack action.`);try{let e=await i(),{registry:r,stateMachine:o}=await n(e),l=o.getStatus();if(!l.success||!l.data)throw new iu(`NO_ACTIVE_FLOW`,`No active flow. Use flow({ action: "start", name: "<flow>" }) first.`);let u=r.get(l.data.flow);if(!u)throw new iu(`FLOW_NOT_FOUND`,`Flow "${l.data.flow}" not found in registry.`);let d=o.step(c,u.manifest);if(!d.success||!d.data)return s(`Cannot ${c}: ${d.error}`);a(d.data.slug,e);let f=d.data;if(t.eventBus&&(t.eventBus.emit({type:`flow:step:eventbus`,flowName:f.flow,flowSlug:f.slug,stepId:f.currentStep??f.completedSteps[f.completedSteps.length-1]??``,status:{next:`complete`,skip:`complete`,redo:`start`}[c]??`complete`,action:{next:`completed`,skip:`skipped`,redo:`redo`}[c]??`completed`,phase:f.phase??`flow`,completedSteps:[...f.completedSteps,...f.skippedSteps],totalSteps:u.manifest.steps.length,timestamp:Date.now(),eventId:`flow-step-${f.slug}-${Date.now()}`,workspaceId:f.slug,source:`flow-tools`}),f.status===`completed`)){let e=typeof f.startedAt==`number`?f.startedAt:Date.now();t.eventBus.emit({type:`flow:complete:eventbus`,flowName:f.flow,flowSlug:f.slug,outcome:`success`,stepCount:u.manifest.steps.length,completedCount:f.completedSteps.length,skippedCount:f.skippedSteps.length,durationMs:Date.now()-e,timestamp:Date.now(),eventId:`flow-complete-${f.slug}-${Date.now()}`,workspaceId:f.slug,source:`flow-tools`})}let p=[];if(f.status===`completed`){let e=P(t.stateDir,`flow-context`,f.slug);for(let t of[`decision`,`pattern`]){let n=P(e,t);try{let e=await He(n);for(let r of e){if(!r.endsWith(`.md`))continue;let e=await Ve(P(n,r),`utf-8`);e.length>100&&p.push({type:t,title:r.replace(/\.md$/,``).replace(/-/g,` `),content:e.length>500?`${e.slice(0,497)}...`:e})}}catch{}}typeof Ue==`function`&&await Ue(e,{recursive:!0,force:!0}).catch(()=>{})}let m=await Su({context:t,entry:u,state:f,activeRoot:e,primaryRoot:f.primaryRoot,roots:f.roots}),h={...Cu({state:f,data:m,includeStatus:!0,action:c}),_hint:f.currentStep?hu:void 0,phase:f.phase,isEpilogue:f.isEpilogue,completedSteps:f.completedSteps,skippedSteps:f.skippedSteps,totalSteps:m.stepSequence.length,remaining:m.stepSequence.filter(e=>!f.completedSteps.includes(e)&&!f.skippedSteps.includes(e)&&e!==f.currentStep),...p.length>0?{promotionCandidates:p}:{}};return s(JSON.stringify(h,null,2))}catch(e){return au(e)?s(e.message):(r.error(`flow action step failed`,j(e)),s(`Error: ${o(e)}`))}}async function ju(e){let{getFlows:t,log:n,resolveFlowRoot:r,resolveRoots:i,toErrorText:a,toTextResponse:o}=e;try{let{registry:e,stateMachine:n,installer:a}=await t(await r()),s=e.list(),c=n.getStatus(),l={flows:s.map(e=>{let t={name:e.name,version:e.version,source:e.source,sourceType:e.sourceType,format:e.format,steps:e.manifest.steps.map(e=>e.id)};if(e.sourceType===`git`&&e.commitSha){let n=a.hasUpdates(e.installPath);return{...t,commitSha:e.commitSha,updateAvailable:n.success&&n.data?n.data.hasUpdates:void 0}}return t}),activeFlow:c.success&&c.data?{flow:c.data.flow,flowOrigin:c.data.flowOrigin,status:c.data.status,currentStep:c.data.currentStep,slug:c.data.slug,topic:c.data.topic,runDir:c.data.runDir}:null,allRoots:i().normalizedAllRoots,discoveredRepos:i().discoveredRepos};return o(JSON.stringify(l,null,2))}catch(e){return n.error(`flow action list failed`,j(e)),o(`Error: ${a(e)}`)}}async function Mu(e,t){let{getFlows:n,log:r,resolveInstallPath:i,resolveInstructionPath:a,toErrorText:o,toTextResponse:s}=t,{name:c}=e;try{let{registry:e,installer:t}=await n(),r=e.get(c);if(!r)throw new iu(`UNKNOWN_FLOW`,`Flow "${c}" not found. Use flow({ action: "list" }) to see available flows.`);let o=r.commitSha??null,l;if(r.sourceType===`git`&&r.installPath){let e=t.hasUpdates(r.installPath);l=e.success&&e.data?e.data.hasUpdates:void 0}let u={name:r.name,version:r.version,description:r.manifest.description,source:r.source,sourceType:r.sourceType,format:r.format,commitSha:o,updateAvailable:l,installPath:i(r.name,r),registeredAt:r.registeredAt,updatedAt:r.updatedAt,steps:r.manifest.steps.map(e=>({id:e.id,name:e.name,instruction:a(r,e.instruction),produces:e.produces,requires:e.requires,description:e.description})),agents:r.manifest.agents,artifactsDir:r.manifest.artifacts_dir,install:r.manifest.install};return s(JSON.stringify(u,null,2))}catch(e){return au(e)?s(e.message):(r.error(`flow action info failed`,j(e)),s(`Error: ${o(e)}`))}}async function Nu(e,t){let{getAllRoots:n,getFlows:r,log:i,toErrorText:a,toTextResponse:o}=t,{flow:s,status:c,limit:l=50}=e,u=e=>{for(let t of[`updatedAt`,`startedAt`,`createdAt`]){let n=e[t];if(typeof n==`number`&&Number.isFinite(n))return n;if(typeof n==`string`){let e=Date.parse(n);if(!Number.isNaN(e))return e}}return null};try{let e=n(),t=[];for(let n of e){let{stateMachine:e}=await r(n),i=e.listRuns({flow:s,status:c});for(let e of i)t.push({...JSON.parse(JSON.stringify(e)),root:n.replaceAll(`\\`,`/`)})}let i=new Set,a=t.filter(e=>{let t=e.id;return i.has(t)?!1:(i.add(t),!0)});if(a.length===0)return o(`No flow runs found.`);let d=a.map((e,t)=>({run:e,index:t,recency:u(e)})).sort((e,t)=>e.recency==null&&t.recency==null?e.index-t.index:e.recency==null?1:t.recency==null?-1:t.recency===e.recency?e.index-t.index:t.recency-e.recency).map(({run:e})=>e).slice(0,l);return o(JSON.stringify({total:a.length,returned:d.length,truncated:a.length>d.length,runs:d},null,2))}catch(e){return i.error(`flow action runs failed`,j(e)),o(`Error: ${a(e)}`)}}function Pu(e){let t=e.content?.find(e=>e.type===`text`)?.text??``;if(!t)return null;try{let e=JSON.parse(t);if(typeof e.slug==`string`&&e.slug.length>0)return e.slug}catch{}return t.match(/[Ss]lug[:\s]*`?([^`\s,]+)`?/)?.[1]??null}function Fu(e,t,n,r){let i=n&&typeof n!=`function`?n:void 0,a=typeof n==`function`?n:r,o=ru(e,t,i,i?.curated,i?.eventBus,i?.skillCompiler),s=W(`flow`);e.registerTool(`flow`,{title:s.title,description:`Manage development flows — list available flows, start/stop runs, navigate steps, read instructions, and install/remove/update flows. Use action parameter to select operation.`,annotations:s.annotations,inputSchema:{action:I.enum([`list`,`info`,`start`,`step`,`status`,`reset`,`read`,`runs`,`add`,`remove`,`update`,`backtrack`,`claim`]).describe(`The flow operation to perform.`),name:I.string().optional().describe(`Flow name — required for info, start, remove, update. Optional override for add.`),topic:I.string().optional().describe(`Human-readable topic for the run (used by start).`),objective:I.string().optional().describe(`L1 snapshot objective — the goal of this flow run. Falls back to topic when absent.`),acceptanceCriteria:I.array(I.string()).optional().describe(`L1 snapshot acceptance criteria (used by start).`),scope:I.array(I.string()).optional().describe(`L1 snapshot scope boundaries (used by start). Falls back to roots when absent.`),exclusions:I.array(I.string()).optional().describe(`L1 snapshot exclusions — what is out of scope (used by start).`),roots:I.array(I.string()).optional().describe(`Workspace roots participating in this flow (used by start).`),advance:I.enum([`next`,`skip`,`redo`,`backtrack`]).optional().describe(`Step navigation action — required for step.`),lifecycleOwnerToken:I.string().optional().describe(`Owner capability token for layered lifecycle mutations (required in layered mode for step/backtrack/claim/reset).`),currentToken:I.string().optional().describe(`Current step execution token from status response for optimistic concurrency.`),targetStep:I.string().optional().describe(`Target step ID for backtrack action — must be a completed prior step.`),step:I.string().optional().describe(`Step id or name to read (used by read). Defaults to current step.`),source:I.string().optional().describe(`Git URL, local path, or "openspec" shorthand — required for add.`),token:I.string().optional().describe(`Auth token for private repos (used by add).`),filter_flow:I.string().optional().describe(`Filter runs by flow name (used by runs).`),filter_status:I.string().optional().describe(`Filter runs by status: active, completed, abandoned (used by runs).`),limit:I.number().int().positive().optional().describe(`Max runs to return (default 50).`)}},Y(`flow`,async e=>{switch(e.action){case`list`:return ju(o);case`info`:return e.name?Mu({name:e.name},o):o.toTextResponse(`Missing required parameter: name`);case`start`:{if(!e.name)return o.toTextResponse(`Missing required parameter: name (flow to start)`);let t=await Tu({flow:e.name,topic:e.topic,roots:e.roots,objective:e.objective,acceptanceCriteria:e.acceptanceCriteria,scope:e.scope,exclusions:e.exclusions},o),n=Pu(t);return n&&a&&a(n),t}case`step`:return e.advance?Au({action:e.advance,targetStep:e.targetStep,lifecycleOwnerToken:e.lifecycleOwnerToken,currentToken:e.currentToken},o):o.toTextResponse(`Missing required parameter: advance (next/skip/redo/backtrack)`);case`status`:{let e=await Ou(o);return a&&a(Pu(e)),e}case`reset`:{let e=await ku(o);return a&&a(null),e}case`read`:return su({step:e.step},o);case`runs`:return Nu({flow:e.filter_flow,status:e.filter_status,limit:e.limit},o);case`add`:return e.source?du({source:e.source,name:e.name,token:e.token},o):o.toTextResponse(`Missing required parameter: source`);case`remove`:return e.name?fu({name:e.name},o):o.toTextResponse(`Missing required parameter: name`);case`update`:return e.name?pu({name:e.name},o):o.toTextResponse(`Missing required parameter: name`);case`backtrack`:return e.targetStep?Eu({targetStep:e.targetStep,lifecycleOwnerToken:e.lifecycleOwnerToken,currentToken:e.currentToken},o):o.toTextResponse(`Missing required parameter: targetStep for backtrack action`);case`claim`:return Du({currentToken:e.currentToken},o);default:return o.toTextResponse(`Unknown action: ${e.action}`)}}))}const Iu=k(`tools`);function Lu(e){let t=W(`evidence_map`);e.registerTool(`evidence_map`,{title:t.title,description:`Track verified/assumed/unresolved claims for complex tasks. Gate readiness: YIELD (proceed), HOLD (unknowns), HARD_BLOCK (critical gaps). Persists across calls.`,inputSchema:{action:I.enum([`create`,`add`,`update`,`get`,`gate`,`list`,`delete`]).describe(`Operation to perform`),task_id:I.string().optional().describe(`Task identifier (required for all except list)`),tier:I.enum([`floor`,`standard`,`critical`]).optional().describe(`FORGE tier (required for create)`),claim:I.string().optional().describe(`Critical-path claim text (for add)`),status:I.enum([`V`,`A`,`U`]).optional().describe(`Evidence status: V=Verified, A=Assumed, U=Unresolved`),receipt:I.string().optional().describe(`Evidence receipt: tool→ref for V, reasoning for A, attempts for U`),id:I.number().optional().describe(`Entry ID (for update)`),critical_path:I.boolean().default(!0).describe(`Whether this claim is on the critical path`),unknown_type:I.enum([`contract`,`convention`,`freshness`,`runtime`,`data-flow`,`impact`]).optional().describe(`Typed unknown classification`),safety_gate:I.enum([`provenance`,`commitment`,`coverage`]).optional().describe(`Safety gate tag: provenance (claim→evidence), commitment (user-approved), coverage (nothing dropped)`),retry_count:I.number().default(0).describe(`Retry count for gate evaluation (0 = first attempt)`),max_retries:I.number().int().min(0).optional().describe(`Maximum retries before escalating. Default: 3`),timeout_action:I.enum([`iterate`,`retry`,`manual`,`terminate`]).optional().describe(`Action to take when gate retries are exhausted. Default: manual`),cwd:I.string().optional().describe(`Working directory for evidence map storage (default: server cwd). Use root_path from forge_ground to match.`)},annotations:t.annotations},Y(`evidence_map`,async({action:e,task_id:t,tier:n,claim:r,status:i,receipt:a,id:o,critical_path:s,unknown_type:c,safety_gate:l,retry_count:u,max_retries:d,timeout_action:f,cwd:p})=>{try{switch(e){case`create`:if(!t)throw Error(`task_id required for create`);if(!n)throw Error(`tier required for create`);return wt({action:`create`,taskId:t,tier:n},p),{content:[{type:`text`,text:`Created evidence map "${t}" (tier: ${n}).\n\n---\n_Next: Use \`evidence_map\` with action "add" to record critical-path claims._`}]};case`add`:{if(!t)throw Error(`task_id required for add`);if(!r)throw Error(`claim required for add`);if(!i)throw Error(`status required for add`);let e=wt({action:`add`,taskId:t,claim:r,status:i,receipt:a??``,criticalPath:s,unknownType:c,safetyGate:l},p),n=e.autoCreated?[`⚠️ Evidence map "${t}" was auto-created with tier "standard". Use \`create\` action to set a specific tier.`,``,`Added entry #${e.entry?.id} to "${t}": [${i}] ${r}`]:[`Added entry #${e.entry?.id} to "${t}": [${i}] ${r}`];return e.summary&&n.push(``,e.summary),{content:[{type:`text`,text:n.join(`
191
191
  `)}]}}case`update`:{if(!t)throw Error(`task_id required for update`);if(o===void 0)throw Error(`id required for update`);if(!i)throw Error(`status required for update`);let e=wt({action:`update`,taskId:t,id:o,status:i,receipt:a??``},p),n=[`Updated entry #${o} in "${t}" → ${i}`];return e.summary&&n.push(``,e.summary),{content:[{type:`text`,text:n.join(`
192
192
  `)}]}}case`get`:{if(!t)throw Error(`task_id required for get`);let e=wt({action:`get`,taskId:t},p);return e.state?{content:[{type:`text`,text:[`## Evidence Map: ${t} (${e.state.tier})`,``,e.formattedMap??`No entries.`,``,`_${e.state.entries.length} entries — created ${e.state.createdAt}_`].join(`
193
193
  `)}]}:{content:[{type:`text`,text:`Evidence map "${t}" not found.`}]}}case`gate`:{if(!t)throw Error(`task_id required for gate`);let e=wt({action:`gate`,taskId:t,retryCount:u,maxRetries:d,timeoutAction:f},p);if(!e.gate)return{content:[{type:`text`,text:`Evidence map "${t}" not found.`}]};let n=e.gate,r=[`## FORGE Gate: **${n.verdict}**`,``,`**Reason:** ${n.reason}`,``,`**Stats:** ${n.stats.verified}V / ${n.stats.assumed}A / ${n.stats.unresolved}U (${n.stats.total} total)`];return n.action&&r.push(``,`**Recommended action:** ${n.action}`),n.retriesRemaining!==void 0&&r.push(`**Retries remaining:** ${n.retriesRemaining}`),n.summary&&r.push(``,`**Summary:** ${n.summary}`),n.warnings.length>0&&r.push(``,`**Warnings:**`,...n.warnings.map(e=>`- ⚠️ ${e}`)),n.unresolvedCritical.length>0&&r.push(``,`**Blocking entries:**`,...n.unresolvedCritical.map(e=>`- #${e.id}: ${e.claim} [${e.unknownType??`untyped`}]`)),n.safetyGates&&(r.push(``,`**Safety Gates:**`,`- Provenance: ${n.safetyGates.provenance}`,`- Commitment: ${n.safetyGates.commitment}`,`- Coverage: ${n.safetyGates.coverage}`),n.safetyGates.failures.length>0&&r.push(``,`**Safety failures:**`,...n.safetyGates.failures.map(e=>`- \u{1F6D1} ${e}`))),n.annotation&&r.push(``,`**Annotation:**`,n.annotation),e.formattedMap&&r.push(``,`---`,``,e.formattedMap),r.push(``,`---`,`_Next: ${n.verdict===`YIELD`?`Proceed to implementation.`:n.action===`iterate`?`Re-run the build loop, then evaluate the gate again.`:n.action===`retry`?`Re-evaluate the gate after refreshing evidence.`:n.action===`manual`?`Ask for human review before proceeding.`:`Abort the current path and terminate the task.`}_`),{content:[{type:`text`,text:r.join(`
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{c as e,f as t,p as n,s as r}from"./startup-maintenance-cbRSFMY5.js";import{n as i,t as a}from"./bin.js";import{reconfigureForWorkspace as o}from"./config-DX1KYSbN.js";import{S as s,_ as c,b as l,c as u,d,f,g as p,h as m,i as h,l as g,m as _,n as ee,o as v,p as te,r as y,s as b,t as x,u as S,v as C,x as w,y as ne}from"./register-tools-BGFt0C77.js";import{fileURLToPath as T}from"node:url";import{AIKIT_PATHS as re,DISPLAY_SERVER_NAME as E,EMBEDDING_DEFAULTS as D,MODEL_REGISTRY as O,addLogListener as k,computePartitionKey as A,createLogger as j,safeCwdOrHome as M,serializeError as N}from"../../core/dist/index.js";import{existsSync as P,mkdirSync as F,statSync as ie}from"node:fs";import{join as I,resolve as ae}from"node:path";import{FileCache as oe,checkpointList as L,checkpointSave as se,listWorksets as R,stashList as ce}from"../../tools/dist/index.js";import{homedir as z}from"node:os";import{McpServer as le}from"@modelcontextprotocol/sdk/server/mcp.js";import{WasmDiagnostics as B,initializeWasm as ue}from"../../chunker/dist/index.js";import{z as V}from"zod";import{EvolutionCollector as de,PolicyStore as fe}from"../../enterprise-bridge/dist/index.js";import{SqliteGraphStore as pe,allMigrations as me,createSqliteAdapter as H,createStateStore as he,createStore as ge,runMigrations as _e}from"../../store/dist/index.js";import{RootsListChangedNotificationSchema as ve}from"@modelcontextprotocol/sdk/types.js";import{buildFormSchema as U,field as W,normalizeResponse as ye}from"../../elicitation/dist/index.js";import{completable as G}from"@modelcontextprotocol/sdk/server/completable.js";import{EmbedderProxy as be}from"../../embeddings/dist/index.js";import{FileHashCache as xe,IncrementalIndexer as Se}from"../../indexer/dist/index.js";import{AsyncLocalStorage as Ce}from"node:async_hooks";function we(e){function t(){return!!e.server?.getClientCapabilities?.()?.elicitation}async function n(n,r){if(t())try{let t=await e.server.elicitInput({message:n,requestedSchema:r});return ye(t?{action:t.action,content:t.content}:void 0)}catch{return}}return{get available(){return t()},async ask(e){return await n(e.message,e.schema)||{action:`decline`}},async confirm(e){let t=await n(e,U({confirmed:W.confirm(e)}));return t?.action===`accept`&&t.content?.confirmed===!0},async selectOne(e,t){let r=await n(e,U({selection:W.select(`Choose one`,t)}));if(r?.action!==`accept`)return null;let i=r.content?.selection;return typeof i==`string`?i:null},async selectMany(e,t){let r=await n(e,U({selections:W.multi(`Choose one or more`,t)}));if(r?.action!==`accept`)return[];let i=r.content?.selections;return Array.isArray(i)?i:[]},async promptText(e,t){let r=await n(e,U({text:W.text(e,{description:t})}));if(r?.action!==`accept`)return null;let i=r.content?.text;return typeof i==`string`?i:null}}}const Te={debug:`debug`,info:`info`,warn:`warning`,error:`error`};function Ee(e){return k(({level:t,component:n,message:r,data:i})=>{try{Promise.resolve(e.sendLoggingMessage({level:Te[t],logger:n,data:i?{message:r,...i}:r})).catch(()=>{})}catch{}})}const K=3e4,q=new Map;function De(e,t,n){let r=q.get(e);if(r&&Date.now()<r.expires)return Promise.resolve(r.data);let i=n();return Promise.resolve(i).then(n=>(q.set(e,{data:n,expires:Date.now()+t}),n))}function Oe(){q.clear()}function ke(e,t){return De(`curated-paths`,K,async()=>e.listPaths({limit:5e3})).then(e=>e.filter(e=>e.toLowerCase().includes(t.toLowerCase())).slice(0,20))}function Ae(e,t){return De(`file-paths`,K,()=>e.listSourcePaths()).then(e=>e.filter(e=>e.toLowerCase().includes(t.toLowerCase())).slice(0,20))}function je(e,t){return De(`symbol-names`,K,async()=>(await e.findNodes({type:`symbol`,limit:500})).map(e=>e.name)).then(e=>e.filter(e=>e.toLowerCase().includes(t.toLowerCase())).slice(0,20))}function Me(e,t){return t?ce(t).map(e=>e.key).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20):[]}function Ne(e){return R().map(e=>e.name).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20)}function Pe(e,t){return t?L(t).map(e=>e.label).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20):[]}function Fe(e,t,n){if(e.registerPrompt(`ready`,{title:`AI Kit Ready`,description:`AI Kit is ready — quick-start guide for search, onboard, and workflows`},async()=>({messages:[{role:`user`,content:{type:`text`,text:[`AI Kit is ready. Quick start:`,``,'• **New project?** → `onboard({ path: "." })` for full codebase analysis','• **Returning?** → `status({})` then `search({ query: "SESSION CHECKPOINT", origin: "curated" })`','• **Exploring?** → `guide({ goal: "your task" })` for workflow recommendations','• **Quick lookup?** → `search({ query: "your question" })`'].join(`
2
+ import{c as e,f as t,p as n,s as r}from"./startup-maintenance-D7tKqECM.js";import{n as i,t as a}from"./bin.js";import{reconfigureForWorkspace as o}from"./config-CkXCQx7E.js";import{S as s,_ as c,b as l,c as u,d,f,g as p,h as m,i as h,l as g,m as _,n as ee,o as v,p as te,r as y,s as b,t as x,u as S,v as C,x as w,y as ne}from"./register-tools-CCDtIMgE.js";import{fileURLToPath as T}from"node:url";import{AIKIT_PATHS as re,DISPLAY_SERVER_NAME as E,EMBEDDING_DEFAULTS as D,MODEL_REGISTRY as O,addLogListener as k,computePartitionKey as A,createLogger as j,safeCwdOrHome as M,serializeError as N}from"../../core/dist/index.js";import{existsSync as P,mkdirSync as F,statSync as ie}from"node:fs";import{join as I,resolve as ae}from"node:path";import{FileCache as oe,checkpointList as L,checkpointSave as se,listWorksets as R,stashList as ce}from"../../tools/dist/index.js";import{homedir as z}from"node:os";import{McpServer as le}from"@modelcontextprotocol/sdk/server/mcp.js";import{WasmDiagnostics as B,initializeWasm as ue}from"../../chunker/dist/index.js";import{z as V}from"zod";import{EvolutionCollector as de,PolicyStore as fe}from"../../enterprise-bridge/dist/index.js";import{SqliteGraphStore as pe,allMigrations as me,createSqliteAdapter as H,createStateStore as he,createStore as ge,runMigrations as _e}from"../../store/dist/index.js";import{RootsListChangedNotificationSchema as ve}from"@modelcontextprotocol/sdk/types.js";import{buildFormSchema as U,field as W,normalizeResponse as ye}from"../../elicitation/dist/index.js";import{completable as G}from"@modelcontextprotocol/sdk/server/completable.js";import{EmbedderProxy as be}from"../../embeddings/dist/index.js";import{FileHashCache as xe,IncrementalIndexer as Se}from"../../indexer/dist/index.js";import{AsyncLocalStorage as Ce}from"node:async_hooks";function we(e){function t(){return!!e.server?.getClientCapabilities?.()?.elicitation}async function n(n,r){if(t())try{let t=await e.server.elicitInput({message:n,requestedSchema:r});return ye(t?{action:t.action,content:t.content}:void 0)}catch{return}}return{get available(){return t()},async ask(e){return await n(e.message,e.schema)||{action:`decline`}},async confirm(e){let t=await n(e,U({confirmed:W.confirm(e)}));return t?.action===`accept`&&t.content?.confirmed===!0},async selectOne(e,t){let r=await n(e,U({selection:W.select(`Choose one`,t)}));if(r?.action!==`accept`)return null;let i=r.content?.selection;return typeof i==`string`?i:null},async selectMany(e,t){let r=await n(e,U({selections:W.multi(`Choose one or more`,t)}));if(r?.action!==`accept`)return[];let i=r.content?.selections;return Array.isArray(i)?i:[]},async promptText(e,t){let r=await n(e,U({text:W.text(e,{description:t})}));if(r?.action!==`accept`)return null;let i=r.content?.text;return typeof i==`string`?i:null}}}const Te={debug:`debug`,info:`info`,warn:`warning`,error:`error`};function Ee(e){return k(({level:t,component:n,message:r,data:i})=>{try{Promise.resolve(e.sendLoggingMessage({level:Te[t],logger:n,data:i?{message:r,...i}:r})).catch(()=>{})}catch{}})}const K=3e4,q=new Map;function De(e,t,n){let r=q.get(e);if(r&&Date.now()<r.expires)return Promise.resolve(r.data);let i=n();return Promise.resolve(i).then(n=>(q.set(e,{data:n,expires:Date.now()+t}),n))}function Oe(){q.clear()}function ke(e,t){return De(`curated-paths`,K,async()=>e.listPaths({limit:5e3})).then(e=>e.filter(e=>e.toLowerCase().includes(t.toLowerCase())).slice(0,20))}function Ae(e,t){return De(`file-paths`,K,()=>e.listSourcePaths()).then(e=>e.filter(e=>e.toLowerCase().includes(t.toLowerCase())).slice(0,20))}function je(e,t){return De(`symbol-names`,K,async()=>(await e.findNodes({type:`symbol`,limit:500})).map(e=>e.name)).then(e=>e.filter(e=>e.toLowerCase().includes(t.toLowerCase())).slice(0,20))}function Me(e,t){return t?ce(t).map(e=>e.key).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20):[]}function Ne(e){return R().map(e=>e.name).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20)}function Pe(e,t){return t?L(t).map(e=>e.label).filter(t=>t.toLowerCase().includes(e.toLowerCase())).slice(0,20):[]}function Fe(e,t,n){if(e.registerPrompt(`ready`,{title:`AI Kit Ready`,description:`AI Kit is ready — quick-start guide for search, onboard, and workflows`},async()=>({messages:[{role:`user`,content:{type:`text`,text:[`AI Kit is ready. Quick start:`,``,'• **New project?** → `onboard({ path: "." })` for full codebase analysis','• **Returning?** → `status({})` then `search({ query: "SESSION CHECKPOINT", origin: "curated" })`','• **Exploring?** → `guide({ goal: "your task" })` for workflow recommendations','• **Quick lookup?** → `search({ query: "your question" })`'].join(`
3
3
  `)}}]})),e.registerPrompt(`onboard`,{title:`Onboard Codebase`,description:`Analyze the codebase for first-time onboarding — runs all analyzers and produces a knowledge summary`,argsSchema:{path:V.string().optional().describe(`Path to analyze (default: workspace root)`)}},async({path:e})=>({messages:[{role:`user`,content:{type:`text`,text:[`Run the full onboarding workflow for "${e??`.`}"`,``,`1. \`onboard({ path: "${e??`.`}" })\` — full codebase analysis`,`2. \`produce_knowledge({ path: "${e??`.`}" })\` — generate synthesis`,'3. `knowledge({ action: "remember", ... })` for key curated entries',"4. `status` to verify index health"].join(`
4
4
  `)}}]})),e.registerPrompt(`sessionStart`,{title:`Start AI Kit Session`,description:`Initialize an AI Kit session — check status, list knowledge, and resume from last checkpoint`},async()=>({messages:[{role:`user`,content:{type:`text`,text:[`Run the session start protocol:`,``,"1. `status({})` — check AI Kit health and onboard state",'2. `knowledge({ action: "list" })` — see stored knowledge entries','3. `search({ query: "SESSION CHECKPOINT", origin: "curated" })` — resume prior work'].join(`
5
5
  `)}}]})),e.registerPrompt(`sessionEnd`,{title:`End AI Kit Session`,description:`Persist decisions and create a session checkpoint before ending`,argsSchema:{summary:V.string().describe(`Brief summary of decisions made, blockers encountered, and next steps`)}},async({summary:e})=>({messages:[{role:`user`,content:{type:`text`,text:[`Run the session end protocol:`,``,'1. `knowledge({ action: "remember", title: "Session checkpoint: '+e.slice(0,60)+`...", content: "`+e.replace(/"/g,`\\"`)+'", category: "session" })` — persist findings',n===`smart`?`2. Smart indexing is active — index refreshes automatically`:"2. `reindex({})` — refresh search index if files changed",`3. Confirm session data saved`].join(`
@@ -16,7 +16,7 @@ import{c as e,f as t,p as n,s as r}from"./startup-maintenance-cbRSFMY5.js";impor
16
16
  │ Vector search is disabled. Hybrid search returns FTS only. │
17
17
  │ To enable: install/rebuild better-sqlite3 (native module). │
18
18
  └──────────────────────────────────────────────────────────────────┘`);let t=I(s,`lance`);P(t)&&J.info(`Old LanceDB data found at ${t} — ignored. Safe to delete after verifying sqlite-vec works.`)}let m;if(p)if(f.splitEnabled&&f.controlDbPath!==f.contentDbPath){let{migrateToSplitState:e}=await import(`../../store/dist/index.js`);await e(f),m=await H(f.controlDbPath),_e(m,me),J.info(`State store adapter ready`,{type:m.type,dbPath:f.controlDbPath,splitEnabled:!0})}else m=p;else{let e=I(s,`aikit-state.db`);P(s)||F(s,{recursive:!0}),m=await H(e),_e(m,me),J.info(`State store adapter ready`,{type:m.type,dbPath:e})}let[h,g,_,ee]=await Promise.all([(async()=>{try{if(e.embedding.childProcess!==!1){let e=new be({model:o.model,dimensions:o.dimensions,nativeDim:o.nativeDim,queryPrefix:o.queryPrefix,pooling:o.pooling,interOpNumThreads:n.interOpNumThreads,intraOpNumThreads:n.intraOpNumThreads,idleTimeoutMs:n.idleTimeoutMs});return await e.initialize(),J.debug(`Embedder loaded (child process)`,{modelId:e.modelId,dimensions:e.dimensions}),e}let{OnnxEmbedder:t}=await import(`../../embeddings/dist/index.js`),r=new t({model:o.model,dimensions:o.dimensions,nativeDim:o.nativeDim,queryPrefix:o.queryPrefix,pooling:o.pooling,interOpNumThreads:n.interOpNumThreads,intraOpNumThreads:n.intraOpNumThreads});return await r.initialize(),J.debug(`Embedder loaded (in-process)`,{modelId:r.modelId,dimensions:r.dimensions}),r}catch(e){return J.warn(`Embedder initialization failed — vector search degraded to FTS-only`,{error:N(e)}),{dimensions:0,modelId:`unavailable`,initialize:async()=>{},embed:async()=>{throw Error(`Embedder unavailable`)},embedQuery:async()=>{throw Error(`Embedder unavailable`)},embedBatch:async()=>{throw Error(`Embedder unavailable`)}}}})(),(async()=>{let e=t===`sqlite-vec`?await ge({backend:t,path:s,adapter:p??void 0,embeddingDim:o.dimensions,embeddingProfile:o,partition:f}):await ge({backend:t,path:s,adapter:p??void 0,embeddingDim:o.dimensions,partition:void 0});return await e.initialize(),J.debug(`Store initialized`,{backend:t}),e})(),(async()=>{let e=p?new pe({adapter:p}):new pe({path:s});return await e.initialize(),J.debug(`Graph store initialized`,{shared:!!p}),e})(),(async()=>{let e=await ue();if(e){let e=B.get();J.debug(`WASM tree-sitter enabled`,{grammars:e.grammarCount,dir:e.wasmDir})}else{let e=B.get();J.warn(`WASM tree-sitter not available; analyzers will use regex fallback`,{reason:e.reason,os:e.os,arch:e.arch,healAttempted:e.healAttempted,healSuccess:e.healSuccess,healError:e.healError,pathsChecked:e.pathsChecked.map(e=>`${e.path} (${e.exists?`found`:`missing`})`)})}return e})()]),v=new Se(h,g),te=he(m),y=new xe(e.store.path);y.load(),v.setHashCache(y);let b=e.curated.path,x=new i(b);await x.initialize();let S=new a(b,g,h,x);v.setGraphStore(_);let C=u(e.er),w=C?new fe(e.curated.path):void 0;w&&J.debug(`Policy store initialized`,{ruleCount:w.getRules().length});let ne=C?new de:void 0,T=ae(e.sources[0]?.path??M(),re.aiContext),E=P(T),k=e.onboardDir?P(e.onboardDir):!1,A=E||k,j,L=E?T:e.onboardDir;if(A&&L)try{j=ie(L).mtime.toISOString()}catch{}return J.debug(`Onboard state detected`,{onboardComplete:A,onboardTimestamp:j,aiKbExists:E,onboardDirExists:k}),{embedder:h,store:g,stateStore:te,closeStateStore:m===p?void 0:async()=>m.close(),indexer:v,curated:S,graphStore:_,fileCache:new oe,bridge:C,policyStore:w,evolutionCollector:ne,onboardComplete:A,onboardTimestamp:j,eventBus:new c}}function ze(e,t,n){if(e.serverInstructions)return e.serverInstructions;let r=new Set;for(let e of t){let t=n[e];if(t?.category)for(let e of t.category)r.add(e)}let i=[`This server provides ${t.size} tools across ${r.size} categories: ${[...r].sort().join(`, `)}.`,`TOOL ROUTING:`,`- Understand a file -> file_summary (T1=structure, T2=content)`,`- Find code/symbols -> search (hybrid) or symbol (definition + refs)`,`- Validate changes -> check (typecheck+lint) or test_run (tests)`,`- Read file for editing -> read_file (only for exact lines before edits)`,`FORBIDDEN: DO NOT USE native equivalents when AI Kit provides same:`,`- grep/find -> search or find tool`,`- cat/read_file (for understanding) -> file_summary`,`- terminal tsc/lint -> check tool`,`- terminal test -> test_run tool`];return e.readOnly&&i.push(`Server is in read-only mode. Mutating operations are disabled.`),e.features?.length&&i.push(`Active feature groups: ${e.features.join(`, `)}.`),i.join(`
19
- `)}const Be=j(`background-task`);var Ve=class{queue=[];running=null;get isRunning(){return this.running!==null}get currentTask(){return this.running}get pendingCount(){return this.queue.length}schedule(e){return new Promise((t,n)=>{this.queue.push({...e,resolve:t,reject:n}),this.running||this.processQueue()})}async processQueue(){for(;this.queue.length>0;){let e=this.queue.shift();if(!e)break;this.running=e.name,Be.info(`Background task started`,{task:e.name,pending:this.queue.length});let t=Date.now();try{await e.fn();let n=Date.now()-t;Be.info(`Background task completed`,{task:e.name,durationMs:n}),e.resolve()}catch(n){let r=Date.now()-t;Be.error(`Background task failed`,{task:e.name,durationMs:r,err:n}),e.reject(n instanceof Error?n:Error(String(n)))}}this.running=null}};const X=j(`idle-timer`);var He=class{timer=null;cleanupFns=[];idleMs;disposed=!1;sessionActive=!1;_busy=!1;constructor(e){this.idleMs=e?.idleMs??3e5}setBusy(e){this._busy=e,e?this.cancel():this.touch()}onIdle(e){this.cleanupFns.push(e)}markSessionActive(){this.sessionActive=!0}touch(){this.disposed||this._busy||(this.cancel(),this.timer=setTimeout(()=>{this.runCleanup()},this.idleMs),this.timer.unref&&this.timer.unref())}cancel(){this.timer&&=(clearTimeout(this.timer),null)}dispose(){this.cancel(),this.cleanupFns.length=0,this.disposed=!0}async runCleanup(){if(!this.sessionActive){X.info(`Idle timeout reached with no active session — skipping cleanup (waiting for first tool call)`);return}if(this._busy){X.info(`Skipping idle cleanup — background work in progress`);return}X.info(`Idle for ${this.idleMs/1e3}s — running cleanup`);let e=await Promise.allSettled(this.cleanupFns.map(e=>e()));for(let t of e)t.status===`rejected`&&X.warn(`Idle cleanup callback failed`,{error:String(t.reason)})}};const Z=j(`memory-monitor`);var Ue=class{timer=null;warningBytes;criticalBytes;intervalMs;pressureFns=[];memoryPressureFns=[];lastLevel=`normal`;constructor(e){this.warningBytes=e?.warningBytes??3221225472,this.criticalBytes=e?.criticalBytes??6442450944,this.intervalMs=e?.intervalMs??3e4}onPressure(e){this.pressureFns.push(e)}registerMemoryPressureCallback(e){this.memoryPressureFns.push(e)}start(){this.timer||(this.timer=setInterval(()=>this.check(),this.intervalMs),this.timer.unref&&this.timer.unref(),Z.debug(`Memory monitor started`,{warningMB:Math.round(this.warningBytes/1024/1024),criticalMB:Math.round(this.criticalBytes/1024/1024),intervalSec:Math.round(this.intervalMs/1e3)}))}stop(){this.timer&&=(clearInterval(this.timer),null)}getRssBytes(){return process.memoryUsage.rss()}check(){let e=this.getRssBytes(),t=`normal`;if(e>=this.criticalBytes?t=`critical`:e>=this.warningBytes&&(t=`warning`),t!==this.lastLevel||t===`critical`){let n=Math.round(e/1024/1024);t===`critical`?Z.warn(`Memory CRITICAL: ${n}MB RSS — consider restarting the server`):t===`warning`?Z.warn(`Memory WARNING: ${n}MB RSS`):this.lastLevel!==`normal`&&Z.info(`Memory returned to normal: ${n}MB RSS`),this.lastLevel=t}if(t!==`normal`)for(let n of this.pressureFns)try{n(t,e)}catch{}if(t===`critical`)for(let e of this.memoryPressureFns)try{let t=e();t&&typeof t.catch==`function`&&t.catch(()=>{})}catch{}return t===`critical`&&typeof globalThis.gc==`function`&&globalThis.gc(),t}};const We=new Ce;function Ge(e,t){return We.run(e,async()=>{try{return await t()}finally{}})}j(`tool-timeout`);const Ke=new Set([`onboard`,`reindex`,`produce_knowledge`,`analyze`,`codemod`,`audit`]);var qe=class extends Error{toolName;timeoutMs;constructor(e,t){super(`Tool "${e}" timed out after ${t}ms`),this.toolName=e,this.timeoutMs=t,this.name=`ToolTimeoutError`}};function Je(e){return Ke.has(e)?6e5:12e4}function Ye(e,t,n){let r=new AbortController,i=r.signal;return new Promise((a,o)=>{let s=setTimeout(()=>{let e=new qe(n,t);i.aborted||r.abort(e),o(e)},t);s.unref();try{e(i).then(a,o).finally(()=>clearTimeout(s))}catch(e){clearTimeout(s),o(e instanceof Error?e:Error(String(e)))}})}const Q=j(`server`),Xe=new Set([`status`,`list_tools`,`describe_tool`,`config`,`env`,`present`]);function Ze(e,t=28){let n=e.replace(/\s+/g,` `).trim();return n.length<=t?n:`${n.slice(0,t-3)}...`}function Qe(e){let t=[`query`,`path`,`task`,`name`,`start`,`symbol`,`file`,`pattern`],n=[];for(let r of t){let t=e[r];typeof t==`string`&&t.length>0&&t.length<200&&n.push(t)}return n.join(` `).slice(0,200)}async function $e(e,t,n,r){let i=[];if(n){let t=await et(e,n);t&&i.push(t)}try{if(t.statePath){let{ensureLegacyStashImported:n}=await import(`../../tools/dist/index.js`);n(e.stateStore,{stateDir:t.statePath})}let r=e.stateStore.stashList().map(e=>e.key);if(r.length>0){let e=n?n.toLowerCase().split(/\s+/).filter(e=>e.length>2):[];if(e.length===0)i.push(`📦 stash: ${r.length} entries`);else{let t=r.filter(t=>e.some(e=>t.toLowerCase().includes(e))).slice(0,3);t.length>0&&i.push(`📦 stash: ${t.map(e=>`"${Ze(e)}"`).join(`, `)}${r.length>t.length?` (+${r.length-t.length})`:``}`)}}}catch{}if(i.length===0&&!r)return null;if(r){let n=e,r=n.curated;if(r?.list&&n.stateStore)try{let{buildPreludeInjection:e,generatePrelude:a}=await import(`./startup-maintenance-cbRSFMY5.js`).then(e=>e.a),o=e(await a(r,n.stateStore,void 0,t.skillDir),500);o.lines.length>0&&i.push(o.lines.join(`
19
+ `)}const Be=j(`background-task`);var Ve=class{queue=[];running=null;get isRunning(){return this.running!==null}get currentTask(){return this.running}get pendingCount(){return this.queue.length}schedule(e){return new Promise((t,n)=>{this.queue.push({...e,resolve:t,reject:n}),this.running||this.processQueue()})}async processQueue(){for(;this.queue.length>0;){let e=this.queue.shift();if(!e)break;this.running=e.name,Be.info(`Background task started`,{task:e.name,pending:this.queue.length});let t=Date.now();try{await e.fn();let n=Date.now()-t;Be.info(`Background task completed`,{task:e.name,durationMs:n}),e.resolve()}catch(n){let r=Date.now()-t;Be.error(`Background task failed`,{task:e.name,durationMs:r,err:n}),e.reject(n instanceof Error?n:Error(String(n)))}}this.running=null}};const X=j(`idle-timer`);var He=class{timer=null;cleanupFns=[];idleMs;disposed=!1;sessionActive=!1;_busy=!1;constructor(e){this.idleMs=e?.idleMs??3e5}setBusy(e){this._busy=e,e?this.cancel():this.touch()}onIdle(e){this.cleanupFns.push(e)}markSessionActive(){this.sessionActive=!0}touch(){this.disposed||this._busy||(this.cancel(),this.timer=setTimeout(()=>{this.runCleanup()},this.idleMs),this.timer.unref&&this.timer.unref())}cancel(){this.timer&&=(clearTimeout(this.timer),null)}dispose(){this.cancel(),this.cleanupFns.length=0,this.disposed=!0}async runCleanup(){if(!this.sessionActive){X.info(`Idle timeout reached with no active session — skipping cleanup (waiting for first tool call)`);return}if(this._busy){X.info(`Skipping idle cleanup — background work in progress`);return}X.info(`Idle for ${this.idleMs/1e3}s — running cleanup`);let e=await Promise.allSettled(this.cleanupFns.map(e=>e()));for(let t of e)t.status===`rejected`&&X.warn(`Idle cleanup callback failed`,{error:String(t.reason)})}};const Z=j(`memory-monitor`);var Ue=class{timer=null;warningBytes;criticalBytes;intervalMs;pressureFns=[];memoryPressureFns=[];lastLevel=`normal`;constructor(e){this.warningBytes=e?.warningBytes??3221225472,this.criticalBytes=e?.criticalBytes??6442450944,this.intervalMs=e?.intervalMs??3e4}onPressure(e){this.pressureFns.push(e)}registerMemoryPressureCallback(e){this.memoryPressureFns.push(e)}start(){this.timer||(this.timer=setInterval(()=>this.check(),this.intervalMs),this.timer.unref&&this.timer.unref(),Z.debug(`Memory monitor started`,{warningMB:Math.round(this.warningBytes/1024/1024),criticalMB:Math.round(this.criticalBytes/1024/1024),intervalSec:Math.round(this.intervalMs/1e3)}))}stop(){this.timer&&=(clearInterval(this.timer),null)}getRssBytes(){return process.memoryUsage.rss()}check(){let e=this.getRssBytes(),t=`normal`;if(e>=this.criticalBytes?t=`critical`:e>=this.warningBytes&&(t=`warning`),t!==this.lastLevel||t===`critical`){let n=Math.round(e/1024/1024);t===`critical`?Z.warn(`Memory CRITICAL: ${n}MB RSS — consider restarting the server`):t===`warning`?Z.warn(`Memory WARNING: ${n}MB RSS`):this.lastLevel!==`normal`&&Z.info(`Memory returned to normal: ${n}MB RSS`),this.lastLevel=t}if(t!==`normal`)for(let n of this.pressureFns)try{n(t,e)}catch{}if(t===`critical`)for(let e of this.memoryPressureFns)try{let t=e();t&&typeof t.catch==`function`&&t.catch(()=>{})}catch{}return t===`critical`&&typeof globalThis.gc==`function`&&globalThis.gc(),t}};const We=new Ce;function Ge(e,t){return We.run(e,async()=>{try{return await t()}finally{}})}j(`tool-timeout`);const Ke=new Set([`onboard`,`reindex`,`produce_knowledge`,`analyze`,`codemod`,`audit`]);var qe=class extends Error{toolName;timeoutMs;constructor(e,t){super(`Tool "${e}" timed out after ${t}ms`),this.toolName=e,this.timeoutMs=t,this.name=`ToolTimeoutError`}};function Je(e){return Ke.has(e)?6e5:12e4}function Ye(e,t,n){let r=new AbortController,i=r.signal;return new Promise((a,o)=>{let s=setTimeout(()=>{let e=new qe(n,t);i.aborted||r.abort(e),o(e)},t);s.unref();try{e(i).then(a,o).finally(()=>clearTimeout(s))}catch(e){clearTimeout(s),o(e instanceof Error?e:Error(String(e)))}})}const Q=j(`server`),Xe=new Set([`status`,`list_tools`,`describe_tool`,`config`,`env`,`present`]);function Ze(e,t=28){let n=e.replace(/\s+/g,` `).trim();return n.length<=t?n:`${n.slice(0,t-3)}...`}function Qe(e){let t=[`query`,`path`,`task`,`name`,`start`,`symbol`,`file`,`pattern`],n=[];for(let r of t){let t=e[r];typeof t==`string`&&t.length>0&&t.length<200&&n.push(t)}return n.join(` `).slice(0,200)}async function $e(e,t,n,r){let i=[];if(n){let t=await et(e,n);t&&i.push(t)}try{if(t.statePath){let{ensureLegacyStashImported:n}=await import(`../../tools/dist/index.js`);n(e.stateStore,{stateDir:t.statePath})}let r=e.stateStore.stashList().map(e=>e.key);if(r.length>0){let e=n?n.toLowerCase().split(/\s+/).filter(e=>e.length>2):[];if(e.length===0)i.push(`📦 stash: ${r.length} entries`);else{let t=r.filter(t=>e.some(e=>t.toLowerCase().includes(e))).slice(0,3);t.length>0&&i.push(`📦 stash: ${t.map(e=>`"${Ze(e)}"`).join(`, `)}${r.length>t.length?` (+${r.length-t.length})`:``}`)}}}catch{}if(i.length===0&&!r)return null;if(r){let n=e,r=n.curated;if(r?.list&&n.stateStore)try{let{buildPreludeInjection:e,generatePrelude:a}=await import(`./startup-maintenance-D7tKqECM.js`).then(e=>e.a),o=e(await a(r,n.stateStore,void 0,t.skillDir),500);o.lines.length>0&&i.push(o.lines.join(`
20
20
  `))}catch(e){Q.debug?.(`Periodic prelude injection failed`,{error:String(e)})}}return i.length===0?null:`\n${i.join(`
21
21
  `)}`}async function et(e,n){try{let r=await Promise.race([e.store.ftsSearch(n,{limit:3}),new Promise(e=>{let t=setTimeout(()=>e(null),1e3);t.unref&&t.unref()})]);if(!Array.isArray(r)||r.length===0)return null;let i=[];for(let e of r){if(!e||typeof e!=`object`)continue;let n=e.record;if(!n)continue;let r=n.origin;if(r!==`curated`&&r!==`produced`)continue;let a=n.content??``;if(!(!a||a.length<20)){if(a.length<=400){let e=n.headingPath?.trim()||``,t=a.slice(0,400),r=e?`📚 ${e}: ${t}`:`📚 ${t}`;i.push(r)}else{let e=t(a,400),r=n.headingPath?.trim()||``,o=r?`📚 ${r}: ${e}`:`📚 ${e}`;i.push(o)}if(i.length>=2)break}}return i.length===0?null:i.join(`
22
22
  `)}catch{return null}}function tt(e,t,n){let r=5,i=0;for(let[a,o]of Object.entries(e)){let e=o.handler;o.handler=async(...o)=>{let s=await e(...o);if(!s||typeof s!=`object`||r<=0||s.isError||Xe.has(a))return s;try{r--,i++;let e=o[0],a=await $e(t,n,Qe(e&&typeof e==`object`?e:{}),i%5==0);a&&(s.content=Array.isArray(s.content)?s.content:[],s.content.push({type:`text`,text:a}))}catch{}return s}}}function nt(e){let t=e.toLowerCase();return[`protobuf`,`invalid model`,`invalid onnx`,`unexpected end`,`unexpected token`,`failed to load`,`failed to initialize embedding`,`checksum`,`corrupt`,`malformed`,`could not load`,`onnx`,`database is locked`,`database disk image is malformed`,`file is not a database`,`lance`,`cannot find module`,`cannot find package`,`module not found`,`operation not permitted`,`permission denied`].some(e=>t.includes(e))}function rt(e){return v(e)?[`Auto-heal tried to repair missing runtime dependency files in the npx install.`,`If this persists, clear the broken npx cache and restart:`,` npm cache clean --force`,` npx -y @vpxa/aikit@latest serve`].join(`