@gencode/agents 0.16.2 → 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 CHANGED
@@ -1,5 +1,17 @@
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
+
9
+ ## 0.16.3
10
+
11
+ ### Patch Changes
12
+
13
+ - 718e1da: 修复通过 `aimax-server` 或 `aimax run` 执行任务时,终态 callback 已送达但 `<dataDir>/.aimax/<sessionStore>/<sessionId>/logs/<messageId>/app.log` 缺少 `done` / `error` 投递记录的问题。CLI 运行现在通过既有 `onLog` 合同接管 agents 日志持久化,并在终态 callback 发送后统一完成刷盘,避免 agents logger 提前关闭 CLI 使用的日志后端;无需新增配置。
14
+
3
15
  ## 0.16.2
4
16
 
5
17
  ### 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
- 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-CGp_n4m8.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-Bop42Cc_.js";
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-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";
@@ -1099,7 +1099,7 @@ type BatchSpawnResult = {
1099
1099
  status: "done" | "partial_error" | "error";
1100
1100
  results: BatchSpawnItemResult[];
1101
1101
  };
1102
- type InheritedRunParams = Pick<AgentRunParams, "plugins" | "skillsLoadPaths" | "memory" | "messaging" | "historyLimit" | "topicSegmentation" | "onProgress" | "messageId" | "sessionStoreName" | "autoSkills" | "agentPolicy" | "projectDir" | "env">;
1102
+ type InheritedRunParams = Pick<AgentRunParams, "plugins" | "skillsLoadPaths" | "memory" | "messaging" | "historyLimit" | "topicSegmentation" | "onProgress" | "onLog" | "messageId" | "sessionStoreName" | "autoSkills" | "agentPolicy" | "projectDir" | "env">;
1103
1103
  /** Formats the announce message injected into the parent session when a subagent completes. */
1104
1104
  declare function buildSubagentAnnounceMessage(params: {
1105
1105
  task: string;
@@ -1206,7 +1206,7 @@ type SubagentToolsContext = {
1206
1206
  depth: number;
1207
1207
  channel: AgentRunParams["channel"];
1208
1208
  llm: AgentRunParams["llm"];
1209
- inheritedRunParams?: Pick<AgentRunParams, "plugins" | "skillsLoadPaths" | "memory" | "messaging" | "historyLimit" | "topicSegmentation" | "onProgress" | "messageId" | "sessionStoreName" | "autoSkills" | "agentPolicy" | "projectDir" | "env">;
1209
+ inheritedRunParams?: Pick<AgentRunParams, "plugins" | "skillsLoadPaths" | "memory" | "messaging" | "historyLimit" | "topicSegmentation" | "onProgress" | "onLog" | "messageId" | "sessionStoreName" | "autoSkills" | "agentPolicy" | "projectDir" | "env">;
1210
1210
  loopDetection?: ToolLoopDetectionConfig;
1211
1211
  autoSkillsLoadEnabled?: boolean;
1212
1212
  memoryOptions?: MemoryToolOptions;
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-g4RJ5wzA.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(`
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,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`)}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(`
@@ -156,7 +156,7 @@ Numbered/Listed Step Protocol:
156
156
  data: {"type":"message_start","message":{"id":"","type":"message","role":"assistant","content":[],"model":"","stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":0,"output_tokens":0}}}
157
157
 
158
158
  `;function mh(e,t){return!!t&&e.startsWith(t)&&e.includes(`/v1/messages`)}function hh(e,t){let n=new Headers(t?.headers??(e instanceof Request?e.headers:void 0));for(let e of Array.from(n.keys()))gh(e)&&n.delete(e);return{...t,headers:n}}function gh(e){let t=e.toLowerCase();return t===`anthropic-beta`||t===`anthropic-dangerous-direct-browser-access`||t===`x-stainless-helper-method`||t.startsWith(`x-stainless-`)||t===`user-agent`}function _h(e){return typeof e==`string`?e:e instanceof URL?e.toString():e.url}function vh(e,t){return e.api===`anthropic-messages`?{cacheRetention:`none`,headers:{...t?.headers??{},"anthropic-beta":null,"anthropic-dangerous-direct-browser-access":null}}:{}}function yh(e,t=.3){return e.length===0?!0:e.every(e=>e.score<t)}function bh(e){return Math.ceil(e.length/4)}function xh(e,t){if(bh(e)<=t)return e;let n=t*4;return`${e.slice(0,Math.max(0,n-3)).trimEnd()}...`}async function Sh(e){let t=e.query.trim();if(!t)return{};let n=await e.provider.search(t),r=e.coreConfig?.knowledgeController?.scoreThreshold,i=yh(n,r);if(n.length===0)return{isWeakLocalRecall:!0};let a=e.coreConfig?.recall?.tokenBudget??1500,o=[`<!-- AIMax persistent memory recall -->`,``,`## Recalled Memory`,``];for(let e of n){let t=e.path.includes(`#`)?e.path:`${e.path} (L${e.startLine})`;o.push(`- **${t}**: ${e.snippet.trim()}`)}return{block:xh(o.join(`
159
- `),a),blockId:`core-recall-${Date.now()}`,isWeakLocalRecall:i}}function Ch(e,t){return`${t.trim()}\n\n${e}`}function wh(e,t){let n=`${t.trim()}\n\n`;return e.startsWith(n)?e.slice(n.length):e}const Th=`<!-- AIMax compaction memory recall -->`;async function Eh(e){if(e.coreConfig?.compactionRecall?.enabled!==!0)return;let t=e.query.trim();if(t)try{let n=await Sh({provider:e.provider,query:t,coreConfig:{...e.coreConfig,recall:{...e.coreConfig.recall,enabled:!0,tokenBudget:e.coreConfig.compactionRecall?.tokenBudget??e.coreConfig.recall?.tokenBudget}}});return n.block?`${Th}\n\n${n.block.replace(`${Th}\n\n`,``).trim()}`:void 0}catch{return}}async function Dh(e){let{session:{runParams:t,sessionId:n,hookRegistry:i,hookContext:a,runContext:o,eventDispatcher:s},runtimeInputs:{contextFiles:c,bootstrapWarnings:l,skills:u,autoSkillCategories:d,effectivePromptText:f,pluginTools:p,pluginSkillDirs:m,skillsLoadPaths:h,presetSystemPrompt:g},dependencies:{registry:_,spawnFn:v,createModel:y,abortSignal:b}}=e,x=t.autoSkills?.load?.enabled===!0,S=t.agentPolicy?.activeAgent,C=t.channel===`CRON`,w=C?[]:await I(t.dataDir,n,$(t)),T={model:t.llm.model,api:t.llm.apiFormat??`openai-completions`},E=Vs(t.llm),D=await Au({dataDir:t.dataDir,sessionId:n,sessionStoreName:t.sessionStoreName,sessionPathScope:t.sessionPathScope}),O=C?{messages:[],priorSummary:void 0,compactionEntry:void 0,stats:{originalCount:0,keptCount:0,estimatedTokens:0,compacted:!1},compactionEvents:[]}:await ju({entries:w,modelInfo:T,contextWindowTokens:t.llm.contextWindow??2e5,llm:{apiFormat:t.llm.apiFormat,baseUrl:t.llm.baseUrl,apiKey:t.llm.apiKey,model:t.llm.model,flashModel:t.llm.flashModel},historyLimit:t.historyLimit,topicSegmentation:t.topicSegmentation,channel:t.channel,isSubagent:!!t.subagentContext,compactionEnabled:!0,pendingUserMessage:f,signal:b,hooks:i,hookCtx:a,contextManager:D,dataDir:t.dataDir,sessionId:n,entriesToMessagesOptions:E});await Ah({runParams:t,sessionId:n,historyResult:O,runContext:o,eventDispatcher:s,hookRegistry:i,hookContext:a,effectivePromptText:f});let k=t.subagentContext?.depth??0,A=r(t.dataDir,n,$(t)),j=Pn(),M=Ta([...em(t.dataDir,{sessionId:t.subagentContext?.parentSessionId??n,runtimeSessionId:n,currentSessionDir:A,registry:_,processRegistry:j,parentSessionId:n,depth:k,channel:t.channel,llm:t.llm,inheritedRunParams:{sessionStoreName:t.sessionStoreName,plugins:t.plugins,skillsLoadPaths:h,memory:t.memory,messaging:t.messaging,historyLimit:t.historyLimit,topicSegmentation:t.topicSegmentation,autoSkills:t.autoSkills,onProgress:t.onProgress,messageId:t.messageId,agentPolicy:t.agentPolicy,projectDir:t.projectDir,env:t.env},loopDetection:t.loopDetection,autoSkillsLoadEnabled:x,memoryOptions:{providerId:o.memoryProviderId,pluginId:o.memoryPluginId,sessionId:n,sessionStoreName:t.sessionStoreName,llm:{apiFormat:t.llm.apiFormat,baseUrl:t.llm.baseUrl,apiKey:t.llm.apiKey,model:t.llm.model},onMemoryChanged:async()=>{}},pluginSkillDirs:m,skillsLoadPaths:h,reportSkillUsed:async e=>{await s.dispatchProgress(n,e)},reportTaskUpdated:async e=>{await s.dispatchProgress(n,e)},contextManager:D,hitlResume:t.hitlResume,eventDispatcher:s,spawnFn:v,baseEnv:t.env}),...p],S),N=M.map(e=>typeof e.name==`string`?e.name.trim():``).filter(Boolean),P={};for(let e of M){let t=typeof e.name==`string`?e.name.trim():``,n=typeof e.description==`string`?e.description.trim():``;!t||!n||P[t]||(P[t]=n)}let F=t.messaging?.enabled??t.channel!==`CRON`,L=t.messaging?.channels&&t.messaging.channels.length>0?t.messaging.channels:[t.channel],R=Om({dataDir:t.dataDir,projectDir:t.projectDir,skills:wa(u,S),autoSkillCategories:x?d:[],contextFiles:c,toolNames:N,toolSummaries:P,promptMode:k>0?`minimal`:`full`,subagentDepth:k,bootstrapWarnings:l,memoryCitationsMode:t.memory?.citationsMode??`off`,messaging:{enabled:F,channels:L},sandboxInfo:{enabled:!0,hostWorkspaceDir:o.workspaceDir,containerWorkspaceDir:o.workspaceDir},runtimeInfo:{os:process.platform,node:process.version,model:t.llm.model,hostname:It.hostname()},currentDate:new Date().toISOString().split(`T`)[0],presetSystemPrompt:g,activeAgentSystemPrompt:S?.systemPrompt,availableAgents:t.subagentContext?[]:t.agentPolicy?.availableAgents??[],priorConversationSummary:O.priorSummary});R=await kh({systemPrompt:R,dataDir:t.dataDir,sessionId:n,sessionStoreName:t.sessionStoreName});let z,B=t.memory?.core,V=B?.recall?.enabled===!0,H=!!t.subagentContext,U=o.memoryProviderSource===`plugin`&&B?.recall?.forceWithPluginProvider!==!0;if(V&&!H&&!U&&!o.recallState.recallProvided)try{let e=await Sh({provider:o.memoryProvider,query:f,coreConfig:B}),t=B?.knowledgeController;if(t?.enabled===!0&&t?.searchMode===`fallback`&&(e.isWeakLocalRecall===!0||!e.block))try{let e=await(await import(`./kc-Omw-bmtO.js`)).runKcFallbackSearch({config:t,query:f});e.block&&(z&&(R=wh(R,z)),z=e.block,R=Ch(R,z),o.recallState={recallProvided:!0,source:`core`,blockId:e.blockId})}catch(e){await s.dispatchDiagnostic(n,{level:`warn`,scope:`memory`,phase:`core_kc_recall_failed`,message:`KC fallback recall failed`,details:{error:e instanceof Error?e.message:String(e)}}).catch(()=>{})}!o.recallState.recallProvided&&e.block&&(z=e.block,R=Ch(R,z),o.recallState={recallProvided:!0,source:`core`,blockId:e.blockId})}catch(e){await s.dispatchDiagnostic(n,{level:`warn`,scope:`memory`,phase:`core_recall_failed`,message:`core recall step failed`,details:{error:e instanceof Error?e.message:String(e)}}).catch(()=>{})}let ee={selectedTools:N,toolSnippets:[],promptGuidelines:[],contextFiles:c,skills:u,cwd:o.workspaceDir},te=await i.dispatch(`before_agent_start`,{prompt:f,systemPrompt:R,systemPromptOptions:ee,recallState:o.recallState},a,{eventDispatcher:s}),ne=await i.dispatchWithMetadata(`before_prompt_build`,{prompt:f,recallState:o.recallState},a,{eventDispatcher:s});ne.length>0&&console.warn(`[AgentRuntime] before_prompt_build hook(s) fired; this hook is deprecated in favor of before_agent_start. Migrate plugins to before_agent_start.`);let W=[];for(let e of te){if(!e)continue;let t=e;if(t.recall?.block?.trim()){z&&=(R=wh(R,z),void 0),R=Ch(R,t.recall.block.trim()),o.recallState={recallProvided:!0,source:`plugin`};continue}t.systemPrompt&&(R=t.systemPrompt),t.prependContext&&(R=`${t.prependContext}\n\n${R}`),t.message&&W.push(t.message)}for(let e of ne){if(!e.result)continue;let t=e.result;if(t.recall?.block?.trim()){z&&=(R=wh(R,z),void 0),R=Ch(R,t.recall.block.trim()),o.recallState={recallProvided:!0,source:`plugin`};continue}if(t.systemPrompt&&(R=t.systemPrompt),t.prependContext){if((e.pluginId===o.memoryPluginId||e.pluginId===o.memoryProviderId)&&o.recallState.recallProvided)continue;R=`${t.prependContext}\n\n${R}`,(e.pluginId===o.memoryPluginId||e.pluginId===o.memoryProviderId)&&(o.recallState={recallProvided:!0,source:`plugin`})}}await i.dispatch(`after_prompt_build`,{prompt:f,systemPrompt:R},a,{eventDispatcher:s});let re=oh(km(M,a,{eventDispatcher:s}),{sessionId:n,config:t.loopDetection},ch),G=S?.model??t.llm.model,ie=await i.dispatch(`before_model_resolve`,{prompt:f},a,{eventDispatcher:s});for(let e of ie)e&&e.modelOverride&&(G=e.modelOverride);let ae=y({...t.llm,model:G},n,t.messageId,t.channel);try{await Ns(t.dataDir,n,{systemPrompt:R,tools:re},$(t))}catch(e){console.warn(`[AgentRuntime] failed to persist export snapshots for session ${n}:`,e.message)}let K=new Bt({initialState:{systemPrompt:R,model:ae,tools:re,messages:[],...t.llm.thinking?{thinkingLevel:t.llm.thinking}:{}},getApiKey:e=>t.llm.apiKey,streamFn:uh({})}),oe={eventDispatcher:s};a.signal=b;let se=new Rm;return a.toolParamOverrides=se,Im({agent:K,hookRegistry:i,hookContext:a,pluginRuntime:oe,overrideStore:se}),O.messages.length>0&&(K.state.messages=O.messages),W.length>0&&(K.state.messages=[...W,...K.state.messages]),{agent:K,resolvedModelId:G,historyMessages:O.messages,historyResult:O,contextManager:D,usageBaselineTranscriptEntryCount:w.length,workspaceDir:o.workspaceDir,processRegistry:j}}async function Oh(e){let t=await e.hookRegistry.dispatch(`context`,{messages:e.agent.state.messages},e.hookContext,e.pluginRuntime),n=e.agent.state.messages;for(let e of t)!e||!(`messages`in e)||!e.messages||(n=e.messages);n!==e.agent.state.messages&&(e.agent.state.messages=n)}async function kh(e){if((await m(e.dataDir,e.sessionId,{storeName:e.sessionStoreName})).length<=8)return e.systemPrompt;let t=`Older CRON execution records for this session are stored outside the main transcript at ${N(e.dataDir,e.sessionId,{storeName:e.sessionStoreName})}. The main transcript keeps only the latest 8 CRON summaries. Read that jsonl file explicitly if older CRON outcomes matter.`;return`${e.systemPrompt}\n\n${t}`}async function Ah(e){let{runParams:t,sessionId:n,historyResult:r,runContext:i,eventDispatcher:a,hookRegistry:o,hookContext:s,effectivePromptText:c}=e;for(let e of r.compactionEvents??[])e.type===`compaction`&&await a.dispatchDiagnostic(n,{level:`info`,scope:`session`,phase:`history_compaction`,message:e.reason,details:{layer:e.layer,strategy:e.strategy,estimatedTokensFreed:e.estimatedTokensFreed,affectedEntries:e.affectedEntries,snapshotVersion:e.snapshotVersion}});if(r.compactionEntry){let e=r.stats.originalCount-r.stats.keptCount,l=jh(await o.dispatch(`before_compaction`,{messageCount:r.stats.originalCount,compactingCount:e},s,{eventDispatcher:a})),u=l.injectRecall,d=!!l.pluginRecallProvided;if(t.memory?.core?.compactionRecall?.enabled===!0&&!d&&!i.compactionRecallState.recallProvided)try{let e=await Eh({provider:i.memoryProvider,query:c,coreConfig:t.memory.core});e&&(u=e,i.compactionRecallState={recallProvided:!0,source:`core`})}catch(e){await a.dispatchDiagnostic(n,{level:`warn`,scope:`memory`,phase:`core_compaction_recall_failed`,message:`core compaction recall failed`,details:{error:e instanceof Error?e.message:String(e)}}).catch(()=>{})}let f=u?{...r.compactionEntry,content:`${u.trim()}\n\n${r.compactionEntry.content}`}:r.compactionEntry;if(l.skipPersist){await a.dispatchDiagnostic(n,{level:`info`,scope:`session`,phase:`history_compaction`,message:`Compaction output was skipped by plugin hook`,details:{compactedCount:e,injectedRecall:!!l.injectRecall}});return}await i.appendTranscriptEntry(f),(r.compactionEvents?.length??0)===0&&await a.dispatchDiagnostic(n,{level:`info`,scope:`session`,phase:`history_compaction`,message:`Summarised ${e} older entries`,details:{strategy:`summary_only`,compactedCount:e}}),await o.dispatch(`after_compaction`,{messageCount:r.stats.originalCount,compactedCount:e},s,{eventDispatcher:a})}}function jh(e){let t=!1,n=[],r=!1;for(let i of e)if(i){if(i.skipPersist&&(t=!0),i.recall?.block?.trim()){n.push(i.recall.block.trim()),r=!0;continue}typeof i.injectRecall==`string`&&i.injectRecall.trim().length>0&&(n.push(i.injectRecall.trim()),r=!0)}return{skipPersist:t,injectRecall:n.length>0?n.join(`
159
+ `),a),blockId:`core-recall-${Date.now()}`,isWeakLocalRecall:i}}function Ch(e,t){return`${t.trim()}\n\n${e}`}function wh(e,t){let n=`${t.trim()}\n\n`;return e.startsWith(n)?e.slice(n.length):e}const Th=`<!-- AIMax compaction memory recall -->`;async function Eh(e){if(e.coreConfig?.compactionRecall?.enabled!==!0)return;let t=e.query.trim();if(t)try{let n=await Sh({provider:e.provider,query:t,coreConfig:{...e.coreConfig,recall:{...e.coreConfig.recall,enabled:!0,tokenBudget:e.coreConfig.compactionRecall?.tokenBudget??e.coreConfig.recall?.tokenBudget}}});return n.block?`${Th}\n\n${n.block.replace(`${Th}\n\n`,``).trim()}`:void 0}catch{return}}async function Dh(e){let{session:{runParams:t,sessionId:n,hookRegistry:i,hookContext:a,runContext:o,eventDispatcher:s},runtimeInputs:{contextFiles:c,bootstrapWarnings:l,skills:u,autoSkillCategories:d,effectivePromptText:f,pluginTools:p,pluginSkillDirs:m,skillsLoadPaths:h,presetSystemPrompt:g},dependencies:{registry:_,spawnFn:v,createModel:y,abortSignal:b}}=e,x=t.autoSkills?.load?.enabled===!0,S=t.agentPolicy?.activeAgent,C=t.channel===`CRON`,w=C?[]:await I(t.dataDir,n,$(t)),T={model:t.llm.model,api:t.llm.apiFormat??`openai-completions`},E=Vs(t.llm),D=await Au({dataDir:t.dataDir,sessionId:n,sessionStoreName:t.sessionStoreName,sessionPathScope:t.sessionPathScope}),O=C?{messages:[],priorSummary:void 0,compactionEntry:void 0,stats:{originalCount:0,keptCount:0,estimatedTokens:0,compacted:!1},compactionEvents:[]}:await ju({entries:w,modelInfo:T,contextWindowTokens:t.llm.contextWindow??2e5,llm:{apiFormat:t.llm.apiFormat,baseUrl:t.llm.baseUrl,apiKey:t.llm.apiKey,model:t.llm.model,flashModel:t.llm.flashModel},historyLimit:t.historyLimit,topicSegmentation:t.topicSegmentation,channel:t.channel,isSubagent:!!t.subagentContext,compactionEnabled:!0,pendingUserMessage:f,signal:b,hooks:i,hookCtx:a,contextManager:D,dataDir:t.dataDir,sessionId:n,entriesToMessagesOptions:E});await Ah({runParams:t,sessionId:n,historyResult:O,runContext:o,eventDispatcher:s,hookRegistry:i,hookContext:a,effectivePromptText:f});let k=t.subagentContext?.depth??0,A=r(t.dataDir,n,$(t)),j=Pn(),M=Ta([...em(t.dataDir,{sessionId:t.subagentContext?.parentSessionId??n,runtimeSessionId:n,currentSessionDir:A,registry:_,processRegistry:j,parentSessionId:n,depth:k,channel:t.channel,llm:t.llm,inheritedRunParams:{sessionStoreName:t.sessionStoreName,plugins:t.plugins,skillsLoadPaths:h,memory:t.memory,messaging:t.messaging,historyLimit:t.historyLimit,topicSegmentation:t.topicSegmentation,autoSkills:t.autoSkills,onProgress:t.onProgress,onLog:t.onLog,messageId:t.messageId,agentPolicy:t.agentPolicy,projectDir:t.projectDir,env:t.env},loopDetection:t.loopDetection,autoSkillsLoadEnabled:x,memoryOptions:{providerId:o.memoryProviderId,pluginId:o.memoryPluginId,sessionId:n,sessionStoreName:t.sessionStoreName,llm:{apiFormat:t.llm.apiFormat,baseUrl:t.llm.baseUrl,apiKey:t.llm.apiKey,model:t.llm.model},onMemoryChanged:async()=>{}},pluginSkillDirs:m,skillsLoadPaths:h,reportSkillUsed:async e=>{await s.dispatchProgress(n,e)},reportTaskUpdated:async e=>{await s.dispatchProgress(n,e)},contextManager:D,hitlResume:t.hitlResume,eventDispatcher:s,spawnFn:v,baseEnv:t.env}),...p],S),N=M.map(e=>typeof e.name==`string`?e.name.trim():``).filter(Boolean),P={};for(let e of M){let t=typeof e.name==`string`?e.name.trim():``,n=typeof e.description==`string`?e.description.trim():``;!t||!n||P[t]||(P[t]=n)}let F=t.messaging?.enabled??t.channel!==`CRON`,L=t.messaging?.channels&&t.messaging.channels.length>0?t.messaging.channels:[t.channel],R=Om({dataDir:t.dataDir,projectDir:t.projectDir,skills:wa(u,S),autoSkillCategories:x?d:[],contextFiles:c,toolNames:N,toolSummaries:P,promptMode:k>0?`minimal`:`full`,subagentDepth:k,bootstrapWarnings:l,memoryCitationsMode:t.memory?.citationsMode??`off`,messaging:{enabled:F,channels:L},sandboxInfo:{enabled:!0,hostWorkspaceDir:o.workspaceDir,containerWorkspaceDir:o.workspaceDir},runtimeInfo:{os:process.platform,node:process.version,model:t.llm.model,hostname:It.hostname()},currentDate:new Date().toISOString().split(`T`)[0],presetSystemPrompt:g,activeAgentSystemPrompt:S?.systemPrompt,availableAgents:t.subagentContext?[]:t.agentPolicy?.availableAgents??[],priorConversationSummary:O.priorSummary});R=await kh({systemPrompt:R,dataDir:t.dataDir,sessionId:n,sessionStoreName:t.sessionStoreName});let z,B=t.memory?.core,V=B?.recall?.enabled===!0,H=!!t.subagentContext,U=o.memoryProviderSource===`plugin`&&B?.recall?.forceWithPluginProvider!==!0;if(V&&!H&&!U&&!o.recallState.recallProvided)try{let e=await Sh({provider:o.memoryProvider,query:f,coreConfig:B}),t=B?.knowledgeController;if(t?.enabled===!0&&t?.searchMode===`fallback`&&(e.isWeakLocalRecall===!0||!e.block))try{let e=await(await import(`./kc-Omw-bmtO.js`)).runKcFallbackSearch({config:t,query:f});e.block&&(z&&(R=wh(R,z)),z=e.block,R=Ch(R,z),o.recallState={recallProvided:!0,source:`core`,blockId:e.blockId})}catch(e){await s.dispatchDiagnostic(n,{level:`warn`,scope:`memory`,phase:`core_kc_recall_failed`,message:`KC fallback recall failed`,details:{error:e instanceof Error?e.message:String(e)}}).catch(()=>{})}!o.recallState.recallProvided&&e.block&&(z=e.block,R=Ch(R,z),o.recallState={recallProvided:!0,source:`core`,blockId:e.blockId})}catch(e){await s.dispatchDiagnostic(n,{level:`warn`,scope:`memory`,phase:`core_recall_failed`,message:`core recall step failed`,details:{error:e instanceof Error?e.message:String(e)}}).catch(()=>{})}let ee={selectedTools:N,toolSnippets:[],promptGuidelines:[],contextFiles:c,skills:u,cwd:o.workspaceDir},te=await i.dispatch(`before_agent_start`,{prompt:f,systemPrompt:R,systemPromptOptions:ee,recallState:o.recallState},a,{eventDispatcher:s}),ne=await i.dispatchWithMetadata(`before_prompt_build`,{prompt:f,recallState:o.recallState},a,{eventDispatcher:s});ne.length>0&&console.warn(`[AgentRuntime] before_prompt_build hook(s) fired; this hook is deprecated in favor of before_agent_start. Migrate plugins to before_agent_start.`);let W=[];for(let e of te){if(!e)continue;let t=e;if(t.recall?.block?.trim()){z&&=(R=wh(R,z),void 0),R=Ch(R,t.recall.block.trim()),o.recallState={recallProvided:!0,source:`plugin`};continue}t.systemPrompt&&(R=t.systemPrompt),t.prependContext&&(R=`${t.prependContext}\n\n${R}`),t.message&&W.push(t.message)}for(let e of ne){if(!e.result)continue;let t=e.result;if(t.recall?.block?.trim()){z&&=(R=wh(R,z),void 0),R=Ch(R,t.recall.block.trim()),o.recallState={recallProvided:!0,source:`plugin`};continue}if(t.systemPrompt&&(R=t.systemPrompt),t.prependContext){if((e.pluginId===o.memoryPluginId||e.pluginId===o.memoryProviderId)&&o.recallState.recallProvided)continue;R=`${t.prependContext}\n\n${R}`,(e.pluginId===o.memoryPluginId||e.pluginId===o.memoryProviderId)&&(o.recallState={recallProvided:!0,source:`plugin`})}}await i.dispatch(`after_prompt_build`,{prompt:f,systemPrompt:R},a,{eventDispatcher:s});let re=oh(km(M,a,{eventDispatcher:s}),{sessionId:n,config:t.loopDetection},ch),G=S?.model??t.llm.model,ie=await i.dispatch(`before_model_resolve`,{prompt:f},a,{eventDispatcher:s});for(let e of ie)e&&e.modelOverride&&(G=e.modelOverride);let ae=y({...t.llm,model:G},n,t.messageId,t.channel);try{await Ns(t.dataDir,n,{systemPrompt:R,tools:re},$(t))}catch(e){console.warn(`[AgentRuntime] failed to persist export snapshots for session ${n}:`,e.message)}let K=new Bt({initialState:{systemPrompt:R,model:ae,tools:re,messages:[],...t.llm.thinking?{thinkingLevel:t.llm.thinking}:{}},getApiKey:e=>t.llm.apiKey,streamFn:uh({})}),oe={eventDispatcher:s};a.signal=b;let se=new Rm;return a.toolParamOverrides=se,Im({agent:K,hookRegistry:i,hookContext:a,pluginRuntime:oe,overrideStore:se}),O.messages.length>0&&(K.state.messages=O.messages),W.length>0&&(K.state.messages=[...W,...K.state.messages]),{agent:K,resolvedModelId:G,historyMessages:O.messages,historyResult:O,contextManager:D,usageBaselineTranscriptEntryCount:w.length,workspaceDir:o.workspaceDir,processRegistry:j}}async function Oh(e){let t=await e.hookRegistry.dispatch(`context`,{messages:e.agent.state.messages},e.hookContext,e.pluginRuntime),n=e.agent.state.messages;for(let e of t)!e||!(`messages`in e)||!e.messages||(n=e.messages);n!==e.agent.state.messages&&(e.agent.state.messages=n)}async function kh(e){if((await m(e.dataDir,e.sessionId,{storeName:e.sessionStoreName})).length<=8)return e.systemPrompt;let t=`Older CRON execution records for this session are stored outside the main transcript at ${N(e.dataDir,e.sessionId,{storeName:e.sessionStoreName})}. The main transcript keeps only the latest 8 CRON summaries. Read that jsonl file explicitly if older CRON outcomes matter.`;return`${e.systemPrompt}\n\n${t}`}async function Ah(e){let{runParams:t,sessionId:n,historyResult:r,runContext:i,eventDispatcher:a,hookRegistry:o,hookContext:s,effectivePromptText:c}=e;for(let e of r.compactionEvents??[])e.type===`compaction`&&await a.dispatchDiagnostic(n,{level:`info`,scope:`session`,phase:`history_compaction`,message:e.reason,details:{layer:e.layer,strategy:e.strategy,estimatedTokensFreed:e.estimatedTokensFreed,affectedEntries:e.affectedEntries,snapshotVersion:e.snapshotVersion}});if(r.compactionEntry){let e=r.stats.originalCount-r.stats.keptCount,l=jh(await o.dispatch(`before_compaction`,{messageCount:r.stats.originalCount,compactingCount:e},s,{eventDispatcher:a})),u=l.injectRecall,d=!!l.pluginRecallProvided;if(t.memory?.core?.compactionRecall?.enabled===!0&&!d&&!i.compactionRecallState.recallProvided)try{let e=await Eh({provider:i.memoryProvider,query:c,coreConfig:t.memory.core});e&&(u=e,i.compactionRecallState={recallProvided:!0,source:`core`})}catch(e){await a.dispatchDiagnostic(n,{level:`warn`,scope:`memory`,phase:`core_compaction_recall_failed`,message:`core compaction recall failed`,details:{error:e instanceof Error?e.message:String(e)}}).catch(()=>{})}let f=u?{...r.compactionEntry,content:`${u.trim()}\n\n${r.compactionEntry.content}`}:r.compactionEntry;if(l.skipPersist){await a.dispatchDiagnostic(n,{level:`info`,scope:`session`,phase:`history_compaction`,message:`Compaction output was skipped by plugin hook`,details:{compactedCount:e,injectedRecall:!!l.injectRecall}});return}await i.appendTranscriptEntry(f),(r.compactionEvents?.length??0)===0&&await a.dispatchDiagnostic(n,{level:`info`,scope:`session`,phase:`history_compaction`,message:`Summarised ${e} older entries`,details:{strategy:`summary_only`,compactedCount:e}}),await o.dispatch(`after_compaction`,{messageCount:r.stats.originalCount,compactedCount:e},s,{eventDispatcher:a})}}function jh(e){let t=!1,n=[],r=!1;for(let i of e)if(i){if(i.skipPersist&&(t=!0),i.recall?.block?.trim()){n.push(i.recall.block.trim()),r=!0;continue}typeof i.injectRecall==`string`&&i.injectRecall.trim().length>0&&(n.push(i.injectRecall.trim()),r=!0)}return{skipPersist:t,injectRecall:n.length>0?n.join(`
160
160
 
161
161
  `):void 0,pluginRecallProvided:r}}function Mh(e){return e.some(e=>Fh(e.message)!==null||e.toolResults.length>0)}function Nh(e,t){return{role:`assistant`,content:e,stopReason:(t&&typeof t==`object`?t.code:void 0)===`aborted`||e===`aborted`?`aborted`:`error`,errorMessage:e,timestamp:new Date().toISOString()}}function Ph(e,t){for(let n=e.length-1;n>=0;n--){let r=e[n];for(let e=r.toolResults.length-1;e>=0;e--){let n=r.toolResults[e];if(n.toolName===t&&n.content.trim().length>0)return n.content}}return``}function Fh(e){let t=Vh(e),n=Ih(e),r=e.content.filter(e=>e.type===`toolCall`).map(e=>({id:e.id,name:e.name,arguments:e.arguments}));if(t.trim().length===0&&r.length===0)return null;let i={role:`assistant`,content:t,timestamp:new Date().toISOString()};return n.trim().length>0&&(i.thinking=n),r.length>0&&(i.toolCalls=r),i}function Ih(e){return e.content.filter(e=>e.type===`thinking`&&typeof e.thinking==`string`).map(e=>e.thinking).join(``)}function Lh(e){return e.map(e=>Ih(e.message)).filter(e=>e.trim().length>0).join(`
162
162
 
@@ -186,10 +186,10 @@ 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?Ce({...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(`
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
- `);_={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{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":`---
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":`---
193
193
  title: "AGENTS.md Template"
194
194
  summary: ".aimax template for AGENTS.md"
195
195
  read_when:
@@ -15,7 +15,8 @@ type AgentLogEntry = {
15
15
  level: AgentLogLevel;
16
16
  message: string;
17
17
  context?: LogContext;
18
- formatted: string;
18
+ formatted: string; /** Concrete run log directory selected by the current root or nested session. */
19
+ logDir?: string;
19
20
  };
20
21
  type OnLogCallback = (entry: AgentLogEntry) => void;
21
22
  //#endregion
@@ -1053,7 +1054,11 @@ type AgentRunParamsBase = {
1053
1054
  */
1054
1055
  thinking?: ThinkingLevel;
1055
1056
  }; /** In-process progress callback */
1056
- onProgress?: (event: AgentProgressEvent) => Promise<void>; /** Intercept agent log output; when set, logs are routed to this callback instead of process.stderr. File logging (log4js) is unaffected. */
1057
+ onProgress?: (event: AgentProgressEvent) => Promise<void>;
1058
+ /**
1059
+ * Delegates agent log persistence to the embedding caller. When set, agents
1060
+ * does not configure or close its file logger for this run.
1061
+ */
1057
1062
  onLog?: OnLogCallback; /** Execution timeout in milliseconds; omitted means no agent-loop timeout */
1058
1063
  timeoutMs?: number; /** Present when this run is itself a subagent; controls depth limits */
1059
1064
  subagentContext?: SubagentContext; /** AbortSignal to cancel this run from outside (used by parent kill) */
@@ -1,4 +1,4 @@
1
- import { C as TranscriptEntry, Hn as PluginHookRegistry, i as preloadExtensions, ln as RunEventDispatcher, mn as PluginHookAgentContext, n as discoverPiExtensions, o as PluginToolRegistry, r as getExtensions, t as DiscoveredPiExtension } from "../loader-CGp_n4m8.js";
1
+ import { C as TranscriptEntry, Hn as PluginHookRegistry, i as preloadExtensions, ln as RunEventDispatcher, mn as PluginHookAgentContext, n as discoverPiExtensions, o as PluginToolRegistry, r as getExtensions, t as DiscoveredPiExtension } from "../loader-Cf-Eh3Kg.js";
2
2
  import { Agent, AgentTool } from "@earendil-works/pi-agent-core";
3
3
 
4
4
  //#region src/pi-extensions/tool-adapter.d.ts
@@ -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};
@@ -1,4 +1,4 @@
1
- import { $t as PluginManifestRegistry, Bn as PluginHookName, Hn as PluginHookRegistry, Pn as PluginHookHandlerMap, Yt as PluginsConfig, c as PluginUiToolOptions, cn as PluginOrigin, ir as MemoryProviderFactory, it as LlmApiFormat, mn as PluginHookAgentContext, o as PluginToolRegistry, qt as NormalizedPluginsConfig, rn as PluginDiagnostic, s as PluginUiToolDescriptor, t as DiscoveredPiExtension } from "./loader-CGp_n4m8.js";
1
+ import { $t as PluginManifestRegistry, Bn as PluginHookName, Hn as PluginHookRegistry, Pn as PluginHookHandlerMap, Yt as PluginsConfig, c as PluginUiToolOptions, cn as PluginOrigin, ir as MemoryProviderFactory, it as LlmApiFormat, mn as PluginHookAgentContext, o as PluginToolRegistry, qt as NormalizedPluginsConfig, rn as PluginDiagnostic, s as PluginUiToolDescriptor, t as DiscoveredPiExtension } from "./loader-Cf-Eh3Kg.js";
2
2
  import { AgentProgressEvent } from "@gencode/shared";
3
3
 
4
4
  //#region src/plugins/runtime.d.ts
@@ -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
@@ -1,2 +1,2 @@
1
- import { n as SystemWarmState, r as prepareSystemRuntime, t as PrepareSystemRuntimeOptions } from "./system-runtime-Bop42Cc_.js";
1
+ import { n as SystemWarmState, r as prepareSystemRuntime, t as PrepareSystemRuntimeOptions } from "./system-runtime-CEaCYWXK.js";
2
2
  export { PrepareSystemRuntimeOptions, SystemWarmState, prepareSystemRuntime };
@@ -1 +1 @@
1
- import{t as e}from"./system-runtime-g4RJ5wzA.js";import"./provider-registry-DPbmbWqS.js";import"./loader-CkdBGDtW.js";export{e as prepareSystemRuntime};
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,6 +1,6 @@
1
1
  {
2
2
  "name": "@gencode/agents",
3
- "version": "0.16.2",
3
+ "version": "0.16.4",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -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: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 b={apiFormat:`openai-completions`,createModel:ee,buildRequest:te,normalizeResponse:ne};function ee(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 te(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 ne(e){let t=e;return{text:t.choices?.[0]?.message?.content??t.choices?.[0]?.text??``,usage:m(t.usage),raw:e}}const re={"openai-completions":b,"anthropic-messages":h};function ie(e){return re[e]}const ae=new o;async function oe(e,t){return await ae.run(e,t)}function se(e){return{async emit(t){let n=ae.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 ce={before_prompt_build:`before_agent_start`,after_tool_call:`tool_result (for mutable results) or before_tool_call (for blocking)`},le=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 ue=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`}},de=class{hooks=new Map;deprecatedWarned=new Set;blockingTimeoutMs;bestEffortTimeoutMs;constructor(e={}){this.blockingTimeoutMs=fe(e.blockingTimeoutMs,1e4),this.bestEffortTimeoutMs=fe(e.bestEffortTimeoutMs,3e3)}register(e){let t=ce[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=pe(n),c=async()=>await s.handler(t,i.ctx);try{let t=await me(r?oe({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 he({runtime:r,ctx:n,hookName:e,entry:s,policy:o,error:t})}}return a}getDispatchPolicy(e){return le.has(e)?{mode:`blocking`,timeoutMs:this.blockingTimeoutMs}:{mode:`bestEffort`,timeoutMs:this.bestEffortTimeoutMs}}};function fe(e,t){return typeof e==`number`&&Number.isFinite(e)&&e>0?e:t}function pe(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 me(e,t){let n;try{return await Promise.race([e,new Promise((e,r)=>{n=setTimeout(()=>{t.abort(),r(new ue(t.hookName,t.pluginId,t.timeoutMs))},t.timeoutMs),n.unref?.()})])}finally{n&&clearTimeout(n)}}async function he(e){if(!e.runtime||!e.ctx.sessionId)return;let t=e.error instanceof ue;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 ge(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 _e(e=new Date){let t=ge(e),n=String(e.getMilliseconds()).padStart(3,`0`);return`${t.year}-${t.month}-${t.day} ${t.hour}:${t.minute}:${t.second}.${n}`}let x=function(e){return e.INFO=`INFO`,e.WARN=`WARN`,e.ERROR=`ERROR`,e}({});const S=new o;function ve(e,t){return S.run(e,t)}let C=null,w=!1,T=[];function ye(){return _e()}function be(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 xe(e){return i.join(e,`.aimax`)}function Se(e){let t=e?.trim();return t&&t.replace(/[^A-Za-z0-9_.-]/g,`_`)||`no-message-${process.pid}`}function Ce(e,t){let n=t?.sessionStoreName?.trim()||`sessions`,r=Se(t?.messageId);return t?.sessionDir?{runLogId:r,logDir:i.join(t.sessionDir,`logs`,r)}:t?.sessionId?{runLogId:r,logDir:i.join(xe(e),n,t.sessionId,`logs`,r)}:{runLogId:r,logDir:i.join(xe(e),`logs`,r)}}function we(e){return{appLogPath:i.join(e,`app.log`),errorLogPath:i.join(e,`errors.log`)}}function E(e){let{appLogPath:t,errorLogPath:n}=we(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 D(e,t,n){return`[${ye()}] [${e}] ${t}${be(n)}`}function Te(e,t,n){let r=S.getStore();if(r){r({level:e,message:t,context:n,formatted:D(e,t,n)});return}try{process.stderr.write(`${D(e,t,n)}\n`)}catch{}}function O(e,t,n){if(!C){T.push({level:e,message:t,context:n}),T.length>200&&(T=T.slice(-200)),Te(e,t,n);return}w||=(E(C.logDir),!0);let r=D(e,t,n),i=c.getLogger();e===x.ERROR?i.error(r):e===x.WARN?i.warn(r):i.info(r);let a=S.getStore();a&&a({level:e,message:t,context:n,formatted:r})}function Ee(e,t){let{logDir:n,runLogId:r}=Ce(e,t);if(w&&C?.dataDir===e&&C.runLogId===r&&C.logDir===n)return;s.mkdirSync(n,{recursive:!0}),E(n),w=!0,C={dataDir:e,logDir:n,runLogId:r};let i=T;T=[];for(let e of i)O(e.level,e.message,e.context)}async function De(){await c.shutdown(),w=!1}const k={info:(e,t)=>O(x.INFO,e,t),warn:(e,t)=>O(x.WARN,e,t),error:(e,t)=>O(x.ERROR,e,t)};function Oe(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 A=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 ke(e){return{async chat(t){let n=je(t),r=t.model??e.defaultModel;if(!r)throw Error(`LLM model is required`);await Ne(e.hooks,`llm_input`,{sessionId:e.hookCtx?.sessionId??`unknown`,model:r,prompt:Me(n),historyMessages:n},e.hookCtx);let i=ie(f(e.apiFormat)),a=i.buildRequest(e,r,n,t),{signal:o,clear:s,didTimeout:c}=Pe(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 Ie(e,c())}if(!t.ok){let e=await Fe(t)||void 0,n=t.statusText?.trim()||void 0,r=[t.status,n].filter(Boolean).join(` `);throw new A({message:e?`LLM upstream returned HTTP ${r}: ${e}`:`LLM upstream returned HTTP ${r}`,code:`http_error`,statusCode:t.status,statusText:n,providerMessage:e,retryable:Le(t.status)})}let n=Date.now(),s;try{s=await t.json()}catch(e){throw Ae(e,c())}let{text:l,usage:u}=i.normalizeResponse(s),d=Math.max(0,Date.now()-n);return await Ne(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 Ae(e,t){return j(e)&&t?new A({message:`LLM request timed out`,code:`timeout`,retryable:!0,cause:e}):j(e)?new A({message:`LLM request was aborted`,code:`aborted`,retryable:!0,cause:e}):new A({message:`LLM upstream returned an invalid JSON response`,code:`invalid_response`,retryable:!1,cause:e})}function je(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 Me(e){return e.map(e=>`${e.role}: ${e.content}`).join(`
4
- `)}async function Ne(e,t,n,r){!e||!r||await e.dispatch(t,n,r)}function Pe(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 Fe(e){try{let t=await e.text();return t?t.trim().slice(0,200):``}catch{return``}}function Ie(e,t){return e instanceof A?e:j(e)?t?new A({message:`LLM request timed out`,code:`timeout`,retryable:!0,cause:e}):e:new A({message:`LLM network request failed: ${e instanceof Error?e.message:String(e)}`,code:`network_error`,retryable:!0,cause:e})}function j(e){return e instanceof Error&&e.name===`AbortError`}function Le(e){return e===408||e===409||e===425||e===429||e>=500}var M=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 Re(e){return!!(e instanceof M||typeof e==`object`&&e&&`isUiToolPause`in e&&e.isUiToolPause===!0)}const N=new o;function ze(){return{}}async function Be(e,t){return await N.run(e,t)}function Ve(e){let t=N.getStore();!t||t.signal||(t.signal=e)}const P=l.Object({reason:l.String({description:`A brief explanation of why user input is needed through this UI form.`})});function F(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??P,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 M(e,a,t,e,s,c,n);throw Ve(i),i}}}const I=Symbol(`pluginToolOwner`);var L=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=F({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 He(e){return e[I]}function R(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function z(e){return Array.isArray(e)?e.map(e=>typeof e==`string`?e.trim():``).filter(Boolean):[]}function B(){let e=a.homedir();if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function Ue(e){let t=e.trim(),n=B();return t===`~`?n:t.startsWith(`~/`)||t.startsWith(`~\\`)?n?i.join(n,t.slice(2)):void 0:i.resolve(t)}const We=new u({allErrors:!0,strict:!1}),Ge=new Map;function Ke(e,t){let n=Ge.get(t);if(n)return n;let r=We.compile(e);return Ge.set(t,r),r}function qe(e){let t=e.cacheKey??JSON.stringify(e.schema),n=Ke(e.schema,t);return n(e.value)?{ok:!0}:{ok:!1,errors:(n.errors??[]).map(e=>({path:e.instancePath||`/`,message:e.message??`invalid`}))}}function Je(e){let t=z(e?.allow),n=z(e?.deny),r=z(e?.load?.paths),i=z(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 Ye(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=qe({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 V(e){try{return s.realpathSync(e)}catch{return null}}function Xe(e){try{return s.statSync(e)}catch{return null}}function H(e,t){let n=i.relative(e,t);return n===``?!0:n.startsWith(`..`)?!1:!i.isAbsolute(n)}function Ze(e){return`0o${e.toString(8).padStart(3,`0`)}`}const U=new Set([`.ts`,`.js`,`.mts`,`.cts`,`.mjs`,`.cjs`]),Qe=[`index.js`,`index.mjs`,`index.cjs`,`index.ts`,`index.mts`,`index.cts`];function $e(e){let t=i.join(e,`package.json`);if(s.existsSync(t))try{let e=JSON.parse(s.readFileSync(t,`utf-8`));return R(e)?e:void 0}catch{return}}function et(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 tt(e){return e===void 0?process.platform===`win32`||typeof process.getuid!=`function`?null:process.getuid():e}function nt(e){let t=V(e.source),n=V(e.rootDir);return!t||!n||H(n,t)?null:{reason:`source_escapes_root`,sourcePath:e.source,rootPath:e.rootDir,targetPath:e.source,sourceRealPath:t,rootRealPath:n}}function rt(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=Xe(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 it(e){return nt({source:e.source,rootDir:e.rootDir})||rt({source:e.source,rootDir:e.rootDir,origin:e.origin,uid:tt(e.ownershipUid)})}function at(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=${Ze(e.modeBits??0)})`:`blocked plugin candidate: suspicious ownership (${e.targetPath}, uid=${e.foundUid}, expected uid=${e.expectedUid} or root)`}function W(e){let t=it({source:e.source,rootDir:e.rootDir,origin:e.origin,ownershipUid:e.ownershipUid});return t?(e.diagnostics.push({level:`warn`,message:at(t),source:e.source}),!0):!1}function G(e){return i.basename(e,i.extname(e))}function K(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 ot(e){for(let t of Qe){let n=i.join(e,t);if(s.existsSync(n))return n}return null}function q(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(!U.has(i.extname(n.name)))continue;let r=i.dirname(t);if(W({source:t,rootDir:r,origin:e.origin,diagnostics:e.diagnostics,ownershipUid:e.ownershipUid}))continue;e.candidates.push(K({idHint:G(t),source:t,rootDir:r,origin:e.origin,workspaceDir:e.workspaceDir}));continue}if(!n.isDirectory())continue;let r=$e(t),a=et(r);if(a.status===`ok`){for(let n of a.entries){let a=i.resolve(t,n);if(!H(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(!U.has(i.extname(a))){e.diagnostics.push({level:`warn`,message:`plugin entry not a supported extension: ${a}`,source:a});continue}if(W({source:a,rootDir:t,origin:e.origin,diagnostics:e.diagnostics,ownershipUid:e.ownershipUid}))continue;let o=r?.name?.trim(),c=o?`${o}/${G(a)}`:G(a);e.candidates.push(K({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=ot(t);o&&(W({source:o,rootDir:t,origin:e.origin,diagnostics:e.diagnostics,ownershipUid:e.ownershipUid})||e.candidates.push(K({idHint:i.basename(t),source:o,rootDir:t,origin:e.origin,workspaceDir:e.workspaceDir})))}}function st(e){return e?e.map(Ue).filter(e=>typeof e==`string`&&e.length>0):[]}function ct(){let e=B();if(e)return i.join(e,`.aimax`,`extensions`)}function lt(e){return i.join(e,`.aimax`,`extensions`)}function ut(e){return i.join(e,`.aimax`,`extensions`)}function dt(e={}){let t=[],n=[],r=st(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=Xe(a);if(!r){n.push({level:`warn`,message:`plugin path not readable: ${a}`,source:a});continue}if(r.isFile()){if(!U.has(i.extname(a))){n.push({level:`warn`,message:`plugin file has unsupported extension: ${a}`,source:a});continue}let r=i.dirname(a);if(W({source:a,rootDir:r,origin:`config`,diagnostics:n,ownershipUid:e.ownershipUid}))continue;t.push(K({idHint:G(a),source:a,rootDir:r,origin:`config`,workspaceDir:e.workspaceDir}));continue}r.isDirectory()&&q({rootDir:a,origin:`config`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid})}e.dataDir?q({rootDir:lt(e.dataDir),origin:`workspace`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid}):e.workspaceDir&&q({rootDir:ut(e.workspaceDir),origin:`workspace`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid});let a=ct();return a?q({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&&q({rootDir:e.bundledDir,origin:`bundled`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid}),{candidates:t,diagnostics:n}}function ft(e){let t=e.rejectHardlinks??!0,n=V(e.rootPath),r=V(e.absolutePath);if(!n||!r)return{ok:!1,reason:`path`};if(!H(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 J=`aimax.plugin.json`,pt=[J];function mt(e){for(let t of pt){let n=i.join(e,t);if(s.existsSync(n))return n}return i.join(e,J)}function ht(e,t=!0){let n=mt(e),r=ft({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(!R(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=R(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=z(i.skills),p;return R(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 gt(e){let t=new Map,n=[];for(let r of e){let e=ht(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 Y=function(e){return e.INFO=`INFO`,e.WARN=`WARN`,e.ERROR=`ERROR`,e}({});function X(e,t,n,r){let i=`[plugin:${t}][logger:${n}] ${r}`;if(e===Y.ERROR){k.error(i);return}if(e===Y.WARN){k.warn(i);return}k.info(i)}function _t(e){return{version:`0.1.0`,logging:{getLogger:t=>({info:n=>X(Y.INFO,e.pluginId,t,n),warn:n=>X(Y.WARN,e.pluginId,t,n),error:n=>X(Y.ERROR,e.pluginId,t,n)})},session:{env:Object.freeze({...e.env??{}})}}}let vt;function yt(){return vt||=d(import.meta.url,{interopDefault:!0,requireCache:!0}),vt}function bt(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 xt(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 St(n){let r=[...n.registry.diagnostics],a=new L,o=new de,s=[],c=[],l=n.runtime?.llm?ke({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=Ct(n.runtime?.llmAllowlist),d=yt();for(let f of n.registry.manifests.values()){let p=bt({config:n.plugins,pluginId:f.id,origin:f.origin,kind:f.manifest.kind}),m=xt({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 y=_t({pluginId:f.id,env:n.runtime?.env}),b=n.plugins.entries[f.id]?.config,ee={id:f.id,source:f.source,rootDir:f.rootDir,config:b,runtime:y,llm:{chat:async e=>{if(!l)throw Error(`LLM client is not configured`);if(!wt(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:b,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:b,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:()=>se(f.id)};try{v(ee)}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 Ct(e){return(e??[]).map(e=>e.trim()).filter(Boolean)}function wt(e,t,n){return n.length===0?!1:n.includes(e)?!0:t.namesForPlugin(e).some(e=>n.includes(e))}let Z=null,Q=null;function Tt(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 Et(e){let t=Tt(e);return Z&&Q===t?Z:(Z=$(e),Q=t,Z)}function Dt(e){return Z&&Q===Tt(e)?Z:$(e)}function $(e={}){let t=Je(e.config),n=dt({dataDir:e.dataDir,workspaceDir:e.workspaceDir,extraPaths:t.loadPaths,bundledDir:e.bundledDir,ownershipUid:e.ownershipUid}),r=gt(n.candidates),i=Ye({config:t,registry:r}),a=St({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 Ot(e,t){return Array.from(new Set([...t?.piExtensionPaths??[],...e.piExtensionPaths]))}async function kt(e,t){let r=Ot(e,t);return r.length===0?[]:n(r)}function At(e={}){return{runtimeInitialized:!0,pluginSystem:Et({bundledDir:e.bundledDir,config:e.config,ownershipUid:e.ownershipUid,piExtensionPaths:e.piExtensionPaths}),loadedAt:new Date().toISOString(),version:1}}export{Oe as A,M as C,k as D,ke as E,ie as F,f as I,de as M,se as N,Ee as O,oe as P,Be as S,A as T,L as _,Et as a,P as b,_t as c,pt as d,ht as f,Ye as g,Je as h,$ as i,ve as j,De as k,gt as l,dt as m,kt as n,Ot as o,mt as p,Dt as r,St as s,At as t,J as u,He as v,Re as w,ze as x,F as y};