@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 +37 -0
- package/dist/builtin-provider-DMxBOIZn.js +71 -0
- package/dist/index.d.ts +191 -45
- package/dist/index.js +90 -82
- package/package.json +1 -3
- package/dist/builtin-provider-_CdSlTJE.js +0 -71
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
|
|
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; /**
|
|
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
|
|
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?:
|
|
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,
|
|
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 };
|