@vpxa/aikit 0.1.396 → 0.1.398
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/packages/aikit-client/dist/index.d.ts +1 -0
- package/packages/aikit-client/dist/index.js +2 -2
- package/packages/browser/dist/index.js +1 -1
- package/packages/claude-desktop/dist/manifest.json +1 -1
- package/packages/core/dist/index.d.ts +2 -0
- package/packages/server/dist/bin.js +1 -1
- package/packages/server/dist/index.js +1 -1
- package/packages/server/dist/{register-tools-B8PeQx0Y.js → register-tools-BaddGXqY.js} +10 -10
- package/packages/server/dist/{register-tools-DLENgNAW.js → register-tools-DWTLkaFG.js} +10 -10
- package/packages/server/dist/{server-Ba2YVf_M.js → server-Zs9-tb2g.js} +1 -1
- package/packages/server/dist/{server-BmxvSBgJ.js → server-by4LpJpg.js} +1 -1
- package/packages/server/dist/{server-http-B-Shfkdx.js → server-http-C9Zw6erV.js} +1 -1
- package/packages/server/dist/{server-http-BaCFoBkv.js → server-http-DJGyY7DN.js} +1 -1
- package/packages/server/dist/{server-stdio-BRLNHMrk.js → server-stdio-Bl3oSggo.js} +1 -1
- package/packages/server/dist/{server-stdio-CU5MD6W_.js → server-stdio-DsBR9uv4.js} +1 -1
- package/packages/store/dist/index.js +2 -2
- package/packages/store/dist/{lance-store-B1Gim3h9.js → lance-store-CbTCT5kb.js} +1 -1
|
@@ -27,7 +27,7 @@ skillDir is not configured. Run \`aikit init\` or set skillDir in server config
|
|
|
27
27
|
|
|
28
28
|
Run \`onboard({ path: "." })\` to generate this skill.`+n}catch{t=`# Workspace Skill: error
|
|
29
29
|
|
|
30
|
-
Failed to read skill file.`}return{contents:[{uri:`aikit://skill/SKILL.md`,text:t,mimeType:`text/markdown`}]}}),r?Fo.debug(`Workspace skill resources registered`,{skillDir:r}):Fo.debug(`skillDir not configured — skill resources registered with diagnostic messages`)}new Set(Object.entries(Fa).filter(([e,t])=>t.planner?.effect===`read`).map(([e])=>e)),new Set(Object.entries(Fa).filter(([e,t])=>{let n=t.planner?.effect;return n===`write`||n===`mixed`||n===`destructive`}).map(([e])=>e)),new Set(Object.entries(Fa).filter(([e,t])=>t.planner?.costClass===`tiny`).map(([e])=>e));const Uo=[`er_push`,`er_pull`,`er_sync_status`],Wo=[...Uo,`er_update_policy`,`er_evolve_review`],Go=new Set(Wo);function Ko(e){return e.toolProfiles}const qo=5e3,Jo=k(`structured-content-guard`);function Yo(){let e=(async(e,t)=>{let n;try{n=await t()}catch(e){n={content:[{type:`text`,text:`[ERROR:INTERNAL] ${e instanceof Error?e.message:String(e)}`}],isError:!0}}let r=(e.toolConfig??{}).outputSchema;if(r==null)return n;let i=null;if(n.structuredContent==null){let t=Xo(r);n.structuredContent=t,i=`synthesize`,n.structuredContent??(n.structuredContent={},i=`synthesize-null-fallback`,Jo.error(`synthesizeStructuredContent returned null/undefined — using empty fallback`,{tool:e.toolName}))}let a=Zo(r,n.structuredContent);if(a.action!=null&&(n.structuredContent=a.structuredContent,i=a.action),$o(n.structuredContent)||(n.isError=!0,n.structuredContent={},i=`fallback-error`),Qo(r,n.structuredContent)===!1){let e=Xo(r);n.structuredContent=e??{},Qo(r,n.structuredContent)===!1?(n.structuredContent=$o(n.structuredContent)?n.structuredContent:{},i=`final-validation-failed`):i??=`final-heal`}return n});return e.critical=!0,e}function Xo(e){try{return es(e)??{}}catch{return{}}}function Zo(e,t){if(Qo(e,t)!==!1)return{structuredContent:t,action:null};try{let n=Xo(e);if($o(n)&&$o(t)){let r={...n,...t};if(Qo(e,r)!==!1)return{structuredContent:r,action:`heal`}}return{structuredContent:n,action:`fallback-zero-value`}}catch{return{structuredContent:t,action:null}}}function Qo(e,t){let n=e.safeParse;if(typeof n==`function`)try{return n(t).success}catch{return}}function $o(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function es(e){if(!e)return{};if(e.anyOf){let t=e.anyOf.find(e=>e.type!==`null`);return t?es(t):null}let t=e._def?.typeName;if(t&&!e.type)switch(t){case`ZodObject`:{let t={},n=null;try{n=e.shape??(typeof e._def?.shape==`function`?e._def.shape():e._def?.shape)}catch{n=null}if(n)for(let[e,r]of Object.entries(n))try{t[e]=es(r)}catch{t[e]=null}return t}case`ZodArray`:return[];case`ZodString`:return``;case`ZodNumber`:return 0;case`ZodBoolean`:return!1;case`ZodNullable`:return null;case`ZodOptional`:return;case`ZodRecord`:return{};case`ZodEnum`:return e._def?.values?.[0]??``;default:return{}}switch(e.type){case`object`:{let t={},n=e.properties??e.shape;if(n)for(let[e,r]of Object.entries(n))t[e]=es(r);return t}case`array`:return[];case`string`:return``;case`number`:case`integer`:return 0;case`boolean`:return!1;case`nullable`:return null;case`optional`:return;case`record`:return{};case`enum`:return e.options?.[0]??Object.values(e.enum??e._def?.entries??{})[0]??``;default:return{}}}function ts(e){if(!e)return{};try{let t=es(e);return $o(t)?t:{}}catch{return{}}}const ns=Symbol(`toolPipelineState`);function rs(e){return e[ns]}function is(e,t){e[ns]=t}function as(e,t){return t?async(...n)=>{let r=await e(...n);if(!r||typeof r!=`object`)return r;let i=r;return!(`content`in i)||i.structuredContent!=null&&typeof i.structuredContent==`object`?r:(i.structuredContent=ts(t),i.structuredContent??={},r)}:e}function os(e,t,n=``,r,i){let a=rs(e);if(a){a.pipeline=t,a.prefix=n,r!==void 0&&(a.eventBus=r),i!==void 0&&(a.workspaceId=i);return}let o={originalRegisterTool:e.registerTool.bind(e),pipeline:t,prefix:n,eventBus:r,workspaceId:i};is(e,o),e.registerTool=(n,r,i)=>{let a=rs(e),s=a?.prefix?`${a.prefix}${n}`:n;if(!i)return a?.originalRegisterTool(s,r);let c=r?.outputSchema;if((a?.pipeline??t).getMiddlewareNames().length===0){let e=as(i,c);return a?.originalRegisterTool(s,r,e)}let l=U(n),u=a??o,d=as(u.pipeline.wrap(n,i,r,l,u.eventBus,u.workspaceId),c);return a?.originalRegisterTool(s,r,d)}}const ss={analyze:1,audit:1,check:2,codemod:2,config:0,delegate:3,digest:1,env:0,eval:2,evidence_map:2,file_summary:1,find:1,flow:3,forge_ground:2,git:1,graph:1,measure:1,onboard:3,parse_output:1,present:1,process:3,produce_knowledge:3,queue:3,reindex:3,rename:2,replay:1,restore:2,scope_map:1,search:1,session:2,status:0,symbol:1,test_run:2,trace:1,web_fetch:1,web_search:1};function cs(e,t){return e.filter(e=>(ss[e]??0)<=t)}const ls=new Set([`status`,`config`]),us={full:{description:`All tools enabled (default)`,includeCategories:[]},safe:{description:`Read-only tools — no file/state modifications`,includeCategories:[`search`,`analysis`,`compression`,`utilities`,`system`,`git`,`flow`],excludeTools:[`reindex`,`onboard`]},research:{description:`Search, analysis, knowledge, and web access`,includeCategories:[`search`,`analysis`,`knowledge`,`compression`,`web`,`system`,`flow`]},minimal:{description:`Essential tools only — search, status, basic operations`,includeCategories:[`search`,`system`],includeTools:[`file_summary`,`check`,`test_run`]},discovery:{description:`Full toolset plus discovery-oriented meta-tools for guided tool exploration`,includeCategories:[],includeTools:[`list_tools`],excludeTools:[`describe_tool`,`search_tools`]}};function ds(e,t){let n=us[e];if(n)return n;let r=t?.[e];if(r)return r;throw Error(`Unknown tool profile: ${e}`)}function fs(e,t,n){return t.includes(`*`)?!0:(n[e]?.category??[]).some(e=>t.includes(e))}function ps(e,t,n,r){if(t.includes(`*`)){for(let t of n)e.add(t);return}for(let i of n)fs(i,t,r)&&e.add(i)}function ms(e,t,n){if(t.includes(`*`)){e.clear();return}for(let r of[...e])fs(r,t,n)&&e.delete(r)}function hs(e,t,n){if(!e||e.length===0||e.includes(`*`))return new Set(t);let r=new Set;return ps(r,e,t,n),r}function gs(e,t){return e===void 0?t:t===void 0?e:Math.min(e,t)}function _s(e,t){for(let n of[...e])t[n]?.annotations?.readOnlyHint===!1&&e.delete(n)}function vs(e,t,n=0,r=[]){if(n>10)throw Error(`Tool profile inheritance exceeded max depth 10: ${[...r,e].join(` -> `)}`);if(r.includes(e))throw Error(`Tool profile inheritance cycle detected: ${[...r,e].join(` -> `)}`);let i=ds(e,t);return gs(i.extends?vs(i.extends,t,n+1,[...r,e]):void 0,i.maxTier)}function ys(e,t,n,r){let i=(e,a,o)=>{if(a>10)throw Error(`Tool profile inheritance exceeded max depth 10: ${[...o,e].join(` -> `)}`);if(o.includes(e))throw Error(`Tool profile inheritance cycle detected: ${[...o,e].join(` -> `)}`);let s=ds(e,r),c=[...o,e],l=s.extends?i(s.extends,a+1,c):hs(s.includeCategories,t,n);s.extends&&s.includeCategories?.length&&ps(l,s.includeCategories,t,n),s.excludeCategories?.length&&ms(l,s.excludeCategories,n);for(let e of s.includeTools??[])l.add(e);for(let e of s.excludeTools??[])l.delete(e);return l},a=i(e,0,[]),o=vs(e,r);if(o!==void 0){let e=cs([...a],o);a.clear();for(let t of e)a.add(t)}for(let e of ls)a.add(e);return e===`safe`&&_s(a,n),a}const bs=new Set([`search`,`analysis`,`knowledge`,`compression`,`forge`,`presentation`,`execution`,`manipulation`,`session`,`git`,`process`,`system`,`meta`,`utilities`,`web`,`queue`,`flow`]);function xs(e,t,n,r){let i=process.env.AIKIT_TOOLSET||e.toolProfile||`full`,a=ys(i,t,n,r);if(e.features&&e.features.length>0){let i=e.features.filter(e=>!bs.has(e));if(i.length>0)throw Error(`Unknown feature group(s): ${i.join(`, `)}. Valid categories: ${[...bs].join(`, `)}`);let o={description:`Synthetic profile from features config`,includeCategories:e.features},s=ys(`_features`,t,n,{...r,_features:o});for(let e of a)!s.has(e)&&!ls.has(e)&&a.delete(e)}if(e.readOnly)for(let e of[...a])n[e]?.annotations?.readOnlyHint===!1&&!ls.has(e)&&a.delete(e);for(let e of ls)a.add(e);return i===`safe`&&_s(a,n),a}const Ss=I.object({mode:I.enum([`wasm`,`regex`,`unknown`]),reason:I.string(),pathsChecked:I.array(I.object({path:I.string(),exists:I.boolean()})),os:I.string(),arch:I.string(),nodeVersion:I.string(),webTreeSitterImportable:I.boolean(),healAttempted:I.boolean(),healSuccess:I.boolean(),healError:I.string().nullable(),initError:I.string().nullable(),wasmDir:I.string().nullable(),grammarCount:I.number()}),Cs=I.object({kind:I.enum([`onboard`,`update_onboard`,`reindex`,`handoff`,`proceed`]),reason:I.string(),command:I.string().optional()}),ws=I.object({title:I.string(),insight:I.string(),confidence:I.number()}),Ts=I.object({lessons:I.array(ws),conventions:I.array(I.object({title:I.string(),preview:I.string()})),checkpoint:I.string().nullable()});I.object({totalRecords:I.number(),totalFiles:I.number(),lastIndexedAt:I.string().nullable(),onboarded:I.boolean(),onboardDir:I.string(),contentTypes:I.record(I.string(),I.number()),wasmAvailable:I.boolean(),wasmDiagnostics:Ss,graphStats:I.object({nodes:I.number(),edges:I.number()}).nullable(),curatedCount:I.number(),serverVersion:I.string(),scaffoldVersion:I.string().nullable(),workspaceScaffoldVersion:I.string().nullable(),upgradeAvailable:I.boolean(),sessionTokens:I.object({callCount:I.number(),totalInputChars:I.number(),totalOutputChars:I.number(),estInputTokens:I.number(),estTotalTokens:I.number(),startTime:I.string()}).optional(),storeBackend:I.string().optional(),storeDiagnostics:I.object({adapterType:I.string(),vectorSearchEnabled:I.boolean(),ftsEnabled:I.boolean(),degradedMode:I.boolean(),dbPath:I.string(),dbSizeBytes:I.number().nullable(),embeddingDim:I.number(),vectorDtype:I.string()}).nullable().optional(),contextPressure:I.number().min(0).max(100).describe(`0–100 score indicating AI Kit saturation`),nextAction:Cs,prelude:Ts.nullable().optional()}).catchall(I.any()),I.object({ok:I.boolean(),checks:I.array(I.object({name:I.string(),ok:I.boolean(),message:I.string().optional()}))});const Es=I.object({summary:I.object({totalFiles:I.number(),totalLines:I.number(),totalCodeLines:I.number(),totalFunctions:I.number(),avgComplexity:I.number(),maxComplexity:I.object({value:I.number(),file:I.string()})}),files:I.array(I.object({path:I.string(),lines:I.number(),code:I.number(),complexity:I.number(),functions:I.number()}))}),Ds=I.object({platform:I.string(),arch:I.string(),nodeVersion:I.string(),cwd:I.string(),cpus:I.number(),memoryFreeGb:I.number(),memoryTotalGb:I.number()});I.object({iso:I.string(),unix:I.number(),timezone:I.string(),formatted:I.string()});const Os=I.object({passed:I.boolean(),errorCount:I.number(),warningCount:I.number(),topErrors:I.array(I.string())}),ks=I.object({passed:I.boolean(),tsc:Os,biome:Os}),As=I.object({name:I.string(),path:I.string(),depth:I.number()}),js=I.object({name:I.string(),definedIn:I.object({path:I.string(),line:I.number(),kind:I.string(),signature:I.string().optional()}).nullable(),importedBy:I.array(I.object({path:I.string(),line:I.number(),importStatement:I.string()})),referencedIn:I.array(I.object({path:I.string(),line:I.number(),context:I.string(),scope:I.string().optional()})),graphContext:I.object({definingModule:I.string().optional(),importedByModules:I.array(I.string()),siblingSymbols:I.array(I.string())}).nullable(),trace:I.object({callers:I.array(As),callees:I.array(As)}).nullable(),confidence:I.number().nullable(),method:I.string().nullable(),rationale:I.string().nullable(),error:I.string().optional()}),Ms=I.object({symbols:I.array(js)}),Ns=I.object({sourcePath:I.string(),contentType:I.string(),score:I.number(),headingPath:I.string().optional(),startLine:I.number().optional(),endLine:I.number().optional(),origin:I.string().optional(),category:I.string().optional(),tags:I.array(I.string()).optional()}),Ps=I.object({results:I.array(Ns),totalResults:I.number(),searchMode:I.string(),query:I.string(),ref:I.string().optional().describe(`Reusable cache reference for later compact(ref, query)`)}),Fs=I.object({path:I.string(),line:I.number().optional(),matchType:I.string(),preview:I.string()}),Is=I.object({matches:I.array(Fs),totalMatches:I.number(),pattern:I.string(),truncated:I.boolean(),ref:I.string().optional().describe(`Reusable cache reference for later compact(ref, query)`)}),Ls=I.object({path:I.string(),relevance:I.number(),estimatedTokens:I.number(),focusLines:I.array(I.string()).optional()}),Rs=I.object({files:I.array(Ls),totalFiles:I.number(),totalEstimatedTokens:I.number(),task:I.string()}),zs=I.object({path:I.string(),impact:I.string(),reason:I.string()}),Bs=I.object({changedFiles:I.array(I.string()),affectedFiles:I.array(zs),totalAffected:I.number(),riskLevel:I.string()}),Vs=I.object({name:I.string(),passed:I.boolean(),message:I.string().optional(),severity:I.string().optional()}),Hs=I.object({passed:I.boolean(),score:I.number(),checks:I.array(Vs),summary:I.string()}),Us=I.object({id:I.string(),name:I.string(),type:I.string(),sourcePath:I.string().optional()}),Ws=I.object({fromId:I.string(),toId:I.string(),fromName:I.string(),toName:I.string(),type:I.string()}),Gs=I.object({id:I.string(),name:I.string(),type:I.string()}),Ks=I.object({id:I.string(),nodeCount:I.number(),types:I.record(I.string(),I.number()),samples:I.array(Gs)}),qs=I.object({nodes:I.array(Us),edges:I.array(Ws),communities:I.array(Ks).optional(),totalNodes:I.number(),totalEdges:I.number(),query:I.string()});I.object({symbols:I.array(I.object({name:I.string(),path:I.string(),line:I.number().optional(),kind:I.string()})),totalDead:I.number()});const Js=I.object({gitRoot:I.string(),branch:I.string(),commitCount:I.number(),hasUncommitted:I.boolean(),recentCommits:I.array(I.object({hash:I.string(),message:I.string(),author:I.string(),date:I.string()}))}),Ys=I.object({sourceId:I.string(),value:I.string()}),Xs=I.object({id:I.string(),originalChars:I.number(),keptChars:I.number(),segmentsKept:I.number(),segmentsTotal:I.number()}),Zs=I.object({text:I.string().describe(`The compressed digest text output`),ref:I.string().optional().describe(`Reusable cache reference`),fields:I.record(I.string(),I.array(Ys)),sourceStats:I.array(Xs),totalOriginalChars:I.number(),totalCompressedChars:I.number(),ratio:I.number()}),Qs=I.object({passed:I.boolean(),totalTests:I.number(),passedTests:I.number(),failedTests:I.number(),skippedTests:I.number(),duration:I.number().describe(`Duration in milliseconds`),failures:I.array(I.object({name:I.string(),message:I.string(),file:I.string().optional()}))}),$s=k(`utils:enrich`);async function G(e,t){let n={curated:[],graph:[]},r=t.limit??3,[i,a]=await Promise.allSettled([ec(e,t.query,r),tc(e,t.filePath)]);return i.status===`fulfilled`?n.curated=i.value:$s.debug(`Curated enrichment failed`,{error:i.reason}),a.status===`fulfilled`?n.graph=a.value:$s.debug(`Graph enrichment failed`,{error:a.reason}),n}async function ec(e,t,n){if(!e.store||!t)return[];try{let r=await e.store.ftsSearch(t,{origin:`curated`,limit:n});if(r.length>0)return r.map(e=>nc(e.record));if(e.embedder){let r=await e.embedder.embedQuery(t);return(await e.store.search(r,{origin:`curated`,limit:n,minScore:.3})).map(e=>nc(e.record))}return[]}catch(e){return $s.debug(`Curated enrichment failed`,{error:e}),[]}}async function tc(e,t){if(!e.graphStore||!t)return[];try{let n=await e.graphStore.findNodes({sourcePath:t,limit:1});if(n.length===0){let r=t.split(/[/\\]/).pop()?.replace(/\.\w+$/,``)||``;if(!r)return[];let i=await e.graphStore.findNodes({namePattern:r,type:`module`,limit:1});if(i.length===0)return[];n.push(i[0])}let r=n[0],i=await e.graphStore.getNeighbors(r.id,{direction:`both`,limit:10}),a=[];for(let e of i.edges){let t=e.fromId===r.id?e.toId:e.fromId,n=i.nodes.find(e=>e.id===t);if(!n)continue;let o=e.fromId===r.id?`->`:`<-`;a.push(`${o} ${e.type}: ${n.name} (${n.type})`)}return a}catch(e){return $s.debug(`Graph enrichment failed`,{error:e}),[]}}function K(e){let t=[];if(e.curated.length>0){t.push(`**Curated Knowledge:**`);for(let n of e.curated)t.push(`- ${n}`)}if(e.graph.length>0){t.push(`**Graph Context:**`);for(let n of e.graph)t.push(`- ${n}`)}return t.length===0?``:`\n\n---\n### Enrichment\n${t.join(`
|
|
30
|
+
Failed to read skill file.`}return{contents:[{uri:`aikit://skill/SKILL.md`,text:t,mimeType:`text/markdown`}]}}),r?Fo.debug(`Workspace skill resources registered`,{skillDir:r}):Fo.debug(`skillDir not configured — skill resources registered with diagnostic messages`)}new Set(Object.entries(Fa).filter(([e,t])=>t.planner?.effect===`read`).map(([e])=>e)),new Set(Object.entries(Fa).filter(([e,t])=>{let n=t.planner?.effect;return n===`write`||n===`mixed`||n===`destructive`}).map(([e])=>e)),new Set(Object.entries(Fa).filter(([e,t])=>t.planner?.costClass===`tiny`).map(([e])=>e));const Uo=[`er_push`,`er_pull`,`er_sync_status`],Wo=[...Uo,`er_update_policy`,`er_evolve_review`],Go=new Set(Wo);function Ko(e){return e.toolProfiles}const qo=5e3,Jo=k(`structured-content-guard`);function Yo(){let e=(async(e,t)=>{let n;try{n=await t()}catch(e){n={content:[{type:`text`,text:`[ERROR:INTERNAL] ${e instanceof Error?e.message:String(e)}`}],isError:!0}}let r=(e.toolConfig??{}).outputSchema;if(r==null)return n;let i=null;if(n.structuredContent==null){let t=Xo(r);n.structuredContent=t,i=`synthesize`,n.structuredContent??(n.structuredContent={},i=`synthesize-null-fallback`,Jo.error(`synthesizeStructuredContent returned null/undefined — using empty fallback`,{tool:e.toolName}))}let a=Zo(r,n.structuredContent);if(a.action!=null&&(n.structuredContent=a.structuredContent,i=a.action),$o(n.structuredContent)||(n.isError=!0,n.structuredContent={},i=`fallback-error`),Qo(r,n.structuredContent)===!1){let e=Xo(r);n.structuredContent=e??{},Qo(r,n.structuredContent)===!1?(n.structuredContent=$o(n.structuredContent)?n.structuredContent:{},i=`final-validation-failed`):i??=`final-heal`}return n});return e.critical=!0,e}function Xo(e){try{return es(e)??{}}catch{return{}}}function Zo(e,t){if(Qo(e,t)!==!1)return{structuredContent:t,action:null};try{let n=Xo(e);if($o(n)&&$o(t)){let r={...n,...t};if(Qo(e,r)!==!1)return{structuredContent:r,action:`heal`}}return{structuredContent:n,action:`fallback-zero-value`}}catch{return{structuredContent:t,action:null}}}function Qo(e,t){let n=e.safeParse;if(typeof n==`function`)try{return n(t).success}catch{return}}function $o(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function es(e){if(!e)return{};if(e.anyOf){let t=e.anyOf.find(e=>e.type!==`null`);return t?es(t):null}let t=e._def?.typeName;if(t&&!e.type)switch(t){case`ZodObject`:{let t={},n=null;try{n=e.shape??(typeof e._def?.shape==`function`?e._def.shape():e._def?.shape)}catch{n=null}if(n)for(let[e,r]of Object.entries(n))try{t[e]=es(r)}catch{t[e]=null}return t}case`ZodArray`:return[];case`ZodString`:return``;case`ZodNumber`:return 0;case`ZodBoolean`:return!1;case`ZodNullable`:return null;case`ZodOptional`:return;case`ZodRecord`:return{};case`ZodEnum`:return e._def?.values?.[0]??``;default:return{}}switch(e.type){case`object`:{let t={},n=e.properties??e.shape;if(n)for(let[e,r]of Object.entries(n))t[e]=es(r);return t}case`array`:return[];case`string`:return``;case`number`:case`integer`:return 0;case`boolean`:return!1;case`nullable`:return null;case`optional`:return;case`record`:return{};case`enum`:return e.options?.[0]??Object.values(e.enum??e._def?.entries??{})[0]??``;default:return{}}}function ts(e){if(!e)return{};try{let t=es(e);return $o(t)?t:{}}catch{return{}}}const ns=Symbol(`toolPipelineState`);function rs(e){return e[ns]}function is(e,t){e[ns]=t}function as(e,t){return t?async(...n)=>{let r=await e(...n);if(!r||typeof r!=`object`)return r;let i=r;return!(`content`in i)||i.structuredContent!=null&&typeof i.structuredContent==`object`?r:(i.structuredContent=ts(t),i.structuredContent??={},r)}:e}function os(e,t,n=``,r,i){let a=rs(e);if(a){a.pipeline=t,a.prefix=n,r!==void 0&&(a.eventBus=r),i!==void 0&&(a.workspaceId=i);return}let o={originalRegisterTool:e.registerTool.bind(e),pipeline:t,prefix:n,eventBus:r,workspaceId:i};is(e,o),e.registerTool=(n,r,i)=>{let a=rs(e),s=a?.prefix?`${a.prefix}${n}`:n;if(!i)return a?.originalRegisterTool(s,r);let c=r?.outputSchema;if((a?.pipeline??t).getMiddlewareNames().length===0){let e=as(i,c);return a?.originalRegisterTool(s,r,e)}let l=U(n),u=a??o,d=as(u.pipeline.wrap(n,i,r,l,u.eventBus,u.workspaceId),c);return a?.originalRegisterTool(s,r,d)}}const ss={analyze:1,audit:1,check:2,codemod:2,config:0,delegate:3,digest:1,env:0,eval:2,evidence_map:2,file_summary:1,find:1,flow:3,forge_ground:2,git:1,graph:1,measure:1,onboard:3,parse_output:1,present:1,process:3,produce_knowledge:3,queue:3,reindex:3,rename:2,replay:1,restore:2,scope_map:1,search:1,session:2,status:0,symbol:1,test_run:2,trace:1,web_fetch:1,web_search:1};function cs(e,t){return e.filter(e=>(ss[e]??0)<=t)}const ls=new Set([`status`,`config`]),us={full:{description:`All tools enabled (default)`,includeCategories:[]},safe:{description:`Read-only tools — no file/state modifications`,includeCategories:[`search`,`analysis`,`compression`,`utilities`,`system`,`git`,`flow`],excludeTools:[`reindex`,`onboard`]},research:{description:`Search, analysis, knowledge, and web access`,includeCategories:[`search`,`analysis`,`knowledge`,`compression`,`web`,`system`,`flow`]},minimal:{description:`Essential tools only — search, status, basic operations`,includeCategories:[`search`,`system`],includeTools:[`file_summary`,`check`,`test_run`]},discovery:{description:`Full toolset plus discovery-oriented meta-tools for guided tool exploration`,includeCategories:[],includeTools:[`list_tools`],excludeTools:[`describe_tool`,`search_tools`]}};function ds(e,t){let n=us[e];if(n)return n;let r=t?.[e];if(r)return r;throw Error(`Unknown tool profile: ${e}`)}function fs(e,t,n){return t.includes(`*`)?!0:(n[e]?.category??[]).some(e=>t.includes(e))}function ps(e,t,n,r){if(t.includes(`*`)){for(let t of n)e.add(t);return}for(let i of n)fs(i,t,r)&&e.add(i)}function ms(e,t,n){if(t.includes(`*`)){e.clear();return}for(let r of[...e])fs(r,t,n)&&e.delete(r)}function hs(e,t,n){if(!e||e.length===0||e.includes(`*`))return new Set(t);let r=new Set;return ps(r,e,t,n),r}function gs(e,t){return e===void 0?t:t===void 0?e:Math.min(e,t)}function _s(e,t){for(let n of[...e])t[n]?.annotations?.readOnlyHint===!1&&e.delete(n)}function vs(e,t,n=0,r=[]){if(n>10)throw Error(`Tool profile inheritance exceeded max depth 10: ${[...r,e].join(` -> `)}`);if(r.includes(e))throw Error(`Tool profile inheritance cycle detected: ${[...r,e].join(` -> `)}`);let i=ds(e,t);return gs(i.extends?vs(i.extends,t,n+1,[...r,e]):void 0,i.maxTier)}function ys(e,t,n,r){let i=(e,a,o)=>{if(a>10)throw Error(`Tool profile inheritance exceeded max depth 10: ${[...o,e].join(` -> `)}`);if(o.includes(e))throw Error(`Tool profile inheritance cycle detected: ${[...o,e].join(` -> `)}`);let s=ds(e,r),c=[...o,e],l=s.extends?i(s.extends,a+1,c):hs(s.includeCategories,t,n);s.extends&&s.includeCategories?.length&&ps(l,s.includeCategories,t,n),s.excludeCategories?.length&&ms(l,s.excludeCategories,n);for(let e of s.includeTools??[])l.add(e);for(let e of s.excludeTools??[])l.delete(e);return l},a=i(e,0,[]),o=vs(e,r);if(o!==void 0){let e=cs([...a],o);a.clear();for(let t of e)a.add(t)}for(let e of ls)a.add(e);return e===`safe`&&_s(a,n),a}const bs=new Set([`search`,`analysis`,`knowledge`,`compression`,`forge`,`presentation`,`execution`,`manipulation`,`session`,`git`,`process`,`system`,`meta`,`utilities`,`web`,`queue`,`flow`]);function xs(e,t,n,r){let i=process.env.AIKIT_TOOLSET||e.toolProfile||`full`,a=ys(i,t,n,r);if(e.features&&e.features.length>0){let i=e.features.filter(e=>!bs.has(e));if(i.length>0)throw Error(`Unknown feature group(s): ${i.join(`, `)}. Valid categories: ${[...bs].join(`, `)}`);let o={description:`Synthetic profile from features config`,includeCategories:e.features},s=ys(`_features`,t,n,{...r,_features:o});for(let e of a)!s.has(e)&&!ls.has(e)&&a.delete(e)}if(e.readOnly)for(let e of[...a])n[e]?.annotations?.readOnlyHint===!1&&!ls.has(e)&&a.delete(e);for(let e of ls)a.add(e);return i===`safe`&&_s(a,n),a}const Ss=I.object({mode:I.enum([`wasm`,`regex`,`unknown`]),reason:I.string(),pathsChecked:I.array(I.object({path:I.string(),exists:I.boolean()})),os:I.string(),arch:I.string(),nodeVersion:I.string(),webTreeSitterImportable:I.boolean(),healAttempted:I.boolean(),healSuccess:I.boolean(),healError:I.string().nullable(),initError:I.string().nullable(),wasmDir:I.string().nullable(),grammarCount:I.number()}),Cs=I.object({kind:I.enum([`onboard`,`update_onboard`,`reindex`,`handoff`,`proceed`]),reason:I.string(),command:I.string().optional()}),ws=I.object({title:I.string(),insight:I.string(),confidence:I.number()}),Ts=I.object({lessons:I.array(ws),conventions:I.array(I.object({title:I.string(),preview:I.string()})),checkpoint:I.string().nullable()});I.object({totalRecords:I.number(),totalFiles:I.number(),lastIndexedAt:I.string().nullable(),lastSourceIndexedAt:I.string().nullable().optional(),onboarded:I.boolean(),onboardDir:I.string(),contentTypes:I.record(I.string(),I.number()),wasmAvailable:I.boolean(),wasmDiagnostics:Ss,graphStats:I.object({nodes:I.number(),edges:I.number()}).nullable(),curatedCount:I.number(),serverVersion:I.string(),scaffoldVersion:I.string().nullable(),workspaceScaffoldVersion:I.string().nullable(),upgradeAvailable:I.boolean(),sessionTokens:I.object({callCount:I.number(),totalInputChars:I.number(),totalOutputChars:I.number(),estInputTokens:I.number(),estTotalTokens:I.number(),startTime:I.string()}).optional(),storeBackend:I.string().optional(),storeDiagnostics:I.object({adapterType:I.string(),vectorSearchEnabled:I.boolean(),ftsEnabled:I.boolean(),degradedMode:I.boolean(),dbPath:I.string(),dbSizeBytes:I.number().nullable(),embeddingDim:I.number(),vectorDtype:I.string()}).nullable().optional(),contextPressure:I.number().min(0).max(100).describe(`0–100 score indicating AI Kit saturation`),nextAction:Cs,prelude:Ts.nullable().optional()}).catchall(I.any()),I.object({ok:I.boolean(),checks:I.array(I.object({name:I.string(),ok:I.boolean(),message:I.string().optional()}))});const Es=I.object({summary:I.object({totalFiles:I.number(),totalLines:I.number(),totalCodeLines:I.number(),totalFunctions:I.number(),avgComplexity:I.number(),maxComplexity:I.object({value:I.number(),file:I.string()})}),files:I.array(I.object({path:I.string(),lines:I.number(),code:I.number(),complexity:I.number(),functions:I.number()}))}),Ds=I.object({platform:I.string(),arch:I.string(),nodeVersion:I.string(),cwd:I.string(),cpus:I.number(),memoryFreeGb:I.number(),memoryTotalGb:I.number()});I.object({iso:I.string(),unix:I.number(),timezone:I.string(),formatted:I.string()});const Os=I.object({passed:I.boolean(),errorCount:I.number(),warningCount:I.number(),topErrors:I.array(I.string())}),ks=I.object({passed:I.boolean(),tsc:Os,biome:Os}),As=I.object({name:I.string(),path:I.string(),depth:I.number()}),js=I.object({name:I.string(),definedIn:I.object({path:I.string(),line:I.number(),kind:I.string(),signature:I.string().optional()}).nullable(),importedBy:I.array(I.object({path:I.string(),line:I.number(),importStatement:I.string()})),referencedIn:I.array(I.object({path:I.string(),line:I.number(),context:I.string(),scope:I.string().optional()})),graphContext:I.object({definingModule:I.string().optional(),importedByModules:I.array(I.string()),siblingSymbols:I.array(I.string())}).nullable(),trace:I.object({callers:I.array(As),callees:I.array(As)}).nullable(),confidence:I.number().nullable(),method:I.string().nullable(),rationale:I.string().nullable(),error:I.string().optional()}),Ms=I.object({symbols:I.array(js)}),Ns=I.object({sourcePath:I.string(),contentType:I.string(),score:I.number(),headingPath:I.string().optional(),startLine:I.number().optional(),endLine:I.number().optional(),origin:I.string().optional(),category:I.string().optional(),tags:I.array(I.string()).optional()}),Ps=I.object({results:I.array(Ns),totalResults:I.number(),searchMode:I.string(),query:I.string(),ref:I.string().optional().describe(`Reusable cache reference for later compact(ref, query)`)}),Fs=I.object({path:I.string(),line:I.number().optional(),matchType:I.string(),preview:I.string()}),Is=I.object({matches:I.array(Fs),totalMatches:I.number(),pattern:I.string(),truncated:I.boolean(),ref:I.string().optional().describe(`Reusable cache reference for later compact(ref, query)`)}),Ls=I.object({path:I.string(),relevance:I.number(),estimatedTokens:I.number(),focusLines:I.array(I.string()).optional()}),Rs=I.object({files:I.array(Ls),totalFiles:I.number(),totalEstimatedTokens:I.number(),task:I.string()}),zs=I.object({path:I.string(),impact:I.string(),reason:I.string()}),Bs=I.object({changedFiles:I.array(I.string()),affectedFiles:I.array(zs),totalAffected:I.number(),riskLevel:I.string()}),Vs=I.object({name:I.string(),passed:I.boolean(),message:I.string().optional(),severity:I.string().optional()}),Hs=I.object({passed:I.boolean(),score:I.number(),checks:I.array(Vs),summary:I.string()}),Us=I.object({id:I.string(),name:I.string(),type:I.string(),sourcePath:I.string().optional()}),Ws=I.object({fromId:I.string(),toId:I.string(),fromName:I.string(),toName:I.string(),type:I.string()}),Gs=I.object({id:I.string(),name:I.string(),type:I.string()}),Ks=I.object({id:I.string(),nodeCount:I.number(),types:I.record(I.string(),I.number()),samples:I.array(Gs)}),qs=I.object({nodes:I.array(Us),edges:I.array(Ws),communities:I.array(Ks).optional(),totalNodes:I.number(),totalEdges:I.number(),query:I.string()});I.object({symbols:I.array(I.object({name:I.string(),path:I.string(),line:I.number().optional(),kind:I.string()})),totalDead:I.number()});const Js=I.object({gitRoot:I.string(),branch:I.string(),commitCount:I.number(),hasUncommitted:I.boolean(),recentCommits:I.array(I.object({hash:I.string(),message:I.string(),author:I.string(),date:I.string()}))}),Ys=I.object({sourceId:I.string(),value:I.string()}),Xs=I.object({id:I.string(),originalChars:I.number(),keptChars:I.number(),segmentsKept:I.number(),segmentsTotal:I.number()}),Zs=I.object({text:I.string().describe(`The compressed digest text output`),ref:I.string().optional().describe(`Reusable cache reference`),fields:I.record(I.string(),I.array(Ys)),sourceStats:I.array(Xs),totalOriginalChars:I.number(),totalCompressedChars:I.number(),ratio:I.number()}),Qs=I.object({passed:I.boolean(),totalTests:I.number(),passedTests:I.number(),failedTests:I.number(),skippedTests:I.number(),duration:I.number().describe(`Duration in milliseconds`),failures:I.array(I.object({name:I.string(),message:I.string(),file:I.string().optional()}))}),$s=k(`utils:enrich`);async function G(e,t){let n={curated:[],graph:[]},r=t.limit??3,[i,a]=await Promise.allSettled([ec(e,t.query,r),tc(e,t.filePath)]);return i.status===`fulfilled`?n.curated=i.value:$s.debug(`Curated enrichment failed`,{error:i.reason}),a.status===`fulfilled`?n.graph=a.value:$s.debug(`Graph enrichment failed`,{error:a.reason}),n}async function ec(e,t,n){if(!e.store||!t)return[];try{let r=await e.store.ftsSearch(t,{origin:`curated`,limit:n});if(r.length>0)return r.map(e=>nc(e.record));if(e.embedder){let r=await e.embedder.embedQuery(t);return(await e.store.search(r,{origin:`curated`,limit:n,minScore:.3})).map(e=>nc(e.record))}return[]}catch(e){return $s.debug(`Curated enrichment failed`,{error:e}),[]}}async function tc(e,t){if(!e.graphStore||!t)return[];try{let n=await e.graphStore.findNodes({sourcePath:t,limit:1});if(n.length===0){let r=t.split(/[/\\]/).pop()?.replace(/\.\w+$/,``)||``;if(!r)return[];let i=await e.graphStore.findNodes({namePattern:r,type:`module`,limit:1});if(i.length===0)return[];n.push(i[0])}let r=n[0],i=await e.graphStore.getNeighbors(r.id,{direction:`both`,limit:10}),a=[];for(let e of i.edges){let t=e.fromId===r.id?e.toId:e.fromId,n=i.nodes.find(e=>e.id===t);if(!n)continue;let o=e.fromId===r.id?`->`:`<-`;a.push(`${o} ${e.type}: ${n.name} (${n.type})`)}return a}catch(e){return $s.debug(`Graph enrichment failed`,{error:e}),[]}}function K(e){let t=[];if(e.curated.length>0){t.push(`**Curated Knowledge:**`);for(let n of e.curated)t.push(`- ${n}`)}if(e.graph.length>0){t.push(`**Graph Context:**`);for(let n of e.graph)t.push(`- ${n}`)}return t.length===0?``:`\n\n---\n### Enrichment\n${t.join(`
|
|
31
31
|
`)}`}function nc(e){let t=rc(e.metadata,`title`)||e.sourcePath||`Untitled`;return`[${rc(e.metadata,`category`)}] ${t}: ${e.content.slice(0,200)}`}function rc(e,t){let n=e?.[t];return typeof n==`string`?n:``}function q(e,t,n){return{content:[{type:`text`,text:`[ERROR:${e}] ${t}`}],isError:!0,...n==null?{}:{structuredContent:n}}}function J(e,t){return async(n,r)=>{let i=Date.now(),a=await t(n,r),o=Date.now()-i;return a._meta={...a._meta??{},durationMs:o,toolName:e},a}}const ic=k(`tools`),ac=I.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`);function oc(e,t){return t?Vn(e,t):e}function sc(){let e=[];return ur.get()||e.push(`Tree-sitter unavailable — using regex fallback, symbol/pattern confidence reduced`),e.length===0?``:`\n\n> **⚠ Caveats:** ${e.join(`; `)}`}function cc(e){return(e??[]).map(e=>{if(typeof e==`string`)return e;if(e&&typeof e==`object`&&`path`in e)return typeof e.path==`string`?e.path:void 0}).filter(e=>!!e)}function lc(e){let t=[],n=e.filter(e=>/\.(ts|tsx|js|jsx)$/.test(e)&&/(service|store|model|schema|migration)/i.test(e)),r=e.filter(e=>/\.(ts|tsx|js|jsx)$/.test(e)&&!n.includes(e)),i=e.filter(e=>!/\.(ts|tsx|js|jsx)$/.test(e));return(n.length>0||r.length>0||i.length>0)&&(t.push(`
|
|
32
32
|
|
|
33
33
|
### Risk Assessment`),n.length>0&&t.push(`- 🔴 **High risk** (${n.length}): ${n.slice(0,5).map(e=>`\`${e}\``).join(`, `)}`),r.length>0&&t.push(`- 🟡 **Medium risk** (${r.length}): source files`),i.length>0&&t.push(`- 🟢 **Low risk** (${i.length}): non-source files`)),t.join(`
|
|
@@ -2919,7 +2919,7 @@ None.`:`### Stale Lessons\n${l.map(e=>`- **${e.title}** (\`${e.path}\`) — effe
|
|
|
2919
2919
|
navigator.sendBeacon('/callback', new Blob([body], { type: 'application/json' }));
|
|
2920
2920
|
});
|
|
2921
2921
|
})();
|
|
2922
|
-
<\/script>`}function Um(e){try{if(process.platform===`win32`){let t=Yn(`rundll32`,[`url.dll,FileProtocolHandler`,e],{detached:!0,stdio:`ignore`,windowsHide:!0});t.on(`error`,()=>{}),t.unref();return}if(process.platform===`darwin`){qn(`open`,[e]);return}qn(`xdg-open`,[e])}catch{}}async function Wm(e){try{let t=process.env.AGENT_BROWSER_ARGS??``,n=[`--start-maximized`,`--disable-infobars`,`--disable-popup-blocking`],r=t?t.split(`,`):[],i=!1;for(let e of n)r.includes(e)||(r.push(e),i=!0);i&&(process.env.AGENT_BROWSER_ARGS=r.join(`,`));let a=Qn();try{await a.launch(`ui`)}catch{await a.close().catch(()=>{}),await a.launch(`ui`)}a.resetIdleTimer();let o=`t0`;try{o=await a.open(e)}catch{await a.close().catch(()=>{}),await a.launch(`ui`),a.resetIdleTimer(),o=await a.open(e)}try{await a.exec(`set`,`viewport`,`1920`,`1080`),await a.exec(`eval`,`setTimeout(function(){window.focus()}, 300);`).catch(()=>{})}catch{}return{kind:`opened_managed`,url:e,pageId:o}}catch{return Um(e),{kind:`opened_system`,url:e}}}function Gm(e,t,n,r){let i=[e.title];return e.description&&i.push(e.description),i.push(``),n.kind===`opened_managed`?i.push(`Opened in browser — ${t}`):n.kind===`opened_system`?i.push(`Opened in system browser — ${t}`):(i.push(`Failed to open browser: ${n.reason}`),i.push(`Manual URL: ${t}`)),i.push(r),i.join(`
|
|
2922
|
+
<\/script>`}function Um(e){try{if(process.platform===`win32`){let t=Yn(`rundll32`,[`url.dll,FileProtocolHandler`,e],{detached:!0,stdio:`ignore`,windowsHide:!0});t.on(`error`,()=>{}),t.unref();return}if(process.platform===`darwin`){qn(`open`,[e]);return}qn(`xdg-open`,[e])}catch{}}async function Wm(e){try{if(process.platform===`win32`)return Um(e),{kind:`opened_system`,url:e};let t=process.env.AGENT_BROWSER_ARGS??``,n=[`--start-maximized`,`--disable-infobars`,`--disable-popup-blocking`],r=t?t.split(`,`):[],i=!1;for(let e of n)r.includes(e)||(r.push(e),i=!0);i&&(process.env.AGENT_BROWSER_ARGS=r.join(`,`));let a=Qn();try{await a.launch(`ui`)}catch{await a.close().catch(()=>{}),await a.launch(`ui`)}a.resetIdleTimer();let o=`t0`;try{o=await a.open(e)}catch{await a.close().catch(()=>{}),await a.launch(`ui`),a.resetIdleTimer(),o=await a.open(e)}try{await a.exec(`set`,`viewport`,`1920`,`1080`),await a.exec(`eval`,`setTimeout(function(){window.focus()}, 300);`).catch(()=>{})}catch{}return{kind:`opened_managed`,url:e,pageId:o}}catch{return Um(e),{kind:`opened_system`,url:e}}}function Gm(e,t,n,r){let i=[e.title];return e.description&&i.push(e.description),i.push(``),n.kind===`opened_managed`?i.push(`Opened in browser — ${t}`):n.kind===`opened_system`?i.push(`Opened in system browser — ${t}`):(i.push(`Failed to open browser: ${n.reason}`),i.push(`Manual URL: ${t}`)),i.push(r),i.join(`
|
|
2923
2923
|
`)}function Km(e){return e.some(e=>e.id!==`__dismiss`)}function qm(e){return e.replace(`</head>`,`${Zh}\n</head>`).replace(`</body>`,`${Qh}\n</body>`)}function Jm(e){if(!e.headersSent)try{e.writeHead(500,{"Content-Type":`text/plain`}),e.end(`Internal Server Error`)}catch{try{e.end()}catch{}}}function Ym(e,t){let n=e.headers.referer;return typeof n==`string`&&n.length>0?n:`http://127.0.0.1:${t.port}`}async function Xm(e,t){let n=Qn();n.isLaunched()||await n.launch(`headless`);let{base64:r}=await n.screenshotActiveTab({fullPage:t?.fullPage!==!1,format:t?.format,quality:t?.quality,annotate:t?.annotate});return Buffer.from(r,`base64`)}async function Zm(e,t){if(!t){e.writeHead(503,{"Content-Type":`text/plain; charset=utf-8`}),e.end(`Screenshot target is not ready.`);return}try{let n=await Xm(t);e.writeHead(200,{"Content-Type":`image/png`,"Cache-Control":`no-store`}),e.end(n)}catch(t){let n=t instanceof Error?t.message:String(t);console.warn(`[present] Screenshot capture failed:`,n),Jm(e)}}async function Qm(e,t){if(!t){Q(e,503,`CLIPBOARD_CAPTURE_TARGET_MISSING`,`Clipboard target is not ready.`);return}try{let n=await Xm(t);e.writeHead(200,{"Content-Type":`image/png`,"Cache-Control":`no-store`}),e.end(n)}catch(t){let n=t instanceof Error?t.message:String(t);console.warn(`[present] Clipboard capture failed:`,n),Q(e,500,`CLIPBOARD_CAPTURE_FAILED`,`Clipboard capture failed: ${n}`)}}async function $m(e,t){let n=[];e.on(`data`,e=>n.push(e)),e.on(`end`,async()=>{let e=Buffer.concat(n);if(e.length===0){Q(t,400,`EMPTY_BODY`,`No image data received.`);return}try{await eh(e),t.writeHead(200,{"Content-Type":`application/json`}),t.end(JSON.stringify({ok:!0}))}catch(e){let n=e instanceof Error?e.message:String(e);console.warn(`[present] System clipboard write failed:`,n),Q(t,500,`SYSTEM_CLIPBOARD_WRITE_FAILED`,`System clipboard write failed: ${n}`)}}),e.on(`error`,e=>{console.warn(`[present] System clipboard write request error:`,e.message),Q(t,500,`REQUEST_ERROR`,`Request stream error.`)})}async function eh(e){let t=P(Zn(),`aikit-clipboard-${Date.now()}-${Je(4).toString(`hex`)}.png`);try{if(Pe(t,e),process.platform===`win32`){let e=[`Add-Type -AssemblyName System.Drawing;`,`Add-Type -AssemblyName System.Windows.Forms;`,`$path = '${t.replace(/'/g,`''`)}';`,`$img = [System.Drawing.Image]::FromFile($path);`,`$img2 = [System.Drawing.Bitmap]::FromImage($img);`,`$img.Dispose();`,`[System.Windows.Forms.Clipboard]::SetImage($img2);`,`Start-Sleep -Milliseconds 500;`,`$img2.Dispose();`].join(` `);await new Promise((t,n)=>{Kn(`powershell.exe -NoProfile -STA -Command "${e.replace(/"/g,`\\"`)}"`,{timeout:15e3,windowsHide:!0},e=>{e?n(Error(`PowerShell clipboard write failed: ${e.message}`)):t()})})}else if(process.platform===`darwin`)await new Promise((e,n)=>{Kn(`osascript -e 'set the clipboard to (read (POSIX file "${t}") as picture)'`,{timeout:15e3},t=>{t?n(Error(`macOS clipboard write failed: ${t.message}`)):e()})});else try{await new Promise((e,n)=>{Kn(`wl-copy --type image/png < "${t}" 2>/dev/null`,{timeout:1e4},(t,r)=>{t?n(Error(`wl-copy failed: ${t.message}`)):e(r)})});return}catch{await new Promise((e,n)=>{Kn(`xclip -selection clipboard -t image/png -i "${t}"`,{timeout:15e3},t=>{t?n(Error(`Linux clipboard write failed (tried wl-copy then xclip): ${t.message}. Install wl-clipboard (Wayland) or xclip (X11) for clipboard image support.`)):e()})})}}finally{try{Ne(t)}catch{}}}function th(e,t){return e.replace(/'\/callback'/g,`'/present/${t}/callback'`).replace(/"\/callback"/g,`"/present/${t}/callback"`).replace(/'\/ready'/g,`'/present/${t}/ready'`).replace(/"\/ready"/g,`"/present/${t}/ready"`)}function nh(e,t){return e.replace(/src="\/viewer"/g,`src="/present/${t}/viewer"`)}async function rh(e,t,n){if(kh(`<html><body style="font-family:system-ui;padding:2rem;color:#888;text-align:center"><p>Content opened in browser window.</p></body></html>`),e.data!=null&&t.inputSchema){let n=En({data:e.data,schema:t.inputSchema});if(!n.valid){let e=n.errors.map(e=>` ${e.path}: ${e.message}${e.expected?` (expected: ${e.expected}, got: ${e.received})`:``}`).join(`
|
|
2924
2924
|
`);return{content:[{type:`text`,text:`[ERROR:VALIDATION] Template "${t.id}" data validation failed:\n${e}\n\nExpected schema: ${JSON.stringify(t.inputSchema,null,2)}`}],structuredContent:{kind:`error`,error:{code:`VIEWER_DATA_INVALID`,message:`Template "${t.id}" data validation failed:\n${e}\n\nExpected schema: ${JSON.stringify(t.inputSchema,null,2)}`}},isError:!0}}}let r=qm(xp(t.resolveHtml(),e.data??null,t.injectId,t.transformData)),i=Mm(),a=Je(16).toString(`hex`),o=i.createSession({surfaceId:`viewer`,transport:`viewer`,nonce:a});if(!o.ok)return{content:[{type:`text`,text:`${e.title}\n\nUnable to start local browser transport.`}],structuredContent:{kind:`error`,error:{code:`BROWSER_START_FAILED`,message:o.error.message}},isError:!0};let s=o.session.id,c=mm(`viewer`,e.actions??[],i,s,a),l=nh(Tr({title:e.title,subtitle:e.description,html:[`<div class="present-viewer-container">`,` <iframe class="present-viewer-iframe" src="/viewer" sandbox="allow-scripts allow-same-origin"></iframe>`,` ${$h(a)}`,`</div>`].join(`
|
|
2925
2925
|
`),css:[[`.present-viewer-container {`,` flex: 1;`,` min-height: calc(100vh - 12rem);`,` position: relative;`,` border-radius: 0.75rem;`,` overflow: hidden;`,` border: none;`,`}`,`.present-viewer-iframe {`,` border: none;`,` width: 100%;`,` height: 100%;`,` position: absolute;`,` inset: 0;`,` border-radius: inherit;`,`}`].join(`
|
|
@@ -3046,14 +3046,14 @@ Use \`status({})\` to check smart indexing queue status.`}]};let u=Lc(l).createT
|
|
|
3046
3046
|
`)}\n\nNo violations detected.`;let n=e.violations.map(e=>`- ${e.ruleId} | ${e.tool} | ${e.timestamp}\n ${e.rule}\n Suggestion: ${e.suggestion}`);return`${t.join(`
|
|
3047
3047
|
`)}\n\nViolations:\n${n.join(`
|
|
3048
3048
|
`)}`}function z_(e){let t=[e.id,`Label: ${e.label}`,`Created: ${e.createdAt}`];return e.notes&&t.push(`Notes: ${e.notes}`),t.push(``,`Data:`,JSON.stringify(e.data)),t.join(`
|
|
3049
|
-
`)}function B_(e){let t=e.trim();if(!t)return``;try{return JSON.parse(t)}catch{return e}}function V_(e){let t=e?.trim();if(!t)return{};let n;try{n=JSON.parse(t)}catch{throw Error(`data must be a valid JSON object string`)}if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`data must be a JSON object string`);return n}let H_={totalInputChars:0,totalOutputChars:0,callCount:0,startTime:new Date().toISOString()};function U_(){return{...H_}}const W_=new Map,G_=[];function K_(){return Array.from(W_.entries()).map(([e,t])=>({tool:e,...t}))}function q_(){return G_}k(`auto-gc`);function J_(){let e=[...q_()];if(e.length<10)return 0;e.sort((e,t)=>e-t);let t=Math.floor(e.length*.95);return e[Math.min(t,e.length-1)]}function Y_(){return{state:`warming`,p95:J_(),lastGcAt:null,gcCount:0,bufferSize:q_().length}}function X_(e){if(!e||!Le(e))return;let t=F(e);if(Fe(t)!==pe.onboard)return;let n=Ie(t);if(Fe(Ie(n))===fe.workspaces)return Sn(n)}function Z_(e){let t=[];if(e?.skillDir)t.push(e.skillDir);else if(e?.onboardDir){let n=X_(e.onboardDir);n&&t.push(n)}return t}function Q_(e){return Z_(e)[0]}const $_=k(`tools`),ev=14400*1e3,tv={includePrelude:I.boolean().default(!1).describe(`Include session prelude with top lessons, conventions, and last checkpoint`)};function nv(e,t,n,r=15e3){let i,a=new Promise(e=>{i=setTimeout(()=>{$_.warn(`Status sub-operation "${n}" timed out after ${r}ms`),e({value:t,timedOut:!0})},r)});return Promise.race([e.then(e=>(clearTimeout(i),{value:e,timedOut:!1}),e=>(clearTimeout(i),$_.warn(`Status sub-operation "${n}" failed: ${e instanceof Error?e.message:String(e)}`),{value:t,timedOut:!1})),a])}function rv(e){return e.onboarded?e.onboardFreshness===`stale`||e.onboardFreshness===`unknown`?{kind:`update_onboard`,reason:`Onboard context is not fresh. Run onboard({ path: ".", update: true }) before relying on package map or architecture context.`,command:`onboard({ path: ".", update: true })`}:e.indexStale?{kind:`reindex`,reason:`Index stale. Run reindex() to update.`}:e.contextPressure>70?{kind:`handoff`,reason:`Context pressure high. Consider session handoff.`}:{kind:`proceed`,reason:`Ready to work.`}:{kind:`onboard`,reason:`Index not initialized. Run onboard({ path: "." }) first.`}}function iv(){let e=ur.get(),t=lr.get();if(e)return`- **Tree-sitter (WASM)**: ✅ Available (${t.grammarCount} grammars, dir: ${t.wasmDir})`;let n=t.pathsChecked.length?t.pathsChecked.map(e=>` ${e.exists?`✓`:`✗`} ${e.path}`).join(`
|
|
3049
|
+
`)}function B_(e){let t=e.trim();if(!t)return``;try{return JSON.parse(t)}catch{return e}}function V_(e){let t=e?.trim();if(!t)return{};let n;try{n=JSON.parse(t)}catch{throw Error(`data must be a valid JSON object string`)}if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`data must be a JSON object string`);return n}let H_={totalInputChars:0,totalOutputChars:0,callCount:0,startTime:new Date().toISOString()};function U_(){return{...H_}}const W_=new Map,G_=[];function K_(){return Array.from(W_.entries()).map(([e,t])=>({tool:e,...t}))}function q_(){return G_}k(`auto-gc`);function J_(){let e=[...q_()];if(e.length<10)return 0;e.sort((e,t)=>e-t);let t=Math.floor(e.length*.95);return e[Math.min(t,e.length-1)]}function Y_(){return{state:`warming`,p95:J_(),lastGcAt:null,gcCount:0,bufferSize:q_().length}}function X_(e){if(!e||!Le(e))return;let t=F(e);if(Fe(t)!==pe.onboard)return;let n=Ie(t);if(Fe(Ie(n))===fe.workspaces)return Sn(n)}function Z_(e){let t=[];if(e?.skillDir)t.push(e.skillDir);else if(e?.onboardDir){let n=X_(e.onboardDir);n&&t.push(n)}return t}function Q_(e){return Z_(e)[0]}const $_=k(`tools`),ev=14400*1e3,tv={includePrelude:I.boolean().default(!1).describe(`Include session prelude with top lessons, conventions, and last checkpoint`)};function nv(e,t,n,r=15e3){let i,a=new Promise(e=>{i=setTimeout(()=>{$_.warn(`Status sub-operation "${n}" timed out after ${r}ms`),e({value:t,timedOut:!0})},r)});return Promise.race([e.then(e=>(clearTimeout(i),{value:e,timedOut:!1}),e=>(clearTimeout(i),$_.warn(`Status sub-operation "${n}" failed: ${e instanceof Error?e.message:String(e)}`),{value:t,timedOut:!1})),a])}function rv(e){return e.onboarded?e.onboardFreshness===`stale`||e.onboardFreshness===`unknown`?{kind:`update_onboard`,reason:`Onboard context is not fresh. Run onboard({ path: ".", update: true }) before relying on package map or architecture context.`,command:`onboard({ path: ".", update: true })`}:e.indexStale?{kind:`reindex`,reason:`Index stale. Run reindex() to update.`}:e.contextPressure>70?{kind:`handoff`,reason:`Context pressure high. Consider session handoff.`}:{kind:`proceed`,reason:`Ready to work.`}:{kind:`onboard`,reason:`Index not initialized. Run onboard({ path: "." }) first.`}}function iv(e){return e.lastSourceIndexedAt??e.lastIndexedAt??null}function av(){let e=ur.get(),t=lr.get();if(e)return`- **Tree-sitter (WASM)**: ✅ Available (${t.grammarCount} grammars, dir: ${t.wasmDir})`;let n=t.pathsChecked.length?t.pathsChecked.map(e=>` ${e.exists?`✓`:`✗`} ${e.path}`).join(`
|
|
3050
3050
|
`):` none`,r=t.healAttempted?` Auto-heal: ${t.healSuccess?`✓ succeeded`:`✗ failed (${t.healError??`unknown`})`}`:` Auto-heal: not attempted`;return[`- **Tree-sitter (WASM)**: ⚠ Unavailable (regex fallback)`,` Reason: ${t.reason||`unknown`}`,` Paths checked:`,n,r,` OS: ${t.os} ${t.arch} | Node: ${t.nodeVersion}`,` Fix: Reinstall package or run vendor:wasm script`].join(`
|
|
3051
|
-
`)}const
|
|
3052
|
-
`)}],structuredContent:o}}))}function fv(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h){let g=U(`status`);e.registerTool(`status`,{title:g.title,description:`Get the current status and statistics of the AI Kit index.`,inputSchema:tv,annotations:g.annotations},J(`status`,async({includePrelude:e=!1})=>{let g=[];try{let[_,v]=await Promise.all([nv(t.getStats(),{totalRecords:0,totalFiles:0,lastIndexedAt:null,contentTypeBreakdown:{}},`store.getStats`),nv(t.listSourcePaths(),[],`store.listSourcePaths`)]),y=_.value;_.timedOut&&g.push(`⚠ Index stats timed out — values may be incomplete`);let b=v.value;v.timedOut&&g.push(`⚠ File listing timed out`);let x=b.filter(e=>!e.startsWith(`.ai/curated/context/auto-`)&&!e.startsWith(`.ai/curated/workflow/auto-`)&&!e.includes(`node_modules/`)&&!e.startsWith(`.git/`)),S=b.length-x.length,w=null,T=0,E=[`## AI Kit Status`,``,`- **Total Records**: ${y.totalRecords}`,`- **Total Files**: ${y.totalFiles}`,`- **Last Indexed**: ${y.lastIndexedAt??`Never`}`,``,`### Content Types`,...Object.entries(y.contentTypeBreakdown).map(([e,t])=>`- ${e}: ${t}`),``,`### Indexed Files`,...x.slice(0,50).map(e=>`- ${e}`),x.length>50?`\n... and ${x.length-50} more files`:``,S>0?`\n_(${S} internal/auto-curated files hidden — use \`find\` to explore them)_`:``];if(n)try{let e=await nv(n.getStats(),{nodeCount:0,edgeCount:0,nodeTypes:{},edgeTypes:{}},`graphStore.getStats`);if(e.timedOut)g.push(`⚠ Graph stats timed out`),E.push(``,`### Knowledge Graph`,`- Graph stats timed out`);else{let t=e.value;w={nodes:t.nodeCount,edges:t.edgeCount},E.push(``,`### Knowledge Graph`,`- **Nodes**: ${t.nodeCount}`,`- **Edges**: ${t.edgeCount}`,...Object.entries(t.nodeTypes).map(([e,t])=>` - ${e}: ${t}`));try{let e=await nv(n.validate(),{valid:!0,danglingEdges:[],orphanNodes:[],stats:{nodeCount:0,edgeCount:0,nodeTypes:{},edgeTypes:{}}},`graphStore.validate`);if(!e.timedOut){let t=e.value;t.valid||E.push(`- **⚠ Integrity Issues**: ${t.danglingEdges.length} dangling edges`),t.orphanNodes.length>0&&E.push(`- **Orphan nodes**: ${t.orphanNodes.length}`)}}catch{}}}catch{E.push(``,`### Knowledge Graph`,`- Graph store unavailable`)}let te=a?.onboardDir??``,D=M(te),ie=i?.onboardComplete||D,O=ae(te,{lastIndexedAt:y.lastIndexedAt??null});if(E.push(``,`### Onboard Status`,ie?`- ✅ Complete${i?.onboardTimestamp?` (last: ${i.onboardTimestamp})`:``}`:'- ❌ Not run — call `onboard({ path: "." })` to analyze the codebase',`- **Onboard Directory**: \`${te}\``),O){let e=O.packageMap.totalPackages,t=O.freshness.status===`fresh`?`✅`:O.freshness.status===`stale`?`⚠`:`❔`;E.push(`- **Onboard context**: ${O.readInstruction}`,`- **Onboard freshness**: ${t} ${O.freshness.status} (${O.freshness.reason})`,e>0?`- **Package map**: ${e} packages/containers in \`${O.packageMap.sourcePath}\``:"- **Package map**: read `structure.md` and `dependencies.md` from the onboard directory")}if(r)try{let e=await nv(r.count(),0,`curated.count`);e.timedOut?(g.push(`⚠ Curated knowledge count timed out`),E.push(``,`### Curated Knowledge`,`- Listing timed out`)):(T=e.value,E.push(``,`### Curated Knowledge`,T>0?`- ${T} entries`:'- Empty — use `knowledge({ action: "remember", ... })` to persist decisions'))}catch{E.push(``,`### Curated Knowledge`,`- Unable to read curated entries`)}let oe=Un().filter(e=>e.status===`watching`);if(oe.length>0){E.push(``,`### File Watchers`,`- **Active**: ${oe.length}`);for(let e of oe){let t=e.pendingFiles?.length??0;if(E.push(` - \`${e.path}\`: ${e.eventCount} events, ${t} pending files`),t>0&&t<=10)for(let t of e.pendingFiles)E.push(` - \`${t}\``);else t>10&&E.push(` - ${t} pending files (use \`watch({ action: 'list' })\` for details)`)}}let se=cv(y.totalRecords,w?.nodes??0,w?.edges??0,T),ce=y.lastIndexedAt?new Date(y.lastIndexedAt).getTime():0,le=ce>0?Date.now()-ce:1/0,ue=ie&&le>1440*60*1e3,de=rv({onboarded:ie,onboardFreshness:O?.freshness.status??null,indexStale:ue,contextPressure:se});E.push(``),E.push(`## 📊 Context Pressure: ${se}/100`),se>=80?E.push(`⚠️ High pressure — consider pruning stale entries or compacting context.`):se>=50?E.push(`ℹ️ Moderate pressure — AI Kit memory is well-populated.`):E.push(`✅ Low pressure — plenty of headroom for more content.`);let fe=0;if(y.lastIndexedAt){fe=new Date(y.lastIndexedAt).getTime();let e=(Date.now()-fe)/(1e3*60*60);E.push(``,`### Index Freshness`,e>24?o===`smart`?`- ⚠ Last indexed ${Math.floor(e)}h ago — smart indexing will refresh automatically`:`- ⚠ Last indexed ${Math.floor(e)}h ago — may be stale. Run \`reindex({})\``:`- ✅ Last indexed ${e<1?`less than 1h`:`${Math.floor(e)}h`} ago`)}E.push(``,`### Next Action`,`- **${de.kind}**: ${de.reason}`);let pe=null,me=t;if(typeof me.getDiagnostics==`function`)try{let e=me.getDiagnostics();pe={adapterType:e.adapterType,vectorSearchEnabled:e.vectorSearchEnabled,ftsEnabled:e.ftsEnabled,degradedMode:e.degradedMode,dbPath:e.dbPath,dbSizeBytes:e.dbSizeBytes,embeddingDim:e.embeddingDim,vectorDtype:e.vectorDtype},E.push(``,`### Storage`,`- **Backend**: ${a?.store?.backend??`unknown`}`,`- **Adapter**: ${pe.adapterType}`,`- **Vector search**: ${pe.vectorSearchEnabled?`✅ enabled`:`⚠ disabled (FTS-only fallback)`}`,pe.dbPath?`- **DB**: ${pe.dbPath}`:``,pe.dbSizeBytes==null?``:`- **DB size**: ${(pe.dbSizeBytes/1024/1024).toFixed(2)} MB`,`- **Embedding dim**: ${pe.embeddingDim}`,`- **Vector dtype**: ${pe.vectorDtype}`)}catch{}if(o===`smart`)if(E.push(``,`### Smart Indexing`),s){let e=s();e?E.push(`- **Mode**: Smart (trickle)`,`- **Status**: ${e.running?`✅ Running`:`⏸ Stopped`}`,`- **Queue**: ${e.queueSize} files pending`,`- **Changed files**: ${e.changedFilesSize} detected`,`- **Interval**: ${Math.round(e.intervalMs/1e3)}s per batch of ${e.batchSize}`):E.push(`- **Mode**: Smart (trickle)`,`- **Status**: scheduler state unavailable (init may have failed)`)}else E.push(`- **Mode**: Smart (trickle) — scheduler state unavailable`);if(h)try{let e=h.getReport(),t=h.checkThresholds(),n=Object.entries(e.counters),r=Object.entries(e.gauges);if(n.length>0||r.length>0||t.length>0){if(E.push(``,`### 📊 Metrics`),n.length>0){E.push(`**Counters:**`);for(let[e,t]of n)E.push(`- \`${e}\`: ${t}`)}if(r.length>0){E.push(`**Gauges:**`);for(let[e,t]of r)E.push(`- \`${e}\`: ${t}`)}if(t.length>0){E.push(`**⚠ Threshold violations:**`);for(let e of t)E.push(`- ${e}`)}else(n.length>0||r.length>0)&&E.push(`- ✅ All thresholds within limits`)}}catch{E.push(``,`### 📊 Metrics`,`- Metrics unavailable`)}{let e=[];if(u)try{let t=u.getStats();e.push(`- **Decision Hooks**: ${t.count} registered${t.hooks.length>0?` (IDs: ${t.hooks.map(e=>e.id).join(`, `)})`:``}`)}catch{e.push(`- **Decision Hooks**: unavailable`)}else e.push(`- **Decision Hooks**: not configured`);if(d)try{let t=d.getStats(),n=Object.entries(t.byTool).map(([e,t])=>`${e}=${t}`).join(`, `);e.push(`- **Observations**: ${t.totalObservations} total, byTool: ${n||`none`}`)}catch{e.push(`- **Observations**: unavailable`)}else e.push(`- **Observations**: not configured`);if(f)try{let t=f.getStats(),n=Object.keys(t.byName);e.push(`- **Extractors**: ${t.count} registered${n.length>0?` (IDs: ${n.join(`, `)})`:``}`)}catch{e.push(`- **Extractors**: unavailable`)}else e.push(`- **Extractors**: not configured`);if(m)try{let t=m.getStats(),n=t.skillExists?t.isStale?`⚠ Stale`:`✅ Fresh`:`❌ No skill`;e.push(`- **Skill Compiler**: ${n}, version: ${t.skillVersion}, last compiled: ${t.lastCompiledAt?new Date(t.lastCompiledAt).toLocaleString():`Never`}`)}catch{e.push(`- **Skill Compiler**: unavailable`)}else e.push(`- **Skill Compiler**: not configured`);if(p)try{let t=p.getStats();e.push(`- **Promotion Engine**: ${t.held} candidates held, ${t.promoted} promoted, ${t.observedFacts} distinct facts tracked`)}catch{e.push(`- **Promotion Engine**: unavailable`)}else e.push(`- **Promotion Engine**: not configured`);E.push(``,`### 🧩 Feature Coverage`,...e)}let _e=0;{try{let e=a?.stateDir?P(a.stateDir,`stash`):null;if(e&&M(e)){let t=Me(e).mtimeMs;t>fe&&(fe=t)}}catch{}let e=[];if(r)try{let t=T>0?await r.list({limit:5,orderBy:`updated`,order:`desc`}):[];for(let e of t){let t=new Date(e.updated||e.created).getTime();t>fe&&(fe=t)}e.push(...t)}catch{}if(_e=fe>0?Date.now()-fe:0,_e>=ev){let t=Math.floor(_e/36e5);if(E.push(``,`### 🌅 Session Briefing`,`_${t}+ hours since last activity — here's what to pick up:_`,``),e.length>0){E.push(`**Recent decisions/notes:**`);for(let t of e)E.push(`- **${t.title}** (${t.category??`note`}) — ${(t.contentPreview??``).slice(0,80)}…`)}E.push(``,`**Suggested next steps:**`,'- `search({ query: "SESSION CHECKPOINT", origin: "curated" })` — find your last checkpoint',"- `restore({})` — resume from a saved checkpoint",'- `knowledge({ action: "list" })` — browse all stored knowledge')}}E.push(``,`### Runtime`,iv());let ve=ge.instance().getAll(),ye=ve.filter(e=>e.status!==`healthy`);if(ye.length>0){E.push(``,`### ⚠️ Subsystem Health`);for(let e of ye){let t=Math.round((Date.now()-e.since)/1e3);E.push(`- **${e.name}**: ${e.status} (${t}s ago${e.reason?` — ${e.reason}`:``})`)}}else ve.length>0&&E.push(``,`### ✅ Subsystem Health`,`- All ${ve.length} subsystems healthy`);let be=he.getAll();if(be.size>0){E.push(``,`### 🔌 Circuit Breakers`);for(let[e,t]of be){let n=t.getState(),r=`- **${e}**: ${n===`closed`?`🟢`:n===`open`?`🔴`:`🟡`} ${n}`;if(n===`open`){let e=t.remainingCooldownMs();r+=` (recovery in ${Math.ceil(e/1e3)}s)`}E.push(r)}}let k=lv(),xe=uv(),Se=C(),Ce=k!=null&&k!==Se,we=xe!=null&&xe!==Se;if(Ce||we){let e=ne(),t=[];Ce&&t.push(`user scaffold v${k}`),we&&t.push(`workspace scaffold v${xe}`);let n=t.join(`, `);e.state===`success`?E.push(``,`### ✅ Upgrade Applied`,`- Server v${Se} — ${n} auto-upgraded successfully.`,`- _Restart the MCP server to use the updated version._`):e.state===`pending`?E.push(``,`### ⏳ Upgrade In Progress`,`- Server v${Se} ≠ ${n}`,`- Auto-upgrade is running in the background…`):e.state===`failed`?(re(),E.push(``,`### ⬆ Upgrade Available (auto-upgrade failed, retrying)`,`- Server v${Se} ≠ ${n}`,`- Error: ${e.error??`unknown`}`)):(re(),E.push(``,`### ⬆ Upgrade Available`,`- Server v${Se} ≠ ${n}`,`- Auto-upgrade triggered — check again shortly.`))}g.length>0&&E.push(``,`### ⚠ Warnings`,...g.map(e=>`- ${e}`));let Te=K_();if(Te.length>0){let e=Te.sort((e,t)=>t.callCount-e.callCount);E.push(``,`### Tool Usage This Session`,``),E.push(`| Tool | Calls | Tokens In | Tokens Out | Errors | Avg Latency |`),E.push(`|------|-------|-----------|------------|--------|-------------|`);for(let t of e.slice(0,15)){let e=Math.round(t.totalInputChars/4),n=Math.round(t.totalOutputChars/4),r=Math.round(t.totalDurationMs/t.callCount);E.push(`| ${t.tool} | ${t.callCount} | ${e.toLocaleString()} | ${n.toLocaleString()} | ${t.errorCount} | ${r}ms |`)}}let A=U_();A.callCount>0&&(E.push(``),E.push(`### Session Token Usage`),E.push(`- Tool calls: ${A.callCount}`),E.push(`- Input chars: ${A.totalInputChars.toLocaleString()}`),E.push(`- Output chars: ${A.totalOutputChars.toLocaleString()}`),E.push(`- Est. input tokens: ${Math.round(A.totalInputChars/4).toLocaleString()}`),E.push(`- Est. total tokens: ${Math.round((A.totalInputChars+A.totalOutputChars)/4).toLocaleString()}`));let Ee=Y_();if(Ee.bufferSize>=10){let e=Ee.state===`healthy`?`🟢`:Ee.state===`degraded`?`🔴`:`🟡`;E.push(``,`### Auto-GC: ${e} ${Ee.state}`),E.push(`- p95 latency: ${Ee.p95}ms | buffer: ${Ee.bufferSize} samples`),Ee.gcCount>0&&E.push(`- GC cycles triggered: ${Ee.gcCount}`)}if(l){let e=l.getStats();if(e.totalSubscribers>0){E.push(``,`### 🔌 Hooks (EventBus Subscribers)`),E.push(`- Total subscribers: ${e.totalSubscribers}`);for(let[t,n]of Object.entries(e.byEvent))E.push(` - ${t}: ${n} subscriber(s)`);for(let t of e.subscriptions)E.push(` - ${t.name} (${t.eventType}, ${t.policy})`);if(e.autoDisabled.length>0){E.push(``),E.push(` **Auto-disabled subscribers:**`);for(let t of e.autoDisabled)E.push(` - ${t.name} (${t.id}): ${t.reason}`)}}}if(u&&u.size>0){let e=u.getStats();E.push(``,`### 🪝 Decision Hooks`),E.push(`- Total hooks: ${e.count}`);for(let t of e.hooks){let e=t.decisionTypes.join(`, `);E.push(` - ${t.id} (order=${t.order}, policy=${t.failurePolicy}, types=[${e}])`)}}if(d){let e=d.getStats();E.push(``,`### 👁 Observations`),E.push(`- Total observations: ${e.totalObservations}`),E.push(` - Success: ${e.byError.success}, Error: ${e.byError.error}`),E.push(` - Artifacts stored: ${e.artifactCount}`),E.push(` - Truncations: ${e.truncationCount}`),E.push(` - Store entries: ${e.storeSize}`);let t=Object.entries(e.byOrigin);t.length>0&&E.push(` - By origin: ${t.map(([e,t])=>`${e}=${t}`).join(`, `)}`)}if(f){let e=f.getStats();E.push(``,`### 🧩 Extractors`),E.push(`- Total extractors: ${e.count}`);for(let[t,n]of Object.entries(e.byName))E.push(` - ${t} (${n.tools} tool(s), maxFacts: ${n.maxFactsPerEvent??`default`})`)}if(p){let e=p.getStats();if(E.push(``,`### 🏆 Promotion Engine`),E.push(`- Total evaluated: ${e.totalEvaluated}`),E.push(`- Promoted: ${e.promoted}`),E.push(`- Held: ${e.held}`),E.push(`- Rejected: ${e.rejected}`),E.push(`- Superseded: ${e.superseded}`),E.push(`- Decayed: ${e.decayed}`),E.push(`- Distinct facts tracked: ${e.observedFacts}`),e.recentDecisions.length>0){E.push(` Recent decisions:`);for(let t of e.recentDecisions.slice(-5))E.push(` - ${t.decision.status}: "${t.factTitle}" (${t.decision.reason.slice(0,80)})`)}}if(m){let e=m.getStats();if(E.push(``,`### 📋 Workspace Skill`),E.push(`- **Skill exists**: ${e.skillExists?`✅`:`❌`}`),E.push(`- **Stale**: ${e.isStale?`⚠ Yes — regenerating on next trigger`:`✅ Fresh`}`),E.push(`- **Last compiled**: ${e.lastCompiledAt?new Date(e.lastCompiledAt).toLocaleString():`Never`}`),E.push(`- **Version**: ${e.skillVersion}`),E.push(`- **Total compiles**: ${e.totalCompiles}`),e.failedCompiles>0&&E.push(`- **Failed compiles**: ${e.failedCompiles}`),e.skillSize>0&&E.push(`- **Skill size**: ${e.skillSize} bytes`),e.isCompiling&&E.push(`- ⏳ **Currently compiling**`),e.pendingRegeneration&&E.push(`- ⏳ **Regeneration pending**`),e.skillQuality&&E.push(`- **Quality**: ${e.skillQuality}`),e.skillQualityErrors&&e.skillQualityErrors.length>0){E.push(`- **Quality errors (${e.skillQualityErrors.length})**:`);for(let t of e.skillQualityErrors.slice(0,3))E.push(` - ${t}`)}if(e.skillQualityWarnings&&e.skillQualityWarnings.length>0){E.push(`- **Quality warnings (${e.skillQualityWarnings.length})**:`);for(let t of e.skillQualityWarnings.slice(0,3))E.push(` - ${t}`)}let t=m?.getWarnings()??[];if(t.length>0){E.push(`- **Compiler warnings (${t.length})**:`);for(let e of t.slice(0,5))E.push(` - ${e}`);t.length>5&&E.push(` - ... and ${t.length-5} more`)}E.push(``," Read `aikit://skill/SKILL.md` to load full workspace context.")}{let e=Pt();(e.cacheSize>0||e.refReuseCount>0)&&(E.push(``,`### 🔄 Ref Reuse`),E.push(`- **Refs stored**: ${e.refStoreCount}`),E.push(`- **Refs reused**: ${e.refReuseCount}`),e.refStaleCount>0&&E.push(`- **⚠ Stale refs detected**: ${e.refStaleCount}`),E.push(`- **Cache entries**: ${e.cacheSize}`))}let j=E.join(`
|
|
3053
|
-
`),De=_e>=ev,Oe=Z_(a),N=e||De?await ee(r,c,void 0,Oe.length>0?Oe:void 0,O):void 0,ke=oe.length>0?oe.map(e=>({id:e.id,path:e.path,eventCount:e.eventCount,pendingFiles:e.pendingFiles??[]})):void 0,Ae={totalRecords:y.totalRecords,totalFiles:y.totalFiles,lastIndexedAt:y.lastIndexedAt??null,onboarded:ie,onboardDir:te,onboard_context:O,contentTypes:y.contentTypeBreakdown,wasmAvailable:!!ur.get(),wasmDiagnostics:lr.get(),graphStats:w,curatedCount:T,serverVersion:Se,scaffoldVersion:k??null,workspaceScaffoldVersion:xe??null,upgradeAvailable:Ce||we,storeBackend:a?.store?.backend,storeDiagnostics:pe??null,contextPressure:se,nextAction:de,workspace_skill:(()=>{if(!m)return null;try{let e=m.getStats(),t=m?.getWarnings()??[],n=e.skillExists?e.skillQuality??`fallback`:`fallback`;return{exists:e.skillExists,version:e.skillVersion,fresh:!e.isStale,quality:n,warnings:t,uri:`aikit://skill/SKILL.md`,path:e.skillPath,read_instruction:`Read aikit://skill/SKILL.md before working in this repo for full workspace context.`,last_updated:e.lastCompiledAt?new Date(e.lastCompiledAt).toISOString():null,size:e.skillSize}}catch{return null}})(),skill_warnings:m?.getWarnings(m?.resolveActiveFlowSlug()??void 0)??[],watchers:ke,sessionTokens:{callCount:A.callCount,totalInputChars:A.totalInputChars,totalOutputChars:A.totalOutputChars,estInputTokens:Math.round(A.totalInputChars/4),estTotalTokens:Math.round((A.totalInputChars+A.totalOutputChars)/4),startTime:A.startTime},...N===void 0?{}:{prelude:N}};return{content:[{type:`text`,text:j+(o===`smart`?"\n\n---\n_Next: Use `search` to query indexed content or `graph({action:'find_nodes', name_pattern:'<top-level-module>'})` → then `graph({action:'neighbors', node_id})` for relationships. Smart indexing handles updates automatically._":"\n\n---\n_Next: Use `search` to query indexed content, `graph({action:'find_nodes', name_pattern:'<top-level-module>'})` → then `graph({action:'neighbors', node_id})` for relationships, or `reindex` to refresh the index._")}],structuredContent:Ae}}catch(e){return $_.error(`Status failed`,j(e)),q(`INTERNAL`,`Status check failed: ${e instanceof Error?e.message:String(e)}`)}}))}const
|
|
3054
|
-
`)};if(i.length===1)try{return{content:[{type:`text`,text:`${await a(i[0])}\n---\n_Next: Use \`web_fetch\` to read any of these pages in full._`}]}}catch(e){return
|
|
3051
|
+
`)}const ov=5*6e4;let sv=null,cv=null;function lv(e,t,n,r){let i=Math.min(e/2e4,1),a=Math.min((t+n)/5e4,1),o=Math.min(r/200,1);return Math.round(i*40+a*35+o*25)}function uv(){let e=Date.now();if(sv&&e-sv.ts<ov)return sv.value;try{let t=F(Xn(),`.copilot`,`.aikit-scaffold.json`);if(!M(t))return sv={value:null,ts:e},null;let n=JSON.parse(N(t,`utf-8`)).version??null;return sv={value:n,ts:e},n}catch{return sv={value:null,ts:e},null}}function dv(){let e=Date.now();if(cv&&e-cv.ts<ov)return cv.value;try{let t=F(process.cwd(),`.github`,`.aikit-scaffold.json`);if(!M(t))return cv={value:null,ts:e},null;let n=JSON.parse(N(t,`utf-8`)).version??null;return cv={value:n,ts:e},n}catch{return cv={value:null,ts:e},null}}function fv(e){let t=U(`status`);e.registerTool(`status`,{title:t.title,description:`Get the current status and statistics of the AI Kit index.`,inputSchema:tv,annotations:t.annotations},J(`status`,async()=>{let e=C(),t=uv(),n=dv(),r=t!=null&&t!==e,i=n!=null&&n!==e,a=[`## AI Kit Status`,``,`⏳ **AI Kit is initializing** — index stats will be available shortly.`,``,`### Runtime`,`- **Tree-sitter (WASM)**: ${ur.get()?`✅ Available (AST analysis)`:`⚠ Unavailable (regex fallback)`}`,``,`### Version`,`- **Server**: ${e}`,`- **Scaffold (user)**: ${t??`not installed`}`,`- **Scaffold (workspace)**: ${n??`not installed`}`];if(r||i){let o=ne(),s=[];r&&s.push(`user scaffold v${t}`),i&&s.push(`workspace scaffold v${n}`);let c=s.join(`, `);o.state===`success`?a.push(``,`### ✅ Upgrade Applied`,`- Server v${e} — ${c} auto-upgraded successfully.`,`- _Restart the MCP server to use the updated version._`):o.state===`pending`?a.push(``,`### ⏳ Upgrade In Progress`,`- Server v${e} ≠ ${c}`,`- Auto-upgrade is running in the background…`):o.state===`failed`?(re(),a.push(``,`### ⬆ Upgrade Available (auto-upgrade failed, retrying)`,`- Server v${e} ≠ ${c}`,`- Error: ${o.error??`unknown`}`)):(re(),a.push(``,`### ⬆ Upgrade Available`,`- Server v${e} ≠ ${c}`,`- Auto-upgrade triggered — check again shortly.`))}let o={totalRecords:0,totalFiles:0,lastIndexedAt:null,onboarded:!1,onboardDir:``,contentTypes:{},wasmAvailable:!!ur.get(),wasmDiagnostics:lr.get(),graphStats:null,curatedCount:0,serverVersion:e,scaffoldVersion:t??null,workspaceScaffoldVersion:n??null,upgradeAvailable:r||i,contextPressure:0,nextAction:rv({onboarded:!1,indexStale:!1,contextPressure:0})};return{content:[{type:`text`,text:a.join(`
|
|
3052
|
+
`)}],structuredContent:o}}))}function pv(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h){let g=U(`status`);e.registerTool(`status`,{title:g.title,description:`Get the current status and statistics of the AI Kit index.`,inputSchema:tv,annotations:g.annotations},J(`status`,async({includePrelude:e=!1})=>{let g=[];try{let[_,v]=await Promise.all([nv(t.getStats(),{totalRecords:0,totalFiles:0,lastIndexedAt:null,lastSourceIndexedAt:null,contentTypeBreakdown:{},storeBackend:`unknown`,embeddingModel:`unknown`},`store.getStats`),nv(t.listSourcePaths(),[],`store.listSourcePaths`)]),y=_.value;_.timedOut&&g.push(`⚠ Index stats timed out — values may be incomplete`);let b=v.value;v.timedOut&&g.push(`⚠ File listing timed out`);let x=b.filter(e=>!e.startsWith(`.ai/curated/context/auto-`)&&!e.startsWith(`.ai/curated/workflow/auto-`)&&!e.includes(`node_modules/`)&&!e.startsWith(`.git/`)),S=b.length-x.length,w=null,T=0,E=[`## AI Kit Status`,``,`- **Total Records**: ${y.totalRecords}`,`- **Total Files**: ${y.totalFiles}`,`- **Last Indexed**: ${y.lastIndexedAt??`Never`}`,``,`### Content Types`,...Object.entries(y.contentTypeBreakdown).map(([e,t])=>`- ${e}: ${t}`),``,`### Indexed Files`,...x.slice(0,50).map(e=>`- ${e}`),x.length>50?`\n... and ${x.length-50} more files`:``,S>0?`\n_(${S} internal/auto-curated files hidden — use \`find\` to explore them)_`:``];if(n)try{let e=await nv(n.getStats(),{nodeCount:0,edgeCount:0,nodeTypes:{},edgeTypes:{}},`graphStore.getStats`);if(e.timedOut)g.push(`⚠ Graph stats timed out`),E.push(``,`### Knowledge Graph`,`- Graph stats timed out`);else{let t=e.value;w={nodes:t.nodeCount,edges:t.edgeCount},E.push(``,`### Knowledge Graph`,`- **Nodes**: ${t.nodeCount}`,`- **Edges**: ${t.edgeCount}`,...Object.entries(t.nodeTypes).map(([e,t])=>` - ${e}: ${t}`));try{let e=await nv(n.validate(),{valid:!0,danglingEdges:[],orphanNodes:[],stats:{nodeCount:0,edgeCount:0,nodeTypes:{},edgeTypes:{}}},`graphStore.validate`);if(!e.timedOut){let t=e.value;t.valid||E.push(`- **⚠ Integrity Issues**: ${t.danglingEdges.length} dangling edges`),t.orphanNodes.length>0&&E.push(`- **Orphan nodes**: ${t.orphanNodes.length}`)}}catch{}}}catch{E.push(``,`### Knowledge Graph`,`- Graph store unavailable`)}let te=a?.onboardDir??``,D=M(te),ie=i?.onboardComplete||D,O=ae(te,{lastIndexedAt:iv(y)});if(E.push(``,`### Onboard Status`,ie?`- ✅ Complete${i?.onboardTimestamp?` (last: ${i.onboardTimestamp})`:``}`:'- ❌ Not run — call `onboard({ path: "." })` to analyze the codebase',`- **Onboard Directory**: \`${te}\``),O){let e=O.packageMap.totalPackages,t=O.freshness.status===`fresh`?`✅`:O.freshness.status===`stale`?`⚠`:`❔`;E.push(`- **Onboard context**: ${O.readInstruction}`,`- **Onboard freshness**: ${t} ${O.freshness.status} (${O.freshness.reason})`,e>0?`- **Package map**: ${e} packages/containers in \`${O.packageMap.sourcePath}\``:"- **Package map**: read `structure.md` and `dependencies.md` from the onboard directory")}if(r)try{let e=await nv(r.count(),0,`curated.count`);e.timedOut?(g.push(`⚠ Curated knowledge count timed out`),E.push(``,`### Curated Knowledge`,`- Listing timed out`)):(T=e.value,E.push(``,`### Curated Knowledge`,T>0?`- ${T} entries`:'- Empty — use `knowledge({ action: "remember", ... })` to persist decisions'))}catch{E.push(``,`### Curated Knowledge`,`- Unable to read curated entries`)}let oe=Un().filter(e=>e.status===`watching`);if(oe.length>0){E.push(``,`### File Watchers`,`- **Active**: ${oe.length}`);for(let e of oe){let t=e.pendingFiles?.length??0;if(E.push(` - \`${e.path}\`: ${e.eventCount} events, ${t} pending files`),t>0&&t<=10)for(let t of e.pendingFiles)E.push(` - \`${t}\``);else t>10&&E.push(` - ${t} pending files (use \`watch({ action: 'list' })\` for details)`)}}let se=lv(y.totalRecords,w?.nodes??0,w?.edges??0,T),ce=y.lastIndexedAt?new Date(y.lastIndexedAt).getTime():0,le=ce>0?Date.now()-ce:1/0,ue=ie&&le>1440*60*1e3,de=rv({onboarded:ie,onboardFreshness:O?.freshness.status??null,indexStale:ue,contextPressure:se});E.push(``),E.push(`## 📊 Context Pressure: ${se}/100`),se>=80?E.push(`⚠️ High pressure — consider pruning stale entries or compacting context.`):se>=50?E.push(`ℹ️ Moderate pressure — AI Kit memory is well-populated.`):E.push(`✅ Low pressure — plenty of headroom for more content.`);let fe=0;if(y.lastIndexedAt){fe=new Date(y.lastIndexedAt).getTime();let e=(Date.now()-fe)/(1e3*60*60);E.push(``,`### Index Freshness`,e>24?o===`smart`?`- ⚠ Last indexed ${Math.floor(e)}h ago — smart indexing will refresh automatically`:`- ⚠ Last indexed ${Math.floor(e)}h ago — may be stale. Run \`reindex({})\``:`- ✅ Last indexed ${e<1?`less than 1h`:`${Math.floor(e)}h`} ago`)}E.push(``,`### Next Action`,`- **${de.kind}**: ${de.reason}`);let pe=null,me=t;if(typeof me.getDiagnostics==`function`)try{let e=me.getDiagnostics();pe={adapterType:e.adapterType,vectorSearchEnabled:e.vectorSearchEnabled,ftsEnabled:e.ftsEnabled,degradedMode:e.degradedMode,dbPath:e.dbPath,dbSizeBytes:e.dbSizeBytes,embeddingDim:e.embeddingDim,vectorDtype:e.vectorDtype},E.push(``,`### Storage`,`- **Backend**: ${a?.store?.backend??`unknown`}`,`- **Adapter**: ${pe.adapterType}`,`- **Vector search**: ${pe.vectorSearchEnabled?`✅ enabled`:`⚠ disabled (FTS-only fallback)`}`,pe.dbPath?`- **DB**: ${pe.dbPath}`:``,pe.dbSizeBytes==null?``:`- **DB size**: ${(pe.dbSizeBytes/1024/1024).toFixed(2)} MB`,`- **Embedding dim**: ${pe.embeddingDim}`,`- **Vector dtype**: ${pe.vectorDtype}`)}catch{}if(o===`smart`)if(E.push(``,`### Smart Indexing`),s){let e=s();e?E.push(`- **Mode**: Smart (trickle)`,`- **Status**: ${e.running?`✅ Running`:`⏸ Stopped`}`,`- **Queue**: ${e.queueSize} files pending`,`- **Changed files**: ${e.changedFilesSize} detected`,`- **Interval**: ${Math.round(e.intervalMs/1e3)}s per batch of ${e.batchSize}`):E.push(`- **Mode**: Smart (trickle)`,`- **Status**: scheduler state unavailable (init may have failed)`)}else E.push(`- **Mode**: Smart (trickle) — scheduler state unavailable`);if(h)try{let e=h.getReport(),t=h.checkThresholds(),n=Object.entries(e.counters),r=Object.entries(e.gauges);if(n.length>0||r.length>0||t.length>0){if(E.push(``,`### 📊 Metrics`),n.length>0){E.push(`**Counters:**`);for(let[e,t]of n)E.push(`- \`${e}\`: ${t}`)}if(r.length>0){E.push(`**Gauges:**`);for(let[e,t]of r)E.push(`- \`${e}\`: ${t}`)}if(t.length>0){E.push(`**⚠ Threshold violations:**`);for(let e of t)E.push(`- ${e}`)}else(n.length>0||r.length>0)&&E.push(`- ✅ All thresholds within limits`)}}catch{E.push(``,`### 📊 Metrics`,`- Metrics unavailable`)}{let e=[];if(u)try{let t=u.getStats();e.push(`- **Decision Hooks**: ${t.count} registered${t.hooks.length>0?` (IDs: ${t.hooks.map(e=>e.id).join(`, `)})`:``}`)}catch{e.push(`- **Decision Hooks**: unavailable`)}else e.push(`- **Decision Hooks**: not configured`);if(d)try{let t=d.getStats(),n=Object.entries(t.byTool).map(([e,t])=>`${e}=${t}`).join(`, `);e.push(`- **Observations**: ${t.totalObservations} total, byTool: ${n||`none`}`)}catch{e.push(`- **Observations**: unavailable`)}else e.push(`- **Observations**: not configured`);if(f)try{let t=f.getStats(),n=Object.keys(t.byName);e.push(`- **Extractors**: ${t.count} registered${n.length>0?` (IDs: ${n.join(`, `)})`:``}`)}catch{e.push(`- **Extractors**: unavailable`)}else e.push(`- **Extractors**: not configured`);if(m)try{let t=m.getStats(),n=t.skillExists?t.isStale?`⚠ Stale`:`✅ Fresh`:`❌ No skill`;e.push(`- **Skill Compiler**: ${n}, version: ${t.skillVersion}, last compiled: ${t.lastCompiledAt?new Date(t.lastCompiledAt).toLocaleString():`Never`}`)}catch{e.push(`- **Skill Compiler**: unavailable`)}else e.push(`- **Skill Compiler**: not configured`);if(p)try{let t=p.getStats();e.push(`- **Promotion Engine**: ${t.held} candidates held, ${t.promoted} promoted, ${t.observedFacts} distinct facts tracked`)}catch{e.push(`- **Promotion Engine**: unavailable`)}else e.push(`- **Promotion Engine**: not configured`);E.push(``,`### 🧩 Feature Coverage`,...e)}let _e=0;{try{let e=a?.stateDir?P(a.stateDir,`stash`):null;if(e&&M(e)){let t=Me(e).mtimeMs;t>fe&&(fe=t)}}catch{}let e=[];if(r)try{let t=T>0?await r.list({limit:5,orderBy:`updated`,order:`desc`}):[];for(let e of t){let t=new Date(e.updated||e.created).getTime();t>fe&&(fe=t)}e.push(...t)}catch{}if(_e=fe>0?Date.now()-fe:0,_e>=ev){let t=Math.floor(_e/36e5);if(E.push(``,`### 🌅 Session Briefing`,`_${t}+ hours since last activity — here's what to pick up:_`,``),e.length>0){E.push(`**Recent decisions/notes:**`);for(let t of e)E.push(`- **${t.title}** (${t.category??`note`}) — ${(t.contentPreview??``).slice(0,80)}…`)}E.push(``,`**Suggested next steps:**`,'- `search({ query: "SESSION CHECKPOINT", origin: "curated" })` — find your last checkpoint',"- `restore({})` — resume from a saved checkpoint",'- `knowledge({ action: "list" })` — browse all stored knowledge')}}E.push(``,`### Runtime`,av());let ve=ge.instance().getAll(),ye=ve.filter(e=>e.status!==`healthy`);if(ye.length>0){E.push(``,`### ⚠️ Subsystem Health`);for(let e of ye){let t=Math.round((Date.now()-e.since)/1e3);E.push(`- **${e.name}**: ${e.status} (${t}s ago${e.reason?` — ${e.reason}`:``})`)}}else ve.length>0&&E.push(``,`### ✅ Subsystem Health`,`- All ${ve.length} subsystems healthy`);let be=he.getAll();if(be.size>0){E.push(``,`### 🔌 Circuit Breakers`);for(let[e,t]of be){let n=t.getState(),r=`- **${e}**: ${n===`closed`?`🟢`:n===`open`?`🔴`:`🟡`} ${n}`;if(n===`open`){let e=t.remainingCooldownMs();r+=` (recovery in ${Math.ceil(e/1e3)}s)`}E.push(r)}}let k=uv(),xe=dv(),Se=C(),Ce=k!=null&&k!==Se,we=xe!=null&&xe!==Se;if(Ce||we){let e=ne(),t=[];Ce&&t.push(`user scaffold v${k}`),we&&t.push(`workspace scaffold v${xe}`);let n=t.join(`, `);e.state===`success`?E.push(``,`### ✅ Upgrade Applied`,`- Server v${Se} — ${n} auto-upgraded successfully.`,`- _Restart the MCP server to use the updated version._`):e.state===`pending`?E.push(``,`### ⏳ Upgrade In Progress`,`- Server v${Se} ≠ ${n}`,`- Auto-upgrade is running in the background…`):e.state===`failed`?(re(),E.push(``,`### ⬆ Upgrade Available (auto-upgrade failed, retrying)`,`- Server v${Se} ≠ ${n}`,`- Error: ${e.error??`unknown`}`)):(re(),E.push(``,`### ⬆ Upgrade Available`,`- Server v${Se} ≠ ${n}`,`- Auto-upgrade triggered — check again shortly.`))}g.length>0&&E.push(``,`### ⚠ Warnings`,...g.map(e=>`- ${e}`));let Te=K_();if(Te.length>0){let e=Te.sort((e,t)=>t.callCount-e.callCount);E.push(``,`### Tool Usage This Session`,``),E.push(`| Tool | Calls | Tokens In | Tokens Out | Errors | Avg Latency |`),E.push(`|------|-------|-----------|------------|--------|-------------|`);for(let t of e.slice(0,15)){let e=Math.round(t.totalInputChars/4),n=Math.round(t.totalOutputChars/4),r=Math.round(t.totalDurationMs/t.callCount);E.push(`| ${t.tool} | ${t.callCount} | ${e.toLocaleString()} | ${n.toLocaleString()} | ${t.errorCount} | ${r}ms |`)}}let A=U_();A.callCount>0&&(E.push(``),E.push(`### Session Token Usage`),E.push(`- Tool calls: ${A.callCount}`),E.push(`- Input chars: ${A.totalInputChars.toLocaleString()}`),E.push(`- Output chars: ${A.totalOutputChars.toLocaleString()}`),E.push(`- Est. input tokens: ${Math.round(A.totalInputChars/4).toLocaleString()}`),E.push(`- Est. total tokens: ${Math.round((A.totalInputChars+A.totalOutputChars)/4).toLocaleString()}`));let Ee=Y_();if(Ee.bufferSize>=10){let e=Ee.state===`healthy`?`🟢`:Ee.state===`degraded`?`🔴`:`🟡`;E.push(``,`### Auto-GC: ${e} ${Ee.state}`),E.push(`- p95 latency: ${Ee.p95}ms | buffer: ${Ee.bufferSize} samples`),Ee.gcCount>0&&E.push(`- GC cycles triggered: ${Ee.gcCount}`)}if(l){let e=l.getStats();if(e.totalSubscribers>0){E.push(``,`### 🔌 Hooks (EventBus Subscribers)`),E.push(`- Total subscribers: ${e.totalSubscribers}`);for(let[t,n]of Object.entries(e.byEvent))E.push(` - ${t}: ${n} subscriber(s)`);for(let t of e.subscriptions)E.push(` - ${t.name} (${t.eventType}, ${t.policy})`);if(e.autoDisabled.length>0){E.push(``),E.push(` **Auto-disabled subscribers:**`);for(let t of e.autoDisabled)E.push(` - ${t.name} (${t.id}): ${t.reason}`)}}}if(u&&u.size>0){let e=u.getStats();E.push(``,`### 🪝 Decision Hooks`),E.push(`- Total hooks: ${e.count}`);for(let t of e.hooks){let e=t.decisionTypes.join(`, `);E.push(` - ${t.id} (order=${t.order}, policy=${t.failurePolicy}, types=[${e}])`)}}if(d){let e=d.getStats();E.push(``,`### 👁 Observations`),E.push(`- Total observations: ${e.totalObservations}`),E.push(` - Success: ${e.byError.success}, Error: ${e.byError.error}`),E.push(` - Artifacts stored: ${e.artifactCount}`),E.push(` - Truncations: ${e.truncationCount}`),E.push(` - Store entries: ${e.storeSize}`);let t=Object.entries(e.byOrigin);t.length>0&&E.push(` - By origin: ${t.map(([e,t])=>`${e}=${t}`).join(`, `)}`)}if(f){let e=f.getStats();E.push(``,`### 🧩 Extractors`),E.push(`- Total extractors: ${e.count}`);for(let[t,n]of Object.entries(e.byName))E.push(` - ${t} (${n.tools} tool(s), maxFacts: ${n.maxFactsPerEvent??`default`})`)}if(p){let e=p.getStats();if(E.push(``,`### 🏆 Promotion Engine`),E.push(`- Total evaluated: ${e.totalEvaluated}`),E.push(`- Promoted: ${e.promoted}`),E.push(`- Held: ${e.held}`),E.push(`- Rejected: ${e.rejected}`),E.push(`- Superseded: ${e.superseded}`),E.push(`- Decayed: ${e.decayed}`),E.push(`- Distinct facts tracked: ${e.observedFacts}`),e.recentDecisions.length>0){E.push(` Recent decisions:`);for(let t of e.recentDecisions.slice(-5))E.push(` - ${t.decision.status}: "${t.factTitle}" (${t.decision.reason.slice(0,80)})`)}}if(m){let e=m.getStats();if(E.push(``,`### 📋 Workspace Skill`),E.push(`- **Skill exists**: ${e.skillExists?`✅`:`❌`}`),E.push(`- **Stale**: ${e.isStale?`⚠ Yes — regenerating on next trigger`:`✅ Fresh`}`),E.push(`- **Last compiled**: ${e.lastCompiledAt?new Date(e.lastCompiledAt).toLocaleString():`Never`}`),E.push(`- **Version**: ${e.skillVersion}`),E.push(`- **Total compiles**: ${e.totalCompiles}`),e.failedCompiles>0&&E.push(`- **Failed compiles**: ${e.failedCompiles}`),e.skillSize>0&&E.push(`- **Skill size**: ${e.skillSize} bytes`),e.isCompiling&&E.push(`- ⏳ **Currently compiling**`),e.pendingRegeneration&&E.push(`- ⏳ **Regeneration pending**`),e.skillQuality&&E.push(`- **Quality**: ${e.skillQuality}`),e.skillQualityErrors&&e.skillQualityErrors.length>0){E.push(`- **Quality errors (${e.skillQualityErrors.length})**:`);for(let t of e.skillQualityErrors.slice(0,3))E.push(` - ${t}`)}if(e.skillQualityWarnings&&e.skillQualityWarnings.length>0){E.push(`- **Quality warnings (${e.skillQualityWarnings.length})**:`);for(let t of e.skillQualityWarnings.slice(0,3))E.push(` - ${t}`)}let t=m?.getWarnings()??[];if(t.length>0){E.push(`- **Compiler warnings (${t.length})**:`);for(let e of t.slice(0,5))E.push(` - ${e}`);t.length>5&&E.push(` - ... and ${t.length-5} more`)}E.push(``," Read `aikit://skill/SKILL.md` to load full workspace context.")}{let e=Pt();(e.cacheSize>0||e.refReuseCount>0)&&(E.push(``,`### 🔄 Ref Reuse`),E.push(`- **Refs stored**: ${e.refStoreCount}`),E.push(`- **Refs reused**: ${e.refReuseCount}`),e.refStaleCount>0&&E.push(`- **⚠ Stale refs detected**: ${e.refStaleCount}`),E.push(`- **Cache entries**: ${e.cacheSize}`))}let j=E.join(`
|
|
3053
|
+
`),De=_e>=ev,Oe=Z_(a),N=e||De?await ee(r,c,void 0,Oe.length>0?Oe:void 0,O):void 0,ke=oe.length>0?oe.map(e=>({id:e.id,path:e.path,eventCount:e.eventCount,pendingFiles:e.pendingFiles??[]})):void 0,Ae={totalRecords:y.totalRecords,totalFiles:y.totalFiles,lastIndexedAt:y.lastIndexedAt??null,lastSourceIndexedAt:y.lastSourceIndexedAt??null,onboarded:ie,onboardDir:te,onboard_context:O,contentTypes:y.contentTypeBreakdown,wasmAvailable:!!ur.get(),wasmDiagnostics:lr.get(),graphStats:w,curatedCount:T,serverVersion:Se,scaffoldVersion:k??null,workspaceScaffoldVersion:xe??null,upgradeAvailable:Ce||we,storeBackend:a?.store?.backend,storeDiagnostics:pe??null,contextPressure:se,nextAction:de,workspace_skill:(()=>{if(!m)return null;try{let e=m.getStats(),t=m?.getWarnings()??[],n=e.skillExists?e.skillQuality??`fallback`:`fallback`;return{exists:e.skillExists,version:e.skillVersion,fresh:!e.isStale,quality:n,warnings:t,uri:`aikit://skill/SKILL.md`,path:e.skillPath,read_instruction:`Read aikit://skill/SKILL.md before working in this repo for full workspace context.`,last_updated:e.lastCompiledAt?new Date(e.lastCompiledAt).toISOString():null,size:e.skillSize}}catch{return null}})(),skill_warnings:m?.getWarnings(m?.resolveActiveFlowSlug()??void 0)??[],watchers:ke,sessionTokens:{callCount:A.callCount,totalInputChars:A.totalInputChars,totalOutputChars:A.totalOutputChars,estInputTokens:Math.round(A.totalInputChars/4),estTotalTokens:Math.round((A.totalInputChars+A.totalOutputChars)/4),startTime:A.startTime},...N===void 0?{}:{prelude:N}};return{content:[{type:`text`,text:j+(o===`smart`?"\n\n---\n_Next: Use `search` to query indexed content or `graph({action:'find_nodes', name_pattern:'<top-level-module>'})` → then `graph({action:'neighbors', node_id})` for relationships. Smart indexing handles updates automatically._":"\n\n---\n_Next: Use `search` to query indexed content, `graph({action:'find_nodes', name_pattern:'<top-level-module>'})` → then `graph({action:'neighbors', node_id})` for relationships, or `reindex` to refresh the index._")}],structuredContent:Ae}}catch(e){return $_.error(`Status failed`,j(e)),q(`INTERNAL`,`Status check failed: ${e instanceof Error?e.message:String(e)}`)}}))}const mv=k(`tools`);function hv(e){return e instanceof Error?(`code`in e?e.code:void 0)===`ENOENT`||e.message.startsWith(`File not found:`)||e.message.startsWith(`Path not found:`):!1}function gv(e){let t=U(`web_search`);e.registerTool(`web_search`,{title:t.title,description:`PREFERRED web search — fans out to multiple keyless providers (DuckDuckGo + Bing-HTML + Mojeek) by default, returning a deduplicated, consensus-ranked union within a 10s deadline. Optional providers (SearXNG, Google, Brave, Bing API) join the fan-out automatically when their env vars are set. Pass one query or multiple for parallel searching.`,inputSchema:{queries:I.array(I.string().max(2e3)).min(1).max(5).describe('Search queries (1–5). Single: `["react hooks"]`. Multiple searched in parallel.'),limit:I.number().min(1).max(20).default(5).describe(`Max results per query`),site:I.string().optional().describe(`Restrict to domain (e.g., "docs.aws.amazon.com")`),provider:I.enum([`multi`,`duckduckgo`,`bing-html`,`mojeek`,`searxng`,`google`,`brave`,`bing`]).optional().describe("Search provider. Defaults to env AIKIT_SEARCH_PROVIDER, then `multi` (fan-out). Single keyless: `duckduckgo`, `bing-html`, `mojeek`. Self-hosted: `searxng` (requires SEARXNG_URL). Keyed APIs: `google` (GOOGLE_API_KEY+GOOGLE_CSE_ID), `brave` (BRAVE_API_KEY), `bing` (BING_API_KEY). Missing keys auto-fall back to duckduckgo.")},annotations:t.annotations},J(`web_search`,async({queries:e,limit:t,site:n,provider:r})=>{let i=e,a=async e=>{let i=await Gn({query:e,limit:t,site:n,provider:r}),a=[`## Search: ${i.query} _(via ${i.provider})_`,``];if(i.results.length===0)a.push(`No results found.`);else for(let e of i.results)a.push(`### [${e.title}](${e.url})`,e.snippet,``);return a.join(`
|
|
3054
|
+
`)};if(i.length===1)try{return{content:[{type:`text`,text:`${await a(i[0])}\n---\n_Next: Use \`web_fetch\` to read any of these pages in full._`}]}}catch(e){return mv.error(`Web search failed`,j(e)),q(`INTERNAL`,`Web search failed: ${e instanceof Error?e.message:String(e)}`)}let o=await Promise.allSettled(i.map(e=>a(e))),s=[],c=0;for(let e=0;e<o.length;e++){let t=o[e];if(t.status===`fulfilled`)s.push(t.value);else{c++;let n=t.reason instanceof Error?t.reason.message:String(t.reason);mv.error(`Web search failed`,{query:i[e],error:n}),s.push(`## ❌ Search failed: ${i[e]}\n\n${n}`)}}let l=`_Searched ${o.length-c}/${o.length} queries successfully._`;s.push(``,`---`,l,"_Next: Use `web_fetch` to read any of these pages in full._");let u=s.join(`
|
|
3055
3055
|
|
|
3056
|
-
`);return c===o.length?q(`INTERNAL`,u):{content:[{type:`text`,text:u}]}}))}function
|
|
3056
|
+
`);return c===o.length?q(`INTERNAL`,u):{content:[{type:`text`,text:u}]}}))}function _v(e){let t=U(`measure`);e.registerTool(`measure`,{title:t.title,description:`Measure code complexity, line counts, and function counts for a file or directory. Returns per-file metrics sorted by complexity.`,outputSchema:Es,inputSchema:{path:I.string().describe(`File or directory path to measure`),extensions:I.array(I.string()).optional().describe(`File extensions to include (default: .ts,.tsx,.js,.jsx)`),include_hidden:I.boolean().optional().describe(`Include hidden trees such as .generated and .cache. Default false.`),max_tokens:I.number().min(100).max(5e4).optional().describe(`Maximum token budget for the response. When set, output is truncated to fit.`)},annotations:t.annotations},J(`measure`,async({path:e,extensions:t,include_hidden:n,max_tokens:r})=>{try{let i=await Yt({path:e,extensions:t,includeHidden:n}),a=[`## Code Metrics`,``,`**Files:** ${i.summary.totalFiles}`,`**Total lines:** ${i.summary.totalLines} (${i.summary.totalCodeLines} code)`,`**Functions:** ${i.summary.totalFunctions}`,`**Avg complexity:** ${i.summary.avgComplexity}`,`**Max complexity:** ${i.summary.maxComplexity.value} (${i.summary.maxComplexity.file})`,``,`### Top files by complexity`,``,`| File | Lines | Code | Complexity | Cognitive | Functions | Imports |`,`|------|-------|------|------------|-----------|-----------|---------|`];for(let e of i.files.slice(0,20)){let t=e.cognitiveComplexity===void 0?`—`:String(e.cognitiveComplexity);a.push(`| ${e.path} | ${e.lines.total} | ${e.lines.code} | ${e.complexity} | ${t} | ${e.functions} | ${e.imports} |`)}i.files.length>20&&a.push(``,`_...and ${i.files.length-20} more files_`);let o={summary:{totalFiles:i.summary.totalFiles,totalLines:i.summary.totalLines,totalCodeLines:i.summary.totalCodeLines,totalFunctions:i.summary.totalFunctions,avgComplexity:i.summary.avgComplexity,maxComplexity:{value:i.summary.maxComplexity.value,file:i.summary.maxComplexity.file}},files:i.files.map(e=>({path:e.path,lines:e.lines.total,code:e.lines.code,complexity:e.complexity,functions:e.functions}))};return{content:[{type:`text`,text:r?Vn(a.join(`
|
|
3057
3057
|
`),r):a.join(`
|
|
3058
|
-
`)}],structuredContent:o}}catch(e){return
|
|
3059
|
-
`)}],structuredContent:a}}))}const vv=k(`register-tools`);function yv(e){return t=>!e||e.has(t)}function bv(e){try{let t=P(e,`.flows`);if(!M(t))return null;let n=ke(t,{withFileTypes:!0});for(let e of n){if(!e.isDirectory())continue;let n=P(t,e.name,`meta.json`);if(M(n)&&JSON.parse(N(n,`utf-8`)).status===`active`)return e.name}}catch{return null}return null}let xv=null,Sv=null;function Cv(){xv?.(),xv=null}function wv(){return Sv?.flush()??Promise.resolve()}function Tv(e){let{server:t,aikit:n,config:r,elicitor:i,resourceNotifier:a,samplingClient:o,indexMode:s,getSmartState:c,getSmartScheduler:l,precomputedActiveTools:u}=e,d=new Oo,f=r.sources[0]?.path??Ee(),p=be(f),m={activeSlug:null};m.activeSlug=bv(f);let h=new Va(P(r.stateDir??``,`flow-context`),()=>m.activeSlug),g=new Ta;g.register(fi()),g.register(va),g.register(ki),g.register(ra),g.register(yi),g.register(pi),g.register(mi),g.register(ha),g.register(gi),g.register(Sa),g.register(na(()=>m.activeSlug?{active:!0,slug:m.activeSlug}:null)),g.register(sa),g.register(ba),g.register(Ei),g.register(aa);let _=new Za(void 0,n.stateStore),v=n.eventBus,y=Q_(r),b=y?new no(y,{debounceMs:5e3},v??void 0,n.curated,void 0,f):null;b&&b.compileNow(`startup`).catch(e=>{vv.warn(`Startup skill compile failed — will retry on next trigger`,{error:String(e)})});let x=new Oa(g,n.curated,{},h,_,v??void 0,n.stateStore);Sv=x;let S=u??xs(r,[...Ia,...Wo],Fa,Ko(r)),C=yv(S),w=new Set([...S].filter(e=>!Lf.includes(e)&&!Ua.has(e))),T=new qa;d.use(Yo(),{order:1,name:`structured-content-guard`}),d.use(Ba(za(r.tokenBudget)),{order:90,name:`compression`});let E=d.decisionHookRegistry;E.register({id:`search-budget`,order:10,scope:`search`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`budgetHint`],reason:`Enforce token budget on search results`,fn:()=>({type:`decision`,hookId:`search-budget`,decision:`allow`,reason:`Budget hook active`})}),E.register({id:`find-path-containment`,order:10,scope:`find`,timeoutMs:50,failurePolicy:`fail-closed`,decisionTypes:[`deny`],reason:`Validate find scope against workspace boundaries`,fn:()=>({type:`decision`,hookId:`find-path-containment`,decision:`allow`,reason:`Path permitted`})}),E.register({id:`knowledge-mutation-safety`,order:10,scope:`knowledge`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`deny`],reason:`Guard against unintended knowledge mutations`,fn:()=>({type:`decision`,hookId:`knowledge-mutation-safety`,decision:`allow`,reason:`Mutation permitted`})}),E.register({id:`check-scoped-run`,order:10,scope:`check`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Log check run scope for audit`,fn:()=>({type:`decision`,hookId:`check-scoped-run`,decision:`allow`,reason:`Check run permitted`})}),E.register({id:`test-run-scoped`,order:10,scope:`test_run`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Log test run scope for audit`,fn:()=>({type:`decision`,hookId:`test-run-scoped`,decision:`allow`,reason:`Test run permitted`})}),E.register({id:`onboard-path-correctness`,order:10,scope:`onboard`,timeoutMs:50,failurePolicy:`fail-closed`,decisionTypes:[`deny`],reason:`Validate onboard target path is valid and accessible`,fn:()=>({type:`decision`,hookId:`onboard-path-correctness`,decision:`allow`,reason:`Path valid`})}),E.register({id:`compact-budget-hints`,order:10,scope:`compact`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`budgetHint`],reason:`Enforce token budget on compact output`,fn:()=>({type:`decision`,hookId:`compact-budget-hints`,decision:`allow`,reason:`Budget hook active`})}),E.register({id:`flow-step-safety`,order:10,scope:`flow`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Log flow step transitions`,fn:()=>({type:`decision`,hookId:`flow-step-safety`,decision:`allow`,reason:`Step permitted`})}),E.register({id:`present-transport-capability`,order:10,scope:`present`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Verify presentation transport is available`,fn:()=>({type:`decision`,hookId:`present-transport-capability`,decision:`allow`,reason:`Transport available`})});let ee=new jo(r.metricThresholds);os(t,d,r.toolPrefix??``,n.eventBus,()=>{let e=r.sources[0]?.path??Ee();try{return be(e)}catch{return`partition:${qe(`sha256`).update(e).digest(`hex`).slice(0,8)}`}}),v&&(v.subscribe({id:`sub-auto-knowledge`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`args`in e)||!(`result`in e))return;let t=e;try{ee.incrementCounter(`tool.call`,{tool:t.toolName}),t.isError&&ee.incrementCounter(`tool.error`,{tool:t.toolName}),x.push({toolName:t.toolName,args:t.args,result:t.result,durationMs:t.durationMs,isError:t.isError,timestamp:new Date(t.timestamp).toISOString(),origin:t.origin,workspaceId:t.workspaceId,requestId:t.requestId})}catch{}},name:`auto-knowledge`}),v.subscribe({id:`sub-replay`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`args`in e)||!(`result`in e))return;let t=e;try{let{replayAppend:e}=await import(`../../tools/dist/index.js`),n=JSON.stringify(t.args),r=JSON.stringify(t.result);e({ts:new Date(t.timestamp).toISOString(),source:`mcp`,tool:t.toolName,input:n.slice(0,2e3),outputChars:r.length,inputChars:n.length,durationMs:t.durationMs,status:t.isError?`error`:`ok`,output:r.slice(0,2e3),traceId:t.requestId??``})}catch{}},name:`replay`}),v.subscribe({id:`sub-procedural`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`isError`in e))return;let t=e;try{w.has(t.toolName)&&T.record(t.toolName,!t.isError)}catch{}},name:`procedural-memory`}),v.subscribe({id:`sub-observations`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`result`in e))return;let t=e;try{let{ObservationEngine:e,DEFAULT_OBSERVATION_CONFIG:r}=await import(`./observations-Cri43dvk.js`),i=new e(n.stateStore,n.curated),{captureFrom:a}=r;a.includes(t.toolName)&&await i.processToolResult(t.toolName,t.result,{})}catch{}},name:`observation-capture`}),v.subscribe({id:`sub-knowledge-metrics`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`result`in e))return;let t=e;if(t.toolName===`knowledge`)try{let e=t.result,n=t.args?.action;(n===`remember`||n===`update`)&&(ee.incrementCounter(`fact.total`),(e?.status===`unchanged`||e?.result===`unchanged`)&&ee.incrementCounter(`fact.duplicate`))}catch{}},name:`knowledge-metrics`}),v.subscribe({id:`sub-session`,eventType:`session:start`,policy:`async`,handler:async e=>{let t=e,n={serverVersion:t.serverVersion,workspaceRoot:t.workspaceRoot,handoff:t.handoff?`${t.handoff.from} (session ${t.handoff.sessionId})`:void 0};vv.info(`Session started`,n)},name:`session-lifecycle`}),b&&(xv=b.subscribeToEventBus(v)));let te=[...S].filter(e=>Go.has(e)?Uo.includes(e)?!!n.bridge:e===`er_update_policy`?!!n.policyStore:e===`er_evolve_review`?!!n.evolutionCollector:!1:!0),D={store:n.store,graphStore:n.graphStore,embedder:n.embedder},ne={onboardComplete:n.onboardComplete,onboardTimestamp:n.onboardTimestamp},re={search:[{name:`search`,register:()=>f_(t,n.embedder,n.store,n.graphStore,n.bridge,n.evolutionCollector,o,n.stateStore,r.memory?.retention,r.memory?.consolidation,p)},{name:`find`,register:()=>wl(t,n.embedder,n.store)},{name:`symbol`,register:()=>Tl(t,n.embedder,n.store,n.graphStore,D)},{name:`trace`,register:()=>El(t,n.embedder,n.store,n.graphStore,D)},{name:`scope_map`,register:()=>Cl(t,n.embedder,n.store,D)},{name:`file_summary`,register:()=>Rl(t,n.embedder,n.fileCache)}],analysis:[{name:`analyze`,register:()=>Nc(t,n.store,n.embedder)},{name:`blast_radius`,register:()=>Pc(t,n.store,n.embedder,n.graphStore,D)}],knowledge:[{name:`knowledge`,register:()=>Cf(t,n.curated,n.policyStore,n.evolutionCollector,a,void 0,n.stateStore,r.memory?.retention,r.memory?.supersession,r.memory?.consolidation,r.memory?.lessons,D,n.graphStore)},{name:`produce_knowledge`,register:()=>Hg(t,a)}],compression:[{name:`digest`,register:()=>Wu(t,n.embedder)}],forge:[{name:`forge_ground`,register:()=>Gu(t,n.embedder,n.store)},{name:`evidence_map`,register:()=>Uu(t)}],presentation:[{name:`present`,register:()=>Bg(t,i)}],execution:[{name:`check`,register:()=>jl(t,D,r.tokenBudget)},{name:`test_run`,register:()=>Nl(t,D)},{name:`eval`,register:()=>Ml(t)},{name:`audit`,register:()=>zc(t,n.store,n.embedder)}],web:[{name:`browser`,register:()=>$n(t,r)},{name:`web_fetch`,register:()=>ed(t)},{name:`web_search`,register:()=>hv(t)}],manipulation:[{name:`rename`,register:()=>Df(t,r)},{name:`restore`,register:()=>Jg(t)},{name:`codemod`,register:()=>Of(t,r)}],session:[{name:`session`,register:()=>A_(t,n.stateStore,o)}],git:[{name:`git`,register:()=>qu(t)},{name:`parse_output`,register:()=>Pl(t)}],process:[{name:`process`,register:()=>$u(t)},{name:`delegate`,register:()=>Fl(t,o)}],system:[{name:`config`,register:()=>fl(t,r)},{name:`status`,register:()=>fv(t,n.store,n.graphStore,n.curated,ne,r,s,c,n.stateStore,n.eventBus,d.decisionHookRegistry,d.getObservationCompressor(),g,_,b)},{name:`reindex`,register:()=>Wg(t,n.indexer,r,n.curated,n.store,a,s,n.eventBus)},{name:`onboard`,register:()=>ap(t,n.store,n.embedder,r,ne,D,o,a)},{name:`graph`,register:()=>Zu(t,n.graphStore)},{name:`replay`,register:()=>Kg(t)}],utilities:[{name:`measure`,register:()=>gv(t)},{name:`env`,register:()=>_v(t)}],queue:[{name:`queue`,register:()=>sp(t)}],flow:[{name:`flow`,register:()=>Vu(t,r,{store:n.store?{search:async(e,t)=>(await n.store.ftsSearch(e,t)).map(e=>({content:e.record.content}))}:null,graphStore:n.graphStore,embedder:n.embedder,curated:n.curated??null,eventBus:n.eventBus??null,skillCompiler:b},e=>{m.activeSlug=e})}]};for(let[,e]of Object.entries(re))for(let{name:t,register:n}of e)C(t)&&n();n.bridge&&(C(`er_push`)&&Uc(t,n.bridge,n.evolutionCollector),C(`er_pull`)&&Wc(t,n.bridge),C(`er_sync_status`)&&Gc(t,n.bridge)),n.policyStore&&C(`er_update_policy`)&&up(t,n.policyStore),n.evolutionCollector&&C(`er_evolve_review`)&&kl(t,n.evolutionCollector),Lf.some(e=>C(e))&&Rf(t,r,te,n.onboardComplete),Ho(t,n.store,n.curated,y,n.eventBus,d.decisionHookRegistry,b)}function Ev(e,t,n){let r=yv(n);r(`check`)&&jl(e,void 0,t.tokenBudget),r(`eval`)&&Ml(e),r(`test_run`)&&Nl(e),r(`parse_output`)&&Pl(e),r(`delegate`)&&Fl(e),r(`git`)&&qu(e),r(`rename`)&&Df(e,t),r(`codemod`)&&Of(e,t),r(`restore`)&&Jg(e),r(`queue`)&&sp(e),r(`process`)&&$u(e),r(`web_fetch`)&&ed(e),Lf.some(e=>r(e))&&Rf(e,t,[...n??new Set(Ia)]),r(`evidence_map`)&&Uu(e),r(`present`)&&Bg(e),r(`browser`)&&$n(e,t),r(`produce_knowledge`)&&Hg(e),r(`replay`)&&Kg(e),r(`status`)&&dv(e),r(`flow`)&&Vu(e,t),r(`web_search`)&&hv(e),r(`measure`)&&gv(e),r(`env`)&&_v(e)}export{U as S,so as _,yg as a,Fa as b,Hc as c,Yo as d,ts as f,Oo as g,Ko as h,Ev as i,xs as l,Wo as m,wv as n,Yf as o,qo as p,Tv as r,Qf as s,Cv as t,os as u,Ia as v,La as x,Ra as y};
|
|
3058
|
+
`)}],structuredContent:o}}catch(e){return hv(e)?(mv.warn(`Measure failed`,{error:`File not found`}),q(`NOT_FOUND`,`File not found`)):(mv.error(`Measure failed`,j(e)),q(`INTERNAL`,`Measure failed: ${e instanceof Error?e.message:String(e)}`))}}))}function vv(e){let t=U(`env`);e.registerTool(`env`,{title:t.title,description:`Get system and runtime environment info. Sensitive env vars are redacted by default.`,outputSchema:Ds,inputSchema:{include_env:I.boolean().default(!1).describe(`Include environment variables`),filter_env:I.string().optional().describe(`Filter env vars by name substring`),show_sensitive:I.boolean().default(!1).describe(`Show sensitive values (keys, tokens, etc.) — redacted by default`)},annotations:t.annotations},J(`env`,async({include_env:e,filter_env:t,show_sensitive:n})=>{let r=Tt({includeEnv:e,filterEnv:t,showSensitive:n}),i=[`## Environment`,``,`**Platform:** ${r.system.platform} ${r.system.arch}`,`**OS:** ${r.system.type} ${r.system.release}`,`**Host:** ${r.system.hostname}`,`**CPUs:** ${r.system.cpus}`,`**Memory:** ${r.system.memoryFreeGb}GB free / ${r.system.memoryTotalGb}GB total`,``,`**Node:** ${r.runtime.node}`,`**V8:** ${r.runtime.v8}`,`**CWD:** ${r.cwd}`];if(r.env){i.push(``,`### Environment Variables`,``);for(let[e,t]of Object.entries(r.env))i.push(`- \`${e}\`: ${t}`)}let a={platform:r.system.platform,arch:r.system.arch,nodeVersion:r.runtime.node,cwd:r.cwd,cpus:r.system.cpus,memoryFreeGb:r.system.memoryFreeGb,memoryTotalGb:r.system.memoryTotalGb};return{content:[{type:`text`,text:i.join(`
|
|
3059
|
+
`)}],structuredContent:a}}))}const yv=k(`register-tools`);function bv(e){return t=>!e||e.has(t)}function xv(e){try{let t=P(e,`.flows`);if(!M(t))return null;let n=ke(t,{withFileTypes:!0});for(let e of n){if(!e.isDirectory())continue;let n=P(t,e.name,`meta.json`);if(M(n)&&JSON.parse(N(n,`utf-8`)).status===`active`)return e.name}}catch{return null}return null}let Sv=null,Cv=null;function wv(){Sv?.(),Sv=null}function Tv(){return Cv?.flush()??Promise.resolve()}function Ev(e){let{server:t,aikit:n,config:r,elicitor:i,resourceNotifier:a,samplingClient:o,indexMode:s,getSmartState:c,getSmartScheduler:l,precomputedActiveTools:u}=e,d=new Oo,f=r.sources[0]?.path??Ee(),p=be(f),m={activeSlug:null};m.activeSlug=xv(f);let h=new Va(P(r.stateDir??``,`flow-context`),()=>m.activeSlug),g=new Ta;g.register(fi()),g.register(va),g.register(ki),g.register(ra),g.register(yi),g.register(pi),g.register(mi),g.register(ha),g.register(gi),g.register(Sa),g.register(na(()=>m.activeSlug?{active:!0,slug:m.activeSlug}:null)),g.register(sa),g.register(ba),g.register(Ei),g.register(aa);let _=new Za(void 0,n.stateStore),v=n.eventBus,y=Q_(r),b=y?new no(y,{debounceMs:5e3},v??void 0,n.curated,void 0,f):null;b&&b.compileNow(`startup`).catch(e=>{yv.warn(`Startup skill compile failed — will retry on next trigger`,{error:String(e)})});let x=new Oa(g,n.curated,{},h,_,v??void 0,n.stateStore);Cv=x;let S=u??xs(r,[...Ia,...Wo],Fa,Ko(r)),C=bv(S),w=new Set([...S].filter(e=>!Lf.includes(e)&&!Ua.has(e))),T=new qa;d.use(Yo(),{order:1,name:`structured-content-guard`}),d.use(Ba(za(r.tokenBudget)),{order:90,name:`compression`});let E=d.decisionHookRegistry;E.register({id:`search-budget`,order:10,scope:`search`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`budgetHint`],reason:`Enforce token budget on search results`,fn:()=>({type:`decision`,hookId:`search-budget`,decision:`allow`,reason:`Budget hook active`})}),E.register({id:`find-path-containment`,order:10,scope:`find`,timeoutMs:50,failurePolicy:`fail-closed`,decisionTypes:[`deny`],reason:`Validate find scope against workspace boundaries`,fn:()=>({type:`decision`,hookId:`find-path-containment`,decision:`allow`,reason:`Path permitted`})}),E.register({id:`knowledge-mutation-safety`,order:10,scope:`knowledge`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`deny`],reason:`Guard against unintended knowledge mutations`,fn:()=>({type:`decision`,hookId:`knowledge-mutation-safety`,decision:`allow`,reason:`Mutation permitted`})}),E.register({id:`check-scoped-run`,order:10,scope:`check`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Log check run scope for audit`,fn:()=>({type:`decision`,hookId:`check-scoped-run`,decision:`allow`,reason:`Check run permitted`})}),E.register({id:`test-run-scoped`,order:10,scope:`test_run`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Log test run scope for audit`,fn:()=>({type:`decision`,hookId:`test-run-scoped`,decision:`allow`,reason:`Test run permitted`})}),E.register({id:`onboard-path-correctness`,order:10,scope:`onboard`,timeoutMs:50,failurePolicy:`fail-closed`,decisionTypes:[`deny`],reason:`Validate onboard target path is valid and accessible`,fn:()=>({type:`decision`,hookId:`onboard-path-correctness`,decision:`allow`,reason:`Path valid`})}),E.register({id:`compact-budget-hints`,order:10,scope:`compact`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`budgetHint`],reason:`Enforce token budget on compact output`,fn:()=>({type:`decision`,hookId:`compact-budget-hints`,decision:`allow`,reason:`Budget hook active`})}),E.register({id:`flow-step-safety`,order:10,scope:`flow`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Log flow step transitions`,fn:()=>({type:`decision`,hookId:`flow-step-safety`,decision:`allow`,reason:`Step permitted`})}),E.register({id:`present-transport-capability`,order:10,scope:`present`,timeoutMs:100,failurePolicy:`degrade-with-warning`,decisionTypes:[`allow`],reason:`Verify presentation transport is available`,fn:()=>({type:`decision`,hookId:`present-transport-capability`,decision:`allow`,reason:`Transport available`})});let ee=new jo(r.metricThresholds);os(t,d,r.toolPrefix??``,n.eventBus,()=>{let e=r.sources[0]?.path??Ee();try{return be(e)}catch{return`partition:${qe(`sha256`).update(e).digest(`hex`).slice(0,8)}`}}),v&&(v.subscribe({id:`sub-auto-knowledge`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`args`in e)||!(`result`in e))return;let t=e;try{ee.incrementCounter(`tool.call`,{tool:t.toolName}),t.isError&&ee.incrementCounter(`tool.error`,{tool:t.toolName}),x.push({toolName:t.toolName,args:t.args,result:t.result,durationMs:t.durationMs,isError:t.isError,timestamp:new Date(t.timestamp).toISOString(),origin:t.origin,workspaceId:t.workspaceId,requestId:t.requestId})}catch{}},name:`auto-knowledge`}),v.subscribe({id:`sub-replay`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`args`in e)||!(`result`in e))return;let t=e;try{let{replayAppend:e}=await import(`../../tools/dist/index.js`),n=JSON.stringify(t.args),r=JSON.stringify(t.result);e({ts:new Date(t.timestamp).toISOString(),source:`mcp`,tool:t.toolName,input:n.slice(0,2e3),outputChars:r.length,inputChars:n.length,durationMs:t.durationMs,status:t.isError?`error`:`ok`,output:r.slice(0,2e3),traceId:t.requestId??``})}catch{}},name:`replay`}),v.subscribe({id:`sub-procedural`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`isError`in e))return;let t=e;try{w.has(t.toolName)&&T.record(t.toolName,!t.isError)}catch{}},name:`procedural-memory`}),v.subscribe({id:`sub-observations`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`result`in e))return;let t=e;try{let{ObservationEngine:e,DEFAULT_OBSERVATION_CONFIG:r}=await import(`./observations-Cri43dvk.js`),i=new e(n.stateStore,n.curated),{captureFrom:a}=r;a.includes(t.toolName)&&await i.processToolResult(t.toolName,t.result,{})}catch{}},name:`observation-capture`}),v.subscribe({id:`sub-knowledge-metrics`,eventType:`tool:after`,policy:`async`,handler:async e=>{if(!(`toolName`in e)||!(`result`in e))return;let t=e;if(t.toolName===`knowledge`)try{let e=t.result,n=t.args?.action;(n===`remember`||n===`update`)&&(ee.incrementCounter(`fact.total`),(e?.status===`unchanged`||e?.result===`unchanged`)&&ee.incrementCounter(`fact.duplicate`))}catch{}},name:`knowledge-metrics`}),v.subscribe({id:`sub-session`,eventType:`session:start`,policy:`async`,handler:async e=>{let t=e,n={serverVersion:t.serverVersion,workspaceRoot:t.workspaceRoot,handoff:t.handoff?`${t.handoff.from} (session ${t.handoff.sessionId})`:void 0};yv.info(`Session started`,n)},name:`session-lifecycle`}),b&&(Sv=b.subscribeToEventBus(v)));let te=[...S].filter(e=>Go.has(e)?Uo.includes(e)?!!n.bridge:e===`er_update_policy`?!!n.policyStore:e===`er_evolve_review`?!!n.evolutionCollector:!1:!0),D={store:n.store,graphStore:n.graphStore,embedder:n.embedder},ne={onboardComplete:n.onboardComplete,onboardTimestamp:n.onboardTimestamp},re={search:[{name:`search`,register:()=>f_(t,n.embedder,n.store,n.graphStore,n.bridge,n.evolutionCollector,o,n.stateStore,r.memory?.retention,r.memory?.consolidation,p)},{name:`find`,register:()=>wl(t,n.embedder,n.store)},{name:`symbol`,register:()=>Tl(t,n.embedder,n.store,n.graphStore,D)},{name:`trace`,register:()=>El(t,n.embedder,n.store,n.graphStore,D)},{name:`scope_map`,register:()=>Cl(t,n.embedder,n.store,D)},{name:`file_summary`,register:()=>Rl(t,n.embedder,n.fileCache)}],analysis:[{name:`analyze`,register:()=>Nc(t,n.store,n.embedder)},{name:`blast_radius`,register:()=>Pc(t,n.store,n.embedder,n.graphStore,D)}],knowledge:[{name:`knowledge`,register:()=>Cf(t,n.curated,n.policyStore,n.evolutionCollector,a,void 0,n.stateStore,r.memory?.retention,r.memory?.supersession,r.memory?.consolidation,r.memory?.lessons,D,n.graphStore)},{name:`produce_knowledge`,register:()=>Hg(t,a)}],compression:[{name:`digest`,register:()=>Wu(t,n.embedder)}],forge:[{name:`forge_ground`,register:()=>Gu(t,n.embedder,n.store)},{name:`evidence_map`,register:()=>Uu(t)}],presentation:[{name:`present`,register:()=>Bg(t,i)}],execution:[{name:`check`,register:()=>jl(t,D,r.tokenBudget)},{name:`test_run`,register:()=>Nl(t,D)},{name:`eval`,register:()=>Ml(t)},{name:`audit`,register:()=>zc(t,n.store,n.embedder)}],web:[{name:`browser`,register:()=>$n(t,r)},{name:`web_fetch`,register:()=>ed(t)},{name:`web_search`,register:()=>gv(t)}],manipulation:[{name:`rename`,register:()=>Df(t,r)},{name:`restore`,register:()=>Jg(t)},{name:`codemod`,register:()=>Of(t,r)}],session:[{name:`session`,register:()=>A_(t,n.stateStore,o)}],git:[{name:`git`,register:()=>qu(t)},{name:`parse_output`,register:()=>Pl(t)}],process:[{name:`process`,register:()=>$u(t)},{name:`delegate`,register:()=>Fl(t,o)}],system:[{name:`config`,register:()=>fl(t,r)},{name:`status`,register:()=>pv(t,n.store,n.graphStore,n.curated,ne,r,s,c,n.stateStore,n.eventBus,d.decisionHookRegistry,d.getObservationCompressor(),g,_,b)},{name:`reindex`,register:()=>Wg(t,n.indexer,r,n.curated,n.store,a,s,n.eventBus)},{name:`onboard`,register:()=>ap(t,n.store,n.embedder,r,ne,D,o,a)},{name:`graph`,register:()=>Zu(t,n.graphStore)},{name:`replay`,register:()=>Kg(t)}],utilities:[{name:`measure`,register:()=>_v(t)},{name:`env`,register:()=>vv(t)}],queue:[{name:`queue`,register:()=>sp(t)}],flow:[{name:`flow`,register:()=>Vu(t,r,{store:n.store?{search:async(e,t)=>(await n.store.ftsSearch(e,t)).map(e=>({content:e.record.content}))}:null,graphStore:n.graphStore,embedder:n.embedder,curated:n.curated??null,eventBus:n.eventBus??null,skillCompiler:b},e=>{m.activeSlug=e})}]};for(let[,e]of Object.entries(re))for(let{name:t,register:n}of e)C(t)&&n();n.bridge&&(C(`er_push`)&&Uc(t,n.bridge,n.evolutionCollector),C(`er_pull`)&&Wc(t,n.bridge),C(`er_sync_status`)&&Gc(t,n.bridge)),n.policyStore&&C(`er_update_policy`)&&up(t,n.policyStore),n.evolutionCollector&&C(`er_evolve_review`)&&kl(t,n.evolutionCollector),Lf.some(e=>C(e))&&Rf(t,r,te,n.onboardComplete),Ho(t,n.store,n.curated,y,n.eventBus,d.decisionHookRegistry,b)}function Dv(e,t,n){let r=bv(n);r(`check`)&&jl(e,void 0,t.tokenBudget),r(`eval`)&&Ml(e),r(`test_run`)&&Nl(e),r(`parse_output`)&&Pl(e),r(`delegate`)&&Fl(e),r(`git`)&&qu(e),r(`rename`)&&Df(e,t),r(`codemod`)&&Of(e,t),r(`restore`)&&Jg(e),r(`queue`)&&sp(e),r(`process`)&&$u(e),r(`web_fetch`)&&ed(e),Lf.some(e=>r(e))&&Rf(e,t,[...n??new Set(Ia)]),r(`evidence_map`)&&Uu(e),r(`present`)&&Bg(e),r(`browser`)&&$n(e,t),r(`produce_knowledge`)&&Hg(e),r(`replay`)&&Kg(e),r(`status`)&&fv(e),r(`flow`)&&Vu(e,t),r(`web_search`)&&gv(e),r(`measure`)&&_v(e),r(`env`)&&vv(e)}export{U as S,so as _,yg as a,Fa as b,Hc as c,Yo as d,ts as f,Oo as g,Ko as h,Dv as i,xs as l,Wo as m,Tv as n,Yf as o,qo as p,Ev as r,Qf as s,wv as t,os as u,Ia as v,La as x,Ra as y};
|
|
@@ -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-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-
|
|
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-BaddGXqY.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(`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e,t}from"./curated-manager-D4MOFQ-t.js";import{c as n,f as r,p as i,s as a}from"./startup-maintenance-QrloHssd.js";import{reconfigureForWorkspace as o}from"./config-BS9mkd50.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-
|
|
1
|
+
import{n as e,t}from"./curated-manager-D4MOFQ-t.js";import{c as n,f as r,p as i,s as a}from"./startup-maintenance-QrloHssd.js";import{reconfigureForWorkspace as o}from"./config-BS9mkd50.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-DWTLkaFG.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
2
|
`)}}]})),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(`
|
|
3
3
|
`)}}]})),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(`
|
|
4
4
|
`)}}]})),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(`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as e,n as t,r as n,t as r}from"./server-utils-De-aZNQa.js";import{n as i,t as a}from"./startup-maintenance-QrloHssd.js";import{t as o}from"./register-tools-DLENgNAW.js";import{createLogger as s,serializeError as c,setDetailedErrorLoggingEnabled as l}from"../../core/dist/index.js";import{randomUUID as u}from"node:crypto";const d=`__pending__:`;function f(e){return e.startsWith(d)}function p(e){let t=e.headers[`mcp-session-id`];return Array.isArray(t)?t[0]:t}function m(e,t,n,r){e.status(t).json({jsonrpc:`2.0`,error:{code:n,message:r},id:null})}var h=class{options;runtimes=new Map;maxSessions;sessionTimeoutMs;now;constructor(e){this.options=e,this.maxSessions=e.maxSessions??8,this.sessionTimeoutMs=(e.sessionTimeoutMinutes??30)*60*1e3,this.now=e.now??(()=>Date.now())}hasSession(e){return this.runtimes.has(e)}getSessionCount(){return this.runtimes.size}async handleRequest(e,t,n=e.body){let r=p(e),i=r?this.runtimes.get(r):void 0;if(r&&!i){m(t,404,-32001,`Session not found`);return}if(!i){if(e.method!==`POST`){m(t,400,-32e3,`Session required`);return}if(i=await this.createRuntime(t),!i)return}await this.withRuntimeLock(i,async()=>{await i.transport.handleRequest(e,t,n),i.lastAccessAt=this.now();let r=i.transport.sessionId??i.id;e.method!==`DELETE`&&!f(r)&&this.options.onSessionActivity?.(r),e.method===`DELETE`&&!f(r)&&await this.closeSession(r,{closeTransport:!1})})}async closeExpiredSessions(){let e=[...this.runtimes.values()].filter(e=>this.now()-e.lastAccessAt>=this.sessionTimeoutMs).map(e=>e.id);for(let t of e)await this.closeSession(t);return e.length}async closeSession(e,t={}){let n=this.runtimes.get(e);return n?(this.runtimes.delete(e),t.notifySessionEnd!==!1&&!f(e)&&this.options.onSessionEnd?.(e),t.closeTransport!==!1&&await n.transport.close().catch(()=>void 0),await n.server.close().catch(()=>void 0),!0):!1}async closeAll(){let e=[...this.runtimes.keys()];for(let t of e)await this.closeSession(t)}async createRuntime(e){if(await this.closeExpiredSessions(),this.runtimes.size>=this.maxSessions){m(e,503,-32003,`Session capacity reached`);return}let t=this.now(),n=await this.options.createServer(),r={id:`${d}${u()}`,transport:void 0,createdAt:t,lastAccessAt:t,server:n,requestChain:Promise.resolve()},i=this.options.createTransport({sessionIdGenerator:()=>u(),onsessioninitialized:async e=>{this.runtimes.delete(r.id),r.id=e,this.runtimes.set(e,r),this.options.onSessionStart?.(e)},onsessionclosed:async e=>{e&&await this.closeSession(e,{closeTransport:!1})}});return r.transport=i,i.onclose=()=>{let e=r.transport.sessionId??r.id;this.closeSession(e,{closeTransport:!1})},this.runtimes.set(r.id,r),await n.connect(i),r}async withRuntimeLock(e,t){let n=e.requestChain,r;e.requestChain=new Promise(e=>{r=e}),await n;try{await t()}finally{r()}}};function g(e){let t=e.includes(`T`)?e:`${e.replace(` `,`T`)}Z`;return Date.parse(t)}var _=class{stateStore;options;gcTimer=null;constructor(e,t={}){this.stateStore=e,this.options=t}onSessionStart(e,t){this.stateStore.sessionCreate(e,t)}onSessionActivity(e){this.stateStore.sessionTouch(e)}onSessionEnd(e){this.stateStore.sessionDelete(e),Promise.resolve(this.options.onSessionEndMaintenance?.(e)).catch(()=>{})}startGC(){if(this.gcTimer)return;let e=(this.options.gcIntervalMinutes??5)*60*1e3;this.gcTimer=setInterval(()=>{this.runGC()},e),this.gcTimer.unref()}runGC(){let e=this.getStaleSessionIds();for(let t of e)this.options.onBeforeSessionDelete?.(t),Promise.resolve(this.options.onSessionEndMaintenance?.(t)).catch(()=>{}),this.stateStore.sessionDelete(t);return e.length}stop(){this.gcTimer&&=(clearInterval(this.gcTimer),null)}getActiveSessions(){return this.stateStore.sessionList().length}listSessions(){return this.stateStore.sessionList()}getStaleSessionIds(e=Date.now()){let t=(this.options.staleTimeoutMinutes??30)*60*1e3;return this.stateStore.sessionList().filter(n=>{let r=g(n.lastActivity);return Number.isFinite(r)&&e-r>=t}).map(e=>e.sessionId)}};const v=s(`server`);async function y(s,d){let[{default:f},{loadConfig:p,resolveIndexMode:m},{registerDashboardRoutes:g,resolveDashboardDir:y},{registerSettingsRoutes:b,resolveSettingsDir:x},{createSettingsRouter:S},{authMiddleware:C,getOrCreateToken:w}]=await Promise.all([import(`express`),import(`./config-BS9mkd50.js`),import(`./dashboard-static-q97RHnd3.js`),import(`./settings-static-HY0egyKG.js`),import(`./routes-DsSm9ea0.js`),import(`./auth-7LFAZQBu.js`).then(e=>e.t)]),T=p();l(T.logging?.errorDetails===!0),T.configError&&v.warn(`Config load failure`,{error:T.configError}),v.info(`Config loaded`,{sourceCount:T.sources.length,storePath:T.store.path});let E=f();E.use(f.json({limit:`1mb`}));let D=Number(d),O=`http://localhost:${D}`,k=process.env.AIKIT_CORS_ORIGIN??O,A=process.env.AIKIT_ALLOW_ANY_ORIGIN===`true`,j=n(`AIKIT_HTTP_MAX_SESSIONS`,8),M=n(`AIKIT_HTTP_SESSION_TIMEOUT_MINUTES`,30),N=n(`AIKIT_HTTP_SESSION_GC_INTERVAL_MINUTES`,5),P=r({limit:100,windowMs:6e4}),F=!1;E.use((t,n,r)=>{let i=Array.isArray(t.headers.origin)?t.headers.origin[0]:t.headers.origin,a=e({requestOrigin:i,configuredOrigin:k,allowAnyOrigin:A,fallbackOrigin:O});if(a.warn&&!F&&(F=!0,v.warn(`Rejected non-local CORS origin while AIKIT_CORS_ORIGIN=*`,{origin:i,allowAnyOriginEnv:`AIKIT_ALLOW_ANY_ORIGIN=true`})),i&&!a.allowOrigin){n.status(403).json({error:`Origin not allowed`});return}if(a.allowOrigin&&n.setHeader(`Access-Control-Allow-Origin`,a.allowOrigin),n.setHeader(`Access-Control-Allow-Methods`,`GET, POST, PUT, PATCH, DELETE, OPTIONS`),n.setHeader(`Access-Control-Allow-Headers`,`Content-Type, Authorization, Mcp-Session-Id, Mcp-Protocol-Version, Last-Event-ID`),n.setHeader(`Access-Control-Expose-Headers`,`Mcp-Session-Id`),t.method===`OPTIONS`){n.status(204).end();return}r()});let I=w();E.use(C(I)),E.use(`/mcp`,(e,n,r)=>{let i=t(e)??e.ip??e.socket.remoteAddress??`anonymous`;if(P.allow(i)){r();return}let a=Math.max(1,Math.ceil(P.getRetryAfterMs(i)/1e3));n.setHeader(`Retry-After`,String(a)),n.status(429).json({jsonrpc:`2.0`,error:{code:-32003,message:`Rate limit exceeded`},id:null})});let L;E.use(`/mcp`,(e,t,n)=>{if(!L){let t=e.headers[`x-workspace-root`];typeof t==`string`&&t.length>0&&(L=t,v.debug(`Captured workspace root from proxy header`,{wsRoot:t}))}n()}),g(E,y(),v);let R=new Date().toISOString();E.use(`/settings/api`,S({log:v,mcpInfo:()=>({transport:`http`,port:D,pid:process.pid,startedAt:R})})),b(E,x(),v),E.get(`/health`,(e,t)=>{t.json({status:`ok`})});let z=!1,B=null,V=null,H=null,U=null,W=null,G=null,K=null,q=null,J=Promise.resolve(),Y=async(e,n)=>{if(!z||!H||!U){n.status(503).json({jsonrpc:`2.0`,error:{code:-32603,message:`Server initializing — please retry in a few seconds`},id:null});return}let r=J,i;J=new Promise(e=>{i=e});let a={POST:6e4,GET:1e4,DELETE:1e4}[e.method]??3e4;if(!await Promise.race([r.then(()=>!0),new Promise(t=>{let n=setTimeout(()=>{v.warn(`mcpLock timed out waiting for previous request, resetting lock chain`,{method:e.method,timeoutMs:a}),t(!1)},a);n.unref&&n.unref()})])&&(J=Promise.resolve(),i=()=>{},G)){let e=G;G=null,K=null,e.close().catch(()=>{})}try{let r=t(e);if(!G){if(r){n.status(404).json({jsonrpc:`2.0`,error:{code:-32001,message:`Session not found`},id:null});return}let e=new U({sessionIdGenerator:()=>u(),onsessioninitialized:async e=>{K=e,V?.onSessionStart(e,{transport:`http`})},onsessionclosed:async e=>{e&&V?.onSessionEnd(e),K=null}});e.onclose=()=>{G===e&&(G=null),K===e.sessionId&&(K=null)},G=e,await H.connect(e)}let i=G;await i.handleRequest(e,n,e.body),e.method!==`DELETE`&&(!r&&i.sessionId?(K=i.sessionId,V?.onSessionStart(i.sessionId,{transport:`http`}),V?.onSessionActivity(i.sessionId)):r&&V?.onSessionActivity(r))}catch(e){if(v.error(`MCP handler error`,c(e)),!n.headersSent){let t=e instanceof Error?e.message:String(e),r=t.includes(`Not Acceptable`);n.status(r?406:500).json({jsonrpc:`2.0`,error:{code:r?-32e3:-32603,message:r?t:`Internal server error`},id:null})}}finally{i()}},X=async(e,n)=>{let r=t(e);if(W&&(!G||r!==K)){await W.handleRequest(e,n,e.body);return}await Y(e,n)};E.post(`/mcp`,X),E.get(`/mcp`,X),E.delete(`/mcp`,X);let Z=E.listen(D,`127.0.0.1`,()=>{v.info(`MCP server listening`,{url:`http://127.0.0.1:${D}/mcp`,port:D}),setTimeout(async()=>{try{typeof L==`string`&&L.length>0&&(T.sources[0]={path:L,excludePatterns:T.sources[0]?.excludePatterns??[]},T.allRoots=[L],v.debug(`Workspace root applied from proxy header`,{wsRoot:L}));let[{createLazyServer:e,createMcpServer:t,ALL_TOOL_NAMES:n},{StreamableHTTPServerTransport:r},{checkForUpdates:o,autoUpgradeScaffold:l}]=await Promise.all([import(`./server-BmxvSBgJ.js`),import(`@modelcontextprotocol/sdk/server/streamableHttp.js`),import(`./startup-maintenance-QrloHssd.js`).then(e=>e.u)]);o(),l(),setInterval(o,1440*60*1e3).unref();let u=!1,d=m(T),f=e(T,d);q=async()=>{f.aikit&&await Promise.all([f.aikit.embedder.shutdown?.().catch(()=>{})??Promise.resolve(),f.aikit.graphStore.close().catch(()=>{}),f.aikit.closeStateStore?.().catch(()=>{})??Promise.resolve(),f.aikit.store.close().catch(()=>{})])},H=f.server,U=r,z=!0,v.debug(`MCP server configured (lazy — AI Kit initializing in background)`,{toolCount:n.length,resourceCount:2}),f.startInit(),f.ready.then(async()=>{try{if(!f.aikit)throw Error(`AI Kit components are not available after initialization`);V=new _(f.aikit.stateStore,{staleTimeoutMinutes:M,gcIntervalMinutes:N,onBeforeSessionDelete:e=>{if(K===e&&G){let e=G;G=null,K=null,e.close().catch(()=>void 0)}W?.closeSession(e,{notifySessionEnd:!1})},onSessionEndMaintenance:async()=>{if(!f.aikit?.curated||!f.aikit?.stateStore)return;let{pruneLessons:e}=await import(`./startup-maintenance-QrloHssd.js`).then(e=>e.x),t=await e(f.aikit.curated,f.aikit.stateStore,{dryRun:!1});t.pruned.length>0&&v.info(`Session-end lesson prune`,{pruned:t.pruned.length})}}),W=new h({createServer:()=>{if(!f.aikit)throw Error(`AI Kit components are not available after initialization`);return t(f.aikit,T)},createTransport:e=>new r(e),maxSessions:j,sessionTimeoutMinutes:M,onSessionStart:e=>V?.onSessionStart(e,{transport:`http`}),onSessionActivity:e=>V?.onSessionActivity(e),onSessionEnd:e=>V?.onSessionEnd(e)}),V.startGC(),K&&(V.onSessionStart(K,{transport:`http`}),V.onSessionActivity(K)),v.info(`HTTP session runtime ready`,{maxSessions:j,sessionTimeoutMinutes:M,gcIntervalMinutes:N})}catch(e){v.error(`Failed to start session manager`,c(e)),z=!1,u=!0,H=null,U=null,q=null}}),d===`auto`?f.ready.then(async()=>{try{let e=T.sources.map(e=>e.path).join(`, `);v.info(`Running initial index`,{sourcePaths:e}),await f.runInitialIndex(),v.info(`Initial index complete`)}catch(e){v.error(`Initial index failed; will retry on aikit_reindex`,i(s,e))}}):d===`smart`?u||f.ready.then(async()=>{try{if(!f.aikit)throw Error(`AI Kit components are not available after initialization`);let{SmartIndexScheduler:e}=await import(`../../indexer/dist/index.js`),t=new e(f.aikit.indexer,T,f.aikit.store),n=f.aikit.store;B=t,t.start(),n.onBeforeClose&&n.onBeforeClose(()=>t.stop()),f.setSmartScheduler(t),v.debug(`Smart index scheduler started (HTTP mode)`)}catch(e){v.error(`Failed to start smart index scheduler`,i(s,e))}}):v.info(`Initial full indexing skipped in HTTP mode`,{indexMode:d}),f.ready.catch(e=>{v.error(`AI Kit initialization failed`,i(s,e)),z=!1,u=!0,H=null,U=null,q=null}),a(f.ready,()=>f.aikit?{curated:f.aikit.curated,stateStore:f.aikit.stateStore}:null,s)}catch(e){v.error(`Failed to load server modules`,i(s,e)),z=!1,q=null}},100)}),Q=!1,$=async e=>{Q||(Q=!0,v.info(`Shutdown signal received`,{signal:e}),o(),B?.stop(),V?.stop(),await import(`../../tools/dist/index.js`).then(({processStopAll:e})=>e()).catch(()=>{}),await W?.closeAll().catch(()=>void 0),K&&V?.onSessionEnd(K),G&&(await G.close().catch(()=>void 0),G=null,K=null),Z.close(),H&&await H.close(),await q?.().catch(()=>void 0),process.exit(0))};process.on(`SIGINT`,()=>$(`SIGINT`)),process.on(`SIGTERM`,()=>$(`SIGTERM`))}export{y as startHttpMode};
|
|
1
|
+
import{a as e,n as t,r as n,t as r}from"./server-utils-De-aZNQa.js";import{n as i,t as a}from"./startup-maintenance-QrloHssd.js";import{t as o}from"./register-tools-DWTLkaFG.js";import{createLogger as s,serializeError as c,setDetailedErrorLoggingEnabled as l}from"../../core/dist/index.js";import{randomUUID as u}from"node:crypto";const d=`__pending__:`;function f(e){return e.startsWith(d)}function p(e){let t=e.headers[`mcp-session-id`];return Array.isArray(t)?t[0]:t}function m(e,t,n,r){e.status(t).json({jsonrpc:`2.0`,error:{code:n,message:r},id:null})}var h=class{options;runtimes=new Map;maxSessions;sessionTimeoutMs;now;constructor(e){this.options=e,this.maxSessions=e.maxSessions??8,this.sessionTimeoutMs=(e.sessionTimeoutMinutes??30)*60*1e3,this.now=e.now??(()=>Date.now())}hasSession(e){return this.runtimes.has(e)}getSessionCount(){return this.runtimes.size}async handleRequest(e,t,n=e.body){let r=p(e),i=r?this.runtimes.get(r):void 0;if(r&&!i){m(t,404,-32001,`Session not found`);return}if(!i){if(e.method!==`POST`){m(t,400,-32e3,`Session required`);return}if(i=await this.createRuntime(t),!i)return}await this.withRuntimeLock(i,async()=>{await i.transport.handleRequest(e,t,n),i.lastAccessAt=this.now();let r=i.transport.sessionId??i.id;e.method!==`DELETE`&&!f(r)&&this.options.onSessionActivity?.(r),e.method===`DELETE`&&!f(r)&&await this.closeSession(r,{closeTransport:!1})})}async closeExpiredSessions(){let e=[...this.runtimes.values()].filter(e=>this.now()-e.lastAccessAt>=this.sessionTimeoutMs).map(e=>e.id);for(let t of e)await this.closeSession(t);return e.length}async closeSession(e,t={}){let n=this.runtimes.get(e);return n?(this.runtimes.delete(e),t.notifySessionEnd!==!1&&!f(e)&&this.options.onSessionEnd?.(e),t.closeTransport!==!1&&await n.transport.close().catch(()=>void 0),await n.server.close().catch(()=>void 0),!0):!1}async closeAll(){let e=[...this.runtimes.keys()];for(let t of e)await this.closeSession(t)}async createRuntime(e){if(await this.closeExpiredSessions(),this.runtimes.size>=this.maxSessions){m(e,503,-32003,`Session capacity reached`);return}let t=this.now(),n=await this.options.createServer(),r={id:`${d}${u()}`,transport:void 0,createdAt:t,lastAccessAt:t,server:n,requestChain:Promise.resolve()},i=this.options.createTransport({sessionIdGenerator:()=>u(),onsessioninitialized:async e=>{this.runtimes.delete(r.id),r.id=e,this.runtimes.set(e,r),this.options.onSessionStart?.(e)},onsessionclosed:async e=>{e&&await this.closeSession(e,{closeTransport:!1})}});return r.transport=i,i.onclose=()=>{let e=r.transport.sessionId??r.id;this.closeSession(e,{closeTransport:!1})},this.runtimes.set(r.id,r),await n.connect(i),r}async withRuntimeLock(e,t){let n=e.requestChain,r;e.requestChain=new Promise(e=>{r=e}),await n;try{await t()}finally{r()}}};function g(e){let t=e.includes(`T`)?e:`${e.replace(` `,`T`)}Z`;return Date.parse(t)}var _=class{stateStore;options;gcTimer=null;constructor(e,t={}){this.stateStore=e,this.options=t}onSessionStart(e,t){this.stateStore.sessionCreate(e,t)}onSessionActivity(e){this.stateStore.sessionTouch(e)}onSessionEnd(e){this.stateStore.sessionDelete(e),Promise.resolve(this.options.onSessionEndMaintenance?.(e)).catch(()=>{})}startGC(){if(this.gcTimer)return;let e=(this.options.gcIntervalMinutes??5)*60*1e3;this.gcTimer=setInterval(()=>{this.runGC()},e),this.gcTimer.unref()}runGC(){let e=this.getStaleSessionIds();for(let t of e)this.options.onBeforeSessionDelete?.(t),Promise.resolve(this.options.onSessionEndMaintenance?.(t)).catch(()=>{}),this.stateStore.sessionDelete(t);return e.length}stop(){this.gcTimer&&=(clearInterval(this.gcTimer),null)}getActiveSessions(){return this.stateStore.sessionList().length}listSessions(){return this.stateStore.sessionList()}getStaleSessionIds(e=Date.now()){let t=(this.options.staleTimeoutMinutes??30)*60*1e3;return this.stateStore.sessionList().filter(n=>{let r=g(n.lastActivity);return Number.isFinite(r)&&e-r>=t}).map(e=>e.sessionId)}};const v=s(`server`);async function y(s,d){let[{default:f},{loadConfig:p,resolveIndexMode:m},{registerDashboardRoutes:g,resolveDashboardDir:y},{registerSettingsRoutes:b,resolveSettingsDir:x},{createSettingsRouter:S},{authMiddleware:C,getOrCreateToken:w}]=await Promise.all([import(`express`),import(`./config-BS9mkd50.js`),import(`./dashboard-static-q97RHnd3.js`),import(`./settings-static-HY0egyKG.js`),import(`./routes-DsSm9ea0.js`),import(`./auth-7LFAZQBu.js`).then(e=>e.t)]),T=p();l(T.logging?.errorDetails===!0),T.configError&&v.warn(`Config load failure`,{error:T.configError}),v.info(`Config loaded`,{sourceCount:T.sources.length,storePath:T.store.path});let E=f();E.use(f.json({limit:`1mb`}));let D=Number(d),O=`http://localhost:${D}`,k=process.env.AIKIT_CORS_ORIGIN??O,A=process.env.AIKIT_ALLOW_ANY_ORIGIN===`true`,j=n(`AIKIT_HTTP_MAX_SESSIONS`,8),M=n(`AIKIT_HTTP_SESSION_TIMEOUT_MINUTES`,30),N=n(`AIKIT_HTTP_SESSION_GC_INTERVAL_MINUTES`,5),P=r({limit:100,windowMs:6e4}),F=!1;E.use((t,n,r)=>{let i=Array.isArray(t.headers.origin)?t.headers.origin[0]:t.headers.origin,a=e({requestOrigin:i,configuredOrigin:k,allowAnyOrigin:A,fallbackOrigin:O});if(a.warn&&!F&&(F=!0,v.warn(`Rejected non-local CORS origin while AIKIT_CORS_ORIGIN=*`,{origin:i,allowAnyOriginEnv:`AIKIT_ALLOW_ANY_ORIGIN=true`})),i&&!a.allowOrigin){n.status(403).json({error:`Origin not allowed`});return}if(a.allowOrigin&&n.setHeader(`Access-Control-Allow-Origin`,a.allowOrigin),n.setHeader(`Access-Control-Allow-Methods`,`GET, POST, PUT, PATCH, DELETE, OPTIONS`),n.setHeader(`Access-Control-Allow-Headers`,`Content-Type, Authorization, Mcp-Session-Id, Mcp-Protocol-Version, Last-Event-ID`),n.setHeader(`Access-Control-Expose-Headers`,`Mcp-Session-Id`),t.method===`OPTIONS`){n.status(204).end();return}r()});let I=w();E.use(C(I)),E.use(`/mcp`,(e,n,r)=>{let i=t(e)??e.ip??e.socket.remoteAddress??`anonymous`;if(P.allow(i)){r();return}let a=Math.max(1,Math.ceil(P.getRetryAfterMs(i)/1e3));n.setHeader(`Retry-After`,String(a)),n.status(429).json({jsonrpc:`2.0`,error:{code:-32003,message:`Rate limit exceeded`},id:null})});let L;E.use(`/mcp`,(e,t,n)=>{if(!L){let t=e.headers[`x-workspace-root`];typeof t==`string`&&t.length>0&&(L=t,v.debug(`Captured workspace root from proxy header`,{wsRoot:t}))}n()}),g(E,y(),v);let R=new Date().toISOString();E.use(`/settings/api`,S({log:v,mcpInfo:()=>({transport:`http`,port:D,pid:process.pid,startedAt:R})})),b(E,x(),v),E.get(`/health`,(e,t)=>{t.json({status:`ok`})});let z=!1,B=null,V=null,H=null,U=null,W=null,G=null,K=null,q=null,J=Promise.resolve(),Y=async(e,n)=>{if(!z||!H||!U){n.status(503).json({jsonrpc:`2.0`,error:{code:-32603,message:`Server initializing — please retry in a few seconds`},id:null});return}let r=J,i;J=new Promise(e=>{i=e});let a={POST:6e4,GET:1e4,DELETE:1e4}[e.method]??3e4;if(!await Promise.race([r.then(()=>!0),new Promise(t=>{let n=setTimeout(()=>{v.warn(`mcpLock timed out waiting for previous request, resetting lock chain`,{method:e.method,timeoutMs:a}),t(!1)},a);n.unref&&n.unref()})])&&(J=Promise.resolve(),i=()=>{},G)){let e=G;G=null,K=null,e.close().catch(()=>{})}try{let r=t(e);if(!G){if(r){n.status(404).json({jsonrpc:`2.0`,error:{code:-32001,message:`Session not found`},id:null});return}let e=new U({sessionIdGenerator:()=>u(),onsessioninitialized:async e=>{K=e,V?.onSessionStart(e,{transport:`http`})},onsessionclosed:async e=>{e&&V?.onSessionEnd(e),K=null}});e.onclose=()=>{G===e&&(G=null),K===e.sessionId&&(K=null)},G=e,await H.connect(e)}let i=G;await i.handleRequest(e,n,e.body),e.method!==`DELETE`&&(!r&&i.sessionId?(K=i.sessionId,V?.onSessionStart(i.sessionId,{transport:`http`}),V?.onSessionActivity(i.sessionId)):r&&V?.onSessionActivity(r))}catch(e){if(v.error(`MCP handler error`,c(e)),!n.headersSent){let t=e instanceof Error?e.message:String(e),r=t.includes(`Not Acceptable`);n.status(r?406:500).json({jsonrpc:`2.0`,error:{code:r?-32e3:-32603,message:r?t:`Internal server error`},id:null})}}finally{i()}},X=async(e,n)=>{let r=t(e);if(W&&(!G||r!==K)){await W.handleRequest(e,n,e.body);return}await Y(e,n)};E.post(`/mcp`,X),E.get(`/mcp`,X),E.delete(`/mcp`,X);let Z=E.listen(D,`127.0.0.1`,()=>{v.info(`MCP server listening`,{url:`http://127.0.0.1:${D}/mcp`,port:D}),setTimeout(async()=>{try{typeof L==`string`&&L.length>0&&(T.sources[0]={path:L,excludePatterns:T.sources[0]?.excludePatterns??[]},T.allRoots=[L],v.debug(`Workspace root applied from proxy header`,{wsRoot:L}));let[{createLazyServer:e,createMcpServer:t,ALL_TOOL_NAMES:n},{StreamableHTTPServerTransport:r},{checkForUpdates:o,autoUpgradeScaffold:l}]=await Promise.all([import(`./server-by4LpJpg.js`),import(`@modelcontextprotocol/sdk/server/streamableHttp.js`),import(`./startup-maintenance-QrloHssd.js`).then(e=>e.u)]);o(),l(),setInterval(o,1440*60*1e3).unref();let u=!1,d=m(T),f=e(T,d);q=async()=>{f.aikit&&await Promise.all([f.aikit.embedder.shutdown?.().catch(()=>{})??Promise.resolve(),f.aikit.graphStore.close().catch(()=>{}),f.aikit.closeStateStore?.().catch(()=>{})??Promise.resolve(),f.aikit.store.close().catch(()=>{})])},H=f.server,U=r,z=!0,v.debug(`MCP server configured (lazy — AI Kit initializing in background)`,{toolCount:n.length,resourceCount:2}),f.startInit(),f.ready.then(async()=>{try{if(!f.aikit)throw Error(`AI Kit components are not available after initialization`);V=new _(f.aikit.stateStore,{staleTimeoutMinutes:M,gcIntervalMinutes:N,onBeforeSessionDelete:e=>{if(K===e&&G){let e=G;G=null,K=null,e.close().catch(()=>void 0)}W?.closeSession(e,{notifySessionEnd:!1})},onSessionEndMaintenance:async()=>{if(!f.aikit?.curated||!f.aikit?.stateStore)return;let{pruneLessons:e}=await import(`./startup-maintenance-QrloHssd.js`).then(e=>e.x),t=await e(f.aikit.curated,f.aikit.stateStore,{dryRun:!1});t.pruned.length>0&&v.info(`Session-end lesson prune`,{pruned:t.pruned.length})}}),W=new h({createServer:()=>{if(!f.aikit)throw Error(`AI Kit components are not available after initialization`);return t(f.aikit,T)},createTransport:e=>new r(e),maxSessions:j,sessionTimeoutMinutes:M,onSessionStart:e=>V?.onSessionStart(e,{transport:`http`}),onSessionActivity:e=>V?.onSessionActivity(e),onSessionEnd:e=>V?.onSessionEnd(e)}),V.startGC(),K&&(V.onSessionStart(K,{transport:`http`}),V.onSessionActivity(K)),v.info(`HTTP session runtime ready`,{maxSessions:j,sessionTimeoutMinutes:M,gcIntervalMinutes:N})}catch(e){v.error(`Failed to start session manager`,c(e)),z=!1,u=!0,H=null,U=null,q=null}}),d===`auto`?f.ready.then(async()=>{try{let e=T.sources.map(e=>e.path).join(`, `);v.info(`Running initial index`,{sourcePaths:e}),await f.runInitialIndex(),v.info(`Initial index complete`)}catch(e){v.error(`Initial index failed; will retry on aikit_reindex`,i(s,e))}}):d===`smart`?u||f.ready.then(async()=>{try{if(!f.aikit)throw Error(`AI Kit components are not available after initialization`);let{SmartIndexScheduler:e}=await import(`../../indexer/dist/index.js`),t=new e(f.aikit.indexer,T,f.aikit.store),n=f.aikit.store;B=t,t.start(),n.onBeforeClose&&n.onBeforeClose(()=>t.stop()),f.setSmartScheduler(t),v.debug(`Smart index scheduler started (HTTP mode)`)}catch(e){v.error(`Failed to start smart index scheduler`,i(s,e))}}):v.info(`Initial full indexing skipped in HTTP mode`,{indexMode:d}),f.ready.catch(e=>{v.error(`AI Kit initialization failed`,i(s,e)),z=!1,u=!0,H=null,U=null,q=null}),a(f.ready,()=>f.aikit?{curated:f.aikit.curated,stateStore:f.aikit.stateStore}:null,s)}catch(e){v.error(`Failed to load server modules`,i(s,e)),z=!1,q=null}},100)}),Q=!1,$=async e=>{Q||(Q=!0,v.info(`Shutdown signal received`,{signal:e}),o(),B?.stop(),V?.stop(),await import(`../../tools/dist/index.js`).then(({processStopAll:e})=>e()).catch(()=>{}),await W?.closeAll().catch(()=>void 0),K&&V?.onSessionEnd(K),G&&(await G.close().catch(()=>void 0),G=null,K=null),Z.close(),H&&await H.close(),await q?.().catch(()=>void 0),process.exit(0))};process.on(`SIGINT`,()=>$(`SIGINT`)),process.on(`SIGTERM`,()=>$(`SIGTERM`))}export{y as startHttpMode};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{n as e,t}from"./startup-maintenance-D7tKqECM.js";import{a as n,i as r,o as i,s as a}from"./bin.js";import{t as o}from"./register-tools-B8PeQx0Y.js";import{createLogger as s,serializeError as c,setDetailedErrorLoggingEnabled as l}from"../../core/dist/index.js";import{randomUUID as u}from"node:crypto";const d=`__pending__:`;function f(e){return e.startsWith(d)}function p(e){let t=e.headers[`mcp-session-id`];return Array.isArray(t)?t[0]:t}function m(e,t,n,r){e.status(t).json({jsonrpc:`2.0`,error:{code:n,message:r},id:null})}var h=class{options;runtimes=new Map;maxSessions;sessionTimeoutMs;now;constructor(e){this.options=e,this.maxSessions=e.maxSessions??8,this.sessionTimeoutMs=(e.sessionTimeoutMinutes??30)*60*1e3,this.now=e.now??(()=>Date.now())}hasSession(e){return this.runtimes.has(e)}getSessionCount(){return this.runtimes.size}async handleRequest(e,t,n=e.body){let r=p(e),i=r?this.runtimes.get(r):void 0;if(r&&!i){m(t,404,-32001,`Session not found`);return}if(!i){if(e.method!==`POST`){m(t,400,-32e3,`Session required`);return}if(i=await this.createRuntime(t),!i)return}await this.withRuntimeLock(i,async()=>{await i.transport.handleRequest(e,t,n),i.lastAccessAt=this.now();let r=i.transport.sessionId??i.id;e.method!==`DELETE`&&!f(r)&&this.options.onSessionActivity?.(r),e.method===`DELETE`&&!f(r)&&await this.closeSession(r,{closeTransport:!1})})}async closeExpiredSessions(){let e=[...this.runtimes.values()].filter(e=>this.now()-e.lastAccessAt>=this.sessionTimeoutMs).map(e=>e.id);for(let t of e)await this.closeSession(t);return e.length}async closeSession(e,t={}){let n=this.runtimes.get(e);return n?(this.runtimes.delete(e),t.notifySessionEnd!==!1&&!f(e)&&this.options.onSessionEnd?.(e),t.closeTransport!==!1&&await n.transport.close().catch(()=>void 0),await n.server.close().catch(()=>void 0),!0):!1}async closeAll(){let e=[...this.runtimes.keys()];for(let t of e)await this.closeSession(t)}async createRuntime(e){if(await this.closeExpiredSessions(),this.runtimes.size>=this.maxSessions){m(e,503,-32003,`Session capacity reached`);return}let t=this.now(),n=await this.options.createServer(),r={id:`${d}${u()}`,transport:void 0,createdAt:t,lastAccessAt:t,server:n,requestChain:Promise.resolve()},i=this.options.createTransport({sessionIdGenerator:()=>u(),onsessioninitialized:async e=>{this.runtimes.delete(r.id),r.id=e,this.runtimes.set(e,r),this.options.onSessionStart?.(e)},onsessionclosed:async e=>{e&&await this.closeSession(e,{closeTransport:!1})}});return r.transport=i,i.onclose=()=>{let e=r.transport.sessionId??r.id;this.closeSession(e,{closeTransport:!1})},this.runtimes.set(r.id,r),await n.connect(i),r}async withRuntimeLock(e,t){let n=e.requestChain,r;e.requestChain=new Promise(e=>{r=e}),await n;try{await t()}finally{r()}}};function g(e){let t=e.includes(`T`)?e:`${e.replace(` `,`T`)}Z`;return Date.parse(t)}var _=class{stateStore;options;gcTimer=null;constructor(e,t={}){this.stateStore=e,this.options=t}onSessionStart(e,t){this.stateStore.sessionCreate(e,t)}onSessionActivity(e){this.stateStore.sessionTouch(e)}onSessionEnd(e){this.stateStore.sessionDelete(e),Promise.resolve(this.options.onSessionEndMaintenance?.(e)).catch(()=>{})}startGC(){if(this.gcTimer)return;let e=(this.options.gcIntervalMinutes??5)*60*1e3;this.gcTimer=setInterval(()=>{this.runGC()},e),this.gcTimer.unref()}runGC(){let e=this.getStaleSessionIds();for(let t of e)this.options.onBeforeSessionDelete?.(t),Promise.resolve(this.options.onSessionEndMaintenance?.(t)).catch(()=>{}),this.stateStore.sessionDelete(t);return e.length}stop(){this.gcTimer&&=(clearInterval(this.gcTimer),null)}getActiveSessions(){return this.stateStore.sessionList().length}listSessions(){return this.stateStore.sessionList()}getStaleSessionIds(e=Date.now()){let t=(this.options.staleTimeoutMinutes??30)*60*1e3;return this.stateStore.sessionList().filter(n=>{let r=g(n.lastActivity);return Number.isFinite(r)&&e-r>=t}).map(e=>e.sessionId)}};const v=s(`server`);async function y(s,d){let[{default:f},{loadConfig:p,resolveIndexMode:m},{registerDashboardRoutes:g,resolveDashboardDir:y},{registerSettingsRoutes:b,resolveSettingsDir:x},{createSettingsRouter:S},{authMiddleware:C,getOrCreateToken:w}]=await Promise.all([import(`express`),import(`./config-CkXCQx7E.js`),import(`./dashboard-static-CVRj5Cbv.js`),import(`./settings-static-VnUkp9iU.js`),import(`./routes-Ct7q5jrL.js`),import(`./auth-bEP-6uqy.js`)]),T=p();l(T.logging?.errorDetails===!0),T.configError&&v.warn(`Config load failure`,{error:T.configError}),v.info(`Config loaded`,{sourceCount:T.sources.length,storePath:T.store.path});let E=f();E.use(f.json({limit:`1mb`}));let D=Number(d),O=`http://localhost:${D}`,k=process.env.AIKIT_CORS_ORIGIN??O,A=process.env.AIKIT_ALLOW_ANY_ORIGIN===`true`,j=i(`AIKIT_HTTP_MAX_SESSIONS`,8),M=i(`AIKIT_HTTP_SESSION_TIMEOUT_MINUTES`,30),N=i(`AIKIT_HTTP_SESSION_GC_INTERVAL_MINUTES`,5),P=r({limit:100,windowMs:6e4}),F=!1;E.use((e,t,n)=>{let r=Array.isArray(e.headers.origin)?e.headers.origin[0]:e.headers.origin,i=a({requestOrigin:r,configuredOrigin:k,allowAnyOrigin:A,fallbackOrigin:O});if(i.warn&&!F&&(F=!0,v.warn(`Rejected non-local CORS origin while AIKIT_CORS_ORIGIN=*`,{origin:r,allowAnyOriginEnv:`AIKIT_ALLOW_ANY_ORIGIN=true`})),r&&!i.allowOrigin){t.status(403).json({error:`Origin not allowed`});return}if(i.allowOrigin&&t.setHeader(`Access-Control-Allow-Origin`,i.allowOrigin),t.setHeader(`Access-Control-Allow-Methods`,`GET, POST, PUT, PATCH, DELETE, OPTIONS`),t.setHeader(`Access-Control-Allow-Headers`,`Content-Type, Authorization, Mcp-Session-Id, Mcp-Protocol-Version, Last-Event-ID`),t.setHeader(`Access-Control-Expose-Headers`,`Mcp-Session-Id`),e.method===`OPTIONS`){t.status(204).end();return}n()});let I=w();E.use(C(I)),E.use(`/mcp`,(e,t,r)=>{let i=n(e)??e.ip??e.socket.remoteAddress??`anonymous`;if(P.allow(i)){r();return}let a=Math.max(1,Math.ceil(P.getRetryAfterMs(i)/1e3));t.setHeader(`Retry-After`,String(a)),t.status(429).json({jsonrpc:`2.0`,error:{code:-32003,message:`Rate limit exceeded`},id:null})});let L;E.use(`/mcp`,(e,t,n)=>{if(!L){let t=e.headers[`x-workspace-root`];typeof t==`string`&&t.length>0&&(L=t,v.debug(`Captured workspace root from proxy header`,{wsRoot:t}))}n()}),g(E,y(),v);let R=new Date().toISOString();E.use(`/settings/api`,S({log:v,mcpInfo:()=>({transport:`http`,port:D,pid:process.pid,startedAt:R})})),b(E,x(),v),E.get(`/health`,(e,t)=>{t.json({status:`ok`})});let z=!1,B=null,V=null,H=null,U=null,W=null,G=null,K=null,q=null,J=Promise.resolve(),Y=async(e,t)=>{if(!z||!H||!U){t.status(503).json({jsonrpc:`2.0`,error:{code:-32603,message:`Server initializing — please retry in a few seconds`},id:null});return}let r=J,i;J=new Promise(e=>{i=e});let a={POST:6e4,GET:1e4,DELETE:1e4}[e.method]??3e4;if(!await Promise.race([r.then(()=>!0),new Promise(t=>{let n=setTimeout(()=>{v.warn(`mcpLock timed out waiting for previous request, resetting lock chain`,{method:e.method,timeoutMs:a}),t(!1)},a);n.unref&&n.unref()})])&&(J=Promise.resolve(),i=()=>{},G)){let e=G;G=null,K=null,e.close().catch(()=>{})}try{let r=n(e);if(!G){if(r){t.status(404).json({jsonrpc:`2.0`,error:{code:-32001,message:`Session not found`},id:null});return}let e=new U({sessionIdGenerator:()=>u(),onsessioninitialized:async e=>{K=e,V?.onSessionStart(e,{transport:`http`})},onsessionclosed:async e=>{e&&V?.onSessionEnd(e),K=null}});e.onclose=()=>{G===e&&(G=null),K===e.sessionId&&(K=null)},G=e,await H.connect(e)}let i=G;await i.handleRequest(e,t,e.body),e.method!==`DELETE`&&(!r&&i.sessionId?(K=i.sessionId,V?.onSessionStart(i.sessionId,{transport:`http`}),V?.onSessionActivity(i.sessionId)):r&&V?.onSessionActivity(r))}catch(e){if(v.error(`MCP handler error`,c(e)),!t.headersSent){let n=e instanceof Error?e.message:String(e),r=n.includes(`Not Acceptable`);t.status(r?406:500).json({jsonrpc:`2.0`,error:{code:r?-32e3:-32603,message:r?n:`Internal server error`},id:null})}}finally{i()}},X=async(e,t)=>{let r=n(e);if(W&&(!G||r!==K)){await W.handleRequest(e,t,e.body);return}await Y(e,t)};E.post(`/mcp`,X),E.get(`/mcp`,X),E.delete(`/mcp`,X);let Z=E.listen(D,`127.0.0.1`,()=>{v.info(`MCP server listening`,{url:`http://127.0.0.1:${D}/mcp`,port:D}),setTimeout(async()=>{try{typeof L==`string`&&L.length>0&&(T.sources[0]={path:L,excludePatterns:T.sources[0]?.excludePatterns??[]},T.allRoots=[L],v.debug(`Workspace root applied from proxy header`,{wsRoot:L}));let[{createLazyServer:n,createMcpServer:r,ALL_TOOL_NAMES:i},{StreamableHTTPServerTransport:a},{checkForUpdates:o,autoUpgradeScaffold:l}]=await Promise.all([import(`./server-Ba2YVf_M.js`),import(`@modelcontextprotocol/sdk/server/streamableHttp.js`),import(`./startup-maintenance-D7tKqECM.js`).then(e=>e.u)]);o(),l(),setInterval(o,1440*60*1e3).unref();let u=!1,d=m(T),f=n(T,d);q=async()=>{f.aikit&&await Promise.all([f.aikit.embedder.shutdown?.().catch(()=>{})??Promise.resolve(),f.aikit.graphStore.close().catch(()=>{}),f.aikit.closeStateStore?.().catch(()=>{})??Promise.resolve(),f.aikit.store.close().catch(()=>{})])},H=f.server,U=a,z=!0,v.debug(`MCP server configured (lazy — AI Kit initializing in background)`,{toolCount:i.length,resourceCount:2}),f.startInit(),f.ready.then(async()=>{try{if(!f.aikit)throw Error(`AI Kit components are not available after initialization`);V=new _(f.aikit.stateStore,{staleTimeoutMinutes:M,gcIntervalMinutes:N,onBeforeSessionDelete:e=>{if(K===e&&G){let e=G;G=null,K=null,e.close().catch(()=>void 0)}W?.closeSession(e,{notifySessionEnd:!1})},onSessionEndMaintenance:async()=>{if(!f.aikit?.curated||!f.aikit?.stateStore)return;let{pruneLessons:e}=await import(`./startup-maintenance-D7tKqECM.js`).then(e=>e.x),t=await e(f.aikit.curated,f.aikit.stateStore,{dryRun:!1});t.pruned.length>0&&v.info(`Session-end lesson prune`,{pruned:t.pruned.length})}}),W=new h({createServer:()=>{if(!f.aikit)throw Error(`AI Kit components are not available after initialization`);return r(f.aikit,T)},createTransport:e=>new a(e),maxSessions:j,sessionTimeoutMinutes:M,onSessionStart:e=>V?.onSessionStart(e,{transport:`http`}),onSessionActivity:e=>V?.onSessionActivity(e),onSessionEnd:e=>V?.onSessionEnd(e)}),V.startGC(),K&&(V.onSessionStart(K,{transport:`http`}),V.onSessionActivity(K)),v.info(`HTTP session runtime ready`,{maxSessions:j,sessionTimeoutMinutes:M,gcIntervalMinutes:N})}catch(e){v.error(`Failed to start session manager`,c(e)),z=!1,u=!0,H=null,U=null,q=null}}),d===`auto`?f.ready.then(async()=>{try{let e=T.sources.map(e=>e.path).join(`, `);v.info(`Running initial index`,{sourcePaths:e}),await f.runInitialIndex(),v.info(`Initial index complete`)}catch(t){v.error(`Initial index failed; will retry on aikit_reindex`,e(s,t))}}):d===`smart`?u||f.ready.then(async()=>{try{if(!f.aikit)throw Error(`AI Kit components are not available after initialization`);let{SmartIndexScheduler:e}=await import(`../../indexer/dist/index.js`),t=new e(f.aikit.indexer,T,f.aikit.store),n=f.aikit.store;B=t,t.start(),n.onBeforeClose&&n.onBeforeClose(()=>t.stop()),f.setSmartScheduler(t),v.debug(`Smart index scheduler started (HTTP mode)`)}catch(t){v.error(`Failed to start smart index scheduler`,e(s,t))}}):v.info(`Initial full indexing skipped in HTTP mode`,{indexMode:d}),f.ready.catch(t=>{v.error(`AI Kit initialization failed`,e(s,t)),z=!1,u=!0,H=null,U=null,q=null}),t(f.ready,()=>f.aikit?{curated:f.aikit.curated,stateStore:f.aikit.stateStore}:null,s)}catch(t){v.error(`Failed to load server modules`,e(s,t)),z=!1,q=null}},100)}),Q=!1,$=async e=>{Q||(Q=!0,v.info(`Shutdown signal received`,{signal:e}),o(),B?.stop(),V?.stop(),await import(`../../tools/dist/index.js`).then(({processStopAll:e})=>e()).catch(()=>{}),await W?.closeAll().catch(()=>void 0),K&&V?.onSessionEnd(K),G&&(await G.close().catch(()=>void 0),G=null,K=null),Z.close(),H&&await H.close(),await q?.().catch(()=>void 0),process.exit(0))};process.on(`SIGINT`,()=>$(`SIGINT`)),process.on(`SIGTERM`,()=>$(`SIGTERM`))}export{y as startHttpMode};
|
|
2
|
+
import{n as e,t}from"./startup-maintenance-D7tKqECM.js";import{a as n,i as r,o as i,s as a}from"./bin.js";import{t as o}from"./register-tools-BaddGXqY.js";import{createLogger as s,serializeError as c,setDetailedErrorLoggingEnabled as l}from"../../core/dist/index.js";import{randomUUID as u}from"node:crypto";const d=`__pending__:`;function f(e){return e.startsWith(d)}function p(e){let t=e.headers[`mcp-session-id`];return Array.isArray(t)?t[0]:t}function m(e,t,n,r){e.status(t).json({jsonrpc:`2.0`,error:{code:n,message:r},id:null})}var h=class{options;runtimes=new Map;maxSessions;sessionTimeoutMs;now;constructor(e){this.options=e,this.maxSessions=e.maxSessions??8,this.sessionTimeoutMs=(e.sessionTimeoutMinutes??30)*60*1e3,this.now=e.now??(()=>Date.now())}hasSession(e){return this.runtimes.has(e)}getSessionCount(){return this.runtimes.size}async handleRequest(e,t,n=e.body){let r=p(e),i=r?this.runtimes.get(r):void 0;if(r&&!i){m(t,404,-32001,`Session not found`);return}if(!i){if(e.method!==`POST`){m(t,400,-32e3,`Session required`);return}if(i=await this.createRuntime(t),!i)return}await this.withRuntimeLock(i,async()=>{await i.transport.handleRequest(e,t,n),i.lastAccessAt=this.now();let r=i.transport.sessionId??i.id;e.method!==`DELETE`&&!f(r)&&this.options.onSessionActivity?.(r),e.method===`DELETE`&&!f(r)&&await this.closeSession(r,{closeTransport:!1})})}async closeExpiredSessions(){let e=[...this.runtimes.values()].filter(e=>this.now()-e.lastAccessAt>=this.sessionTimeoutMs).map(e=>e.id);for(let t of e)await this.closeSession(t);return e.length}async closeSession(e,t={}){let n=this.runtimes.get(e);return n?(this.runtimes.delete(e),t.notifySessionEnd!==!1&&!f(e)&&this.options.onSessionEnd?.(e),t.closeTransport!==!1&&await n.transport.close().catch(()=>void 0),await n.server.close().catch(()=>void 0),!0):!1}async closeAll(){let e=[...this.runtimes.keys()];for(let t of e)await this.closeSession(t)}async createRuntime(e){if(await this.closeExpiredSessions(),this.runtimes.size>=this.maxSessions){m(e,503,-32003,`Session capacity reached`);return}let t=this.now(),n=await this.options.createServer(),r={id:`${d}${u()}`,transport:void 0,createdAt:t,lastAccessAt:t,server:n,requestChain:Promise.resolve()},i=this.options.createTransport({sessionIdGenerator:()=>u(),onsessioninitialized:async e=>{this.runtimes.delete(r.id),r.id=e,this.runtimes.set(e,r),this.options.onSessionStart?.(e)},onsessionclosed:async e=>{e&&await this.closeSession(e,{closeTransport:!1})}});return r.transport=i,i.onclose=()=>{let e=r.transport.sessionId??r.id;this.closeSession(e,{closeTransport:!1})},this.runtimes.set(r.id,r),await n.connect(i),r}async withRuntimeLock(e,t){let n=e.requestChain,r;e.requestChain=new Promise(e=>{r=e}),await n;try{await t()}finally{r()}}};function g(e){let t=e.includes(`T`)?e:`${e.replace(` `,`T`)}Z`;return Date.parse(t)}var _=class{stateStore;options;gcTimer=null;constructor(e,t={}){this.stateStore=e,this.options=t}onSessionStart(e,t){this.stateStore.sessionCreate(e,t)}onSessionActivity(e){this.stateStore.sessionTouch(e)}onSessionEnd(e){this.stateStore.sessionDelete(e),Promise.resolve(this.options.onSessionEndMaintenance?.(e)).catch(()=>{})}startGC(){if(this.gcTimer)return;let e=(this.options.gcIntervalMinutes??5)*60*1e3;this.gcTimer=setInterval(()=>{this.runGC()},e),this.gcTimer.unref()}runGC(){let e=this.getStaleSessionIds();for(let t of e)this.options.onBeforeSessionDelete?.(t),Promise.resolve(this.options.onSessionEndMaintenance?.(t)).catch(()=>{}),this.stateStore.sessionDelete(t);return e.length}stop(){this.gcTimer&&=(clearInterval(this.gcTimer),null)}getActiveSessions(){return this.stateStore.sessionList().length}listSessions(){return this.stateStore.sessionList()}getStaleSessionIds(e=Date.now()){let t=(this.options.staleTimeoutMinutes??30)*60*1e3;return this.stateStore.sessionList().filter(n=>{let r=g(n.lastActivity);return Number.isFinite(r)&&e-r>=t}).map(e=>e.sessionId)}};const v=s(`server`);async function y(s,d){let[{default:f},{loadConfig:p,resolveIndexMode:m},{registerDashboardRoutes:g,resolveDashboardDir:y},{registerSettingsRoutes:b,resolveSettingsDir:x},{createSettingsRouter:S},{authMiddleware:C,getOrCreateToken:w}]=await Promise.all([import(`express`),import(`./config-CkXCQx7E.js`),import(`./dashboard-static-CVRj5Cbv.js`),import(`./settings-static-VnUkp9iU.js`),import(`./routes-Ct7q5jrL.js`),import(`./auth-bEP-6uqy.js`)]),T=p();l(T.logging?.errorDetails===!0),T.configError&&v.warn(`Config load failure`,{error:T.configError}),v.info(`Config loaded`,{sourceCount:T.sources.length,storePath:T.store.path});let E=f();E.use(f.json({limit:`1mb`}));let D=Number(d),O=`http://localhost:${D}`,k=process.env.AIKIT_CORS_ORIGIN??O,A=process.env.AIKIT_ALLOW_ANY_ORIGIN===`true`,j=i(`AIKIT_HTTP_MAX_SESSIONS`,8),M=i(`AIKIT_HTTP_SESSION_TIMEOUT_MINUTES`,30),N=i(`AIKIT_HTTP_SESSION_GC_INTERVAL_MINUTES`,5),P=r({limit:100,windowMs:6e4}),F=!1;E.use((e,t,n)=>{let r=Array.isArray(e.headers.origin)?e.headers.origin[0]:e.headers.origin,i=a({requestOrigin:r,configuredOrigin:k,allowAnyOrigin:A,fallbackOrigin:O});if(i.warn&&!F&&(F=!0,v.warn(`Rejected non-local CORS origin while AIKIT_CORS_ORIGIN=*`,{origin:r,allowAnyOriginEnv:`AIKIT_ALLOW_ANY_ORIGIN=true`})),r&&!i.allowOrigin){t.status(403).json({error:`Origin not allowed`});return}if(i.allowOrigin&&t.setHeader(`Access-Control-Allow-Origin`,i.allowOrigin),t.setHeader(`Access-Control-Allow-Methods`,`GET, POST, PUT, PATCH, DELETE, OPTIONS`),t.setHeader(`Access-Control-Allow-Headers`,`Content-Type, Authorization, Mcp-Session-Id, Mcp-Protocol-Version, Last-Event-ID`),t.setHeader(`Access-Control-Expose-Headers`,`Mcp-Session-Id`),e.method===`OPTIONS`){t.status(204).end();return}n()});let I=w();E.use(C(I)),E.use(`/mcp`,(e,t,r)=>{let i=n(e)??e.ip??e.socket.remoteAddress??`anonymous`;if(P.allow(i)){r();return}let a=Math.max(1,Math.ceil(P.getRetryAfterMs(i)/1e3));t.setHeader(`Retry-After`,String(a)),t.status(429).json({jsonrpc:`2.0`,error:{code:-32003,message:`Rate limit exceeded`},id:null})});let L;E.use(`/mcp`,(e,t,n)=>{if(!L){let t=e.headers[`x-workspace-root`];typeof t==`string`&&t.length>0&&(L=t,v.debug(`Captured workspace root from proxy header`,{wsRoot:t}))}n()}),g(E,y(),v);let R=new Date().toISOString();E.use(`/settings/api`,S({log:v,mcpInfo:()=>({transport:`http`,port:D,pid:process.pid,startedAt:R})})),b(E,x(),v),E.get(`/health`,(e,t)=>{t.json({status:`ok`})});let z=!1,B=null,V=null,H=null,U=null,W=null,G=null,K=null,q=null,J=Promise.resolve(),Y=async(e,t)=>{if(!z||!H||!U){t.status(503).json({jsonrpc:`2.0`,error:{code:-32603,message:`Server initializing — please retry in a few seconds`},id:null});return}let r=J,i;J=new Promise(e=>{i=e});let a={POST:6e4,GET:1e4,DELETE:1e4}[e.method]??3e4;if(!await Promise.race([r.then(()=>!0),new Promise(t=>{let n=setTimeout(()=>{v.warn(`mcpLock timed out waiting for previous request, resetting lock chain`,{method:e.method,timeoutMs:a}),t(!1)},a);n.unref&&n.unref()})])&&(J=Promise.resolve(),i=()=>{},G)){let e=G;G=null,K=null,e.close().catch(()=>{})}try{let r=n(e);if(!G){if(r){t.status(404).json({jsonrpc:`2.0`,error:{code:-32001,message:`Session not found`},id:null});return}let e=new U({sessionIdGenerator:()=>u(),onsessioninitialized:async e=>{K=e,V?.onSessionStart(e,{transport:`http`})},onsessionclosed:async e=>{e&&V?.onSessionEnd(e),K=null}});e.onclose=()=>{G===e&&(G=null),K===e.sessionId&&(K=null)},G=e,await H.connect(e)}let i=G;await i.handleRequest(e,t,e.body),e.method!==`DELETE`&&(!r&&i.sessionId?(K=i.sessionId,V?.onSessionStart(i.sessionId,{transport:`http`}),V?.onSessionActivity(i.sessionId)):r&&V?.onSessionActivity(r))}catch(e){if(v.error(`MCP handler error`,c(e)),!t.headersSent){let n=e instanceof Error?e.message:String(e),r=n.includes(`Not Acceptable`);t.status(r?406:500).json({jsonrpc:`2.0`,error:{code:r?-32e3:-32603,message:r?n:`Internal server error`},id:null})}}finally{i()}},X=async(e,t)=>{let r=n(e);if(W&&(!G||r!==K)){await W.handleRequest(e,t,e.body);return}await Y(e,t)};E.post(`/mcp`,X),E.get(`/mcp`,X),E.delete(`/mcp`,X);let Z=E.listen(D,`127.0.0.1`,()=>{v.info(`MCP server listening`,{url:`http://127.0.0.1:${D}/mcp`,port:D}),setTimeout(async()=>{try{typeof L==`string`&&L.length>0&&(T.sources[0]={path:L,excludePatterns:T.sources[0]?.excludePatterns??[]},T.allRoots=[L],v.debug(`Workspace root applied from proxy header`,{wsRoot:L}));let[{createLazyServer:n,createMcpServer:r,ALL_TOOL_NAMES:i},{StreamableHTTPServerTransport:a},{checkForUpdates:o,autoUpgradeScaffold:l}]=await Promise.all([import(`./server-Zs9-tb2g.js`),import(`@modelcontextprotocol/sdk/server/streamableHttp.js`),import(`./startup-maintenance-D7tKqECM.js`).then(e=>e.u)]);o(),l(),setInterval(o,1440*60*1e3).unref();let u=!1,d=m(T),f=n(T,d);q=async()=>{f.aikit&&await Promise.all([f.aikit.embedder.shutdown?.().catch(()=>{})??Promise.resolve(),f.aikit.graphStore.close().catch(()=>{}),f.aikit.closeStateStore?.().catch(()=>{})??Promise.resolve(),f.aikit.store.close().catch(()=>{})])},H=f.server,U=a,z=!0,v.debug(`MCP server configured (lazy — AI Kit initializing in background)`,{toolCount:i.length,resourceCount:2}),f.startInit(),f.ready.then(async()=>{try{if(!f.aikit)throw Error(`AI Kit components are not available after initialization`);V=new _(f.aikit.stateStore,{staleTimeoutMinutes:M,gcIntervalMinutes:N,onBeforeSessionDelete:e=>{if(K===e&&G){let e=G;G=null,K=null,e.close().catch(()=>void 0)}W?.closeSession(e,{notifySessionEnd:!1})},onSessionEndMaintenance:async()=>{if(!f.aikit?.curated||!f.aikit?.stateStore)return;let{pruneLessons:e}=await import(`./startup-maintenance-D7tKqECM.js`).then(e=>e.x),t=await e(f.aikit.curated,f.aikit.stateStore,{dryRun:!1});t.pruned.length>0&&v.info(`Session-end lesson prune`,{pruned:t.pruned.length})}}),W=new h({createServer:()=>{if(!f.aikit)throw Error(`AI Kit components are not available after initialization`);return r(f.aikit,T)},createTransport:e=>new a(e),maxSessions:j,sessionTimeoutMinutes:M,onSessionStart:e=>V?.onSessionStart(e,{transport:`http`}),onSessionActivity:e=>V?.onSessionActivity(e),onSessionEnd:e=>V?.onSessionEnd(e)}),V.startGC(),K&&(V.onSessionStart(K,{transport:`http`}),V.onSessionActivity(K)),v.info(`HTTP session runtime ready`,{maxSessions:j,sessionTimeoutMinutes:M,gcIntervalMinutes:N})}catch(e){v.error(`Failed to start session manager`,c(e)),z=!1,u=!0,H=null,U=null,q=null}}),d===`auto`?f.ready.then(async()=>{try{let e=T.sources.map(e=>e.path).join(`, `);v.info(`Running initial index`,{sourcePaths:e}),await f.runInitialIndex(),v.info(`Initial index complete`)}catch(t){v.error(`Initial index failed; will retry on aikit_reindex`,e(s,t))}}):d===`smart`?u||f.ready.then(async()=>{try{if(!f.aikit)throw Error(`AI Kit components are not available after initialization`);let{SmartIndexScheduler:e}=await import(`../../indexer/dist/index.js`),t=new e(f.aikit.indexer,T,f.aikit.store),n=f.aikit.store;B=t,t.start(),n.onBeforeClose&&n.onBeforeClose(()=>t.stop()),f.setSmartScheduler(t),v.debug(`Smart index scheduler started (HTTP mode)`)}catch(t){v.error(`Failed to start smart index scheduler`,e(s,t))}}):v.info(`Initial full indexing skipped in HTTP mode`,{indexMode:d}),f.ready.catch(t=>{v.error(`AI Kit initialization failed`,e(s,t)),z=!1,u=!0,H=null,U=null,q=null}),t(f.ready,()=>f.aikit?{curated:f.aikit.curated,stateStore:f.aikit.stateStore}:null,s)}catch(t){v.error(`Failed to load server modules`,e(s,t)),z=!1,q=null}},100)}),Q=!1,$=async e=>{Q||(Q=!0,v.info(`Shutdown signal received`,{signal:e}),o(),B?.stop(),V?.stop(),await import(`../../tools/dist/index.js`).then(({processStopAll:e})=>e()).catch(()=>{}),await W?.closeAll().catch(()=>void 0),K&&V?.onSessionEnd(K),G&&(await G.close().catch(()=>void 0),G=null,K=null),Z.close(),H&&await H.close(),await q?.().catch(()=>void 0),process.exit(0))};process.on(`SIGINT`,()=>$(`SIGINT`)),process.on(`SIGTERM`,()=>$(`SIGTERM`))}export{y as startHttpMode};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{n as e,t}from"./startup-maintenance-D7tKqECM.js";import{r as n}from"./bin.js";import{a as r,t as i}from"./register-tools-
|
|
2
|
+
import{n as e,t}from"./startup-maintenance-D7tKqECM.js";import{r as n}from"./bin.js";import{a as r,t as i}from"./register-tools-BaddGXqY.js";import{createLogger as a,serializeError as o,setDetailedErrorLoggingEnabled as s}from"../../core/dist/index.js";const c=a(`server`);var l=class{buffer;append(e){this.buffer=this.buffer?Buffer.concat([this.buffer,e]):e}readMessage(){if(!this.buffer)return null;for(let e=0;e<this.buffer.length;e++){if(this.buffer[e]!==10)continue;let t=this.buffer.toString(`utf8`,0,e).replace(/\r$/,``),n=e+1;try{let e=JSON.parse(t);return this.buffer=this.buffer.subarray(n),e}catch{try{let e=r(t);return c.warn(`JSON parse failed on MCP message — repair succeeded`,{preview:t.slice(0,80)}),this.buffer=this.buffer.subarray(n),e}catch{}}}return null}clear(){this.buffer=void 0}};async function u(r){let[{loadConfig:a,reconfigureForWorkspace:u,resolveIndexMode:d},{createLazyServer:f},{checkForUpdates:p,autoUpgradeScaffold:m},{RootsListChangedNotificationSchema:h}]=await Promise.all([import(`./config-CkXCQx7E.js`),import(`./server-Zs9-tb2g.js`),import(`./startup-maintenance-D7tKqECM.js`).then(e=>e.u),import(`@modelcontextprotocol/sdk/types.js`)]),g=a();s(g.logging?.errorDetails===!0),g.configError&&c.warn(`Config load failure`,{error:g.configError}),c.info(`Config loaded`,{sourceCount:g.sources.length,storePath:g.store.path}),m(),setInterval(p,1440*60*1e3).unref();let _=d(g),v=f(g,_),{server:y,startInit:b,ready:x,runInitialIndex:S}=v,{StdioServerTransport:C}=await import(`@modelcontextprotocol/sdk/server/stdio.js`),w=new C;if(typeof w._readBuffer?.readMessage!=`function`)throw Error(`Cannot install JSON repair: StdioServerTransport._readBuffer has unexpected shape`);w._readBuffer=new l,c.debug(`JSON repair installed on stdio transport`),await y.connect(w),c.debug(`MCP server started`,{transport:`stdio`}),await n({config:g,indexMode:_,log:c,rootsChangedNotificationSchema:h,reconfigureForWorkspace:u,runInitialIndex:S,server:y,startInit:b,version:r});let T=null,E=null,D=!1,O=async e=>{D||(D=!0,c.info(`Shutdown signal received`,{signal:e}),i(),T&&=(clearTimeout(T),null),E?.stop(),await import(`../../tools/dist/index.js`).then(({processStopAll:e})=>e()).catch(()=>{}),await w.close().catch(()=>void 0),await y.close().catch(()=>void 0),v.aikit&&await Promise.all([v.aikit.embedder.shutdown?.().catch(()=>{})??Promise.resolve(),v.aikit.graphStore.close().catch(()=>{}),v.aikit.closeStateStore?.().catch(()=>{})??Promise.resolve(),v.aikit.store.close().catch(()=>{})]),process.exit(0))},k=()=>{T&&clearTimeout(T),T=setTimeout(async()=>{c.info(`Auto-shutdown: no activity for 30 minutes — releasing resources`),i();try{let e=v.aikit;e&&(e.embedder.shutdown?.().catch(()=>{}),e.store.releaseMemory?.(),e.graphStore.releaseMemory?.())}catch(e){c.warn(`Resource release failed during shutdown`,o(e))}},18e5),T.unref&&T.unref()};k(),process.stdin.on(`data`,()=>k()),process.stdin.on(`end`,()=>void O(`stdin-end`)),process.stdin.on(`close`,()=>void O(`stdin-close`)),process.stdin.on(`error`,()=>void O(`stdin-error`)),process.on(`SIGINT`,()=>void O(`SIGINT`)),process.on(`SIGTERM`,()=>void O(`SIGTERM`)),x.catch(t=>{c.error(`Initialization failed — server will continue with limited tools`,e(r,t))}),_===`smart`?x.then(async()=>{try{if(!v.aikit)throw Error(`AI Kit components are not available after initialization`);let{SmartIndexScheduler:e}=await import(`../../indexer/dist/index.js`),t=new e(v.aikit.indexer,g,v.aikit.store);E=t;let n=v.aikit.store;t.start(),n.onBeforeClose&&n.onBeforeClose(()=>t.stop()),v.setSmartScheduler(t),c.debug(`Smart index scheduler started (stdio mode)`)}catch(t){c.error(`Failed to start smart index scheduler`,e(r,t))}}).catch(t=>c.error(`AI Kit init failed for smart scheduler`,e(r,t))):c.warn(`Initial full indexing skipped; use aikit_reindex to index manually`,{indexMode:_}),t(x,()=>v.aikit?{curated:v.aikit.curated,stateStore:v.aikit.stateStore}:null,r)}export{u as startStdioMode};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e}from"./workspace-bootstrap-DTnTU8p2.js";import{n as t,t as n}from"./startup-maintenance-QrloHssd.js";import{a as r,t as i}from"./register-tools-
|
|
1
|
+
import{n as e}from"./workspace-bootstrap-DTnTU8p2.js";import{n as t,t as n}from"./startup-maintenance-QrloHssd.js";import{a as r,t as i}from"./register-tools-DWTLkaFG.js";import{createLogger as a,serializeError as o,setDetailedErrorLoggingEnabled as s}from"../../core/dist/index.js";const c=a(`server`);var l=class{buffer;append(e){this.buffer=this.buffer?Buffer.concat([this.buffer,e]):e}readMessage(){if(!this.buffer)return null;for(let e=0;e<this.buffer.length;e++){if(this.buffer[e]!==10)continue;let t=this.buffer.toString(`utf8`,0,e).replace(/\r$/,``),n=e+1;try{let e=JSON.parse(t);return this.buffer=this.buffer.subarray(n),e}catch{try{let e=r(t);return c.warn(`JSON parse failed on MCP message — repair succeeded`,{preview:t.slice(0,80)}),this.buffer=this.buffer.subarray(n),e}catch{}}}return null}clear(){this.buffer=void 0}};async function u(r){let[{loadConfig:a,reconfigureForWorkspace:u,resolveIndexMode:d},{createLazyServer:f},{checkForUpdates:p,autoUpgradeScaffold:m},{RootsListChangedNotificationSchema:h}]=await Promise.all([import(`./config-BS9mkd50.js`),import(`./server-by4LpJpg.js`),import(`./startup-maintenance-QrloHssd.js`).then(e=>e.u),import(`@modelcontextprotocol/sdk/types.js`)]),g=a();s(g.logging?.errorDetails===!0),g.configError&&c.warn(`Config load failure`,{error:g.configError}),c.info(`Config loaded`,{sourceCount:g.sources.length,storePath:g.store.path}),m(),setInterval(p,1440*60*1e3).unref();let _=d(g),v=f(g,_),{server:y,startInit:b,ready:x,runInitialIndex:S}=v,{StdioServerTransport:C}=await import(`@modelcontextprotocol/sdk/server/stdio.js`),w=new C;if(typeof w._readBuffer?.readMessage!=`function`)throw Error(`Cannot install JSON repair: StdioServerTransport._readBuffer has unexpected shape`);w._readBuffer=new l,c.debug(`JSON repair installed on stdio transport`),await y.connect(w),c.debug(`MCP server started`,{transport:`stdio`}),await e({config:g,indexMode:_,log:c,rootsChangedNotificationSchema:h,reconfigureForWorkspace:u,runInitialIndex:S,server:y,startInit:b,version:r});let T=null,E=null,D=!1,O=async e=>{D||(D=!0,c.info(`Shutdown signal received`,{signal:e}),i(),T&&=(clearTimeout(T),null),E?.stop(),await import(`../../tools/dist/index.js`).then(({processStopAll:e})=>e()).catch(()=>{}),await w.close().catch(()=>void 0),await y.close().catch(()=>void 0),v.aikit&&await Promise.all([v.aikit.embedder.shutdown?.().catch(()=>{})??Promise.resolve(),v.aikit.graphStore.close().catch(()=>{}),v.aikit.closeStateStore?.().catch(()=>{})??Promise.resolve(),v.aikit.store.close().catch(()=>{})]),process.exit(0))},k=()=>{T&&clearTimeout(T),T=setTimeout(async()=>{c.info(`Auto-shutdown: no activity for 30 minutes — releasing resources`),i();try{let e=v.aikit;e&&(e.embedder.shutdown?.().catch(()=>{}),e.store.releaseMemory?.(),e.graphStore.releaseMemory?.())}catch(e){c.warn(`Resource release failed during shutdown`,o(e))}},18e5),T.unref&&T.unref()};k(),process.stdin.on(`data`,()=>k()),process.stdin.on(`end`,()=>void O(`stdin-end`)),process.stdin.on(`close`,()=>void O(`stdin-close`)),process.stdin.on(`error`,()=>void O(`stdin-error`)),process.on(`SIGINT`,()=>void O(`SIGINT`)),process.on(`SIGTERM`,()=>void O(`SIGTERM`)),x.catch(e=>{c.error(`Initialization failed — server will continue with limited tools`,t(r,e))}),_===`smart`?x.then(async()=>{try{if(!v.aikit)throw Error(`AI Kit components are not available after initialization`);let{SmartIndexScheduler:e}=await import(`../../indexer/dist/index.js`),t=new e(v.aikit.indexer,g,v.aikit.store);E=t;let n=v.aikit.store;t.start(),n.onBeforeClose&&n.onBeforeClose(()=>t.stop()),v.setSmartScheduler(t),c.debug(`Smart index scheduler started (stdio mode)`)}catch(e){c.error(`Failed to start smart index scheduler`,t(r,e))}}).catch(e=>c.error(`AI Kit init failed for smart scheduler`,t(r,e))):c.warn(`Initial full indexing skipped; use aikit_reindex to index manually`,{indexMode:_}),n(x,()=>v.aikit?{curated:v.aikit.curated,stateStore:v.aikit.stateStore}:null,r)}export{u as startStdioMode};
|