@gencode/agents 0.0.20 → 0.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +222 -8
- package/dist/index.js +57 -55
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { S as AgentsConfig, _ as saveAgentsConfig, a as listAgents, b as AgentConfig, c as normalizeAgentId, d as resolveAgentDir, f as resolveAgentIdByBinding, g as resolveModelString, h as resolveModelFallbacks, i as getAgentConfig, l as removeAgent, m as resolveDefaultAgentId, n as addBinding, o as listBindings, p as resolveAgentsConfigPath, s as loadAgentsConfig, t as addAgent, u as removeBindings, v as updateAgentIdentity, x as AgentModelConfig, y as AgentBinding } from "./index-pXTy2jgd.js";
|
|
2
2
|
import { AssistantMessage, Message } from "@mariozechner/pi-ai";
|
|
3
3
|
import { AgentMessage, AgentTool } from "@mariozechner/pi-agent-core";
|
|
4
|
-
import
|
|
4
|
+
import * as _gencode_shared0 from "@gencode/shared";
|
|
5
|
+
import { AgentCustomProgressEvent, AgentProgressEvent, AgentProgressEvent as AgentProgressEvent$1, CallbackEventPayload, CallbackEventPayload as CallbackEventPayload$1, Channel, Channel as Channel$1, CollapseSpan, HitlCheckpoint, HitlCheckpoint as HitlCheckpoint$1, HitlHistoryEntry, HitlRequest, HitlRequest as HitlRequest$1, HitlResolution, HitlResolution as HitlResolution$1, HitlStatus, HitlToolContext, HitlToolContext as HitlToolContext$1, PausedRunState, PausedRunState as PausedRunState$1, ReadStateRecord, RunResultPayload, RunResultPayload as RunResultPayload$1, SessionContextSnapshot, SessionMemorySnapshot, SnipRecord, ToolResultReference } from "@gencode/shared";
|
|
5
6
|
|
|
6
7
|
//#region src/loop-detection/tool-loop-detection.d.ts
|
|
7
8
|
type ToolLoopDetectionConfig = {
|
|
@@ -142,7 +143,13 @@ type AgentRunParamsBase = {
|
|
|
142
143
|
onProgress?: (event: AgentProgressEvent$1) => Promise<void>; /** Execution timeout in milliseconds; defaults to 600000 (10 min) */
|
|
143
144
|
timeoutMs?: number; /** Present when this run is itself a subagent; controls depth limits */
|
|
144
145
|
subagentContext?: SubagentContext; /** AbortSignal to cancel this run from outside (used by parent kill) */
|
|
145
|
-
abortSignal?: AbortSignal; /**
|
|
146
|
+
abortSignal?: AbortSignal; /** Structured HITL resume state injected by CLI resume path. */
|
|
147
|
+
hitlResume?: {
|
|
148
|
+
request: HitlRequest;
|
|
149
|
+
resolution: HitlResolution;
|
|
150
|
+
checkpoint: HitlCheckpoint;
|
|
151
|
+
toolContext?: HitlToolContext$1;
|
|
152
|
+
}; /** Tool-loop detection guardrails (disabled by default) */
|
|
146
153
|
loopDetection?: ToolLoopDetectionConfig; /** Plugin system options (optional) */
|
|
147
154
|
plugins?: {
|
|
148
155
|
/** Plugin config structure (allow/deny/entries/slots/load.paths) */config?: PluginsConfig; /** Data dir used to resolve .aimax extensions */
|
|
@@ -184,7 +191,12 @@ type AgentRunParams = AgentRunParamsBase & ({
|
|
|
184
191
|
});
|
|
185
192
|
/** Final result returned after agent execution completes */
|
|
186
193
|
type AgentRunResult = RunResultPayload$1 & {
|
|
187
|
-
sessionId: string;
|
|
194
|
+
sessionId: string; /** Present when the run was paused for HITL. */
|
|
195
|
+
paused?: {
|
|
196
|
+
requestId: string;
|
|
197
|
+
kind: _gencode_shared0.HitlKind;
|
|
198
|
+
title: string;
|
|
199
|
+
};
|
|
188
200
|
};
|
|
189
201
|
/** HTTP callback body formats */
|
|
190
202
|
type CallbackPayload = CallbackEventPayload$1;
|
|
@@ -620,6 +632,11 @@ type PluginHookAgentContext = {
|
|
|
620
632
|
workspaceDir?: string;
|
|
621
633
|
channel?: AgentRunParams["channel"];
|
|
622
634
|
};
|
|
635
|
+
type PluginExecutionRuntime = {
|
|
636
|
+
eventDispatcher: {
|
|
637
|
+
dispatchProgress: (sessionId: string, event: AgentProgressEvent$1) => Promise<void>;
|
|
638
|
+
};
|
|
639
|
+
};
|
|
623
640
|
type PluginHookBeforeModelResolveEvent = {
|
|
624
641
|
prompt: string;
|
|
625
642
|
};
|
|
@@ -740,7 +757,7 @@ type PluginHookRegistration<K extends PluginHookName = PluginHookName> = {
|
|
|
740
757
|
declare class PluginHookRegistry {
|
|
741
758
|
private readonly hooks;
|
|
742
759
|
register<K extends PluginHookName>(registration: PluginHookRegistration<K>): void;
|
|
743
|
-
dispatch<K extends PluginHookName>(hookName: K, event: Parameters<PluginHookHandlerMap[K]>[0], ctx: Parameters<PluginHookHandlerMap[K]>[1]): Promise<Array<Awaited<ReturnType<PluginHookHandlerMap[K]>>>>;
|
|
760
|
+
dispatch<K extends PluginHookName>(hookName: K, event: Parameters<PluginHookHandlerMap[K]>[0], ctx: Parameters<PluginHookHandlerMap[K]>[1], runtime?: PluginExecutionRuntime): Promise<Array<Awaited<ReturnType<PluginHookHandlerMap[K]>>>>;
|
|
744
761
|
}
|
|
745
762
|
//#endregion
|
|
746
763
|
//#region src/context/session-context-store.d.ts
|
|
@@ -1250,6 +1267,30 @@ type UnionLast<U> = UnionToIntersect<U extends unknown ? (x: U) => 0 : never> ex
|
|
|
1250
1267
|
type UnionToTuple<U, Acc extends unknown[] = [], R = UnionLast<U>> = [U] extends [never] ? Acc : UnionToTuple<Exclude<U, R>, [Extract<U, R>, ...Acc]>;
|
|
1251
1268
|
type Assert<T, E> = T extends E ? T : never;
|
|
1252
1269
|
type Evaluate<T> = T extends infer O ? { [K in keyof O]: O[K] } : never;
|
|
1270
|
+
type Ensure<T> = T extends infer U ? U : never;
|
|
1271
|
+
//#endregion
|
|
1272
|
+
//#region ../../node_modules/.pnpm/@sinclair+typebox@0.34.48/node_modules/@sinclair/typebox/build/cjs/type/array/array.d.ts
|
|
1273
|
+
interface ArrayOptions extends SchemaOptions {
|
|
1274
|
+
/** The minimum number of items in this array */
|
|
1275
|
+
minItems?: number;
|
|
1276
|
+
/** The maximum number of items in this array */
|
|
1277
|
+
maxItems?: number;
|
|
1278
|
+
/** Should this schema contain unique items */
|
|
1279
|
+
uniqueItems?: boolean;
|
|
1280
|
+
/** A schema for which some elements should match */
|
|
1281
|
+
contains?: TSchema;
|
|
1282
|
+
/** A minimum number of contains schema matches */
|
|
1283
|
+
minContains?: number;
|
|
1284
|
+
/** A maximum number of contains schema matches */
|
|
1285
|
+
maxContains?: number;
|
|
1286
|
+
}
|
|
1287
|
+
type ArrayStatic<T extends TSchema, P extends unknown[]> = Ensure<Static<T, P>[]>;
|
|
1288
|
+
interface TArray<T extends TSchema = TSchema> extends TSchema, ArrayOptions {
|
|
1289
|
+
[Kind]: 'Array';
|
|
1290
|
+
static: ArrayStatic<T, this['params']>;
|
|
1291
|
+
type: 'array';
|
|
1292
|
+
items: T;
|
|
1293
|
+
}
|
|
1253
1294
|
//#endregion
|
|
1254
1295
|
//#region ../../node_modules/.pnpm/@sinclair+typebox@0.34.48/node_modules/@sinclair/typebox/build/cjs/type/schema/schema.d.ts
|
|
1255
1296
|
interface SchemaOptions {
|
|
@@ -1389,10 +1430,12 @@ declare const execSchema: TObject<{
|
|
|
1389
1430
|
background: TOptional<TBoolean>;
|
|
1390
1431
|
}>;
|
|
1391
1432
|
type ExecToolOptions = {
|
|
1433
|
+
sessionId?: string;
|
|
1392
1434
|
workspaceDir: string;
|
|
1393
1435
|
registry: ProcessRegistry;
|
|
1394
1436
|
scopeKey?: string;
|
|
1395
1437
|
contextManager?: ContextManager;
|
|
1438
|
+
hitlResume?: AgentRunParams["hitlResume"];
|
|
1396
1439
|
};
|
|
1397
1440
|
declare function createExecTool(options: ExecToolOptions): AgentTool<typeof execSchema, Record<string, unknown>>;
|
|
1398
1441
|
//#endregion
|
|
@@ -1464,7 +1507,11 @@ type ApplyPatchDetails = {
|
|
|
1464
1507
|
declare const applyPatchSchema: TObject<{
|
|
1465
1508
|
input: TString;
|
|
1466
1509
|
}>;
|
|
1467
|
-
|
|
1510
|
+
type ApplyPatchToolOptions = {
|
|
1511
|
+
sessionId?: string;
|
|
1512
|
+
hitlResume?: AgentRunParams["hitlResume"];
|
|
1513
|
+
};
|
|
1514
|
+
declare function createApplyPatchTool(workspaceDir: string, options?: ApplyPatchToolOptions): AgentTool<typeof applyPatchSchema, ApplyPatchDetails>;
|
|
1468
1515
|
//#endregion
|
|
1469
1516
|
//#region src/tools/image.d.ts
|
|
1470
1517
|
declare const imageSchema: TObject<{
|
|
@@ -1545,9 +1592,62 @@ type SubagentsResult = {
|
|
|
1545
1592
|
*/
|
|
1546
1593
|
declare function createSubagentsTool(registry: SubagentRegistry, parentSessionId: string): AgentTool<typeof subagentsSchema, SubagentsResult>;
|
|
1547
1594
|
//#endregion
|
|
1595
|
+
//#region src/tools/clarify.d.ts
|
|
1596
|
+
declare const clarifySchema: TObject<{
|
|
1597
|
+
question: TString;
|
|
1598
|
+
options: TOptional<TArray<TString>>;
|
|
1599
|
+
allow_free_text: TOptional<TBoolean>;
|
|
1600
|
+
}>;
|
|
1601
|
+
type ClarifyResult = {
|
|
1602
|
+
paused: true;
|
|
1603
|
+
};
|
|
1604
|
+
/**
|
|
1605
|
+
* Creates the `clarify` tool that the agent can call to ask the user a question.
|
|
1606
|
+
*
|
|
1607
|
+
* @param sessionId - Current session ID for the HITL request.
|
|
1608
|
+
* @param turnId - Current turn ID for checkpoint tracking.
|
|
1609
|
+
*/
|
|
1610
|
+
declare function createClarifyTool(sessionId: string): AgentTool<typeof clarifySchema, ClarifyResult>;
|
|
1611
|
+
//#endregion
|
|
1612
|
+
//#region src/tools/request-approval.d.ts
|
|
1613
|
+
declare const approvalSchema: TObject<{
|
|
1614
|
+
action: TString;
|
|
1615
|
+
reason: TString;
|
|
1616
|
+
details: TOptional<TString>;
|
|
1617
|
+
}>;
|
|
1618
|
+
type ApprovalResult = {
|
|
1619
|
+
paused: true;
|
|
1620
|
+
};
|
|
1621
|
+
/**
|
|
1622
|
+
* Creates the `request_approval` tool.
|
|
1623
|
+
*
|
|
1624
|
+
* @param sessionId - Current session ID.
|
|
1625
|
+
* @param turnId - Current turn ID for checkpoint tracking.
|
|
1626
|
+
*/
|
|
1627
|
+
declare function createRequestApprovalTool(sessionId: string, hitlResume?: AgentRunParams["hitlResume"]): AgentTool<typeof approvalSchema, ApprovalResult>;
|
|
1628
|
+
//#endregion
|
|
1629
|
+
//#region src/tools/request-review.d.ts
|
|
1630
|
+
declare const reviewSchema: TObject<{
|
|
1631
|
+
title: TString;
|
|
1632
|
+
description: TString;
|
|
1633
|
+
content: TString;
|
|
1634
|
+
content_type: TOptional<TString>;
|
|
1635
|
+
}>;
|
|
1636
|
+
type ReviewResult = {
|
|
1637
|
+
paused: true;
|
|
1638
|
+
};
|
|
1639
|
+
/**
|
|
1640
|
+
* Creates the `request_review` tool.
|
|
1641
|
+
*
|
|
1642
|
+
* @param sessionId - Current session ID.
|
|
1643
|
+
* @param turnId - Current turn ID for checkpoint tracking.
|
|
1644
|
+
*/
|
|
1645
|
+
declare function createRequestReviewTool(sessionId: string): AgentTool<typeof reviewSchema, ReviewResult>;
|
|
1646
|
+
//#endregion
|
|
1548
1647
|
//#region src/tools/index.d.ts
|
|
1549
1648
|
/** Optional context for enabling subagent tools */
|
|
1550
1649
|
type SubagentToolsContext = {
|
|
1650
|
+
sessionId: string;
|
|
1551
1651
|
registry: SubagentRegistry;
|
|
1552
1652
|
parentSessionId: string; /** Depth of the current agent (root = 0) */
|
|
1553
1653
|
depth: number;
|
|
@@ -1556,7 +1656,8 @@ type SubagentToolsContext = {
|
|
|
1556
1656
|
inheritedRunParams?: Pick<AgentRunParams, "plugins" | "memory" | "messaging" | "docs" | "historyLimit" | "onProgress" | "messageId">;
|
|
1557
1657
|
loopDetection?: ToolLoopDetectionConfig;
|
|
1558
1658
|
memoryOptions?: MemoryToolOptions;
|
|
1559
|
-
contextManager?: ContextManager;
|
|
1659
|
+
contextManager?: ContextManager;
|
|
1660
|
+
hitlResume?: AgentRunParams["hitlResume"]; /** Callback that runs a child agent; injected to avoid circular imports */
|
|
1560
1661
|
spawnFn: (params: AgentRunParams) => Promise<AgentRunResult>;
|
|
1561
1662
|
};
|
|
1562
1663
|
/**
|
|
@@ -1647,6 +1748,17 @@ type CreatePluginRuntimeOptions = {
|
|
|
1647
1748
|
};
|
|
1648
1749
|
declare function createPluginRuntime(options: CreatePluginRuntimeOptions): PluginRuntime;
|
|
1649
1750
|
//#endregion
|
|
1751
|
+
//#region src/plugins/progress-runtime.d.ts
|
|
1752
|
+
type PluginCustomProgressInput = {
|
|
1753
|
+
name: string;
|
|
1754
|
+
label?: string;
|
|
1755
|
+
data?: Record<string, unknown>;
|
|
1756
|
+
};
|
|
1757
|
+
type PluginProgressEmitter = {
|
|
1758
|
+
emit(event: PluginCustomProgressInput): Promise<void>;
|
|
1759
|
+
};
|
|
1760
|
+
declare function createPluginProgressEmitter(pluginId: string): PluginProgressEmitter;
|
|
1761
|
+
//#endregion
|
|
1650
1762
|
//#region src/llm/client.d.ts
|
|
1651
1763
|
type LlmChatMessage = {
|
|
1652
1764
|
role: "system" | "user" | "assistant";
|
|
@@ -1732,6 +1844,7 @@ type PluginApi = {
|
|
|
1732
1844
|
priority?: number;
|
|
1733
1845
|
}) => void;
|
|
1734
1846
|
registerSkillDir: (dir: string) => void;
|
|
1847
|
+
createProgressEmitter: () => PluginProgressEmitter;
|
|
1735
1848
|
};
|
|
1736
1849
|
declare function loadPlugins(options: PluginLoadOptions): PluginRegistry;
|
|
1737
1850
|
//#endregion
|
|
@@ -1753,6 +1866,107 @@ type PluginSystem = {
|
|
|
1753
1866
|
declare function initializePluginSystem(options?: PluginSystemOptions): PluginSystem;
|
|
1754
1867
|
//#endregion
|
|
1755
1868
|
//#region src/plugins/tool-hooks.d.ts
|
|
1756
|
-
declare function wrapToolsWithHooks(tools: AgentTool[], hooks: PluginHookRegistry, ctx: PluginHookAgentContext): AgentTool[];
|
|
1869
|
+
declare function wrapToolsWithHooks(tools: AgentTool[], hooks: PluginHookRegistry, ctx: PluginHookAgentContext, runtime: PluginExecutionRuntime): AgentTool[];
|
|
1870
|
+
//#endregion
|
|
1871
|
+
//#region src/hitl/types.d.ts
|
|
1872
|
+
/** Information about the tool call that triggered the HITL pause. */
|
|
1873
|
+
/** Full internal context carried by a HitlPauseSignal. */
|
|
1874
|
+
type HitlPauseContext = {
|
|
1875
|
+
/** The HITL request to present to the user. */request: HitlRequest$1; /** Tool call context when the pause was triggered from a tool. */
|
|
1876
|
+
toolContext?: HitlToolContext; /** Checkpoint information for resumption. */
|
|
1877
|
+
checkpoint: HitlCheckpoint$1;
|
|
1878
|
+
};
|
|
1879
|
+
/** Options for resuming a paused session. */
|
|
1880
|
+
type ResumeOptions = {
|
|
1881
|
+
/** The data directory for the user. */dataDir: string; /** The session to resume. */
|
|
1882
|
+
sessionId: string; /** The request to resolve. */
|
|
1883
|
+
requestId: string; /** The user's resolution. */
|
|
1884
|
+
resolution: HitlResolution$1;
|
|
1885
|
+
};
|
|
1886
|
+
/** Result of attempting to resume a paused session. */
|
|
1887
|
+
type ResumeValidationResult = {
|
|
1888
|
+
valid: true;
|
|
1889
|
+
state: PausedRunState$1;
|
|
1890
|
+
} | {
|
|
1891
|
+
valid: false;
|
|
1892
|
+
reason: string;
|
|
1893
|
+
};
|
|
1894
|
+
type ResolveHitlRequestResult = {
|
|
1895
|
+
state: PausedRunState$1;
|
|
1896
|
+
idempotentReplay: boolean;
|
|
1897
|
+
};
|
|
1898
|
+
//#endregion
|
|
1899
|
+
//#region src/hitl/pause-signal.d.ts
|
|
1900
|
+
declare class HitlPauseSignal extends Error {
|
|
1901
|
+
/** The HITL request to present to the user. */
|
|
1902
|
+
readonly request: HitlRequest$1;
|
|
1903
|
+
/** Checkpoint information for resumption. */
|
|
1904
|
+
readonly checkpoint: HitlCheckpoint$1;
|
|
1905
|
+
/** Optional tool call context. */
|
|
1906
|
+
readonly toolContext?: HitlToolContext;
|
|
1907
|
+
/** Discriminator to reliably identify the signal in catch blocks. */
|
|
1908
|
+
readonly isHitlPause: true;
|
|
1909
|
+
constructor(/** The HITL request to present to the user. */
|
|
1910
|
+
|
|
1911
|
+
request: HitlRequest$1, /** Checkpoint information for resumption. */
|
|
1912
|
+
|
|
1913
|
+
checkpoint: HitlCheckpoint$1, /** Optional tool call context. */
|
|
1914
|
+
|
|
1915
|
+
toolContext?: HitlToolContext);
|
|
1916
|
+
}
|
|
1917
|
+
/**
|
|
1918
|
+
* Type-guard that checks if an unknown error is a HitlPauseSignal.
|
|
1919
|
+
* Handles both `instanceof` and duck-typing for cross-module boundaries.
|
|
1920
|
+
*/
|
|
1921
|
+
declare function isHitlPauseSignal(error: unknown): error is HitlPauseSignal;
|
|
1922
|
+
//#endregion
|
|
1923
|
+
//#region src/hitl/session-store.d.ts
|
|
1924
|
+
/** Returns the path to `pending-hitl.json` for a session. */
|
|
1925
|
+
declare function pendingHitlPath(dataDir: string, sessionId: string): string;
|
|
1926
|
+
/** Returns the path to `hitl-history.jsonl` for a session. */
|
|
1927
|
+
declare function hitlHistoryPath(dataDir: string, sessionId: string): string;
|
|
1928
|
+
/** Reads the current `pending-hitl.json`; returns `null` if none exists. */
|
|
1929
|
+
declare function readPendingHitl(dataDir: string, sessionId: string): Promise<PausedRunState | null>;
|
|
1930
|
+
/** Reads all entries from `hitl-history.jsonl`; returns `[]` if none exists. */
|
|
1931
|
+
declare function readHitlHistory(dataDir: string, sessionId: string): Promise<HitlHistoryEntry[]>;
|
|
1932
|
+
/**
|
|
1933
|
+
* Creates and persists an initial pending HITL state from a request.
|
|
1934
|
+
* Also appends a "requested" entry to the history log.
|
|
1935
|
+
*/
|
|
1936
|
+
declare function createPendingHitl(dataDir: string, sessionId: string, request: HitlRequest, checkpoint: PausedRunState["checkpoint"], context: PausedRunState["context"], toolContext?: HitlToolContext$1): Promise<PausedRunState>;
|
|
1937
|
+
/**
|
|
1938
|
+
* Transitions the pending HITL to a new status and persists the update.
|
|
1939
|
+
*
|
|
1940
|
+
* Returns the updated state, or `null` if:
|
|
1941
|
+
* - No pending HITL exists
|
|
1942
|
+
* - The request ID doesn't match
|
|
1943
|
+
* - The current status is not "pending"
|
|
1944
|
+
*/
|
|
1945
|
+
declare function transitionHitlStatus(dataDir: string, sessionId: string, requestId: string, newStatus: Exclude<HitlStatus, "pending">, resolution?: HitlResolution): Promise<PausedRunState | null>;
|
|
1946
|
+
/**
|
|
1947
|
+
* Removes the `pending-hitl.json` file after the session has fully resumed.
|
|
1948
|
+
* This is a cleanup step — the history log retains the full audit trail.
|
|
1949
|
+
*/
|
|
1950
|
+
declare function clearPendingHitl(dataDir: string, sessionId: string): Promise<void>;
|
|
1951
|
+
//#endregion
|
|
1952
|
+
//#region src/hitl/resume.d.ts
|
|
1953
|
+
/**
|
|
1954
|
+
* Validates a resume attempt against the persisted HITL state.
|
|
1955
|
+
*
|
|
1956
|
+
* Checks performed:
|
|
1957
|
+
* 1. A pending HITL exists for this session
|
|
1958
|
+
* 2. The request ID matches
|
|
1959
|
+
* 3. The session ID matches
|
|
1960
|
+
* 4. The current status is "pending"
|
|
1961
|
+
* 5. The request has not expired
|
|
1962
|
+
*/
|
|
1963
|
+
declare function validateResume(dataDir: string, sessionId: string, requestId: string): Promise<ResumeValidationResult>;
|
|
1964
|
+
/**
|
|
1965
|
+
* Resolves a pending HITL request: validates, transitions to "resolved",
|
|
1966
|
+
* and returns the updated state.
|
|
1967
|
+
*
|
|
1968
|
+
* Returns the resolved PausedRunState on success, or throws on validation failure.
|
|
1969
|
+
*/
|
|
1970
|
+
declare function resolveHitlRequest(options: ResumeOptions): Promise<ResolveHitlRequestResult>;
|
|
1757
1971
|
//#endregion
|
|
1758
|
-
export { AgentBinding, AgentConfig, AgentModelConfig, type AgentProgressEvent, type AgentRunParams, type AgentRunResult, AgentsConfig, BOOTSTRAP_FILE_NAMES, BOOTSTRAP_MAX_CHARS, BOOTSTRAP_TOTAL_MAX_CHARS, type BootstrapContextFile, type BootstrapEnsureResult, type BootstrapFile, type BootstrapMountResult, type BootstrapMountStatus, type CallbackEventPayload, type CallbackPayload, type Channel, type ContextManager, type EmbeddingProvider, type EmbeddingProviderContext, type EmbeddingProviderFactory, type EmbeddingProviderRegistration, MAX_CHILDREN_PER_SESSION, MAX_SUBAGENT_DEPTH, type MemoryCallOptions, type MemoryChangeSource, type MemoryChangedEvent, type MemoryChangedHandler, MemoryIndexManager, type MemoryProvider, type MemoryProviderContext, type MemoryProviderFactory, type MemoryProviderRegistration, type MemoryProviderStatus, type MemorySearchOptions, type MemorySearchResult, type NormalizedPluginsConfig, PLUGIN_MANIFEST_FILENAME, PLUGIN_MANIFEST_FILENAMES, type PersistedSubagentRunRecord, type PersistedToolResult, type PluginApi, type PluginCandidate, type PluginConfigUiHint, type PluginDiagnostic, type PluginDiscoveryOptions, type PluginDiscoveryResult, type PluginEntryConfig, type PluginHookAfterCompactionEvent, type PluginHookAfterPromptBuildEvent, type PluginHookAfterToolCallEvent, type PluginHookAgentContext, type PluginHookAgentEndEvent, type PluginHookAssistantMessageEndEvent, type PluginHookBeforeCompactionEvent, type PluginHookBeforeModelResolveEvent, type PluginHookBeforeModelResolveResult, type PluginHookBeforePromptBuildEvent, type PluginHookBeforePromptBuildResult, type PluginHookBeforeToolCallEvent, type PluginHookBeforeToolCallResult, type PluginHookHandlerMap, type PluginHookLlmInputEvent, type PluginHookLlmOutputEvent, type PluginHookMemoryChangedEvent, type PluginHookName, PluginHookRegistry, type PluginHookSessionEndEvent, type PluginHookSessionResetEvent, type PluginHookSessionStartEvent, type PluginKind, type PluginManifest, type PluginManifestLoadResult, type PluginManifestRegistry, type PluginOrigin, type PluginRecord, type PluginRegistry, type PluginRuntime, type PluginRuntimeContext, type PluginSystem, type PluginSystemOptions, type PluginToolOptions, PluginToolRegistry, type PluginsConfig, type PluginsConfigValidationResult, type RegisteredPluginTool, type RunResultPayload, type SessionContextStore, type SessionExport, type SessionInspection, type SessionMetadata, type SessionSummary, type Skill, type SlashCommandList, type SubagentContext, SubagentRegistry, type SubagentRunRecord, type SubagentStatus, type SubagentToolsContext, type SystemPromptParams, type ToolLoopDetectionConfig, type TranscriptEntry, addAgent, addBinding, aimaxDir, appendToMemory, appendTranscriptEntry, bootstrapMountLayout, buildBootstrapContextFiles, buildSkillsPrompt, buildSubagentAnnounceMessage, buildSystemPrompt, cleanupOldSubagentRecords, collapseLogPath, contextSnapshotPath, createAgentTools, createApplyPatchTool, createBashTool, createBuiltinMemoryProvider, createContextManager, createEditFileTool, createExecTool, createImageTool, createListDirTool, createMemoryAppendTool, createMemoryGetTool, createMemorySearchTool, createPluginRuntime, createProcessTool, createReadFileTool, createSession, createSessionContextStore, createSessionsSpawnTool, createSubagentsTool, createWriteFileTool, deleteMemoryFile, discoverAIMaxPlugins, ensureBootstrapMountLayout, ensureSession, exportSession, generateSessionTitle, getAgentConfig, getMemoryLines, hasBootstrapSentinel, initializePluginSystem, inspectBootstrapMountLayout, inspectSession, isBootstrapMountLayoutReady, listAgents, listAvailableSlashCommands, listBindings, listMemoryFiles, listSessionSummaries, listSessions, listSubagentRunsFromDisk, loadAgentsConfig, loadBootstrapFiles, loadPluginManifest, loadPluginManifestRegistry, loadPlugins, loadSessionContextSnapshot, loadSessionMetadata, loadSkills, loadSkillsFromDirs, loadSkillsWithPluginDirs, loadSubagentRegistryFromDisk, loadTranscript, memoryDir, metadataPath, normalizeAgentId, normalizePluginsConfig, primaryMemoryPath, readMemoryFile, readPrimaryMemory, registerEmbeddingProvider, registerMemoryProvider, removeAgent, removeBindings, replaceMemoryFile, resetEmbeddingProviderRegistryForTests, resetMemoryProviderRegistryForTests, resolveAgentDir, resolveAgentIdByBinding, resolveAgentsConfigPath, resolveDefaultAgentId, resolveEmbeddingProvider, resolveMemoryProvider, resolveModelFallbacks, resolveModelString, resolvePluginManifestPath, runAgent, saveAgentsConfig, saveSessionMetadata, saveSubagentRegistryToDisk, searchMemory, sessionDir, sessionMemoryPath, sessionsDir, skillsDir, toolResultsDir, transcriptPath, updateAgentIdentity, validatePluginsConfig, wrapToolsWithHooks };
|
|
1972
|
+
export { AgentBinding, AgentConfig, type AgentCustomProgressEvent, AgentModelConfig, type AgentProgressEvent, type AgentRunParams, type AgentRunResult, AgentsConfig, BOOTSTRAP_FILE_NAMES, BOOTSTRAP_MAX_CHARS, BOOTSTRAP_TOTAL_MAX_CHARS, type BootstrapContextFile, type BootstrapEnsureResult, type BootstrapFile, type BootstrapMountResult, type BootstrapMountStatus, type CallbackEventPayload, type CallbackPayload, type Channel, type ContextManager, type EmbeddingProvider, type EmbeddingProviderContext, type EmbeddingProviderFactory, type EmbeddingProviderRegistration, type HitlPauseContext, HitlPauseSignal, type HitlToolContext, MAX_CHILDREN_PER_SESSION, MAX_SUBAGENT_DEPTH, type MemoryCallOptions, type MemoryChangeSource, type MemoryChangedEvent, type MemoryChangedHandler, MemoryIndexManager, type MemoryProvider, type MemoryProviderContext, type MemoryProviderFactory, type MemoryProviderRegistration, type MemoryProviderStatus, type MemorySearchOptions, type MemorySearchResult, type NormalizedPluginsConfig, PLUGIN_MANIFEST_FILENAME, PLUGIN_MANIFEST_FILENAMES, type PersistedSubagentRunRecord, type PersistedToolResult, type PluginApi, type PluginCandidate, type PluginConfigUiHint, type PluginCustomProgressInput, type PluginDiagnostic, type PluginDiscoveryOptions, type PluginDiscoveryResult, type PluginEntryConfig, type PluginExecutionRuntime, type PluginHookAfterCompactionEvent, type PluginHookAfterPromptBuildEvent, type PluginHookAfterToolCallEvent, type PluginHookAgentContext, type PluginHookAgentEndEvent, type PluginHookAssistantMessageEndEvent, type PluginHookBeforeCompactionEvent, type PluginHookBeforeModelResolveEvent, type PluginHookBeforeModelResolveResult, type PluginHookBeforePromptBuildEvent, type PluginHookBeforePromptBuildResult, type PluginHookBeforeToolCallEvent, type PluginHookBeforeToolCallResult, type PluginHookHandlerMap, type PluginHookLlmInputEvent, type PluginHookLlmOutputEvent, type PluginHookMemoryChangedEvent, type PluginHookName, PluginHookRegistry, type PluginHookSessionEndEvent, type PluginHookSessionResetEvent, type PluginHookSessionStartEvent, type PluginKind, type PluginManifest, type PluginManifestLoadResult, type PluginManifestRegistry, type PluginOrigin, type PluginProgressEmitter, type PluginRecord, type PluginRegistry, type PluginRuntime, type PluginRuntimeContext, type PluginSystem, type PluginSystemOptions, type PluginToolOptions, PluginToolRegistry, type PluginsConfig, type PluginsConfigValidationResult, type RegisteredPluginTool, type ResumeOptions, type ResumeValidationResult, type RunResultPayload, type SessionContextStore, type SessionExport, type SessionInspection, type SessionMetadata, type SessionSummary, type Skill, type SlashCommandList, type SubagentContext, SubagentRegistry, type SubagentRunRecord, type SubagentStatus, type SubagentToolsContext, type SystemPromptParams, type ToolLoopDetectionConfig, type TranscriptEntry, addAgent, addBinding, aimaxDir, appendToMemory, appendTranscriptEntry, bootstrapMountLayout, buildBootstrapContextFiles, buildSkillsPrompt, buildSubagentAnnounceMessage, buildSystemPrompt, cleanupOldSubagentRecords, clearPendingHitl, collapseLogPath, contextSnapshotPath, createAgentTools, createApplyPatchTool, createBashTool, createBuiltinMemoryProvider, createClarifyTool, createContextManager, createEditFileTool, createExecTool, createImageTool, createListDirTool, createMemoryAppendTool, createMemoryGetTool, createMemorySearchTool, createPendingHitl, createPluginProgressEmitter, createPluginRuntime, createProcessTool, createReadFileTool, createRequestApprovalTool, createRequestReviewTool, createSession, createSessionContextStore, createSessionsSpawnTool, createSubagentsTool, createWriteFileTool, deleteMemoryFile, discoverAIMaxPlugins, ensureBootstrapMountLayout, ensureSession, exportSession, generateSessionTitle, getAgentConfig, getMemoryLines, hasBootstrapSentinel, hitlHistoryPath, initializePluginSystem, inspectBootstrapMountLayout, inspectSession, isBootstrapMountLayoutReady, isHitlPauseSignal, listAgents, listAvailableSlashCommands, listBindings, listMemoryFiles, listSessionSummaries, listSessions, listSubagentRunsFromDisk, loadAgentsConfig, loadBootstrapFiles, readPendingHitl as loadPendingHitl, readPendingHitl, loadPluginManifest, loadPluginManifestRegistry, loadPlugins, loadSessionContextSnapshot, loadSessionMetadata, loadSkills, loadSkillsFromDirs, loadSkillsWithPluginDirs, loadSubagentRegistryFromDisk, loadTranscript, memoryDir, metadataPath, normalizeAgentId, normalizePluginsConfig, pendingHitlPath, primaryMemoryPath, readHitlHistory, readMemoryFile, readPrimaryMemory, registerEmbeddingProvider, registerMemoryProvider, removeAgent, removeBindings, replaceMemoryFile, resetEmbeddingProviderRegistryForTests, resetMemoryProviderRegistryForTests, resolveAgentDir, resolveAgentIdByBinding, resolveAgentsConfigPath, resolveDefaultAgentId, resolveEmbeddingProvider, resolveHitlRequest, resolveHitlRequest as resolvePendingHitl, resolveMemoryProvider, resolveModelFallbacks, resolveModelString, resolvePluginManifestPath, runAgent, saveAgentsConfig, saveSessionMetadata, saveSubagentRegistryToDisk, searchMemory, sessionDir, sessionMemoryPath, sessionsDir, skillsDir, toolResultsDir, transcriptPath, transitionHitlStatus, updateAgentIdentity, validatePluginsConfig, validateResume, wrapToolsWithHooks };
|
package/dist/index.js
CHANGED
|
@@ -1,77 +1,79 @@
|
|
|
1
|
-
import{C as e,E as t,S as n,T as r,_ as i,a,b as o,c as s,d as c,f as l,g as u,h as d,i as f,l as p,m,n as h,o as g,p as _,r as v,s as y,u as b,v as x,w as S,x as C,y as w}from"./builtin-provider-Ce21lZic.js";import{i as T,n as E,r as
|
|
1
|
+
import{C as e,E as t,S as n,T as r,_ as i,a,b as o,c as s,d as c,f as l,g as u,h as d,i as f,l as p,m,n as h,o as g,p as _,r as v,s as y,u as b,v as x,w as S,x as C,y as w}from"./builtin-provider-Ce21lZic.js";import{i as T,n as E,r as ee}from"./provider-registry-rVbsCDN2.js";import{_ as D,a as O,c as k,d as A,f as j,g as M,h as te,i as ne,l as re,m as ie,n as ae,o as oe,p as se,s as ce,t as le,u as ue,v as de}from"./config-DG3Q1aJ6.js";import N from"node:fs/promises";import P from"node:path";import fe from"gray-matter";import{Type as F,calculateCost as pe,getEnvApiKey as me,parseStreamingJson as he,registerApiProvider as ge,registerBuiltInApiProviders as _e,supportsXhigh as ve}from"@mariozechner/pi-ai";import ye from"openai";import{AssistantMessageEventStream as be}from"@mariozechner/pi-ai/dist/utils/event-stream.js";import{sanitizeSurrogates as I}from"@mariozechner/pi-ai/dist/utils/sanitize-unicode.js";import{buildCopilotDynamicHeaders as xe,hasCopilotVisionInput as Se}from"@mariozechner/pi-ai/dist/providers/github-copilot-headers.js";import{buildBaseOptions as Ce,clampReasoning as we}from"@mariozechner/pi-ai/dist/providers/simple-options.js";import{transformMessages as Te}from"@mariozechner/pi-ai/dist/providers/transform-messages.js";import{createHash as Ee,randomUUID as L}from"node:crypto";import R from"node:fs";import{Agent as De}from"@mariozechner/pi-agent-core";import Oe from"node:os";import{spawn as ke}from"node:child_process";import{AsyncLocalStorage as Ae}from"node:async_hooks";import je from"ajv";import{createJiti as Me}from"jiti";import{isHitlExpired as Ne}from"@gencode/shared";const Pe=2e4,Fe=15e4,Ie=[`AGENTS.md`,`SOUL.md`,`TOOLS.md`,`IDENTITY.md`,`USER.md`,`HEARTBEAT.md`,`MEMORY.md`,`BOOTSTRAP.md`];function z(e){return P.join(e,`.aimax`)}async function Le(e){let t=z(e),n=[];for(let e of Ie){let r=P.join(t,e);try{let t=await N.readFile(r,`utf-8`);n.push({name:e,path:r,content:t,missing:!1}),e===`BOOTSTRAP.md`&&await N.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 Re(e,t,n){let r=e.trimEnd();if(r.length<=n)return{result:r,truncated:!1,originalLength:r.length};let i=Math.floor(n*.7),a=Math.floor(n*.2),o=r.slice(0,i),s=r.slice(-a);return{result:[o,[``,`[...truncated, read ${t} for full content...]`,`…(truncated ${t}: kept ${i}+${a} chars of ${r.length})…`,``].join(`
|
|
2
2
|
`),s].join(`
|
|
3
|
-
`),truncated:!0,originalLength:r.length}}function
|
|
4
|
-
`);for(let e of r){let t=e.trim();if(!t)continue;let n=(t.match(/^#+\s+(.+)$/)?.[1]??t).trim();if(n)return n.slice(0,500)}return``}async function
|
|
3
|
+
`),truncated:!0,originalLength:r.length}}function ze(e,t){return t<=0?``:e.length<=t?e:t<=1?e.slice(0,t):`${e.slice(0,t-1)}…`}function Be(e,t){let n=t?.maxChars??Pe,r=Math.max(1,t?.totalMaxChars??Math.max(n,Fe)),i=[];for(let a of e){if(r<=0)break;if(a.missing){let e=ze(`[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}=Re(a.content??``,a.name,e),l=ze(o,r);l&&((s||l.length<o.length)&&t?.warn?.(`bootstrap file ${a.name} is ${c} chars (limit ${e}); truncating`),r=Math.max(0,r-l.length),i.push({path:a.path,content:l}))}return i}function Ve(e){return P.join(e,`.aimax`,`skills`)}function He(e){return e instanceof Error&&e.message.trim()?e.message:String(e)}function Ue(e,t,n){process.stderr.write(`[skills] failed to load skill "${e}" from ${t}: ${He(n)}\n`)}function We(e){let t=fe(e),n=t.data.description;if(typeof n==`string`&&n.trim())return n.trim().slice(0,500);let r=t.content.split(`
|
|
4
|
+
`);for(let e of r){let t=e.trim();if(!t)continue;let n=(t.match(/^#+\s+(.+)$/)?.[1]??t).trim();if(n)return n.slice(0,500)}return``}async function Ge(e){return qe([Ve(e)])}async function Ke(e,t){return qe([Ve(e),...t])}async function qe(e){let t=[],n=new Set;for(let r of e){let e;try{e=await N.readdir(r,{withFileTypes:!0})}catch(e){if(e.code===`ENOENT`)continue;throw e}let i=e.filter(e=>e.isDirectory()).map(e=>e.name);for(let e of i.sort()){if(t.length>=50)break;if(n.has(e))continue;let i=P.join(r,e,`SKILL.md`),a;try{a=await N.readFile(i,`utf-8`)}catch(e){if(e.code===`ENOENT`)continue;throw e}let o;try{o=We(a)}catch(t){Ue(e,i,t);continue}t.push({name:e,description:o,location:i}),n.add(e)}}return t}function Je(e){return e.length===0?``:`<available_skills>\n${e.map(e=>[` <skill>`,` <name>${e.name}</name>`,` <description>${e.description}</description>`,` <location>${e.location}</location>`,` </skill>`].join(`
|
|
5
5
|
`)).join(`
|
|
6
|
-
`)}\n</available_skills>`}const
|
|
7
|
-
`)}function
|
|
6
|
+
`)}\n</available_skills>`}const Ye=3,Xe=5;var Ze=class{entries=new Map;announced=new Set;register(e,t){this.entries.set(e.runId,{record:e,promise:t})}complete(e,t){let n=this.entries.get(e);!n||n.record.status!==`running`||(n.record.status=`done`,n.record.result=t,n.record.endedAt=Date.now())}fail(e,t){let n=this.entries.get(e);!n||n.record.status!==`running`||(n.record.status=`error`,n.record.error=t,n.record.endedAt=Date.now())}kill(e){let t=this.entries.get(e);return!t||t.record.status!==`running`?!1:(t.record.abortController.abort(),t.record.status=`killed`,t.record.endedAt=Date.now(),!0)}killAll(e){let t=0;for(let{record:n}of this.entries.values())n.parentSessionId===e&&n.status===`running`&&(n.abortController.abort(),n.status=`killed`,n.endedAt=Date.now(),t++);return t}list(e){return Array.from(this.entries.values()).filter(t=>t.record.parentSessionId===e).map(e=>e.record)}hasPending(e){return this.list(e).some(e=>e.status===`running`)}countActive(e){return this.list(e).filter(e=>e.status===`running`).length}async waitForAll(e){let t=Array.from(this.entries.values()).filter(t=>t.record.parentSessionId===e&&t.record.status===`running`).map(e=>e.promise);t.length>0&&await Promise.allSettled(t)}consumeCompleted(e){let t=this.list(e).filter(e=>e.status!==`running`&&!this.announced.has(e.runId));for(let e of t)this.announced.add(e.runId);return t}hasUnannounced(e){return this.list(e).some(e=>e.status!==`running`&&!this.announced.has(e.runId))}needsAnnounce(e){return this.hasPending(e)||this.hasUnannounced(e)}checkSpawnAllowed(e,t){return t>3?{allowed:!1,reason:`Maximum subagent depth (3) reached`}:this.countActive(e)>=5?{allowed:!1,reason:`Maximum concurrent subagents (5) reached for this session`}:{allowed:!0}}getStatus(e){return this.entries.get(e)?.record.status??null}};const Qe=new Map;function $e(e){let t=Qe.get(e);return t||(t={},Qe.set(e,t)),t}function et(e){Qe.delete(e)}function tt(e,t){return P.isAbsolute(e)?P.normalize(e):P.normalize(P.join(t,e))}function nt(e){let t=e.replace(/\\/g,`/`);if(!t.endsWith(`/SKILL.md`))return;let n=t.lastIndexOf(`/.pingclaw/skills/`);if(n===-1)return;let r=t.slice(n+18,t.length-9);if(!(!r||r.includes(`/`)))return r}var rt=class{skillLocations;reportedSkills=new Set;pendingReadFilePaths=[];constructor(e){this.params=e,this.skillLocations=new Map(e.skills.map(e=>[P.normalize(e.location),e.name]))}onToolExecutionStart(e){if(e.toolName!==`read_file`||!e.args||typeof e.args!=`object`)return;let t=e.args.path;typeof t==`string`&&this.pendingReadFilePaths.push(tt(t,this.params.workspaceDir))}async onToolExecutionEnd(e){if(e.toolName!==`read_file`)return;let t=this.pendingReadFilePaths.pop(),n=t?this.skillLocations.get(t)??nt(t):void 0;!n||e.isError||this.reportedSkills.has(n)||(this.reportedSkills.add(n),await this.params.reportDiagnostic?.({level:`info`,phase:`skill_activated`,message:`skill activated`,details:{skillName:n,resolvedPath:t}}),await this.params.report({type:`skill_used`,skillName:n,agent:`aimax:main`,taskId:`aimax[${this.params.sessionId}]`}))}},B=class extends Error{code;statusCode;statusText;providerMessage;retryable;constructor(e){super(e.message,{cause:e.cause}),this.name=`LlmRequestError`,this.code=e.code,this.statusCode=e.statusCode,this.statusText=e.statusText,this.providerMessage=e.providerMessage,this.retryable=e.retryable}};function it(e){return{async chat(t){let n=at(t),r=t.model??e.defaultModel;if(!r)throw Error(`LLM model is required`);await ct(e.hooks,`llm_input`,{sessionId:e.hookCtx?.sessionId??`unknown`,model:r,prompt:ot(n),historyMessages:n},e.hookCtx);let i={model:r,messages:n,stream:!1};typeof t.temperature==`number`&&(i.temperature=t.temperature),typeof t.maxTokens==`number`&&(i.max_tokens=t.maxTokens);let{signal:a,clear:o,didTimeout:s}=lt(t.signal,t.timeoutMs);try{let t;try{let n=e.baseUrl.replace(/\/$/,``);t=await fetch(`${n}/chat/completions`,{method:`POST`,headers:{"content-type":`application/json`,authorization:`Bearer ${e.apiKey}`,"Client-Code":`AIMax`},body:JSON.stringify(i),signal:a})}catch(e){throw dt(e,s())}if(!t.ok){let e=await ut(t)||void 0,n=t.statusText?.trim()||void 0,r=[t.status,n].filter(Boolean).join(` `);throw new B({message:e?`LLM upstream returned HTTP ${r}: ${e}`:`LLM upstream returned HTTP ${r}`,code:`http_error`,statusCode:t.status,statusText:n,providerMessage:e,retryable:pt(t.status)})}let n;try{n=await t.json()}catch(e){throw new B({message:`LLM upstream returned an invalid JSON response`,code:`invalid_response`,retryable:!1,cause:e})}let o=n.choices?.[0]?.message?.content??n.choices?.[0]?.text??``,c=st(n.usage);return await ct(e.hooks,`llm_output`,{sessionId:e.hookCtx?.sessionId??`unknown`,model:r,assistantTexts:o?[o]:[],usage:c},e.hookCtx),{text:o,usage:c,raw:n}}finally{o()}}}}function at(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 ot(e){return e.map(e=>`${e.role}: ${e.content}`).join(`
|
|
7
|
+
`)}function st(e){let t=e?.input??e?.prompt_tokens??0,n=e?.output??e?.completion_tokens??0;return{input:t,output:n,total:e?.total??e?.total_tokens??t+n}}async function ct(e,t,n,r){!e||!r||await e.dispatch(t,n,r)}function lt(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 ut(e){try{let t=await e.text();return t?t.trim().slice(0,200):``}catch{return``}}function dt(e,t){return e instanceof B?e:ft(e)?t?new B({message:`LLM request timed out`,code:`timeout`,retryable:!0,cause:e}):e:new B({message:`LLM network request failed: ${e instanceof Error?e.message:String(e)}`,code:`network_error`,retryable:!0,cause:e})}function ft(e){return e instanceof Error&&e.name===`AbortError`}function pt(e){return e===408||e===409||e===425||e===429||e>=500}function mt(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.error&&typeof t.error==`object`?!0:t.object===`error`}function ht(e){if(!mt(e))return null;let t=e,n=gt(t.message),r=V(n?.code)??V(t.code),i=V(n?.type)??V(t.type),a=V(n?.message)??_t(t.error)??V(t.message)??`Unknown upstream error`;return{message:vt(a,i,r),providerMessage:a,providerCode:r,providerType:i,retryable:yt(r,i),raw:e}}function gt(e){if(typeof e!=`string`)return null;let t=e.trim();if(!t.startsWith(`{`)||!t.endsWith(`}`))return null;try{let e=JSON.parse(t);return e&&typeof e==`object`?e:null}catch{return null}}function _t(e){if(!(!e||typeof e!=`object`))return V(e.message)}function V(e){if(e==null)return;let t=String(e).trim();return t.length>0?t:void 0}function vt(e,t,n){let r=[t,n].filter(Boolean).join(` `);return r?`${e} (${r})`:e}function yt(e,t){let n=Number(e);if(Number.isFinite(n))return n===408||n===409||n===425||n===429||n>=500;let r=t?.toLowerCase();return r===`ratelimiterror`||r===`internalservererror`}const bt=(e,t,n)=>{let r=new be;return(async()=>{let i={role:`assistant`,content:[],api:e.api,provider:e.provider,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`stop`,timestamp:Date.now(),errorMessage:void 0};try{let a=St(e,t,n?.apiKey||me(e.provider)||``,n?.headers),o=Ct(e,t,n);n?.onPayload?.(o);let s=await a.chat.completions.create(o,{signal:n?.signal});r.push({type:`start`,partial:i});let c=null,l=i.content,u=()=>l.length-1,d=e=>{if(e){if(e.type===`text`){r.push({type:`text_end`,contentIndex:u(),content:e.text,partial:i});return}if(e.type===`thinking`){r.push({type:`thinking_end`,contentIndex:u(),content:e.thinking,partial:i});return}e.type===`toolCall`&&(e.arguments=he(e.partialArgs),delete e.partialArgs,r.push({type:`toolcall_end`,contentIndex:u(),toolCall:e,partial:i}))}};for await(let t of s){let n=ht(t);if(n)throw new B({message:`LLM upstream returned an error payload in a 200 stream: ${n.message}`,code:`stream_payload_error`,providerMessage:n.providerMessage,retryable:n.retryable,cause:n.raw});if(t.usage){let n=t.usage.prompt_tokens_details?.cached_tokens||0,r=t.usage.completion_tokens_details?.reasoning_tokens||0,a=(t.usage.prompt_tokens||0)-n,o=(t.usage.completion_tokens||0)+r;i.usage={input:a,output:o,cacheRead:n,cacheWrite:0,totalTokens:a+o+n,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},pe(e,i.usage)}let a=t.choices?.[0];if(!a||(a.finish_reason&&(i.stopReason=kt(a.finish_reason)),!a.delta))continue;a.delta.content!==null&&a.delta.content!==void 0&&a.delta.content.length>0&&((!c||c.type!==`text`)&&(d(c),c={type:`text`,text:``},i.content.push(c),r.push({type:`text_start`,contentIndex:u(),partial:i})),c.text+=a.delta.content,r.push({type:`text_delta`,contentIndex:u(),delta:a.delta.content,partial:i}));let o=[`reasoning_content`,`reasoning`,`reasoning_text`].find(e=>{let t=a.delta[e];return t!=null&&t.length>0});if(o){(!c||c.type!==`thinking`)&&(d(c),c={type:`thinking`,thinking:``,thinkingSignature:o},i.content.push(c),r.push({type:`thinking_start`,contentIndex:u(),partial:i}));let e=a.delta[o];c.thinking+=e,r.push({type:`thinking_delta`,contentIndex:u(),delta:e,partial:i})}if(a.delta.tool_calls)for(let e of a.delta.tool_calls){(!c||c.type!==`toolCall`||e.id&&c.id!==e.id)&&(d(c),c={type:`toolCall`,id:e.id||``,name:e.function?.name||``,arguments:{},partialArgs:``},i.content.push(c),r.push({type:`toolcall_start`,contentIndex:u(),partial:i})),e.id&&(c.id=e.id),e.function?.name&&(c.name=e.function.name);let t=``;e.function?.arguments&&(t=e.function.arguments,c.partialArgs+=e.function.arguments,c.arguments=he(c.partialArgs)),r.push({type:`toolcall_delta`,contentIndex:u(),delta:t,partial:i})}let s=a.delta.reasoning_details;if(s&&Array.isArray(s)){for(let e of s)if(e.type===`reasoning.encrypted`&&e.id&&e.data){let t=i.content.find(t=>t.type===`toolCall`&&t.id===e.id);t&&(t.thoughtSignature=JSON.stringify(e))}}}if(d(c),n?.signal?.aborted)throw Error(`Request was aborted`);if(i.stopReason===`aborted`||i.stopReason===`error`)throw Error(i.errorMessage??(i.stopReason===`aborted`?`Request was aborted`:`LLM stream ended with stopReason=${i.stopReason}`));r.push({type:`done`,reason:i.stopReason,message:i}),r.end()}catch(e){for(let e of i.content)delete e.index;i.stopReason=n?.signal?.aborted?`aborted`:`error`,i.errorMessage=e instanceof Error?e.message:JSON.stringify(e);let t=e?.error?.metadata?.raw;t&&(i.errorMessage+=`\n${t}`),r.push({type:`error`,reason:i.stopReason,error:i}),r.end()}})(),r},xt=(e,t,n)=>{let r=n?.apiKey||me(e.provider);if(!r)throw Error(`No API key for provider: ${e.provider}`);let i=Ce(e,n,r),a=ve(e)?n?.reasoning:we(n?.reasoning);return bt(e,t,{...i,reasoningEffort:a,toolChoice:void 0})};function St(e,t,n,r){if(!n){if(!process.env.OPENAI_API_KEY)throw Error(`OpenAI API key is required. Set OPENAI_API_KEY environment variable or pass it as an argument.`);n=process.env.OPENAI_API_KEY}let i={...e.headers};if(e.provider===`github-copilot`){let e=Se(t.messages);Object.assign(i,xe({messages:t.messages,hasImages:e}))}return r&&Object.assign(i,r),new ye({apiKey:n,baseURL:e.baseUrl,dangerouslyAllowBrowser:!0,defaultHeaders:i})}function Ct(e,t,n){let r=jt(e),i=Dt(e,t,r);Et(e,i);let a={model:e.id,messages:i,stream:!0};if(r.supportsUsageInStreaming!==!1&&(a.stream_options={include_usage:!0}),r.supportsStore&&(a.store=!1),n?.maxTokens&&(r.maxTokensField===`max_tokens`?a.max_tokens=n.maxTokens:a.max_completion_tokens=n.maxTokens),n?.temperature!==void 0&&(a.temperature=n.temperature),t.tools?a.tools=Ot(t.tools,r):wt(t.messages)&&(a.tools=[]),n?.toolChoice&&(a.tool_choice=n.toolChoice),(r.thinkingFormat===`zai`||r.thinkingFormat===`qwen`)&&e.reasoning?a.enable_thinking=!!n?.reasoningEffort:n?.reasoningEffort&&e.reasoning&&r.supportsReasoningEffort&&(a.reasoning_effort=n.reasoningEffort),e.baseUrl.includes(`openrouter.ai`)&&e.compat?.openRouterRouting&&(a.provider=e.compat.openRouterRouting),e.baseUrl.includes(`ai-gateway.vercel.sh`)&&e.compat?.vercelGatewayRouting){let t=e.compat.vercelGatewayRouting;if(t.only||t.order){let e={};t.only&&(e.only=t.only),t.order&&(e.order=t.order),a.providerOptions={gateway:e}}}return a}function wt(e){for(let t of e)if(t.role===`toolResult`||t.role===`assistant`&&t.content.some(e=>e.type===`toolCall`))return!0;return!1}function Tt(e){let t=e.replace(/[^a-zA-Z0-9]/g,``);return t.length<9?t+=`ABCDEFGHI`.slice(0,9-t.length):t.length>9&&(t=t.slice(0,9)),t}function Et(e,t){if(!(e.provider!==`openrouter`||!e.id.startsWith(`anthropic/`)))for(let e=t.length-1;e>=0;--e){let n=t[e];if(n.role!==`user`&&n.role!==`assistant`)continue;let r=n.content;if(typeof r==`string`){n.content=[{type:`text`,text:r,cache_control:{type:`ephemeral`}}];return}if(Array.isArray(r))for(let e=r.length-1;e>=0;--e){let t=r[e];if(t?.type===`text`){Object.assign(t,{cache_control:{type:`ephemeral`}});return}}}}function Dt(e,t,n){let r=[],i=t=>{if(n.requiresMistralToolIds)return Tt(t);if(t.includes(`|`)){let[e]=t.split(`|`);return e.replace(/[^a-zA-Z0-9_-]/g,`_`).slice(0,40)}return e.provider===`openai`&&t.length>40?t.slice(0,40):t},a=Te(t.messages,e,e=>i(e));if(t.systemPrompt){let i=e.reasoning&&n.supportsDeveloperRole?`developer`:`system`;r.push({role:i,content:I(t.systemPrompt)})}let o=null;for(let t=0;t<a.length;t+=1){let i=a[t];if(n.requiresAssistantAfterToolResult&&o===`toolResult`&&i.role===`user`&&r.push({role:`assistant`,content:`I have processed the tool results.`}),i.role===`user`){if(typeof i.content==`string`)r.push({role:`user`,content:I(i.content)});else{let t=i.content.map(e=>e.type===`text`?{type:`text`,text:I(e.text)}:{type:`image_url`,image_url:{url:`data:${e.mimeType};base64,${e.data}`}}),n=e.input.includes(`image`)?t:t.filter(e=>e.type!==`image_url`);if(n.length===0)continue;r.push({role:`user`,content:n})}o=i.role;continue}if(i.role===`assistant`){let t={role:`assistant`,content:n.requiresAssistantAfterToolResult?``:null},a=i.content.filter(e=>e.type===`text`&&e.text?.trim().length>0);a.length>0&&(t.content=e.provider===`github-copilot`?a.map(e=>I(e.text)).join(``):a.map(e=>({type:`text`,text:I(e.text)})));let s=i.content.filter(e=>e.type===`thinking`&&e.thinking?.trim().length>0);if(s.length>0)if(n.requiresThinkingAsText){let e=s.map(e=>e.thinking).join(`
|
|
8
8
|
|
|
9
9
|
`);t.content?t.content.unshift({type:`text`,text:e}):t.content=[{type:`text`,text:e}]}else{let e=s[0].thinkingSignature;e&&e.length>0&&(t[e]=s.map(e=>e.thinking).join(`
|
|
10
10
|
`))}let c=i.content.filter(e=>e.type===`toolCall`);if(c.length>0){t.tool_calls=c.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.arguments)}}));let e=c.filter(e=>e.thoughtSignature).map(e=>{try{return JSON.parse(e.thoughtSignature)}catch{return null}}).filter(Boolean);e.length>0&&(t.reasoning_details=e)}let l=t.content;if(!(l!=null&&l.length>0)&&!t.tool_calls)continue;r.push(t),o=i.role;continue}if(i.role===`toolResult`){let i=[],s=t;for(;s<a.length&&a[s].role===`toolResult`;s+=1){let t=a[s],o=t.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
11
|
-
`),c=t.content.some(e=>e.type===`image`),l={role:`tool`,content:
|
|
12
|
-
`),r=n===-1?t:t.slice(0,n).trim(),i=r.match(/^\/([^\s:]+)\s*:(.*)$/);if(!i)return r;let[,a,o]=i,s=o.trimStart();return s?`/${a} ${s}`:`/${a}`}function
|
|
13
|
-
`)}}function
|
|
11
|
+
`),c=t.content.some(e=>e.type===`image`),l={role:`tool`,content:I(o.length>0?o:`(see attached image)`),tool_call_id:t.toolCallId};if(n.requiresToolResultName&&t.toolName&&(l.name=t.toolName),r.push(l),c&&e.input.includes(`image`))for(let e of t.content)e.type===`image`&&i.push({type:`image_url`,image_url:{url:`data:${e.mimeType};base64,${e.data}`}})}t=s-1,i.length>0?(n.requiresAssistantAfterToolResult&&r.push({role:`assistant`,content:`I have processed the tool results.`}),r.push({role:`user`,content:[{type:`text`,text:`Attached image(s) from tool result:`},...i]}),o=`user`):o=`toolResult`}}return r}function Ot(e,t){return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.parameters,...t.supportsStrictMode!==!1&&{strict:!1}}}))}function kt(e){if(e===null)return`stop`;switch(e){case`stop`:return`stop`;case`length`:return`length`;case`function_call`:case`tool_calls`:return`toolUse`;case`error`:case`content_filter`:return`error`;default:throw Error(`Unhandled stop reason: ${e}`)}}function At(e){let t=e.provider,n=e.baseUrl,r=t===`zai`||n.includes(`api.z.ai`),i=t===`cerebras`||n.includes(`cerebras.ai`)||t===`xai`||n.includes(`api.x.ai`)||t===`mistral`||n.includes(`mistral.ai`)||n.includes(`chutes.ai`)||n.includes(`deepseek.com`)||r||t===`opencode`||n.includes(`opencode.ai`),a=t===`mistral`||n.includes(`mistral.ai`)||n.includes(`chutes.ai`),o=t===`xai`||n.includes(`api.x.ai`),s=t===`mistral`||n.includes(`mistral.ai`);return{supportsStore:!i,supportsDeveloperRole:!i,supportsReasoningEffort:!o&&!r,supportsUsageInStreaming:!0,maxTokensField:a?`max_tokens`:`max_completion_tokens`,requiresToolResultName:s,requiresAssistantAfterToolResult:!1,requiresThinkingAsText:s,requiresMistralToolIds:s,thinkingFormat:r?`zai`:`openai`,openRouterRouting:{},vercelGatewayRouting:{},supportsStrictMode:!0}}function jt(e){let t=At(e);return e.compat?{supportsStore:e.compat.supportsStore??t.supportsStore,supportsDeveloperRole:e.compat.supportsDeveloperRole??t.supportsDeveloperRole,supportsReasoningEffort:e.compat.supportsReasoningEffort??t.supportsReasoningEffort,supportsUsageInStreaming:e.compat.supportsUsageInStreaming??t.supportsUsageInStreaming,maxTokensField:e.compat.maxTokensField??t.maxTokensField,requiresToolResultName:e.compat.requiresToolResultName??t.requiresToolResultName,requiresAssistantAfterToolResult:e.compat.requiresAssistantAfterToolResult??t.requiresAssistantAfterToolResult,requiresThinkingAsText:e.compat.requiresThinkingAsText??t.requiresThinkingAsText,requiresMistralToolIds:e.compat.requiresMistralToolIds??t.requiresMistralToolIds,thinkingFormat:e.compat.thinkingFormat??t.thinkingFormat,openRouterRouting:e.compat.openRouterRouting??{},vercelGatewayRouting:e.compat.vercelGatewayRouting??t.vercelGatewayRouting,supportsStrictMode:e.compat.supportsStrictMode??t.supportsStrictMode}:t}let Mt=!1;function Nt(){Mt||=(_e(),ge({api:`openai-completions`,stream:bt,streamSimple:xt}),!0)}var Pt=class{constructor(e){this.params=e}async dispatchProgress(e,t){let n={...t,sessionId:e,...this.params.messageId?{messageId:this.params.messageId}:{},...this.params.subagentContext?{parentSessionId:this.params.subagentContext.parentSessionId,depth:this.params.subagentContext.depth}:{}};await this.params.onProgress?.(n)}async dispatchDiagnostic(e,t){await this.dispatchProgress(e,{type:`diagnostic`,...t})}};function Ft(e,t=80){let n=e.trim().replace(/\s+/g,` `);return n.length<=t?n:n.slice(0,t-1)+`…`}function It(e){if(!e)return null;let t=(typeof e==`string`?e:e.toString(`utf-8`)).replace(/\\/g,`/`).replace(/^\.\//,``).trim();return t.length>0?t:null}function Lt(e){let t=It(e.filename);if(e.kind===`memory-file`)return[`MEMORY.md`];if(e.kind===`memory-file-lower`)return[`memory.md`];if(e.kind===`memory-dir`){if(!t)return[`memory`];let e=P.basename(t).replace(/\\/g,`/`);return e.endsWith(`.md`)?[`memory/${e}`]:[]}return t?t===`MEMORY.md`||t===`memory.md`?[t]:t===`memory`?[`memory`]:t.startsWith(`memory/`)?t.endsWith(`.md`)?[t]:[`memory`]:[]:[`MEMORY.md`,`memory`]}function Rt(e){let t=e.watchFactory??((e,t,n)=>R.watch(e,t,n)),n=P.join(e.dataDir,`.aimax`),r=[{target:P.join(n,`MEMORY.md`),kind:`memory-file`},{target:P.join(n,`memory.md`),kind:`memory-file-lower`},{target:P.join(n,`memory`),kind:`memory-dir`},{target:n,kind:`memory-root`}],i=[],a=new Set,o=null,s=Number.isFinite(e.debounceMs)&&(e.debounceMs??0)>0?Math.floor(e.debounceMs):1500,c=async()=>{let t=Array.from(a);if(a.clear(),t.length===0)return;let n={reason:`external-watch`,files:t,source:`memory`,sessionId:e.sessionId,providerId:e.providerId,timestamp:new Date().toISOString()};e.provider?.sync&&await e.provider.sync(`external-watch`).catch(()=>{}),e.provider?.onMemoryChanged&&await Promise.resolve(e.provider.onMemoryChanged(n)).catch(()=>{}),e.onMemoryChanged&&await Promise.resolve(e.onMemoryChanged(n)).catch(()=>{})},l=()=>{o&&clearTimeout(o),o=setTimeout(()=>{o=null,c()},s)};for(let e of r)try{let n=t(e.target,{recursive:!1},(t,n)=>{let r=Lt({kind:e.kind,filename:n});if(r.length!==0){for(let e of r)a.add(e);l()}});n.on?.(`error`,()=>{try{n.close()}catch{}}),i.push(n)}catch{}return()=>{o&&=(clearTimeout(o),null);for(let e of i)try{e.close()}catch{}}}async function zt(e){let{runParams:t,eventDispatcher:n,hookRegistry:r}=e,{sessionId:i,hookContext:a,memoryProviderId:o,memoryPluginId:c}=e,l=P.join(t.dataDir,`workspace`),u=new Map,d=new Map,f=!1,p=async e=>{let t=Date.now(),o=Ht(e.files);if(o.length===0)return;let s=e.reason===`external-watch`&&e.source===`memory`?o.filter(e=>t-(u.get(e.toLowerCase())??0)>3e3):o;if(s.length===0)return;if(e.reason!==`external-watch`&&e.source===`memory`)for(let e of s)u.set(e.toLowerCase(),t);let c=`${e.reason}|${e.source}|${s.map(e=>e.toLowerCase()).sort().join(`|`)}`;if(t-(d.get(c)??0)<1e3)return;d.set(c,t);let l={...e,files:s};await n.dispatchProgress(e.sessionId??i,{type:`memory_changed`,reason:l.reason,files:l.files,source:l.source,providerId:l.providerId,timestamp:l.timestamp}).catch(()=>{}),await r.dispatch(`memory_changed`,l,{...a,sessionId:l.sessionId??a.sessionId},{eventDispatcher:n}).catch(()=>{})},m=P.join(t.dataDir,`.aimax`),g=T({providerId:o,pluginId:c,dataDir:t.dataDir,memoryDir:m,sessionId:i})?.provider??h({dataDir:t.dataDir,memoryDir:m,sessionId:i}),_=Rt({dataDir:t.dataDir,sessionId:i,providerId:o??c??g.id,provider:g,onMemoryChanged:p});g.sync&&g.sync(`session-start`).catch(()=>{});let v=async e=>{await s(t.dataDir,i,e,Vt({providerId:o,pluginId:c,onMemoryChanged:p}))};return{workspaceDir:l,memoryProviderId:o,memoryPluginId:c,appendTranscriptEntry:v,persistInitialUserEntry:async e=>f?!1:(await v({role:`user`,content:e,timestamp:new Date().toISOString()}),f=!0,!0),stop:()=>{_()}}}function Bt(e){let t=new Date().toISOString();return{id:e.sessionId,title:e.title,channel:e.channel,createdAt:t,updatedAt:t}}function Vt(e){return e.providerId||e.pluginId?{providerId:e.providerId,pluginId:e.pluginId,onMemoryChanged:e.onMemoryChanged}:{onMemoryChanged:e.onMemoryChanged}}function Ht(e){let t=[],n=new Set;for(let r of e){let e=r.replace(/\\/g,`/`).replace(/^\.\//,``).trim();if(!e)continue;let i=e.toLowerCase()===`memory.md`?`MEMORY.md`:e,a=i.toLowerCase();n.has(a)||(n.add(a),t.push(i))}return t}async function Ut(e){let{sessionId:t,resetCommand:n,previousSessionId:r,resetMessage:i,startMessage:a,hookRegistry:o,hookContext:s,eventDispatcher:c}=e;n&&i&&await c.dispatchProgress(t,{type:`session_reset`,action:n.action,previousSessionId:r,message:i}),n&&i&&await o.dispatch(`session_reset`,{action:n.action,sessionId:t,previousSessionId:r,message:i},s,{eventDispatcher:c}),await c.dispatchProgress(t,{type:`start`,message:a}),await o.dispatch(`session_start`,{sessionId:t},s,{eventDispatcher:c})}async function Wt(e){let{sessionId:t,result:n,runParams:r,hookRegistry:i,hookContext:a}=e;await i.dispatch(`agent_end`,{success:!n.error,error:n.error,durationMs:n.durationMs},a,{eventDispatcher:e.eventDispatcher});let o=await w(r.dataDir,t);await i.dispatch(`session_end`,{sessionId:t,messageCount:o.length,durationMs:n.durationMs},a,{eventDispatcher:e.eventDispatcher})}async function Gt(e){let{replyText:t,sessionId:n,isNewSession:i,transcriptMessage:a,initialUserEntryPersisted:o=!1,runParams:c,hookRegistry:l,hookContext:u,startTime:d,compactionEntry:f,eventDispatcher:p}=e;if(o||await s(c.dataDir,n,{role:`user`,content:a,timestamp:new Date().toISOString()}),f&&await s(c.dataDir,n,f),await s(c.dataDir,n,{role:`assistant`,content:t,timestamp:new Date().toISOString()}),i){let e=a.trim()?a:`New session`;await C(c.dataDir,Bt({sessionId:n,title:Ft(e),channel:c.channel}))}let m={sessionId:n,text:t,usage:{input:0,output:0,total:0},durationMs:Date.now()-d,context:{snapshotPath:b(c.dataDir,n),toolResultsDir:r(c.dataDir,n)}};return await Wt({sessionId:n,result:m,runParams:c,hookRegistry:l,hookContext:u,eventDispatcher:p}),m}async function Kt(e){let{sessionId:t,isNewSession:n,transcriptMessage:i,runParams:a,hookRegistry:o,hookContext:s,startTime:c,text:l,usage:u,error:d,paused:f,eventDispatcher:p}=e;n&&await C(a.dataDir,Bt({sessionId:t,title:Ft(i),channel:a.channel}));let m={sessionId:t,text:l,usage:u,durationMs:Date.now()-c,error:d,paused:f,context:{snapshotPath:b(a.dataDir,t),toolResultsDir:r(a.dataDir,t)}};return await Wt({sessionId:t,result:m,runParams:a,hookRegistry:o,hookContext:s,eventDispatcher:p}),m}const qt=[{name:`/help`,description:`显示可用命令`},{name:`/new`,description:`开始新会话`},{name:`/reset`,description:`重置当前会话`},{name:`/compact`,description:`精简会话上下文`},{name:`/skill`,description:`按名称运行技能`}];function Jt(){return qt.map(e=>({...e}))}function Yt(e){return e.trim().replace(/^\/+/,``).toLowerCase().replace(/[\s_]+/g,`-`)}function Xt(e){let t=new Set,n=[];for(let r of e){let e=Yt(r.name);e&&(t.has(e)||(t.add(e),n.push({name:`/${e}`,description:r.description||`Skill command.`})))}return n}function Zt(e){let t=Jt(),n=Xt(e);return{builtin:t,skillCommands:n,all:[...t,...n]}}function Qt(e){let t=e.trim();if(!t)return``;let n=t.indexOf(`
|
|
12
|
+
`),r=n===-1?t:t.slice(0,n).trim(),i=r.match(/^\/([^\s:]+)\s*:(.*)$/);if(!i)return r;let[,a,o]=i,s=o.trimStart();return s?`/${a} ${s}`:`/${a}`}function $t(e){let t=Qt(e);if(!t.startsWith(`/`))return null;let n=t.match(/^\/([^\s]+)(?:\s+([\s\S]+))?$/);if(!n)return null;let r=n[1]?.trim().toLowerCase()??``,i=(n[2]??``).trim();return r?{name:r,rest:i}:null}function en(e){let t=e.trim();if(!t.startsWith(`/`))return null;let n=t.match(/^\/([^\s:]+)\s*:(.*)$/s),r=(n?(()=>{let[,e,t]=n,r=t.trimStart();return r?`/${e} ${r}`:`/${e}`})():t).match(/^\/([^\s@]+)(?:@[^\s]+)?(?:\s+([\s\S]+))?$/);if(!r)return null;let i=r[1]?.trim().toLowerCase()??``;if(i!==`new`&&i!==`reset`)return null;let a=(r[2]??``).trim();return{action:i===`new`?`new`:`reset`,remainder:a}}function tn(e,t){let n=$t(e);if(!n)return{kind:`none`};if(n.name===`help`)return n.rest?{kind:`unknown`,name:n.name,args:n.rest}:{kind:`help`};if(n.name===`compact`)return{kind:`compact`,instructions:n.rest};if(n.name===`new`||n.name===`reset`)return{kind:`reset`,action:n.name===`new`?`new`:`reset`,remainder:n.rest};if(n.name===`skill`){if(!n.rest)return{kind:`unknown`,name:n.name,args:``};let e=n.rest.match(/^([^\s]+)(?:\s+([\s\S]+))?$/);return e?{kind:`skill`,name:Yt(e[1]??``),args:(e[2]??``).trim()}:{kind:`unknown`,name:n.name,args:n.rest}}return new Set(Xt(t).map(e=>e.name.slice(1))).has(n.name)?{kind:`skill-direct`,name:n.name,args:n.rest}:{kind:`unknown`,name:n.name,args:n.rest}}const nn=new Set([`/new`,`/reset`,`/compact`]),rn=new Set([`/help`]);function an(e){return e.name===`/compact`?{...e,name:`/compact [instructions]`}:e.name===`/skill`?{...e,name:`/skill <name> [input]`}:e}function on(e){if(e.length===0)return[];let t=e.map(an),n=Math.max(25,...t.map(e=>e.name.length));return t.map(e=>` ${e.name.padEnd(n)} ${e.description}`)}function sn(e){let t=Zt(e.skills),n=t.builtin.filter(e=>nn.has(e.name)),r=t.builtin.filter(e=>e.name===`/skill`),i=t.builtin.filter(e=>rn.has(e.name)),a=t.skillCommands.slice(0,4),o=[];return o.push(`帮助`),o.push(``),o.push(`会话命令`),o.push(...on(n)),o.push(``),o.push(`技能命令`),o.push(...on(r)),a.length>0?(o.push(...on(a)),t.skillCommands.length>a.length&&o.push(` ... 还有 ${t.skillCommands.length-a.length} 个`)):o.push(` 未安装技能命令`),o.push(``),o.push(`其他命令`),o.push(...on(i)),{kind:`reply`,text:o.join(`
|
|
13
|
+
`)}}function cn(e,t){let n=t.trim().toLowerCase();return n&&Xt(e).map(e=>e.name.slice(1)).includes(n)?{name:n}:null}function ln(e){let t=cn(e.ctx.skills,e.skillName);return t?{kind:`rewrite`,message:[`Use the "${t.name}" skill for this request.`,e.args?`User input:\n${e.args}`:null].filter(e=>!!e).join(`
|
|
14
14
|
|
|
15
|
-
`)}:{kind:`reply`,text:`❌ Skill not found: ${e.skillName}. Use /help to see available skills.`}}function
|
|
16
|
-
`):e.content;return H(e.toolName)+H(t)}function U(e){return e.reduce((e,t)=>e+
|
|
17
|
-
`);async function
|
|
15
|
+
`)}:{kind:`reply`,text:`❌ Skill not found: ${e.skillName}. Use /help to see available skills.`}}function un(e){let t=tn(e.message,e.skills);return t.kind===`none`?{kind:`pass`,message:e.message}:t.kind===`help`?sn(e):t.kind===`compact`?{kind:`compact`,instructions:t.instructions}:t.kind===`skill`||t.kind===`skill-direct`?ln({ctx:e,skillName:t.name,args:t.args}):t.kind===`unknown`&&t.name===`skill`?{kind:`reply`,text:`Usage: /skill <name> [input]`}:{kind:`pass`,message:e.message}}function H(e){return Math.ceil(e.length/4*1.2)}function dn(e){if(e.role===`user`)return H(e.content);if(e.role===`assistant`){let t=H(e.content);for(let n of e.toolCalls??[])t+=H(n.name)+H(JSON.stringify(n.arguments));return t}let t=e.toolResultRef?[`[tool result persisted] ${e.toolResultRef.toolName} (${e.toolResultRef.originalChars} chars).`,`Full output: ${e.toolResultRef.storagePath}`,e.toolResultRef.preview].filter(Boolean).join(`
|
|
16
|
+
`):e.content;return H(e.toolName)+H(t)}function U(e){return e.reduce((e,t)=>e+dn(t),0)}const fn=[`You are a conversation history summariser. Compress the conversation below into a concise summary.`,``,`MUST PRESERVE:`,`- Active tasks and their current status (including batch progress e.g. '5/17 items done')`,`- The last thing the user requested and what was being done about it`,`- Decisions made and their rationale`,`- TODOs, open questions, and constraints`,`- All opaque identifiers exactly as written: UUIDs, hashes, file paths, URLs, IPs, ports (never shorten or reconstruct them)`,``,`Prioritise recent context over older history.`,`Output only the summary text — no preamble, no headings.`].join(`
|
|
17
|
+
`);async function pn(e){let{entries:t,llm:n,previousSummary:r,instructions:i,signal:a,hooks:o,hookCtx:s}=e,c=hn(t,r,i),l,u=it({baseUrl:n.baseUrl,apiKey:n.apiKey,defaultModel:n.model,hooks:o,hookCtx:s});for(let e=1;e<=3;e++)try{let e=(await u.chat({system:fn,user:c,temperature:0,maxTokens:2048,signal:a})).text.trim();if(!e)throw Error(`LLM summarisation returned empty content`);return e}catch(t){if(t instanceof Error&&t.name===`AbortError`)throw t;l=t,e<3&&await mn(500*e)}throw l}function mn(e){return new Promise(t=>setTimeout(t,e))}function hn(e,t,n){let r=[];n?.trim()&&r.push(`[Extra instructions]\n${n.trim()}\n`),t?.trim()?(r.push(`[Prior summary]\n${t.trim()}\n`),r.push(`[Conversation to incorporate]`)):r.push(`[Conversation to summarise]`);for(let t of e)if(t.role===`user`)r.push(`User: ${t.content}`);else if(t.role===`assistant`){let e=t.toolCalls&&t.toolCalls.length>0?` [called tools: ${t.toolCalls.map(e=>e.name).join(`, `)}]`:``;r.push(`Assistant:${e} ${t.content}`.trimEnd())}else if(t.role===`tool_result`){let e=t.isError?`error`:`ok`,n=t.toolResultRef?[`[tool result persisted] ${t.toolResultRef.toolName} (${t.toolResultRef.originalChars} chars).`,`Full output: ${t.toolResultRef.storagePath}`,t.toolResultRef.preview.trim()?`Preview:\n${t.toolResultRef.preview.trimEnd()}`:``].filter(Boolean).join(`
|
|
18
18
|
`):t.content,i=n.length>2e3?`${n.slice(0,2e3)}… [truncated]`:n;r.push(`Tool(${t.toolName})[${e}]: ${i}`)}return r.join(`
|
|
19
|
-
`)}function
|
|
20
|
-
`);function
|
|
21
|
-
`)}async function
|
|
19
|
+
`)}function gn(e,t){let n=Math.floor(t*.35),r=0,i=e.length;for(let t=e.length-1;t>=0;t--){let a=dn(e[t]);if(r+a>n)break;r+=a,i=t}return{toKeep:e.slice(i),toSummarise:e.slice(0,i)}}function _n(e){let t=new Set;for(let n of e)if(n.role===`assistant`)for(let e of n.toolCalls??[])t.add(e.id);let n=e.filter(e=>e.role!==`tool_result`||t.has(e.toolCallId));return n.length===e.length?e:n}async function vn(e){let{entries:t,contextWindowTokens:n,llm:r,instructions:i,signal:a,hooks:o,hookCtx:s}=e,c=yn(t),l=c>=0?t[c].content:void 0,u=_n(c>=0?t.slice(c+1):t);if(u.length===0)return{status:`skipped`,reason:`No history to compact.`,estimatedTokens:0};let{toKeep:d,toSummarise:f}=gn(u,n);return f.length===0&&u.length>1&&(f=u.slice(0,u.length-1),d=u.slice(u.length-1)),f.length===0?{status:`skipped`,reason:`Not enough history to compact.`,estimatedTokens:U(u)}:{status:`compacted`,entry:{role:`compaction`,content:await pn({entries:f,llm:r,previousSummary:l,instructions:i,signal:a,hooks:o,hookCtx:s}),keptCount:d.length,droppedCount:f.length,timestamp:new Date().toISOString()},keptCount:d.length,droppedCount:f.length,estimatedTokens:U(d)}}function yn(e){for(let t=e.length-1;t>=0;t--)if(e[t].role===`compaction`)return t;return-1}const bn=[`✨ 新会话已开启,我们可以重新开始啦~`,``,` 我是爱码Max,你的AI研发助手。你可以这样和我聊:`,` 💻 “用React写一个登录组件”`,` ✏️ “帮我写一个用户中心的PRD”`,` 🧪 “为这个接口设计测试用例”`,` 💬 “解释下什么是微服务”`,``,` 直接说出你的需求就行~`].join(`
|
|
20
|
+
`);function xn(){return{kind:`reply`,text:bn}}function Sn(){return{kind:`reply`,text:`✅ Session reset.`}}function Cn(e){let t=En(e)?`text`:`messages`,n=t===`text`?e.message:void 0,r=t===`messages`?e.messages:void 0,i=r?Dn(r):null,a=n??i?.text,o=a?en(a):null,s=o?.remainder??``,c=!!(o&&!s),l=o&&s?s:a,u=t===`text`?l??``:o&&s&&r?On(r,s):r;return{inputMode:t,rawMessage:n,promptInput:u,transcriptMessage:t===`text`?c?n:l??``:kn(u),slashCommandSource:a,messageForRun:l,requestedSessionId:o?void 0:e.sessionId,previousSessionId:o?e.sessionId:void 0,resetCommand:o??void 0,resetShortCircuit:c}}function wn(e,t){if(e.resetShortCircuit)return{kind:`reset_reply`,action:e.resetCommand?.action??`new`,transcriptMessage:e.transcriptMessage,initialUserEntryPersisted:!0};if(!e.slashCommandSource)return{kind:`run`,effectivePrompt:e.promptInput,transcriptMessage:e.transcriptMessage};let n=un({message:e.messageForRun??``,skills:t});if(n.kind===`reply`)return{kind:`reply`,replyText:n.text,transcriptMessage:e.transcriptMessage};if(n.kind===`compact`)return{kind:`compact`,transcriptMessage:e.transcriptMessage,instructions:n.instructions,initialUserEntryPersisted:e.resetCommand?!0:void 0};if(n.kind===`rewrite`){let t=e.inputMode===`text`?n.message:On(e.promptInput,n.message);return{kind:`run`,effectivePrompt:t,transcriptMessage:kn(t)}}return{kind:`run`,effectivePrompt:e.inputMode===`text`?e.messageForRun??``:e.promptInput,transcriptMessage:e.inputMode===`text`?e.messageForRun??``:e.transcriptMessage}}async function Tn(e){let t=wn(e.invocation,e.skills);if(t.kind===`run`)return{kind:`continue`,effectivePrompt:t.effectivePrompt,transcriptMessage:t.transcriptMessage};if(t.kind===`reset_reply`)return{kind:`completed`,result:await Gt({replyText:(t.action===`reset`?Sn():xn()).text,sessionId:e.sessionId,isNewSession:e.isNewSession,transcriptMessage:t.transcriptMessage,initialUserEntryPersisted:t.initialUserEntryPersisted||e.initialUserEntryPersisted,runParams:e.runParams,hookRegistry:e.hookRegistry,hookContext:e.hookContext,startTime:e.startTime,eventDispatcher:e.eventDispatcher})};if(t.kind===`reply`)return{kind:`completed`,result:await Gt({replyText:t.replyText,sessionId:e.sessionId,isNewSession:e.isNewSession,transcriptMessage:t.transcriptMessage,initialUserEntryPersisted:t.initialUserEntryPersisted||e.initialUserEntryPersisted,runParams:e.runParams,hookRegistry:e.hookRegistry,hookContext:e.hookContext,startTime:e.startTime,eventDispatcher:e.eventDispatcher})};let n=await vn({entries:e.runParams.channel===`CRON`?[]:await w(e.runParams.dataDir,e.sessionId),contextWindowTokens:e.runParams.llm.contextWindow??2e5,llm:{baseUrl:e.runParams.llm.baseUrl,apiKey:e.runParams.llm.apiKey,model:e.runParams.llm.model},instructions:t.instructions,signal:e.runParams.abortSignal,hooks:e.hookRegistry,hookCtx:e.hookContext});return{kind:`completed`,result:await Gt({replyText:n.status===`compacted`?`⚙️ Compacted (kept ${n.keptCount}, dropped ${n.droppedCount}).`:`⚙️ Compaction skipped: ${n.reason}`,sessionId:e.sessionId,isNewSession:e.isNewSession,transcriptMessage:t.transcriptMessage,initialUserEntryPersisted:t.initialUserEntryPersisted||e.initialUserEntryPersisted,runParams:e.runParams,hookRegistry:e.hookRegistry,hookContext:e.hookContext,startTime:e.startTime,compactionEntry:n.status===`compacted`?n.entry:void 0,eventDispatcher:e.eventDispatcher})}}function En(e){return typeof e.message==`string`}function Dn(e){for(let t=0;t<e.length;t+=1){let n=e[t];if(n.role!==`user`)continue;if(typeof n.content==`string`)return{index:t,text:n.content};if(!Array.isArray(n.content)||n.content.length===0)return null;let r=n.content[0];return r?.type===`text`&&typeof r.text==`string`?{index:t,text:r.text}:null}return null}function On(e,t){let n=Dn(e);return n?e.map((e,r)=>{if(r!==n.index)return e;let i=e;return typeof i.content==`string`?{...e,content:t}:Array.isArray(i.content)&&i.content.length>0?{...e,content:i.content.map((e,n)=>{if(n!==0)return e;let r=e;return r?.type===`text`&&typeof r.text==`string`?{...r,text:t}:e})}:e}):e}function kn(e){return typeof e==`string`?e:JSON.stringify(e)}function An(e,t){if(!t||t<=0||e.length===0)return e;let n=0,r=e.length;for(let i=e.length-1;i>=0;i--)if(e[i].role===`user`){if(n++,n>t)return e.slice(r);r=i}return e}const jn={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}};function W(e,t){return e.map(e=>Mn(e,t))}function Mn(e,t){let n=new Date(e.timestamp).getTime();if(Nn(e))return{role:`user`,content:e.content,timestamp:n};if(Pn(e)){let r=[];e.content&&r.push({type:`text`,text:e.content});for(let t of e.toolCalls??[])r.push({type:`toolCall`,id:t.id,name:t.name,arguments:t.arguments});return{role:`assistant`,content:r,api:t.api,provider:`openai`,model:t.model,usage:jn,stopReason:`stop`,timestamp:n}}let r=e;return{role:`toolResult`,toolCallId:r.toolCallId,toolName:r.toolName,content:[{type:`text`,text:Fn(r)}],isError:r.isError,timestamp:n}}function Nn(e){return e.role===`user`}function Pn(e){return e.role===`assistant`}function Fn(e){if(!e.toolResultRef)return e.content;let t=e.toolResultRef.preview.trimEnd(),n=[`[tool result persisted] ${e.toolResultRef.toolName} (${e.toolResultRef.originalChars} chars).`,`Full output: ${e.toolResultRef.storagePath}`];return t&&(n.push(`Preview:`),n.push(t)),n.join(`
|
|
21
|
+
`)}async function In(e){let t=Bn(e.dataDir,e.sessionId),n=new Map,r=new Map,i=[],a=[],o=[],s,c=0,l,u,d=await Wn(t);for(let e of d.readStates)n.set(Ln(e.path,e.offset,e.limit),e);for(let e of d.toolResults)r.set(e.toolCallId,e);i.push(...d.compaction.budgets),a.push(...d.compaction.snips),o.push(...d.compaction.collapseSpans),s=d.compaction.sessionMemory,c=d.compaction.consecutiveAutocompactFailures,l=d.compaction.lastCompactionAt,u=d.compaction.lastCompactionLayer;let f=async()=>{let e={version:2,updatedAt:new Date().toISOString(),readStates:Array.from(n.values()),toolResults:Array.from(r.values()).slice(-100),compaction:{sessionMemory:s,budgets:i.slice(-200),snips:a.slice(-200),collapseSpans:o.slice(-100),consecutiveAutocompactFailures:c,lastCompactionAt:l,lastCompactionLayer:u}};await N.mkdir(P.dirname(t),{recursive:!0}),await N.writeFile(t,JSON.stringify(e,null,2),`utf-8`)};return{async findReusableRead(e,t,r){let i=Ln(e,t,r),a=n.get(i);if(!a)return null;let o=await Hn(e);return o===null||o!==a.lastModifiedMs?(n.delete(i),await f(),null):a},async recordRead(e){let t=new Date().toISOString(),r={path:e.path,offset:e.offset,limit:e.limit,contentHash:Un(e.content),lineCount:e.lineCount,capturedAt:t,lastModifiedMs:await Hn(e.path)??Date.now()};return n.set(Ln(e.path,e.offset,e.limit),r),await f(),r},async invalidatePath(e){let t=!1;for(let[r,i]of n.entries())Rn(i.path)===Rn(e)&&(n.delete(r),t=!0);t&&await f()},async persistToolResult(t){let n=t.thresholdChars??12e3;if(t.content.length<=n)return{content:t.content};let a=t.previewChars??2e3,o=Vn(e.dataDir,e.sessionId),s=`${t.toolCallId}.txt`,c=P.join(o,s);await N.mkdir(o,{recursive:!0}),await N.writeFile(c,t.content,`utf-8`);let d=P.relative(e.dataDir,c).split(P.sep).join(`/`),p=qn(t.content,a),m={sessionId:e.sessionId,toolCallId:t.toolCallId,toolName:t.toolName,storagePath:d,preview:p,originalChars:t.content.length,truncated:!0,createdAt:new Date().toISOString()};return r.set(m.toolCallId,m),i.push({toolCallId:m.toolCallId,toolName:m.toolName,originalChars:t.content.length,storedChars:t.content.length,previewChars:p.length,strategy:`persist`,createdAt:m.createdAt}),l=m.createdAt,u=`L2`,await f(),{content:Kn(m),reference:m}},async recordSnip(e){a.push(e),l=e.createdAt,u=e.reason===`context_dedup`?`L1`:e.reason===`microcompact`?`L4`:`L3`,await f()},async recordCollapse(e){o.push(e),l=e.createdAt,u=e.layer,await f()},async setSessionMemory(t){s=t,await Jn(e.dataDir,e.sessionId,t),await f()},async recordAutocompactResult(e){c=e.failed?c+1:0,l=e.timestamp,u=`L6`,await f()},getSnapshot(){return{version:2,updatedAt:new Date().toISOString(),readStates:Array.from(n.values()),toolResults:Array.from(r.values()).slice(-100),compaction:{sessionMemory:s,budgets:i.slice(-200),snips:a.slice(-200),collapseSpans:o.slice(-100),consecutiveAutocompactFailures:c,lastCompactionAt:l,lastCompactionLayer:u}}}}}function Ln(e,t,n){return`${Rn(e)}::${t??``}::${n??``}`}function Rn(e){return P.normalize(e)}function zn(e,t){return P.join(e,`.aimax`,`sessions`,t)}function Bn(e,t){return P.join(zn(e,t),`context.json`)}function Vn(e,t){return P.join(zn(e,t),`tool-results`)}async function Hn(e){try{return(await N.stat(e)).mtimeMs}catch{return null}}function Un(e){return Ee(`sha1`).update(e).digest(`hex`)}async function Wn(e){try{let t=await N.readFile(e,`utf-8`),n=JSON.parse(t),r=typeof n.version==`number`?n.version:void 0;return r!==1&&r!==2?Gn():{version:2,updatedAt:typeof n.updatedAt==`string`?n.updatedAt:new Date(0).toISOString(),readStates:Array.isArray(n.readStates)?n.readStates:[],toolResults:Array.isArray(n.toolResults)?n.toolResults:[],compaction:{sessionMemory:n.compaction?.sessionMemory,budgets:Array.isArray(n.compaction?.budgets)?n.compaction.budgets:[],snips:Array.isArray(n.compaction?.snips)?n.compaction.snips:[],collapseSpans:Array.isArray(n.compaction?.collapseSpans)?n.compaction.collapseSpans:[],consecutiveAutocompactFailures:typeof n.compaction?.consecutiveAutocompactFailures==`number`?n.compaction.consecutiveAutocompactFailures:0,lastCompactionAt:typeof n.compaction?.lastCompactionAt==`string`?n.compaction.lastCompactionAt:void 0,lastCompactionLayer:n.compaction?.lastCompactionLayer===`L1`||n.compaction?.lastCompactionLayer===`L2`||n.compaction?.lastCompactionLayer===`L3`||n.compaction?.lastCompactionLayer===`L4`||n.compaction?.lastCompactionLayer===`L5`||n.compaction?.lastCompactionLayer===`L6`?n.compaction.lastCompactionLayer:void 0}}}catch{return Gn()}}function Gn(){return{version:2,updatedAt:new Date(0).toISOString(),readStates:[],toolResults:[],compaction:{budgets:[],snips:[],collapseSpans:[],consecutiveAutocompactFailures:0}}}function Kn(e){let t=e.preview.length<e.originalChars?`
|
|
22
22
|
...`:``;return[`[tool result persisted] ${e.toolName} output was too large (${e.originalChars} chars).`,`Full output: ${e.storagePath}`,``,`Preview:`,e.preview+t].join(`
|
|
23
|
-
`)}function
|
|
24
|
-
`),r=n>t*.5?n:t;return e.slice(0,r)}async function
|
|
25
|
-
`);if(s===n.content){l.push(n);continue}u+=1,d+=Math.max(0,Math.floor((n.content.length-s.length)/4));let f=new Date().toISOString();await o?.recordSnip({toolCallId:n.toolCallId,toolName:n.toolName,originalChars:n.content.length,retainedChars:s.length,reason:a===`microcompact`?`microcompact`:`history_snip`,createdAt:f}),l.push({...n,content:s})}return u>0&&s.push({type:`compaction`,reason:`${a===`snip`?`Snip compacted`:`Microcompacted`} ${u} tool results`,layer:i,strategy:a,estimatedTokensFreed:d,affectedEntries:u,snapshotVersion:2}),
|
|
26
|
-
`);r!==e.content&&(a+=1,o+=Math.max(0,Math.floor((e.content.length-r.length)/4)),await n?.recordSnip({toolCallId:e.toolCallId,toolName:e.toolName,originalChars:e.content.length,retainedChars:r.length,reason:`microcompact`,createdAt:new Date().toISOString()})),s.push({...e,content:r})}return a===0?t:(r.push({type:`compaction`,reason:`Microcompacted ${a} stale tool results`,layer:`L4`,strategy:`microcompact_age`,estimatedTokensFreed:o,affectedEntries:a,snapshotVersion:2}),
|
|
23
|
+
`)}function qn(e,t){if(e.length<=t)return e;let n=e.slice(0,t).lastIndexOf(`
|
|
24
|
+
`),r=n>t*.5?n:t;return e.slice(0,r)}async function Jn(e,t,n){let r=P.join(zn(e,t),`session-memory.json`);await N.mkdir(P.dirname(r),{recursive:!0}),await N.writeFile(r,JSON.stringify(n,null,2),`utf-8`)}const Yn=new Set([`read_file`,`list_dir`,`glob`,`grep`,`bash`,`exec`,`web_fetch`,`web_search`]);async function Xn(e){let{entries:t,modelInfo:n,contextWindowTokens:r,llm:i,historyLimit:a,compactionEnabled:o=!0,signal:s,hooks:c,hookCtx:l,contextStore:u,dataDir:d,sessionId:f}=e,p,m=ir(t),h=m>=0?t.slice(m+1):t;m>=0&&(p=t[m].content);let g=t.length,_=_n(An(h,a)),v=[];u&&(p=await Zn({entries:_,existingSummary:p,llm:i,contextStore:u,signal:s,hooks:c,hookCtx:l}));let y=_;if(y=await Qn({entries:y,maxInlineResults:8,maxChars:1e3,layer:`L3`,strategy:`snip`,contextStore:u,compactionEvents:v}),y=await $n({entries:y,contextStore:u,compactionEvents:v}),y=await er({entries:y,contextStore:u,compactionEvents:v,dataDir:d,sessionId:f}),!o)return{messages:W(y,n),priorSummary:p,compactionEntry:void 0,stats:{originalCount:g,keptCount:y.length,estimatedTokens:U(y),compacted:!1},compactionEvents:v};let b=ar(r),x=U(y)>=Math.max(1e3,b-13e3),S=u?.getSnapshot(),C=S?.compaction.consecutiveAutocompactFailures??0;if(!x||C>=3)return{messages:W(y,n),priorSummary:p,compactionEntry:void 0,stats:{originalCount:g,keptCount:y.length,estimatedTokens:U(y),compacted:!1},compactionEvents:v};let{toKeep:w,toSummarise:T}=gn(y,b);if(T.length===0)return{messages:W(y,n),priorSummary:p,compactionEntry:void 0,stats:{originalCount:g,keptCount:y.length,estimatedTokens:U(y),compacted:!1},compactionEvents:v};let E=new Date().toISOString();try{let e=S?.compaction.sessionMemory,t=e?.summary?.trim()?e.summary.trim():await pn({entries:T,llm:i,previousSummary:p,signal:s,hooks:c,hookCtx:l}),r={role:`compaction`,content:t,keptCount:w.length,droppedCount:T.length,timestamp:E};return await u?.recordAutocompactResult({layer:`L6`,failed:!1,timestamp:E}),v.push({type:`compaction`,reason:e?.summary?.trim()?`Autocompact replaced ${T.length} entries with session memory`:`Autocompact summarised ${T.length} entries`,layer:`L6`,strategy:e?.summary?.trim()?`session_memory`:`full_summary`,estimatedTokensFreed:Math.max(0,U(T)),affectedEntries:T.length,snapshotVersion:2}),{messages:W(_n(w),n),priorSummary:t,compactionEntry:r,stats:{originalCount:g,keptCount:w.length,estimatedTokens:U(w),compacted:!0},compactionEvents:v}}catch{return await u?.recordAutocompactResult({layer:`L6`,failed:!0,timestamp:E}),{messages:W(y,n),priorSummary:p,compactionEntry:void 0,stats:{originalCount:g,keptCount:y.length,estimatedTokens:U(y),compacted:!1},compactionEvents:[...v,{type:`compaction`,reason:`Autocompact failed and was skipped for this turn`,layer:`L6`,strategy:`circuit_breaker_retry`,snapshotVersion:2}]}}}async function Zn(e){let{entries:t,existingSummary:n,llm:r,contextStore:i,signal:a,hooks:o,hookCtx:s}=e,c=U(t),l=i.getSnapshot().compaction.sessionMemory,u=!l&&c>=8e3,d=!!l&&c>=(l?.tokenEstimate??0)+15e3&&rr(t)>=3;if(!u&&!d)return n??l?.summary;let f=await pn({entries:t,llm:r,previousSummary:n??l?.summary,instructions:`Produce a durable session memory for future compaction and resume.`,signal:a,hooks:o,hookCtx:s}),p={version:1,summary:f,generatedAt:new Date().toISOString(),sourceEntryCount:t.length,tokenEstimate:c,trigger:u?`threshold`:`autocompact`};return await i.setSessionMemory(p),f}async function Qn(e){let{entries:t,maxInlineResults:n,maxChars:r,layer:i,strategy:a,contextStore:o,compactionEvents:s}=e;if(t.filter(nr).length<=n)return t;let c=n,l=[],u=0,d=0;for(let e=t.length-1;e>=0;--e){let n=t[e];if(!nr(n)){l.push(n);continue}if(c>0&&n.content.length<=r){--c,l.push(n);continue}let i=n.toolResultRef?.preview?.trim()||n.content.slice(0,r).trim(),s=[`[${a}] Older tool output condensed for context control.`,`Tool: ${n.toolName}`,i?`Preview:\n${i}`:``].filter(Boolean).join(`
|
|
25
|
+
`);if(s===n.content){l.push(n);continue}u+=1,d+=Math.max(0,Math.floor((n.content.length-s.length)/4));let f=new Date().toISOString();await o?.recordSnip({toolCallId:n.toolCallId,toolName:n.toolName,originalChars:n.content.length,retainedChars:s.length,reason:a===`microcompact`?`microcompact`:`history_snip`,createdAt:f}),l.push({...n,content:s})}return u>0&&s.push({type:`compaction`,reason:`${a===`snip`?`Snip compacted`:`Microcompacted`} ${u} tool results`,layer:i,strategy:a,estimatedTokensFreed:d,affectedEntries:u,snapshotVersion:2}),_n(l.reverse())}async function $n(e){let{entries:t,contextStore:n,compactionEvents:r}=e,i=Date.now()-36e5,a=0,o=0,s=[];for(let e of t){if(!nr(e)){s.push(e);continue}let t=Date.parse(e.timestamp);if(!(t>0&&t<i)){s.push(e);continue}let r=[`[microcompact] Tool output aged out of the hot context window.`,`Tool: ${e.toolName}`,`Preview:\n${e.toolResultRef?.preview?.trim()||e.content.slice(0,400).trim()}`].join(`
|
|
26
|
+
`);r!==e.content&&(a+=1,o+=Math.max(0,Math.floor((e.content.length-r.length)/4)),await n?.recordSnip({toolCallId:e.toolCallId,toolName:e.toolName,originalChars:e.content.length,retainedChars:r.length,reason:`microcompact`,createdAt:new Date().toISOString()})),s.push({...e,content:r})}return a===0?t:(r.push({type:`compaction`,reason:`Microcompacted ${a} stale tool results`,layer:`L4`,strategy:`microcompact_age`,estimatedTokensFreed:o,affectedEntries:a,snapshotVersion:2}),Qn({entries:s,maxInlineResults:4,maxChars:400,layer:`L4`,strategy:`microcompact`,contextStore:n,compactionEvents:r}))}async function er(e){let{entries:t,contextStore:n,compactionEvents:r,dataDir:i,sessionId:a}=e,o=t.reduce((e,t,n)=>(t.role===`user`&&e.push(n),e),[]);if(o.length<=2)return t;let s=o[o.length-2]??t.length,c=[],l=0,u=0,d=0;for(;l<t.length;){if(l>=s||t[l]?.role===`user`){c.push(t[l]),l+=1;continue}let e=l;for(;l<s&&t[l]?.role!==`user`;)l+=1;let r=t.slice(e,l),o=r.filter(nr).filter(e=>Yn.has(e.toolName)),f=o.reduce((e,t)=>e+t.content.length,0);if(o.length<3||f<1500){c.push(...r);continue}let p=tr(r,o),m=new Date().toISOString(),h={role:`assistant`,content:p,timestamp:m};c.push(h),u+=r.length,d+=Math.max(0,Math.floor(U(r)-U([h])));let g={id:L(),layer:`L5`,startEntryIndex:e,endEntryIndex:l-1,toolNames:[...new Set(o.map(e=>e.toolName))],summary:p,sourceCount:r.length,estimatedTokensFreed:d,createdAt:m};await n?.recordCollapse(g),i&&a&&await or(i,a,g)}return u>0&&r.push({type:`compaction`,reason:`Collapsed ${u} historical tool activity entries`,layer:`L5`,strategy:`context_collapse`,estimatedTokensFreed:d,affectedEntries:u,snapshotVersion:2}),c}function tr(e,t){let n=[...new Set(t.map(e=>e.toolName))],r=t.slice(-3).map(e=>`- ${e.toolName}: ${(e.toolResultRef?.preview||e.content).slice(0,180).trim()}`).join(`
|
|
27
27
|
`),i=e.filter(e=>e.role===`assistant`).map(e=>e.content.trim()).filter(Boolean).slice(-2).join(`
|
|
28
28
|
`);return[`[context collapse] ${t.length} tool results across ${n.join(`, `)}`,i?`Assistant checkpoints:\n${i}`:``,r?`Recent tool findings:\n${r}`:``].filter(Boolean).join(`
|
|
29
29
|
|
|
30
|
-
`)}function
|
|
31
|
-
`)}function
|
|
32
|
-
`)}],details:{status:l.status,sessionId:l.sessionId,command:l.command,cwd:l.cwd,exitCode:l.exitCode,exitSignal:l.exitSignal,toolResultRef:m?.reference}}}}}const
|
|
33
|
-
`)}],details:{status:`completed`,sessions:t}}}if(!n.sessionId?.trim())return
|
|
34
|
-
`);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
|
|
35
|
-
`),c=Math.max(1,r.offset??1),l=Math.min(
|
|
30
|
+
`)}function nr(e){return e.role===`tool_result`}function rr(e){return e.reduce((e,t)=>e+(t.role===`user`?1:0),0)}function ir(e){for(let t=e.length-1;t>=0;--t)if(e[t]?.role===`compaction`)return t;return-1}function ar(e){return Math.max(256,e-Math.min(e/4,2e4))}async function or(e,t,n){let r=p(e,t);await N.mkdir(P.dirname(r),{recursive:!0}),await N.appendFile(r,`${JSON.stringify(n)}\n`,`utf-8`)}async function sr(e){let t=await In(e);return{async getReusableRead(e,n,r){let i=await t.findReusableRead(e,n,r);return i?{reused:!0,lineCount:i.lineCount}:{reused:!1}},async rememberRead(e){await t.recordRead(e)},async invalidateReadPath(e){await t.invalidatePath(e)},persistToolResult(e){return t.persistToolResult(e)},manageHistory(e){return Xn({...e,contextStore:t})},getSnapshot:t.getSnapshot}}async function cr(e){return e.contextManager?e.contextManager.manageHistory({entries:e.entries,modelInfo:e.modelInfo,contextWindowTokens:e.contextWindowTokens,llm:e.llm,historyLimit:e.historyLimit,compactionEnabled:e.compactionEnabled,signal:e.signal,hooks:e.hooks,hookCtx:e.hookCtx,dataDir:e.dataDir,sessionId:e.sessionId}):Xn({entries:e.entries,modelInfo:e.modelInfo,contextWindowTokens:e.contextWindowTokens,llm:e.llm,historyLimit:e.historyLimit,compactionEnabled:e.compactionEnabled,signal:e.signal,hooks:e.hooks,hookCtx:e.hookCtx,dataDir:e.dataDir,sessionId:e.sessionId})}var G=class extends Error{isHitlPause=!0;constructor(e,t,n){super(`HITL_PAUSED`),this.request=e,this.checkpoint=t,this.toolContext=n,this.name=`HitlPauseSignal`}};function lr(e){return!!(e instanceof G||typeof e==`object`&&e&&`isHitlPause`in e&&e.isHitlPause===!0)}const ur=F.Object({command:F.String({description:`Shell command to execute`}),workdir:F.Optional(F.String({description:`Working directory (relative to workspace root)`})),env:F.Optional(F.Record(F.String(),F.String())),timeout:F.Optional(F.Number({description:`Timeout in seconds (default: 1800)`})),yieldMs:F.Optional(F.Number({description:`Wait this many milliseconds before returning running state`})),background:F.Optional(F.Boolean({description:`Return immediately with running session`}))});function dr(e,t,n){return Math.max(t,Math.min(n,e))}function fr(e){return typeof e!=`number`||!Number.isFinite(e)||e<=0?1800:Math.floor(e)}function pr(e){return typeof e!=`number`||!Number.isFinite(e)||e<0?1e4:dr(Math.floor(e),0,12e4)}function mr(e,t){if(!t?.trim())return e;let n=P.isAbsolute(t)?P.normalize(t):P.normalize(P.join(e,t));if(!n.startsWith(e+P.sep)&&n!==e)throw Error(`workdir escapes workspace: ${t}`);return n}function hr(e){let t=e.outputTail.trim();return`${t.length>0?`${t}\n\n`:``}Process is running in the background. sessionId=${e.sessionId}\nUse process(action="poll"|"log", sessionId) to continue.`}function gr(e){return vr({stdout:e.stdoutTail,stderr:e.stderrTail,exitCode:e.exitCode,backgroundInfo:``}).join(`
|
|
31
|
+
`)}function _r(e){return e.replace(/^(\s*\n)+/,``).trimEnd()}function vr(e){let t=_r(e.stdout),n=e.stderr.trim();if(e.exitCode!==void 0&&e.exitCode!==0){let t=`Exit code: ${e.exitCode===null?`null`:e.exitCode}`;n=n.length>0?`${n}\n${t}`:t}return[t.length>0?t:`(no output)`,n,e.backgroundInfo?.trim()||``].filter(e=>e.length>0)}function yr(e){return/\b(rm|mv|cp|chmod|chown|sudo|git\s+push|kubectl\s+delete|terraform\s+apply|docker\s+rm)\b|[>|]{1,2}\s*[^ ]+/i.test(e)}function br(e,t,n){return!e||e.request.kind!==`approval`||e.toolContext?.toolName!==`exec`||e.toolContext.toolCallId!==t||JSON.stringify(e.toolContext.toolArgs)!==JSON.stringify(n)?!1:e.resolution.action===`submit`&&(e.resolution.values?.selectedChoiceIds?.includes(`approve`)??!1)}function xr(e){return{name:`exec`,label:`Exec`,description:`Execute shell commands with optional background continuation. Use process tool to poll logs and status.`,parameters:ur,async execute(t,n,r){if(!n.command?.trim())return{content:[{type:`text`,text:`Error: command is required.`}],details:{status:`failed`}};if(e.sessionId&&yr(n.command)&&!br(e.hitlResume,t,n))throw new G({requestId:L(),sessionId:e.hitlResume?.request.sessionId??e.sessionId,kind:`approval`,title:`Confirm shell command`,prompt:`This command may modify system or workspace state. Approve before execution.`,details:{tool:`exec`,command:n.command,workdir:n.workdir},preview:{mimeType:`text/plain`,content:n.command},input:{mode:`choice`,choices:[{id:`approve`,label:`Approve`},{id:`deny`,label:`Deny`}]},policy:{resumable:!0,defaultOnTimeout:`deny`},createdAt:new Date().toISOString()},{turnId:t,phase:`before_tool`,resumeStrategy:`reenter_from_checkpoint`},{toolCallId:t,toolName:`exec`,toolArgs:n});let i;try{i=mr(e.workspaceDir,n.workdir)}catch(e){return{content:[{type:`text`,text:`Error: ${e instanceof Error?e.message:String(e)}`}],details:{status:`failed`}}}let a=fr(n.timeout),o=e.registry.start({command:n.command,cwd:i,env:n.env,timeoutSec:a,scopeKey:e.scopeKey}),s=n.background===!0,c=typeof n.yieldMs==`number`&&Number.isFinite(n.yieldMs),l=o,u;try{if(!s&&r&&(u=()=>{e.registry.terminate(o.sessionId,e.scopeKey)},r.aborted?u():r.addEventListener(`abort`,u,{once:!0})),!s&&!c){let t=await e.registry.wait(o.sessionId,e.scopeKey,void 0);t&&(l=t)}else if(!s){let t=await e.registry.wait(o.sessionId,e.scopeKey,pr(n.yieldMs));t&&(l=t)}}finally{r&&u&&r.removeEventListener(`abort`,u)}if(l.status===`running`)return{content:[{type:`text`,text:hr(l)}],details:{status:`running`,sessionId:l.sessionId,command:l.command,cwd:l.cwd,pid:l.pid}};let d=e.registry.readOutput(l.sessionId,e.scopeKey),f=d?vr({stdout:d.stdout,stderr:d.stderr,exitCode:l.exitCode,backgroundInfo:``}):[gr(l)],p=_r(d?.stdout??l.stdoutTail),m=await e.contextManager?.persistToolResult({toolCallId:t,toolName:`exec`,content:p.length>0?p:`(no output)`});return{content:[{type:`text`,text:[m?.content??(p.length>0?p:`(no output)`),...f.slice(1)].join(`
|
|
32
|
+
`)}],details:{status:l.status,sessionId:l.sessionId,command:l.command,cwd:l.cwd,exitCode:l.exitCode,exitSignal:l.exitSignal,toolResultRef:m?.reference}}}}}const Sr=F.Object({action:F.String({description:`Process action: list | poll | log | kill`}),sessionId:F.Optional(F.String({description:`Session id for non-list actions`})),offset:F.Optional(F.Number({description:`Log line offset (0-based)`})),limit:F.Optional(F.Number({description:`Maximum lines to return`})),timeout:F.Optional(F.Number({description:`Poll wait time in milliseconds`}))});function Cr(e){return typeof e!=`number`||!Number.isFinite(e)||e<0?0:Math.max(0,Math.min(12e4,Math.floor(e)))}function K(e){return{content:[{type:`text`,text:e}],details:{status:`failed`}}}function wr(e){return{name:`process`,label:`Process`,description:`Manage background exec sessions: list, poll, log, kill.`,parameters:Sr,async execute(t,n){let r=n.action?.trim().toLowerCase();if(r===`list`){let t=e.registry.list(e.scopeKey);return{content:[{type:`text`,text:t.length===0?`No running or recent sessions.`:t.map(e=>{let t=(e.endedAt??Date.now())-e.startedAt;return`${e.sessionId} ${e.status.padEnd(9)} ${t}ms :: ${e.command}`}).join(`
|
|
33
|
+
`)}],details:{status:`completed`,sessions:t}}}if(!n.sessionId?.trim())return K(`sessionId is required for this action.`);let i=n.sessionId.trim();if(r===`poll`){let t=await e.registry.wait(i,e.scopeKey,Cr(n.timeout));return t?{content:[{type:`text`,text:t.status===`running`?`Session ${i} is still running.`:`Session ${i} finished with status=${t.status}, exitCode=${t.exitCode??`null`}.`}],details:{status:t.status,sessionId:i,exitCode:t.exitCode,exitSignal:t.exitSignal,aggregated:t.status!==`running`}}:K(`No session found for ${i}`)}if(r===`log`){let t=e.registry.readLog({sessionId:i,scopeKey:e.scopeKey,offset:n.offset,limit:n.limit});return t?{content:[{type:`text`,text:t.text.trim().length>0?t.text:`(no output)`}],details:{status:t.status,sessionId:i,totalLines:t.totalLines,totalChars:t.totalChars,truncated:t.truncated,exitCode:t.exitCode,exitSignal:t.exitSignal}}:K(`No session found for ${i}`)}if(r===`kill`){let t=await e.registry.terminate(i,e.scopeKey);return t?{content:[{type:`text`,text:t.status===`running`?`Termination signal sent to ${i}.`:`Session ${i} terminated with status=${t.status}.`}],details:{status:t.status,sessionId:i,exitCode:t.exitCode,exitSignal:t.exitSignal}}:K(`No session found for ${i}`)}return K(`Unsupported action: ${n.action}`)}}}const Tr=2e5;function Er(e,t=4e3){return e?e.length>t?e.slice(-t):e:``}function Dr(e,t){let n=e+t;return n.length<=Tr?{text:n,truncated:!1}:{text:n.slice(-Tr),truncated:!0}}function Or(e,t,n){if(n.length===0)return;let r=n.toString(`utf-8`),i=Dr(e.output,r);e.output=i.text;let a=Dr(e[t],r);e[t]=a.text,(i.truncated||a.truncated)&&(e.outputTruncated=!0)}function q(e){return{sessionId:e.sessionId,scopeKey:e.scopeKey,command:e.command,cwd:e.cwd,pid:typeof e.child.pid==`number`?e.child.pid:void 0,startedAt:e.startedAt,endedAt:e.endedAt,status:e.status,exitCode:e.exitCode,exitSignal:e.exitSignal,outputTail:Er(e.output),stdoutTail:Er(e.stdout),stderrTail:Er(e.stderr),outputTruncated:e.outputTruncated}}function J(e,t){return t?e.scopeKey===t:!0}function kr(e,t){return typeof e!=`number`||!Number.isFinite(e)||e<=0?t:Math.floor(e)}function Ar(e){return e?e.split(/\r?\n/):[]}function jr(e){let t=Ar(e.record.output),n=e.offset===void 0&&e.limit===void 0,r=Math.max(0,(e.offset??0)|0),i=kr(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(`
|
|
34
|
+
`);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 Mr(e){e.timeoutTimer&&=(clearTimeout(e.timeoutTimer),void 0),e.killTimer&&=(clearTimeout(e.killTimer),void 0),e.resolveDone()}function Nr(){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),Mr(e))};return{start(t){let n=ke(`bash`,[`-lc`,t.command],{cwd:t.cwd,env:{...process.env,...t.env??{}},stdio:[`pipe`,`pipe`,`pipe`]}),r=()=>{},a=new Promise(e=>{r=e}),o={sessionId:L(),scopeKey:t.scopeKey,command:t.command,cwd:t.cwd,startedAt:Date.now(),child:n,status:`running`,output:``,stdout:``,stderr:``,outputTruncated:!1,donePromise:a,resolveDone:r};e.set(o.sessionId,o),n.stdout.on(`data`,e=>Or(o,`stdout`,e)),n.stderr.on(`data`,e=>Or(o,`stderr`,e));let s=kr(t.timeoutSec,1800);return o.timeoutTimer=setTimeout(()=>{o.status===`running`&&(o.status=`timeout`,Or(o,`stderr`,Buffer.from(`\n[Timed out after ${s}s]\n`)),o.child.kill(`SIGTERM`),o.killTimer=setTimeout(()=>{(o.status===`running`||o.status===`timeout`)&&o.child.kill(`SIGKILL`)},1e3))},s*1e3),n.on(`error`,e=>{i(o,()=>{o.status===`running`&&(o.status=`failed`),Or(o,`stderr`,Buffer.from(`\n[Process error: ${e.message}]\n`))})}),n.on(`close`,(e,t)=>{i(o,()=>{o.exitCode=e,o.exitSignal=t,o.status===`running`?o.status=e===0?`completed`:`failed`:o.status===`killed`&&e===0&&(o.status=`completed`)})}),q(o)},get(e,t){let n=r(e);return!n||!J(n,t)?null:q(n)},list(n){return[...e.values(),...t.values()].filter(e=>J(e,n)).sort((e,t)=>t.startedAt-e.startedAt).map(e=>q(e))},async wait(e,t,n){let i=r(e);if(!i||!J(i,t))return null;if(i.status!==`running`)return q(i);typeof n==`number`&&Number.isFinite(n)&&n>=0?await Promise.race([i.donePromise,new Promise(e=>{setTimeout(e,n)})]):await i.donePromise;let a=r(e);return!a||!J(a,t)?null:q(a)},readLog(e){let t=r(e.sessionId);return!t||!J(t,e.scopeKey)?null:jr({record:t,offset:e.offset,limit:e.limit})},readOutput(e,t){let n=r(e);return!n||!J(n,t)?null:{sessionId:n.sessionId,status:n.status,stdout:n.stdout,stderr:n.stderr,combined:n.output,truncated:n.outputTruncated,exitCode:n.exitCode,exitSignal:n.exitSignal}},async terminate(e,t){let n=r(e);if(!n||!J(n,t))return null;if(n.status!==`running`)return q(n);n.status=`killed`,n.child.kill(`SIGTERM`),n.killTimer=setTimeout(()=>{(n.status===`running`||n.status===`killed`)&&n.child.kill(`SIGKILL`)},1e3),await Promise.race([n.donePromise,new Promise(e=>{setTimeout(e,1500)})]);let i=r(e);return i?q(i):null}}}function Pr(e){return xr({workspaceDir:e,registry:Nr(),scopeKey:e})}const Fr=5*1024*1024,Ir=2e3;function Lr(e,t){return P.isAbsolute(e)?P.normalize(e):P.normalize(P.join(t,e))}const Rr=F.Object({path:F.String({description:`File path (relative to workspace or absolute)`}),offset:F.Optional(F.Number({description:`Line offset (1-based, default: 1)`})),limit:F.Optional(F.Number({description:`Maximum lines to read (default: 2000)`}))});function zr(e,t){return{name:`read_file`,label:`Read File`,description:`Read the contents of a file`,parameters:Rr,async execute(n,r){let i;try{i=Lr(r.path,e)}catch(e){return{content:[{type:`text`,text:`Error: ${e instanceof Error?e.message:String(e)}`}],details:{content:``,lines:0,truncated:!1}}}let a=await t?.getReusableRead(i,r.offset,r.limit);if(a?.reused)return{content:[{type:`text`,text:`[file unchanged] ${r.path}`}],details:{content:``,lines:a.lineCount??0,truncated:!1,deduplicated:!0}};let o;try{o=await N.readFile(i)}catch(e){return{content:[{type:`text`,text:`Error: ${e.code===`ENOENT`?`File not found: ${r.path}`:String(e)}`}],details:{content:``,lines:0,truncated:!1}}}if(o.length>Fr){let e=o.slice(0,Fr).toString(`utf-8`);return{content:[{type:`text`,text:`${e}\n[...file truncated at ${Fr} bytes]`}],details:{content:e,lines:0,truncated:!0}}}let s=o.toString(`utf-8`).split(`
|
|
35
|
+
`),c=Math.max(1,r.offset??1),l=Math.min(Ir,r.limit??Ir),u=s.slice(c-1,c-1+l),d=u.length<s.length-(c-1),f=u.map((e,t)=>`${(c+t).toString().padStart(4)} ${e}`).join(`
|
|
36
36
|
`),p=d?`\n[...${s.length-(c-1+u.length)} more lines]`:``;return await t?.rememberRead({path:i,content:u.join(`
|
|
37
37
|
`),lineCount:u.length,offset:r.offset,limit:r.limit}),{content:[{type:`text`,text:f+p}],details:{content:u.join(`
|
|
38
|
-
`),lines:u.length,truncated:d}}}}}const
|
|
39
|
-
`)||`(empty directory)`}],details:{entries:a}}}}}const
|
|
40
|
-
`)}function
|
|
41
|
-
`);n.length>0&&n[n.length-1]===``&&n.pop();let r=
|
|
42
|
-
`)}function
|
|
43
|
-
`)}`);r.push([s,n.length,o]),i=s+n.length}return r.sort((e,t)=>e[0]-t[0]),r}function
|
|
44
|
-
`)}],details:{matches:i}}}}}const
|
|
45
|
-
`)||`(empty)`}],details:{lines:i}}}}}const
|
|
46
|
-
`)};return{content:[{type:`text`,text:JSON.stringify(t)}],details:t}}if(i===`kill`){let n=r.target?.trim();if(!n||n===`*`||n===`all`){let n=e.killAll(t),r={action:`kill`,killed:n,text:n>0?`Killed ${n} subagent(s).`:`No running subagents to kill.`};return{content:[{type:`text`,text:JSON.stringify(r)}],details:r}}let i=
|
|
38
|
+
`),lines:u.length,truncated:d}}}}}const Br=F.Object({path:F.String({description:`File path (relative to workspace or absolute)`}),content:F.String({description:`File content to write`})});function Vr(e,t){return{name:`write_file`,label:`Write File`,description:`Create or overwrite a file with the given content`,parameters:Br,async execute(n,r){let i;try{i=Lr(r.path,e)}catch(e){return{content:[{type:`text`,text:`Error: ${e instanceof Error?e.message:String(e)}`}],details:{path:r.path}}}try{await N.mkdir(P.dirname(i),{recursive:!0}),await N.writeFile(i,r.content,`utf-8`),await t?.invalidateReadPath(i)}catch(e){return{content:[{type:`text`,text:`Error writing file: ${e instanceof Error?e.message:String(e)}`}],details:{path:i}}}return{content:[{type:`text`,text:`File written: ${r.path}`}],details:{path:i}}}}}const Hr=F.Object({path:F.String({description:`File path (relative to workspace or absolute)`}),old_string:F.String({description:`Exact text to replace`}),new_string:F.String({description:`Replacement text`})});function Ur(e,t){return{name:`edit_file`,label:`Edit File`,description:`Replace the first occurrence of old_string with new_string in a file`,parameters:Hr,async execute(n,r){let i;try{i=Lr(r.path,e)}catch(e){return{content:[{type:`text`,text:`Error: ${e instanceof Error?e.message:String(e)}`}],details:{path:r.path,occurrences:0}}}let a;try{a=await N.readFile(i,`utf-8`)}catch(e){return{content:[{type:`text`,text:`Error: ${e.code===`ENOENT`?`File not found: ${r.path}`:String(e)}`}],details:{path:i,occurrences:0}}}if(!a.includes(r.old_string))return{content:[{type:`text`,text:`Error: old_string not found in ${r.path}`}],details:{path:i,occurrences:0}};let o=a.replace(r.old_string,r.new_string);return await N.writeFile(i,o,`utf-8`),await t?.invalidateReadPath(i),{content:[{type:`text`,text:`File edited: ${r.path}`}],details:{path:i,occurrences:1}}}}}const Wr=F.Object({path:F.Optional(F.String({description:`Directory path (default: workspace root)`}))});function Gr(e){return{name:`list_dir`,label:`List Directory`,description:`List the contents of a directory`,parameters:Wr,async execute(t,n){let r=n.path??`.`,i;try{i=Lr(r,e)}catch(e){return{content:[{type:`text`,text:`Error: ${e instanceof Error?e.message:String(e)}`}],details:{entries:[]}}}let a;try{a=(await N.readdir(i,{withFileTypes:!0})).map(e=>`${e.name}${e.isDirectory()?`/`:``}`)}catch(e){return{content:[{type:`text`,text:`Error: ${e instanceof Error?e.message:String(e)}`}],details:{entries:[]}}}return{content:[{type:`text`,text:a.join(`
|
|
39
|
+
`)||`(empty directory)`}],details:{entries:a}}}}}const Kr=F.Object({input:F.String({description:`Patch content using the *** Begin Patch/End Patch format.`})});function qr(e,t){let n=P.isAbsolute(e)?P.normalize(e):P.normalize(P.join(t,e));if(!n.startsWith(t+P.sep)&&n!==t)throw Error(`Path escapes workspace: ${e}`);return n}function Jr(e,t){let n=P.relative(t,e);return!n||n===``?P.basename(e):n.startsWith(`..`)||P.isAbsolute(n)?e:n}async function Yr(e){await N.mkdir(P.dirname(e),{recursive:!0})}function Xr(e){let t=[`Success. Updated the following files:`];for(let n of e.added)t.push(`A ${n}`);for(let n of e.modified)t.push(`M ${n}`);for(let n of e.deleted)t.push(`D ${n}`);return t.join(`
|
|
40
|
+
`)}function Zr(e,t={}){return{name:`apply_patch`,label:`apply_patch`,description:`Apply a patch to one or more files using the apply_patch format. The input should include *** Begin Patch and *** End Patch markers.`,parameters:Kr,async execute(n,r){try{let i=r.input?.trim();if(!i)return{content:[{type:`text`,text:`Error: Provide a patch input.`}],details:{summary:{added:[],modified:[],deleted:[]}}};if(t.sessionId&&!(t.hitlResume?.request.kind===`approval`&&t.hitlResume.toolContext?.toolName===`apply_patch`&&t.hitlResume.toolContext.toolCallId===n&&JSON.stringify(t.hitlResume.toolContext.toolArgs)===JSON.stringify(r)&&t.hitlResume.resolution.action===`submit`&&(t.hitlResume.resolution.values?.selectedChoiceIds?.includes(`approve`)??!1)))throw new G({requestId:L(),sessionId:t.hitlResume?.request.sessionId??t.sessionId,kind:`approval`,title:`Confirm patch application`,prompt:`Applying this patch will modify files in the workspace. Approve before continuing.`,preview:{mimeType:`text/plain`,content:i},details:{tool:`apply_patch`},input:{mode:`choice`,choices:[{id:`approve`,label:`Approve`},{id:`deny`,label:`Deny`}]},policy:{resumable:!0,defaultOnTimeout:`deny`},createdAt:new Date().toISOString()},{turnId:n,phase:`before_tool`,resumeStrategy:`reenter_from_checkpoint`},{toolCallId:n,toolName:`apply_patch`,toolArgs:r});let a=$r(i);if(a.hunks.length===0)return{content:[{type:`text`,text:`Error: No files were modified.`}],details:{summary:{added:[],modified:[],deleted:[]}}};let o={added:[],modified:[],deleted:[]},s={added:new Set,modified:new Set,deleted:new Set};for(let t of a.hunks){if(t.kind===`add`){let n=qr(t.path,e);await Yr(n),await N.writeFile(n,t.contents,`utf-8`),Qr(o,s,`added`,Jr(n,e));continue}if(t.kind===`delete`){let n=qr(t.path,e);await N.rm(n,{force:!0,recursive:!1}),Qr(o,s,`deleted`,Jr(n,e));continue}let n=qr(t.path,e),r=await ri(n,t.chunks);if(t.movePath){let i=qr(t.movePath,e);await Yr(i),await N.writeFile(i,r,`utf-8`),await N.rm(n,{force:!0,recursive:!1}),Qr(o,s,`modified`,Jr(i,e))}else await N.writeFile(n,r,`utf-8`),Qr(o,s,`modified`,Jr(n,e))}return{content:[{type:`text`,text:Xr(o)}],details:{summary:o}}}catch(e){if(e instanceof G)throw e;return{content:[{type:`text`,text:`Error: ${e instanceof Error?e.message:String(e)}`}],details:{summary:{added:[],modified:[],deleted:[]}}}}}}}function Qr(e,t,n,r){t[n].has(r)||(t[n].add(r),e[n].push(r))}function $r(e){let t=e.trim();if(!t)throw Error(`Invalid patch: input is empty.`);let n=t.split(/\r?\n/);ei(n);let r=[],i=n.slice(1,n.length-1),a=2;for(;i.length>0;){let{hunk:e,consumed:t}=ti(i,a);r.push(e),a+=t,i=i.slice(t)}return{hunks:r}}function ei(e){let t=e[0]?.trim(),n=e[e.length-1]?.trim();if(t!==`*** Begin Patch`)throw Error(`The first line of the patch must be '*** Begin Patch'`);if(n!==`*** End Patch`)throw Error(`The last line of the patch must be '*** End Patch'`)}function ti(e,t){if(e.length===0)throw Error(`Invalid patch hunk at line ${t}: empty hunk`);let n=e[0].trim();if(n.startsWith(`*** Add File: `)){let t=n.slice(14),r=``,i=1;for(let t of e.slice(1))if(t.startsWith(`+`))r+=`${t.slice(1)}\n`,i+=1;else break;return{hunk:{kind:`add`,path:t,contents:r},consumed:i}}if(n.startsWith(`*** Delete File: `))return{hunk:{kind:`delete`,path:n.slice(17)},consumed:1};if(n.startsWith(`*** Update File: `)){let r=n.slice(17),i=e.slice(1),a=1,o,s=i[0]?.trim();s?.startsWith(`*** Move to: `)&&(o=s.slice(13),i=i.slice(1),a+=1);let c=[];for(;i.length>0;){if(i[0].trim()===``){i=i.slice(1),a+=1;continue}if(i[0].startsWith(`***`))break;let{chunk:e,consumed:n}=ni(i,t+a,c.length===0);c.push(e),i=i.slice(n),a+=n}if(c.length===0)throw Error(`Invalid patch hunk at line ${t}: Update file hunk for path '${r}' is empty`);return{hunk:{kind:`update`,path:r,movePath:o,chunks:c},consumed:a}}throw Error(`Invalid patch hunk at line ${t}: '${e[0]}' is not a valid hunk header.`)}function ni(e,t,n){if(e.length===0)throw Error(`Invalid patch hunk at line ${t}: Update hunk does not contain any lines`);let r,i=0;if(e[0]===`@@`)i=1;else if(e[0].startsWith(`@@ `))r=e[0].slice(3),i=1;else if(!n)throw Error(`Invalid patch hunk at line ${t}: Expected update hunk to start with a @@ context marker.`);if(i>=e.length)throw Error(`Invalid patch hunk at line ${t+1}: Update hunk does not contain any lines`);let a={changeContext:r,oldLines:[],newLines:[],isEndOfFile:!1},o=0;for(let n of e.slice(i)){if(n===`*** End of File`){if(o===0)throw Error(`Invalid patch hunk at line ${t+1}: Update hunk does not contain any lines`);a.isEndOfFile=!0,o+=1;break}let e=n[0];if(!e){a.oldLines.push(``),a.newLines.push(``),o+=1;continue}if(e===` `){let e=n.slice(1);a.oldLines.push(e),a.newLines.push(e),o+=1;continue}if(e===`+`){a.newLines.push(n.slice(1)),o+=1;continue}if(e===`-`){a.oldLines.push(n.slice(1)),o+=1;continue}if(o===0)throw Error(`Invalid patch hunk at line ${t+1}: Unexpected line found in update hunk.`);break}return{chunk:a,consumed:o+i}}async function ri(e,t){let n=(await N.readFile(e,`utf-8`).catch(t=>{throw Error(`Failed to read file to update ${e}: ${t}`)})).split(`
|
|
41
|
+
`);n.length>0&&n[n.length-1]===``&&n.pop();let r=ai(n,ii(n,e,t));return(r.length===0||r[r.length-1]!==``)&&(r=[...r,``]),r.join(`
|
|
42
|
+
`)}function ii(e,t,n){let r=[],i=0;for(let a of n){if(a.changeContext){let n=oi(e,[a.changeContext],i,!1);if(n===null)throw Error(`Failed to find context '${a.changeContext}' in ${t}`);i=n+1}if(a.oldLines.length===0){let t=e.length>0&&e[e.length-1]===``?e.length-1:e.length;r.push([t,0,a.newLines]);continue}let n=a.oldLines,o=a.newLines,s=oi(e,n,i,a.isEndOfFile);if(s===null&&n[n.length-1]===``&&(n=n.slice(0,-1),o.length>0&&o[o.length-1]===``&&(o=o.slice(0,-1)),s=oi(e,n,i,a.isEndOfFile)),s===null)throw Error(`Failed to find expected lines in ${t}:\n${a.oldLines.join(`
|
|
43
|
+
`)}`);r.push([s,n.length,o]),i=s+n.length}return r.sort((e,t)=>e[0]-t[0]),r}function ai(e,t){let n=[...e];for(let[e,r,i]of[...t].toReversed()){for(let t=0;t<r;t+=1)e<n.length&&n.splice(e,1);for(let t=0;t<i.length;t+=1)n.splice(e+t,0,i[t])}return n}function oi(e,t,n,r){if(t.length===0)return n;if(t.length>e.length)return null;let i=e.length-t.length,a=r&&e.length>=t.length?i:n;if(a>i)return null;for(let n=a;n<=i;n+=1)if(si(e,t,n,e=>e))return n;for(let n=a;n<=i;n+=1)if(si(e,t,n,e=>e.trimEnd()))return n;for(let n=a;n<=i;n+=1)if(si(e,t,n,e=>e.trim()))return n;for(let n=a;n<=i;n+=1)if(si(e,t,n,e=>ci(e.trim())))return n;return null}function si(e,t,n,r){for(let i=0;i<t.length;i+=1)if(r(e[n+i])!==r(t[i]))return!1;return!0}function ci(e){return Array.from(e).map(e=>{switch(e){case`‐`:case`‑`:case`‒`:case`–`:case`—`:case`―`:case`−`:return`-`;case`‘`:case`’`:case`‚`:case`‛`:return`'`;case`“`:case`”`:case`„`:case`‟`:return`"`;case`\xA0`:case` `:case` `:case` `:case` `:case` `:case` `:case` `:case` `:case` `:case` `:case` `:case` `:return` `;default:return e}}).join(``)}const li=F.Object({question:F.String({description:`The question to ask the user.`}),options:F.Optional(F.Array(F.String(),{description:`Optional list of choices for the user to select from.`})),allow_free_text:F.Optional(F.Boolean({description:`Whether to allow the user to type a free-text response in addition to choices. Defaults to true.`}))});function ui(e){return{name:`clarify`,label:`Clarify`,description:`Ask the user a clarifying question when you need more information to proceed. Provide a clear question and optionally a list of choices. The current task will be paused until the user responds.`,parameters:li,async execute(t,n){let r=L(),i=n.options&&n.options.length>0,a;throw a=i?{mode:`choice`,choices:n.options.map((e,t)=>({id:`option-${t}`,label:e})),allowFreeText:n.allow_free_text!==!1}:{mode:`text`,multiline:!0,placeholder:`Type your response...`},new G({requestId:r,sessionId:e,kind:`clarify`,title:`Agent needs clarification`,prompt:n.question,input:a,policy:{resumable:!0},createdAt:new Date().toISOString()},{turnId:t,phase:`before_tool`,resumeStrategy:`reenter_from_checkpoint`},{toolCallId:t,toolName:`clarify`,toolArgs:n})}}}function di(e){return P.join(e,`.aimax`)}function fi(e){return P.join(di(e),`MEMORY.md`)}async function pi(e,t,n){e.onMemoryChanged&&await Promise.resolve(e.onMemoryChanged(n)).catch(()=>{}),t&&await Promise.resolve(t(n)).catch(()=>{})}function Y(e,t){let n=di(e),r=T({providerId:t?.providerId,pluginId:t?.pluginId,dataDir:e,memoryDir:n,sessionId:t?.sessionId});return r?r.provider:h({dataDir:e,memoryDir:n,sessionId:t?.sessionId})}async function mi(e){return f(di(e))}async function hi(e){try{return await N.readFile(e,`utf-8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}}async function gi(e){return hi(fi(e))}async function _i(e,t,n){return await Y(e,n).search(t)}async function vi(e,t,n,r,i){try{return await Y(e,i).getLines(t,n,r)}catch{return null}}async function yi(e,t,n){let r=Y(e,n);await r.append(t),await pi(r,n?.onMemoryChanged,{reason:`append`,files:[`MEMORY.md`],source:`memory`,sessionId:n?.sessionId,providerId:n?.providerId??n?.pluginId,timestamp:new Date().toISOString()})}async function bi(e,t,n,r){let i=Y(e,r);await i.updateFile(t,n),await pi(i,r?.onMemoryChanged,{reason:`update`,files:[t],source:`memory`,sessionId:r?.sessionId,providerId:r?.providerId??r?.pluginId,timestamp:new Date().toISOString()})}async function xi(e,t,n){let r=Y(e,n);await r.deleteFile(t),await pi(r,n?.onMemoryChanged,{reason:`delete`,files:[t],source:`memory`,sessionId:n?.sessionId,providerId:n?.providerId??n?.pluginId,timestamp:new Date().toISOString()})}const Si=F.Object({query:F.String({description:`Search query (case-insensitive substring match)`})});function Ci(e,t){return{name:`memory_search`,label:`Memory Search`,description:`Search memory files for relevant information`,parameters:Si,async execute(n,r){let i=(await _i(e,r.query,{providerId:t?.providerId,pluginId:t?.pluginId,sessionId:t?.sessionId})).map(e=>({file:e.path,start_line:e.startLine,end_line:e.endLine,score:Number(e.score.toFixed(4)),text:e.snippet,source:e.source,citation:e.citation}));return i.length===0?{content:[{type:`text`,text:`No results found for: ${r.query}`}],details:{matches:i}}:{content:[{type:`text`,text:i.map(e=>{let t=`${e.file}:${e.start_line}-${e.end_line} (${e.score}): ${e.text}`;return e.citation?`${t}\n${e.citation}`:t}).join(`
|
|
44
|
+
`)}],details:{matches:i}}}}}const wi=F.Object({file:F.String({description:`Memory file path`}),start_line:F.Number({description:`Start line number (1-based)`}),end_line:F.Number({description:`End line number (1-based)`})});function Ti(e,t){return{name:`memory_get`,label:`Memory Get`,description:`Read specific lines from a memory file`,parameters:wi,async execute(n,r){let i=await vi(e,r.file,r.start_line,r.end_line,{providerId:t?.providerId,pluginId:t?.pluginId,sessionId:t?.sessionId});return i===null?{content:[{type:`text`,text:`File not found: ${r.file}`}],details:{lines:null}}:{content:[{type:`text`,text:i.map((e,t)=>`${(r.start_line+t).toString().padStart(4)} ${e}`).join(`
|
|
45
|
+
`)||`(empty)`}],details:{lines:i}}}}}const Ei=F.Object({content:F.String({description:`Content to append to MEMORY.md`})});function Di(e,t){return{name:`memory_append`,label:`Memory Append`,description:`Append new information to the MEMORY.md file`,parameters:Ei,async execute(n,r){try{return await yi(e,r.content,{providerId:t?.providerId,pluginId:t?.pluginId,sessionId:t?.sessionId,onMemoryChanged:t?.onMemoryChanged}),{content:[{type:`text`,text:`Memory updated.`}],details:{appended:!0}}}catch(e){return{content:[{type:`text`,text:`Error appending to memory: ${e instanceof Error?e.message:String(e)}`}],details:{appended:!1}}}}}}const Oi=F.Object({action:F.String({description:`A short description of the action that needs approval.`}),reason:F.String({description:`Why this action needs human approval.`}),details:F.Optional(F.String({description:`Additional details about the action (e.g. the command to execute).`}))});function ki(e,t){return{name:`request_approval`,label:`Request Approval`,description:`Request explicit human approval before performing a high-risk action. Describe the action and why it needs approval. The task will be paused until the user approves or denies the action.`,parameters:Oi,async execute(n,r){if(t?.request.kind===`approval`&&t.toolContext?.toolName===`request_approval`&&t.toolContext.toolCallId===n&&t.resolution.action===`submit`){let e=t.resolution.values?.selectedChoiceIds?.includes(`approve`)??!1;return{content:[{type:`text`,text:e?`Approval granted.`:`Approval denied.`}],details:{paused:!1,approved:e}}}let i=L(),a;throw r.details&&(a={mimeType:`text/plain`,content:r.details}),new G({requestId:i,sessionId:e,kind:`approval`,title:r.action,prompt:r.reason,preview:a,input:{mode:`choice`,choices:[{id:`approve`,label:`Approve`,description:`Allow this action to proceed`},{id:`deny`,label:`Deny`,description:`Reject this action`}]},policy:{resumable:!0,defaultOnTimeout:`deny`},createdAt:new Date().toISOString()},{turnId:n,phase:`before_tool`,resumeStrategy:`reenter_from_checkpoint`},{toolCallId:n,toolName:`request_approval`,toolArgs:r})}}}const Ai=F.Object({title:F.String({description:`A short title for the review (e.g. 'Weekly Report Draft').`}),description:F.String({description:`What the user should review and what kind of feedback you need.`}),content:F.String({description:`The content to review (text, markdown, or JSON).`}),content_type:F.Optional(F.String({description:`MIME type: text/plain, application/json, or text/markdown. Defaults to text/markdown.`}))});function ji(e){return{name:`request_review`,label:`Request Review`,description:`Present a draft, document, or output for human review before proceeding. Include the content to review and a description of what feedback you need. The task will be paused until the user reviews and responds.`,parameters:Ai,async execute(t,n){let r=L(),i={mimeType:n.content_type??`text/markdown`,content:n.content};throw new G({requestId:r,sessionId:e,kind:`review`,title:n.title,prompt:n.description,preview:i,input:{mode:`choice`,choices:[{id:`approve`,label:`Approve`,description:`The content looks good, proceed`},{id:`revise`,label:`Request changes`,description:`Provide feedback for revision`},{id:`reject`,label:`Reject`,description:`Discard this draft`}],allowFreeText:!0},policy:{resumable:!0},createdAt:new Date().toISOString()},{turnId:t,phase:`before_tool`,resumeStrategy:`reenter_from_checkpoint`},{toolCallId:t,toolName:`request_review`,toolArgs:n})}}}const Mi=F.Object({task:F.String({description:`The task description for the subagent to execute`}),label:F.Optional(F.String({description:`Optional short label to identify this subagent`}))});function Ni(e){let t=e.label?`"${e.label}"`:`task: ${e.task}`;return e.status===`done`?`[Subagent completed] ${t}\n\n${e.result??`(no output)`}`:e.status===`error`?`[Subagent failed] ${t}\n\nError: ${e.error??`unknown error`}`:`[Subagent killed] ${t}`}function Pi(e,t,n,r,i,a,o,s,l){return{name:`sessions_spawn`,label:`Spawn Subagent`,description:`Delegate a task to a subagent that runs independently. Returns immediately with status=accepted; the subagent result will be delivered back automatically as a follow-up message — do not poll or sleep.`,parameters:Mi,async execute(u,d){let f=d.task.trim(),p=d.label?.trim();if(!f){let e={status:`error`,error:`task must not be empty`};return{content:[{type:`text`,text:JSON.stringify(e)}],details:e}}let m=e.checkSpawnAllowed(t,n+1);if(!m.allowed){let e={status:`forbidden`,error:m.reason};return{content:[{type:`text`,text:JSON.stringify(e)}],details:e}}let h=L(),g=new AbortController,_;try{_=await c(r,i)}catch(e){let t={status:`error`,error:`Failed to create session: ${e instanceof Error?e.message:String(e)}`};return{content:[{type:`text`,text:JSON.stringify(t)}],details:t}}let v={runId:h,childSessionId:_,parentSessionId:t,task:f,label:p,depth:n+1,status:`running`,startedAt:Date.now(),abortController:g},y=l({dataDir:r,sessionId:_,message:f,channel:i,llm:a,...s,loopDetection:o,abortSignal:g.signal,subagentContext:{depth:n+1,parentSessionId:t}}).then(t=>{e.complete(h,t.text||t.error||`(no output)`)}).catch(t=>{let n=t instanceof Error?t.message:String(t);e.fail(h,n)});e.register(v,y);let b={status:`accepted`,childSessionId:_,runId:h,note:`The subagent result will be sent back automatically. Do not poll or re-spawn.`};return{content:[{type:`text`,text:JSON.stringify(b)}],details:b}}}}const Fi=F.Object({action:F.Union([`list`,`kill`].map(e=>F.Literal(e)),{description:`Action to perform: "list" to show subagents, "kill" to stop one or all`}),target:F.Optional(F.String({description:`For kill: a runId, label, or index from the list. Use "*" or "all" to kill every subagent.`}))});function Ii(e){return e<1e3?`${e}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${Math.floor(e/6e4)}m${Math.floor(e%6e4/1e3)}s`}function Li(e,t){let n=parseInt(t,10);return!isNaN(n)&&n>=1&&n<=e.length?e[n-1]:e.find(e=>e.runId.startsWith(t)||e.runId===t)||(e.find(e=>e.label&&e.label.toLowerCase()===t.toLowerCase())??null)}function Ri(e,t){return{name:`subagents`,label:`Subagents`,description:`List or kill subagents spawned by this session. Use list to check status, kill to stop one or all.`,parameters:Fi,async execute(n,r){let i=r.action,a=Date.now(),o=e.list(t);if(i===`list`){let e=o.map((e,t)=>({index:t+1,runId:e.runId,label:e.label??e.task.slice(0,40),task:e.task,status:e.status,depth:e.depth,runtimeMs:e.endedAt?e.endedAt-e.startedAt:a-e.startedAt})),t={action:`list`,runs:e,text:(e.length===0?[`(no subagents)`]:e.map(e=>`${e.index}. [${e.status}] ${e.label} (${Ii(e.runtimeMs)})`)).join(`
|
|
46
|
+
`)};return{content:[{type:`text`,text:JSON.stringify(t)}],details:t}}if(i===`kill`){let n=r.target?.trim();if(!n||n===`*`||n===`all`){let n=e.killAll(t),r={action:`kill`,killed:n,text:n>0?`Killed ${n} subagent(s).`:`No running subagents to kill.`};return{content:[{type:`text`,text:JSON.stringify(r)}],details:r}}let i=Li(o,n);if(!i){let e={action:`kill`,killed:0,error:`No subagent found matching "${n}". Use list to see available subagents.`,text:`Error: no subagent matching "${n}"`};return{content:[{type:`text`,text:JSON.stringify(e)}],details:e}}let a=e.kill(i.runId),s=i.label??i.task.slice(0,40),c={action:`kill`,killed:a?1:0,text:a?`Killed subagent "${s}".`:`Subagent "${s}" is already finished.`};return{content:[{type:`text`,text:JSON.stringify(c)}],details:c}}let s={action:i,error:`Unsupported action.`,text:`Error: unsupported action.`};return{content:[{type:`text`,text:JSON.stringify(s)}],details:s}}}}const zi=F.Object({image:F.String({description:`Image path or URL`}),prompt:F.Optional(F.String({description:`Prompt for image analysis`})),model:F.Optional(F.String({description:`Optional model override`})),maxBytesMb:F.Optional(F.Number({description:`Optional size cap in MB`}))});function Bi(){return{name:`image`,label:`Image`,description:`Analyze an image with the configured image model. (Not implemented in AIMax yet.)`,parameters:zi,async execute(e,t){let n={implemented:!1,error:`image tool not implemented (awaiting third-party integration).`};return{content:[{type:`text`,text:`Error: ${n.error}`}],details:n}}}}function Vi(e,t){let n=P.join(e,`workspace`),r=t?.memoryOptions,i=Nr(),a=[xr({sessionId:t?.sessionId,workspaceDir:n,registry:i,scopeKey:n,contextManager:t?.contextManager,hitlResume:t?.hitlResume}),wr({registry:i,scopeKey:n}),zr(n,t?.contextManager),Vr(n,t?.contextManager),Ur(n,t?.contextManager),Gr(n),Zr(n,{sessionId:t?.sessionId,hitlResume:t?.hitlResume}),Ci(e,r),Ti(e,r),Di(e,r),...t?.sessionId?[ui(t.sessionId),ki(t.sessionId,t.hitlResume),ji(t.sessionId)]:[]];return t&&a.push(Pi(t.registry,t.parentSessionId,t.depth,e,t.channel,t.llm,t.loopDetection,t.inheritedRunParams??{},t.spawnFn),Ri(t.registry,t.parentSessionId)),a}const Hi={read_file:`Read file contents`,write_file:`Create or overwrite files`,edit_file:`Make precise edits to files`,list_dir:`List directory contents`,apply_patch:`Apply multi-file patches`,exec:`Run shell commands`,process:`Manage background exec sessions`,memory_search:`Search memory files for relevant information`,memory_get:`Read specific lines from memory files`,memory_append:`Append new long-term memory`,sessions_spawn:`Spawn an isolated subagent session`,subagents:`List, steer, or kill subagent runs`},Ui=[`read_file`,`write_file`,`edit_file`,`list_dir`,`apply_patch`,`exec`,`process`,`memory_search`,`memory_get`,`memory_append`,`sessions_spawn`,`subagents`];function Wi(e){let t=new Map;for(let n of e){let e=n.trim();if(!e)continue;let r=e.toLowerCase();t.has(r)||t.set(r,e)}let n=Array.from(t.keys());return{ordered:[...Ui.filter(e=>t.has(e)),...n.filter(e=>!Ui.includes(e)).sort()],displayName:t}}function Gi(e){let{ordered:t,displayName:n}=Wi(e.toolNames),r=new Map;for(let[t,n]of Object.entries(e.toolSummaries??{})){let e=t.trim().toLowerCase();!e||!n?.trim()||r.set(e,n.trim())}return[`## Tooling`,`Tool availability (filtered by runtime policy):`,`Tool names are case-sensitive. Call tools exactly as listed.`,t.map(e=>{let t=n.get(e)??e,i=r.get(e)??Hi[e];return i?`- ${t}: ${i}`:`- ${t}`}).join(`
|
|
47
47
|
`),``].join(`
|
|
48
|
-
`)}function
|
|
49
|
-
`)}function
|
|
50
|
-
`)}function
|
|
48
|
+
`)}function Ki(){return[`## Safety`,`You have no independent goals: do not pursue self-preservation, replication, resource acquisition, or power-seeking; avoid long-term plans beyond the user's request.`,`Prioritize safety and human oversight over completion; if instructions conflict, pause and ask; comply with stop/pause/audit requests and never bypass safeguards.`,`Do not attempt to bypass approvals, safety rails, or access boundaries.`,`Never print, reveal, or echo environment variable values. If configuration must be shown, use placeholders plus brief meanings instead, such as {{API_KEY}}: model access credential.`,``].join(`
|
|
49
|
+
`)}function qi(e){return e?``:[`## Tool Call Style`,`Default: call routine low-risk tools directly without narrating every step.`,`Narrate briefly when actions are sensitive, long-running, or likely surprising.`,`When approvals are required, keep the command text exact and complete.`,``].join(`
|
|
50
|
+
`)}function Ji(e){return e.length===0?``:[`## Skills (mandatory)`,`Before replying: scan <available_skills> <description> entries.`,"- If exactly one skill clearly applies: read its SKILL.md at <location> with `read_file`, then follow it.",`- If multiple could apply: choose the most specific one, then read/follow it.`,`- If none clearly apply: do not read any SKILL.md.`,`Constraints: never read more than one skill up front; only read after selecting.`,`<available_skills>\n${e.map(e=>[` <skill>`,` <name>${e.name}</name>`,` <description>${e.description}</description>`,` <location>${e.location}</location>`,` </skill>`].join(`
|
|
51
51
|
`)).join(`
|
|
52
52
|
`)}\n</available_skills>`,``].join(`
|
|
53
|
-
`)}function
|
|
54
|
-
`)}function
|
|
55
|
-
`)}function
|
|
56
|
-
`)}function
|
|
57
|
-
`)}function
|
|
58
|
-
`)}function
|
|
59
|
-
`)}function
|
|
60
|
-
`)}function
|
|
61
|
-
`)}function
|
|
62
|
-
`)}function
|
|
63
|
-
`)}function
|
|
64
|
-
`)}function
|
|
65
|
-
`):``}function
|
|
66
|
-
`,
|
|
67
|
-
`)}function
|
|
68
|
-
`).trim()}function oa(e){return e instanceof Error?e.message||e.name:typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`?`${e}`:na(e)}function sa(e,t,n,r){if(r!==void 0)return`error:${Z(oa(r))}`;if(!X(n))return n===void 0?void 0:Z(n);let i=X(n.details)?n.details:{},a=aa(n);if(ia(e,t)&&e===`process`&&X(t)){let e=t.action;if(e===`poll`)return Z({action:e,status:i.status,exitCode:i.exitCode??null,exitSignal:i.exitSignal??null,aggregated:i.aggregated??null,text:a});if(e===`log`)return Z({action:e,status:i.status,totalLines:i.totalLines??null,totalChars:i.totalChars??null,truncated:i.truncated??null,exitCode:i.exitCode??null,exitSignal:i.exitSignal??null,text:a})}return Z({details:i,text:a})}function ca(e,t,n){let r=0,i;for(let a=e.length-1;a>=0;--a){let o=e[a];if(!(!o||o.toolName!==t||o.argsHash!==n)&&!(typeof o.resultHash!=`string`||!o.resultHash)){if(!i){i=o.resultHash,r=1;continue}if(o.resultHash!==i)break;r+=1}}return{count:r,latestResultHash:i}}function la(e,t){let n=e.at(-1);if(!n)return{count:0,noProgressEvidence:!1};let r,i;for(let t=e.length-2;t>=0;--t){let a=e[t];if(a&&a.argsHash!==n.argsHash){r=a.argsHash,i=a.toolName;break}}if(!r||!i)return{count:0,noProgressEvidence:!1};let a=0;for(let t=e.length-1;t>=0;--t){let i=e[t];if(!i)continue;let o=a%2==0?n.argsHash:r;if(i.argsHash!==o)break;a+=1}if(a<2||t!==r)return{count:0,noProgressEvidence:!1};let o=Math.max(0,e.length-a),s,c,l=!0;for(let t=o;t<e.length;t+=1){let i=e[t];if(i){if(!i.resultHash){l=!1;break}if(i.argsHash===n.argsHash){if(!s)s=i.resultHash;else if(s!==i.resultHash){l=!1;break}continue}if(i.argsHash===r){if(!c)c=i.resultHash;else if(c!==i.resultHash){l=!1;break}continue}l=!1;break}}return(!s||!c)&&(l=!1),{count:a+1,pairedToolName:n.toolName,pairedSignature:n.argsHash,noProgressEvidence:l}}function ua(e,t){return[e,t].toSorted().join(`|`)}function da(e,t,n,r){let i=ea(r);if(!i.enabled)return{stuck:!1};let a=e.toolCallHistory??[],o=ta(t,n),s=ca(a,t,o),c=s.count,l=ia(t,n),u=la(a,o);if(c>=i.globalCircuitBreakerThreshold)return{stuck:!0,level:`critical`,detector:`global_circuit_breaker`,count:c,message:`CRITICAL: ${t} has repeated identical no-progress outcomes ${c} times. Session execution blocked by global circuit breaker to prevent runaway loops.`,warningKey:`global:${t}:${o}:${s.latestResultHash??`none`}`};if(l&&i.detectors.knownPollNoProgress&&c>=i.criticalThreshold)return{stuck:!0,level:`critical`,detector:`known_poll_no_progress`,count:c,message:`CRITICAL: Called ${t} with identical arguments and no progress ${c} times. This appears to be a stuck polling loop. Session execution blocked to prevent resource waste.`,warningKey:`poll:${t}:${o}:${s.latestResultHash??`none`}`};if(l&&i.detectors.knownPollNoProgress&&c>=i.warningThreshold)return{stuck:!0,level:`warning`,detector:`known_poll_no_progress`,count:c,message:`WARNING: You have called ${t} ${c} times with identical arguments and no progress. Stop polling and either (1) increase wait time between checks, or (2) report the task as failed if the process is stuck.`,warningKey:`poll:${t}:${o}:${s.latestResultHash??`none`}`};let d=u.pairedSignature?`pingpong:${ua(o,u.pairedSignature)}`:`pingpong:${t}:${o}`;if(i.detectors.pingPong&&u.count>=i.criticalThreshold&&u.noProgressEvidence)return{stuck:!0,level:`critical`,detector:`ping_pong`,count:u.count,message:`CRITICAL: You are alternating between repeated tool-call patterns (${u.count} consecutive calls) with no progress. This appears to be a stuck ping-pong loop. Session execution blocked to prevent resource waste.`,pairedToolName:u.pairedToolName,warningKey:d};if(i.detectors.pingPong&&u.count>=i.warningThreshold)return{stuck:!0,level:`warning`,detector:`ping_pong`,count:u.count,message:`WARNING: You are alternating between repeated tool-call patterns (${u.count} consecutive calls). This looks like a ping-pong loop; stop retrying and report the task as failed.`,pairedToolName:u.pairedToolName,warningKey:d};let f=a.filter(e=>e.toolName===t&&e.argsHash===o).length;return!l&&i.detectors.genericRepeat&&f>=i.warningThreshold?{stuck:!0,level:`warning`,detector:`generic_repeat`,count:f,message:`WARNING: You have called ${t} ${f} times with identical arguments. If this is not making progress, stop retrying and report the task as failed.`,warningKey:`generic:${t}:${o}`}:{stuck:!1}}function fa(e,t,n,r,i){let a=ea(i);e.toolCallHistory||=[],e.toolCallHistory.push({toolName:t,argsHash:ta(t,n),toolCallId:r,timestamp:Date.now()}),e.toolCallHistory.length>a.historySize&&e.toolCallHistory.shift()}function pa(e,t){let n=ea(t.config),r=sa(t.toolName,t.toolParams,t.result,t.error);if(!r)return;e.toolCallHistory||=[];let i=ta(t.toolName,t.toolParams),a=!1;for(let n=e.toolCallHistory.length-1;n>=0;--n){let o=e.toolCallHistory[n];if(o&&!(t.toolCallId&&o.toolCallId!==t.toolCallId)&&!(o.toolName!==t.toolName||o.argsHash!==i)&&o.resultHash===void 0){o.resultHash=r,a=!0;break}}a||e.toolCallHistory.push({toolName:t.toolName,argsHash:i,toolCallId:t.toolCallId,resultHash:r,timestamp:Date.now()}),e.toolCallHistory.length>n.historySize&&e.toolCallHistory.splice(0,e.toolCallHistory.length-n.historySize)}function ma(e,t,n){e.toolLoopWarningBuckets||=new Map;let r=Math.floor(n/10);if(r<=(e.toolLoopWarningBuckets.get(t)??0))return!1;if(e.toolLoopWarningBuckets.set(t,r),e.toolLoopWarningBuckets.size>256){let t=e.toolLoopWarningBuckets.keys().next().value;t&&e.toolLoopWarningBuckets.delete(t)}return!0}function ha(e){return e&&e.trim()||`tool`}function ga(e,t,n){if(!e.execute)return e;let r=ha(e.name),i=e.execute.bind(e);return{...e,execute:async(e,a,o,s)=>{let c=n(t.sessionId),l=da(c,r,a,t.config);if(l.stuck){if(l.level===`critical`)throw Error(l.message);ma(c,l.warningKey??`${l.detector}:${r}`,l.count)&&t.onWarning?.(l)}fa(c,r,a,e,t.config);try{let n=await i(e,a,o,s);return pa(c,{toolName:r,toolParams:a,toolCallId:e,result:n,config:t.config}),n}catch(n){throw pa(c,{toolName:r,toolParams:a,toolCallId:e,error:n,config:t.config}),n}}}}function _a(e,t,n){return e.map(e=>ga(e,t,n))}async function va(e){let{session:{runParams:t,sessionId:n,hookRegistry:r,hookContext:i,runContext:a,eventDispatcher:o},runtimeInputs:{contextFiles:s,bootstrapWarnings:c,skills:l,effectivePromptText:u,pluginTools:d},dependencies:{registry:f,spawnFn:p,createModel:m,abortSignal:h}}=e,g=t.channel===`CRON`,_=g?[]:await w(t.dataDir,n),v={model:t.llm.model,api:`openai-completions`},y=await ar({dataDir:t.dataDir,sessionId:n}),b=g?{messages:[],priorSummary:void 0,compactionEntry:void 0,stats:{originalCount:0,keptCount:0,estimatedTokens:0,compacted:!1},compactionEvents:[]}:await or({entries:_,modelInfo:v,contextWindowTokens:t.llm.contextWindow??2e5,llm:{baseUrl:t.llm.baseUrl,apiKey:t.llm.apiKey,model:t.llm.model},historyLimit:t.historyLimit,compactionEnabled:!0,signal:h,hooks:r,hookCtx:i,contextManager:y,dataDir:t.dataDir,sessionId:n});await ya({sessionId:n,historyResult:b,runContext:a,eventDispatcher:o,hookRegistry:r,hookContext:i});let x=t.subagentContext?.depth??0,S=[...Ai(t.dataDir,{registry:f,parentSessionId:n,depth:x,channel:t.channel,llm:t.llm,inheritedRunParams:{plugins:t.plugins,memory:t.memory,messaging:t.messaging,docs:t.docs,historyLimit:t.historyLimit,onProgress:t.onProgress,messageId:t.messageId},loopDetection:t.loopDetection,memoryOptions:{providerId:a.memoryProviderId,pluginId:a.memoryPluginId,sessionId:n,onMemoryChanged:async()=>{}},contextManager:y,spawnFn:p}),...d],C=S.map(e=>typeof e.name==`string`?e.name.trim():``).filter(Boolean),T={};for(let e of S){let t=typeof e.name==`string`?e.name.trim():``,n=typeof e.description==`string`?e.description.trim():``;!t||!n||T[t]||(T[t]=n)}let E=t.messaging?.enabled??t.channel!==`CRON`,D=t.messaging?.channels&&t.messaging.channels.length>0?t.messaging.channels:[t.channel],O=Xi({dataDir:t.dataDir,skills:l,contextFiles:s,toolNames:C,toolSummaries:T,promptMode:x>0?`minimal`:`full`,bootstrapWarnings:c,memoryCitationsMode:t.memory?.citationsMode??`off`,messaging:{enabled:E,channels:D},docs:{localPath:t.docs?.localPath,webUrl:t.docs?.webUrl,sourceUrl:t.docs?.sourceUrl},sandboxInfo:{enabled:!0,hostWorkspaceDir:a.workspaceDir,containerWorkspaceDir:a.workspaceDir},runtimeInfo:{os:process.platform,node:process.version,model:t.llm.model,hostname:Oe.hostname()},currentDate:new Date().toISOString().split(`T`)[0],priorConversationSummary:b.priorSummary}),k=await r.dispatch(`before_prompt_build`,{prompt:u},i);for(let e of k)e&&(e.systemPrompt&&(O=e.systemPrompt),e.prependContext&&(O=`${e.prependContext}\n\n${O}`));await r.dispatch(`after_prompt_build`,{prompt:u,systemPrompt:O},i);let A=_a(Zi(S,r,i),{sessionId:n,config:t.loopDetection},Ze),j=t.llm.model,M=await r.dispatch(`before_model_resolve`,{prompt:u},i);for(let e of M)e&&e.modelOverride&&(j=e.modelOverride);let N=m({...t.llm,model:j},n),ee=new De({initialState:{systemPrompt:O,model:N,tools:A,messages:[]},getApiKey:e=>t.llm.apiKey});return b.messages.length>0&&ee.replaceMessages(b.messages),{agent:ee,resolvedModelId:j,historyMessages:b.messages,historyResult:b,workspaceDir:a.workspaceDir}}async function ya(e){let{sessionId:t,historyResult:n,runContext:r,eventDispatcher:i,hookRegistry:a,hookContext:o}=e;for(let e of n.compactionEvents??[])e.type===`compaction`&&await i.dispatchDiagnostic(t,{level:`info`,scope:`session`,phase:`history_compaction`,message:e.reason,details:{layer:e.layer,strategy:e.strategy,estimatedTokensFreed:e.estimatedTokensFreed,affectedEntries:e.affectedEntries,snapshotVersion:e.snapshotVersion}});if(n.compactionEntry){let e=n.stats.originalCount-n.stats.keptCount;await a.dispatch(`before_compaction`,{messageCount:n.stats.originalCount,compactingCount:e},o),await r.appendTranscriptEntry(n.compactionEntry),(n.compactionEvents?.length??0)===0&&await i.dispatchDiagnostic(t,{level:`info`,scope:`session`,phase:`history_compaction`,message:`Summarised ${e} older entries`,details:{strategy:`summary_only`,compactedCount:e}}),await a.dispatch(`after_compaction`,{messageCount:n.stats.originalCount,compactedCount:e},o)}}async function ba(e){let{agent:t,message:n,sessionId:r,modelId:i,historyMessages:a,eventDispatcher:o,skillUsageTracker:s,hooks:c,hookCtx:l,abortSignal:u}=e,d=``,f=``,p=``,m=0,h=0,g,_,v=0,y=[],b=new Map,x=t.subscribe(async e=>{if(e.type===`message_update`){let t=e.assistantMessageEvent;if(t.type===`text_delta`&&typeof t.delta==`string`){let n=Da(`partial`in t?t.partial:void 0)??Da(`message`in t?t.message:void 0)??Da(`message`in e?e.message:void 0),i=Oa(t.delta,n,f);i&&(await o.dispatchProgress(r,{type:`stream_text_delta`,text:i}),p+=i),n&&(f=n,p=n)}if(t.type===`done`){let e=t.message;d=Ea(e);let n=Oa(``,d,p||f);n&&(await o.dispatchProgress(r,{type:`stream_text_delta`,text:n}),p+=n),f=d,p=d,e.usage&&(m=e.usage.input,h=e.usage.output)}return}if(e.type===`message_end`){let t=e.message;if(t.usage&&(m=t.usage.input,h=t.usage.output),t.role===`assistant`&&Array.isArray(t.content)){let e=t,n=Ea(e);await c.dispatch(`assistant_message_end`,{sessionId:r,model:i,assistantText:n,assistantMessage:e,hasToolCalls:e.content.some(e=>e.type===`toolCall`),durationMs:v>0?Math.max(0,Date.now()-v):void 0,usage:t.usage?{input:m,output:h,total:m+h}:void 0},l)}return}if(e.type===`turn_end`){let t=e.message;(t.stopReason===`error`||t.stopReason===`aborted`)&&(_=t.errorMessage??(t.stopReason===`aborted`?`aborted`:`Unknown LLM error`));let n=e.toolResults??[];y.push({message:t,toolResults:n.map(e=>({toolCallId:e.toolCallId,toolName:e.toolName,content:e.content.filter(e=>e.type===`text`).map(e=>e.text??``).join(``),isError:e.isError,toolResultRef:wa(e.content.filter(e=>e.type===`text`).map(e=>e.text??``).join(``),r,e.toolCallId,e.toolName)}))});return}if(e.type===`tool_execution_start`){p=``,b.set(e.toolCallId,e.args),s.onToolExecutionStart({toolName:e.toolName,args:e.args}),await o.dispatchProgress(r,{type:`tool_start`,toolCallId:e.toolCallId,name:e.toolName,input:e.args});return}if(e.type===`tool_execution_end`){await s.onToolExecutionEnd({toolName:e.toolName,isError:e.isError});let t=typeof e.result==`string`?e.result:JSON.stringify(e.result),n=b.get(e.toolCallId);b.delete(e.toolCallId),await o.dispatchProgress(r,{type:`tool_end`,toolCallId:e.toolCallId,name:e.toolName,input:n,output:t,isError:e.isError})}});try{if(await c.dispatch(`llm_input`,{sessionId:r,model:i,prompt:typeof n==`string`?n:JSON.stringify(n),historyMessages:a},l),u?.aborted)throw Error(`aborted`);if(v=Date.now(),await t.prompt(n),!g){let e=typeof t.state.error==`string`?t.state.error:void 0,n=_??e;n&&(g=ka(n),await o.dispatchProgress(r,{type:`error`,message:g}))}}catch(e){g=ka(e),await o.dispatchProgress(r,{type:`error`,message:g})}finally{x()}let S=y.length>0?y[y.length-1]?.message:void 0;return await c.dispatch(`llm_output`,{sessionId:r,model:i,assistantTexts:d?[d]:[],lastAssistant:S,usage:{input:m,output:h,total:m+h}},l),{text:(y.length>0?Ea(y[y.length-1].message):``)||d,inputTokens:m,outputTokens:h,error:g,turnRecords:y}}async function xa(e,t){if(t.turnRecords.length>0){for(let n of t.turnRecords){let t=Sa(n.message);t&&await e(t);for(let t of n.toolResults)await e(Ca(t))}return}t.text&&await e({role:`assistant`,content:t.text,timestamp:new Date().toISOString()})}function Sa(e){let t=e.content.filter(e=>e.type===`text`).map(e=>e.text).join(``),n=e.content.filter(e=>e.type===`toolCall`).map(e=>({id:e.id,name:e.name,arguments:e.arguments}));if(t.trim().length===0&&n.length===0)return null;let r={role:`assistant`,content:t,timestamp:new Date().toISOString()};return n.length>0&&(r.toolCalls=n),r}function Ca(e){return{role:`tool_result`,toolCallId:e.toolCallId,toolName:e.toolName,content:e.content,isError:e.isError,toolResultRef:e.toolResultRef,timestamp:new Date().toISOString()}}function wa(e,t,n,r){let i=e.match(/\[tool result persisted\][^\n]*\((\d+) chars\)\.\nFull output: ([^\n]+)/);if(i)return{sessionId:t,toolCallId:n,toolName:r,storagePath:i[2]??``,preview:Ta(e),originalChars:Number(i[1]??`0`),truncated:!0,createdAt:new Date().toISOString()}}function Ta(e){let t=e.indexOf(`
|
|
53
|
+
`)}function Yi(){return[`## Memory Write`,`When the user asks to remember something or new long-term memory is needed, you must use memory_append. Do not use write_file or edit_file for memory writes.`,``].join(`
|
|
54
|
+
`)}function Xi(e){return[`## Memory Recall`,`Before answering anything about prior work, decisions, dates, people, preferences, or todos: run memory_search on MEMORY.md + memory/*.md; then use memory_get to pull only the needed lines. If low confidence after search, say you checked.`,e===`off`?`Citations are disabled: do not include memory file paths or line numbers unless the user explicitly asks.`:`When useful, include memory evidence as Source: <path#line>.`,``].join(`
|
|
55
|
+
`)}function Zi(e){let t=`${e.dataDir}/.aimax`,n=`${e.dataDir}/workspace`,r=e.sandboxInfo?.hostWorkspaceDir?.trim()||n,i=e.sandboxInfo?.containerWorkspaceDir?.trim(),a=e.sandboxInfo?.enabled&&i?`For file tools, paths resolve against the cloud workspace mount ${r}. For exec commands, use paths under ${i} (or relative paths from there). Prefer relative paths whenever possible.`:`This cloud workspace is mounted user storage. Prefer relative paths to keep file tools and shell commands aligned.`;return[`## Workspace`,`Your cloud working directory is: ${r}`,a,`User identity, memory, and agent state live under ${t}, not inside the cloud workspace.`,`Files such as AGENTS.md, SOUL.md, TOOLS.md, IDENTITY.md, USER.md, HEARTBEAT.md, MEMORY.md, and the memory/ directory belong under ${t}.`,`Only create or update those files at their real .aimax paths. Never create cloud workspace copies like ${r}/AGENTS.md or ${r}/MEMORY.md unless the user explicitly asks for separate cloud documents.`,``].join(`
|
|
56
|
+
`)}function Qi(e){if(!e?.enabled)return``;let t=[`## Sandbox`,`You are running in a containerized cloud CLI runtime.`];return e.containerWorkspaceDir?.trim()&&t.push(`Container workdir: ${e.containerWorkspaceDir.trim()}`),e.hostWorkspaceDir?.trim()&&t.push(`Host-mounted workspace: ${e.hostWorkspaceDir.trim()}`),t.push(``),t.join(`
|
|
57
|
+
`)}function $i(e){let t=[];if(e.timezone&&t.push(`Time zone: ${e.timezone}`),e.currentDate){t.push(`Current date: ${e.currentDate}`);let n=ea(e.currentDate);n&&t.push(`Day of week: ${n}`)}return t.length===0?``:[`## Current Date & Time`,...t,``].join(`
|
|
58
|
+
`)}function ea(e){let t=/^(\d{4})-(\d{2})-(\d{2})$/.exec(e.trim());if(!t)return null;let n=Number(t[1]),r=Number(t[2]),i=Number(t[3]),a=new Date(Date.UTC(n,r-1,i));return Number.isNaN(a.getTime())||a.getUTCFullYear()!==n||a.getUTCMonth()!==r-1||a.getUTCDate()!==i?null:[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`][a.getUTCDay()]}function ta(e){if(e.isMinimal||!e.enabled)return``;let t=(e.channels??[]).map(e=>e.trim()).filter(Boolean);return[`## Messaging`,`Reply in the current session for user-visible responses.`,`Use subagent tools for delegated long-running tasks and report concise progress back in this session.`,`Do not use shell/network commands to bypass the platform messaging pipeline.`,t.length>0?`Configured channels: ${t.join(` | `)}`:``,``].filter(Boolean).join(`
|
|
59
|
+
`)}function na(e){if(e.isMinimal)return``;let t=e.docs,n=[`## Documentation`,t?.localPath?`Cloud docs mount: ${t.localPath}`:``,t?.webUrl?`Docs mirror: ${t.webUrl}`:``,t?.sourceUrl?`Source: ${t.sourceUrl}`:``,`For AiMax behavior, configuration, and architecture questions, consult documentation first.`,``].filter(Boolean);return n.length<=2?``:n.join(`
|
|
60
|
+
`)}function ra(e){if(!e)return``;let t=[e.hostname?`host=${e.hostname}`:``,e.os?`os=${e.os}`:``,e.node?`node=${e.node}`:``,e.model?`model=${e.model}`:``].filter(Boolean);return t.length===0?``:[`## Runtime`,`Runtime: ${t.join(` | `)}`,``].join(`
|
|
61
|
+
`)}function ia(e){return e.isMinimal?``:[`## Silent Replies`,`Do not send empty or filler replies.`,`If a tool already delivered the user-visible output, keep your final reply minimal and avoid duplication.`,``].join(`
|
|
62
|
+
`)}function aa(e){return e.isMinimal?``:[`## Heartbeats`,`Heartbeat prompt: ${e.heartbeatPrompt?.trim()||`Read HEARTBEAT.md if it exists (cloud workspace context). Follow it strictly. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK.`}`,`If a user message matches the heartbeat prompt and nothing needs attention, reply exactly: HEARTBEAT_OK`,`If something needs attention, do NOT include "HEARTBEAT_OK"; respond with the alert text instead.`,``].join(`
|
|
63
|
+
`)}function oa(e){let t=e.contextFiles,n=(e.bootstrapWarnings??[]).map(e=>e.trim()).filter(Boolean);if(t.length===0&&n.length===0)return``;let r=t.some(e=>(e.path.split(`/`).pop()?.toLowerCase()??``)===`soul.md`),i=[`# Project Context`,``];if(n.length>0){i.push(`⚠ Bootstrap truncation warning:`);for(let e of n)i.push(`- ${e}`);i.push(``)}t.length>0&&(i.push(`The following project context files have been loaded:`),i.push(`These are source-of-truth cloud files at their shown paths. If you update them, use the exact path shown in the heading, especially for files under .aimax.`)),r&&i.push(`If SOUL.md is present, embody its persona and tone. Avoid stiff, generic replies; follow its guidance unless higher-priority instructions override it.`),i.push(``);for(let e of t)i.push(`## ${e.path}`,``,e.content,``);return i.join(`
|
|
64
|
+
`)}function sa(e){return e?.trim()?[`## Prior Conversation Summary`,`The following is a summary of the conversation history that occurred before the current context window.`,`Use it to maintain continuity with earlier work.`,``,e.trim(),``].join(`
|
|
65
|
+
`):``}function ca(e){let t=e.promptMode??`full`,n=t===`minimal`;if(t===`none`)return`You are a personal assistant running inside AiMax.`;let r=e.toolNames&&e.toolNames.length>0?e.toolNames:[...Ui],i=e.skills??[],a=e.contextFiles??[];return[`You are a personal assistant running inside AiMax.
|
|
66
|
+
`,Gi({toolNames:r,toolSummaries:e.toolSummaries}),qi(n),Ki(),Ji(i),Yi(),Xi(e.memoryCitationsMode??`off`),Zi({dataDir:e.dataDir,sandboxInfo:e.sandboxInfo}),Qi(e.sandboxInfo),$i({currentDate:e.currentDate,timezone:e.timezone}),ta({isMinimal:n,enabled:e.messaging?.enabled,channels:e.messaging?.channels}),na({isMinimal:n,docs:e.docs}),ia({isMinimal:n}),aa({isMinimal:n,heartbeatPrompt:e.heartbeatPrompt}),ra(e.runtimeInfo),oa({contextFiles:a,bootstrapWarnings:e.bootstrapWarnings}),sa(e.priorConversationSummary)].filter(Boolean).join(`
|
|
67
|
+
`)}const la=new Ae;async function ua(e,t){return await la.run(e,t)}function da(e){return{async emit(t){let n=la.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 fa=Symbol(`pluginToolOwner`);var pa=class{tools=[];register(e,t,n){let r=t.name,i=n?.names??(n?.name?[n.name]:r?[r]:[]);Object.defineProperty(t,fa,{value:e,enumerable:!1,configurable:!1,writable:!1}),this.tools.push({pluginId:e,tool:t,optional:n?.optional??!1,names:i})}list(){return[...this.tools]}namesForPlugin(e){return this.tools.filter(t=>t.pluginId===e).flatMap(e=>e.names)}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)}};function ma(e){return e[fa]}function ha(e,t,n,r){return e.map(e=>{let i=e,a=e.name??`unknown`,o=ma(e);return{...i,async execute(e,s,c,l){let u=Date.now(),d=s??{},f=!1,p,m=async e=>o?await ua({pluginId:o,hookContext:n,eventDispatcher:r.eventDispatcher},e):await e(),h=await t.dispatch(`before_tool_call`,{toolCallId:e,toolName:a,params:d},n,r);for(let e of h)e&&(e.params&&(d=e.params),e.block&&(f=!0,p=e.blockReason));if(f)return await t.dispatch(`after_tool_call`,{toolCallId:e,toolName:a,params:d,error:p??`blocked by plugin`,durationMs:Date.now()-u},n,r),{content:[{type:`text`,text:p??`Tool blocked by plugin`}],isError:!0,details:{}};try{let o=await m(async()=>await i.execute(e,d,c,l));return await t.dispatch(`after_tool_call`,{toolCallId:e,toolName:a,params:d,result:o,durationMs:Date.now()-u},n,r),o}catch(i){throw await t.dispatch(`after_tool_call`,{toolCallId:e,toolName:a,params:d,error:String(i),durationMs:Date.now()-u},n,r),i}}}})}var ga=class{hooks=new Map;register(e){let t=this.hooks.get(e.hookName)??[];t.push(e),t.sort((e,t)=>(e.priority??0)-(t.priority??0)),this.hooks.set(e.hookName,t)}async dispatch(e,t,n,r){let i=this.hooks.get(e)??[],a=[];for(let e of i){let i=async()=>await e.handler(t,n),o=r?await ua({pluginId:e.pluginId,hookContext:n,eventDispatcher:r.eventDispatcher},i):await i();a.push(o)}return a}};const X={enabled:!1,historySize:30,warningThreshold:10,criticalThreshold:20,globalCircuitBreakerThreshold:30,detectors:{genericRepeat:!0,knownPollNoProgress:!0,pingPong:!0}};function _a(e,t){return typeof e!=`number`||!Number.isInteger(e)||e<=0?t:e}function va(e){let t=_a(e?.warningThreshold,X.warningThreshold),n=_a(e?.criticalThreshold,X.criticalThreshold),r=_a(e?.globalCircuitBreakerThreshold,X.globalCircuitBreakerThreshold);return n<=t&&(n=t+1),r<=n&&(r=n+1),{enabled:e?.enabled??X.enabled,historySize:_a(e?.historySize,X.historySize),warningThreshold:t,criticalThreshold:n,globalCircuitBreakerThreshold:r,detectors:{genericRepeat:e?.detectors?.genericRepeat??X.detectors.genericRepeat,knownPollNoProgress:e?.detectors?.knownPollNoProgress??X.detectors.knownPollNoProgress,pingPong:e?.detectors?.pingPong??X.detectors.pingPong}}}function Z(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function ya(e,t){return`${e}:${Q(t)}`}function ba(e){if(typeof e!=`object`||!e)return JSON.stringify(e);if(Array.isArray(e))return`[${e.map(ba).join(`,`)}]`;let t=e;return`{${Object.keys(t).toSorted().map(e=>`${JSON.stringify(e)}:${ba(t[e])}`).join(`,`)}}`}function xa(e){try{return ba(e)}catch{return e==null?`${e}`:typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`?`${e}`:e instanceof Error?`${e.name}:${e.message}`:Object.prototype.toString.call(e)}}function Q(e){let t=xa(e);return Ee(`sha256`).update(t).digest(`hex`)}function Sa(e,t){if(e===`command_status`)return!0;if(e!==`process`||!Z(t))return!1;let n=t.action;return n===`poll`||n===`log`}function Ca(e){return!Z(e)||!Array.isArray(e.content)?``:e.content.filter(e=>Z(e)&&typeof e.type==`string`&&typeof e.text==`string`).map(e=>e.text).join(`
|
|
68
|
+
`).trim()}function wa(e){return e instanceof Error?e.message||e.name:typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`?`${e}`:ba(e)}function Ta(e,t,n,r){if(r!==void 0)return`error:${Q(wa(r))}`;if(!Z(n))return n===void 0?void 0:Q(n);let i=Z(n.details)?n.details:{},a=Ca(n);if(Sa(e,t)&&e===`process`&&Z(t)){let e=t.action;if(e===`poll`)return Q({action:e,status:i.status,exitCode:i.exitCode??null,exitSignal:i.exitSignal??null,aggregated:i.aggregated??null,text:a});if(e===`log`)return Q({action:e,status:i.status,totalLines:i.totalLines??null,totalChars:i.totalChars??null,truncated:i.truncated??null,exitCode:i.exitCode??null,exitSignal:i.exitSignal??null,text:a})}return Q({details:i,text:a})}function Ea(e,t,n){let r=0,i;for(let a=e.length-1;a>=0;--a){let o=e[a];if(!(!o||o.toolName!==t||o.argsHash!==n)&&!(typeof o.resultHash!=`string`||!o.resultHash)){if(!i){i=o.resultHash,r=1;continue}if(o.resultHash!==i)break;r+=1}}return{count:r,latestResultHash:i}}function Da(e,t){let n=e.at(-1);if(!n)return{count:0,noProgressEvidence:!1};let r,i;for(let t=e.length-2;t>=0;--t){let a=e[t];if(a&&a.argsHash!==n.argsHash){r=a.argsHash,i=a.toolName;break}}if(!r||!i)return{count:0,noProgressEvidence:!1};let a=0;for(let t=e.length-1;t>=0;--t){let i=e[t];if(!i)continue;let o=a%2==0?n.argsHash:r;if(i.argsHash!==o)break;a+=1}if(a<2||t!==r)return{count:0,noProgressEvidence:!1};let o=Math.max(0,e.length-a),s,c,l=!0;for(let t=o;t<e.length;t+=1){let i=e[t];if(i){if(!i.resultHash){l=!1;break}if(i.argsHash===n.argsHash){if(!s)s=i.resultHash;else if(s!==i.resultHash){l=!1;break}continue}if(i.argsHash===r){if(!c)c=i.resultHash;else if(c!==i.resultHash){l=!1;break}continue}l=!1;break}}return(!s||!c)&&(l=!1),{count:a+1,pairedToolName:n.toolName,pairedSignature:n.argsHash,noProgressEvidence:l}}function Oa(e,t){return[e,t].toSorted().join(`|`)}function ka(e,t,n,r){let i=va(r);if(!i.enabled)return{stuck:!1};let a=e.toolCallHistory??[],o=ya(t,n),s=Ea(a,t,o),c=s.count,l=Sa(t,n),u=Da(a,o);if(c>=i.globalCircuitBreakerThreshold)return{stuck:!0,level:`critical`,detector:`global_circuit_breaker`,count:c,message:`CRITICAL: ${t} has repeated identical no-progress outcomes ${c} times. Session execution blocked by global circuit breaker to prevent runaway loops.`,warningKey:`global:${t}:${o}:${s.latestResultHash??`none`}`};if(l&&i.detectors.knownPollNoProgress&&c>=i.criticalThreshold)return{stuck:!0,level:`critical`,detector:`known_poll_no_progress`,count:c,message:`CRITICAL: Called ${t} with identical arguments and no progress ${c} times. This appears to be a stuck polling loop. Session execution blocked to prevent resource waste.`,warningKey:`poll:${t}:${o}:${s.latestResultHash??`none`}`};if(l&&i.detectors.knownPollNoProgress&&c>=i.warningThreshold)return{stuck:!0,level:`warning`,detector:`known_poll_no_progress`,count:c,message:`WARNING: You have called ${t} ${c} times with identical arguments and no progress. Stop polling and either (1) increase wait time between checks, or (2) report the task as failed if the process is stuck.`,warningKey:`poll:${t}:${o}:${s.latestResultHash??`none`}`};let d=u.pairedSignature?`pingpong:${Oa(o,u.pairedSignature)}`:`pingpong:${t}:${o}`;if(i.detectors.pingPong&&u.count>=i.criticalThreshold&&u.noProgressEvidence)return{stuck:!0,level:`critical`,detector:`ping_pong`,count:u.count,message:`CRITICAL: You are alternating between repeated tool-call patterns (${u.count} consecutive calls) with no progress. This appears to be a stuck ping-pong loop. Session execution blocked to prevent resource waste.`,pairedToolName:u.pairedToolName,warningKey:d};if(i.detectors.pingPong&&u.count>=i.warningThreshold)return{stuck:!0,level:`warning`,detector:`ping_pong`,count:u.count,message:`WARNING: You are alternating between repeated tool-call patterns (${u.count} consecutive calls). This looks like a ping-pong loop; stop retrying and report the task as failed.`,pairedToolName:u.pairedToolName,warningKey:d};let f=a.filter(e=>e.toolName===t&&e.argsHash===o).length;return!l&&i.detectors.genericRepeat&&f>=i.warningThreshold?{stuck:!0,level:`warning`,detector:`generic_repeat`,count:f,message:`WARNING: You have called ${t} ${f} times with identical arguments. If this is not making progress, stop retrying and report the task as failed.`,warningKey:`generic:${t}:${o}`}:{stuck:!1}}function Aa(e,t,n,r,i){let a=va(i);e.toolCallHistory||=[],e.toolCallHistory.push({toolName:t,argsHash:ya(t,n),toolCallId:r,timestamp:Date.now()}),e.toolCallHistory.length>a.historySize&&e.toolCallHistory.shift()}function ja(e,t){let n=va(t.config),r=Ta(t.toolName,t.toolParams,t.result,t.error);if(!r)return;e.toolCallHistory||=[];let i=ya(t.toolName,t.toolParams),a=!1;for(let n=e.toolCallHistory.length-1;n>=0;--n){let o=e.toolCallHistory[n];if(o&&!(t.toolCallId&&o.toolCallId!==t.toolCallId)&&!(o.toolName!==t.toolName||o.argsHash!==i)&&o.resultHash===void 0){o.resultHash=r,a=!0;break}}a||e.toolCallHistory.push({toolName:t.toolName,argsHash:i,toolCallId:t.toolCallId,resultHash:r,timestamp:Date.now()}),e.toolCallHistory.length>n.historySize&&e.toolCallHistory.splice(0,e.toolCallHistory.length-n.historySize)}function Ma(e,t,n){e.toolLoopWarningBuckets||=new Map;let r=Math.floor(n/10);if(r<=(e.toolLoopWarningBuckets.get(t)??0))return!1;if(e.toolLoopWarningBuckets.set(t,r),e.toolLoopWarningBuckets.size>256){let t=e.toolLoopWarningBuckets.keys().next().value;t&&e.toolLoopWarningBuckets.delete(t)}return!0}function Na(e){return e&&e.trim()||`tool`}function Pa(e,t,n){if(!e.execute)return e;let r=Na(e.name),i=e.execute.bind(e);return{...e,execute:async(e,a,o,s)=>{let c=n(t.sessionId),l=ka(c,r,a,t.config);if(l.stuck){if(l.level===`critical`)throw Error(l.message);Ma(c,l.warningKey??`${l.detector}:${r}`,l.count)&&t.onWarning?.(l)}Aa(c,r,a,e,t.config);try{let n=await i(e,a,o,s);return ja(c,{toolName:r,toolParams:a,toolCallId:e,result:n,config:t.config}),n}catch(n){throw ja(c,{toolName:r,toolParams:a,toolCallId:e,error:n,config:t.config}),n}}}}function Fa(e,t,n){return e.map(e=>Pa(e,t,n))}async function Ia(e){let{session:{runParams:t,sessionId:n,hookRegistry:r,hookContext:i,runContext:a,eventDispatcher:o},runtimeInputs:{contextFiles:s,bootstrapWarnings:c,skills:l,effectivePromptText:u,pluginTools:d},dependencies:{registry:f,spawnFn:p,createModel:m,abortSignal:h}}=e,g=t.channel===`CRON`,_=g?[]:await w(t.dataDir,n),v={model:t.llm.model,api:`openai-completions`},y=await sr({dataDir:t.dataDir,sessionId:n}),b=g?{messages:[],priorSummary:void 0,compactionEntry:void 0,stats:{originalCount:0,keptCount:0,estimatedTokens:0,compacted:!1},compactionEvents:[]}:await cr({entries:_,modelInfo:v,contextWindowTokens:t.llm.contextWindow??2e5,llm:{baseUrl:t.llm.baseUrl,apiKey:t.llm.apiKey,model:t.llm.model},historyLimit:t.historyLimit,compactionEnabled:!0,signal:h,hooks:r,hookCtx:i,contextManager:y,dataDir:t.dataDir,sessionId:n});await La({sessionId:n,historyResult:b,runContext:a,eventDispatcher:o,hookRegistry:r,hookContext:i});let x=t.subagentContext?.depth??0,S=[...Vi(t.dataDir,{sessionId:t.subagentContext?.parentSessionId??n,registry:f,parentSessionId:n,depth:x,channel:t.channel,llm:t.llm,inheritedRunParams:{plugins:t.plugins,memory:t.memory,messaging:t.messaging,docs:t.docs,historyLimit:t.historyLimit,onProgress:t.onProgress,messageId:t.messageId},loopDetection:t.loopDetection,memoryOptions:{providerId:a.memoryProviderId,pluginId:a.memoryPluginId,sessionId:n,onMemoryChanged:async()=>{}},contextManager:y,hitlResume:t.hitlResume,spawnFn:p}),...d],C=S.map(e=>typeof e.name==`string`?e.name.trim():``).filter(Boolean),T={};for(let e of S){let t=typeof e.name==`string`?e.name.trim():``,n=typeof e.description==`string`?e.description.trim():``;!t||!n||T[t]||(T[t]=n)}let E=t.messaging?.enabled??t.channel!==`CRON`,ee=t.messaging?.channels&&t.messaging.channels.length>0?t.messaging.channels:[t.channel],D=ca({dataDir:t.dataDir,skills:l,contextFiles:s,toolNames:C,toolSummaries:T,promptMode:x>0?`minimal`:`full`,bootstrapWarnings:c,memoryCitationsMode:t.memory?.citationsMode??`off`,messaging:{enabled:E,channels:ee},docs:{localPath:t.docs?.localPath,webUrl:t.docs?.webUrl,sourceUrl:t.docs?.sourceUrl},sandboxInfo:{enabled:!0,hostWorkspaceDir:a.workspaceDir,containerWorkspaceDir:a.workspaceDir},runtimeInfo:{os:process.platform,node:process.version,model:t.llm.model,hostname:Oe.hostname()},currentDate:new Date().toISOString().split(`T`)[0],priorConversationSummary:b.priorSummary}),O=await r.dispatch(`before_prompt_build`,{prompt:u},i,{eventDispatcher:o});for(let e of O)e&&(e.systemPrompt&&(D=e.systemPrompt),e.prependContext&&(D=`${e.prependContext}\n\n${D}`));await r.dispatch(`after_prompt_build`,{prompt:u,systemPrompt:D},i,{eventDispatcher:o});let k=Fa(ha(S,r,i,{eventDispatcher:o}),{sessionId:n,config:t.loopDetection},$e),A=t.llm.model,j=await r.dispatch(`before_model_resolve`,{prompt:u},i,{eventDispatcher:o});for(let e of j)e&&e.modelOverride&&(A=e.modelOverride);let M=m({...t.llm,model:A},n),te=new De({initialState:{systemPrompt:D,model:M,tools:k,messages:[]},getApiKey:e=>t.llm.apiKey});return b.messages.length>0&&te.replaceMessages(b.messages),{agent:te,resolvedModelId:A,historyMessages:b.messages,historyResult:b,workspaceDir:a.workspaceDir}}async function La(e){let{sessionId:t,historyResult:n,runContext:r,eventDispatcher:i,hookRegistry:a,hookContext:o}=e;for(let e of n.compactionEvents??[])e.type===`compaction`&&await i.dispatchDiagnostic(t,{level:`info`,scope:`session`,phase:`history_compaction`,message:e.reason,details:{layer:e.layer,strategy:e.strategy,estimatedTokensFreed:e.estimatedTokensFreed,affectedEntries:e.affectedEntries,snapshotVersion:e.snapshotVersion}});if(n.compactionEntry){let e=n.stats.originalCount-n.stats.keptCount;await a.dispatch(`before_compaction`,{messageCount:n.stats.originalCount,compactingCount:e},o,{eventDispatcher:i}),await r.appendTranscriptEntry(n.compactionEntry),(n.compactionEvents?.length??0)===0&&await i.dispatchDiagnostic(t,{level:`info`,scope:`session`,phase:`history_compaction`,message:`Summarised ${e} older entries`,details:{strategy:`summary_only`,compactedCount:e}}),await a.dispatch(`after_compaction`,{messageCount:n.stats.originalCount,compactedCount:e},o,{eventDispatcher:i})}}async function Ra(e){let{agent:t,message:n,sessionId:r,modelId:i,historyMessages:a,eventDispatcher:o,skillUsageTracker:s,hooks:c,hookCtx:l,abortSignal:u}=e,d=``,f=``,p=``,m=0,h=0,g,_,v=0,y=[],b=new Map,x=t.subscribe(async e=>{if(e.type===`message_update`){let t=e.assistantMessageEvent;if(t.type===`text_delta`&&typeof t.delta==`string`){let n=Ga(`partial`in t?t.partial:void 0)??Ga(`message`in t?t.message:void 0)??Ga(`message`in e?e.message:void 0),i=Ka(t.delta,n,f);i&&(await o.dispatchProgress(r,{type:`stream_text_delta`,text:i}),p+=i),n&&(f=n,p=n)}if(t.type===`done`){let e=t.message;d=Wa(e);let n=Ka(``,d,p||f);n&&(await o.dispatchProgress(r,{type:`stream_text_delta`,text:n}),p+=n),f=d,p=d,e.usage&&(m=e.usage.input,h=e.usage.output)}return}if(e.type===`message_end`){let t=e.message;if(t.usage&&(m=t.usage.input,h=t.usage.output),t.role===`assistant`&&Array.isArray(t.content)){let e=t,n=Wa(e);await c.dispatch(`assistant_message_end`,{sessionId:r,model:i,assistantText:n,assistantMessage:e,hasToolCalls:e.content.some(e=>e.type===`toolCall`),durationMs:v>0?Math.max(0,Date.now()-v):void 0,usage:t.usage?{input:m,output:h,total:m+h}:void 0},l)}return}if(e.type===`turn_end`){let t=e.message;(t.stopReason===`error`||t.stopReason===`aborted`)&&(_=t.errorMessage??(t.stopReason===`aborted`?`aborted`:`Unknown LLM error`));let n=e.toolResults??[];y.push({message:t,toolResults:n.map(e=>({toolCallId:e.toolCallId,toolName:e.toolName,content:e.content.filter(e=>e.type===`text`).map(e=>e.text??``).join(``),isError:e.isError,toolResultRef:Ha(e.content.filter(e=>e.type===`text`).map(e=>e.text??``).join(``),r,e.toolCallId,e.toolName)}))});return}if(e.type===`tool_execution_start`){p=``,b.set(e.toolCallId,e.args),s.onToolExecutionStart({toolName:e.toolName,args:e.args}),await o.dispatchProgress(r,{type:`tool_start`,toolCallId:e.toolCallId,name:e.toolName,input:e.args});return}if(e.type===`tool_execution_end`){await s.onToolExecutionEnd({toolName:e.toolName,isError:e.isError});let t=typeof e.result==`string`?e.result:JSON.stringify(e.result),n=b.get(e.toolCallId);b.delete(e.toolCallId),await o.dispatchProgress(r,{type:`tool_end`,toolCallId:e.toolCallId,name:e.toolName,input:n,output:t,isError:e.isError})}});try{if(await c.dispatch(`llm_input`,{sessionId:r,model:i,prompt:typeof n==`string`?n:JSON.stringify(n),historyMessages:a},l),u?.aborted)throw Error(`aborted`);if(v=Date.now(),await t.prompt(n),!g){let e=typeof t.state.error==`string`?t.state.error:void 0,n=_??e;n&&(g=qa(n),await o.dispatchProgress(r,{type:`error`,message:g}))}}catch(e){g=qa(e),await o.dispatchProgress(r,{type:`error`,message:g})}finally{x()}let S=y.length>0?y[y.length-1]?.message:void 0;return await c.dispatch(`llm_output`,{sessionId:r,model:i,assistantTexts:d?[d]:[],lastAssistant:S,usage:{input:m,output:h,total:m+h}},l),{text:(y.length>0?Wa(y[y.length-1].message):``)||d,inputTokens:m,outputTokens:h,error:g,turnRecords:y}}async function za(e,t){if(t.turnRecords.length>0){for(let n of t.turnRecords){let t=Ba(n.message);t&&await e(t);for(let t of n.toolResults)await e(Va(t))}return}t.text&&await e({role:`assistant`,content:t.text,timestamp:new Date().toISOString()})}function Ba(e){let t=e.content.filter(e=>e.type===`text`).map(e=>e.text).join(``),n=e.content.filter(e=>e.type===`toolCall`).map(e=>({id:e.id,name:e.name,arguments:e.arguments}));if(t.trim().length===0&&n.length===0)return null;let r={role:`assistant`,content:t,timestamp:new Date().toISOString()};return n.length>0&&(r.toolCalls=n),r}function Va(e){return{role:`tool_result`,toolCallId:e.toolCallId,toolName:e.toolName,content:e.content,isError:e.isError,toolResultRef:e.toolResultRef,timestamp:new Date().toISOString()}}function Ha(e,t,n,r){let i=e.match(/\[tool result persisted\][^\n]*\((\d+) chars\)\.\nFull output: ([^\n]+)/);if(i)return{sessionId:t,toolCallId:n,toolName:r,storagePath:i[2]??``,preview:Ua(e),originalChars:Number(i[1]??`0`),truncated:!0,createdAt:new Date().toISOString()}}function Ua(e){let t=e.indexOf(`
|
|
69
69
|
Preview:
|
|
70
|
-
`);return t===-1?``:e.slice(t+10).replace(/\n\.\.\.$/,``)}function
|
|
70
|
+
`);return t===-1?``:e.slice(t+10).replace(/\n\.\.\.$/,``)}function Wa(e){return e.content.filter(e=>e.type===`text`).map(e=>e.text).join(``)}function Ga(e){if(!e||typeof e!=`object`)return null;let t=e;return Array.isArray(t.content)?t.content.filter(e=>typeof e==`object`&&!!e&&`type`in e&&e.type===`text`&&`text`in e).map(e=>e.text).join(``):null}function Ka(e,t,n){return t?n?t===n?``:t.startsWith(n)?t.slice(n.length):t:t:e}function qa(e){let t=Ja(e);return t?t.code===`http_error`&&t.statusCode?t.providerMessage?`LLM upstream returned HTTP ${t.statusCode}${t.statusText?` ${t.statusText}`:``}: ${t.providerMessage}`:`LLM upstream returned HTTP ${t.statusCode}${t.statusText?` ${t.statusText}`:``}`:t.code===`timeout`?`LLM request timed out`:t.code===`network_error`?t.message:t.code===`aborted`?`LLM request was aborted`:t.message:e instanceof Error?e.message:String(e)}function Ja(e){if(e instanceof B)return e;if(!(e instanceof Error))return null;let t=e;return e.name!==`LlmRequestError`&&!t.code?null:{message:e.message,code:t.code,statusCode:t.statusCode,statusText:t.statusText,providerMessage:t.providerMessage}}async function Ya(e){let{agent:t,registry:n,sessionId:r,resolvedModelId:i,eventDispatcher:a,skillUsageTracker:o,hookRegistry:s,hookContext:c,abortSignal:l,appendEntry:u}=e,d=0,f=``,p=0,m=0,h;for(;!l?.aborted&&n.needsAnnounce(r)&&d<10;){d++,await n.waitForAll(r);let e=n.consumeCompleted(r);if(e.length===0)break;for(let t of e)await a.dispatchProgress(r,{type:`subagent_complete`,childSessionId:t.childSessionId,task:t.task,status:t.status});let g=Xa(e);await u({role:`user`,content:g,timestamp:new Date().toISOString()});let _=await Ra({agent:t,message:g,sessionId:r,modelId:i,historyMessages:[],eventDispatcher:a,skillUsageTracker:o,hooks:s,hookCtx:c,abortSignal:l});f=_.text,p+=_.inputTokens,m+=_.outputTokens,_.error&&!h&&(h=_.error),await za(u,_)}return{text:f,inputTokens:p,outputTokens:m,error:h}}function Xa(e){if(e.length===1){let t=e[0];return Ni({task:t.task,label:t.label,status:t.status,result:t.result,error:t.error})}let t=e.map(e=>Ni({task:e.task,label:e.label,status:e.status,result:e.result,error:e.error}));return`[${e.length} subagents completed]\n\n${t.join(`
|
|
71
71
|
|
|
72
72
|
---
|
|
73
73
|
|
|
74
|
-
`)}`}function Na(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Pa(e){return Array.isArray(e)?e.map(e=>typeof e==`string`?e.trim():``).filter(Boolean):[]}function Fa(e){let t=e.trim();return t===`~`?Oe.homedir():t.startsWith(`~/`)||t.startsWith(`~\\`)?F.join(Oe.homedir(),t.slice(2)):F.resolve(t)}const Ia=new Ae({allErrors:!0,strict:!1}),La=new Map;function Ra(e,t){let n=La.get(t);if(n)return n;let r=Ia.compile(e);return La.set(t,r),r}function za(e){let t=e.cacheKey??JSON.stringify(e.schema),n=Ra(e.schema,t);return n(e.value)?{ok:!0}:{ok:!1,errors:(n.errors??[]).map(e=>({path:e.instancePath||`/`,message:e.message??`invalid`}))}}function Ba(e){let t=Pa(e?.allow),n=Pa(e?.deny),r=Pa(e?.load?.paths),i=e?.entries??{},a=e?.slots??{};return{enabled:e?.enabled??!0,allow:Array.from(new Set(t)),deny:Array.from(new Set(n)),loadPaths:Array.from(new Set(r)),entries:i,slots:a}}function Va(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=za({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 Ha(e){try{return R.realpathSync(e)}catch{return null}}function Ua(e){try{return R.statSync(e)}catch{return null}}function Wa(e,t){let n=F.relative(e,t);return n===``?!0:n.startsWith(`..`)?!1:!F.isAbsolute(n)}function Ga(e){return`0o${e.toString(8).padStart(3,`0`)}`}const Ka=new Set([`.ts`,`.js`,`.mts`,`.cts`,`.mjs`,`.cjs`]),qa=[`index.ts`,`index.js`,`index.mts`,`index.cts`,`index.mjs`,`index.cjs`];function Ja(e){let t=F.join(e,`package.json`);if(R.existsSync(t))try{let e=JSON.parse(R.readFileSync(t,`utf-8`));return Na(e)?e:void 0}catch{return}}function Ya(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 Xa(e){return e===void 0?process.platform===`win32`||typeof process.getuid!=`function`?null:process.getuid():e}function Za(e){let t=Ha(e.source),n=Ha(e.rootDir);return!t||!n||Wa(n,t)?null:{reason:`source_escapes_root`,sourcePath:e.source,rootPath:e.rootDir,targetPath:e.source,sourceRealPath:t,rootRealPath:n}}function Qa(e){if(process.platform===`win32`)return null;let t=[e.rootDir,e.source],n=new Set;for(let r of t){let t=F.resolve(r);if(n.has(t))continue;n.add(t);let i=Ua(r);if(!i)return{reason:`path_stat_failed`,sourcePath:e.source,rootPath:e.rootDir,targetPath:r};let a=i.mode&511;if(a&2)return{reason:`path_world_writable`,sourcePath:e.source,rootPath:e.rootDir,targetPath:r,modeBits:a};if(e.origin!==`bundled`&&e.uid!==null&&typeof i.uid==`number`&&i.uid!==e.uid&&i.uid!==0)return{reason:`path_suspicious_ownership`,sourcePath:e.source,rootPath:e.rootDir,targetPath:r,foundUid:i.uid,expectedUid:e.uid}}return null}function $a(e){return Za({source:e.source,rootDir:e.rootDir})||Qa({source:e.source,rootDir:e.rootDir,origin:e.origin,uid:Xa(e.ownershipUid)})}function eo(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=${Ga(e.modeBits??0)})`:`blocked plugin candidate: suspicious ownership (${e.targetPath}, uid=${e.foundUid}, expected uid=${e.expectedUid} or root)`}function to(e){let t=$a({source:e.source,rootDir:e.rootDir,origin:e.origin,ownershipUid:e.ownershipUid});return t?(e.diagnostics.push({level:`warn`,message:eo(t),source:e.source}),!0):!1}function no(e){return F.basename(e,F.extname(e))}function ro(e){return{idHint:e.idHint,source:e.source,rootDir:e.rootDir,origin:e.origin,workspaceDir:e.workspaceDir,packageName:e.packageName,packageVersion:e.packageVersion,packageDescription:e.packageDescription,packageDir:e.packageDir,packageManifest:e.packageManifest}}function io(e){for(let t of qa){let n=F.join(e,t);if(R.existsSync(n))return n}return null}function Q(e){let t;try{t=R.readdirSync(e.rootDir,{withFileTypes:!0})}catch{return}for(let n of t){let t=F.join(e.rootDir,n.name);if(n.isFile()){if(!Ka.has(F.extname(n.name)))continue;let r=F.dirname(t);if(to({source:t,rootDir:r,origin:e.origin,diagnostics:e.diagnostics,ownershipUid:e.ownershipUid}))continue;e.candidates.push(ro({idHint:no(t),source:t,rootDir:r,origin:e.origin,workspaceDir:e.workspaceDir}));continue}if(!n.isDirectory())continue;let r=Ja(t),i=Ya(r);if(i.status===`ok`){for(let n of i.entries){let i=F.resolve(t,n);if(!Wa(t,i)){e.diagnostics.push({level:`warn`,message:`blocked plugin candidate: package entry escapes package root (${n})`,source:i});continue}if(!R.existsSync(i)){e.diagnostics.push({level:`warn`,message:`plugin entry missing: ${i}`,source:i});continue}if(!Ka.has(F.extname(i))){e.diagnostics.push({level:`warn`,message:`plugin entry not a supported extension: ${i}`,source:i});continue}if(to({source:i,rootDir:t,origin:e.origin,diagnostics:e.diagnostics,ownershipUid:e.ownershipUid}))continue;let a=r?.name?.trim(),o=a?`${a}/${no(i)}`:no(i);e.candidates.push(ro({idHint:o,source:i,rootDir:t,origin:e.origin,workspaceDir:e.workspaceDir,packageName:r?.name,packageVersion:r?.version,packageDescription:r?.description,packageDir:t,packageManifest:r?.aimax}))}continue}let a=io(t);a&&(to({source:a,rootDir:t,origin:e.origin,diagnostics:e.diagnostics,ownershipUid:e.ownershipUid})||e.candidates.push(ro({idHint:F.basename(t),source:a,rootDir:t,origin:e.origin,workspaceDir:e.workspaceDir})))}}function ao(e){return e?e.map(Fa):[]}function oo(){return F.join(Fa(`~`),`.aimax`,`extensions`)}function so(e){return F.join(e,`.aimax`,`extensions`)}function co(e){return F.join(e,`.aimax`,`extensions`)}function lo(e={}){let t=[],n=[],r=ao(e.extraPaths);for(let i of r){if(!R.existsSync(i)){n.push({level:`warn`,message:`plugin path not found: ${i}`,source:i});continue}let r=Ua(i);if(!r){n.push({level:`warn`,message:`plugin path not readable: ${i}`,source:i});continue}if(r.isFile()){if(!Ka.has(F.extname(i))){n.push({level:`warn`,message:`plugin file has unsupported extension: ${i}`,source:i});continue}let r=F.dirname(i);if(to({source:i,rootDir:r,origin:`config`,diagnostics:n,ownershipUid:e.ownershipUid}))continue;t.push(ro({idHint:no(i),source:i,rootDir:r,origin:`config`,workspaceDir:e.workspaceDir}));continue}r.isDirectory()&&Q({rootDir:i,origin:`config`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid})}return e.dataDir?Q({rootDir:so(e.dataDir),origin:`workspace`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid}):e.workspaceDir&&Q({rootDir:co(e.workspaceDir),origin:`workspace`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid}),Q({rootDir:oo(),origin:`global`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid}),e.bundledDir&&Q({rootDir:e.bundledDir,origin:`bundled`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid}),{candidates:t,diagnostics:n}}function uo(e){let t=e.rejectHardlinks??!0,n=Ha(e.rootPath),r=Ha(e.absolutePath);if(!n||!r)return{ok:!1,reason:`path`};if(!Wa(n,r))return{ok:!1,reason:`unsafe`};let i;try{i=R.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:R.openSync(r,`r`)}}catch{return{ok:!1,reason:`path`}}}const fo=`aimax.plugin.json`,po=[fo];function mo(e){for(let t of po){let n=F.join(e,t);if(R.existsSync(n))return n}return F.join(e,fo)}function ho(e,t=!0){let n=mo(e),r=uo({absolutePath:n,rootPath:e,rejectHardlinks:t});if(!r.ok){let e=r.reason;return e===`path`?{ok:!1,error:`plugin manifest not found: ${n}`,manifestPath:n}:{ok:!1,error:`unsafe plugin manifest path: ${n} (${e})`,manifestPath:n}}let i;try{i=JSON.parse(R.readFileSync(r.fd,`utf-8`))}catch(e){return{ok:!1,error:`failed to parse plugin manifest: ${String(e)}`,manifestPath:n}}finally{R.closeSync(r.fd)}if(!Na(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=Na(i.configSchema)?i.configSchema:null;if(!o)return{ok:!1,error:`plugin manifest requires configSchema`,manifestPath:n};let s=typeof i.kind==`string`?i.kind:void 0,c=typeof i.name==`string`?i.name.trim():void 0,l=typeof i.description==`string`?i.description.trim():void 0,u=typeof i.version==`string`?i.version.trim():void 0,d=Pa(i.skills),f;return Na(i.uiHints)&&(f=i.uiHints),{ok:!0,manifest:{id:a,configSchema:o,kind:s,name:c,description:l,version:u,skills:d,uiHints:f},manifestPath:n}}function go(e){let t=new Map,n=[];for(let r of e){let e=ho(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}}var _o=class{tools=[];register(e,t,n){let r=t.name,i=n?.names??(n?.name?[n.name]:r?[r]:[]);this.tools.push({pluginId:e,tool:t,optional:n?.optional??!1,names:i})}list(){return[...this.tools]}namesForPlugin(e){return this.tools.filter(t=>t.pluginId===e).flatMap(e=>e.names)}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)}};let vo=function(e){return e.INFO=`INFO`,e.WARN=`WARN`,e.ERROR=`ERROR`,e}({});function yo(){let e=new Date;return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)} ${String(e.getHours()).padStart(2,`0`)}:${String(e.getMinutes()).padStart(2,`0`)}:${String(e.getSeconds()).padStart(2,`0`)}.${String(e.getMilliseconds()).padStart(3,`0`)}`}function bo(e,t,n,r){process.stderr.write(`[${yo()}] [${e}] [plugin:${t}][logger:${n}] ${r}\n`)}function xo(e){return{version:`0.1.0`,logging:{getLogger:t=>({info:n=>bo(vo.INFO,e.pluginId,t,n),warn:n=>bo(vo.WARN,e.pluginId,t,n),error:n=>bo(vo.ERROR,e.pluginId,t,n)})}}}function So(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 Co(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 wo(e){let t=[...e.registry.diagnostics],n=new _o,r=new Qi,i=[],o=[],s=e.runtime?.llm?nt({baseUrl:e.runtime.llm.baseUrl,apiKey:e.runtime.llm.apiKey,defaultModel:e.runtime.llm.model,hooks:r,hookCtx:e.runtime.hookCtx}):void 0,c=To(e.runtime?.llmAllowlist),l=je(import.meta.url,{interopDefault:!0,requireCache:!1});for(let u of e.registry.manifests.values()){let d=So({config:e.plugins,pluginId:u.id,origin:u.origin,kind:u.manifest.kind}),f=Co({id:u.id,source:u.source,origin:u.origin,enabled:d,configSchema:!0,skills:u.manifest.skills??[]});if(!d){o.push(f);continue}let p;try{p=l(u.source)}catch(e){f.status=`error`,f.error=String(e),t.push({level:`error`,message:`failed to load plugin ${u.id}: ${String(e)}`,pluginId:u.id,source:u.source}),o.push(f);continue}let m=p&&typeof p==`object`&&`default`in p?p.default:p,h=typeof m==`function`?m:m&&typeof m==`object`&&typeof m.register==`function`?m.register:void 0;if(!h){f.status=`error`,f.error=`plugin module does not export a register function`,t.push({level:`error`,message:`plugin ${u.id} has no register function`,pluginId:u.id,source:u.source}),o.push(f);continue}let g=xo({pluginId:u.id}),_=e.plugins.entries[u.id]?.config,v={id:u.id,source:u.source,rootDir:u.rootDir,config:_,runtime:g,llm:{chat:async e=>{if(!s)throw Error(`LLM client is not configured`);if(!Eo(u.id,n,c))throw Error(`Plugin ${u.id} is not allowed to use LLM`);return s.chat(e)}},registerTool:(e,t)=>{n.register(u.id,e,t),f.toolCount+=1},registerEmbeddingProvider:e=>{if(u.manifest.kind!==`memory`)throw Error(`Plugin ${u.id} is not allowed to register embedding providers`);a({pluginId:u.id,id:e.id,create:e.create,config:_,rootDir:u.rootDir,source:u.source})},registerMemoryProvider:e=>{if(u.manifest.kind!==`memory`)throw Error(`Plugin ${u.id} is not allowed to register memory providers`);E({pluginId:u.id,id:e.id,create:e.create,config:_,rootDir:u.rootDir,source:u.source})},registerHook:(e,t,n)=>{r.register({pluginId:u.id,hookName:e,handler:t,priority:n?.priority,source:u.source}),f.hookCount+=1},registerSkillDir:e=>{let t=F.isAbsolute(e)?e:F.resolve(u.rootDir,e);i.push(t)}};try{h(v)}catch(e){f.status=`error`,f.error=String(e),t.push({level:`error`,message:`plugin ${u.id} registration failed: ${String(e)}`,pluginId:u.id,source:u.source})}if(u.manifest.skills&&u.manifest.skills.length>0)for(let e of u.manifest.skills){let t=F.isAbsolute(e)?e:F.resolve(u.rootDir,e);i.push(t)}o.push(f)}return{plugins:o,diagnostics:t,tools:n,hooks:r,skills:i}}function To(e){return(e??[]).map(e=>e.trim()).filter(Boolean)}function Eo(e,t,n){return n.length===0?!1:n.includes(e)?!0:t.namesForPlugin(e).some(e=>n.includes(e))}function Do(e={}){let t=Ba(e.config),n=lo({dataDir:e.dataDir,workspaceDir:e.workspaceDir,extraPaths:t.loadPaths,bundledDir:e.bundledDir,ownershipUid:e.ownershipUid}),r=go(n.candidates),i=Va({config:t,registry:r}),a=wo({registry:r,plugins:t,workspaceDir:e.workspaceDir,runtime:e.runtime});return{registry:a,diagnostics:[...n.diagnostics,...r.diagnostics,...i.diagnostics,...a.diagnostics],normalizedConfig:t}}function Oo(e){let{runParams:t,hookContext:n,sessionId:r,eventDispatcher:i}=e,a=e=>{i.dispatchDiagnostic(r,e).catch(()=>void 0)},o=t.plugins?Do({...t.plugins,runtime:{llm:t.llm,hookCtx:n,llmAllowlist:t.plugins.llmAllowlist}}):void 0;if(!o)a({level:`info`,scope:`plugin`,phase:`plugin_system_disabled`,message:`plugin system disabled for this run`});else{a({level:o.diagnostics.some(e=>e.level===`error`)?`warn`:`info`,scope:`plugin`,phase:`plugin_system_initialized`,message:`plugin system initialized`,details:{pluginCount:o.registry.plugins.length,enabledPluginCount:o.registry.plugins.filter(e=>e.status===`loaded`).length,disabledPluginCount:o.registry.plugins.filter(e=>e.status===`disabled`).length,errorPluginCount:o.registry.plugins.filter(e=>e.status===`error`).length,diagnosticCount:o.diagnostics.length}});for(let e of o.registry.plugins)a({level:e.status===`error`?`error`:e.status===`disabled`?`warn`:`info`,scope:`plugin`,phase:`plugin_${e.status}`,message:e.status===`error`?`plugin failed to initialize`:e.status===`disabled`?`plugin disabled`:`plugin enabled`,details:{pluginId:e.id,origin:e.origin,toolCount:e.toolCount,hookCount:e.hookCount,skillCount:e.skills.length,source:e.source,errorMessage:e.error}});for(let e of o.diagnostics)a({level:e.level===`error`?`error`:`warn`,scope:`plugin`,phase:`plugin_diagnostic`,message:e.message,details:{pluginId:e.pluginId,source:e.source}})}return{hookRegistry:o?.registry.hooks??new Qi,pluginSkillDirs:o?.registry.skills??[],pluginTools:o?.registry.tools.resolveEnabled(t.plugins?.toolAllowlist)??[],memoryPluginId:t.memory?.pluginId??o?.normalizedConfig.slots?.memory}}async function ko(e){let{runParams:t,requestedSessionId:n,eventDispatcher:r}=e,i=F.join(t.dataDir,`workspace`),a=n,o=!a;a?await l(t.dataDir,a):a=await c(t.dataDir,t.channel);let s={sessionId:a,workspaceDir:i,channel:t.channel},u=Oo({runParams:t,hookContext:s,sessionId:a,eventDispatcher:r}),d=u.hookRegistry,f=await Lt({runParams:t,sessionId:a,hookContext:s,memoryProviderId:t.memory?.providerId,memoryPluginId:u.memoryPluginId,eventDispatcher:r,hookRegistry:d});return{sessionId:a,isNewSession:o,workspaceDir:i,hookContext:s,hookRegistry:d,pluginContext:u,runContext:f,start:e=>Vt({sessionId:a,runParams:t,hookRegistry:d,hookContext:s,eventDispatcher:r,...e})}}function Ao(e){return e===null||typeof e==`string`||typeof e==`number`||typeof e==`boolean`?e:JSON.stringify(e)??String(e)}function jo(e){if(!(e instanceof Error))return{errorValue:Ao(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]=Ao(n[e]));return t}async function Mo(e){await e.dispatcher.dispatchDiagnostic(e.sessionId,{level:`error`,scope:e.scope,phase:e.phase,message:e.message,details:{...e.details,...jo(e.error)}})}function No(e,t){return{id:e.model,name:e.model,api:`openai-completions`,provider:`openai`,baseUrl:e.baseUrl,reasoning:!1,input:[`text`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:e.contextWindow??2e5,maxTokens:32768,headers:{"Client-Code":`AIMax`,"X-Session-Id":t},compat:{supportsStore:!1,supportsDeveloperRole:!1,supportsReasoningEffort:!1,supportsUsageInStreaming:!0}}}async function Po(e,t){jt();let n=Date.now(),r=new Mt(e),i=xn(e),a=i.transcriptMessage,o=!1,s=i.previousSessionId,c=await ko({runParams:e,requestedSessionId:i.requestedSessionId,eventDispatcher:r}),l=c.sessionId,u=c.isNewSession,d=c.workspaceDir,f=c.hookContext,p=c.hookRegistry,m=c.pluginContext,h=c.runContext;await r.dispatchDiagnostic(l,{level:`info`,scope:`runner`,phase:`run_started`,message:`agent run started`,details:{channel:e.channel,isNewSession:u,hasMessageId:!!e.messageId,hasPlugins:!!e.plugins,hasMemory:!!e.memory}}),await r.dispatchDiagnostic(l,{level:`info`,scope:`session`,phase:u?`session_created`:`session_resumed`,message:u?`session created`:`session resumed`,details:{requestedSessionId:i.requestedSessionId,previousSessionId:s,workspaceDir:d}}),i.resetCommand&&(o=await h.persistInitialUserEntry(a)),await c.start({resetCommand:i.resetCommand,previousSessionId:s,resetMessage:i.slashCommandSource,startMessage:typeof i.promptInput==`string`?i.promptInput:a});let g=new AbortController;e.abortSignal?.aborted?g.abort():e.abortSignal?.addEventListener(`abort`,()=>g.abort());let _=await Fe(e.dataDir),v=[],y=Re(_,{warn:e=>v.push(e)});await r.dispatchDiagnostic(l,{level:v.length>0?`warn`:`info`,scope:`runner`,phase:`bootstrap_loaded`,message:`bootstrap context loaded`,details:{bootstrapFileCount:_.length,contextFileCount:y.length,warningCount:v.length}});let b=await We(e.dataDir,m.pluginSkillDirs),x=new tt({workspaceDir:d,sessionId:l,skills:b,report:e=>r.dispatchProgress(l,e),reportDiagnostic:e=>r.dispatchDiagnostic(l,{level:e.level,scope:`skill`,phase:e.phase,message:e.message,details:e.details})});await r.dispatchDiagnostic(l,{level:`info`,scope:`skill`,phase:`skills_loaded`,message:`skills loaded`,details:{skillCount:b.length,pluginSkillDirCount:m.pluginSkillDirs.length}});let S=e=>h.appendTranscriptEntry(e),C=await Cn({invocation:i,skills:b,sessionId:l,isNewSession:u,initialUserEntryPersisted:o,runParams:e,hookRegistry:p,hookContext:f,startTime:n,eventDispatcher:r});if(C.kind===`completed`)return C.result;let w=C.effectivePrompt;a=C.transcriptMessage;let T=typeof w==`string`?w:a;await r.dispatchDiagnostic(l,{level:`info`,scope:`runner`,phase:`invocation_resolved`,message:`invocation resolved`,details:{promptType:typeof w==`string`?`string`:`messages`,transcriptLength:a.length}});let E=await va({session:{runParams:e,sessionId:l,hookRegistry:p,hookContext:f,runContext:h,eventDispatcher:r},runtimeInputs:{contextFiles:y,bootstrapWarnings:v,skills:b,effectivePromptText:T,pluginTools:m.pluginTools},dependencies:{registry:t,spawnFn:e=>Po(e,new Ye),createModel:No,abortSignal:g.signal}}),D=E.agent,O=E.resolvedModelId;await r.dispatchDiagnostic(l,{level:`info`,scope:`runner`,phase:`runtime_created`,message:`agent runtime created`,details:{modelId:O,historyMessageCount:E.historyMessages.length,pluginToolCount:m.pluginTools.length}}),g.signal.addEventListener(`abort`,()=>D.abort());let k=0,A=0,j=``,M;try{o=await h.persistInitialUserEntry(a)||o,await r.dispatchDiagnostic(l,{level:`info`,scope:`runner`,phase:`first_turn_started`,message:`first agent turn started`});let e=await ba({agent:D,message:w,sessionId:l,modelId:O,historyMessages:E.historyMessages,eventDispatcher:r,skillUsageTracker:x,hooks:p,hookCtx:f,abortSignal:g.signal});j=e.text,k+=e.inputTokens,A+=e.outputTokens,e.error&&(M=e.error),await r.dispatchDiagnostic(l,{level:e.error?`warn`:`info`,scope:`runner`,phase:`first_turn_completed`,message:`first agent turn completed`,details:{hasError:!!e.error,error:e.error,inputTokens:e.inputTokens,outputTokens:e.outputTokens}}),await xa(S,e),await r.dispatchDiagnostic(l,{level:`info`,scope:`runner`,phase:`announce_loop_started`,message:`announce loop started`});let n=await ja({agent:D,registry:t,sessionId:l,resolvedModelId:O,eventDispatcher:r,skillUsageTracker:x,hookRegistry:p,hookContext:f,abortSignal:g.signal,appendEntry:S});n.text&&(j=n.text),k+=n.inputTokens,A+=n.outputTokens,n.error&&!M&&(M=n.error),await r.dispatchDiagnostic(l,{level:n.error?`warn`:`info`,scope:`runner`,phase:`announce_loop_completed`,message:`announce loop completed`,details:{hasError:!!n.error,error:n.error,inputTokens:n.inputTokens,outputTokens:n.outputTokens}})}catch(t){throw await Mo({dispatcher:r,sessionId:l,scope:`runner`,phase:`run_failed`,message:`agent run failed`,error:t,details:{channel:e.channel,isNewSession:u}}),t}finally{Qe(l),h.stop()}let N={input:k,output:A,total:k+A};return await r.dispatchDiagnostic(l,{level:M?`warn`:`info`,scope:`runner`,phase:`run_completed`,message:`agent run completed`,details:{durationMs:Date.now()-n,inputTokens:N.input,outputTokens:N.output,totalTokens:N.total,hasError:!!M,error:M}}),Wt({sessionId:l,isNewSession:u,transcriptMessage:a,runParams:e,hookRegistry:p,hookContext:f,startTime:n,eventDispatcher:r,text:j,usage:N,error:M})}async function Fo(e,t){let n=t??new Ye;try{return await Po(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:jo(t)}),t}}const Io={"AGENTS.md":`---
|
|
74
|
+
`)}`}function Za(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Qa(e){return Array.isArray(e)?e.map(e=>typeof e==`string`?e.trim():``).filter(Boolean):[]}function $a(e){let t=e.trim();return t===`~`?Oe.homedir():t.startsWith(`~/`)||t.startsWith(`~\\`)?P.join(Oe.homedir(),t.slice(2)):P.resolve(t)}const eo=new je({allErrors:!0,strict:!1}),to=new Map;function no(e,t){let n=to.get(t);if(n)return n;let r=eo.compile(e);return to.set(t,r),r}function ro(e){let t=e.cacheKey??JSON.stringify(e.schema),n=no(e.schema,t);return n(e.value)?{ok:!0}:{ok:!1,errors:(n.errors??[]).map(e=>({path:e.instancePath||`/`,message:e.message??`invalid`}))}}function io(e){let t=Qa(e?.allow),n=Qa(e?.deny),r=Qa(e?.load?.paths),i=e?.entries??{},a=e?.slots??{};return{enabled:e?.enabled??!0,allow:Array.from(new Set(t)),deny:Array.from(new Set(n)),loadPaths:Array.from(new Set(r)),entries:i,slots:a}}function ao(e){let t=[],{config:n,registry:r}=e,i=new Set(r.manifests.keys()),a=(e,n)=>i.has(e)?!0:(t.push({level:`error`,message:`unknown plugin id in ${n}: ${e}`,pluginId:e}),!1);for(let e of n.allow)a(e,`plugins.allow`);for(let e of n.deny)a(e,`plugins.deny`);for(let e of Object.keys(n.entries))a(e,`plugins.entries`);let o=n.slots??{};for(let[e,n]of Object.entries(o)){if(!n||n===`none`||!a(n,`plugins.slots.${e}`))continue;let i=r.manifests.get(n);i?.manifest.kind?i.manifest.kind!==e&&t.push({level:`error`,message:`plugin ${n} does not declare kind ${e}`,pluginId:n}):t.push({level:`error`,message:`plugin ${n} does not declare kind ${e}`,pluginId:n})}for(let[e,i]of Object.entries(n.entries)){let n=r.manifests.get(e);if(!n)continue;let a=n.manifest.configSchema,o=ro({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 oo(e){try{return R.realpathSync(e)}catch{return null}}function so(e){try{return R.statSync(e)}catch{return null}}function co(e,t){let n=P.relative(e,t);return n===``?!0:n.startsWith(`..`)?!1:!P.isAbsolute(n)}function lo(e){return`0o${e.toString(8).padStart(3,`0`)}`}const uo=new Set([`.ts`,`.js`,`.mts`,`.cts`,`.mjs`,`.cjs`]),fo=[`index.ts`,`index.js`,`index.mts`,`index.cts`,`index.mjs`,`index.cjs`];function po(e){let t=P.join(e,`package.json`);if(R.existsSync(t))try{let e=JSON.parse(R.readFileSync(t,`utf-8`));return Za(e)?e:void 0}catch{return}}function mo(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 ho(e){return e===void 0?process.platform===`win32`||typeof process.getuid!=`function`?null:process.getuid():e}function go(e){let t=oo(e.source),n=oo(e.rootDir);return!t||!n||co(n,t)?null:{reason:`source_escapes_root`,sourcePath:e.source,rootPath:e.rootDir,targetPath:e.source,sourceRealPath:t,rootRealPath:n}}function _o(e){if(process.platform===`win32`)return null;let t=[e.rootDir,e.source],n=new Set;for(let r of t){let t=P.resolve(r);if(n.has(t))continue;n.add(t);let i=so(r);if(!i)return{reason:`path_stat_failed`,sourcePath:e.source,rootPath:e.rootDir,targetPath:r};let a=i.mode&511;if(a&2)return{reason:`path_world_writable`,sourcePath:e.source,rootPath:e.rootDir,targetPath:r,modeBits:a};if(e.origin!==`bundled`&&e.uid!==null&&typeof i.uid==`number`&&i.uid!==e.uid&&i.uid!==0)return{reason:`path_suspicious_ownership`,sourcePath:e.source,rootPath:e.rootDir,targetPath:r,foundUid:i.uid,expectedUid:e.uid}}return null}function vo(e){return go({source:e.source,rootDir:e.rootDir})||_o({source:e.source,rootDir:e.rootDir,origin:e.origin,uid:ho(e.ownershipUid)})}function yo(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=${lo(e.modeBits??0)})`:`blocked plugin candidate: suspicious ownership (${e.targetPath}, uid=${e.foundUid}, expected uid=${e.expectedUid} or root)`}function bo(e){let t=vo({source:e.source,rootDir:e.rootDir,origin:e.origin,ownershipUid:e.ownershipUid});return t?(e.diagnostics.push({level:`warn`,message:yo(t),source:e.source}),!0):!1}function xo(e){return P.basename(e,P.extname(e))}function So(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 Co(e){for(let t of fo){let n=P.join(e,t);if(R.existsSync(n))return n}return null}function wo(e){let t;try{t=R.readdirSync(e.rootDir,{withFileTypes:!0})}catch{return}for(let n of t){let t=P.join(e.rootDir,n.name);if(n.isFile()){if(!uo.has(P.extname(n.name)))continue;let r=P.dirname(t);if(bo({source:t,rootDir:r,origin:e.origin,diagnostics:e.diagnostics,ownershipUid:e.ownershipUid}))continue;e.candidates.push(So({idHint:xo(t),source:t,rootDir:r,origin:e.origin,workspaceDir:e.workspaceDir}));continue}if(!n.isDirectory())continue;let r=po(t),i=mo(r);if(i.status===`ok`){for(let n of i.entries){let i=P.resolve(t,n);if(!co(t,i)){e.diagnostics.push({level:`warn`,message:`blocked plugin candidate: package entry escapes package root (${n})`,source:i});continue}if(!R.existsSync(i)){e.diagnostics.push({level:`warn`,message:`plugin entry missing: ${i}`,source:i});continue}if(!uo.has(P.extname(i))){e.diagnostics.push({level:`warn`,message:`plugin entry not a supported extension: ${i}`,source:i});continue}if(bo({source:i,rootDir:t,origin:e.origin,diagnostics:e.diagnostics,ownershipUid:e.ownershipUid}))continue;let a=r?.name?.trim(),o=a?`${a}/${xo(i)}`:xo(i);e.candidates.push(So({idHint:o,source:i,rootDir:t,origin:e.origin,workspaceDir:e.workspaceDir,packageName:r?.name,packageVersion:r?.version,packageDescription:r?.description,packageDir:t,packageManifest:r?.aimax}))}continue}let a=Co(t);a&&(bo({source:a,rootDir:t,origin:e.origin,diagnostics:e.diagnostics,ownershipUid:e.ownershipUid})||e.candidates.push(So({idHint:P.basename(t),source:a,rootDir:t,origin:e.origin,workspaceDir:e.workspaceDir})))}}function To(e){return e?e.map($a):[]}function Eo(){return P.join($a(`~`),`.aimax`,`extensions`)}function Do(e){return P.join(e,`.aimax`,`extensions`)}function Oo(e){return P.join(e,`.aimax`,`extensions`)}function ko(e={}){let t=[],n=[],r=To(e.extraPaths);for(let i of r){if(!R.existsSync(i)){n.push({level:`warn`,message:`plugin path not found: ${i}`,source:i});continue}let r=so(i);if(!r){n.push({level:`warn`,message:`plugin path not readable: ${i}`,source:i});continue}if(r.isFile()){if(!uo.has(P.extname(i))){n.push({level:`warn`,message:`plugin file has unsupported extension: ${i}`,source:i});continue}let r=P.dirname(i);if(bo({source:i,rootDir:r,origin:`config`,diagnostics:n,ownershipUid:e.ownershipUid}))continue;t.push(So({idHint:xo(i),source:i,rootDir:r,origin:`config`,workspaceDir:e.workspaceDir}));continue}r.isDirectory()&&wo({rootDir:i,origin:`config`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid})}return e.dataDir?wo({rootDir:Do(e.dataDir),origin:`workspace`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid}):e.workspaceDir&&wo({rootDir:Oo(e.workspaceDir),origin:`workspace`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid}),wo({rootDir:Eo(),origin:`global`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid}),e.bundledDir&&wo({rootDir:e.bundledDir,origin:`bundled`,workspaceDir:e.workspaceDir,diagnostics:n,candidates:t,ownershipUid:e.ownershipUid}),{candidates:t,diagnostics:n}}function Ao(e){let t=e.rejectHardlinks??!0,n=oo(e.rootPath),r=oo(e.absolutePath);if(!n||!r)return{ok:!1,reason:`path`};if(!co(n,r))return{ok:!1,reason:`unsafe`};let i;try{i=R.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:R.openSync(r,`r`)}}catch{return{ok:!1,reason:`path`}}}const jo=`aimax.plugin.json`,Mo=[jo];function No(e){for(let t of Mo){let n=P.join(e,t);if(R.existsSync(n))return n}return P.join(e,jo)}function Po(e,t=!0){let n=No(e),r=Ao({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(R.readFileSync(r.fd,`utf-8`))}catch(e){return{ok:!1,error:`failed to parse plugin manifest: ${String(e)}`,manifestPath:n}}finally{R.closeSync(r.fd)}if(!Za(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=Za(i.configSchema)?i.configSchema:null;if(!o)return{ok:!1,error:`plugin manifest requires configSchema`,manifestPath:n};let s=typeof i.kind==`string`?i.kind:void 0,c=typeof i.name==`string`?i.name.trim():void 0,l=typeof i.description==`string`?i.description.trim():void 0,u=typeof i.version==`string`?i.version.trim():void 0,d=Qa(i.skills),f;return Za(i.uiHints)&&(f=i.uiHints),{ok:!0,manifest:{id:a,configSchema:o,kind:s,name:c,description:l,version:u,skills:d,uiHints:f},manifestPath:n}}function Fo(e){let t=new Map,n=[];for(let r of e){let e=Po(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 Io=function(e){return e.INFO=`INFO`,e.WARN=`WARN`,e.ERROR=`ERROR`,e}({});function Lo(){let e=new Date;return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)} ${String(e.getHours()).padStart(2,`0`)}:${String(e.getMinutes()).padStart(2,`0`)}:${String(e.getSeconds()).padStart(2,`0`)}.${String(e.getMilliseconds()).padStart(3,`0`)}`}function Ro(e,t,n,r){process.stderr.write(`[${Lo()}] [${e}] [plugin:${t}][logger:${n}] ${r}\n`)}function zo(e){return{version:`0.1.0`,logging:{getLogger:t=>({info:n=>Ro(Io.INFO,e.pluginId,t,n),warn:n=>Ro(Io.WARN,e.pluginId,t,n),error:n=>Ro(Io.ERROR,e.pluginId,t,n)})}}}function Bo(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 Vo(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 Ho(e){let t=[...e.registry.diagnostics],n=new pa,r=new ga,i=[],o=[],s=e.runtime?.llm?it({baseUrl:e.runtime.llm.baseUrl,apiKey:e.runtime.llm.apiKey,defaultModel:e.runtime.llm.model,hooks:r,hookCtx:e.runtime.hookCtx}):void 0,c=Uo(e.runtime?.llmAllowlist),l=Me(import.meta.url,{interopDefault:!0,requireCache:!1});for(let u of e.registry.manifests.values()){let d=Bo({config:e.plugins,pluginId:u.id,origin:u.origin,kind:u.manifest.kind}),f=Vo({id:u.id,source:u.source,origin:u.origin,enabled:d,configSchema:!0,skills:u.manifest.skills??[]});if(!d){o.push(f);continue}let p;try{p=l(u.source)}catch(e){f.status=`error`,f.error=String(e),t.push({level:`error`,message:`failed to load plugin ${u.id}: ${String(e)}`,pluginId:u.id,source:u.source}),o.push(f);continue}let m=p&&typeof p==`object`&&`default`in p?p.default:p,h=typeof m==`function`?m:m&&typeof m==`object`&&typeof m.register==`function`?m.register:void 0;if(!h){f.status=`error`,f.error=`plugin module does not export a register function`,t.push({level:`error`,message:`plugin ${u.id} has no register function`,pluginId:u.id,source:u.source}),o.push(f);continue}let g=zo({pluginId:u.id}),_=e.plugins.entries[u.id]?.config,v={id:u.id,source:u.source,rootDir:u.rootDir,config:_,runtime:g,llm:{chat:async e=>{if(!s)throw Error(`LLM client is not configured`);if(!Wo(u.id,n,c))throw Error(`Plugin ${u.id} is not allowed to use LLM`);return s.chat(e)}},registerTool:(e,t)=>{n.register(u.id,e,t),f.toolCount+=1},registerEmbeddingProvider:e=>{if(u.manifest.kind!==`memory`)throw Error(`Plugin ${u.id} is not allowed to register embedding providers`);a({pluginId:u.id,id:e.id,create:e.create,config:_,rootDir:u.rootDir,source:u.source})},registerMemoryProvider:e=>{if(u.manifest.kind!==`memory`)throw Error(`Plugin ${u.id} is not allowed to register memory providers`);E({pluginId:u.id,id:e.id,create:e.create,config:_,rootDir:u.rootDir,source:u.source})},registerHook:(e,t,n)=>{r.register({pluginId:u.id,hookName:e,handler:t,priority:n?.priority,source:u.source}),f.hookCount+=1},registerSkillDir:e=>{let t=P.isAbsolute(e)?e:P.resolve(u.rootDir,e);i.push(t)},createProgressEmitter:()=>da(u.id)};try{h(v)}catch(e){f.status=`error`,f.error=String(e),t.push({level:`error`,message:`plugin ${u.id} registration failed: ${String(e)}`,pluginId:u.id,source:u.source})}if(u.manifest.skills&&u.manifest.skills.length>0)for(let e of u.manifest.skills){let t=P.isAbsolute(e)?e:P.resolve(u.rootDir,e);i.push(t)}o.push(f)}return{plugins:o,diagnostics:t,tools:n,hooks:r,skills:i}}function Uo(e){return(e??[]).map(e=>e.trim()).filter(Boolean)}function Wo(e,t,n){return n.length===0?!1:n.includes(e)?!0:t.namesForPlugin(e).some(e=>n.includes(e))}function Go(e={}){let t=io(e.config),n=ko({dataDir:e.dataDir,workspaceDir:e.workspaceDir,extraPaths:t.loadPaths,bundledDir:e.bundledDir,ownershipUid:e.ownershipUid}),r=Fo(n.candidates),i=ao({config:t,registry:r}),a=Ho({registry:r,plugins:t,workspaceDir:e.workspaceDir,runtime:e.runtime});return{registry:a,diagnostics:[...n.diagnostics,...r.diagnostics,...i.diagnostics,...a.diagnostics],normalizedConfig:t}}function Ko(e){let{runParams:t,hookContext:n,sessionId:r,eventDispatcher:i}=e,a=e=>{i.dispatchDiagnostic(r,e).catch(()=>void 0)},o=t.plugins?Go({...t.plugins,runtime:{llm:t.llm,hookCtx:n,llmAllowlist:t.plugins.llmAllowlist}}):void 0;if(!o)a({level:`info`,scope:`plugin`,phase:`plugin_system_disabled`,message:`plugin system disabled for this run`});else{a({level:o.diagnostics.some(e=>e.level===`error`)?`warn`:`info`,scope:`plugin`,phase:`plugin_system_initialized`,message:`plugin system initialized`,details:{pluginCount:o.registry.plugins.length,enabledPluginCount:o.registry.plugins.filter(e=>e.status===`loaded`).length,disabledPluginCount:o.registry.plugins.filter(e=>e.status===`disabled`).length,errorPluginCount:o.registry.plugins.filter(e=>e.status===`error`).length,diagnosticCount:o.diagnostics.length}});for(let e of o.registry.plugins)a({level:e.status===`error`?`error`:e.status===`disabled`?`warn`:`info`,scope:`plugin`,phase:`plugin_${e.status}`,message:e.status===`error`?`plugin failed to initialize`:e.status===`disabled`?`plugin disabled`:`plugin enabled`,details:{pluginId:e.id,origin:e.origin,toolCount:e.toolCount,hookCount:e.hookCount,skillCount:e.skills.length,source:e.source,errorMessage:e.error}});for(let e of o.diagnostics)a({level:e.level===`error`?`error`:`warn`,scope:`plugin`,phase:`plugin_diagnostic`,message:e.message,details:{pluginId:e.pluginId,source:e.source}})}return{hookRegistry:o?.registry.hooks??new ga,pluginSkillDirs:o?.registry.skills??[],pluginTools:o?.registry.tools.resolveEnabled(t.plugins?.toolAllowlist)??[],memoryPluginId:t.memory?.pluginId??o?.normalizedConfig.slots?.memory}}async function qo(e){let{runParams:t,requestedSessionId:n,eventDispatcher:r}=e,i=P.join(t.dataDir,`workspace`),a=n,o=!a;a?await l(t.dataDir,a):a=await c(t.dataDir,t.channel);let s={sessionId:a,workspaceDir:i,channel:t.channel},u=Ko({runParams:t,hookContext:s,sessionId:a,eventDispatcher:r}),d=u.hookRegistry,f=await zt({runParams:t,sessionId:a,hookContext:s,memoryProviderId:t.memory?.providerId,memoryPluginId:u.memoryPluginId,eventDispatcher:r,hookRegistry:d});return{sessionId:a,isNewSession:o,workspaceDir:i,hookContext:s,hookRegistry:d,pluginContext:u,runContext:f,start:e=>Ut({sessionId:a,runParams:t,hookRegistry:d,hookContext:s,eventDispatcher:r,...e})}}function Jo(e){return e===null||typeof e==`string`||typeof e==`number`||typeof e==`boolean`?e:JSON.stringify(e)??String(e)}function Yo(e){if(!(e instanceof Error))return{errorValue:Jo(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]=Jo(n[e]));return t}async function Xo(e){await e.dispatcher.dispatchDiagnostic(e.sessionId,{level:`error`,scope:e.scope,phase:e.phase,message:e.message,details:{...e.details,...Yo(e.error)}})}function Zo(e,t){return P.join(n(e,t),`pending-hitl.json`)}function Qo(e,t){return P.join(n(e,t),`hitl-history.jsonl`)}async function $o(e,t,r){let i=n(e,t);await N.mkdir(i,{recursive:!0});let a=Zo(e,t);await N.writeFile(a,JSON.stringify(r,null,2),`utf-8`)}async function es(e,t,r){let i=n(e,t);await N.mkdir(i,{recursive:!0});let a=Qo(e,t),o=JSON.stringify(r)+`
|
|
75
|
+
`;await N.appendFile(a,o,`utf-8`)}async function ts(e,t){let n=Zo(e,t);try{let e=await N.readFile(n,`utf-8`);return JSON.parse(e)}catch(e){if(e.code===`ENOENT`)return null;throw e}}async function ns(e,t){let n=Qo(e,t);try{let e=await N.readFile(n,`utf-8`),t=[];for(let n of e.split(`
|
|
76
|
+
`)){let e=n.trim();if(e)try{t.push(JSON.parse(e))}catch{}}return t}catch(e){if(e.code===`ENOENT`)return[];throw e}}async function rs(e,t,n,r,i,a){let o=new Date().toISOString(),s={version:1,sessionId:t,request:n,status:`pending`,checkpoint:r,context:i,toolContext:a,createdAt:o,updatedAt:o};return await $o(e,t,s),await es(e,t,{requestId:n.requestId,sessionId:t,action:`requested`,payload:n,timestamp:o}),s}async function is(e,t,n,r,i){let a=await ts(e,t);if(!a||a.request.requestId!==n||a.status!==`pending`)return null;let o=new Date().toISOString(),s={...a,status:r,resolution:i,updatedAt:o};await $o(e,t,s);let c={resolved:`resolved`,expired:`expired`,cancelled:`cancelled`}[r];return await es(e,t,{requestId:n,sessionId:t,action:c,payload:i??a.request,timestamp:o}),s}async function as(e,t,n){let r=await ts(e,t);return!r||r.request.requestId!==n?null:r.status===`resolved`?r:null}async function os(e,t){let n=Zo(e,t);try{await N.unlink(n)}catch(e){if(e.code===`ENOENT`)return;throw e}}function ss(e,t){return{id:e.model,name:e.model,api:`openai-completions`,provider:`openai`,baseUrl:e.baseUrl,reasoning:!1,input:[`text`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:e.contextWindow??2e5,maxTokens:32768,headers:{"Client-Code":`AIMax`,"X-Session-Id":t},compat:{supportsStore:!1,supportsDeveloperRole:!1,supportsReasoningEffort:!1,supportsUsageInStreaming:!0}}}async function cs(e,t){Nt();let n=Date.now(),r=new Pt(e),i=Cn(e),a=i.transcriptMessage,o=!1,s=i.previousSessionId,c=await qo({runParams:e,requestedSessionId:i.requestedSessionId,eventDispatcher:r}),l=c.sessionId,u=c.isNewSession,d=c.workspaceDir,f=c.hookContext,p=c.hookRegistry,m=c.pluginContext,h=c.runContext;await r.dispatchDiagnostic(l,{level:`info`,scope:`runner`,phase:`run_started`,message:`agent run started`,details:{channel:e.channel,isNewSession:u,hasMessageId:!!e.messageId,hasPlugins:!!e.plugins,hasMemory:!!e.memory}}),await r.dispatchDiagnostic(l,{level:`info`,scope:`session`,phase:u?`session_created`:`session_resumed`,message:u?`session created`:`session resumed`,details:{requestedSessionId:i.requestedSessionId,previousSessionId:s,workspaceDir:d}}),i.resetCommand&&(o=await h.persistInitialUserEntry(a)),await c.start({resetCommand:i.resetCommand,previousSessionId:s,resetMessage:i.slashCommandSource,startMessage:typeof i.promptInput==`string`?i.promptInput:a});let g=new AbortController;e.abortSignal?.aborted?g.abort():e.abortSignal?.addEventListener(`abort`,()=>g.abort());let _=await Le(e.dataDir),v=[],y=Be(_,{warn:e=>v.push(e)});await r.dispatchDiagnostic(l,{level:v.length>0?`warn`:`info`,scope:`runner`,phase:`bootstrap_loaded`,message:`bootstrap context loaded`,details:{bootstrapFileCount:_.length,contextFileCount:y.length,warningCount:v.length}});let b=await Ke(e.dataDir,m.pluginSkillDirs),x=new rt({workspaceDir:d,sessionId:l,skills:b,report:e=>r.dispatchProgress(l,e),reportDiagnostic:e=>r.dispatchDiagnostic(l,{level:e.level,scope:`skill`,phase:e.phase,message:e.message,details:e.details})});await r.dispatchDiagnostic(l,{level:`info`,scope:`skill`,phase:`skills_loaded`,message:`skills loaded`,details:{skillCount:b.length,pluginSkillDirCount:m.pluginSkillDirs.length}});let S=e=>h.appendTranscriptEntry(e),C=await Tn({invocation:i,skills:b,sessionId:l,isNewSession:u,initialUserEntryPersisted:o,runParams:e,hookRegistry:p,hookContext:f,startTime:n,eventDispatcher:r});if(C.kind===`completed`)return C.result;let w=C.effectivePrompt;a=C.transcriptMessage;let T=typeof w==`string`?w:a;await r.dispatchDiagnostic(l,{level:`info`,scope:`runner`,phase:`invocation_resolved`,message:`invocation resolved`,details:{promptType:typeof w==`string`?`string`:`messages`,transcriptLength:a.length}});let E=await Ia({session:{runParams:e,sessionId:l,hookRegistry:p,hookContext:f,runContext:h,eventDispatcher:r},runtimeInputs:{contextFiles:y,bootstrapWarnings:v,skills:b,effectivePromptText:T,pluginTools:m.pluginTools},dependencies:{registry:t,spawnFn:e=>cs(e,new Ze),createModel:ss,abortSignal:g.signal}}),ee=E.agent,D=E.resolvedModelId;await r.dispatchDiagnostic(l,{level:`info`,scope:`runner`,phase:`runtime_created`,message:`agent runtime created`,details:{modelId:D,historyMessageCount:E.historyMessages.length,pluginToolCount:m.pluginTools.length}}),g.signal.addEventListener(`abort`,()=>ee.abort());let O=0,k=0,A=``,j;try{o=await h.persistInitialUserEntry(a)||o,await r.dispatchDiagnostic(l,{level:`info`,scope:`runner`,phase:`first_turn_started`,message:`first agent turn started`});let e=await Ra({agent:ee,message:w,sessionId:l,modelId:D,historyMessages:E.historyMessages,eventDispatcher:r,skillUsageTracker:x,hooks:p,hookCtx:f,abortSignal:g.signal});A=e.text,O+=e.inputTokens,k+=e.outputTokens,e.error&&(j=e.error),await r.dispatchDiagnostic(l,{level:e.error?`warn`:`info`,scope:`runner`,phase:`first_turn_completed`,message:`first agent turn completed`,details:{hasError:!!e.error,error:e.error,inputTokens:e.inputTokens,outputTokens:e.outputTokens}}),await za(S,e),await r.dispatchDiagnostic(l,{level:`info`,scope:`runner`,phase:`announce_loop_started`,message:`announce loop started`});let n=await Ya({agent:ee,registry:t,sessionId:l,resolvedModelId:D,eventDispatcher:r,skillUsageTracker:x,hookRegistry:p,hookContext:f,abortSignal:g.signal,appendEntry:S});n.text&&(A=n.text),O+=n.inputTokens,k+=n.outputTokens,n.error&&!j&&(j=n.error),await r.dispatchDiagnostic(l,{level:n.error?`warn`:`info`,scope:`runner`,phase:`announce_loop_completed`,message:`announce loop completed`,details:{hasError:!!n.error,error:n.error,inputTokens:n.inputTokens,outputTokens:n.outputTokens}})}catch(t){if(lr(t)){let i=t,o=e.subagentContext?.parentSessionId??l,s=o===i.request.sessionId?i.request:{...i.request,sessionId:o};await rs(e.dataDir,o,s,i.checkpoint,{agentId:e.subagentContext?`subagent-depth-${e.subagentContext.depth}`:void 0,channel:e.channel,parentSessionId:e.subagentContext?.parentSessionId,depth:e.subagentContext?.depth},i.toolContext),await r.dispatchProgress(o,{type:`hitl_requested`,request:s}),await r.dispatchDiagnostic(l,{level:`info`,scope:`runner`,phase:`hitl_paused`,message:`agent paused for HITL: ${i.request.kind} — ${i.request.title}`,details:{requestId:s.requestId,kind:s.kind,checkpointPhase:i.checkpoint.phase,bubbledToParent:!!e.subagentContext?.parentSessionId}});let c={input:O,output:k,total:O+k};return Kt({sessionId:l,isNewSession:u,transcriptMessage:a,runParams:e,hookRegistry:p,hookContext:f,startTime:n,eventDispatcher:r,text:A||`[HITL paused] ${i.request.title}: ${i.request.prompt}`,usage:c,error:void 0,paused:{requestId:s.requestId,kind:s.kind,title:s.title}})}throw await Xo({dispatcher:r,sessionId:l,scope:`runner`,phase:`run_failed`,message:`agent run failed`,error:t,details:{channel:e.channel,isNewSession:u}}),t}finally{et(l),h.stop()}let M={input:O,output:k,total:O+k};return await r.dispatchDiagnostic(l,{level:j?`warn`:`info`,scope:`runner`,phase:`run_completed`,message:`agent run completed`,details:{durationMs:Date.now()-n,inputTokens:M.input,outputTokens:M.output,totalTokens:M.total,hasError:!!j,error:j}}),Kt({sessionId:l,isNewSession:u,transcriptMessage:a,runParams:e,hookRegistry:p,hookContext:f,startTime:n,eventDispatcher:r,text:A,usage:M,error:j})}async function ls(e,t){let n=t??new Ze;try{return await cs(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:Yo(t)}),t}}const us={"AGENTS.md":`---
|
|
75
77
|
title: "AGENTS.md Template"
|
|
76
78
|
summary: ".aimax template for AGENTS.md"
|
|
77
79
|
read_when:
|
|
@@ -518,4 +520,4 @@ read_when:
|
|
|
518
520
|
# Add tasks below when you want the agent to check something periodically.
|
|
519
521
|
|
|
520
522
|
# This file lives at .aimax/HEARTBEAT.md, not in workspace/.
|
|
521
|
-
`},
|
|
523
|
+
`},ds=[`AGENTS.md`,`BOOTSTRAP.md`,`IDENTITY.md`,`USER.md`,`SOUL.md`,`TOOLS.md`,`HEARTBEAT.md`];async function $(e,t){try{if(!(await N.stat(e)).isDirectory())throw Error(`Path exists but is not a directory: ${e}`);t.skippedDirs.push(e);return}catch(e){if(e.code!==`ENOENT`)throw e}await N.mkdir(e,{recursive:!0}),t.createdDirs.push(e)}async function fs(e,t,n){try{if(!(await N.stat(e)).isFile())throw Error(`Path exists but is not a file: ${e}`);n.skippedFiles.push(e);return}catch(e){if(e.code!==`ENOENT`)throw e}await N.mkdir(P.dirname(e),{recursive:!0});try{await N.writeFile(e,t,{encoding:`utf-8`,flag:`wx`}),n.createdFiles.push(e)}catch(t){if(t.code===`EEXIST`){n.skippedFiles.push(e);return}throw t}}function ps(e){let t=z(e);return[e,t,P.join(t,`skills`),P.join(t,`sessions`),P.join(t,`memory`),P.join(e,`workspace`)]}function ms(e){let t=z(e);return[...ds.filter(e=>e!==`BOOTSTRAP.md`).map(e=>P.join(t,e)),P.join(t,`MEMORY.md`)]}function hs(e){return P.join(z(e),`.bootstrapped`)}async function gs(e){try{return(await N.stat(hs(e))).isFile()}catch(e){if(e.code===`ENOENT`)return!1;throw e}}async function _s(e){let t=hs(e);await N.mkdir(P.dirname(t),{recursive:!0}),await N.writeFile(t,``,{encoding:`utf-8`})}async function vs(e){let t=[],n=[];for(let n of ps(e))try{(await N.stat(n)).isDirectory()||t.push(n)}catch(e){if(e.code===`ENOENT`){t.push(n);continue}throw e}for(let t of ms(e))try{(await N.stat(t)).isFile()||n.push(t)}catch(e){if(e.code===`ENOENT`){n.push(t);continue}throw e}return{dataDir:e,ready:t.length===0&&n.length===0,missingDirs:t,missingFiles:n}}async function ys(e){return(await vs(e)).ready}async function bs(e){if(await gs(e))return{ready:!0,performedBootstrap:!1};if((await vs(e)).ready)return await _s(e),{ready:!0,performedBootstrap:!1};let t=await xs(e);return await _s(e),{ready:!0,performedBootstrap:!0,result:t}}async function xs(e){let t={dataDir:e,createdDirs:[],skippedDirs:[],createdFiles:[],skippedFiles:[]},n=z(e),r=P.join(e,`workspace`),i=P.join(n,`skills`),a=P.join(n,`sessions`),o=P.join(n,`memory`);await $(e,t),await $(n,t),await $(i,t),await $(a,t),await $(o,t),await $(r,t);for(let e of ds){let r=us[e]??``;await fs(P.join(n,e),r,t)}return await fs(P.join(n,`MEMORY.md`),``,t),t}async function Ss(e){let t=P.join(e,`.aimax`,`subagents`,`runs.json`);try{let e=await N.readFile(t,`utf-8`),n=JSON.parse(e);if(!n||typeof n!=`object`)return new Map;let r;if(n.version===1&&n.records)r=n.records;else if(n.version===void 0)r=n;else return new Map;let i=new Map;for(let[e,t]of Object.entries(r)){if(!t||typeof t!=`object`)continue;let n=t;i.set(e,{...n,abortController:new AbortController})}return i}catch(e){return e.code,new Map}}async function Cs(e,t){let n=P.join(e,`.aimax`,`subagents`,`runs.json`),r={};for(let[e,n]of t.entries())if(typeof n.endedAt==`number`){let{abortController:t,...i}=n;r[e]={...i,version:1}}let i={version:1,records:r};await N.mkdir(P.dirname(n),{recursive:!0}),await N.writeFile(n,JSON.stringify(i,null,2),`utf-8`)}async function ws(e,t){let n=await Ss(e),r=[];for(let e of n.values())if(e.parentSessionId===t){let{abortController:t,...n}=e;r.push({...n,version:1})}return r.sort((e,t)=>e.startedAt-t.startedAt)}async function Ts(e,t=7){let n=await Ss(e),r=Date.now()-t*24*60*60*1e3,i=0;for(let[e,t]of n.entries())t.endedAt&&t.endedAt<r&&(n.delete(e),i++);return i>0&&await Cs(e,n),i}async function Es(e,t,n){let r=await ts(e,t);return r?r.request.requestId===n?r.sessionId===t?r.status===`pending`?Ne(r.request)?(await is(e,t,n,`expired`),{valid:!1,reason:`HITL request has expired`}):{valid:!0,state:r}:{valid:!1,reason:`HITL request is already "${r.status}", cannot resume`}:{valid:!1,reason:`Session ID mismatch: expected "${r.sessionId}", got "${t}"`}:{valid:!1,reason:`Request ID mismatch: expected "${r.request.requestId}", got "${n}"`}:{valid:!1,reason:`No pending HITL request found for this session`}}async function Ds(e){let{dataDir:t,sessionId:n,requestId:r,resolution:i}=e,a=await as(t,n,r);if(a){let e=a.resolution?.idempotencyKey;if(e&&i.idempotencyKey&&e===i.idempotencyKey)return{state:a,idempotentReplay:!0};throw Error(`HITL resume validation failed: HITL request is already "${a.status}", cannot resume`)}let o=await Es(t,n,r);if(!o.valid)throw Error(`HITL resume validation failed: ${o.reason}`);let s=await is(t,n,r,`resolved`,i);if(!s)throw Error(`Failed to transition HITL state to resolved (concurrent modification?)`);return{state:s,idempotentReplay:!1}}export{Ie as BOOTSTRAP_FILE_NAMES,Pe as BOOTSTRAP_MAX_CHARS,Fe as BOOTSTRAP_TOTAL_MAX_CHARS,G as HitlPauseSignal,Xe as MAX_CHILDREN_PER_SESSION,Ye as MAX_SUBAGENT_DEPTH,v as MemoryIndexManager,jo as PLUGIN_MANIFEST_FILENAME,Mo as PLUGIN_MANIFEST_FILENAMES,ga as PluginHookRegistry,pa as PluginToolRegistry,Ze as SubagentRegistry,le as addAgent,ae as addBinding,z as aimaxDir,yi as appendToMemory,s as appendTranscriptEntry,xs as bootstrapMountLayout,Be as buildBootstrapContextFiles,Je as buildSkillsPrompt,Ni as buildSubagentAnnounceMessage,ca as buildSystemPrompt,Ts as cleanupOldSubagentRecords,os as clearPendingHitl,p as collapseLogPath,b as contextSnapshotPath,Vi as createAgentTools,Zr as createApplyPatchTool,Pr as createBashTool,h as createBuiltinMemoryProvider,ui as createClarifyTool,sr as createContextManager,Ur as createEditFileTool,xr as createExecTool,Bi as createImageTool,Gr as createListDirTool,Di as createMemoryAppendTool,Ti as createMemoryGetTool,Ci as createMemorySearchTool,rs as createPendingHitl,da as createPluginProgressEmitter,zo as createPluginRuntime,wr as createProcessTool,zr as createReadFileTool,ki as createRequestApprovalTool,ji as createRequestReviewTool,c as createSession,In as createSessionContextStore,Pi as createSessionsSpawnTool,Ri as createSubagentsTool,Vr as createWriteFileTool,xi as deleteMemoryFile,ko as discoverAIMaxPlugins,bs as ensureBootstrapMountLayout,l as ensureSession,_ as exportSession,Ft as generateSessionTitle,ne as getAgentConfig,vi as getMemoryLines,gs as hasBootstrapSentinel,Qo as hitlHistoryPath,Go as initializePluginSystem,vs as inspectBootstrapMountLayout,m as inspectSession,ys as isBootstrapMountLayoutReady,lr as isHitlPauseSignal,O as listAgents,Zt as listAvailableSlashCommands,oe as listBindings,mi as listMemoryFiles,d as listSessionSummaries,u as listSessions,ws as listSubagentRunsFromDisk,ce as loadAgentsConfig,Le as loadBootstrapFiles,ts as loadPendingHitl,ts as readPendingHitl,Po as loadPluginManifest,Fo as loadPluginManifestRegistry,Ho as loadPlugins,i as loadSessionContextSnapshot,x as loadSessionMetadata,Ge as loadSkills,qe as loadSkillsFromDirs,Ke as loadSkillsWithPluginDirs,Ss as loadSubagentRegistryFromDisk,w as loadTranscript,di as memoryDir,o as metadataPath,k as normalizeAgentId,io as normalizePluginsConfig,Zo as pendingHitlPath,fi as primaryMemoryPath,ns as readHitlHistory,hi as readMemoryFile,gi as readPrimaryMemory,a as registerEmbeddingProvider,E as registerMemoryProvider,re as removeAgent,ue as removeBindings,bi as replaceMemoryFile,g as resetEmbeddingProviderRegistryForTests,ee as resetMemoryProviderRegistryForTests,A as resolveAgentDir,j as resolveAgentIdByBinding,se as resolveAgentsConfigPath,ie as resolveDefaultAgentId,y as resolveEmbeddingProvider,Ds as resolveHitlRequest,Ds as resolvePendingHitl,T as resolveMemoryProvider,te as resolveModelFallbacks,M as resolveModelString,No as resolvePluginManifestPath,ls as runAgent,D as saveAgentsConfig,C as saveSessionMetadata,Cs as saveSubagentRegistryToDisk,_i as searchMemory,n as sessionDir,e as sessionMemoryPath,S as sessionsDir,Ve as skillsDir,r as toolResultsDir,t as transcriptPath,is as transitionHitlStatus,de as updateAgentIdentity,ao as validatePluginsConfig,Es as validateResume,ha as wrapToolsWithHooks};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gencode/agents",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.22",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"openai": "6.10.0",
|
|
31
31
|
"sqlite-vec": "^0.1.6",
|
|
32
32
|
"zod": "^4.3.6",
|
|
33
|
-
"@gencode/shared": "0.0.
|
|
33
|
+
"@gencode/shared": "0.0.8"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"@sinclair/typebox": "^0.34.48",
|