@vpxa/aikit 0.1.10 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/package.json +1 -1
  2. package/packages/indexer/dist/smart-index-scheduler.js +1 -1
  3. package/packages/server/dist/compression-interceptor.d.ts +12 -0
  4. package/packages/server/dist/compression-interceptor.js +1 -0
  5. package/packages/server/dist/server.js +2 -2
  6. package/packages/server/dist/tools/present/tool.js +1 -1
  7. package/packages/tools/dist/compact.d.ts +6 -0
  8. package/packages/tools/dist/compact.js +2 -2
  9. package/packages/tools/dist/compress-output.d.ts +38 -0
  10. package/packages/tools/dist/compress-output.js +1 -0
  11. package/packages/tools/dist/compression/delta-cache.d.ts +29 -0
  12. package/packages/tools/dist/compression/delta-cache.js +1 -0
  13. package/packages/tools/dist/compression/engine.d.ts +34 -0
  14. package/packages/tools/dist/compression/engine.js +4 -0
  15. package/packages/tools/dist/compression/litm.d.ts +20 -0
  16. package/packages/tools/dist/compression/litm.js +1 -0
  17. package/packages/tools/dist/compression/mmr.d.ts +24 -0
  18. package/packages/tools/dist/compression/mmr.js +1 -0
  19. package/packages/tools/dist/compression/rules/docker.d.ts +11 -0
  20. package/packages/tools/dist/compression/rules/docker.js +3 -0
  21. package/packages/tools/dist/compression/rules/generic.d.ts +11 -0
  22. package/packages/tools/dist/compression/rules/generic.js +3 -0
  23. package/packages/tools/dist/compression/rules/git.d.ts +11 -0
  24. package/packages/tools/dist/compression/rules/git.js +3 -0
  25. package/packages/tools/dist/compression/rules/index.d.ts +14 -0
  26. package/packages/tools/dist/compression/rules/index.js +1 -0
  27. package/packages/tools/dist/compression/rules/kubectl.d.ts +11 -0
  28. package/packages/tools/dist/compression/rules/kubectl.js +3 -0
  29. package/packages/tools/dist/compression/rules/lint.d.ts +11 -0
  30. package/packages/tools/dist/compression/rules/lint.js +3 -0
  31. package/packages/tools/dist/compression/rules/npm.d.ts +11 -0
  32. package/packages/tools/dist/compression/rules/npm.js +3 -0
  33. package/packages/tools/dist/compression/rules/test-runner.d.ts +11 -0
  34. package/packages/tools/dist/compression/rules/test-runner.js +3 -0
  35. package/packages/tools/dist/compression/scoring.d.ts +26 -0
  36. package/packages/tools/dist/compression/scoring.js +1 -0
  37. package/packages/tools/dist/compression/types.d.ts +61 -0
  38. package/packages/tools/dist/compression/types.js +1 -0
  39. package/packages/tools/dist/digest.d.ts +5 -0
  40. package/packages/tools/dist/digest.js +4 -4
  41. package/packages/tools/dist/index.d.ts +5 -1
  42. package/packages/tools/dist/index.js +1 -1
  43. package/packages/tools/dist/parse-output.d.ts +3 -1
  44. package/packages/tools/dist/parse-output.js +1 -1
  45. package/packages/tools/dist/truncation.d.ts +34 -1
  46. package/packages/tools/dist/truncation.js +10 -6
  47. package/packages/tui/dist/{App-DpjN3iS-.js → App-D8fednPY.js} +1 -1
  48. package/packages/tui/dist/App.js +1 -1
  49. package/packages/tui/dist/{CuratedPanel-BIamXLNy.js → CuratedPanel-BwkPKdX4.js} +1 -1
  50. package/packages/tui/dist/LogPanel-C6KagE0H.js +3320 -0
  51. package/packages/tui/dist/{SearchPanel-CpJGczAc.js → SearchPanel-BbvCaco0.js} +1 -1
  52. package/packages/tui/dist/{StatusPanel-BAbUxyqQ.js → StatusPanel-BFshFJU9.js} +1 -1
  53. package/packages/tui/dist/chunk-BSngPjfM.js +2 -0
  54. package/packages/tui/dist/{devtools-DMOZMn70.js → devtools-owCrRz12.js} +2 -2
  55. package/packages/tui/dist/hooks/useKBClient.js +1 -1
  56. package/packages/tui/dist/hooks/usePolling.js +1 -1
  57. package/packages/tui/dist/index.js +1 -1
  58. package/packages/tui/dist/{jsx-runtime-y6Gdq5PZ.js → jsx-runtime-B_2ewjsM.js} +7 -7
  59. package/packages/tui/dist/panels/CuratedPanel.js +1 -1
  60. package/packages/tui/dist/panels/LogPanel.js +1 -1
  61. package/packages/tui/dist/panels/SearchPanel.js +1 -1
  62. package/packages/tui/dist/panels/StatusPanel.js +1 -1
  63. package/packages/tui/dist/{react-D__J1GQe.js → react-sYq8CyFO.js} +1 -1
  64. package/packages/tui/dist/{useKBClient-C35iA4uG.js → useKBClient-BkBffCdd.js} +1 -1
  65. package/packages/tui/dist/{usePolling-BbjnRWgx.js → usePolling-D3y7u5cZ.js} +1 -1
  66. package/packages/tui/dist/LogPanel-Db-SeZhR.js +0 -3
  67. package/packages/tui/dist/chunk-D6axbAb-.js +0 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vpxa/aikit",
3
- "version": "0.1.10",
3
+ "version": "0.1.11",
4
4
  "type": "module",
5
5
  "description": "Local-first AI developer toolkit — knowledge base, code analysis, context management, and developer tools for LLM agents",
6
6
  "license": "MIT",
@@ -1 +1 @@
1
- import{statSync as e}from"node:fs";import{createLogger as t}from"../../core/dist/index.js";import{availableParallelism as n,loadavg as r}from"node:os";const i=t(`smart-index`),a=1.5;var o=class{trickleTimer=null;trickleIntervalMs;batchSize;priorityQueue=[];changedFiles=[];lastRefreshTime=0;refreshing=!1;constructor(e,t){this.indexer=e,this.config=t,this.trickleIntervalMs=this.readPositiveIntEnv(`AIKIT_SMART_TRICKLE_MS`,12e4),this.batchSize=this.readPositiveIntEnv(`AIKIT_SMART_BATCH_SIZE`,1)}start(){this.stop(),i.info(`Smart index scheduler started (trickle mode)`,{intervalMs:this.trickleIntervalMs,batchSize:this.batchSize}),this.scheduleTick()}stop(){this.trickleTimer&&=(clearTimeout(this.trickleTimer),null)}prioritize(...t){let n=[...new Set(t.filter(Boolean))].filter(t=>{try{return!e(t).isDirectory()}catch{return!0}});for(let e of n){let t=this.priorityQueue.indexOf(e);t>=0&&this.priorityQueue.splice(t,1)}for(let e of n.reverse())this.priorityQueue.unshift(e);this.priorityQueue.length>500&&(this.priorityQueue.length=500),n.length>0&&i.info(`Files prioritized for trickle indexing`,{added:n.length,queued:this.priorityQueue.length})}getState(){return{mode:`smart`,queueSize:this.priorityQueue.length,changedFilesSize:this.changedFiles.length,intervalMs:this.trickleIntervalMs,batchSize:this.batchSize,running:this.trickleTimer!==null}}readPositiveIntEnv(e,t){let n=Number(process.env[e]);return Number.isFinite(n)&&n>0?n:t}scheduleTick(){this.trickleTimer=setTimeout(()=>void this.tick(),this.trickleIntervalMs),this.trickleTimer.unref&&this.trickleTimer.unref()}async tick(){try{if(this.indexer.isIndexing){i.info(`Skipping trickle tick — indexing already in progress`);return}let e=this.getCpuCount(),t=r()[0];if(e>0&&t/e>a){i.info(`Skipping trickle tick — system load too high`,{load:t.toFixed(2),cpuCount:e,threshold:a});return}let n=await this.pickFiles();if(n.length===0){await this.maybeRefreshChangedFiles();return}i.info(`Trickle indexing tick started`,{count:n.length,files:n});let o=await this.indexer.indexFiles(this.config,n);this.changedFiles=this.changedFiles.filter(e=>!n.includes(e)),i.info(`Trickle indexing tick complete`,{filesProcessed:o.filesProcessed,filesSkipped:o.filesSkipped,chunksCreated:o.chunksCreated})}catch(e){i.error(`Trickle indexing tick failed`,{error:String(e)})}finally{this.scheduleTick()}}getCpuCount(){try{return typeof n==`function`?n():4}catch{return 4}}async pickFiles(){let e=[];for(;e.length<this.batchSize&&this.priorityQueue.length>0;){let t=this.priorityQueue.shift();t&&!e.includes(t)&&e.push(t)}if(e.length<this.batchSize)for(await this.maybeRefreshChangedFiles();e.length<this.batchSize&&this.changedFiles.length>0;){let t=this.changedFiles.shift();t&&!e.includes(t)&&e.push(t)}return e}async maybeRefreshChangedFiles(){let e=Date.now();if(!(this.refreshing||this.changedFiles.length>0&&e-this.lastRefreshTime<6e5)){this.refreshing=!0;try{this.changedFiles=await this.indexer.getChangedFiles(this.config),this.lastRefreshTime=e,this.changedFiles.length>0&&i.info(`Refreshed changed files for trickle indexing`,{count:this.changedFiles.length})}catch(e){i.error(`Failed to refresh changed files for trickle indexing`,{error:String(e)})}finally{this.refreshing=!1}}}};export{o as SmartIndexScheduler};
1
+ import{statSync as e}from"node:fs";import{createLogger as t}from"../../core/dist/index.js";import{availableParallelism as n,loadavg as r}from"node:os";const i=t(`smart-index`),a=1.5;var o=class{trickleTimer=null;trickleIntervalMs;batchSize;priorityQueue=[];changedFiles=[];lastRefreshTime=0;refreshing=!1;constructor(e,t){this.indexer=e,this.config=t,this.trickleIntervalMs=this.readPositiveIntEnv(`AIKIT_SMART_TRICKLE_MS`,12e4),this.batchSize=this.readPositiveIntEnv(`AIKIT_SMART_BATCH_SIZE`,1)}start(){this.stop(),i.info(`Smart index scheduler started (trickle mode)`,{intervalMs:this.trickleIntervalMs,batchSize:this.batchSize}),this.scheduleTick()}stop(){this.trickleTimer&&=(clearTimeout(this.trickleTimer),null)}prioritize(...t){let n=[...new Set(t.filter(Boolean))].filter(t=>{try{return!e(t).isDirectory()}catch{return console.debug(`smart-index: skipping non-existent path: ${t}`),!1}});for(let e of n){let t=this.priorityQueue.indexOf(e);t>=0&&this.priorityQueue.splice(t,1)}for(let e of n.reverse())this.priorityQueue.unshift(e);this.priorityQueue.length>500&&(this.priorityQueue.length=500),n.length>0&&i.info(`Files prioritized for trickle indexing`,{added:n.length,queued:this.priorityQueue.length})}getState(){return{mode:`smart`,queueSize:this.priorityQueue.length,changedFilesSize:this.changedFiles.length,intervalMs:this.trickleIntervalMs,batchSize:this.batchSize,running:this.trickleTimer!==null}}readPositiveIntEnv(e,t){let n=Number(process.env[e]);return Number.isFinite(n)&&n>0?n:t}scheduleTick(){this.trickleTimer=setTimeout(()=>void this.tick(),this.trickleIntervalMs),this.trickleTimer.unref&&this.trickleTimer.unref()}async tick(){try{if(this.indexer.isIndexing){i.info(`Skipping trickle tick — indexing already in progress`);return}let e=this.getCpuCount(),t=r()[0];if(e>0&&t/e>a){i.info(`Skipping trickle tick — system load too high`,{load:t.toFixed(2),cpuCount:e,threshold:a});return}let n=await this.pickFiles();if(n.length===0){await this.maybeRefreshChangedFiles();return}i.info(`Trickle indexing tick started`,{count:n.length,files:n});let o=await this.indexer.indexFiles(this.config,n);this.changedFiles=this.changedFiles.filter(e=>!n.includes(e)),i.info(`Trickle indexing tick complete`,{filesProcessed:o.filesProcessed,filesSkipped:o.filesSkipped,chunksCreated:o.chunksCreated})}catch(e){i.error(`Trickle indexing tick failed`,{error:String(e)})}finally{this.scheduleTick()}}getCpuCount(){try{return typeof n==`function`?n():4}catch{return 4}}async pickFiles(){let e=[];for(;e.length<this.batchSize&&this.priorityQueue.length>0;){let t=this.priorityQueue.shift();t&&!e.includes(t)&&e.push(t)}if(e.length<this.batchSize)for(await this.maybeRefreshChangedFiles();e.length<this.batchSize&&this.changedFiles.length>0;){let t=this.changedFiles.shift();t&&!e.includes(t)&&e.push(t)}return e}async maybeRefreshChangedFiles(){let e=Date.now();if(!(this.refreshing||this.changedFiles.length>0&&e-this.lastRefreshTime<6e5)){this.refreshing=!0;try{this.changedFiles=await this.indexer.getChangedFiles(this.config),this.lastRefreshTime=e,this.changedFiles.length>0&&i.info(`Refreshed changed files for trickle indexing`,{count:this.changedFiles.length})}catch(e){i.error(`Failed to refresh changed files for trickle indexing`,{error:String(e)})}finally{this.refreshing=!1}}}};export{o as SmartIndexScheduler};
@@ -0,0 +1,12 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+
3
+ //#region packages/server/src/compression-interceptor.d.ts
4
+ interface CompressionInterceptorOptions {
5
+ /** Minimum character count before compression kicks in (default: 4000) */
6
+ threshold?: number;
7
+ /** Maximum token budget for compressed output (default: 2000) */
8
+ tokenBudget?: number;
9
+ }
10
+ declare function installCompressionInterceptor(server: McpServer, options?: CompressionInterceptorOptions): void;
11
+ //#endregion
12
+ export { CompressionInterceptorOptions, installCompressionInterceptor };
@@ -0,0 +1 @@
1
+ import{compressTerminalOutput as e}from"../../tools/dist/index.js";const t=new Set([`compact`,`digest`,`file_summary`,`stratum_card`,`present`,`web_fetch`,`web_search`]);function n(n,r){let i=r?.threshold??4e3,a=r?.tokenBudget??2e3,o=n.registerTool.bind(n);n.registerTool=(n,r,s)=>t.has(n)?o(n,r,s):o(n,r,async(t,r)=>{let o=await s(t,r);if(!Array.isArray(o.content))return o;let c=0;for(let e of o.content)e.type===`text`&&typeof e.text==`string`&&(c+=e.text.length);if(c<i)return o;let l=o.content.map(t=>{if(t.type!==`text`||typeof t.text!=`string`||t.text.length<i)return t;let r=e({text:t.text,tool:n,tokenBudget:a});return{...t,text:r.text}});return{...o,content:l}})}export{n as installCompressionInterceptor};
@@ -1,3 +1,3 @@
1
- import{BackgroundTaskScheduler as e}from"./background-task.js";import{clearCompletionCache as t}from"./completions.js";import{CuratedKnowledgeManager as n}from"./curated-manager.js";import{createElicitor as r,noopElicitor as i}from"./elicitor.js";import{IdleTimer as a}from"./idle-timer.js";import{bridgeMcpLogging as o}from"./mcp-logging.js";import{MemoryMonitor as s}from"./memory-monitor.js";import{registerPrompts as c}from"./prompts.js";import{installReplayInterceptor as l}from"./replay-interceptor.js";import{ResourceNotifier as u}from"./resources/resource-notifier.js";import{registerResources as d}from"./resources/resources.js";import{createSamplingClient as f}from"./sampling.js";import{installStructuredContentGuard as p}from"./structured-content-guard.js";import{getToolMeta as m}from"./tool-metadata.js";import{installToolPrefix as h}from"./tool-prefix.js";import{ToolTimeoutError as g,getToolTimeout as _,withTimeout as v}from"./tool-timeout.js";import{registerAnalyzeDependenciesTool as y,registerAnalyzeDiagramTool as b,registerAnalyzeEntryPointsTool as x,registerAnalyzePatternsTool as S,registerAnalyzeStructureTool as ee,registerAnalyzeSymbolsTool as C,registerBlastRadiusTool as w}from"./tools/analyze.tools.js";import{registerAuditTool as T}from"./tools/audit.tool.js";import{registerBrainstormTool as E}from"./tools/brainstorm.tool.js";import{initBridgeComponents as te,registerErPullTool as D,registerErPushTool as O,registerErSyncStatusTool as k}from"./tools/bridge.tools.js";import{registerConfigTool as ne}from"./tools/config.tool.js";import{registerCompactTool as A,registerDeadSymbolsTool as j,registerFileSummaryTool as M,registerFindTool as N,registerScopeMapTool as re,registerSymbolTool as P,registerTraceTool as F}from"./tools/context.tools.js";import{registerErEvolveReviewTool as ie}from"./tools/evolution.tools.js";import{registerBatchTool as ae,registerCheckTool as oe,registerDelegateTool as se,registerEvalTool as ce,registerParseOutputTool as le,registerTestRunTool as I}from"./tools/execution.tools.js";import{registerFlowTools as ue}from"./tools/flow.tools.js";import{registerDigestTool as de,registerEvidenceMapTool as L,registerForgeClassifyTool as R,registerForgeGroundTool as fe,registerStratumCardTool as pe}from"./tools/forge.tools.js";import{registerForgetTool as me}from"./tools/forget.tool.js";import{registerGraphTool as he}from"./tools/graph.tool.js";import{registerGuideTool as z,registerHealthTool as B,registerProcessTool as V,registerWatchTool as H,registerWebFetchTool as U}from"./tools/infra.tools.js";import{registerListTool as ge}from"./tools/list.tool.js";import{registerLookupTool as _e}from"./tools/lookup.tool.js";import{registerCodemodTool as W,registerDataTransformTool as G,registerDiffParseTool as K,registerGitContextTool as q,registerRenameTool as ve}from"./tools/manipulation.tools.js";import{registerOnboardTool as ye}from"./tools/onboard.tool.js";import{registerCheckpointTool as be,registerLaneTool as xe,registerQueueTool as Se,registerStashTool as Ce,registerWorksetTool as we}from"./tools/persistence.tools.js";import{registerErUpdatePolicyTool as Te}from"./tools/policy.tools.js";import{registerPresentTool as Ee}from"./tools/present/tool.js";import"./tools/present/index.js";import{registerProduceKnowledgeTool as De}from"./tools/produce.tool.js";import{registerReadTool as Oe}from"./tools/read.tool.js";import{registerReindexTool as ke}from"./tools/reindex.tool.js";import{registerRememberTool as Ae}from"./tools/remember.tool.js";import{registerReplayTool as je}from"./tools/replay.tool.js";import{registerRestoreTool as Me}from"./tools/restore.tool.js";import{registerSearchTool as Ne}from"./tools/search.tool.js";import{getCurrentVersion as Pe}from"./version-check.js";import{registerEarlyStatusTool as Fe,registerStatusTool as Ie}from"./tools/status.tool.js";import{registerUpdateTool as Le}from"./tools/update.tool.js";import{registerChangelogTool as Re,registerEncodeTool as ze,registerEnvTool as Be,registerHttpTool as Ve,registerMeasureTool as He,registerRegexTestTool as Ue,registerSchemaValidateTool as We,registerSnippetTool as Ge,registerTimeTool as J,registerWebSearchTool as Ke}from"./tools/utility.tools.js";import{existsSync as qe,statSync as Je}from"node:fs";import{resolve as Ye}from"node:path";import{AIKIT_PATHS as Xe,createLogger as Ze,serializeError as Y}from"../../core/dist/index.js";import{initializeWasm as Qe}from"../../chunker/dist/index.js";import{OnnxEmbedder as $e}from"../../embeddings/dist/index.js";import{EvolutionCollector as et,PolicyStore as tt}from"../../enterprise-bridge/dist/index.js";import{FileHashCache as nt,IncrementalIndexer as rt}from"../../indexer/dist/index.js";import{SqliteGraphStore as it,createStore as at}from"../../store/dist/index.js";import{FileCache as ot}from"../../tools/dist/index.js";import{completable as st}from"@modelcontextprotocol/sdk/server/completable.js";import{McpServer as ct}from"@modelcontextprotocol/sdk/server/mcp.js";import{z as lt}from"zod";const X=Ze(`server`);async function Z(e){X.info(`Initializing AI Kit components`);let[t,r,i,a]=await Promise.all([(async()=>{let t=new $e({model:e.embedding.model,dimensions:e.embedding.dimensions});return await t.initialize(),X.info(`Embedder loaded`,{modelId:t.modelId,dimensions:t.dimensions}),t})(),(async()=>{let t=await at({backend:e.store.backend,path:e.store.path});return await t.initialize(),X.info(`Store initialized`),t})(),(async()=>{let t=new it({path:e.store.path});return await t.initialize(),X.info(`Graph store initialized`),t})(),(async()=>{let e=await Qe();return e?X.info(`WASM tree-sitter enabled for AST analysis`):X.warn(`WASM tree-sitter not available; analyzers will use regex fallback`),e})()]),o=new rt(t,r),s=new nt(e.store.path);s.load(),o.setHashCache(s);let c=e.curated.path,l=new n(c,r,t);o.setGraphStore(i);let u=te(e.er),d=u?new tt(e.curated.path):void 0;d&&X.info(`Policy store initialized`,{ruleCount:d.getRules().length});let f=u?new et:void 0,p=Ye(e.sources[0]?.path??process.cwd(),Xe.aiKb),m=qe(p),h=e.onboardDir?qe(e.onboardDir):!1,g=m||h,_,v=m?p:e.onboardDir;if(g&&v)try{_=Je(v).mtime.toISOString()}catch{}return X.info(`Onboard state detected`,{onboardComplete:g,onboardTimestamp:_,aiKbExists:m,onboardDirExists:h}),{embedder:t,store:r,indexer:o,curated:l,graphStore:i,fileCache:new ot,bridge:u,policyStore:d,evolutionCollector:f,onboardComplete:g,onboardTimestamp:_}}function ut(e,t){let n=new ct({name:t.serverName??`aikit`,version:Pe()},{capabilities:{logging:{},completions:{},prompts:{}}});return o(n),h(n,t.toolPrefix??``),Q(n,e,t,r(n),new u(n),f(n)),c(n,{curated:e.curated,store:e.store,graphStore:e.graphStore},t.indexMode),n}function Q(e,t,n,r,i,a,o,s){l(e),p(e),Ne(e,t.embedder,t.store,t.graphStore,t.bridge,t.evolutionCollector,a),_e(e,t.store),Ie(e,t.store,t.graphStore,t.curated,{onboardComplete:t.onboardComplete,onboardTimestamp:t.onboardTimestamp},n,o,s),ne(e,n),ke(e,t.indexer,n,t.curated,t.store,i,o),Ae(e,t.curated,t.policyStore,t.evolutionCollector,i),Le(e,t.curated,i),me(e,t.curated,i),Oe(e,t.curated),ge(e,t.curated),ee(e,t.store,t.embedder),y(e,t.store,t.embedder),C(e,t.store,t.embedder),S(e,t.store,t.embedder),x(e,t.store,t.embedder),b(e,t.store,t.embedder),w(e,t.store,t.embedder,t.graphStore),De(e,n),ye(e,t.store,t.embedder,n),he(e,t.graphStore),T(e,t.store,t.embedder);let c=n.sources[0]?.path??process.cwd();A(e,t.embedder,t.fileCache,c),re(e,t.embedder,t.store),N(e,t.embedder,t.store),le(e),we(e),oe(e),ae(e,t.embedder,t.store),P(e,t.embedder,t.store,t.graphStore),ce(e),I(e),Ce(e),q(e),K(e),ve(e),W(e),Me(e),M(e,t.fileCache,c),be(e),G(e),F(e,t.embedder,t.store,t.graphStore),V(e),H(e),j(e,t.embedder,t.store),se(e,a),B(e),xe(e),Se(e),U(e),z(e,o),L(e),de(e,t.embedder),R(e),pe(e,t.embedder,t.fileCache),fe(e,t.embedder,t.store),Ee(e,r),r&&E(e,r),Ke(e),Ve(e),Ue(e),ze(e),He(e),Re(e),We(e),Ge(e),Be(e),J(e),ue(e,n),t.bridge&&(O(e,t.bridge,t.evolutionCollector),D(e,t.bridge),k(e,t.bridge)),t.policyStore&&Te(e,t.policyStore),t.evolutionCollector&&ie(e,t.evolutionCollector),d(e,t.store,t.curated),je(e)}async function dt(e){let t=await Z(e),n=ut(t,e);X.info(`MCP server configured`,{toolCount:$.length,resourceCount:2});let r=async()=>{try{let n=e.sources.map(e=>e.path).join(`, `);X.info(`Running initial index`,{sourcePaths:n});let r=await t.indexer.index(e,e=>{e.phase===`crawling`||e.phase===`done`||(e.phase===`chunking`&&e.currentFile&&X.debug(`Indexing file`,{current:e.filesProcessed+1,total:e.filesTotal,file:e.currentFile}),e.phase===`cleanup`&&X.debug(`Index cleanup`,{staleEntries:e.filesTotal-e.filesProcessed}))});X.info(`Initial index complete`,{filesProcessed:r.filesProcessed,filesSkipped:r.filesSkipped,chunksCreated:r.chunksCreated,durationMs:r.durationMs});try{await t.store.createFtsIndex()}catch(e){X.warn(`FTS index creation failed`,Y(e))}try{let e=await t.curated.reindexAll();X.info(`Curated re-index complete`,{indexed:e.indexed})}catch(e){X.error(`Curated re-index failed`,Y(e))}}catch(e){X.error(`Initial index failed; will retry on aikit_reindex`,Y(e))}},i=async()=>{X.info(`Shutting down`),await Promise.all([t.embedder.shutdown().catch(()=>{}),t.graphStore.close().catch(()=>{}),t.store.close().catch(()=>{})]),process.exit(0)};process.on(`SIGINT`,i),process.on(`SIGTERM`,i);let a=process.ppid,o=setInterval(()=>{try{process.kill(a,0)}catch{X.info(`Parent process died; shutting down`,{parentPid:a}),clearInterval(o),i()}},5e3);return o.unref(),{server:n,runInitialIndex:r,shutdown:i}}const ft=new Set(`batch.brainstorm.changelog.check.checkpoint.codemod.compact.config.data_transform.delegate.diff_parse.digest.encode.env.eval.evidence_map.file_summary.forge_classify.git_context.graph.guide.health.http.lane.measure.onboard.parse_output.present.process.produce_knowledge.queue.read.regex_test.reindex.remember.rename.replay.restore.schema_validate.scope_map.snippet.stash.status.stratum_card.test_run.time.update.forget.list.watch.web_fetch.web_search.workset`.split(`.`)),pt=5e3,mt=new Set(`brainstorm.changelog.check.checkpoint.codemod.data_transform.delegate.diff_parse.encode.env.eval.evidence_map.forge_classify.git_context.guide.present.health.http.lane.measure.parse_output.process.produce_knowledge.queue.regex_test.rename.replay.restore.schema_validate.snippet.stash.status.test_run.time.watch.web_fetch.web_search.workset`.split(`.`));function ht(e){oe(e),ce(e),I(e),le(e),se(e),q(e),K(e),ve(e),W(e),G(e),we(e),Ce(e),be(e),Me(e),xe(e),Se(e),B(e),V(e),H(e),U(e),z(e),L(e),R(e),Ee(e),E(e,i),De(e),je(e),Fe(e),Ke(e),Ve(e),Ue(e),ze(e),He(e),Re(e),We(e),Ge(e),Be(e),J(e)}const $=`analyze_dependencies.analyze_diagram.analyze_entry_points.analyze_patterns.analyze_structure.analyze_symbols.audit.batch.blast_radius.brainstorm.changelog.check.checkpoint.codemod.compact.config.data_transform.dead_symbols.delegate.diff_parse.digest.encode.env.eval.evidence_map.file_summary.find.flow_info.flow_list.flow_reset.flow_start.flow_status.flow_step.forge_classify.forge_ground.forget.git_context.graph.guide.health.http.lane.list.lookup.measure.onboard.parse_output.present.process.produce_knowledge.queue.read.regex_test.reindex.remember.rename.replay.restore.schema_validate.scope_map.search.snippet.stash.status.stratum_card.symbol.test_run.time.trace.update.watch.web_fetch.web_search.workset`.split(`.`);function gt(n,i){let l=new ct({name:n.serverName??`aikit`,version:Pe()},{capabilities:{logging:{},completions:{},prompts:{}}}),d=`initializing`,p=``,y=!1,b=null,x=null,S=null;function ee(e){if(!e||typeof e!=`object`)return[];let t=e,n=[];for(let e of[`path`,`file`,`source_path`,`sourcePath`,`filePath`]){let r=t[e];typeof r==`string`&&r&&n.push(r)}for(let e of[`changed_files`,`paths`,`files`]){let r=t[e];if(Array.isArray(r))for(let e of r){if(typeof e==`string`){n.push(e);continue}e&&typeof e==`object`&&typeof e.path==`string`&&n.push(e.path)}}if(Array.isArray(t.sources))for(let e of t.sources)e&&typeof e==`object`&&typeof e.path==`string`&&n.push(e.path);return n}let C=()=>d===`failed`?[`❌ AI Kit initialization failed — this tool is unavailable.`,``,p?`Error: ${p}`:``,``,`**35 tools are still available** and fully functional:`,`check, eval, test_run, git_context, health, measure, web_fetch, web_search,`,`regex_test, encode, stash, checkpoint, lane, process, time, env, and more.`,``,`Try restarting the MCP server to retry initialization.`].filter(Boolean).join(`
1
+ import{BackgroundTaskScheduler as e}from"./background-task.js";import{clearCompletionCache as t}from"./completions.js";import{installCompressionInterceptor as n}from"./compression-interceptor.js";import{CuratedKnowledgeManager as r}from"./curated-manager.js";import{createElicitor as i,noopElicitor as a}from"./elicitor.js";import{IdleTimer as o}from"./idle-timer.js";import{bridgeMcpLogging as s}from"./mcp-logging.js";import{MemoryMonitor as c}from"./memory-monitor.js";import{registerPrompts as l}from"./prompts.js";import{installReplayInterceptor as u}from"./replay-interceptor.js";import{ResourceNotifier as d}from"./resources/resource-notifier.js";import{registerResources as f}from"./resources/resources.js";import{createSamplingClient as p}from"./sampling.js";import{installStructuredContentGuard as m}from"./structured-content-guard.js";import{getToolMeta as h}from"./tool-metadata.js";import{installToolPrefix as g}from"./tool-prefix.js";import{ToolTimeoutError as _,getToolTimeout as v,withTimeout as ee}from"./tool-timeout.js";import{registerAnalyzeDependenciesTool as y,registerAnalyzeDiagramTool as b,registerAnalyzeEntryPointsTool as x,registerAnalyzePatternsTool as te,registerAnalyzeStructureTool as S,registerAnalyzeSymbolsTool as C,registerBlastRadiusTool as w}from"./tools/analyze.tools.js";import{registerAuditTool as ne}from"./tools/audit.tool.js";import{registerBrainstormTool as T}from"./tools/brainstorm.tool.js";import{initBridgeComponents as E,registerErPullTool as D,registerErPushTool as O,registerErSyncStatusTool as re}from"./tools/bridge.tools.js";import{registerConfigTool as k}from"./tools/config.tool.js";import{registerCompactTool as A,registerDeadSymbolsTool as j,registerFileSummaryTool as M,registerFindTool as ie,registerScopeMapTool as N,registerSymbolTool as P,registerTraceTool as ae}from"./tools/context.tools.js";import{registerErEvolveReviewTool as oe}from"./tools/evolution.tools.js";import{registerBatchTool as se,registerCheckTool as F,registerDelegateTool as I,registerEvalTool as L,registerParseOutputTool as R,registerTestRunTool as z}from"./tools/execution.tools.js";import{registerFlowTools as ce}from"./tools/flow.tools.js";import{registerDigestTool as le,registerEvidenceMapTool as B,registerForgeClassifyTool as V,registerForgeGroundTool as ue,registerStratumCardTool as de}from"./tools/forge.tools.js";import{registerForgetTool as fe}from"./tools/forget.tool.js";import{registerGraphTool as pe}from"./tools/graph.tool.js";import{registerGuideTool as H,registerHealthTool as U,registerProcessTool as W,registerWatchTool as G,registerWebFetchTool as K}from"./tools/infra.tools.js";import{registerListTool as me}from"./tools/list.tool.js";import{registerLookupTool as he}from"./tools/lookup.tool.js";import{registerCodemodTool as ge,registerDataTransformTool as q,registerDiffParseTool as _e,registerGitContextTool as ve,registerRenameTool as ye}from"./tools/manipulation.tools.js";import{registerOnboardTool as be}from"./tools/onboard.tool.js";import{registerCheckpointTool as xe,registerLaneTool as Se,registerQueueTool as Ce,registerStashTool as we,registerWorksetTool as Te}from"./tools/persistence.tools.js";import{registerErUpdatePolicyTool as Ee}from"./tools/policy.tools.js";import{registerPresentTool as De}from"./tools/present/tool.js";import"./tools/present/index.js";import{registerProduceKnowledgeTool as Oe}from"./tools/produce.tool.js";import{registerReadTool as ke}from"./tools/read.tool.js";import{registerReindexTool as Ae}from"./tools/reindex.tool.js";import{registerRememberTool as je}from"./tools/remember.tool.js";import{registerReplayTool as Me}from"./tools/replay.tool.js";import{registerRestoreTool as Ne}from"./tools/restore.tool.js";import{registerSearchTool as Pe}from"./tools/search.tool.js";import{getCurrentVersion as Fe}from"./version-check.js";import{registerEarlyStatusTool as Ie,registerStatusTool as Le}from"./tools/status.tool.js";import{registerUpdateTool as Re}from"./tools/update.tool.js";import{registerChangelogTool as ze,registerEncodeTool as Be,registerEnvTool as Ve,registerHttpTool as He,registerMeasureTool as Ue,registerRegexTestTool as We,registerSchemaValidateTool as Ge,registerSnippetTool as Ke,registerTimeTool as qe,registerWebSearchTool as Je}from"./tools/utility.tools.js";import{existsSync as Ye,statSync as Xe}from"node:fs";import{resolve as Ze}from"node:path";import{AIKIT_PATHS as Qe,createLogger as $e,serializeError as J}from"../../core/dist/index.js";import{initializeWasm as et}from"../../chunker/dist/index.js";import{OnnxEmbedder as tt}from"../../embeddings/dist/index.js";import{EvolutionCollector as nt,PolicyStore as rt}from"../../enterprise-bridge/dist/index.js";import{FileHashCache as it,IncrementalIndexer as at}from"../../indexer/dist/index.js";import{SqliteGraphStore as ot,createStore as st}from"../../store/dist/index.js";import{FileCache as ct}from"../../tools/dist/index.js";import{completable as lt}from"@modelcontextprotocol/sdk/server/completable.js";import{McpServer as ut}from"@modelcontextprotocol/sdk/server/mcp.js";import{z as dt}from"zod";const Y=$e(`server`);async function X(e){Y.info(`Initializing AI Kit components`);let[t,n,i,a]=await Promise.all([(async()=>{let t=new tt({model:e.embedding.model,dimensions:e.embedding.dimensions});return await t.initialize(),Y.info(`Embedder loaded`,{modelId:t.modelId,dimensions:t.dimensions}),t})(),(async()=>{let t=await st({backend:e.store.backend,path:e.store.path});return await t.initialize(),Y.info(`Store initialized`),t})(),(async()=>{let t=new ot({path:e.store.path});return await t.initialize(),Y.info(`Graph store initialized`),t})(),(async()=>{let e=await et();return e?Y.info(`WASM tree-sitter enabled for AST analysis`):Y.warn(`WASM tree-sitter not available; analyzers will use regex fallback`),e})()]),o=new at(t,n),s=new it(e.store.path);s.load(),o.setHashCache(s);let c=e.curated.path,l=new r(c,n,t);o.setGraphStore(i);let u=E(e.er),d=u?new rt(e.curated.path):void 0;d&&Y.info(`Policy store initialized`,{ruleCount:d.getRules().length});let f=u?new nt:void 0,p=Ze(e.sources[0]?.path??process.cwd(),Qe.aiKb),m=Ye(p),h=e.onboardDir?Ye(e.onboardDir):!1,g=m||h,_,v=m?p:e.onboardDir;if(g&&v)try{_=Xe(v).mtime.toISOString()}catch{}return Y.info(`Onboard state detected`,{onboardComplete:g,onboardTimestamp:_,aiKbExists:m,onboardDirExists:h}),{embedder:t,store:n,indexer:o,curated:l,graphStore:i,fileCache:new ct,bridge:u,policyStore:d,evolutionCollector:f,onboardComplete:g,onboardTimestamp:_}}function ft(e,t){let n=new ut({name:t.serverName??`aikit`,version:Fe()},{capabilities:{logging:{},completions:{},prompts:{}}});return s(n),g(n,t.toolPrefix??``),Z(n,e,t,i(n),new d(n),p(n)),l(n,{curated:e.curated,store:e.store,graphStore:e.graphStore},t.indexMode),n}function Z(e,t,r,i,a,o,s,c){u(e),m(e),n(e),Pe(e,t.embedder,t.store,t.graphStore,t.bridge,t.evolutionCollector,o),he(e,t.store),Le(e,t.store,t.graphStore,t.curated,{onboardComplete:t.onboardComplete,onboardTimestamp:t.onboardTimestamp},r,s,c),k(e,r),Ae(e,t.indexer,r,t.curated,t.store,a,s),je(e,t.curated,t.policyStore,t.evolutionCollector,a),Re(e,t.curated,a),fe(e,t.curated,a),ke(e,t.curated),me(e,t.curated),S(e,t.store,t.embedder),y(e,t.store,t.embedder),C(e,t.store,t.embedder),te(e,t.store,t.embedder),x(e,t.store,t.embedder),b(e,t.store,t.embedder),w(e,t.store,t.embedder,t.graphStore),Oe(e,r),be(e,t.store,t.embedder,r),pe(e,t.graphStore),ne(e,t.store,t.embedder);let l=r.sources[0]?.path??process.cwd();A(e,t.embedder,t.fileCache,l),N(e,t.embedder,t.store),ie(e,t.embedder,t.store),R(e),Te(e),F(e),se(e,t.embedder,t.store),P(e,t.embedder,t.store,t.graphStore),L(e),z(e),we(e),ve(e),_e(e),ye(e),ge(e),Ne(e),M(e,t.fileCache,l),xe(e),q(e),ae(e,t.embedder,t.store,t.graphStore),W(e),G(e),j(e,t.embedder,t.store),I(e,o),U(e),Se(e),Ce(e),K(e),H(e,s),B(e),le(e,t.embedder),V(e),de(e,t.embedder,t.fileCache),ue(e,t.embedder,t.store),De(e,i),i&&T(e,i),Je(e),He(e),We(e),Be(e),Ue(e),ze(e),Ge(e),Ke(e),Ve(e),qe(e),ce(e,r),t.bridge&&(O(e,t.bridge,t.evolutionCollector),D(e,t.bridge),re(e,t.bridge)),t.policyStore&&Ee(e,t.policyStore),t.evolutionCollector&&oe(e,t.evolutionCollector),f(e,t.store,t.curated),Me(e)}async function pt(e){let t=await X(e),n=ft(t,e);Y.info(`MCP server configured`,{toolCount:$.length,resourceCount:2});let r=async()=>{try{let n=e.sources.map(e=>e.path).join(`, `);Y.info(`Running initial index`,{sourcePaths:n});let r=await t.indexer.index(e,e=>{e.phase===`crawling`||e.phase===`done`||(e.phase===`chunking`&&e.currentFile&&Y.debug(`Indexing file`,{current:e.filesProcessed+1,total:e.filesTotal,file:e.currentFile}),e.phase===`cleanup`&&Y.debug(`Index cleanup`,{staleEntries:e.filesTotal-e.filesProcessed}))});Y.info(`Initial index complete`,{filesProcessed:r.filesProcessed,filesSkipped:r.filesSkipped,chunksCreated:r.chunksCreated,durationMs:r.durationMs});try{await t.store.createFtsIndex()}catch(e){Y.warn(`FTS index creation failed`,J(e))}try{let e=await t.curated.reindexAll();Y.info(`Curated re-index complete`,{indexed:e.indexed})}catch(e){Y.error(`Curated re-index failed`,J(e))}}catch(e){Y.error(`Initial index failed; will retry on aikit_reindex`,J(e))}},i=async()=>{Y.info(`Shutting down`),await Promise.all([t.embedder.shutdown().catch(()=>{}),t.graphStore.close().catch(()=>{}),t.store.close().catch(()=>{})]),process.exit(0)};process.on(`SIGINT`,i),process.on(`SIGTERM`,i);let a=process.ppid,o=setInterval(()=>{try{process.kill(a,0)}catch{Y.info(`Parent process died; shutting down`,{parentPid:a}),clearInterval(o),i()}},5e3);return o.unref(),{server:n,runInitialIndex:r,shutdown:i}}const mt=new Set(`batch.brainstorm.changelog.check.checkpoint.codemod.compact.config.data_transform.delegate.diff_parse.digest.encode.env.eval.evidence_map.file_summary.forge_classify.git_context.graph.guide.health.http.lane.measure.onboard.parse_output.present.process.produce_knowledge.queue.read.regex_test.reindex.remember.rename.replay.restore.schema_validate.scope_map.snippet.stash.status.stratum_card.test_run.time.update.forget.list.watch.web_fetch.web_search.workset`.split(`.`)),ht=5e3,Q=new Set(`brainstorm.changelog.check.checkpoint.codemod.data_transform.delegate.diff_parse.encode.env.eval.evidence_map.forge_classify.git_context.guide.present.health.http.lane.measure.parse_output.process.produce_knowledge.queue.regex_test.rename.replay.restore.schema_validate.snippet.stash.status.test_run.time.watch.web_fetch.web_search.workset`.split(`.`));function gt(e){F(e),L(e),z(e),R(e),I(e),ve(e),_e(e),ye(e),ge(e),q(e),Te(e),we(e),xe(e),Ne(e),Se(e),Ce(e),U(e),W(e),G(e),K(e),H(e),B(e),V(e),De(e),T(e,a),Oe(e),Me(e),Ie(e),Je(e),He(e),We(e),Be(e),Ue(e),ze(e),Ge(e),Ke(e),Ve(e),qe(e)}const $=`analyze_dependencies.analyze_diagram.analyze_entry_points.analyze_patterns.analyze_structure.analyze_symbols.audit.batch.blast_radius.brainstorm.changelog.check.checkpoint.codemod.compact.config.data_transform.dead_symbols.delegate.diff_parse.digest.encode.env.eval.evidence_map.file_summary.find.flow_info.flow_list.flow_reset.flow_start.flow_status.flow_step.forge_classify.forge_ground.forget.git_context.graph.guide.health.http.lane.list.lookup.measure.onboard.parse_output.present.process.produce_knowledge.queue.read.regex_test.reindex.remember.rename.replay.restore.schema_validate.scope_map.search.snippet.stash.status.stratum_card.symbol.test_run.time.trace.update.watch.web_fetch.web_search.workset`.split(`.`);function _t(n,r){let a=new ut({name:n.serverName??`aikit`,version:Fe()},{capabilities:{logging:{},completions:{},prompts:{}}}),u=`initializing`,f=``,m=!1,y=null,b=null,x=null;function te(e){if(!e||typeof e!=`object`)return[];let t=e,n=[];for(let e of[`path`,`file`,`source_path`,`sourcePath`,`filePath`]){let r=t[e];typeof r==`string`&&r&&n.push(r)}for(let e of[`changed_files`,`paths`,`files`]){let r=t[e];if(Array.isArray(r))for(let e of r){if(typeof e==`string`){n.push(e);continue}e&&typeof e==`object`&&typeof e.path==`string`&&n.push(e.path)}}if(Array.isArray(t.sources))for(let e of t.sources)e&&typeof e==`object`&&typeof e.path==`string`&&n.push(e.path);return n}let S=()=>u===`failed`?[`❌ AI Kit initialization failed — this tool is unavailable.`,``,f?`Error: ${f}`:``,``,`**35 tools are still available** and fully functional:`,`check, eval, test_run, git_context, health, measure, web_fetch, web_search,`,`regex_test, encode, stash, checkpoint, lane, process, time, env, and more.`,``,`Try restarting the MCP server to retry initialization.`].filter(Boolean).join(`
2
2
  `):[`AI Kit is still initializing (loading embeddings model & store).`,``,`**35 tools are already available** while initialization completes — including:`,`check, eval, test_run, git_context, health, measure, web_fetch, web_search,`,`regex_test, encode, stash, checkpoint, lane, process, time, env, and more.`,``,`This tool requires the AI Kit index. Please retry in a few seconds,`,`or use one of the available tools above in the meantime.`].join(`
3
- `);o(l),h(l,n.toolPrefix??``);let w=l.sendToolListChanged.bind(l);l.sendToolListChanged=()=>{};let T=[];for(let e of $){let t=m(e),n=l.registerTool(e,{title:t.title,description:`${t.title} — initializing, available shortly`,inputSchema:{},annotations:t.annotations},async()=>({content:[{type:`text`,text:C()}]}));mt.has(e)?n.remove():T.push(n)}ht(l),l.sendToolListChanged=w;let E=l.registerResource(`aikit-status`,`aikit://status`,{description:`AI Kit status (initializing...)`,mimeType:`text/plain`},async()=>({contents:[{uri:`aikit://status`,text:`AI Kit is initializing...`,mimeType:`text/plain`}]})),te=l.registerPrompt(`_init`,{description:`Initializing AI Kit…`,argsSchema:{_dummy:st(lt.string(),()=>[])}},async()=>({messages:[]})),D,O=new Promise(e=>{D=e}),k,ne=new Promise(e=>{k=e}),A=()=>k?.(),j=(async()=>{await ne;let e;try{e=await Z(n)}catch(e){d=`failed`,p=e instanceof Error?e.message:String(e),X.error(`AI Kit initialization failed — server continuing with zero-dep tools only`,{error:p});return}let o=l.sendToolListChanged.bind(l);l.sendToolListChanged=()=>{};let m=l.sendPromptListChanged.bind(l);l.sendPromptListChanged=()=>{};let h=l.sendResourceListChanged.bind(l);l.sendResourceListChanged=()=>{};for(let e of T)e.remove();E.remove(),te.remove();let C=l._registeredTools??{};for(let e of mt)C[e]?.remove();let w=new u(l),O=f(l);Q(l,e,n,r(l),w,O,i,i===`smart`?(()=>{let e=S;return e?.getState?e.getState():null}):null),c(l,{curated:e.curated,store:e.store,graphStore:e.graphStore},i),l.sendToolListChanged=o,l.sendPromptListChanged=m,l.sendResourceListChanged=h,Promise.resolve(l.sendToolListChanged()).catch(()=>{}),Promise.resolve(l.sendPromptListChanged()).catch(()=>{}),Promise.resolve(l.sendResourceListChanged()).catch(()=>{});let k=l._registeredTools??{};for(let[t,n]of Object.entries(k)){if(ft.has(t))continue;let r=n.handler;n.handler=async(...n)=>{if(!e.indexer.isIndexing)return r(...n);let i=y?`re-indexing`:`running initial index`,a=new Promise(e=>setTimeout(()=>e({content:[{type:`text`,text:`⏳ AI Kit is ${i}. The tool "${t}" timed out waiting for index data (${pt/1e3}s).\n\nThe existing index may be temporarily locked. Please retry shortly — indexing will complete automatically.`}]}),pt));return Promise.race([r(...n),a])}}for(let[e,t]of Object.entries(k)){let n=t.handler,r=_(e);t.handler=async(...t)=>{try{return await v(()=>n(...t),r,e)}catch(t){if(t instanceof g)return{content:[{type:`text`,text:`⏳ Tool "${e}" timed out after ${r/1e3}s. This may indicate a long-running operation. Please retry or break the task into smaller steps.`}]};throw t}}}let A=Object.keys(k).length;A<$.length&&X.warn(`ALL_TOOL_NAMES count mismatch`,{expectedToolCount:$.length,registeredToolCount:A}),X.info(`MCP server configured`,{toolCount:$.length,resourceCount:4});let j=new s;j.onPressure((e,n)=>{e===`warning`&&t(),e===`critical`&&(X.warn(`Memory pressure critical — consider restarting`,{rssMB:Math.round(n/1024/1024)}),t())}),j.start();let M=new a;x=M,M.onIdle(async()=>{if(N.isRunning||e.indexer.isIndexing){X.info(`Idle cleanup deferred — background tasks still running`),M.touch();return}X.info(`Idle cleanup: closing store and graph connections`);try{await Promise.all([e.store.close().catch(()=>{}),e.graphStore.close().catch(()=>{})])}catch{}}),M.touch();for(let e of Object.values(k)){let t=e.handler;e.handler=async(...e)=>{if(M.touch(),S){let t=ee(e[0]);t.length>0&&S.prioritize(...t)}return t(...e)}}b=e,D?.(e)})(),M=async()=>{let e=await O;x?.setBusy(!0);try{let t=n.sources.map(e=>e.path).join(`, `);X.info(`Running initial index`,{sourcePaths:t});let r=await e.indexer.index(n,e=>{e.phase===`crawling`||e.phase===`done`||(e.phase===`chunking`&&e.currentFile&&X.debug(`Indexing file`,{current:e.filesProcessed+1,total:e.filesTotal,file:e.currentFile}),e.phase===`cleanup`&&X.debug(`Index cleanup`,{staleEntries:e.filesTotal-e.filesProcessed}))});y=!0,X.info(`Initial index complete`,{filesProcessed:r.filesProcessed,filesSkipped:r.filesSkipped,chunksCreated:r.chunksCreated,durationMs:r.durationMs});try{await e.store.createFtsIndex()}catch(e){X.warn(`FTS index creation failed`,Y(e))}try{let t=await e.curated.reindexAll();X.info(`Curated re-index complete`,{indexed:t.indexed})}catch(e){X.error(`Curated re-index failed`,Y(e))}}catch(e){X.error(`Initial index failed; will retry on aikit_reindex`,Y(e))}finally{x?.setBusy(!1)}},N=new e,re=()=>N.schedule({name:`initial-index`,fn:M}),P=process.ppid,F=setInterval(()=>{try{process.kill(P,0)}catch{X.info(`Parent process died; shutting down`,{parentPid:P}),clearInterval(F),O.then(async e=>{await Promise.all([e.embedder.shutdown().catch(()=>{}),e.graphStore.close().catch(()=>{}),e.store.close().catch(()=>{})])}).catch(()=>{}).finally(()=>process.exit(0))}},5e3);return F.unref(),{server:l,startInit:A,ready:j,runInitialIndex:re,get kb(){return b},scheduler:N,setSmartScheduler(e){S=e}}}export{$ as ALL_TOOL_NAMES,gt as createLazyServer,ut as createMcpServer,dt as createServer,Z as initializeKnowledgeBase,Q as registerMcpTools};
3
+ `);s(a),g(a,n.toolPrefix??``);let C=a.sendToolListChanged.bind(a);a.sendToolListChanged=()=>{};let w=[];for(let e of $){let t=h(e),n=a.registerTool(e,{title:t.title,description:`${t.title} — initializing, available shortly`,inputSchema:{},annotations:t.annotations},async()=>({content:[{type:`text`,text:S()}]}));Q.has(e)?n.remove():w.push(n)}gt(a),a.sendToolListChanged=C;let ne=a.registerResource(`aikit-status`,`aikit://status`,{description:`AI Kit status (initializing...)`,mimeType:`text/plain`},async()=>({contents:[{uri:`aikit://status`,text:`AI Kit is initializing...`,mimeType:`text/plain`}]})),T=a.registerPrompt(`_init`,{description:`Initializing AI Kit…`,argsSchema:{_dummy:lt(dt.string(),()=>[])}},async()=>({messages:[]})),E,D=new Promise(e=>{E=e}),O,re=new Promise(e=>{O=e}),k=()=>O?.(),A=(async()=>{await re;let e;try{e=await X(n)}catch(e){u=`failed`,f=e instanceof Error?e.message:String(e),Y.error(`AI Kit initialization failed — server continuing with zero-dep tools only`,{error:f});return}let s=a.sendToolListChanged.bind(a);a.sendToolListChanged=()=>{};let h=a.sendPromptListChanged.bind(a);a.sendPromptListChanged=()=>{};let g=a.sendResourceListChanged.bind(a);a.sendResourceListChanged=()=>{};for(let e of w)e.remove();ne.remove(),T.remove();let S=a._registeredTools??{};for(let e of Q)S[e]?.remove();let C=new d(a),D=p(a);Z(a,e,n,i(a),C,D,r,r===`smart`?(()=>{let e=x;return e?.getState?e.getState():null}):null),l(a,{curated:e.curated,store:e.store,graphStore:e.graphStore},r),a.sendToolListChanged=s,a.sendPromptListChanged=h,a.sendResourceListChanged=g,Promise.resolve(a.sendToolListChanged()).catch(()=>{}),Promise.resolve(a.sendPromptListChanged()).catch(()=>{}),Promise.resolve(a.sendResourceListChanged()).catch(()=>{});let O=a._registeredTools??{};for(let[t,n]of Object.entries(O)){if(mt.has(t))continue;let r=n.handler;n.handler=async(...n)=>{if(!e.indexer.isIndexing)return r(...n);let i=m?`re-indexing`:`running initial index`,a=new Promise(e=>setTimeout(()=>e({content:[{type:`text`,text:`⏳ AI Kit is ${i}. The tool "${t}" timed out waiting for index data (${ht/1e3}s).\n\nThe existing index may be temporarily locked. Please retry shortly — indexing will complete automatically.`}]}),ht));return Promise.race([r(...n),a])}}for(let[e,t]of Object.entries(O)){let n=t.handler,r=v(e);t.handler=async(...t)=>{try{return await ee(()=>n(...t),r,e)}catch(t){if(t instanceof _)return{content:[{type:`text`,text:`⏳ Tool "${e}" timed out after ${r/1e3}s. This may indicate a long-running operation. Please retry or break the task into smaller steps.`}]};throw t}}}let k=Object.keys(O).length;k<$.length&&Y.warn(`ALL_TOOL_NAMES count mismatch`,{expectedToolCount:$.length,registeredToolCount:k}),Y.info(`MCP server configured`,{toolCount:$.length,resourceCount:4});let A=new c;A.onPressure((e,n)=>{e===`warning`&&t(),e===`critical`&&(Y.warn(`Memory pressure critical — consider restarting`,{rssMB:Math.round(n/1024/1024)}),t())}),A.start();let j=new o;b=j,j.onIdle(async()=>{if(M.isRunning||e.indexer.isIndexing){Y.info(`Idle cleanup deferred — background tasks still running`),j.touch();return}Y.info(`Idle cleanup: closing store and graph connections`);try{await Promise.all([e.store.close().catch(()=>{}),e.graphStore.close().catch(()=>{})])}catch{}}),j.touch();for(let e of Object.values(O)){let t=e.handler;e.handler=async(...e)=>{if(j.touch(),x){let t=te(e[0]);t.length>0&&x.prioritize(...t)}return t(...e)}}y=e,E?.(e)})(),j=async()=>{let e=await D;b?.setBusy(!0);try{let t=n.sources.map(e=>e.path).join(`, `);Y.info(`Running initial index`,{sourcePaths:t});let r=await e.indexer.index(n,e=>{e.phase===`crawling`||e.phase===`done`||(e.phase===`chunking`&&e.currentFile&&Y.debug(`Indexing file`,{current:e.filesProcessed+1,total:e.filesTotal,file:e.currentFile}),e.phase===`cleanup`&&Y.debug(`Index cleanup`,{staleEntries:e.filesTotal-e.filesProcessed}))});m=!0,Y.info(`Initial index complete`,{filesProcessed:r.filesProcessed,filesSkipped:r.filesSkipped,chunksCreated:r.chunksCreated,durationMs:r.durationMs});try{await e.store.createFtsIndex()}catch(e){Y.warn(`FTS index creation failed`,J(e))}try{let t=await e.curated.reindexAll();Y.info(`Curated re-index complete`,{indexed:t.indexed})}catch(e){Y.error(`Curated re-index failed`,J(e))}}catch(e){Y.error(`Initial index failed; will retry on aikit_reindex`,J(e))}finally{b?.setBusy(!1)}},M=new e,ie=()=>M.schedule({name:`initial-index`,fn:j}),N=process.ppid,P=setInterval(()=>{try{process.kill(N,0)}catch{Y.info(`Parent process died; shutting down`,{parentPid:N}),clearInterval(P),D.then(async e=>{await Promise.all([e.embedder.shutdown().catch(()=>{}),e.graphStore.close().catch(()=>{}),e.store.close().catch(()=>{})])}).catch(()=>{}).finally(()=>process.exit(0))}},5e3);return P.unref(),{server:a,startInit:k,ready:A,runInitialIndex:ie,get kb(){return y},scheduler:M,setSmartScheduler(e){x=e}}}export{$ as ALL_TOOL_NAMES,_t as createLazyServer,ft as createMcpServer,pt as createServer,X as initializeKnowledgeBase,Z as registerMcpTools};
@@ -15,5 +15,5 @@ import{getToolMeta as e}from"../../tool-metadata.js";import{buildBrowserHtml as
15
15
  - "html" (default): Rich markdown in chat + embedded UIResource. Use for display-only content (tables, charts, reports, status boards) where no user interaction is needed.
16
16
  - "browser": Serves a themed dashboard on a local URL. Use ONLY when you need user interaction back (confirmations, selections, form input). The tool blocks until user clicks an action button, then returns their selection.
17
17
  FORMAT RULE: If no user interaction is needed → use "html". If you need user input back → use "browser".
18
- BROWSER WORKFLOW: After calling present with format "browser", you MUST extract the URL from the response and call openBrowserPage({ url }) to open it in VS Code Simple Browser. A system browser fallback also opens automatically, but always call openBrowserPage yourself.`,annotations:r.annotations,inputSchema:_,_meta:{ui:{resourceUri:h}}},async({format:e,title:t,content:r,actions:i,template:a})=>(e??`html`)===`browser`?await w(t,r,i,n,a):T(t,r,i,a))}async function w(e,r,i,a,o){let s=n(e,r),c=t(e,r,i,o),l=p({uri:`ui://aikit/present-browser.html`,content:{type:`rawHtml`,htmlString:c},encoding:`text`,adapters:{mcpApps:{enabled:!0}}}),u,m,h=Array.isArray(i)?i:[],g=``,_;try{b&&=(b.close(),null),h.length>0&&(u=new Promise(e=>{m=e}));let e=!1;g=await new Promise((t,n)=>{let r=f((t,n)=>{if(e||(e=!0,_&&clearTimeout(_)),t.method===`POST`&&t.url===`/callback`){let e=``;t.on(`data`,t=>{e+=t.toString()}),t.on(`end`,()=>{n.writeHead(200,{"Content-Type":`application/json`,"Access-Control-Allow-Origin":`*`}),n.end(`{"ok":true}`);try{let t=JSON.parse(e);m?.(t)}catch{}});return}if(t.method===`OPTIONS`){n.writeHead(204,{"Access-Control-Allow-Origin":`*`,"Access-Control-Allow-Methods":`POST`,"Access-Control-Allow-Headers":`Content-Type`}),n.end();return}n.writeHead(200,{"Content-Type":`text/html; charset=utf-8`}),n.end(c)});r.listen(0,`127.0.0.1`,()=>{let i=r.address();if(typeof i==`object`&&i){b=r;let n=`http://127.0.0.1:${i.port}`;_=setTimeout(()=>{if(!e)try{d(process.platform===`win32`?`start "" "${n}"`:process.platform===`darwin`?`open "${n}"`:`xdg-open "${n}"`)}catch{}},8e3),_.unref(),t(n)}else n(Error(`Failed to start present server`))}),setTimeout(()=>{r.close(),b===r&&(b=null)},300*1e3).unref()})}catch{}let v=g?`${s}\n\n---\n🌐 **Dashboard opened in browser:** ${g}\n\n**IMPORTANT:** You MUST now open this URL using the \`openBrowserPage\` tool (Simple Browser). If that tool is unavailable, open the URL in the system browser as a fallback. If neither works, ask the user to open the URL manually.`:s;if(h.length>0&&a?.available&&u)try{let e=await Promise.race([u,new Promise((e,t)=>setTimeout(()=>t(Error(`timeout`)),300*1e3))]);return{content:[{type:`text`,text:`${v}\n\n✅ **Selected:** ${e.actionId} = \`${e.value}\``},l]}}catch{return{content:[{type:`text`,text:`${v}\n\n⚠️ *No selection received (timed out).*`},l]}}return{content:[{type:`text`,text:v},l]}}function T(e,r,i,a){let o=Array.isArray(i)?i:[],s=n(e,r);if(o.length>0){let e=[``];for(let t=0;t<o.length;t++){let n=o[t],r=typeof n.label==`string`?n.label:`Action ${t+1}`;if(n.type===`select`&&Array.isArray(n.options)){let i=n.options.map(e=>typeof e==`string`?e:e.label).join(`, `);e.push(`${t+1}. **${r}** — choose: ${i}`)}else e.push(`${t+1}. **${r}**`)}s+=`\n${e.join(`
18
+ BROWSER WORKFLOW: After calling present with format "browser", you MUST extract the URL from the response and call openBrowserPage({ url }) to open it in VS Code Simple Browser. A system browser fallback also opens automatically, but always call openBrowserPage yourself.`,annotations:r.annotations,inputSchema:_,_meta:{ui:{resourceUri:h}}},async({format:e,title:t,content:r,actions:i,template:a})=>(e??`html`)===`browser`||Array.isArray(i)&&i.length>0?await w(t,r,i,n,a):T(t,r,i,a))}async function w(e,r,i,a,o){let s=n(e,r),c=t(e,r,i,o),l=p({uri:`ui://aikit/present-browser.html`,content:{type:`rawHtml`,htmlString:c},encoding:`text`,adapters:{mcpApps:{enabled:!0}}}),u,m,h=Array.isArray(i)?i:[],g=``,_;try{b&&=(b.close(),null),h.length>0&&(u=new Promise(e=>{m=e}));let e=!1;g=await new Promise((t,n)=>{let r=f((t,n)=>{if(e||(e=!0,_&&clearTimeout(_)),t.method===`POST`&&t.url===`/callback`){let e=``;t.on(`data`,t=>{e+=t.toString()}),t.on(`end`,()=>{n.writeHead(200,{"Content-Type":`application/json`,"Access-Control-Allow-Origin":`*`}),n.end(`{"ok":true}`);try{let t=JSON.parse(e);m?.(t)}catch{}});return}if(t.method===`OPTIONS`){n.writeHead(204,{"Access-Control-Allow-Origin":`*`,"Access-Control-Allow-Methods":`POST`,"Access-Control-Allow-Headers":`Content-Type`}),n.end();return}n.writeHead(200,{"Content-Type":`text/html; charset=utf-8`}),n.end(c)});r.listen(0,`127.0.0.1`,()=>{let i=r.address();if(typeof i==`object`&&i){b=r;let n=`http://127.0.0.1:${i.port}`;_=setTimeout(()=>{if(!e)try{d(process.platform===`win32`?`start "" "${n}"`:process.platform===`darwin`?`open "${n}"`:`xdg-open "${n}"`)}catch{}},8e3),_.unref(),t(n)}else n(Error(`Failed to start present server`))}),setTimeout(()=>{r.close(),b===r&&(b=null)},300*1e3).unref()})}catch{}let v=g?`${s}\n\n---\n🌐 **Dashboard opened in browser:** ${g}\n\n**IMPORTANT:** You MUST now open this URL using the \`openBrowserPage\` tool (Simple Browser). If that tool is unavailable, open the URL in the system browser as a fallback. If neither works, ask the user to open the URL manually.`:s;if(h.length>0&&a?.available&&u)try{let e=await Promise.race([u,new Promise((e,t)=>setTimeout(()=>t(Error(`timeout`)),300*1e3))]);return{content:[{type:`text`,text:`${v}\n\n✅ **Selected:** ${e.actionId} = \`${e.value}\``},l]}}catch{return{content:[{type:`text`,text:`${v}\n\n⚠️ *No selection received (timed out).*`},l]}}return{content:[{type:`text`,text:v},l]}}function T(e,r,i,a){let o=Array.isArray(i)?i:[],s=n(e,r);if(o.length>0){let e=[``];for(let t=0;t<o.length;t++){let n=o[t],r=typeof n.label==`string`?n.label:`Action ${t+1}`;if(n.type===`select`&&Array.isArray(n.options)){let i=n.options.map(e=>typeof e==`string`?e:e.label).join(`, `);e.push(`${t+1}. **${r}** — choose: ${i}`)}else e.push(`${t+1}. **${r}**`)}s+=`\n${e.join(`
19
19
  `)}`}let c=p({uri:`ui://aikit/present-static.html`,content:{type:`rawHtml`,htmlString:t(e,r,i,a)},encoding:`text`,adapters:{mcpApps:{enabled:!0}}});return{content:[{type:`text`,text:s},c],structuredContent:{title:e,content:r,actions:o}}}export{w as formatAsBrowser,T as formatAsHtml,S as getPresentHtml,C as registerPresentTool,x as resolvePresentHtml};
@@ -19,6 +19,12 @@ interface CompactOptions {
19
19
  segmentation?: 'paragraph' | 'sentence' | 'line';
20
20
  /** Optional file cache — use cached content instead of raw readFile */
21
21
  cache?: FileCache;
22
+ /**
23
+ * Content delivery mode:
24
+ * - 'full' (default): Return compressed text as normal
25
+ * - 'delta': Return only changes since last read (for re-reads of same file)
26
+ */
27
+ mode?: 'full' | 'delta';
22
28
  }
23
29
  interface CompactResult {
24
30
  /** The compressed text */
@@ -1,3 +1,3 @@
1
- import{bookendReorder as e,cosineSimilarity as t,segment as n}from"./text-utils.js";import{readFile as r,stat as i}from"node:fs/promises";async function a(a,o){let{query:s,maxChars:c=3e3,minScore:l=.3,segmentation:u=`paragraph`}=o,d=o.tokenBudget?o.tokenBudget*4:c,f;if(o.text)f=o.text;else if(o.path){let e;try{e=await i(o.path)}catch(e){let t=e.code;throw t===`ENOENT`?Error(`File not found: ${o.path}. Check the path and try again.`):t===`EACCES`||t===`EPERM`?Error(`Permission denied reading ${o.path}. The file exists but is not accessible.`):e}if(e.isDirectory())throw Error(`Path is a directory: ${o.path}. compact requires a file path, not a directory. Use analyze_structure or find to explore directories.`);if(e.size>1e7)throw Error(`File too large (${(e.size/1e6).toFixed(1)}MB). compact supports files up to 10MB. Consider splitting or using search instead.`);f=o.cache?(await o.cache.get(o.path)).content:await r(o.path,`utf-8`)}else throw Error(`Either "text" or "path" must be provided`);if(f.length<=d)return{text:f,originalChars:f.length,compressedChars:f.length,ratio:1,segmentsKept:1,segmentsTotal:1};let p=n(f,u);if(p.length===0)return{text:``,originalChars:f.length,compressedChars:0,ratio:0,segmentsKept:0,segmentsTotal:0};let m=await a.embed(s),h=[];for(let e=0;e<p.length;e++){let n=t(m,await a.embed(p[e]));h.push({text:p[e],score:n,index:e})}let g=h.filter(e=>e.score>=l).sort((e,t)=>t.score-e.score),_=[],v=0;for(let e of g){if(v+e.text.length>d){v===0&&(_.push({...e,text:e.text.slice(0,d)}),v=d);break}_.push(e),v+=e.text.length+2}let y=e(_.sort((e,t)=>t.score-e.score)).map(e=>e.text).join(`
1
+ import{bookendReorder as e,cosineSimilarity as t,segment as n}from"./text-utils.js";import{getDelta as r}from"./compression/delta-cache.js";import{scoreLines as i}from"./compression/scoring.js";import{readFile as a,stat as o}from"node:fs/promises";async function s(s,c){let{query:l,maxChars:u=3e3,minScore:d=.3,segmentation:f=`paragraph`}=c,p=c.tokenBudget?c.tokenBudget*4:u,m;if(c.text)m=c.text;else if(c.path){let e;try{e=await o(c.path)}catch(e){let t=e.code;throw t===`ENOENT`?Error(`File not found: ${c.path}. Check the path and try again.`):t===`EACCES`||t===`EPERM`?Error(`Permission denied reading ${c.path}. The file exists but is not accessible.`):e}if(e.isDirectory())throw Error(`Path is a directory: ${c.path}. compact requires a file path, not a directory. Use analyze_structure or find to explore directories.`);if(e.size>1e7)throw Error(`File too large (${(e.size/1e6).toFixed(1)}MB). compact supports files up to 10MB. Consider splitting or using search instead.`);m=c.cache?(await c.cache.get(c.path)).content:await a(c.path,`utf-8`)}else throw Error(`Either "text" or "path" must be provided`);if(c.mode===`delta`&&c.path){let e=r(c.path,m);if(e.isDelta)return{text:e.text,originalChars:m.length,compressedChars:e.text.length,ratio:e.text.length/m.length,segmentsKept:1,segmentsTotal:1}}if(m.length<=p)return{text:m,originalChars:m.length,compressedChars:m.length,ratio:1,segmentsKept:1,segmentsTotal:1};let h=n(m,f);if(h.length===0)return{text:``,originalChars:m.length,compressedChars:0,ratio:0,segmentsKept:0,segmentsTotal:0};let g=await s.embed(l),_=i(h),v=[];for(let e=0;e<h.length;e++){let n=.85*t(g,await s.embed(h[e]))+.15*(_[e]??0);v.push({text:h[e],score:n,index:e})}let y=v.filter(e=>e.score>=d).sort((e,t)=>t.score-e.score),b=[],x=0;for(let e of y){if(x+e.text.length>p){x===0&&(b.push({...e,text:e.text.slice(0,p)}),x=p);break}b.push(e),x+=e.text.length+2}let S=e(b.sort((e,t)=>t.score-e.score)).map(e=>e.text).join(`
2
2
 
3
- `);return{text:y,originalChars:f.length,compressedChars:y.length,ratio:y.length/f.length,segmentsKept:_.length,segmentsTotal:p.length}}export{a as compact};
3
+ `);return{text:S,originalChars:m.length,compressedChars:S.length,ratio:S.length/m.length,segmentsKept:b.length,segmentsTotal:h.length}}export{s as compact};
@@ -0,0 +1,38 @@
1
+ import { CompressionMode, CompressionResult } from "./compression/types.js";
2
+ import { detectOutputTool } from "./compression/engine.js";
3
+
4
+ //#region packages/tools/src/compress-output.d.ts
5
+ interface CompressOutputOptions {
6
+ /** Raw terminal/shell output text */
7
+ text: string;
8
+ /** Override detected tool (e.g., 'git', 'npm', 'tsc') */
9
+ tool?: string;
10
+ /** Compression mode: structural (default), heuristic, aggressive */
11
+ mode?: CompressionMode;
12
+ /** Maximum output characters (default: 4000) */
13
+ maxChars?: number;
14
+ /** Maximum output tokens (alternative to maxChars, uses 4 chars/token) */
15
+ tokenBudget?: number;
16
+ }
17
+ /**
18
+ * Compress terminal/shell output using intelligent rule-based compression.
19
+ *
20
+ * Automatically detects the tool that produced the output (git, npm, tsc,
21
+ * vitest, docker, kubectl, ESLint, etc.) and applies tool-specific
22
+ * compression strategies that preserve critical information while reducing
23
+ * token count.
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * const result = compressTerminalOutput({
28
+ * text: rawGitDiff,
29
+ * maxChars: 3000,
30
+ * });
31
+ * // result.text contains compressed output
32
+ * // result.rule tells which compression rule was applied
33
+ * // result._meta.truncated tells if output was further truncated
34
+ * ```
35
+ */
36
+ declare function compressTerminalOutput(options: CompressOutputOptions): CompressionResult;
37
+ //#endregion
38
+ export { CompressOutputOptions, type CompressionMode, type CompressionResult, compressTerminalOutput, detectOutputTool };
@@ -0,0 +1 @@
1
+ import{compressOutput as e,detectOutputTool as t}from"./compression/engine.js";import"./compression/rules/index.js";function n(t){let{text:n,tool:r,mode:i=`structural`,maxChars:a,tokenBudget:o}=t;return e(n,{mode:i,maxChars:o?o*4:a??4e3,tool:r})}export{n as compressTerminalOutput,t as detectOutputTool};
@@ -0,0 +1,29 @@
1
+ //#region packages/tools/src/compression/delta-cache.d.ts
2
+ interface DeltaCacheEntry {
3
+ hash: string;
4
+ text: string;
5
+ timestamp: number;
6
+ }
7
+ interface DeltaResult {
8
+ /** The delta text (diff or full text if no prior version) */
9
+ text: string;
10
+ /** Whether this is a delta (true) or full text (false) */
11
+ isDelta: boolean;
12
+ /** Content hash of current version */
13
+ hash: string;
14
+ }
15
+ /**
16
+ * Get delta for a given key (typically file path).
17
+ * Returns unified diff if prior version cached, or full text otherwise.
18
+ */
19
+ declare function getDelta(key: string, currentText: string): DeltaResult;
20
+ /**
21
+ * Clear the delta cache (useful for testing).
22
+ */
23
+ declare function clearDeltaCache(): void;
24
+ /**
25
+ * Check if a key has a cached version.
26
+ */
27
+ declare function hasCachedVersion(key: string): boolean;
28
+ //#endregion
29
+ export { DeltaCacheEntry, DeltaResult, clearDeltaCache, getDelta, hasCachedVersion };
@@ -0,0 +1 @@
1
+ import{createHash as e}from"node:crypto";import{createTwoFilesPatch as t}from"diff";import{LRUCache as n}from"lru-cache";const r=new n({max:200,ttl:1e3*60*30});function i(t){return e(`sha256`).update(t).digest(`hex`).slice(0,16)}function a(e,n){let a=i(n),o=r.get(e);if(r.set(e,{hash:a,text:n,timestamp:Date.now()}),!o||o.hash===a)return{text:o?.hash===a?`[No changes since last read]`:n,isDelta:o?.hash===a,hash:a};let s=t(e,e,o.text,n,`previous`,`current`,{context:3});return s.length>=n.length*.8?{text:n,isDelta:!1,hash:a}:{text:s,isDelta:!0,hash:a}}function o(){r.clear()}function s(e){return r.has(e)}export{o as clearDeltaCache,a as getDelta,s as hasCachedVersion};
@@ -0,0 +1,34 @@
1
+ import { CompressionContext, CompressionMode, CompressionResult, CompressionRule } from "./types.js";
2
+
3
+ //#region packages/tools/src/compression/engine.d.ts
4
+ /**
5
+ * Register a compression rule. Rules are auto-sorted by priority (highest first).
6
+ */
7
+ declare function registerRule(rule: CompressionRule): void;
8
+ /**
9
+ * Register multiple compression rules at once.
10
+ */
11
+ declare function registerRules(newRules: CompressionRule[]): void;
12
+ /**
13
+ * Get all registered rules (for testing/inspection).
14
+ */
15
+ declare function getRegisteredRules(): readonly CompressionRule[];
16
+ /**
17
+ * Detect the tool that produced the output.
18
+ * Uses heuristic pattern matching on the raw text.
19
+ */
20
+ declare function detectOutputTool(text: string): string;
21
+ /**
22
+ * Core compression pipeline.
23
+ * 1. Strip ANSI codes
24
+ * 2. Detect tool
25
+ * 3. Find matching rule (priority order)
26
+ * 4. Apply rule or fall back to truncation
27
+ */
28
+ declare function compressOutput(rawText: string, options?: {
29
+ mode?: CompressionMode;
30
+ maxChars?: number;
31
+ tool?: string;
32
+ }): CompressionResult;
33
+ //#endregion
34
+ export { type CompressionContext, type CompressionMode, type CompressionResult, type CompressionRule, compressOutput, detectOutputTool, getRegisteredRules, registerRule, registerRules };
@@ -0,0 +1,4 @@
1
+ import{stripAnsi as e}from"../parse-output.js";import{estimateTokens as t}from"../text-utils.js";const n=[];function r(e){n.push(e),n.sort((e,t)=>t.priority-e.priority)}function i(e){for(let t of e)r(t)}function a(){return n}function o(e){return/^(diff --git|commit [0-9a-f]{7,40}|On branch |Your branch )/m.test(e)?`git`:/^\s*[MADRCU?!]{1,2}\s+\S/m.test(e)&&/^##\s/m.test(e)?`git-status`:/^(npm (warn|ERR!|notice)|added \d+ packages?|up to date)/m.test(e)?`npm`:/^(Packages|Progress):/m.test(e)||/pnpm/.test(e)?`pnpm`:/✓|✗|PASS|FAIL|Tests?\s+\d+\s+(passed|failed)/m.test(e)||/^(PASS|FAIL)\s+\S/m.test(e)?`test-runner`:/^(error TS\d+|warning TS\d+|\S+\.tsx?[(:]\d+)/m.test(e)?`tsc`:/^\S+\.\w+:\d+:\d+\s+(error|warning|info)/m.test(e)||/Found \d+ (error|warning)/m.test(e)?`lint`:/^(CONTAINER ID|IMAGE|REPOSITORY|Step \d+\/\d+|--->)/m.test(e)||/docker|Dockerfile/i.test(e)?`docker`:/^(NAME\s+READY|NAMESPACE\s|kubectl)/m.test(e)?`kubectl`:`unknown`}function s(r,i={}){let{mode:a=`structural`,maxChars:s=4e3}=i,c=e(r),l=i.tool??o(c),u=c.length;if(u<=s)return{text:c,originalChars:u,compressedChars:c.length,ratio:1,rule:`passthrough`,tool:l,_meta:{truncated:!1,mode:a}};let d={text:c,tool:l,mode:a,maxChars:s,originalChars:u};for(let e of n)if(e.match(d)){let n=e.compress(d),r=n.length,i=r>s?`${n.slice(0,s-50)}\n... [truncated ${r-s+50} chars, ~${t(n.slice(s-50))} tokens]`:n;return{text:i,originalChars:u,compressedChars:i.length,ratio:i.length/u,rule:e.name,tool:l,_meta:{truncated:r>s,mode:a}}}let f=Math.floor(s*.6),p=s-f-60,m=c.split(`
2
+ `),h=``,g=0;for(let e of m){if(h.length+e.length+1>f)break;h+=`${h?`
3
+ `:``}${e}`,g++}let _=``,v=0;for(let e=m.length-1;e>=g&&!(_.length+m[e].length+1>p);e--)_=`${m[e]}${_?`
4
+ `:``}${_}`,v++;let y=`\n... [${m.length-g-v} lines omitted (${Math.max(0,u-h.length-_.length)} chars, ~${t(c.slice(h.length,Math.max(h.length,c.length-_.length)))} tokens)] ...\n`,b=`${h}${y}${_}`;return{text:b,originalChars:u,compressedChars:b.length,ratio:b.length/u,rule:`fallback-truncation`,tool:l,_meta:{truncated:!0,mode:a}}}export{s as compressOutput,o as detectOutputTool,a as getRegisteredRules,r as registerRule,i as registerRules};
@@ -0,0 +1,20 @@
1
+ //#region packages/tools/src/compression/litm.d.ts
2
+ /**
3
+ * LITM-aware block positioning for multi-source digest.
4
+ * Liu et al. TACL 2024: LLMs attend more to start and end positions.
5
+ * Re-orders source blocks so highest-relevance sources appear at edges.
6
+ */
7
+ interface ScoredBlock {
8
+ id: string;
9
+ text: string;
10
+ /** Maximum segment score for this source block */
11
+ maxScore: number;
12
+ }
13
+ /**
14
+ * Reorder source blocks using bookend (U-curve) positioning.
15
+ * Highest-scoring blocks placed at start and end positions.
16
+ * Input order is preserved for blocks with equal scores.
17
+ */
18
+ declare function reorderBlocksLITM(blocks: ScoredBlock[]): ScoredBlock[];
19
+ //#endregion
20
+ export { ScoredBlock, reorderBlocksLITM };
@@ -0,0 +1 @@
1
+ function e(e){if(e.length<=2)return e;let t=[...e].sort((e,t)=>t.maxScore-e.maxScore),n=Array(t.length),r=0,i=t.length-1;for(let e=0;e<t.length;e++)e%2==0?n[r++]=t[e]:n[i--]=t[e];return n}export{e as reorderBlocksLITM};
@@ -0,0 +1,24 @@
1
+ //#region packages/tools/src/compression/mmr.d.ts
2
+ /**
3
+ * MMR (Maximal Marginal Relevance) deduplication for digest segments.
4
+ * Prevents near-identical segments from consuming budget.
5
+ * Uses bigram Jaccard similarity for fast structural comparison.
6
+ */
7
+ interface MMRCandidate {
8
+ index: number;
9
+ text: string;
10
+ /** Query relevance score (0-1) */
11
+ relevance: number;
12
+ }
13
+ /**
14
+ * Select segments using MMR to balance relevance and diversity.
15
+ *
16
+ * @param candidates - Segments with their relevance scores
17
+ * @param lambda - Trade-off: 1.0 = pure relevance, 0.0 = pure diversity (default: 0.7)
18
+ * @param maxItems - Maximum items to select (default: all)
19
+ * @param safetyThreshold - Segments above this relevance are always kept (default: 0.8)
20
+ * @returns Selected candidates in MMR order
21
+ */
22
+ declare function mmrSelect(candidates: MMRCandidate[], lambda?: number, maxItems?: number, safetyThreshold?: number): MMRCandidate[];
23
+ //#endregion
24
+ export { MMRCandidate, mmrSelect };
@@ -0,0 +1 @@
1
+ function e(e){let t=new Set,n=e.toLowerCase().replace(/\s+/g,` `);for(let e=0;e<n.length-1;e++)t.add(n.slice(e,e+2));return t}function t(e,t){if(e.size===0&&t.size===0)return 1;let n=0;for(let r of e)t.has(r)&&n++;let r=e.size+t.size-n;return r===0?0:n/r}function n(n,r=.7,i,a=.8){if(n.length===0)return[];let o=i??n.length,s=[],c=[],l=new Set(n.map((e,t)=>t)),u=n.map(t=>e(t.text));for(;s.length<o&&l.size>0;){let e=-1,i=-1/0;for(let o of l){let l=n[o];if(l.relevance>=a&&s.length===0){e=o;break}let d=0;for(let e of c){let n=t(u[o],e);n>d&&(d=n)}let f=r*l.relevance-(1-r)*d;f>i&&(i=f,e=o)}if(e===-1)break;s.push(n[e]),c.push(u[e]),l.delete(e)}return s}export{n as mmrSelect};
@@ -0,0 +1,11 @@
1
+ import { CompressionRule } from "../types.js";
2
+
3
+ //#region packages/tools/src/compression/rules/docker.d.ts
4
+ /**
5
+ * Compression rule for Docker build/run output.
6
+ * Preserves: build errors, final image info, layer cache hits.
7
+ * Collapses: download progress, intermediate steps.
8
+ */
9
+ declare const dockerRule: CompressionRule;
10
+ //#endregion
11
+ export { dockerRule };
@@ -0,0 +1,3 @@
1
+ const e={name:`docker`,toolPatterns:[`docker`],priority:8,match(e){return e.tool===`docker`},compress(e){let t=e.text.split(`
2
+ `),n=[],r=0,i=0;for(let e of t){if(e.match(/^(ERROR|error|Error|WARNING|SECURITY)/i)||e.includes(`failed`)){n.push(e);continue}if(e.match(/^Step \d+\/\d+\s*:/)){n.push(e);continue}if(e.match(/^\s*(FROM|RUN|COPY|ADD|WORKDIR|ENV|EXPOSE|CMD|ENTRYPOINT)\s/i)){n.push(e);continue}if(e.includes(`CACHED`)||e.includes(`Using cache`)){r++;continue}if(e.match(/^[a-f0-9]+:\s*(Pull|Download|Extract|Waiting|Verifying)/)){i++;continue}if(e.match(/^(Successfully|sha256:|REPOSITORY|IMAGE ID|CONTAINER ID)/)){n.push(e);continue}if(e.match(/^\S{12}\s+\S+/)&&!e.match(/^[a-f0-9]+:/)){n.push(e);continue}e.match(/^#\d+\s/)&&n.push(e)}return r>0&&n.push(`[${r} cached layers]`),i>0&&n.push(`[${i} download/extract operations]`),n.join(`
3
+ `)}};export{e as dockerRule};
@@ -0,0 +1,11 @@
1
+ import { CompressionRule } from "../types.js";
2
+
3
+ //#region packages/tools/src/compression/rules/generic.d.ts
4
+ /**
5
+ * Generic compression rule — lowest priority fallback.
6
+ * Handles: dedup repeated lines, collapse blank lines, smart truncation.
7
+ * Applied when no specific tool rule matches.
8
+ */
9
+ declare const genericRule: CompressionRule;
10
+ //#endregion
11
+ export { genericRule };
@@ -0,0 +1,3 @@
1
+ const e={name:`generic`,toolPatterns:[/.*/],priority:0,match(e){return e.tool===`unknown`||!e.tool},compress(e){let t=e.text.split(`
2
+ `),n=[],r=``,i=0,a=0;for(let e of t){let t=e.trim();if(t===``){a++,a<=1&&n.push(``);continue}if(a=0,t===r.trim()){i++;continue}i>0&&(n.push(` [repeated ${i} more times]`),i=0),r=e,n.push(e)}return i>0&&n.push(` [repeated ${i} more times]`),n.join(`
3
+ `)}};export{e as genericRule};
@@ -0,0 +1,11 @@
1
+ import { CompressionRule } from "../types.js";
2
+
3
+ //#region packages/tools/src/compression/rules/git.d.ts
4
+ /**
5
+ * Compression rule for git diff and git log output.
6
+ * Preserves: file list, +/- stats, error messages.
7
+ * Collapses: hunk bodies, repeated context lines.
8
+ */
9
+ declare const gitRule: CompressionRule;
10
+ //#endregion
11
+ export { gitRule };
@@ -0,0 +1,3 @@
1
+ const e={name:`git`,toolPatterns:[`git`,`git-status`],priority:10,match(e){return e.tool===`git`||e.tool===`git-status`},compress(e){let t=e.text.split(`
2
+ `),n=[],r=!1,i=0,a=0,o=``;for(let s of t){if(s.startsWith(`diff --git`)||s.startsWith(`---`)||s.startsWith(`+++`)){r&&(i>0||a>0)&&n.push(` [${i}+ ${a}- lines in ${o}]`),r=!1,i=0,a=0,n.push(s),s.startsWith(`diff --git`)&&(o=s.replace(/^diff --git a\/\S+ b\//,``));continue}if(s.startsWith(`@@`)){r&&(i>0||a>0)&&n.push(` [${i}+ ${a}- lines]`),r=!0,i=0,a=0,n.push(s);continue}if(e.tool===`git-status`){n.push(s);continue}if(r){s.startsWith(`+`)?i++:s.startsWith(`-`)&&a++;continue}if(s.startsWith(`commit `)||s.startsWith(`Author:`)||s.startsWith(`Date:`)||s.startsWith(`On branch`)||s.match(/^\s*\d+ file/)||s.match(/insertion|deletion/)){n.push(s);continue}if(s.startsWith(`error:`)||s.startsWith(`fatal:`)||s.startsWith(`warning:`)){n.push(s);continue}/^\s{4}\S/.test(s)&&n.push(s)}return r&&(i>0||a>0)&&n.push(` [${i}+ ${a}- lines in ${o}]`),n.join(`
3
+ `)}};export{e as gitRule};
@@ -0,0 +1,14 @@
1
+ import { CompressionRule } from "../types.js";
2
+ import { dockerRule } from "./docker.js";
3
+ import { genericRule } from "./generic.js";
4
+ import { gitRule } from "./git.js";
5
+ import { kubectlRule } from "./kubectl.js";
6
+ import { lintRule } from "./lint.js";
7
+ import { npmRule } from "./npm.js";
8
+ import { testRunnerRule } from "./test-runner.js";
9
+
10
+ //#region packages/tools/src/compression/rules/index.d.ts
11
+ /** All built-in compression rules */
12
+ declare const allRules: CompressionRule[];
13
+ //#endregion
14
+ export { allRules, dockerRule, genericRule, gitRule, kubectlRule, lintRule, npmRule, testRunnerRule };
@@ -0,0 +1 @@
1
+ import{registerRules as e}from"../engine.js";import{dockerRule as t}from"./docker.js";import{genericRule as n}from"./generic.js";import{gitRule as r}from"./git.js";import{kubectlRule as i}from"./kubectl.js";import{lintRule as a}from"./lint.js";import{npmRule as o}from"./npm.js";import{testRunnerRule as s}from"./test-runner.js";const c=[r,o,s,a,t,i,n];e(c);export{c as allRules,t as dockerRule,n as genericRule,r as gitRule,i as kubectlRule,a as lintRule,o as npmRule,s as testRunnerRule};
@@ -0,0 +1,11 @@
1
+ import { CompressionRule } from "../types.js";
2
+
3
+ //#region packages/tools/src/compression/rules/kubectl.d.ts
4
+ /**
5
+ * Compression rule for kubectl/Kubernetes output.
6
+ * Preserves: pod statuses, error events, resource summaries.
7
+ * Collapses: normal events, verbose resource details.
8
+ */
9
+ declare const kubectlRule: CompressionRule;
10
+ //#endregion
11
+ export { kubectlRule };
@@ -0,0 +1,3 @@
1
+ const e={name:`kubectl`,toolPatterns:[`kubectl`,`k8s`],priority:8,match(e){return e.tool===`kubectl`},compress(e){let t=e.text.split(`
2
+ `),n=[],r=0;for(let e of t){if(e.match(/^(NAME|NAMESPACE|LAST SEEN|TYPE)\s+/)){n.push(e);continue}if(e.match(/\b(Warning|Error|Failed|CrashLoopBackOff|OOMKilled|Evicted|Pending)\b/i)){n.push(e);continue}if(e.match(/^\S+\s+\d+\/\d+\s+(Running|Error|CrashLoop|Pending|Completed|Terminating)/)){n.push(e);continue}if(e.match(/^\d+[smhd]\s+.*Normal\s/)){r++;continue}e.match(/^\S+\s+/)&&e.trim().length>0&&n.push(e)}return r>0&&n.push(`[${r} normal events]`),n.join(`
3
+ `)}};export{e as kubectlRule};
@@ -0,0 +1,11 @@
1
+ import { CompressionRule } from "../types.js";
2
+
3
+ //#region packages/tools/src/compression/rules/lint.d.ts
4
+ /**
5
+ * Compression rule for linter output (ESLint, Biome, tsc errors, etc.).
6
+ * Preserves: error locations, error messages grouped by severity.
7
+ * Collapses: passing files, verbose context.
8
+ */
9
+ declare const lintRule: CompressionRule;
10
+ //#endregion
11
+ export { lintRule };
@@ -0,0 +1,3 @@
1
+ const e={name:`lint`,toolPatterns:[`lint`,`tsc`,`eslint`,`biome`],priority:10,match(e){return e.tool===`lint`||e.tool===`tsc`},compress(e){let t=e.text.split(`
2
+ `),n=[],r=[],i=0;for(let e of t){if(e.match(/:\d+:\d+\s+error\b/i)||e.match(/^error\s+TS\d+/)){n.push(e);continue}if(e.match(/:\d+:\d+\s+warning\b/i)||e.match(/^warning\s+TS\d+/)){r.push(e);continue}if(e.match(/:\d+:\d+\s+(info|hint)\b/i)){i++;continue}if(e.match(/Found \d+|✖\s+\d+|errors?\s+and\s+\d+\s+warning|problems?.*error/i)){n.push(e);continue}e.match(/^\s*\d+ error/)&&n.push(e)}let a=[];return n.length>0&&(a.push(`=== ERRORS (${n.length}) ===`),a.push(...n.slice(0,30)),n.length>30&&a.push(`[${n.length-30} more errors]`)),r.length>0&&(a.push(`=== WARNINGS (${r.length}) ===`),a.push(...r.slice(0,10)),r.length>10&&a.push(`[${r.length-10} more warnings]`)),i>0&&a.push(`[${i} info/hint messages]`),a.length===0&&a.push(`[No errors or warnings found]`),a.join(`
3
+ `)}};export{e as lintRule};
@@ -0,0 +1,11 @@
1
+ import { CompressionRule } from "../types.js";
2
+
3
+ //#region packages/tools/src/compression/rules/npm.d.ts
4
+ /**
5
+ * Compression rule for npm/pnpm/yarn output.
6
+ * Preserves: errors, warnings summary, added/removed counts.
7
+ * Collapses: progress bars, individual package names, verbose logs.
8
+ */
9
+ declare const npmRule: CompressionRule;
10
+ //#endregion
11
+ export { npmRule };
@@ -0,0 +1,3 @@
1
+ const e={name:`npm`,toolPatterns:[`npm`,`pnpm`,`yarn`],priority:10,match(e){return e.tool===`npm`||e.tool===`pnpm`},compress(e){let t=e.text.split(`
2
+ `),n=[],r=0,i=0,a=[];for(let e of t){if(e.includes(`ERR!`)||e.startsWith(`npm error`)||e.includes(`ERESOLVE`)){a.push(e);continue}if(e.includes(`npm warn`)||e.includes(`WARN`)){r++,r<=3&&n.push(e);continue}if(e.includes(`notice`)){i++;continue}if(!(e.includes(`timing`)||e.includes(`http fetch`)||/^\s*$/.test(e))){if(e.match(/^(added|removed|changed|up to date|audited|found \d+)/)){n.push(e);continue}if(e.match(/^(Packages:|Progress:|Done in|dependencies:)/)){n.push(e);continue}e.match(/^(>|\$)\s/)&&n.push(e)}}return r>3&&n.push(`[${r-3} more warnings]`),i>0&&n.push(`[${i} notices]`),a.length>0&&(n.unshift(`=== ERRORS ===`),n.splice(1,0,...a)),n.join(`
3
+ `)}};export{e as npmRule};
@@ -0,0 +1,11 @@
1
+ import { CompressionRule } from "../types.js";
2
+
3
+ //#region packages/tools/src/compression/rules/test-runner.d.ts
4
+ /**
5
+ * Compression rule for test runner output (vitest, jest, mocha, etc.).
6
+ * Preserves: test failures with stack traces, summary line.
7
+ * Collapses: passing tests into count, verbose watch output.
8
+ */
9
+ declare const testRunnerRule: CompressionRule;
10
+ //#endregion
11
+ export { testRunnerRule };
@@ -0,0 +1,3 @@
1
+ const e={name:`test-runner`,toolPatterns:[`test-runner`,`vitest`,`jest`,`mocha`],priority:10,match(e){return e.tool===`test-runner`},compress(e){let t=e.text.split(`
2
+ `),n=[],r=0,i=!1,a=[];for(let e of t){if(e.match(/Tests?\s+\d+\s+(passed|failed)|Test Suites:|test.*files?|Duration/i)){n.push(e);continue}if(e.match(/^(FAIL|✗|×|✖)\s/)||e.match(/^\s*(FAIL|Error|AssertionError)/)){i&&a.length>0&&n.push(...a),i=!0,a=[e];continue}if(i){if(e.match(/^\s+(at\s|Expected|Received|>\s|\d+\s*\||⎯|─)/)||e.trim().length===0){a.length<12&&a.push(e);continue}n.push(...a),i=!1,a=[]}if(e.match(/^(PASS|✓|✔|√)\s/)||e.match(/^\s*✓\s/)){r++;continue}if(e.match(/^\s*(PASS|FAIL|RUN)\s+\S+\.(test|spec)\./)){n.push(e);continue}e.match(/^(Rerun|Watch|press|Waiting|stdout)/)||e.trim()}return i&&a.length>0&&n.push(...a),r>0&&n.unshift(`[${r} tests passed]`),n.join(`
3
+ `)}};export{e as testRunnerRule};
@@ -0,0 +1,26 @@
1
+ //#region packages/tools/src/compression/scoring.d.ts
2
+ /**
3
+ * Score a line of text by BPE token density (surprise).
4
+ * Higher score = more information-dense content.
5
+ * Range: 0.0 to 1.0
6
+ */
7
+ declare function bpeSurprise(line: string): number;
8
+ /**
9
+ * Score text lines with composite BPE surprise scoring.
10
+ * Combines token density with rare token frequency.
11
+ *
12
+ * @param lines - Array of text lines to score
13
+ * @returns Array of scores (0.0 to 1.0) in same order as input
14
+ */
15
+ declare function scoreLines(lines: string[]): number[];
16
+ /**
17
+ * Fallback scoring using Shannon character entropy.
18
+ * Used when BPE tokenizer is unavailable.
19
+ */
20
+ declare function shannonEntropy(text: string): number;
21
+ /**
22
+ * Score a single line with fallback to entropy if BPE fails.
23
+ */
24
+ declare function scoreLine(line: string): number;
25
+ //#endregion
26
+ export { bpeSurprise, scoreLine, scoreLines, shannonEntropy };
@@ -0,0 +1 @@
1
+ import{encode as e}from"gpt-tokenizer/model/gpt-4o";const t=.6;function n(n){if(!n||n.length===0)return 0;let r=e(n),i=n.length;return i===0?0:Math.min(r.length/i,t)/t}function r(n){if(n.length===0)return[];let r=new Map,i=[];for(let t of n){let n=e(t);i.push(n);for(let e of n)r.set(e,(r.get(e)??0)+1)}let a=[];for(let e=0;e<n.length;e++){let o=n[e],s=i[e];if(!o||s.length===0){a.push(0);continue}let c=Math.min(s.length/o.length,t)/t,l=0;for(let e of s)(r.get(e)??0)===1&&l++;let u=l/s.length,d=.6*c+.4*u;a.push(Math.min(d,1))}return a}function i(e){if(!e||e.length===0)return 0;let t=new Map;for(let n of e)t.set(n,(t.get(n)??0)+1);let n=0,r=e.length;for(let e of t.values()){let t=e/r;t>0&&(n-=t*Math.log2(t))}return Math.min(n/6.6,1)}function a(e){try{return n(e)}catch{return i(e)}}export{n as bpeSurprise,a as scoreLine,r as scoreLines,i as shannonEntropy};