@gencode/agents 0.0.44 → 0.0.45

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.
@@ -1,7 +1,7 @@
1
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 from"node:path";import i,{randomUUID as a}from"node:crypto";import o from"node:fs";const s=`sessions`;function c(e){let t=e?.trim()||s;if(!/^[A-Za-z0-9_-]+$/.test(t))throw Error(`Invalid session store name: ${e}. Must match /^[A-Za-z0-9_-]+$/`);return t}function l(e,t){return r.join(e,`.aimax`,c(t?.storeName))}function u(e,t,n){return r.join(l(e,n),t)}function d(e,t,n){return r.join(u(e,t,n),`transcript.jsonl`)}function f(e,t,n){return r.join(u(e,t,n),`session.json`)}function p(e,t,n){return r.join(u(e,t,n),`context.json`)}function m(e,t,n){return r.join(u(e,t,n),`session-memory.json`)}function h(e,t,n){return r.join(u(e,t,n),`collapse-log.jsonl`)}function g(e,t,n){return r.join(u(e,t,n),`tool-results`)}const _={version:2,updatedAt:new Date(0).toISOString(),readStates:[],toolResults:[],compaction:{budgets:[],snips:[],collapseSpans:[],consecutiveAutocompactFailures:0}};async function ee(e,t,i){let o=a(),s=u(e,o,i);await n.mkdir(s,{recursive:!0});let c=r.join(s,`.channel`);return await n.writeFile(c,t,`utf-8`),o}async function v(e,t,r){let i=u(e,t,r);await n.mkdir(i,{recursive:!0})}async function y(e,t,r){let i=d(e,t,r),a;try{a=await n.readFile(i,`utf-8`)}catch(e){if(e.code===`ENOENT`)return[];throw e}let o=[];for(let e of a.split(`
2
2
  `)){let t=e.trim();if(t)try{o.push(JSON.parse(t))}catch{}}return o}async function b(e,t,i,a){await v(e,t,a);let o=d(e,t,a),s=JSON.stringify(i)+`
3
3
  `;await n.appendFile(o,s,`utf-8`);try{let{resolveMemoryProvider:t}=await import(`./provider-registry-CxtHsHdk.js`).then(e=>e.t),{createBuiltinMemoryProvider:n}=await Promise.resolve().then(()=>Q),i=r.join(e,`.aimax`),s=t({providerId:a?.providerId,pluginId:a?.pluginId,dataDir:e,memoryDir:i,sessionStoreName:a?.storeName})?.provider??n({dataDir:e,memoryDir:i,sessionStoreName:a?.storeName});s.noteSessionUpdate&&s.noteSessionUpdate(o)}catch{}a?.onMemoryChanged&&await Promise.resolve(a.onMemoryChanged({reason:`transcript-append`,files:[r.join(c(a.storeName),t,`transcript.jsonl`).replace(/\\/g,`/`)],source:`sessions`,sessionId:t,providerId:a.providerId??a.pluginId,timestamp:new Date().toISOString()})).catch(()=>{})}async function te(e,t,i,a){await v(e,t,a);let o=d(e,t,a),s=i(await y(e,t,a)),l=s.map(e=>JSON.stringify(e)).join(`
4
- `);await n.writeFile(o,l.length>0?`${l}\n`:``,`utf-8`);try{let{resolveMemoryProvider:t}=await import(`./provider-registry-CxtHsHdk.js`).then(e=>e.t),{createBuiltinMemoryProvider:n}=await Promise.resolve().then(()=>Q),i=r.join(e,`.aimax`),s=t({providerId:a?.providerId,pluginId:a?.pluginId,dataDir:e,memoryDir:i,sessionStoreName:a?.storeName})?.provider??n({dataDir:e,memoryDir:i,sessionStoreName:a?.storeName});s.noteSessionUpdate&&s.noteSessionUpdate(o)}catch{}return a?.onMemoryChanged&&await Promise.resolve(a.onMemoryChanged({reason:`transcript-rewrite`,files:[r.join(c(a.storeName),t,`transcript.jsonl`).replace(/\\/g,`/`)],source:`sessions`,sessionId:t,providerId:a.providerId??a.pluginId,timestamp:new Date().toISOString()})).catch(()=>{}),s}async function x(e,t){let r=l(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 S(e,t,r){await v(e,t.id,r);let i=f(e,t.id,r);await n.writeFile(i,JSON.stringify(t,null,2),`utf-8`)}async function ne(e,t,n,r){let i=await C(e,t,r);if(!i)return null;let a={...i,...n,id:i.id,createdAt:i.createdAt,updatedAt:new Date().toISOString()};return await S(e,a,r),a}async function C(e,t,i){let a=f(e,t,i);try{let o=await n.readFile(a,`utf-8`),s=JSON.parse(o);if(!s.channel){let a=r.join(u(e,t,i),`.channel`);try{s.channel=(await n.readFile(a,`utf-8`)).trim()}catch{s.channel=`WEB`}}return s}catch(e){if(e.code===`ENOENT`)return null;throw e}}async function re(e,t,n){let r=await x(e,n),i=await Promise.all(r.map(async t=>{let r=await C(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 w(e,t,r){let i=p(e,t,r);try{let e=await n.readFile(i,`utf-8`),t=JSON.parse(e),r=typeof t.version==`number`?t.version:void 0;return r!==1&&r!==2?_:{version:2,updatedAt:typeof t.updatedAt==`string`?t.updatedAt:_.updatedAt,readStates:Array.isArray(t.readStates)?t.readStates:[],toolResults:Array.isArray(t.toolResults)?t.toolResults:[],compaction:{sessionMemory:t.compaction?.sessionMemory,budgets:Array.isArray(t.compaction?.budgets)?t.compaction.budgets:[],snips:Array.isArray(t.compaction?.snips)?t.compaction.snips:[],collapseSpans:Array.isArray(t.compaction?.collapseSpans)?t.compaction.collapseSpans:[],consecutiveAutocompactFailures:typeof t.compaction?.consecutiveAutocompactFailures==`number`?t.compaction.consecutiveAutocompactFailures:0,lastCompactionAt:typeof t.compaction?.lastCompactionAt==`string`?t.compaction.lastCompactionAt:void 0,lastCompactionLayer:t.compaction?.lastCompactionLayer===`L1`||t.compaction?.lastCompactionLayer===`L2`||t.compaction?.lastCompactionLayer===`L3`||t.compaction?.lastCompactionLayer===`L4`||t.compaction?.lastCompactionLayer===`L5`||t.compaction?.lastCompactionLayer===`L6`?t.compaction.lastCompactionLayer:void 0}}}catch(e){if(e.code===`ENOENT`)return _;throw e}}async function T(e,t,n){let[r,i,a]=await Promise.all([C(e,t,n),y(e,t,n),w(e,t,n)]);return{id:t,metadata:r,transcriptPath:d(e,t,n),contextSnapshotPath:p(e,t,n),sessionMemoryPath:m(e,t,n),collapseLogPath:h(e,t,n),toolResultsDir:g(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 T(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 D(e){return!!(e&&typeof e==`object`&&`code`in e&&e.code===`ENOENT`)}async function ie(e){let t;try{t=await n.lstat(e)}catch(e){if(D(e))return{missing:!0};throw e}if(t.isSymbolicLink()||!t.isFile())throw Error(`path required`);return{missing:!1,stat:t}}function ae(e){try{o.mkdirSync(e,{recursive:!0})}catch{}return e}function oe(e){return e.trim().replace(/^[./]+/,``).replace(/\\/g,`/`)}function se(e){let t=oe(e);return t?t===`MEMORY.md`||t===`memory.md`?!0:t.startsWith(`memory/`):!1}async function O(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 O(i,t);continue}n.isFile()&&n.name.endsWith(`.md`)&&t.push(i)}}}async function k(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 O(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 A(e){return i.createHash(`sha256`).update(e).digest(`hex`)}async function ce(e,t){let i;try{i=await n.stat(e)}catch(e){if(D(e))return null;throw e}let a;try{a=await n.readFile(e,`utf-8`)}catch(e){if(D(e))return null;throw e}let o=A(a);return{path:r.relative(t,e).replace(/\\/g,`/`),absPath:e,mtimeMs:i.mtimeMs,size:i.size,hash:o}}function le(e,t){let n=e.split(`
4
+ `);await n.writeFile(o,l.length>0?`${l}\n`:``,`utf-8`);try{let{resolveMemoryProvider:t}=await import(`./provider-registry-CxtHsHdk.js`).then(e=>e.t),{createBuiltinMemoryProvider:n}=await Promise.resolve().then(()=>Q),i=r.join(e,`.aimax`),s=t({providerId:a?.providerId,pluginId:a?.pluginId,dataDir:e,memoryDir:i,sessionStoreName:a?.storeName})?.provider??n({dataDir:e,memoryDir:i,sessionStoreName:a?.storeName});s.noteSessionUpdate&&s.noteSessionUpdate(o)}catch{}return a?.onMemoryChanged&&await Promise.resolve(a.onMemoryChanged({reason:`transcript-rewrite`,files:[r.join(c(a.storeName),t,`transcript.jsonl`).replace(/\\/g,`/`)],source:`sessions`,sessionId:t,providerId:a.providerId??a.pluginId,timestamp:new Date().toISOString()})).catch(()=>{}),s}async function x(e,t){let r=l(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 S(e,t,r){await v(e,t.id,r);let i=f(e,t.id,r);await n.writeFile(i,JSON.stringify(t,null,2),`utf-8`)}async function ne(e,t,n,r){let i=await C(e,t,r);if(!i)return null;let a={...i,...n,id:i.id,createdAt:i.createdAt,updatedAt:new Date().toISOString()};return await S(e,a,r),a}async function C(e,t,i){let a=f(e,t,i);try{let o=await n.readFile(a,`utf-8`),s=JSON.parse(o);if(!s.channel){let a=r.join(u(e,t,i),`.channel`);try{s.channel=(await n.readFile(a,`utf-8`)).trim()}catch{s.channel=`WEB`}}return s}catch(e){if(e.code===`ENOENT`)return null;throw e}}async function re(e,t,n){let r=await x(e,n),i=await Promise.all(r.map(async t=>{let r=await C(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 w(e,t,r){let i=p(e,t,r);try{let e=await n.readFile(i,`utf-8`),t=JSON.parse(e),r=typeof t.version==`number`?t.version:void 0;return r!==1&&r!==2?_:{version:2,updatedAt:typeof t.updatedAt==`string`?t.updatedAt:_.updatedAt,readStates:Array.isArray(t.readStates)?t.readStates:[],toolResults:Array.isArray(t.toolResults)?t.toolResults:[],compaction:{sessionMemory:t.compaction?.sessionMemory,modelUsage:t.compaction?.modelUsage,budgets:Array.isArray(t.compaction?.budgets)?t.compaction.budgets:[],snips:Array.isArray(t.compaction?.snips)?t.compaction.snips:[],collapseSpans:Array.isArray(t.compaction?.collapseSpans)?t.compaction.collapseSpans:[],consecutiveAutocompactFailures:typeof t.compaction?.consecutiveAutocompactFailures==`number`?t.compaction.consecutiveAutocompactFailures:0,lastCompactionAt:typeof t.compaction?.lastCompactionAt==`string`?t.compaction.lastCompactionAt:void 0,lastCompactionLayer:t.compaction?.lastCompactionLayer===`L1`||t.compaction?.lastCompactionLayer===`L2`||t.compaction?.lastCompactionLayer===`L3`||t.compaction?.lastCompactionLayer===`L4`||t.compaction?.lastCompactionLayer===`L5`||t.compaction?.lastCompactionLayer===`L6`?t.compaction.lastCompactionLayer:void 0}}}catch(e){if(e.code===`ENOENT`)return _;throw e}}async function T(e,t,n){let[r,i,a]=await Promise.all([C(e,t,n),y(e,t,n),w(e,t,n)]);return{id:t,metadata:r,transcriptPath:d(e,t,n),contextSnapshotPath:p(e,t,n),sessionMemoryPath:m(e,t,n),collapseLogPath:h(e,t,n),toolResultsDir:g(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 T(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 D(e){return!!(e&&typeof e==`object`&&`code`in e&&e.code===`ENOENT`)}async function ie(e){let t;try{t=await n.lstat(e)}catch(e){if(D(e))return{missing:!0};throw e}if(t.isSymbolicLink()||!t.isFile())throw Error(`path required`);return{missing:!1,stat:t}}function ae(e){try{o.mkdirSync(e,{recursive:!0})}catch{}return e}function oe(e){return e.trim().replace(/^[./]+/,``).replace(/\\/g,`/`)}function se(e){let t=oe(e);return t?t===`MEMORY.md`||t===`memory.md`?!0:t.startsWith(`memory/`):!1}async function O(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 O(i,t);continue}n.isFile()&&n.name.endsWith(`.md`)&&t.push(i)}}}async function k(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 O(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 A(e){return i.createHash(`sha256`).update(e).digest(`hex`)}async function ce(e,t){let i;try{i=await n.stat(e)}catch(e){if(D(e))return null;throw e}let a;try{a=await n.readFile(e,`utf-8`)}catch(e){if(D(e))return null;throw e}let o=A(a);return{path:r.relative(t,e).replace(/\\/g,`/`),absPath:e,mtimeMs:i.mtimeMs,size:i.size,hash:o}}function le(e,t){let n=e.split(`
5
5
  `);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(`
6
6
  `),r=e.lineNo,i=t.lineNo;a.push({startLine:r,endLine:i,text:n,hash:A(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 ue(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 j(e){try{let t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}function de(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 fe(e){return(e.toLowerCase().match(/[\p{L}\p{N}_]+/gu)??[]).filter(Boolean)}function pe(e){return i.createHash(`sha256`).update(e).digest().readUInt32BE(0)}function M(e,t=384){let n=Array(t).fill(0),r=fe(e);if(r.length===0)return n;for(let e of r){let r=pe(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 N(e){let t=e?.model?.trim()||`mock-embedding-v1`,n=e?.dimensions??384;return{id:`external-mock`,model:t,embedQuery:async e=>M(e,n),embedBatch:async e=>e.map(e=>M(e,n))}}const P=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 me(e){let t=e.id?.trim()||e.pluginId;return P.register({id:t,pluginId:e.pluginId,create:e.create,config:e.config,rootDir:e.rootDir,source:e.source}),t}function F(e){let t=e.providerId?.trim(),n=e.pluginId?.trim(),r=(t?P.getById(t):void 0)??(n?P.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 he(){P.clear()}const I={enabled:!1,lambda:.7};function L(e){let t=e.toLowerCase().match(/[a-z0-9_]+/g)??[];return new Set(t)}function R(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 ge(e,t,n){if(t.length===0)return 0;let r=0,i=n.get(e.id)??L(e.content);for(let e of t){let t=R(i,n.get(e.id)??L(e.content));t>r&&(r=t)}return r}function _e(e,t,n){return n*e-(1-n)*t}function ve(e,t={}){let{enabled:n=I.enabled,lambda:r=I.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,L(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=_e(l(n.score),ge(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 ye(e,t={}){if(e.length===0)return e;let n=new Map;return ve(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 z={enabled:!1,halfLifeDays:30},B=/(?:^|\/)(?:memory)\/(\d{4})-(\d{2})-(\d{2})\.md$/;function be(e){return!Number.isFinite(e)||e<=0?0:Math.LN2/e}function xe(e){let t=be(e.halfLifeDays),n=Math.max(0,e.ageInDays);return t<=0||!Number.isFinite(n)?1:Math.exp(-t*n)}function Se(e){return e.score*xe(e)}function Ce(e){let t=e.replaceAll(`\\`,`/`).replace(/^\.\//,``),n=B.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 we(e){let t=e.replaceAll(`\\`,`/`).replace(/^\.\//,``);return t===`MEMORY.md`||t===`memory.md`?!0:t.startsWith(`memory/`)?!B.test(t):!1}async function Te(e){let t=Ce(e.filePath);if(t)return t;if(e.source===`memory`&&we(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 Ee(e,t){return Math.max(0,t-e.getTime())/864e5}async function De(e){let t={...z,...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=Te({filePath:i.path,source:i.source,memoryRoot:e.memoryRoot}),r.set(a,o));let s=await o;if(!s)return i;let c=Se({score:i.score,ageInDays:Ee(s,n),halfLifeDays:t.halfLifeDays});return{...i,score:c}}))}function Oe(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 ke(e){return 1/(1+(Number.isFinite(e)?Math.max(0,e):999))}async function Ae(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 De({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:{...z,...e.temporalDecay},memoryRoot:e.memoryRoot,nowMs:e.nowMs})).slice().sort((e,t)=>t.score-e.score),r={...I,...e.mmr};return r.enabled?ye(n,r):n}function je(e){e.db.exec(`
7
7
  CREATE TABLE IF NOT EXISTS meta (
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ import { S as AgentsConfig, _ as saveAgentsConfig, a as listAgents, b as AgentCo
2
2
  import { AssistantMessage, Message } from "@mariozechner/pi-ai";
3
3
  import { AgentMessage, AgentTool } from "@mariozechner/pi-agent-core";
4
4
  import * as _gencode_shared0 from "@gencode/shared";
5
- import { AgentCustomProgressEvent, AgentProgressEvent, AgentProgressEvent as AgentProgressEvent$1, 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, PausedRunState, PausedRunState as PausedRunState$1, ReadStateRecord, RunResultPayload, RunResultPayload as RunResultPayload$1, SessionContextSnapshot, SessionMemorySnapshot, SnipRecord, ToolResultReference, UiToolExtra, UiToolOutputSchema, UiToolPausedState, UiToolRequest, UiToolResult, UiToolValidationResult } from "@gencode/shared";
5
+ import { AgentCustomProgressEvent, AgentProgressEvent, AgentProgressEvent as AgentProgressEvent$1, 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, SnipRecord, ToolResultReference, UiToolExtra, UiToolOutputSchema, UiToolPausedState, UiToolRequest, UiToolResult, UiToolValidationResult } from "@gencode/shared";
6
6
 
7
7
  //#region src/loop-detection/tool-loop-detection.d.ts
8
8
  type ToolLoopDetectionConfig = {
@@ -824,6 +824,7 @@ type SessionContextStore = {
824
824
  recordSnip(record: SnipRecord): Promise<void>;
825
825
  recordCollapse(span: CollapseSpan): Promise<void>;
826
826
  setSessionMemory(snapshot: SessionMemorySnapshot): Promise<void>;
827
+ recordModelUsage(checkpoint: ModelUsageCheckpoint): Promise<void>;
827
828
  recordAutocompactResult(params: {
828
829
  layer: "L6";
829
830
  failed: boolean;
@@ -852,6 +853,7 @@ type ManageLayeredHistoryParams = {
852
853
  };
853
854
  historyLimit?: number;
854
855
  compactionEnabled?: boolean;
856
+ pendingUserMessage?: string;
855
857
  signal?: AbortSignal;
856
858
  hooks?: PluginHookRegistry;
857
859
  hookCtx?: PluginHookAgentContext;
@@ -891,6 +893,13 @@ type ContextManager = {
891
893
  thresholdChars?: number;
892
894
  previewChars?: number;
893
895
  }): Promise<PersistedToolResult>;
896
+ recordModelUsage(params: {
897
+ model: string;
898
+ inputTokens: number;
899
+ outputTokens: number;
900
+ totalTokens: number;
901
+ coveredTranscriptEntryCount: number;
902
+ }): Promise<void>;
894
903
  manageHistory(params: Omit<ManageLayeredHistoryParams, "contextStore">): Promise<ManageLayeredHistoryResult>;
895
904
  getSnapshot: SessionContextStore["getSnapshot"];
896
905
  };
@@ -1308,30 +1317,6 @@ type UnionLast<U> = UnionToIntersect<U extends unknown ? (x: U) => 0 : never> ex
1308
1317
  type UnionToTuple<U, Acc extends unknown[] = [], R = UnionLast<U>> = [U] extends [never] ? Acc : UnionToTuple<Exclude<U, R>, [Extract<U, R>, ...Acc]>;
1309
1318
  type Assert<T, E> = T extends E ? T : never;
1310
1319
  type Evaluate<T> = T extends infer O ? { [K in keyof O]: O[K] } : never;
1311
- type Ensure<T> = T extends infer U ? U : never;
1312
- //#endregion
1313
- //#region ../../node_modules/.pnpm/@sinclair+typebox@0.34.48/node_modules/@sinclair/typebox/build/cjs/type/array/array.d.ts
1314
- interface ArrayOptions extends SchemaOptions {
1315
- /** The minimum number of items in this array */
1316
- minItems?: number;
1317
- /** The maximum number of items in this array */
1318
- maxItems?: number;
1319
- /** Should this schema contain unique items */
1320
- uniqueItems?: boolean;
1321
- /** A schema for which some elements should match */
1322
- contains?: TSchema;
1323
- /** A minimum number of contains schema matches */
1324
- minContains?: number;
1325
- /** A maximum number of contains schema matches */
1326
- maxContains?: number;
1327
- }
1328
- type ArrayStatic<T extends TSchema, P extends unknown[]> = Ensure<Static<T, P>[]>;
1329
- interface TArray<T extends TSchema = TSchema> extends TSchema, ArrayOptions {
1330
- [Kind]: 'Array';
1331
- static: ArrayStatic<T, this['params']>;
1332
- type: 'array';
1333
- items: T;
1334
- }
1335
1320
  //#endregion
1336
1321
  //#region ../../node_modules/.pnpm/@sinclair+typebox@0.34.48/node_modules/@sinclair/typebox/build/cjs/type/schema/schema.d.ts
1337
1322
  interface SchemaOptions {
@@ -1633,63 +1618,6 @@ type SubagentsResult = {
1633
1618
  */
1634
1619
  declare function createSubagentsTool(registry: SubagentRegistry, parentSessionId: string): AgentTool<typeof subagentsSchema, SubagentsResult>;
1635
1620
  //#endregion
1636
- //#region src/tools/clarify.d.ts
1637
- declare const clarifySchema: TObject<{
1638
- question: TString;
1639
- options: TOptional<TArray<TString>>;
1640
- allow_free_text: TOptional<TBoolean>;
1641
- }>;
1642
- type ClarifyResult = {
1643
- paused: true;
1644
- };
1645
- /**
1646
- * Creates the `clarify` tool that the agent can call to ask the user a question.
1647
- *
1648
- * @param sessionId - Current session ID for the HITL request.
1649
- * @param hitlResume - When present, contains the user's resolution for a
1650
- * previously paused clarify request. The tool returns the
1651
- * user's answer instead of throwing again.
1652
- */
1653
- declare function createClarifyTool(sessionId: string, hitlResume?: AgentRunParams["hitlResume"]): AgentTool<typeof clarifySchema, ClarifyResult>;
1654
- //#endregion
1655
- //#region src/tools/request-approval.d.ts
1656
- declare const approvalSchema: TObject<{
1657
- action: TString;
1658
- reason: TString;
1659
- details: TOptional<TString>;
1660
- }>;
1661
- type ApprovalResult = {
1662
- paused: true;
1663
- };
1664
- declare function formatApprovalResolution(resolution: NonNullable<NonNullable<AgentRunParams["hitlResume"]>["resolution"]>): string;
1665
- /**
1666
- * Creates the `request_approval` tool.
1667
- *
1668
- * @param sessionId - Current session ID.
1669
- * @param turnId - Current turn ID for checkpoint tracking.
1670
- */
1671
- declare function createRequestApprovalTool(sessionId: string, hitlResume?: AgentRunParams["hitlResume"]): AgentTool<typeof approvalSchema, ApprovalResult>;
1672
- //#endregion
1673
- //#region src/tools/request-review.d.ts
1674
- declare const reviewSchema: TObject<{
1675
- title: TString;
1676
- description: TString;
1677
- content: TString;
1678
- content_type: TOptional<TString>;
1679
- }>;
1680
- type ReviewResult = {
1681
- paused: true;
1682
- };
1683
- /**
1684
- * Creates the `request_review` tool.
1685
- *
1686
- * @param sessionId - Current session ID.
1687
- * @param hitlResume - When present, contains the user's resolution for a
1688
- * previously paused review request. The tool returns the
1689
- * reviewer's verdict instead of throwing again.
1690
- */
1691
- declare function createRequestReviewTool(sessionId: string, hitlResume?: AgentRunParams["hitlResume"]): AgentTool<typeof reviewSchema, ReviewResult>;
1692
- //#endregion
1693
1621
  //#region src/tools/ui-tool.d.ts
1694
1622
  type UiToolOptions = {
1695
1623
  /** Unique tool name (must be valid identifier, e.g. "collect_feedback"). */name: string; /** Human-readable label shown in tool listings. */
@@ -2219,6 +2147,7 @@ declare const HITL_MESSAGES: {
2219
2147
  };
2220
2148
  };
2221
2149
  declare function approvalSummaryFromResolution(resolution: HitlResolution): string;
2150
+ declare function formatApprovalResolution(resolution: HitlResolution): string;
2222
2151
  /**
2223
2152
  * Formats a clarify resolution into a JSON string suitable for the tool
2224
2153
  * result content in the transcript. The model sees this as the clarify
@@ -2233,4 +2162,4 @@ declare function formatClarifyResolution(resolution: HitlResolution): string;
2233
2162
  declare function formatReviewResolution(resolution: HitlResolution): string;
2234
2163
  declare function buildResumeNarration(resolution: HitlResolution, kind: string): string;
2235
2164
  //#endregion
2236
- export { AgentBinding, AgentConfig, type AgentCustomProgressEvent, AgentModelConfig, type AgentProgressEvent, type AgentRunParams, type AgentRunResult, AgentsConfig, 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, DEFAULT_SESSION_STORE_NAME, type EmbeddingProvider, type EmbeddingProviderContext, type EmbeddingProviderFactory, type EmbeddingProviderRegistration, HITL_MESSAGES, type HitlPauseContext, HitlPauseSignal, type HitlToolContext, 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 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 PluginHookBeforeModelResolveEvent, type PluginHookBeforeModelResolveResult, type PluginHookBeforePromptBuildEvent, type PluginHookBeforePromptBuildResult, type PluginHookBeforeToolCallEvent, type PluginHookBeforeToolCallResult, 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, type SessionContextStore, type SessionExport, type SessionInspection, type SessionMetadata, type SessionMetadataUpdate, type SessionSummary, type Skill, type SlashCommandList, type SubagentContext, SubagentRegistry, type SubagentRunRecord, type SubagentStatus, type SubagentToolsContext, type SystemPromptParams, type ToolLoopDetectionConfig, type TranscriptEntry, type UiToolInputSchema, type UiToolOptions, UiToolPauseSignal, addAgent, addBinding, aimaxDir, appendToMemory, appendTranscriptEntry, approvalSummaryFromResolution, bootstrapMountLayout, buildBootstrapContextFiles, buildResumeNarration, buildSkillsPrompt, buildSubagentAnnounceMessage, buildSystemPrompt, cleanupOldSubagentRecords, clearPendingHitl, clearPendingUiTool, collapseLogPath, contextSnapshotPath, createAgentTools, createApplyPatchTool, createBashTool, createBuiltinMemoryProvider, createClarifyTool, createContextManager, createEditFileTool, createExecTool, createImageTool, createListDirTool, createMemoryAppendTool, createMemoryGetTool, createMemorySearchTool, createPendingHitl, createPendingUiTool, createPluginProgressEmitter, createPluginRuntime, createProcessTool, createReadFileTool, createRequestApprovalTool, createRequestReviewTool, createSession, createSessionContextStore, createSessionsSpawnTool, createSubagentsTool, createUiTool, createWriteFileTool, defaultUiToolInputSchema, deleteMemoryFile, discoverAIMaxPlugins, ensureBootstrapMountLayout, ensureSession, exportSession, formatApprovalResolution, formatClarifyResolution, formatReviewResolution, generateSessionTitle, getAgentConfig, getMemoryLines, hasBootstrapSentinel, hitlHistoryPath, initializePluginSystem, inspectBootstrapMountLayout, inspectSession, isBootstrapMountLayoutReady, isHitlPauseSignal, isUiToolPauseSignal, listAgents, listAvailableSlashCommands, listBindings, listMemoryFiles, listSessionSummaries, listSessions, listSubagentRunsFromDisk, loadAgentsConfig, loadBootstrapFiles, readPendingHitl as loadPendingHitl, readPendingHitl, readPendingUiTool as loadPendingUiTool, readPendingUiTool, loadPluginManifest, loadPluginManifestRegistry, loadPlugins, loadSessionContextSnapshot, loadSessionMetadata, loadSkills, loadSkillsFromDirs, loadSkillsWithPluginDirs, loadSubagentRegistryFromDisk, loadTranscript, memoryDir, metadataPath, normalizeAgentId, normalizePluginsConfig, normalizeSessionStoreName, pendingHitlPath, pendingUiToolPath, primaryMemoryPath, readHitlHistory, readMemoryFile, readPrimaryMemory, 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, searchMemory, sessionDir, sessionMemoryPath, sessionsDir, skillsDir, toolResultsDir, transcriptPath, transitionHitlStatus, updateAgentIdentity, updateSessionMetadata, validatePluginsConfig, validateResume, wrapToolsWithHooks };
2165
+ export { AgentBinding, AgentConfig, type AgentCustomProgressEvent, AgentModelConfig, type AgentProgressEvent, type AgentRunParams, type AgentRunResult, AgentsConfig, 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, DEFAULT_SESSION_STORE_NAME, type EmbeddingProvider, type EmbeddingProviderContext, type EmbeddingProviderFactory, type EmbeddingProviderRegistration, HITL_MESSAGES, type HitlPauseContext, HitlPauseSignal, type HitlToolContext, 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 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 PluginHookBeforeModelResolveEvent, type PluginHookBeforeModelResolveResult, type PluginHookBeforePromptBuildEvent, type PluginHookBeforePromptBuildResult, type PluginHookBeforeToolCallEvent, type PluginHookBeforeToolCallResult, 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, type SessionContextStore, type SessionExport, type SessionInspection, type SessionMetadata, type SessionMetadataUpdate, type SessionSummary, type Skill, type SlashCommandList, type SubagentContext, SubagentRegistry, type SubagentRunRecord, type SubagentStatus, type SubagentToolsContext, type SystemPromptParams, type ToolLoopDetectionConfig, type TranscriptEntry, type UiToolInputSchema, type UiToolOptions, UiToolPauseSignal, addAgent, addBinding, aimaxDir, appendToMemory, appendTranscriptEntry, approvalSummaryFromResolution, bootstrapMountLayout, buildBootstrapContextFiles, buildResumeNarration, buildSkillsPrompt, buildSubagentAnnounceMessage, buildSystemPrompt, cleanupOldSubagentRecords, clearPendingHitl, clearPendingUiTool, collapseLogPath, contextSnapshotPath, createAgentTools, createApplyPatchTool, createBashTool, createBuiltinMemoryProvider, createContextManager, createEditFileTool, createExecTool, createImageTool, createListDirTool, createMemoryAppendTool, createMemoryGetTool, createMemorySearchTool, createPendingHitl, createPendingUiTool, createPluginProgressEmitter, createPluginRuntime, createProcessTool, createReadFileTool, createSession, createSessionContextStore, createSessionsSpawnTool, createSubagentsTool, createUiTool, createWriteFileTool, defaultUiToolInputSchema, deleteMemoryFile, discoverAIMaxPlugins, ensureBootstrapMountLayout, ensureSession, exportSession, formatApprovalResolution, formatClarifyResolution, formatReviewResolution, generateSessionTitle, getAgentConfig, getMemoryLines, hasBootstrapSentinel, hitlHistoryPath, initializePluginSystem, inspectBootstrapMountLayout, inspectSession, isBootstrapMountLayoutReady, isHitlPauseSignal, isUiToolPauseSignal, listAgents, listAvailableSlashCommands, listBindings, listMemoryFiles, listSessionSummaries, listSessions, listSubagentRunsFromDisk, loadAgentsConfig, loadBootstrapFiles, readPendingHitl as loadPendingHitl, readPendingHitl, readPendingUiTool as loadPendingUiTool, readPendingUiTool, loadPluginManifest, loadPluginManifestRegistry, loadPlugins, loadSessionContextSnapshot, loadSessionMetadata, loadSkills, loadSkillsFromDirs, loadSkillsWithPluginDirs, loadSubagentRegistryFromDisk, loadTranscript, memoryDir, metadataPath, normalizeAgentId, normalizePluginsConfig, normalizeSessionStoreName, pendingHitlPath, pendingUiToolPath, primaryMemoryPath, readHitlHistory, readMemoryFile, readPrimaryMemory, 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, searchMemory, sessionDir, sessionMemoryPath, sessionsDir, skillsDir, toolResultsDir, transcriptPath, transitionHitlStatus, updateAgentIdentity, updateSessionMetadata, validatePluginsConfig, validateResume, wrapToolsWithHooks };
package/dist/index.js CHANGED
@@ -1,14 +1,14 @@
1
- import{A as e,C as t,D as n,E as r,O as i,S as a,T as o,_ as s,a as c,b as l,c as u,d,f,g as p,h as m,i as h,k as g,l as _,m as v,n as y,o as b,p as x,r as S,s as C,u as w,v as T,w as E,x as D,y as O}from"./builtin-provider-CJJNj6nV.js";import{i as k,n as A,r as j}from"./provider-registry-CxtHsHdk.js";import{_ as M,a as N,c as P,d as ee,f as te,g as ne,h as re,i as ie,l as ae,m as oe,n as se,o as ce,p as le,s as ue,t as de,u as fe,v as pe}from"./config-DG3Q1aJ6.js";import F from"node:fs/promises";import I from"node:path";import me from"gray-matter";import{Type as L,calculateCost as he,getEnvApiKey as ge,parseStreamingJson as _e,registerApiProvider as ve,registerBuiltInApiProviders as ye,supportsXhigh as be}from"@mariozechner/pi-ai";import xe from"openai";import{AssistantMessageEventStream as Se}from"@mariozechner/pi-ai/dist/utils/event-stream.js";import{sanitizeSurrogates as R}from"@mariozechner/pi-ai/dist/utils/sanitize-unicode.js";import{buildCopilotDynamicHeaders as Ce,hasCopilotVisionInput as we}from"@mariozechner/pi-ai/dist/providers/github-copilot-headers.js";import{buildBaseOptions as Te,clampReasoning as Ee}from"@mariozechner/pi-ai/dist/providers/simple-options.js";import{transformMessages as De}from"@mariozechner/pi-ai/dist/providers/transform-messages.js";import{createHash as Oe,randomUUID as z}from"node:crypto";import{Agent as ke}from"@mariozechner/pi-agent-core";import Ae from"node:os";import{spawn as je}from"node:child_process";import{isBinaryFile as Me}from"isbinaryfile";import B from"node:fs";import{isHitlExpired as Ne,validateUiToolResult as Pe}from"@gencode/shared";import{AsyncLocalStorage as Fe}from"node:async_hooks";import Ie from"ajv";import{createJiti as Le}from"jiti";const Re=2e4,ze=15e4,Be=[`AGENTS.md`,`SOUL.md`,`TOOLS.md`,`IDENTITY.md`,`USER.md`,`HEARTBEAT.md`,`MEMORY.md`,`BOOTSTRAP.md`];function V(e){return I.join(e,`.aimax`)}async function Ve(e){let t=V(e),n=[];for(let e of Be){let r=I.join(t,e);try{let t=await F.readFile(r,`utf-8`);n.push({name:e,path:r,content:t,missing:!1}),e===`BOOTSTRAP.md`&&await F.unlink(r).catch(()=>{})}catch(t){if(t.code===`ENOENT`)n.push({name:e,path:r,content:null,missing:!0});else throw t}}return n}function He(e,t,n){let r=e.trimEnd();if(r.length<=n)return{result:r,truncated:!1,originalLength:r.length};let i=Math.floor(n*.7),a=Math.floor(n*.2),o=r.slice(0,i),s=r.slice(-a);return{result:[o,[``,`[...truncated, read ${t} for full content...]`,`…(truncated ${t}: kept ${i}+${a} chars of ${r.length})…`,``].join(`
1
+ import{A as e,C as t,D as n,E as r,O as i,S as a,T as o,_ as s,a as c,b as l,c as u,d,f,g as p,h as m,i as h,k as g,l as _,m as v,n as y,o as b,p as x,r as S,s as C,u as w,v as T,w as E,x as D,y as O}from"./builtin-provider-Cz8tAvvf.js";import{i as k,n as A,r as j}from"./provider-registry-CxtHsHdk.js";import{_ as M,a as N,c as P,d as F,f as ee,g as te,h as ne,i as re,l as ie,m as ae,n as oe,o as se,p as ce,s as le,t as ue,u as de,v as fe}from"./config-DG3Q1aJ6.js";import I from"node:fs/promises";import L from"node:path";import pe from"gray-matter";import{Type as R,calculateCost as me,getEnvApiKey as he,parseStreamingJson as ge,registerApiProvider as _e,registerBuiltInApiProviders as ve,supportsXhigh as ye}from"@mariozechner/pi-ai";import be from"openai";import{AssistantMessageEventStream as xe}from"@mariozechner/pi-ai/dist/utils/event-stream.js";import{sanitizeSurrogates as z}from"@mariozechner/pi-ai/dist/utils/sanitize-unicode.js";import{buildCopilotDynamicHeaders as Se,hasCopilotVisionInput as Ce}from"@mariozechner/pi-ai/dist/providers/github-copilot-headers.js";import{buildBaseOptions as we,clampReasoning as Te}from"@mariozechner/pi-ai/dist/providers/simple-options.js";import{transformMessages as Ee}from"@mariozechner/pi-ai/dist/providers/transform-messages.js";import{createHash as De,randomUUID as Oe}from"node:crypto";import{Agent as ke}from"@mariozechner/pi-agent-core";import Ae from"node:os";import{spawn as je}from"node:child_process";import{isBinaryFile as Me}from"isbinaryfile";import B from"node:fs";import{isHitlExpired as Ne,validateUiToolResult as Pe}from"@gencode/shared";import{AsyncLocalStorage as Fe}from"node:async_hooks";import Ie from"ajv";import{createJiti as Le}from"jiti";const Re=2e4,ze=15e4,Be=[`AGENTS.md`,`SOUL.md`,`TOOLS.md`,`IDENTITY.md`,`USER.md`,`HEARTBEAT.md`,`MEMORY.md`,`BOOTSTRAP.md`];function V(e){return L.join(e,`.aimax`)}async function Ve(e){let t=V(e),n=[];for(let e of Be){let r=L.join(t,e);try{let t=await I.readFile(r,`utf-8`);n.push({name:e,path:r,content:t,missing:!1}),e===`BOOTSTRAP.md`&&await I.unlink(r).catch(()=>{})}catch(t){if(t.code===`ENOENT`)n.push({name:e,path:r,content:null,missing:!0});else throw t}}return n}function He(e,t,n){let r=e.trimEnd();if(r.length<=n)return{result:r,truncated:!1,originalLength:r.length};let i=Math.floor(n*.7),a=Math.floor(n*.2),o=r.slice(0,i),s=r.slice(-a);return{result:[o,[``,`[...truncated, read ${t} for full content...]`,`…(truncated ${t}: kept ${i}+${a} chars of ${r.length})…`,``].join(`
2
2
  `),s].join(`
3
- `),truncated:!0,originalLength:r.length}}function Ue(e,t){return t<=0?``:e.length<=t?e:t<=1?e.slice(0,t):`${e.slice(0,t-1)}…`}function We(e,t){let n=t?.maxChars??Re,r=Math.max(1,t?.totalMaxChars??Math.max(n,ze)),i=[];for(let a of e){if(r<=0)break;if(a.missing){let e=Ue(`[MISSING] Expected at: ${a.path}`,r);if(!e)break;r=Math.max(0,r-e.length),i.push({path:a.path,content:e});continue}if(r<64){t?.warn?.(`remaining bootstrap budget is ${r} chars (<64); skipping additional files`);break}let e=Math.max(1,Math.min(n,r)),{result:o,truncated:s,originalLength:c}=He(a.content??``,a.name,e),l=Ue(o,r);l&&((s||l.length<o.length)&&t?.warn?.(`bootstrap file ${a.name} is ${c} chars (limit ${e}); truncating`),r=Math.max(0,r-l.length),i.push({path:a.path,content:l}))}return i}function Ge(e){return I.join(e,`.aimax`,`skills`)}function Ke(e){return e instanceof Error&&e.message.trim()?e.message:String(e)}function qe(e,t,n){process.stderr.write(`[skills] failed to load skill "${e}" from ${t}: ${Ke(n)}\n`)}function Je(e){let t=me(e),n=t.data.description;if(typeof n==`string`&&n.trim())return n.trim().slice(0,500);let r=t.content.split(`
4
- `);for(let e of r){let t=e.trim();if(!t)continue;let n=(t.match(/^#+\s+(.+)$/)?.[1]??t).trim();if(n)return n.slice(0,500)}return``}async function Ye(e){return Ze([Ge(e)])}async function Xe(e,t){return Ze([Ge(e),...t])}async function Ze(e){let t=[],n=new Set;for(let r of e){let e;try{e=await F.readdir(r,{withFileTypes:!0})}catch(e){if(e.code===`ENOENT`)continue;throw e}let i=e.filter(e=>e.isDirectory()).map(e=>e.name);for(let e of i.sort()){if(t.length>=50)break;if(n.has(e))continue;let i=I.join(r,e,`SKILL.md`),a;try{a=await F.readFile(i,`utf-8`)}catch(e){if(e.code===`ENOENT`)continue;throw e}let o;try{o=Je(a)}catch(t){qe(e,i,t);continue}t.push({name:e,description:o,location:i}),n.add(e)}}return t}function Qe(e){return e.length===0?``:`<available_skills>\n${e.map(e=>[` <skill>`,` <name>${e.name}</name>`,` <description>${e.description}</description>`,` <location>${e.location}</location>`,` </skill>`].join(`
3
+ `),truncated:!0,originalLength:r.length}}function Ue(e,t){return t<=0?``:e.length<=t?e:t<=1?e.slice(0,t):`${e.slice(0,t-1)}…`}function We(e,t){let n=t?.maxChars??Re,r=Math.max(1,t?.totalMaxChars??Math.max(n,ze)),i=[];for(let a of e){if(r<=0)break;if(a.missing){let e=Ue(`[MISSING] Expected at: ${a.path}`,r);if(!e)break;r=Math.max(0,r-e.length),i.push({path:a.path,content:e});continue}if(r<64){t?.warn?.(`remaining bootstrap budget is ${r} chars (<64); skipping additional files`);break}let e=Math.max(1,Math.min(n,r)),{result:o,truncated:s,originalLength:c}=He(a.content??``,a.name,e),l=Ue(o,r);l&&((s||l.length<o.length)&&t?.warn?.(`bootstrap file ${a.name} is ${c} chars (limit ${e}); truncating`),r=Math.max(0,r-l.length),i.push({path:a.path,content:l}))}return i}function Ge(e){return L.join(e,`.aimax`,`skills`)}function Ke(e){return e instanceof Error&&e.message.trim()?e.message:String(e)}function qe(e,t,n){process.stderr.write(`[skills] failed to load skill "${e}" from ${t}: ${Ke(n)}\n`)}function Je(e){let t=pe(e),n=t.data.description;if(typeof n==`string`&&n.trim())return n.trim().slice(0,500);let r=t.content.split(`
4
+ `);for(let e of r){let t=e.trim();if(!t)continue;let n=(t.match(/^#+\s+(.+)$/)?.[1]??t).trim();if(n)return n.slice(0,500)}return``}async function Ye(e){return Ze([Ge(e)])}async function Xe(e,t){return Ze([Ge(e),...t])}async function Ze(e){let t=[],n=new Set;for(let r of e){let e;try{e=await I.readdir(r,{withFileTypes:!0})}catch(e){if(e.code===`ENOENT`)continue;throw e}let i=e.filter(e=>e.isDirectory()).map(e=>e.name);for(let e of i.sort()){if(t.length>=50)break;if(n.has(e))continue;let i=L.join(r,e,`SKILL.md`),a;try{a=await I.readFile(i,`utf-8`)}catch(e){if(e.code===`ENOENT`)continue;throw e}let o;try{o=Je(a)}catch(t){qe(e,i,t);continue}t.push({name:e,description:o,location:i}),n.add(e)}}return t}function Qe(e){return e.length===0?``:`<available_skills>\n${e.map(e=>[` <skill>`,` <name>${e.name}</name>`,` <description>${e.description}</description>`,` <location>${e.location}</location>`,` </skill>`].join(`
5
5
  `)).join(`
6
- `)}\n</available_skills>`}const $e=3,et=5;var tt=class{entries=new Map;announced=new Set;register(e,t){this.entries.set(e.runId,{record:e,promise:t})}complete(e,t){let n=this.entries.get(e);!n||n.record.status!==`running`||(n.record.status=`done`,n.record.result=t,n.record.endedAt=Date.now())}fail(e,t){let n=this.entries.get(e);!n||n.record.status!==`running`||(n.record.status=`error`,n.record.error=t,n.record.endedAt=Date.now())}kill(e){let t=this.entries.get(e);return!t||t.record.status!==`running`?!1:(t.record.abortController.abort(),t.record.status=`killed`,t.record.endedAt=Date.now(),!0)}killAll(e){let t=0;for(let{record:n}of this.entries.values())n.parentSessionId===e&&n.status===`running`&&(n.abortController.abort(),n.status=`killed`,n.endedAt=Date.now(),t++);return t}list(e){return Array.from(this.entries.values()).filter(t=>t.record.parentSessionId===e).map(e=>e.record)}hasPending(e){return this.list(e).some(e=>e.status===`running`)}countActive(e){return this.list(e).filter(e=>e.status===`running`).length}async waitForAll(e){let t=Array.from(this.entries.values()).filter(t=>t.record.parentSessionId===e&&t.record.status===`running`).map(e=>e.promise);t.length>0&&await Promise.allSettled(t)}consumeCompleted(e){let t=this.list(e).filter(e=>e.status!==`running`&&!this.announced.has(e.runId));for(let e of t)this.announced.add(e.runId);return t}hasUnannounced(e){return this.list(e).some(e=>e.status!==`running`&&!this.announced.has(e.runId))}needsAnnounce(e){return this.hasPending(e)||this.hasUnannounced(e)}checkSpawnAllowed(e,t){return t>3?{allowed:!1,reason:`Maximum subagent depth (3) reached`}:this.countActive(e)>=5?{allowed:!1,reason:`Maximum concurrent subagents (5) reached for this session`}:{allowed:!0}}getStatus(e){return this.entries.get(e)?.record.status??null}};const nt=new Map;function rt(e){let t=nt.get(e);return t||(t={},nt.set(e,t)),t}function it(e){nt.delete(e)}function at(e,t){return I.isAbsolute(e)?I.normalize(e):I.normalize(I.join(t,e))}function ot(e){let t=e.replace(/\\/g,`/`);if(!t.endsWith(`/SKILL.md`))return;let n=t.lastIndexOf(`/.pingclaw/skills/`);if(n===-1)return;let r=t.slice(n+18,t.length-9);if(!(!r||r.includes(`/`)))return r}var st=class{skillLocations;reportedSkills=new Set;pendingReadFilePaths=[];constructor(e){this.params=e,this.skillLocations=new Map(e.skills.map(e=>[I.normalize(e.location),e.name]))}onToolExecutionStart(e){if(e.toolName!==`read_file`||!e.args||typeof e.args!=`object`)return;let t=e.args.path;typeof t==`string`&&this.pendingReadFilePaths.push(at(t,this.params.workspaceDir))}async onToolExecutionEnd(e){if(e.toolName!==`read_file`)return;let t=this.pendingReadFilePaths.pop(),n=t?this.skillLocations.get(t)??ot(t):void 0;!n||e.isError||this.reportedSkills.has(n)||(this.reportedSkills.add(n),await this.params.reportDiagnostic?.({level:`info`,phase:`skill_activated`,message:`skill activated`,details:{skillName:n,resolvedPath:t}}),await this.params.report({type:`skill_used`,skillName:n,agent:`aimax:main`,taskId:`aimax[${this.params.sessionId}]`}))}},H=class extends Error{code;statusCode;statusText;providerMessage;retryable;constructor(e){super(e.message,{cause:e.cause}),this.name=`LlmRequestError`,this.code=e.code,this.statusCode=e.statusCode,this.statusText=e.statusText,this.providerMessage=e.providerMessage,this.retryable=e.retryable}};function ct(e){return{async chat(t){let n=lt(t),r=t.model??e.defaultModel;if(!r)throw Error(`LLM model is required`);await ft(e.hooks,`llm_input`,{sessionId:e.hookCtx?.sessionId??`unknown`,model:r,prompt:ut(n),historyMessages:n},e.hookCtx);let i={model:r,messages:n,stream:!1};typeof t.temperature==`number`&&(i.temperature=t.temperature),typeof t.maxTokens==`number`&&(i.max_tokens=t.maxTokens);let{signal:a,clear:o,didTimeout:s}=pt(t.signal,t.timeoutMs);try{let t;try{let n=e.baseUrl.replace(/\/$/,``);t=await fetch(`${n}/chat/completions`,{method:`POST`,headers:{"content-type":`application/json`,authorization:`Bearer ${e.apiKey}`,"Client-Code":`AIMax`},body:JSON.stringify(i),signal:a})}catch(e){throw ht(e,s())}if(!t.ok){let e=await mt(t)||void 0,n=t.statusText?.trim()||void 0,r=[t.status,n].filter(Boolean).join(` `);throw new H({message:e?`LLM upstream returned HTTP ${r}: ${e}`:`LLM upstream returned HTTP ${r}`,code:`http_error`,statusCode:t.status,statusText:n,providerMessage:e,retryable:_t(t.status)})}let n;try{n=await t.json()}catch(e){throw new H({message:`LLM upstream returned an invalid JSON response`,code:`invalid_response`,retryable:!1,cause:e})}let o=n.choices?.[0]?.message?.content??n.choices?.[0]?.text??``,c=dt(n.usage);return await ft(e.hooks,`llm_output`,{sessionId:e.hookCtx?.sessionId??`unknown`,model:r,assistantTexts:o?[o]:[],usage:c},e.hookCtx),{text:o,usage:c,raw:n}}finally{o()}}}}function lt(e){if(Array.isArray(e.messages)&&e.messages.length>0)return e.messages;let t=[];if(e.system?.trim()&&t.push({role:`system`,content:e.system}),e.user?.trim()&&t.push({role:`user`,content:e.user}),t.length===0)throw Error(`LLM messages are required`);return t}function ut(e){return e.map(e=>`${e.role}: ${e.content}`).join(`
7
- `)}function dt(e){let t=e?.input??e?.prompt_tokens??0,n=e?.output??e?.completion_tokens??0;return{input:t,output:n,total:e?.total??e?.total_tokens??t+n}}async function ft(e,t,n,r){!e||!r||await e.dispatch(t,n,r)}function pt(e,t){if(!e&&(!t||t<=0))return{signal:void 0,clear:()=>{},didTimeout:()=>!1};let n=new AbortController,r,i=!1;return e&&(e.aborted?n.abort():e.addEventListener(`abort`,()=>n.abort(),{once:!0})),t&&t>0&&(r=setTimeout(()=>{i=!0,n.abort()},t)),{signal:n.signal,clear:()=>{r&&clearTimeout(r)},didTimeout:()=>i}}async function mt(e){try{let t=await e.text();return t?t.trim().slice(0,200):``}catch{return``}}function ht(e,t){return e instanceof H?e:gt(e)?t?new H({message:`LLM request timed out`,code:`timeout`,retryable:!0,cause:e}):e:new H({message:`LLM network request failed: ${e instanceof Error?e.message:String(e)}`,code:`network_error`,retryable:!0,cause:e})}function gt(e){return e instanceof Error&&e.name===`AbortError`}function _t(e){return e===408||e===409||e===425||e===429||e>=500}function vt(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.error&&typeof t.error==`object`?!0:t.object===`error`}function yt(e){if(!vt(e))return null;let t=e,n=bt(t.message),r=U(n?.code)??U(t.code),i=U(n?.type)??U(t.type),a=U(n?.message)??xt(t.error)??U(t.message)??`Unknown upstream error`;return{message:St(a,i,r),providerMessage:a,providerCode:r,providerType:i,retryable:Ct(r,i),raw:e}}function bt(e){if(typeof e!=`string`)return null;let t=e.trim();if(!t.startsWith(`{`)||!t.endsWith(`}`))return null;try{let e=JSON.parse(t);return e&&typeof e==`object`?e:null}catch{return null}}function xt(e){if(!(!e||typeof e!=`object`))return U(e.message)}function U(e){if(e==null)return;let t=String(e).trim();return t.length>0?t:void 0}function St(e,t,n){let r=[t,n].filter(Boolean).join(` `);return r?`${e} (${r})`:e}function Ct(e,t){let n=Number(e);if(Number.isFinite(n))return n===408||n===409||n===425||n===429||n>=500;let r=t?.toLowerCase();return r===`ratelimiterror`||r===`internalservererror`}const wt=(e,t,n)=>{let r=new Se;return(async()=>{let i={role:`assistant`,content:[],api:e.api,provider:e.provider,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`stop`,timestamp:Date.now(),errorMessage:void 0};try{let a=Et(e,t,n?.apiKey||ge(e.provider)||``,n?.headers),o=Dt(e,t,n);n?.onPayload?.(o);let s=await a.chat.completions.create(o,{signal:n?.signal});r.push({type:`start`,partial:i});let c=null,l=i.content,u=()=>l.length-1,d=e=>{if(e){if(e.type===`text`){r.push({type:`text_end`,contentIndex:u(),content:e.text,partial:i});return}if(e.type===`thinking`){r.push({type:`thinking_end`,contentIndex:u(),content:e.thinking,partial:i});return}e.type===`toolCall`&&(e.arguments=_e(e.partialArgs),delete e.partialArgs,r.push({type:`toolcall_end`,contentIndex:u(),toolCall:e,partial:i}))}};for await(let t of s){let n=yt(t);if(n)throw new H({message:`LLM upstream returned an error payload in a 200 stream: ${n.message}`,code:`stream_payload_error`,providerMessage:n.providerMessage,retryable:n.retryable,cause:n.raw});if(t.usage){let n=t.usage.prompt_tokens_details?.cached_tokens||0,r=t.usage.completion_tokens_details?.reasoning_tokens||0,a=(t.usage.prompt_tokens||0)-n,o=(t.usage.completion_tokens||0)+r;i.usage={input:a,output:o,cacheRead:n,cacheWrite:0,totalTokens:a+o+n,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},he(e,i.usage)}let a=t.choices?.[0];if(!a||(a.finish_reason&&(i.stopReason=Nt(a.finish_reason)),!a.delta))continue;a.delta.content!==null&&a.delta.content!==void 0&&a.delta.content.length>0&&((!c||c.type!==`text`)&&(d(c),c={type:`text`,text:``},i.content.push(c),r.push({type:`text_start`,contentIndex:u(),partial:i})),c.text+=a.delta.content,r.push({type:`text_delta`,contentIndex:u(),delta:a.delta.content,partial:i}));let o=[`reasoning_content`,`reasoning`,`reasoning_text`].find(e=>{let t=a.delta[e];return t!=null&&t.length>0});if(o){(!c||c.type!==`thinking`)&&(d(c),c={type:`thinking`,thinking:``,thinkingSignature:o},i.content.push(c),r.push({type:`thinking_start`,contentIndex:u(),partial:i}));let e=a.delta[o];c.thinking+=e,r.push({type:`thinking_delta`,contentIndex:u(),delta:e,partial:i})}if(a.delta.tool_calls)for(let e of a.delta.tool_calls){(!c||c.type!==`toolCall`||e.id&&c.id!==e.id)&&(d(c),c={type:`toolCall`,id:e.id||``,name:e.function?.name||``,arguments:{},partialArgs:``},i.content.push(c),r.push({type:`toolcall_start`,contentIndex:u(),partial:i})),e.id&&(c.id=e.id),e.function?.name&&(c.name=e.function.name);let t=``;e.function?.arguments&&(t=e.function.arguments,c.partialArgs+=e.function.arguments,c.arguments=_e(c.partialArgs)),r.push({type:`toolcall_delta`,contentIndex:u(),delta:t,partial:i})}let s=a.delta.reasoning_details;if(s&&Array.isArray(s)){for(let e of s)if(e.type===`reasoning.encrypted`&&e.id&&e.data){let t=i.content.find(t=>t.type===`toolCall`&&t.id===e.id);t&&(t.thoughtSignature=JSON.stringify(e))}}}if(d(c),n?.signal?.aborted)throw Error(`Request was aborted`);if(i.stopReason===`aborted`||i.stopReason===`error`)throw Error(i.errorMessage??(i.stopReason===`aborted`?`Request was aborted`:`LLM stream ended with stopReason=${i.stopReason}`));r.push({type:`done`,reason:i.stopReason,message:i}),r.end()}catch(e){for(let e of i.content)delete e.index;i.stopReason=n?.signal?.aborted?`aborted`:`error`,i.errorMessage=e instanceof Error?e.message:JSON.stringify(e);let t=e?.error?.metadata?.raw;t&&(i.errorMessage+=`\n${t}`),r.push({type:`error`,reason:i.stopReason,error:i}),r.end()}})(),r},Tt=(e,t,n)=>{let r=n?.apiKey||ge(e.provider);if(!r)throw Error(`No API key for provider: ${e.provider}`);let i=Te(e,n,r),a=be(e)?n?.reasoning:Ee(n?.reasoning);return wt(e,t,{...i,reasoningEffort:a,toolChoice:void 0})};function Et(e,t,n,r){if(!n){if(!process.env.OPENAI_API_KEY)throw Error(`OpenAI API key is required. Set OPENAI_API_KEY environment variable or pass it as an argument.`);n=process.env.OPENAI_API_KEY}let i={...e.headers};if(e.provider===`github-copilot`){let e=we(t.messages);Object.assign(i,Ce({messages:t.messages,hasImages:e}))}return r&&Object.assign(i,r),new xe({apiKey:n,baseURL:e.baseUrl,dangerouslyAllowBrowser:!0,defaultHeaders:i})}function Dt(e,t,n){let r=Ft(e),i=jt(e,t,r);At(e,i);let a={model:e.id,messages:i,stream:!0};if(r.supportsUsageInStreaming!==!1&&(a.stream_options={include_usage:!0}),r.supportsStore&&(a.store=!1),n?.maxTokens&&(r.maxTokensField===`max_tokens`?a.max_tokens=n.maxTokens:a.max_completion_tokens=n.maxTokens),n?.temperature!==void 0&&(a.temperature=n.temperature),t.tools?a.tools=Mt(t.tools,r):Ot(t.messages)&&(a.tools=[]),n?.toolChoice&&(a.tool_choice=n.toolChoice),(r.thinkingFormat===`zai`||r.thinkingFormat===`qwen`)&&e.reasoning?a.enable_thinking=!!n?.reasoningEffort:n?.reasoningEffort&&e.reasoning&&r.supportsReasoningEffort&&(a.reasoning_effort=n.reasoningEffort),e.baseUrl.includes(`openrouter.ai`)&&e.compat?.openRouterRouting&&(a.provider=e.compat.openRouterRouting),e.baseUrl.includes(`ai-gateway.vercel.sh`)&&e.compat?.vercelGatewayRouting){let t=e.compat.vercelGatewayRouting;if(t.only||t.order){let e={};t.only&&(e.only=t.only),t.order&&(e.order=t.order),a.providerOptions={gateway:e}}}return a}function Ot(e){for(let t of e)if(t.role===`toolResult`||t.role===`assistant`&&t.content.some(e=>e.type===`toolCall`))return!0;return!1}function kt(e){let t=e.replace(/[^a-zA-Z0-9]/g,``);return t.length<9?t+=`ABCDEFGHI`.slice(0,9-t.length):t.length>9&&(t=t.slice(0,9)),t}function At(e,t){if(!(e.provider!==`openrouter`||!e.id.startsWith(`anthropic/`)))for(let e=t.length-1;e>=0;--e){let n=t[e];if(n.role!==`user`&&n.role!==`assistant`)continue;let r=n.content;if(typeof r==`string`){n.content=[{type:`text`,text:r,cache_control:{type:`ephemeral`}}];return}if(Array.isArray(r))for(let e=r.length-1;e>=0;--e){let t=r[e];if(t?.type===`text`){Object.assign(t,{cache_control:{type:`ephemeral`}});return}}}}function jt(e,t,n){let r=[],i=t=>{if(n.requiresMistralToolIds)return kt(t);if(t.includes(`|`)){let[e]=t.split(`|`);return e.replace(/[^a-zA-Z0-9_-]/g,`_`).slice(0,40)}return e.provider===`openai`&&t.length>40?t.slice(0,40):t},a=De(t.messages,e,e=>i(e));if(t.systemPrompt){let i=e.reasoning&&n.supportsDeveloperRole?`developer`:`system`;r.push({role:i,content:R(t.systemPrompt)})}let o=null;for(let t=0;t<a.length;t+=1){let i=a[t];if(n.requiresAssistantAfterToolResult&&o===`toolResult`&&i.role===`user`&&r.push({role:`assistant`,content:`I have processed the tool results.`}),i.role===`user`){if(typeof i.content==`string`)r.push({role:`user`,content:R(i.content)});else{let t=i.content.map(e=>e.type===`text`?{type:`text`,text:R(e.text)}:{type:`image_url`,image_url:{url:`data:${e.mimeType};base64,${e.data}`}}),n=e.input.includes(`image`)?t:t.filter(e=>e.type!==`image_url`);if(n.length===0)continue;r.push({role:`user`,content:n})}o=i.role;continue}if(i.role===`assistant`){let t={role:`assistant`,content:n.requiresAssistantAfterToolResult?``:null},a=i.content.filter(e=>e.type===`text`&&e.text?.trim().length>0);a.length>0&&(t.content=e.provider===`github-copilot`?a.map(e=>R(e.text)).join(``):a.map(e=>({type:`text`,text:R(e.text)})));let s=i.content.filter(e=>e.type===`thinking`&&e.thinking?.trim().length>0);if(s.length>0)if(n.requiresThinkingAsText){let e=s.map(e=>e.thinking).join(`
6
+ `)}\n</available_skills>`}const $e=3,et=5;var tt=class{entries=new Map;announced=new Set;register(e,t){this.entries.set(e.runId,{record:e,promise:t})}complete(e,t){let n=this.entries.get(e);!n||n.record.status!==`running`||(n.record.status=`done`,n.record.result=t,n.record.endedAt=Date.now())}fail(e,t){let n=this.entries.get(e);!n||n.record.status!==`running`||(n.record.status=`error`,n.record.error=t,n.record.endedAt=Date.now())}kill(e){let t=this.entries.get(e);return!t||t.record.status!==`running`?!1:(t.record.abortController.abort(),t.record.status=`killed`,t.record.endedAt=Date.now(),!0)}killAll(e){let t=0;for(let{record:n}of this.entries.values())n.parentSessionId===e&&n.status===`running`&&(n.abortController.abort(),n.status=`killed`,n.endedAt=Date.now(),t++);return t}list(e){return Array.from(this.entries.values()).filter(t=>t.record.parentSessionId===e).map(e=>e.record)}hasPending(e){return this.list(e).some(e=>e.status===`running`)}countActive(e){return this.list(e).filter(e=>e.status===`running`).length}async waitForAll(e){let t=Array.from(this.entries.values()).filter(t=>t.record.parentSessionId===e&&t.record.status===`running`).map(e=>e.promise);t.length>0&&await Promise.allSettled(t)}consumeCompleted(e){let t=this.list(e).filter(e=>e.status!==`running`&&!this.announced.has(e.runId));for(let e of t)this.announced.add(e.runId);return t}hasUnannounced(e){return this.list(e).some(e=>e.status!==`running`&&!this.announced.has(e.runId))}needsAnnounce(e){return this.hasPending(e)||this.hasUnannounced(e)}checkSpawnAllowed(e,t){return t>3?{allowed:!1,reason:`Maximum subagent depth (3) reached`}:this.countActive(e)>=5?{allowed:!1,reason:`Maximum concurrent subagents (5) reached for this session`}:{allowed:!0}}getStatus(e){return this.entries.get(e)?.record.status??null}};const nt=new Map;function rt(e){let t=nt.get(e);return t||(t={},nt.set(e,t)),t}function it(e){nt.delete(e)}function at(e,t){return L.isAbsolute(e)?L.normalize(e):L.normalize(L.join(t,e))}function ot(e){let t=e.replace(/\\/g,`/`);if(!t.endsWith(`/SKILL.md`))return;let n=t.lastIndexOf(`/.pingclaw/skills/`);if(n===-1)return;let r=t.slice(n+18,t.length-9);if(!(!r||r.includes(`/`)))return r}var st=class{skillLocations;reportedSkills=new Set;pendingReadFilePaths=[];constructor(e){this.params=e,this.skillLocations=new Map(e.skills.map(e=>[L.normalize(e.location),e.name]))}onToolExecutionStart(e){if(e.toolName!==`read_file`||!e.args||typeof e.args!=`object`)return;let t=e.args.path;typeof t==`string`&&this.pendingReadFilePaths.push(at(t,this.params.workspaceDir))}async onToolExecutionEnd(e){if(e.toolName!==`read_file`)return;let t=this.pendingReadFilePaths.pop(),n=t?this.skillLocations.get(t)??ot(t):void 0;!n||e.isError||this.reportedSkills.has(n)||(this.reportedSkills.add(n),await this.params.reportDiagnostic?.({level:`info`,phase:`skill_activated`,message:`skill activated`,details:{skillName:n,resolvedPath:t}}),await this.params.report({type:`skill_used`,skillName:n,agent:`aimax:main`,taskId:`aimax[${this.params.sessionId}]`}))}},H=class extends Error{code;statusCode;statusText;providerMessage;retryable;constructor(e){super(e.message,{cause:e.cause}),this.name=`LlmRequestError`,this.code=e.code,this.statusCode=e.statusCode,this.statusText=e.statusText,this.providerMessage=e.providerMessage,this.retryable=e.retryable}};function ct(e){return{async chat(t){let n=lt(t),r=t.model??e.defaultModel;if(!r)throw Error(`LLM model is required`);await ft(e.hooks,`llm_input`,{sessionId:e.hookCtx?.sessionId??`unknown`,model:r,prompt:ut(n),historyMessages:n},e.hookCtx);let i={model:r,messages:n,stream:!1};typeof t.temperature==`number`&&(i.temperature=t.temperature),typeof t.maxTokens==`number`&&(i.max_tokens=t.maxTokens);let{signal:a,clear:o,didTimeout:s}=pt(t.signal,t.timeoutMs);try{let t;try{let n=e.baseUrl.replace(/\/$/,``);t=await fetch(`${n}/chat/completions`,{method:`POST`,headers:{"content-type":`application/json`,authorization:`Bearer ${e.apiKey}`,"Client-Code":`AIMax`},body:JSON.stringify(i),signal:a})}catch(e){throw ht(e,s())}if(!t.ok){let e=await mt(t)||void 0,n=t.statusText?.trim()||void 0,r=[t.status,n].filter(Boolean).join(` `);throw new H({message:e?`LLM upstream returned HTTP ${r}: ${e}`:`LLM upstream returned HTTP ${r}`,code:`http_error`,statusCode:t.status,statusText:n,providerMessage:e,retryable:_t(t.status)})}let n;try{n=await t.json()}catch(e){throw new H({message:`LLM upstream returned an invalid JSON response`,code:`invalid_response`,retryable:!1,cause:e})}let o=n.choices?.[0]?.message?.content??n.choices?.[0]?.text??``,c=dt(n.usage);return await ft(e.hooks,`llm_output`,{sessionId:e.hookCtx?.sessionId??`unknown`,model:r,assistantTexts:o?[o]:[],usage:c},e.hookCtx),{text:o,usage:c,raw:n}}finally{o()}}}}function lt(e){if(Array.isArray(e.messages)&&e.messages.length>0)return e.messages;let t=[];if(e.system?.trim()&&t.push({role:`system`,content:e.system}),e.user?.trim()&&t.push({role:`user`,content:e.user}),t.length===0)throw Error(`LLM messages are required`);return t}function ut(e){return e.map(e=>`${e.role}: ${e.content}`).join(`
7
+ `)}function dt(e){let t=e?.input??e?.prompt_tokens??0,n=e?.output??e?.completion_tokens??0;return{input:t,output:n,total:e?.total??e?.total_tokens??t+n}}async function ft(e,t,n,r){!e||!r||await e.dispatch(t,n,r)}function pt(e,t){if(!e&&(!t||t<=0))return{signal:void 0,clear:()=>{},didTimeout:()=>!1};let n=new AbortController,r,i=!1;return e&&(e.aborted?n.abort():e.addEventListener(`abort`,()=>n.abort(),{once:!0})),t&&t>0&&(r=setTimeout(()=>{i=!0,n.abort()},t)),{signal:n.signal,clear:()=>{r&&clearTimeout(r)},didTimeout:()=>i}}async function mt(e){try{let t=await e.text();return t?t.trim().slice(0,200):``}catch{return``}}function ht(e,t){return e instanceof H?e:gt(e)?t?new H({message:`LLM request timed out`,code:`timeout`,retryable:!0,cause:e}):e:new H({message:`LLM network request failed: ${e instanceof Error?e.message:String(e)}`,code:`network_error`,retryable:!0,cause:e})}function gt(e){return e instanceof Error&&e.name===`AbortError`}function _t(e){return e===408||e===409||e===425||e===429||e>=500}function vt(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.error&&typeof t.error==`object`?!0:t.object===`error`}function yt(e){if(!vt(e))return null;let t=e,n=bt(t.message),r=U(n?.code)??U(t.code),i=U(n?.type)??U(t.type),a=U(n?.message)??xt(t.error)??U(t.message)??`Unknown upstream error`;return{message:St(a,i,r),providerMessage:a,providerCode:r,providerType:i,retryable:Ct(r,i),raw:e}}function bt(e){if(typeof e!=`string`)return null;let t=e.trim();if(!t.startsWith(`{`)||!t.endsWith(`}`))return null;try{let e=JSON.parse(t);return e&&typeof e==`object`?e:null}catch{return null}}function xt(e){if(!(!e||typeof e!=`object`))return U(e.message)}function U(e){if(e==null)return;let t=String(e).trim();return t.length>0?t:void 0}function St(e,t,n){let r=[t,n].filter(Boolean).join(` `);return r?`${e} (${r})`:e}function Ct(e,t){let n=Number(e);if(Number.isFinite(n))return n===408||n===409||n===425||n===429||n>=500;let r=t?.toLowerCase();return r===`ratelimiterror`||r===`internalservererror`}const wt=(e,t,n)=>{let r=new xe;return(async()=>{let i={role:`assistant`,content:[],api:e.api,provider:e.provider,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`stop`,timestamp:Date.now(),errorMessage:void 0};try{let a=Et(e,t,n?.apiKey||he(e.provider)||``,n?.headers),o=Dt(e,t,n);n?.onPayload?.(o);let s=await a.chat.completions.create(o,{signal:n?.signal});r.push({type:`start`,partial:i});let c=null,l=i.content,u=()=>l.length-1,d=e=>{if(e){if(e.type===`text`){r.push({type:`text_end`,contentIndex:u(),content:e.text,partial:i});return}if(e.type===`thinking`){r.push({type:`thinking_end`,contentIndex:u(),content:e.thinking,partial:i});return}e.type===`toolCall`&&(e.arguments=ge(e.partialArgs),delete e.partialArgs,r.push({type:`toolcall_end`,contentIndex:u(),toolCall:e,partial:i}))}};for await(let t of s){let n=yt(t);if(n)throw new H({message:`LLM upstream returned an error payload in a 200 stream: ${n.message}`,code:`stream_payload_error`,providerMessage:n.providerMessage,retryable:n.retryable,cause:n.raw});if(t.usage){let n=t.usage.prompt_tokens_details?.cached_tokens||0,r=t.usage.completion_tokens_details?.reasoning_tokens||0,a=(t.usage.prompt_tokens||0)-n,o=(t.usage.completion_tokens||0)+r;i.usage={input:a,output:o,cacheRead:n,cacheWrite:0,totalTokens:a+o+n,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},me(e,i.usage)}let a=t.choices?.[0];if(!a||(a.finish_reason&&(i.stopReason=Nt(a.finish_reason)),!a.delta))continue;a.delta.content!==null&&a.delta.content!==void 0&&a.delta.content.length>0&&((!c||c.type!==`text`)&&(d(c),c={type:`text`,text:``},i.content.push(c),r.push({type:`text_start`,contentIndex:u(),partial:i})),c.text+=a.delta.content,r.push({type:`text_delta`,contentIndex:u(),delta:a.delta.content,partial:i}));let o=[`reasoning_content`,`reasoning`,`reasoning_text`].find(e=>{let t=a.delta[e];return t!=null&&t.length>0});if(o){(!c||c.type!==`thinking`)&&(d(c),c={type:`thinking`,thinking:``,thinkingSignature:o},i.content.push(c),r.push({type:`thinking_start`,contentIndex:u(),partial:i}));let e=a.delta[o];c.thinking+=e,r.push({type:`thinking_delta`,contentIndex:u(),delta:e,partial:i})}if(a.delta.tool_calls)for(let e of a.delta.tool_calls){(!c||c.type!==`toolCall`||e.id&&c.id!==e.id)&&(d(c),c={type:`toolCall`,id:e.id||``,name:e.function?.name||``,arguments:{},partialArgs:``},i.content.push(c),r.push({type:`toolcall_start`,contentIndex:u(),partial:i})),e.id&&(c.id=e.id),e.function?.name&&(c.name=e.function.name);let t=``;e.function?.arguments&&(t=e.function.arguments,c.partialArgs+=e.function.arguments,c.arguments=ge(c.partialArgs)),r.push({type:`toolcall_delta`,contentIndex:u(),delta:t,partial:i})}let s=a.delta.reasoning_details;if(s&&Array.isArray(s)){for(let e of s)if(e.type===`reasoning.encrypted`&&e.id&&e.data){let t=i.content.find(t=>t.type===`toolCall`&&t.id===e.id);t&&(t.thoughtSignature=JSON.stringify(e))}}}if(d(c),n?.signal?.aborted)throw Error(`Request was aborted`);if(i.stopReason===`aborted`||i.stopReason===`error`)throw Error(i.errorMessage??(i.stopReason===`aborted`?`Request was aborted`:`LLM stream ended with stopReason=${i.stopReason}`));r.push({type:`done`,reason:i.stopReason,message:i}),r.end()}catch(e){for(let e of i.content)delete e.index;i.stopReason=n?.signal?.aborted?`aborted`:`error`,i.errorMessage=e instanceof Error?e.message:JSON.stringify(e);let t=e?.error?.metadata?.raw;t&&(i.errorMessage+=`\n${t}`),r.push({type:`error`,reason:i.stopReason,error:i}),r.end()}})(),r},Tt=(e,t,n)=>{let r=n?.apiKey||he(e.provider);if(!r)throw Error(`No API key for provider: ${e.provider}`);let i=we(e,n,r),a=ye(e)?n?.reasoning:Te(n?.reasoning);return wt(e,t,{...i,reasoningEffort:a,toolChoice:void 0})};function Et(e,t,n,r){if(!n){if(!process.env.OPENAI_API_KEY)throw Error(`OpenAI API key is required. Set OPENAI_API_KEY environment variable or pass it as an argument.`);n=process.env.OPENAI_API_KEY}let i={...e.headers};if(e.provider===`github-copilot`){let e=Ce(t.messages);Object.assign(i,Se({messages:t.messages,hasImages:e}))}return r&&Object.assign(i,r),new be({apiKey:n,baseURL:e.baseUrl,dangerouslyAllowBrowser:!0,defaultHeaders:i})}function Dt(e,t,n){let r=Ft(e),i=jt(e,t,r);At(e,i);let a={model:e.id,messages:i,stream:!0};if(r.supportsUsageInStreaming!==!1&&(a.stream_options={include_usage:!0}),r.supportsStore&&(a.store=!1),n?.maxTokens&&(r.maxTokensField===`max_tokens`?a.max_tokens=n.maxTokens:a.max_completion_tokens=n.maxTokens),n?.temperature!==void 0&&(a.temperature=n.temperature),t.tools?a.tools=Mt(t.tools,r):Ot(t.messages)&&(a.tools=[]),n?.toolChoice&&(a.tool_choice=n.toolChoice),(r.thinkingFormat===`zai`||r.thinkingFormat===`qwen`)&&e.reasoning?a.enable_thinking=!!n?.reasoningEffort:n?.reasoningEffort&&e.reasoning&&r.supportsReasoningEffort&&(a.reasoning_effort=n.reasoningEffort),e.baseUrl.includes(`openrouter.ai`)&&e.compat?.openRouterRouting&&(a.provider=e.compat.openRouterRouting),e.baseUrl.includes(`ai-gateway.vercel.sh`)&&e.compat?.vercelGatewayRouting){let t=e.compat.vercelGatewayRouting;if(t.only||t.order){let e={};t.only&&(e.only=t.only),t.order&&(e.order=t.order),a.providerOptions={gateway:e}}}return a}function Ot(e){for(let t of e)if(t.role===`toolResult`||t.role===`assistant`&&t.content.some(e=>e.type===`toolCall`))return!0;return!1}function kt(e){let t=e.replace(/[^a-zA-Z0-9]/g,``);return t.length<9?t+=`ABCDEFGHI`.slice(0,9-t.length):t.length>9&&(t=t.slice(0,9)),t}function At(e,t){if(!(e.provider!==`openrouter`||!e.id.startsWith(`anthropic/`)))for(let e=t.length-1;e>=0;--e){let n=t[e];if(n.role!==`user`&&n.role!==`assistant`)continue;let r=n.content;if(typeof r==`string`){n.content=[{type:`text`,text:r,cache_control:{type:`ephemeral`}}];return}if(Array.isArray(r))for(let e=r.length-1;e>=0;--e){let t=r[e];if(t?.type===`text`){Object.assign(t,{cache_control:{type:`ephemeral`}});return}}}}function jt(e,t,n){let r=[],i=t=>{if(n.requiresMistralToolIds)return kt(t);if(t.includes(`|`)){let[e]=t.split(`|`);return e.replace(/[^a-zA-Z0-9_-]/g,`_`).slice(0,40)}return e.provider===`openai`&&t.length>40?t.slice(0,40):t},a=Ee(t.messages,e,e=>i(e));if(t.systemPrompt){let i=e.reasoning&&n.supportsDeveloperRole?`developer`:`system`;r.push({role:i,content:z(t.systemPrompt)})}let o=null;for(let t=0;t<a.length;t+=1){let i=a[t];if(n.requiresAssistantAfterToolResult&&o===`toolResult`&&i.role===`user`&&r.push({role:`assistant`,content:`I have processed the tool results.`}),i.role===`user`){if(typeof i.content==`string`)r.push({role:`user`,content:z(i.content)});else{let t=i.content.map(e=>e.type===`text`?{type:`text`,text:z(e.text)}:{type:`image_url`,image_url:{url:`data:${e.mimeType};base64,${e.data}`}}),n=e.input.includes(`image`)?t:t.filter(e=>e.type!==`image_url`);if(n.length===0)continue;r.push({role:`user`,content:n})}o=i.role;continue}if(i.role===`assistant`){let t={role:`assistant`,content:n.requiresAssistantAfterToolResult?``:null},a=i.content.filter(e=>e.type===`text`&&e.text?.trim().length>0);a.length>0&&(t.content=e.provider===`github-copilot`?a.map(e=>z(e.text)).join(``):a.map(e=>({type:`text`,text:z(e.text)})));let s=i.content.filter(e=>e.type===`thinking`&&e.thinking?.trim().length>0);if(s.length>0)if(n.requiresThinkingAsText){let e=s.map(e=>e.thinking).join(`
8
8
 
9
9
  `);t.content?t.content.unshift({type:`text`,text:e}):t.content=[{type:`text`,text:e}]}else{let e=s[0].thinkingSignature;e&&e.length>0&&(t[e]=s.map(e=>e.thinking).join(`
10
10
  `))}let c=i.content.filter(e=>e.type===`toolCall`);if(c.length>0){t.tool_calls=c.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.arguments)}}));let e=c.filter(e=>e.thoughtSignature).map(e=>{try{return JSON.parse(e.thoughtSignature)}catch{return null}}).filter(Boolean);e.length>0&&(t.reasoning_details=e)}let l=t.content;if(!(l!=null&&l.length>0)&&!t.tool_calls)continue;r.push(t),o=i.role;continue}if(i.role===`toolResult`){let i=[],s=t;for(;s<a.length&&a[s].role===`toolResult`;s+=1){let t=a[s],o=t.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
11
- `),c=t.content.some(e=>e.type===`image`),l={role:`tool`,content:R(o.length>0?o:`(see attached image)`),tool_call_id:t.toolCallId};if(n.requiresToolResultName&&t.toolName&&(l.name=t.toolName),r.push(l),c&&e.input.includes(`image`))for(let e of t.content)e.type===`image`&&i.push({type:`image_url`,image_url:{url:`data:${e.mimeType};base64,${e.data}`}})}t=s-1,i.length>0?(n.requiresAssistantAfterToolResult&&r.push({role:`assistant`,content:`I have processed the tool results.`}),r.push({role:`user`,content:[{type:`text`,text:`Attached image(s) from tool result:`},...i]}),o=`user`):o=`toolResult`}}return r}function Mt(e,t){return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.parameters,...t.supportsStrictMode!==!1&&{strict:!1}}}))}function Nt(e){if(e===null)return`stop`;switch(e){case`stop`:return`stop`;case`length`:return`length`;case`function_call`:case`tool_calls`:return`toolUse`;case`error`:case`content_filter`:return`error`;default:throw Error(`Unhandled stop reason: ${e}`)}}function Pt(e){let t=e.provider,n=e.baseUrl,r=t===`zai`||n.includes(`api.z.ai`),i=t===`cerebras`||n.includes(`cerebras.ai`)||t===`xai`||n.includes(`api.x.ai`)||t===`mistral`||n.includes(`mistral.ai`)||n.includes(`chutes.ai`)||n.includes(`deepseek.com`)||r||t===`opencode`||n.includes(`opencode.ai`),a=t===`mistral`||n.includes(`mistral.ai`)||n.includes(`chutes.ai`),o=t===`xai`||n.includes(`api.x.ai`),s=t===`mistral`||n.includes(`mistral.ai`);return{supportsStore:!i,supportsDeveloperRole:!i,supportsReasoningEffort:!o&&!r,supportsUsageInStreaming:!0,maxTokensField:a?`max_tokens`:`max_completion_tokens`,requiresToolResultName:s,requiresAssistantAfterToolResult:!1,requiresThinkingAsText:s,requiresMistralToolIds:s,thinkingFormat:r?`zai`:`openai`,openRouterRouting:{},vercelGatewayRouting:{},supportsStrictMode:!0}}function Ft(e){let t=Pt(e);return e.compat?{supportsStore:e.compat.supportsStore??t.supportsStore,supportsDeveloperRole:e.compat.supportsDeveloperRole??t.supportsDeveloperRole,supportsReasoningEffort:e.compat.supportsReasoningEffort??t.supportsReasoningEffort,supportsUsageInStreaming:e.compat.supportsUsageInStreaming??t.supportsUsageInStreaming,maxTokensField:e.compat.maxTokensField??t.maxTokensField,requiresToolResultName:e.compat.requiresToolResultName??t.requiresToolResultName,requiresAssistantAfterToolResult:e.compat.requiresAssistantAfterToolResult??t.requiresAssistantAfterToolResult,requiresThinkingAsText:e.compat.requiresThinkingAsText??t.requiresThinkingAsText,requiresMistralToolIds:e.compat.requiresMistralToolIds??t.requiresMistralToolIds,thinkingFormat:e.compat.thinkingFormat??t.thinkingFormat,openRouterRouting:e.compat.openRouterRouting??{},vercelGatewayRouting:e.compat.vercelGatewayRouting??t.vercelGatewayRouting,supportsStrictMode:e.compat.supportsStrictMode??t.supportsStrictMode}:t}let It=!1;function Lt(){It||=(ye(),ve({api:`openai-completions`,stream:wt,streamSimple:Tt}),!0)}var Rt=class{constructor(e){this.params=e}async dispatchProgress(e,t){let n={...t,sessionId:e,...this.params.messageId?{messageId:this.params.messageId}:{},...this.params.subagentContext?{parentSessionId:this.params.subagentContext.parentSessionId,depth:this.params.subagentContext.depth}:{}};await this.params.onProgress?.(n)}async dispatchDiagnostic(e,t){await this.dispatchProgress(e,{type:`diagnostic`,...t})}};const zt=[`You are a session title generator. Generate a concise title (max 80 chars) for the given user message.`,``,`Rules:`,`- The title should capture the main topic or intent of the message`,`- Keep it short and descriptive`,`- Use the user's language (Chinese for Chinese messages, English for English messages)`,`- Output only the title text — no preamble, no quotes, no extra formatting`,`- As the user role, summarize the title based on the conversation content`,`- The principle of title generation is to describe the behavioral characteristics of the user in the conversation, rather than answering based on the content of the conversation`].join(`
11
+ `),c=t.content.some(e=>e.type===`image`),l={role:`tool`,content:z(o.length>0?o:`(see attached image)`),tool_call_id:t.toolCallId};if(n.requiresToolResultName&&t.toolName&&(l.name=t.toolName),r.push(l),c&&e.input.includes(`image`))for(let e of t.content)e.type===`image`&&i.push({type:`image_url`,image_url:{url:`data:${e.mimeType};base64,${e.data}`}})}t=s-1,i.length>0?(n.requiresAssistantAfterToolResult&&r.push({role:`assistant`,content:`I have processed the tool results.`}),r.push({role:`user`,content:[{type:`text`,text:`Attached image(s) from tool result:`},...i]}),o=`user`):o=`toolResult`}}return r}function Mt(e,t){return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.parameters,...t.supportsStrictMode!==!1&&{strict:!1}}}))}function Nt(e){if(e===null)return`stop`;switch(e){case`stop`:return`stop`;case`length`:return`length`;case`function_call`:case`tool_calls`:return`toolUse`;case`error`:case`content_filter`:return`error`;default:throw Error(`Unhandled stop reason: ${e}`)}}function Pt(e){let t=e.provider,n=e.baseUrl,r=t===`zai`||n.includes(`api.z.ai`),i=t===`cerebras`||n.includes(`cerebras.ai`)||t===`xai`||n.includes(`api.x.ai`)||t===`mistral`||n.includes(`mistral.ai`)||n.includes(`chutes.ai`)||n.includes(`deepseek.com`)||r||t===`opencode`||n.includes(`opencode.ai`),a=t===`mistral`||n.includes(`mistral.ai`)||n.includes(`chutes.ai`),o=t===`xai`||n.includes(`api.x.ai`),s=t===`mistral`||n.includes(`mistral.ai`);return{supportsStore:!i,supportsDeveloperRole:!i,supportsReasoningEffort:!o&&!r,supportsUsageInStreaming:!0,maxTokensField:a?`max_tokens`:`max_completion_tokens`,requiresToolResultName:s,requiresAssistantAfterToolResult:!1,requiresThinkingAsText:s,requiresMistralToolIds:s,thinkingFormat:r?`zai`:`openai`,openRouterRouting:{},vercelGatewayRouting:{},supportsStrictMode:!0}}function Ft(e){let t=Pt(e);return e.compat?{supportsStore:e.compat.supportsStore??t.supportsStore,supportsDeveloperRole:e.compat.supportsDeveloperRole??t.supportsDeveloperRole,supportsReasoningEffort:e.compat.supportsReasoningEffort??t.supportsReasoningEffort,supportsUsageInStreaming:e.compat.supportsUsageInStreaming??t.supportsUsageInStreaming,maxTokensField:e.compat.maxTokensField??t.maxTokensField,requiresToolResultName:e.compat.requiresToolResultName??t.requiresToolResultName,requiresAssistantAfterToolResult:e.compat.requiresAssistantAfterToolResult??t.requiresAssistantAfterToolResult,requiresThinkingAsText:e.compat.requiresThinkingAsText??t.requiresThinkingAsText,requiresMistralToolIds:e.compat.requiresMistralToolIds??t.requiresMistralToolIds,thinkingFormat:e.compat.thinkingFormat??t.thinkingFormat,openRouterRouting:e.compat.openRouterRouting??{},vercelGatewayRouting:e.compat.vercelGatewayRouting??t.vercelGatewayRouting,supportsStrictMode:e.compat.supportsStrictMode??t.supportsStrictMode}:t}let It=!1;function Lt(){It||=(ve(),_e({api:`openai-completions`,stream:wt,streamSimple:Tt}),!0)}var Rt=class{constructor(e){this.params=e}async dispatchProgress(e,t){let n={...t,sessionId:e,...this.params.messageId?{messageId:this.params.messageId}:{},...this.params.subagentContext?{parentSessionId:this.params.subagentContext.parentSessionId,depth:this.params.subagentContext.depth}:{}};await this.params.onProgress?.(n)}async dispatchDiagnostic(e,t){await this.dispatchProgress(e,{type:`diagnostic`,...t})}};const zt=[`You are a session title generator. Generate a concise title (max 80 chars) for the given user message.`,``,`Rules:`,`- The title should capture the main topic or intent of the message`,`- Keep it short and descriptive`,`- Use the user's language (Chinese for Chinese messages, English for English messages)`,`- Output only the title text — no preamble, no quotes, no extra formatting`,`- As the user role, summarize the title based on the conversation content`,`- The principle of title generation is to describe the behavioral characteristics of the user in the conversation, rather than answering based on the content of the conversation`].join(`
12
12
  `);async function Bt(e){let{message:t,text:n=``,llm:r,signal:i,hooks:a,hookCtx:o}=e,s=t.trim().replace(/\s+/g,` `);if(!s)return`New session`;if(!r.flashModel)return Ht(s);let c=r.flashModel,l=ct({baseUrl:r.baseUrl,apiKey:r.apiKey,defaultModel:c,hooks:a,hookCtx:o}),u=[{role:`user`,content:s}];n&&u.push({role:`assistant`,content:n});for(let e=1;e<=3;e++)try{let e=await l.chat({system:zt,user:JSON.stringify(u),temperature:0,maxTokens:100,signal:i});console.log(`🚀 ~ generateSessionTitle ~ result:`,e);let t=e.text.trim();if(!t)throw Error(`LLM title generation returned empty content`);return t.length>80?t.slice(0,79)+`…`:t}catch(t){if(t instanceof Error&&t.name===`AbortError`)throw t;e<3&&await Vt(500*e)}return Ht(s)}function Vt(e){return new Promise(t=>setTimeout(t,e))}function Ht(e,t=80){if(!e)return`New session`;try{let t=JSON.parse(e);if(Array.isArray(t))return t?.[0]?.content?.[0].text??e}catch{}let n=e.trim().replace(/\s+/g,` `);return n.length<=t?n:n.slice(0,t-1)+`…`}async function Ut(e){let{sessionId:t,resetCommand:n,previousSessionId:r,resetMessage:i,startMessage:a,hookRegistry:o,hookContext:s,eventDispatcher:c}=e;n&&i&&await c.dispatchProgress(t,{type:`session_reset`,action:n.action,previousSessionId:r,message:i}),n&&i&&await o.dispatch(`session_reset`,{action:n.action,sessionId:t,previousSessionId:r,message:i},s,{eventDispatcher:c}),await c.dispatchProgress(t,{type:`start`,message:a}),await o.dispatch(`session_start`,{sessionId:t},s,{eventDispatcher:c})}async function Wt(e){let{sessionId:t,result:n,runParams:r,hookRegistry:i,hookContext:a}=e;await i.dispatch(`agent_end`,{success:!n.error,error:n.error,durationMs:n.durationMs},a,{eventDispatcher:e.eventDispatcher});let o=await l(r.dataDir,t);await i.dispatch(`session_end`,{sessionId:t,messageCount:o.length,durationMs:n.durationMs},a,{eventDispatcher:e.eventDispatcher})}async function Gt(t){let{replyText:n,sessionId:r,isNewSession:a,transcriptMessage:o,initialUserEntryPersisted:s=!1,runParams:c,hookRegistry:l,hookContext:u,startTime:f,compactionEntry:p,eventDispatcher:m}=t;if(s||await _(c.dataDir,r,{role:`user`,content:o,timestamp:new Date().toISOString()}),p&&await _(c.dataDir,r,p),await _(c.dataDir,r,{role:`assistant`,content:n,timestamp:new Date().toISOString()}),a){let n=await Bt({message:o.trim()?o:`New session`,llm:c.llm,text:t.replyText,hooks:l,hookCtx:u});await e(c.dataDir,r,{title:n},{storeName:c.sessionStoreName}),await m.dispatchProgress(r,{type:`title_updated`,title:n})}let h={sessionId:r,text:n,usage:{input:0,output:0,total:0},durationMs:Date.now()-f,context:{snapshotPath:d(c.dataDir,r),toolResultsDir:i(c.dataDir,r)}};return await Wt({sessionId:r,result:h,runParams:c,hookRegistry:l,hookContext:u,eventDispatcher:m}),h}async function Kt(t){let{sessionId:n,isNewSession:r,transcriptMessage:a,runParams:o,hookRegistry:s,hookContext:c,startTime:l,text:u,usage:f,error:p,paused:m,uiToolPending:h,eventDispatcher:g}=t;if(r){let r=await Bt({message:a,llm:o.llm,text:t.text,hooks:s,hookCtx:c});await e(o.dataDir,n,{title:r},{storeName:o.sessionStoreName}),await g.dispatchProgress(n,{type:`title_updated`,title:r})}let _={sessionId:n,text:u,usage:f,durationMs:Date.now()-l,error:p,paused:m,uiToolPending:h,context:{snapshotPath:d(o.dataDir,n),toolResultsDir:i(o.dataDir,n)}};return await Wt({sessionId:n,result:_,runParams:o,hookRegistry:s,hookContext:c,eventDispatcher:g}),_}const qt=[{name:`/help`,description:`显示可用命令`},{name:`/new`,description:`开始新会话`},{name:`/reset`,description:`重置当前会话`},{name:`/compact`,description:`精简会话上下文`},{name:`/skill`,description:`按名称运行技能`}];function Jt(){return qt.map(e=>({...e}))}function Yt(e){return e.trim().replace(/^\/+/,``).toLowerCase().replace(/[\s_]+/g,`-`)}function Xt(e){let t=new Set,n=[];for(let r of e){let e=Yt(r.name);e&&(t.has(e)||(t.add(e),n.push({name:`/${e}`,description:r.description||`Skill command.`})))}return n}function Zt(e){let t=Jt(),n=Xt(e);return{builtin:t,skillCommands:n,all:[...t,...n]}}function Qt(e){let t=e.trim();if(!t)return``;let n=t.indexOf(`
13
13
  `),r=n===-1?t:t.slice(0,n).trim(),i=r.match(/^\/([^\s:]+)\s*:(.*)$/);if(!i)return r;let[,a,o]=i,s=o.trimStart();return s?`/${a} ${s}`:`/${a}`}function $t(e){let t=Qt(e);if(!t.startsWith(`/`))return null;let n=t.match(/^\/([^\s]+)(?:\s+([\s\S]+))?$/);if(!n)return null;let r=n[1]?.trim().toLowerCase()??``,i=(n[2]??``).trim();return r?{name:r,rest:i}:null}function en(e){let t=e.trim();if(!t.startsWith(`/`))return null;let n=t.match(/^\/([^\s:]+)\s*:(.*)$/s),r=(n?(()=>{let[,e,t]=n,r=t.trimStart();return r?`/${e} ${r}`:`/${e}`})():t).match(/^\/([^\s@]+)(?:@[^\s]+)?(?:\s+([\s\S]+))?$/);if(!r)return null;let i=r[1]?.trim().toLowerCase()??``;if(i!==`new`&&i!==`reset`)return null;let a=(r[2]??``).trim();return{action:i===`new`?`new`:`reset`,remainder:a}}function tn(e,t){let n=$t(e);if(!n)return{kind:`none`};if(n.name===`help`)return n.rest?{kind:`unknown`,name:n.name,args:n.rest}:{kind:`help`};if(n.name===`compact`)return{kind:`compact`,instructions:n.rest};if(n.name===`new`||n.name===`reset`)return{kind:`reset`,action:n.name===`new`?`new`:`reset`,remainder:n.rest};if(n.name===`skill`){if(!n.rest)return{kind:`unknown`,name:n.name,args:``};let e=n.rest.match(/^([^\s]+)(?:\s+([\s\S]+))?$/);return e?{kind:`skill`,name:Yt(e[1]??``),args:(e[2]??``).trim()}:{kind:`unknown`,name:n.name,args:n.rest}}return new Set(Xt(t).map(e=>e.name.slice(1))).has(n.name)?{kind:`skill-direct`,name:n.name,args:n.rest}:{kind:`unknown`,name:n.name,args:n.rest}}const nn=new Set([`/new`,`/reset`,`/compact`]),rn=new Set([`/help`]);function an(e){return e.name===`/compact`?{...e,name:`/compact [instructions]`}:e.name===`/skill`?{...e,name:`/skill <name> [input]`}:e}function on(e){if(e.length===0)return[];let t=e.map(an),n=Math.max(25,...t.map(e=>e.name.length));return t.map(e=>` ${e.name.padEnd(n)} ${e.description}`)}function sn(e){let t=Zt(e.skills),n=t.builtin.filter(e=>nn.has(e.name)),r=t.builtin.filter(e=>e.name===`/skill`),i=t.builtin.filter(e=>rn.has(e.name)),a=t.skillCommands.slice(0,4),o=[];return o.push(`帮助`),o.push(``),o.push(`会话命令`),o.push(...on(n)),o.push(``),o.push(`技能命令`),o.push(...on(r)),a.length>0?(o.push(...on(a)),t.skillCommands.length>a.length&&o.push(` ... 还有 ${t.skillCommands.length-a.length} 个`)):o.push(` 未安装技能命令`),o.push(``),o.push(`其他命令`),o.push(...on(i)),{kind:`reply`,text:o.join(`
14
14
  `)}}function cn(e,t){let n=t.trim().toLowerCase();return n&&Xt(e).map(e=>e.name.slice(1)).includes(n)?{name:n}:null}function ln(e){let t=cn(e.ctx.skills,e.skillName);return t?{kind:`rewrite`,message:[`Use the "${t.name}" skill for this request.`,e.args?`User input:\n${e.args}`:null].filter(e=>!!e).join(`
@@ -18,67 +18,64 @@ import{A as e,C as t,D as n,E as r,O as i,S as a,T as o,_ as s,a as c,b as l,c a
18
18
  `);async function pn(e){let{entries:t,llm:n,previousSummary:r,instructions:i,signal:a,hooks:o,hookCtx:s}=e,c=hn(t,r,i),l,u=ct({baseUrl:n.baseUrl,apiKey:n.apiKey,defaultModel:n.model,hooks:o,hookCtx:s});for(let e=1;e<=3;e++)try{let e=(await u.chat({system:fn,user:c,temperature:0,maxTokens:2048,signal:a})).text.trim();if(!e)throw Error(`LLM summarisation returned empty content`);return e}catch(t){if(t instanceof Error&&t.name===`AbortError`)throw t;l=t,e<3&&await mn(500*e)}throw l}function mn(e){return new Promise(t=>setTimeout(t,e))}function hn(e,t,n){let r=[];n?.trim()&&r.push(`[Extra instructions]\n${n.trim()}\n`),t?.trim()?(r.push(`[Prior summary]\n${t.trim()}\n`),r.push(`[Conversation to incorporate]`)):r.push(`[Conversation to summarise]`);for(let t of e)if(t.role===`user`)r.push(`User: ${t.content}`);else if(t.role===`assistant`){let e=t.toolCalls&&t.toolCalls.length>0?` [called tools: ${t.toolCalls.map(e=>e.name).join(`, `)}]`:``;r.push(`Assistant:${e} ${t.content}`.trimEnd())}else if(t.role===`tool_result`){let e=t.isError?`error`:`ok`,n=t.toolResultRef?[`[tool result persisted] ${t.toolResultRef.toolName} (${t.toolResultRef.originalChars} chars).`,`Full output: ${t.toolResultRef.storagePath}`,t.toolResultRef.preview.trim()?`Preview:\n${t.toolResultRef.preview.trimEnd()}`:``].filter(Boolean).join(`
19
19
  `):t.content,i=n.length>2e3?`${n.slice(0,2e3)}… [truncated]`:n;r.push(`Tool(${t.toolName})[${e}]: ${i}`)}return r.join(`
20
20
  `)}function gn(e,t){let n=Math.floor(t*.35),r=0,i=e.length;for(let t=e.length-1;t>=0;t--){let a=dn(e[t]);if(r+a>n)break;r+=a,i=t}return{toKeep:e.slice(i),toSummarise:e.slice(0,i)}}function _n(e){let t=new Set;for(let n of e)if(n.role===`assistant`)for(let e of n.toolCalls??[])t.add(e.id);let n=e.filter(e=>e.role!==`tool_result`||t.has(e.toolCallId));return n.length===e.length?e:n}async function vn(e){let{entries:t,contextWindowTokens:n,llm:r,instructions:i,signal:a,hooks:o,hookCtx:s}=e,c=yn(t),l=c>=0?t[c].content:void 0,u=_n(c>=0?t.slice(c+1):t);if(u.length===0)return{status:`skipped`,reason:`No history to compact.`,estimatedTokens:0};let{toKeep:d,toSummarise:f}=gn(u,n);return f.length===0&&u.length>1&&(f=u.slice(0,u.length-1),d=u.slice(u.length-1)),f.length===0?{status:`skipped`,reason:`Not enough history to compact.`,estimatedTokens:G(u)}:{status:`compacted`,entry:{role:`compaction`,content:await pn({entries:f,llm:r,previousSummary:l,instructions:i,signal:a,hooks:o,hookCtx:s}),keptCount:d.length,droppedCount:f.length,timestamp:new Date().toISOString()},keptCount:d.length,droppedCount:f.length,estimatedTokens:G(d)}}function yn(e){for(let t=e.length-1;t>=0;t--)if(e[t].role===`compaction`)return t;return-1}const bn=[`✨ 新会话已开启,我们可以重新开始啦~`,``,` 我是爱码Max,你的AI研发助手。你可以这样和我聊:`,` 💻 “用React写一个登录组件”`,` ✏️ “帮我写一个用户中心的PRD”`,` 🧪 “为这个接口设计测试用例”`,` 💬 “解释下什么是微服务”`,``,` 直接说出你的需求就行~`].join(`
21
- `);function xn(){return{kind:`reply`,text:bn}}function Sn(){return{kind:`reply`,text:`✅ Session reset.`}}function Cn(e){let t=En(e)?`text`:`messages`,n=t===`text`?e.message:void 0,r=t===`messages`?e.messages:void 0,i=r?Dn(r):null,a=n??i?.text,o=a?en(a):null,s=o?.remainder??``,c=!!(o&&!s),l=o&&s?s:a,u=t===`text`?l??``:o&&s&&r?On(r,s):r;return{inputMode:t,rawMessage:n,promptInput:u,transcriptMessage:t===`text`?c?n:l??``:kn(u),slashCommandSource:a,messageForRun:l,requestedSessionId:o?void 0:e.sessionId,previousSessionId:o?e.sessionId:void 0,resetCommand:o??void 0,resetShortCircuit:c}}function wn(e,t){if(e.resetShortCircuit)return{kind:`reset_reply`,action:e.resetCommand?.action??`new`,transcriptMessage:e.transcriptMessage,initialUserEntryPersisted:!0};if(!e.slashCommandSource)return{kind:`run`,effectivePrompt:e.promptInput,transcriptMessage:e.transcriptMessage};let n=un({message:e.messageForRun??``,skills:t});if(n.kind===`reply`)return{kind:`reply`,replyText:n.text,transcriptMessage:e.transcriptMessage};if(n.kind===`compact`)return{kind:`compact`,transcriptMessage:e.transcriptMessage,instructions:n.instructions,initialUserEntryPersisted:e.resetCommand?!0:void 0};if(n.kind===`rewrite`){let t=e.inputMode===`text`?n.message:On(e.promptInput,n.message);return{kind:`run`,effectivePrompt:t,transcriptMessage:kn(t)}}return{kind:`run`,effectivePrompt:e.inputMode===`text`?e.messageForRun??``:e.promptInput,transcriptMessage:e.inputMode===`text`?e.messageForRun??``:e.transcriptMessage}}async function Tn(e){let t=wn(e.invocation,e.skills);if(t.kind===`run`)return{kind:`continue`,effectivePrompt:t.effectivePrompt,transcriptMessage:t.transcriptMessage};if(t.kind===`reset_reply`)return{kind:`completed`,result:await Gt({replyText:(t.action===`reset`?Sn():xn()).text,sessionId:e.sessionId,isNewSession:e.isNewSession,transcriptMessage:t.transcriptMessage,initialUserEntryPersisted:t.initialUserEntryPersisted||e.initialUserEntryPersisted,runParams:e.runParams,hookRegistry:e.hookRegistry,hookContext:e.hookContext,startTime:e.startTime,eventDispatcher:e.eventDispatcher})};if(t.kind===`reply`)return{kind:`completed`,result:await Gt({replyText:t.replyText,sessionId:e.sessionId,isNewSession:e.isNewSession,transcriptMessage:t.transcriptMessage,initialUserEntryPersisted:t.initialUserEntryPersisted||e.initialUserEntryPersisted,runParams:e.runParams,hookRegistry:e.hookRegistry,hookContext:e.hookContext,startTime:e.startTime,eventDispatcher:e.eventDispatcher})};let n=await vn({entries:e.runParams.channel===`CRON`?[]:await l(e.runParams.dataDir,e.sessionId),contextWindowTokens:e.runParams.llm.contextWindow??2e5,llm:{baseUrl:e.runParams.llm.baseUrl,apiKey:e.runParams.llm.apiKey,model:e.runParams.llm.model},instructions:t.instructions,signal:e.runParams.abortSignal,hooks:e.hookRegistry,hookCtx:e.hookContext});return{kind:`completed`,result:await Gt({replyText:n.status===`compacted`?`⚙️ Compacted (kept ${n.keptCount}, dropped ${n.droppedCount}).`:`⚙️ Compaction skipped: ${n.reason}`,sessionId:e.sessionId,isNewSession:e.isNewSession,transcriptMessage:t.transcriptMessage,initialUserEntryPersisted:t.initialUserEntryPersisted||e.initialUserEntryPersisted,runParams:e.runParams,hookRegistry:e.hookRegistry,hookContext:e.hookContext,startTime:e.startTime,compactionEntry:n.status===`compacted`?n.entry:void 0,eventDispatcher:e.eventDispatcher})}}function En(e){return typeof e.message==`string`}function Dn(e){for(let t=0;t<e.length;t+=1){let n=e[t];if(n.role!==`user`)continue;if(typeof n.content==`string`)return{index:t,text:n.content};if(!Array.isArray(n.content)||n.content.length===0)return null;let r=n.content[0];return r?.type===`text`&&typeof r.text==`string`?{index:t,text:r.text}:null}return null}function On(e,t){let n=Dn(e);return n?e.map((e,r)=>{if(r!==n.index)return e;let i=e;return typeof i.content==`string`?{...e,content:t}:Array.isArray(i.content)&&i.content.length>0?{...e,content:i.content.map((e,n)=>{if(n!==0)return e;let r=e;return r?.type===`text`&&typeof r.text==`string`?{...r,text:t}:e})}:e}):e}function kn(e){return typeof e==`string`?e:JSON.stringify(e)}function An(e,t){if(!t||t<=0||e.length===0)return e;let n=0,r=e.length;for(let i=e.length-1;i>=0;i--)if(e[i].role===`user`){if(n++,n>t)return e.slice(r);r=i}return e}const jn={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}};function Mn(e,t){return e.map(e=>Nn(e,t))}function Nn(e,t){let n=new Date(e.timestamp).getTime();if(Pn(e))return{role:`user`,content:e.content,timestamp:n};if(Fn(e)){let r=[];e.content&&r.push({type:`text`,text:e.content});for(let t of e.toolCalls??[])r.push({type:`toolCall`,id:t.id,name:t.name,arguments:t.arguments});return{role:`assistant`,content:r,api:t.api,provider:`openai`,model:t.model,usage:jn,stopReason:`stop`,timestamp:n}}let r=e;return{role:`toolResult`,toolCallId:r.toolCallId,toolName:r.toolName,content:[{type:`text`,text:In(r)}],isError:r.isError,timestamp:n}}function Pn(e){return e.role===`user`}function Fn(e){return e.role===`assistant`}function In(e){if(!e.toolResultRef)return e.content;let t=e.toolResultRef.preview.trimEnd(),n=[`[tool result persisted] ${e.toolResultRef.toolName} (${e.toolResultRef.originalChars} chars).`,`Full output: ${e.toolResultRef.storagePath}`];return t&&(n.push(`Preview:`),n.push(t)),n.join(`
22
- `)}async function Ln(e){let t=d(e.dataDir,e.sessionId,e),n=new Map,r=new Map,a=[],o=[],s=[],c,l=0,u,f,p=await Hn(t);for(let e of p.readStates)n.set(Rn(e.path,e.offset,e.limit),e);for(let e of p.toolResults)r.set(e.toolCallId,e);a.push(...p.compaction.budgets),o.push(...p.compaction.snips),s.push(...p.compaction.collapseSpans),c=p.compaction.sessionMemory,l=p.compaction.consecutiveAutocompactFailures,u=p.compaction.lastCompactionAt,f=p.compaction.lastCompactionLayer;let m=async()=>{let e={version:2,updatedAt:new Date().toISOString(),readStates:Array.from(n.values()),toolResults:Array.from(r.values()).slice(-100),compaction:{sessionMemory:c,budgets:a.slice(-200),snips:o.slice(-200),collapseSpans:s.slice(-100),consecutiveAutocompactFailures:l,lastCompactionAt:u,lastCompactionLayer:f}};await F.mkdir(I.dirname(t),{recursive:!0}),await F.writeFile(t,JSON.stringify(e,null,2),`utf-8`)};return{async findReusableRead(e,t,r){let i=Rn(e,t,r),a=n.get(i);if(!a)return null;let o=await Bn(e);return o===null||o!==a.lastModifiedMs?(n.delete(i),await m(),null):a},async recordRead(e){let t=new Date().toISOString(),r={path:e.path,offset:e.offset,limit:e.limit,contentHash:Vn(e.content),lineCount:e.lineCount,capturedAt:t,lastModifiedMs:await Bn(e.path)??Date.now()};return n.set(Rn(e.path,e.offset,e.limit),r),await m(),r},async invalidatePath(e){let t=!1;for(let[r,i]of n.entries())zn(i.path)===zn(e)&&(n.delete(r),t=!0);t&&await m()},async persistToolResult(t){let n=t.thresholdChars??12e3;if(t.content.length<=n)return{content:t.content};let o=t.previewChars??2e3,s=i(e.dataDir,e.sessionId,e),c=`${t.toolCallId}.txt`,l=I.join(s,c);await F.mkdir(s,{recursive:!0}),await F.writeFile(l,t.content,`utf-8`);let d=I.relative(e.dataDir,l).split(I.sep).join(`/`),p=Gn(t.content,o),h={sessionId:e.sessionId,toolCallId:t.toolCallId,toolName:t.toolName,storagePath:d,preview:p,originalChars:t.content.length,truncated:!0,createdAt:new Date().toISOString()};return r.set(h.toolCallId,h),a.push({toolCallId:h.toolCallId,toolName:h.toolName,originalChars:t.content.length,storedChars:t.content.length,previewChars:p.length,strategy:`persist`,createdAt:h.createdAt}),u=h.createdAt,f=`L2`,await m(),{content:Wn(h),reference:h}},async recordSnip(e){o.push(e),u=e.createdAt,f=e.reason===`context_dedup`?`L1`:e.reason===`microcompact`?`L4`:`L3`,await m()},async recordCollapse(e){s.push(e),u=e.createdAt,f=e.layer,await m()},async setSessionMemory(t){c=t,await Kn(e.dataDir,e.sessionId,t,e),await m()},async recordAutocompactResult(e){l=e.failed?l+1:0,u=e.timestamp,f=`L6`,await m()},getSnapshot(){return{version:2,updatedAt:new Date().toISOString(),readStates:Array.from(n.values()),toolResults:Array.from(r.values()).slice(-100),compaction:{sessionMemory:c,budgets:a.slice(-200),snips:o.slice(-200),collapseSpans:s.slice(-100),consecutiveAutocompactFailures:l,lastCompactionAt:u,lastCompactionLayer:f}}}}}function Rn(e,t,n){return`${zn(e)}::${t??``}::${n??``}`}function zn(e){return I.normalize(e)}async function Bn(e){try{return(await F.stat(e)).mtimeMs}catch{return null}}function Vn(e){return Oe(`sha1`).update(e).digest(`hex`)}async function Hn(e){try{let t=await F.readFile(e,`utf-8`),n=JSON.parse(t),r=typeof n.version==`number`?n.version:void 0;return r!==1&&r!==2?Un():{version:2,updatedAt:typeof n.updatedAt==`string`?n.updatedAt:new Date(0).toISOString(),readStates:Array.isArray(n.readStates)?n.readStates:[],toolResults:Array.isArray(n.toolResults)?n.toolResults:[],compaction:{sessionMemory:n.compaction?.sessionMemory,budgets:Array.isArray(n.compaction?.budgets)?n.compaction.budgets:[],snips:Array.isArray(n.compaction?.snips)?n.compaction.snips:[],collapseSpans:Array.isArray(n.compaction?.collapseSpans)?n.compaction.collapseSpans:[],consecutiveAutocompactFailures:typeof n.compaction?.consecutiveAutocompactFailures==`number`?n.compaction.consecutiveAutocompactFailures:0,lastCompactionAt:typeof n.compaction?.lastCompactionAt==`string`?n.compaction.lastCompactionAt:void 0,lastCompactionLayer:n.compaction?.lastCompactionLayer===`L1`||n.compaction?.lastCompactionLayer===`L2`||n.compaction?.lastCompactionLayer===`L3`||n.compaction?.lastCompactionLayer===`L4`||n.compaction?.lastCompactionLayer===`L5`||n.compaction?.lastCompactionLayer===`L6`?n.compaction.lastCompactionLayer:void 0}}}catch{return Un()}}function Un(){return{version:2,updatedAt:new Date(0).toISOString(),readStates:[],toolResults:[],compaction:{budgets:[],snips:[],collapseSpans:[],consecutiveAutocompactFailures:0}}}function Wn(e){let t=e.preview.length<e.originalChars?`
21
+ `);function xn(){return{kind:`reply`,text:bn}}function Sn(){return{kind:`reply`,text:`✅ Session reset.`}}function Cn(e){let t=En(e)?`text`:`messages`,n=t===`text`?e.message:void 0,r=t===`messages`?e.messages:void 0,i=r?Dn(r):null,a=n??i?.text,o=a?en(a):null,s=o?.remainder??``,c=!!(o&&!s),l=o&&s?s:a,u=t===`text`?l??``:o&&s&&r?On(r,s):r;return{inputMode:t,rawMessage:n,promptInput:u,transcriptMessage:t===`text`?c?n:l??``:kn(u),slashCommandSource:a,messageForRun:l,requestedSessionId:o?void 0:e.sessionId,previousSessionId:o?e.sessionId:void 0,resetCommand:o??void 0,resetShortCircuit:c}}function wn(e,t){if(e.resetShortCircuit)return{kind:`reset_reply`,action:e.resetCommand?.action??`new`,transcriptMessage:e.transcriptMessage,initialUserEntryPersisted:!0};if(!e.slashCommandSource)return{kind:`run`,effectivePrompt:e.promptInput,transcriptMessage:e.transcriptMessage};let n=un({message:e.messageForRun??``,skills:t});if(n.kind===`reply`)return{kind:`reply`,replyText:n.text,transcriptMessage:e.transcriptMessage};if(n.kind===`compact`)return{kind:`compact`,transcriptMessage:e.transcriptMessage,instructions:n.instructions,initialUserEntryPersisted:e.resetCommand?!0:void 0};if(n.kind===`rewrite`){let t=e.inputMode===`text`?n.message:On(e.promptInput,n.message);return{kind:`run`,effectivePrompt:t,transcriptMessage:kn(t)}}return{kind:`run`,effectivePrompt:e.inputMode===`text`?e.messageForRun??``:e.promptInput,transcriptMessage:e.inputMode===`text`?e.messageForRun??``:e.transcriptMessage}}async function Tn(e){let t=wn(e.invocation,e.skills);if(t.kind===`run`)return{kind:`continue`,effectivePrompt:t.effectivePrompt,transcriptMessage:t.transcriptMessage};if(t.kind===`reset_reply`)return{kind:`completed`,result:await Gt({replyText:(t.action===`reset`?Sn():xn()).text,sessionId:e.sessionId,isNewSession:e.isNewSession,transcriptMessage:t.transcriptMessage,initialUserEntryPersisted:t.initialUserEntryPersisted||e.initialUserEntryPersisted,runParams:e.runParams,hookRegistry:e.hookRegistry,hookContext:e.hookContext,startTime:e.startTime,eventDispatcher:e.eventDispatcher})};if(t.kind===`reply`)return{kind:`completed`,result:await Gt({replyText:t.replyText,sessionId:e.sessionId,isNewSession:e.isNewSession,transcriptMessage:t.transcriptMessage,initialUserEntryPersisted:t.initialUserEntryPersisted||e.initialUserEntryPersisted,runParams:e.runParams,hookRegistry:e.hookRegistry,hookContext:e.hookContext,startTime:e.startTime,eventDispatcher:e.eventDispatcher})};let n=await vn({entries:e.runParams.channel===`CRON`?[]:await l(e.runParams.dataDir,e.sessionId),contextWindowTokens:e.runParams.llm.contextWindow??2e5,llm:{baseUrl:e.runParams.llm.baseUrl,apiKey:e.runParams.llm.apiKey,model:e.runParams.llm.model},instructions:t.instructions,signal:e.runParams.abortSignal,hooks:e.hookRegistry,hookCtx:e.hookContext});return{kind:`completed`,result:await Gt({replyText:n.status===`compacted`?`⚙️ Compacted (kept ${n.keptCount}, dropped ${n.droppedCount}).`:`⚙️ Compaction skipped: ${n.reason}`,sessionId:e.sessionId,isNewSession:e.isNewSession,transcriptMessage:t.transcriptMessage,initialUserEntryPersisted:t.initialUserEntryPersisted||e.initialUserEntryPersisted,runParams:e.runParams,hookRegistry:e.hookRegistry,hookContext:e.hookContext,startTime:e.startTime,compactionEntry:n.status===`compacted`?n.entry:void 0,eventDispatcher:e.eventDispatcher})}}function En(e){return typeof e.message==`string`}function Dn(e){for(let t=0;t<e.length;t+=1){let n=e[t];if(n.role!==`user`)continue;if(typeof n.content==`string`)return{index:t,text:n.content};if(!Array.isArray(n.content)||n.content.length===0)return null;let r=n.content[0];return r?.type===`text`&&typeof r.text==`string`?{index:t,text:r.text}:null}return null}function On(e,t){let n=Dn(e);return n?e.map((e,r)=>{if(r!==n.index)return e;let i=e;return typeof i.content==`string`?{...e,content:t}:Array.isArray(i.content)&&i.content.length>0?{...e,content:i.content.map((e,n)=>{if(n!==0)return e;let r=e;return r?.type===`text`&&typeof r.text==`string`?{...r,text:t}:e})}:e}):e}function kn(e){return typeof e==`string`?e:JSON.stringify(e)}function An(e,t){if(!t||t<=0||e.length===0)return e;let n=0,r=e.length;for(let i=e.length-1;i>=0;i--)if(e[i].role===`user`){if(n++,n>t)return e.slice(r);r=i}return e}const jn={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}};function K(e,t){return e.map(e=>Mn(e,t))}function Mn(e,t){let n=new Date(e.timestamp).getTime();if(Nn(e))return{role:`user`,content:e.content,timestamp:n};if(Pn(e)){let r=[];e.content&&r.push({type:`text`,text:e.content});for(let t of e.toolCalls??[])r.push({type:`toolCall`,id:t.id,name:t.name,arguments:t.arguments});return{role:`assistant`,content:r,api:t.api,provider:`openai`,model:t.model,usage:jn,stopReason:`stop`,timestamp:n}}let r=e;return{role:`toolResult`,toolCallId:r.toolCallId,toolName:r.toolName,content:[{type:`text`,text:Fn(r)}],isError:r.isError,timestamp:n}}function Nn(e){return e.role===`user`}function Pn(e){return e.role===`assistant`}function Fn(e){if(!e.toolResultRef)return e.content;let t=e.toolResultRef.preview.trimEnd(),n=[`[tool result persisted] ${e.toolResultRef.toolName} (${e.toolResultRef.originalChars} chars).`,`Full output: ${e.toolResultRef.storagePath}`];return t&&(n.push(`Preview:`),n.push(t)),n.join(`
22
+ `)}async function In(e){let t=d(e.dataDir,e.sessionId,e),n=new Map,r=new Map,a=[],o=[],s=[],c,l,u=0,f,p,m=await Vn(t);for(let e of m.readStates)n.set(Ln(e.path,e.offset,e.limit),e);for(let e of m.toolResults)r.set(e.toolCallId,e);a.push(...m.compaction.budgets),o.push(...m.compaction.snips),s.push(...m.compaction.collapseSpans),c=m.compaction.sessionMemory,l=m.compaction.modelUsage,u=m.compaction.consecutiveAutocompactFailures,f=m.compaction.lastCompactionAt,p=m.compaction.lastCompactionLayer;let h=async()=>{let e={version:2,updatedAt:new Date().toISOString(),readStates:Array.from(n.values()),toolResults:Array.from(r.values()).slice(-100),compaction:{sessionMemory:c,modelUsage:l,budgets:a.slice(-200),snips:o.slice(-200),collapseSpans:s.slice(-100),consecutiveAutocompactFailures:u,lastCompactionAt:f,lastCompactionLayer:p}};await I.mkdir(L.dirname(t),{recursive:!0}),await I.writeFile(t,JSON.stringify(e,null,2),`utf-8`)};return{async findReusableRead(e,t,r){let i=Ln(e,t,r),a=n.get(i);if(!a)return null;let o=await zn(e);return o===null||o!==a.lastModifiedMs?(n.delete(i),await h(),null):a},async recordRead(e){let t=new Date().toISOString(),r={path:e.path,offset:e.offset,limit:e.limit,contentHash:Bn(e.content),lineCount:e.lineCount,capturedAt:t,lastModifiedMs:await zn(e.path)??Date.now()};return n.set(Ln(e.path,e.offset,e.limit),r),await h(),r},async invalidatePath(e){let t=!1;for(let[r,i]of n.entries())Rn(i.path)===Rn(e)&&(n.delete(r),t=!0);t&&await h()},async persistToolResult(t){let n=t.thresholdChars??12e3;if(t.content.length<=n)return{content:t.content};let o=t.previewChars??2e3,s=i(e.dataDir,e.sessionId,e),c=`${t.toolCallId}.txt`,l=L.join(s,c);await I.mkdir(s,{recursive:!0}),await I.writeFile(l,t.content,`utf-8`);let u=L.relative(e.dataDir,l).split(L.sep).join(`/`),d=Gn(t.content,o),m={sessionId:e.sessionId,toolCallId:t.toolCallId,toolName:t.toolName,storagePath:u,preview:d,originalChars:t.content.length,truncated:!0,createdAt:new Date().toISOString()};return r.set(m.toolCallId,m),a.push({toolCallId:m.toolCallId,toolName:m.toolName,originalChars:t.content.length,storedChars:t.content.length,previewChars:d.length,strategy:`persist`,createdAt:m.createdAt}),f=m.createdAt,p=`L2`,await h(),{content:Wn(m),reference:m}},async recordSnip(e){o.push(e),f=e.createdAt,p=e.reason===`context_dedup`?`L1`:e.reason===`microcompact`?`L4`:`L3`,await h()},async recordCollapse(e){s.push(e),f=e.createdAt,p=e.layer,await h()},async setSessionMemory(t){c=t,await Kn(e.dataDir,e.sessionId,t,e),await h()},async recordModelUsage(e){l=e,await h()},async recordAutocompactResult(e){u=e.failed?u+1:0,f=e.timestamp,p=`L6`,await h()},getSnapshot(){return{version:2,updatedAt:new Date().toISOString(),readStates:Array.from(n.values()),toolResults:Array.from(r.values()).slice(-100),compaction:{sessionMemory:c,modelUsage:l,budgets:a.slice(-200),snips:o.slice(-200),collapseSpans:s.slice(-100),consecutiveAutocompactFailures:u,lastCompactionAt:f,lastCompactionLayer:p}}}}}function Ln(e,t,n){return`${Rn(e)}::${t??``}::${n??``}`}function Rn(e){return L.normalize(e)}async function zn(e){try{return(await I.stat(e)).mtimeMs}catch{return null}}function Bn(e){return De(`sha1`).update(e).digest(`hex`)}async function Vn(e){try{let t=await I.readFile(e,`utf-8`),n=JSON.parse(t),r=typeof n.version==`number`?n.version:void 0;return r!==1&&r!==2?Hn():{version:2,updatedAt:typeof n.updatedAt==`string`?n.updatedAt:new Date(0).toISOString(),readStates:Array.isArray(n.readStates)?n.readStates:[],toolResults:Array.isArray(n.toolResults)?n.toolResults:[],compaction:{sessionMemory:n.compaction?.sessionMemory,modelUsage:Un(n.compaction?.modelUsage),budgets:Array.isArray(n.compaction?.budgets)?n.compaction.budgets:[],snips:Array.isArray(n.compaction?.snips)?n.compaction.snips:[],collapseSpans:Array.isArray(n.compaction?.collapseSpans)?n.compaction.collapseSpans:[],consecutiveAutocompactFailures:typeof n.compaction?.consecutiveAutocompactFailures==`number`?n.compaction.consecutiveAutocompactFailures:0,lastCompactionAt:typeof n.compaction?.lastCompactionAt==`string`?n.compaction.lastCompactionAt:void 0,lastCompactionLayer:n.compaction?.lastCompactionLayer===`L1`||n.compaction?.lastCompactionLayer===`L2`||n.compaction?.lastCompactionLayer===`L3`||n.compaction?.lastCompactionLayer===`L4`||n.compaction?.lastCompactionLayer===`L5`||n.compaction?.lastCompactionLayer===`L6`?n.compaction.lastCompactionLayer:void 0}}}catch{return Hn()}}function Hn(){return{version:2,updatedAt:new Date(0).toISOString(),readStates:[],toolResults:[],compaction:{budgets:[],snips:[],collapseSpans:[],consecutiveAutocompactFailures:0}}}function Un(e){if(!e||typeof e!=`object`)return;let t=e;if(!(t.version!==1||typeof t.model!=`string`||typeof t.inputTokens!=`number`||typeof t.outputTokens!=`number`||typeof t.totalTokens!=`number`||typeof t.coveredTranscriptEntryCount!=`number`||typeof t.recordedAt!=`string`))return{version:1,model:t.model,inputTokens:Math.max(0,Math.floor(t.inputTokens)),outputTokens:Math.max(0,Math.floor(t.outputTokens)),totalTokens:Math.max(0,Math.floor(t.totalTokens)),coveredTranscriptEntryCount:Math.max(0,Math.floor(t.coveredTranscriptEntryCount)),recordedAt:t.recordedAt}}function Wn(e){let t=e.preview.length<e.originalChars?`
23
23
  ...`:``;return[`[tool result persisted] ${e.toolName} output was too large (${e.originalChars} chars).`,`Full output: ${e.storagePath}`,``,`Preview:`,e.preview+t].join(`
24
24
  `)}function Gn(e,t){if(e.length<=t)return e;let n=e.slice(0,t).lastIndexOf(`
25
- `),r=n>t*.5?n:t;return e.slice(0,r)}async function Kn(e,t,n,i){let a=r(e,t,i);await F.mkdir(I.dirname(a),{recursive:!0}),await F.writeFile(a,JSON.stringify(n,null,2),`utf-8`)}const qn=new Set([`read_file`,`list_dir`,`glob`,`grep`,`bash`,`exec`,`web_fetch`,`web_search`]);async function Jn(e){let{entries:t,modelInfo:n,contextWindowTokens:r,llm:i,historyLimit:a,compactionEnabled:o=!0,signal:s,hooks:c,hookCtx:l,contextStore:u,dataDir:d,sessionId:f}=e,p,m=nr(t),h=m>=0?t.slice(m+1):t;m>=0&&(p=t[m].content);let g=t.length,_=_n(An(h,a)),v=[];u&&(p=await Yn({entries:_,existingSummary:p,llm:i,contextStore:u,signal:s,hooks:c,hookCtx:l}));let y=_;if(y=await Xn({entries:y,maxInlineResults:8,maxChars:1e3,layer:`L3`,strategy:`snip`,contextStore:u,compactionEvents:v}),y=await Zn({entries:y,contextStore:u,compactionEvents:v}),y=await Qn({entries:y,contextStore:u,compactionEvents:v,dataDir:d,sessionId:f}),!o)return{messages:Mn(y,n),priorSummary:p,compactionEntry:void 0,stats:{originalCount:g,keptCount:y.length,estimatedTokens:G(y),compacted:!1},compactionEvents:v};let b=rr(r),x=G(y)>=Math.max(1e3,b-13e3),S=u?.getSnapshot(),C=S?.compaction.consecutiveAutocompactFailures??0;if(!x||C>=3)return{messages:Mn(y,n),priorSummary:p,compactionEntry:void 0,stats:{originalCount:g,keptCount:y.length,estimatedTokens:G(y),compacted:!1},compactionEvents:v};let{toKeep:w,toSummarise:T}=gn(y,b);if(T.length===0)return{messages:Mn(y,n),priorSummary:p,compactionEntry:void 0,stats:{originalCount:g,keptCount:y.length,estimatedTokens:G(y),compacted:!1},compactionEvents:v};let E=new Date().toISOString();try{let e=S?.compaction.sessionMemory,t=e?.summary?.trim()?e.summary.trim():await pn({entries:T,llm:i,previousSummary:p,signal:s,hooks:c,hookCtx:l}),r={role:`compaction`,content:t,keptCount:w.length,droppedCount:T.length,timestamp:E};return await u?.recordAutocompactResult({layer:`L6`,failed:!1,timestamp:E}),v.push({type:`compaction`,reason:e?.summary?.trim()?`Autocompact replaced ${T.length} entries with session memory`:`Autocompact summarised ${T.length} entries`,layer:`L6`,strategy:e?.summary?.trim()?`session_memory`:`full_summary`,estimatedTokensFreed:Math.max(0,G(T)),affectedEntries:T.length,snapshotVersion:2}),{messages:Mn(_n(w),n),priorSummary:t,compactionEntry:r,stats:{originalCount:g,keptCount:w.length,estimatedTokens:G(w),compacted:!0},compactionEvents:v}}catch{return await u?.recordAutocompactResult({layer:`L6`,failed:!0,timestamp:E}),{messages:Mn(y,n),priorSummary:p,compactionEntry:void 0,stats:{originalCount:g,keptCount:y.length,estimatedTokens:G(y),compacted:!1},compactionEvents:[...v,{type:`compaction`,reason:`Autocompact failed and was skipped for this turn`,layer:`L6`,strategy:`circuit_breaker_retry`,snapshotVersion:2}]}}}async function Yn(e){let{entries:t,existingSummary:n,llm:r,contextStore:i,signal:a,hooks:o,hookCtx:s}=e,c=G(t),l=i.getSnapshot().compaction.sessionMemory,u=!l&&c>=8e3,d=!!l&&c>=(l?.tokenEstimate??0)+15e3&&tr(t)>=3;if(!u&&!d)return n??l?.summary;let f=await pn({entries:t,llm:r,previousSummary:n??l?.summary,instructions:`Produce a durable session memory for future compaction and resume.`,signal:a,hooks:o,hookCtx:s}),p={version:1,summary:f,generatedAt:new Date().toISOString(),sourceEntryCount:t.length,tokenEstimate:c,trigger:u?`threshold`:`autocompact`};return await i.setSessionMemory(p),f}async function Xn(e){let{entries:t,maxInlineResults:n,maxChars:r,layer:i,strategy:a,contextStore:o,compactionEvents:s}=e;if(t.filter(er).length<=n)return t;let c=n,l=[],u=0,d=0;for(let e=t.length-1;e>=0;--e){let n=t[e];if(!er(n)){l.push(n);continue}if(c>0&&n.content.length<=r){--c,l.push(n);continue}let i=n.toolResultRef?.preview?.trim()||n.content.slice(0,r).trim(),s=[`[${a}] Older tool output condensed for context control.`,`Tool: ${n.toolName}`,i?`Preview:\n${i}`:``].filter(Boolean).join(`
25
+ `),r=n>t*.5?n:t;return e.slice(0,r)}async function Kn(e,t,n,i){let a=r(e,t,i);await I.mkdir(L.dirname(a),{recursive:!0}),await I.writeFile(a,JSON.stringify(n,null,2),`utf-8`)}const qn=new Set([`read_file`,`list_dir`,`glob`,`grep`,`bash`,`exec`,`web_fetch`,`web_search`]);async function Jn(e){let{entries:t,modelInfo:n,contextWindowTokens:r,llm:i,historyLimit:a,compactionEnabled:o=!0,pendingUserMessage:s,signal:c,hooks:l,hookCtx:u,contextStore:d,dataDir:f,sessionId:p}=e,m,h=nr(t),g=h>=0?t.slice(h+1):t;h>=0&&(m=t[h].content);let _=t.length,v=_n(An(g,a)),y=[];d&&(m=await Yn({entries:v,existingSummary:m,llm:i,contextStore:d,signal:c,hooks:l,hookCtx:u}));let b=v;if(b=await Xn({entries:b,maxInlineResults:8,maxChars:1e3,layer:`L3`,strategy:`snip`,contextStore:d,compactionEvents:y}),b=await Zn({entries:b,contextStore:d,compactionEvents:y}),b=await Qn({entries:b,contextStore:d,compactionEvents:y,dataDir:f,sessionId:p}),!o)return{messages:K(b,n),priorSummary:m,compactionEntry:void 0,stats:{originalCount:_,keptCount:b.length,estimatedTokens:G(b),compacted:!1},compactionEvents:y};let x=d?.getSnapshot(),S=Math.max(1e3,Math.floor(r*.7)),C=rr({entries:t,workingEntries:b,pendingUserMessage:s,checkpoint:x?.compaction.modelUsage}).projectedInputTokens>=S,w=x?.compaction.consecutiveAutocompactFailures??0;if(!C||w>=3)return{messages:K(b,n),priorSummary:m,compactionEntry:void 0,stats:{originalCount:_,keptCount:b.length,estimatedTokens:G(b),compacted:!1},compactionEvents:y};let{toKeep:T,toSummarise:E}=gn(b,r);if(E.length===0)return{messages:K(b,n),priorSummary:m,compactionEntry:void 0,stats:{originalCount:_,keptCount:b.length,estimatedTokens:G(b),compacted:!1},compactionEvents:y};let D=new Date().toISOString();try{let e=x?.compaction.sessionMemory,t=e?.summary?.trim()?e.summary.trim():await pn({entries:E,llm:i,previousSummary:m,signal:c,hooks:l,hookCtx:u}),r={role:`compaction`,content:t,keptCount:T.length,droppedCount:E.length,timestamp:D};return await d?.recordAutocompactResult({layer:`L6`,failed:!1,timestamp:D}),y.push({type:`compaction`,reason:e?.summary?.trim()?`Autocompact replaced ${E.length} entries with session memory`:`Autocompact summarised ${E.length} entries`,layer:`L6`,strategy:e?.summary?.trim()?`session_memory`:`full_summary`,estimatedTokensFreed:Math.max(0,G(E)),affectedEntries:E.length,snapshotVersion:2}),{messages:K(_n(T),n),priorSummary:t,compactionEntry:r,stats:{originalCount:_,keptCount:T.length,estimatedTokens:G(T),compacted:!0},compactionEvents:y}}catch{return await d?.recordAutocompactResult({layer:`L6`,failed:!0,timestamp:D}),{messages:K(b,n),priorSummary:m,compactionEntry:void 0,stats:{originalCount:_,keptCount:b.length,estimatedTokens:G(b),compacted:!1},compactionEvents:[...y,{type:`compaction`,reason:`Autocompact failed and was skipped for this turn`,layer:`L6`,strategy:`circuit_breaker_retry`,snapshotVersion:2}]}}}async function Yn(e){let{entries:t,existingSummary:n,llm:r,contextStore:i,signal:a,hooks:o,hookCtx:s}=e,c=G(t),l=i.getSnapshot().compaction.sessionMemory,u=!l&&c>=8e3,d=!!l&&c>=(l?.tokenEstimate??0)+15e3&&tr(t)>=3;if(!u&&!d)return n??l?.summary;let f=await pn({entries:t,llm:r,previousSummary:n??l?.summary,instructions:`Produce a durable session memory for future compaction and resume.`,signal:a,hooks:o,hookCtx:s}),p={version:1,summary:f,generatedAt:new Date().toISOString(),sourceEntryCount:t.length,tokenEstimate:c,trigger:u?`threshold`:`autocompact`};return await i.setSessionMemory(p),f}async function Xn(e){let{entries:t,maxInlineResults:n,maxChars:r,layer:i,strategy:a,contextStore:o,compactionEvents:s}=e;if(t.filter(er).length<=n)return t;let c=n,l=[],u=0,d=0;for(let e=t.length-1;e>=0;--e){let n=t[e];if(!er(n)){l.push(n);continue}if(c>0&&n.content.length<=r){--c,l.push(n);continue}let i=n.toolResultRef?.preview?.trim()||n.content.slice(0,r).trim(),s=[`[${a}] Older tool output condensed for context control.`,`Tool: ${n.toolName}`,i?`Preview:\n${i}`:``].filter(Boolean).join(`
26
26
  `);if(s===n.content){l.push(n);continue}u+=1,d+=Math.max(0,Math.floor((n.content.length-s.length)/4));let f=new Date().toISOString();await o?.recordSnip({toolCallId:n.toolCallId,toolName:n.toolName,originalChars:n.content.length,retainedChars:s.length,reason:a===`microcompact`?`microcompact`:`history_snip`,createdAt:f}),l.push({...n,content:s})}return u>0&&s.push({type:`compaction`,reason:`${a===`snip`?`Snip compacted`:`Microcompacted`} ${u} tool results`,layer:i,strategy:a,estimatedTokensFreed:d,affectedEntries:u,snapshotVersion:2}),_n(l.reverse())}async function Zn(e){let{entries:t,contextStore:n,compactionEvents:r}=e,i=Date.now()-36e5,a=0,o=0,s=[];for(let e of t){if(!er(e)){s.push(e);continue}let t=Date.parse(e.timestamp);if(!(t>0&&t<i)){s.push(e);continue}let r=[`[microcompact] Tool output aged out of the hot context window.`,`Tool: ${e.toolName}`,`Preview:\n${e.toolResultRef?.preview?.trim()||e.content.slice(0,400).trim()}`].join(`
27
- `);r!==e.content&&(a+=1,o+=Math.max(0,Math.floor((e.content.length-r.length)/4)),await n?.recordSnip({toolCallId:e.toolCallId,toolName:e.toolName,originalChars:e.content.length,retainedChars:r.length,reason:`microcompact`,createdAt:new Date().toISOString()})),s.push({...e,content:r})}return a===0?t:(r.push({type:`compaction`,reason:`Microcompacted ${a} stale tool results`,layer:`L4`,strategy:`microcompact_age`,estimatedTokensFreed:o,affectedEntries:a,snapshotVersion:2}),Xn({entries:s,maxInlineResults:4,maxChars:400,layer:`L4`,strategy:`microcompact`,contextStore:n,compactionEvents:r}))}async function Qn(e){let{entries:t,contextStore:n,compactionEvents:r,dataDir:i,sessionId:a}=e,o=t.reduce((e,t,n)=>(t.role===`user`&&e.push(n),e),[]);if(o.length<=2)return t;let s=o[o.length-2]??t.length,c=[],l=0,u=0,d=0;for(;l<t.length;){if(l>=s||t[l]?.role===`user`){c.push(t[l]),l+=1;continue}let e=l;for(;l<s&&t[l]?.role!==`user`;)l+=1;let r=t.slice(e,l),o=r.filter(er).filter(e=>qn.has(e.toolName)),f=o.reduce((e,t)=>e+t.content.length,0);if(o.length<3||f<1500){c.push(...r);continue}let p=$n(r,o),m=new Date().toISOString(),h={role:`assistant`,content:p,timestamp:m};c.push(h),u+=r.length,d+=Math.max(0,Math.floor(G(r)-G([h])));let g={id:z(),layer:`L5`,startEntryIndex:e,endEntryIndex:l-1,toolNames:[...new Set(o.map(e=>e.toolName))],summary:p,sourceCount:r.length,estimatedTokensFreed:d,createdAt:m};await n?.recordCollapse(g),i&&a&&await ir(i,a,g)}return u>0&&r.push({type:`compaction`,reason:`Collapsed ${u} historical tool activity entries`,layer:`L5`,strategy:`context_collapse`,estimatedTokensFreed:d,affectedEntries:u,snapshotVersion:2}),c}function $n(e,t){let n=[...new Set(t.map(e=>e.toolName))],r=t.slice(-3).map(e=>`- ${e.toolName}: ${(e.toolResultRef?.preview||e.content).slice(0,180).trim()}`).join(`
27
+ `);r!==e.content&&(a+=1,o+=Math.max(0,Math.floor((e.content.length-r.length)/4)),await n?.recordSnip({toolCallId:e.toolCallId,toolName:e.toolName,originalChars:e.content.length,retainedChars:r.length,reason:`microcompact`,createdAt:new Date().toISOString()})),s.push({...e,content:r})}return a===0?t:(r.push({type:`compaction`,reason:`Microcompacted ${a} stale tool results`,layer:`L4`,strategy:`microcompact_age`,estimatedTokensFreed:o,affectedEntries:a,snapshotVersion:2}),Xn({entries:s,maxInlineResults:4,maxChars:400,layer:`L4`,strategy:`microcompact`,contextStore:n,compactionEvents:r}))}async function Qn(e){let{entries:t,contextStore:n,compactionEvents:r,dataDir:i,sessionId:a}=e,o=t.reduce((e,t,n)=>(t.role===`user`&&e.push(n),e),[]);if(o.length<=2)return t;let s=o[o.length-2]??t.length,c=[],l=0,u=0,d=0;for(;l<t.length;){if(l>=s||t[l]?.role===`user`){c.push(t[l]),l+=1;continue}let e=l;for(;l<s&&t[l]?.role!==`user`;)l+=1;let r=t.slice(e,l),o=r.filter(er).filter(e=>qn.has(e.toolName)),f=o.reduce((e,t)=>e+t.content.length,0);if(o.length<3||f<1500){c.push(...r);continue}let p=$n(r,o),m=new Date().toISOString(),h={role:`assistant`,content:p,timestamp:m};c.push(h),u+=r.length,d+=Math.max(0,Math.floor(G(r)-G([h])));let g={id:Oe(),layer:`L5`,startEntryIndex:e,endEntryIndex:l-1,toolNames:[...new Set(o.map(e=>e.toolName))],summary:p,sourceCount:r.length,estimatedTokensFreed:d,createdAt:m};await n?.recordCollapse(g),i&&a&&await ir(i,a,g)}return u>0&&r.push({type:`compaction`,reason:`Collapsed ${u} historical tool activity entries`,layer:`L5`,strategy:`context_collapse`,estimatedTokensFreed:d,affectedEntries:u,snapshotVersion:2}),c}function $n(e,t){let n=[...new Set(t.map(e=>e.toolName))],r=t.slice(-3).map(e=>`- ${e.toolName}: ${(e.toolResultRef?.preview||e.content).slice(0,180).trim()}`).join(`
28
28
  `),i=e.filter(e=>e.role===`assistant`).map(e=>e.content.trim()).filter(Boolean).slice(-2).join(`
29
29
  `);return[`[context collapse] ${t.length} tool results across ${n.join(`, `)}`,i?`Assistant checkpoints:\n${i}`:``,r?`Recent tool findings:\n${r}`:``].filter(Boolean).join(`
30
30
 
31
- `)}function er(e){return e.role===`tool_result`}function tr(e){return e.reduce((e,t)=>e+(t.role===`user`?1:0),0)}function nr(e){for(let t=e.length-1;t>=0;--t)if(e[t]?.role===`compaction`)return t;return-1}function rr(e){return Math.max(256,e-Math.min(e/4,2e4))}async function ir(e,t,n){let r=w(e,t);await F.mkdir(I.dirname(r),{recursive:!0}),await F.appendFile(r,`${JSON.stringify(n)}\n`,`utf-8`)}async function ar(e){let t=await Ln(e);return{async getReusableRead(e,n,r){let i=await t.findReusableRead(e,n,r);return i?{reused:!0,lineCount:i.lineCount}:{reused:!1}},async rememberRead(e){await t.recordRead(e)},async invalidateReadPath(e){await t.invalidatePath(e)},persistToolResult(e){return t.persistToolResult(e)},manageHistory(e){return Jn({...e,contextStore:t})},getSnapshot:t.getSnapshot}}async function or(e){return e.contextManager?e.contextManager.manageHistory({entries:e.entries,modelInfo:e.modelInfo,contextWindowTokens:e.contextWindowTokens,llm:e.llm,historyLimit:e.historyLimit,compactionEnabled:e.compactionEnabled,signal:e.signal,hooks:e.hooks,hookCtx:e.hookCtx,dataDir:e.dataDir,sessionId:e.sessionId}):Jn({entries:e.entries,modelInfo:e.modelInfo,contextWindowTokens:e.contextWindowTokens,llm:e.llm,historyLimit:e.historyLimit,compactionEnabled:e.compactionEnabled,signal:e.signal,hooks:e.hooks,hookCtx:e.hookCtx,dataDir:e.dataDir,sessionId:e.sessionId})}var K=class extends Error{isHitlPause=!0;constructor(e,t,n,r=!1){super(`HITL_PAUSED`),this.request=e,this.checkpoint=t,this.toolContext=n,this.transparentPause=r,this.name=`HitlPauseSignal`}};function sr(e){return!!(e instanceof K||typeof e==`object`&&e&&`isHitlPause`in e&&e.isHitlPause===!0)}const cr=L.Object({command:L.String({description:`Shell command to execute`}),workdir:L.Optional(L.String({description:`Working directory (relative to workspace root)`})),env:L.Optional(L.Record(L.String(),L.String())),timeout:L.Optional(L.Number({description:`Timeout in seconds (default: 1800)`})),yieldMs:L.Optional(L.Number({description:`Wait this many milliseconds before returning running state`})),background:L.Optional(L.Boolean({description:`Return immediately with running session`}))});function lr(e,t,n){return Math.max(t,Math.min(n,e))}function ur(e){return typeof e!=`number`||!Number.isFinite(e)||e<=0?1800:Math.floor(e)}function dr(e){return typeof e!=`number`||!Number.isFinite(e)||e<0?1e4:lr(Math.floor(e),0,12e4)}function fr(e,t){if(!t?.trim())return e;let n=I.isAbsolute(t)?I.normalize(t):I.normalize(I.join(e,t));if(!n.startsWith(e+I.sep)&&n!==e)throw Error(`workdir escapes workspace: ${t}`);return n}function pr(e){let t=e.outputTail.trim();return`${t.length>0?`${t}\n\n`:``}Process is running in the background. sessionId=${e.sessionId}\nUse process(action="poll"|"log", sessionId) to continue.`}function mr(e){return gr({stdout:e.stdoutTail,stderr:e.stderrTail,exitCode:e.exitCode,backgroundInfo:``}).join(`
31
+ `)}function er(e){return e.role===`tool_result`}function tr(e){return e.reduce((e,t)=>e+(t.role===`user`?1:0),0)}function nr(e){for(let t=e.length-1;t>=0;--t)if(e[t]?.role===`compaction`)return t;return-1}function rr(e){let t=e.pendingUserMessage?.trim()?G([{role:`user`,content:e.pendingUserMessage,timestamp:new Date(0).toISOString()}]):0;if(!e.checkpoint){let n=G(e.workingEntries)+t;return{projectedInputTokens:n,estimatedIncrementTokens:n}}let n=G(e.entries.slice(Math.max(0,e.checkpoint.coveredTranscriptEntryCount)).filter(e=>e.role!==`compaction`))+t;return{projectedInputTokens:e.checkpoint.inputTokens+n,estimatedIncrementTokens:n}}async function ir(e,t,n){let r=w(e,t);await I.mkdir(L.dirname(r),{recursive:!0}),await I.appendFile(r,`${JSON.stringify(n)}\n`,`utf-8`)}async function ar(e){let t=await In(e);return{async getReusableRead(e,n,r){let i=await t.findReusableRead(e,n,r);return i?{reused:!0,lineCount:i.lineCount}:{reused:!1}},async rememberRead(e){await t.recordRead(e)},async invalidateReadPath(e){await t.invalidatePath(e)},persistToolResult(e){return t.persistToolResult(e)},async recordModelUsage(e){await t.recordModelUsage({version:1,model:e.model,inputTokens:e.inputTokens,outputTokens:e.outputTokens,totalTokens:e.totalTokens,coveredTranscriptEntryCount:e.coveredTranscriptEntryCount,recordedAt:new Date().toISOString()})},manageHistory(e){return Jn({...e,contextStore:t})},getSnapshot:t.getSnapshot}}async function or(e){return e.contextManager?e.contextManager.manageHistory({entries:e.entries,modelInfo:e.modelInfo,contextWindowTokens:e.contextWindowTokens,llm:e.llm,historyLimit:e.historyLimit,compactionEnabled:e.compactionEnabled,pendingUserMessage:e.pendingUserMessage,signal:e.signal,hooks:e.hooks,hookCtx:e.hookCtx,dataDir:e.dataDir,sessionId:e.sessionId}):Jn({entries:e.entries,modelInfo:e.modelInfo,contextWindowTokens:e.contextWindowTokens,llm:e.llm,historyLimit:e.historyLimit,compactionEnabled:e.compactionEnabled,pendingUserMessage:e.pendingUserMessage,signal:e.signal,hooks:e.hooks,hookCtx:e.hookCtx,dataDir:e.dataDir,sessionId:e.sessionId})}var sr=class extends Error{isHitlPause=!0;constructor(e,t,n,r=!1){super(`HITL_PAUSED`),this.request=e,this.checkpoint=t,this.toolContext=n,this.transparentPause=r,this.name=`HitlPauseSignal`}};function q(e){return!!(e instanceof sr||typeof e==`object`&&e&&`isHitlPause`in e&&e.isHitlPause===!0)}const cr=R.Object({command:R.String({description:`Shell command to execute`}),workdir:R.Optional(R.String({description:`Working directory (relative to workspace root)`})),env:R.Optional(R.Record(R.String(),R.String())),timeout:R.Optional(R.Number({description:`Timeout in seconds (default: 1800)`})),yieldMs:R.Optional(R.Number({description:`Wait this many milliseconds before returning running state`})),background:R.Optional(R.Boolean({description:`Return immediately with running session`}))});function lr(e,t,n){return Math.max(t,Math.min(n,e))}function ur(e){return typeof e!=`number`||!Number.isFinite(e)||e<=0?1800:Math.floor(e)}function dr(e){return typeof e!=`number`||!Number.isFinite(e)||e<0?1e4:lr(Math.floor(e),0,12e4)}function fr(e,t){if(!t?.trim())return e;let n=L.isAbsolute(t)?L.normalize(t):L.normalize(L.join(e,t));if(!n.startsWith(e+L.sep)&&n!==e)throw Error(`workdir escapes workspace: ${t}`);return n}function pr(e){let t=e.outputTail.trim();return`${t.length>0?`${t}\n\n`:``}Process is running in the background. sessionId=${e.sessionId}\nUse process(action="poll"|"log", sessionId) to continue.`}function mr(e){return gr({stdout:e.stdoutTail,stderr:e.stderrTail,exitCode:e.exitCode,backgroundInfo:``}).join(`
32
32
  `)}function hr(e){return e.replace(/^(\s*\n)+/,``).trimEnd()}function gr(e){let t=hr(e.stdout),n=e.stderr.trim();if(e.exitCode!==void 0&&e.exitCode!==0){let t=`Exit code: ${e.exitCode===null?`null`:e.exitCode}`;n=n.length>0?`${n}\n${t}`:t}return[t.length>0?t:`(no output)`,n,e.backgroundInfo?.trim()||``].filter(e=>e.length>0)}function _r(e){return{name:`exec`,label:`Exec`,description:`Execute shell commands with optional background continuation. Use process tool to poll logs and status.`,parameters:cr,async execute(t,n,r){if(!n.command?.trim())return{content:[{type:`text`,text:`Error: command is required.`}],details:{status:`failed`}};let i;try{i=fr(e.workspaceDir,n.workdir)}catch(e){return{content:[{type:`text`,text:`Error: ${e instanceof Error?e.message:String(e)}`}],details:{status:`failed`}}}let a=ur(n.timeout),o=e.registry.start({command:n.command,cwd:i,env:n.env,timeoutSec:a,scopeKey:e.scopeKey}),s=n.background===!0,c=typeof n.yieldMs==`number`&&Number.isFinite(n.yieldMs),l=o,u;try{if(!s&&r&&(u=()=>{e.registry.terminate(o.sessionId,e.scopeKey)},r.aborted?u():r.addEventListener(`abort`,u,{once:!0})),!s&&!c){let t=await e.registry.wait(o.sessionId,e.scopeKey,void 0);t&&(l=t)}else if(!s){let t=await e.registry.wait(o.sessionId,e.scopeKey,dr(n.yieldMs));t&&(l=t)}}finally{r&&u&&r.removeEventListener(`abort`,u)}if(l.status===`running`)return{content:[{type:`text`,text:pr(l)}],details:{status:`running`,sessionId:l.sessionId,command:l.command,cwd:l.cwd,pid:l.pid}};let d=e.registry.readOutput(l.sessionId,e.scopeKey),f=d?gr({stdout:d.stdout,stderr:d.stderr,exitCode:l.exitCode,backgroundInfo:``}):[mr(l)],p=hr(d?.stdout??l.stdoutTail),m=await e.contextManager?.persistToolResult({toolCallId:t,toolName:`exec`,content:p.length>0?p:`(no output)`});return{content:[{type:`text`,text:[m?.content??(p.length>0?p:`(no output)`),...f.slice(1)].join(`
33
- `)}],details:{status:l.status,sessionId:l.sessionId,command:l.command,cwd:l.cwd,exitCode:l.exitCode,exitSignal:l.exitSignal,toolResultRef:m?.reference}}}}}const vr=L.Object({action:L.String({description:`Process action: list | poll | log | kill`}),sessionId:L.Optional(L.String({description:`Session id for non-list actions`})),offset:L.Optional(L.Number({description:`Log line offset (0-based)`})),limit:L.Optional(L.Number({description:`Maximum lines to return`})),timeout:L.Optional(L.Number({description:`Poll wait time in milliseconds`}))});function yr(e){return typeof e!=`number`||!Number.isFinite(e)||e<0?0:Math.max(0,Math.min(12e4,Math.floor(e)))}function br(e){return{content:[{type:`text`,text:e}],details:{status:`failed`}}}function xr(e){return{name:`process`,label:`Process`,description:`Manage background exec sessions: list, poll, log, kill.`,parameters:vr,async execute(t,n){let r=n.action?.trim().toLowerCase();if(r===`list`){let t=e.registry.list(e.scopeKey);return{content:[{type:`text`,text:t.length===0?`No running or recent sessions.`:t.map(e=>{let t=(e.endedAt??Date.now())-e.startedAt;return`${e.sessionId} ${e.status.padEnd(9)} ${t}ms :: ${e.command}`}).join(`
34
- `)}],details:{status:`completed`,sessions:t}}}if(!n.sessionId?.trim())return br(`sessionId is required for this action.`);let i=n.sessionId.trim();if(r===`poll`){let t=await e.registry.wait(i,e.scopeKey,yr(n.timeout));return t?{content:[{type:`text`,text:t.status===`running`?`Session ${i} is still running.`:`Session ${i} finished with status=${t.status}, exitCode=${t.exitCode??`null`}.`}],details:{status:t.status,sessionId:i,exitCode:t.exitCode,exitSignal:t.exitSignal,aggregated:t.status!==`running`}}:br(`No session found for ${i}`)}if(r===`log`){let t=e.registry.readLog({sessionId:i,scopeKey:e.scopeKey,offset:n.offset,limit:n.limit});return t?{content:[{type:`text`,text:t.text.trim().length>0?t.text:`(no output)`}],details:{status:t.status,sessionId:i,totalLines:t.totalLines,totalChars:t.totalChars,truncated:t.truncated,exitCode:t.exitCode,exitSignal:t.exitSignal}}:br(`No session found for ${i}`)}if(r===`kill`){let t=await e.registry.terminate(i,e.scopeKey);return t?{content:[{type:`text`,text:t.status===`running`?`Termination signal sent to ${i}.`:`Session ${i} terminated with status=${t.status}.`}],details:{status:t.status,sessionId:i,exitCode:t.exitCode,exitSignal:t.exitSignal}}:br(`No session found for ${i}`)}return br(`Unsupported action: ${n.action}`)}}}const Sr=2e5;function Cr(e,t=4e3){return e?e.length>t?e.slice(-t):e:``}function wr(e,t){let n=e+t;return n.length<=Sr?{text:n,truncated:!1}:{text:n.slice(-Sr),truncated:!0}}function Tr(e,t,n){if(n.length===0)return;let r=n.toString(`utf-8`),i=wr(e.output,r);e.output=i.text;let a=wr(e[t],r);e[t]=a.text,(i.truncated||a.truncated)&&(e.outputTruncated=!0)}function q(e){return{sessionId:e.sessionId,scopeKey:e.scopeKey,command:e.command,cwd:e.cwd,pid:typeof e.child.pid==`number`?e.child.pid:void 0,startedAt:e.startedAt,endedAt:e.endedAt,status:e.status,exitCode:e.exitCode,exitSignal:e.exitSignal,outputTail:Cr(e.output),stdoutTail:Cr(e.stdout),stderrTail:Cr(e.stderr),outputTruncated:e.outputTruncated}}function J(e,t){return t?e.scopeKey===t:!0}function Er(e,t){return typeof e!=`number`||!Number.isFinite(e)||e<=0?t:Math.floor(e)}function Dr(e){return e?e.split(/\r?\n/):[]}function Or(e){let t=Dr(e.record.output),n=e.offset===void 0&&e.limit===void 0,r=Math.max(0,(e.offset??0)|0),i=Er(e.limit,n?200:Math.max(1,t.length-r)),a=(n&&t.length>200?t.slice(t.length-200):t.slice(r,r+i)).join(`
35
- `);return{sessionId:e.record.sessionId,status:e.record.status,text:a,totalLines:t.length,totalChars:e.record.output.length,truncated:e.record.outputTruncated,exitCode:e.record.exitCode,exitSignal:e.record.exitSignal}}function kr(e){e.timeoutTimer&&=(clearTimeout(e.timeoutTimer),void 0),e.killTimer&&=(clearTimeout(e.killTimer),void 0),e.resolveDone()}function Ar(){let e=new Map,t=new Map,n=n=>{if(e.delete(n.sessionId),t.set(n.sessionId,n),t.size<=100)return;let r=Array.from(t.values()).sort((e,t)=>(e.endedAt??2**53-1)-(t.endedAt??2**53-1));for(;r.length>100;){let e=r.shift();if(!e)break;t.delete(e.sessionId)}},r=n=>e.get(n)??t.get(n)??null,i=(e,t)=>{e.endedAt===void 0&&(t?.(),e.endedAt=Date.now(),n(e),kr(e))};return{start(t){let n=je(`bash`,[`-lc`,t.command],{cwd:t.cwd,env:{...process.env,...t.env??{}},stdio:[`pipe`,`pipe`,`pipe`]}),r=()=>{},a=new Promise(e=>{r=e}),o={sessionId:z(),scopeKey:t.scopeKey,command:t.command,cwd:t.cwd,startedAt:Date.now(),child:n,status:`running`,output:``,stdout:``,stderr:``,outputTruncated:!1,donePromise:a,resolveDone:r};e.set(o.sessionId,o),n.stdout.on(`data`,e=>Tr(o,`stdout`,e)),n.stderr.on(`data`,e=>Tr(o,`stderr`,e));let s=Er(t.timeoutSec,1800);return o.timeoutTimer=setTimeout(()=>{o.status===`running`&&(o.status=`timeout`,Tr(o,`stderr`,Buffer.from(`\n[Timed out after ${s}s]\n`)),o.child.kill(`SIGTERM`),o.killTimer=setTimeout(()=>{(o.status===`running`||o.status===`timeout`)&&o.child.kill(`SIGKILL`)},1e3))},s*1e3),n.on(`error`,e=>{i(o,()=>{o.status===`running`&&(o.status=`failed`),Tr(o,`stderr`,Buffer.from(`\n[Process error: ${e.message}]\n`))})}),n.on(`close`,(e,t)=>{i(o,()=>{o.exitCode=e,o.exitSignal=t,o.status===`running`?o.status=e===0?`completed`:`failed`:o.status===`killed`&&e===0&&(o.status=`completed`)})}),q(o)},get(e,t){let n=r(e);return!n||!J(n,t)?null:q(n)},list(n){return[...e.values(),...t.values()].filter(e=>J(e,n)).sort((e,t)=>t.startedAt-e.startedAt).map(e=>q(e))},async wait(e,t,n){let i=r(e);if(!i||!J(i,t))return null;if(i.status!==`running`)return q(i);typeof n==`number`&&Number.isFinite(n)&&n>=0?await Promise.race([i.donePromise,new Promise(e=>{setTimeout(e,n)})]):await i.donePromise;let a=r(e);return!a||!J(a,t)?null:q(a)},readLog(e){let t=r(e.sessionId);return!t||!J(t,e.scopeKey)?null:Or({record:t,offset:e.offset,limit:e.limit})},readOutput(e,t){let n=r(e);return!n||!J(n,t)?null:{sessionId:n.sessionId,status:n.status,stdout:n.stdout,stderr:n.stderr,combined:n.output,truncated:n.outputTruncated,exitCode:n.exitCode,exitSignal:n.exitSignal}},async terminate(e,t){let n=r(e);if(!n||!J(n,t))return null;if(n.status!==`running`)return q(n);n.status=`killed`,n.child.kill(`SIGTERM`),n.killTimer=setTimeout(()=>{(n.status===`running`||n.status===`killed`)&&n.child.kill(`SIGKILL`)},1e3),await Promise.race([n.donePromise,new Promise(e=>{setTimeout(e,1500)})]);let i=r(e);return i?q(i):null}}}function jr(e){return _r({workspaceDir:e,registry:Ar(),scopeKey:e})}const Mr=5*1024*1024,Nr=2e3;function Pr(e,t){return I.isAbsolute(e)?I.normalize(e):I.normalize(I.join(t,e))}const Fr=L.Object({path:L.String({description:`File path (relative to workspace or absolute)`}),offset:L.Optional(L.Number({description:`Line offset (1-based, default: 1)`})),limit:L.Optional(L.Number({description:`Maximum lines to read (default: 2000)`}))});function Ir(e,t){return{name:`read_file`,label:`Read File`,description:`Read the contents of a file`,parameters:Fr,async execute(n,r){let i;try{i=Pr(r.path,e)}catch(e){return{content:[{type:`text`,text:`Error: ${e instanceof Error?e.message:String(e)}`}],details:{content:``,lines:0,truncated:!1}}}let a=await t?.getReusableRead(i,r.offset,r.limit);if(a?.reused)return{content:[{type:`text`,text:`[file unchanged] ${r.path}`}],details:{content:``,lines:a.lineCount??0,truncated:!1,deduplicated:!0}};let o;try{o=await F.readFile(i)}catch(e){return{content:[{type:`text`,text:`Error: ${e.code===`ENOENT`?`File not found: ${r.path}`:String(e)}`}],details:{content:``,lines:0,truncated:!1}}}let s=o.subarray(0,Math.min(o.length,4096));if(await Me(s,s.length))return{content:[{type:`text`,text:`Error: read_file only supports text files. ${r.path} appears to be binary; use another tool or install an appropriate skill to handle it.`}],details:{content:``,lines:0,truncated:!1}};if(o.length>Mr){let e=o.slice(0,Mr).toString(`utf-8`);return{content:[{type:`text`,text:`${e}\n[...file truncated at ${Mr} bytes]`}],details:{content:e,lines:0,truncated:!0}}}let c=o.toString(`utf-8`).split(`
33
+ `)}],details:{status:l.status,sessionId:l.sessionId,command:l.command,cwd:l.cwd,exitCode:l.exitCode,exitSignal:l.exitSignal,toolResultRef:m?.reference}}}}}const vr=R.Object({action:R.String({description:`Process action: list | poll | log | kill`}),sessionId:R.Optional(R.String({description:`Session id for non-list actions`})),offset:R.Optional(R.Number({description:`Log line offset (0-based)`})),limit:R.Optional(R.Number({description:`Maximum lines to return`})),timeout:R.Optional(R.Number({description:`Poll wait time in milliseconds`}))});function yr(e){return typeof e!=`number`||!Number.isFinite(e)||e<0?0:Math.max(0,Math.min(12e4,Math.floor(e)))}function br(e){return{content:[{type:`text`,text:e}],details:{status:`failed`}}}function xr(e){return{name:`process`,label:`Process`,description:`Manage background exec sessions: list, poll, log, kill.`,parameters:vr,async execute(t,n){let r=n.action?.trim().toLowerCase();if(r===`list`){let t=e.registry.list(e.scopeKey);return{content:[{type:`text`,text:t.length===0?`No running or recent sessions.`:t.map(e=>{let t=(e.endedAt??Date.now())-e.startedAt;return`${e.sessionId} ${e.status.padEnd(9)} ${t}ms :: ${e.command}`}).join(`
34
+ `)}],details:{status:`completed`,sessions:t}}}if(!n.sessionId?.trim())return br(`sessionId is required for this action.`);let i=n.sessionId.trim();if(r===`poll`){let t=await e.registry.wait(i,e.scopeKey,yr(n.timeout));return t?{content:[{type:`text`,text:t.status===`running`?`Session ${i} is still running.`:`Session ${i} finished with status=${t.status}, exitCode=${t.exitCode??`null`}.`}],details:{status:t.status,sessionId:i,exitCode:t.exitCode,exitSignal:t.exitSignal,aggregated:t.status!==`running`}}:br(`No session found for ${i}`)}if(r===`log`){let t=e.registry.readLog({sessionId:i,scopeKey:e.scopeKey,offset:n.offset,limit:n.limit});return t?{content:[{type:`text`,text:t.text.trim().length>0?t.text:`(no output)`}],details:{status:t.status,sessionId:i,totalLines:t.totalLines,totalChars:t.totalChars,truncated:t.truncated,exitCode:t.exitCode,exitSignal:t.exitSignal}}:br(`No session found for ${i}`)}if(r===`kill`){let t=await e.registry.terminate(i,e.scopeKey);return t?{content:[{type:`text`,text:t.status===`running`?`Termination signal sent to ${i}.`:`Session ${i} terminated with status=${t.status}.`}],details:{status:t.status,sessionId:i,exitCode:t.exitCode,exitSignal:t.exitSignal}}:br(`No session found for ${i}`)}return br(`Unsupported action: ${n.action}`)}}}const Sr=2e5;function Cr(e,t=4e3){return e?e.length>t?e.slice(-t):e:``}function wr(e,t){let n=e+t;return n.length<=Sr?{text:n,truncated:!1}:{text:n.slice(-Sr),truncated:!0}}function Tr(e,t,n){if(n.length===0)return;let r=n.toString(`utf-8`),i=wr(e.output,r);e.output=i.text;let a=wr(e[t],r);e[t]=a.text,(i.truncated||a.truncated)&&(e.outputTruncated=!0)}function J(e){return{sessionId:e.sessionId,scopeKey:e.scopeKey,command:e.command,cwd:e.cwd,pid:typeof e.child.pid==`number`?e.child.pid:void 0,startedAt:e.startedAt,endedAt:e.endedAt,status:e.status,exitCode:e.exitCode,exitSignal:e.exitSignal,outputTail:Cr(e.output),stdoutTail:Cr(e.stdout),stderrTail:Cr(e.stderr),outputTruncated:e.outputTruncated}}function Y(e,t){return t?e.scopeKey===t:!0}function Er(e,t){return typeof e!=`number`||!Number.isFinite(e)||e<=0?t:Math.floor(e)}function Dr(e){return e?e.split(/\r?\n/):[]}function Or(e){let t=Dr(e.record.output),n=e.offset===void 0&&e.limit===void 0,r=Math.max(0,(e.offset??0)|0),i=Er(e.limit,n?200:Math.max(1,t.length-r)),a=(n&&t.length>200?t.slice(t.length-200):t.slice(r,r+i)).join(`
35
+ `);return{sessionId:e.record.sessionId,status:e.record.status,text:a,totalLines:t.length,totalChars:e.record.output.length,truncated:e.record.outputTruncated,exitCode:e.record.exitCode,exitSignal:e.record.exitSignal}}function kr(e){e.timeoutTimer&&=(clearTimeout(e.timeoutTimer),void 0),e.killTimer&&=(clearTimeout(e.killTimer),void 0),e.resolveDone()}function Ar(){let e=new Map,t=new Map,n=n=>{if(e.delete(n.sessionId),t.set(n.sessionId,n),t.size<=100)return;let r=Array.from(t.values()).sort((e,t)=>(e.endedAt??2**53-1)-(t.endedAt??2**53-1));for(;r.length>100;){let e=r.shift();if(!e)break;t.delete(e.sessionId)}},r=n=>e.get(n)??t.get(n)??null,i=(e,t)=>{e.endedAt===void 0&&(t?.(),e.endedAt=Date.now(),n(e),kr(e))};return{start(t){let n=je(`bash`,[`-lc`,t.command],{cwd:t.cwd,env:{...process.env,...t.env??{}},stdio:[`pipe`,`pipe`,`pipe`]}),r=()=>{},a=new Promise(e=>{r=e}),o={sessionId:Oe(),scopeKey:t.scopeKey,command:t.command,cwd:t.cwd,startedAt:Date.now(),child:n,status:`running`,output:``,stdout:``,stderr:``,outputTruncated:!1,donePromise:a,resolveDone:r};e.set(o.sessionId,o),n.stdout.on(`data`,e=>Tr(o,`stdout`,e)),n.stderr.on(`data`,e=>Tr(o,`stderr`,e));let s=Er(t.timeoutSec,1800);return o.timeoutTimer=setTimeout(()=>{o.status===`running`&&(o.status=`timeout`,Tr(o,`stderr`,Buffer.from(`\n[Timed out after ${s}s]\n`)),o.child.kill(`SIGTERM`),o.killTimer=setTimeout(()=>{(o.status===`running`||o.status===`timeout`)&&o.child.kill(`SIGKILL`)},1e3))},s*1e3),n.on(`error`,e=>{i(o,()=>{o.status===`running`&&(o.status=`failed`),Tr(o,`stderr`,Buffer.from(`\n[Process error: ${e.message}]\n`))})}),n.on(`close`,(e,t)=>{i(o,()=>{o.exitCode=e,o.exitSignal=t,o.status===`running`?o.status=e===0?`completed`:`failed`:o.status===`killed`&&e===0&&(o.status=`completed`)})}),J(o)},get(e,t){let n=r(e);return!n||!Y(n,t)?null:J(n)},list(n){return[...e.values(),...t.values()].filter(e=>Y(e,n)).sort((e,t)=>t.startedAt-e.startedAt).map(e=>J(e))},async wait(e,t,n){let i=r(e);if(!i||!Y(i,t))return null;if(i.status!==`running`)return J(i);typeof n==`number`&&Number.isFinite(n)&&n>=0?await Promise.race([i.donePromise,new Promise(e=>{setTimeout(e,n)})]):await i.donePromise;let a=r(e);return!a||!Y(a,t)?null:J(a)},readLog(e){let t=r(e.sessionId);return!t||!Y(t,e.scopeKey)?null:Or({record:t,offset:e.offset,limit:e.limit})},readOutput(e,t){let n=r(e);return!n||!Y(n,t)?null:{sessionId:n.sessionId,status:n.status,stdout:n.stdout,stderr:n.stderr,combined:n.output,truncated:n.outputTruncated,exitCode:n.exitCode,exitSignal:n.exitSignal}},async terminate(e,t){let n=r(e);if(!n||!Y(n,t))return null;if(n.status!==`running`)return J(n);n.status=`killed`,n.child.kill(`SIGTERM`),n.killTimer=setTimeout(()=>{(n.status===`running`||n.status===`killed`)&&n.child.kill(`SIGKILL`)},1e3),await Promise.race([n.donePromise,new Promise(e=>{setTimeout(e,1500)})]);let i=r(e);return i?J(i):null}}}function jr(e){return _r({workspaceDir:e,registry:Ar(),scopeKey:e})}const Mr=5*1024*1024,Nr=2e3;function Pr(e,t){return L.isAbsolute(e)?L.normalize(e):L.normalize(L.join(t,e))}const Fr=R.Object({path:R.String({description:`File path (relative to workspace or absolute)`}),offset:R.Optional(R.Number({description:`Line offset (1-based, default: 1)`})),limit:R.Optional(R.Number({description:`Maximum lines to read (default: 2000)`}))});function Ir(e,t){return{name:`read_file`,label:`Read File`,description:`Read the contents of a file`,parameters:Fr,async execute(n,r){let i;try{i=Pr(r.path,e)}catch(e){return{content:[{type:`text`,text:`Error: ${e instanceof Error?e.message:String(e)}`}],details:{content:``,lines:0,truncated:!1}}}let a=await t?.getReusableRead(i,r.offset,r.limit);if(a?.reused)return{content:[{type:`text`,text:`[file unchanged] ${r.path}`}],details:{content:``,lines:a.lineCount??0,truncated:!1,deduplicated:!0}};let o;try{o=await I.readFile(i)}catch(e){return{content:[{type:`text`,text:`Error: ${e.code===`ENOENT`?`File not found: ${r.path}`:String(e)}`}],details:{content:``,lines:0,truncated:!1}}}let s=o.subarray(0,Math.min(o.length,4096));if(await Me(s,s.length))return{content:[{type:`text`,text:`Error: read_file only supports text files. ${r.path} appears to be binary; use another tool or install an appropriate skill to handle it.`}],details:{content:``,lines:0,truncated:!1}};if(o.length>Mr){let e=o.slice(0,Mr).toString(`utf-8`);return{content:[{type:`text`,text:`${e}\n[...file truncated at ${Mr} bytes]`}],details:{content:e,lines:0,truncated:!0}}}let c=o.toString(`utf-8`).split(`
36
36
  `),l=Math.max(1,r.offset??1),u=Math.min(Nr,r.limit??Nr),d=c.slice(l-1,l-1+u),f=d.length<c.length-(l-1),p=d.map((e,t)=>`${(l+t).toString().padStart(4)} ${e}`).join(`
37
37
  `),m=f?`\n[...${c.length-(l-1+d.length)} more lines]`:``;return await t?.rememberRead({path:i,content:d.join(`
38
38
  `),lineCount:d.length,offset:r.offset,limit:r.limit}),{content:[{type:`text`,text:p+m}],details:{content:d.join(`
39
- `),lines:d.length,truncated:f}}}}}const Lr=L.Object({path:L.String({description:`File path (relative to workspace or absolute)`}),content:L.String({description:`File content to write`})});function Rr(e,t){return{name:`write_file`,label:`Write File`,description:`Create or overwrite a file with the given content`,parameters:Lr,async execute(n,r){let i;try{i=Pr(r.path,e)}catch(e){return{content:[{type:`text`,text:`Error: ${e instanceof Error?e.message:String(e)}`}],details:{path:r.path}}}try{await F.mkdir(I.dirname(i),{recursive:!0}),await F.writeFile(i,r.content,`utf-8`),await t?.invalidateReadPath(i)}catch(e){return{content:[{type:`text`,text:`Error writing file: ${e instanceof Error?e.message:String(e)}`}],details:{path:i}}}return{content:[{type:`text`,text:`File written: ${r.path}`}],details:{path:i}}}}}const zr=L.Object({path:L.String({description:`File path (relative to workspace or absolute)`}),old_string:L.String({description:`Exact text to replace`}),new_string:L.String({description:`Replacement text`})});function Br(e,t){return{name:`edit_file`,label:`Edit File`,description:`Replace the first occurrence of old_string with new_string in a file`,parameters:zr,async execute(n,r){let i;try{i=Pr(r.path,e)}catch(e){return{content:[{type:`text`,text:`Error: ${e instanceof Error?e.message:String(e)}`}],details:{path:r.path,occurrences:0}}}let a;try{a=await F.readFile(i,`utf-8`)}catch(e){return{content:[{type:`text`,text:`Error: ${e.code===`ENOENT`?`File not found: ${r.path}`:String(e)}`}],details:{path:i,occurrences:0}}}if(!a.includes(r.old_string))return{content:[{type:`text`,text:`Error: old_string not found in ${r.path}`}],details:{path:i,occurrences:0}};let o=a.replace(r.old_string,r.new_string);return await F.writeFile(i,o,`utf-8`),await t?.invalidateReadPath(i),{content:[{type:`text`,text:`File edited: ${r.path}`}],details:{path:i,occurrences:1}}}}}const Vr=L.Object({path:L.Optional(L.String({description:`Directory path (default: workspace root)`}))});function Hr(e){return{name:`list_dir`,label:`List Directory`,description:`List the contents of a directory`,parameters:Vr,async execute(t,n){let r=n.path??`.`,i;try{i=Pr(r,e)}catch(e){return{content:[{type:`text`,text:`Error: ${e instanceof Error?e.message:String(e)}`}],details:{entries:[]}}}let a;try{a=(await F.readdir(i,{withFileTypes:!0})).map(e=>`${e.name}${e.isDirectory()?`/`:``}`)}catch(e){return{content:[{type:`text`,text:`Error: ${e instanceof Error?e.message:String(e)}`}],details:{entries:[]}}}return{content:[{type:`text`,text:a.join(`
40
- `)||`(empty directory)`}],details:{entries:a}}}}}const Ur=L.Object({input:L.String({description:`Patch content using the *** Begin Patch/End Patch format.`})});function Wr(e,t){let n=I.isAbsolute(e)?I.normalize(e):I.normalize(I.join(t,e));if(!n.startsWith(t+I.sep)&&n!==t)throw Error(`Path escapes workspace: ${e}`);return n}function Gr(e,t){let n=I.relative(t,e);return!n||n===``?I.basename(e):n.startsWith(`..`)||I.isAbsolute(n)?e:n}async function Kr(e){await F.mkdir(I.dirname(e),{recursive:!0})}function qr(e){let t=[`Success. Updated the following files:`];for(let n of e.added)t.push(`A ${n}`);for(let n of e.modified)t.push(`M ${n}`);for(let n of e.deleted)t.push(`D ${n}`);return t.join(`
41
- `)}function Jr(e,t={}){return{name:`apply_patch`,label:`apply_patch`,description:`Apply a patch to one or more files using the apply_patch format. The input should include *** Begin Patch and *** End Patch markers.`,parameters:Ur,async execute(t,n){try{let t=n.input?.trim();if(!t)return{content:[{type:`text`,text:`Error: Provide a patch input.`}],details:{summary:{added:[],modified:[],deleted:[]}}};let r=Xr(t);if(r.hunks.length===0)return{content:[{type:`text`,text:`Error: No files were modified.`}],details:{summary:{added:[],modified:[],deleted:[]}}};let i={added:[],modified:[],deleted:[]},a={added:new Set,modified:new Set,deleted:new Set};for(let t of r.hunks){if(t.kind===`add`){let n=Wr(t.path,e);await Kr(n),await F.writeFile(n,t.contents,`utf-8`),Yr(i,a,`added`,Gr(n,e));continue}if(t.kind===`delete`){let n=Wr(t.path,e);await F.rm(n,{force:!0,recursive:!1}),Yr(i,a,`deleted`,Gr(n,e));continue}let n=Wr(t.path,e),r=await ei(n,t.chunks);if(t.movePath){let o=Wr(t.movePath,e);await Kr(o),await F.writeFile(o,r,`utf-8`),await F.rm(n,{force:!0,recursive:!1}),Yr(i,a,`modified`,Gr(o,e))}else await F.writeFile(n,r,`utf-8`),Yr(i,a,`modified`,Gr(n,e))}return{content:[{type:`text`,text:qr(i)}],details:{summary:i}}}catch(e){if(sr(e))throw e;return{content:[{type:`text`,text:`Error: ${e instanceof Error?e.message:String(e)}`}],details:{summary:{added:[],modified:[],deleted:[]}}}}}}}function Yr(e,t,n,r){t[n].has(r)||(t[n].add(r),e[n].push(r))}function Xr(e){let t=e.trim();if(!t)throw Error(`Invalid patch: input is empty.`);let n=t.split(/\r?\n/);Zr(n);let r=[],i=n.slice(1,n.length-1),a=2;for(;i.length>0;){let{hunk:e,consumed:t}=Qr(i,a);r.push(e),a+=t,i=i.slice(t)}return{hunks:r}}function Zr(e){let t=e[0]?.trim(),n=e[e.length-1]?.trim();if(t!==`*** Begin Patch`)throw Error(`The first line of the patch must be '*** Begin Patch'`);if(n!==`*** End Patch`)throw Error(`The last line of the patch must be '*** End Patch'`)}function Qr(e,t){if(e.length===0)throw Error(`Invalid patch hunk at line ${t}: empty hunk`);let n=e[0].trim();if(n.startsWith(`*** Add File: `)){let t=n.slice(14),r=``,i=1;for(let t of e.slice(1))if(t.startsWith(`+`))r+=`${t.slice(1)}\n`,i+=1;else break;return{hunk:{kind:`add`,path:t,contents:r},consumed:i}}if(n.startsWith(`*** Delete File: `))return{hunk:{kind:`delete`,path:n.slice(17)},consumed:1};if(n.startsWith(`*** Update File: `)){let r=n.slice(17),i=e.slice(1),a=1,o,s=i[0]?.trim();s?.startsWith(`*** Move to: `)&&(o=s.slice(13),i=i.slice(1),a+=1);let c=[];for(;i.length>0;){if(i[0].trim()===``){i=i.slice(1),a+=1;continue}if(i[0].startsWith(`***`))break;let{chunk:e,consumed:n}=$r(i,t+a,c.length===0);c.push(e),i=i.slice(n),a+=n}if(c.length===0)throw Error(`Invalid patch hunk at line ${t}: Update file hunk for path '${r}' is empty`);return{hunk:{kind:`update`,path:r,movePath:o,chunks:c},consumed:a}}throw Error(`Invalid patch hunk at line ${t}: '${e[0]}' is not a valid hunk header.`)}function $r(e,t,n){if(e.length===0)throw Error(`Invalid patch hunk at line ${t}: Update hunk does not contain any lines`);let r,i=0;if(e[0]===`@@`)i=1;else if(e[0].startsWith(`@@ `))r=e[0].slice(3),i=1;else if(!n)throw Error(`Invalid patch hunk at line ${t}: Expected update hunk to start with a @@ context marker.`);if(i>=e.length)throw Error(`Invalid patch hunk at line ${t+1}: Update hunk does not contain any lines`);let a={changeContext:r,oldLines:[],newLines:[],isEndOfFile:!1},o=0;for(let n of e.slice(i)){if(n===`*** End of File`){if(o===0)throw Error(`Invalid patch hunk at line ${t+1}: Update hunk does not contain any lines`);a.isEndOfFile=!0,o+=1;break}let e=n[0];if(!e){a.oldLines.push(``),a.newLines.push(``),o+=1;continue}if(e===` `){let e=n.slice(1);a.oldLines.push(e),a.newLines.push(e),o+=1;continue}if(e===`+`){a.newLines.push(n.slice(1)),o+=1;continue}if(e===`-`){a.oldLines.push(n.slice(1)),o+=1;continue}if(o===0)throw Error(`Invalid patch hunk at line ${t+1}: Unexpected line found in update hunk.`);break}return{chunk:a,consumed:o+i}}async function ei(e,t){let n=(await F.readFile(e,`utf-8`).catch(t=>{throw Error(`Failed to read file to update ${e}: ${t}`)})).split(`
39
+ `),lines:d.length,truncated:f}}}}}const Lr=R.Object({path:R.String({description:`File path (relative to workspace or absolute)`}),content:R.String({description:`File content to write`})});function Rr(e,t){return{name:`write_file`,label:`Write File`,description:`Create or overwrite a file with the given content`,parameters:Lr,async execute(n,r){let i;try{i=Pr(r.path,e)}catch(e){return{content:[{type:`text`,text:`Error: ${e instanceof Error?e.message:String(e)}`}],details:{path:r.path}}}try{await I.mkdir(L.dirname(i),{recursive:!0}),await I.writeFile(i,r.content,`utf-8`),await t?.invalidateReadPath(i)}catch(e){return{content:[{type:`text`,text:`Error writing file: ${e instanceof Error?e.message:String(e)}`}],details:{path:i}}}return{content:[{type:`text`,text:`File written: ${r.path}`}],details:{path:i}}}}}const zr=R.Object({path:R.String({description:`File path (relative to workspace or absolute)`}),old_string:R.String({description:`Exact text to replace`}),new_string:R.String({description:`Replacement text`})});function Br(e,t){return{name:`edit_file`,label:`Edit File`,description:`Replace the first occurrence of old_string with new_string in a file`,parameters:zr,async execute(n,r){let i;try{i=Pr(r.path,e)}catch(e){return{content:[{type:`text`,text:`Error: ${e instanceof Error?e.message:String(e)}`}],details:{path:r.path,occurrences:0}}}let a;try{a=await I.readFile(i,`utf-8`)}catch(e){return{content:[{type:`text`,text:`Error: ${e.code===`ENOENT`?`File not found: ${r.path}`:String(e)}`}],details:{path:i,occurrences:0}}}if(!a.includes(r.old_string))return{content:[{type:`text`,text:`Error: old_string not found in ${r.path}`}],details:{path:i,occurrences:0}};let o=a.replace(r.old_string,r.new_string);return await I.writeFile(i,o,`utf-8`),await t?.invalidateReadPath(i),{content:[{type:`text`,text:`File edited: ${r.path}`}],details:{path:i,occurrences:1}}}}}const Vr=R.Object({path:R.Optional(R.String({description:`Directory path (default: workspace root)`}))});function Hr(e){return{name:`list_dir`,label:`List Directory`,description:`List the contents of a directory`,parameters:Vr,async execute(t,n){let r=n.path??`.`,i;try{i=Pr(r,e)}catch(e){return{content:[{type:`text`,text:`Error: ${e instanceof Error?e.message:String(e)}`}],details:{entries:[]}}}let a;try{a=(await I.readdir(i,{withFileTypes:!0})).map(e=>`${e.name}${e.isDirectory()?`/`:``}`)}catch(e){return{content:[{type:`text`,text:`Error: ${e instanceof Error?e.message:String(e)}`}],details:{entries:[]}}}return{content:[{type:`text`,text:a.join(`
40
+ `)||`(empty directory)`}],details:{entries:a}}}}}const Ur=R.Object({input:R.String({description:`Patch content using the *** Begin Patch/End Patch format.`})});function Wr(e,t){let n=L.isAbsolute(e)?L.normalize(e):L.normalize(L.join(t,e));if(!n.startsWith(t+L.sep)&&n!==t)throw Error(`Path escapes workspace: ${e}`);return n}function Gr(e,t){let n=L.relative(t,e);return!n||n===``?L.basename(e):n.startsWith(`..`)||L.isAbsolute(n)?e:n}async function Kr(e){await I.mkdir(L.dirname(e),{recursive:!0})}function qr(e){let t=[`Success. Updated the following files:`];for(let n of e.added)t.push(`A ${n}`);for(let n of e.modified)t.push(`M ${n}`);for(let n of e.deleted)t.push(`D ${n}`);return t.join(`
41
+ `)}function Jr(e,t={}){return{name:`apply_patch`,label:`apply_patch`,description:`Apply a patch to one or more files using the apply_patch format. The input should include *** Begin Patch and *** End Patch markers.`,parameters:Ur,async execute(t,n){try{let t=n.input?.trim();if(!t)return{content:[{type:`text`,text:`Error: Provide a patch input.`}],details:{summary:{added:[],modified:[],deleted:[]}}};let r=Xr(t);if(r.hunks.length===0)return{content:[{type:`text`,text:`Error: No files were modified.`}],details:{summary:{added:[],modified:[],deleted:[]}}};let i={added:[],modified:[],deleted:[]},a={added:new Set,modified:new Set,deleted:new Set};for(let t of r.hunks){if(t.kind===`add`){let n=Wr(t.path,e);await Kr(n),await I.writeFile(n,t.contents,`utf-8`),Yr(i,a,`added`,Gr(n,e));continue}if(t.kind===`delete`){let n=Wr(t.path,e);await I.rm(n,{force:!0,recursive:!1}),Yr(i,a,`deleted`,Gr(n,e));continue}let n=Wr(t.path,e),r=await ei(n,t.chunks);if(t.movePath){let o=Wr(t.movePath,e);await Kr(o),await I.writeFile(o,r,`utf-8`),await I.rm(n,{force:!0,recursive:!1}),Yr(i,a,`modified`,Gr(o,e))}else await I.writeFile(n,r,`utf-8`),Yr(i,a,`modified`,Gr(n,e))}return{content:[{type:`text`,text:qr(i)}],details:{summary:i}}}catch(e){if(q(e))throw e;return{content:[{type:`text`,text:`Error: ${e instanceof Error?e.message:String(e)}`}],details:{summary:{added:[],modified:[],deleted:[]}}}}}}}function Yr(e,t,n,r){t[n].has(r)||(t[n].add(r),e[n].push(r))}function Xr(e){let t=e.trim();if(!t)throw Error(`Invalid patch: input is empty.`);let n=t.split(/\r?\n/);Zr(n);let r=[],i=n.slice(1,n.length-1),a=2;for(;i.length>0;){let{hunk:e,consumed:t}=Qr(i,a);r.push(e),a+=t,i=i.slice(t)}return{hunks:r}}function Zr(e){let t=e[0]?.trim(),n=e[e.length-1]?.trim();if(t!==`*** Begin Patch`)throw Error(`The first line of the patch must be '*** Begin Patch'`);if(n!==`*** End Patch`)throw Error(`The last line of the patch must be '*** End Patch'`)}function Qr(e,t){if(e.length===0)throw Error(`Invalid patch hunk at line ${t}: empty hunk`);let n=e[0].trim();if(n.startsWith(`*** Add File: `)){let t=n.slice(14),r=``,i=1;for(let t of e.slice(1))if(t.startsWith(`+`))r+=`${t.slice(1)}\n`,i+=1;else break;return{hunk:{kind:`add`,path:t,contents:r},consumed:i}}if(n.startsWith(`*** Delete File: `))return{hunk:{kind:`delete`,path:n.slice(17)},consumed:1};if(n.startsWith(`*** Update File: `)){let r=n.slice(17),i=e.slice(1),a=1,o,s=i[0]?.trim();s?.startsWith(`*** Move to: `)&&(o=s.slice(13),i=i.slice(1),a+=1);let c=[];for(;i.length>0;){if(i[0].trim()===``){i=i.slice(1),a+=1;continue}if(i[0].startsWith(`***`))break;let{chunk:e,consumed:n}=$r(i,t+a,c.length===0);c.push(e),i=i.slice(n),a+=n}if(c.length===0)throw Error(`Invalid patch hunk at line ${t}: Update file hunk for path '${r}' is empty`);return{hunk:{kind:`update`,path:r,movePath:o,chunks:c},consumed:a}}throw Error(`Invalid patch hunk at line ${t}: '${e[0]}' is not a valid hunk header.`)}function $r(e,t,n){if(e.length===0)throw Error(`Invalid patch hunk at line ${t}: Update hunk does not contain any lines`);let r,i=0;if(e[0]===`@@`)i=1;else if(e[0].startsWith(`@@ `))r=e[0].slice(3),i=1;else if(!n)throw Error(`Invalid patch hunk at line ${t}: Expected update hunk to start with a @@ context marker.`);if(i>=e.length)throw Error(`Invalid patch hunk at line ${t+1}: Update hunk does not contain any lines`);let a={changeContext:r,oldLines:[],newLines:[],isEndOfFile:!1},o=0;for(let n of e.slice(i)){if(n===`*** End of File`){if(o===0)throw Error(`Invalid patch hunk at line ${t+1}: Update hunk does not contain any lines`);a.isEndOfFile=!0,o+=1;break}let e=n[0];if(!e){a.oldLines.push(``),a.newLines.push(``),o+=1;continue}if(e===` `){let e=n.slice(1);a.oldLines.push(e),a.newLines.push(e),o+=1;continue}if(e===`+`){a.newLines.push(n.slice(1)),o+=1;continue}if(e===`-`){a.oldLines.push(n.slice(1)),o+=1;continue}if(o===0)throw Error(`Invalid patch hunk at line ${t+1}: Unexpected line found in update hunk.`);break}return{chunk:a,consumed:o+i}}async function ei(e,t){let n=(await I.readFile(e,`utf-8`).catch(t=>{throw Error(`Failed to read file to update ${e}: ${t}`)})).split(`
42
42
  `);n.length>0&&n[n.length-1]===``&&n.pop();let r=ni(n,ti(n,e,t));return(r.length===0||r[r.length-1]!==``)&&(r=[...r,``]),r.join(`
43
43
  `)}function ti(e,t,n){let r=[],i=0;for(let a of n){if(a.changeContext){let n=ri(e,[a.changeContext],i,!1);if(n===null)throw Error(`Failed to find context '${a.changeContext}' in ${t}`);i=n+1}if(a.oldLines.length===0){let t=e.length>0&&e[e.length-1]===``?e.length-1:e.length;r.push([t,0,a.newLines]);continue}let n=a.oldLines,o=a.newLines,s=ri(e,n,i,a.isEndOfFile);if(s===null&&n[n.length-1]===``&&(n=n.slice(0,-1),o.length>0&&o[o.length-1]===``&&(o=o.slice(0,-1)),s=ri(e,n,i,a.isEndOfFile)),s===null)throw Error(`Failed to find expected lines in ${t}:\n${a.oldLines.join(`
44
- `)}`);r.push([s,n.length,o]),i=s+n.length}return r.sort((e,t)=>e[0]-t[0]),r}function ni(e,t){let n=[...e];for(let[e,r,i]of[...t].toReversed()){for(let t=0;t<r;t+=1)e<n.length&&n.splice(e,1);for(let t=0;t<i.length;t+=1)n.splice(e+t,0,i[t])}return n}function ri(e,t,n,r){if(t.length===0)return n;if(t.length>e.length)return null;let i=e.length-t.length,a=r&&e.length>=t.length?i:n;if(a>i)return null;for(let n=a;n<=i;n+=1)if(ii(e,t,n,e=>e))return n;for(let n=a;n<=i;n+=1)if(ii(e,t,n,e=>e.trimEnd()))return n;for(let n=a;n<=i;n+=1)if(ii(e,t,n,e=>e.trim()))return n;for(let n=a;n<=i;n+=1)if(ii(e,t,n,e=>ai(e.trim())))return n;return null}function ii(e,t,n,r){for(let i=0;i<t.length;i+=1)if(r(e[n+i])!==r(t[i]))return!1;return!0}function ai(e){return Array.from(e).map(e=>{switch(e){case`‐`:case`‑`:case`‒`:case`–`:case`—`:case`―`:case`−`:return`-`;case`‘`:case`’`:case`‚`:case`‛`:return`'`;case`“`:case`”`:case`„`:case`‟`:return`"`;case`\xA0`:case` `:case` `:case` `:case` `:case` `:case` `:case` `:case` `:case` `:case` `:case` `:case` `:return` `;default:return e}}).join(``)}const Y={clarify:{label:`澄清问题`,description:`当你需要更多信息才能继续时,向用户提出澄清问题。提供清晰的问题,并可选给出候选选项。任务会暂停,直到用户回复。`,title:`需要你补充信息`,placeholder:`请输入你的回复`},approval:{label:`请求授权`,description:"仅当用户或系统明确要求调用 `request_approval` 时使用。不要把它用于一般确认、澄清或推断式授权检查。说明要执行的动作,以及为什么必须显式授权。任务会暂停,直到用户同意或拒绝。",choices:{approve:{label:`同意`,description:`允许继续执行该操作`},deny:{label:`拒绝`,description:`不允许执行该操作`}},summary:{approved:`已授权。`,denied:`已拒绝。`,timeout:`由于超时,视为拒绝。`}},review:{label:`请求审阅`,description:`在继续之前,将草稿、文档或输出提交给用户审阅。包含需要审阅的内容,以及你希望获得的反馈类型。任务会暂停,直到用户完成审阅并回复。`,choices:{approve:{label:`通过`,description:`内容没有问题,继续执行`},revise:{label:`需要修改`,description:`提供反馈后再修改`},reject:{label:`拒绝`,description:`放弃当前草稿`}}}};function oi(e){return e.action===`timeout`?Y.approval.summary.timeout:e.action===`submit`&&(e.values?.selectedChoiceIds?.includes(`approve`)??!1)?Y.approval.summary.approved:Y.approval.summary.denied}function si(e){let t=e.values?.text??e.values?.selectedChoiceIds?.join(`, `)??``;return JSON.stringify({action:e.action,answer:t,values:e.values??{},submittedBy:e.submittedBy,submittedAt:e.submittedAt})}function ci(e){let t=(e.values?.selectedChoiceIds??[])[0]??e.action,n=e.values?.text??``;return JSON.stringify({action:e.action,verdict:t,feedback:n,values:e.values??{},submittedBy:e.submittedBy,submittedAt:e.submittedAt})}function li(e,t){let n=[];return n.push(`[HITL 恢复] 用户已响应 ${t} 请求(${e.requestId})。`),e.action===`cancel`?(n.push(`动作:用户取消了该请求。请确认取消并继续后续流程,不要执行原操作。`),n.join(`
45
- `)):e.action===`timeout`?(n.push(`动作:该请求在未收到用户响应的情况下超时。请按默认超时策略处理。`),n.join(`
46
- `)):(n.push(`动作:用户已提交结果。`),e.values?.selectedChoiceIds&&e.values.selectedChoiceIds.length>0&&n.push(`已选项:${e.values.selectedChoiceIds.join(`, `)}`),e.values?.text&&n.push(`用户文本:${e.values.text}`),e.values?.form&&n.push(`表单数据:${JSON.stringify(e.values.form)}`),n.join(`
47
- `))}const ui=L.Object({question:L.String({description:`The question to ask the user.`}),options:L.Optional(L.Array(L.String(),{description:`Optional list of choices for the user to select from.`})),allow_free_text:L.Optional(L.Boolean({description:`Whether to allow the user to type a free-text response in addition to choices. Defaults to true.`}))});function di(e,t){return{name:`clarify`,label:Y.clarify.label,description:Y.clarify.description,parameters:ui,async execute(n,r){if(t?.request.kind===`clarify`&&t.toolContext?.toolName===`clarify`&&t.toolContext.toolCallId===n)return{content:[{type:`text`,text:si(t.resolution)}],details:{paused:!1}};let i=z(),a=r.options&&r.options.length>0,o;throw o=a?{mode:`choice`,choices:r.options.map((e,t)=>({id:`option-${t}`,label:e})),allowFreeText:r.allow_free_text!==!1}:{mode:`text`,multiline:!0,placeholder:Y.clarify.placeholder},new K({requestId:i,sessionId:e,kind:`clarify`,title:Y.clarify.title,prompt:r.question,input:o,policy:{resumable:!0},createdAt:new Date().toISOString()},{turnId:n,phase:`before_tool`,resumeStrategy:`reenter_from_checkpoint`},{toolCallId:n,toolName:`clarify`,toolArgs:r})}}}function fi(e){return I.join(e,`.aimax`)}function pi(e){return I.join(fi(e),`MEMORY.md`)}async function mi(e,t,n){e.onMemoryChanged&&await Promise.resolve(e.onMemoryChanged(n)).catch(()=>{}),t&&await Promise.resolve(t(n)).catch(()=>{})}function hi(e,t){let n=fi(e),r=k({providerId:t?.providerId,pluginId:t?.pluginId,dataDir:e,memoryDir:n,sessionId:t?.sessionId});return r?r.provider:y({dataDir:e,memoryDir:n,sessionId:t?.sessionId})}async function gi(e){return C(fi(e))}async function _i(e){try{return await F.readFile(e,`utf-8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}}async function vi(e){return _i(pi(e))}async function yi(e,t,n){return await hi(e,n).search(t)}async function bi(e,t,n,r,i){try{return await hi(e,i).getLines(t,n,r)}catch{return null}}async function xi(e,t,n){let r=hi(e,n);await r.append(t),await mi(r,n?.onMemoryChanged,{reason:`append`,files:[`MEMORY.md`],source:`memory`,sessionId:n?.sessionId,providerId:n?.providerId??n?.pluginId,timestamp:new Date().toISOString()})}async function Si(e,t,n,r){let i=hi(e,r);await i.updateFile(t,n),await mi(i,r?.onMemoryChanged,{reason:`update`,files:[t],source:`memory`,sessionId:r?.sessionId,providerId:r?.providerId??r?.pluginId,timestamp:new Date().toISOString()})}async function Ci(e,t,n){let r=hi(e,n);await r.deleteFile(t),await mi(r,n?.onMemoryChanged,{reason:`delete`,files:[t],source:`memory`,sessionId:n?.sessionId,providerId:n?.providerId??n?.pluginId,timestamp:new Date().toISOString()})}const wi=L.Object({query:L.String({description:`Search query (case-insensitive substring match)`})});function Ti(e,t){return{name:`memory_search`,label:`Memory Search`,description:`Search memory files for relevant information`,parameters:wi,async execute(n,r){let i=(await yi(e,r.query,{providerId:t?.providerId,pluginId:t?.pluginId,sessionId:t?.sessionId})).map(e=>({file:e.path,start_line:e.startLine,end_line:e.endLine,score:Number(e.score.toFixed(4)),text:e.snippet,source:e.source,citation:e.citation}));return i.length===0?{content:[{type:`text`,text:`No results found for: ${r.query}`}],details:{matches:i}}:{content:[{type:`text`,text:i.map(e=>{let t=`${e.file}:${e.start_line}-${e.end_line} (${e.score}): ${e.text}`;return e.citation?`${t}\n${e.citation}`:t}).join(`
48
- `)}],details:{matches:i}}}}}const Ei=L.Object({file:L.String({description:`Memory file path`}),start_line:L.Number({description:`Start line number (1-based)`}),end_line:L.Number({description:`End line number (1-based)`})});function Di(e,t){return{name:`memory_get`,label:`Memory Get`,description:`Read specific lines from a memory file`,parameters:Ei,async execute(n,r){let i=await bi(e,r.file,r.start_line,r.end_line,{providerId:t?.providerId,pluginId:t?.pluginId,sessionId:t?.sessionId});return i===null?{content:[{type:`text`,text:`File not found: ${r.file}`}],details:{lines:null}}:{content:[{type:`text`,text:i.map((e,t)=>`${(r.start_line+t).toString().padStart(4)} ${e}`).join(`
49
- `)||`(empty)`}],details:{lines:i}}}}}const Oi=L.Object({content:L.String({description:`Content to append to MEMORY.md`})});function ki(e,t){return{name:`memory_append`,label:`Memory Append`,description:`Append new information to the MEMORY.md file`,parameters:Oi,async execute(n,r){try{return await xi(e,r.content,{providerId:t?.providerId,pluginId:t?.pluginId,sessionId:t?.sessionId,onMemoryChanged:t?.onMemoryChanged}),{content:[{type:`text`,text:`Memory updated.`}],details:{appended:!0}}}catch(e){return{content:[{type:`text`,text:`Error appending to memory: ${e instanceof Error?e.message:String(e)}`}],details:{appended:!1}}}}}}const Ai=L.Object({action:L.String({description:`A short description of the action that needs approval.`}),reason:L.String({description:`Why this action needs human approval.`}),details:L.Optional(L.String({description:`Additional details about the action (e.g. the command to execute).`}))});function ji(e){let t=e.action===`submit`&&(e.values?.selectedChoiceIds?.includes(`approve`)??!1);return JSON.stringify({summary:oi(e),action:e.action,approved:t,values:e.values??{},submittedBy:e.submittedBy,submittedAt:e.submittedAt,idempotencyKey:e.idempotencyKey})}function Mi(e,t){return{name:`request_approval`,label:Y.approval.label,description:Y.approval.description,parameters:Ai,async execute(n,r){if(t?.request.kind===`approval`&&t.toolContext?.toolName===`request_approval`&&t.toolContext.toolCallId===n&&t.resolution.action===`submit`)return{content:[{type:`text`,text:ji(t.resolution)}],details:{paused:!1,approved:t.resolution.values?.selectedChoiceIds?.includes(`approve`)??!1,resolution:t.resolution}};let i=z(),a;throw r.details&&(a={mimeType:`text/plain`,content:r.details}),new K({requestId:i,sessionId:e,kind:`approval`,title:r.action,prompt:r.reason,preview:a,input:{mode:`choice`,choices:[{id:`approve`,label:Y.approval.choices.approve.label,description:Y.approval.choices.approve.description},{id:`deny`,label:Y.approval.choices.deny.label,description:Y.approval.choices.deny.description}]},policy:{resumable:!0,defaultOnTimeout:`deny`},createdAt:new Date().toISOString()},{turnId:n,phase:`before_tool`,resumeStrategy:`reenter_from_checkpoint`},{toolCallId:n,toolName:`request_approval`,toolArgs:r})}}}const Ni=L.Object({title:L.String({description:`A short title for the review (e.g. 'Weekly Report Draft').`}),description:L.String({description:`What the user should review and what kind of feedback you need.`}),content:L.String({description:`The content to review (text, markdown, or JSON).`}),content_type:L.Optional(L.String({description:`MIME type: text/plain, application/json, or text/markdown. Defaults to text/markdown.`}))});function Pi(e,t){return{name:`request_review`,label:Y.review.label,description:Y.review.description,parameters:Ni,async execute(n,r){if(t?.request.kind===`review`&&t.toolContext?.toolName===`request_review`&&t.toolContext.toolCallId===n)return{content:[{type:`text`,text:ci(t.resolution)}],details:{paused:!1}};let i=z(),a={mimeType:r.content_type??`text/markdown`,content:r.content};throw new K({requestId:i,sessionId:e,kind:`review`,title:r.title,prompt:r.description,preview:a,input:{mode:`choice`,choices:[{id:`approve`,label:Y.review.choices.approve.label,description:Y.review.choices.approve.description},{id:`revise`,label:Y.review.choices.revise.label,description:Y.review.choices.revise.description},{id:`reject`,label:Y.review.choices.reject.label,description:Y.review.choices.reject.description}],allowFreeText:!0},policy:{resumable:!0},createdAt:new Date().toISOString()},{turnId:n,phase:`before_tool`,resumeStrategy:`reenter_from_checkpoint`},{toolCallId:n,toolName:`request_review`,toolArgs:r})}}}const Fi=L.Object({task:L.String({description:`The task description for the subagent to execute`}),label:L.Optional(L.String({description:`Optional short label to identify this subagent`}))});function Ii(e){let t=e.label?`"${e.label}"`:`task: ${e.task}`;return e.status===`done`?`[Subagent completed] ${t}\n\n${e.result??`(no output)`}`:e.status===`error`?`[Subagent failed] ${t}\n\nError: ${e.error??`unknown error`}`:`[Subagent killed] ${t}`}function Li(e,t,n,r,i,a,o,s,c){return{name:`sessions_spawn`,label:`Spawn Subagent`,description:`Use this tool only when the user or system instructions explicitly require using a subagent, delegation, or parallel agent execution. Do not use it for routine decomposition or inferred parallelism. Returns immediately with status=accepted; the subagent result will be delivered back automatically as a follow-up message — do not poll or sleep.`,parameters:Fi,async execute(l,u){let d=u.task.trim(),p=u.label?.trim();if(!d){let e={status:`error`,error:`task must not be empty`};return{content:[{type:`text`,text:JSON.stringify(e)}],details:e}}let m=e.checkSpawnAllowed(t,n+1);if(!m.allowed){let e={status:`forbidden`,error:m.reason};return{content:[{type:`text`,text:JSON.stringify(e)}],details:e}}let h=z(),g=new AbortController,_;try{_=await f(r,i,{storeName:s.sessionStoreName})}catch(e){let t={status:`error`,error:`Failed to create session: ${e instanceof Error?e.message:String(e)}`};return{content:[{type:`text`,text:JSON.stringify(t)}],details:t}}let v={runId:h,childSessionId:_,parentSessionId:t,task:d,label:p,depth:n+1,status:`running`,startedAt:Date.now(),abortController:g},y=c({dataDir:r,sessionId:_,message:d,channel:i,llm:a,...s,loopDetection:o,abortSignal:g.signal,subagentContext:{depth:n+1,parentSessionId:t}}).then(t=>{e.complete(h,t.text||t.error||`(no output)`)}).catch(t=>{let n=t instanceof Error?t.message:String(t);e.fail(h,n)});e.register(v,y);let b={status:`accepted`,childSessionId:_,runId:h,note:`The subagent result will be sent back automatically. Do not poll or re-spawn.`};return{content:[{type:`text`,text:JSON.stringify(b)}],details:b}}}}const Ri=L.Object({action:L.Union([`list`,`kill`].map(e=>L.Literal(e)),{description:`Action to perform: "list" to show subagents, "kill" to stop one or all`}),target:L.Optional(L.String({description:`For kill: a runId, label, or index from the list. Use "*" or "all" to kill every subagent.`}))});function zi(e){return e<1e3?`${e}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${Math.floor(e/6e4)}m${Math.floor(e%6e4/1e3)}s`}function Bi(e,t){let n=parseInt(t,10);return!isNaN(n)&&n>=1&&n<=e.length?e[n-1]:e.find(e=>e.runId.startsWith(t)||e.runId===t)||(e.find(e=>e.label&&e.label.toLowerCase()===t.toLowerCase())??null)}function Vi(e,t){return{name:`subagents`,label:`Subagents`,description:`List or kill subagents spawned by this session. Use list to check status, kill to stop one or all.`,parameters:Ri,async execute(n,r){let i=r.action,a=Date.now(),o=e.list(t);if(i===`list`){let e=o.map((e,t)=>({index:t+1,runId:e.runId,label:e.label??e.task.slice(0,40),task:e.task,status:e.status,depth:e.depth,runtimeMs:e.endedAt?e.endedAt-e.startedAt:a-e.startedAt})),t={action:`list`,runs:e,text:(e.length===0?[`(no subagents)`]:e.map(e=>`${e.index}. [${e.status}] ${e.label} (${zi(e.runtimeMs)})`)).join(`
50
- `)};return{content:[{type:`text`,text:JSON.stringify(t)}],details:t}}if(i===`kill`){let n=r.target?.trim();if(!n||n===`*`||n===`all`){let n=e.killAll(t),r={action:`kill`,killed:n,text:n>0?`Killed ${n} subagent(s).`:`No running subagents to kill.`};return{content:[{type:`text`,text:JSON.stringify(r)}],details:r}}let i=Bi(o,n);if(!i){let e={action:`kill`,killed:0,error:`No subagent found matching "${n}". Use list to see available subagents.`,text:`Error: no subagent matching "${n}"`};return{content:[{type:`text`,text:JSON.stringify(e)}],details:e}}let a=e.kill(i.runId),s=i.label??i.task.slice(0,40),c={action:`kill`,killed:a?1:0,text:a?`Killed subagent "${s}".`:`Subagent "${s}" is already finished.`};return{content:[{type:`text`,text:JSON.stringify(c)}],details:c}}let s={action:i,error:`Unsupported action.`,text:`Error: unsupported action.`};return{content:[{type:`text`,text:JSON.stringify(s)}],details:s}}}}const Hi=L.Object({image:L.String({description:`Image path or URL`}),prompt:L.Optional(L.String({description:`Prompt for image analysis`})),model:L.Optional(L.String({description:`Optional model override`})),maxBytesMb:L.Optional(L.Number({description:`Optional size cap in MB`}))});function Ui(){return{name:`image`,label:`Image`,description:`Analyze an image with the configured image model. (Not implemented in AIMax yet.)`,parameters:Hi,async execute(e,t){let n={implemented:!1,error:`image tool not implemented (awaiting third-party integration).`};return{content:[{type:`text`,text:`Error: ${n.error}`}],details:n}}}}var Wi=class extends Error{isUiToolPause=!0;request;constructor(e,t,n,r,i,a,o){super(`UI_TOOL_PAUSED`),this.toolArgs=o,this.name=`UiToolPauseSignal`,this.request={requestId:e,sessionId:t,toolName:n,toolCallId:r,outputSchema:i,extra:a,createdAt:new Date().toISOString()}}};function Gi(e){return!!(e instanceof Wi||typeof e==`object`&&e&&`isUiToolPause`in e&&e.isUiToolPause===!0)}const Ki=new Fe;function qi(){return{}}async function Ji(e,t){return await Ki.run(e,t)}function Yi(e){let t=Ki.getStore();!t||t.signal||(t.signal=e)}const Xi=L.Object({reason:L.String({description:`A brief explanation of why user input is needed through this UI form.`})});function Zi(e){let{name:t,label:n,description:r,sessionId:i,inputSchema:a,outputSchema:o,extra:s,validate:c,resume:l}=e;return{name:t,label:n,description:r,parameters:a??Xi,async execute(e,n){if(l&&l.toolCallId===e&&l.toolName===t&&l.sessionId===i){let e=Pe(o,l.values);if(!e.valid){let t=e.errors;return{content:[{type:`text`,text:JSON.stringify({error:`validation_failed`,errors:t})}],details:{}}}if(c){let e=await c(l.values);if(!e.valid){let t=e.errors;return{content:[{type:`text`,text:JSON.stringify({error:`validation_failed`,errors:t})}],details:{}}}}return{content:[{type:`text`,text:JSON.stringify({submitted:!0,values:l.values})}],details:{}}}let r=new Wi(e,i,t,e,o,s,n);throw Yi(r),r}}}function Qi(e,t){let n=I.join(e,`workspace`),r=t?.memoryOptions,i=Ar(),a=[_r({sessionId:t?.sessionId,workspaceDir:n,registry:i,scopeKey:n,contextManager:t?.contextManager,hitlResume:t?.hitlResume}),xr({registry:i,scopeKey:n}),Ir(n,t?.contextManager),Rr(n,t?.contextManager),Br(n,t?.contextManager),Hr(n),Jr(n,{sessionId:t?.sessionId,hitlResume:t?.hitlResume}),Ti(e,r),Di(e,r),ki(e,r),...t?.sessionId?[di(t.sessionId,t.hitlResume),Mi(t.sessionId,t.hitlResume),Pi(t.sessionId,t.hitlResume)]:[]];return t&&a.push(Li(t.registry,t.parentSessionId,t.depth,e,t.channel,t.llm,t.loopDetection,t.inheritedRunParams??{},t.spawnFn),Vi(t.registry,t.parentSessionId)),a}const $i={read_file:`Read file contents`,write_file:`Create or overwrite files`,edit_file:`Make precise edits to files`,list_dir:`List directory contents`,apply_patch:`Apply multi-file patches`,exec:`Run shell commands`,process:`Manage background exec sessions`,memory_search:`Search memory files for relevant information`,memory_get:`Read specific lines from memory files`,memory_append:`Append new long-term memory`,sessions_spawn:`Spawn an isolated subagent session`,subagents:`List, steer, or kill subagent runs`},ea=[`read_file`,`write_file`,`edit_file`,`list_dir`,`apply_patch`,`exec`,`process`,`memory_search`,`memory_get`,`memory_append`,`sessions_spawn`,`subagents`];function ta(e){let t=new Map;for(let n of e){let e=n.trim();if(!e)continue;let r=e.toLowerCase();t.has(r)||t.set(r,e)}let n=Array.from(t.keys());return{ordered:[...ea.filter(e=>t.has(e)),...n.filter(e=>!ea.includes(e)).sort()],displayName:t}}function na(e){let{ordered:t,displayName:n}=ta(e.toolNames),r=new Map;for(let[t,n]of Object.entries(e.toolSummaries??{})){let e=t.trim().toLowerCase();!e||!n?.trim()||r.set(e,n.trim())}return[`## Tooling`,`Tool availability (filtered by runtime policy):`,`Tool names are case-sensitive. Call tools exactly as listed.`,t.map(e=>{let t=n.get(e)??e,i=r.get(e)??$i[e];return i?`- ${t}: ${i}`:`- ${t}`}).join(`
44
+ `)}`);r.push([s,n.length,o]),i=s+n.length}return r.sort((e,t)=>e[0]-t[0]),r}function ni(e,t){let n=[...e];for(let[e,r,i]of[...t].toReversed()){for(let t=0;t<r;t+=1)e<n.length&&n.splice(e,1);for(let t=0;t<i.length;t+=1)n.splice(e+t,0,i[t])}return n}function ri(e,t,n,r){if(t.length===0)return n;if(t.length>e.length)return null;let i=e.length-t.length,a=r&&e.length>=t.length?i:n;if(a>i)return null;for(let n=a;n<=i;n+=1)if(ii(e,t,n,e=>e))return n;for(let n=a;n<=i;n+=1)if(ii(e,t,n,e=>e.trimEnd()))return n;for(let n=a;n<=i;n+=1)if(ii(e,t,n,e=>e.trim()))return n;for(let n=a;n<=i;n+=1)if(ii(e,t,n,e=>ai(e.trim())))return n;return null}function ii(e,t,n,r){for(let i=0;i<t.length;i+=1)if(r(e[n+i])!==r(t[i]))return!1;return!0}function ai(e){return Array.from(e).map(e=>{switch(e){case`‐`:case`‑`:case`‒`:case`–`:case`—`:case`―`:case`−`:return`-`;case`‘`:case`’`:case`‚`:case`‛`:return`'`;case`“`:case`”`:case`„`:case`‟`:return`"`;case`\xA0`:case` `:case` `:case` `:case` `:case` `:case` `:case` `:case` `:case` `:case` `:case` `:case` `:return` `;default:return e}}).join(``)}function oi(e){return L.join(e,`.aimax`)}function si(e){return L.join(oi(e),`MEMORY.md`)}async function ci(e,t,n){e.onMemoryChanged&&await Promise.resolve(e.onMemoryChanged(n)).catch(()=>{}),t&&await Promise.resolve(t(n)).catch(()=>{})}function li(e,t){let n=oi(e),r=k({providerId:t?.providerId,pluginId:t?.pluginId,dataDir:e,memoryDir:n,sessionId:t?.sessionId});return r?r.provider:y({dataDir:e,memoryDir:n,sessionId:t?.sessionId})}async function ui(e){return C(oi(e))}async function di(e){try{return await I.readFile(e,`utf-8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}}async function fi(e){return di(si(e))}async function pi(e,t,n){return await li(e,n).search(t)}async function mi(e,t,n,r,i){try{return await li(e,i).getLines(t,n,r)}catch{return null}}async function hi(e,t,n){let r=li(e,n);await r.append(t),await ci(r,n?.onMemoryChanged,{reason:`append`,files:[`MEMORY.md`],source:`memory`,sessionId:n?.sessionId,providerId:n?.providerId??n?.pluginId,timestamp:new Date().toISOString()})}async function gi(e,t,n,r){let i=li(e,r);await i.updateFile(t,n),await ci(i,r?.onMemoryChanged,{reason:`update`,files:[t],source:`memory`,sessionId:r?.sessionId,providerId:r?.providerId??r?.pluginId,timestamp:new Date().toISOString()})}async function _i(e,t,n){let r=li(e,n);await r.deleteFile(t),await ci(r,n?.onMemoryChanged,{reason:`delete`,files:[t],source:`memory`,sessionId:n?.sessionId,providerId:n?.providerId??n?.pluginId,timestamp:new Date().toISOString()})}const vi=R.Object({query:R.String({description:`Search query (case-insensitive substring match)`})});function yi(e,t){return{name:`memory_search`,label:`Memory Search`,description:`Search memory files for relevant information`,parameters:vi,async execute(n,r){let i=(await pi(e,r.query,{providerId:t?.providerId,pluginId:t?.pluginId,sessionId:t?.sessionId})).map(e=>({file:e.path,start_line:e.startLine,end_line:e.endLine,score:Number(e.score.toFixed(4)),text:e.snippet,source:e.source,citation:e.citation}));return i.length===0?{content:[{type:`text`,text:`No results found for: ${r.query}`}],details:{matches:i}}:{content:[{type:`text`,text:i.map(e=>{let t=`${e.file}:${e.start_line}-${e.end_line} (${e.score}): ${e.text}`;return e.citation?`${t}\n${e.citation}`:t}).join(`
45
+ `)}],details:{matches:i}}}}}const bi=R.Object({file:R.String({description:`Memory file path`}),start_line:R.Number({description:`Start line number (1-based)`}),end_line:R.Number({description:`End line number (1-based)`})});function xi(e,t){return{name:`memory_get`,label:`Memory Get`,description:`Read specific lines from a memory file`,parameters:bi,async execute(n,r){let i=await mi(e,r.file,r.start_line,r.end_line,{providerId:t?.providerId,pluginId:t?.pluginId,sessionId:t?.sessionId});return i===null?{content:[{type:`text`,text:`File not found: ${r.file}`}],details:{lines:null}}:{content:[{type:`text`,text:i.map((e,t)=>`${(r.start_line+t).toString().padStart(4)} ${e}`).join(`
46
+ `)||`(empty)`}],details:{lines:i}}}}}const Si=R.Object({content:R.String({description:`Content to append to MEMORY.md`})});function Ci(e,t){return{name:`memory_append`,label:`Memory Append`,description:`Append new information to the MEMORY.md file`,parameters:Si,async execute(n,r){try{return await hi(e,r.content,{providerId:t?.providerId,pluginId:t?.pluginId,sessionId:t?.sessionId,onMemoryChanged:t?.onMemoryChanged}),{content:[{type:`text`,text:`Memory updated.`}],details:{appended:!0}}}catch(e){return{content:[{type:`text`,text:`Error appending to memory: ${e instanceof Error?e.message:String(e)}`}],details:{appended:!1}}}}}}const wi=R.Object({task:R.String({description:`The task description for the subagent to execute`}),label:R.Optional(R.String({description:`Optional short label to identify this subagent`}))});function Ti(e){let t=e.label?`"${e.label}"`:`task: ${e.task}`;return e.status===`done`?`[Subagent completed] ${t}\n\n${e.result??`(no output)`}`:e.status===`error`?`[Subagent failed] ${t}\n\nError: ${e.error??`unknown error`}`:`[Subagent killed] ${t}`}function Ei(e,t,n,r,i,a,o,s,c){return{name:`sessions_spawn`,label:`Spawn Subagent`,description:`Use this tool only when the user or system instructions explicitly require using a subagent, delegation, or parallel agent execution. Do not use it for routine decomposition or inferred parallelism. Returns immediately with status=accepted; the subagent result will be delivered back automatically as a follow-up message — do not poll or sleep.`,parameters:wi,async execute(l,u){let d=u.task.trim(),p=u.label?.trim();if(!d){let e={status:`error`,error:`task must not be empty`};return{content:[{type:`text`,text:JSON.stringify(e)}],details:e}}let m=e.checkSpawnAllowed(t,n+1);if(!m.allowed){let e={status:`forbidden`,error:m.reason};return{content:[{type:`text`,text:JSON.stringify(e)}],details:e}}let h=Oe(),g=new AbortController,_;try{_=await f(r,i,{storeName:s.sessionStoreName})}catch(e){let t={status:`error`,error:`Failed to create session: ${e instanceof Error?e.message:String(e)}`};return{content:[{type:`text`,text:JSON.stringify(t)}],details:t}}let v={runId:h,childSessionId:_,parentSessionId:t,task:d,label:p,depth:n+1,status:`running`,startedAt:Date.now(),abortController:g},y=c({dataDir:r,sessionId:_,message:d,channel:i,llm:a,...s,loopDetection:o,abortSignal:g.signal,subagentContext:{depth:n+1,parentSessionId:t}}).then(t=>{e.complete(h,t.text||t.error||`(no output)`)}).catch(t=>{let n=t instanceof Error?t.message:String(t);e.fail(h,n)});e.register(v,y);let b={status:`accepted`,childSessionId:_,runId:h,note:`The subagent result will be sent back automatically. Do not poll or re-spawn.`};return{content:[{type:`text`,text:JSON.stringify(b)}],details:b}}}}const Di=R.Object({action:R.Union([`list`,`kill`].map(e=>R.Literal(e)),{description:`Action to perform: "list" to show subagents, "kill" to stop one or all`}),target:R.Optional(R.String({description:`For kill: a runId, label, or index from the list. Use "*" or "all" to kill every subagent.`}))});function Oi(e){return e<1e3?`${e}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${Math.floor(e/6e4)}m${Math.floor(e%6e4/1e3)}s`}function ki(e,t){let n=parseInt(t,10);return!isNaN(n)&&n>=1&&n<=e.length?e[n-1]:e.find(e=>e.runId.startsWith(t)||e.runId===t)||(e.find(e=>e.label&&e.label.toLowerCase()===t.toLowerCase())??null)}function Ai(e,t){return{name:`subagents`,label:`Subagents`,description:`List or kill subagents spawned by this session. Use list to check status, kill to stop one or all.`,parameters:Di,async execute(n,r){let i=r.action,a=Date.now(),o=e.list(t);if(i===`list`){let e=o.map((e,t)=>({index:t+1,runId:e.runId,label:e.label??e.task.slice(0,40),task:e.task,status:e.status,depth:e.depth,runtimeMs:e.endedAt?e.endedAt-e.startedAt:a-e.startedAt})),t={action:`list`,runs:e,text:(e.length===0?[`(no subagents)`]:e.map(e=>`${e.index}. [${e.status}] ${e.label} (${Oi(e.runtimeMs)})`)).join(`
47
+ `)};return{content:[{type:`text`,text:JSON.stringify(t)}],details:t}}if(i===`kill`){let n=r.target?.trim();if(!n||n===`*`||n===`all`){let n=e.killAll(t),r={action:`kill`,killed:n,text:n>0?`Killed ${n} subagent(s).`:`No running subagents to kill.`};return{content:[{type:`text`,text:JSON.stringify(r)}],details:r}}let i=ki(o,n);if(!i){let e={action:`kill`,killed:0,error:`No subagent found matching "${n}". Use list to see available subagents.`,text:`Error: no subagent matching "${n}"`};return{content:[{type:`text`,text:JSON.stringify(e)}],details:e}}let a=e.kill(i.runId),s=i.label??i.task.slice(0,40),c={action:`kill`,killed:a?1:0,text:a?`Killed subagent "${s}".`:`Subagent "${s}" is already finished.`};return{content:[{type:`text`,text:JSON.stringify(c)}],details:c}}let s={action:i,error:`Unsupported action.`,text:`Error: unsupported action.`};return{content:[{type:`text`,text:JSON.stringify(s)}],details:s}}}}const ji=R.Object({image:R.String({description:`Image path or URL`}),prompt:R.Optional(R.String({description:`Prompt for image analysis`})),model:R.Optional(R.String({description:`Optional model override`})),maxBytesMb:R.Optional(R.Number({description:`Optional size cap in MB`}))});function Mi(){return{name:`image`,label:`Image`,description:`Analyze an image with the configured image model. (Not implemented in AIMax yet.)`,parameters:ji,async execute(e,t){let n={implemented:!1,error:`image tool not implemented (awaiting third-party integration).`};return{content:[{type:`text`,text:`Error: ${n.error}`}],details:n}}}}var Ni=class extends Error{isUiToolPause=!0;request;constructor(e,t,n,r,i,a,o){super(`UI_TOOL_PAUSED`),this.toolArgs=o,this.name=`UiToolPauseSignal`,this.request={requestId:e,sessionId:t,toolName:n,toolCallId:r,outputSchema:i,extra:a,createdAt:new Date().toISOString()}}};function Pi(e){return!!(e instanceof Ni||typeof e==`object`&&e&&`isUiToolPause`in e&&e.isUiToolPause===!0)}const Fi=new Fe;function Ii(){return{}}async function Li(e,t){return await Fi.run(e,t)}function Ri(e){let t=Fi.getStore();!t||t.signal||(t.signal=e)}const zi=R.Object({reason:R.String({description:`A brief explanation of why user input is needed through this UI form.`})});function Bi(e){let{name:t,label:n,description:r,sessionId:i,inputSchema:a,outputSchema:o,extra:s,validate:c,resume:l}=e;return{name:t,label:n,description:r,parameters:a??zi,async execute(e,n){if(l&&l.toolCallId===e&&l.toolName===t&&l.sessionId===i){let e=Pe(o,l.values);if(!e.valid){let t=e.errors;return{content:[{type:`text`,text:JSON.stringify({error:`validation_failed`,errors:t})}],details:{}}}if(c){let e=await c(l.values);if(!e.valid){let t=e.errors;return{content:[{type:`text`,text:JSON.stringify({error:`validation_failed`,errors:t})}],details:{}}}}return{content:[{type:`text`,text:JSON.stringify({submitted:!0,values:l.values})}],details:{}}}let r=new Ni(e,i,t,e,o,s,n);throw Ri(r),r}}}function Vi(e,t){let n=L.join(e,`workspace`),r=t?.memoryOptions,i=Ar(),a=[_r({sessionId:t?.sessionId,workspaceDir:n,registry:i,scopeKey:n,contextManager:t?.contextManager,hitlResume:t?.hitlResume}),xr({registry:i,scopeKey:n}),Ir(n,t?.contextManager),Rr(n,t?.contextManager),Br(n,t?.contextManager),Hr(n),Jr(n,{sessionId:t?.sessionId,hitlResume:t?.hitlResume}),yi(e,r),xi(e,r),Ci(e,r)];return t&&a.push(Ei(t.registry,t.parentSessionId,t.depth,e,t.channel,t.llm,t.loopDetection,t.inheritedRunParams??{},t.spawnFn),Ai(t.registry,t.parentSessionId)),a}const Hi={read_file:`Read file contents`,write_file:`Create or overwrite files`,edit_file:`Make precise edits to files`,list_dir:`List directory contents`,apply_patch:`Apply multi-file patches`,exec:`Run shell commands`,process:`Manage background exec sessions`,memory_search:`Search memory files for relevant information`,memory_get:`Read specific lines from memory files`,memory_append:`Append new long-term memory`,sessions_spawn:`Spawn an isolated subagent session`,subagents:`List, steer, or kill subagent runs`},Ui=[`read_file`,`write_file`,`edit_file`,`list_dir`,`apply_patch`,`exec`,`process`,`memory_search`,`memory_get`,`memory_append`,`sessions_spawn`,`subagents`];function Wi(e){let t=new Map;for(let n of e){let e=n.trim();if(!e)continue;let r=e.toLowerCase();t.has(r)||t.set(r,e)}let n=Array.from(t.keys());return{ordered:[...Ui.filter(e=>t.has(e)),...n.filter(e=>!Ui.includes(e)).sort()],displayName:t}}function Gi(e){let{ordered:t,displayName:n}=Wi(e.toolNames),r=new Map;for(let[t,n]of Object.entries(e.toolSummaries??{})){let e=t.trim().toLowerCase();!e||!n?.trim()||r.set(e,n.trim())}return[`## Tooling`,`Tool availability (filtered by runtime policy):`,`Tool names are case-sensitive. Call tools exactly as listed.`,t.map(e=>{let t=n.get(e)??e,i=r.get(e)??Hi[e];return i?`- ${t}: ${i}`:`- ${t}`}).join(`
51
48
  `),``].join(`
52
- `)}function ra(){return[`## Safety`,`You have no independent goals: do not pursue self-preservation, replication, resource acquisition, or power-seeking; avoid long-term plans beyond the user's request.`,`Prioritize safety and human oversight over completion; if instructions conflict, pause and ask; comply with stop/pause/audit requests and never bypass safeguards.`,`Do not attempt to bypass approvals, safety rails, or access boundaries.`,`Never print, reveal, or echo environment variable values. If configuration must be shown, use placeholders plus brief meanings instead, such as {{API_KEY}}: model access credential.`,``].join(`
53
- `)}function ia(e){return e?``:[`## Tool Call Style`,`Default: call routine low-risk tools directly without narrating every step.`,`Narrate briefly when actions are sensitive, long-running, or likely surprising.`,`When approvals are required, keep the command text exact and complete.`,``].join(`
54
- `)}function aa(e){return e.length===0?``:[`## Skills (mandatory)`,`Before replying: scan <available_skills> <description> entries.`,"- If exactly one skill clearly applies: read its SKILL.md at <location> with `read_file`, then follow it.",`- If multiple could apply: choose the most specific one, then read/follow it.`,`- If none clearly apply: do not read any SKILL.md.`,`Constraints: never read more than one skill up front; only read after selecting.`,`<available_skills>\n${e.map(e=>[` <skill>`,` <name>${e.name}</name>`,` <description>${e.description}</description>`,` <location>${e.location}</location>`,` </skill>`].join(`
49
+ `)}function Ki(){return[`## Safety`,`You have no independent goals: do not pursue self-preservation, replication, resource acquisition, or power-seeking; avoid long-term plans beyond the user's request.`,`Prioritize safety and human oversight over completion; if instructions conflict, pause and ask; comply with stop/pause/audit requests and never bypass safeguards.`,`Do not attempt to bypass approvals, safety rails, or access boundaries.`,`Never print, reveal, or echo environment variable values. If configuration must be shown, use placeholders plus brief meanings instead, such as {{API_KEY}}: model access credential.`,``].join(`
50
+ `)}function qi(e){return e?``:[`## Tool Call Style`,`Default: call routine low-risk tools directly without narrating every step.`,`Narrate briefly when actions are sensitive, long-running, or likely surprising.`,`When approvals are required, keep the command text exact and complete.`,``].join(`
51
+ `)}function Ji(e){return e.length===0?``:[`## Skills (mandatory)`,`Before replying: scan <available_skills> <description> entries.`,"- If exactly one skill clearly applies: read its SKILL.md at <location> with `read_file`, then follow it.",`- If multiple could apply: choose the most specific one, then read/follow it.`,`- If none clearly apply: do not read any SKILL.md.`,`Constraints: never read more than one skill up front; only read after selecting.`,`<available_skills>\n${e.map(e=>[` <skill>`,` <name>${e.name}</name>`,` <description>${e.description}</description>`,` <location>${e.location}</location>`,` </skill>`].join(`
55
52
  `)).join(`
56
53
  `)}\n</available_skills>`,``].join(`
57
- `)}function oa(){return[`## Scenes`,'If the user message contains a `<scenes category="..." type="..." items="...">...</scenes>` tag, treat it as an explicit scene activation request.',"In this tag, `category` means the scene category, `type` means the scene name, and `items` means the item list required by that scene.","The `category`, `type`, and `items` attributes may each contain one or more comma-separated values. You must split them on commas, trim whitespace, and use every requested value.","Before executing the task, you must enumerate every requested `<category, scene, item>` combination derived from those attributes.","For each requested item, you must inspect `/scenes/<category>/<scene>/<item>/` and read that item's `SKILL.md` with `read_file`.","If one `<scenes ...>` tag requests multiple items for the same scene, you must load them one by one. Do not stop after the first matching item.","Do not start implementation, analysis, tool execution, or user-facing conclusions until all required scene `SKILL.md` files have been read.","After reading those scene `SKILL.md` files, you must follow their instructions as mandatory task-specific guidance unless a higher-priority instruction overrides them.","Scene skills are not loaded by default. Only load them when the user explicitly includes the `<scenes ...>` tag.","When a scene is activated, you must load scene instructions only from `/scenes/<category>/<scene>/<item>/SKILL.md`.","Do not load, match, or fall back to scene instructions from `<dataDir>/.aimax/skills`.","Do not load, match, or fall back to scene instructions from `/aimax/extensions/`.","Do not load, match, or fall back to scene instructions from any path declared in `<available_skills>`.",`Do not ignore, rewrite, or drop the scene tag semantics even if the natural-language request looks answerable without scene skills.`,``].join(`
58
- `)}function sa(){return[`## Memory Write`,`When the user asks to remember something or new long-term memory is needed, you must use memory_append. Do not use write_file or edit_file for memory writes.`,``].join(`
59
- `)}function ca(e){return[`## Memory Recall`,`Before answering anything about prior work, decisions, dates, people, preferences, or todos: run memory_search on MEMORY.md + memory/*.md; then use memory_get to pull only the needed lines. If low confidence after search, say you checked.`,e===`off`?`Citations are disabled: do not include memory file paths or line numbers unless the user explicitly asks.`:`When useful, include memory evidence as Source: <path#line>.`,``].join(`
60
- `)}function la(e){let t=`${e.dataDir}/.aimax`,n=`${e.dataDir}/workspace`,r=e.sandboxInfo?.hostWorkspaceDir?.trim()||n,i=e.sandboxInfo?.containerWorkspaceDir?.trim(),a=e.sandboxInfo?.enabled&&i?`For file tools, paths resolve against the cloud workspace mount ${r}. For exec commands, use paths under ${i} (or relative paths from there). Prefer relative paths whenever possible.`:`This cloud workspace is mounted user storage. Prefer relative paths to keep file tools and shell commands aligned.`;return[`## Workspace`,`Your cloud working directory is: ${r}`,a,`User identity, memory, and agent state live under ${t}, not inside the cloud workspace.`,`Files such as AGENTS.md, SOUL.md, TOOLS.md, IDENTITY.md, USER.md, HEARTBEAT.md, MEMORY.md, and the memory/ directory belong under ${t}.`,`Only create or update those files at their real .aimax paths. Never create cloud workspace copies like ${r}/AGENTS.md or ${r}/MEMORY.md unless the user explicitly asks for separate cloud documents.`,``].join(`
61
- `)}function ua(e){if(!e?.enabled)return``;let t=[`## Sandbox`,`You are running in a containerized cloud CLI runtime.`];return e.containerWorkspaceDir?.trim()&&t.push(`Container workdir: ${e.containerWorkspaceDir.trim()}`),e.hostWorkspaceDir?.trim()&&t.push(`Host-mounted workspace: ${e.hostWorkspaceDir.trim()}`),t.push(``),t.join(`
62
- `)}function da(e){let t=[];if(e.timezone&&t.push(`Time zone: ${e.timezone}`),e.currentDate){t.push(`Current date: ${e.currentDate}`);let n=fa(e.currentDate);n&&t.push(`Day of week: ${n}`)}return t.length===0?``:[`## Current Date & Time`,...t,``].join(`
63
- `)}function fa(e){let t=/^(\d{4})-(\d{2})-(\d{2})$/.exec(e.trim());if(!t)return null;let n=Number(t[1]),r=Number(t[2]),i=Number(t[3]),a=new Date(Date.UTC(n,r-1,i));return Number.isNaN(a.getTime())||a.getUTCFullYear()!==n||a.getUTCMonth()!==r-1||a.getUTCDate()!==i?null:[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`][a.getUTCDay()]}function pa(e){if(e.isMinimal||!e.enabled)return``;let t=(e.channels??[]).map(e=>e.trim()).filter(Boolean);return[`## Messaging`,`Reply in the current session for user-visible responses.`,`Use subagent tools only when the user or system instructions explicitly require subagents, delegation, or parallel agent execution; otherwise stay in the current agent.`,`Do not use shell/network commands to bypass the platform messaging pipeline.`,t.length>0?`Configured channels: ${t.join(` | `)}`:``,``].filter(Boolean).join(`
64
- `)}function ma(e){if(e.isMinimal)return``;let t=e.docs,n=[`## Documentation`,t?.localPath?`Cloud docs mount: ${t.localPath}`:``,t?.webUrl?`Docs mirror: ${t.webUrl}`:``,t?.sourceUrl?`Source: ${t.sourceUrl}`:``,`For AiMax behavior, configuration, and architecture questions, consult documentation first.`,``].filter(Boolean);return n.length<=2?``:n.join(`
65
- `)}function ha(e){if(!e)return``;let t=[e.hostname?`host=${e.hostname}`:``,e.os?`os=${e.os}`:``,e.node?`node=${e.node}`:``,e.model?`model=${e.model}`:``].filter(Boolean);return t.length===0?``:[`## Runtime`,`Runtime: ${t.join(` | `)}`,``].join(`
66
- `)}function ga(e){return e.isMinimal?``:[`## Silent Replies`,`Do not send empty or filler replies.`,`If a tool already delivered the user-visible output, keep your final reply minimal and avoid duplication.`,``].join(`
67
- `)}function _a(e){return e.isMinimal?``:[`## Heartbeats`,`Heartbeat prompt: ${e.heartbeatPrompt?.trim()||`Read HEARTBEAT.md if it exists (cloud workspace context). Follow it strictly. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK.`}`,`If a user message matches the heartbeat prompt and nothing needs attention, reply exactly: HEARTBEAT_OK`,`If something needs attention, do NOT include "HEARTBEAT_OK"; respond with the alert text instead.`,``].join(`
68
- `)}function va(e){let t=e.contextFiles,n=(e.bootstrapWarnings??[]).map(e=>e.trim()).filter(Boolean);if(t.length===0&&n.length===0)return``;let r=t.some(e=>(e.path.split(`/`).pop()?.toLowerCase()??``)===`soul.md`),i=[`# Project Context`,``];if(n.length>0){i.push(`⚠ Bootstrap truncation warning:`);for(let e of n)i.push(`- ${e}`);i.push(``)}t.length>0&&(i.push(`The following project context files have been loaded:`),i.push(`These are source-of-truth cloud files at their shown paths. If you update them, use the exact path shown in the heading, especially for files under .aimax.`)),r&&i.push(`If SOUL.md is present, embody its persona and tone. Avoid stiff, generic replies; follow its guidance unless higher-priority instructions override it.`),i.push(``);for(let e of t)i.push(`## ${e.path}`,``,e.content,``);return i.join(`
69
- `)}function ya(e){return e?.trim()?[`## Prior Conversation Summary`,`The following is a summary of the conversation history that occurred before the current context window.`,`Use it to maintain continuity with earlier work.`,``,e.trim(),``].join(`
70
- `):``}function ba(e){let t=e.promptMode??`full`,n=t===`minimal`;if(t===`none`)return`You are a personal assistant running inside AiMax.`;let r=e.toolNames&&e.toolNames.length>0?e.toolNames:[...ea],i=e.skills??[],a=e.contextFiles??[];return[`You are a personal assistant running inside AiMax.
71
- `,na({toolNames:r,toolSummaries:e.toolSummaries}),ia(n),ra(),aa(i),oa(),sa(),ca(e.memoryCitationsMode??`off`),la({dataDir:e.dataDir,sandboxInfo:e.sandboxInfo}),ua(e.sandboxInfo),da({currentDate:e.currentDate,timezone:e.timezone}),pa({isMinimal:n,enabled:e.messaging?.enabled,channels:e.messaging?.channels}),ma({isMinimal:n,docs:e.docs}),ga({isMinimal:n}),_a({isMinimal:n,heartbeatPrompt:e.heartbeatPrompt}),ha(e.runtimeInfo),va({contextFiles:a,bootstrapWarnings:e.bootstrapWarnings}),ya(e.priorConversationSummary)].filter(Boolean).join(`
72
- `)}const xa=new Fe;async function Sa(e,t){return await xa.run(e,t)}function Ca(e){return{async emit(t){let n=xa.getStore();if(!n||n.pluginId!==e)throw Error(`Plugin ${e} cannot emit progress outside its runtime context`);if(!n.hookContext.sessionId)throw Error(`Plugin ${e} cannot emit progress without an active session`);await n.eventDispatcher.dispatchProgress(n.hookContext.sessionId,{type:`custom`,pluginId:e,name:t.name,label:t.label,data:t.data})}}}const wa=Symbol(`pluginToolOwner`);var Ta=class{tools=[];uiTools=[];register(e,t,n){let r=t.name,i=n?.names??(n?.name?[n.name]:r?[r]:[]);Object.defineProperty(t,wa,{value:e,enumerable:!1,configurable:!1,writable:!1}),this.tools.push({pluginId:e,tool:t,optional:n?.optional??!1,names:i})}registerUiTool(e,t,n){this.uiTools.push({pluginId:e,descriptor:t,optional:n?.optional??!1})}list(){return[...this.tools]}listUiTools(){return[...this.uiTools]}namesForPlugin(e){let t=this.tools.filter(t=>t.pluginId===e).flatMap(e=>e.names),n=this.uiTools.filter(t=>t.pluginId===e).map(e=>e.descriptor.name);return[...t,...n]}resolveEnabled(e){let t=new Set((e??[]).map(e=>e.trim()).filter(Boolean));return this.tools.filter(e=>{if(!e.optional)return!0;if(t.size===0)return!1;if(t.has(e.pluginId))return!0;for(let n of e.names)if(t.has(n))return!0;return!1}).map(e=>e.tool)}resolveUiTools(e,t,n){let r=new Set((n??[]).map(e=>e.trim()).filter(Boolean));return this.uiTools.filter(e=>e.optional?r.size===0?!1:!!(r.has(e.pluginId)||r.has(e.descriptor.name)):!0).map(n=>{let r=Zi({name:n.descriptor.name,label:n.descriptor.label,description:n.descriptor.description,sessionId:e,inputSchema:n.descriptor.inputSchema,outputSchema:n.descriptor.outputSchema,extra:n.descriptor.extra,validate:n.descriptor.validate,resume:t});return Object.defineProperty(r,wa,{value:n.pluginId,enumerable:!1,configurable:!1,writable:!1}),r})}};function Ea(e){return e[wa]}const Da=new Fe;function Oa(){return{}}async function ka(e,t){return await Da.run(e,t)}function Aa(e){let t=Da.getStore();!t||t.signal||(t.signal=e)}function ja(e,t,n,r){return e.map(e=>{let i=e,a=e.name??`unknown`,o=Ea(e);return{...i,async execute(e,s,c,l){let u=Date.now(),d=s??{},f=!1,p,m=async e=>o?await Sa({pluginId:o,hookContext:n,eventDispatcher:r.eventDispatcher},e):await e(),h=await t.dispatch(`before_tool_call`,{toolCallId:e,toolName:a,params:d},n,r);for(let e of h)e&&(e.params&&(d=e.params),e.block&&(f=!0,p=e.blockReason));if(f)return await t.dispatch(`after_tool_call`,{toolCallId:e,toolName:a,params:d,error:p??`blocked by plugin`,durationMs:Date.now()-u},n,r),{content:[{type:`text`,text:p??`Tool blocked by plugin`}],isError:!0,details:{}};try{let o=await m(async()=>await i.execute(e,d,c,l));return await t.dispatch(`after_tool_call`,{toolCallId:e,toolName:a,params:d,result:o,durationMs:Date.now()-u},n,r),o}catch(i){if(sr(i)){Aa(i);let o={content:[{type:`text`,text:i.message}],isError:!0,details:{}};return await t.dispatch(`after_tool_call`,{toolCallId:e,toolName:a,params:d,result:o,durationMs:Date.now()-u},n,r),o}throw await t.dispatch(`after_tool_call`,{toolCallId:e,toolName:a,params:d,error:String(i),durationMs:Date.now()-u},n,r),i}}}})}var Ma=class{hooks=new Map;register(e){let t=this.hooks.get(e.hookName)??[];t.push(e),t.sort((e,t)=>(e.priority??0)-(t.priority??0)),this.hooks.set(e.hookName,t)}async dispatch(e,t,n,r){let i=this.hooks.get(e)??[],a=[];for(let e of i){let i=async()=>await e.handler(t,n),o=r?await Sa({pluginId:e.pluginId,hookContext:n,eventDispatcher:r.eventDispatcher},i):await i();a.push(o)}return a}};const X={enabled:!1,historySize:30,warningThreshold:10,criticalThreshold:20,globalCircuitBreakerThreshold:30,detectors:{genericRepeat:!0,knownPollNoProgress:!0,pingPong:!0}};function Na(e,t){return typeof e!=`number`||!Number.isInteger(e)||e<=0?t:e}function Pa(e){let t=Na(e?.warningThreshold,X.warningThreshold),n=Na(e?.criticalThreshold,X.criticalThreshold),r=Na(e?.globalCircuitBreakerThreshold,X.globalCircuitBreakerThreshold);return n<=t&&(n=t+1),r<=n&&(r=n+1),{enabled:e?.enabled??X.enabled,historySize:Na(e?.historySize,X.historySize),warningThreshold:t,criticalThreshold:n,globalCircuitBreakerThreshold:r,detectors:{genericRepeat:e?.detectors?.genericRepeat??X.detectors.genericRepeat,knownPollNoProgress:e?.detectors?.knownPollNoProgress??X.detectors.knownPollNoProgress,pingPong:e?.detectors?.pingPong??X.detectors.pingPong}}}function Z(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function Fa(e,t){return`${e}:${Q(t)}`}function Ia(e){if(typeof e!=`object`||!e)return JSON.stringify(e);if(Array.isArray(e))return`[${e.map(Ia).join(`,`)}]`;let t=e;return`{${Object.keys(t).toSorted().map(e=>`${JSON.stringify(e)}:${Ia(t[e])}`).join(`,`)}}`}function La(e){try{return Ia(e)}catch{return e==null?`${e}`:typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`?`${e}`:e instanceof Error?`${e.name}:${e.message}`:Object.prototype.toString.call(e)}}function Q(e){let t=La(e);return Oe(`sha256`).update(t).digest(`hex`)}function Ra(e,t){if(e===`command_status`)return!0;if(e!==`process`||!Z(t))return!1;let n=t.action;return n===`poll`||n===`log`}function za(e){return!Z(e)||!Array.isArray(e.content)?``:e.content.filter(e=>Z(e)&&typeof e.type==`string`&&typeof e.text==`string`).map(e=>e.text).join(`
73
- `).trim()}function Ba(e){return e instanceof Error?e.message||e.name:typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`?`${e}`:Ia(e)}function Va(e,t,n,r){if(r!==void 0)return`error:${Q(Ba(r))}`;if(!Z(n))return n===void 0?void 0:Q(n);let i=Z(n.details)?n.details:{},a=za(n);if(Ra(e,t)&&e===`process`&&Z(t)){let e=t.action;if(e===`poll`)return Q({action:e,status:i.status,exitCode:i.exitCode??null,exitSignal:i.exitSignal??null,aggregated:i.aggregated??null,text:a});if(e===`log`)return Q({action:e,status:i.status,totalLines:i.totalLines??null,totalChars:i.totalChars??null,truncated:i.truncated??null,exitCode:i.exitCode??null,exitSignal:i.exitSignal??null,text:a})}return Q({details:i,text:a})}function Ha(e,t,n){let r=0,i;for(let a=e.length-1;a>=0;--a){let o=e[a];if(!(!o||o.toolName!==t||o.argsHash!==n)&&!(typeof o.resultHash!=`string`||!o.resultHash)){if(!i){i=o.resultHash,r=1;continue}if(o.resultHash!==i)break;r+=1}}return{count:r,latestResultHash:i}}function Ua(e,t){let n=e.at(-1);if(!n)return{count:0,noProgressEvidence:!1};let r,i;for(let t=e.length-2;t>=0;--t){let a=e[t];if(a&&a.argsHash!==n.argsHash){r=a.argsHash,i=a.toolName;break}}if(!r||!i)return{count:0,noProgressEvidence:!1};let a=0;for(let t=e.length-1;t>=0;--t){let i=e[t];if(!i)continue;let o=a%2==0?n.argsHash:r;if(i.argsHash!==o)break;a+=1}if(a<2||t!==r)return{count:0,noProgressEvidence:!1};let o=Math.max(0,e.length-a),s,c,l=!0;for(let t=o;t<e.length;t+=1){let i=e[t];if(i){if(!i.resultHash){l=!1;break}if(i.argsHash===n.argsHash){if(!s)s=i.resultHash;else if(s!==i.resultHash){l=!1;break}continue}if(i.argsHash===r){if(!c)c=i.resultHash;else if(c!==i.resultHash){l=!1;break}continue}l=!1;break}}return(!s||!c)&&(l=!1),{count:a+1,pairedToolName:n.toolName,pairedSignature:n.argsHash,noProgressEvidence:l}}function Wa(e,t){return[e,t].toSorted().join(`|`)}function Ga(e,t,n,r){let i=Pa(r);if(!i.enabled)return{stuck:!1};let a=e.toolCallHistory??[],o=Fa(t,n),s=Ha(a,t,o),c=s.count,l=Ra(t,n),u=Ua(a,o);if(c>=i.globalCircuitBreakerThreshold)return{stuck:!0,level:`critical`,detector:`global_circuit_breaker`,count:c,message:`CRITICAL: ${t} has repeated identical no-progress outcomes ${c} times. Session execution blocked by global circuit breaker to prevent runaway loops.`,warningKey:`global:${t}:${o}:${s.latestResultHash??`none`}`};if(l&&i.detectors.knownPollNoProgress&&c>=i.criticalThreshold)return{stuck:!0,level:`critical`,detector:`known_poll_no_progress`,count:c,message:`CRITICAL: Called ${t} with identical arguments and no progress ${c} times. This appears to be a stuck polling loop. Session execution blocked to prevent resource waste.`,warningKey:`poll:${t}:${o}:${s.latestResultHash??`none`}`};if(l&&i.detectors.knownPollNoProgress&&c>=i.warningThreshold)return{stuck:!0,level:`warning`,detector:`known_poll_no_progress`,count:c,message:`WARNING: You have called ${t} ${c} times with identical arguments and no progress. Stop polling and either (1) increase wait time between checks, or (2) report the task as failed if the process is stuck.`,warningKey:`poll:${t}:${o}:${s.latestResultHash??`none`}`};let d=u.pairedSignature?`pingpong:${Wa(o,u.pairedSignature)}`:`pingpong:${t}:${o}`;if(i.detectors.pingPong&&u.count>=i.criticalThreshold&&u.noProgressEvidence)return{stuck:!0,level:`critical`,detector:`ping_pong`,count:u.count,message:`CRITICAL: You are alternating between repeated tool-call patterns (${u.count} consecutive calls) with no progress. This appears to be a stuck ping-pong loop. Session execution blocked to prevent resource waste.`,pairedToolName:u.pairedToolName,warningKey:d};if(i.detectors.pingPong&&u.count>=i.warningThreshold)return{stuck:!0,level:`warning`,detector:`ping_pong`,count:u.count,message:`WARNING: You are alternating between repeated tool-call patterns (${u.count} consecutive calls). This looks like a ping-pong loop; stop retrying and report the task as failed.`,pairedToolName:u.pairedToolName,warningKey:d};let f=a.filter(e=>e.toolName===t&&e.argsHash===o).length;return!l&&i.detectors.genericRepeat&&f>=i.warningThreshold?{stuck:!0,level:`warning`,detector:`generic_repeat`,count:f,message:`WARNING: You have called ${t} ${f} times with identical arguments. If this is not making progress, stop retrying and report the task as failed.`,warningKey:`generic:${t}:${o}`}:{stuck:!1}}function Ka(e,t,n,r,i){let a=Pa(i);e.toolCallHistory||=[],e.toolCallHistory.push({toolName:t,argsHash:Fa(t,n),toolCallId:r,timestamp:Date.now()}),e.toolCallHistory.length>a.historySize&&e.toolCallHistory.shift()}function qa(e,t){let n=Pa(t.config),r=Va(t.toolName,t.toolParams,t.result,t.error);if(!r)return;e.toolCallHistory||=[];let i=Fa(t.toolName,t.toolParams),a=!1;for(let n=e.toolCallHistory.length-1;n>=0;--n){let o=e.toolCallHistory[n];if(o&&!(t.toolCallId&&o.toolCallId!==t.toolCallId)&&!(o.toolName!==t.toolName||o.argsHash!==i)&&o.resultHash===void 0){o.resultHash=r,a=!0;break}}a||e.toolCallHistory.push({toolName:t.toolName,argsHash:i,toolCallId:t.toolCallId,resultHash:r,timestamp:Date.now()}),e.toolCallHistory.length>n.historySize&&e.toolCallHistory.splice(0,e.toolCallHistory.length-n.historySize)}function Ja(e,t,n){e.toolLoopWarningBuckets||=new Map;let r=Math.floor(n/10);if(r<=(e.toolLoopWarningBuckets.get(t)??0))return!1;if(e.toolLoopWarningBuckets.set(t,r),e.toolLoopWarningBuckets.size>256){let t=e.toolLoopWarningBuckets.keys().next().value;t&&e.toolLoopWarningBuckets.delete(t)}return!0}function Ya(e){return e&&e.trim()||`tool`}function Xa(e,t,n){if(!e.execute)return e;let r=Ya(e.name),i=e.execute.bind(e);return{...e,execute:async(e,a,o,s)=>{let c=n(t.sessionId),l=Ga(c,r,a,t.config);if(l.stuck){if(l.level===`critical`)throw Error(l.message);Ja(c,l.warningKey??`${l.detector}:${r}`,l.count)&&t.onWarning?.(l)}Ka(c,r,a,e,t.config);try{let n=await i(e,a,o,s);return qa(c,{toolName:r,toolParams:a,toolCallId:e,result:n,config:t.config}),n}catch(n){throw qa(c,{toolName:r,toolParams:a,toolCallId:e,error:n,config:t.config}),n}}}}function Za(e,t,n){return e.map(e=>Xa(e,t,n))}async function Qa(e){let{session:{runParams:t,sessionId:n,hookRegistry:r,hookContext:i,runContext:a,eventDispatcher:o},runtimeInputs:{contextFiles:s,bootstrapWarnings:c,skills:u,effectivePromptText:d,pluginTools:f},dependencies:{registry:p,spawnFn:m,createModel:h,abortSignal:g}}=e,_=t.channel===`CRON`,v=_?[]:await l(t.dataDir,n,{storeName:t.sessionStoreName}),y={model:t.llm.model,api:`openai-completions`},b=await ar({dataDir:t.dataDir,sessionId:n,sessionStoreName:t.sessionStoreName}),x=_?{messages:[],priorSummary:void 0,compactionEntry:void 0,stats:{originalCount:0,keptCount:0,estimatedTokens:0,compacted:!1},compactionEvents:[]}:await or({entries:v,modelInfo:y,contextWindowTokens:t.llm.contextWindow??2e5,llm:{baseUrl:t.llm.baseUrl,apiKey:t.llm.apiKey,model:t.llm.model},historyLimit:t.historyLimit,compactionEnabled:!0,signal:g,hooks:r,hookCtx:i,contextManager:b,dataDir:t.dataDir,sessionId:n});await $a({sessionId:n,historyResult:x,runContext:a,eventDispatcher:o,hookRegistry:r,hookContext:i});let S=t.subagentContext?.depth??0,C=[...Qi(t.dataDir,{sessionId:t.subagentContext?.parentSessionId??n,registry:p,parentSessionId:n,depth:S,channel:t.channel,llm:t.llm,inheritedRunParams:{sessionStoreName:t.sessionStoreName,plugins:t.plugins,memory:t.memory,messaging:t.messaging,docs:t.docs,historyLimit:t.historyLimit,onProgress:t.onProgress,messageId:t.messageId},loopDetection:t.loopDetection,memoryOptions:{providerId:a.memoryProviderId,pluginId:a.memoryPluginId,sessionId:n,onMemoryChanged:async()=>{}},contextManager:b,hitlResume:t.hitlResume,spawnFn:m}),...f],w=C.map(e=>typeof e.name==`string`?e.name.trim():``).filter(Boolean),T={};for(let e of C){let t=typeof e.name==`string`?e.name.trim():``,n=typeof e.description==`string`?e.description.trim():``;!t||!n||T[t]||(T[t]=n)}let E=t.messaging?.enabled??t.channel!==`CRON`,D=t.messaging?.channels&&t.messaging.channels.length>0?t.messaging.channels:[t.channel],O=ba({dataDir:t.dataDir,skills:u,contextFiles:s,toolNames:w,toolSummaries:T,promptMode:S>0?`minimal`:`full`,bootstrapWarnings:c,memoryCitationsMode:t.memory?.citationsMode??`off`,messaging:{enabled:E,channels:D},docs:{localPath:t.docs?.localPath,webUrl:t.docs?.webUrl,sourceUrl:t.docs?.sourceUrl},sandboxInfo:{enabled:!0,hostWorkspaceDir:a.workspaceDir,containerWorkspaceDir:a.workspaceDir},runtimeInfo:{os:process.platform,node:process.version,model:t.llm.model,hostname:Ae.hostname()},currentDate:new Date().toISOString().split(`T`)[0],priorConversationSummary:x.priorSummary}),k=await r.dispatch(`before_prompt_build`,{prompt:d},i,{eventDispatcher:o});for(let e of k)e&&(e.systemPrompt&&(O=e.systemPrompt),e.prependContext&&(O=`${e.prependContext}\n\n${O}`));await r.dispatch(`after_prompt_build`,{prompt:d,systemPrompt:O},i,{eventDispatcher:o});let A=Za(ja(C,r,i,{eventDispatcher:o}),{sessionId:n,config:t.loopDetection},rt),j=t.llm.model,M=await r.dispatch(`before_model_resolve`,{prompt:d},i,{eventDispatcher:o});for(let e of M)e&&e.modelOverride&&(j=e.modelOverride);let N=h({...t.llm,model:j},n,t.messageId,t.channel),P=new ke({initialState:{systemPrompt:O,model:N,tools:A,messages:[]},getApiKey:e=>t.llm.apiKey});return x.messages.length>0&&P.replaceMessages(x.messages),{agent:P,resolvedModelId:j,historyMessages:x.messages,historyResult:x,workspaceDir:a.workspaceDir}}async function $a(e){let{sessionId:t,historyResult:n,runContext:r,eventDispatcher:i,hookRegistry:a,hookContext:o}=e;for(let e of n.compactionEvents??[])e.type===`compaction`&&await i.dispatchDiagnostic(t,{level:`info`,scope:`session`,phase:`history_compaction`,message:e.reason,details:{layer:e.layer,strategy:e.strategy,estimatedTokensFreed:e.estimatedTokensFreed,affectedEntries:e.affectedEntries,snapshotVersion:e.snapshotVersion}});if(n.compactionEntry){let e=n.stats.originalCount-n.stats.keptCount;await a.dispatch(`before_compaction`,{messageCount:n.stats.originalCount,compactingCount:e},o,{eventDispatcher:i}),await r.appendTranscriptEntry(n.compactionEntry),(n.compactionEvents?.length??0)===0&&await i.dispatchDiagnostic(t,{level:`info`,scope:`session`,phase:`history_compaction`,message:`Summarised ${e} older entries`,details:{strategy:`summary_only`,compactedCount:e}}),await a.dispatch(`after_compaction`,{messageCount:n.stats.originalCount,compactedCount:e},o,{eventDispatcher:i})}}async function eo(e){let{agent:t,message:n,continueFromHistory:r=!1,sessionId:i,modelId:a,historyMessages:o,eventDispatcher:s,skillUsageTracker:c,hooks:l,hookCtx:u,abortSignal:d,onTurnRecordProduced:f}=e,p=``,m=``,h=``,g=0,_=0,v,y,b=0,x=[],S=new Map,C=Oa(),w=qi(),T=t.subscribe(async e=>{let t=()=>!!w.signal;if(e.type===`message_update`){let n=e.assistantMessageEvent;if(n.type===`text_delta`&&typeof n.delta==`string`){if(t())return;let r=so(`partial`in n?n.partial:void 0)??so(`message`in n?n.message:void 0)??so(`message`in e?e.message:void 0),a=co(n.delta,r,m);a&&(await s.dispatchProgress(i,{type:`stream_text_delta`,text:a}),h+=a),r&&(m=r,h=r)}if(n.type===`done`){let e=n.message;if(t()){p=``,m=``,h=``,e.usage&&(g=e.usage.input,_=e.usage.output);return}p=oo(e);let r=co(``,p,h||m);r&&(await s.dispatchProgress(i,{type:`stream_text_delta`,text:r}),h+=r),m=p,h=p,e.usage&&(g=e.usage.input,_=e.usage.output)}return}if(e.type===`message_end`){let t=e.message;if(t.usage&&(g=t.usage.input,_=t.usage.output),t.role===`assistant`&&Array.isArray(t.content)){let e=t,n=oo(e);await l.dispatch(`assistant_message_end`,{sessionId:i,model:a,assistantText:n,assistantMessage:e,hasToolCalls:e.content.some(e=>e.type===`toolCall`),durationMs:b>0?Math.max(0,Date.now()-b):void 0,usage:t.usage?{input:g,output:_,total:g+_}:void 0},u)}return}if(e.type===`turn_end`){let t=e.message;(t.stopReason===`error`||t.stopReason===`aborted`)&&(y=t.errorMessage??(t.stopReason===`aborted`?`aborted`:`Unknown LLM error`));let n=(e.toolResults??[]).map(e=>({toolCallId:e.toolCallId,toolName:e.toolName,content:e.content.filter(e=>e.type===`text`).map(e=>e.text??``).join(``),isError:e.isError,toolResultRef:io(e.content.filter(e=>e.type===`text`).map(e=>e.text??``).join(``),i,e.toolCallId,e.toolName)}));if(x.push({message:t,toolResults:n}),f){let e=!!C.signal,r=!!w.signal;if(e&&C.signal.transparentPause||await f(no(to(t),e||r),r?[]:n.map(ro)),e||r)return}return}if(e.type===`tool_execution_start`){h=``,S.set(e.toolCallId,e.args),c.onToolExecutionStart({toolName:e.toolName,args:e.args}),await s.dispatchProgress(i,{type:`tool_start`,toolCallId:e.toolCallId,name:e.toolName,input:e.args});return}if(e.type===`tool_execution_end`){await c.onToolExecutionEnd({toolName:e.toolName,isError:e.isError});let t=typeof e.result==`string`?e.result:JSON.stringify(e.result),n=S.get(e.toolCallId);if(S.delete(e.toolCallId),w.signal)return;await s.dispatchProgress(i,{type:`tool_end`,toolCallId:e.toolCallId,name:e.toolName,input:n,output:t,isError:e.isError})}});try{if(await l.dispatch(`llm_input`,{sessionId:i,model:a,prompt:typeof n==`string`?n:JSON.stringify(n),historyMessages:o},u),d?.aborted)throw Error(`aborted`);b=Date.now(),await ka(C,async()=>{await Ji(w,async()=>{r?await t.continue():await t.prompt(n)})});let e=C.signal;if(e)throw e;let c=w.signal;if(c)throw c;if(!v){let e=typeof t.state.error==`string`?t.state.error:void 0,n=y??e;n&&(v=lo(n),await s.dispatchProgress(i,{type:`error`,message:v}))}}catch(e){if(sr(e)||Gi(e))throw e;v=lo(e),await s.dispatchProgress(i,{type:`error`,message:v})}finally{T()}let E=x.length>0?x[x.length-1]?.message:void 0;await l.dispatch(`llm_output`,{sessionId:i,model:a,assistantTexts:p?[p]:[],lastAssistant:E,usage:{input:g,output:_,total:g+_}},u);let D=w.signal?``:x.length>0?oo(x[x.length-1].message):``;if(C.signal)throw C.signal;if(w.signal)throw w.signal;return f&&x.length===0&&p.trim().length>0&&await f({role:`assistant`,content:p,timestamp:new Date().toISOString()},[]),{text:D||p,inputTokens:g,outputTokens:_,error:v,turnRecords:x}}function to(e){let t=e.content.filter(e=>e.type===`text`).map(e=>e.text).join(``),n=e.content.filter(e=>e.type===`toolCall`).map(e=>({id:e.id,name:e.name,arguments:e.arguments}));if(t.trim().length===0&&n.length===0)return null;let r={role:`assistant`,content:t,timestamp:new Date().toISOString()};return n.length>0&&(r.toolCalls=n),r}function no(e,t){return!e||!t?e:!e.toolCalls||e.toolCalls.length===0?null:{...e,content:``}}function ro(e){return{role:`tool_result`,toolCallId:e.toolCallId,toolName:e.toolName,content:e.content,isError:e.isError,toolResultRef:e.toolResultRef,timestamp:new Date().toISOString()}}function io(e,t,n,r){let i=e.match(/\[tool result persisted\][^\n]*\((\d+) chars\)\.\nFull output: ([^\n]+)/);if(i)return{sessionId:t,toolCallId:n,toolName:r,storagePath:i[2]??``,preview:ao(e),originalChars:Number(i[1]??`0`),truncated:!0,createdAt:new Date().toISOString()}}function ao(e){let t=e.indexOf(`
54
+ `)}function Yi(){return[`## Scenes`,'If the user message contains a `<scenes category="..." type="..." items="...">...</scenes>` tag, treat it as an explicit scene activation request.',"In this tag, `category` means the scene category, `type` means the scene name, and `items` means the item list required by that scene.","The `category`, `type`, and `items` attributes may each contain one or more comma-separated values. You must split them on commas, trim whitespace, and use every requested value.","Before executing the task, you must enumerate every requested `<category, scene, item>` combination derived from those attributes.","For each requested item, you must inspect `/scenes/<category>/<scene>/<item>/` and read that item's `SKILL.md` with `read_file`.","If one `<scenes ...>` tag requests multiple items for the same scene, you must load them one by one. Do not stop after the first matching item.","Do not start implementation, analysis, tool execution, or user-facing conclusions until all required scene `SKILL.md` files have been read.","After reading those scene `SKILL.md` files, you must follow their instructions as mandatory task-specific guidance unless a higher-priority instruction overrides them.","Scene skills are not loaded by default. Only load them when the user explicitly includes the `<scenes ...>` tag.","When a scene is activated, you must load scene instructions only from `/scenes/<category>/<scene>/<item>/SKILL.md`.","Do not load, match, or fall back to scene instructions from `<dataDir>/.aimax/skills`.","Do not load, match, or fall back to scene instructions from `/aimax/extensions/`.","Do not load, match, or fall back to scene instructions from any path declared in `<available_skills>`.",`Do not ignore, rewrite, or drop the scene tag semantics even if the natural-language request looks answerable without scene skills.`,``].join(`
55
+ `)}function Xi(){return[`## Memory Write`,`When the user asks to remember something or new long-term memory is needed, you must use memory_append. Do not use write_file or edit_file for memory writes.`,``].join(`
56
+ `)}function Zi(e){return[`## Memory Recall`,`Before answering anything about prior work, decisions, dates, people, preferences, or todos: run memory_search on MEMORY.md + memory/*.md; then use memory_get to pull only the needed lines. If low confidence after search, say you checked.`,e===`off`?`Citations are disabled: do not include memory file paths or line numbers unless the user explicitly asks.`:`When useful, include memory evidence as Source: <path#line>.`,``].join(`
57
+ `)}function Qi(e){let t=`${e.dataDir}/.aimax`,n=`${e.dataDir}/workspace`,r=e.sandboxInfo?.hostWorkspaceDir?.trim()||n,i=e.sandboxInfo?.containerWorkspaceDir?.trim(),a=e.sandboxInfo?.enabled&&i?`For file tools, paths resolve against the cloud workspace mount ${r}. For exec commands, use paths under ${i} (or relative paths from there). Prefer relative paths whenever possible.`:`This cloud workspace is mounted user storage. Prefer relative paths to keep file tools and shell commands aligned.`;return[`## Workspace`,`Your cloud working directory is: ${r}`,a,`User identity, memory, and agent state live under ${t}, not inside the cloud workspace.`,`Files such as AGENTS.md, SOUL.md, TOOLS.md, IDENTITY.md, USER.md, HEARTBEAT.md, MEMORY.md, and the memory/ directory belong under ${t}.`,`Only create or update those files at their real .aimax paths. Never create cloud workspace copies like ${r}/AGENTS.md or ${r}/MEMORY.md unless the user explicitly asks for separate cloud documents.`,``].join(`
58
+ `)}function $i(e){if(!e?.enabled)return``;let t=[`## Sandbox`,`You are running in a containerized cloud CLI runtime.`];return e.containerWorkspaceDir?.trim()&&t.push(`Container workdir: ${e.containerWorkspaceDir.trim()}`),e.hostWorkspaceDir?.trim()&&t.push(`Host-mounted workspace: ${e.hostWorkspaceDir.trim()}`),t.push(``),t.join(`
59
+ `)}function ea(e){let t=[];if(e.timezone&&t.push(`Time zone: ${e.timezone}`),e.currentDate){t.push(`Current date: ${e.currentDate}`);let n=ta(e.currentDate);n&&t.push(`Day of week: ${n}`)}return t.length===0?``:[`## Current Date & Time`,...t,``].join(`
60
+ `)}function ta(e){let t=/^(\d{4})-(\d{2})-(\d{2})$/.exec(e.trim());if(!t)return null;let n=Number(t[1]),r=Number(t[2]),i=Number(t[3]),a=new Date(Date.UTC(n,r-1,i));return Number.isNaN(a.getTime())||a.getUTCFullYear()!==n||a.getUTCMonth()!==r-1||a.getUTCDate()!==i?null:[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`][a.getUTCDay()]}function na(e){if(e.isMinimal||!e.enabled)return``;let t=(e.channels??[]).map(e=>e.trim()).filter(Boolean);return[`## Messaging`,`Reply in the current session for user-visible responses.`,`Use subagent tools only when the user or system instructions explicitly require subagents, delegation, or parallel agent execution; otherwise stay in the current agent.`,`Do not use shell/network commands to bypass the platform messaging pipeline.`,t.length>0?`Configured channels: ${t.join(` | `)}`:``,``].filter(Boolean).join(`
61
+ `)}function ra(e){if(e.isMinimal)return``;let t=e.docs,n=[`## Documentation`,t?.localPath?`Cloud docs mount: ${t.localPath}`:``,t?.webUrl?`Docs mirror: ${t.webUrl}`:``,t?.sourceUrl?`Source: ${t.sourceUrl}`:``,`For AiMax behavior, configuration, and architecture questions, consult documentation first.`,``].filter(Boolean);return n.length<=2?``:n.join(`
62
+ `)}function ia(e){if(!e)return``;let t=[e.hostname?`host=${e.hostname}`:``,e.os?`os=${e.os}`:``,e.node?`node=${e.node}`:``,e.model?`model=${e.model}`:``].filter(Boolean);return t.length===0?``:[`## Runtime`,`Runtime: ${t.join(` | `)}`,``].join(`
63
+ `)}function aa(e){return e.isMinimal?``:[`## Silent Replies`,`Do not send empty or filler replies.`,`If a tool already delivered the user-visible output, keep your final reply minimal and avoid duplication.`,``].join(`
64
+ `)}function oa(e){return e.isMinimal?``:[`## Heartbeats`,`Heartbeat prompt: ${e.heartbeatPrompt?.trim()||`Read HEARTBEAT.md if it exists (cloud workspace context). Follow it strictly. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK.`}`,`If a user message matches the heartbeat prompt and nothing needs attention, reply exactly: HEARTBEAT_OK`,`If something needs attention, do NOT include "HEARTBEAT_OK"; respond with the alert text instead.`,``].join(`
65
+ `)}function sa(e){let t=e.contextFiles,n=(e.bootstrapWarnings??[]).map(e=>e.trim()).filter(Boolean);if(t.length===0&&n.length===0)return``;let r=t.some(e=>(e.path.split(`/`).pop()?.toLowerCase()??``)===`soul.md`),i=[`# Project Context`,``];if(n.length>0){i.push(`⚠ Bootstrap truncation warning:`);for(let e of n)i.push(`- ${e}`);i.push(``)}t.length>0&&(i.push(`The following project context files have been loaded:`),i.push(`These are source-of-truth cloud files at their shown paths. If you update them, use the exact path shown in the heading, especially for files under .aimax.`)),r&&i.push(`If SOUL.md is present, embody its persona and tone. Avoid stiff, generic replies; follow its guidance unless higher-priority instructions override it.`),i.push(``);for(let e of t)i.push(`## ${e.path}`,``,e.content,``);return i.join(`
66
+ `)}function ca(e){return e?.trim()?[`## Prior Conversation Summary`,`The following is a summary of the conversation history that occurred before the current context window.`,`Use it to maintain continuity with earlier work.`,``,e.trim(),``].join(`
67
+ `):``}function la(e){let t=e.promptMode??`full`,n=t===`minimal`;if(t===`none`)return`You are a personal assistant running inside AiMax.`;let r=e.toolNames&&e.toolNames.length>0?e.toolNames:[...Ui],i=e.skills??[],a=e.contextFiles??[];return[`You are a personal assistant running inside AiMax.
68
+ `,Gi({toolNames:r,toolSummaries:e.toolSummaries}),qi(n),Ki(),Ji(i),Yi(),Xi(),Zi(e.memoryCitationsMode??`off`),Qi({dataDir:e.dataDir,sandboxInfo:e.sandboxInfo}),$i(e.sandboxInfo),ea({currentDate:e.currentDate,timezone:e.timezone}),na({isMinimal:n,enabled:e.messaging?.enabled,channels:e.messaging?.channels}),ra({isMinimal:n,docs:e.docs}),aa({isMinimal:n}),oa({isMinimal:n,heartbeatPrompt:e.heartbeatPrompt}),ia(e.runtimeInfo),sa({contextFiles:a,bootstrapWarnings:e.bootstrapWarnings}),ca(e.priorConversationSummary)].filter(Boolean).join(`
69
+ `)}const ua=new Fe;async function da(e,t){return await ua.run(e,t)}function fa(e){return{async emit(t){let n=ua.getStore();if(!n||n.pluginId!==e)throw Error(`Plugin ${e} cannot emit progress outside its runtime context`);if(!n.hookContext.sessionId)throw Error(`Plugin ${e} cannot emit progress without an active session`);await n.eventDispatcher.dispatchProgress(n.hookContext.sessionId,{type:`custom`,pluginId:e,name:t.name,label:t.label,data:t.data})}}}const pa=Symbol(`pluginToolOwner`);var ma=class{tools=[];uiTools=[];register(e,t,n){let r=t.name,i=n?.names??(n?.name?[n.name]:r?[r]:[]);Object.defineProperty(t,pa,{value:e,enumerable:!1,configurable:!1,writable:!1}),this.tools.push({pluginId:e,tool:t,optional:n?.optional??!1,names:i})}registerUiTool(e,t,n){this.uiTools.push({pluginId:e,descriptor:t,optional:n?.optional??!1})}list(){return[...this.tools]}listUiTools(){return[...this.uiTools]}namesForPlugin(e){let t=this.tools.filter(t=>t.pluginId===e).flatMap(e=>e.names),n=this.uiTools.filter(t=>t.pluginId===e).map(e=>e.descriptor.name);return[...t,...n]}resolveEnabled(e){let t=new Set((e??[]).map(e=>e.trim()).filter(Boolean));return this.tools.filter(e=>{if(!e.optional)return!0;if(t.size===0)return!1;if(t.has(e.pluginId))return!0;for(let n of e.names)if(t.has(n))return!0;return!1}).map(e=>e.tool)}resolveUiTools(e,t,n){let r=new Set((n??[]).map(e=>e.trim()).filter(Boolean));return this.uiTools.filter(e=>e.optional?r.size===0?!1:!!(r.has(e.pluginId)||r.has(e.descriptor.name)):!0).map(n=>{let r=Bi({name:n.descriptor.name,label:n.descriptor.label,description:n.descriptor.description,sessionId:e,inputSchema:n.descriptor.inputSchema,outputSchema:n.descriptor.outputSchema,extra:n.descriptor.extra,validate:n.descriptor.validate,resume:t});return Object.defineProperty(r,pa,{value:n.pluginId,enumerable:!1,configurable:!1,writable:!1}),r})}};function ha(e){return e[pa]}const ga=new Fe;function _a(){return{}}async function va(e,t){return await ga.run(e,t)}function ya(e){let t=ga.getStore();!t||t.signal||(t.signal=e)}function ba(e,t,n,r){return e.map(e=>{let i=e,a=e.name??`unknown`,o=ha(e);return{...i,async execute(e,s,c,l){let u=Date.now(),d=s??{},f=!1,p,m=async e=>o?await da({pluginId:o,hookContext:n,eventDispatcher:r.eventDispatcher},e):await e(),h=await t.dispatch(`before_tool_call`,{toolCallId:e,toolName:a,params:d},n,r);for(let e of h)e&&(e.params&&(d=e.params),e.block&&(f=!0,p=e.blockReason));if(f)return await t.dispatch(`after_tool_call`,{toolCallId:e,toolName:a,params:d,error:p??`blocked by plugin`,durationMs:Date.now()-u},n,r),{content:[{type:`text`,text:p??`Tool blocked by plugin`}],isError:!0,details:{}};try{let o=await m(async()=>await i.execute(e,d,c,l));return await t.dispatch(`after_tool_call`,{toolCallId:e,toolName:a,params:d,result:o,durationMs:Date.now()-u},n,r),o}catch(i){if(q(i)){ya(i);let o={content:[{type:`text`,text:i.message}],isError:!0,details:{}};return await t.dispatch(`after_tool_call`,{toolCallId:e,toolName:a,params:d,result:o,durationMs:Date.now()-u},n,r),o}throw await t.dispatch(`after_tool_call`,{toolCallId:e,toolName:a,params:d,error:String(i),durationMs:Date.now()-u},n,r),i}}}})}var xa=class{hooks=new Map;register(e){let t=this.hooks.get(e.hookName)??[];t.push(e),t.sort((e,t)=>(e.priority??0)-(t.priority??0)),this.hooks.set(e.hookName,t)}async dispatch(e,t,n,r){let i=this.hooks.get(e)??[],a=[];for(let e of i){let i=async()=>await e.handler(t,n),o=r?await da({pluginId:e.pluginId,hookContext:n,eventDispatcher:r.eventDispatcher},i):await i();a.push(o)}return a}};const X={enabled:!1,historySize:30,warningThreshold:10,criticalThreshold:20,globalCircuitBreakerThreshold:30,detectors:{genericRepeat:!0,knownPollNoProgress:!0,pingPong:!0}};function Sa(e,t){return typeof e!=`number`||!Number.isInteger(e)||e<=0?t:e}function Ca(e){let t=Sa(e?.warningThreshold,X.warningThreshold),n=Sa(e?.criticalThreshold,X.criticalThreshold),r=Sa(e?.globalCircuitBreakerThreshold,X.globalCircuitBreakerThreshold);return n<=t&&(n=t+1),r<=n&&(r=n+1),{enabled:e?.enabled??X.enabled,historySize:Sa(e?.historySize,X.historySize),warningThreshold:t,criticalThreshold:n,globalCircuitBreakerThreshold:r,detectors:{genericRepeat:e?.detectors?.genericRepeat??X.detectors.genericRepeat,knownPollNoProgress:e?.detectors?.knownPollNoProgress??X.detectors.knownPollNoProgress,pingPong:e?.detectors?.pingPong??X.detectors.pingPong}}}function Z(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function wa(e,t){return`${e}:${Q(t)}`}function Ta(e){if(typeof e!=`object`||!e)return JSON.stringify(e);if(Array.isArray(e))return`[${e.map(Ta).join(`,`)}]`;let t=e;return`{${Object.keys(t).toSorted().map(e=>`${JSON.stringify(e)}:${Ta(t[e])}`).join(`,`)}}`}function Ea(e){try{return Ta(e)}catch{return e==null?`${e}`:typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`?`${e}`:e instanceof Error?`${e.name}:${e.message}`:Object.prototype.toString.call(e)}}function Q(e){let t=Ea(e);return De(`sha256`).update(t).digest(`hex`)}function Da(e,t){if(e===`command_status`)return!0;if(e!==`process`||!Z(t))return!1;let n=t.action;return n===`poll`||n===`log`}function Oa(e){return!Z(e)||!Array.isArray(e.content)?``:e.content.filter(e=>Z(e)&&typeof e.type==`string`&&typeof e.text==`string`).map(e=>e.text).join(`
70
+ `).trim()}function ka(e){return e instanceof Error?e.message||e.name:typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`?`${e}`:Ta(e)}function Aa(e,t,n,r){if(r!==void 0)return`error:${Q(ka(r))}`;if(!Z(n))return n===void 0?void 0:Q(n);let i=Z(n.details)?n.details:{},a=Oa(n);if(Da(e,t)&&e===`process`&&Z(t)){let e=t.action;if(e===`poll`)return Q({action:e,status:i.status,exitCode:i.exitCode??null,exitSignal:i.exitSignal??null,aggregated:i.aggregated??null,text:a});if(e===`log`)return Q({action:e,status:i.status,totalLines:i.totalLines??null,totalChars:i.totalChars??null,truncated:i.truncated??null,exitCode:i.exitCode??null,exitSignal:i.exitSignal??null,text:a})}return Q({details:i,text:a})}function ja(e,t,n){let r=0,i;for(let a=e.length-1;a>=0;--a){let o=e[a];if(!(!o||o.toolName!==t||o.argsHash!==n)&&!(typeof o.resultHash!=`string`||!o.resultHash)){if(!i){i=o.resultHash,r=1;continue}if(o.resultHash!==i)break;r+=1}}return{count:r,latestResultHash:i}}function Ma(e,t){let n=e.at(-1);if(!n)return{count:0,noProgressEvidence:!1};let r,i;for(let t=e.length-2;t>=0;--t){let a=e[t];if(a&&a.argsHash!==n.argsHash){r=a.argsHash,i=a.toolName;break}}if(!r||!i)return{count:0,noProgressEvidence:!1};let a=0;for(let t=e.length-1;t>=0;--t){let i=e[t];if(!i)continue;let o=a%2==0?n.argsHash:r;if(i.argsHash!==o)break;a+=1}if(a<2||t!==r)return{count:0,noProgressEvidence:!1};let o=Math.max(0,e.length-a),s,c,l=!0;for(let t=o;t<e.length;t+=1){let i=e[t];if(i){if(!i.resultHash){l=!1;break}if(i.argsHash===n.argsHash){if(!s)s=i.resultHash;else if(s!==i.resultHash){l=!1;break}continue}if(i.argsHash===r){if(!c)c=i.resultHash;else if(c!==i.resultHash){l=!1;break}continue}l=!1;break}}return(!s||!c)&&(l=!1),{count:a+1,pairedToolName:n.toolName,pairedSignature:n.argsHash,noProgressEvidence:l}}function Na(e,t){return[e,t].toSorted().join(`|`)}function Pa(e,t,n,r){let i=Ca(r);if(!i.enabled)return{stuck:!1};let a=e.toolCallHistory??[],o=wa(t,n),s=ja(a,t,o),c=s.count,l=Da(t,n),u=Ma(a,o);if(c>=i.globalCircuitBreakerThreshold)return{stuck:!0,level:`critical`,detector:`global_circuit_breaker`,count:c,message:`CRITICAL: ${t} has repeated identical no-progress outcomes ${c} times. Session execution blocked by global circuit breaker to prevent runaway loops.`,warningKey:`global:${t}:${o}:${s.latestResultHash??`none`}`};if(l&&i.detectors.knownPollNoProgress&&c>=i.criticalThreshold)return{stuck:!0,level:`critical`,detector:`known_poll_no_progress`,count:c,message:`CRITICAL: Called ${t} with identical arguments and no progress ${c} times. This appears to be a stuck polling loop. Session execution blocked to prevent resource waste.`,warningKey:`poll:${t}:${o}:${s.latestResultHash??`none`}`};if(l&&i.detectors.knownPollNoProgress&&c>=i.warningThreshold)return{stuck:!0,level:`warning`,detector:`known_poll_no_progress`,count:c,message:`WARNING: You have called ${t} ${c} times with identical arguments and no progress. Stop polling and either (1) increase wait time between checks, or (2) report the task as failed if the process is stuck.`,warningKey:`poll:${t}:${o}:${s.latestResultHash??`none`}`};let d=u.pairedSignature?`pingpong:${Na(o,u.pairedSignature)}`:`pingpong:${t}:${o}`;if(i.detectors.pingPong&&u.count>=i.criticalThreshold&&u.noProgressEvidence)return{stuck:!0,level:`critical`,detector:`ping_pong`,count:u.count,message:`CRITICAL: You are alternating between repeated tool-call patterns (${u.count} consecutive calls) with no progress. This appears to be a stuck ping-pong loop. Session execution blocked to prevent resource waste.`,pairedToolName:u.pairedToolName,warningKey:d};if(i.detectors.pingPong&&u.count>=i.warningThreshold)return{stuck:!0,level:`warning`,detector:`ping_pong`,count:u.count,message:`WARNING: You are alternating between repeated tool-call patterns (${u.count} consecutive calls). This looks like a ping-pong loop; stop retrying and report the task as failed.`,pairedToolName:u.pairedToolName,warningKey:d};let f=a.filter(e=>e.toolName===t&&e.argsHash===o).length;return!l&&i.detectors.genericRepeat&&f>=i.warningThreshold?{stuck:!0,level:`warning`,detector:`generic_repeat`,count:f,message:`WARNING: You have called ${t} ${f} times with identical arguments. If this is not making progress, stop retrying and report the task as failed.`,warningKey:`generic:${t}:${o}`}:{stuck:!1}}function Fa(e,t,n,r,i){let a=Ca(i);e.toolCallHistory||=[],e.toolCallHistory.push({toolName:t,argsHash:wa(t,n),toolCallId:r,timestamp:Date.now()}),e.toolCallHistory.length>a.historySize&&e.toolCallHistory.shift()}function Ia(e,t){let n=Ca(t.config),r=Aa(t.toolName,t.toolParams,t.result,t.error);if(!r)return;e.toolCallHistory||=[];let i=wa(t.toolName,t.toolParams),a=!1;for(let n=e.toolCallHistory.length-1;n>=0;--n){let o=e.toolCallHistory[n];if(o&&!(t.toolCallId&&o.toolCallId!==t.toolCallId)&&!(o.toolName!==t.toolName||o.argsHash!==i)&&o.resultHash===void 0){o.resultHash=r,a=!0;break}}a||e.toolCallHistory.push({toolName:t.toolName,argsHash:i,toolCallId:t.toolCallId,resultHash:r,timestamp:Date.now()}),e.toolCallHistory.length>n.historySize&&e.toolCallHistory.splice(0,e.toolCallHistory.length-n.historySize)}function La(e,t,n){e.toolLoopWarningBuckets||=new Map;let r=Math.floor(n/10);if(r<=(e.toolLoopWarningBuckets.get(t)??0))return!1;if(e.toolLoopWarningBuckets.set(t,r),e.toolLoopWarningBuckets.size>256){let t=e.toolLoopWarningBuckets.keys().next().value;t&&e.toolLoopWarningBuckets.delete(t)}return!0}function Ra(e){return e&&e.trim()||`tool`}function za(e,t,n){if(!e.execute)return e;let r=Ra(e.name),i=e.execute.bind(e);return{...e,execute:async(e,a,o,s)=>{let c=n(t.sessionId),l=Pa(c,r,a,t.config);if(l.stuck){if(l.level===`critical`)throw Error(l.message);La(c,l.warningKey??`${l.detector}:${r}`,l.count)&&t.onWarning?.(l)}Fa(c,r,a,e,t.config);try{let n=await i(e,a,o,s);return Ia(c,{toolName:r,toolParams:a,toolCallId:e,result:n,config:t.config}),n}catch(n){throw Ia(c,{toolName:r,toolParams:a,toolCallId:e,error:n,config:t.config}),n}}}}function Ba(e,t,n){return e.map(e=>za(e,t,n))}async function Va(e){let{session:{runParams:t,sessionId:n,hookRegistry:r,hookContext:i,runContext:a,eventDispatcher:o},runtimeInputs:{contextFiles:s,bootstrapWarnings:c,skills:u,effectivePromptText:d,pluginTools:f},dependencies:{registry:p,spawnFn:m,createModel:h,abortSignal:g}}=e,_=t.channel===`CRON`,v=_?[]:await l(t.dataDir,n,{storeName:t.sessionStoreName}),y={model:t.llm.model,api:`openai-completions`},b=await ar({dataDir:t.dataDir,sessionId:n,sessionStoreName:t.sessionStoreName}),x=_?{messages:[],priorSummary:void 0,compactionEntry:void 0,stats:{originalCount:0,keptCount:0,estimatedTokens:0,compacted:!1},compactionEvents:[]}:await or({entries:v,modelInfo:y,contextWindowTokens:t.llm.contextWindow??2e5,llm:{baseUrl:t.llm.baseUrl,apiKey:t.llm.apiKey,model:t.llm.model},historyLimit:t.historyLimit,compactionEnabled:!0,pendingUserMessage:d,signal:g,hooks:r,hookCtx:i,contextManager:b,dataDir:t.dataDir,sessionId:n});await Ha({sessionId:n,historyResult:x,runContext:a,eventDispatcher:o,hookRegistry:r,hookContext:i});let S=t.subagentContext?.depth??0,C=[...Vi(t.dataDir,{sessionId:t.subagentContext?.parentSessionId??n,registry:p,parentSessionId:n,depth:S,channel:t.channel,llm:t.llm,inheritedRunParams:{sessionStoreName:t.sessionStoreName,plugins:t.plugins,memory:t.memory,messaging:t.messaging,docs:t.docs,historyLimit:t.historyLimit,onProgress:t.onProgress,messageId:t.messageId},loopDetection:t.loopDetection,memoryOptions:{providerId:a.memoryProviderId,pluginId:a.memoryPluginId,sessionId:n,onMemoryChanged:async()=>{}},contextManager:b,hitlResume:t.hitlResume,spawnFn:m}),...f],w=C.map(e=>typeof e.name==`string`?e.name.trim():``).filter(Boolean),T={};for(let e of C){let t=typeof e.name==`string`?e.name.trim():``,n=typeof e.description==`string`?e.description.trim():``;!t||!n||T[t]||(T[t]=n)}let E=t.messaging?.enabled??t.channel!==`CRON`,D=t.messaging?.channels&&t.messaging.channels.length>0?t.messaging.channels:[t.channel],O=la({dataDir:t.dataDir,skills:u,contextFiles:s,toolNames:w,toolSummaries:T,promptMode:S>0?`minimal`:`full`,bootstrapWarnings:c,memoryCitationsMode:t.memory?.citationsMode??`off`,messaging:{enabled:E,channels:D},docs:{localPath:t.docs?.localPath,webUrl:t.docs?.webUrl,sourceUrl:t.docs?.sourceUrl},sandboxInfo:{enabled:!0,hostWorkspaceDir:a.workspaceDir,containerWorkspaceDir:a.workspaceDir},runtimeInfo:{os:process.platform,node:process.version,model:t.llm.model,hostname:Ae.hostname()},currentDate:new Date().toISOString().split(`T`)[0],priorConversationSummary:x.priorSummary}),k=await r.dispatch(`before_prompt_build`,{prompt:d},i,{eventDispatcher:o});for(let e of k)e&&(e.systemPrompt&&(O=e.systemPrompt),e.prependContext&&(O=`${e.prependContext}\n\n${O}`));await r.dispatch(`after_prompt_build`,{prompt:d,systemPrompt:O},i,{eventDispatcher:o});let A=Ba(ba(C,r,i,{eventDispatcher:o}),{sessionId:n,config:t.loopDetection},rt),j=t.llm.model,M=await r.dispatch(`before_model_resolve`,{prompt:d},i,{eventDispatcher:o});for(let e of M)e&&e.modelOverride&&(j=e.modelOverride);let N=h({...t.llm,model:j},n,t.messageId,t.channel),P=new ke({initialState:{systemPrompt:O,model:N,tools:A,messages:[]},getApiKey:e=>t.llm.apiKey});return x.messages.length>0&&P.replaceMessages(x.messages),{agent:P,resolvedModelId:j,historyMessages:x.messages,historyResult:x,contextManager:b,usageBaselineTranscriptEntryCount:v.length,workspaceDir:a.workspaceDir}}async function Ha(e){let{sessionId:t,historyResult:n,runContext:r,eventDispatcher:i,hookRegistry:a,hookContext:o}=e;for(let e of n.compactionEvents??[])e.type===`compaction`&&await i.dispatchDiagnostic(t,{level:`info`,scope:`session`,phase:`history_compaction`,message:e.reason,details:{layer:e.layer,strategy:e.strategy,estimatedTokensFreed:e.estimatedTokensFreed,affectedEntries:e.affectedEntries,snapshotVersion:e.snapshotVersion}});if(n.compactionEntry){let e=n.stats.originalCount-n.stats.keptCount;await a.dispatch(`before_compaction`,{messageCount:n.stats.originalCount,compactingCount:e},o,{eventDispatcher:i}),await r.appendTranscriptEntry(n.compactionEntry),(n.compactionEvents?.length??0)===0&&await i.dispatchDiagnostic(t,{level:`info`,scope:`session`,phase:`history_compaction`,message:`Summarised ${e} older entries`,details:{strategy:`summary_only`,compactedCount:e}}),await a.dispatch(`after_compaction`,{messageCount:n.stats.originalCount,compactedCount:e},o,{eventDispatcher:i})}}async function Ua(e){let{agent:t,message:n,continueFromHistory:r=!1,sessionId:i,modelId:a,historyMessages:o,eventDispatcher:s,skillUsageTracker:c,hooks:l,hookCtx:u,abortSignal:d,onTurnRecordProduced:f}=e,p=``,m=``,h=``,g=0,_=0,v,y,b=0,x=[],S=new Map,C=_a(),w=Ii(),T=t.subscribe(async e=>{let t=()=>!!w.signal;if(e.type===`message_update`){let n=e.assistantMessageEvent;if(n.type===`text_delta`&&typeof n.delta==`string`){if(t())return;let r=Xa(`partial`in n?n.partial:void 0)??Xa(`message`in n?n.message:void 0)??Xa(`message`in e?e.message:void 0),a=Za(n.delta,r,m);a&&(await s.dispatchProgress(i,{type:`stream_text_delta`,text:a}),h+=a),r&&(m=r,h=r)}if(n.type===`done`){let e=n.message;if(t()){p=``,m=``,h=``,e.usage&&(g=e.usage.input,_=e.usage.output);return}p=Ya(e);let r=Za(``,p,h||m);r&&(await s.dispatchProgress(i,{type:`stream_text_delta`,text:r}),h+=r),m=p,h=p,e.usage&&(g=e.usage.input,_=e.usage.output)}return}if(e.type===`message_end`){let t=e.message;if(t.usage&&(g=t.usage.input,_=t.usage.output),t.role===`assistant`&&Array.isArray(t.content)){let e=t,n=Ya(e);await l.dispatch(`assistant_message_end`,{sessionId:i,model:a,assistantText:n,assistantMessage:e,hasToolCalls:e.content.some(e=>e.type===`toolCall`),durationMs:b>0?Math.max(0,Date.now()-b):void 0,usage:t.usage?{input:g,output:_,total:g+_}:void 0},u)}return}if(e.type===`turn_end`){let t=e.message;(t.stopReason===`error`||t.stopReason===`aborted`)&&(y=t.errorMessage??(t.stopReason===`aborted`?`aborted`:`Unknown LLM error`));let n=(e.toolResults??[]).map(e=>({toolCallId:e.toolCallId,toolName:e.toolName,content:e.content.filter(e=>e.type===`text`).map(e=>e.text??``).join(``),isError:e.isError,toolResultRef:qa(e.content.filter(e=>e.type===`text`).map(e=>e.text??``).join(``),i,e.toolCallId,e.toolName)}));if(x.push({message:t,toolResults:n}),f){let e=!!C.signal,r=!!w.signal;if(e&&C.signal.transparentPause||await f(Ga(Wa(t),e||r),r?[]:n.map(Ka)),e||r)return}return}if(e.type===`tool_execution_start`){h=``,S.set(e.toolCallId,e.args),c.onToolExecutionStart({toolName:e.toolName,args:e.args}),await s.dispatchProgress(i,{type:`tool_start`,toolCallId:e.toolCallId,name:e.toolName,input:e.args});return}if(e.type===`tool_execution_end`){await c.onToolExecutionEnd({toolName:e.toolName,isError:e.isError});let t=typeof e.result==`string`?e.result:JSON.stringify(e.result),n=S.get(e.toolCallId);if(S.delete(e.toolCallId),w.signal)return;await s.dispatchProgress(i,{type:`tool_end`,toolCallId:e.toolCallId,name:e.toolName,input:n,output:t,isError:e.isError})}});try{if(await l.dispatch(`llm_input`,{sessionId:i,model:a,prompt:typeof n==`string`?n:JSON.stringify(n),historyMessages:o},u),d?.aborted)throw Error(`aborted`);b=Date.now(),await va(C,async()=>{await Li(w,async()=>{r?await t.continue():await t.prompt(n)})});let e=C.signal;if(e)throw e;let c=w.signal;if(c)throw c;if(!v){let e=typeof t.state.error==`string`?t.state.error:void 0,n=y??e;n&&(v=Qa(n),await s.dispatchProgress(i,{type:`error`,message:v}))}}catch(e){if(q(e)||Pi(e))throw e;v=Qa(e),await s.dispatchProgress(i,{type:`error`,message:v})}finally{T()}let E=x.length>0?x[x.length-1]?.message:void 0;await l.dispatch(`llm_output`,{sessionId:i,model:a,assistantTexts:p?[p]:[],lastAssistant:E,usage:{input:g,output:_,total:g+_}},u);let D=w.signal?``:x.length>0?Ya(x[x.length-1].message):``;if(C.signal)throw C.signal;if(w.signal)throw w.signal;return f&&x.length===0&&p.trim().length>0&&await f({role:`assistant`,content:p,timestamp:new Date().toISOString()},[]),{text:D||p,inputTokens:g,outputTokens:_,error:v,turnRecords:x}}function Wa(e){let t=e.content.filter(e=>e.type===`text`).map(e=>e.text).join(``),n=e.content.filter(e=>e.type===`toolCall`).map(e=>({id:e.id,name:e.name,arguments:e.arguments}));if(t.trim().length===0&&n.length===0)return null;let r={role:`assistant`,content:t,timestamp:new Date().toISOString()};return n.length>0&&(r.toolCalls=n),r}function Ga(e,t){return!e||!t?e:!e.toolCalls||e.toolCalls.length===0?null:{...e,content:``}}function Ka(e){return{role:`tool_result`,toolCallId:e.toolCallId,toolName:e.toolName,content:e.content,isError:e.isError,toolResultRef:e.toolResultRef,timestamp:new Date().toISOString()}}function qa(e,t,n,r){let i=e.match(/\[tool result persisted\][^\n]*\((\d+) chars\)\.\nFull output: ([^\n]+)/);if(i)return{sessionId:t,toolCallId:n,toolName:r,storagePath:i[2]??``,preview:Ja(e),originalChars:Number(i[1]??`0`),truncated:!0,createdAt:new Date().toISOString()}}function Ja(e){let t=e.indexOf(`
74
71
  Preview:
75
- `);return t===-1?``:e.slice(t+10).replace(/\n\.\.\.$/,``)}function oo(e){return e.content.filter(e=>e.type===`text`).map(e=>e.text).join(``)}function so(e){if(!e||typeof e!=`object`)return null;let t=e;return Array.isArray(t.content)?t.content.filter(e=>typeof e==`object`&&!!e&&`type`in e&&e.type===`text`&&`text`in e).map(e=>e.text).join(``):null}function co(e,t,n){return t?n?t===n?``:t.startsWith(n)?t.slice(n.length):t:t:e}function lo(e){let t=uo(e);return t?t.code===`http_error`&&t.statusCode?t.providerMessage?`LLM upstream returned HTTP ${t.statusCode}${t.statusText?` ${t.statusText}`:``}: ${t.providerMessage}`:`LLM upstream returned HTTP ${t.statusCode}${t.statusText?` ${t.statusText}`:``}`:t.code===`timeout`?`LLM request timed out`:t.code===`network_error`?t.message:t.code===`aborted`?`LLM request was aborted`:t.message:e instanceof Error?e.message:String(e)}function uo(e){if(e instanceof H)return e;if(!(e instanceof Error))return null;let t=e;return e.name!==`LlmRequestError`&&!t.code?null:{message:e.message,code:t.code,statusCode:t.statusCode,statusText:t.statusText,providerMessage:t.providerMessage}}async function fo(e){let{agent:t,registry:n,sessionId:r,resolvedModelId:i,eventDispatcher:a,skillUsageTracker:o,hookRegistry:s,hookContext:c,abortSignal:l,appendEntry:u}=e,d=0,f=``,p=0,m=0,h;for(;!l?.aborted&&n.needsAnnounce(r)&&d<10;){d++,await n.waitForAll(r);let e=n.consumeCompleted(r);if(e.length===0)break;for(let t of e)await a.dispatchProgress(r,{type:`subagent_complete`,childSessionId:t.childSessionId,task:t.task,status:t.status});let g=po(e);await u({role:`assistant`,content:g,timestamp:new Date().toISOString()});let _=await eo({agent:t,message:g,sessionId:r,modelId:i,historyMessages:[],eventDispatcher:a,skillUsageTracker:o,hooks:s,hookCtx:c,abortSignal:l,onTurnRecordProduced:async(e,t)=>{e&&await u(e);for(let e of t)await u(e)}});f=_.text,p+=_.inputTokens,m+=_.outputTokens,_.error&&!h&&(h=_.error)}return{text:f,inputTokens:p,outputTokens:m,error:h}}function po(e){if(e.length===1){let t=e[0];return Ii({task:t.task,label:t.label,status:t.status,result:t.result,error:t.error})}let t=e.map(e=>Ii({task:e.task,label:e.label,status:e.status,result:e.result,error:e.error}));return`[${e.length} subagents completed]\n\n${t.join(`
72
+ `);return t===-1?``:e.slice(t+10).replace(/\n\.\.\.$/,``)}function Ya(e){return e.content.filter(e=>e.type===`text`).map(e=>e.text).join(``)}function Xa(e){if(!e||typeof e!=`object`)return null;let t=e;return Array.isArray(t.content)?t.content.filter(e=>typeof e==`object`&&!!e&&`type`in e&&e.type===`text`&&`text`in e).map(e=>e.text).join(``):null}function Za(e,t,n){return t?n?t===n?``:t.startsWith(n)?t.slice(n.length):t:t:e}function Qa(e){let t=$a(e);return t?t.code===`http_error`&&t.statusCode?t.providerMessage?`LLM upstream returned HTTP ${t.statusCode}${t.statusText?` ${t.statusText}`:``}: ${t.providerMessage}`:`LLM upstream returned HTTP ${t.statusCode}${t.statusText?` ${t.statusText}`:``}`:t.code===`timeout`?`LLM request timed out`:t.code===`network_error`?t.message:t.code===`aborted`?`LLM request was aborted`:t.message:e instanceof Error?e.message:String(e)}function $a(e){if(e instanceof H)return e;if(!(e instanceof Error))return null;let t=e;return e.name!==`LlmRequestError`&&!t.code?null:{message:e.message,code:t.code,statusCode:t.statusCode,statusText:t.statusText,providerMessage:t.providerMessage}}async function eo(e){let{agent:t,registry:n,sessionId:r,resolvedModelId:i,eventDispatcher:a,skillUsageTracker:o,hookRegistry:s,hookContext:c,abortSignal:l,appendEntry:u}=e,d=0,f=``,p=0,m=0,h;for(;!l?.aborted&&n.needsAnnounce(r)&&d<10;){d++,await n.waitForAll(r);let e=n.consumeCompleted(r);if(e.length===0)break;for(let t of e)await a.dispatchProgress(r,{type:`subagent_complete`,childSessionId:t.childSessionId,task:t.task,status:t.status});let g=to(e);await u({role:`assistant`,content:g,timestamp:new Date().toISOString()});let _=await Ua({agent:t,message:g,sessionId:r,modelId:i,historyMessages:[],eventDispatcher:a,skillUsageTracker:o,hooks:s,hookCtx:c,abortSignal:l,onTurnRecordProduced:async(e,t)=>{e&&await u(e);for(let e of t)await u(e)}});f=_.text,p+=_.inputTokens,m+=_.outputTokens,_.error&&!h&&(h=_.error)}return{text:f,inputTokens:p,outputTokens:m,error:h}}function to(e){if(e.length===1){let t=e[0];return Ti({task:t.task,label:t.label,status:t.status,result:t.result,error:t.error})}let t=e.map(e=>Ti({task:e.task,label:e.label,status:e.status,result:e.result,error:e.error}));return`[${e.length} subagents completed]\n\n${t.join(`
76
73
 
77
74
  ---
78
75
 
79
- `)}`}function mo(e){if(!e)return null;let t=(typeof e==`string`?e:e.toString(`utf-8`)).replace(/\\/g,`/`).replace(/^\.\//,``).trim();return t.length>0?t:null}function ho(e){let t=mo(e.filename);if(e.kind===`memory-file`)return[`MEMORY.md`];if(e.kind===`memory-file-lower`)return[`memory.md`];if(e.kind===`memory-dir`){if(!t)return[`memory`];let e=I.basename(t).replace(/\\/g,`/`);return e.endsWith(`.md`)?[`memory/${e}`]:[]}return t?t===`MEMORY.md`||t===`memory.md`?[t]:t===`memory`?[`memory`]:t.startsWith(`memory/`)?t.endsWith(`.md`)?[t]:[`memory`]:[]:[`MEMORY.md`,`memory`]}function go(e){let t=e.watchFactory??((e,t,n)=>B.watch(e,t,n)),n=I.join(e.dataDir,`.aimax`),r=[{target:I.join(n,`MEMORY.md`),kind:`memory-file`},{target:I.join(n,`memory.md`),kind:`memory-file-lower`},{target:I.join(n,`memory`),kind:`memory-dir`},{target:n,kind:`memory-root`}],i=[],a=new Set,o=null,s=Number.isFinite(e.debounceMs)&&(e.debounceMs??0)>0?Math.floor(e.debounceMs):1500,c=async()=>{let t=Array.from(a);if(a.clear(),t.length===0)return;let n={reason:`external-watch`,files:t,source:`memory`,sessionId:e.sessionId,providerId:e.providerId,timestamp:new Date().toISOString()};e.provider?.sync&&await e.provider.sync(`external-watch`).catch(()=>{}),e.provider?.onMemoryChanged&&await Promise.resolve(e.provider.onMemoryChanged(n)).catch(()=>{}),e.onMemoryChanged&&await Promise.resolve(e.onMemoryChanged(n)).catch(()=>{})},l=()=>{o&&clearTimeout(o),o=setTimeout(()=>{o=null,c()},s)};for(let e of r)try{let n=t(e.target,{recursive:!1},(t,n)=>{let r=ho({kind:e.kind,filename:n});if(r.length!==0){for(let e of r)a.add(e);l()}});n.on?.(`error`,()=>{try{n.close()}catch{}}),i.push(n)}catch{}return()=>{o&&=(clearTimeout(o),null);for(let e of i)try{e.close()}catch{}}}async function _o(e){let{runParams:t,eventDispatcher:n,hookRegistry:r}=e,{sessionId:i,hookContext:a,memoryProviderId:o,memoryPluginId:s}=e,c=I.join(t.dataDir,`workspace`),l=new Map,u=new Map,d=!1,f=async e=>{let t=Date.now(),o=bo(e.files);if(o.length===0)return;let s=e.reason===`external-watch`&&e.source===`memory`?o.filter(e=>t-(l.get(e.toLowerCase())??0)>3e3):o;if(s.length===0)return;if(e.reason!==`external-watch`&&e.source===`memory`)for(let e of s)l.set(e.toLowerCase(),t);let c=`${e.reason}|${e.source}|${s.map(e=>e.toLowerCase()).sort().join(`|`)}`;if(t-(u.get(c)??0)<1e3)return;u.set(c,t);let d={...e,files:s};await n.dispatchProgress(e.sessionId??i,{type:`memory_changed`,reason:d.reason,files:d.files,source:d.source,providerId:d.providerId,timestamp:d.timestamp}).catch(()=>{}),await r.dispatch(`memory_changed`,d,{...a,sessionId:d.sessionId??a.sessionId},{eventDispatcher:n}).catch(()=>{})},p=I.join(t.dataDir,`.aimax`),m=k({providerId:o,pluginId:s,dataDir:t.dataDir,memoryDir:p,sessionId:i,sessionStoreName:t.sessionStoreName})?.provider??y({dataDir:t.dataDir,memoryDir:p,sessionId:i,sessionStoreName:t.sessionStoreName}),h=go({dataDir:t.dataDir,sessionId:i,providerId:o??s??m.id,provider:m,onMemoryChanged:f});m.sync&&m.sync(`session-start`).catch(()=>{});let g=async e=>{await _(t.dataDir,i,e,yo({sessionStoreName:t.sessionStoreName,providerId:o,pluginId:s,onMemoryChanged:f}))};return{workspaceDir:c,memoryProviderId:o,memoryPluginId:s,appendTranscriptEntry:g,persistInitialUserEntry:async e=>d?!1:(await g({role:`user`,content:e,timestamp:new Date().toISOString()}),d=!0,!0),stop:()=>{h()}}}function vo(e){let t=new Date().toISOString();return{id:e.sessionId,title:e.title,channel:e.channel,createdAt:t,updatedAt:t}}function yo(e){return e.sessionStoreName||e.providerId||e.pluginId?{storeName:e.sessionStoreName,providerId:e.providerId,pluginId:e.pluginId,onMemoryChanged:e.onMemoryChanged}:{onMemoryChanged:e.onMemoryChanged}}function bo(e){let t=[],n=new Set;for(let r of e){let e=r.replace(/\\/g,`/`).replace(/^\.\//,``).trim();if(!e)continue;let i=e.toLowerCase()===`memory.md`?`MEMORY.md`:e,a=i.toLowerCase();n.has(a)||(n.add(a),t.push(i))}return t}function xo(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function So(e){return Array.isArray(e)?e.map(e=>typeof e==`string`?e.trim():``).filter(Boolean):[]}function Co(){let e=Ae.homedir();if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function wo(e){let t=e.trim(),n=Co();return t===`~`?n:t.startsWith(`~/`)||t.startsWith(`~\\`)?n?I.join(n,t.slice(2)):void 0:I.resolve(t)}const To=new Ie({allErrors:!0,strict:!1}),Eo=new Map;function Do(e,t){let n=Eo.get(t);if(n)return n;let r=To.compile(e);return Eo.set(t,r),r}function Oo(e){let t=e.cacheKey??JSON.stringify(e.schema),n=Do(e.schema,t);return n(e.value)?{ok:!0}:{ok:!1,errors:(n.errors??[]).map(e=>({path:e.instancePath||`/`,message:e.message??`invalid`}))}}function ko(e){let t=So(e?.allow),n=So(e?.deny),r=So(e?.load?.paths),i=e?.entries??{},a=e?.slots??{};return{enabled:e?.enabled??!0,allow:Array.from(new Set(t)),deny:Array.from(new Set(n)),loadPaths:Array.from(new Set(r)),entries:i,slots:a}}function Ao(e){let t=[],{config:n,registry:r}=e,i=new Set(r.manifests.keys()),a=(e,n)=>i.has(e)?!0:(t.push({level:`error`,message:`unknown plugin id in ${n}: ${e}`,pluginId:e}),!1);for(let e of n.allow)a(e,`plugins.allow`);for(let e of n.deny)a(e,`plugins.deny`);for(let e of Object.keys(n.entries))a(e,`plugins.entries`);let o=n.slots??{};for(let[e,n]of Object.entries(o)){if(!n||n===`none`||!a(n,`plugins.slots.${e}`))continue;let i=r.manifests.get(n);i?.manifest.kind?i.manifest.kind!==e&&t.push({level:`error`,message:`plugin ${n} does not declare kind ${e}`,pluginId:n}):t.push({level:`error`,message:`plugin ${n} does not declare kind ${e}`,pluginId:n})}for(let[e,i]of Object.entries(n.entries)){let n=r.manifests.get(e);if(!n)continue;let a=n.manifest.configSchema,o=Oo({schema:a,cacheKey:`${e}:${n.manifestPath}`,value:i?.config??{}});if(!o.ok)for(let n of o.errors)t.push({level:`error`,message:`plugin config invalid (${e}) at ${n.path}: ${n.message}`,pluginId:e});i?.enabled===!1&&i?.config&&t.push({level:`warn`,message:`plugin config set while disabled: ${e}`,pluginId:e})}return{ok:t.every(e=>e.level!==`error`),diagnostics:t}}function jo(e){try{return B.realpathSync(e)}catch{return null}}function Mo(e){try{return B.statSync(e)}catch{return null}}function No(e,t){let n=I.relative(e,t);return n===``?!0:n.startsWith(`..`)?!1:!I.isAbsolute(n)}function Po(e){return`0o${e.toString(8).padStart(3,`0`)}`}const Fo=new Set([`.ts`,`.js`,`.mts`,`.cts`,`.mjs`,`.cjs`]),Io=[`index.ts`,`index.js`,`index.mts`,`index.cts`,`index.mjs`,`index.cjs`];function Lo(e){let t=I.join(e,`package.json`);if(B.existsSync(t))try{let e=JSON.parse(B.readFileSync(t,`utf-8`));return xo(e)?e:void 0}catch{return}}function Ro(e){let t=e?.aimax?.extensions;if(!Array.isArray(t))return{status:`missing`,entries:[]};let n=t.map(e=>typeof e==`string`?e.trim():``).filter(Boolean);return n.length===0?{status:`empty`,entries:[]}:{status:`ok`,entries:n}}function zo(e){return e===void 0?process.platform===`win32`||typeof process.getuid!=`function`?null:process.getuid():e}function Bo(e){let t=jo(e.source),n=jo(e.rootDir);return!t||!n||No(n,t)?null:{reason:`source_escapes_root`,sourcePath:e.source,rootPath:e.rootDir,targetPath:e.source,sourceRealPath:t,rootRealPath:n}}function Vo(e){if(process.platform===`win32`)return null;let t=[e.rootDir,e.source],n=new Set;for(let r of t){let t=I.resolve(r);if(n.has(t))continue;n.add(t);let i=Mo(r);if(!i)return{reason:`path_stat_failed`,sourcePath:e.source,rootPath:e.rootDir,targetPath:r};let a=i.mode&511;if(a&2)return{reason:`path_world_writable`,sourcePath:e.source,rootPath:e.rootDir,targetPath:r,modeBits:a};if(e.origin!==`bundled`&&e.uid!==null&&typeof i.uid==`number`&&i.uid!==e.uid&&i.uid!==0)return{reason:`path_suspicious_ownership`,sourcePath:e.source,rootPath:e.rootDir,targetPath:r,foundUid:i.uid,expectedUid:e.uid}}return null}function Ho(e){return Bo({source:e.source,rootDir:e.rootDir})||Vo({source:e.source,rootDir:e.rootDir,origin:e.origin,uid:zo(e.ownershipUid)})}function Uo(e){return e.reason===`source_escapes_root`?`blocked plugin candidate: source escapes plugin root (${e.sourcePath} -> ${e.sourceRealPath}; root=${e.rootRealPath})`:e.reason===`path_stat_failed`?`blocked plugin candidate: cannot stat path (${e.targetPath})`:e.reason===`path_world_writable`?`blocked plugin candidate: world-writable path (${e.targetPath}, mode=${Po(e.modeBits??0)})`:`blocked plugin candidate: suspicious ownership (${e.targetPath}, uid=${e.foundUid}, expected uid=${e.expectedUid} or root)`}function Wo(e){let t=Ho({source:e.source,rootDir:e.rootDir,origin:e.origin,ownershipUid:e.ownershipUid});return t?(e.diagnostics.push({level:`warn`,message:Uo(t),source:e.source}),!0):!1}function Go(e){return I.basename(e,I.extname(e))}function Ko(e){return{idHint:e.idHint,source:e.source,rootDir:e.rootDir,origin:e.origin,workspaceDir:e.workspaceDir,packageName:e.packageName,packageVersion:e.packageVersion,packageDescription:e.packageDescription,packageDir:e.packageDir,packageManifest:e.packageManifest}}function qo(e){for(let t of Io){let n=I.join(e,t);if(B.existsSync(n))return n}return null}function Jo(e){let t;try{t=B.readdirSync(e.rootDir,{withFileTypes:!0})}catch{return}for(let n of t){let t=I.join(e.rootDir,n.name);if(n.isFile()){if(!Fo.has(I.extname(n.name)))continue;let r=I.dirname(t);if(Wo({source:t,rootDir:r,origin:e.origin,diagnostics:e.diagnostics,ownershipUid:e.ownershipUid}))continue;e.candidates.push(Ko({idHint:Go(t),source:t,rootDir:r,origin:e.origin,workspaceDir:e.workspaceDir}));continue}if(!n.isDirectory())continue;let r=Lo(t),i=Ro(r);if(i.status===`ok`){for(let n of i.entries){let i=I.resolve(t,n);if(!No(t,i)){e.diagnostics.push({level:`warn`,message:`blocked plugin candidate: package entry escapes package root (${n})`,source:i});continue}if(!B.existsSync(i)){e.diagnostics.push({level:`warn`,message:`plugin entry missing: ${i}`,source:i});continue}if(!Fo.has(I.extname(i))){e.diagnostics.push({level:`warn`,message:`plugin entry not a supported extension: ${i}`,source:i});continue}if(Wo({source:i,rootDir:t,origin:e.origin,diagnostics:e.diagnostics,ownershipUid:e.ownershipUid}))continue;let a=r?.name?.trim(),o=a?`${a}/${Go(i)}`:Go(i);e.candidates.push(Ko({idHint:o,source:i,rootDir:t,origin:e.origin,workspaceDir:e.workspaceDir,packageName:r?.name,packageVersion:r?.version,packageDescription:r?.description,packageDir:t,packageManifest:r?.aimax}))}continue}let a=qo(t);a&&(Wo({source:a,rootDir:t,origin:e.origin,diagnostics:e.diagnostics,ownershipUid:e.ownershipUid})||e.candidates.push(Ko({idHint:I.basename(t),source:a,rootDir:t,origin:e.origin,workspaceDir:e.workspaceDir})))}}function Yo(e){return e?e.map(wo).filter(e=>typeof e==`string`&&e.length>0):[]}function Xo(){let e=Co();if(e)return I.join(e,`.aimax`,`extensions`)}function Zo(e){return I.join(e,`.aimax`,`extensions`)}function Qo(e){return I.join(e,`.aimax`,`extensions`)}function $o(e={}){let t=[],n=[],r=Yo(e.extraPaths);for(let i of r){if(!B.existsSync(i)){n.push({level:`warn`,message:`plugin path not found: ${i}`,source:i});continue}let r=Mo(i);if(!r){n.push({level:`warn`,message:`plugin path not readable: ${i}`,source:i});continue}if(r.isFile()){if(!Fo.has(I.extname(i))){n.push({level:`warn`,message:`plugin file has unsupported extension: ${i}`,source:i});continue}let r=I.dirname(i);if(Wo({source:i,rootDir:r,origin:`config`,diagnostics:n,ownershipUid:e.ownershipUid}))continue;t.push(Ko({idHint:Go(i),source:i,rootDir:r,origin:`config`,workspaceDir:e.workspaceDir}));continue}r.isDirectory()&&Jo({rootDir:i,origin:`config`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid})}e.dataDir?Jo({rootDir:Zo(e.dataDir),origin:`workspace`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid}):e.workspaceDir&&Jo({rootDir:Qo(e.workspaceDir),origin:`workspace`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid});let i=Xo();return i?Jo({rootDir:i,origin:`global`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid}):n.push({level:`warn`,message:`skipping global plugin discovery: home directory is unavailable`}),e.bundledDir&&Jo({rootDir:e.bundledDir,origin:`bundled`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid}),{candidates:t,diagnostics:n}}function es(e){let t=e.rejectHardlinks??!0,n=jo(e.rootPath),r=jo(e.absolutePath);if(!n||!r)return{ok:!1,reason:`path`};if(!No(n,r))return{ok:!1,reason:`unsafe`};let i;try{i=B.lstatSync(r)}catch{return{ok:!1,reason:`stat`}}if(t&&typeof i.nlink==`number`&&i.nlink>1)return{ok:!1,reason:`hardlink`};try{return{ok:!0,fd:B.openSync(r,`r`)}}catch{return{ok:!1,reason:`path`}}}const ts=`aimax.plugin.json`,ns=[ts];function rs(e){for(let t of ns){let n=I.join(e,t);if(B.existsSync(n))return n}return I.join(e,ts)}function is(e,t=!0){let n=rs(e),r=es({absolutePath:n,rootPath:e,rejectHardlinks:t});if(!r.ok){let e=r.reason;return e===`path`?{ok:!1,error:`plugin manifest not found: ${n}`,manifestPath:n}:{ok:!1,error:`unsafe plugin manifest path: ${n} (${e})`,manifestPath:n}}let i;try{i=JSON.parse(B.readFileSync(r.fd,`utf-8`))}catch(e){return{ok:!1,error:`failed to parse plugin manifest: ${String(e)}`,manifestPath:n}}finally{B.closeSync(r.fd)}if(!xo(i))return{ok:!1,error:`plugin manifest must be an object`,manifestPath:n};let a=typeof i.id==`string`?i.id.trim():``;if(!a)return{ok:!1,error:`plugin manifest requires id`,manifestPath:n};let o=xo(i.configSchema)?i.configSchema:null;if(!o)return{ok:!1,error:`plugin manifest requires configSchema`,manifestPath:n};let s=typeof i.kind==`string`?i.kind:void 0,c=typeof i.name==`string`?i.name.trim():void 0,l=typeof i.description==`string`?i.description.trim():void 0,u=typeof i.version==`string`?i.version.trim():void 0,d=So(i.skills),f;return xo(i.uiHints)&&(f=i.uiHints),{ok:!0,manifest:{id:a,configSchema:o,kind:s,name:c,description:l,version:u,skills:d,uiHints:f},manifestPath:n}}function as(e){let t=new Map,n=[];for(let r of e){let e=is(r.rootDir);if(!e.ok){n.push({level:`error`,message:e.error,source:r.source,pluginId:r.idHint});continue}let i=e.manifest.id;if(t.has(i)){n.push({level:`warn`,message:`duplicate plugin id ignored: ${i}`,source:r.source,pluginId:i});continue}t.set(i,{id:i,rootDir:r.rootDir,source:r.source,origin:r.origin,manifestPath:e.manifestPath,manifest:e.manifest})}return{manifests:t,diagnostics:n}}let os=function(e){return e.INFO=`INFO`,e.WARN=`WARN`,e.ERROR=`ERROR`,e}({});function ss(){let e=new Date;return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)} ${String(e.getHours()).padStart(2,`0`)}:${String(e.getMinutes()).padStart(2,`0`)}:${String(e.getSeconds()).padStart(2,`0`)}.${String(e.getMilliseconds()).padStart(3,`0`)}`}function cs(e,t,n,r){process.stderr.write(`[${ss()}] [${e}] [plugin:${t}][logger:${n}] ${r}\n`)}function ls(e){return{version:`0.1.0`,logging:{getLogger:t=>({info:n=>cs(os.INFO,e.pluginId,t,n),warn:n=>cs(os.WARN,e.pluginId,t,n),error:n=>cs(os.ERROR,e.pluginId,t,n)})}}}function us(e){if(!e.config.enabled)return!1;let t=e.config.entries[e.pluginId];if(t?.enabled===!1||e.config.deny.includes(e.pluginId)||e.config.allow.length>0&&!e.config.allow.includes(e.pluginId)||e.origin===`bundled`&&t?.enabled!==!0)return!1;if(e.kind&&e.config.slots?.[e.kind]){let t=e.config.slots[e.kind];if(t&&t!==`none`&&t!==e.pluginId)return!1}return!0}function ds(e){return{id:e.id,source:e.source,origin:e.origin,enabled:e.enabled,status:e.enabled?`loaded`:`disabled`,toolCount:0,hookCount:0,skills:e.skills,configSchema:e.configSchema}}function fs(e){let t=[...e.registry.diagnostics],n=new Ta,r=new Ma,i=[],a=[],o=e.runtime?.llm?ct({baseUrl:e.runtime.llm.baseUrl,apiKey:e.runtime.llm.apiKey,defaultModel:e.runtime.llm.model,hooks:r,hookCtx:e.runtime.hookCtx}):void 0,s=ps(e.runtime?.llmAllowlist),c=Le(import.meta.url,{interopDefault:!0,requireCache:!1});for(let l of e.registry.manifests.values()){let u=us({config:e.plugins,pluginId:l.id,origin:l.origin,kind:l.manifest.kind}),d=ds({id:l.id,source:l.source,origin:l.origin,enabled:u,configSchema:!0,skills:l.manifest.skills??[]});if(!u){a.push(d);continue}let f;try{f=c(l.source)}catch(e){d.status=`error`,d.error=String(e),t.push({level:`error`,message:`failed to load plugin ${l.id}: ${String(e)}`,pluginId:l.id,source:l.source}),a.push(d);continue}let p=f&&typeof f==`object`&&`default`in f?f.default:f,m=typeof p==`function`?p:p&&typeof p==`object`&&typeof p.register==`function`?p.register:void 0;if(!m){d.status=`error`,d.error=`plugin module does not export a register function`,t.push({level:`error`,message:`plugin ${l.id} has no register function`,pluginId:l.id,source:l.source}),a.push(d);continue}let g=ls({pluginId:l.id}),_=e.plugins.entries[l.id]?.config,v={id:l.id,source:l.source,rootDir:l.rootDir,config:_,runtime:g,llm:{chat:async e=>{if(!o)throw Error(`LLM client is not configured`);if(!ms(l.id,n,s))throw Error(`Plugin ${l.id} is not allowed to use LLM`);return o.chat(e)}},registerTool:(e,t)=>{n.register(l.id,e,t),d.toolCount+=1},registerUiTool:(e,t)=>{n.registerUiTool(l.id,e,t),d.toolCount+=1},registerEmbeddingProvider:e=>{if(l.manifest.kind!==`memory`)throw Error(`Plugin ${l.id} is not allowed to register embedding providers`);h({pluginId:l.id,id:e.id,create:e.create,config:_,rootDir:l.rootDir,source:l.source})},registerMemoryProvider:e=>{if(l.manifest.kind!==`memory`)throw Error(`Plugin ${l.id} is not allowed to register memory providers`);A({pluginId:l.id,id:e.id,create:e.create,config:_,rootDir:l.rootDir,source:l.source})},registerHook:(e,t,n)=>{r.register({pluginId:l.id,hookName:e,handler:t,priority:n?.priority,source:l.source}),d.hookCount+=1},registerSkillDir:e=>{let t=I.isAbsolute(e)?e:I.resolve(l.rootDir,e);i.push(t)},createProgressEmitter:()=>Ca(l.id)};try{m(v)}catch(e){d.status=`error`,d.error=String(e),t.push({level:`error`,message:`plugin ${l.id} registration failed: ${String(e)}`,pluginId:l.id,source:l.source})}if(l.manifest.skills&&l.manifest.skills.length>0)for(let e of l.manifest.skills){let t=I.isAbsolute(e)?e:I.resolve(l.rootDir,e);i.push(t)}a.push(d)}return{plugins:a,diagnostics:t,tools:n,hooks:r,skills:i}}function ps(e){return(e??[]).map(e=>e.trim()).filter(Boolean)}function ms(e,t,n){return n.length===0?!1:n.includes(e)?!0:t.namesForPlugin(e).some(e=>n.includes(e))}function hs(e={}){let t=ko(e.config),n=$o({dataDir:e.dataDir,workspaceDir:e.workspaceDir,extraPaths:t.loadPaths,bundledDir:e.bundledDir,ownershipUid:e.ownershipUid}),r=as(n.candidates),i=Ao({config:t,registry:r}),a=fs({registry:r,plugins:t,workspaceDir:e.workspaceDir,runtime:e.runtime});return{registry:a,diagnostics:[...n.diagnostics,...r.diagnostics,...i.diagnostics,...a.diagnostics],normalizedConfig:t}}function gs(e){let{runParams:t,hookContext:n,sessionId:r,eventDispatcher:i}=e,a=e=>{i.dispatchDiagnostic(r,e).catch(()=>void 0)},o=t.plugins?hs({...t.plugins,runtime:{llm:t.llm,hookCtx:n,llmAllowlist:t.plugins.llmAllowlist}}):void 0;if(!o)a({level:`info`,scope:`plugin`,phase:`plugin_system_disabled`,message:`plugin system disabled for this run`});else{a({level:o.diagnostics.some(e=>e.level===`error`)?`warn`:`info`,scope:`plugin`,phase:`plugin_system_initialized`,message:`plugin system initialized`,details:{pluginCount:o.registry.plugins.length,enabledPluginCount:o.registry.plugins.filter(e=>e.status===`loaded`).length,disabledPluginCount:o.registry.plugins.filter(e=>e.status===`disabled`).length,errorPluginCount:o.registry.plugins.filter(e=>e.status===`error`).length,diagnosticCount:o.diagnostics.length}});for(let e of o.registry.plugins)a({level:e.status===`error`?`error`:e.status===`disabled`?`warn`:`info`,scope:`plugin`,phase:`plugin_${e.status}`,message:e.status===`error`?`plugin failed to initialize`:e.status===`disabled`?`plugin disabled`:`plugin enabled`,details:{pluginId:e.id,origin:e.origin,toolCount:e.toolCount,hookCount:e.hookCount,skillCount:e.skills.length,source:e.source,errorMessage:e.error}});for(let e of o.diagnostics)a({level:e.level===`error`?`error`:`warn`,scope:`plugin`,phase:`plugin_diagnostic`,message:e.message,details:{pluginId:e.pluginId,source:e.source}})}return{hookRegistry:o?.registry.hooks??new Ma,pluginSkillDirs:o?.registry.skills??[],pluginTools:[...o?.registry.tools.resolveEnabled(t.plugins?.toolAllowlist)??[],...o?.registry.tools.resolveUiTools(r,t.uiToolResume,t.plugins?.toolAllowlist)??[]],memoryPluginId:t.memory?.pluginId??o?.normalizedConfig.slots?.memory}}async function _s(e){let{runParams:t,requestedSessionId:n,eventDispatcher:r}=e,i=I.join(t.dataDir,`workspace`),a=n,o=!a;a?await x(t.dataDir,a,{storeName:t.sessionStoreName}):a=await f(t.dataDir,t.channel,{storeName:t.sessionStoreName});let s={sessionId:a,workspaceDir:i,channel:t.channel},c=gs({runParams:t,hookContext:s,sessionId:a,eventDispatcher:r}),l=c.hookRegistry,u=await _o({runParams:t,sessionId:a,hookContext:s,memoryProviderId:t.memory?.providerId,memoryPluginId:c.memoryPluginId,eventDispatcher:r,hookRegistry:l});return{sessionId:a,isNewSession:o,workspaceDir:i,hookContext:s,hookRegistry:l,pluginContext:c,runContext:u,start:e=>Ut({sessionId:a,runParams:t,hookRegistry:l,hookContext:s,eventDispatcher:r,...e})}}function vs(e){return e===null||typeof e==`string`||typeof e==`number`||typeof e==`boolean`?e:JSON.stringify(e)??String(e)}function ys(e){if(!(e instanceof Error))return{errorValue:vs(e)};let t={errorName:e.name,errorMessage:e.message};e.stack&&(t.stack=e.stack);let n=e;for(let e of[`code`,`statusCode`,`statusText`,`providerMessage`,`retryable`,`cause`])n[e]!==void 0&&(t[e]=vs(n[e]));return t}async function bs(e){await e.dispatcher.dispatchDiagnostic(e.sessionId,{level:`error`,scope:e.scope,phase:e.phase,message:e.message,details:{...e.details,...ys(e.error)}})}function xs(e,t,n){return I.join(o(e,t,n),`pending-hitl.json`)}function Ss(e,t,n){return I.join(o(e,t,n),`hitl-history.jsonl`)}async function Cs(e,t,n,r){let i=o(e,t,r);await F.mkdir(i,{recursive:!0});let a=xs(e,t,r);await F.writeFile(a,JSON.stringify(n,null,2),`utf-8`)}async function ws(e,t,n,r){let i=o(e,t,r);await F.mkdir(i,{recursive:!0});let a=Ss(e,t,r),s=JSON.stringify(n)+`
80
- `;await F.appendFile(a,s,`utf-8`)}async function Ts(e,t,n){let r=xs(e,t,n);try{let e=await F.readFile(r,`utf-8`);return JSON.parse(e)}catch(e){if(e.code===`ENOENT`)return null;throw e}}async function Es(e,t,n){let r=Ss(e,t,n);try{let e=await F.readFile(r,`utf-8`),t=[];for(let n of e.split(`
81
- `)){let e=n.trim();if(e)try{t.push(JSON.parse(e))}catch{}}return t}catch(e){if(e.code===`ENOENT`)return[];throw e}}async function Ds(e,t,n,r,i,a,o){let s=new Date().toISOString(),c={version:1,sessionId:t,request:n,status:`pending`,checkpoint:r,context:i,toolContext:a,createdAt:s,updatedAt:s};return await Cs(e,t,c,o),await ws(e,t,{requestId:n.requestId,sessionId:t,action:`requested`,payload:n,timestamp:s},o),c}async function Os(e,t,n,r,i,a){let o=await Ts(e,t,a);if(!o||o.request.requestId!==n||o.status!==`pending`)return null;let s=new Date().toISOString(),c={...o,status:r,resolution:i,updatedAt:s};await Cs(e,t,c,a);let l={resolved:`resolved`,expired:`expired`,cancelled:`cancelled`}[r];return await ws(e,t,{requestId:n,sessionId:t,action:l,payload:i??o.request,timestamp:s},a),c}async function ks(e,t,n,r){let i=await Ts(e,t,r);return!i||i.request.requestId!==n?null:i.status===`resolved`?i:null}async function As(e,t,n){let r=xs(e,t,n);try{await F.unlink(r)}catch(e){if(e.code===`ENOENT`)return;throw e}}function js(e,t,n){return I.join(o(e,t,n),`pending-ui-tool.json`)}async function Ms(e,t,n,r){let i=o(e,t,r);await F.mkdir(i,{recursive:!0}),await F.writeFile(js(e,t,r),JSON.stringify(n,null,2),`utf-8`)}async function Ns(e,t,n){try{let r=await F.readFile(js(e,t,n),`utf-8`);return JSON.parse(r)}catch(e){if(e.code===`ENOENT`)return null;throw e}}async function Ps(e,t,n,r){let i=new Date().toISOString(),a={version:1,sessionId:t,request:n,status:`pending`,createdAt:i,updatedAt:i};return await Ms(e,t,a,r),a}async function Fs(e,t,n,r,i){let a=await Ns(e,t,i);if(!a||a.request.requestId!==n||a.status!==`pending`)return null;let o={...a,status:`resolved`,result:r,updatedAt:new Date().toISOString()};return await Ms(e,t,o,i),o}async function Is(e,t,n){try{await F.unlink(js(e,t,n))}catch(e){if(e.code===`ENOENT`)return;throw e}}function Ls(e,t,n,r){let i={"Client-Code":`AIMax`,"X-Session-Id":t};return n&&(i[`X-Message-Id`]=n),r&&(i[`X-Channel`]=r),{id:e.model,name:e.model,api:`openai-completions`,provider:`openai`,baseUrl:e.baseUrl,reasoning:!1,input:[`text`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:e.contextWindow??2e5,maxTokens:32768,headers:i,compat:{supportsStore:!1,supportsDeveloperRole:!1,supportsReasoningEffort:!1,supportsUsageInStreaming:!0}}}async function Rs(e,t){Lt();let n=Date.now(),r=new Rt(e),i=Cn(e),a=i.transcriptMessage,o=!1,s=i.previousSessionId,c=await _s({runParams:e,requestedSessionId:i.requestedSessionId,eventDispatcher:r}),l=c.sessionId,u=c.isNewSession,d=c.workspaceDir,f=c.hookContext,p=c.hookRegistry,m=c.pluginContext,h=c.runContext;await r.dispatchDiagnostic(l,{level:`info`,scope:`runner`,phase:`run_started`,message:`agent run started`,details:{channel:e.channel,isNewSession:u,hasMessageId:!!e.messageId,hasPlugins:!!e.plugins,hasMemory:!!e.memory}}),await r.dispatchDiagnostic(l,{level:`info`,scope:`session`,phase:u?`session_created`:`session_resumed`,message:u?`session created`:`session resumed`,details:{requestedSessionId:i.requestedSessionId,previousSessionId:s,workspaceDir:d}}),u&&await E(e.dataDir,vo({sessionId:l,title:Ht(a),channel:e.channel}),{storeName:e.sessionStoreName}),i.resetCommand&&!e.hitlResume&&!e.uiToolResume&&(o=await h.persistInitialUserEntry(a)),await c.start({resetCommand:i.resetCommand,previousSessionId:s,resetMessage:i.slashCommandSource,startMessage:typeof i.promptInput==`string`?i.promptInput:a});let g=new AbortController;e.abortSignal?.aborted?g.abort():e.abortSignal?.addEventListener(`abort`,()=>g.abort());let _=await Ve(e.dataDir),v=[],y=We(_,{warn:e=>v.push(e)});await r.dispatchDiagnostic(l,{level:v.length>0?`warn`:`info`,scope:`runner`,phase:`bootstrap_loaded`,message:`bootstrap context loaded`,details:{bootstrapFileCount:_.length,contextFileCount:y.length,warningCount:v.length}});let b=await Xe(e.dataDir,m.pluginSkillDirs),x=new st({workspaceDir:d,sessionId:l,skills:b,report:e=>r.dispatchProgress(l,e),reportDiagnostic:e=>r.dispatchDiagnostic(l,{level:e.level,scope:`skill`,phase:e.phase,message:e.message,details:e.details})});await r.dispatchDiagnostic(l,{level:`info`,scope:`skill`,phase:`skills_loaded`,message:`skills loaded`,details:{skillCount:b.length,pluginSkillDirCount:m.pluginSkillDirs.length}});let S=e=>h.appendTranscriptEntry(e),C=await Tn({invocation:i,skills:b,sessionId:l,isNewSession:u,initialUserEntryPersisted:o,runParams:e,hookRegistry:p,hookContext:f,startTime:n,eventDispatcher:r});if(C.kind===`completed`)return C.result;let w=C.effectivePrompt;a=C.transcriptMessage;let T=typeof w==`string`?w:a;await r.dispatchDiagnostic(l,{level:`info`,scope:`runner`,phase:`invocation_resolved`,message:`invocation resolved`,details:{promptType:typeof w==`string`?`string`:`messages`,transcriptLength:a.length}});let D=await Qa({session:{runParams:e,sessionId:l,hookRegistry:p,hookContext:f,runContext:h,eventDispatcher:r},runtimeInputs:{contextFiles:y,bootstrapWarnings:v,skills:b,effectivePromptText:T,pluginTools:m.pluginTools},dependencies:{registry:t,spawnFn:e=>Rs(e,new tt),createModel:Ls,abortSignal:g.signal}}),O=D.agent,k=D.resolvedModelId;await r.dispatchDiagnostic(l,{level:`info`,scope:`runner`,phase:`runtime_created`,message:`agent runtime created`,details:{modelId:k,historyMessageCount:D.historyMessages.length,pluginToolCount:m.pluginTools.length}}),g.signal.addEventListener(`abort`,()=>O.abort());let A=0,j=0,M=``,N;try{!e.hitlResume&&!e.uiToolResume&&(o=await h.persistInitialUserEntry(a)||o),await r.dispatchDiagnostic(l,{level:`info`,scope:`runner`,phase:`first_turn_started`,message:`first agent turn started`});let n=await eo({agent:O,message:w,continueFromHistory:!!e.uiToolResume,sessionId:l,modelId:k,historyMessages:D.historyMessages,eventDispatcher:r,skillUsageTracker:x,hooks:p,hookCtx:f,abortSignal:g.signal,onTurnRecordProduced:async(e,t)=>{e&&await S(e);for(let e of t)await S(e)}});M=n.text,A+=n.inputTokens,j+=n.outputTokens,n.error&&(N=n.error),await r.dispatchDiagnostic(l,{level:n.error?`warn`:`info`,scope:`runner`,phase:`first_turn_completed`,message:`first agent turn completed`,details:{hasError:!!n.error,error:n.error,inputTokens:n.inputTokens,outputTokens:n.outputTokens}}),await r.dispatchDiagnostic(l,{level:`info`,scope:`runner`,phase:`announce_loop_started`,message:`announce loop started`});let i=await fo({agent:O,registry:t,sessionId:l,resolvedModelId:k,eventDispatcher:r,skillUsageTracker:x,hookRegistry:p,hookContext:f,abortSignal:g.signal,appendEntry:S});i.text&&(M=i.text),A+=i.inputTokens,j+=i.outputTokens,i.error&&!N&&(N=i.error),await r.dispatchDiagnostic(l,{level:i.error?`warn`:`info`,scope:`runner`,phase:`announce_loop_completed`,message:`announce loop completed`,details:{hasError:!!i.error,error:i.error,inputTokens:i.inputTokens,outputTokens:i.outputTokens}})}catch(t){if(sr(t)){let i=t,o=e.subagentContext?.parentSessionId??l,s=o===i.request.sessionId?i.request:{...i.request,sessionId:o};await Ds(e.dataDir,o,s,i.checkpoint,{agentId:e.subagentContext?`subagent-depth-${e.subagentContext.depth}`:void 0,channel:e.channel,parentSessionId:e.subagentContext?.parentSessionId,depth:e.subagentContext?.depth},i.toolContext),await r.dispatchProgress(o,{type:`hitl_requested`,request:s}),await r.dispatchDiagnostic(l,{level:`info`,scope:`runner`,phase:`hitl_paused`,message:`agent paused for HITL: ${i.request.kind} — ${i.request.title}`,details:{requestId:s.requestId,kind:s.kind,checkpointPhase:i.checkpoint.phase,bubbledToParent:!!e.subagentContext?.parentSessionId}});let c={input:A,output:j,total:A+j};return Kt({sessionId:l,isNewSession:u,transcriptMessage:a,runParams:e,hookRegistry:p,hookContext:f,startTime:n,eventDispatcher:r,text:M||`[HITL paused] ${i.request.title}: ${i.request.prompt}`,usage:c,error:void 0,paused:{requestId:s.requestId,kind:s.kind,title:s.title}})}if(Gi(t)){let i=t;await Ps(e.dataDir,l,i.request,{storeName:e.sessionStoreName}),await r.dispatchProgress(l,{type:`ui_tool_request`,request:i.request}),await r.dispatchDiagnostic(l,{level:`info`,scope:`tool`,phase:`ui_tool_paused`,message:`agent paused for UI tool input: ${i.request.toolName}`,details:{requestId:i.request.requestId,toolName:i.request.toolName,toolCallId:i.request.toolCallId,outputSchemaTitle:i.request.outputSchema.title,propertyCount:Object.keys(i.request.outputSchema.properties).length}});let o={input:A,output:j,total:A+j};return Kt({sessionId:l,isNewSession:u,transcriptMessage:a,runParams:e,hookRegistry:p,hookContext:f,startTime:n,eventDispatcher:r,text:M||`[UI Tool] Waiting for user input: ${i.request.outputSchema.title}`,usage:o,error:void 0,uiToolPending:{requestId:i.request.requestId,toolName:i.request.toolName,toolCallId:i.request.toolCallId,outputSchema:i.request.outputSchema,extra:i.request.extra}})}throw await bs({dispatcher:r,sessionId:l,scope:`runner`,phase:`run_failed`,message:`agent run failed`,error:t,details:{channel:e.channel,isNewSession:u}}),t}finally{it(l),h.stop()}let P={input:A,output:j,total:A+j};return await r.dispatchDiagnostic(l,{level:N?`warn`:`info`,scope:`runner`,phase:`run_completed`,message:`agent run completed`,details:{durationMs:Date.now()-n,inputTokens:P.input,outputTokens:P.output,totalTokens:P.total,hasError:!!N,error:N}}),Kt({sessionId:l,isNewSession:u,transcriptMessage:a,runParams:e,hookRegistry:p,hookContext:f,startTime:n,eventDispatcher:r,text:M,usage:P,error:N})}async function zs(e,t){let n=t??new tt;try{return await Rs(e,n)}catch(t){throw e.onProgress&&await e.onProgress({type:`diagnostic`,level:`error`,scope:`runner`,phase:`run_crashed`,message:`agent run crashed before completion`,details:ys(t)}),t}}const Bs={"AGENTS.md":`---
76
+ `)}`}function no(e){if(!e)return null;let t=(typeof e==`string`?e:e.toString(`utf-8`)).replace(/\\/g,`/`).replace(/^\.\//,``).trim();return t.length>0?t:null}function ro(e){let t=no(e.filename);if(e.kind===`memory-file`)return[`MEMORY.md`];if(e.kind===`memory-file-lower`)return[`memory.md`];if(e.kind===`memory-dir`){if(!t)return[`memory`];let e=L.basename(t).replace(/\\/g,`/`);return e.endsWith(`.md`)?[`memory/${e}`]:[]}return t?t===`MEMORY.md`||t===`memory.md`?[t]:t===`memory`?[`memory`]:t.startsWith(`memory/`)?t.endsWith(`.md`)?[t]:[`memory`]:[]:[`MEMORY.md`,`memory`]}function io(e){let t=e.watchFactory??((e,t,n)=>B.watch(e,t,n)),n=L.join(e.dataDir,`.aimax`),r=[{target:L.join(n,`MEMORY.md`),kind:`memory-file`},{target:L.join(n,`memory.md`),kind:`memory-file-lower`},{target:L.join(n,`memory`),kind:`memory-dir`},{target:n,kind:`memory-root`}],i=[],a=new Set,o=null,s=Number.isFinite(e.debounceMs)&&(e.debounceMs??0)>0?Math.floor(e.debounceMs):1500,c=async()=>{let t=Array.from(a);if(a.clear(),t.length===0)return;let n={reason:`external-watch`,files:t,source:`memory`,sessionId:e.sessionId,providerId:e.providerId,timestamp:new Date().toISOString()};e.provider?.sync&&await e.provider.sync(`external-watch`).catch(()=>{}),e.provider?.onMemoryChanged&&await Promise.resolve(e.provider.onMemoryChanged(n)).catch(()=>{}),e.onMemoryChanged&&await Promise.resolve(e.onMemoryChanged(n)).catch(()=>{})},l=()=>{o&&clearTimeout(o),o=setTimeout(()=>{o=null,c()},s)};for(let e of r)try{let n=t(e.target,{recursive:!1},(t,n)=>{let r=ro({kind:e.kind,filename:n});if(r.length!==0){for(let e of r)a.add(e);l()}});n.on?.(`error`,()=>{try{n.close()}catch{}}),i.push(n)}catch{}return()=>{o&&=(clearTimeout(o),null);for(let e of i)try{e.close()}catch{}}}async function ao(e){let{runParams:t,eventDispatcher:n,hookRegistry:r}=e,{sessionId:i,hookContext:a,memoryProviderId:o,memoryPluginId:s}=e,c=L.join(t.dataDir,`workspace`),l=new Map,u=new Map,d=!1,f=async e=>{let t=Date.now(),o=co(e.files);if(o.length===0)return;let s=e.reason===`external-watch`&&e.source===`memory`?o.filter(e=>t-(l.get(e.toLowerCase())??0)>3e3):o;if(s.length===0)return;if(e.reason!==`external-watch`&&e.source===`memory`)for(let e of s)l.set(e.toLowerCase(),t);let c=`${e.reason}|${e.source}|${s.map(e=>e.toLowerCase()).sort().join(`|`)}`;if(t-(u.get(c)??0)<1e3)return;u.set(c,t);let d={...e,files:s};await n.dispatchProgress(e.sessionId??i,{type:`memory_changed`,reason:d.reason,files:d.files,source:d.source,providerId:d.providerId,timestamp:d.timestamp}).catch(()=>{}),await r.dispatch(`memory_changed`,d,{...a,sessionId:d.sessionId??a.sessionId},{eventDispatcher:n}).catch(()=>{})},p=L.join(t.dataDir,`.aimax`),m=k({providerId:o,pluginId:s,dataDir:t.dataDir,memoryDir:p,sessionId:i,sessionStoreName:t.sessionStoreName})?.provider??y({dataDir:t.dataDir,memoryDir:p,sessionId:i,sessionStoreName:t.sessionStoreName}),h=io({dataDir:t.dataDir,sessionId:i,providerId:o??s??m.id,provider:m,onMemoryChanged:f});m.sync&&m.sync(`session-start`).catch(()=>{});let g=async e=>{await _(t.dataDir,i,e,so({sessionStoreName:t.sessionStoreName,providerId:o,pluginId:s,onMemoryChanged:f}))};return{workspaceDir:c,memoryProviderId:o,memoryPluginId:s,appendTranscriptEntry:g,persistInitialUserEntry:async e=>d?!1:(await g({role:`user`,content:e,timestamp:new Date().toISOString()}),d=!0,!0),stop:()=>{h()}}}function oo(e){let t=new Date().toISOString();return{id:e.sessionId,title:e.title,channel:e.channel,createdAt:t,updatedAt:t}}function so(e){return e.sessionStoreName||e.providerId||e.pluginId?{storeName:e.sessionStoreName,providerId:e.providerId,pluginId:e.pluginId,onMemoryChanged:e.onMemoryChanged}:{onMemoryChanged:e.onMemoryChanged}}function co(e){let t=[],n=new Set;for(let r of e){let e=r.replace(/\\/g,`/`).replace(/^\.\//,``).trim();if(!e)continue;let i=e.toLowerCase()===`memory.md`?`MEMORY.md`:e,a=i.toLowerCase();n.has(a)||(n.add(a),t.push(i))}return t}function lo(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function uo(e){return Array.isArray(e)?e.map(e=>typeof e==`string`?e.trim():``).filter(Boolean):[]}function fo(){let e=Ae.homedir();if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function po(e){let t=e.trim(),n=fo();return t===`~`?n:t.startsWith(`~/`)||t.startsWith(`~\\`)?n?L.join(n,t.slice(2)):void 0:L.resolve(t)}const mo=new Ie({allErrors:!0,strict:!1}),ho=new Map;function go(e,t){let n=ho.get(t);if(n)return n;let r=mo.compile(e);return ho.set(t,r),r}function _o(e){let t=e.cacheKey??JSON.stringify(e.schema),n=go(e.schema,t);return n(e.value)?{ok:!0}:{ok:!1,errors:(n.errors??[]).map(e=>({path:e.instancePath||`/`,message:e.message??`invalid`}))}}function vo(e){let t=uo(e?.allow),n=uo(e?.deny),r=uo(e?.load?.paths),i=e?.entries??{},a=e?.slots??{};return{enabled:e?.enabled??!0,allow:Array.from(new Set(t)),deny:Array.from(new Set(n)),loadPaths:Array.from(new Set(r)),entries:i,slots:a}}function yo(e){let t=[],{config:n,registry:r}=e,i=new Set(r.manifests.keys()),a=(e,n)=>i.has(e)?!0:(t.push({level:`error`,message:`unknown plugin id in ${n}: ${e}`,pluginId:e}),!1);for(let e of n.allow)a(e,`plugins.allow`);for(let e of n.deny)a(e,`plugins.deny`);for(let e of Object.keys(n.entries))a(e,`plugins.entries`);let o=n.slots??{};for(let[e,n]of Object.entries(o)){if(!n||n===`none`||!a(n,`plugins.slots.${e}`))continue;let i=r.manifests.get(n);i?.manifest.kind?i.manifest.kind!==e&&t.push({level:`error`,message:`plugin ${n} does not declare kind ${e}`,pluginId:n}):t.push({level:`error`,message:`plugin ${n} does not declare kind ${e}`,pluginId:n})}for(let[e,i]of Object.entries(n.entries)){let n=r.manifests.get(e);if(!n)continue;let a=n.manifest.configSchema,o=_o({schema:a,cacheKey:`${e}:${n.manifestPath}`,value:i?.config??{}});if(!o.ok)for(let n of o.errors)t.push({level:`error`,message:`plugin config invalid (${e}) at ${n.path}: ${n.message}`,pluginId:e});i?.enabled===!1&&i?.config&&t.push({level:`warn`,message:`plugin config set while disabled: ${e}`,pluginId:e})}return{ok:t.every(e=>e.level!==`error`),diagnostics:t}}function bo(e){try{return B.realpathSync(e)}catch{return null}}function xo(e){try{return B.statSync(e)}catch{return null}}function So(e,t){let n=L.relative(e,t);return n===``?!0:n.startsWith(`..`)?!1:!L.isAbsolute(n)}function Co(e){return`0o${e.toString(8).padStart(3,`0`)}`}const wo=new Set([`.ts`,`.js`,`.mts`,`.cts`,`.mjs`,`.cjs`]),To=[`index.ts`,`index.js`,`index.mts`,`index.cts`,`index.mjs`,`index.cjs`];function Eo(e){let t=L.join(e,`package.json`);if(B.existsSync(t))try{let e=JSON.parse(B.readFileSync(t,`utf-8`));return lo(e)?e:void 0}catch{return}}function Do(e){let t=e?.aimax?.extensions;if(!Array.isArray(t))return{status:`missing`,entries:[]};let n=t.map(e=>typeof e==`string`?e.trim():``).filter(Boolean);return n.length===0?{status:`empty`,entries:[]}:{status:`ok`,entries:n}}function Oo(e){return e===void 0?process.platform===`win32`||typeof process.getuid!=`function`?null:process.getuid():e}function ko(e){let t=bo(e.source),n=bo(e.rootDir);return!t||!n||So(n,t)?null:{reason:`source_escapes_root`,sourcePath:e.source,rootPath:e.rootDir,targetPath:e.source,sourceRealPath:t,rootRealPath:n}}function Ao(e){if(process.platform===`win32`)return null;let t=[e.rootDir,e.source],n=new Set;for(let r of t){let t=L.resolve(r);if(n.has(t))continue;n.add(t);let i=xo(r);if(!i)return{reason:`path_stat_failed`,sourcePath:e.source,rootPath:e.rootDir,targetPath:r};let a=i.mode&511;if(a&2)return{reason:`path_world_writable`,sourcePath:e.source,rootPath:e.rootDir,targetPath:r,modeBits:a};if(e.origin!==`bundled`&&e.uid!==null&&typeof i.uid==`number`&&i.uid!==e.uid&&i.uid!==0)return{reason:`path_suspicious_ownership`,sourcePath:e.source,rootPath:e.rootDir,targetPath:r,foundUid:i.uid,expectedUid:e.uid}}return null}function jo(e){return ko({source:e.source,rootDir:e.rootDir})||Ao({source:e.source,rootDir:e.rootDir,origin:e.origin,uid:Oo(e.ownershipUid)})}function Mo(e){return e.reason===`source_escapes_root`?`blocked plugin candidate: source escapes plugin root (${e.sourcePath} -> ${e.sourceRealPath}; root=${e.rootRealPath})`:e.reason===`path_stat_failed`?`blocked plugin candidate: cannot stat path (${e.targetPath})`:e.reason===`path_world_writable`?`blocked plugin candidate: world-writable path (${e.targetPath}, mode=${Co(e.modeBits??0)})`:`blocked plugin candidate: suspicious ownership (${e.targetPath}, uid=${e.foundUid}, expected uid=${e.expectedUid} or root)`}function No(e){let t=jo({source:e.source,rootDir:e.rootDir,origin:e.origin,ownershipUid:e.ownershipUid});return t?(e.diagnostics.push({level:`warn`,message:Mo(t),source:e.source}),!0):!1}function Po(e){return L.basename(e,L.extname(e))}function Fo(e){return{idHint:e.idHint,source:e.source,rootDir:e.rootDir,origin:e.origin,workspaceDir:e.workspaceDir,packageName:e.packageName,packageVersion:e.packageVersion,packageDescription:e.packageDescription,packageDir:e.packageDir,packageManifest:e.packageManifest}}function Io(e){for(let t of To){let n=L.join(e,t);if(B.existsSync(n))return n}return null}function Lo(e){let t;try{t=B.readdirSync(e.rootDir,{withFileTypes:!0})}catch{return}for(let n of t){let t=L.join(e.rootDir,n.name);if(n.isFile()){if(!wo.has(L.extname(n.name)))continue;let r=L.dirname(t);if(No({source:t,rootDir:r,origin:e.origin,diagnostics:e.diagnostics,ownershipUid:e.ownershipUid}))continue;e.candidates.push(Fo({idHint:Po(t),source:t,rootDir:r,origin:e.origin,workspaceDir:e.workspaceDir}));continue}if(!n.isDirectory())continue;let r=Eo(t),i=Do(r);if(i.status===`ok`){for(let n of i.entries){let i=L.resolve(t,n);if(!So(t,i)){e.diagnostics.push({level:`warn`,message:`blocked plugin candidate: package entry escapes package root (${n})`,source:i});continue}if(!B.existsSync(i)){e.diagnostics.push({level:`warn`,message:`plugin entry missing: ${i}`,source:i});continue}if(!wo.has(L.extname(i))){e.diagnostics.push({level:`warn`,message:`plugin entry not a supported extension: ${i}`,source:i});continue}if(No({source:i,rootDir:t,origin:e.origin,diagnostics:e.diagnostics,ownershipUid:e.ownershipUid}))continue;let a=r?.name?.trim(),o=a?`${a}/${Po(i)}`:Po(i);e.candidates.push(Fo({idHint:o,source:i,rootDir:t,origin:e.origin,workspaceDir:e.workspaceDir,packageName:r?.name,packageVersion:r?.version,packageDescription:r?.description,packageDir:t,packageManifest:r?.aimax}))}continue}let a=Io(t);a&&(No({source:a,rootDir:t,origin:e.origin,diagnostics:e.diagnostics,ownershipUid:e.ownershipUid})||e.candidates.push(Fo({idHint:L.basename(t),source:a,rootDir:t,origin:e.origin,workspaceDir:e.workspaceDir})))}}function Ro(e){return e?e.map(po).filter(e=>typeof e==`string`&&e.length>0):[]}function zo(){let e=fo();if(e)return L.join(e,`.aimax`,`extensions`)}function Bo(e){return L.join(e,`.aimax`,`extensions`)}function Vo(e){return L.join(e,`.aimax`,`extensions`)}function Ho(e={}){let t=[],n=[],r=Ro(e.extraPaths);for(let i of r){if(!B.existsSync(i)){n.push({level:`warn`,message:`plugin path not found: ${i}`,source:i});continue}let r=xo(i);if(!r){n.push({level:`warn`,message:`plugin path not readable: ${i}`,source:i});continue}if(r.isFile()){if(!wo.has(L.extname(i))){n.push({level:`warn`,message:`plugin file has unsupported extension: ${i}`,source:i});continue}let r=L.dirname(i);if(No({source:i,rootDir:r,origin:`config`,diagnostics:n,ownershipUid:e.ownershipUid}))continue;t.push(Fo({idHint:Po(i),source:i,rootDir:r,origin:`config`,workspaceDir:e.workspaceDir}));continue}r.isDirectory()&&Lo({rootDir:i,origin:`config`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid})}e.dataDir?Lo({rootDir:Bo(e.dataDir),origin:`workspace`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid}):e.workspaceDir&&Lo({rootDir:Vo(e.workspaceDir),origin:`workspace`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid});let i=zo();return i?Lo({rootDir:i,origin:`global`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid}):n.push({level:`warn`,message:`skipping global plugin discovery: home directory is unavailable`}),e.bundledDir&&Lo({rootDir:e.bundledDir,origin:`bundled`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid}),{candidates:t,diagnostics:n}}function Uo(e){let t=e.rejectHardlinks??!0,n=bo(e.rootPath),r=bo(e.absolutePath);if(!n||!r)return{ok:!1,reason:`path`};if(!So(n,r))return{ok:!1,reason:`unsafe`};let i;try{i=B.lstatSync(r)}catch{return{ok:!1,reason:`stat`}}if(t&&typeof i.nlink==`number`&&i.nlink>1)return{ok:!1,reason:`hardlink`};try{return{ok:!0,fd:B.openSync(r,`r`)}}catch{return{ok:!1,reason:`path`}}}const Wo=`aimax.plugin.json`,Go=[Wo];function Ko(e){for(let t of Go){let n=L.join(e,t);if(B.existsSync(n))return n}return L.join(e,Wo)}function qo(e,t=!0){let n=Ko(e),r=Uo({absolutePath:n,rootPath:e,rejectHardlinks:t});if(!r.ok){let e=r.reason;return e===`path`?{ok:!1,error:`plugin manifest not found: ${n}`,manifestPath:n}:{ok:!1,error:`unsafe plugin manifest path: ${n} (${e})`,manifestPath:n}}let i;try{i=JSON.parse(B.readFileSync(r.fd,`utf-8`))}catch(e){return{ok:!1,error:`failed to parse plugin manifest: ${String(e)}`,manifestPath:n}}finally{B.closeSync(r.fd)}if(!lo(i))return{ok:!1,error:`plugin manifest must be an object`,manifestPath:n};let a=typeof i.id==`string`?i.id.trim():``;if(!a)return{ok:!1,error:`plugin manifest requires id`,manifestPath:n};let o=lo(i.configSchema)?i.configSchema:null;if(!o)return{ok:!1,error:`plugin manifest requires configSchema`,manifestPath:n};let s=typeof i.kind==`string`?i.kind:void 0,c=typeof i.name==`string`?i.name.trim():void 0,l=typeof i.description==`string`?i.description.trim():void 0,u=typeof i.version==`string`?i.version.trim():void 0,d=uo(i.skills),f;return lo(i.uiHints)&&(f=i.uiHints),{ok:!0,manifest:{id:a,configSchema:o,kind:s,name:c,description:l,version:u,skills:d,uiHints:f},manifestPath:n}}function Jo(e){let t=new Map,n=[];for(let r of e){let e=qo(r.rootDir);if(!e.ok){n.push({level:`error`,message:e.error,source:r.source,pluginId:r.idHint});continue}let i=e.manifest.id;if(t.has(i)){n.push({level:`warn`,message:`duplicate plugin id ignored: ${i}`,source:r.source,pluginId:i});continue}t.set(i,{id:i,rootDir:r.rootDir,source:r.source,origin:r.origin,manifestPath:e.manifestPath,manifest:e.manifest})}return{manifests:t,diagnostics:n}}let Yo=function(e){return e.INFO=`INFO`,e.WARN=`WARN`,e.ERROR=`ERROR`,e}({});function Xo(){let e=new Date;return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)} ${String(e.getHours()).padStart(2,`0`)}:${String(e.getMinutes()).padStart(2,`0`)}:${String(e.getSeconds()).padStart(2,`0`)}.${String(e.getMilliseconds()).padStart(3,`0`)}`}function Zo(e,t,n,r){process.stderr.write(`[${Xo()}] [${e}] [plugin:${t}][logger:${n}] ${r}\n`)}function Qo(e){return{version:`0.1.0`,logging:{getLogger:t=>({info:n=>Zo(Yo.INFO,e.pluginId,t,n),warn:n=>Zo(Yo.WARN,e.pluginId,t,n),error:n=>Zo(Yo.ERROR,e.pluginId,t,n)})}}}function $o(e){if(!e.config.enabled)return!1;let t=e.config.entries[e.pluginId];if(t?.enabled===!1||e.config.deny.includes(e.pluginId)||e.config.allow.length>0&&!e.config.allow.includes(e.pluginId)||e.origin===`bundled`&&t?.enabled!==!0)return!1;if(e.kind&&e.config.slots?.[e.kind]){let t=e.config.slots[e.kind];if(t&&t!==`none`&&t!==e.pluginId)return!1}return!0}function es(e){return{id:e.id,source:e.source,origin:e.origin,enabled:e.enabled,status:e.enabled?`loaded`:`disabled`,toolCount:0,hookCount:0,skills:e.skills,configSchema:e.configSchema}}function ts(e){let t=[...e.registry.diagnostics],n=new ma,r=new xa,i=[],a=[],o=e.runtime?.llm?ct({baseUrl:e.runtime.llm.baseUrl,apiKey:e.runtime.llm.apiKey,defaultModel:e.runtime.llm.model,hooks:r,hookCtx:e.runtime.hookCtx}):void 0,s=ns(e.runtime?.llmAllowlist),c=Le(import.meta.url,{interopDefault:!0,requireCache:!1});for(let l of e.registry.manifests.values()){let u=$o({config:e.plugins,pluginId:l.id,origin:l.origin,kind:l.manifest.kind}),d=es({id:l.id,source:l.source,origin:l.origin,enabled:u,configSchema:!0,skills:l.manifest.skills??[]});if(!u){a.push(d);continue}let f;try{f=c(l.source)}catch(e){d.status=`error`,d.error=String(e),t.push({level:`error`,message:`failed to load plugin ${l.id}: ${String(e)}`,pluginId:l.id,source:l.source}),a.push(d);continue}let p=f&&typeof f==`object`&&`default`in f?f.default:f,m=typeof p==`function`?p:p&&typeof p==`object`&&typeof p.register==`function`?p.register:void 0;if(!m){d.status=`error`,d.error=`plugin module does not export a register function`,t.push({level:`error`,message:`plugin ${l.id} has no register function`,pluginId:l.id,source:l.source}),a.push(d);continue}let g=Qo({pluginId:l.id}),_=e.plugins.entries[l.id]?.config,v={id:l.id,source:l.source,rootDir:l.rootDir,config:_,runtime:g,llm:{chat:async e=>{if(!o)throw Error(`LLM client is not configured`);if(!rs(l.id,n,s))throw Error(`Plugin ${l.id} is not allowed to use LLM`);return o.chat(e)}},registerTool:(e,t)=>{n.register(l.id,e,t),d.toolCount+=1},registerUiTool:(e,t)=>{n.registerUiTool(l.id,e,t),d.toolCount+=1},registerEmbeddingProvider:e=>{if(l.manifest.kind!==`memory`)throw Error(`Plugin ${l.id} is not allowed to register embedding providers`);h({pluginId:l.id,id:e.id,create:e.create,config:_,rootDir:l.rootDir,source:l.source})},registerMemoryProvider:e=>{if(l.manifest.kind!==`memory`)throw Error(`Plugin ${l.id} is not allowed to register memory providers`);A({pluginId:l.id,id:e.id,create:e.create,config:_,rootDir:l.rootDir,source:l.source})},registerHook:(e,t,n)=>{r.register({pluginId:l.id,hookName:e,handler:t,priority:n?.priority,source:l.source}),d.hookCount+=1},registerSkillDir:e=>{let t=L.isAbsolute(e)?e:L.resolve(l.rootDir,e);i.push(t)},createProgressEmitter:()=>fa(l.id)};try{m(v)}catch(e){d.status=`error`,d.error=String(e),t.push({level:`error`,message:`plugin ${l.id} registration failed: ${String(e)}`,pluginId:l.id,source:l.source})}if(l.manifest.skills&&l.manifest.skills.length>0)for(let e of l.manifest.skills){let t=L.isAbsolute(e)?e:L.resolve(l.rootDir,e);i.push(t)}a.push(d)}return{plugins:a,diagnostics:t,tools:n,hooks:r,skills:i}}function ns(e){return(e??[]).map(e=>e.trim()).filter(Boolean)}function rs(e,t,n){return n.length===0?!1:n.includes(e)?!0:t.namesForPlugin(e).some(e=>n.includes(e))}function is(e={}){let t=vo(e.config),n=Ho({dataDir:e.dataDir,workspaceDir:e.workspaceDir,extraPaths:t.loadPaths,bundledDir:e.bundledDir,ownershipUid:e.ownershipUid}),r=Jo(n.candidates),i=yo({config:t,registry:r}),a=ts({registry:r,plugins:t,workspaceDir:e.workspaceDir,runtime:e.runtime});return{registry:a,diagnostics:[...n.diagnostics,...r.diagnostics,...i.diagnostics,...a.diagnostics],normalizedConfig:t}}function as(e){let{runParams:t,hookContext:n,sessionId:r,eventDispatcher:i}=e,a=e=>{i.dispatchDiagnostic(r,e).catch(()=>void 0)},o=t.plugins?is({...t.plugins,runtime:{llm:t.llm,hookCtx:n,llmAllowlist:t.plugins.llmAllowlist}}):void 0;if(!o)a({level:`info`,scope:`plugin`,phase:`plugin_system_disabled`,message:`plugin system disabled for this run`});else{a({level:o.diagnostics.some(e=>e.level===`error`)?`warn`:`info`,scope:`plugin`,phase:`plugin_system_initialized`,message:`plugin system initialized`,details:{pluginCount:o.registry.plugins.length,enabledPluginCount:o.registry.plugins.filter(e=>e.status===`loaded`).length,disabledPluginCount:o.registry.plugins.filter(e=>e.status===`disabled`).length,errorPluginCount:o.registry.plugins.filter(e=>e.status===`error`).length,diagnosticCount:o.diagnostics.length}});for(let e of o.registry.plugins)a({level:e.status===`error`?`error`:e.status===`disabled`?`warn`:`info`,scope:`plugin`,phase:`plugin_${e.status}`,message:e.status===`error`?`plugin failed to initialize`:e.status===`disabled`?`plugin disabled`:`plugin enabled`,details:{pluginId:e.id,origin:e.origin,toolCount:e.toolCount,hookCount:e.hookCount,skillCount:e.skills.length,source:e.source,errorMessage:e.error}});for(let e of o.diagnostics)a({level:e.level===`error`?`error`:`warn`,scope:`plugin`,phase:`plugin_diagnostic`,message:e.message,details:{pluginId:e.pluginId,source:e.source}})}return{hookRegistry:o?.registry.hooks??new xa,pluginSkillDirs:o?.registry.skills??[],pluginTools:[...o?.registry.tools.resolveEnabled(t.plugins?.toolAllowlist)??[],...o?.registry.tools.resolveUiTools(r,t.uiToolResume,t.plugins?.toolAllowlist)??[]],memoryPluginId:t.memory?.pluginId??o?.normalizedConfig.slots?.memory}}async function os(e){let{runParams:t,requestedSessionId:n,eventDispatcher:r}=e,i=L.join(t.dataDir,`workspace`),a=n,o=!a;a?await x(t.dataDir,a,{storeName:t.sessionStoreName}):a=await f(t.dataDir,t.channel,{storeName:t.sessionStoreName});let s={sessionId:a,workspaceDir:i,channel:t.channel},c=as({runParams:t,hookContext:s,sessionId:a,eventDispatcher:r}),l=c.hookRegistry,u=await ao({runParams:t,sessionId:a,hookContext:s,memoryProviderId:t.memory?.providerId,memoryPluginId:c.memoryPluginId,eventDispatcher:r,hookRegistry:l});return{sessionId:a,isNewSession:o,workspaceDir:i,hookContext:s,hookRegistry:l,pluginContext:c,runContext:u,start:e=>Ut({sessionId:a,runParams:t,hookRegistry:l,hookContext:s,eventDispatcher:r,...e})}}function ss(e){return e===null||typeof e==`string`||typeof e==`number`||typeof e==`boolean`?e:JSON.stringify(e)??String(e)}function cs(e){if(!(e instanceof Error))return{errorValue:ss(e)};let t={errorName:e.name,errorMessage:e.message};e.stack&&(t.stack=e.stack);let n=e;for(let e of[`code`,`statusCode`,`statusText`,`providerMessage`,`retryable`,`cause`])n[e]!==void 0&&(t[e]=ss(n[e]));return t}async function ls(e){await e.dispatcher.dispatchDiagnostic(e.sessionId,{level:`error`,scope:e.scope,phase:e.phase,message:e.message,details:{...e.details,...cs(e.error)}})}function us(e,t,n){return L.join(o(e,t,n),`pending-hitl.json`)}function ds(e,t,n){return L.join(o(e,t,n),`hitl-history.jsonl`)}async function fs(e,t,n,r){let i=o(e,t,r);await I.mkdir(i,{recursive:!0});let a=us(e,t,r);await I.writeFile(a,JSON.stringify(n,null,2),`utf-8`)}async function ps(e,t,n,r){let i=o(e,t,r);await I.mkdir(i,{recursive:!0});let a=ds(e,t,r),s=JSON.stringify(n)+`
77
+ `;await I.appendFile(a,s,`utf-8`)}async function ms(e,t,n){let r=us(e,t,n);try{let e=await I.readFile(r,`utf-8`);return JSON.parse(e)}catch(e){if(e.code===`ENOENT`)return null;throw e}}async function hs(e,t,n){let r=ds(e,t,n);try{let e=await I.readFile(r,`utf-8`),t=[];for(let n of e.split(`
78
+ `)){let e=n.trim();if(e)try{t.push(JSON.parse(e))}catch{}}return t}catch(e){if(e.code===`ENOENT`)return[];throw e}}async function gs(e,t,n,r,i,a,o){let s=new Date().toISOString(),c={version:1,sessionId:t,request:n,status:`pending`,checkpoint:r,context:i,toolContext:a,createdAt:s,updatedAt:s};return await fs(e,t,c,o),await ps(e,t,{requestId:n.requestId,sessionId:t,action:`requested`,payload:n,timestamp:s},o),c}async function _s(e,t,n,r,i,a){let o=await ms(e,t,a);if(!o||o.request.requestId!==n||o.status!==`pending`)return null;let s=new Date().toISOString(),c={...o,status:r,resolution:i,updatedAt:s};await fs(e,t,c,a);let l={resolved:`resolved`,expired:`expired`,cancelled:`cancelled`}[r];return await ps(e,t,{requestId:n,sessionId:t,action:l,payload:i??o.request,timestamp:s},a),c}async function vs(e,t,n,r){let i=await ms(e,t,r);return!i||i.request.requestId!==n?null:i.status===`resolved`?i:null}async function ys(e,t,n){let r=us(e,t,n);try{await I.unlink(r)}catch(e){if(e.code===`ENOENT`)return;throw e}}function bs(e,t,n){return L.join(o(e,t,n),`pending-ui-tool.json`)}async function xs(e,t,n,r){let i=o(e,t,r);await I.mkdir(i,{recursive:!0}),await I.writeFile(bs(e,t,r),JSON.stringify(n,null,2),`utf-8`)}async function Ss(e,t,n){try{let r=await I.readFile(bs(e,t,n),`utf-8`);return JSON.parse(r)}catch(e){if(e.code===`ENOENT`)return null;throw e}}async function Cs(e,t,n,r){let i=new Date().toISOString(),a={version:1,sessionId:t,request:n,status:`pending`,createdAt:i,updatedAt:i};return await xs(e,t,a,r),a}async function ws(e,t,n,r,i){let a=await Ss(e,t,i);if(!a||a.request.requestId!==n||a.status!==`pending`)return null;let o={...a,status:`resolved`,result:r,updatedAt:new Date().toISOString()};return await xs(e,t,o,i),o}async function Ts(e,t,n){try{await I.unlink(bs(e,t,n))}catch(e){if(e.code===`ENOENT`)return;throw e}}function Es(e,t,n,r){let i={"Client-Code":`AIMax`,"X-Session-Id":t};return n&&(i[`X-Message-Id`]=n),r&&(i[`X-Channel`]=r),{id:e.model,name:e.model,api:`openai-completions`,provider:`openai`,baseUrl:e.baseUrl,reasoning:!1,input:[`text`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:e.contextWindow??2e5,maxTokens:32768,headers:i,compat:{supportsStore:!1,supportsDeveloperRole:!1,supportsReasoningEffort:!1,supportsUsageInStreaming:!0}}}async function Ds(e,t){Lt();let n=Date.now(),r=new Rt(e),i=Cn(e),a=i.transcriptMessage,o=!1,s=i.previousSessionId,c=await os({runParams:e,requestedSessionId:i.requestedSessionId,eventDispatcher:r}),l=c.sessionId,u=c.isNewSession,d=c.workspaceDir,f=c.hookContext,p=c.hookRegistry,m=c.pluginContext,h=c.runContext;await r.dispatchDiagnostic(l,{level:`info`,scope:`runner`,phase:`run_started`,message:`agent run started`,details:{channel:e.channel,isNewSession:u,hasMessageId:!!e.messageId,hasPlugins:!!e.plugins,hasMemory:!!e.memory}}),await r.dispatchDiagnostic(l,{level:`info`,scope:`session`,phase:u?`session_created`:`session_resumed`,message:u?`session created`:`session resumed`,details:{requestedSessionId:i.requestedSessionId,previousSessionId:s,workspaceDir:d}}),u&&await E(e.dataDir,oo({sessionId:l,title:Ht(a),channel:e.channel}),{storeName:e.sessionStoreName}),i.resetCommand&&!e.hitlResume&&!e.uiToolResume&&(o=await h.persistInitialUserEntry(a)),await c.start({resetCommand:i.resetCommand,previousSessionId:s,resetMessage:i.slashCommandSource,startMessage:typeof i.promptInput==`string`?i.promptInput:a});let g=new AbortController;e.abortSignal?.aborted?g.abort():e.abortSignal?.addEventListener(`abort`,()=>g.abort());let _=await Ve(e.dataDir),v=[],y=We(_,{warn:e=>v.push(e)});await r.dispatchDiagnostic(l,{level:v.length>0?`warn`:`info`,scope:`runner`,phase:`bootstrap_loaded`,message:`bootstrap context loaded`,details:{bootstrapFileCount:_.length,contextFileCount:y.length,warningCount:v.length}});let b=await Xe(e.dataDir,m.pluginSkillDirs),x=new st({workspaceDir:d,sessionId:l,skills:b,report:e=>r.dispatchProgress(l,e),reportDiagnostic:e=>r.dispatchDiagnostic(l,{level:e.level,scope:`skill`,phase:e.phase,message:e.message,details:e.details})});await r.dispatchDiagnostic(l,{level:`info`,scope:`skill`,phase:`skills_loaded`,message:`skills loaded`,details:{skillCount:b.length,pluginSkillDirCount:m.pluginSkillDirs.length}});let S=e=>h.appendTranscriptEntry(e),C=await Tn({invocation:i,skills:b,sessionId:l,isNewSession:u,initialUserEntryPersisted:o,runParams:e,hookRegistry:p,hookContext:f,startTime:n,eventDispatcher:r});if(C.kind===`completed`)return C.result;let w=C.effectivePrompt;a=C.transcriptMessage;let T=typeof w==`string`?w:a;await r.dispatchDiagnostic(l,{level:`info`,scope:`runner`,phase:`invocation_resolved`,message:`invocation resolved`,details:{promptType:typeof w==`string`?`string`:`messages`,transcriptLength:a.length}});let D=await Va({session:{runParams:e,sessionId:l,hookRegistry:p,hookContext:f,runContext:h,eventDispatcher:r},runtimeInputs:{contextFiles:y,bootstrapWarnings:v,skills:b,effectivePromptText:T,pluginTools:m.pluginTools},dependencies:{registry:t,spawnFn:e=>Ds(e,new tt),createModel:Es,abortSignal:g.signal}}),O=D.agent,k=D.resolvedModelId;await r.dispatchDiagnostic(l,{level:`info`,scope:`runner`,phase:`runtime_created`,message:`agent runtime created`,details:{modelId:k,historyMessageCount:D.historyMessages.length,pluginToolCount:m.pluginTools.length}}),g.signal.addEventListener(`abort`,()=>O.abort());let A=0,j=0,M=``,N,P=!1;try{if(!e.hitlResume&&!e.uiToolResume){let e=await h.persistInitialUserEntry(a);P=e,o=e||o}await r.dispatchDiagnostic(l,{level:`info`,scope:`runner`,phase:`first_turn_started`,message:`first agent turn started`});let n=await Ua({agent:O,message:w,continueFromHistory:!!e.uiToolResume,sessionId:l,modelId:k,historyMessages:D.historyMessages,eventDispatcher:r,skillUsageTracker:x,hooks:p,hookCtx:f,abortSignal:g.signal,onTurnRecordProduced:async(e,t)=>{e&&await S(e);for(let e of t)await S(e)}});M=n.text,A+=n.inputTokens,j+=n.outputTokens,n.error&&(N=n.error),await r.dispatchDiagnostic(l,{level:n.error?`warn`:`info`,scope:`runner`,phase:`first_turn_completed`,message:`first agent turn completed`,details:{hasError:!!n.error,error:n.error,inputTokens:n.inputTokens,outputTokens:n.outputTokens}}),await r.dispatchDiagnostic(l,{level:`info`,scope:`runner`,phase:`announce_loop_started`,message:`announce loop started`});let i=await eo({agent:O,registry:t,sessionId:l,resolvedModelId:k,eventDispatcher:r,skillUsageTracker:x,hookRegistry:p,hookContext:f,abortSignal:g.signal,appendEntry:S});i.text&&(M=i.text),A+=i.inputTokens,j+=i.outputTokens,i.error&&!N&&(N=i.error),await r.dispatchDiagnostic(l,{level:i.error?`warn`:`info`,scope:`runner`,phase:`announce_loop_completed`,message:`announce loop completed`,details:{hasError:!!i.error,error:i.error,inputTokens:i.inputTokens,outputTokens:i.outputTokens}})}catch(t){if(q(t)){let i=t,o=e.subagentContext?.parentSessionId??l,s=o===i.request.sessionId?i.request:{...i.request,sessionId:o};await gs(e.dataDir,o,s,i.checkpoint,{agentId:e.subagentContext?`subagent-depth-${e.subagentContext.depth}`:void 0,channel:e.channel,parentSessionId:e.subagentContext?.parentSessionId,depth:e.subagentContext?.depth},i.toolContext),await r.dispatchProgress(o,{type:`hitl_requested`,request:s}),await r.dispatchDiagnostic(l,{level:`info`,scope:`runner`,phase:`hitl_paused`,message:`agent paused for HITL: ${i.request.kind} — ${i.request.title}`,details:{requestId:s.requestId,kind:s.kind,checkpointPhase:i.checkpoint.phase,bubbledToParent:!!e.subagentContext?.parentSessionId}});let c={input:A,output:j,total:A+j};return await Os({runtime:D,resolvedModelId:k,usage:c,currentUserEntryCoveredByUsage:P}),Kt({sessionId:l,isNewSession:u,transcriptMessage:a,runParams:e,hookRegistry:p,hookContext:f,startTime:n,eventDispatcher:r,text:M||`[HITL paused] ${i.request.title}: ${i.request.prompt}`,usage:c,error:void 0,paused:{requestId:s.requestId,kind:s.kind,title:s.title}})}if(Pi(t)){let i=t;await Cs(e.dataDir,l,i.request,{storeName:e.sessionStoreName}),await r.dispatchProgress(l,{type:`ui_tool_request`,request:i.request}),await r.dispatchDiagnostic(l,{level:`info`,scope:`tool`,phase:`ui_tool_paused`,message:`agent paused for UI tool input: ${i.request.toolName}`,details:{requestId:i.request.requestId,toolName:i.request.toolName,toolCallId:i.request.toolCallId,outputSchemaTitle:i.request.outputSchema.title,propertyCount:Object.keys(i.request.outputSchema.properties).length}});let o={input:A,output:j,total:A+j};return await Os({runtime:D,resolvedModelId:k,usage:o,currentUserEntryCoveredByUsage:P}),Kt({sessionId:l,isNewSession:u,transcriptMessage:a,runParams:e,hookRegistry:p,hookContext:f,startTime:n,eventDispatcher:r,text:M||`[UI Tool] Waiting for user input: ${i.request.outputSchema.title}`,usage:o,error:void 0,uiToolPending:{requestId:i.request.requestId,toolName:i.request.toolName,toolCallId:i.request.toolCallId,outputSchema:i.request.outputSchema,extra:i.request.extra}})}throw await ls({dispatcher:r,sessionId:l,scope:`runner`,phase:`run_failed`,message:`agent run failed`,error:t,details:{channel:e.channel,isNewSession:u}}),t}finally{it(l),h.stop()}let F={input:A,output:j,total:A+j};return await r.dispatchDiagnostic(l,{level:N?`warn`:`info`,scope:`runner`,phase:`run_completed`,message:`agent run completed`,details:{durationMs:Date.now()-n,inputTokens:F.input,outputTokens:F.output,totalTokens:F.total,hasError:!!N,error:N}}),await Os({runtime:D,resolvedModelId:k,usage:F,currentUserEntryCoveredByUsage:P}),Kt({sessionId:l,isNewSession:u,transcriptMessage:a,runParams:e,hookRegistry:p,hookContext:f,startTime:n,eventDispatcher:r,text:M,usage:F,error:N})}async function Os(e){let{runtime:t,resolvedModelId:n,usage:r,currentUserEntryCoveredByUsage:i}=e;r.input<=0&&r.total<=0||await t.contextManager.recordModelUsage({model:n,inputTokens:r.input,outputTokens:r.output,totalTokens:r.total,coveredTranscriptEntryCount:t.usageBaselineTranscriptEntryCount+(i?1:0)})}async function ks(e,t){let n=t??new tt;try{return await Ds(e,n)}catch(t){throw e.onProgress&&await e.onProgress({type:`diagnostic`,level:`error`,scope:`runner`,phase:`run_crashed`,message:`agent run crashed before completion`,details:cs(t)}),t}}const As={"AGENTS.md":`---
82
79
  title: "AGENTS.md Template"
83
80
  summary: ".aimax template for AGENTS.md"
84
81
  read_when:
@@ -385,4 +382,7 @@ read_when:
385
382
  # Add tasks below when you want the agent to check something periodically.
386
383
 
387
384
  # This file lives at .aimax/HEARTBEAT.md, not in workspace/.
388
- `},Vs=[`AGENTS.md`,`BOOTSTRAP.md`,`IDENTITY.md`,`USER.md`,`SOUL.md`,`TOOLS.md`,`HEARTBEAT.md`];async function $(e,t){try{if(!(await F.stat(e)).isDirectory())throw Error(`Path exists but is not a directory: ${e}`);t.skippedDirs.push(e);return}catch(e){if(e.code!==`ENOENT`)throw e}await F.mkdir(e,{recursive:!0}),t.createdDirs.push(e)}async function Hs(e,t,n){try{if(!(await F.stat(e)).isFile())throw Error(`Path exists but is not a file: ${e}`);n.skippedFiles.push(e);return}catch(e){if(e.code!==`ENOENT`)throw e}await F.mkdir(I.dirname(e),{recursive:!0});try{await F.writeFile(e,t,{encoding:`utf-8`,flag:`wx`}),n.createdFiles.push(e)}catch(t){if(t.code===`EEXIST`){n.skippedFiles.push(e);return}throw t}}function Us(e){let t=V(e);return[e,t,I.join(t,`skills`),I.join(t,`sessions`),I.join(t,`memory`),I.join(e,`workspace`)]}function Ws(e){let t=V(e);return[...Vs.filter(e=>e!==`BOOTSTRAP.md`).map(e=>I.join(t,e)),I.join(t,`MEMORY.md`)]}function Gs(e){return I.join(V(e),`.bootstrapped`)}async function Ks(e){try{return(await F.stat(Gs(e))).isFile()}catch(e){if(e.code===`ENOENT`)return!1;throw e}}async function qs(e){let t=Gs(e);await F.mkdir(I.dirname(t),{recursive:!0}),await F.writeFile(t,``,{encoding:`utf-8`})}async function Js(e){let t=[],n=[];for(let n of Us(e))try{(await F.stat(n)).isDirectory()||t.push(n)}catch(e){if(e.code===`ENOENT`){t.push(n);continue}throw e}for(let t of Ws(e))try{(await F.stat(t)).isFile()||n.push(t)}catch(e){if(e.code===`ENOENT`){n.push(t);continue}throw e}return{dataDir:e,ready:t.length===0&&n.length===0,missingDirs:t,missingFiles:n}}async function Ys(e){return(await Js(e)).ready}async function Xs(e){if(await Ks(e))return{ready:!0,performedBootstrap:!1};if((await Js(e)).ready)return await qs(e),{ready:!0,performedBootstrap:!1};let t=await Zs(e);return await qs(e),{ready:!0,performedBootstrap:!0,result:t}}async function Zs(e){let t={dataDir:e,createdDirs:[],skippedDirs:[],createdFiles:[],skippedFiles:[]},n=V(e),r=I.join(e,`workspace`),i=I.join(n,`skills`),a=I.join(n,`sessions`),o=I.join(n,`memory`);await $(e,t),await $(n,t),await $(i,t),await $(a,t),await $(o,t),await $(r,t);for(let e of Vs){let r=Bs[e]??``;await Hs(I.join(n,e),r,t)}return await Hs(I.join(n,`MEMORY.md`),``,t),t}async function Qs(e){let t=I.join(e,`.aimax`,`subagents`,`runs.json`);try{let e=await F.readFile(t,`utf-8`),n=JSON.parse(e);if(!n||typeof n!=`object`)return new Map;let r;if(n.version===1&&n.records)r=n.records;else if(n.version===void 0)r=n;else return new Map;let i=new Map;for(let[e,t]of Object.entries(r)){if(!t||typeof t!=`object`)continue;let n=t;i.set(e,{...n,abortController:new AbortController})}return i}catch(e){return e.code,new Map}}async function $s(e,t){let n=I.join(e,`.aimax`,`subagents`,`runs.json`),r={};for(let[e,n]of t.entries())if(typeof n.endedAt==`number`){let{abortController:t,...i}=n;r[e]={...i,version:1}}let i={version:1,records:r};await F.mkdir(I.dirname(n),{recursive:!0}),await F.writeFile(n,JSON.stringify(i,null,2),`utf-8`)}async function ec(e,t){let n=await Qs(e),r=[];for(let e of n.values())if(e.parentSessionId===t){let{abortController:t,...n}=e;r.push({...n,version:1})}return r.sort((e,t)=>e.startedAt-t.startedAt)}async function tc(e,t=7){let n=await Qs(e),r=Date.now()-t*24*60*60*1e3,i=0;for(let[e,t]of n.entries())t.endedAt&&t.endedAt<r&&(n.delete(e),i++);return i>0&&await $s(e,n),i}async function nc(e,t,n,r){let i=await Ts(e,t,{storeName:r});return i?i.request.requestId===n?i.sessionId===t?i.status===`pending`?Ne(i.request)?(await Os(e,t,n,`expired`,void 0,{storeName:r}),{valid:!1,reason:`HITL request has expired`}):{valid:!0,state:i}:{valid:!1,reason:`HITL request is already "${i.status}", cannot resume`}:{valid:!1,reason:`Session ID mismatch: expected "${i.sessionId}", got "${t}"`}:{valid:!1,reason:`Request ID mismatch: expected "${i.request.requestId}", got "${n}"`}:{valid:!1,reason:`No pending HITL request found for this session`}}async function rc(e){let{dataDir:t,sessionId:n,requestId:r,resolution:i,sessionStoreName:a}=e,o=await ks(t,n,r,{storeName:a});if(o){let e=o.resolution?.idempotencyKey;if(e&&i.idempotencyKey&&e===i.idempotencyKey)return{state:o,idempotentReplay:!0};throw Error(`HITL resume validation failed: HITL request is already "${o.status}", cannot resume`)}let s=await nc(t,n,r,a);if(!s.valid)throw Error(`HITL resume validation failed: ${s.reason}`);let c=await Os(t,n,r,`resolved`,i,{storeName:a});if(!c)throw Error(`Failed to transition HITL state to resolved (concurrent modification?)`);return{state:c,idempotentReplay:!1}}export{Be as BOOTSTRAP_FILE_NAMES,Re as BOOTSTRAP_MAX_CHARS,ze as BOOTSTRAP_TOTAL_MAX_CHARS,u as DEFAULT_SESSION_STORE_NAME,Y as HITL_MESSAGES,K as HitlPauseSignal,et as MAX_CHILDREN_PER_SESSION,$e as MAX_SUBAGENT_DEPTH,S as MemoryIndexManager,ts as PLUGIN_MANIFEST_FILENAME,ns as PLUGIN_MANIFEST_FILENAMES,Ma as PluginHookRegistry,Ta as PluginToolRegistry,tt as SubagentRegistry,Wi as UiToolPauseSignal,de as addAgent,se as addBinding,V as aimaxDir,xi as appendToMemory,_ as appendTranscriptEntry,oi as approvalSummaryFromResolution,Zs as bootstrapMountLayout,We as buildBootstrapContextFiles,li as buildResumeNarration,Qe as buildSkillsPrompt,Ii as buildSubagentAnnounceMessage,ba as buildSystemPrompt,tc as cleanupOldSubagentRecords,As as clearPendingHitl,Is as clearPendingUiTool,w as collapseLogPath,d as contextSnapshotPath,Qi as createAgentTools,Jr as createApplyPatchTool,jr as createBashTool,y as createBuiltinMemoryProvider,di as createClarifyTool,ar as createContextManager,Br as createEditFileTool,_r as createExecTool,Ui as createImageTool,Hr as createListDirTool,ki as createMemoryAppendTool,Di as createMemoryGetTool,Ti as createMemorySearchTool,Ds as createPendingHitl,Ps as createPendingUiTool,Ca as createPluginProgressEmitter,ls as createPluginRuntime,xr as createProcessTool,Ir as createReadFileTool,Mi as createRequestApprovalTool,Pi as createRequestReviewTool,f as createSession,Ln as createSessionContextStore,Li as createSessionsSpawnTool,Vi as createSubagentsTool,Zi as createUiTool,Rr as createWriteFileTool,Xi as defaultUiToolInputSchema,Ci as deleteMemoryFile,$o as discoverAIMaxPlugins,Xs as ensureBootstrapMountLayout,x as ensureSession,v as exportSession,ji as formatApprovalResolution,si as formatClarifyResolution,ci as formatReviewResolution,Bt as generateSessionTitle,ie as getAgentConfig,bi as getMemoryLines,Ks as hasBootstrapSentinel,Ss as hitlHistoryPath,hs as initializePluginSystem,Js as inspectBootstrapMountLayout,m as inspectSession,Ys as isBootstrapMountLayoutReady,sr as isHitlPauseSignal,Gi as isUiToolPauseSignal,N as listAgents,Zt as listAvailableSlashCommands,ce as listBindings,gi as listMemoryFiles,p as listSessionSummaries,s as listSessions,ec as listSubagentRunsFromDisk,ue as loadAgentsConfig,Ve as loadBootstrapFiles,Ts as loadPendingHitl,Ts as readPendingHitl,Ns as loadPendingUiTool,Ns as readPendingUiTool,is as loadPluginManifest,as as loadPluginManifestRegistry,fs as loadPlugins,T as loadSessionContextSnapshot,O as loadSessionMetadata,Ye as loadSkills,Ze as loadSkillsFromDirs,Xe as loadSkillsWithPluginDirs,Qs as loadSubagentRegistryFromDisk,l as loadTranscript,fi as memoryDir,D as metadataPath,P as normalizeAgentId,ko as normalizePluginsConfig,a as normalizeSessionStoreName,xs as pendingHitlPath,js as pendingUiToolPath,pi as primaryMemoryPath,Es as readHitlHistory,_i as readMemoryFile,vi as readPrimaryMemory,h as registerEmbeddingProvider,A as registerMemoryProvider,ae as removeAgent,fe as removeBindings,Si as replaceMemoryFile,c as resetEmbeddingProviderRegistryForTests,j as resetMemoryProviderRegistryForTests,ee as resolveAgentDir,te as resolveAgentIdByBinding,le as resolveAgentsConfigPath,oe as resolveDefaultAgentId,b as resolveEmbeddingProvider,rc as resolveHitlRequest,rc as resolvePendingHitl,k as resolveMemoryProvider,re as resolveModelFallbacks,ne as resolveModelString,Fs as resolvePendingUiTool,rs as resolvePluginManifestPath,t as rewriteTranscript,zs as runAgent,M as saveAgentsConfig,E as saveSessionMetadata,$s as saveSubagentRegistryToDisk,yi as searchMemory,o as sessionDir,r as sessionMemoryPath,n as sessionsDir,Ge as skillsDir,i as toolResultsDir,g as transcriptPath,Os as transitionHitlStatus,pe as updateAgentIdentity,e as updateSessionMetadata,Ao as validatePluginsConfig,nc as validateResume,ja as wrapToolsWithHooks};
385
+ `},js=[`AGENTS.md`,`BOOTSTRAP.md`,`IDENTITY.md`,`USER.md`,`SOUL.md`,`TOOLS.md`,`HEARTBEAT.md`];async function $(e,t){try{if(!(await I.stat(e)).isDirectory())throw Error(`Path exists but is not a directory: ${e}`);t.skippedDirs.push(e);return}catch(e){if(e.code!==`ENOENT`)throw e}await I.mkdir(e,{recursive:!0}),t.createdDirs.push(e)}async function Ms(e,t,n){try{if(!(await I.stat(e)).isFile())throw Error(`Path exists but is not a file: ${e}`);n.skippedFiles.push(e);return}catch(e){if(e.code!==`ENOENT`)throw e}await I.mkdir(L.dirname(e),{recursive:!0});try{await I.writeFile(e,t,{encoding:`utf-8`,flag:`wx`}),n.createdFiles.push(e)}catch(t){if(t.code===`EEXIST`){n.skippedFiles.push(e);return}throw t}}function Ns(e){let t=V(e);return[e,t,L.join(t,`skills`),L.join(t,`sessions`),L.join(t,`memory`),L.join(e,`workspace`)]}function Ps(e){let t=V(e);return[...js.filter(e=>e!==`BOOTSTRAP.md`).map(e=>L.join(t,e)),L.join(t,`MEMORY.md`)]}function Fs(e){return L.join(V(e),`.bootstrapped`)}async function Is(e){try{return(await I.stat(Fs(e))).isFile()}catch(e){if(e.code===`ENOENT`)return!1;throw e}}async function Ls(e){let t=Fs(e);await I.mkdir(L.dirname(t),{recursive:!0}),await I.writeFile(t,``,{encoding:`utf-8`})}async function Rs(e){let t=[],n=[];for(let n of Ns(e))try{(await I.stat(n)).isDirectory()||t.push(n)}catch(e){if(e.code===`ENOENT`){t.push(n);continue}throw e}for(let t of Ps(e))try{(await I.stat(t)).isFile()||n.push(t)}catch(e){if(e.code===`ENOENT`){n.push(t);continue}throw e}return{dataDir:e,ready:t.length===0&&n.length===0,missingDirs:t,missingFiles:n}}async function zs(e){return(await Rs(e)).ready}async function Bs(e){if(await Is(e))return{ready:!0,performedBootstrap:!1};if((await Rs(e)).ready)return await Ls(e),{ready:!0,performedBootstrap:!1};let t=await Vs(e);return await Ls(e),{ready:!0,performedBootstrap:!0,result:t}}async function Vs(e){let t={dataDir:e,createdDirs:[],skippedDirs:[],createdFiles:[],skippedFiles:[]},n=V(e),r=L.join(e,`workspace`),i=L.join(n,`skills`),a=L.join(n,`sessions`),o=L.join(n,`memory`);await $(e,t),await $(n,t),await $(i,t),await $(a,t),await $(o,t),await $(r,t);for(let e of js){let r=As[e]??``;await Ms(L.join(n,e),r,t)}return await Ms(L.join(n,`MEMORY.md`),``,t),t}async function Hs(e){let t=L.join(e,`.aimax`,`subagents`,`runs.json`);try{let e=await I.readFile(t,`utf-8`),n=JSON.parse(e);if(!n||typeof n!=`object`)return new Map;let r;if(n.version===1&&n.records)r=n.records;else if(n.version===void 0)r=n;else return new Map;let i=new Map;for(let[e,t]of Object.entries(r)){if(!t||typeof t!=`object`)continue;let n=t;i.set(e,{...n,abortController:new AbortController})}return i}catch(e){return e.code,new Map}}async function Us(e,t){let n=L.join(e,`.aimax`,`subagents`,`runs.json`),r={};for(let[e,n]of t.entries())if(typeof n.endedAt==`number`){let{abortController:t,...i}=n;r[e]={...i,version:1}}let i={version:1,records:r};await I.mkdir(L.dirname(n),{recursive:!0}),await I.writeFile(n,JSON.stringify(i,null,2),`utf-8`)}async function Ws(e,t){let n=await Hs(e),r=[];for(let e of n.values())if(e.parentSessionId===t){let{abortController:t,...n}=e;r.push({...n,version:1})}return r.sort((e,t)=>e.startedAt-t.startedAt)}async function Gs(e,t=7){let n=await Hs(e),r=Date.now()-t*24*60*60*1e3,i=0;for(let[e,t]of n.entries())t.endedAt&&t.endedAt<r&&(n.delete(e),i++);return i>0&&await Us(e,n),i}async function Ks(e,t,n,r){let i=await ms(e,t,{storeName:r});return i?i.request.requestId===n?i.sessionId===t?i.status===`pending`?Ne(i.request)?(await _s(e,t,n,`expired`,void 0,{storeName:r}),{valid:!1,reason:`HITL request has expired`}):{valid:!0,state:i}:{valid:!1,reason:`HITL request is already "${i.status}", cannot resume`}:{valid:!1,reason:`Session ID mismatch: expected "${i.sessionId}", got "${t}"`}:{valid:!1,reason:`Request ID mismatch: expected "${i.request.requestId}", got "${n}"`}:{valid:!1,reason:`No pending HITL request found for this session`}}async function qs(e){let{dataDir:t,sessionId:n,requestId:r,resolution:i,sessionStoreName:a}=e,o=await vs(t,n,r,{storeName:a});if(o){let e=o.resolution?.idempotencyKey;if(e&&i.idempotencyKey&&e===i.idempotencyKey)return{state:o,idempotentReplay:!0};throw Error(`HITL resume validation failed: HITL request is already "${o.status}", cannot resume`)}let s=await Ks(t,n,r,a);if(!s.valid)throw Error(`HITL resume validation failed: ${s.reason}`);let c=await _s(t,n,r,`resolved`,i,{storeName:a});if(!c)throw Error(`Failed to transition HITL state to resolved (concurrent modification?)`);return{state:c,idempotentReplay:!1}}const Js={clarify:{label:`澄清问题`,description:`当你需要更多信息才能继续时,向用户提出澄清问题。提供清晰的问题,并可选给出候选选项。任务会暂停,直到用户回复。`,title:`需要你补充信息`,placeholder:`请输入你的回复`},approval:{label:`请求授权`,description:"仅当用户或系统明确要求调用 `request_approval` 时使用。不要把它用于一般确认、澄清或推断式授权检查。说明要执行的动作,以及为什么必须显式授权。任务会暂停,直到用户同意或拒绝。",choices:{approve:{label:`同意`,description:`允许继续执行该操作`},deny:{label:`拒绝`,description:`不允许执行该操作`}},summary:{approved:`已授权。`,denied:`已拒绝。`,timeout:`由于超时,视为拒绝。`}},review:{label:`请求审阅`,description:`在继续之前,将草稿、文档或输出提交给用户审阅。包含需要审阅的内容,以及你希望获得的反馈类型。任务会暂停,直到用户完成审阅并回复。`,choices:{approve:{label:`通过`,description:`内容没有问题,继续执行`},revise:{label:`需要修改`,description:`提供反馈后再修改`},reject:{label:`拒绝`,description:`放弃当前草稿`}}}};function Ys(e){return e.action===`timeout`?Js.approval.summary.timeout:e.action===`submit`&&(e.values?.selectedChoiceIds?.includes(`approve`)??!1)?Js.approval.summary.approved:Js.approval.summary.denied}function Xs(e){let t=e.action===`submit`&&(e.values?.selectedChoiceIds?.includes(`approve`)??!1);return JSON.stringify({summary:Ys(e),action:e.action,approved:t,values:e.values??{},submittedBy:e.submittedBy,submittedAt:e.submittedAt,idempotencyKey:e.idempotencyKey})}function Zs(e){let t=e.values?.text??e.values?.selectedChoiceIds?.join(`, `)??``;return JSON.stringify({action:e.action,answer:t,values:e.values??{},submittedBy:e.submittedBy,submittedAt:e.submittedAt})}function Qs(e){let t=(e.values?.selectedChoiceIds??[])[0]??e.action,n=e.values?.text??``;return JSON.stringify({action:e.action,verdict:t,feedback:n,values:e.values??{},submittedBy:e.submittedBy,submittedAt:e.submittedAt})}function $s(e,t){let n=[];return n.push(`[HITL 恢复] 用户已响应 ${t} 请求(${e.requestId})。`),e.action===`cancel`?(n.push(`动作:用户取消了该请求。请确认取消并继续后续流程,不要执行原操作。`),n.join(`
386
+ `)):e.action===`timeout`?(n.push(`动作:该请求在未收到用户响应的情况下超时。请按默认超时策略处理。`),n.join(`
387
+ `)):(n.push(`动作:用户已提交结果。`),e.values?.selectedChoiceIds&&e.values.selectedChoiceIds.length>0&&n.push(`已选项:${e.values.selectedChoiceIds.join(`, `)}`),e.values?.text&&n.push(`用户文本:${e.values.text}`),e.values?.form&&n.push(`表单数据:${JSON.stringify(e.values.form)}`),n.join(`
388
+ `))}export{Be as BOOTSTRAP_FILE_NAMES,Re as BOOTSTRAP_MAX_CHARS,ze as BOOTSTRAP_TOTAL_MAX_CHARS,u as DEFAULT_SESSION_STORE_NAME,Js as HITL_MESSAGES,sr as HitlPauseSignal,et as MAX_CHILDREN_PER_SESSION,$e as MAX_SUBAGENT_DEPTH,S as MemoryIndexManager,Wo as PLUGIN_MANIFEST_FILENAME,Go as PLUGIN_MANIFEST_FILENAMES,xa as PluginHookRegistry,ma as PluginToolRegistry,tt as SubagentRegistry,Ni as UiToolPauseSignal,ue as addAgent,oe as addBinding,V as aimaxDir,hi as appendToMemory,_ as appendTranscriptEntry,Ys as approvalSummaryFromResolution,Vs as bootstrapMountLayout,We as buildBootstrapContextFiles,$s as buildResumeNarration,Qe as buildSkillsPrompt,Ti as buildSubagentAnnounceMessage,la as buildSystemPrompt,Gs as cleanupOldSubagentRecords,ys as clearPendingHitl,Ts as clearPendingUiTool,w as collapseLogPath,d as contextSnapshotPath,Vi as createAgentTools,Jr as createApplyPatchTool,jr as createBashTool,y as createBuiltinMemoryProvider,ar as createContextManager,Br as createEditFileTool,_r as createExecTool,Mi as createImageTool,Hr as createListDirTool,Ci as createMemoryAppendTool,xi as createMemoryGetTool,yi as createMemorySearchTool,gs as createPendingHitl,Cs as createPendingUiTool,fa as createPluginProgressEmitter,Qo as createPluginRuntime,xr as createProcessTool,Ir as createReadFileTool,f as createSession,In as createSessionContextStore,Ei as createSessionsSpawnTool,Ai as createSubagentsTool,Bi as createUiTool,Rr as createWriteFileTool,zi as defaultUiToolInputSchema,_i as deleteMemoryFile,Ho as discoverAIMaxPlugins,Bs as ensureBootstrapMountLayout,x as ensureSession,v as exportSession,Xs as formatApprovalResolution,Zs as formatClarifyResolution,Qs as formatReviewResolution,Bt as generateSessionTitle,re as getAgentConfig,mi as getMemoryLines,Is as hasBootstrapSentinel,ds as hitlHistoryPath,is as initializePluginSystem,Rs as inspectBootstrapMountLayout,m as inspectSession,zs as isBootstrapMountLayoutReady,q as isHitlPauseSignal,Pi as isUiToolPauseSignal,N as listAgents,Zt as listAvailableSlashCommands,se as listBindings,ui as listMemoryFiles,p as listSessionSummaries,s as listSessions,Ws as listSubagentRunsFromDisk,le as loadAgentsConfig,Ve as loadBootstrapFiles,ms as loadPendingHitl,ms as readPendingHitl,Ss as loadPendingUiTool,Ss as readPendingUiTool,qo as loadPluginManifest,Jo as loadPluginManifestRegistry,ts as loadPlugins,T as loadSessionContextSnapshot,O as loadSessionMetadata,Ye as loadSkills,Ze as loadSkillsFromDirs,Xe as loadSkillsWithPluginDirs,Hs as loadSubagentRegistryFromDisk,l as loadTranscript,oi as memoryDir,D as metadataPath,P as normalizeAgentId,vo as normalizePluginsConfig,a as normalizeSessionStoreName,us as pendingHitlPath,bs as pendingUiToolPath,si as primaryMemoryPath,hs as readHitlHistory,di as readMemoryFile,fi as readPrimaryMemory,h as registerEmbeddingProvider,A as registerMemoryProvider,ie as removeAgent,de as removeBindings,gi as replaceMemoryFile,c as resetEmbeddingProviderRegistryForTests,j as resetMemoryProviderRegistryForTests,F as resolveAgentDir,ee as resolveAgentIdByBinding,ce as resolveAgentsConfigPath,ae as resolveDefaultAgentId,b as resolveEmbeddingProvider,qs as resolveHitlRequest,qs as resolvePendingHitl,k as resolveMemoryProvider,ne as resolveModelFallbacks,te as resolveModelString,ws as resolvePendingUiTool,Ko as resolvePluginManifestPath,t as rewriteTranscript,ks as runAgent,M as saveAgentsConfig,E as saveSessionMetadata,Us as saveSubagentRegistryToDisk,pi as searchMemory,o as sessionDir,r as sessionMemoryPath,n as sessionsDir,Ge as skillsDir,i as toolResultsDir,g as transcriptPath,_s as transitionHitlStatus,fe as updateAgentIdentity,e as updateSessionMetadata,yo as validatePluginsConfig,Ks as validateResume,ba as wrapToolsWithHooks};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gencode/agents",
3
- "version": "0.0.44",
3
+ "version": "0.0.45",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -30,7 +30,7 @@
30
30
  "openai": "6.10.0",
31
31
  "sqlite-vec": "^0.1.6",
32
32
  "zod": "^4.3.6",
33
- "@gencode/shared": "0.0.15"
33
+ "@gencode/shared": "0.0.16"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@sinclair/typebox": "^0.34.48",