@gencode/agents 0.0.39 → 0.0.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +172 -8
- package/dist/index.js +61 -61
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,84 +1,84 @@
|
|
|
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{
|
|
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(`
|
|
2
2
|
`),s].join(`
|
|
3
|
-
`),truncated:!0,originalLength:r.length}}function
|
|
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
|
|
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(`
|
|
5
5
|
`)).join(`
|
|
6
|
-
`)}\n</available_skills>`}const
|
|
7
|
-
`)}function
|
|
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(`
|
|
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
|
|
12
|
-
`);async function
|
|
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
|
|
14
|
-
`)}}function
|
|
15
|
-
|
|
16
|
-
`)}:{kind:`reply`,text:`❌ Skill not found: ${e.skillName}. Use /help to see available skills.`}}function
|
|
17
|
-
`):e.content;return W(e.toolName)+W(t)}function G(e){return e.reduce((e,t)=>e+
|
|
18
|
-
`);async function
|
|
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(`
|
|
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
|
+
`),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
|
+
`)}}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(`
|
|
15
|
+
|
|
16
|
+
`)}:{kind:`reply`,text:`❌ Skill not found: ${e.skillName}. Use /help to see available skills.`}}function un(e){let t=tn(e.message,e.skills);return t.kind===`none`?{kind:`pass`,message:e.message}:t.kind===`help`?sn(e):t.kind===`compact`?{kind:`compact`,instructions:t.instructions}:t.kind===`skill`||t.kind===`skill-direct`?ln({ctx:e,skillName:t.name,args:t.args}):t.kind===`unknown`&&t.name===`skill`?{kind:`reply`,text:`Usage: /skill <name> [input]`}:{kind:`pass`,message:e.message}}function W(e){return Math.ceil(e.length/4*1.2)}function dn(e){if(e.role===`user`)return W(e.content);if(e.role===`assistant`){let t=W(e.content);for(let n of e.toolCalls??[])t+=W(n.name)+W(JSON.stringify(n.arguments));return t}let t=e.toolResultRef?[`[tool result persisted] ${e.toolResultRef.toolName} (${e.toolResultRef.originalChars} chars).`,`Full output: ${e.toolResultRef.storagePath}`,e.toolResultRef.preview].filter(Boolean).join(`
|
|
17
|
+
`):e.content;return W(e.toolName)+W(t)}function G(e){return e.reduce((e,t)=>e+dn(t),0)}const fn=[`You are a conversation history summariser. Compress the conversation below into a concise summary.`,``,`MUST PRESERVE:`,`- Active tasks and their current status (including batch progress e.g. '5/17 items done')`,`- The last thing the user requested and what was being done about it`,`- Decisions made and their rationale`,`- TODOs, open questions, and constraints`,`- All opaque identifiers exactly as written: UUIDs, hashes, file paths, URLs, IPs, ports (never shorten or reconstruct them)`,``,`Prioritise recent context over older history.`,`Output only the summary text — no preamble, no headings.`].join(`
|
|
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
|
-
`)}function
|
|
21
|
-
`);function
|
|
22
|
-
`)}async function
|
|
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?`
|
|
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
|
-
`)}function
|
|
25
|
-
`),r=n>t*.5?n:t;return e.slice(0,r)}async function
|
|
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}),
|
|
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}),
|
|
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(`
|
|
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(`
|
|
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
|
|
32
|
-
`)}function
|
|
33
|
-
`)}],details:{status:l.status,sessionId:l.sessionId,command:l.command,cwd:l.cwd,exitCode:l.exitCode,exitSignal:l.exitSignal,toolResultRef:m?.reference}}}}}const
|
|
34
|
-
`)}],details:{status:`completed`,sessions:t}}}if(!n.sessionId?.trim())return
|
|
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
|
|
36
|
-
`),l=Math.max(1,r.offset??1),u=Math.min(
|
|
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(`
|
|
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(`
|
|
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
|
|
40
|
-
`)||`(empty directory)`}],details:{entries:a}}}}}const
|
|
41
|
-
`)}function
|
|
42
|
-
`);n.length>0&&n[n.length-1]===``&&n.pop();let r=
|
|
43
|
-
`)}function
|
|
44
|
-
`)}`);r.push([s,n.length,o]),i=s+n.length}return r.sort((e,t)=>e[0]-t[0]),r}function
|
|
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(`
|
|
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
|
+
`)}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
45
|
`)):e.action===`timeout`?(n.push(`动作:该请求在未收到用户响应的情况下超时。请按默认超时策略处理。`),n.join(`
|
|
46
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
|
|
48
|
-
`)}],details:{matches:i}}}}}const
|
|
49
|
-
`)||`(empty)`}],details:{lines:i}}}}}const
|
|
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=
|
|
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){super(`UI_TOOL_PAUSED`),this.toolArgs=a,this.name=`UiToolPauseSignal`,this.request={requestId:e,sessionId:t,toolName:n,toolCallId:r,schema:i,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,schema:a,validate:o,resume:s}=e;return{name:t,label:n,description:r,parameters:Xi,async execute(e,n){if(s&&s.toolCallId===e&&s.toolName===t&&s.sessionId===i){let e=Pe(a,s.values);if(!e.valid){let t=e.errors;return{content:[{type:`text`,text:JSON.stringify({error:`validation_failed`,errors:t})}],details:{}}}if(o){let e=await o(s.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:s.values})}],details:{}}}let r=new Wi(z(),i,t,e,a,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(`
|
|
51
51
|
`),``].join(`
|
|
52
|
-
`)}function
|
|
53
|
-
`)}function
|
|
54
|
-
`)}function
|
|
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(`
|
|
55
55
|
`)).join(`
|
|
56
56
|
`)}\n</available_skills>`,``].join(`
|
|
57
|
-
`)}function
|
|
58
|
-
`)}function
|
|
59
|
-
`)}function
|
|
60
|
-
`)}function
|
|
61
|
-
`)}function
|
|
62
|
-
`)}function
|
|
63
|
-
`)}function
|
|
64
|
-
`)}function
|
|
65
|
-
`)}function
|
|
66
|
-
`)}function
|
|
67
|
-
`)}function
|
|
68
|
-
`)}function
|
|
69
|
-
`)}function
|
|
70
|
-
`):``}function
|
|
71
|
-
`,
|
|
72
|
-
`)}const
|
|
73
|
-
`).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 rr({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 ir({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 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},nt),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),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 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,sessionId:r,modelId:i,historyMessages:a,eventDispatcher:o,skillUsageTracker:s,hooks:c,hookCtx:l,abortSignal:u,onTurnRecordProduced:d}=e,f=``,p=``,m=``,h=0,g=0,_,v,y=0,b=[],x=new Map,S=_a(),C=t.subscribe(async e=>{if(e.type===`message_update`){let t=e.assistantMessageEvent;if(t.type===`text_delta`&&typeof t.delta==`string`){let n=Xa(`partial`in t?t.partial:void 0)??Xa(`message`in t?t.message:void 0)??Xa(`message`in e?e.message:void 0),i=Za(t.delta,n,p);i&&(await o.dispatchProgress(r,{type:`stream_text_delta`,text:i}),m+=i),n&&(p=n,m=n)}if(t.type===`done`){let e=t.message;f=Ya(e);let n=Za(``,f,m||p);n&&(await o.dispatchProgress(r,{type:`stream_text_delta`,text:n}),m+=n),p=f,m=f,e.usage&&(h=e.usage.input,g=e.usage.output)}return}if(e.type===`message_end`){let t=e.message;if(t.usage&&(h=t.usage.input,g=t.usage.output),t.role===`assistant`&&Array.isArray(t.content)){let e=t,n=Ya(e);await c.dispatch(`assistant_message_end`,{sessionId:r,model:i,assistantText:n,assistantMessage:e,hasToolCalls:e.content.some(e=>e.type===`toolCall`),durationMs:y>0?Math.max(0,Date.now()-y):void 0,usage:t.usage?{input:h,output:g,total:h+g}:void 0},l)}return}if(e.type===`turn_end`){let t=e.message;(t.stopReason===`error`||t.stopReason===`aborted`)&&(v=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(``),r,e.toolCallId,e.toolName)}));b.push({message:t,toolResults:n}),d&&(await d(Ga(Wa(t),!!S.signal),n.map(Ka)),S.signal);return}if(e.type===`tool_execution_start`){m=``,x.set(e.toolCallId,e.args),s.onToolExecutionStart({toolName:e.toolName,args:e.args}),await o.dispatchProgress(r,{type:`tool_start`,toolCallId:e.toolCallId,name:e.toolName,input:e.args});return}if(e.type===`tool_execution_end`){await s.onToolExecutionEnd({toolName:e.toolName,isError:e.isError});let t=typeof e.result==`string`?e.result:JSON.stringify(e.result),n=x.get(e.toolCallId);x.delete(e.toolCallId),await o.dispatchProgress(r,{type:`tool_end`,toolCallId:e.toolCallId,name:e.toolName,input:n,output:t,isError:e.isError})}});try{if(await c.dispatch(`llm_input`,{sessionId:r,model:i,prompt:typeof n==`string`?n:JSON.stringify(n),historyMessages:a},l),u?.aborted)throw Error(`aborted`);y=Date.now(),await va(S,async()=>{await t.prompt(n)});let e=S.signal;if(e)throw e;if(!_){let e=typeof t.state.error==`string`?t.state.error:void 0,n=v??e;n&&(_=Qa(n),await o.dispatchProgress(r,{type:`error`,message:_}))}}catch(e){if(or(e))throw e;_=Qa(e),await o.dispatchProgress(r,{type:`error`,message:_})}finally{C()}let w=b.length>0?b[b.length-1]?.message:void 0;await c.dispatch(`llm_output`,{sessionId:r,model:i,assistantTexts:f?[f]:[],lastAssistant:w,usage:{input:h,output:g,total:h+g}},l);let T=b.length>0?Ya(b[b.length-1].message):``;if(S.signal)throw S.signal;return d&&b.length===0&&f.trim().length>0&&await d({role:`assistant`,content:f,timestamp:new Date().toISOString()},[]),{text:T||f,inputTokens:h,outputTokens:g,error:_,turnRecords:b}}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(`
|
|
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,schema:n.descriptor.schema,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),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=>{if(e.type===`message_update`){let t=e.assistantMessageEvent;if(t.type===`text_delta`&&typeof t.delta==`string`){let n=so(`partial`in t?t.partial:void 0)??so(`message`in t?t.message:void 0)??so(`message`in e?e.message:void 0),r=co(t.delta,n,m);r&&(await s.dispatchProgress(i,{type:`stream_text_delta`,text:r}),h+=r),n&&(m=n,h=n)}if(t.type===`done`){let e=t.message;p=oo(e);let n=co(``,p,h||m);n&&(await s.dispatchProgress(i,{type:`stream_text_delta`,text:n}),h+=n),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);S.delete(e.toolCallId),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=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(`
|
|
74
74
|
Preview:
|
|
75
|
-
`);return t===-1?``:e.slice(t+10).replace(/\n\.\.\.$/,``)}function
|
|
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(`
|
|
76
76
|
|
|
77
77
|
---
|
|
78
78
|
|
|
79
|
-
`)}`}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=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 io(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=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=I.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=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=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?I.join(n,t.slice(2)):void 0:I.resolve(t)}const mo=new Pe({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=I.relative(e,t);return n===``?!0:n.startsWith(`..`)?!1:!I.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=I.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=I.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 I.basename(e,I.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=I.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=I.join(e.rootDir,n.name);if(n.isFile()){if(!wo.has(I.extname(n.name)))continue;let r=I.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=I.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(I.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:I.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 I.join(e,`.aimax`,`extensions`)}function Bo(e){return I.join(e,`.aimax`,`extensions`)}function Vo(e){return I.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(I.extname(i))){n.push({level:`warn`,message:`plugin file has unsupported extension: ${i}`,source:i});continue}let r=I.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=I.join(e,t);if(B.existsSync(n))return n}return I.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?st({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=Fe(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},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:()=>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=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 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)??[],memoryPluginId:t.memory?.pluginId??o?.normalizedConfig.slots?.memory}}async function os(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=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=>Ht({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 I.join(o(e,t,n),`pending-hitl.json`)}function ds(e,t,n){return I.join(o(e,t,n),`hitl-history.jsonl`)}async function fs(e,t,n,r){let i=o(e,t,r);await F.mkdir(i,{recursive:!0});let a=us(e,t,r);await F.writeFile(a,JSON.stringify(n,null,2),`utf-8`)}async function ps(e,t,n,r){let i=o(e,t,r);await F.mkdir(i,{recursive:!0});let a=ds(e,t,r),s=JSON.stringify(n)+`
|
|
80
|
-
`;await F.appendFile(a,s,`utf-8`)}async function
|
|
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
|
|
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){return{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:{"Client-Code":`AIMax`,"X-Session-Id":t},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,schemaTitle:i.request.schema.title,fieldCount:i.request.schema.fields.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.schema.title}`,usage:o,error:void 0,uiToolPending:{requestId:i.request.requestId,toolName:i.request.toolName,toolCallId:i.request.toolCallId,schema:i.request.schema}})}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":`---
|
|
82
82
|
title: "AGENTS.md Template"
|
|
83
83
|
summary: ".aimax template for AGENTS.md"
|
|
84
84
|
read_when:
|
|
@@ -385,4 +385,4 @@ read_when:
|
|
|
385
385
|
# Add tasks below when you want the agent to check something periodically.
|
|
386
386
|
|
|
387
387
|
# This file lives at .aimax/HEARTBEAT.md, not in workspace/.
|
|
388
|
-
`},
|
|
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,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};
|