@gencode/agents 0.5.0 → 0.6.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,42 @@
1
1
  # @gencode/agents
2
2
 
3
+ ## 0.6.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 7d6e6c8: Replace CLI session encryption keys with gocryptfs-backed .aimax mounts while keeping the `--encrypt-sessions` switch.
8
+
9
+ ## 0.6.0
10
+
11
+ ### Minor Changes
12
+
13
+ - c0283fc: ### Auto-Skills Runtime and Review Workflow
14
+
15
+ Added the learned auto-skills runtime and CLI controls.
16
+
17
+ - Added `.aimax/auto-skills` storage support with `categories.json`, single-level category slugs, `SKILL.md` entrypoints, generated `metadata.json`, archived/active status handling, and `.reviews/run-log.jsonl` audit records for completed review-agent runs.
18
+ - Added `AutoSkillsLoader` APIs to list categories, list active learned skills by category, search compact skill metadata, view a selected `SKILL.md`, and load bounded resource files inside an auto-skill directory.
19
+ - Added manifest-based in-memory and prompt snapshot caching for auto-skill indexes, with cache invalidation after category, create, update, and archive writes.
20
+ - Added main-agent read tools: `auto_skill_categories`, `auto_skill_list`, `auto_skill_search`, and `auto_skill_view`; these are hidden when `autoSkills.load.enabled` is false.
21
+ - Added a system-prompt auto-skills section that routes the main agent from categories to list/view/search while preferring curated, user, and plugin skills when both apply.
22
+ - Added the restricted `auto_skill_manage` tool for internal review-agent use only, supporting `create_category`, `create`, `update`, and `archive` actions with structured success/error payloads.
23
+ - Added public/internal agent visibility, keeping `visibility: internal` definitions out of public custom-agent delegation and `subagent_spawn` selection while still allowing explicit internal orchestration to resolve them by name.
24
+ - Added post-run auto-skill review lifecycle modes: `off`, `gate`, `dry_run`, and `write`, replacing legacy score thresholds with configurable scope-based gates for the full session, current run, and post-review window.
25
+ - Added per-session auto-skill review state with `maxReviewsPerSession`, attempted/completed/failed timestamps, and a reviewed-transcript cursor so repeat reviews focus on newly accumulated work.
26
+ - Added pre-gate skips for subagents, cron runs, run errors, HITL pauses, pending UI tools, gate misses, and sessions that already reached their review cap.
27
+ - Added compact review packets with session/current-run/review-window ranges, stats, tool stats, loaded/viewed skills, failed tool summaries, active categories, review state, and evidence file locations.
28
+ - Added the review-only `auto_skill_review_context_view` tool so the internal curator can read bounded review-window, current-run, recent-conversation, explicit transcript-range, or referenced tool-result evidence.
29
+ - Added silent internal curator integration for dry-run and write review modes, including diagnostic timing events, sanitized tool-result diagnostics, sanitized write-tool arguments, durable-write summaries parsed from `auto_skill_manage` results, and completed/failed review run logs.
30
+ - Added the named internal `auto-skill-reviewer` agent for review orchestration, applying its prompt, init prompt, model override, and tool restrictions to silent review turns; review runs now skip with diagnostics when that internal agent is not configured.
31
+ - Added `--system-agents-dir` and `AIMAX_SYSTEM_AGENTS_DIR` controls for `run` and `resume`, including absolute-path validation, CLI-over-env precedence, start-log reporting, and propagation through direct runs, HITL resumes, UI tool resumes, and run-dispatched resume flows.
32
+ - Added CLI controls for `run` and `resume`: `--auto-skills-load-enabled`, `--auto-skills-review-mode`, `AIMAX_AUTO_SKILLS_LOAD_ENABLED`, and `AIMAX_AUTO_SKILLS_REVIEW_MODE`, including validation, option-overrides-env precedence, and propagation through direct runs, resumed HITL runs, UI tool resumes, and run-dispatched resume flows; when these controls are unset, the agents layer defaults to `load.enabled=false` and `review.mode=write`.
33
+ - Exported auto-skills loader helpers, review gate/state helpers, public types, and read-tool factories from the package entrypoints.
34
+
35
+ ### Patch Changes
36
+
37
+ - 18e17e4: Relax Microcompact staleness handling so tool results stay inline for the last 48 hours and remain protected within the most recent three user turns.
38
+ - c39239c: Use AES-GCM session encryption with CLI-supplied key rotation support so session files no longer rely on reversible encoding alone.
39
+
3
40
  ## 0.5.0
4
41
 
5
42
  ### Minor Changes
@@ -0,0 +1,71 @@
1
+ import{t as e}from"./rolldown-runtime-CNxR59P3.js";import{createRequire as t}from"node:module";import n from"node:fs/promises";import r,{basename as i}from"node:path";import a,{randomUUID as o}from"node:crypto";import s from"node:fs";async function c(e){try{return await n.readFile(e,`utf-8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}}async function l(e,t,r){await n.writeFile(e,t,`utf-8`)}async function u(e,t,r){if(!r){await n.appendFile(e,t,`utf-8`);return}let i=await c(e);await l(e,i?i+t:t,!0)}async function d(e,t,r){let i=`${e}.${process.pid}.${Date.now()}.tmp`;await n.writeFile(i,t,`utf-8`),await n.rename(i,e)}async function f(e){return c(e)}const ee=`sessions`,p=2e3,m=new Map;function h(e){let t=e?.trim()||ee;if(!/^[A-Za-z0-9_-]+$/.test(t))throw Error(`Invalid session store name: ${e}. Must match /^[A-Za-z0-9_-]+$/`);return t}function te(e,t){let n=t.trim();if(!/^[A-Za-z0-9_-]+$/.test(n))throw Error(`Invalid ${e}: ${t}. Must match /^[A-Za-z0-9_-]+$/`);return n}function g(e,t){return r.join(e,`.aimax`,h(t?.storeName))}function _(e,t,n){let i=n?.subagent?te(`subagent session id`,t):t;if(n?.subagent){if(n.subagent.parentDir)return r.join(n.subagent.parentDir,`subagents`,i);let t=te(`parent session id`,n.subagent.parentSessionId);return r.join(g(e,n),t,`subagents`,i)}return r.join(g(e,n),i)}function v(e,t,n){return r.join(_(e,t,n),`transcript.jsonl`)}function y(e,t,n){return r.join(_(e,t,n),`artifacts.json`)}function b(e,t,n){return r.join(_(e,t,n),`session.json`)}function x(e,t,n){return r.join(_(e,t,n),`context.json`)}function S(e,t,n){return r.join(_(e,t,n),`session-memory.json`)}function ne(e,t,n){return r.join(_(e,t,n),`collapse-log.jsonl`)}function re(e,t,n){return r.join(_(e,t,n),`tool-results`)}function C(e,t,n){return r.join(_(e,t,n),`cron-executions.jsonl`)}const w={version:2,updatedAt:new Date(0).toISOString(),readStates:[],toolResults:[],compaction:{budgets:[],snips:[],collapseSpans:[],consecutiveAutocompactFailures:0}};async function ie(e,t,i){let a=i?.sessionId??o(),s=_(e,a,i);await n.mkdir(s,{recursive:!0});let c=r.join(s,`.channel`);return await n.writeFile(c,t,`utf-8`),a}async function T(e,t,r){let i=_(e,t,r);await n.mkdir(i,{recursive:!0})}async function E(e,t,n){let r=await c(v(e,t,n));if(r===null)return[];let i=[];for(let e of r.split(`
2
+ `)){let t=e.trim();if(t)try{i.push(JSON.parse(t))}catch{}}return i}async function ae(e,t,n,r){await T(e,t,r);let i=y(e,t,r),a=r?.encryptSessions??!1;await le(i,async()=>{let e=await D(i);await ce(i,{version:1,updatedAt:new Date().toISOString(),operations:[...e.operations,se(n)]},a)})}async function oe(e,t,n){return(await D(y(e,t,n))).operations}function se(e){let t=e.content.length,n=t>p;return{...e,content:n?`${e.content.slice(0,Math.max(0,p-3))}...`:e.content,timestamp:new Date().toISOString(),truncated:n,originalChars:t}}async function D(e){let t=await c(e);if(t===null)return O();try{let e=JSON.parse(t);return e.version!==1||!Array.isArray(e.operations)?O():{version:1,updatedAt:typeof e.updatedAt==`string`?e.updatedAt:new Date(0).toISOString(),operations:e.operations}}catch{return O()}}function O(){return{version:1,updatedAt:new Date(0).toISOString(),operations:[]}}async function ce(e,t,i){await n.mkdir(r.dirname(e),{recursive:!0}),await d(e,`${JSON.stringify(t,null,2)}\n`,i)}async function le(e,t){let n=(m.get(e)??Promise.resolve()).catch(()=>{}).then(t);m.set(e,n);try{await n}finally{m.get(e)===n&&m.delete(e)}}async function ue(e,t,n,i){await T(e,t,i);let a=v(e,t,i);await u(a,JSON.stringify(n)+`
3
+ `,i?.encryptSessions??!1);try{let{resolveMemoryProvider:t}=await import(`./provider-registry-CxtHsHdk.js`).then(e=>e.t),{createBuiltinMemoryProvider:n}=await Promise.resolve().then(()=>$),o=r.join(e,`.aimax`),s=t({providerId:i?.providerId,pluginId:i?.pluginId,dataDir:e,memoryDir:o,sessionStoreName:i?.storeName})?.provider??n({dataDir:e,memoryDir:o,sessionStoreName:i?.storeName});s.noteSessionUpdate&&s.noteSessionUpdate(a)}catch{}i?.onMemoryChanged&&await Promise.resolve(i.onMemoryChanged({reason:`transcript-append`,files:[r.join(h(i.storeName),t,`transcript.jsonl`).replace(/\\/g,`/`)],source:`sessions`,sessionId:t,providerId:i.providerId??i.pluginId,timestamp:new Date().toISOString()})).catch(()=>{})}async function de(e,t,n,i){await T(e,t,i);let a=v(e,t,i),o=n(await E(e,t,i)),s=o.map(e=>JSON.stringify(e)).join(`
4
+ `),c=i?.encryptSessions??!1;await l(a,s.length>0?`${s}\n`:``,c);try{let{resolveMemoryProvider:t}=await import(`./provider-registry-CxtHsHdk.js`).then(e=>e.t),{createBuiltinMemoryProvider:n}=await Promise.resolve().then(()=>$),o=r.join(e,`.aimax`),s=t({providerId:i?.providerId,pluginId:i?.pluginId,dataDir:e,memoryDir:o,sessionStoreName:i?.storeName})?.provider??n({dataDir:e,memoryDir:o,sessionStoreName:i?.storeName});s.noteSessionUpdate&&s.noteSessionUpdate(a)}catch{}return i?.onMemoryChanged&&await Promise.resolve(i.onMemoryChanged({reason:`transcript-rewrite`,files:[r.join(h(i.storeName),t,`transcript.jsonl`).replace(/\\/g,`/`)],source:`sessions`,sessionId:t,providerId:i.providerId??i.pluginId,timestamp:new Date().toISOString()})).catch(()=>{}),o}async function fe(e,t,n,r){await T(e,t,r),await u(C(e,t,r),JSON.stringify(n)+`
5
+ `,r?.encryptSessions??!1)}async function pe(e,t,n){let r=await c(C(e,t,n));if(r===null)return[];let i=[];for(let e of r.split(`
6
+ `)){let t=e.trim();if(t)try{i.push(JSON.parse(t))}catch{}}return i}async function k(e,t){let r=g(e,t);try{return(await n.readdir(r,{withFileTypes:!0})).filter(e=>e.isDirectory()).map(e=>e.name).sort()}catch(e){if(e.code===`ENOENT`)return[];throw e}}async function A(e,t,n){await T(e,t.id,n);let r=b(e,t.id,n),i=n?.encryptSessions??!1;await l(r,JSON.stringify(t,null,2),i)}async function me(e,t,n,r){let i=await j(e,t,r);if(!i)return null;let a={...i,...n,id:i.id,createdAt:i.createdAt,updatedAt:new Date().toISOString()};return await A(e,a,r),a}async function j(e,t,i){let a=await c(b(e,t,i));if(a===null)return null;try{let o=JSON.parse(a);if(!o.channel){let a=r.join(_(e,t,i),`.channel`);try{o.channel=(await n.readFile(a,`utf-8`)).trim()}catch{o.channel=`WEB`}}return o}catch{return null}}async function he(e,t,n){let r=await k(e,n),i=await Promise.all(r.map(async t=>{let r=await j(e,t,n);return{id:t,title:r?.title??t,channel:r?.channel??`WEB`,createdAt:r?.createdAt??``,updatedAt:r?.updatedAt??``}}));return t?i.filter(e=>e.channel===t):i}async function M(e,t,n){let r=await c(x(e,t,n));if(r===null)return w;try{let e=JSON.parse(r),t=typeof e.version==`number`?e.version:void 0;return t!==1&&t!==2?w:{version:2,updatedAt:typeof e.updatedAt==`string`?e.updatedAt:w.updatedAt,readStates:Array.isArray(e.readStates)?e.readStates:[],toolResults:Array.isArray(e.toolResults)?e.toolResults:[],compaction:{sessionMemory:e.compaction?.sessionMemory,modelUsage:e.compaction?.modelUsage,budgets:Array.isArray(e.compaction?.budgets)?e.compaction.budgets:[],snips:Array.isArray(e.compaction?.snips)?e.compaction.snips:[],collapseSpans:Array.isArray(e.compaction?.collapseSpans)?e.compaction.collapseSpans:[],consecutiveAutocompactFailures:typeof e.compaction?.consecutiveAutocompactFailures==`number`?e.compaction.consecutiveAutocompactFailures:0,lastCompactionAt:typeof e.compaction?.lastCompactionAt==`string`?e.compaction.lastCompactionAt:void 0,lastCompactionLayer:e.compaction?.lastCompactionLayer===`L1`||e.compaction?.lastCompactionLayer===`L2`||e.compaction?.lastCompactionLayer===`L3`||e.compaction?.lastCompactionLayer===`L4`||e.compaction?.lastCompactionLayer===`L5`||e.compaction?.lastCompactionLayer===`L6`?e.compaction.lastCompactionLayer:void 0}}}catch{return w}}async function ge(e,t,r){let i=_(e,t,r);try{return(await n.stat(i)).isDirectory()}catch(e){if(e.code===`ENOENT`)return!1;throw e}}async function N(e,t,n){let[r,i,a]=await Promise.all([j(e,t,n),E(e,t,n),M(e,t,n)]);return{id:t,metadata:r,transcriptPath:v(e,t,n),contextSnapshotPath:x(e,t,n),sessionMemoryPath:S(e,t,n),collapseLogPath:ne(e,t,n),toolResultsDir:re(e,t,n),transcriptEntryCount:i.length,readStateCount:a.readStates.length,toolResultRefCount:a.toolResults.length,transcriptEntries:i,context:a}}async function _e(e,t,n){let r=await N(e,t,n);return{id:r.id,metadata:r.metadata,transcript:r.transcriptEntries,context:r.context,paths:{transcriptPath:r.transcriptPath,contextSnapshotPath:r.contextSnapshotPath,sessionMemoryPath:r.sessionMemoryPath,collapseLogPath:r.collapseLogPath,toolResultsDir:r.toolResultsDir}}}function P(e){return!!(e&&typeof e==`object`&&`code`in e&&e.code===`ENOENT`)}async function ve(e){let t;try{t=await n.lstat(e)}catch(e){if(P(e))return{missing:!0};throw e}if(t.isSymbolicLink()||!t.isFile())throw Error(`path required`);return{missing:!1,stat:t}}function ye(e){try{s.mkdirSync(e,{recursive:!0})}catch{}return e}function be(e){return e.trim().replace(/^[./]+/,``).replace(/\\/g,`/`)}function xe(e){let t=be(e);return t?t===`MEMORY.md`||t===`memory.md`?!0:t.startsWith(`memory/`):!1}async function Se(e,t){let i=await n.readdir(e,{withFileTypes:!0});for(let n of i){let i=r.join(e,n.name);if(!n.isSymbolicLink()){if(n.isDirectory()){await Se(i,t);continue}n.isFile()&&n.name.endsWith(`.md`)&&t.push(i)}}}async function F(e){let t=[],i=r.join(e,`MEMORY.md`),a=r.join(e,`memory.md`),o=r.join(e,`memory`),s=async e=>{try{let r=await n.lstat(e);if(r.isSymbolicLink()||!r.isFile()||!e.endsWith(`.md`))return;t.push(e)}catch{}};await s(i),await s(a);try{let e=await n.lstat(o);!e.isSymbolicLink()&&e.isDirectory()&&await Se(o,t)}catch{}if(t.length<=1)return t;let c=new Set,l=[];for(let e of t){let t=e;try{t=await n.realpath(e)}catch{}c.has(t)||(c.add(t),l.push(e))}return l}function I(e){return a.createHash(`sha256`).update(e).digest(`hex`)}async function Ce(e,t){let i;try{i=await n.stat(e)}catch(e){if(P(e))return null;throw e}let a;try{a=await n.readFile(e,`utf-8`)}catch(e){if(P(e))return null;throw e}let o=I(a);return{path:r.relative(t,e).replace(/\\/g,`/`),absPath:e,mtimeMs:i.mtimeMs,size:i.size,hash:o}}function we(e,t){let n=e.split(`
7
+ `);if(n.length===0)return[];let r=Math.max(32,t.tokens*4),i=Math.max(0,t.overlap*4),a=[],o=[],s=0,c=()=>{if(o.length===0)return;let e=o[0],t=o[o.length-1];if(!e||!t)return;let n=o.map(e=>e.line).join(`
8
+ `),r=e.lineNo,i=t.lineNo;a.push({startLine:r,endLine:i,text:n,hash:I(n)})},l=()=>{if(i<=0||o.length===0){o=[],s=0;return}let e=0,t=[];for(let n=o.length-1;n>=0;--n){let r=o[n];if(r&&(e+=r.line.length+1,t.unshift(r),e>=i))break}o=t,s=t.reduce((e,t)=>e+t.line.length+1,0)};for(let e=0;e<n.length;e+=1){let t=n[e]??``,i=e+1,a=[];if(t.length===0)a.push(``);else for(let e=0;e<t.length;e+=r)a.push(t.slice(e,e+r));for(let e of a){let t=e.length+1;s+t>r&&o.length>0&&(c(),l()),o.push({line:e,lineNo:i}),s+=t}}return c(),a}function Te(e,t){if(!(!t||t.length===0))for(let n of e)n.startLine=t[n.startLine-1]??n.startLine,n.endLine=t[n.endLine-1]??n.endLine}function L(e){try{let t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}function Ee(e,t){if(e.length===0||t.length===0)return 0;let n=Math.min(e.length,t.length),r=0,i=0,a=0;for(let o=0;o<n;o+=1){let n=e[o]??0,s=t[o]??0;r+=n*s,i+=n*n,a+=s*s}return i===0||a===0?0:r/(Math.sqrt(i)*Math.sqrt(a))}function De(e){return(e.toLowerCase().match(/[\p{L}\p{N}_]+/gu)??[]).filter(Boolean)}function Oe(e){return a.createHash(`sha256`).update(e).digest().readUInt32BE(0)}function R(e,t=384){let n=Array(t).fill(0),r=De(e);if(r.length===0)return n;for(let e of r){let r=Oe(e)%t;n[r]+=1}let i=Math.sqrt(n.reduce((e,t)=>e+t*t,0));if(i>0)for(let e=0;e<n.length;e+=1)n[e]=n[e]/i;return n}function z(e){let t=e?.model?.trim()||`mock-embedding-v1`,n=e?.dimensions??384;return{id:`external-mock`,model:t,embedQuery:async e=>R(e,n),embedBatch:async e=>e.map(e=>R(e,n))}}const B=new class{providers=new Map;byPluginId=new Map;register(e){this.providers.set(e.id,e),e.pluginId&&this.byPluginId.set(e.pluginId,e.id)}getById(e){return this.providers.get(e)}getByPluginId(e){let t=this.byPluginId.get(e);return t?this.providers.get(t):void 0}clear(){this.providers.clear(),this.byPluginId.clear()}};function ke(e){let t=e.id?.trim()||e.pluginId;return B.register({id:t,pluginId:e.pluginId,create:e.create,config:e.config,rootDir:e.rootDir,source:e.source}),t}function V(e){let t=e.providerId?.trim(),n=e.pluginId?.trim(),r=(t?B.getById(t):void 0)??(n?B.getByPluginId(n):void 0);return r?{provider:r.create({dataDir:e.dataDir,memoryDir:e.memoryDir,pluginId:r.pluginId,config:r.config,rootDir:r.rootDir,source:r.source}),registration:r}:null}function Ae(){B.clear()}const H={enabled:!1,lambda:.7};function U(e){let t=e.toLowerCase().match(/[a-z0-9_]+/g)??[];return new Set(t)}function je(e,t){if(e.size===0&&t.size===0)return 1;if(e.size===0||t.size===0)return 0;let n=0,r=e.size<=t.size?e:t,i=e.size<=t.size?t:e;for(let e of r)i.has(e)&&n++;let a=e.size+t.size-n;return a===0?0:n/a}function Me(e,t,n){if(t.length===0)return 0;let r=0,i=n.get(e.id)??U(e.content);for(let e of t){let t=je(i,n.get(e.id)??U(e.content));t>r&&(r=t)}return r}function Ne(e,t,n){return n*e-(1-n)*t}function Pe(e,t={}){let{enabled:n=H.enabled,lambda:r=H.lambda}=t;if(!n||e.length<=1)return[...e];let i=Math.max(0,Math.min(1,r));if(i===1)return e.slice().sort((e,t)=>t.score-e.score);let a=new Map;for(let t of e)a.set(t.id,U(t.content));let o=Math.max(...e.map(e=>e.score)),s=Math.min(...e.map(e=>e.score)),c=o-s,l=e=>c===0?1:(e-s)/c,u=[],d=new Set(e);for(;d.size>0;){let e=null,t=-1/0;for(let n of d){let r=Ne(l(n.score),Me(n,u,a),i);(r>t||r===t&&n.score>(e?.score??-1/0))&&(t=r,e=n)}if(e)u.push(e),d.delete(e);else break}return u}function Fe(e,t={}){if(e.length===0)return e;let n=new Map;return Pe(e.map((e,t)=>{let r=`${e.path}:${e.startLine}:${t}`;return n.set(r,e),{id:r,score:e.score,content:e.snippet}}),t).map(e=>n.get(e.id))}const W={enabled:!1,halfLifeDays:30},G=/(?:^|\/)(?:memory)\/(\d{4})-(\d{2})-(\d{2})\.md$/;function Ie(e){return!Number.isFinite(e)||e<=0?0:Math.LN2/e}function Le(e){let t=Ie(e.halfLifeDays),n=Math.max(0,e.ageInDays);return t<=0||!Number.isFinite(n)?1:Math.exp(-t*n)}function Re(e){return e.score*Le(e)}function ze(e){let t=e.replaceAll(`\\`,`/`).replace(/^\.\//,``),n=G.exec(t);if(!n)return null;let r=Number(n[1]),i=Number(n[2]),a=Number(n[3]);if(!Number.isInteger(r)||!Number.isInteger(i)||!Number.isInteger(a))return null;let o=Date.UTC(r,i-1,a),s=new Date(o);return s.getUTCFullYear()!==r||s.getUTCMonth()!==i-1||s.getUTCDate()!==a?null:s}function Be(e){let t=e.replaceAll(`\\`,`/`).replace(/^\.\//,``);return t===`MEMORY.md`||t===`memory.md`?!0:t.startsWith(`memory/`)?!G.test(t):!1}async function Ve(e){let t=ze(e.filePath);if(t)return t;if(e.source===`memory`&&Be(e.filePath)||!e.memoryRoot)return null;let i=r.isAbsolute(e.filePath)?e.filePath:r.resolve(e.memoryRoot,e.filePath);try{let e=await n.stat(i);return Number.isFinite(e.mtimeMs)?new Date(e.mtimeMs):null}catch{return null}}function He(e,t){return Math.max(0,t-e.getTime())/864e5}async function Ue(e){let t={...W,...e.temporalDecay};if(!t.enabled)return[...e.results];let n=e.nowMs??Date.now(),r=new Map;return Promise.all(e.results.map(async i=>{let a=`${i.source}:${i.path}`,o=r.get(a);o||(o=Ve({filePath:i.path,source:i.source,memoryRoot:e.memoryRoot}),r.set(a,o));let s=await o;if(!s)return i;let c=Re({score:i.score,ageInDays:He(s,n),halfLifeDays:t.halfLifeDays});return{...i,score:c}}))}function We(e){let t=e.match(/[\p{L}\p{N}_]+/gu)?.map(e=>e.trim()).filter(Boolean)??[];return t.length===0?null:t.map(e=>`"${e.replaceAll(`"`,``)}"`).join(` AND `)}function Ge(e){return 1/(1+(Number.isFinite(e)?Math.max(0,e):999))}async function Ke(e){let t=new Map;for(let n of e.vector)t.set(n.id,{id:n.id,path:n.path,startLine:n.startLine,endLine:n.endLine,source:n.source,snippet:n.snippet,vectorScore:n.vectorScore,textScore:0});for(let n of e.keyword){let e=t.get(n.id);e?(e.textScore=n.textScore,n.snippet&&n.snippet.length>0&&(e.snippet=n.snippet)):t.set(n.id,{id:n.id,path:n.path,startLine:n.startLine,endLine:n.endLine,source:n.source,snippet:n.snippet,vectorScore:0,textScore:n.textScore})}let n=(await Ue({results:Array.from(t.values()).map(t=>{let n=e.vectorWeight*t.vectorScore+e.textWeight*t.textScore;return{path:t.path,startLine:t.startLine,endLine:t.endLine,score:n,snippet:t.snippet,source:t.source}}),temporalDecay:{...W,...e.temporalDecay},memoryRoot:e.memoryRoot,nowMs:e.nowMs})).slice().sort((e,t)=>t.score-e.score),r={...H,...e.mmr};return r.enabled?Fe(n,r):n}function qe(e){e.db.exec(`
9
+ CREATE TABLE IF NOT EXISTS meta (
10
+ key TEXT PRIMARY KEY,
11
+ value TEXT NOT NULL
12
+ );
13
+ `),e.db.exec(`
14
+ CREATE TABLE IF NOT EXISTS files (
15
+ path TEXT PRIMARY KEY,
16
+ source TEXT NOT NULL DEFAULT 'memory',
17
+ hash TEXT NOT NULL,
18
+ mtime INTEGER NOT NULL,
19
+ size INTEGER NOT NULL
20
+ );
21
+ `),e.db.exec(`
22
+ CREATE TABLE IF NOT EXISTS chunks (
23
+ id TEXT PRIMARY KEY,
24
+ path TEXT NOT NULL,
25
+ source TEXT NOT NULL DEFAULT 'memory',
26
+ start_line INTEGER NOT NULL,
27
+ end_line INTEGER NOT NULL,
28
+ hash TEXT NOT NULL,
29
+ model TEXT NOT NULL,
30
+ text TEXT NOT NULL,
31
+ embedding TEXT NOT NULL,
32
+ updated_at INTEGER NOT NULL
33
+ );
34
+ `),e.db.exec(`
35
+ CREATE TABLE IF NOT EXISTS ${e.embeddingCacheTable} (
36
+ provider TEXT NOT NULL,
37
+ model TEXT NOT NULL,
38
+ provider_key TEXT NOT NULL,
39
+ hash TEXT NOT NULL,
40
+ embedding TEXT NOT NULL,
41
+ dims INTEGER,
42
+ updated_at INTEGER NOT NULL,
43
+ PRIMARY KEY (provider, model, provider_key, hash)
44
+ );
45
+ `),e.db.exec(`CREATE INDEX IF NOT EXISTS idx_embedding_cache_updated_at ON ${e.embeddingCacheTable}(updated_at);`);let t=!1,n;if(e.ftsEnabled)try{e.db.exec(`CREATE VIRTUAL TABLE IF NOT EXISTS ${e.ftsTable} USING fts5(\n text,\n id UNINDEXED,\n path UNINDEXED,\n source UNINDEXED,\n model UNINDEXED,\n start_line UNINDEXED,\n end_line UNINDEXED\n);`),t=!0}catch(e){let r=e instanceof Error?e.message:String(e);t=!1,n=r}return K(e.db,`files`,`source`,`TEXT NOT NULL DEFAULT 'memory'`),K(e.db,`chunks`,`source`,`TEXT NOT NULL DEFAULT 'memory'`),e.db.exec(`CREATE INDEX IF NOT EXISTS idx_chunks_path ON chunks(path);`),e.db.exec(`CREATE INDEX IF NOT EXISTS idx_chunks_source ON chunks(source);`),{ftsAvailable:t,...n?{ftsError:n}:{}}}function K(e,t,n,r){e.prepare(`PRAGMA table_info(${t})`).all().some(e=>e.name===n)||e.exec(`ALTER TABLE ${t} ADD COLUMN ${n} ${r}`)}function q(e,t){return e.length<=t?e:e.slice(0,t)}const Je=e=>Buffer.from(new Float32Array(e).buffer);async function Ye(e){return e.queryVec.length===0||e.limit<=0?[]:await e.ensureVectorReady(e.queryVec.length)?e.db.prepare(`SELECT c.id, c.path, c.start_line, c.end_line, c.text,
46
+ c.source,
47
+ vec_distance_cosine(v.embedding, ?) AS dist
48
+ FROM ${e.vectorTable} v\n JOIN chunks c ON c.id = v.id\n WHERE c.model = ?${e.sourceFilterVec.sql}\n ORDER BY dist ASC\n LIMIT ?`).all(Je(e.queryVec),e.providerModel,...e.sourceFilterVec.params,e.limit).map(t=>({id:t.id,path:t.path,startLine:t.start_line,endLine:t.end_line,score:1-t.dist,snippet:q(t.text,e.snippetMaxChars),source:t.source})):Xe({db:e.db,providerModel:e.providerModel,sourceFilter:e.sourceFilterChunks}).map(t=>({chunk:t,score:Ee(e.queryVec,t.embedding)})).filter(e=>Number.isFinite(e.score)).slice().sort((e,t)=>t.score-e.score).slice(0,e.limit).map(t=>({id:t.chunk.id,path:t.chunk.path,startLine:t.chunk.startLine,endLine:t.chunk.endLine,score:t.score,snippet:q(t.chunk.text,e.snippetMaxChars),source:t.chunk.source}))}function Xe(e){return e.db.prepare(`SELECT id, path, start_line, end_line, text, embedding, source
49
+ FROM chunks
50
+ WHERE model = ?${e.sourceFilter.sql}`).all(e.providerModel,...e.sourceFilter.params).map(e=>({id:e.id,path:e.path,startLine:e.start_line,endLine:e.end_line,text:e.text,embedding:L(e.embedding),source:e.source}))}async function Ze(e){if(e.limit<=0)return[];let t=e.buildFtsQuery(e.query);if(!t)return[];let n=e.providerModel?` AND model = ?`:``,r=e.providerModel?[e.providerModel]:[];return e.db.prepare(`SELECT id, path, source, start_line, end_line, text,\n bm25(${e.ftsTable}) AS rank\n FROM ${e.ftsTable}\n WHERE ${e.ftsTable} MATCH ?${n}${e.sourceFilter.sql}\n ORDER BY rank ASC\n LIMIT ?`).all(t,...r,...e.sourceFilter.params,e.limit).map(t=>{let n=e.bm25RankToScore(t.rank);return{id:t.id,path:t.path,startLine:t.start_line,endLine:t.end_line,score:n,textScore:n,snippet:q(t.text,e.snippetMaxChars),source:t.source}})}const Qe=t(import.meta.url);function $e(){try{return Qe(`node:sqlite`)}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`SQLite support is unavailable in this Node runtime (missing node:sqlite). ${t}`,{cause:e})}}const J={chunkTokens:400,chunkOverlap:80,maxResults:6,minScore:.2,fallback:{enabled:!0},embedding:{},experimental:{sessionMemory:!1},sources:[`memory`],store:{sessionStoreName:void 0,vector:{enabled:!0}},hybrid:{enabled:!0,vectorWeight:.7,textWeight:.3,candidateMultiplier:4,mmr:{enabled:!1,lambda:.7},temporalDecay:{enabled:!1,halfLifeDays:30}},cache:{enabled:!0,maxEntries:5e4},sync:{onSessionStart:!0,onSearch:!0,watch:!0,watchDebounceMs:1500,sessions:{deltaBytes:1e5,deltaMessages:50}},citations:`auto`};async function et(e){try{let t=await import(`sqlite-vec`),n=e.extensionPath?.trim()?e.extensionPath.trim():void 0,r=n??t.getLoadablePath();return e.db.enableLoadExtension(!0),n?e.db.loadExtension(r):t.load(e.db),{ok:!0,extensionPath:r}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}}function tt(e,t,n){let i=g(e,{storeName:n});return r.relative(i,t).replace(/\\/g,`/`)}async function nt(e,t){let i=g(e,{storeName:t});try{let e=await n.readdir(i,{withFileTypes:!0}),t=[];for(let a of e){if(!a.isDirectory())continue;let e=r.join(i,a.name,`transcript.jsonl`);try{(await n.stat(e)).isFile()&&t.push(e)}catch{}}return t}catch(e){if(P(e))return[];throw e}}function rt(e){return typeof e==`string`?e:Array.isArray(e)?e.map(e=>typeof e==`string`?e:e&&typeof e==`object`&&`text`in e?String(e.text??``):``).filter(Boolean).join(` `):e?String(e):``}async function it(e,t,i){let a;try{a=await n.stat(t)}catch(e){if(P(e))return null;throw e}let o;try{let e=await c(t);if(e===null)return null;o=e}catch(e){if(P(e))return null;throw e}let s=[],l=[],u=o.split(`
51
+ `);for(let e=0;e<u.length;e+=1){let t=u[e]?.trim();if(t)try{let n=JSON.parse(t),r=n.role??`unknown`,i=rt(n.content);if(!i)continue;let a=i.split(`
52
+ `);for(let t of a)s.push(`[${r}] ${t}`),l.push(e+1)}catch{}}let d=s.join(`
53
+ `),f=I(d);return{path:r.join(h(i),tt(e,t,i)).replace(/\\/g,`/`),absPath:t,mtimeMs:a.mtimeMs,size:a.size,hash:f,content:d,lineMap:l}}const Y=`chunks_vec`,X=`chunks_fts`,Z=`embedding_cache`,at=`memory_index_meta_v1`,ot=3e4;function st(e,t,n){let r=t.split(`
54
+ `);for(let t of r){let n=t.match(/^##\s+(.+)$/);if(n?.[1])return`${e}#${n[1].trim()}`}return`${e}#L${n}`}const ct=new Map;function Q(e,t){let n={...e,...t,hybrid:{...e.hybrid,...t?.hybrid??{}},cache:{...e.cache,...t?.cache??{}},sync:{...e.sync,...t?.sync??{}},experimental:{...e.experimental,...t?.experimental??{}},sources:t?.sources??e.sources,embedding:{...e.embedding,...t?.embedding??{}},store:{...e.store,...t?.store??{},vector:{...e.store.vector,...t?.store?.vector??{}}}};return n.experimental.sessionMemory&&!n.sources.includes(`sessions`)&&(n.sources=[...n.sources,`sessions`]),n}var lt=class e{dataDir;memoryRoot;storePath;config;sessionStoreName;provider;providerKey;embeddingProviderId;db;dirty=!0;ftsAvailable=!1;ftsError;vector={enabled:!0,available:null,extensionPath:void 0,loadError:void 0,dims:void 0};vectorReady=null;watchers=[];watchTimer=null;sessionWatchTimer=null;sessionsDirty=!1;sessionsDirtyFiles=new Set;sessionPendingFiles=new Set;searchFallbackOnly=!1;lastRebuildSummary;sessionDeltas=new Map;static get(t,n){let i=r.join(t,`.aimax`),a=Q(J,n),o=`${i}::${h(a.store.sessionStoreName)}`,s=ct.get(o);if(s)return n&&s.applyConfig(n),s;let c=new e(t,i,a);return ct.set(o,c),c}constructor(e,t,n){this.dataDir=e,this.memoryRoot=t,this.storePath=r.join(t,`.index.sqlite`),this.config=Q(J,n),this.sessionStoreName=h(this.config.store.sessionStoreName),this.provider=z(),this.providerKey=this.computeProviderKey(),this.applyEmbeddingProvider(),this.vector.enabled=this.config.store.vector.enabled,this.vector.extensionPath=this.config.store.vector.extensionPath,this.db=this.openDatabase(),this.ensureSchema(),this.ensureWatcher(),this.ensureSessionListener(),this.dirty=!0}applyConfig(e){this.config=Q(this.config,e),this.sessionStoreName=h(this.config.store.sessionStoreName),this.applyEmbeddingProvider(),this.vector.enabled=this.config.store.vector.enabled,this.vector.extensionPath=this.config.store.vector.extensionPath,this.ensureWatcher(),this.ensureSessionListener()}warmSession(){this.config.sync.onSessionStart&&this.sync({reason:`session-start`}).catch(()=>{})}noteSessionUpdate(e){this.scheduleSessionDirty(e)}status(){let e=this.buildSourceFilter(),t=this.db.prepare(`SELECT COUNT(*) as c FROM files WHERE 1=1${e.sql}`).get(...e.params),n=this.db.prepare(`SELECT COUNT(*) as c FROM chunks WHERE 1=1${e.sql}`).get(...e.params),r=(()=>{let t=Array.from(this.config.sources);if(t.length===0)return[];let n=new Map;for(let e of t)n.set(e,{files:0,chunks:0});let r=this.db.prepare(`SELECT source, COUNT(*) as c FROM files WHERE 1=1${e.sql} GROUP BY source`).all(...e.params);for(let e of r){let t=n.get(e.source)??{files:0,chunks:0};t.files=e.c??0,n.set(e.source,t)}let i=this.db.prepare(`SELECT source, COUNT(*) as c FROM chunks WHERE 1=1${e.sql} GROUP BY source`).all(...e.params);for(let e of i){let t=n.get(e.source)??{files:0,chunks:0};t.chunks=e.c??0,n.set(e.source,t)}return t.map(e=>Object.assign({source:e},n.get(e)))})(),i=this.provider?`hybrid`:`fts-only`,a=this.config.cache.enabled?this.db.prepare(`SELECT COUNT(*) as c FROM ${Z}`).get()?.c??0:void 0;return{backend:`builtin`,files:t?.c??0,chunks:n?.c??0,dirty:this.dirty||this.sessionsDirty,workspaceDir:this.memoryRoot,dbPath:this.storePath,provider:this.provider.id,model:this.provider.model,sources:Array.from(this.config.sources),sourceCounts:r,cache:this.config.cache.enabled?{enabled:!0,entries:a,maxEntries:this.config.cache.maxEntries}:{enabled:!1,maxEntries:this.config.cache.maxEntries},fts:{enabled:this.config.hybrid.enabled,available:this.ftsAvailable,error:this.ftsError,rows:this.getFtsRowCount()},vector:{enabled:this.vector.enabled,available:this.vector.available??void 0,extensionPath:this.vector.extensionPath,loadError:this.vector.loadError,dims:this.vector.dims},custom:{searchMode:i,fallbackActive:this.searchFallbackOnly,lastRebuildSummary:this.lastRebuildSummary}}}async probeEmbeddingAvailability(){try{return await this.provider.embedBatch([`ping`]),{ok:!0}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}}async probeVectorAvailability(){return this.vector.enabled?await this.ensureVectorReady():!1}async search(e){let t=e.trim();if(!t)return[];if(this.readMeta()?this.config.sync.onSearch&&(this.dirty||this.sessionsDirty)&&this.sync({reason:`search`}).catch(()=>{this.searchFallbackOnly=!0}):await this.sync({reason:`boot`}).catch(()=>{this.searchFallbackOnly=!0}),this.searchFallbackOnly)return this.decorateCitations(await this.fileScanSearch(t));let n=this.config.hybrid,r=Math.min(200,Math.max(1,Math.floor(this.config.maxResults*n.candidateMultiplier))),i=n.enabled&&this.ftsAvailable?await this.searchKeyword(t,r).catch(()=>[]):[],a=await this.provider.embedQuery(t).catch(()=>[]),o=a.some(e=>e!==0)?await this.searchVector(a,r).catch(()=>[]):[],s=[];if(!n.enabled||!this.ftsAvailable)s=o.filter(e=>e.score>=this.config.minScore).slice(0,this.config.maxResults);else{let e=await Ke({vector:o.map(e=>({id:`${e.path}:${e.startLine}:${e.endLine}:${e.source}`,path:e.path,startLine:e.startLine,endLine:e.endLine,source:e.source,snippet:e.snippet,vectorScore:e.score})),keyword:i.map(e=>({id:`${e.path}:${e.startLine}:${e.endLine}:${e.source}`,path:e.path,startLine:e.startLine,endLine:e.endLine,source:e.source,snippet:e.snippet,textScore:e.textScore})),vectorWeight:n.vectorWeight,textWeight:n.textWeight,mmr:n.mmr,temporalDecay:n.temporalDecay,memoryRoot:this.memoryRoot}),t=e.filter(e=>e.score>=this.config.minScore);if(t.length>0||i.length===0)s=t.slice(0,this.config.maxResults);else{let t=Math.min(this.config.minScore,n.textWeight);s=e.filter(e=>e.score>=t).slice(0,this.config.maxResults)}}return s.length>0?this.decorateCitations(this.decorateEntryIds(s)):this.config.fallback.enabled?(this.searchFallbackOnly=!0,this.decorateCitations(this.decorateEntryIds(await this.fileScanSearch(t)))):[]}async readFile(e){let{absPath:t,relPath:r}=this.resolveMemoryFilePath(e.relPath);if((await ve(t)).missing)return{text:``,path:r};let i;try{i=await n.readFile(t,`utf-8`)}catch(e){if(P(e))return{text:``,path:r};throw e}if(!e.from&&!e.lines)return{text:i,path:r};let a=i.split(`
55
+ `),o=Math.max(1,e.from??1),s=Math.max(1,e.lines??a.length);return{text:a.slice(o-1,o-1+s).join(`
56
+ `),path:r}}async replaceFile(e){let{absPath:t}=this.resolveMemoryFilePath(e.relPath);await n.mkdir(r.dirname(t),{recursive:!0}),await n.writeFile(t,e.content,`utf-8`),this.dirty=!0,await this.syncAndPostCheck(`replace`)}async deleteFile(e){let{absPath:t}=this.resolveMemoryFilePath(e);try{await n.unlink(t)}catch(e){if(P(e))return;throw e}this.dirty=!0,await this.syncAndPostCheck(`delete`)}async appendToMemory(e){let t=this.memoryRoot;await n.mkdir(t,{recursive:!0});let i=r.join(t,`MEMORY.md`),a=e.endsWith(`
57
+ `)?e:`${e}\n`;await n.appendFile(i,a,`utf-8`),this.dirty=!0,await this.syncAndPostCheck(`append`)}openDatabase(){ye(r.dirname(this.storePath));let{DatabaseSync:e}=$e();return new e(this.storePath,{allowExtension:this.vector.enabled})}ensureSchema(){let e=qe({db:this.db,embeddingCacheTable:Z,ftsTable:X,ftsEnabled:this.config.hybrid.enabled});this.ftsAvailable=e.ftsAvailable,e.ftsError&&(this.ftsError=e.ftsError)}async ensureVectorReady(e){if(!this.vector.enabled)return!1;this.vectorReady||=this.withTimeout(this.loadVectorExtension(),ot,`sqlite-vec load timed out after ${Math.round(ot/1e3)}s`);let t=!1;try{t=await this.vectorReady||!1}catch(e){let t=e instanceof Error?e.message:String(e);return this.vector.available=!1,this.vector.loadError=t,this.vectorReady=null,!1}return t&&typeof e==`number`&&e>0&&this.ensureVectorTable(e),t}async loadVectorExtension(){if(this.vector.available!==null)return this.vector.available;if(!this.vector.enabled)return this.vector.available=!1,!1;try{let e=this.vector.extensionPath?.trim()?this.vector.extensionPath.trim():void 0,t=await et({db:this.db,extensionPath:e});if(!t.ok)throw Error(t.error??`unknown sqlite-vec load error`);return this.vector.extensionPath=t.extensionPath,this.vector.available=!0,!0}catch(e){let t=e instanceof Error?e.message:String(e);return this.vector.available=!1,this.vector.loadError=t,!1}}ensureVectorTable(e){this.vector.dims!==e&&(this.vector.dims&&this.vector.dims!==e&&this.dropVectorTable(),this.db.exec(`CREATE VIRTUAL TABLE IF NOT EXISTS ${Y} USING vec0(\n id TEXT PRIMARY KEY,\n embedding FLOAT[${e}]\n)`),this.vector.dims=e)}dropVectorTable(){try{this.db.exec(`DROP TABLE IF EXISTS ${Y}`)}catch{}}async withTimeout(e,t,n){if(!Number.isFinite(t)||t<=0)return await e;let r=null,i=new Promise((e,i)=>{r=setTimeout(()=>i(Error(n)),t)});try{return await Promise.race([e,i])}finally{r&&clearTimeout(r)}}ensureWatcher(){if(!this.config.sync.watch||this.watchers.length>0)return;let e=[r.join(this.memoryRoot,`MEMORY.md`),r.join(this.memoryRoot,`memory.md`),r.join(this.memoryRoot,`memory`)],t=()=>{this.dirty=!0,this.scheduleWatchSync()};for(let n of e)try{let e=s.watch(n,{recursive:!1},t);e.on(`error`,()=>{try{e.close()}catch{}}),this.watchers.push(e)}catch{}}scheduleWatchSync(){this.config.sync.watch&&(this.watchTimer&&clearTimeout(this.watchTimer),this.watchTimer=setTimeout(()=>{this.watchTimer=null,this.sync({reason:`watch`}).catch(()=>{})},this.config.sync.watchDebounceMs))}ensureSessionListener(){if(!this.config.experimental.sessionMemory)return;let e=g(this.dataDir,{storeName:this.sessionStoreName});try{let t=s.watch(e,{recursive:!0},(t,n)=>{if(!n||!n.endsWith(`transcript.jsonl`))return;let i=r.join(e,n);this.scheduleSessionDirty(i)});this.watchers.push(t)}catch{}}scheduleSessionDirty(e){this.config.experimental.sessionMemory&&(this.sessionPendingFiles.add(e),!this.sessionWatchTimer&&(this.sessionWatchTimer=setTimeout(()=>{this.sessionWatchTimer=null,this.processSessionDeltaBatch().catch(()=>{})},5e3)))}async processSessionDeltaBatch(){if(this.sessionPendingFiles.size===0)return;let e=Array.from(this.sessionPendingFiles);this.sessionPendingFiles.clear();let t=!1;for(let n of e){let e=await this.updateSessionDelta(n);if(!e)continue;let r=e.deltaBytes,i=e.deltaMessages,a=r<=0?e.pendingBytes>0:e.pendingBytes>=r,o=i<=0?e.pendingMessages>0:e.pendingMessages>=i;!a&&!o||(this.sessionsDirtyFiles.add(n),this.sessionsDirty=!0,e.pendingBytes=r>0?Math.max(0,e.pendingBytes-r):0,e.pendingMessages=i>0?Math.max(0,e.pendingMessages-i):0,t=!0)}t&&this.sync({reason:`session-delta`}).catch(()=>{})}async updateSessionDelta(e){let t=this.config.sync.sessions;if(!t)return null;let r;try{r=await n.stat(e)}catch{return null}let i=r.size,a=this.sessionDeltas.get(e);a||(a={lastSize:0,pendingBytes:0,pendingMessages:0},this.sessionDeltas.set(e,a));let o=Math.max(0,i-a.lastSize);return o===0&&i===a.lastSize?{deltaBytes:t.deltaBytes,deltaMessages:t.deltaMessages,pendingBytes:a.pendingBytes,pendingMessages:a.pendingMessages}:(i<a.lastSize?(a.lastSize=i,a.pendingBytes+=i,t.deltaMessages>0&&(t.deltaBytes<=0||a.pendingBytes<t.deltaBytes)&&(a.pendingMessages+=await this.countNewlines(e,0,i))):(a.pendingBytes+=o,t.deltaMessages>0&&(t.deltaBytes<=0||a.pendingBytes<t.deltaBytes)&&(a.pendingMessages+=await this.countNewlines(e,a.lastSize,i)),a.lastSize=i),this.sessionDeltas.set(e,a),{deltaBytes:t.deltaBytes,deltaMessages:t.deltaMessages,pendingBytes:a.pendingBytes,pendingMessages:a.pendingMessages})}async countNewlines(e,t,r){if(r<=t)return 0;let i;try{i=await n.open(e,`r`)}catch{return 0}try{let e=t,n=0,a=Buffer.alloc(64*1024);for(;e<r;){let t=Math.min(a.length,r-e),{bytesRead:o}=await i.read(a,0,t,e);if(o<=0)break;for(let e=0;e<o;e+=1)a[e]===10&&(n+=1);e+=o}return n}finally{await i.close()}}computeProviderKey(){return I(JSON.stringify({provider:this.provider.id,model:this.provider.model}))}resolveMemoryFilePath(e){let t=e.trim();if(!t)throw Error(`path required`);let n=r.isAbsolute(t)?r.resolve(t):r.resolve(this.memoryRoot,t),i=r.relative(this.memoryRoot,n).replace(/\\/g,`/`);if(!(i.length>0&&!i.startsWith(`..`)&&!r.isAbsolute(i)&&xe(i))||!n.endsWith(`.md`))throw Error(`path required`);return{absPath:n,relPath:i}}applyEmbeddingProvider(){let e=this.config.embedding?.providerId?.trim();if(e){let t=V({providerId:e,dataDir:this.dataDir,memoryDir:this.memoryRoot});if(!t)throw Error(`Embedding provider not found: ${e}`);this.provider=t.provider,this.embeddingProviderId=e,this.providerKey=this.computeProviderKey(),this.dirty=!0;return}this.embeddingProviderId&&(this.provider=z(),this.embeddingProviderId=void 0,this.providerKey=this.computeProviderKey(),this.dirty=!0)}readMeta(){let e=this.db.prepare(`SELECT value FROM meta WHERE key = ?`).get(at);if(!e?.value)return null;try{return JSON.parse(e.value)}catch{return null}}writeMeta(e){let t=JSON.stringify(e);this.db.prepare(`INSERT INTO meta (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value=excluded.value`).run(at,t)}loadEmbeddingCache(e){if(!this.config.cache.enabled||e.length===0)return new Map;let t=Array.from(new Set(e.filter(Boolean)));if(t.length===0)return new Map;let n=new Map,r=[this.provider.id,this.provider.model,this.providerKey];for(let e=0;e<t.length;e+=400){let i=t.slice(e,e+400),a=i.map(()=>`?`).join(`, `),o=this.db.prepare(`SELECT hash, embedding FROM ${Z}\n WHERE provider = ? AND model = ? AND provider_key = ? AND hash IN (${a})`).all(...r,...i);for(let e of o)n.set(e.hash,L(e.embedding))}return n}upsertEmbeddingCache(e){if(!this.config.cache.enabled||e.length===0)return;let t=Date.now(),n=this.db.prepare(`INSERT INTO ${Z} (provider, model, provider_key, hash, embedding, dims, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(provider, model, provider_key, hash) DO UPDATE SET\n embedding=excluded.embedding,\n dims=excluded.dims,\n updated_at=excluded.updated_at`);for(let r of e){let e=r.embedding??[];n.run(this.provider.id,this.provider.model,this.providerKey,r.hash,JSON.stringify(e),e.length,t)}}async embedChunks(e){if(e.length===0)return[];let t=this.loadEmbeddingCache(e.map(e=>e.hash)),n=Array.from({length:e.length},()=>[]),r=[];for(let i=0;i<e.length;i+=1){let a=e[i],o=a?.hash?t.get(a.hash):void 0;o&&o.length>0?n[i]=o:a&&r.push({index:i,chunk:a})}if(r.length===0)return n;let i=await this.provider.embedBatch(r.map(e=>e.chunk.text)),a=[];for(let e=0;e<r.length;e+=1){let t=r[e],o=i[e]??[];n[t.index]=o,a.push({hash:t.chunk.hash,embedding:o})}return this.upsertEmbeddingCache(a),n}async indexFile(e,t){let r=we(t.content??await n.readFile(e.absPath,`utf-8`),{tokens:this.config.chunkTokens,overlap:this.config.chunkOverlap}).filter(e=>e.text.trim().length>0);t.source===`sessions`&&Te(r,t.lineMap);let i=await this.embedChunks(r),a=i.find(e=>e.length>0),o=a?await this.ensureVectorReady(a.length):!1,s=Date.now();if(o)try{this.db.prepare(`DELETE FROM ${Y} WHERE id IN (SELECT id FROM chunks WHERE path = ? AND source = ?)`).run(e.path,t.source)}catch{}if(this.ftsAvailable)try{this.db.prepare(`DELETE FROM ${X} WHERE path = ? AND source = ? AND model = ?`).run(e.path,t.source,this.provider.model)}catch{}this.db.prepare(`DELETE FROM chunks WHERE path = ? AND source = ?`).run(e.path,t.source);for(let n=0;n<r.length;n+=1){let a=r[n],c=i[n]??[],l=I(`${t.source}:${e.path}:${a.startLine}:${a.endLine}:${a.hash}:${this.provider.model}`);if(this.db.prepare(`INSERT INTO chunks (id, path, source, start_line, end_line, hash, model, text, embedding, updated_at)
58
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
59
+ ON CONFLICT(id) DO UPDATE SET
60
+ hash=excluded.hash,
61
+ model=excluded.model,
62
+ text=excluded.text,
63
+ embedding=excluded.embedding,
64
+ updated_at=excluded.updated_at`).run(l,e.path,t.source,a.startLine,a.endLine,a.hash,this.provider.model,a.text,JSON.stringify(c),s),o&&c.length>0){try{this.db.prepare(`DELETE FROM ${Y} WHERE id = ?`).run(l)}catch{}this.db.prepare(`INSERT INTO ${Y} (id, embedding) VALUES (?, ?)`).run(l,Buffer.from(new Float32Array(c).buffer))}this.ftsAvailable&&this.db.prepare(`INSERT INTO ${X} (text, id, path, source, model, start_line, end_line)\n VALUES (?, ?, ?, ?, ?, ?, ?)`).run(a.text,l,e.path,t.source,this.provider.model,a.startLine,a.endLine)}this.db.prepare(`INSERT INTO files (path, source, hash, mtime, size) VALUES (?, ?, ?, ?, ?)
65
+ ON CONFLICT(path) DO UPDATE SET
66
+ source=excluded.source,
67
+ hash=excluded.hash,
68
+ mtime=excluded.mtime,
69
+ size=excluded.size`).run(e.path,t.source,e.hash,e.mtimeMs,e.size)}buildSourceFilter(){let e=this.config.sources;return e.length?{sql:` AND source IN (${e.map(()=>`?`).join(`, `)})`,params:e}:{sql:``,params:[]}}async searchVector(e,t){return await Ye({db:this.db,vectorTable:Y,providerModel:this.provider.model,queryVec:e,limit:t,snippetMaxChars:700,ensureVectorReady:async e=>await this.ensureVectorReady(e),sourceFilterVec:this.buildSourceFilter(),sourceFilterChunks:this.buildSourceFilter()})}async searchKeyword(e,t){return this.ftsAvailable?await Ze({db:this.db,ftsTable:X,providerModel:this.provider.model,query:e,limit:t,snippetMaxChars:700,sourceFilter:this.buildSourceFilter(),buildFtsQuery:e=>We(e),bm25RankToScore:Ge}):[]}resetIndex(){if(this.db.exec(`DELETE FROM files`),this.db.exec(`DELETE FROM chunks`),this.ftsAvailable)try{this.db.exec(`DELETE FROM ${X}`)}catch{}this.dropVectorTable(),this.vector.dims=void 0,this.sessionsDirtyFiles.clear()}async syncAndPostCheck(e){try{await this.sync({reason:`mutation-postcheck`})}catch{this.searchFallbackOnly=!0;return}this.searchFallbackOnly=!this.indexHasSearchableData()}indexHasSearchableData(){try{if((this.db.prepare(`SELECT COUNT(*) as c FROM chunks`).get()?.c??0)>0)return!0}catch{}try{if(s.readdirSync(this.memoryRoot).filter(e=>e.endsWith(`.md`)).length>0)return!1;let e=r.join(this.memoryRoot,`memory`);return s.existsSync(e)?s.readdirSync(e).filter(e=>e.endsWith(`.md`)).length===0:!0}catch{return!1}}async fileScanSearch(e){let t=e.trim().toLowerCase();if(!t)return[];let a=await F(this.memoryRoot),o=[];for(let e of a){let a=``;try{a=await n.readFile(e,`utf-8`)}catch{continue}let s=r.relative(this.memoryRoot,e).replace(/\\/g,`/`);s.startsWith(`memory/`);let c=a.split(`
70
+ `);for(let n=0;n<c.length;n+=1){let r=c[n]??``,a=r.toLowerCase();if(!a.includes(t))continue;let l=a===t?1:Math.max(.2,t.length/Math.max(r.length,t.length));o.push({path:s||i(e),startLine:n+1,endLine:n+1,score:Number(l.toFixed(4)),snippet:r.slice(0,700),source:`memory`})}}return o.sort((e,t)=>t.score-e.score||e.path.localeCompare(t.path)||e.startLine-t.startLine),o.slice(0,this.config.maxResults)}getFtsRowCount(){if(this.ftsAvailable)try{return this.db.prepare(`SELECT COUNT(*) as c FROM ${X}`).get()?.c??0}catch{return}}buildRebuildSummary(e){let t=this.db.prepare(`SELECT COUNT(*) as c FROM chunks`).get();return{reason:e.reason,memoryFilesIndexed:e.memoryFilesIndexed,sessionFilesIndexed:e.sessionFilesIndexed,staleMemoryFilesRemoved:e.staleMemoryFilesRemoved,staleSessionFilesRemoved:e.staleSessionFilesRemoved,chunks:t?.c??0,ftsRows:this.getFtsRowCount(),fallbackActive:this.searchFallbackOnly,needsFullReindex:e.needsFullReindex}}async rebuild(e=`manual-rebuild`){return this.resetIndex(),this.dirty=!0,this.sessionsDirty=!0,await this.sync({reason:e,forceFullReindex:!0}),this.lastRebuildSummary??this.buildRebuildSummary({reason:e,memoryFilesIndexed:0,sessionFilesIndexed:0,staleMemoryFilesRemoved:0,staleSessionFilesRemoved:0,needsFullReindex:!0})}async sync(e){let t=this.readMeta(),n=e?.forceFullReindex||!t||t.model!==this.provider.model||t.provider!==this.provider.id||t.providerKey!==this.providerKey||t.chunkTokens!==this.config.chunkTokens||t.chunkOverlap!==this.config.chunkOverlap||this.vector.available&&!t?.vectorDims;n&&this.resetIndex();let r=await F(this.memoryRoot),i=(await Promise.all(r.map(async e=>Ce(e,this.memoryRoot)))).filter(e=>e!==null),a=new Set(i.map(e=>e.path)),o=0,s=i.map(e=>async()=>{let t=this.db.prepare(`SELECT hash FROM files WHERE path = ? AND source = ?`).get(e.path,`memory`);!n&&t?.hash===e.hash||(await this.indexFile(e,{source:`memory`}),o+=1)});for(let e of s)await e();let c=0,l=this.db.prepare(`SELECT path FROM files WHERE source = ?`).all(`memory`);for(let e of l)if(!a.has(e.path)){this.db.prepare(`DELETE FROM files WHERE path = ? AND source = ?`).run(e.path,`memory`),c+=1;try{this.db.prepare(`DELETE FROM ${Y} WHERE id IN (SELECT id FROM chunks WHERE path = ? AND source = ?)`).run(e.path,`memory`)}catch{}if(this.db.prepare(`DELETE FROM chunks WHERE path = ? AND source = ?`).run(e.path,`memory`),this.ftsAvailable)try{this.db.prepare(`DELETE FROM ${X} WHERE path = ? AND source = ? AND model = ?`).run(e.path,`memory`,this.provider.model)}catch{}}let u={indexed:0,staleRemoved:0};this.config.experimental.sessionMemory&&(n||this.sessionsDirty)&&(u=await this.syncSessionFiles(n)),this.writeMeta({model:this.provider.model,provider:this.provider.id,providerKey:this.providerKey,chunkTokens:this.config.chunkTokens,chunkOverlap:this.config.chunkOverlap,...this.vector.available&&this.vector.dims?{vectorDims:this.vector.dims}:{}}),this.dirty=!1,this.searchFallbackOnly=!this.indexHasSearchableData(),this.lastRebuildSummary=this.buildRebuildSummary({reason:e?.reason??`sync`,memoryFilesIndexed:o,sessionFilesIndexed:u.indexed,staleMemoryFilesRemoved:c,staleSessionFilesRemoved:u.staleRemoved,needsFullReindex:!!n})}async syncSessionFiles(e){let t=await nt(this.dataDir,this.sessionStoreName),n=(await Promise.all(t.map(async e=>it(this.dataDir,e,this.sessionStoreName)))).filter(e=>e!==null),r=new Set(n.map(e=>e.path)),i=e||this.sessionsDirtyFiles.size===0,a=0;for(let t of n){if(!i&&!this.sessionsDirtyFiles.has(t.absPath))continue;let n=this.db.prepare(`SELECT hash FROM files WHERE path = ? AND source = ?`).get(t.path,`sessions`);if(!e&&n?.hash===t.hash){this.resetSessionDelta(t.absPath,t.size);continue}await this.indexFile(t,{source:`sessions`,content:t.content,lineMap:t.lineMap}),a+=1,this.resetSessionDelta(t.absPath,t.size)}let o=0,s=this.db.prepare(`SELECT path FROM files WHERE source = ?`).all(`sessions`);for(let e of s)if(!r.has(e.path)){this.db.prepare(`DELETE FROM files WHERE path = ? AND source = ?`).run(e.path,`sessions`),o+=1;try{this.db.prepare(`DELETE FROM ${Y} WHERE id IN (SELECT id FROM chunks WHERE path = ? AND source = ?)`).run(e.path,`sessions`)}catch{}if(this.db.prepare(`DELETE FROM chunks WHERE path = ? AND source = ?`).run(e.path,`sessions`),this.ftsAvailable)try{this.db.prepare(`DELETE FROM ${X} WHERE path = ? AND source = ? AND model = ?`).run(e.path,`sessions`,this.provider.model)}catch{}}return this.sessionsDirty=!1,this.sessionsDirtyFiles.clear(),{indexed:a,staleRemoved:o}}resetSessionDelta(e,t){let n=this.sessionDeltas.get(e);n&&(n.lastSize=t,n.pendingBytes=0,n.pendingMessages=0)}decorateCitations(e){return this.config.citations===`off`?e:e.map(e=>{let t=`Source: ${e.path}#L${e.startLine}-L${e.endLine}`;return this.config.citations===`on`?{...e,citation:t,snippet:`${e.snippet}\n\n${t}`}:{...e,citation:t}})}decorateEntryIds(e){return e.map(e=>{if(e.id)return e;let t=st(e.path,e.snippet,e.startLine);return{...e,id:t}})}},$=e({createBuiltinMemoryProvider:()=>ut});function ut(e,t){let n=lt.get(e.dataDir,t?.includeSessions?{experimental:{sessionMemory:!0},sources:[`memory`,`sessions`],store:{sessionStoreName:e.sessionStoreName,vector:{enabled:!0}}}:e.sessionStoreName?{store:{sessionStoreName:e.sessionStoreName,vector:{enabled:!0}}}:void 0),i=e.memoryDir;return{id:`builtin-memory`,name:`Builtin Memory Provider`,status:()=>n.status(),search:async(e,t)=>n.search(e),getLines:async(e,t,r)=>{let i=Math.max(1,r-t+1),a=await n.readFile({relPath:e,from:t,lines:i});return a.text?a.text.split(`
71
+ `):[]},listFiles:async()=>F(i),append:async e=>n.appendToMemory(e),updateFile:async(e,t)=>{await n.replaceFile({relPath:e,content:t})},deleteFile:async e=>{await n.deleteFile(e)},sync:async e=>{if(e===`cli-rebuild`){await n.rebuild(e);return}await n.sync({reason:e??`provider-sync`})},noteSessionUpdate:e=>{let t=r.isAbsolute(e)?e:r.resolve(e);n.noteSessionUpdate(t)}}}export{de as A,d as B,oe as C,E as D,j as E,g as F,f as H,re as I,v as L,_ as M,ge as N,b as O,S as P,me as R,k as S,M as T,l as U,c as V,C as _,Ae as a,N as b,ee as c,fe as d,ue as f,ie as g,x as h,ke as i,A as j,h as k,p as l,ne as m,ut as n,V as o,y as p,lt as r,F as s,$ as t,ae as u,T as v,pe as w,he as x,_e as y,u as z};
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { S as AgentsConfig, _ as saveAgentsConfig, a as listAgents, b as AgentConfig, c as normalizeAgentId, d as resolveAgentDir, f as resolveAgentIdByBinding, g as resolveModelString, h as resolveModelFallbacks, i as getAgentConfig, l as removeAgent, m as resolveDefaultAgentId, n as addBinding, o as listBindings, p as resolveAgentsConfigPath, s as loadAgentsConfig, t as addAgent, u as removeBindings, v as updateAgentIdentity, x as AgentModelConfig, y as AgentBinding } from "./index-pXTy2jgd.js";
2
2
  import * as _gencode_shared0 from "@gencode/shared";
3
3
  import { AgentCustomProgressEvent, AgentProgressEvent, AgentProgressEvent as AgentProgressEvent$1, AgentProgressEvent as AgentProgressEvent$2, CallbackEventPayload, CallbackEventPayload as CallbackEventPayload$1, Channel, Channel as Channel$1, CollapseSpan, HitlCheckpoint, HitlCheckpoint as HitlCheckpoint$1, HitlHistoryEntry, HitlRequest, HitlRequest as HitlRequest$1, HitlResolution, HitlResolution as HitlResolution$1, HitlStatus, HitlToolContext, HitlToolContext as HitlToolContext$1, ModelUsageCheckpoint, PausedRunState, PausedRunState as PausedRunState$1, ReadStateRecord, RunResultPayload, RunResultPayload as RunResultPayload$1, SessionContextSnapshot, SessionMemorySnapshot, SessionMetadata, SessionMetadata as SessionMetadata$1, SessionSummary, SessionSummary as SessionSummary$1, SnipRecord, ToolResultReference, UiToolExtra, UiToolOutputSchema, UiToolPausedState, UiToolRequest, UiToolResult, UiToolValidationResult } from "@gencode/shared";
4
- import { AssistantMessage, Message } from "@mariozechner/pi-ai";
5
4
  import { AgentMessage, AgentTool } from "@mariozechner/pi-agent-core";
5
+ import { AssistantMessage, Message } from "@mariozechner/pi-ai";
6
6
 
7
7
  //#region src/loop-detection/tool-loop-detection.d.ts
8
8
  type ToolLoopDetectionConfig = {
@@ -168,9 +168,11 @@ declare function buildSkillsPrompt(skills: Skill[]): string;
168
168
  //#region src/agents/definitions.d.ts
169
169
  declare const SYSTEM_AGENTS_DIR = "/aimax/agents";
170
170
  type AgentConfigSource = "system" | "user" | "project";
171
+ type AgentVisibility = "public" | "internal";
171
172
  type AgentDefinition = {
172
173
  name: string;
173
174
  description: string;
175
+ visibility?: AgentVisibility;
174
176
  tools?: string[];
175
177
  disallowedTools?: string[];
176
178
  model?: string;
@@ -190,19 +192,45 @@ type AgentDirectoryCandidate = {
190
192
  dir: string;
191
193
  source: AgentConfigSource;
192
194
  };
193
- type AgentRuntimePolicy = {
195
+ type AgentRuntimePolicy = AgentDefinitionsContext & {
194
196
  activeAgent?: AgentDefinition;
195
- availableAgents?: AgentDefinition[];
196
197
  requestedAgentName?: string;
197
198
  };
199
+ type AgentRuntimePolicyInput = Partial<AgentDefinitionsContext> & {
200
+ activeAgent?: AgentDefinition;
201
+ requestedAgentName?: string;
202
+ };
203
+ type AgentDefinitionsStats = {
204
+ total: number;
205
+ public: number;
206
+ internal: number;
207
+ };
208
+ type AgentDefinitionsContext = {
209
+ allAgents: AgentDefinition[];
210
+ availableAgents: AgentDefinition[];
211
+ findPublic(name: string | undefined): AgentDefinition | undefined;
212
+ findAny(name: string | undefined): AgentDefinition | undefined;
213
+ stats(): AgentDefinitionsStats;
214
+ };
198
215
  declare function agentDirCandidates(options: AgentScanOptions): AgentDirectoryCandidate[];
199
216
  declare function scanAgentDefinitions(options: AgentScanOptions): Promise<AgentDefinition[]>;
217
+ declare function createAgentDefinitionsContext(params?: {
218
+ allAgents?: AgentDefinition[];
219
+ availableAgents?: AgentDefinition[];
220
+ }): AgentDefinitionsContext;
221
+ declare function resolveAgentDefinitionsContext(options: AgentScanOptions & {
222
+ agentPolicy?: AgentRuntimePolicyInput;
223
+ }): Promise<AgentDefinitionsContext>;
200
224
  declare function loadAgentDefinitionsFromDir(dir: string, source: AgentConfigSource): Promise<AgentDefinition[]>;
201
225
  declare function parseAgentDefinition(content: string, options: {
202
226
  sourcePath: string;
203
227
  source: AgentConfigSource;
204
228
  }): AgentDefinition | undefined;
205
- declare function findAgentDefinition(agents: AgentDefinition[], name: string | undefined): AgentDefinition | undefined;
229
+ declare function findAgentDefinition(agents: AgentDefinition[], name: string | undefined, options?: {
230
+ includeInternal?: boolean;
231
+ }): AgentDefinition | undefined;
232
+ declare function agentVisibility(agent: AgentDefinition): AgentVisibility;
233
+ declare function publicAgentDefinitions(agents: AgentDefinition[]): AgentDefinition[];
206
234
  declare function filterSkillsForAgent(skills: Skill[], agent?: AgentDefinition): Skill[];
207
235
  declare function filterToolsForAgent(tools: AgentTool[], agent?: AgentDefinition): AgentTool[];
208
236
  declare function buildAgentDelegationPrompt(agents: AgentDefinition[]): string;
@@ -214,6 +242,20 @@ type SubagentContext = {
214
242
  /** Nesting depth of this run (root = 0, first child = 1, …) */depth: number; /** Session ID of the parent that spawned this subagent */
215
243
  parentSessionId: string;
216
244
  };
245
+ type AutoSkillReviewMode = "off" | "gate" | "dry_run" | "write";
246
+ type AutoSkillReviewReasonCode = "tool_call_volume" | "tool_diversity" | "state_changing_tools" | "tool_errors" | "multi_turn";
247
+ type AutoSkillReviewGateScope = "session" | "currentRun" | "reviewWindow";
248
+ type AutoSkillReviewGateRuleConfig = {
249
+ enabled: false;
250
+ min?: number;
251
+ toolNames?: string[];
252
+ } | {
253
+ enabled?: true;
254
+ min: number;
255
+ toolNames?: string[];
256
+ };
257
+ type AutoSkillReviewGateConfig = Partial<Record<AutoSkillReviewReasonCode, number | AutoSkillReviewGateRuleConfig>>;
258
+ type AutoSkillReviewGatesConfig = Partial<Record<AutoSkillReviewGateScope, AutoSkillReviewGateConfig>>;
217
259
  type SessionPathScope = {
218
260
  subagent?: {
219
261
  parentSessionId: string;
@@ -227,7 +269,8 @@ type SessionPathScope = {
227
269
  };
228
270
  type AgentRunParamsBase = {
229
271
  /** User data directory path (e.g. /data/user1) */dataDir: string; /** Optional current project directory used as the default cwd context for repository/code work. */
230
- projectDir?: string; /** The .aimax child directory used to persist session state; defaults to "sessions". */
272
+ projectDir?: string; /** Optional system-level agent definition directory; defaults to /aimax/agents. */
273
+ systemAgentsDir?: string; /** The .aimax child directory used to persist session state; defaults to "sessions". */
231
274
  sessionStoreName?: string; /** Optional nested path scope for session state, used for subagent-owned sessions. */
232
275
  sessionPathScope?: SessionPathScope; /** Session ID to resume; if omitted, a new session is created */
233
276
  sessionId?: string; /** Message ID for correlating events */
@@ -267,7 +310,7 @@ type AgentRunParamsBase = {
267
310
  * Additional skill registry directories supplied by the CLI.
268
311
  * Each directory contains skill child directories such as <dir>/<skill-name>/SKILL.md.
269
312
  */
270
- skillsLoadPaths?: string[]; /** Whether to encrypt session data at rest using lz-string compression. */
313
+ skillsLoadPaths?: string[]; /** Whether the CLI should prepare an encrypted .aimax mount before this run. */
271
314
  encryptSessions?: boolean; /** Memory system options (optional) */
272
315
  memory?: {
273
316
  /** Explicit memory provider id (overrides plugins.slots.memory) */providerId?: string; /** Explicit plugin id for memory provider (used when providerId not set) */
@@ -277,6 +320,16 @@ type AgentRunParamsBase = {
277
320
  messaging?: {
278
321
  enabled?: boolean; /** Human-readable configured channel list */
279
322
  channels?: string[];
323
+ }; /** Internal auto-skill controls. CLI wiring is intentionally separate. */
324
+ autoSkills?: {
325
+ load?: {
326
+ /** Defaults to false. When false, the main agent cannot see or load learned auto-skills. */enabled?: boolean;
327
+ };
328
+ review?: {
329
+ /** Defaults to "write": run post-run auto-skill review when gates pass unless explicitly disabled. */mode?: AutoSkillReviewMode; /** Defaults to 1. Hard cap for review attempts that complete per session. */
330
+ maxReviewsPerSession?: number; /** Scope-based all-AND gates for session, current run, and review window statistics. */
331
+ gates?: AutoSkillReviewGatesConfig;
332
+ };
280
333
  };
281
334
  /**
282
335
  * Maximum number of recent user turns to include in context.
@@ -284,7 +337,7 @@ type AgentRunParamsBase = {
284
337
  * 0 or undefined means no limit.
285
338
  */
286
339
  historyLimit?: number; /** Internal multi-agent prompt/model/tool policy resolved at run time. */
287
- agentPolicy?: AgentRuntimePolicy;
340
+ agentPolicy?: AgentRuntimePolicyInput;
288
341
  };
289
342
  /** Parameters for running an agent session */
290
343
  type AgentRunParams = AgentRunParamsBase & ({
@@ -998,45 +1051,10 @@ declare function inspectSession(dataDir: string, sessionId: string, options?: Se
998
1051
  declare function exportSession(dataDir: string, sessionId: string, options?: SessionPathOptions): Promise<SessionExport>;
999
1052
  //#endregion
1000
1053
  //#region src/session/session-storage.d.ts
1001
- /**
1002
- * Unified session storage layer.
1003
- *
1004
- * When encryption is enabled, all session file content is compressed/encoded
1005
- * via lz-string before writing and decompressed/decoded on read.
1006
- * The marker prefix `__LZENC__` lets readers distinguish encrypted content
1007
- * from plain-text even after a configuration change.
1008
- */
1009
- /** Compress + encode a UTF-8 string into a base64-safe encrypted payload. */
1010
- declare function encryptContent(plain: string): string;
1011
- /** Detect whether a payload is encrypted, then decode + decompress. */
1012
- declare function decryptContent(raw: string): string;
1013
- /** Returns `true` when the raw string starts with the encryption marker. */
1014
- declare function isEncryptedContent(raw: string): boolean;
1015
- /**
1016
- * Read a session file, transparently decrypting if the content is encrypted.
1017
- * Returns `null` when the file does not exist (ENOENT).
1018
- */
1019
1054
  declare function readSessionFile(filePath: string): Promise<string | null>;
1020
- /**
1021
- * Write content to a session file, optionally encrypting it.
1022
- */
1023
1055
  declare function writeSessionFile(filePath: string, content: string, encrypt?: boolean): Promise<void>;
1024
- /**
1025
- * Append content to a session file, optionally encrypting the *entire* file.
1026
- *
1027
- * For JSONL files in encrypted mode we must read-decrypt-append-encrypt-write
1028
- * because lz-string output is not append-friendly.
1029
- */
1030
1056
  declare function appendSessionFile(filePath: string, line: string, encrypt?: boolean): Promise<void>;
1031
- /**
1032
- * Atomically write content via a temp file + rename, optionally encrypting.
1033
- */
1034
1057
  declare function atomicWriteSessionFile(filePath: string, content: string, encrypt?: boolean): Promise<void>;
1035
- /**
1036
- * Read a session file and return its content as a string, transparently
1037
- * handling encrypted files. This replaces direct `fs.createReadStream` usage
1038
- * for session transcript scanning.
1039
- */
1040
1058
  declare function readSessionFileContent(filePath: string): Promise<string | null>;
1041
1059
  //#endregion
1042
1060
  //#region src/context/session-context-store.d.ts
@@ -1344,6 +1362,95 @@ declare function resolveMemoryProvider(params: {
1344
1362
  } | null;
1345
1363
  declare function resetMemoryProviderRegistryForTests(): void;
1346
1364
  //#endregion
1365
+ //#region src/auto-skills/paths.d.ts
1366
+ declare function autoSkillsDir(dataDir: string): string;
1367
+ //#endregion
1368
+ //#region src/auto-skills/types.d.ts
1369
+ type AutoSkillSource = "auto";
1370
+ type AutoSkillStatus = "active" | "archived";
1371
+ type AutoSkillCategory = {
1372
+ path: string;
1373
+ name: string;
1374
+ description: string;
1375
+ createdBy?: string;
1376
+ };
1377
+ type AutoSkillIndexEntry = {
1378
+ skillId: string;
1379
+ name: string;
1380
+ description: string;
1381
+ categoryPath: string;
1382
+ source: AutoSkillSource;
1383
+ status: AutoSkillStatus;
1384
+ rootDir: string;
1385
+ skillDir: string;
1386
+ skillFile: string;
1387
+ metadataFile?: string;
1388
+ tags: string[];
1389
+ relatedSkills: string[];
1390
+ confidence?: number;
1391
+ createdAt?: string;
1392
+ updatedAt?: string;
1393
+ };
1394
+ type AutoSkillListItem = {
1395
+ skillId: string;
1396
+ name: string;
1397
+ description: string;
1398
+ categoryPath: string;
1399
+ source: AutoSkillSource;
1400
+ };
1401
+ type AutoSkillSearchResult = AutoSkillListItem & {
1402
+ score: number;
1403
+ };
1404
+ type AutoSkillViewResult = AutoSkillListItem & {
1405
+ status: AutoSkillStatus;
1406
+ content: string;
1407
+ path: string;
1408
+ skillDir: string;
1409
+ filePath?: string;
1410
+ tags?: string[];
1411
+ relatedSkills?: string[];
1412
+ };
1413
+ type AutoSkillsLoaderOptions = {
1414
+ dataDir?: string;
1415
+ rootDir?: string;
1416
+ includeArchived?: boolean;
1417
+ maxSkillBytes?: number;
1418
+ maxResourceBytes?: number;
1419
+ };
1420
+ type AutoSkillListOptions = {
1421
+ categoryPath?: string;
1422
+ recursive?: boolean;
1423
+ };
1424
+ type AutoSkillSearchOptions = {
1425
+ query: string;
1426
+ limit?: number;
1427
+ };
1428
+ type AutoSkillViewOptions = {
1429
+ skillId: string;
1430
+ filePath?: string;
1431
+ };
1432
+ //#endregion
1433
+ //#region src/auto-skills/loader.d.ts
1434
+ declare function createAutoSkillsLoader(options: AutoSkillsLoaderOptions): AutoSkillsLoader;
1435
+ declare class AutoSkillsLoader {
1436
+ readonly rootDir: string;
1437
+ private readonly includeArchived;
1438
+ private readonly maxSkillBytes;
1439
+ private readonly maxResourceBytes;
1440
+ constructor(options: AutoSkillsLoaderOptions);
1441
+ autoSkillCategories(): Promise<AutoSkillCategory[]>;
1442
+ autoSkillList(options?: AutoSkillListOptions): Promise<AutoSkillListItem[]>;
1443
+ autoSkillSearch(options: AutoSkillSearchOptions): Promise<AutoSkillSearchResult[]>;
1444
+ autoSkillView(options: AutoSkillViewOptions): Promise<AutoSkillViewResult>;
1445
+ loadIndex(): Promise<AutoSkillIndexEntry[]>;
1446
+ private loadIndexState;
1447
+ private parseEntriesFromManifest;
1448
+ private visibleEntries;
1449
+ private visibleEntriesFrom;
1450
+ private optionsHash;
1451
+ private loadEntry;
1452
+ }
1453
+ //#endregion
1347
1454
  //#region src/commands/types.d.ts
1348
1455
  type SlashCommandSpec = {
1349
1456
  name: string;
@@ -1374,6 +1481,7 @@ type SystemPromptParams = {
1374
1481
  };
1375
1482
  toolNames?: string[];
1376
1483
  toolSummaries?: Record<string, string>;
1484
+ autoSkillCategories?: AutoSkillCategory[];
1377
1485
  promptMode?: PromptMode;
1378
1486
  bootstrapWarnings?: string[];
1379
1487
  memoryCitationsMode?: MemoryCitationsMode;
@@ -1907,6 +2015,43 @@ declare function createSkillLoadTool(params: {
1907
2015
  reportSkillUsed?: SkillUsedReporter;
1908
2016
  }): AgentTool<typeof skillLoadSchema, SkillLoadToolResult>;
1909
2017
  //#endregion
2018
+ //#region src/tools/auto-skills.d.ts
2019
+ declare const autoSkillCategoriesSchema: TObject<{}>;
2020
+ declare const autoSkillListSchema: TObject<{
2021
+ categoryPath: TOptional<TString>;
2022
+ recursive: TOptional<TBoolean>;
2023
+ }>;
2024
+ declare const autoSkillSearchSchema: TObject<{
2025
+ query: TString;
2026
+ limit: TOptional<TNumber>;
2027
+ }>;
2028
+ declare const autoSkillViewSchema: TObject<{
2029
+ skillId: TString;
2030
+ filePath: TOptional<TString>;
2031
+ }>;
2032
+ type AutoSkillCategoriesToolResult = {
2033
+ categories: AutoSkillCategory[];
2034
+ count: number;
2035
+ error?: string;
2036
+ };
2037
+ type AutoSkillListToolResult = {
2038
+ skills: AutoSkillListItem[];
2039
+ count: number;
2040
+ error?: string;
2041
+ };
2042
+ type AutoSkillSearchToolResult = {
2043
+ skills: AutoSkillSearchResult[];
2044
+ count: number;
2045
+ error?: string;
2046
+ };
2047
+ type AutoSkillViewToolResult = Partial<AutoSkillViewResult> & {
2048
+ error?: string;
2049
+ };
2050
+ declare function createAutoSkillCategoriesTool(dataDir: string): AgentTool<typeof autoSkillCategoriesSchema, AutoSkillCategoriesToolResult>;
2051
+ declare function createAutoSkillListTool(dataDir: string): AgentTool<typeof autoSkillListSchema, AutoSkillListToolResult>;
2052
+ declare function createAutoSkillSearchTool(dataDir: string): AgentTool<typeof autoSkillSearchSchema, AutoSkillSearchToolResult>;
2053
+ declare function createAutoSkillViewTool(dataDir: string): AgentTool<typeof autoSkillViewSchema, AutoSkillViewToolResult>;
2054
+ //#endregion
1910
2055
  //#region src/tools/image.d.ts
1911
2056
  declare const imageSchema: TObject<{
1912
2057
  image: TString;
@@ -1962,7 +2107,7 @@ type BatchSpawnResult = {
1962
2107
  status: "done" | "partial_error" | "error";
1963
2108
  results: BatchSpawnItemResult[];
1964
2109
  };
1965
- type InheritedRunParams = Pick<AgentRunParams, "plugins" | "skillsLoadPaths" | "memory" | "messaging" | "historyLimit" | "onProgress" | "messageId" | "sessionStoreName" | "agentPolicy">;
2110
+ type InheritedRunParams = Pick<AgentRunParams, "plugins" | "skillsLoadPaths" | "memory" | "messaging" | "historyLimit" | "onProgress" | "messageId" | "sessionStoreName" | "autoSkills" | "agentPolicy">;
1966
2111
  /** Formats the announce message injected into the parent session when a subagent completes. */
1967
2112
  declare function buildSubagentAnnounceMessage(params: {
1968
2113
  task: string;
@@ -2109,8 +2254,9 @@ type SubagentToolsContext = {
2109
2254
  depth: number;
2110
2255
  channel: AgentRunParams["channel"];
2111
2256
  llm: AgentRunParams["llm"];
2112
- inheritedRunParams?: Pick<AgentRunParams, "plugins" | "skillsLoadPaths" | "memory" | "messaging" | "historyLimit" | "onProgress" | "messageId" | "sessionStoreName" | "agentPolicy">;
2257
+ inheritedRunParams?: Pick<AgentRunParams, "plugins" | "skillsLoadPaths" | "memory" | "messaging" | "historyLimit" | "onProgress" | "messageId" | "sessionStoreName" | "autoSkills" | "agentPolicy">;
2113
2258
  loopDetection?: ToolLoopDetectionConfig;
2259
+ autoSkillsLoadEnabled?: boolean;
2114
2260
  memoryOptions?: MemoryToolOptions;
2115
2261
  pluginSkillDirs?: string[];
2116
2262
  skillsLoadPaths?: string[];
@@ -2579,4 +2725,4 @@ declare function formatClarifyResolution(resolution: HitlResolution): string;
2579
2725
  declare function formatReviewResolution(resolution: HitlResolution): string;
2580
2726
  declare function buildResumeNarration(resolution: HitlResolution, kind: string): string;
2581
2727
  //#endregion
2582
- export { AgentBinding, AgentConfig, type AgentConfigSource, type AgentCustomProgressEvent, type AgentDefinition, type AgentDirectoryCandidate, AgentModelConfig, type AgentProgressEvent, type AgentRunParams, type AgentRunResult, type AgentRuntimePolicy, type AgentScanOptions, AgentsConfig, type ArtifactOpInput, type ArtifactOperation, type ArtifactOperationInput, type ArtifactOperationName, type ArtifactOperationType, BOOTSTRAP_FILE_NAMES, BOOTSTRAP_MAX_CHARS, BOOTSTRAP_TOTAL_MAX_CHARS, type BootstrapContextFile, type BootstrapEnsureResult, type BootstrapFile, type BootstrapMountResult, type BootstrapMountStatus, type CallbackEventPayload, type CallbackPayload, type Channel, type ContextManager, type CronExecutionRecord, DEFAULT_SESSION_STORE_NAME, type EmbeddingProvider, type EmbeddingProviderContext, type EmbeddingProviderFactory, type EmbeddingProviderRegistration, HITL_MESSAGES, type HitlPauseContext, HitlPauseSignal, type HitlToolContext, MAX_ARTIFACT_CONTENT_CHARS, MAX_CHILDREN_PER_SESSION, MAX_SUBAGENT_DEPTH, type MemoryCallOptions, type MemoryChangeSource, type MemoryChangedEvent, type MemoryChangedHandler, MemoryIndexManager, type MemoryProvider, type MemoryProviderContext, type MemoryProviderFactory, type MemoryProviderRegistration, type MemoryProviderStatus, type MemoryRebuildSummary, type MemorySearchOptions, type MemorySearchResult, type NormalizedPluginsConfig, PLUGIN_MANIFEST_FILENAME, PLUGIN_MANIFEST_FILENAMES, type PersistedSubagentRunRecord, type PersistedToolResult, type PluginApi, type PluginCandidate, type PluginConfigUiHint, type PluginCustomProgressInput, type PluginDiagnostic, type PluginDiscoveryOptions, type PluginDiscoveryResult, type PluginEntryConfig, type PluginExecutionRuntime, type PluginHookAfterCompactionEvent, type PluginHookAfterPromptBuildEvent, type PluginHookAfterToolCallEvent, type PluginHookAgentContext, type PluginHookAgentEndEvent, type PluginHookAssistantMessageEndEvent, type PluginHookBeforeCompactionEvent, type PluginHookBeforeCompactionResult, type PluginHookBeforeModelResolveEvent, type PluginHookBeforeModelResolveResult, type PluginHookBeforePromptBuildEvent, type PluginHookBeforePromptBuildResult, type PluginHookBeforeToolCallEvent, type PluginHookBeforeToolCallResult, type PluginHookDreamGateEvent, type PluginHookDreamGateResult, type PluginHookHandlerMap, type PluginHookLlmInputEvent, type PluginHookLlmOutputEvent, type PluginHookMemoryChangedEvent, type PluginHookName, PluginHookRegistry, type PluginHookSessionEndEvent, type PluginHookSessionResetEvent, type PluginHookSessionStartEvent, type PluginKind, type PluginManifest, type PluginManifestLoadResult, type PluginManifestRegistry, type PluginOrigin, type PluginProgressEmitter, type PluginRecord, type PluginRegistry, type PluginRuntime, type PluginRuntimeContext, type PluginSystem, type PluginSystemOptions, type PluginToolOptions, PluginToolRegistry, type PluginUiToolDescriptor, type PluginUiToolOptions, type PluginsConfig, type PluginsConfigValidationResult, type RegisteredPluginTool, type ResumeOptions, type ResumeValidationResult, type RunResultPayload, SYSTEM_AGENTS_DIR, type SessionContextStore, type SessionExport, type SessionInspection, type SessionMetadata, type SessionMetadataUpdate, type SessionSummary, type Skill, type SkillDirectory, type SkillViewResult, type SlashCommandList, type SubagentContext, SubagentRegistry, type SubagentRunRecord, type SubagentStatus, type SubagentToolsContext, type SystemPromptParams, type ToolLoopDetectionConfig, type TranscriptEntry, type UiToolInputSchema, type UiToolOptions, UiToolPauseSignal, addAgent, addBinding, agentDirCandidates, aimaxDir, appendArtifactOperation, appendCronExecutionRecord, appendRecentToMemory, appendSessionFile, appendToMemory, appendTranscriptEntry, approvalSummaryFromResolution, artifactsPath, atomicWriteSessionFile, bootstrapMountLayout, buildAgentDelegationPrompt, buildAgentTaskPrompt, buildBootstrapContextFiles, buildResumeNarration, buildSkillsPrompt, buildSubagentAnnounceMessage, buildSystemPrompt, cleanupOldSubagentRecords, clearPendingHitl, clearPendingUiTool, collapseLogPath, contextSnapshotPath, createAgentTools, createApplyPatchTool, createBashTool, createBatchSubagentSpawnTool, createBuiltinMemoryProvider, createContextManager, createEditFileTool, createExecTool, createImageTool, createListDirTool, createMemoryAppendTool, createMemoryForgetTool, createMemoryGetTool, createMemoryListTool, createMemoryLogTool, createMemorySearchTool, createMemoryUpdateTool, createMemoryWriteTool, createPendingHitl, createPendingUiTool, createPluginProgressEmitter, createPluginRuntime, createProcessTool, createReadFileTool, createSession, createSessionContextStore, createSessionSearchTool, createSkillListTool, createSkillLoadTool, createSubagentSpawnTool, createSubagentsTool, createUiTool, createWriteFileTool, cronExecutionsPath, decryptContent, defaultUiToolInputSchema, deleteMemoryFile, discoverAIMaxPlugins, encryptContent, ensureBootstrapMountLayout, ensureSession, exportSession, filterSkillsForAgent, filterToolsForAgent, findAgentDefinition, findSkillByName, formatApprovalResolution, formatClarifyResolution, formatReviewResolution, generateSessionTitle, getAgentConfig, getMemoryLines, hasBootstrapSentinel, hitlHistoryPath, initializePluginSystem, inspectBootstrapMountLayout, inspectSession, isBootstrapMountLayoutReady, isEncryptedContent, isHitlPauseSignal, isUiToolPauseSignal, listAgents, listAvailableSlashCommands, listBindings, listMemoryFiles, listSessionSummaries, listSessions, listSubagentRunsFromDisk, loadAgentDefinitionsFromDir, loadAgentsConfig, loadArtifactOperations, loadBootstrapFiles, loadCronExecutionRecords, readPendingHitl as loadPendingHitl, readPendingHitl, readPendingUiTool as loadPendingUiTool, readPendingUiTool, loadPluginManifest, loadPluginManifestRegistry, loadPlugins, loadSessionContextSnapshot, loadSessionMetadata, loadSkillView, loadSkills, loadSkillsFromDirs, loadSkillsWithPluginDirs, loadSubagentRegistryFromDisk, loadTranscript, memoryDir, metadataPath, normalizeAgentId, normalizePluginsConfig, normalizeSessionStoreName, parseAgentDefinition, pendingHitlPath, pendingUiToolPath, primaryMemoryPath, readHitlHistory, readMemoryFile, readPrimaryMemory, readSessionFile, readSessionFileContent, registerEmbeddingProvider, registerMemoryProvider, removeAgent, removeBindings, replaceMemoryFile, resetEmbeddingProviderRegistryForTests, resetMemoryProviderRegistryForTests, resolveAgentDir, resolveAgentIdByBinding, resolveAgentsConfigPath, resolveDefaultAgentId, resolveEmbeddingProvider, resolveHitlRequest, resolveHitlRequest as resolvePendingHitl, resolveMemoryProvider, resolveModelFallbacks, resolveModelString, resolvePendingUiTool, resolvePluginManifestPath, rewriteTranscript, runAgent, saveAgentsConfig, saveSessionMetadata, saveSubagentRegistryToDisk, scanAgentDefinitions, searchMemory, sessionDir, sessionMemoryPath, sessionsDir, skillsDir, toolResultsDir, transcriptPath, transitionHitlStatus, updateAgentIdentity, updateSessionMetadata, validatePluginsConfig, validateResume, wrapToolsWithHooks, writeSessionFile };
2728
+ export { AgentBinding, AgentConfig, type AgentConfigSource, type AgentCustomProgressEvent, type AgentDefinition, type AgentDefinitionsContext, type AgentDefinitionsStats, type AgentDirectoryCandidate, AgentModelConfig, type AgentProgressEvent, type AgentRunParams, type AgentRunResult, type AgentRuntimePolicy, type AgentRuntimePolicyInput, type AgentScanOptions, type AgentVisibility, AgentsConfig, type ArtifactOpInput, type ArtifactOperation, type ArtifactOperationInput, type ArtifactOperationName, type ArtifactOperationType, type AutoSkillCategory, type AutoSkillIndexEntry, type AutoSkillListItem, type AutoSkillListOptions, type AutoSkillSearchOptions, type AutoSkillSearchResult, type AutoSkillStatus, type AutoSkillViewOptions, type AutoSkillViewResult, AutoSkillsLoader, type AutoSkillsLoaderOptions, BOOTSTRAP_FILE_NAMES, BOOTSTRAP_MAX_CHARS, BOOTSTRAP_TOTAL_MAX_CHARS, type BootstrapContextFile, type BootstrapEnsureResult, type BootstrapFile, type BootstrapMountResult, type BootstrapMountStatus, type CallbackEventPayload, type CallbackPayload, type Channel, type ContextManager, type CronExecutionRecord, DEFAULT_SESSION_STORE_NAME, type EmbeddingProvider, type EmbeddingProviderContext, type EmbeddingProviderFactory, type EmbeddingProviderRegistration, HITL_MESSAGES, type HitlPauseContext, HitlPauseSignal, type HitlToolContext, MAX_ARTIFACT_CONTENT_CHARS, MAX_CHILDREN_PER_SESSION, MAX_SUBAGENT_DEPTH, type MemoryCallOptions, type MemoryChangeSource, type MemoryChangedEvent, type MemoryChangedHandler, MemoryIndexManager, type MemoryProvider, type MemoryProviderContext, type MemoryProviderFactory, type MemoryProviderRegistration, type MemoryProviderStatus, type MemoryRebuildSummary, type MemorySearchOptions, type MemorySearchResult, type NormalizedPluginsConfig, PLUGIN_MANIFEST_FILENAME, PLUGIN_MANIFEST_FILENAMES, type PersistedSubagentRunRecord, type PersistedToolResult, type PluginApi, type PluginCandidate, type PluginConfigUiHint, type PluginCustomProgressInput, type PluginDiagnostic, type PluginDiscoveryOptions, type PluginDiscoveryResult, type PluginEntryConfig, type PluginExecutionRuntime, type PluginHookAfterCompactionEvent, type PluginHookAfterPromptBuildEvent, type PluginHookAfterToolCallEvent, type PluginHookAgentContext, type PluginHookAgentEndEvent, type PluginHookAssistantMessageEndEvent, type PluginHookBeforeCompactionEvent, type PluginHookBeforeCompactionResult, type PluginHookBeforeModelResolveEvent, type PluginHookBeforeModelResolveResult, type PluginHookBeforePromptBuildEvent, type PluginHookBeforePromptBuildResult, type PluginHookBeforeToolCallEvent, type PluginHookBeforeToolCallResult, type PluginHookDreamGateEvent, type PluginHookDreamGateResult, type PluginHookHandlerMap, type PluginHookLlmInputEvent, type PluginHookLlmOutputEvent, type PluginHookMemoryChangedEvent, type PluginHookName, PluginHookRegistry, type PluginHookSessionEndEvent, type PluginHookSessionResetEvent, type PluginHookSessionStartEvent, type PluginKind, type PluginManifest, type PluginManifestLoadResult, type PluginManifestRegistry, type PluginOrigin, type PluginProgressEmitter, type PluginRecord, type PluginRegistry, type PluginRuntime, type PluginRuntimeContext, type PluginSystem, type PluginSystemOptions, type PluginToolOptions, PluginToolRegistry, type PluginUiToolDescriptor, type PluginUiToolOptions, type PluginsConfig, type PluginsConfigValidationResult, type RegisteredPluginTool, type ResumeOptions, type ResumeValidationResult, type RunResultPayload, SYSTEM_AGENTS_DIR, type SessionContextStore, type SessionExport, type SessionInspection, type SessionMetadata, type SessionMetadataUpdate, type SessionSummary, type Skill, type SkillDirectory, type SkillViewResult, type SlashCommandList, type SubagentContext, SubagentRegistry, type SubagentRunRecord, type SubagentStatus, type SubagentToolsContext, type SystemPromptParams, type ToolLoopDetectionConfig, type TranscriptEntry, type UiToolInputSchema, type UiToolOptions, UiToolPauseSignal, addAgent, addBinding, agentDirCandidates, agentVisibility, aimaxDir, appendArtifactOperation, appendCronExecutionRecord, appendRecentToMemory, appendSessionFile, appendToMemory, appendTranscriptEntry, approvalSummaryFromResolution, artifactsPath, atomicWriteSessionFile, autoSkillsDir, bootstrapMountLayout, buildAgentDelegationPrompt, buildAgentTaskPrompt, buildBootstrapContextFiles, buildResumeNarration, buildSkillsPrompt, buildSubagentAnnounceMessage, buildSystemPrompt, cleanupOldSubagentRecords, clearPendingHitl, clearPendingUiTool, collapseLogPath, contextSnapshotPath, createAgentDefinitionsContext, createAgentTools, createApplyPatchTool, createAutoSkillCategoriesTool, createAutoSkillListTool, createAutoSkillSearchTool, createAutoSkillViewTool, createAutoSkillsLoader, createBashTool, createBatchSubagentSpawnTool, createBuiltinMemoryProvider, createContextManager, createEditFileTool, createExecTool, createImageTool, createListDirTool, createMemoryAppendTool, createMemoryForgetTool, createMemoryGetTool, createMemoryListTool, createMemoryLogTool, createMemorySearchTool, createMemoryUpdateTool, createMemoryWriteTool, createPendingHitl, createPendingUiTool, createPluginProgressEmitter, createPluginRuntime, createProcessTool, createReadFileTool, createSession, createSessionContextStore, createSessionSearchTool, createSkillListTool, createSkillLoadTool, createSubagentSpawnTool, createSubagentsTool, createUiTool, createWriteFileTool, cronExecutionsPath, defaultUiToolInputSchema, deleteMemoryFile, discoverAIMaxPlugins, ensureBootstrapMountLayout, ensureSession, exportSession, filterSkillsForAgent, filterToolsForAgent, findAgentDefinition, findSkillByName, formatApprovalResolution, formatClarifyResolution, formatReviewResolution, generateSessionTitle, getAgentConfig, getMemoryLines, hasBootstrapSentinel, hitlHistoryPath, initializePluginSystem, inspectBootstrapMountLayout, inspectSession, isBootstrapMountLayoutReady, isHitlPauseSignal, isUiToolPauseSignal, listAgents, listAvailableSlashCommands, listBindings, listMemoryFiles, listSessionSummaries, listSessions, listSubagentRunsFromDisk, loadAgentDefinitionsFromDir, loadAgentsConfig, loadArtifactOperations, loadBootstrapFiles, loadCronExecutionRecords, readPendingHitl as loadPendingHitl, readPendingHitl, readPendingUiTool as loadPendingUiTool, readPendingUiTool, loadPluginManifest, loadPluginManifestRegistry, loadPlugins, loadSessionContextSnapshot, loadSessionMetadata, loadSkillView, loadSkills, loadSkillsFromDirs, loadSkillsWithPluginDirs, loadSubagentRegistryFromDisk, loadTranscript, memoryDir, metadataPath, normalizeAgentId, normalizePluginsConfig, normalizeSessionStoreName, parseAgentDefinition, pendingHitlPath, pendingUiToolPath, primaryMemoryPath, publicAgentDefinitions, readHitlHistory, readMemoryFile, readPrimaryMemory, readSessionFile, readSessionFileContent, registerEmbeddingProvider, registerMemoryProvider, removeAgent, removeBindings, replaceMemoryFile, resetEmbeddingProviderRegistryForTests, resetMemoryProviderRegistryForTests, resolveAgentDefinitionsContext, resolveAgentDir, resolveAgentIdByBinding, resolveAgentsConfigPath, resolveDefaultAgentId, resolveEmbeddingProvider, resolveHitlRequest, resolveHitlRequest as resolvePendingHitl, resolveMemoryProvider, resolveModelFallbacks, resolveModelString, resolvePendingUiTool, resolvePluginManifestPath, rewriteTranscript, runAgent, saveAgentsConfig, saveSessionMetadata, saveSubagentRegistryToDisk, scanAgentDefinitions, searchMemory, sessionDir, sessionMemoryPath, sessionsDir, skillsDir, toolResultsDir, transcriptPath, transitionHitlStatus, updateAgentIdentity, updateSessionMetadata, validatePluginsConfig, validateResume, wrapToolsWithHooks, writeSessionFile };