@gencode/agents 0.16.3 → 0.16.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/system-runtime-BwN5oJYF.js +4 -0
- package/dist/{system-runtime-CbHrwg94.d.ts → system-runtime-CEaCYWXK.d.ts} +6 -0
- package/dist/system-runtime.d.ts +1 -1
- package/dist/system-runtime.js +1 -1
- package/package.json +1 -1
- package/dist/system-runtime-CpWEW04p.js +0 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @gencode/agents
|
|
2
2
|
|
|
3
|
+
## 0.16.4
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- c96335b: Container prestart deployments can now preload system plugins before the real user request arrives. Start `aimax-server` with `--plugins-config /path/to/plugins.json` or `AIMAX_SERVER_PLUGINS_CONFIG=/path/to/plugins.json`; the server reads that file during warmup and preloads the configured plugins. If a `/run` request does not provide its own `run.pluginsConfig` and does not override `AIMAX_PLUGINS_CONFIG` in request `env`, the run automatically inherits the startup plugins config path, so the CLI execution reuses the preloaded plugin registry. Plugin runtime values such as session env and LLM access remain bound to the actual run request.
|
|
8
|
+
|
|
3
9
|
## 0.16.3
|
|
4
10
|
|
|
5
11
|
### Patch Changes
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { C as AgentsConfig, S as AgentModelConfig, _ as saveAgentsConfig, a as listAgents, b as AgentBinding, c as normalizeAgentId, d as resolveAgentDir, f as resolveAgentIdByBinding, g as resolveModelString, h as resolveModelFallbacks, i as getAgentConfig, l as removeAgent, m as resolveDefaultAgentId, n as addBinding, o as listBindings, p as resolveAgentsConfigPath, s as loadAgentsConfig, t as addAgent, u as removeBindings, v as updateAgent, x as AgentConfig, y as updateAgentIdentity } from "./index-BNCxlrCH.js";
|
|
2
2
|
import { $ as loadSkills, $n as MemoryChangeSource, $t as PluginManifestRegistry, A as AgentRuntimePolicyInput, An as PluginHookContextEvent, At as loadArtifactOperations, B as filterToolsForAgent, Bn as PluginHookName, Bt as sessionDir, C as TranscriptEntry, Cn as PluginHookBeforeModelResolveResult, Ct as createSession, D as AgentDefinitionsStats, Dn as PluginHookBeforeProviderRequestResult, Dt as inspectSession, E as AgentDefinitionsContext, En as PluginHookBeforeProviderRequestEvent, Et as exportSession, F as agentVisibility, Fn as PluginHookInputEvent, Ft as loadTranscript, G as resolveAgentDefinitionsContext, Gn as PluginHookSessionEndEvent, Gt as transcriptPath, H as loadAgentDefinitionsFromDir, Hn as PluginHookRegistry, Ht as sessionsDir, I as buildAgentDelegationPrompt, In as PluginHookInputResult, It as metadataPath, J as SkillDirectory, Jn as PluginHookToolResultEvent, Jt as PluginEntryConfig, K as scanAgentDefinitions, Kn as PluginHookSessionResetEvent, Kt as updateSessionMetadata, L as buildAgentTaskPrompt, Ln as PluginHookLlmInputEvent, Lt as normalizeSessionStoreName, M as AgentVisibility, Mn as PluginHookDreamGateEvent, Mt as loadSessionContextSnapshot, N as SYSTEM_AGENTS_DIR, Nn as PluginHookDreamGateResult, Nt as loadSessionMetadata, O as AgentDirectoryCandidate, On as PluginHookBeforeToolCallEvent, Ot as listSessionSummaries, P as agentDirCandidates, Pn as PluginHookHandlerMap, Pt as loadSystemPromptSnapshot, Q as loadSkillView, Qn as ReadonlyTranscriptSessionAdapter, Qt as validatePluginsConfig, R as createAgentDefinitionsContext, Rn as PluginHookLlmOutputEvent, Rt as rewriteTranscript, S as ThinkingLevel, Sn as PluginHookBeforeModelResolveEvent, St as contextSnapshotPath, T as AgentDefinition, Tn as PluginHookBeforePromptBuildResult, Tt as ensureSession, U as parseAgentDefinition, Un as PluginHookResourcesDiscoverEvent, Ut as systemPromptSnapshotPath, V as findAgentDefinition, Vn as PluginHookRegistration, Vt as sessionMemoryPath, W as publicAgentDefinitions, Wn as PluginHookResourcesDiscoverResult, Wt as toolResultsDir, X as buildSkillsPrompt, Xn as PluginHookTurnEndEvent, Xt as PluginsConfigValidationResult, Y as SkillViewResult, Yn as PluginHookToolResultResult, Yt as PluginsConfig, Z as findSkillByName, Zn as PluginHookTurnStartEvent, Zt as normalizePluginsConfig, _ as CallbackPayload, _n as PluginHookAssistantMessageEndEvent, _t as appendArtifactOperation, a as PluginToolOptions, an as PluginKind, ar as MemorySearchOptions, at as ArtifactOpInput, b as PiExtensionDialogBridge, bn as PluginHookBeforeCompactionEvent, bt as artifactsPath, c as PluginUiToolOptions, cn as PluginOrigin, cr as MemoryRebuildSummary, ct as ArtifactOperationName, d as UiToolOptions, dn as PluginHookAfterCompactionEvent, dr as AgentLogEntry, dt as DEFAULT_SESSION_STORE_NAME, en as loadPluginManifestRegistry, er as MemoryChangedEvent, et as loadSkillsFromDirs, f as createUiTool, fn as PluginHookAfterPromptBuildEvent, fr as OnLogCallback, ft as MAX_ARTIFACT_CONTENT_CHARS, g as AgentRunResult, gn as PluginHookAgentStartEvent, gt as SessionPathOptions, h as AgentRunParams, hn as PluginHookAgentEndEvent, ht as SessionMetadataUpdate, in as PluginDiscoveryResult, ir as MemoryProviderFactory, it as LlmApiFormat, j as AgentScanOptions, jn as PluginHookContextResult, jt as loadCronExecutionRecords, k as AgentRuntimePolicy, kn as PluginHookBeforeToolCallResult, kt as listSessions, l as RegisteredPluginTool, ln as RunEventDispatcher, lr as MemorySearchResult$1, lt as ArtifactOperationType, m as AgentProgressEvent$2, mn as PluginHookAgentContext, mt as SessionInspection, nn as PluginConfigUiHint, nr as MemoryProvider, nt as skillsDir, o as PluginToolRegistry, on as PluginManifest, or as MemoryIndexManager, ot as ArtifactOperation, p as defaultUiToolInputSchema, pn as PluginHookAfterToolCallEvent, pt as SessionExport, q as Skill, qn as PluginHookSessionStartEvent, qt as NormalizedPluginsConfig, rn as PluginDiagnostic, rr as MemoryProviderContext, rt as TopicSegmentationConfig, s as PluginUiToolDescriptor, sn as PluginManifestLoadResult, sr as MemoryProviderStatus, st as ArtifactOperationInput, tn as PluginCandidate, tr as MemoryChangedHandler, tt as loadSkillsWithPluginDirs, u as UiToolInputSchema, un as PluginExecutionRuntime, ur as ToolLoopDetectionConfig, ut as CronExecutionRecord, v as Channel, vn as PluginHookBeforeAgentStartEvent, vt as appendCronExecutionRecord, w as AgentConfigSource, wn as PluginHookBeforePromptBuildEvent, wt as cronExecutionsPath, x as SubagentContext, xn as PluginHookBeforeCompactionResult, xt as collapseLogPath, y as CompactionEntry, yn as PluginHookBeforeAgentStartResult, yt as appendTranscriptEntry, z as filterSkillsForAgent, zn as PluginHookMemoryChangedEvent, zt as saveSessionMetadata } from "./loader-Cf-Eh3Kg.js";
|
|
3
|
-
import { C as createPluginProgressEmitter, S as PluginProgressEmitter, T as createPluginRuntime, _ as resetEmbeddingProviderRegistryForTests, a as PluginSystemOptions, b as PluginRuntimeContext, c as preloadPluginSystem, d as PluginRegistry, f as loadPlugins, g as registerEmbeddingProvider, h as EmbeddingProviderRegistration, i as PluginSystem, l as PluginApi, m as EmbeddingProviderFactory, n as SystemWarmState, o as getPluginSystem, p as EmbeddingProviderContext, r as prepareSystemRuntime, s as initializePluginSystem, t as PrepareSystemRuntimeOptions, u as PluginRecord, v as resolveEmbeddingProvider, w as PluginRuntime, x as PluginCustomProgressInput, y as EmbeddingProvider } from "./system-runtime-
|
|
3
|
+
import { C as createPluginProgressEmitter, S as PluginProgressEmitter, T as createPluginRuntime, _ as resetEmbeddingProviderRegistryForTests, a as PluginSystemOptions, b as PluginRuntimeContext, c as preloadPluginSystem, d as PluginRegistry, f as loadPlugins, g as registerEmbeddingProvider, h as EmbeddingProviderRegistration, i as PluginSystem, l as PluginApi, m as EmbeddingProviderFactory, n as SystemWarmState, o as getPluginSystem, p as EmbeddingProviderContext, r as prepareSystemRuntime, s as initializePluginSystem, t as PrepareSystemRuntimeOptions, u as PluginRecord, v as resolveEmbeddingProvider, w as PluginRuntime, x as PluginCustomProgressInput, y as EmbeddingProvider } from "./system-runtime-CEaCYWXK.js";
|
|
4
4
|
import { AgentCustomProgressEvent, AgentProgressEvent, AgentProgressEvent as AgentProgressEvent$1, AgentTaskItem, AgentTaskStatus, AgentTaskUpdatedEvent, ArtifactRecord, ArtifactRecord as ArtifactRecord$1, CallbackEventPayload, Channel as Channel$1, CollapseSpan, CoreMemoryConfig, GoalStatus, HitlCheckpoint as HitlCheckpoint$1, HitlHistoryEntry, HitlRequest, HitlRequest as HitlRequest$1, HitlResolution, HitlResolution as HitlResolution$1, HitlStatus, HitlToolContext, HitlToolContext as HitlToolContext$1, MemoryCompactionRecallRuntimeState, MemoryRecallRuntimeState, ModelUsageCheckpoint, PausedRunState, PausedRunState as PausedRunState$1, ReadStateRecord, RunResultPayload, SessionContextSnapshot, SessionMemorySnapshot, SessionMetadata, SessionSummary, SnipRecord, ThreadGoal, ToolResultReference, UiToolExtra, UiToolOutputSchema, UiToolPausedState, UiToolRequest, UiToolResult } from "@gencode/shared";
|
|
5
5
|
import { Agent, AgentMessage, AgentTool } from "@earendil-works/pi-agent-core";
|
|
6
6
|
import { Message, Type } from "@earendil-works/pi-ai";
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{A as e,C as t,D as n,E as r,F as i,I as a,L as o,M as s,N as c,O as l,P as u,R as d,S as f,T as p,_ as m,a as h,b as g,c as _,d as v,f as y,g as b,h as x,i as S,j as C,k as w,l as T,m as E,n as D,o as O,p as k,r as A,s as j,t as M,u as N,v as P,w as F,x as I,y as L,z as R}from"./session-BpKaF-Gk.js";import{n as z,t as B}from"./goal-events-CocRykqc.js";import{c as V,i as H,l as U,n as ee,o as te,r as ne,s as W,t as re,u as G}from"./goal-store-M3_Nx3ky.js";import{A as ie,C as ae,D as K,E as oe,F as se,I as ce,M as le,N as ue,O as de,P as fe,S as pe,T as me,_ as he,a as ge,b as _e,c as ve,d as ye,f as be,g as xe,h as Se,i as Ce,j as we,k as Te,l as Ee,m as De,n as Oe,o as ke,p as Ae,r as je,s as Me,t as Ne,u as Pe,v as Fe,w as Ie,x as Le,y as Re}from"./system-runtime-
|
|
1
|
+
import{A as e,C as t,D as n,E as r,F as i,I as a,L as o,M as s,N as c,O as l,P as u,R as d,S as f,T as p,_ as m,a as h,b as g,c as _,d as v,f as y,g as b,h as x,i as S,j as C,k as w,l as T,m as E,n as D,o as O,p as k,r as A,s as j,t as M,u as N,v as P,w as F,x as I,y as L,z as R}from"./session-BpKaF-Gk.js";import{n as z,t as B}from"./goal-events-CocRykqc.js";import{c as V,i as H,l as U,n as ee,o as te,r as ne,s as W,t as re,u as G}from"./goal-store-M3_Nx3ky.js";import{A as ie,C as ae,D as K,E as oe,F as se,I as ce,M as le,N as ue,O as de,P as fe,S as pe,T as me,_ as he,a as ge,b as _e,c as ve,d as ye,f as be,g as xe,h as Se,i as Ce,j as we,k as Te,l as Ee,m as De,n as Oe,o as ke,p as Ae,r as je,s as Me,t as Ne,u as Pe,v as Fe,w as Ie,x as Le,y as Re}from"./system-runtime-BwN5oJYF.js";import{a as ze,c as Be,i as Ve,l as He,o as Ue,r as We,s as Ge,t as Ke,u as qe}from"./default-provider-BV9gmV00.js";import{a as Je,i as Ye,n as Xe,o as Ze,r as Qe,t as $e}from"./provider-registry-DPbmbWqS.js";import"./loader-CkdBGDtW.js";import{t as et}from"./host-BC9sAhdH.js";import{a as tt,i as nt,l as rt,n as it,o as at,r as ot,s as st,t as ct}from"./session-store-BwYOp-2K.js";import{_ as lt,a as ut,c as dt,d as ft,f as pt,g as mt,h as ht,i as gt,l as _t,m as vt,n as yt,o as bt,p as xt,s as St,t as Ct,u as wt,v as Tt,y as Et}from"./config-DDlWxQf7.js";import{MAX_GOAL_CONTINUATIONS_PER_RUN as Dt,formatTaskForDisplay as Ot,isHitlExpired as kt,isHitlTool as At}from"@gencode/shared";import q,{readFile as jt}from"node:fs/promises";import J,{join as Mt}from"node:path";import{createHash as Nt,randomBytes as Pt,randomUUID as Ft}from"node:crypto";import It from"node:os";import{spawn as Lt}from"node:child_process";import{TextDecoder as Rt}from"node:util";import zt from"gray-matter";import{Agent as Bt}from"@earendil-works/pi-agent-core";import{AsyncLocalStorage as Vt}from"node:async_hooks";import Ht from"node:fs";import Ut from"openai";import{Type as Y,calculateCost as Wt,clampThinkingLevel as Gt,createAssistantMessageEventStream as Kt,getEnvApiKey as qt,parseStreamingJson as Jt,registerApiProvider as Yt,registerBuiltInApiProviders as Xt,streamSimple as Zt}from"@earendil-works/pi-ai";import{fileURLToPath as Qt}from"node:url";import{isBinaryFile as $t}from"isbinaryfile";var en=class{turn=null;wallClock={activeGoalId:null,lastAccountedAt:Date.now()};resetWallClock(){this.wallClock.lastAccountedAt=Date.now()}markActiveGoal(e,t,n){e&&(this.turn&&this.turn.turnId===e?(this.turn.activeGoalId=t,this.turn.lastTokenUsage=n):this.turn={turnId:e,activeGoalId:t,lastTokenUsage:n}),this.wallClock.activeGoalId!==t&&this.resetWallClock(),this.wallClock.activeGoalId=t}clearActiveGoal(){this.turn&&(this.turn.activeGoalId=null),this.wallClock.activeGoalId=null,this.resetWallClock()}tokenDeltaSinceLastAccounting(e){if(!this.turn||!this.turn.activeGoalId)return 0;let t=this.turn.lastTokenUsage;return Math.max(0,e.input-t.input)+Math.max(0,e.output-t.output)}timeDeltaSecondsSinceLastAccounting(){if(!this.wallClock.activeGoalId)return 0;let e=Date.now()-this.wallClock.lastAccountedAt;return Math.floor(e/1e3)}markAccounted(e,t){this.turn&&(this.turn.lastTokenUsage=e),t>0&&(this.wallClock.lastAccountedAt+=t*1e3),this.wallClock.lastAccountedAt>Date.now()&&(this.wallClock.lastAccountedAt=Date.now())}};async function tn(e,t,n,r,i){let a=await W(e,t,{storeName:i?.storeName});if(!a)return{goal:null,budgetLimited:!1};let o=n.turn?.activeGoalId??n.wallClock.activeGoalId;if(o&&o!==a.goalId)return{goal:a,budgetLimited:!1};let s=n.tokenDeltaSinceLastAccounting(r),c=n.timeDeltaSecondsSinceLastAccounting();if(s<=0&&c<=0)return{goal:a,budgetLimited:!1};let l=a.tokensUsed+s,u=a.timeUsedSeconds+c,d=a.status,f=!1;a.tokenBudget!==null&&l>=a.tokenBudget&&a.status===`active`&&(d=`budget_limited`,f=!0);let p=await U(e,t,{tokensUsed:l,timeUsedSeconds:u,status:d},{storeName:i?.storeName,eventSource:i?.eventSource});return n.markAccounted(r,c),{goal:p,budgetLimited:f}}const nn=`clarify plan and acceptance`,rn=`补齐后续 task list、每个 task 的验收项和当前下一步`,an={goal:[`目标`,`goal`,`objective`],scope:[`范围`,`scope`,`约束`,`constraints`],steps:[`步骤`,`阶段`,`steps`,`phases`],acceptance:[`完成标准`,`验收`,`验证`,`输出`,`acceptance`,`verification`,`output`,`deliverables`]},on=[`test`,`verify`,`validation`,`pass`,`run `,`npm `,`pnpm `,`pytest`,`通过`,`验证`,`测试`,`输出`,`证明`,`截图`,`日志`,`覆盖`,`回归`];function sn(e){return e.trim().toLowerCase().replace(/[【】\[\]]/g,``)}function cn(e,t){let n=sn(e);return t.some(e=>n===e.toLowerCase()||n.includes(e.toLowerCase()))}function ln(e){let t=e.split(/\r?\n/),n=[];for(let e of t){let t=e.trim();if(!t)continue;let r=t.match(/^(?:[-*•]|\d+[.)])\s+(.+)$/);if(r?.[1]){n.push(r[1].trim());continue}t.length>=8&&n.push(t)}return n.filter(e=>e.length>=4)}function un(e){let t={raw:e.trim()},n=/(?:^|\n)\s*(?:【([^】]+)】|(?:#{1,3}\s*)?([A-Za-z\u4e00-\u9fff][^:\n]{0,30}))\s*[::]\s*/g,r=[],i;for(;(i=n.exec(e))!==null;){let e=(i[1]??i[2]??``).trim();e&&r.push({label:e,start:i.index,contentStart:i.index+i[0].length})}for(let n=0;n<r.length;n+=1){let i=r[n],a=r[n+1],o=e.slice(i.contentStart,a?.start??e.length).trim();for(let[e,n]of Object.entries(an))cn(i.label,n)&&(t[e]=t[e]?`${t[e]}\n${o}`:o)}return{goal:t.goal?.trim()||e.split(/\r?\n/).map(e=>e.trim()).find(e=>e.length>=8)||e.trim(),scope:t.scope?.trim()??``,steps:t.steps?ln(t.steps):[],acceptance:t.acceptance?ln(t.acceptance):[],raw:e.trim()}}function dn(e){let t=e.toLowerCase();return on.some(e=>t.includes(e.toLowerCase()))}function fn(e){return e.some(dn)}function pn(e,t){return{id:e,text:t,required:!0}}function mn(e){return{id:e.id,kind:e.kind,title:e.title,required:!0,status:e.status,acceptanceCriteria:e.acceptanceCriteria,acceptanceEvidence:[],evidenceRefs:[],blockedReason:null,updatedAt:e.updatedAt}}function hn(e){return mn({id:`task-1`,kind:`clarify`,title:nn,status:`doing`,acceptanceCriteria:[pn(`ac-1`,rn)],updatedAt:e})}function gn(e,t,n){let r=e.slice(0,5),i=t.length>0?t.map((e,t)=>pn(`ac-${t+1}`,e)):[pn(`ac-1`,`完成:${r[0]}`)];return r.map((e,t)=>mn({id:`task-${t+1}`,kind:`execution`,title:e,status:t===0?`doing`:`todo`,acceptanceCriteria:t===0?i:[pn(`ac-1`,`完成:${e}`)],updatedAt:n}))}function _n(e){let t=new Date().toISOString(),n=un(e),r=n.goal||n.raw,i=n.scope?[n.scope]:[],a=[];if(n.steps.length>=2)return{interpretation:r,assumptions:i,openQuestions:a,tasks:gn(n.steps,n.acceptance,t)};let o=n.acceptance;if(o.length>0&&fn(o))return{interpretation:r,assumptions:i,openQuestions:a,tasks:gn([n.steps[0]??n.goal],o,t)};if(n.raw.length>=40&&fn(ln(n.raw))){let e=ln(n.raw).filter(dn);return{interpretation:r,assumptions:i,openQuestions:a,tasks:gn([n.goal],e,t)}}return{interpretation:r,assumptions:i,openQuestions:a,tasks:[hn(t)]}}function vn(e,t){return`- [${e?`x`:` `}] ${t.id}: ${t.text}`}function yn(e,t){let n=t??new Set(e.acceptanceEvidence);return[`### ${e.id}: ${e.title}`,``,`Status: ${e.status}`,``,`Acceptance Criteria:`,...e.acceptanceCriteria.map(e=>vn(n.has(e.id),e)),``].join(`
|
|
2
2
|
`)}function bn(e,t){let n=e.tasks.find(t=>t.id===e.currentTaskId),r=t?.interpretation?.trim()||e.objective,i=t?.assumptions??[],a=t?.openQuestions??[],o=t?.progressLog??[`${new Date(e.updatedAt).toISOString().slice(0,16).replace(`T`,` `)}: 创建目标并生成初始任务。`],s=t?.evidence?.length?t.evidence:e.finalEvidenceRefs.length>0?e.finalEvidenceRefs:[],c=t?.risks??(e.blockedReason?[e.blockedReason]:[]),l=[`# Goal Plan`,``,`## Objective`,``,e.objective,``,`## Interpretation`,``,r,``,`## Assumptions`,``,...i.length>0?i.map(e=>`- ${e}`):[`- 暂无`],``];return t?.taskPlanNotes?.trim()&&l.push(`## Task Plan Notes`,``,t.taskPlanNotes.trim(),``),l.push(`## Current Focus`,``,`- Current task: ${e.currentTaskId??`none`}`,`- Status: ${e.status}`,`- Next step: ${n?.title??`无当前任务`}`,...e.blockedReason?[`- Blocked: ${e.blockedReason}`]:[],``,`## Task List`,``,...e.tasks.flatMap(e=>{let n=new Set,r=t?.criterionEvidence?.[e.id];if(r)for(let t of e.acceptanceCriteria)r.includes(t.id)&&n.add(t.id);else if(e.status===`done`)for(let t of e.acceptanceCriteria)n.add(t.id);return[yn(e,n)]}),`## Progress Log`,``,...o.map(e=>`- ${e}`),``,`## Open Questions`,``,...a.length>0?a.map(e=>`- ${e}`):[`- 暂无`],``,`## Evidence`,``,...s.length>0?s.map(e=>`- ${e}`):[`- 暂无`],``,`## Risks`,``,...c.length>0?c.map(e=>`- ${e}`):[`- 暂无`],``),t?.finalSummary?.trim()&&l.push(`## Final Summary`,``,t.finalSummary.trim(),``),l.join(`
|
|
3
3
|
`)}const xn=process.platform===`win32`;function Sn(e){return xn?{shell:!0,file:process.env.ComSpec||process.env.COMSPEC||`cmd.exe`,args:[`/d`,`/s`,`/c`,`chcp 65001>nul & ${e}`]}:{file:`bash`,args:[`-lc`,e],shell:void 0}}function Cn(e,t){if(!(e.exitCode!==null||e.signalCode!==null)){if(xn&&typeof e.pid==`number`){let n=[`/pid`,String(e.pid),`/T`];t===`SIGKILL`&&n.push(`/F`);try{Lt(`taskkill`,n,{windowsHide:!0,stdio:`ignore`})}catch{try{e.kill()}catch{}}return}try{if(typeof e.pid==`number`){process.kill(-e.pid,t);return}e.kill(t)}catch{try{e.kill(t)}catch{}}}}const wn=2e5;function Tn(e,t=4e3){return e?e.length>t?e.slice(-t):e:``}function En(e,t){let n=e+t;return n.length<=wn?{text:n,truncated:!1}:{text:n.slice(-wn),truncated:!0}}function Dn(e,t,n){if(n.length===0)return;let r=n.toString(`utf-8`),i=En(e.output,r);e.output=i.text;let a=En(e[t],r);e[t]=a.text,(i.truncated||a.truncated)&&(e.outputTruncated=!0)}function On(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:Tn(e.output),stdoutTail:Tn(e.stdout),stderrTail:Tn(e.stderr),outputTruncated:e.outputTruncated}}function kn(e,t){return t?e.scopeKey===t:!0}function An(e,t){return typeof e!=`number`||!Number.isFinite(e)||e<=0?t:Math.floor(e)}function jn(e){return e?e.split(/\r?\n/):[]}function Mn(e){let t=jn(e.record.output),n=e.offset===void 0&&e.limit===void 0,r=Math.max(0,(e.offset??0)|0),i=An(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(`
|
|
4
4
|
`);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 Nn(e){e.timeoutTimer&&=(clearTimeout(e.timeoutTimer),void 0),e.killTimer&&=(clearTimeout(e.killTimer),void 0),e.resolveDone()}function Pn(){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),Nn(e))};return{start(t){let{file:n,args:r,shell:a}=Sn(t.command),o=Lt(n,r,{cwd:t.cwd,env:{...process.env,...t.baseEnv??{},...t.env??{}},stdio:[`pipe`,`pipe`,`pipe`],windowsHide:!0,shell:a,detached:!xn}),s=()=>{},c=new Promise(e=>{s=e}),l={sessionId:Ft(),scopeKey:t.scopeKey,command:t.command,cwd:t.cwd,startedAt:Date.now(),child:o,status:`running`,output:``,stdout:``,stderr:``,outputTruncated:!1,donePromise:c,resolveDone:s};e.set(l.sessionId,l),o.stdout.on(`data`,e=>Dn(l,`stdout`,e)),o.stderr.on(`data`,e=>Dn(l,`stderr`,e));let u=e=>t=>{Dn(l,`stderr`,Buffer.from(`\n[${e} stream error: ${t.message}]\n`))};o.stdout.on(`error`,u(`stdout`)),o.stderr.on(`error`,u(`stderr`)),o.stdin.on(`error`,u(`stdin`));try{o.stdin.end()}catch{}let d=An(t.timeoutSec,1800);return l.timeoutTimer=setTimeout(()=>{l.status===`running`&&(l.status=`timeout`,Dn(l,`stderr`,Buffer.from(`\n[Timed out after ${d}s]\n`)),Cn(l.child,`SIGTERM`),l.killTimer=setTimeout(()=>{(l.status===`running`||l.status===`timeout`)&&Cn(l.child,`SIGKILL`)},1e3))},d*1e3),o.on(`error`,e=>{i(l,()=>{l.status===`running`&&(l.status=`failed`),Dn(l,`stderr`,Buffer.from(`\n[Process error: ${e.message}]\n`))})}),o.on(`close`,(e,t)=>{i(l,()=>{l.exitCode=e,l.exitSignal=t,l.status===`running`?l.status=e===0?`completed`:`failed`:l.status===`killed`&&e===0&&(l.status=`completed`)})}),On(l)},get(e,t){let n=r(e);return!n||!kn(n,t)?null:On(n)},list(n){return[...e.values(),...t.values()].filter(e=>kn(e,n)).sort((e,t)=>t.startedAt-e.startedAt).map(e=>On(e))},async wait(e,t,n){let i=r(e);if(!i||!kn(i,t))return null;if(i.status!==`running`)return On(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||!kn(a,t)?null:On(a)},readLog(e){let t=r(e.sessionId);return!t||!kn(t,e.scopeKey)?null:Mn({record:t,offset:e.offset,limit:e.limit})},readOutput(e,t){let n=r(e);return!n||!kn(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||!kn(n,t))return null;if(n.status!==`running`)return On(n);n.status=`killed`,Cn(n.child,`SIGTERM`),n.killTimer=setTimeout(()=>{(n.status===`running`||n.status===`killed`)&&Cn(n.child,`SIGKILL`)},1e3),await Promise.race([n.donePromise,new Promise(e=>{setTimeout(e,1500)})]);let i=r(e);return i?On(i):null},disposeAll(){for(let t of e.values()){if(t.status!==`running`)continue;t.status=`killed`,Cn(t.child,`SIGTERM`);let e=setTimeout(()=>{(t.status===`running`||t.status===`killed`)&&Cn(t.child,`SIGKILL`)},1e3);typeof e.unref==`function`&&e.unref(),t.killTimer=e}}}}const Fn=1;var In=class extends Error{constructor(e){super(`unsupported_goal_state_version:${e}`),this.name=`UnsupportedGoalStateVersionError`}},Ln=class extends Error{constructor(e){super(e),this.name=`CorruptEvidenceRegistryError`}},Rn=class extends Error{rawContentPreview;constructor(e,t){super(e),this.name=`CorruptGoalWorkflowStateError`,t?.cause!==void 0&&(this.cause=t.cause),this.rawContentPreview=t?.rawContentPreview}};const zn=new Map;function Bn(e,t,n){return`${e}\x00${t}\x00${n?.storeName??``}`}async function Vn(e,t,n,r){let i=Bn(e,t,n),a=zn.get(i)??Promise.resolve(),o,s=new Promise(e=>{o=e});zn.set(i,a.then(()=>s)),await a;try{return await r()}finally{o()}}function Hn(e,t,n){return J.join(ee(e,t,n),`state.json`)}function Un(e,t,n){return J.join(ee(e,t,n),`plan.md`)}function Wn(e,t,n){return J.join(ee(e,t,n),`artifacts`)}async function Gn(e,t){let n=`${e}.${process.pid}.${Date.now()}.${Pt(4).toString(`hex`)}.tmp`;try{await q.writeFile(n,t,`utf-8`),await q.rename(n,e)}finally{await q.unlink(n).catch(e=>{if(e.code!==`ENOENT`)throw e})}}function Kn(e){if(e.version!==1)throw new In(e.version)}function qn(e){let t=e.currentTaskId?e.tasks.find(t=>t.id===e.currentTaskId)??null:null,n=e.tasks.filter(e=>e.required!==!1),r=n.filter(e=>e.status===`done`).length,i=n.filter(e=>e.status!==`done`).length;return{workflowStatus:e.status,currentTaskId:e.currentTaskId,currentTaskTitle:t?.title??null,currentTaskStatus:t?.status??null,blockedReason:e.blockedReason,openRequiredTasks:i,doneRequiredTasks:r,finalEvidenceRefs:[...e.finalEvidenceRefs]}}async function Jn(e,t,n){let r=Hn(e,t,n);try{let e=await q.readFile(r,`utf-8`);try{let t=JSON.parse(e);return Kn(t),t}catch(t){throw t instanceof In?t:new Rn(`corrupt_goal_workflow_state`,{cause:t,rawContentPreview:e.slice(0,200)})}}catch(e){if(e.code===`ENOENT`)return null;throw e instanceof Rn||e instanceof In?e:new Rn(`corrupt_goal_workflow_state`,{cause:e})}}async function Yn(e,t,n){let r=Hn(e,t,n),i;try{i=await q.readFile(r,`utf-8`)}catch(e){if(e.code===`ENOENT`)return{ok:!0,healthy:!0,mode:`absent`};throw e}try{return Kn(JSON.parse(i)),{ok:!0,healthy:!0,mode:`healthy`}}catch(e){if(e instanceof In)throw e}let a=await W(e,t,n);if(!a)throw Error(`repairGoalWorkflowState requires an existing goal record`);let o=(await V(e,t,a,n)).trim();if(!o)throw Error(`repairGoalWorkflowState requires a non-empty objective`);let s=`${r}.corrupt.${new Date().toISOString().replace(/[:.]/g,`-`)}.bak`,c=null;try{await q.writeFile(s,i,`utf-8`),c=s}catch{}return await $n(e,t,{goalId:a.goalId,objective:o},n),await mr(e,t,{type:`goal_workflow_repaired`,goalId:a.goalId,mode:`reinitialized`,backupPath:c},n),{ok:!0,mode:`reinitialized`,goalId:a.goalId,backedUpState:c}}async function Xn(e,t,n){let r=await Jn(e,t,n);return r?qn(r):null}async function Zn(e,t,n){let r=await Jn(e,t,n);return r?{goalState:qn(r),workflowWarning:null}:{goalState:null,workflowWarning:`workflow_not_initialized`}}async function Qn(e,t,n){let r=Hn(e,t,n),i=Un(e,t,n),a=Wn(e,t,n);await Promise.all([q.unlink(r).catch(e=>{if(e.code!==`ENOENT`)throw e}),q.unlink(i).catch(e=>{if(e.code!==`ENOENT`)throw e}),q.rm(a,{recursive:!0,force:!0})])}async function $n(e,t,n,r){let i=n.objective.trim();if(!i)throw Error(`initializeGoalWorkflow requires a non-empty objective`);await Qn(e,t,r);let a=_n(i),o=new Date().toISOString(),s=a.tasks.find(e=>e.status===`doing`)?.id??a.tasks[0]?.id??null,c={version:1,goalId:n.goalId,status:`active`,objective:i,currentTaskId:s,tasks:a.tasks,blockedReason:null,finalEvidenceRefs:[],completedAt:null,updatedAt:o},l=ee(e,t,r);await q.mkdir(l,{recursive:!0}),await Gn(Hn(e,t,r),JSON.stringify(c,null,2));let u=bn(c,{interpretation:a.interpretation,assumptions:a.assumptions,openQuestions:a.openQuestions});return await Gn(Un(e,t,r),u),c}const er=[/(?:api[_-]?key|token|secret|password|authorization)\s*[:=]\s*\S+/gi,/Bearer\s+[A-Za-z0-9._~+/=-]+/gi,/sk-[A-Za-z0-9]{16,}/g];function tr(e,t,n){return J.join(Wn(e,t,n),`registry.jsonl`)}function nr(e,t,n){return J.join(Wn(e,t,n),`notes`)}function rr(e,t,n){return J.join(ee(e,t,n),`plan-meta.json`)}function ir(e){let t=e,n=!1;for(let e of er)t=t.replace(e,e=>e.length<=8?(n=!0,`[REDACTED]`):`${e.slice(0,4)}[REDACTED]`);return{text:t,redactionIncomplete:n}}function ar(e){return`${e}-${Date.now().toString(36)}-${Pt(3).toString(`hex`)}`}async function or(e,t,n,r){let i=await sr(e,t,r),a=new Set(i.map(e=>e.id));for(let e=0;e<8;e+=1){let e=`${n}:${ar(n)}`;if(!a.has(e))return e}throw Error(`failed_to_generate_unique_evidence_id`)}async function sr(e,t,n){let r=tr(e,t,n);try{let e=await q.readFile(r,`utf-8`),t=[],n=e.split(/\r?\n/).map((e,t)=>({line:e,index:t})).filter(e=>e.line.trim().length>0);for(let[e,r]of n.entries())try{t.push(JSON.parse(r.line))}catch{if(e===n.length-1)continue;throw new Ln(`corrupt evidence registry line ${r.index+1}`)}return t}catch(e){if(e.code===`ENOENT`)return[];throw e}}async function cr(e,t,n,r){let i=tr(e,t,r);await q.mkdir(J.dirname(i),{recursive:!0}),await q.appendFile(i,`${JSON.stringify(n)}\n`,`utf-8`)}async function lr(e,t,n,r){Kn(n),await Gn(Hn(e,t,r),JSON.stringify(n,null,2))}async function ur(e,t,n){let r=rr(e,t,n);try{let e=await q.readFile(r,`utf-8`);return JSON.parse(e)}catch(e){if(e.code===`ENOENT`)return{};throw e}}async function dr(e,t,n,r){await Gn(rr(e,t,r),JSON.stringify(n,null,2))}async function fr(e,t,n,r){let i=await ur(e,t,r),a={...i,...n,assumptions:n.assumptions??i.assumptions,openQuestions:n.openQuestions??i.openQuestions,progressLog:n.progressLog??i.progressLog,evidence:n.evidence??i.evidence,risks:n.risks??i.risks,criterionEvidence:{...i.criterionEvidence,...n.criterionEvidence}};return await dr(e,t,a,r),a}async function pr(e,t,n,r){try{let i=bn(n,await ur(e,t,r));return await Gn(Un(e,t,r),i),{ok:!0}}catch(e){return{ok:!1,warning:`plan_update_failed`,message:e instanceof Error?e.message:String(e)}}}async function mr(e,t,n,r){let{type:i,...a}=n,o={timestamp:new Date().toISOString(),sessionId:t,goalId:n.goalId??null,action:i,detail:a},s=z(e,t,r);await q.mkdir(J.dirname(s),{recursive:!0}),await q.appendFile(s,`${JSON.stringify(o)}\n`,`utf-8`)}async function hr(e,t,n,r){if(n.kind===`manual`&&!n.source?.trim())return{error:`manual evidence requires source`};if(Buffer.byteLength(n.content,`utf-8`)>65536)return{error:`note_content_too_large`};let i=await or(e,t,n.kind,r),a=i.split(`:`)[1]??ar(n.kind),o=nr(e,t,r);await q.mkdir(o,{recursive:!0});let s=`goal/artifacts/notes/${a}.md`,c=J.join(nr(e,t,r),`${a}.md`),l=ir(n.content);await q.writeFile(c,l.text,`utf-8`);let u={id:i,kind:n.kind,summary:n.summary,source:n.source??`model`,createdAt:new Date().toISOString(),notePath:s,contentBytes:Buffer.byteLength(l.text,`utf-8`),redactionIncomplete:l.redactionIncomplete};try{await cr(e,t,u,r)}catch{return await q.unlink(c).catch(()=>{}),{error:`registry_write_failed`}}return{evidenceRef:i}}function gr(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`)}function _r(e){let t=[`Workflow status: ${e.workflowStatus}`];if(e.currentTaskId&&(t.push(`Current task: ${e.currentTaskId} — ${gr(e.currentTaskTitle??`untitled`)}`,`Current task status: ${e.currentTaskStatus??`unknown`}`),e.currentTaskKind&&t.push(`Current task kind: ${e.currentTaskKind}`)),e.blockedReason&&t.push(`Workflow blocked: ${gr(e.blockedReason)}`),e.taskBlockedReason&&e.taskBlockedReason!==e.blockedReason&&t.push(`Task blocked: ${gr(e.taskBlockedReason)}`),e.acceptanceCriteria.length>0){t.push(``,`Acceptance criteria (current task):`);for(let n of e.acceptanceCriteria){let e=n.required===!1?``:` [required]`;t.push(`- ${n.id}${e}: ${gr(n.text)}`)}}if(e.openQuestions.length>0){t.push(``,`Open questions:`);for(let n of e.openQuestions)t.push(`- ${gr(n)}`)}return t}function vr(e){let t=[`- Treat goal/state.json as the only task workflow machine state; use goal/plan.md for human-readable context.`,`- Work on the current task and acceptance criteria shown in this context.`,`- Do not expose internal workflow files or task mechanics to the user unless they ask for implementation details.`,`- If the overall goal is genuinely achieved, submit goal({ status: "complete", summary }).`,`- If the goal cannot continue without user input or external state, submit goal({ status: "blocked", reason, neededInput }).`,`- Use the current worktree, files, command output, and test results as authoritative evidence.`,`- Do not rely solely on conversation memory to assess completion.`,`- Do NOT mark complete merely because the budget is nearly exhausted or you are stopping work.`,`- If you cannot finish in this turn, make concrete progress on the current task.`,`- Do not inform the user about this continuation context; treat it as internal steering.`];return(e.currentTaskKind===`clarify`||e.currentTaskTitle===nn)&&t.unshift(`- Current task is "${nn}": explore, clarify, and refine the plan and acceptance criteria.`,`- Do NOT implement deliverables yet; use normal conversation to clarify scope and acceptance before execution work.`),t}function yr(){return[`- Keep the full objective intact; do not redefine it as a smaller task.`,`- Use the current worktree, files, command output, and test results as authoritative evidence of progress.`,`- Do not rely solely on conversation memory to assess completion.`,`- Perform a completion audit: check each requirement in the objective against actual state.`,`- If the overall goal is genuinely achieved, submit goal({ status: "complete", summary }).`,`- If the goal cannot continue without user input or external state, submit goal({ status: "blocked", reason, neededInput }).`,`- Do NOT mark complete merely because the budget is nearly exhausted or you are stopping work.`,`- If you cannot finish in this turn, make concrete progress and the goal remains active.`,`- Do not inform the user about this continuation context; treat it as internal steering.`]}const br=`The user just set a thread goal. Acknowledge it implicitly, then work on the current workflow task below.`;function xr(e,t,n){return Sr(e,t,n,{introLine:br})}function Sr(e,t,n,r){let i=gr(t),a=e.tokenBudget===null?`none`:String(e.tokenBudget),o=String(e.tokensUsed),s=e.tokenBudget===null?`unbounded`:String(Math.max(0,e.tokenBudget-e.tokensUsed)),c=n?`The user's thread goal is still active. Continue working on the current workflow task below.`:`The user's thread goal is still active. Continue working toward the objective below.`,l=[`<goal_context>`,``,r?.introLine??c,``,`<objective>`,i,`</objective>`,``,`Token budget: ${a}`,`Tokens used: ${o}`,`Tokens remaining: ${s}`,`Time used: ${e.timeUsedSeconds}s`,``];return n?l.push(`<workflow>`,..._r(n),`</workflow>`,``,`Rules:`,...vr(n)):l.push(`Rules:`,...yr()),l.push(``,`</goal_context>`),l.join(`
|
|
@@ -186,7 +186,7 @@ Preview:
|
|
|
186
186
|
|
|
187
187
|
---
|
|
188
188
|
|
|
189
|
-
`)}`}async function Zv(e){let{runParams:t,hookContext:n,sessionId:r,eventDispatcher:i,runtimeBridge:a}=e,o=e=>{i.dispatchDiagnostic(r,e).catch(()=>void 0)},s=t.plugins?Date.now():void 0,c=t.plugins?
|
|
189
|
+
`)}`}async function Zv(e){let{runParams:t,hookContext:n,sessionId:r,eventDispatcher:i,runtimeBridge:a}=e,o=e=>{i.dispatchDiagnostic(r,e).catch(()=>void 0)},s=t.plugins?Date.now():void 0,c=t.plugins?je({...t.plugins,config:t.plugins.config,runtime:{llm:t.llm,hookCtx:n,llmAllowlist:t.plugins.llmAllowlist,env:t.env}}):void 0,l=s===void 0?void 0:Math.max(0,Date.now()-s);if(!c)return o({level:`info`,scope:`plugin`,phase:`plugin_system_disabled`,message:`plugin system disabled for this run`}),{hookRegistry:new le,pluginSkillDirs:[],pluginTools:[]};o({level:c.diagnostics.some(e=>e.level===`error`)?`warn`:`info`,scope:`plugin`,phase:`plugin_system_initialized`,message:`plugin system initialized`,details:{pluginCount:c.registry.plugins.length,enabledPluginCount:c.registry.plugins.filter(e=>e.status===`loaded`).length,disabledPluginCount:c.registry.plugins.filter(e=>e.status===`disabled`).length,errorPluginCount:c.registry.plugins.filter(e=>e.status===`error`).length,diagnosticCount:c.diagnostics.length,durationMs:l}});for(let e of c.registry.plugins)o({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,durationMs:e.durationMs,errorMessage:e.error}});for(let e of c.diagnostics)o({level:e.level===`error`?`error`:`warn`,scope:`plugin`,phase:`plugin_diagnostic`,message:e.message,details:{pluginId:e.pluginId,source:e.source}});let u=ke(c.normalizedConfig),d;if(u.length>0){let e=await Oe(c.normalizedConfig);if(e.length>0){d=new et(e);let s=n.session?.getSessionDir?.(),l=t.createPiExtensionDialogBridge?.(r),u={};for(let[e,t]of Object.entries(c.normalizedConfig.entries??{}))t?.config&&typeof t.config==`object`&&(u[e]=t.config);let f=new Map;for(let t of e){let e=`pi:${t.name}`;u[e]&&f.set(e,u[e])}await d.activate({hookRegistry:c.registry.hooks,toolRegistry:c.registry.tools,hookContext:n,eventDispatcher:i,sessionId:r,sessionDir:s,runtimeBridge:a,dialogBridge:l,piExtensionConfigs:f}),o({level:`info`,scope:`plugin`,phase:`pi_extensions_activated`,message:`pi extensions activated`,details:{extensionCount:e.length,extensionNames:e.map(e=>e.name),commandCount:d.getRegisteredCommands().size}})}}return{hookRegistry:c.registry.hooks,pluginSkillDirs:c.registry.skills,pluginTools:[...c.registry.tools.resolveEnabled(t.plugins?.toolAllowlist)??[],...c.registry.tools.resolveUiTools(r,t.uiToolResume,t.plugins?.toolAllowlist)??[]],memoryPluginId:t.memory?.pluginId??c.normalizedConfig.slots?.memory,extensionHost:d}}var Qv=class{agent=null;messageQueue=[];compactRequest=null;bindAgent(e){this.agent=e}dispose(){this.agent=null,this.messageQueue=[],this.compactRequest=null}sendUserMessage(e,t){this.messageQueue.push({content:e,deliverAs:t?.deliverAs,resolve:()=>{}})}isIdle(){if(!this.agent)return!0;let e=this.agent.state;return!e.isStreaming&&(e.pendingToolCalls?.size??0)===0}requestCompact(e){this.compactRequest=e??{}}drainMessages(){let e=this.messageQueue.map(e=>e.content);return this.messageQueue=[],e}drainCompactRequest(){let e=this.compactRequest;return this.compactRequest=null,e}hasPendingMessages(){return this.messageQueue.length>0}hasPendingCompact(){return this.compactRequest!==null}};async function $v(e){let{runParams:t,requestedSessionId:n,eventDispatcher:i}=e,a=Kp(t),o=n,s=!o,c=$(t);o?(await w(t.dataDir,o,c)||(s=!0),await v(t.dataDir,o,c)):o=await T(t.dataDir,t.channel,{...c});let l={sessionId:o,messageId:t.messageId,workspaceDir:a,channel:t.channel,session:{getSessionId:()=>o,getSessionDir:()=>r(t.dataDir,o,c),getEntries:()=>I(t.dataDir,o,c)}},u=new Qv,d=await Zv({runParams:t,hookContext:l,sessionId:o,eventDispatcher:i,runtimeBridge:u}),f=d.hookRegistry,p=await qp({runParams:t,sessionId:o,hookContext:l,memoryProviderId:t.memory?.providerId,memoryPluginId:d.memoryPluginId,eventDispatcher:i,hookRegistry:f});return{sessionId:o,isNewSession:s,workspaceDir:a,hookContext:l,hookRegistry:f,pluginContext:d,runContext:p,runtimeBridge:u,start:e=>H_({sessionId:o,runParams:t,hookRegistry:f,hookContext:l,eventDispatcher:i,...e})}}function ey(e){return e===null||typeof e==`string`||typeof e==`number`||typeof e==`boolean`?e:JSON.stringify(e)??String(e)}function ty(e){if(!(e instanceof Error))return{errorValue:ey(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]=ey(n[e]));return t}async function ny(e){await e.dispatcher.dispatchDiagnostic(e.sessionId,{level:`error`,scope:e.scope,phase:e.phase,message:e.message,details:{...e.details,...ty(e.error)}})}function ry(e,t,n){return J.join(r(e,t,n),`pending-ui-tool.json`)}async function iy(e,t,n,i){let a=r(e,t,i);await q.mkdir(a,{recursive:!0}),await R(ry(e,t,i),JSON.stringify(n,null,2),i?.encryptSessions)}async function ay(e,t,n){let r=await o(ry(e,t,n));return r===null?null:JSON.parse(r)}async function oy(e,t,n,r){let i=new Date().toISOString(),a={version:1,sessionId:t,request:n,status:`pending`,createdAt:i,updatedAt:i};return await iy(e,t,a,r),a}async function sy(e,t,n,r,i){let a=await ay(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 iy(e,t,o,i),o}async function cy(e,t,n){try{await q.unlink(ry(e,t,n))}catch(e){if(e.code===`ENOENT`)return;throw e}}async function ly(e,t,n,r){let i=await W(e,t,{storeName:r?.storeName});if(!i||i.status!==`active`&&i.status!==`budget_limited`){n.clearActiveGoal();return}(n.turn?.activeGoalId??n.wallClock.activeGoalId)!==i.goalId&&n.markActiveGoal(`run`,i.goalId,{input:0,output:0,total:0})}async function uy(e,t,n,r,i,a){let o=await W(e,t,{storeName:a?.storeName});await ly(e,t,n,a);let s=await tn(e,t,n,r,a);return s.goal&&await Bv(i,t,{before:o,after:s.goal,action:s.budgetLimited?`budget_limited`:`updated`}),s}function dy(e){let t=e.hitlResume?.toolContext?.toolName;return!!(e.hitlResume&&e.hitlResume.checkpoint.phase===`before_tool`&&e.hitlResume.toolContext&&t&&!At(t))}async function fy(e){let t=e.params.hitlResume,n=t?.toolContext;if(!t||!n)throw Error(`before-tool HITL resume requires toolContext`);if(!(t.resolution.action===`submit`&&(t.resolution.values?.selectedChoiceIds?.includes(`approve`)??!1))){let t=`HITL approval denied; tool execution skipped.`;return await e.appendEntry({role:`assistant`,content:``,toolCalls:[{id:n.toolCallId,name:n.toolName,arguments:n.toolArgs}],timestamp:new Date().toISOString()}),await e.appendEntry({role:`tool_result`,toolCallId:n.toolCallId,toolName:n.toolName,content:t,isError:!0,timestamp:new Date().toISOString()}),{text:t,error:t}}let r=(Array.isArray(e.agent.state.tools)?e.agent.state.tools:[]).find(e=>e&&typeof e==`object`&&e.name===n.toolName&&typeof e.execute==`function`);if(!r)throw Error(`Cannot resume HITL tool call: tool not found: ${n.toolName}`);await e.appendEntry({role:`assistant`,content:``,toolCalls:[{id:n.toolCallId,name:n.toolName,arguments:n.toolArgs}],timestamp:new Date().toISOString()}),await e.eventDispatcher.dispatchProgress(e.sessionId,{type:`tool_start`,toolCallId:n.toolCallId,name:n.toolName,input:n.toolArgs});let i,a=!1;try{let t=yo();if(i=await bo(t,async()=>await r.execute(n.toolCallId,n.toolArgs,e.abortSignal)),t.signal)throw t.signal;a=!!i?.isError}catch(e){if(_o(e))throw e;a=!0,i={content:[{type:`text`,text:e instanceof Error?e.message:String(e)}],details:{}}}let o=py(i),s=i&&typeof i==`object`?i.details:void 0,c=s&&typeof s==`object`?s.toolResultRef:void 0;return await e.eventDispatcher.dispatchProgress(e.sessionId,{type:`tool_end`,toolCallId:n.toolCallId,name:n.toolName,input:n.toolArgs,output:o,isError:a}),await e.appendEntry({role:`tool_result`,toolCallId:n.toolCallId,toolName:n.toolName,content:o,isError:a,...c?{toolResultRef:c}:{},timestamp:new Date().toISOString()}),{text:o,error:a?o:void 0}}function py(e){if(typeof e==`string`)return e;if(!e||typeof e!=`object`)return JSON.stringify(e);let t=e.content;return Array.isArray(t)?t.filter(e=>e&&typeof e==`object`&&e.type===`text`).map(e=>e.text??``).join(``):JSON.stringify(e)}const my=2e4,hy=15e4,gy=[`AGENTS.md`,`SOUL.md`,`TOOLS.md`,`IDENTITY.md`,`USER.md`,`MEMORY.md`,`BOOTSTRAP.md`];function _y(e){return J.join(e,`.aimax`)}async function vy(e){let t=_y(e),n=[];for(let e of gy){let r=J.join(t,e);try{let t=await q.readFile(r,`utf-8`);n.push({name:e,path:r,content:t,missing:!1}),e===`BOOTSTRAP.md`&&await q.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 yy(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(`
|
|
190
190
|
`),s].join(`
|
|
191
191
|
`),truncated:!0,originalLength:r.length}}function by(e,t){return t<=0?``:e.length<=t?e:t<=1?e.slice(0,t):`${e.slice(0,t-1)}…`}function xy(e,t){let n=t?.maxChars??my,r=Math.max(1,t?.totalMaxChars??Math.max(n,hy)),i=[];for(let a of e){if(r<=0)break;if(a.missing){let e=by(`[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}=yy(a.content??``,a.name,e),l=by(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}const Sy=`You are a personal assistant running inside AiMax.`;async function Cy(e){try{return{presetSystemPrompt:zt(await q.readFile(e,`utf-8`)).content.trim()||Sy}}catch(e){if(e.code===`ENOENT`)return{presetSystemPrompt:Sy};throw e}}async function wy(){return Cy(`/aimax_pvc/system_prompt.md`)}async function Ty(e){let{runParams:t,sessionId:n,pluginContext:r,eventDispatcher:i}=e,a=await vy(t.dataDir),o=[],s=xy(a,{warn:e=>o.push(e)}),c=await wy();await i.dispatchDiagnostic(n,{level:o.length>0?`warn`:`info`,scope:`runner`,phase:`bootstrap_loaded`,message:`bootstrap context loaded`,details:{bootstrapFileCount:a.length,contextFileCount:s.length,warningCount:o.length}}),K.info(`bootstrap context loaded`,{sessionId:n,bootstrapFileCount:a.length,contextFileCount:s.length,warningCount:o.length});let l=t.skillsLoadPaths??[],u=await Mf(t.dataDir,r.pluginSkillDirs,l),d=await va({dataDir:t.dataDir,projectDir:t.projectDir,systemAgentsDir:t.systemAgentsDir,agentPolicy:t.agentPolicy}),f=d.stats(),p=t.agentPolicy?.activeAgent??d.findPublic(t.agentPolicy?.requestedAgentName);if(t.agentPolicy?.requestedAgentName&&!p)throw Error(`Unknown custom agent: ${t.agentPolicy.requestedAgentName}`);let m={...d,...p?{activeAgent:p}:{},...t.agentPolicy?.requestedAgentName?{requestedAgentName:t.agentPolicy.requestedAgentName}:{}},h={...t,agentPolicy:m};return await i.dispatchDiagnostic(n,{level:`info`,scope:`skill`,phase:`skills_loaded`,message:`skills loaded`,details:{skillCount:u.length,pluginSkillDirCount:r.pluginSkillDirs.length,skillsLoadPathCount:l.length,skills:u.map(e=>({name:e.name,description:e.description,location:e.location}))}}),K.info(`skills loaded`,{sessionId:n,skillCount:u.length,pluginSkillDirCount:r.pluginSkillDirs.length,skillsLoadPathCount:l.length}),await i.dispatchDiagnostic(n,{level:`info`,scope:`runner`,phase:`agents_loaded`,message:`custom agents loaded`,details:{agentCount:f.public,allAgentCount:f.total,internalAgentCount:f.internal,activeAgent:m.activeAgent?.name,agents:d.availableAgents.map(e=>({name:e.name,description:e.description,source:e.source,sourcePath:e.sourcePath}))}}),K.info(`custom agents loaded`,{sessionId:n,agentCount:f.public,allAgentCount:f.total,internalAgentCount:f.internal,activeAgent:m.activeAgent?.name,requestedAgentName:m.requestedAgentName}),{contextFiles:s,bootstrapWarnings:o,skills:u,autoSkillCategories:await Ey({dataDir:t.dataDir,sessionId:n,eventDispatcher:i,enabled:t.autoSkills?.load?.enabled===!0}),runParamsWithAgentPolicy:h,skillsLoadPaths:l,presetSystemPrompt:c.presetSystemPrompt}}async function Ey(e){if(!e.enabled)return[];try{let t=await new Gi({dataDir:e.dataDir}).autoSkillCategories();return t.length===0?[]:(await e.eventDispatcher.dispatchDiagnostic(e.sessionId,{level:`info`,scope:`skill`,phase:`auto_skills_loaded`,message:`auto-skill categories loaded`,details:{categoryCount:t.length,categories:t.map(e=>({path:e.path,description:e.description}))}}),t)}catch(t){return await e.eventDispatcher.dispatchDiagnostic(e.sessionId,{level:`warn`,scope:`skill`,phase:`auto_skills_load_failed`,message:`auto-skill categories failed to load`,details:{error:t instanceof Error?t.message:String(t)}}),[]}}var Dy=class{#e=0;#t=0;add(e,t){this.#e+=e,this.#t+=t}snapshot(){return{input:this.#e,output:this.#t,total:this.#e+this.#t}}};const Oy={Inferred:1,Child:2,Own:3};var ky=class{records=[];indices=new Map;urlWhitelist;constructor(e={}){let t=jy(e.urlWhitelist);this.urlWhitelist=t.length>0?new Set(t):void 0}addOwn(e){this.add(e,Oy.Own)}addInferred(e){this.add(e,Oy.Inferred)}addChild(e){e&&e.length>0&&this.add(e,Oy.Child)}dump(){return this.records.map(e=>e.record)}add(e,t){for(let n of e){if(!this.shouldCollect(n))continue;let e=Ay(n),r=this.indices.get(e);if(r!==void 0){let e=this.records[r];e&&t>e.priority&&(this.records[r]={record:n,priority:t});continue}this.indices.set(e,this.records.length),this.records.push({record:n,priority:t})}}shouldCollect(e){if(e.kind!==`url`||!this.urlWhitelist)return!0;let t=My(e.url);return t?this.urlWhitelist.has(t):!1}};function Ay(e){return e.kind===`file`?`file:${e.file}`:`url:${e.url}`}function jy(e){return e?e.map(e=>e.trim().toLowerCase()).filter(Boolean):[]}function My(e){try{return new URL(e).hostname.trim().toLowerCase()||null}catch{return null}}const Ny=`crons`;function Py(e){return`messages`in e?{inputMode:`messages`,messagesCount:e.messages.length}:{inputMode:`text`,messageLength:e.message.length,messagePreview:ie(e.message)}}async function Fy(e){let t,n=0,r=0,i;if(e.runtimeBridge.hasPendingMessages()){let a=e.runtimeBridge.drainMessages();for(let o of a){let a=await Uh({agent:e.agent,message:o,continueFromHistory:!1,sessionId:e.sessionId,channel:e.channel,modelId:e.resolvedModelId,historyMessages:e.runtime.historyMessages,eventDispatcher:e.eventDispatcher,hooks:e.hookRegistry,hookCtx:e.hookContext,abortSignal:e.abortSignal,retry:e.retry,onTurnRecordProduced:async(t,n)=>{t&&await e.appendEntry(t);for(let t of n)await e.appendEntry(t)}});n+=a.inputTokens,r+=a.outputTokens,a.text&&(t=a.text),a.error&&(i=a.error);let s=await Yv({agent:e.agent,registry:e.registry,sessionId:e.sessionId,resolvedModelId:e.resolvedModelId,eventDispatcher:e.eventDispatcher,hookRegistry:e.hookRegistry,hookContext:e.hookContext,abortSignal:e.abortSignal,appendEntry:e.appendEntry});n+=s.inputTokens,r+=s.outputTokens,s.text&&(t=s.text),s.error&&!i&&(i=s.error)}}let a=e.runtimeBridge.drainCompactRequest();if(a)try{let t=await jv({entries:e.runParams.channel===`CRON`?[]:await I(e.runParams.dataDir,e.sessionId,$(e.runParams)),contextWindowTokens:e.runParams.llm.contextWindow??2e5,llm:{apiFormat:e.runParams.llm.apiFormat,baseUrl:e.runParams.llm.baseUrl,apiKey:e.runParams.llm.apiKey,model:e.runParams.llm.model},instructions:a.customInstructions,signal:e.abortSignal,hooks:e.hookRegistry,hookCtx:e.hookContext});t.status===`compacted`&&await e.appendEntry(t.entry),a.onComplete?.(t)}catch(e){a.onError?.(e instanceof Error?e:Error(String(e)))}return{lastResponseText:t,inputTokens:n,outputTokens:r,error:i}}async function Iy(e,t){P_();let n=Date.now(),i=new Na(e),a=new ky({urlWhitelist:e.artifactsUrlWhitelist}),o=Vv(e);K.info(`agent invocation prepared`,{requestedSessionId:o.requestedSessionId,previousSessionId:o.previousSessionId,inputMode:o.inputMode,hasSlashCommand:!!o.slashCommandSource,resetAction:o.resetCommand?.action,resetShortCircuit:o.resetShortCircuit,transcriptLength:o.transcriptMessage.length,messageForRunLength:o.messageForRun?.length,depth:e.subagentContext?.depth,parentSessionId:e.subagentContext?.parentSessionId});let s=o.transcriptMessage,c=!1,l=o.previousSessionId,u=await $v({runParams:e,requestedSessionId:o.requestedSessionId,eventDispatcher:i}),d=u.sessionId;de(e.dataDir,{messageId:e.messageId,sessionId:d,sessionStoreName:e.sessionStoreName,sessionDir:r(e.dataDir,d,$(e))});let f=u.isNewSession,m=u.workspaceDir,h=u.hookContext,g=u.hookRegistry,_=u.pluginContext,v=u.runContext,y=u.runtimeBridge,b=0,x=!1,S=()=>{x||(x=!0,y.dispose())},C=(await I(e.dataDir,d,$(e))).length;if(K.info(`agent run started`,{sessionId:d,requestedSessionId:o.requestedSessionId,previousSessionId:l,channel:e.channel,messageId:e.messageId,sessionStoreName:e.sessionStoreName,isNewSession:f,hasPlugins:!!e.plugins,hasMemory:!!e.memory,depth:e.subagentContext?.depth,parentSessionId:e.subagentContext?.parentSessionId}),await i.dispatchDiagnostic(d,{level:`info`,scope:`runner`,phase:`run_started`,message:`agent run started`,details:{channel:e.channel,isNewSession:f,hasMessageId:!!e.messageId,hasPlugins:!!e.plugins,hasMemory:!!e.memory}}),K.info(f?`session created`:`session resumed`,{sessionId:d,requestedSessionId:o.requestedSessionId,previousSessionId:l,workspaceDir:m}),await i.dispatchDiagnostic(d,{level:`info`,scope:`session`,phase:f?`session_created`:`session_resumed`,message:f?`session created`:`session resumed`,details:{requestedSessionId:o.requestedSessionId,previousSessionId:l,workspaceDir:m}}),f&&await p(e.dataDir,Yp({sessionId:d,title:V_(s),channel:e.channel}),$(e)),e.pendingGoal){let t=await G(e.dataDir,d,{objective:e.pendingGoal.objective,status:`active`,tokenBudget:e.pendingGoal.tokenBudget,tokensUsed:0,timeUsedSeconds:0},{storeName:e.sessionStoreName,eventSource:`runner`});await $n(e.dataDir,d,{goalId:t.goalId,objective:e.pendingGoal.objective},{storeName:e.sessionStoreName})}o.resetCommand&&!e.hitlResume&&!e.uiToolResume&&(c=await v.persistInitialUserEntry(s));let w=new AbortController;e.abortSignal?.aborted?w.abort():e.abortSignal?.addEventListener(`abort`,()=>w.abort()),h.signal=w.signal,await u.start({resetCommand:o.resetCommand,previousSessionId:l,resetMessage:o.slashCommandSource,startMessage:typeof o.promptInput==`string`?o.promptInput:s});let T=await Ty({runParams:e,sessionId:d,pluginContext:_,eventDispatcher:i}),E=e=>v.appendTranscriptEntry(e),D=await Uv({invocation:o,skills:T.skills,sessionId:d,isNewSession:f,initialUserEntryPersisted:c,runParams:e,runContext:v,hookRegistry:g,hookContext:h,startTime:n,eventDispatcher:i,extensionHost:_.extensionHost});if(D.kind===`completed`)return K.info(`agent run short-circuited`,{sessionId:d,durationMs:Date.now()-n,hasError:!!D.result.error,paused:!!D.result.paused,uiToolPending:!!D.result.uiToolPending,textLength:D.result.text.length}),S(),D.result;let O=D.effectivePrompt;s=D.transcriptMessage;let k=typeof O==`string`?O:s;await i.dispatchDiagnostic(d,{level:`info`,scope:`runner`,phase:`invocation_resolved`,message:`invocation resolved`,details:{promptType:typeof O==`string`?`string`:`messages`,transcriptLength:s.length}}),K.info(`invocation resolved`,{sessionId:d,promptType:typeof O==`string`?`string`:`messages`,transcriptLength:s.length});let A=await Dh({session:{runParams:T.runParamsWithAgentPolicy,sessionId:d,hookRegistry:g,hookContext:h,runContext:v,eventDispatcher:i},runtimeInputs:{contextFiles:T.contextFiles,bootstrapWarnings:T.bootstrapWarnings,skills:T.skills,autoSkillCategories:T.autoSkillCategories,effectivePromptText:k,pluginTools:_.pluginTools,pluginSkillDirs:_.pluginSkillDirs,skillsLoadPaths:T.skillsLoadPaths,presetSystemPrompt:T.presetSystemPrompt},dependencies:{registry:t,spawnFn:e=>Iy(e,new Ap),createModel:da,abortSignal:w.signal}}),j=A.agent,M=A.resolvedModelId;y.bindAgent(j),await i.dispatchDiagnostic(d,{level:`info`,scope:`runner`,phase:`runtime_created`,message:`agent runtime created`,details:{modelId:M,historyMessageCount:A.historyMessages.length,pluginToolCount:_.pluginTools.length}}),K.info(`agent runtime created`,{sessionId:d,modelId:M,historyMessageCount:A.historyMessages.length,pluginToolCount:_.pluginTools.length});let N=Hy(e.timeoutMs),P=!1,F=N===void 0?void 0:setTimeout(()=>{P=!0,w.abort(),j.abort(),i.dispatchDiagnostic(d,{level:`warn`,scope:`runner`,phase:`run_timeout`,message:`agent run timed out`,details:{timeoutMs:N}}),K.warn(`agent run timed out`,{sessionId:d,timeoutMs:N})},N);w.signal.addEventListener(`abort`,()=>j.abort());let L=new Dy,R=``,z,B=!1,V=new en;await ly(e.dataDir,d,V,{storeName:e.sessionStoreName}),w.signal;try{if(dy(e)){let t=await fy({params:e,agent:j,sessionId:d,eventDispatcher:i,appendEntry:E,abortSignal:w.signal});return R=t.text,S(),Z_({sessionId:d,isNewSession:f,transcriptMessage:s,runParams:e,runContext:v,hookRegistry:g,hookContext:h,startTime:n,eventDispatcher:i,artifacts:a.dump(),text:R,usage:{input:0,output:0,total:0},error:t.error})}if(!e.hitlResume&&!e.uiToolResume){let t=await v.persistInitialUserEntry(s);B=t,c=t||c;try{await Vn(e.dataDir,d,{storeName:e.sessionStoreName},()=>Fr(e.dataDir,d,{storeName:e.sessionStoreName}))}catch(e){if(!(e instanceof Rn))throw e}}await i.dispatchDiagnostic(d,{level:`info`,scope:`runner`,phase:`first_turn_started`,message:`first agent turn started`});let r=await W(e.dataDir,d,{storeName:e.sessionStoreName}),o=!1,l=null;if(r?.status===`active`)try{l=await kr(e.dataDir,d,{storeName:e.sessionStoreName})}catch(e){if(e instanceof Rn)o=!0;else throw e}let u=!!(o||l&&Br(l)),p=Ur({hookRegistry:g,isGateActive:()=>u}),m=await Lr(e.dataDir,d,O,{storeName:e.sessionStoreName}),_;if(o){let e=[`<goal_context>`,`Goal workflow state (goal/state.json) is corrupt and unreadable.`,`Do not submit goal complete or blocked until the workflow state is repaired by the runtime.`,`</goal_context>`,``].join(`
|
|
192
192
|
`);_={prompt:typeof m.prompt==`string`?e+m.prompt:[{type:`text`,text:e},...m.prompt],hadFirstGoalWorkflowSteering:!0}}else _=await Ir(e.dataDir,d,m.prompt,{storeName:e.sessionStoreName});K.info(`first agent turn started`,{sessionId:d,modelId:M});let x=await Uh({agent:j,message:_.prompt,continueFromHistory:!!e.uiToolResume,sessionId:d,channel:e.channel,modelId:M,historyMessages:A.historyMessages,eventDispatcher:i,hooks:g,hookCtx:h,abortSignal:w.signal,retry:e.llmRetry,artifactAccumulator:a,onTurnRecordProduced:async(e,t)=>{e&&await E(e);for(let e of t)await E(e)}});p(),R=x.text,L.add(x.inputTokens,x.outputTokens),x.error&&(z=x.error),m.hadObjectiveUpdatedSteering&&!x.error&&await Rr(e.dataDir,d,{storeName:e.sessionStoreName}),await i.dispatchDiagnostic(d,{level:x.error?`warn`:`info`,scope:`runner`,phase:`first_turn_completed`,message:`first agent turn completed`,details:{hasError:!!x.error,error:x.error,inputTokens:x.inputTokens,outputTokens:x.outputTokens}});let C={sessionId:d,hasError:!!x.error,error:x.error,inputTokens:x.inputTokens,outputTokens:x.outputTokens};x.error?K.warn(`first agent turn completed with error`,C):K.info(`first agent turn completed`,C);let T=await uy(e.dataDir,d,V,L.snapshot(),i,{storeName:e.sessionStoreName,eventSource:`runner`});T.budgetLimited&&await i.dispatchDiagnostic(d,{level:`info`,scope:`session`,phase:`goal_budget_limited`,message:`goal token budget exhausted`}),await i.dispatchDiagnostic(d,{level:`info`,scope:`runner`,phase:`announce_loop_started`,message:`announce loop started`}),K.info(`announce loop started`,{sessionId:d});let D=await Yv({agent:j,registry:t,sessionId:d,resolvedModelId:M,eventDispatcher:i,hookRegistry:g,hookContext:h,abortSignal:w.signal,retry:e.llmRetry,artifactAccumulator:a,appendEntry:E});if(D.text&&(R=D.text),L.add(D.inputTokens,D.outputTokens),D.error&&!z&&(z=D.error),await i.dispatchDiagnostic(d,{level:D.error?`warn`:`info`,scope:`runner`,phase:`announce_loop_completed`,message:`announce loop completed`,details:{hasError:!!D.error,error:D.error,inputTokens:D.inputTokens,outputTokens:D.outputTokens}}),T=await uy(e.dataDir,d,V,L.snapshot(),i,{storeName:e.sessionStoreName,eventSource:`runner`}),T.budgetLimited&&await i.dispatchDiagnostic(d,{level:`info`,scope:`session`,phase:`goal_budget_limited`,message:`goal token budget exhausted`}),Ar()){let n=new Or;n.reset(),x.error&&(n.lastTurnHadOutput=!1);let r=!0,o=Dt;for(;r&&n.continuationCount<o&&!w.signal.aborted;)if(r=await Nr({agent:j,dataDir:e.dataDir,sessionId:d,sessionStoreName:e.sessionStoreName,state:n,accounting:V,abortSignal:w.signal,executeTurn:async t=>{let n=await Uh({agent:j,message:t,continueFromHistory:!1,sessionId:d,channel:e.channel,modelId:M,historyMessages:A.historyMessages,eventDispatcher:i,hooks:g,hookCtx:h,abortSignal:w.signal,artifactAccumulator:a,onTurnRecordProduced:async(e,t)=>{await Pr(E,e,t)}});L.add(n.inputTokens,n.outputTokens),R=n.text||R,n.error&&!z&&(z=n.error);let r=n.turnRecords.reduce((e,t)=>e+t.toolResults.length,0);return{text:n.text,inputTokens:n.inputTokens,outputTokens:n.outputTokens,error:n.error,toolResultCount:r}},flushAccountingAfterTurn:async()=>{(await uy(e.dataDir,d,V,L.snapshot(),i,{storeName:e.sessionStoreName,eventSource:`runner`})).budgetLimited&&await i.dispatchDiagnostic(d,{level:`info`,scope:`session`,phase:`goal_budget_limited`,message:`goal token budget exhausted`})}}),r){let e=await Yv({agent:j,registry:t,sessionId:d,resolvedModelId:M,eventDispatcher:i,hookRegistry:g,hookContext:h,abortSignal:w.signal,artifactAccumulator:a,appendEntry:E});L.add(e.inputTokens,e.outputTokens),e.text&&(R=e.text),e.error&&!z&&(z=e.error)}}do{if(w.signal.aborted)break;if(b++,b>8){i.dispatchDiagnostic(d,{level:`warn`,scope:`runner`,phase:`bridge_cycle_limit`,message:`SessionRuntimeBridge exceeded max cycles (8)`}).catch(()=>{});break}await U_({sessionId:d,result:{sessionId:d,text:R??``,usage:L.snapshot(),durationMs:Date.now()-n,error:z},runParams:e,hookRegistry:g,hookContext:h,eventDispatcher:i});let r=await Fy({runtimeBridge:y,agent:A.agent,runtime:A,sessionId:d,channel:e.channel,resolvedModelId:M,eventDispatcher:i,hookRegistry:g,hookContext:h,abortSignal:w.signal,retry:e.llmRetry,appendEntry:E,runParams:e,registry:t});L.add(r.inputTokens,r.outputTokens),r.lastResponseText&&(R=r.lastResponseText),r.error&&!z&&(z=r.error)}while(!w.signal.aborted&&(y.hasPendingMessages()||y.hasPendingCompact()));S();let k={sessionId:d,hasError:!!D.error,error:D.error,inputTokens:D.inputTokens,outputTokens:D.outputTokens};D.error?K.warn(`announce loop completed with error`,k):K.info(`announce loop completed`,k)}catch(t){if(_o(t)){let r=t,o=e.subagentContext?.parentSessionId??d,c=o===r.request.sessionId?r.request:{...r.request,sessionId:o};await it(e.dataDir,o,c,r.checkpoint,{agentId:e.subagentContext?`subagent-depth-${e.subagentContext.depth}`:void 0,channel:e.channel,parentSessionId:e.subagentContext?.parentSessionId,depth:e.subagentContext?.depth},r.toolContext),await i.dispatchProgress(o,{type:`hitl_requested`,request:c}),await i.dispatchDiagnostic(d,{level:`info`,scope:`runner`,phase:`hitl_paused`,message:`agent paused for HITL: ${r.request.kind} — ${r.request.title}`,details:{requestId:c.requestId,kind:c.kind,checkpointPhase:r.checkpoint.phase,bubbledToParent:!!e.subagentContext?.parentSessionId}}),K.info(`agent paused for HITL`,{sessionId:d,requestId:c.requestId,kind:c.kind,checkpointPhase:r.checkpoint.phase,bubbledToParent:!!e.subagentContext?.parentSessionId});let l={...L.snapshot()};return await Ly({runtime:A,resolvedModelId:M,usage:l,currentUserEntryCoveredByUsage:B}),S(),Z_({sessionId:d,isNewSession:f,transcriptMessage:s,runParams:e,runContext:v,hookRegistry:g,hookContext:h,startTime:n,eventDispatcher:i,artifacts:a.dump(),text:R||`[HITL paused] ${r.request.title}: ${r.request.prompt}`,usage:l,error:void 0,paused:{requestId:c.requestId,kind:c.kind,title:c.title}})}if(Ie(t)){let r=t,o=r.request.outputSchema.properties??{};await oy(e.dataDir,d,r.request,$(e)),await i.dispatchProgress(d,{type:`ui_tool_request`,request:r.request}),await i.dispatchDiagnostic(d,{level:`info`,scope:`tool`,phase:`ui_tool_paused`,message:`agent paused for UI tool input: ${r.request.toolName}`,details:{requestId:r.request.requestId,toolName:r.request.toolName,toolCallId:r.request.toolCallId,outputSchemaTitle:r.request.outputSchema.title,propertyCount:Object.keys(o).length}}),K.info(`agent paused for UI tool input`,{sessionId:d,requestId:r.request.requestId,toolName:r.request.toolName,toolCallId:r.request.toolCallId,outputSchemaTitle:r.request.outputSchema.title,propertyCount:Object.keys(o).length});let c={...L.snapshot()};return await Ly({runtime:A,resolvedModelId:M,usage:c,currentUserEntryCoveredByUsage:B}),S(),Z_({sessionId:d,isNewSession:f,transcriptMessage:s,runParams:e,runContext:v,hookRegistry:g,hookContext:h,startTime:n,eventDispatcher:i,artifacts:a.dump(),text:R||``,usage:c,error:void 0,uiToolPending:{requestId:r.request.requestId,toolName:r.request.toolName,toolCallId:r.request.toolCallId,outputSchema:r.request.outputSchema,extra:r.request.extra}})}if(P&&Uy(t))z=`Run timed out after ${N}ms`;else throw await ny({dispatcher:i,sessionId:d,scope:`runner`,phase:`run_failed`,message:`agent run failed`,error:t,details:{channel:e.channel,isNewSession:f}}),K.error(`agent run failed`,{sessionId:d,channel:e.channel,isNewSession:f,error:t instanceof Error?t.message:String(t)}),t}finally{F!==void 0&&clearTimeout(F);try{await uy(e.dataDir,d,V,L.snapshot(),i,{storeName:e.sessionStoreName,eventSource:`runner`})}catch{}V.clearActiveGoal(),lh(d);try{A.processRegistry.disposeAll()}catch{}try{ze.disposeForDataDir(e.dataDir)}catch{}v.stop(),S()}let H=L.snapshot();P&&(z=`Run timed out after ${N}ms`),await i.dispatchDiagnostic(d,{level:z?`warn`:`info`,scope:`runner`,phase:`run_completed`,message:`agent run completed`,details:{durationMs:Date.now()-n,inputTokens:H.input,outputTokens:H.output,totalTokens:H.total,hasError:!!z,error:z}});let U={sessionId:d,durationMs:Date.now()-n,inputTokens:H.input,outputTokens:H.output,totalTokens:H.total,hasError:!!z,error:z};return z?K.warn(`agent run completed with error`,U):K.info(`agent run completed`,U),await Ly({runtime:A,resolvedModelId:M,usage:H,currentUserEntryCoveredByUsage:B}),await m_({sessionId:d,runParams:T.runParamsWithAgentPolicy,eventDispatcher:i,transcriptStartIndex:C,result:{text:R,usage:H,durationMs:Date.now()-n,error:z}}),Z_({sessionId:d,isNewSession:f,transcriptMessage:s,runParams:e,runContext:v,hookRegistry:g,hookContext:h,startTime:n,eventDispatcher:i,artifacts:a.dump(),transcriptStartIndex:C,text:R,usage:H,error:z,sessionEndOnly:b>0})}async function Ly(e){let{runtime:t,resolvedModelId:n,usage:r,currentUserEntryCoveredByUsage:i}=e;r.input<=0&&r.total<=0||await t.contextManager.recordModelUsage({model:n,inputTokens:r.input,outputTokens:r.output,totalTokens:r.total,coveredTranscriptEntryCount:t.usageBaselineTranscriptEntryCount+(i?1:0)})}async function Ry(e){let t=Date.now(),i=new Na(e),a=Vv(e),o=a.transcriptMessage.trim()||`CRON task`,c=Ny;K.info(`cron run started`,{requestedSessionId:a.requestedSessionId,channel:e.channel,sessionStoreName:c,...Py(e)});let l=a.requestedSessionId,d=!l;l?(await n(e.dataDir,l,{storeName:c})||(d=!0),await v(e.dataDir,l,{storeName:c})):l=await T(e.dataDir,e.channel,{storeName:c}),d&&await p(e.dataDir,Yp({sessionId:l,title:V_(o),channel:e.channel}),{storeName:c});let f=r(e.dataDir,l,{storeName:c});de(e.dataDir,{messageId:e.messageId,sessionId:l,sessionStoreName:c,sessionDir:f});let m={parentSessionId:l,parentDir:f},g=await T(e.dataDir,e.channel,{storeName:Ny,subagent:m});await i.dispatchProgress(l,{type:`subagent_spawn`,childSessionId:g,task:o}),K.info(`cron child subagent spawned`,{parentSessionId:l,childSessionId:g,taskLength:o.length,taskPreview:ie(o)});let y={...e,sessionId:g,sessionStoreName:Ny,sessionPathScope:{subagent:m},subagentContext:{depth:1,parentSessionId:l}},b,x=`done`;try{b=await Iy(y,new Ap),b.error&&(x=`error`)}catch(n){let r=n instanceof Error?n.message:String(n);b={sessionId:g,text:``,usage:{input:0,output:0,total:0},durationMs:Date.now()-t,error:r,context:{snapshotPath:_(e.dataDir,g,{storeName:Ny,subagent:m}),toolResultsDir:s(e.dataDir,g,{storeName:Ny,subagent:m})}},x=`error`,K.error(`cron child run failed`,{parentSessionId:l,childSessionId:g,error:r})}de(e.dataDir,{messageId:e.messageId,sessionId:l,sessionStoreName:c,sessionDir:f}),await i.dispatchProgress(l,{type:`subagent_complete`,childSessionId:g,task:o,status:x}),K.info(`cron child subagent completed`,{parentSessionId:l,childSessionId:g,status:x,durationMs:Date.now()-t,hasError:!!b.error});let C=Pp({task:o,status:x,result:b.text,error:b.error}),w=new Date().toISOString();await h(e.dataDir,l,{role:`assistant`,content:C,timestamp:w,source:`cron`},{storeName:c});let E={task:o,status:x,content:C,childSessionId:g,createdAt:w};return await S(e.dataDir,l,E,{storeName:c}),await F(e.dataDir,l,e=>zy(e,8),{storeName:c}),await u(e.dataDir,l,{},{storeName:c}),{...b,sessionId:l,context:{snapshotPath:_(e.dataDir,l,{storeName:c}),toolResultsDir:s(e.dataDir,l,{storeName:c})}}}function zy(e,t){if(t<=0)return e.filter(e=>!By(e));let n=e.reduce((e,t,n)=>(By(t)&&e.push(n),e),[]);if(n.length<=t)return e;let r=new Set(n.slice(-t));return e.filter((e,t)=>!By(e)||r.has(t))}function By(e){return`source`in e&&e.source===`cron`}async function Vy(e,t){let n=async()=>{if(K.info(`agent request received`,{dataDir:e.dataDir,projectDir:e.projectDir,sessionId:e.sessionId,messageId:e.messageId,channel:e.channel,sessionStoreName:e.sessionStoreName,hasHitlResume:!!e.hitlResume,hasUiToolResume:!!e.uiToolResume,isSubagent:!!e.subagentContext,depth:e.subagentContext?.depth,parentSessionId:e.subagentContext?.parentSessionId,hasPlugins:!!e.plugins,hasMemory:!!e.memory,...Py(e)}),e.channel===`CRON`&&!e.subagentContext)return Ry(e);let n=t??new Ap;try{return await Iy(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:ty(t)}),K.error(`agent run crashed before completion`,{sessionId:e.sessionId,channel:e.channel,messageId:e.messageId,error:t instanceof Error?t.message:String(t)}),t}};try{return await(e.onLog?we(e.onLog,n):n())}finally{e.onLog||await Te()}}function Hy(e){return typeof e==`number`&&Number.isFinite(e)&&e>0?e:void 0}function Uy(e){if(e instanceof Error)return e.name===`AbortError`||e.message===`aborted`;if(!e||typeof e!=`object`)return!1;let t=e;return t.name===`AbortError`||t.message===`aborted`||t.code===`aborted`}const Wy={"AGENTS.md":`---
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{i as e,t}from"./provider-registry-DPbmbWqS.js";import{n}from"./loader-CkdBGDtW.js";import{validateUiToolResult as r}from"@gencode/shared";import i from"node:path";import a from"node:os";import{AsyncLocalStorage as o}from"node:async_hooks";import s from"node:fs";import c from"log4js";import{Type as l}from"@earendil-works/pi-ai";import u from"ajv";import{createJiti as d}from"jiti";function f(e){return e??`openai-completions`}function p(e,t,n){let r={"Client-Code":`AIMax`,"X-Session-Id":e};return t&&(r[`X-Message-Id`]=t),n&&(r[`X-Channel`]=n),r}function m(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}}const h={apiFormat:`anthropic-messages`,createModel:g,buildRequest:v,normalizeResponse:y};function g(e,t,n,r){return{id:e.model,name:e.model,api:`anthropic-messages`,provider:`anthropic`,baseUrl:_(e.baseUrl),reasoning:!1,input:[`text`,`image`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:e.contextWindow??2e5,maxTokens:e.maxTokens??32768,headers:p(t,n,r)}}function _(e){return e.replace(/\/+$/,``).replace(/\/v1$/,``)}function v(e,t,n,r){let i=e.baseUrl.replace(/\/+$/,``),a=[],o=[];for(let e of n){if(e.role===`system`){e.content.trim()&&o.push(e.content);continue}a.push({role:e.role,content:e.content})}let s={model:t,messages:a.length>0?a:[{role:`user`,content:``}],max_tokens:r.maxTokens??2048,stream:!1};return o.length>0&&(s.system=o.join(`
|
|
2
|
+
|
|
3
|
+
`)),typeof r.temperature==`number`&&(s.temperature=r.temperature),{url:i.endsWith(`/v1`)?`${i}/messages`:`${i}/v1/messages`,headers:{"content-type":`application/json`,"x-api-key":e.apiKey,"anthropic-version":`2023-06-01`,"Client-Code":`AIMax`},body:s}}function y(e){let t=e,n=t.content?.filter(e=>e.type===`text`&&typeof e.text==`string`).map(e=>e.text).join(``)??``,r=(t.usage?.input_tokens??0)+(t.usage?.cache_read_input_tokens??0)+(t.usage?.cache_creation_input_tokens??0),i=t.usage?.output_tokens??0;return{text:n,usage:{input:r,output:i,total:r+i},raw:e}}const ee={apiFormat:`openai-completions`,createModel:te,buildRequest:ne,normalizeResponse:re};function te(e,t,n,r){let i=e.baseUrl.includes(`deepseek.com`),a=e.thinking;return{id:e.model,name:e.model,api:`openai-completions`,provider:i?`deepseek`:`openai`,baseUrl:e.baseUrl,reasoning:i||!!a,...i&&{thinkingLevelMap:{high:`high`,xhigh:`max`}},...a&&!i&&{thinkingLevelMap:{high:`high`,xhigh:`high`}},input:[`text`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:e.contextWindow??2e5,maxTokens:e.maxTokens??32768,headers:p(t,n,r),compat:{supportsStore:!1,supportsDeveloperRole:!1,supportsReasoningEffort:!!(a&&!i),supportsUsageInStreaming:!0,...a&&!i&&{thinkingFormat:`deepseek`}}}}function ne(e,t,n,r){let i={model:t,messages:n,stream:!1};return typeof r.temperature==`number`&&(i.temperature=r.temperature),typeof r.maxTokens==`number`&&(i.max_tokens=r.maxTokens),{url:`${e.baseUrl.replace(/\/+$/,``)}/chat/completions`,headers:{"content-type":`application/json`,authorization:`Bearer ${e.apiKey}`,"Client-Code":`AIMax`},body:i}}function re(e){let t=e;return{text:t.choices?.[0]?.message?.content??t.choices?.[0]?.text??``,usage:m(t.usage),raw:e}}const ie={"openai-completions":ee,"anthropic-messages":h};function ae(e){return ie[e]}const oe=new o;async function se(e,t){return await oe.run(e,t)}function ce(e){return{async emit(t){let n=oe.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 le={before_prompt_build:`before_agent_start`,after_tool_call:`tool_result (for mutable results) or before_tool_call (for blocking)`},ue=new Set([`before_model_resolve`,`before_prompt_build`,`before_agent_start`,`before_tool_call`,`tool_result`,`before_compaction`,`context`,`before_provider_request`,`dream_gate`,`input`,`resources_discover`]);var de=class extends Error{constructor(e,t,n){super(`Plugin hook "${e}" timed out after ${n}ms (plugin: ${t})`),this.hookName=e,this.pluginId=t,this.timeoutMs=n,this.name=`PluginHookTimeoutError`}},fe=class{hooks=new Map;deprecatedWarned=new Set;blockingTimeoutMs;bestEffortTimeoutMs;constructor(e={}){this.blockingTimeoutMs=pe(e.blockingTimeoutMs,1e4),this.bestEffortTimeoutMs=pe(e.bestEffortTimeoutMs,3e3)}register(e){let t=le[e.hookName];t&&!this.deprecatedWarned.has(e.hookName)&&(this.deprecatedWarned.add(e.hookName),console.warn(`[PluginHookRegistry] Hook "${e.hookName}" is deprecated. Use "${t}" instead. (plugin: ${e.pluginId})`));let n=this.hooks.get(e.hookName)??[];n.push(e),n.sort((e,t)=>(e.priority??0)-(t.priority??0)),this.hooks.set(e.hookName,n)}async dispatch(e,t,n,r){return(await this.dispatchWithMetadata(e,t,n,r)).map(e=>e.result)}async dispatchWithMetadata(e,t,n,r){let i=this.hooks.get(e)??[],a=[],o=this.getDispatchPolicy(e);for(let s of i){let i=me(n),c=async()=>await s.handler(t,i.ctx);try{let t=await he(r?se({pluginId:s.pluginId,hookContext:i.ctx,eventDispatcher:r.eventDispatcher},c):c(),{hookName:e,pluginId:s.pluginId,timeoutMs:o.timeoutMs,abort:i.abort});i.clear(),a.push({pluginId:s.pluginId,source:s.source,result:t})}catch(t){if(i.clear(),o.mode===`blocking`)throw t;await ge({runtime:r,ctx:n,hookName:e,entry:s,policy:o,error:t})}}return a}getDispatchPolicy(e){return ue.has(e)?{mode:`blocking`,timeoutMs:this.blockingTimeoutMs}:{mode:`bestEffort`,timeoutMs:this.bestEffortTimeoutMs}}};function pe(e,t){return typeof e==`number`&&Number.isFinite(e)&&e>0?e:t}function me(e){let t=new AbortController,n;return e.signal&&(e.signal.aborted?t.abort():(n=()=>t.abort(),e.signal.addEventListener(`abort`,n,{once:!0}))),{ctx:{...e,signal:t.signal},abort:()=>t.abort(),clear:()=>{n&&e.signal&&e.signal.removeEventListener(`abort`,n)}}}async function he(e,t){let n;try{return await Promise.race([e,new Promise((e,r)=>{n=setTimeout(()=>{t.abort(),r(new de(t.hookName,t.pluginId,t.timeoutMs))},t.timeoutMs),n.unref?.()})])}finally{n&&clearTimeout(n)}}async function ge(e){if(!e.runtime||!e.ctx.sessionId)return;let t=e.error instanceof de;await e.runtime.eventDispatcher.dispatchProgress(e.ctx.sessionId,{type:`diagnostic`,level:`warn`,scope:`plugin`,phase:t?`hook_timeout`:`hook_failed`,message:t?`plugin hook timed out: ${e.hookName}`:`plugin hook failed: ${e.hookName}`,details:{hookName:e.hookName,pluginId:e.entry.pluginId,source:e.entry.source,mode:e.policy.mode,timeoutMs:e.policy.timeoutMs,error:e.error instanceof Error?e.error.message:String(e.error)}}).catch(()=>{})}function _e(e){let t=new Intl.DateTimeFormat(`en-CA`,{timeZone:`Asia/Shanghai`,year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hour12:!1}).formatToParts(e);return Object.fromEntries(t.map(e=>[e.type,e.value]))}function ve(e=new Date){let t=_e(e),n=String(e.getMilliseconds()).padStart(3,`0`);return`${t.year}-${t.month}-${t.day} ${t.hour}:${t.minute}:${t.second}.${n}`}let b=function(e){return e.INFO=`INFO`,e.WARN=`WARN`,e.ERROR=`ERROR`,e}({});const x=new o;function ye(e,t){return x.run({onLog:e},t)}let S=null,C=!1,w=[];function be(){return ve()}function xe(e){if(!e)return``;let t=Object.entries(e).filter(([,e])=>e!==void 0).map(([e,t])=>`${e}=${JSON.stringify(t)}`);return t.length>0?` ${t.join(` `)}`:``}function Se(e){return i.join(e,`.aimax`)}function Ce(e){let t=e?.trim();return t&&t.replace(/[^A-Za-z0-9_.-]/g,`_`)||`no-message-${process.pid}`}function we(e,t){let n=t?.sessionStoreName?.trim()||`sessions`,r=Ce(t?.messageId);return t?.sessionDir?{runLogId:r,logDir:i.join(t.sessionDir,`logs`,r)}:t?.sessionId?{runLogId:r,logDir:i.join(Se(e),n,t.sessionId,`logs`,r)}:{runLogId:r,logDir:i.join(Se(e),`logs`,r)}}function Te(e){return{appLogPath:i.join(e,`app.log`),errorLogPath:i.join(e,`errors.log`)}}function Ee(e){let{appLogPath:t,errorLogPath:n}=Te(e);c.configure({appenders:{appFile:{type:`file`,filename:t,maxLogSize:5*1024*1024,backups:3,compress:!0,keepFileExt:!0,layout:{type:`messagePassThrough`}},errorFile:{type:`file`,filename:n,maxLogSize:5*1024*1024,backups:3,compress:!0,keepFileExt:!0,layout:{type:`messagePassThrough`}},errorsOnly:{type:`logLevelFilter`,appender:`errorFile`,level:`error`,maxLevel:`fatal`}},categories:{default:{appenders:[`appFile`,`errorsOnly`],level:`info`}}})}function T(e,t,n){return`[${be()}] [${e}] ${t}${xe(n)}`}function De(e,t,n){try{process.stderr.write(`${T(e,t,n)}\n`)}catch{}}function E(e,t,n){let r=x.getStore();if(r){r.onLog({level:e,message:t,context:n,formatted:T(e,t,n),logDir:r.logDir});return}if(!S){w.push({level:e,message:t,context:n}),w.length>200&&(w=w.slice(-200)),De(e,t,n);return}C||=(Ee(S.logDir),!0);let i=T(e,t,n),a=c.getLogger();e===b.ERROR?a.error(i):e===b.WARN?a.warn(i):a.info(i)}function Oe(e,t){let{logDir:n,runLogId:r}=we(e,t),i=x.getStore();if(i){i.logDir=n;return}if(C&&S?.dataDir===e&&S.runLogId===r&&S.logDir===n)return;s.mkdirSync(n,{recursive:!0}),Ee(n),C=!0,S={dataDir:e,logDir:n,runLogId:r};let a=w;w=[];for(let e of a)E(e.level,e.message,e.context)}async function ke(){try{await Ae()}finally{C=!1}}function Ae(){return new Promise((e,t)=>{c.shutdown(n=>{if(n){t(n);return}e()})})}const D={info:(e,t)=>E(b.INFO,e,t),warn:(e,t)=>E(b.WARN,e,t),error:(e,t)=>E(b.ERROR,e,t)};function je(e,t){if(e===void 0)return;let n=e.replace(/\s+/g,` `).trim();return t===void 0||n.length<=t?n:`${n.slice(0,Math.max(0,t-3))}...`}var O=class extends Error{code;statusCode;statusText;providerMessage;providerCode;providerType;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.providerCode=e.providerCode,this.providerType=e.providerType,this.retryable=e.retryable}};function Me(e){return{async chat(t){let n=Pe(t),r=t.model??e.defaultModel;if(!r)throw Error(`LLM model is required`);await k(e.hooks,`llm_input`,{sessionId:e.hookCtx?.sessionId??`unknown`,model:r,prompt:Fe(n),historyMessages:n},e.hookCtx);let i=ae(f(e.apiFormat)),a=i.buildRequest(e,r,n,t),{signal:o,clear:s,didTimeout:c}=Ie(t.signal,t.timeoutMs);try{let t;try{t=await fetch(a.url,{method:`POST`,headers:a.headers,body:JSON.stringify(a.body),signal:o})}catch(e){throw Re(e,c())}if(!t.ok){let e=await Le(t)||void 0,n=t.statusText?.trim()||void 0,r=[t.status,n].filter(Boolean).join(` `);throw new O({message:e?`LLM upstream returned HTTP ${r}: ${e}`:`LLM upstream returned HTTP ${r}`,code:`http_error`,statusCode:t.status,statusText:n,providerMessage:e,retryable:ze(t.status)})}let n=Date.now(),s;try{s=await t.json()}catch(e){throw Ne(e,c())}let{text:l,usage:u}=i.normalizeResponse(s),d=Math.max(0,Date.now()-n);return await k(e.hooks,`llm_output`,{sessionId:e.hookCtx?.sessionId??`unknown`,model:r,assistantTexts:l?[l]:[],durationMs:d,usage:u},e.hookCtx),{text:l,usage:u,raw:s}}finally{s()}}}}function Ne(e,t){return A(e)&&t?new O({message:`LLM request timed out`,code:`timeout`,retryable:!0,cause:e}):A(e)?new O({message:`LLM request was aborted`,code:`aborted`,retryable:!0,cause:e}):new O({message:`LLM upstream returned an invalid JSON response`,code:`invalid_response`,retryable:!1,cause:e})}function Pe(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 Fe(e){return e.map(e=>`${e.role}: ${e.content}`).join(`
|
|
4
|
+
`)}async function k(e,t,n,r){!e||!r||await e.dispatch(t,n,r)}function Ie(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 Le(e){try{let t=await e.text();return t?t.trim().slice(0,200):``}catch{return``}}function Re(e,t){return e instanceof O?e:A(e)?t?new O({message:`LLM request timed out`,code:`timeout`,retryable:!0,cause:e}):e:new O({message:`LLM network request failed: ${e instanceof Error?e.message:String(e)}`,code:`network_error`,retryable:!0,cause:e})}function A(e){return e instanceof Error&&e.name===`AbortError`}function ze(e){return e===408||e===409||e===425||e===429||e>=500}var j=class extends Error{isUiToolPause=!0;request;constructor(e,t,n,r,i,a,o){super(`UI_TOOL_PAUSED`),this.toolArgs=o,this.name=`UiToolPauseSignal`,this.request={requestId:e,sessionId:t,toolName:n,toolCallId:r,outputSchema:i,extra:a,createdAt:new Date().toISOString()}}};function Be(e){return!!(e instanceof j||typeof e==`object`&&e&&`isUiToolPause`in e&&e.isUiToolPause===!0)}const Ve=new o;function He(){return{}}async function Ue(e,t){return await Ve.run(e,t)}function We(e){let t=Ve.getStore();!t||t.signal||(t.signal=e)}const Ge=l.Object({reason:l.String({description:`A brief explanation of why user input is needed through this UI form.`})});function Ke(e){let{name:t,label:n,description:i,sessionId:a,inputSchema:o,outputSchema:s,extra:c,validate:l,resume:u}=e;return{name:t,label:n,description:i,parameters:o??Ge,async execute(e,n){if(u&&u.toolCallId===e&&u.toolName===t&&u.sessionId===a){let e=r(s,u.values);if(!e.valid){let t=e.errors;return{content:[{type:`text`,text:JSON.stringify({error:`validation_failed`,errors:t})}],details:{}}}if(l){let e=await l(u.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:u.values})}],details:{}}}let i=new j(e,a,t,e,s,c,n);throw We(i),i}}}const M=Symbol(`pluginToolOwner`);var qe=class{tools=[];uiTools=[];register(e,t,n){let r=t.name,i=n?.names??(n?.name?[n.name]:r?[r]:[]);Object.defineProperty(t,M,{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=Ke({name:n.descriptor.name,label:n.descriptor.label,description:n.descriptor.description,sessionId:e,inputSchema:n.descriptor.inputSchema,outputSchema:n.descriptor.outputSchema,extra:n.descriptor.extra,validate:n.descriptor.validate,resume:t});return Object.defineProperty(r,M,{value:n.pluginId,enumerable:!1,configurable:!1,writable:!1}),r})}};function Je(e){return e[M]}function N(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function P(e){return Array.isArray(e)?e.map(e=>typeof e==`string`?e.trim():``).filter(Boolean):[]}function Ye(){let e=a.homedir();if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function Xe(e){let t=e.trim(),n=Ye();return t===`~`?n:t.startsWith(`~/`)||t.startsWith(`~\\`)?n?i.join(n,t.slice(2)):void 0:i.resolve(t)}const Ze=new u({allErrors:!0,strict:!1}),F=new Map;function Qe(e,t){let n=F.get(t);if(n)return n;let r=Ze.compile(e);return F.set(t,r),r}function $e(e){let t=e.cacheKey??JSON.stringify(e.schema),n=Qe(e.schema,t);return n(e.value)?{ok:!0}:{ok:!1,errors:(n.errors??[]).map(e=>({path:e.instancePath||`/`,message:e.message??`invalid`}))}}function I(e){let t=P(e?.allow),n=P(e?.deny),r=P(e?.load?.paths),i=P(e?.piExtensions?.paths),a=e?.entries??{},o=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)),piExtensionPaths:Array.from(new Set(i)),entries:a,slots:o}}function L(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=$e({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 R(e){try{return s.realpathSync(e)}catch{return null}}function z(e){try{return s.statSync(e)}catch{return null}}function B(e,t){let n=i.relative(e,t);return n===``?!0:n.startsWith(`..`)?!1:!i.isAbsolute(n)}function et(e){return`0o${e.toString(8).padStart(3,`0`)}`}const V=new Set([`.ts`,`.js`,`.mts`,`.cts`,`.mjs`,`.cjs`]),tt=[`index.js`,`index.mjs`,`index.cjs`,`index.ts`,`index.mts`,`index.cts`];function nt(e){let t=i.join(e,`package.json`);if(s.existsSync(t))try{let e=JSON.parse(s.readFileSync(t,`utf-8`));return N(e)?e:void 0}catch{return}}function rt(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 it(e){return e===void 0?process.platform===`win32`||typeof process.getuid!=`function`?null:process.getuid():e}function at(e){let t=R(e.source),n=R(e.rootDir);return!t||!n||B(n,t)?null:{reason:`source_escapes_root`,sourcePath:e.source,rootPath:e.rootDir,targetPath:e.source,sourceRealPath:t,rootRealPath:n}}function ot(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 a=z(r);if(!a)return{reason:`path_stat_failed`,sourcePath:e.source,rootPath:e.rootDir,targetPath:r};let o=a.mode&511;if(o&2)return{reason:`path_world_writable`,sourcePath:e.source,rootPath:e.rootDir,targetPath:r,modeBits:o};if(e.origin!==`bundled`&&e.uid!==null&&typeof a.uid==`number`&&a.uid!==e.uid&&a.uid!==0)return{reason:`path_suspicious_ownership`,sourcePath:e.source,rootPath:e.rootDir,targetPath:r,foundUid:a.uid,expectedUid:e.uid}}return null}function st(e){return at({source:e.source,rootDir:e.rootDir})||ot({source:e.source,rootDir:e.rootDir,origin:e.origin,uid:it(e.ownershipUid)})}function ct(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=${et(e.modeBits??0)})`:`blocked plugin candidate: suspicious ownership (${e.targetPath}, uid=${e.foundUid}, expected uid=${e.expectedUid} or root)`}function H(e){let t=st({source:e.source,rootDir:e.rootDir,origin:e.origin,ownershipUid:e.ownershipUid});return t?(e.diagnostics.push({level:`warn`,message:ct(t),source:e.source}),!0):!1}function U(e){return i.basename(e,i.extname(e))}function W(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 lt(e){for(let t of tt){let n=i.join(e,t);if(s.existsSync(n))return n}return null}function G(e){let t;try{t=s.readdirSync(e.rootDir,{withFileTypes:!0})}catch{return}for(let n of t){let t=i.join(e.rootDir,n.name);if(n.isFile()){if(!V.has(i.extname(n.name)))continue;let r=i.dirname(t);if(H({source:t,rootDir:r,origin:e.origin,diagnostics:e.diagnostics,ownershipUid:e.ownershipUid}))continue;e.candidates.push(W({idHint:U(t),source:t,rootDir:r,origin:e.origin,workspaceDir:e.workspaceDir}));continue}if(!n.isDirectory())continue;let r=nt(t),a=rt(r);if(a.status===`ok`){for(let n of a.entries){let a=i.resolve(t,n);if(!B(t,a)){e.diagnostics.push({level:`warn`,message:`blocked plugin candidate: package entry escapes package root (${n})`,source:a});continue}if(!s.existsSync(a)){e.diagnostics.push({level:`warn`,message:`plugin entry missing: ${a}`,source:a});continue}if(!V.has(i.extname(a))){e.diagnostics.push({level:`warn`,message:`plugin entry not a supported extension: ${a}`,source:a});continue}if(H({source:a,rootDir:t,origin:e.origin,diagnostics:e.diagnostics,ownershipUid:e.ownershipUid}))continue;let o=r?.name?.trim(),c=o?`${o}/${U(a)}`:U(a);e.candidates.push(W({idHint:c,source:a,rootDir:t,origin:e.origin,workspaceDir:e.workspaceDir,packageName:r?.name,packageVersion:r?.version,packageDescription:r?.description,packageDir:t,packageManifest:r?.aimax}))}continue}let o=lt(t);o&&(H({source:o,rootDir:t,origin:e.origin,diagnostics:e.diagnostics,ownershipUid:e.ownershipUid})||e.candidates.push(W({idHint:i.basename(t),source:o,rootDir:t,origin:e.origin,workspaceDir:e.workspaceDir})))}}function ut(e){return e?e.map(Xe).filter(e=>typeof e==`string`&&e.length>0):[]}function dt(){let e=Ye();if(e)return i.join(e,`.aimax`,`extensions`)}function ft(e){return i.join(e,`.aimax`,`extensions`)}function pt(e){return i.join(e,`.aimax`,`extensions`)}function mt(e={}){let t=[],n=[],r=ut(e.extraPaths);for(let a of r){if(!s.existsSync(a)){n.push({level:`warn`,message:`plugin path not found: ${a}`,source:a});continue}let r=z(a);if(!r){n.push({level:`warn`,message:`plugin path not readable: ${a}`,source:a});continue}if(r.isFile()){if(!V.has(i.extname(a))){n.push({level:`warn`,message:`plugin file has unsupported extension: ${a}`,source:a});continue}let r=i.dirname(a);if(H({source:a,rootDir:r,origin:`config`,diagnostics:n,ownershipUid:e.ownershipUid}))continue;t.push(W({idHint:U(a),source:a,rootDir:r,origin:`config`,workspaceDir:e.workspaceDir}));continue}r.isDirectory()&&G({rootDir:a,origin:`config`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid})}e.dataDir?G({rootDir:ft(e.dataDir),origin:`workspace`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid}):e.workspaceDir&&G({rootDir:pt(e.workspaceDir),origin:`workspace`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid});let a=dt();return a?G({rootDir:a,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&&G({rootDir:e.bundledDir,origin:`bundled`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid}),{candidates:t,diagnostics:n}}function ht(e){let t=e.rejectHardlinks??!0,n=R(e.rootPath),r=R(e.absolutePath);if(!n||!r)return{ok:!1,reason:`path`};if(!B(n,r))return{ok:!1,reason:`unsafe`};let i;try{i=s.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:s.openSync(r,`r`)}}catch{return{ok:!1,reason:`path`}}}const K=`aimax.plugin.json`,gt=[K];function _t(e){for(let t of gt){let n=i.join(e,t);if(s.existsSync(n))return n}return i.join(e,K)}function vt(e,t=!0){let n=_t(e),r=ht({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(s.readFileSync(r.fd,`utf-8`))}catch(e){return{ok:!1,error:`failed to parse plugin manifest: ${String(e)}`,manifestPath:n}}finally{s.closeSync(r.fd)}if(!N(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=N(i.configSchema)?i.configSchema:null;if(!o)return{ok:!1,error:`plugin manifest requires configSchema`,manifestPath:n};let c=typeof i.kind==`string`?i.kind:void 0,l=typeof i.name==`string`?i.name.trim():void 0,u=typeof i.description==`string`?i.description.trim():void 0,d=typeof i.version==`string`?i.version.trim():void 0,f=P(i.skills),p;return N(i.uiHints)&&(p=i.uiHints),{ok:!0,manifest:{id:a,configSchema:o,kind:c,name:l,description:u,version:d,skills:f,uiHints:p},manifestPath:n}}function yt(e){let t=new Map,n=[];for(let r of e){let e=vt(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 q=function(e){return e.INFO=`INFO`,e.WARN=`WARN`,e.ERROR=`ERROR`,e}({});function J(e,t,n,r){let i=`[plugin:${t}][logger:${n}] ${r}`;if(e===q.ERROR){D.error(i);return}if(e===q.WARN){D.warn(i);return}D.info(i)}function bt(e){let t=()=>e.getEnv?.()??e.env??{};return{version:`0.1.0`,logging:{getLogger:t=>({info:n=>J(q.INFO,e.pluginId,t,n),warn:n=>J(q.WARN,e.pluginId,t,n),error:n=>J(q.ERROR,e.pluginId,t,n)})},session:{get env(){return Object.freeze({...t()})}}}}let Y;function xt(){return Y||=d(import.meta.url,{interopDefault:!0,requireCache:!0}),Y}function St(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 Ct(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 wt(n){let r=[...n.registry.diagnostics],a=new qe,o=new fe,s=[],c=[],l=n.runtimeRef??{current:n.runtime};n.runtime!==void 0&&(l.current=n.runtime);let u=xt();for(let d of n.registry.manifests.values()){let f=St({config:n.plugins,pluginId:d.id,origin:d.origin,kind:d.manifest.kind}),p=Ct({id:d.id,source:d.source,origin:d.origin,enabled:f,configSchema:!0,skills:d.manifest.skills??[]});if(!f){c.push(p);continue}let m=Date.now(),h;try{h=u(d.source)}catch(e){p.status=`error`,p.error=String(e),p.durationMs=Math.max(0,Date.now()-m),r.push({level:`error`,message:`failed to load plugin ${d.id}: ${String(e)}`,pluginId:d.id,source:d.source}),c.push(p);continue}let g=h&&typeof h==`object`&&`default`in h?h.default:h,_=typeof g==`function`?g:g&&typeof g==`object`&&typeof g.register==`function`?g.register:void 0;if(!_){p.status=`error`,p.error=`plugin module does not export a register function`,p.durationMs=Math.max(0,Date.now()-m),r.push({level:`error`,message:`plugin ${d.id} has no register function`,pluginId:d.id,source:d.source}),c.push(p);continue}let v=bt({pluginId:d.id,getEnv:()=>l.current?.env}),y=n.plugins.entries[d.id]?.config,ee={id:d.id,source:d.source,rootDir:d.rootDir,config:y,runtime:v,llm:{chat:async e=>{let t=l.current,n=t?.llm?Me({apiFormat:t.llm.apiFormat,baseUrl:t.llm.baseUrl,apiKey:t.llm.apiKey,defaultModel:t.llm.model,hooks:o,hookCtx:t.hookCtx}):void 0;if(!n)throw Error(`LLM client is not configured`);let r=Tt(t?.llmAllowlist);if(!Et(d.id,a,r))throw Error(`Plugin ${d.id} is not allowed to use LLM`);return n.chat(e)}},registerTool:(e,t)=>{a.register(d.id,e,t),p.toolCount+=1},registerUiTool:(e,t)=>{a.registerUiTool(d.id,e,t),p.toolCount+=1},registerEmbeddingProvider:t=>{if(d.manifest.kind!==`memory`)throw Error(`Plugin ${d.id} is not allowed to register embedding providers`);e({pluginId:d.id,id:t.id,create:t.create,config:y,rootDir:d.rootDir,source:d.source})},registerMemoryProvider:e=>{if(d.manifest.kind!==`memory`)throw Error(`Plugin ${d.id} is not allowed to register memory providers`);t({pluginId:d.id,id:e.id,create:e.create,config:y,rootDir:d.rootDir,source:d.source})},registerHook:(e,t,n)=>{o.register({pluginId:d.id,hookName:e,handler:t,priority:n?.priority,source:d.source}),p.hookCount+=1},registerSkillDir:e=>{let t=i.isAbsolute(e)?e:i.resolve(d.rootDir,e);s.push(t)},createProgressEmitter:()=>ce(d.id)};try{_(ee)}catch(e){p.status=`error`,p.error=String(e),r.push({level:`error`,message:`plugin ${d.id} registration failed: ${String(e)}`,pluginId:d.id,source:d.source})}if(d.manifest.skills&&d.manifest.skills.length>0)for(let e of d.manifest.skills){let t=i.isAbsolute(e)?e:i.resolve(d.rootDir,e);s.push(t)}p.durationMs=Math.max(0,Date.now()-m),c.push(p)}return{plugins:c,diagnostics:r,tools:a,hooks:o,skills:s}}function Tt(e){return(e??[]).map(e=>e.trim()).filter(Boolean)}function Et(e,t,n){return n.length===0?!1:n.includes(e)?!0:t.namesForPlugin(e).some(e=>n.includes(e))}let X=null,Z=null,Dt=null;function Ot(e){return e===void 0?``:JSON.stringify(e)}function kt(e){return[e.dataDir??``,e.bundledDir??``,e.workspaceDir??``,e.ownershipUid??``,Q(e)].join(`|`)}function Q(e){let t=I(e.config);return Ot({bundledDir:e.bundledDir,ownershipUid:e.ownershipUid,piExtensionPaths:e.piExtensionPaths,config:t})}function At(e,t){return e.runtimeRef&&(e.runtimeRef.current=t),e}function jt(e){let t=kt(e);return X&&Z===t?At(X,e.runtime):(X=$(e),Z=t,Dt=Q(e),X)}function Mt(e){return X&&Z===kt(e)||X&&Dt===Q(e)?At(X,e.runtime):$(e)}function $(e={}){let t=I(e.config),n={current:e.runtime},r=mt({dataDir:e.dataDir,workspaceDir:e.workspaceDir,extraPaths:t.loadPaths,bundledDir:e.bundledDir,ownershipUid:e.ownershipUid}),i=yt(r.candidates),a=L({config:t,registry:i}),o=wt({registry:i,plugins:t,workspaceDir:e.workspaceDir,runtime:e.runtime,runtimeRef:n});return{registry:o,diagnostics:[...r.diagnostics,...i.diagnostics,...a.diagnostics,...o.diagnostics],normalizedConfig:t,piExtensions:[],runtimeRef:n}}function Nt(e,t){return Array.from(new Set([...t?.piExtensionPaths??[],...e.piExtensionPaths]))}async function Pt(e,t){let r=Nt(e,t);return r.length===0?[]:n(r)}function Ft(e={}){return{runtimeInitialized:!0,pluginSystem:jt({bundledDir:e.bundledDir,config:e.config,ownershipUid:e.ownershipUid,piExtensionPaths:e.piExtensionPaths}),loadedAt:new Date().toISOString(),version:1}}export{je as A,j as C,D,Me as E,ae as F,f as I,fe as M,ce as N,Oe as O,se as P,Ue as S,O as T,qe as _,jt as a,Ge as b,bt as c,gt as d,vt as f,L as g,I as h,$ as i,ye as j,ke as k,yt as l,mt as m,Pt as n,Nt as o,_t as p,Mt as r,wt as s,Ft as t,K as u,Je as v,Be as w,He as x,Ke as y};
|
|
@@ -27,6 +27,7 @@ type CreatePluginRuntimeOptions = {
|
|
|
27
27
|
* prevent plugins from mutating shared state.
|
|
28
28
|
*/
|
|
29
29
|
env?: Record<string, string>;
|
|
30
|
+
getEnv?: () => Record<string, string> | undefined;
|
|
30
31
|
};
|
|
31
32
|
declare function createPluginRuntime(options: CreatePluginRuntimeOptions): PluginRuntime;
|
|
32
33
|
//#endregion
|
|
@@ -88,6 +89,9 @@ type PluginRuntimeContext = {
|
|
|
88
89
|
*/
|
|
89
90
|
env?: Record<string, string>;
|
|
90
91
|
};
|
|
92
|
+
type PluginRuntimeContextRef = {
|
|
93
|
+
current?: PluginRuntimeContext;
|
|
94
|
+
};
|
|
91
95
|
//#endregion
|
|
92
96
|
//#region src/memory/embeddings.d.ts
|
|
93
97
|
type EmbeddingProvider = {
|
|
@@ -160,6 +164,7 @@ type PluginLoadOptions = {
|
|
|
160
164
|
plugins: NormalizedPluginsConfig;
|
|
161
165
|
workspaceDir?: string;
|
|
162
166
|
runtime?: PluginRuntimeContext;
|
|
167
|
+
runtimeRef?: PluginRuntimeContextRef;
|
|
163
168
|
};
|
|
164
169
|
type PluginApi = {
|
|
165
170
|
id: string;
|
|
@@ -223,6 +228,7 @@ type PluginSystem = {
|
|
|
223
228
|
diagnostics: PluginDiagnostic[];
|
|
224
229
|
normalizedConfig: NormalizedPluginsConfig;
|
|
225
230
|
piExtensions: DiscoveredPiExtension[];
|
|
231
|
+
runtimeRef?: PluginRuntimeContextRef;
|
|
226
232
|
};
|
|
227
233
|
declare function initializePluginSystem(options?: PluginSystemOptions): PluginSystem;
|
|
228
234
|
//#endregion
|
package/dist/system-runtime.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as SystemWarmState, r as prepareSystemRuntime, t as PrepareSystemRuntimeOptions } from "./system-runtime-
|
|
1
|
+
import { n as SystemWarmState, r as prepareSystemRuntime, t as PrepareSystemRuntimeOptions } from "./system-runtime-CEaCYWXK.js";
|
|
2
2
|
export { PrepareSystemRuntimeOptions, SystemWarmState, prepareSystemRuntime };
|
package/dist/system-runtime.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./system-runtime-
|
|
1
|
+
import{t as e}from"./system-runtime-BwN5oJYF.js";import"./provider-registry-DPbmbWqS.js";import"./loader-CkdBGDtW.js";export{e as prepareSystemRuntime};
|
package/package.json
CHANGED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{i as e,t}from"./provider-registry-DPbmbWqS.js";import{n}from"./loader-CkdBGDtW.js";import{validateUiToolResult as r}from"@gencode/shared";import i from"node:path";import a from"node:os";import{AsyncLocalStorage as o}from"node:async_hooks";import s from"node:fs";import c from"log4js";import{Type as l}from"@earendil-works/pi-ai";import u from"ajv";import{createJiti as d}from"jiti";function f(e){return e??`openai-completions`}function p(e,t,n){let r={"Client-Code":`AIMax`,"X-Session-Id":e};return t&&(r[`X-Message-Id`]=t),n&&(r[`X-Channel`]=n),r}function m(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}}const h={apiFormat:`anthropic-messages`,createModel:g,buildRequest:v,normalizeResponse:ee};function g(e,t,n,r){return{id:e.model,name:e.model,api:`anthropic-messages`,provider:`anthropic`,baseUrl:_(e.baseUrl),reasoning:!1,input:[`text`,`image`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:e.contextWindow??2e5,maxTokens:e.maxTokens??32768,headers:p(t,n,r)}}function _(e){return e.replace(/\/+$/,``).replace(/\/v1$/,``)}function v(e,t,n,r){let i=e.baseUrl.replace(/\/+$/,``),a=[],o=[];for(let e of n){if(e.role===`system`){e.content.trim()&&o.push(e.content);continue}a.push({role:e.role,content:e.content})}let s={model:t,messages:a.length>0?a:[{role:`user`,content:``}],max_tokens:r.maxTokens??2048,stream:!1};return o.length>0&&(s.system=o.join(`
|
|
2
|
-
|
|
3
|
-
`)),typeof r.temperature==`number`&&(s.temperature=r.temperature),{url:i.endsWith(`/v1`)?`${i}/messages`:`${i}/v1/messages`,headers:{"content-type":`application/json`,"x-api-key":e.apiKey,"anthropic-version":`2023-06-01`,"Client-Code":`AIMax`},body:s}}function ee(e){let t=e,n=t.content?.filter(e=>e.type===`text`&&typeof e.text==`string`).map(e=>e.text).join(``)??``,r=(t.usage?.input_tokens??0)+(t.usage?.cache_read_input_tokens??0)+(t.usage?.cache_creation_input_tokens??0),i=t.usage?.output_tokens??0;return{text:n,usage:{input:r,output:i,total:r+i},raw:e}}const y={apiFormat:`openai-completions`,createModel:te,buildRequest:ne,normalizeResponse:re};function te(e,t,n,r){let i=e.baseUrl.includes(`deepseek.com`),a=e.thinking;return{id:e.model,name:e.model,api:`openai-completions`,provider:i?`deepseek`:`openai`,baseUrl:e.baseUrl,reasoning:i||!!a,...i&&{thinkingLevelMap:{high:`high`,xhigh:`max`}},...a&&!i&&{thinkingLevelMap:{high:`high`,xhigh:`high`}},input:[`text`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:e.contextWindow??2e5,maxTokens:e.maxTokens??32768,headers:p(t,n,r),compat:{supportsStore:!1,supportsDeveloperRole:!1,supportsReasoningEffort:!!(a&&!i),supportsUsageInStreaming:!0,...a&&!i&&{thinkingFormat:`deepseek`}}}}function ne(e,t,n,r){let i={model:t,messages:n,stream:!1};return typeof r.temperature==`number`&&(i.temperature=r.temperature),typeof r.maxTokens==`number`&&(i.max_tokens=r.maxTokens),{url:`${e.baseUrl.replace(/\/+$/,``)}/chat/completions`,headers:{"content-type":`application/json`,authorization:`Bearer ${e.apiKey}`,"Client-Code":`AIMax`},body:i}}function re(e){let t=e;return{text:t.choices?.[0]?.message?.content??t.choices?.[0]?.text??``,usage:m(t.usage),raw:e}}const ie={"openai-completions":y,"anthropic-messages":h};function b(e){return ie[e]}const x=new o;async function S(e,t){return await x.run(e,t)}function C(e){return{async emit(t){let n=x.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 ae={before_prompt_build:`before_agent_start`,after_tool_call:`tool_result (for mutable results) or before_tool_call (for blocking)`},oe=new Set([`before_model_resolve`,`before_prompt_build`,`before_agent_start`,`before_tool_call`,`tool_result`,`before_compaction`,`context`,`before_provider_request`,`dream_gate`,`input`,`resources_discover`]);var se=class extends Error{constructor(e,t,n){super(`Plugin hook "${e}" timed out after ${n}ms (plugin: ${t})`),this.hookName=e,this.pluginId=t,this.timeoutMs=n,this.name=`PluginHookTimeoutError`}},ce=class{hooks=new Map;deprecatedWarned=new Set;blockingTimeoutMs;bestEffortTimeoutMs;constructor(e={}){this.blockingTimeoutMs=le(e.blockingTimeoutMs,1e4),this.bestEffortTimeoutMs=le(e.bestEffortTimeoutMs,3e3)}register(e){let t=ae[e.hookName];t&&!this.deprecatedWarned.has(e.hookName)&&(this.deprecatedWarned.add(e.hookName),console.warn(`[PluginHookRegistry] Hook "${e.hookName}" is deprecated. Use "${t}" instead. (plugin: ${e.pluginId})`));let n=this.hooks.get(e.hookName)??[];n.push(e),n.sort((e,t)=>(e.priority??0)-(t.priority??0)),this.hooks.set(e.hookName,n)}async dispatch(e,t,n,r){return(await this.dispatchWithMetadata(e,t,n,r)).map(e=>e.result)}async dispatchWithMetadata(e,t,n,r){let i=this.hooks.get(e)??[],a=[],o=this.getDispatchPolicy(e);for(let s of i){let i=ue(n),c=async()=>await s.handler(t,i.ctx);try{let t=await de(r?S({pluginId:s.pluginId,hookContext:i.ctx,eventDispatcher:r.eventDispatcher},c):c(),{hookName:e,pluginId:s.pluginId,timeoutMs:o.timeoutMs,abort:i.abort});i.clear(),a.push({pluginId:s.pluginId,source:s.source,result:t})}catch(t){if(i.clear(),o.mode===`blocking`)throw t;await fe({runtime:r,ctx:n,hookName:e,entry:s,policy:o,error:t})}}return a}getDispatchPolicy(e){return oe.has(e)?{mode:`blocking`,timeoutMs:this.blockingTimeoutMs}:{mode:`bestEffort`,timeoutMs:this.bestEffortTimeoutMs}}};function le(e,t){return typeof e==`number`&&Number.isFinite(e)&&e>0?e:t}function ue(e){let t=new AbortController,n;return e.signal&&(e.signal.aborted?t.abort():(n=()=>t.abort(),e.signal.addEventListener(`abort`,n,{once:!0}))),{ctx:{...e,signal:t.signal},abort:()=>t.abort(),clear:()=>{n&&e.signal&&e.signal.removeEventListener(`abort`,n)}}}async function de(e,t){let n;try{return await Promise.race([e,new Promise((e,r)=>{n=setTimeout(()=>{t.abort(),r(new se(t.hookName,t.pluginId,t.timeoutMs))},t.timeoutMs),n.unref?.()})])}finally{n&&clearTimeout(n)}}async function fe(e){if(!e.runtime||!e.ctx.sessionId)return;let t=e.error instanceof se;await e.runtime.eventDispatcher.dispatchProgress(e.ctx.sessionId,{type:`diagnostic`,level:`warn`,scope:`plugin`,phase:t?`hook_timeout`:`hook_failed`,message:t?`plugin hook timed out: ${e.hookName}`:`plugin hook failed: ${e.hookName}`,details:{hookName:e.hookName,pluginId:e.entry.pluginId,source:e.entry.source,mode:e.policy.mode,timeoutMs:e.policy.timeoutMs,error:e.error instanceof Error?e.error.message:String(e.error)}}).catch(()=>{})}function pe(e){let t=new Intl.DateTimeFormat(`en-CA`,{timeZone:`Asia/Shanghai`,year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hour12:!1}).formatToParts(e);return Object.fromEntries(t.map(e=>[e.type,e.value]))}function me(e=new Date){let t=pe(e),n=String(e.getMilliseconds()).padStart(3,`0`);return`${t.year}-${t.month}-${t.day} ${t.hour}:${t.minute}:${t.second}.${n}`}let w=function(e){return e.INFO=`INFO`,e.WARN=`WARN`,e.ERROR=`ERROR`,e}({});const T=new o;function he(e,t){return T.run({onLog:e},t)}let E=null,D=!1,O=[];function ge(){return me()}function _e(e){if(!e)return``;let t=Object.entries(e).filter(([,e])=>e!==void 0).map(([e,t])=>`${e}=${JSON.stringify(t)}`);return t.length>0?` ${t.join(` `)}`:``}function ve(e){return i.join(e,`.aimax`)}function ye(e){let t=e?.trim();return t&&t.replace(/[^A-Za-z0-9_.-]/g,`_`)||`no-message-${process.pid}`}function be(e,t){let n=t?.sessionStoreName?.trim()||`sessions`,r=ye(t?.messageId);return t?.sessionDir?{runLogId:r,logDir:i.join(t.sessionDir,`logs`,r)}:t?.sessionId?{runLogId:r,logDir:i.join(ve(e),n,t.sessionId,`logs`,r)}:{runLogId:r,logDir:i.join(ve(e),`logs`,r)}}function xe(e){return{appLogPath:i.join(e,`app.log`),errorLogPath:i.join(e,`errors.log`)}}function k(e){let{appLogPath:t,errorLogPath:n}=xe(e);c.configure({appenders:{appFile:{type:`file`,filename:t,maxLogSize:5*1024*1024,backups:3,compress:!0,keepFileExt:!0,layout:{type:`messagePassThrough`}},errorFile:{type:`file`,filename:n,maxLogSize:5*1024*1024,backups:3,compress:!0,keepFileExt:!0,layout:{type:`messagePassThrough`}},errorsOnly:{type:`logLevelFilter`,appender:`errorFile`,level:`error`,maxLevel:`fatal`}},categories:{default:{appenders:[`appFile`,`errorsOnly`],level:`info`}}})}function A(e,t,n){return`[${ge()}] [${e}] ${t}${_e(n)}`}function Se(e,t,n){try{process.stderr.write(`${A(e,t,n)}\n`)}catch{}}function j(e,t,n){let r=T.getStore();if(r){r.onLog({level:e,message:t,context:n,formatted:A(e,t,n),logDir:r.logDir});return}if(!E){O.push({level:e,message:t,context:n}),O.length>200&&(O=O.slice(-200)),Se(e,t,n);return}D||=(k(E.logDir),!0);let i=A(e,t,n),a=c.getLogger();e===w.ERROR?a.error(i):e===w.WARN?a.warn(i):a.info(i)}function Ce(e,t){let{logDir:n,runLogId:r}=be(e,t),i=T.getStore();if(i){i.logDir=n;return}if(D&&E?.dataDir===e&&E.runLogId===r&&E.logDir===n)return;s.mkdirSync(n,{recursive:!0}),k(n),D=!0,E={dataDir:e,logDir:n,runLogId:r};let a=O;O=[];for(let e of a)j(e.level,e.message,e.context)}async function we(){try{await Te()}finally{D=!1}}function Te(){return new Promise((e,t)=>{c.shutdown(n=>{if(n){t(n);return}e()})})}const M={info:(e,t)=>j(w.INFO,e,t),warn:(e,t)=>j(w.WARN,e,t),error:(e,t)=>j(w.ERROR,e,t)};function Ee(e,t){if(e===void 0)return;let n=e.replace(/\s+/g,` `).trim();return t===void 0||n.length<=t?n:`${n.slice(0,Math.max(0,t-3))}...`}var N=class extends Error{code;statusCode;statusText;providerMessage;providerCode;providerType;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.providerCode=e.providerCode,this.providerType=e.providerType,this.retryable=e.retryable}};function De(e){return{async chat(t){let n=ke(t),r=t.model??e.defaultModel;if(!r)throw Error(`LLM model is required`);await je(e.hooks,`llm_input`,{sessionId:e.hookCtx?.sessionId??`unknown`,model:r,prompt:Ae(n),historyMessages:n},e.hookCtx);let i=b(f(e.apiFormat)),a=i.buildRequest(e,r,n,t),{signal:o,clear:s,didTimeout:c}=Me(t.signal,t.timeoutMs);try{let t;try{t=await fetch(a.url,{method:`POST`,headers:a.headers,body:JSON.stringify(a.body),signal:o})}catch(e){throw Pe(e,c())}if(!t.ok){let e=await Ne(t)||void 0,n=t.statusText?.trim()||void 0,r=[t.status,n].filter(Boolean).join(` `);throw new N({message:e?`LLM upstream returned HTTP ${r}: ${e}`:`LLM upstream returned HTTP ${r}`,code:`http_error`,statusCode:t.status,statusText:n,providerMessage:e,retryable:Fe(t.status)})}let n=Date.now(),s;try{s=await t.json()}catch(e){throw Oe(e,c())}let{text:l,usage:u}=i.normalizeResponse(s),d=Math.max(0,Date.now()-n);return await je(e.hooks,`llm_output`,{sessionId:e.hookCtx?.sessionId??`unknown`,model:r,assistantTexts:l?[l]:[],durationMs:d,usage:u},e.hookCtx),{text:l,usage:u,raw:s}}finally{s()}}}}function Oe(e,t){return P(e)&&t?new N({message:`LLM request timed out`,code:`timeout`,retryable:!0,cause:e}):P(e)?new N({message:`LLM request was aborted`,code:`aborted`,retryable:!0,cause:e}):new N({message:`LLM upstream returned an invalid JSON response`,code:`invalid_response`,retryable:!1,cause:e})}function ke(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 Ae(e){return e.map(e=>`${e.role}: ${e.content}`).join(`
|
|
4
|
-
`)}async function je(e,t,n,r){!e||!r||await e.dispatch(t,n,r)}function Me(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 Ne(e){try{let t=await e.text();return t?t.trim().slice(0,200):``}catch{return``}}function Pe(e,t){return e instanceof N?e:P(e)?t?new N({message:`LLM request timed out`,code:`timeout`,retryable:!0,cause:e}):e:new N({message:`LLM network request failed: ${e instanceof Error?e.message:String(e)}`,code:`network_error`,retryable:!0,cause:e})}function P(e){return e instanceof Error&&e.name===`AbortError`}function Fe(e){return e===408||e===409||e===425||e===429||e>=500}var F=class extends Error{isUiToolPause=!0;request;constructor(e,t,n,r,i,a,o){super(`UI_TOOL_PAUSED`),this.toolArgs=o,this.name=`UiToolPauseSignal`,this.request={requestId:e,sessionId:t,toolName:n,toolCallId:r,outputSchema:i,extra:a,createdAt:new Date().toISOString()}}};function Ie(e){return!!(e instanceof F||typeof e==`object`&&e&&`isUiToolPause`in e&&e.isUiToolPause===!0)}const Le=new o;function Re(){return{}}async function ze(e,t){return await Le.run(e,t)}function Be(e){let t=Le.getStore();!t||t.signal||(t.signal=e)}const Ve=l.Object({reason:l.String({description:`A brief explanation of why user input is needed through this UI form.`})});function He(e){let{name:t,label:n,description:i,sessionId:a,inputSchema:o,outputSchema:s,extra:c,validate:l,resume:u}=e;return{name:t,label:n,description:i,parameters:o??Ve,async execute(e,n){if(u&&u.toolCallId===e&&u.toolName===t&&u.sessionId===a){let e=r(s,u.values);if(!e.valid){let t=e.errors;return{content:[{type:`text`,text:JSON.stringify({error:`validation_failed`,errors:t})}],details:{}}}if(l){let e=await l(u.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:u.values})}],details:{}}}let i=new F(e,a,t,e,s,c,n);throw Be(i),i}}}const I=Symbol(`pluginToolOwner`);var Ue=class{tools=[];uiTools=[];register(e,t,n){let r=t.name,i=n?.names??(n?.name?[n.name]:r?[r]:[]);Object.defineProperty(t,I,{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=He({name:n.descriptor.name,label:n.descriptor.label,description:n.descriptor.description,sessionId:e,inputSchema:n.descriptor.inputSchema,outputSchema:n.descriptor.outputSchema,extra:n.descriptor.extra,validate:n.descriptor.validate,resume:t});return Object.defineProperty(r,I,{value:n.pluginId,enumerable:!1,configurable:!1,writable:!1}),r})}};function We(e){return e[I]}function L(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function R(e){return Array.isArray(e)?e.map(e=>typeof e==`string`?e.trim():``).filter(Boolean):[]}function Ge(){let e=a.homedir();if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function Ke(e){let t=e.trim(),n=Ge();return t===`~`?n:t.startsWith(`~/`)||t.startsWith(`~\\`)?n?i.join(n,t.slice(2)):void 0:i.resolve(t)}const qe=new u({allErrors:!0,strict:!1}),Je=new Map;function Ye(e,t){let n=Je.get(t);if(n)return n;let r=qe.compile(e);return Je.set(t,r),r}function Xe(e){let t=e.cacheKey??JSON.stringify(e.schema),n=Ye(e.schema,t);return n(e.value)?{ok:!0}:{ok:!1,errors:(n.errors??[]).map(e=>({path:e.instancePath||`/`,message:e.message??`invalid`}))}}function Ze(e){let t=R(e?.allow),n=R(e?.deny),r=R(e?.load?.paths),i=R(e?.piExtensions?.paths),a=e?.entries??{},o=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)),piExtensionPaths:Array.from(new Set(i)),entries:a,slots:o}}function Qe(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=Xe({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 z(e){try{return s.realpathSync(e)}catch{return null}}function $e(e){try{return s.statSync(e)}catch{return null}}function B(e,t){let n=i.relative(e,t);return n===``?!0:n.startsWith(`..`)?!1:!i.isAbsolute(n)}function et(e){return`0o${e.toString(8).padStart(3,`0`)}`}const V=new Set([`.ts`,`.js`,`.mts`,`.cts`,`.mjs`,`.cjs`]),tt=[`index.js`,`index.mjs`,`index.cjs`,`index.ts`,`index.mts`,`index.cts`];function nt(e){let t=i.join(e,`package.json`);if(s.existsSync(t))try{let e=JSON.parse(s.readFileSync(t,`utf-8`));return L(e)?e:void 0}catch{return}}function rt(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 it(e){return e===void 0?process.platform===`win32`||typeof process.getuid!=`function`?null:process.getuid():e}function at(e){let t=z(e.source),n=z(e.rootDir);return!t||!n||B(n,t)?null:{reason:`source_escapes_root`,sourcePath:e.source,rootPath:e.rootDir,targetPath:e.source,sourceRealPath:t,rootRealPath:n}}function ot(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 a=$e(r);if(!a)return{reason:`path_stat_failed`,sourcePath:e.source,rootPath:e.rootDir,targetPath:r};let o=a.mode&511;if(o&2)return{reason:`path_world_writable`,sourcePath:e.source,rootPath:e.rootDir,targetPath:r,modeBits:o};if(e.origin!==`bundled`&&e.uid!==null&&typeof a.uid==`number`&&a.uid!==e.uid&&a.uid!==0)return{reason:`path_suspicious_ownership`,sourcePath:e.source,rootPath:e.rootDir,targetPath:r,foundUid:a.uid,expectedUid:e.uid}}return null}function st(e){return at({source:e.source,rootDir:e.rootDir})||ot({source:e.source,rootDir:e.rootDir,origin:e.origin,uid:it(e.ownershipUid)})}function ct(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=${et(e.modeBits??0)})`:`blocked plugin candidate: suspicious ownership (${e.targetPath}, uid=${e.foundUid}, expected uid=${e.expectedUid} or root)`}function H(e){let t=st({source:e.source,rootDir:e.rootDir,origin:e.origin,ownershipUid:e.ownershipUid});return t?(e.diagnostics.push({level:`warn`,message:ct(t),source:e.source}),!0):!1}function U(e){return i.basename(e,i.extname(e))}function W(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 lt(e){for(let t of tt){let n=i.join(e,t);if(s.existsSync(n))return n}return null}function G(e){let t;try{t=s.readdirSync(e.rootDir,{withFileTypes:!0})}catch{return}for(let n of t){let t=i.join(e.rootDir,n.name);if(n.isFile()){if(!V.has(i.extname(n.name)))continue;let r=i.dirname(t);if(H({source:t,rootDir:r,origin:e.origin,diagnostics:e.diagnostics,ownershipUid:e.ownershipUid}))continue;e.candidates.push(W({idHint:U(t),source:t,rootDir:r,origin:e.origin,workspaceDir:e.workspaceDir}));continue}if(!n.isDirectory())continue;let r=nt(t),a=rt(r);if(a.status===`ok`){for(let n of a.entries){let a=i.resolve(t,n);if(!B(t,a)){e.diagnostics.push({level:`warn`,message:`blocked plugin candidate: package entry escapes package root (${n})`,source:a});continue}if(!s.existsSync(a)){e.diagnostics.push({level:`warn`,message:`plugin entry missing: ${a}`,source:a});continue}if(!V.has(i.extname(a))){e.diagnostics.push({level:`warn`,message:`plugin entry not a supported extension: ${a}`,source:a});continue}if(H({source:a,rootDir:t,origin:e.origin,diagnostics:e.diagnostics,ownershipUid:e.ownershipUid}))continue;let o=r?.name?.trim(),c=o?`${o}/${U(a)}`:U(a);e.candidates.push(W({idHint:c,source:a,rootDir:t,origin:e.origin,workspaceDir:e.workspaceDir,packageName:r?.name,packageVersion:r?.version,packageDescription:r?.description,packageDir:t,packageManifest:r?.aimax}))}continue}let o=lt(t);o&&(H({source:o,rootDir:t,origin:e.origin,diagnostics:e.diagnostics,ownershipUid:e.ownershipUid})||e.candidates.push(W({idHint:i.basename(t),source:o,rootDir:t,origin:e.origin,workspaceDir:e.workspaceDir})))}}function ut(e){return e?e.map(Ke).filter(e=>typeof e==`string`&&e.length>0):[]}function dt(){let e=Ge();if(e)return i.join(e,`.aimax`,`extensions`)}function ft(e){return i.join(e,`.aimax`,`extensions`)}function pt(e){return i.join(e,`.aimax`,`extensions`)}function mt(e={}){let t=[],n=[],r=ut(e.extraPaths);for(let a of r){if(!s.existsSync(a)){n.push({level:`warn`,message:`plugin path not found: ${a}`,source:a});continue}let r=$e(a);if(!r){n.push({level:`warn`,message:`plugin path not readable: ${a}`,source:a});continue}if(r.isFile()){if(!V.has(i.extname(a))){n.push({level:`warn`,message:`plugin file has unsupported extension: ${a}`,source:a});continue}let r=i.dirname(a);if(H({source:a,rootDir:r,origin:`config`,diagnostics:n,ownershipUid:e.ownershipUid}))continue;t.push(W({idHint:U(a),source:a,rootDir:r,origin:`config`,workspaceDir:e.workspaceDir}));continue}r.isDirectory()&&G({rootDir:a,origin:`config`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid})}e.dataDir?G({rootDir:ft(e.dataDir),origin:`workspace`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid}):e.workspaceDir&&G({rootDir:pt(e.workspaceDir),origin:`workspace`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid});let a=dt();return a?G({rootDir:a,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&&G({rootDir:e.bundledDir,origin:`bundled`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid}),{candidates:t,diagnostics:n}}function ht(e){let t=e.rejectHardlinks??!0,n=z(e.rootPath),r=z(e.absolutePath);if(!n||!r)return{ok:!1,reason:`path`};if(!B(n,r))return{ok:!1,reason:`unsafe`};let i;try{i=s.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:s.openSync(r,`r`)}}catch{return{ok:!1,reason:`path`}}}const K=`aimax.plugin.json`,gt=[K];function _t(e){for(let t of gt){let n=i.join(e,t);if(s.existsSync(n))return n}return i.join(e,K)}function q(e,t=!0){let n=_t(e),r=ht({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(s.readFileSync(r.fd,`utf-8`))}catch(e){return{ok:!1,error:`failed to parse plugin manifest: ${String(e)}`,manifestPath:n}}finally{s.closeSync(r.fd)}if(!L(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=L(i.configSchema)?i.configSchema:null;if(!o)return{ok:!1,error:`plugin manifest requires configSchema`,manifestPath:n};let c=typeof i.kind==`string`?i.kind:void 0,l=typeof i.name==`string`?i.name.trim():void 0,u=typeof i.description==`string`?i.description.trim():void 0,d=typeof i.version==`string`?i.version.trim():void 0,f=R(i.skills),p;return L(i.uiHints)&&(p=i.uiHints),{ok:!0,manifest:{id:a,configSchema:o,kind:c,name:l,description:u,version:d,skills:f,uiHints:p},manifestPath:n}}function vt(e){let t=new Map,n=[];for(let r of e){let e=q(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 J=function(e){return e.INFO=`INFO`,e.WARN=`WARN`,e.ERROR=`ERROR`,e}({});function Y(e,t,n,r){let i=`[plugin:${t}][logger:${n}] ${r}`;if(e===J.ERROR){M.error(i);return}if(e===J.WARN){M.warn(i);return}M.info(i)}function yt(e){return{version:`0.1.0`,logging:{getLogger:t=>({info:n=>Y(J.INFO,e.pluginId,t,n),warn:n=>Y(J.WARN,e.pluginId,t,n),error:n=>Y(J.ERROR,e.pluginId,t,n)})},session:{env:Object.freeze({...e.env??{}})}}}let bt;function xt(){return bt||=d(import.meta.url,{interopDefault:!0,requireCache:!0}),bt}function St(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 Ct(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 wt(n){let r=[...n.registry.diagnostics],a=new Ue,o=new ce,s=[],c=[],l=n.runtime?.llm?De({apiFormat:n.runtime.llm.apiFormat,baseUrl:n.runtime.llm.baseUrl,apiKey:n.runtime.llm.apiKey,defaultModel:n.runtime.llm.model,hooks:o,hookCtx:n.runtime.hookCtx}):void 0,u=Tt(n.runtime?.llmAllowlist),d=xt();for(let f of n.registry.manifests.values()){let p=St({config:n.plugins,pluginId:f.id,origin:f.origin,kind:f.manifest.kind}),m=Ct({id:f.id,source:f.source,origin:f.origin,enabled:p,configSchema:!0,skills:f.manifest.skills??[]});if(!p){c.push(m);continue}let h=Date.now(),g;try{g=d(f.source)}catch(e){m.status=`error`,m.error=String(e),m.durationMs=Math.max(0,Date.now()-h),r.push({level:`error`,message:`failed to load plugin ${f.id}: ${String(e)}`,pluginId:f.id,source:f.source}),c.push(m);continue}let _=g&&typeof g==`object`&&`default`in g?g.default:g,v=typeof _==`function`?_:_&&typeof _==`object`&&typeof _.register==`function`?_.register:void 0;if(!v){m.status=`error`,m.error=`plugin module does not export a register function`,m.durationMs=Math.max(0,Date.now()-h),r.push({level:`error`,message:`plugin ${f.id} has no register function`,pluginId:f.id,source:f.source}),c.push(m);continue}let ee=yt({pluginId:f.id,env:n.runtime?.env}),y=n.plugins.entries[f.id]?.config,te={id:f.id,source:f.source,rootDir:f.rootDir,config:y,runtime:ee,llm:{chat:async e=>{if(!l)throw Error(`LLM client is not configured`);if(!Et(f.id,a,u))throw Error(`Plugin ${f.id} is not allowed to use LLM`);return l.chat(e)}},registerTool:(e,t)=>{a.register(f.id,e,t),m.toolCount+=1},registerUiTool:(e,t)=>{a.registerUiTool(f.id,e,t),m.toolCount+=1},registerEmbeddingProvider:t=>{if(f.manifest.kind!==`memory`)throw Error(`Plugin ${f.id} is not allowed to register embedding providers`);e({pluginId:f.id,id:t.id,create:t.create,config:y,rootDir:f.rootDir,source:f.source})},registerMemoryProvider:e=>{if(f.manifest.kind!==`memory`)throw Error(`Plugin ${f.id} is not allowed to register memory providers`);t({pluginId:f.id,id:e.id,create:e.create,config:y,rootDir:f.rootDir,source:f.source})},registerHook:(e,t,n)=>{o.register({pluginId:f.id,hookName:e,handler:t,priority:n?.priority,source:f.source}),m.hookCount+=1},registerSkillDir:e=>{let t=i.isAbsolute(e)?e:i.resolve(f.rootDir,e);s.push(t)},createProgressEmitter:()=>C(f.id)};try{v(te)}catch(e){m.status=`error`,m.error=String(e),r.push({level:`error`,message:`plugin ${f.id} registration failed: ${String(e)}`,pluginId:f.id,source:f.source})}if(f.manifest.skills&&f.manifest.skills.length>0)for(let e of f.manifest.skills){let t=i.isAbsolute(e)?e:i.resolve(f.rootDir,e);s.push(t)}m.durationMs=Math.max(0,Date.now()-h),c.push(m)}return{plugins:c,diagnostics:r,tools:a,hooks:o,skills:s}}function Tt(e){return(e??[]).map(e=>e.trim()).filter(Boolean)}function Et(e,t,n){return n.length===0?!1:n.includes(e)?!0:t.namesForPlugin(e).some(e=>n.includes(e))}let X=null,Z=null;function Dt(e){let{dataDir:t,bundledDir:n,workspaceDir:r}=e,i=e.config?JSON.stringify({allow:e.config.allow,deny:e.config.deny,enabled:e.config.enabled,piExtensions:e.config.piExtensions}):``;return`${t??``}|${n??``}|${r??``}|${i}`}function Ot(e){let t=Dt(e);return X&&Z===t?X:(X=Q(e),Z=t,X)}function kt(e){return X&&Z===Dt(e)?X:Q(e)}function Q(e={}){let t=Ze(e.config),n=mt({dataDir:e.dataDir,workspaceDir:e.workspaceDir,extraPaths:t.loadPaths,bundledDir:e.bundledDir,ownershipUid:e.ownershipUid}),r=vt(n.candidates),i=Qe({config:t,registry:r}),a=wt({registry:r,plugins:t,workspaceDir:e.workspaceDir,runtime:e.runtime});return{registry:a,diagnostics:[...n.diagnostics,...r.diagnostics,...i.diagnostics,...a.diagnostics],normalizedConfig:t,piExtensions:[]}}function $(e,t){return Array.from(new Set([...t?.piExtensionPaths??[],...e.piExtensionPaths]))}async function At(e,t){let r=$(e,t);return r.length===0?[]:n(r)}function jt(e={}){return{runtimeInitialized:!0,pluginSystem:Ot({bundledDir:e.bundledDir,config:e.config,ownershipUid:e.ownershipUid,piExtensionPaths:e.piExtensionPaths}),loadedAt:new Date().toISOString(),version:1}}export{Ee as A,F as C,M as D,De as E,b as F,f as I,ce as M,C as N,Ce as O,S as P,ze as S,N as T,Ue as _,Ot as a,Ve as b,yt as c,gt as d,q as f,Qe as g,Ze as h,Q as i,he as j,we as k,vt as l,mt as m,At as n,$ as o,_t as p,kt as r,wt as s,jt as t,K as u,We as v,Ie as w,Re as x,He as y};
|