memeloop 0.2.2 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.d.cts +2 -2
- package/dist/browser.d.ts +2 -2
- package/dist/{chunk-K6P63KD4.js → chunk-HY3U3GLE.js} +16 -4
- package/dist/chunk-HY3U3GLE.js.map +1 -0
- package/dist/{chunk-GYIOMQMY.js → chunk-XNSJRDCW.js} +104 -86
- package/dist/chunk-XNSJRDCW.js.map +1 -0
- package/dist/{fetchProvider-BhqRqi5-.d.ts → fetchProvider-B_vva3b3.d.ts} +26 -2
- package/dist/{fetchProvider-HJ_FkORN.d.cts → fetchProvider-Bz4CE3_R.d.cts} +26 -2
- package/dist/index.cjs +141 -98
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +23 -9
- package/dist/index.js.map +1 -1
- package/dist/llm-providers.cjs +17 -6
- package/dist/llm-providers.cjs.map +1 -1
- package/dist/llm-providers.d.cts +2 -0
- package/dist/llm-providers.d.ts +2 -0
- package/dist/llm-providers.js +4 -4
- package/dist/llm-providers.js.map +1 -1
- package/dist/loop-api.cjs +23 -10
- package/dist/loop-api.cjs.map +1 -1
- package/dist/loop-api.d.cts +1 -1
- package/dist/loop-api.d.ts +1 -1
- package/dist/loop-api.js +4 -2
- package/dist/mobile.cjs +14 -3
- package/dist/mobile.cjs.map +1 -1
- package/dist/mobile.d.cts +1 -1
- package/dist/mobile.d.ts +1 -1
- package/dist/mobile.js +1 -1
- package/dist/{orchestration-portable-B4udCSVd.d.ts → orchestration-portable-DUoAjtD1.d.ts} +10 -1
- package/dist/{orchestration-portable-BWaCsCGK.d.cts → orchestration-portable-xJ7z-ctw.d.cts} +10 -1
- package/dist/orchestration-portable.cjs.map +1 -1
- package/dist/orchestration-portable.d.cts +1 -1
- package/dist/orchestration-portable.d.ts +1 -1
- package/dist/orchestration-portable.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-GYIOMQMY.js.map +0 -1
- package/dist/chunk-K6P63KD4.js.map +0 -1
package/dist/mobile.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/mobile.ts","../src/llm/fetchProvider.ts","../src/conversation/parts.ts","../src/conversation/factory.ts","../src/tools/pluginRegistry.ts","../src/promptUtilities/responseConcat.ts","../src/promptUtilities/responsePatternUtility.ts","../src/storage/nextLamport.ts","../src/loopAPI/hooks/registry.ts","../src/loopAPI/agent-tool-loop/compaction.ts","../src/loopAPI/agent-tool-loop/historyCompaction.ts","../src/loopAPI/agent-tool-loop/llmStream.ts","../src/promptUtilities/promptConcat.ts","../src/promptUtilities/utilities.ts","../src/loopAPI/agent-tool-loop/toolResultMessage.ts","../src/loopAPI/agent-tool-loop/modelMessages.ts","../src/orchestration/drivers/unknownEffect.ts","../src/orchestration/errors.ts","../src/orchestration/resources.ts","../src/tools/structuredToolResult.ts","../src/loopAPI/agent-tool-loop/toolCallRunner.ts","../src/permission/engine.ts","../src/orchestration/security/admission.ts","../src/tools/approval.ts","../src/loopAPI/agent-tool-loop/toolUseGate.ts","../src/loopAPI/agent-tool-loop/turnPrimitives.ts","../src/loopAPI/agent-tool-loop/directRunner.ts","../src/loopAPI/agent-tool-loop/runner.ts","../src/loopProfiles/builtinProfileSources.ts","../src/loopProfiles/loadBuiltins.ts"],"sourcesContent":["/**\n * React Native entry: fetch-based LLM access and direct agent/tool execution.\n *\n * Deployable JavaScript loop loading is intentionally excluded because Metro\n * cannot transform variable dynamic imports. Remote orchestration remains\n * available from the browser entry.\n */\nexport type * from './agent/agentProfiles.js';\nexport type * from './conversation/types.js';\nexport type * from './device-network/types.js';\nexport { createFetchLLMProvider } from './llm/fetchProvider.js';\nexport type * from './llm/providerRegistry.js';\nexport { resolveAgentToolLoopTerminalState, runAgentToolLoopTurn, type RunAgentToolLoopTurnCallbacks, type RunAgentToolLoopTurnResult } from './loopAPI/agent-tool-loop/runner.js';\nexport type * from './loopAPI/types.js';\nexport { getBuiltinLoopProfile, getBuiltinLoopProfiles } from './loopProfiles/loadBuiltins.js';\nexport type * from './types.js';\n","/**\n * Provider-agnostic LLM provider — wraps a current Vercel AI SDK LanguageModel.\n *\n * The core does NOT depend on @ai-sdk/openai or any specific provider.\n * Hosts inject their own `createModel` factory:\n *\n * import { createOpenAI } from '@ai-sdk/openai';\n * const openai = createOpenAI({ baseURL: '...', apiKey: '...' });\n * const provider = createFetchLLMProvider({\n * name: 'openai',\n * createModel: (id) => openai(id ?? 'gpt-4o-mini'),\n * });\n *\n * Or for Anthropic:\n * import { createAnthropic } from '@ai-sdk/anthropic';\n * const anthropic = createAnthropic({ apiKey: '...' });\n * const provider = createFetchLLMProvider({\n * name: 'claude',\n * createModel: (id) => anthropic(id ?? 'claude-3-5-sonnet-20241022'),\n * });\n *\n * Works with every @ai-sdk/* provider: openai, anthropic, google, deepseek,\n * cohere, mistral, azure, bedrock, groq, ollama, openrouter, together, etc.\n */\n\nimport type { LanguageModel } from 'ai';\nimport { generateText, streamText } from 'ai';\n\nimport type { ILLMProvider } from '../types.js';\n\n// ─── Config ────────────────────────────────────────────────────────────\n\nexport interface FetchLLMProviderConfig {\n /** Display name. */\n name: string;\n /** Serializable default model identity for scheduling and audit records. */\n modelId?: string;\n /**\n * Factory: given an optional model id, return a LanguageModel from any @ai-sdk/* provider.\n * The factory is responsible for picking a default model when `modelId` is omitted.\n */\n createModel: (modelId?: string) => LanguageModel;\n}\n\n// ─── Factory ───────────────────────────────────────────────────────────\n\n/**\n * Create an `ILLMProvider` that delegates to the Vercel AI SDK.\n *\n * Provider-agnostic — hosts supply their own `createModel` factory.\n * Supports every @ai-sdk/* provider (OpenAI, Anthropic, Google, DeepSeek,\n * Groq, Ollama, OpenRouter, Together, Bedrock, Azure, Mistral, Cohere…).\n *\n * @example\n * ```ts\n * import { createOpenAI } from '@ai-sdk/openai';\n * const openai = createOpenAI({ baseURL: 'https://api.openai.com/v1', apiKey });\n * const provider = createFetchLLMProvider({\n * name: 'openai',\n * createModel: (modelId) => openai(modelId ?? 'gpt-4o-mini'),\n * });\n * ```\n */\nexport function createFetchLLMProvider(config: FetchLLMProviderConfig): ILLMProvider {\n return {\n name: config.name,\n ...(config.modelId !== undefined ? { modelId: config.modelId } : {}),\n // Store the factory so hosts can introspect or extend\n model: config.createModel as unknown as LanguageModel,\n async chat(request: unknown) {\n const body = (typeof request === 'object' && request !== null ? request : {}) as {\n messages?: Array<{ role: string; content: string }>;\n model?: string;\n stream?: boolean;\n max_tokens?: number;\n temperature?: number;\n system?: string;\n abortSignal?: AbortSignal;\n };\n\n const model = config.createModel(body.model);\n const specificationVersion = (\n model as { specificationVersion?: unknown } | null\n )?.specificationVersion;\n if (\n model === null ||\n typeof model !== 'object' ||\n !['v2', 'v3', 'v4'].includes(String(specificationVersion))\n ) {\n throw new Error(\n `LLM provider '${config.name}' returned an incompatible AI SDK model for '${\n typeof body.model === 'string' ? body.model : (config.modelId ?? 'default')\n }' (expected specificationVersion v2, v3, or v4; received ${String(specificationVersion)})`,\n );\n }\n\n const systemMessages = (body.messages ?? [])\n .filter((message) => message.role === 'system')\n .map((message) => message.content);\n const messages = (body.messages ?? [])\n .filter((message) => message.role !== 'system')\n .map((message) => {\n // AI SDK model messages do not accept a bare textual tool role.\n // MemeLoop stores tool results as role='tool'; promote them to user\n // messages while preserving the result text in conversation history.\n const role = message.role === 'tool' ? 'user' : (message.role as 'user' | 'assistant');\n return {\n role,\n content: message.content,\n };\n });\n\n const system = body.system ?? (\n systemMessages.length > 0 ? systemMessages.join('\\n\\n') : undefined\n );\n const temperature = body.temperature;\n const abortSignal = body.abortSignal;\n const maxOutputTokens = body.max_tokens;\n\n if (body.stream !== false) {\n let streamingError: unknown;\n const result = streamText({\n model,\n instructions: system,\n messages,\n maxOutputTokens,\n temperature,\n abortSignal,\n onError: ({ error }) => {\n streamingError = error;\n },\n });\n return (async function*() {\n for await (const chunk of result.textStream) {\n yield chunk;\n }\n if (streamingError !== undefined) {\n throw streamingError instanceof Error\n ? streamingError\n : new Error('The model stream failed', { cause: streamingError });\n }\n })();\n }\n\n const result = await generateText({\n model,\n instructions: system,\n messages,\n maxOutputTokens,\n temperature,\n abortSignal,\n });\n return result.text;\n },\n };\n}\n","import type { AttachmentReference, ChatAttachmentPart, ChatMessage, ChatMessagePart, ChatReasoningPart, ChatToolCallPart, ChatToolResultPart, ToolCall } from './types.js';\n\nexport interface ChatMessageProjection {\n content: string;\n reasoning_content?: string;\n toolCalls?: ToolCall[];\n attachments?: AttachmentReference[];\n}\n\nfunction tryParseJson(value: string): unknown {\n try {\n return JSON.parse(value);\n } catch {\n return undefined;\n }\n}\n\nexport function parseLegacyToolResultContent(content: string): ChatToolResultPart | null {\n const match = /(?:<functions_result>\\s*)?Tool:\\s*(.+?)\\nParameters:\\s*(.+?)\\n(Error|Result):\\s*([\\s\\S]*?)\\s*(?:<\\/functions_result>|$)/su.exec(content.trim());\n if (!match) return null;\n\n const [, rawToolName, rawParameters, kind, rawBody] = match;\n const parsedParameters = tryParseJson(rawParameters.trim());\n const result = rawBody.trim();\n return {\n type: 'tool-result',\n toolName: rawToolName.trim(),\n parameters: parsedParameters,\n result,\n isError: kind === 'Error',\n payload: tryParseJson(result),\n };\n}\n\nfunction isTextPart(part: ChatMessagePart): part is Extract<ChatMessagePart, { type: 'text' }> {\n return part.type === 'text';\n}\n\nfunction isReasoningPart(part: ChatMessagePart): part is ChatReasoningPart {\n return part.type === 'reasoning';\n}\n\nfunction isToolCallPart(part: ChatMessagePart): part is ChatToolCallPart {\n return part.type === 'tool-call';\n}\n\nfunction isAttachmentPart(part: ChatMessagePart): part is ChatAttachmentPart {\n return part.type === 'attachment';\n}\n\nexport function isToolResultPart(part: ChatMessagePart): part is ChatToolResultPart {\n return part.type === 'tool-result';\n}\n\nexport function buildToolResultSummary(part: ChatToolResultPart): string {\n const prefix = part.isError ? 'Error' : 'Result';\n const suffix = part.result.trim();\n if (suffix.length === 0) return `${prefix} from ${part.toolName}`;\n return `${prefix} from ${part.toolName}: ${suffix}`;\n}\n\nexport function projectChatMessageParts(parts: readonly ChatMessagePart[]): ChatMessageProjection {\n const text = parts.filter(isTextPart).map((part) => part.text.trim()).filter(Boolean);\n const reasoning = parts.filter(isReasoningPart).map((part) => part.text.trim()).filter(Boolean);\n const toolCalls = parts\n .filter(isToolCallPart)\n .map((part) => ({ id: part.toolCallId, toolName: part.toolName, arguments: part.arguments }));\n const attachments = parts.filter(isAttachmentPart).map((part) => part.attachment);\n const toolResults = parts.filter(isToolResultPart);\n\n let content = text.join('\\n\\n');\n if (content.length === 0 && toolResults.length > 0) {\n content = toolResults.map(buildToolResultSummary).join('\\n\\n');\n }\n if (content.length === 0 && toolCalls.length > 0) {\n content = toolCalls.map((part) => `Tool call: ${part.toolName}`).join('\\n\\n');\n }\n\n return {\n content,\n reasoning_content: reasoning.length > 0 ? reasoning.join('\\n\\n') : undefined,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n attachments: attachments.length > 0 ? attachments : undefined,\n };\n}\n\nexport function buildLegacyChatMessageParts(input: {\n role: string;\n content?: string;\n reasoning_content?: string;\n toolCalls?: ToolCall[];\n attachments?: AttachmentReference[];\n detailRef?: ChatToolResultPart['detailRef'];\n metadata?: Record<string, unknown>;\n}): ChatMessagePart[] {\n const parts: ChatMessagePart[] = [];\n\n if (input.role !== 'tool' && typeof input.content === 'string' && input.content.trim().length > 0) {\n parts.push({ type: 'text', text: input.content });\n }\n\n if (typeof input.reasoning_content === 'string' && input.reasoning_content.trim().length > 0) {\n parts.push({ type: 'reasoning', text: input.reasoning_content });\n }\n\n if (input.toolCalls) {\n for (const toolCall of input.toolCalls) {\n parts.push({\n type: 'tool-call',\n toolCallId: toolCall.id,\n toolName: toolCall.toolName,\n arguments: toolCall.arguments,\n });\n }\n }\n\n if (input.attachments) {\n for (const attachment of input.attachments) {\n parts.push({ type: 'attachment', attachment });\n }\n }\n\n if (input.role === 'tool') {\n const metadata = input.metadata ?? {};\n const parsed = typeof input.content === 'string' ? parseLegacyToolResultContent(input.content) : null;\n const toolName = typeof metadata.toolId === 'string' && metadata.toolId.length > 0\n ? metadata.toolId\n : parsed?.toolName ?? 'tool';\n const result = parsed?.result ?? (typeof input.content === 'string' ? input.content : '');\n const payload = parsed?.payload ?? tryParseJson(result);\n parts.push({\n type: 'tool-result',\n toolName,\n parameters: metadata.toolParameters ?? parsed?.parameters,\n result,\n isError: metadata.isError === true || parsed?.isError === true,\n payload,\n detailRef: input.detailRef,\n });\n }\n\n return parts;\n}\n\nexport function getChatMessageParts(\n message: Pick<\n ChatMessage,\n 'role' | 'parts' | 'content' | 'reasoning_content' | 'toolCalls' | 'attachments' | 'detailRef' | 'metadata'\n >,\n): ChatMessagePart[] {\n return message.parts ?? buildLegacyChatMessageParts(message);\n}\n","/**\n * Domain factories for creating canonical ChatMessage and AgentInstance objects.\n *\n * These factories ensure that every host (Desktop, Mobile, CLI, Cloud)\n * constructs messages and instances with the same required fields,\n * default values, and clock behavior.\n *\n * Hosts that need a different originNodeId, message ID scheme, or lamport\n * clock source should pass those values explicitly rather than creating\n * their own factory.\n */\nimport type { AgentDefinition } from '../agent/types.js';\nimport type { AgentFrameworkConfig } from '../promptUtilities/types.js';\nimport type { AgentInstance, AgentInstanceLatestStatus } from '../types.js';\nimport { buildLegacyChatMessageParts, projectChatMessageParts } from './parts.js';\nimport type { ChatMessage, ChatRole } from './types.js';\n\n/**\n * Create a canonical ChatMessage with required defaults.\n *\n * @param input.messageId - Unique message identifier. Use nanoid or equivalent.\n * @param input.conversationId - The conversation/agent-instance this message belongs to.\n * @param input.role - Message role (user, assistant, tool, agent, error).\n * @param input.content - Message text content.\n * @param input.originNodeId - Node that originated this message. Core default is \"unknown\";\n * hosts should pass their own identifier (e.g. \"tidgi-desktop\", \"memeloop-cli\").\n * @param input.contentType - MIME type override (default \"text/plain\").\n * @param input.metadata - Optional metadata map.\n * @param input.duration - Processing duration in ms.\n * @param input.lamportClock - Lamport clock value. Defaults to `Date.now()`.\n * @param input.toolCalls - Tool calls associated with assistant messages.\n * @param input.reasoning_content - Reasoning/thinking content.\n * @param input.hidden - Whether the message is hidden from the UI.\n * @param input.detailRef - Reference to large tool output stored elsewhere.\n */\nexport function createChatMessage(input: {\n messageId: string;\n conversationId: string;\n role: ChatRole;\n content?: string;\n originNodeId?: string;\n contentType?: string;\n metadata?: Record<string, unknown>;\n duration?: number | null;\n lamportClock?: number;\n parts?: ChatMessage['parts'];\n toolCalls?: ChatMessage['toolCalls'];\n reasoning_content?: string;\n hidden?: boolean;\n attachments?: ChatMessage['attachments'];\n detailRef?: ChatMessage['detailRef'];\n}): ChatMessage {\n const now = Date.now();\n const parts = input.parts ?? buildLegacyChatMessageParts({\n role: input.role,\n content: input.content,\n reasoning_content: input.reasoning_content,\n toolCalls: input.toolCalls,\n attachments: input.attachments,\n detailRef: input.detailRef,\n metadata: input.metadata,\n });\n const projection = projectChatMessageParts(parts);\n return {\n messageId: input.messageId,\n conversationId: input.conversationId,\n originNodeId: input.originNodeId ?? 'unknown',\n timestamp: now,\n lamportClock: input.lamportClock ?? now,\n role: input.role,\n parts: parts.length > 0 ? parts : undefined,\n content: input.content ?? projection.content,\n contentType: input.contentType ?? 'text/plain',\n metadata: input.metadata,\n duration: input.duration,\n toolCalls: input.toolCalls ?? projection.toolCalls,\n reasoning_content: input.reasoning_content ?? projection.reasoning_content,\n hidden: input.hidden,\n attachments: input.attachments ?? projection.attachments,\n detailRef: input.detailRef,\n };\n}\n\n/**\n * Default status applied to newly created agent instances.\n */\nconst DEFAULT_INSTANCE_STATUS: AgentInstanceLatestStatus = {\n state: 'completed',\n modified: new Date(),\n};\n\n/**\n * Create an AgentInstance from an AgentDefinition.\n *\n * The returned instance has an empty message list, a default \"completed\"\n * status, and copies all definition-level fields as instance defaults.\n *\n * @param definition - The AgentDefinition to base the instance on.\n * @param overrides - Optional overrides for instance-specific fields:\n * - `id`: Instance ID (default: nanoid-equivalent, must be provided by host)\n * - `name`: Display name (default: definition.name)\n * - `status`: Initial status\n * - `volatile`: Whether the instance is ephemeral\n * - `closed`: Whether closed on creation\n * - `isDelegatedAgentRun`, `parentAgentRunId`: Delegated agent relationship\n * - `agentFrameworkConfig`: Per-instance framework config override\n */\nexport function createAgentInstanceFromDefinition(\n definition: AgentDefinition,\n overrides: {\n id: string;\n name?: string;\n status?: AgentInstanceLatestStatus;\n volatile?: boolean;\n closed?: boolean;\n isDelegatedAgentRun?: boolean;\n parentAgentRunId?: string;\n agentFrameworkConfig?: AgentFrameworkConfig;\n },\n): AgentInstance {\n const now = new Date();\n return {\n ...definition,\n id: overrides.id,\n agentDefId: definition.id,\n name: overrides.name ?? definition.name,\n status: overrides.status ?? DEFAULT_INSTANCE_STATUS,\n messages: [],\n created: now,\n modified: now,\n closed: overrides.closed ?? false,\n volatile: overrides.volatile ?? false,\n isDelegatedAgentRun: overrides.isDelegatedAgentRun,\n parentAgentRunId: overrides.parentAgentRunId,\n agentFrameworkConfig: overrides.agentFrameworkConfig,\n };\n}\n","import type { HookSlot, PromptConcatHooks, PromptConcatTool, TapAsyncHandler } from './types.js';\n\nconst defaultPluginRegistry = new Map<string, PromptConcatTool>();\n/**\n * 默认全局注册表。生产与常规定义工具共用此 Map。\n * 测试或沙箱可用 {@link runWithPluginRegistry} 替换为独立 Map,避免用例间泄漏。\n */\nexport const pluginRegistry = defaultPluginRegistry;\n\n/**\n * 当前活跃的插件注册表覆盖(用于测试隔离)。\n * 不使用 AsyncLocalStorage,改用模块级变量 + try/finally,避免对 node:async_hooks 的依赖。\n */\nlet activeOverride: Map<string, PromptConcatTool> | null = null;\n\nexport function getActivePluginRegistry(): Map<string, PromptConcatTool> {\n return activeOverride ?? defaultPluginRegistry;\n}\n\nexport function runWithPluginRegistry<T>(\n registry: Map<string, PromptConcatTool>,\n function_: () => T,\n): T {\n const previous = activeOverride;\n activeOverride = registry;\n try {\n return function_();\n } finally {\n activeOverride = previous;\n }\n}\n\n/** Lightweight hook slot:tapAsync 注册,promise 串行执行(对齐 TidGi tapable AsyncSeriesHook) */\nfunction createHookSlot(): HookSlot & {\n handlers: TapAsyncHandler[];\n} {\n const handlers: TapAsyncHandler[] = [];\n return {\n handlers,\n tapAsync(_name, function_) {\n handlers.push(function_);\n },\n async promise(context: unknown) {\n for (const function_ of handlers) {\n await new Promise<void>((resolve) => {\n function_(context, resolve);\n });\n }\n },\n };\n}\n\nexport function createAgentFrameworkHooks(): PromptConcatHooks {\n return {\n processPrompts: createHookSlot(),\n finalizePrompts: createHookSlot(),\n postProcess: createHookSlot(),\n userMessageReceived: createHookSlot(),\n agentStatusChanged: createHookSlot(),\n toolExecuted: createHookSlot(),\n responseUpdate: createHookSlot(),\n responseComplete: createHookSlot(),\n };\n}\n\nconst hookHandlers: {\n processPrompts?: TapAsyncHandler[];\n} = {};\n\nexport async function runProcessPromptsHooks<TContext>(\n _hooks: PromptConcatHooks,\n context: TContext,\n): Promise<TContext> {\n const slot = _hooks.processPrompts as {\n handlers?: TapAsyncHandler[];\n };\n const fns = slot?.handlers ?? hookHandlers.processPrompts ?? [];\n for (const function_ of fns) {\n await new Promise<void>((resolve) => {\n function_(context, resolve);\n });\n }\n return context;\n}\n\nexport async function runResponseCompleteHooks(\n hooks: PromptConcatHooks,\n context: unknown,\n): Promise<void> {\n await hooks.responseComplete.promise(context);\n}\n\nexport async function runPostProcessHooks(\n hooks: PromptConcatHooks,\n context: unknown,\n): Promise<void> {\n await hooks.postProcess.promise(context);\n}\n\nexport async function runToolExecutedHooks(\n hooks: PromptConcatHooks,\n context: unknown,\n): Promise<void> {\n await hooks.toolExecuted.promise(context);\n}\n\n/**\n * TidGi `createHooksWithPlugins`:按 agentFrameworkConfig.plugins 把插件注册表里的工具挂到 hooks。\n */\n/** 从 Agent 上下文解析插件表:优先 `tools.getPromptPlugins()`,否则 ALS / 全局默认。 */\nexport function resolvePromptPluginMap(context: {\n tools?: { getPromptPlugins?: () => Map<string, PromptConcatTool> };\n}): Map<string, PromptConcatTool> {\n const fromTools = context.tools?.getPromptPlugins?.();\n if (fromTools) return fromTools;\n return getActivePluginRegistry();\n}\n\nexport async function createHooksWithPlugins(\n agentFrameworkConfig: {\n plugins?: Array<{ toolId: string; [key: string]: unknown }>;\n },\n options?: { pluginRegistry?: Map<string, PromptConcatTool> },\n): Promise<{\n hooks: PromptConcatHooks;\n pluginConfigs: Array<{ toolId: string; [key: string]: unknown }>;\n}> {\n const reg = options?.pluginRegistry ?? getActivePluginRegistry();\n const hooks = createAgentFrameworkHooks();\n if (agentFrameworkConfig.plugins) {\n for (const pluginConfig of agentFrameworkConfig.plugins) {\n const { toolId } = pluginConfig;\n const plugin = reg.get(toolId);\n if (plugin) {\n plugin(hooks);\n }\n }\n }\n return {\n hooks,\n pluginConfigs: agentFrameworkConfig.plugins ?? [],\n };\n}\n","/**\n * TidGi `responseConcat.ts` 迁移:postProcess 钩子链 + responses 合并。\n */\nimport type { ChatMessage } from '../conversation/index.js';\nimport { createAgentFrameworkHooks, resolvePromptPluginMap, runPostProcessHooks } from '../tools/pluginRegistry.js';\nimport type { AgentResponse, DefineToolAgentFrameworkContext, FrameworkPluginToolConfig } from '../tools/types.js';\nimport type { YieldNextRoundTarget } from '../tools/types.js';\nimport type { ToolCallingMatch } from './responsePatternUtility.js';\nimport type { IPrompt } from './types.js';\n\nfunction cloneResponses(responses: AgentResponse[]): AgentResponse[] {\n return structuredClone(responses);\n}\n\nexport async function responseConcat(\n agentFrameworkConfig: { response?: AgentResponse[]; plugins?: FrameworkPluginToolConfig[] },\n llmResponse: string,\n agentFrameworkContext: DefineToolAgentFrameworkContext,\n messages: ChatMessage[],\n): Promise<{\n processedResponse: string;\n yieldNextRoundTo?: YieldNextRoundTarget;\n toolCallInfo?: ToolCallingMatch;\n}> {\n const responses: AgentResponse[] = Array.isArray(agentFrameworkConfig?.response)\n ? cloneResponses(agentFrameworkConfig.response)\n : [];\n const toolConfigs = (\n Array.isArray(agentFrameworkConfig.plugins) ? agentFrameworkConfig.plugins : []\n ).filter((t) => t.enabled !== false);\n\n const hooks = createAgentFrameworkHooks();\n const pluginMap = resolvePromptPluginMap(agentFrameworkContext);\n for (const tool of toolConfigs) {\n const builtInTool = pluginMap.get(tool.toolId);\n if (builtInTool) {\n builtInTool(hooks);\n }\n }\n\n let yieldNextRoundTo: YieldNextRoundTarget | undefined;\n let toolCallInfo: ToolCallingMatch | undefined;\n\n for (const tool of toolConfigs) {\n const responseContext = {\n agentFrameworkContext,\n messages,\n prompts: [] as IPrompt[],\n toolConfig: tool,\n llmResponse,\n responses,\n metadata: {},\n actions: {} as { yieldNextRoundTo?: YieldNextRoundTarget; toolCalling?: ToolCallingMatch },\n };\n\n await runPostProcessHooks(hooks, responseContext);\n\n if (responseContext.actions?.yieldNextRoundTo) {\n yieldNextRoundTo = responseContext.actions.yieldNextRoundTo;\n if (responseContext.actions.toolCalling) {\n toolCallInfo = responseContext.actions.toolCalling;\n }\n }\n }\n\n const processedResponse = flattenResponses(responses);\n\n return {\n processedResponse: processedResponse || llmResponse,\n yieldNextRoundTo,\n toolCallInfo,\n };\n}\n\nfunction flattenResponses(responses: AgentResponse[]): string {\n if (responses.length === 0) {\n return '';\n }\n return responses\n .filter((response) => response.enabled !== false)\n .map((response) => response.text || '')\n .join('\\n\\n')\n .trim();\n}\n","/**\n * 从 TidGi-Desktop `responsePatternUtility.ts` 迁移:解析 LLM 输出中的 XML 风格 tool 调用。\n * 仅做数据解析,不执行任何代码。\n */\nimport JSON5 from 'json5';\n\nconst MAX_FALLBACK_INPUT_LENGTH = 1000;\nexport const TOOL_PARAMETER_PARSE_ERROR_KEY = '__memeloopToolParameterParseError';\n\nexport type ToolCallingMatch =\n | { found: false }\n | {\n found: true;\n toolId: string;\n parameters: Record<string, unknown>;\n originalText: string;\n };\n\ninterface ToolPattern {\n name: string;\n pattern: RegExp;\n extractToolId: (match: RegExpExecArray) => string;\n extractParams: (match: RegExpExecArray) => string;\n extractOriginalText: (match: RegExpExecArray) => string;\n}\n\nfunction parseToolParameters(parametersText: string): Record<string, unknown> {\n if (!parametersText || !parametersText.trim()) {\n return {};\n }\n\n const trimmedText = parametersText.trim();\n\n try {\n return JSON.parse(trimmedText) as Record<string, unknown>;\n } catch {\n /* try JSON5 */\n }\n\n try {\n return JSON5.parse(trimmedText);\n } catch {\n /* fall through */\n }\n\n return {\n [TOOL_PARAMETER_PARSE_ERROR_KEY]: `Invalid tool arguments JSON. Return one valid JSON object inside the tool tag. Received: ${\n trimmedText.substring(0, MAX_FALLBACK_INPUT_LENGTH)\n }`,\n };\n}\n\nfunction extractFunctionCallsParameters(text: string): Record<string, unknown> {\n const parameters: Record<string, unknown> = {};\n const parameterRegex = /<parameter\\s+name=\"([^\"]+)\"[^>]*>([^<]*)<\\/parameter>/g;\n let m: RegExpExecArray | null;\n while ((m = parameterRegex.exec(text)) !== null) {\n parameters[m[1]] = m[2].trim();\n }\n return parameters;\n}\n\nconst toolPatterns: ToolPattern[] = [\n {\n name: 'tool_use',\n pattern: /<tool_use\\s+name=\"([^\"]+)\"[^>]*>(.*?)<\\/tool_use>/gis,\n extractToolId: (match) => match[1],\n extractParams: (match) => match[2],\n extractOriginalText: (match) => match[0],\n },\n {\n name: 'function_call',\n pattern: /<function_call\\s+name=\"([^\"]+)\"[^>]*>(.*?)<\\/function_call>/gis,\n extractToolId: (match) => match[1],\n extractParams: (match) => match[2],\n extractOriginalText: (match) => match[0],\n },\n {\n name: 'function_calls_invoke',\n pattern: /<invoke\\s+name=\"([^\"]+)\"[^>]*>(.*?)<\\/invoke>/gis,\n extractToolId: (match) => match[1],\n extractParams: (match) => JSON.stringify(extractFunctionCallsParameters(match[2])),\n extractOriginalText: (match) => match[0],\n },\n];\n\nexport function matchToolCalling(responseText: string): ToolCallingMatch {\n try {\n for (const toolPattern of toolPatterns) {\n toolPattern.pattern.lastIndex = 0;\n\n const match = toolPattern.pattern.exec(responseText);\n if (match) {\n const toolId = toolPattern.extractToolId(match);\n const parametersText = toolPattern.extractParams(match);\n const originalText = toolPattern.extractOriginalText(match);\n\n return {\n found: true,\n toolId,\n parameters: parseToolParameters(parametersText),\n originalText,\n };\n }\n }\n\n return { found: false };\n } catch {\n return { found: false };\n }\n}\n\nexport function matchAllToolCallings(responseText: string): {\n calls: Array<ToolCallingMatch & { found: true }>;\n parallel: boolean;\n} {\n const calls: Array<ToolCallingMatch & { found: true }> = [];\n const parallel = /<parallel_tool_calls>/i.test(responseText);\n\n try {\n for (const toolPattern of toolPatterns) {\n toolPattern.pattern.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = toolPattern.pattern.exec(responseText)) !== null) {\n calls.push({\n found: true,\n toolId: toolPattern.extractToolId(match),\n parameters: parseToolParameters(toolPattern.extractParams(match)),\n originalText: toolPattern.extractOriginalText(match),\n });\n }\n }\n } catch {\n /* ignore */\n }\n\n return { calls, parallel };\n}\n","import type { ConversationEventStore } from './ports.js';\n\n/**\n * 下一条消息的 Lamport 时钟:取会话内已有消息的最大 lamportClock + 1。\n * Depends only on the narrow ConversationEventStore port (plan 24.41).\n */\nexport async function nextLamportClockForConversation(\n storage: ConversationEventStore,\n conversationId: string,\n): Promise<number> {\n if (typeof storage.getMaxLamportClockForConversation === 'function') {\n const max = await storage.getMaxLamportClockForConversation(conversationId);\n return max + 1;\n }\n const msgs = await storage.getMessages(conversationId, { mode: 'full-content' });\n let max = 0;\n for (const m of msgs) {\n if (typeof m.lamportClock === 'number' && m.lamportClock > max) {\n max = m.lamportClock;\n }\n }\n return max + 1;\n}\n","/**\n * Hook registry for managing lifecycle hook handlers.\n * Hooks execute in registration order (first registered, first executed).\n *\n * Converted from module-level singletons to an instance class for test isolation\n * and multi-runtime support. Backward-compatible function exports delegate to a\n * default global instance.\n */\n\nimport type { HookContext, HookHandler, HookResult, HookType } from './types.js';\n\n/** Type matching the hook handler maps. */\ntype HookHandlerMap = Map<string, HookHandler>;\n\n/**\n * Instance-level hook registry. Each instance maintains its own handler state.\n */\nexport class HookRegistry {\n private readonly hookRegistry = new Map<HookType, HookHandlerMap>();\n private readonly hookOrder: Map<HookType, HookHandler[]> = new Map();\n\n /**\n * Register a hook handler for a specific lifecycle event.\n */\n registerHook(type: HookType, handler: HookHandler, name?: string): void {\n const key = name ?? `hook:${Date.now().toString(36)}:${Math.random().toString(36).slice(2, 8)}`;\n const handlers = this.hookOrder.get(type) ?? [];\n handlers.push(handler);\n this.hookOrder.set(type, handlers);\n\n const map = this.hookRegistry.get(type) ?? new Map<string, HookHandler>();\n map.set(key, handler);\n this.hookRegistry.set(type, map);\n }\n\n /**\n * Unregister a specific hook handler by name.\n */\n unregisterHook(type: HookType, name: string): boolean {\n const map = this.hookRegistry.get(type);\n if (!map) return false;\n const deleted = map.delete(name);\n if (deleted) {\n this.hookOrder.set(type, Array.from(map.values()));\n }\n return deleted;\n }\n\n /**\n * Execute all registered hooks for a given type in registration order.\n */\n async executeHooks(\n type: HookType,\n context: HookContext,\n data: Record<string, unknown>,\n ): Promise<HookResult> {\n const handlers = this.hookOrder.get(type);\n if (!handlers || handlers.length === 0) {\n return { allowed: true };\n }\n\n let currentData = data;\n let mergedModified: Record<string, unknown> | undefined;\n let permissionAction: HookResult['permissionAction'];\n for (const handler of handlers) {\n try {\n const result = await handler(context, currentData);\n if (result.modified) {\n mergedModified = { ...(mergedModified ?? {}), ...result.modified };\n currentData = { ...currentData, ...result.modified };\n }\n if (result.permissionAction && result.permissionAction !== 'allow') {\n permissionAction = result.permissionAction;\n }\n if (!result.allowed) {\n return {\n ...result,\n modified: mergedModified ?? result.modified,\n permissionAction: permissionAction ?? result.permissionAction,\n };\n }\n } catch (error) {\n return {\n allowed: false,\n reason: error instanceof Error ? error.message : 'Hook execution failed',\n modified: mergedModified,\n permissionAction,\n };\n }\n }\n\n const finalResult: HookResult = { allowed: true };\n if (mergedModified) finalResult.modified = mergedModified;\n if (permissionAction) finalResult.permissionAction = permissionAction;\n return finalResult;\n }\n\n /**\n * Check if any hooks are registered for a given type.\n */\n hasHooks(type: HookType): boolean {\n const map = this.hookRegistry.get(type);\n return map != null && map.size > 0;\n }\n\n /**\n * Remove all registered hooks of all types.\n */\n clearHooks(): void {\n this.hookRegistry.clear();\n this.hookOrder.clear();\n }\n\n /**\n * List all hook types that have at least one registered handler.\n */\n listRegisteredHookTypes(): HookType[] {\n const types: HookType[] = [];\n for (const [type, map] of this.hookRegistry) {\n if (map.size > 0) {\n types.push(type);\n }\n }\n return types;\n }\n\n /**\n * Get the count of registered handlers for a hook type.\n */\n getHookCount(type: HookType): number {\n const map = this.hookRegistry.get(type);\n return map?.size ?? 0;\n }\n}\n\n// ─── Default global instance + backward-compatible function exports ───\n\nconst defaultHookRegistry = new HookRegistry();\n\nexport function getDefaultHookRegistry(): HookRegistry {\n return defaultHookRegistry;\n}\n\nexport function registerHook(type: HookType, handler: HookHandler, name?: string): void {\n defaultHookRegistry.registerHook(type, handler, name);\n}\n\nexport function unregisterHook(type: HookType, name: string): boolean {\n return defaultHookRegistry.unregisterHook(type, name);\n}\n\nexport async function executeHooks(\n type: HookType,\n context: HookContext,\n data: Record<string, unknown>,\n): Promise<HookResult> {\n return defaultHookRegistry.executeHooks(type, context, data);\n}\n\nexport function hasHooks(type: HookType): boolean {\n return defaultHookRegistry.hasHooks(type);\n}\n\nexport function clearHooks(): void {\n defaultHookRegistry.clearHooks();\n}\n\nexport function listRegisteredHookTypes(): HookType[] {\n return defaultHookRegistry.listRegisteredHookTypes();\n}\n\n/**\n * Get the count of registered handlers for a hook type.\n */\nexport function getHookCount(type: HookType): number {\n return defaultHookRegistry.getHookCount(type);\n}\n","import type { ChatMessage } from '../../conversation/index.js';\nimport type { ILLMProvider } from '../../types.js';\n\nexport interface CompactionOptions {\n /** Maximum token count to aim for after compaction (estimated by char count / 3.5). Default: 0 (no limit). */\n maxTokens?: number;\n /** Number of recent message turns (user+assistant pairs) to preserve. Default: 4. */\n recentTurnsToKeep?: number;\n /** Whether to attempt LLM summarization. Falls back to truncation if LLM unavailable or fails. Default: true. */\n useLlmSummary?: boolean;\n /** Optional LLM provider for summarization. */\n llmProvider?: ILLMProvider;\n}\n\nexport interface CompactionResult {\n /** Compacted messages (summary + recent turns). */\n messages: ChatMessage[];\n /** True if compaction reduced the message count. */\n compacted: boolean;\n /** Number of messages dropped. */\n droppedCount: number;\n /** Summary text generated or fallback notice. */\n summaryText: string;\n}\n\n/**\n * Counts \"turns\" in message history. A turn is a user→assistant pair.\n * Tool messages are grouped with the preceding assistant message.\n */\nfunction countTurns(messages: ChatMessage[]): number {\n let turns = 0;\n for (const message of messages) {\n if (message.role === 'user') {\n turns++;\n }\n }\n return turns;\n}\n\n/**\n * Estimate token count from message content (rough: chars / 3.5).\n */\nfunction estimateTokens(messages: ChatMessage[]): number {\n let total = 0;\n for (const message of messages) {\n const content = typeof message.content === 'string' ? message.content : JSON.stringify(message.content);\n total += content.length / 3.5;\n }\n return Math.ceil(total);\n}\n\n/**\n * Build a fallback summary string from the dropped messages.\n */\nfunction buildTruncationSummary(dropped: ChatMessage[], totalDropped: number): string {\n const turns = countTurns(dropped);\n const oldest = dropped[0];\n const newest = dropped[dropped.length - 1];\n const oldestTime = oldest?.timestamp ? new Date(oldest.timestamp).toISOString() : 'unknown';\n const newestTime = newest?.timestamp ? new Date(newest.timestamp).toISOString() : 'unknown';\n\n return `[context-summary] ${totalDropped} earlier messages (${turns} turns, ${oldestTime} → ${newestTime}) were compacted. Key topics: see recent messages below.`;\n}\n\n/**\n * Creates a summary ChatMessage from the compaction result.\n */\nfunction createSummaryMessage(\n conversationId: string,\n summaryText: string,\n baseMessage: ChatMessage,\n): ChatMessage {\n return {\n messageId: `${conversationId}:compacted:${Date.now().toString(36)}`,\n conversationId,\n originNodeId: baseMessage.originNodeId,\n timestamp: Date.now(),\n lamportClock: -1, // Will be replaced by AgentToolLoop\n role: 'assistant',\n content: summaryText,\n metadata: { compacted: true },\n };\n}\n\n/**\n * Deterministic compaction: keeps recent N turns and replaces older messages\n * with a single summary message.\n */\nexport function compactMessages(\n messages: ChatMessage[],\n options: Omit<CompactionOptions, 'llmProvider' | 'useLlmSummary'> = {},\n): CompactionResult {\n const recentTurnsToKeep = options.recentTurnsToKeep ?? 4;\n\n if (messages.length <= recentTurnsToKeep * 2) {\n return { messages, compacted: false, droppedCount: 0, summaryText: '' };\n }\n\n // Find the cutoff point: keep the last recentTurnsToKeep user messages + everything after them\n const userIndices: number[] = [];\n for (let index = 0; index < messages.length; index++) {\n if (messages[index].role === 'user') {\n userIndices.push(index);\n }\n }\n\n if (userIndices.length <= recentTurnsToKeep) {\n return { messages, compacted: false, droppedCount: 0, summaryText: '' };\n }\n\n // The first message to keep starts at the recentTurnsToKeep-th user message from the end\n const keepStartIndex = userIndices[userIndices.length - recentTurnsToKeep];\n const dropped = messages.slice(0, keepStartIndex);\n const kept = messages.slice(keepStartIndex);\n\n if (dropped.length === 0) {\n return { messages, compacted: false, droppedCount: 0, summaryText: '' };\n }\n\n const conversationId = messages[0]?.conversationId ?? 'unknown';\n const summaryText = buildTruncationSummary(dropped, dropped.length);\n const summaryMessage = createSummaryMessage(conversationId, summaryText, messages[0]);\n\n const compacted: ChatMessage[] = [summaryMessage, ...kept];\n\n // Also prune tool outputs older than the cutoff in the kept section\n // (we already dropped them in the \"dropped\" section)\n\n return {\n messages: compacted,\n compacted: true,\n droppedCount: dropped.length,\n summaryText,\n };\n}\n\n/**\n * Checks whether compaction is needed based on message count threshold.\n * @returns true if message count exceeds threshold (default 50).\n */\nexport function shouldCompact(messages: ChatMessage[], threshold?: number): boolean {\n const t = threshold ?? 50;\n return messages.length > t;\n}\n\n/**\n * Auto-compact: estimates token usage, and if it exceeds maxTokens,\n * performs compaction to keep the context within bounds.\n *\n * Uses the LLM provider for summarization if available, falling back to\n * simple truncation + turn counting.\n */\nexport async function autoCompact(\n messages: ChatMessage[],\n options: CompactionOptions = {},\n): Promise<CompactionResult> {\n const recentTurnsToKeep = options.recentTurnsToKeep ?? 4;\n\n // If we're within budget, no need to compact\n if (options.maxTokens && options.maxTokens > 0) {\n const currentTokens = estimateTokens(messages);\n if (currentTokens <= options.maxTokens) {\n return { messages, compacted: false, droppedCount: 0, summaryText: '' };\n }\n }\n\n // If LLM summarization is requested and provider model is available, try it\n if (options.useLlmSummary !== false && options.llmProvider?.model != null) {\n try {\n const result = await llmCompact(messages, options.llmProvider, recentTurnsToKeep);\n if (result) return result;\n } catch {\n // Fall through to truncation\n }\n }\n\n // Fallback: deterministic truncation\n return compactMessages(messages, { ...options });\n}\n\n/**\n * LLM-based compaction: asks the model to summarize the older conversation turns.\n */\nasync function llmCompact(\n messages: ChatMessage[],\n llmProvider: ILLMProvider,\n recentTurnsToKeep: number,\n): Promise<CompactionResult | null> {\n const userIndices: number[] = [];\n for (let index = 0; index < messages.length; index++) {\n if (messages[index].role === 'user') {\n userIndices.push(index);\n }\n }\n\n if (userIndices.length <= recentTurnsToKeep) {\n return null;\n }\n\n const keepStartIndex = userIndices[userIndices.length - recentTurnsToKeep];\n const toSummarize = messages.slice(0, keepStartIndex);\n const kept = messages.slice(keepStartIndex);\n\n if (toSummarize.length === 0) return null;\n\n const conversationId = messages[0]?.conversationId ?? 'unknown';\n\n // Build a text representation of the messages to summarize\n const conversationText = toSummarize\n .map((m) => {\n const content = typeof m.content === 'string' ? m.content : JSON.stringify(m.content);\n const toolId = typeof m.metadata?.toolId === 'string' ? m.metadata.toolId : 'unknown';\n const roleLabel = m.role === 'tool' ? `[tool: ${toolId}]` : `[${m.role}]`;\n // Keep tool outputs brief in summary\n if (m.role === 'tool' && content.length > 500) {\n return `${roleLabel} ${content.slice(0, 500)}... (truncated)`;\n }\n return `${roleLabel} ${content}`;\n })\n .join('\\n\\n');\n\n const prompt =\n `Summarize the following conversation excerpt. Be concise but capture key decisions, action items, tool calls, and important context. Focus on information useful for continuing the conversation.\n\n<conversation>\n${conversationText.slice(0, 8000)}\n</conversation>\n\nProvide a brief summary (3-5 paragraphs) of the key points.`;\n\n try {\n const summaryText = await generateSummary(llmProvider, prompt);\n if (!summaryText || summaryText.length < 10) return null;\n\n const summaryMessage = createSummaryMessage(\n conversationId,\n `[context-summary] ${summaryText}`,\n messages[0],\n );\n\n return {\n messages: [summaryMessage, ...kept],\n compacted: true,\n droppedCount: toSummarize.length,\n summaryText,\n };\n } catch {\n return null; // Fall back to truncation\n }\n}\n\nasync function generateSummary(llmProvider: ILLMProvider, prompt: string): Promise<string | null> {\n if (typeof llmProvider.chat !== 'function') return null;\n const raw = llmProvider.chat({ messages: [{ role: 'user', content: prompt }] });\n let resolved: unknown = raw;\n if (resolved != null && typeof (resolved as Promise<unknown>).then === 'function') {\n resolved = await (resolved as Promise<unknown>);\n }\n if (\n resolved != null &&\n typeof (resolved as AsyncIterable<unknown>)[Symbol.asyncIterator] === 'function'\n ) {\n let text = '';\n for await (const chunk of resolved as AsyncIterable<unknown>) {\n text += chunkToText(chunk);\n }\n return text || null;\n }\n if (typeof resolved === 'string') return resolved;\n return null;\n}\n\nfunction chunkToText(chunk: unknown): string {\n if (typeof chunk === 'string') return chunk;\n if (chunk != null && typeof chunk === 'object' && 'content' in chunk) {\n const content = (chunk as { content?: unknown }).content;\n return typeof content === 'string' ? content : JSON.stringify(content);\n }\n return JSON.stringify(chunk);\n}\n","import type { ChatMessage } from '../../conversation/index.js';\nimport { nextLamportClockForConversation } from '../../storage/nextLamport.js';\nimport type { AgentFrameworkContext } from '../../types.js';\nimport { executeHooks, hasHooks } from '../hooks/registry.js';\nimport { autoCompact as autoCompactMessages, shouldCompact } from './compaction.js';\n\nimport type { AgentLoopStep } from '../types.js';\n\ntype ContextCompactionModified = {\n history?: unknown;\n skipDefault?: unknown;\n compacted?: unknown;\n droppedCount?: unknown;\n summaryText?: unknown;\n persistSummaryMessage?: unknown;\n};\n\ntype AutoCompactResult = {\n messages: ChatMessage[];\n compacted: boolean;\n droppedCount: number;\n summaryText: string;\n};\n\ntype AutoCompactFunction = (\n messages: ChatMessage[],\n options: {\n recentTurnsToKeep: number;\n maxTokens: number;\n llmProvider: unknown;\n },\n) => Promise<AutoCompactResult>;\n\nfunction compactHistory(\n history: ChatMessage[],\n options: AgentFrameworkContext['agentToolLoop'],\n): ChatMessage[] {\n const maxMessages = options?.contextCompaction?.maxMessages ?? 0;\n if (maxMessages <= 0 || history.length <= maxMessages) return history;\n const dropped = history.length - maxMessages;\n const tail = history.slice(-maxMessages);\n const summaryMessage: ChatMessage = {\n ...tail[0],\n messageId: `${tail[0]?.conversationId ?? 'unknown'}:summary:${Date.now().toString(36)}`,\n role: 'assistant',\n content: `[context-summary] ${dropped} earlier messages were compacted.`,\n };\n if (options?.contextCompaction?.replayLastUserMessage === false) return tail;\n const lastUser = [...history].reverse().find((message) => message.role === 'user');\n if (!lastUser) return [summaryMessage, ...tail];\n if (tail.some((message) => message.messageId === lastUser.messageId)) return tail;\n return [summaryMessage, lastUser, ...tail];\n}\n\nfunction asChatMessages(value: unknown): ChatMessage[] | undefined {\n if (!Array.isArray(value)) return undefined;\n if (!value.every((message) => message != null && typeof message === 'object')) return undefined;\n return value as ChatMessage[];\n}\n\nfunction buildCompactedStep(\n conversationId: string,\n iteration: number,\n droppedCount: unknown,\n summaryText: unknown,\n): AgentLoopStep {\n return {\n type: 'thinking',\n data: {\n status: 'compacted',\n conversationId,\n droppedCount: typeof droppedCount === 'number' ? droppedCount : 0,\n summaryText: typeof summaryText === 'string' ? summaryText : '',\n iteration,\n },\n };\n}\n\nasync function persistSummaryMessage(\n context: AgentFrameworkContext,\n conversationId: string,\n summaryMessage: ChatMessage | undefined,\n): Promise<void> {\n if (!summaryMessage) return;\n const lamportSummary = await nextLamportClockForConversation(context.storage, conversationId);\n await context.storage.appendMessage({\n ...summaryMessage,\n lamportClock: lamportSummary,\n });\n}\n\nasync function maybeApplyContextCompactionHook(options: {\n context: AgentFrameworkContext;\n conversationId: string;\n iteration: number;\n history: ChatMessage[];\n agentToolLoopOptions: AgentFrameworkContext['agentToolLoop'];\n}): Promise<{ handled: boolean; history: ChatMessage[]; steps: AgentLoopStep[] }> {\n const { context, conversationId, iteration, history, agentToolLoopOptions } = options;\n if (!hasHooks('ContextCompaction')) {\n return { handled: false, history, steps: [] };\n }\n\n const hookResult = await executeHooks('ContextCompaction', context, {\n conversationId,\n iteration,\n history,\n autoCompact: agentToolLoopOptions?.autoCompact,\n contextCompaction: agentToolLoopOptions?.contextCompaction,\n });\n const modified = hookResult.modified as ContextCompactionModified | undefined;\n const modifiedHistory = asChatMessages(modified?.history);\n const nextHistory = modifiedHistory ?? history;\n const skipDefault = !hookResult.allowed || modifiedHistory != null || modified?.skipDefault === true;\n if (!skipDefault) {\n return { handled: false, history: nextHistory, steps: [] };\n }\n\n const steps = modified?.compacted === true\n ? [buildCompactedStep(conversationId, iteration, modified.droppedCount, modified.summaryText)]\n : [];\n if (modified?.persistSummaryMessage === true) {\n await persistSummaryMessage(context, conversationId, nextHistory[0]);\n }\n\n return { handled: true, history: nextHistory, steps };\n}\n\nasync function applyBuiltInAutoCompact(options: {\n context: AgentFrameworkContext;\n conversationId: string;\n iteration: number;\n history: ChatMessage[];\n agentToolLoopOptions: AgentFrameworkContext['agentToolLoop'];\n}): Promise<{ history: ChatMessage[]; steps: AgentLoopStep[] }> {\n const { context, conversationId, iteration, agentToolLoopOptions } = options;\n let history = options.history;\n const autoCompactOptions = agentToolLoopOptions?.autoCompact;\n if (!autoCompactOptions) {\n return { history, steps: [] };\n }\n\n const threshold = autoCompactOptions.threshold ?? 50;\n if (!shouldCompact(history, threshold)) {\n return { history, steps: [] };\n }\n\n try {\n const result = await (autoCompactMessages as unknown as AutoCompactFunction)(history, {\n recentTurnsToKeep: autoCompactOptions.recentTurnsToKeep ?? 4,\n maxTokens: autoCompactOptions.maxTokens ?? 0,\n llmProvider: context.llmProvider,\n });\n if (!result.compacted) {\n return { history, steps: [] };\n }\n\n history = result.messages;\n await persistSummaryMessage(context, conversationId, result.messages[0]);\n return {\n history,\n steps: [\n buildCompactedStep(conversationId, iteration, result.droppedCount, result.summaryText),\n ],\n };\n } catch (error) {\n if (context.logger?.warn) {\n context.logger.warn('[agentToolLoop] auto-compact failed:', error);\n } else {\n console.warn('[agentToolLoop] auto-compact failed:', error);\n }\n return { history, steps: [] };\n }\n}\n\nexport async function prepareIterationHistory(options: {\n context: AgentFrameworkContext;\n conversationId: string;\n iteration: number;\n rawHistory: ChatMessage[];\n agentToolLoopOptions: AgentFrameworkContext['agentToolLoop'];\n}): Promise<{ history: ChatMessage[]; steps: AgentLoopStep[] }> {\n const { agentToolLoopOptions } = options;\n const hookResult = await maybeApplyContextCompactionHook({\n ...options,\n history: options.rawHistory,\n });\n if (hookResult.handled) {\n return hookResult;\n }\n\n const autoCompactResult = await applyBuiltInAutoCompact({\n ...options,\n history: hookResult.history,\n });\n return {\n history: compactHistory(autoCompactResult.history, agentToolLoopOptions),\n steps: autoCompactResult.steps,\n };\n}\n","type LegacyLlmContext = {\n llmProvider: {\n chat?: unknown;\n };\n};\n\ntype LegacyChatFunction = (request: unknown) => unknown;\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n value != null && typeof (value as AsyncIterable<unknown>)[Symbol.asyncIterator] === 'function'\n );\n}\n\nexport function chunkToText(chunk: unknown): string {\n if (typeof chunk === 'string') return chunk;\n if (chunk != null && typeof chunk === 'object' && 'content' in chunk) {\n const content = (chunk as { content?: unknown }).content;\n return typeof content === 'string' ? content : JSON.stringify(content);\n }\n return JSON.stringify(chunk);\n}\n\nexport async function* streamLlm(\n context: LegacyLlmContext,\n request: unknown,\n): AsyncGenerator<unknown, void, unknown> {\n const chatFunction = context.llmProvider.chat;\n\n if (typeof chatFunction !== 'function') {\n throw new Error(\n \"LLM provider does not support legacy chat() method. Use AI SDK's streamText instead.\",\n );\n }\n const raw = (chatFunction as LegacyChatFunction)(request);\n let resolved: unknown = raw;\n if (resolved != null && typeof (resolved as Promise<unknown>).then === 'function') {\n resolved = await (resolved as Promise<unknown>);\n }\n if (isAsyncIterable(resolved)) {\n for await (const chunk of resolved) {\n yield chunk;\n }\n return;\n }\n yield resolved;\n}\n","import type { ChatMessage } from '../conversation/index.js';\n\nimport { createAgentFrameworkHooks, resolvePromptPluginMap, runProcessPromptsHooks } from '../tools/pluginRegistry.js';\nimport type { AgentFrameworkContext } from '../types.js';\nimport type { AgentPromptDescription, PromptNode, PromptPluginConfig } from './types.js';\n\n/** 将 prompt 节点 `id` 映射到 agentFrameworkConfig.prompts 树中的索引路径(供 UI / schema 注解)。 */\nexport function collectPromptSourcePaths(\n prompts: PromptNode[],\n basePath = 'agentFrameworkConfig.prompts',\n): Record<string, string> {\n const out: Record<string, string> = {};\n function walk(nodes: PromptNode[], prefix: string): void {\n nodes.forEach((n, index) => {\n const p = `${prefix}.${index}`;\n if (n.id) {\n out[n.id] = p;\n }\n if (n.children?.length) {\n walk(n.children, `${p}.children`);\n }\n });\n }\n walk(prompts, basePath);\n return out;\n}\n\nconst logger = {\n debug: (..._arguments: unknown[]) => {},\n info: (..._arguments: unknown[]) => {},\n warn: (..._arguments: unknown[]) => {},\n error: (..._arguments: unknown[]) => {},\n};\n\nexport interface PromptConcatContext {\n messages: ChatMessage[];\n}\n\n/** 扁平化后的 LLM 消息(不依赖 peer `ai` 包导出,避免 d.ts 与 SDK 主版本不一致) */\nexport type PromptFlatModelMessage = {\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: unknown;\n};\n\nexport function findPromptById(\n prompts: PromptNode[],\n id: string,\n): { prompt: PromptNode; parent: PromptNode[]; index: number } | undefined {\n for (let index = 0; index < prompts.length; index++) {\n const prompt = prompts[index];\n if (prompt.id === id) {\n return { prompt, parent: prompts, index };\n }\n if (prompt.children) {\n const found = findPromptById(prompt.children, id);\n if (found) return found;\n }\n }\n return undefined;\n}\n\nexport function flattenPrompts(prompts: PromptNode[]): PromptFlatModelMessage[] {\n const result: PromptFlatModelMessage[] = [];\n\n function processPrompt(prompt: PromptNode): string {\n let text = prompt.text ?? '';\n if (prompt.children) {\n for (const child of prompt.children) {\n if (!child.role) {\n text += processPrompt(child);\n }\n }\n }\n return text;\n }\n\n function collectRolePrompts(nodes: PromptNode[]): void {\n for (const prompt of nodes) {\n if (prompt.enabled === false) continue;\n\n const content = processPrompt(prompt);\n if (content.trim() || prompt.role) {\n result.push({\n role: prompt.role ?? 'system',\n content: content.trim(),\n });\n }\n\n if (prompt.children) {\n collectRolePrompts(prompt.children);\n }\n }\n }\n\n collectRolePrompts(prompts);\n return result;\n}\n\nexport interface PromptConcatPluginPreview {\n id: string;\n toolId?: string;\n caption?: string;\n}\n\nexport interface PromptConcatStreamState {\n processedPrompts: PromptNode[];\n flatPrompts: PromptFlatModelMessage[];\n step: 'flatten' | 'complete' | 'plugin' | 'finalize';\n isComplete: boolean;\n /** prompt 节点 id → JSON 路径(如 agentFrameworkConfig.prompts.0) */\n sourcePaths?: Record<string, string>;\n /** Desktop UI: plugin currently being processed. */\n currentPlugin?: PromptConcatPluginPreview;\n /** Desktop UI: progress value between 0 and 1. */\n progress?: number;\n}\n\nexport interface PromptConcatOptions {\n readAttachmentFile?: (path: string) => Promise<Uint8Array>;\n}\n\nexport async function* promptConcatStream(\n agentConfig: Pick<AgentPromptDescription, 'agentFrameworkConfig'>,\n messages: ChatMessage[],\n agentFrameworkContext: AgentFrameworkContext,\n options?: PromptConcatOptions,\n): AsyncGenerator<PromptConcatStreamState, PromptConcatStreamState, unknown> {\n const frameworkConfig = agentConfig.agentFrameworkConfig;\n const promptConfigs: PromptNode[] = frameworkConfig?.prompts ?? [];\n const plugins: PromptPluginConfig[] = frameworkConfig?.plugins ?? [];\n\n const hooks = createAgentFrameworkHooks();\n const pluginMap = resolvePromptPluginMap(agentFrameworkContext);\n for (const plugin of plugins) {\n const entry = pluginMap.get(plugin.toolId);\n if (entry) entry(hooks);\n }\n\n // Run processPrompts hooks once per plugin so each handler sees its own toolConfig.\n // Desktop defineTool handlers check toolConfig.toolId and skip non-matching plugins.\n let processedContext = { prompts: promptConfigs };\n for (let index = 0; index < plugins.length; index++) {\n const plugin = plugins[index];\n processedContext = await runProcessPromptsHooks(hooks, {\n prompts: processedContext.prompts,\n messages,\n toolConfig: plugin as never,\n pluginIndex: index,\n agentFrameworkContext,\n });\n }\n\n const processed = processedContext.prompts;\n const flat = flattenPrompts(processed);\n\n // 如果最后一条消息是 user,把其内容追加到 prompts\n const last = messages[messages.length - 1];\n if (last && last.role === 'user') {\n const content = last.content;\n const fileMeta = (last as ChatMessage & { metadata?: { file?: { path?: string } } }).metadata\n ?.file;\n if (fileMeta?.path && options?.readAttachmentFile) {\n try {\n const buf = await options.readAttachmentFile(fileMeta.path);\n flat.push({\n role: 'user',\n content: [\n { type: 'image', image: buf },\n { type: 'text', text: content },\n ],\n });\n } catch (error) {\n logger.error('failed to read attached file', { error, path: fileMeta.path });\n }\n } else if (fileMeta?.path && !options?.readAttachmentFile) {\n flat.push({\n role: 'user',\n content: `[attached path: ${fileMeta.path}]\\n${content}`,\n });\n } else {\n flat.push({ role: 'user', content });\n }\n }\n\n const state: PromptConcatStreamState = {\n processedPrompts: processed,\n flatPrompts: flat,\n step: 'complete',\n isComplete: true,\n sourcePaths: collectPromptSourcePaths(processed),\n };\n\n yield state;\n return state;\n}\n","import type { ChatMessage } from '../conversation/index.js';\n\nexport function normalizeRoleForLlm(role: string): 'user' | 'assistant' | 'system' | 'tool' {\n if (role === 'assistant' || role === 'system' || role === 'tool') return role;\n return 'user';\n}\n\n/**\n * 丢弃早于 `now - maxAgeMs` 的历史消息(按 `ChatMessage.timestamp`,毫秒)。\n * `maxAgeMs <= 0` 时不裁剪。\n */\nexport function filterOldMessagesByDuration(\n messages: ChatMessage[],\n maxAgeMs: number,\n now: number = Date.now(),\n): ChatMessage[] {\n if (maxAgeMs <= 0) return messages;\n const cutoff = now - maxAgeMs;\n return messages.filter((m) => typeof m.timestamp === 'number' && m.timestamp >= cutoff);\n}\n\nexport function getFinalPromptResult(parts: string[]): string {\n return parts.filter(Boolean).join('\\n\\n');\n}\n","export function formatToolResultMessage(\n toolName: string,\n parameters: Record<string, unknown>,\n body: string,\n isError: boolean,\n): string {\n return `<functions_result>\nTool: ${toolName}\nParameters: ${JSON.stringify(parameters)}\n${isError ? 'Error' : 'Result'}: ${body}\n</functions_result>`;\n}\n","import type { AgentDefinition } from '../../agent/types.js';\nimport { type ChatMessage, getChatMessageParts, isToolResultPart } from '../../conversation/index.js';\nimport { promptConcatStream } from '../../promptUtilities/promptConcat.js';\nimport type { PromptNode, PromptPluginConfig } from '../../promptUtilities/types.js';\nimport { filterOldMessagesByDuration } from '../../promptUtilities/utilities.js';\nimport type { AgentFrameworkContext } from '../../types.js';\nimport { formatToolResultMessage } from './toolResultMessage.js';\n\nexport type LlmRequestMessage = {\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: unknown;\n};\n\nfunction chatMessageToModelMessage(message: ChatMessage): LlmRequestMessage {\n const role: LlmRequestMessage['role'] = message.role === 'agent' || message.role === 'error'\n ? 'assistant'\n : message.role === 'tool'\n ? 'tool'\n : message.role === 'user'\n ? 'user'\n : 'assistant';\n\n if (role === 'tool') {\n const toolResults = getChatMessageParts(message).filter(isToolResultPart);\n if (toolResults.length > 0) {\n return {\n role,\n content: toolResults.map((part) =>\n formatToolResultMessage(\n part.toolName,\n (part.parameters && typeof part.parameters === 'object' ? part.parameters : {}) as Record<string, unknown>,\n part.result,\n part.isError === true,\n )\n ).join('\\n\\n'),\n };\n }\n }\n\n return {\n role,\n content: message.content,\n };\n}\n\nexport async function resolveAgentDefinitionModel(\n context: AgentFrameworkContext,\n definitionId: string,\n): Promise<AgentDefinition | null> {\n if (context.resolveAgentDefinition) {\n return context.resolveAgentDefinition(definitionId);\n }\n return context.storage.getAgentDefinition(definitionId);\n}\n\nexport async function inferDefinitionId(\n storage: AgentFrameworkContext['storage'],\n conversationId: string,\n): Promise<string> {\n try {\n const meta = await storage.getConversationMeta(conversationId);\n if (meta?.definitionId) return meta.definitionId;\n } catch {\n /* optional on old mocks */\n }\n const parts = conversationId.split(':');\n if (parts.length >= 2) {\n return parts.slice(0, -1).join(':');\n }\n return conversationId;\n}\n\nexport async function buildLlmMessages(\n context: AgentFrameworkContext,\n conversationId: string,\n history: ChatMessage[],\n): Promise<LlmRequestMessage[]> {\n const definitionId = await inferDefinitionId(context.storage, conversationId);\n const definition = await resolveAgentDefinitionModel(context, definitionId);\n const fw = definition?.agentFrameworkConfig as\n | { prompts?: unknown[]; plugins?: unknown[] }\n | undefined;\n const maxHistoryAgeMs = context.agentToolLoop?.maxHistoryAgeMs ?? 0;\n const historyForPrompt = maxHistoryAgeMs > 0 ? filterOldMessagesByDuration(history, maxHistoryAgeMs) : history;\n\n if (fw?.prompts && Array.isArray(fw.prompts) && fw.prompts.length > 0) {\n const readAttachmentFile = context.agentToolLoop?.readAttachmentFile;\n const gen = promptConcatStream(\n {\n agentFrameworkConfig: {\n prompts: fw.prompts as PromptNode[],\n plugins: (fw.plugins ?? []) as PromptPluginConfig[],\n response: [],\n },\n },\n historyForPrompt,\n context,\n readAttachmentFile ? { readAttachmentFile } : undefined,\n );\n let lastFlat: LlmRequestMessage[] = [];\n for await (const state of gen) {\n lastFlat = state.flatPrompts as LlmRequestMessage[];\n }\n const withoutTrailingUser = lastFlat.length > 0 && lastFlat[lastFlat.length - 1]?.role === 'user'\n ? lastFlat.slice(0, -1)\n : lastFlat;\n return [...withoutTrailingUser, ...historyForPrompt.map(chatMessageToModelMessage)];\n }\n\n const systemText = typeof definition?.systemPrompt === 'string' ? definition.systemPrompt.trim() : '';\n if (systemText.length > 0) {\n return [\n { role: 'system', content: systemText },\n ...historyForPrompt.map(chatMessageToModelMessage),\n ];\n }\n\n return historyForPrompt.map(chatMessageToModelMessage);\n}\n","import type { OrchestrationCondition } from '../client.js';\nimport type { ToolOperationResource, ToolOperationStatus } from '../resources.js';\n\n/**\n * Condition type raised on a ToolOperation whose executor crashed or\n * disconnected after a side effect may have occurred. While this condition is\n * `True`, controllers must follow the recorded reconciliation decision instead\n * of blindly repeating the operation.\n */\nexport const TOOL_OPERATION_CONDITION_EFFECT_UNKNOWN = 'EffectUnknown';\n\n/**\n * Evidence gathered by driver/controller inspection after an executor crash or\n * disconnect. Evidence is produced by the trusted side (driver checkpoints,\n * verifier probes, artifact records), never by the possibly-failed executor's\n * own claim alone.\n */\nexport interface UnknownEffectEvidence {\n /**\n * The executor produced a result before the disconnect and only the\n * completion acknowledgement was lost. The caller is responsible for\n * attaching the observed result when applying the decision.\n */\n resultObserved?: boolean;\n /** Reference to independent verification evidence (artifact, verifier run). */\n evidenceRef?: string;\n /** ISO timestamp of the observed disconnect/crash. */\n disconnectedAt?: string;\n}\n\nexport type UnknownEffectAction = 'retry' | 'succeeded' | 'verification-required' | 'manual-intervention';\n\nexport interface UnknownEffectDecision {\n action: UnknownEffectAction;\n reason: string;\n}\n\nconst DEFAULT_MAX_ATTEMPTS = 3;\n\nfunction attemptsOf(operation: ToolOperationResource): number {\n return operation.status?.attempts ?? 0;\n}\n\nfunction maxAttemptsOf(operation: ToolOperationResource): number {\n return operation.spec.retry?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;\n}\n\n/**\n * Decide how to reconcile an operation whose effect is unknown. The decision\n * never blindly repeats destructive work:\n *\n * 1. An observed result means only the ack was lost → `succeeded`.\n * 2. `read` effects have no side effects → `retry` (within attempt budget).\n * 3. `retry.nonRetryable` operations are never repeated → `manual-intervention`.\n * 4. Operations with an `idempotencyKey` dedupe at the executor/store, so a\n * repeated delivery is safe → `retry` (within attempt budget).\n * 5. Everything else requires independent verification before any retry →\n * `verification-required`.\n */\nexport function reconcileUnknownEffect(\n operation: ToolOperationResource,\n evidence: UnknownEffectEvidence,\n): UnknownEffectDecision {\n if (evidence.resultObserved) {\n return { action: 'succeeded', reason: 'result was observed before the disconnect; only the ack was lost' };\n }\n\n if (operation.spec.retry?.nonRetryable) {\n return { action: 'manual-intervention', reason: 'operation is marked nonRetryable and its effect is unknown' };\n }\n\n const attempts = attemptsOf(operation);\n const maxAttempts = maxAttemptsOf(operation);\n const withinBudget = attempts < maxAttempts;\n\n if (operation.spec.effect === 'read') {\n if (withinBudget) {\n return { action: 'retry', reason: `read effect has no side effects (attempt ${attempts + 1}/${maxAttempts})` };\n }\n return { action: 'verification-required', reason: `read retry budget exhausted (${attempts}/${maxAttempts})` };\n }\n\n if (operation.spec.idempotencyKey) {\n if (withinBudget) {\n return {\n action: 'retry',\n reason: `idempotencyKey deduplicates repeated delivery (attempt ${attempts + 1}/${maxAttempts})`,\n };\n }\n return {\n action: 'verification-required',\n reason: `idempotent retry budget exhausted (${attempts}/${maxAttempts}); verify before further attempts`,\n };\n }\n\n return {\n action: 'verification-required',\n reason: `effect '${operation.spec.effect}' without idempotencyKey must be verified before any retry`,\n };\n}\n\nfunction effectUnknownCondition(decision: UnknownEffectDecision, at: string): OrchestrationCondition {\n return {\n type: TOOL_OPERATION_CONDITION_EFFECT_UNKNOWN,\n status: 'True',\n reason: decision.action,\n message: decision.reason,\n lastTransitionTime: at,\n };\n}\n\n/**\n * Apply a reconciliation decision to an operation, producing the next status:\n *\n * - `retry` → back to `Pending` (requeue) with the EffectUnknown condition.\n * - `succeeded` → `Completed` (caller attaches the observed result separately).\n * - `verification-required` / `manual-intervention` → stays `Running` with the\n * EffectUnknown condition; the operation is not repeated until a verifier or\n * operator clears the condition.\n */\nexport function applyUnknownEffectDecision(\n operation: ToolOperationResource,\n decision: UnknownEffectDecision,\n at: string = new Date().toISOString(),\n): ToolOperationResource {\n const conditions = [\n ...(operation.status?.conditions ?? []).filter((c) => c.type !== TOOL_OPERATION_CONDITION_EFFECT_UNKNOWN),\n effectUnknownCondition(decision, at),\n ];\n\n const base: ToolOperationStatus = {\n ...operation.status,\n conditions,\n };\n\n if (decision.action === 'retry') {\n return { ...operation, status: { ...base, phase: 'Pending' } };\n }\n if (decision.action === 'succeeded') {\n return {\n ...operation,\n status: { ...base, phase: 'Completed', completedAt: at },\n };\n }\n return { ...operation, status: { ...base, phase: 'Running' } };\n}\n","export const ORCHESTRATION_ERROR_CODES = [\n 'UNSUPPORTED',\n 'FORBIDDEN',\n 'CONFLICT',\n 'STALE_EPOCH',\n 'NOT_FOUND',\n 'INVALID',\n 'EXHAUSTED',\n 'UNAVAILABLE',\n 'TIMEOUT',\n 'CANCELLED',\n 'UNKNOWN_EFFECT',\n 'WATCH_COMPACTED',\n 'INTERNAL',\n] as const;\n\nexport type OrchestrationErrorCode = typeof ORCHESTRATION_ERROR_CODES[number];\n\nexport interface OrchestrationErrorData {\n code: OrchestrationErrorCode;\n message: string;\n retryable: boolean;\n retryAfterMs?: number;\n reason?: string;\n details?: Record<string, unknown>;\n}\n\nexport class OrchestrationError extends Error {\n readonly code: OrchestrationErrorCode;\n readonly retryable: boolean;\n readonly retryAfterMs?: number;\n readonly reason?: string;\n readonly details?: Record<string, unknown>;\n\n constructor(data: OrchestrationErrorData) {\n super(data.message);\n this.name = 'OrchestrationError';\n this.code = data.code;\n this.retryable = data.retryable;\n this.retryAfterMs = data.retryAfterMs;\n this.reason = data.reason;\n this.details = data.details;\n }\n\n toJSON(): OrchestrationErrorData {\n return {\n code: this.code,\n message: this.message,\n retryable: this.retryable,\n retryAfterMs: this.retryAfterMs,\n reason: this.reason,\n details: this.details,\n };\n }\n}\n\nexport function isOrchestrationError(error: unknown): error is OrchestrationError {\n return error instanceof OrchestrationError;\n}\n\nexport function toOrchestrationErrorData(\n error: unknown,\n fallback: Pick<OrchestrationErrorData, 'code' | 'retryable'> = {\n code: 'INTERNAL',\n retryable: false,\n },\n): OrchestrationErrorData {\n if (isOrchestrationError(error)) return error.toJSON();\n return {\n ...fallback,\n message: error instanceof Error ? error.message : String(error),\n };\n}\n","import type { OrchestrationObjectMetadata, OrchestrationOwnerReference, OrchestrationResourceManifest, OrchestrationResourceStatus, OrchestrationTypeMeta } from './client.js';\nimport type { OrchestrationErrorData } from './errors.js';\n\nexport const AGENT_WORKLOAD_API_VERSION = 'workload.memeloop.io/v1alpha1';\nexport const AGENT_WORKLOAD_KIND = 'AgentWorkload';\n\nexport const AGENT_RUN_API_VERSION = 'run.memeloop.io/v1alpha1';\nexport const AGENT_RUN_KIND = 'AgentRun';\n\n/**\n * Host-asserted trust classification of a node or workload. The trust class\n * is bound by the host; it is never self-reported by the workload, the model,\n * or a `.mjs` script.\n */\nexport type NodeTrustClass = 'trusted' | 'restricted' | 'quarantine';\n\nexport type AgentTrustLevel = NodeTrustClass;\n\n/** Ordered data classifications; higher ranks are more sensitive. */\nexport type DataClassification = 'public' | 'internal' | 'confidential' | 'restricted';\n\nexport type ToolAdmissionAction = 'allow' | 'deny' | 'require-approval';\n\n/**\n * Declarative trusted-admission rule. Rules are evaluated in order; the first\n * matching rule wins (firewall semantics). A rule matches when `toolPattern`\n * matches the tool reference name and either `effects` is omitted (all\n * effects) or contains the operation effect.\n */\nexport interface ToolAdmissionRule {\n toolPattern: string;\n effects?: ToolOperationEffect[];\n action: ToolAdmissionAction;\n reason?: string;\n}\n\nexport interface ToolAdmissionPolicy {\n /** Applied when no rule matches. Restricted/quarantine profiles resolve to `deny` regardless of this field. */\n defaultAction: ToolAdmissionAction;\n rules?: ToolAdmissionRule[];\n}\n\nexport interface AgentWorkloadModelPolicy {\n modelClass?: string;\n allowedModelNames?: string[];\n budget?: {\n maxTokens?: number;\n maxCost?: number;\n };\n}\n\nexport interface AgentWorkloadToolPolicy {\n allowedToolClasses?: string[];\n /** Tool classes that must have a healthy executor on the selected node. */\n requiredToolClasses?: string[];\n allowedToolIds?: string[];\n defaultAction?: 'allow' | 'ask' | 'deny';\n rules?: Array<{ pattern: string; action: 'allow' | 'ask' | 'deny' }>;\n}\n\nexport interface AgentWorkloadNetworkPolicy {\n networkClass?: string;\n egress?: 'none' | 'same-node' | 'restricted' | 'open';\n /** Minimum boundary that must enforce this policy before the workload binds. */\n minimumEnforcement?: 'none' | 'process' | 'namespace' | 'host' | 'external';\n}\n\nexport interface AgentWorkloadVolumeClaim {\n name: string;\n claimRef: string;\n}\n\nexport interface AgentWorkloadStoragePolicy {\n storageClass?: string;\n volumes?: AgentWorkloadVolumeClaim[];\n}\n\nexport interface AgentWorkloadCredentialPolicy {\n /** Credential broker class required on the selected node. */\n brokerClass?: string;\n /** Audiences for which the node must be able to request scoped grants. */\n audiences?: string[];\n /** Target classes for which scoped grants may be issued. */\n targets?: string[];\n}\n\nexport interface AgentWorkloadResourceRequirements {\n cpuMillicores?: number;\n memoryBytes?: number;\n gpuCount?: number;\n diskBytes?: number;\n bandwidthKbps?: number;\n}\n\nexport interface AgentWorkloadPlacement {\n /**\n * Registered external-orchestrator driver name. When set, the external\n * orchestration controller owns placement and the local node binder skips\n * this workload. External placement is always explicit; there is no silent\n * spillover from the local runtime.\n */\n orchestrator?: string;\n nodeSelector?: Record<string, string>;\n requiredNode?: string;\n antiAffinity?: string[];\n /** Soft co-location preference; never overrides a hard security filter. */\n preferredNode?: string;\n /** Taints the workload tolerates. Nodes with taints not listed here are filtered out. */\n tolerations?: string[];\n /**\n * Maximum data classification the workload may carry. Nodes with a lower\n * `maxDataClassification` than the workload's effective classification are\n * filtered out. Quarantine nodes are always treated as `public`-only.\n */\n dataClassification?: DataClassification;\n /** Allowed residency labels (for example `local`, `cn`, or `eu-west`). */\n dataResidency?: string[];\n /** Require a currently verified node attestation. */\n requireAttestation?: boolean;\n /** Fleet batch constraints enforced before a target binds. */\n rollout?: {\n batchId: string;\n excludedFaultDomains?: string[];\n maxConcurrentPerFaultDomain?: number;\n };\n}\n\nexport type AgentWorkloadCompletionPolicy = 'complete' | 'detach' | 'daemon';\n\nexport interface AgentWorkloadSpec {\n profileId?: string;\n scriptReference?: string;\n promptReference?: string;\n trust?: AgentTrustLevel;\n /** RuntimeClass selected for script workloads (plan 24.18); declarative only. */\n runtimeClass?: string;\n /**\n * Non-secret environment variables for the workload (plan 24.14 `env`).\n * Secret-shaped values are rejected at admission (deployGeneratedScript)\n * and stripped again at launch (plan 24.35), so specs persisted in the\n * ControlStore never carry provider keys.\n */\n env?: Record<string, string>;\n /** Name of a SecurityProfile resource governing admission and model access. */\n securityProfileRef?: string;\n placement?: AgentWorkloadPlacement;\n modelPolicy?: AgentWorkloadModelPolicy;\n toolPolicy?: AgentWorkloadToolPolicy;\n networkPolicy?: AgentWorkloadNetworkPolicy;\n storagePolicy?: AgentWorkloadStoragePolicy;\n credentialPolicy?: AgentWorkloadCredentialPolicy;\n resources?: AgentWorkloadResourceRequirements;\n /** Content-addressed artifacts whose locality may influence placement. */\n artifactReferences?: string[];\n /** Durable checkpoint whose locality may influence placement. */\n checkpointReference?: string;\n completionPolicy?: AgentWorkloadCompletionPolicy;\n ownerReferences?: OrchestrationOwnerReference[];\n}\n\nexport interface AgentWorkloadStatus extends OrchestrationResourceStatus {\n phase?: 'Pending' | 'Scheduling' | 'Running' | 'Completed' | 'Failed';\n /** Node the binding controller scheduled this workload onto. */\n assignedNode?: string;\n /** Durable trusted policy decision that authorized the current binding. */\n placementDecisionRef?: string;\n /** Policy snapshot digest bound to placementDecisionRef. */\n placementPolicyDigest?: string;\n /** External driver selected for this workload, when any. */\n assignedDriver?: string;\n /** Opaque native workload identifier returned by the external driver. */\n externalId?: string;\n /** Non-secret, string-only backend metadata used for diagnostics/adoption. */\n externalMetadata?: Record<string, string>;\n runs?: Array<{\n apiVersion: string;\n kind: string;\n name?: string;\n namespace?: string;\n uid?: string;\n }>;\n lastRunResult?: string;\n}\n\nexport interface AgentWorkloadCondition {\n type: string;\n status: 'True' | 'False' | 'Unknown';\n}\n\nexport type AgentWorkloadManifest = OrchestrationResourceManifest<AgentWorkloadSpec>;\n\nexport interface AgentWorkloadResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: AgentWorkloadSpec;\n status?: AgentWorkloadStatus;\n}\n\nexport interface AgentRunSpec {\n workloadRef: {\n apiVersion: string;\n kind: string;\n name?: string;\n namespace?: string;\n uid?: string;\n };\n promptReference?: string;\n retry?: number;\n timeoutMs?: number;\n}\n\nexport interface AgentRunStatus extends OrchestrationResourceStatus {\n phase?: 'Pending' | 'Starting' | 'Running' | 'Completed' | 'Failed' | 'Cancelled';\n /**\n * Durable claim written before invoking a LoopRuntimeDriver. A different\n * daemon instance that observes Starting/Running must adopt through a\n * managed driver or fail UNKNOWN_EFFECT; it must never blindly start again.\n */\n runtimeExecutionClaim?: {\n controllerInstanceId: string;\n claimedAt: string;\n };\n /** Independently selected serving endpoint for this run's model calls. */\n assignedModelEndpoint?: {\n apiVersion: string;\n kind: string;\n name: string;\n namespace?: string;\n uid: string;\n };\n /** Fences the model binding decision to the controller leadership epoch. */\n modelBinding?: {\n leaseEpoch: string;\n endpointResourceVersion: string;\n boundAt: string;\n };\n /** NetworkAttachment that must reach Attached before this run starts. */\n networkAttachmentRef?: {\n apiVersion: string;\n kind: string;\n name: string;\n namespace?: string;\n uid: string;\n };\n volumePhase?: 'Pending' | 'Publishing' | 'Ready' | 'Releasing' | 'Released' | 'Failed';\n volumePublishClaim?: {\n leaseEpoch: string;\n claimedAt: string;\n };\n volumeBindings?: Array<{\n name: string;\n claimRef: { name: string; uid: string };\n volumeRef: { name: string; uid: string };\n assignedDriver: string;\n assignedNode: string;\n /** Managed node-stage handle used for ordered publish cleanup. */\n stageHandle?: string;\n publishHandle: string;\n readOnly: boolean;\n }>;\n volumeReleaseRequestedAt?: string;\n volumeError?: OrchestrationErrorData;\n outputReference?: string;\n summary?: string;\n exitCode?: number;\n}\n\nexport interface AgentRunCondition {\n type: string;\n status: 'True' | 'False' | 'Unknown';\n}\n\nexport type AgentRunManifest = OrchestrationResourceManifest<AgentRunSpec>;\n\nexport interface AgentRunResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: AgentRunSpec;\n status?: AgentRunStatus;\n}\n\nexport function createAgentWorkloadManifest(name: string, spec: AgentWorkloadSpec): AgentWorkloadManifest {\n return {\n apiVersion: AGENT_WORKLOAD_API_VERSION,\n kind: AGENT_WORKLOAD_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function createAgentRunManifest(name: string, spec: AgentRunSpec): AgentRunManifest {\n return {\n apiVersion: AGENT_RUN_API_VERSION,\n kind: AGENT_RUN_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function isAgentWorkload(resource: { apiVersion?: string; kind?: string }): resource is AgentWorkloadResource {\n return resource.apiVersion === AGENT_WORKLOAD_API_VERSION && resource.kind === AGENT_WORKLOAD_KIND;\n}\n\nexport function isAgentRun(resource: { apiVersion?: string; kind?: string }): resource is AgentRunResource {\n return resource.apiVersion === AGENT_RUN_API_VERSION && resource.kind === AGENT_RUN_KIND;\n}\n\nexport function agentWorkloadReference(name: string, namespace?: string): {\n apiVersion: string;\n kind: string;\n name: string;\n namespace?: string;\n} {\n return {\n apiVersion: AGENT_WORKLOAD_API_VERSION,\n kind: AGENT_WORKLOAD_KIND,\n name,\n namespace,\n };\n}\n\nexport const TOOL_OPERATION_API_VERSION = 'execution.memeloop.io/v1alpha1';\nexport const TOOL_OPERATION_KIND = 'ToolOperation';\n\nexport type ToolOperationEffect = 'read' | 'create' | 'update' | 'delete' | 'execute' | 'unknown';\n\nexport interface ToolOperationToolReference {\n apiVersion?: string;\n kind: string;\n name: string;\n namespace?: string;\n /** Expected input/output schema digest; executors with another digest are rejected. */\n schemaDigest?: string;\n}\n\nexport interface ToolOperationRetryPolicy {\n maxAttempts?: number;\n nonRetryable?: boolean;\n fencingToken?: string;\n}\n\nexport interface ToolOperationPolicy {\n requireApproval?: boolean;\n auditLevel?: 'none' | 'metadata' | 'payload';\n}\n\nexport interface ToolOperationSpec {\n toolRef: ToolOperationToolReference;\n arguments?: Record<string, unknown>;\n effect: ToolOperationEffect;\n idempotencyKey?: string;\n timeoutMs?: number;\n retry?: ToolOperationRetryPolicy;\n policy?: ToolOperationPolicy;\n /** Explicit registered external-orchestrator driver selection. */\n placement?: {\n orchestrator?: string;\n requiredNode?: string;\n preferredNode?: string;\n nodeSelector?: Record<string, string>;\n minimumTrust?: NodeTrustClass;\n };\n}\n\nexport interface ToolOperationResult {\n value?: unknown;\n error?: OrchestrationErrorData;\n evidenceRef?: string;\n}\n\nexport interface ToolOperationApprovalEvidence {\n approvalId: string;\n decision: 'allow' | 'deny';\n /** Trusted human/service identity. Model-provided identities are invalid. */\n actor: string;\n decidedAt: string;\n reason?: string;\n}\n\nexport interface ToolOperationStatus extends OrchestrationResourceStatus {\n phase?: 'Pending' | 'Running' | 'Completed' | 'Failed' | 'Cancelled';\n result?: ToolOperationResult;\n attempts?: number;\n startedAt?: string;\n completedAt?: string;\n /** Trusted approval evidence returned by the host-bound approval driver. */\n approval?: ToolOperationApprovalEvidence;\n assignedDriver?: string;\n assignedNode?: string;\n assignedExecutor?: {\n apiVersion: string;\n kind: string;\n name: string;\n namespace?: string;\n uid?: string;\n };\n /**\n * Durable claim written before a local effect starts. A different fencing\n * epoch observing Running must reconcile unknown effect instead of blindly\n * repeating the operation.\n */\n executionClaim?: {\n leaseEpoch: string;\n claimedAt: string;\n };\n externalId?: string;\n externalMetadata?: Record<string, string>;\n}\n\nexport type ToolOperationManifest = OrchestrationResourceManifest<ToolOperationSpec>;\n\nexport interface ToolOperationResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: ToolOperationSpec;\n status?: ToolOperationStatus;\n}\n\nexport function createToolOperationManifest(name: string, spec: ToolOperationSpec): ToolOperationManifest {\n return {\n apiVersion: TOOL_OPERATION_API_VERSION,\n kind: TOOL_OPERATION_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function isToolOperation(resource: { apiVersion?: string; kind?: string }): resource is ToolOperationResource {\n return resource.apiVersion === TOOL_OPERATION_API_VERSION && resource.kind === TOOL_OPERATION_KIND;\n}\n\nexport function agentRunReference(name: string, namespace?: string): {\n apiVersion: string;\n kind: string;\n name: string;\n namespace?: string;\n} {\n return {\n apiVersion: AGENT_RUN_API_VERSION,\n kind: AGENT_RUN_KIND,\n name,\n namespace,\n };\n}\n\nexport const TOOL_CLASS_API_VERSION = 'tool.memeloop.io/v1alpha1';\nexport const TOOL_CLASS_KIND = 'ToolClass';\n\nexport const TOOL_EXECUTOR_API_VERSION = 'tool.memeloop.io/v1alpha1';\nexport const TOOL_EXECUTOR_KIND = 'ToolExecutor';\n\nexport type ToolRiskLevel = 'none' | 'low' | 'medium' | 'high' | 'critical';\n\nexport interface ToolClassSchema {\n input: Record<string, unknown>;\n output?: Record<string, unknown>;\n required?: string[];\n}\n\nexport interface ToolClassSpec {\n description?: string;\n version?: string;\n schema: ToolClassSchema;\n schemaDigest?: string;\n risk?: ToolRiskLevel;\n effects?: ToolOperationEffect[];\n allowedTargets?: string[];\n categories?: string[];\n}\n\nexport interface ToolClassStatus extends OrchestrationResourceStatus {\n endpointCount?: number;\n healthyEndpointCount?: number;\n}\n\nexport type ToolClassManifest = OrchestrationResourceManifest<ToolClassSpec>;\n\nexport interface ToolClassResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: ToolClassSpec;\n status?: ToolClassStatus;\n}\n\nexport interface ToolExecutorCapability {\n toolClassRef: {\n apiVersion: string;\n kind: string;\n name: string;\n };\n schemaDigest: string;\n effects?: ToolOperationEffect[];\n endpoint: string;\n capacity?: {\n maxConcurrent?: number;\n queueDepth?: number;\n };\n health?: {\n lastHeartbeat?: string;\n healthy: boolean;\n };\n}\n\nexport interface ToolExecutorSpec {\n nodeId?: string;\n selectors?: Record<string, string>;\n capabilities: ToolExecutorCapability[];\n trust?: 'trusted' | 'restricted' | 'quarantine';\n}\n\nexport interface ToolExecutorStatus extends OrchestrationResourceStatus {\n heartbeat?: string;\n healthy?: boolean;\n}\n\nexport type ToolExecutorManifest = OrchestrationResourceManifest<ToolExecutorSpec>;\n\nexport interface ToolExecutorResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: ToolExecutorSpec;\n status?: ToolExecutorStatus;\n}\n\nexport function createToolClassManifest(name: string, spec: ToolClassSpec): ToolClassManifest {\n return {\n apiVersion: TOOL_CLASS_API_VERSION,\n kind: TOOL_CLASS_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function createToolExecutorManifest(name: string, spec: ToolExecutorSpec): ToolExecutorManifest {\n return {\n apiVersion: TOOL_EXECUTOR_API_VERSION,\n kind: TOOL_EXECUTOR_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function isToolClass(resource: { apiVersion?: string; kind?: string }): resource is ToolClassResource {\n return resource.apiVersion === TOOL_CLASS_API_VERSION && resource.kind === TOOL_CLASS_KIND;\n}\n\nexport function isToolExecutor(resource: { apiVersion?: string; kind?: string }): resource is ToolExecutorResource {\n return resource.apiVersion === TOOL_EXECUTOR_API_VERSION && resource.kind === TOOL_EXECUTOR_KIND;\n}\n\nexport const MODEL_CLASS_API_VERSION = 'models.memeloop.io/v1alpha1';\nexport const MODEL_CLASS_KIND = 'ModelClass';\n\nexport const MODEL_ENDPOINT_API_VERSION = 'models.memeloop.io/v1alpha1';\nexport const MODEL_ENDPOINT_KIND = 'ModelEndpoint';\n\nexport const MODEL_CALL_RECORD_API_VERSION = 'models.memeloop.io/v1alpha1';\nexport const MODEL_CALL_RECORD_KIND = 'ModelCallRecord';\n\nexport type ModelModality = 'text' | 'vision' | 'audio' | 'embedding';\n\nexport interface ModelClassCapabilities {\n streaming?: boolean;\n toolUse?: boolean;\n jsonMode?: boolean;\n systemPrompt?: boolean;\n}\n\n/**\n * Declarative model catalog entry. Carries identity, digest, capabilities,\n * residency, and cost metadata only — raw provider SDK clients, base URLs with\n * embedded credentials, and API keys must never appear here.\n */\nexport interface ModelClassSpec {\n description?: string;\n /** Provider family identifier, e.g. `openai`, `anthropic`, `ollama`. */\n provider: string;\n /** Provider model name, e.g. `gpt-4o-mini`, `qwen2.5:7b`. */\n model: string;\n version?: string;\n /** Content digest: local weights hash or provider snapshot identifier. */\n digest?: string;\n modalities?: ModelModality[];\n contextWindow?: number;\n maxOutputTokens?: number;\n capabilities?: ModelClassCapabilities;\n /** `local`, `cloud`, or a region/zone label constraining data residency. */\n dataResidency?: string;\n cost?: {\n inputPerMillion?: number;\n outputPerMillion?: number;\n currency?: string;\n };\n}\n\nexport interface ModelClassStatus extends OrchestrationResourceStatus {\n endpointCount?: number;\n healthyEndpointCount?: number;\n}\n\nexport type ModelClassManifest = OrchestrationResourceManifest<ModelClassSpec>;\n\nexport interface ModelClassResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: ModelClassSpec;\n status?: ModelClassStatus;\n}\n\n/**\n * Schedulable model serving endpoint. The endpoint string is an opaque driver\n * handle (e.g. `ollama://node-1/qwen2.5:7b` or `gateway://default`) and must\n * not embed credentials.\n */\nexport interface ModelEndpointSpec {\n modelClassRef: {\n apiVersion: string;\n kind: string;\n name: string;\n };\n /** Must match the referenced ModelClass digest for schedulability. */\n modelDigest?: string;\n nodeId?: string;\n trust?: 'trusted' | 'restricted' | 'quarantine';\n endpoint: string;\n capacity?: {\n maxConcurrent?: number;\n tokensPerMinute?: number;\n };\n dataPolicy?: {\n classification?: string;\n retention?: string;\n };\n}\n\nexport interface ModelEndpointStatus extends OrchestrationResourceStatus {\n healthy?: boolean;\n heartbeat?: string;\n activeCalls?: number;\n}\n\nexport type ModelEndpointManifest = OrchestrationResourceManifest<ModelEndpointSpec>;\n\nexport interface ModelEndpointResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: ModelEndpointSpec;\n status?: ModelEndpointStatus;\n}\n\n/**\n * Audit and usage record for a single model call. Records carry usage and\n * classification metadata, never raw prompts, completions, or credentials.\n */\nexport interface ModelCallRecordSpec {\n modelClassRef: {\n apiVersion: string;\n kind: string;\n name: string;\n };\n /** Immutable model artifact/provider snapshot selected for this call. */\n modelDigest?: string;\n endpointRef?: {\n apiVersion: string;\n kind: string;\n name: string;\n };\n runRef?: OrchestrationOwnerReference;\n /** Immutable attempt number from the authorizing ModelAccessHandle. */\n runAttempt?: number;\n /** Bound actor identity asserted by the host, not self-reported. */\n caller?: string;\n /** Name of the ModelAccessHandle authorizing this call. */\n accessHandleRef?: string;\n /** Admission/policy snapshot bound into the authorizing handle. */\n policyDigest?: string;\n inputClassification?: string;\n outputClassification?: string;\n}\n\nexport interface ModelCallRecordStatus extends OrchestrationResourceStatus {\n phase?: 'Running' | 'Completed' | 'Failed' | 'Cancelled';\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n cost?: number;\n currency?: string;\n };\n latencyMs?: number;\n startedAt?: string;\n completedAt?: string;\n error?: OrchestrationErrorData;\n}\n\nexport type ModelCallRecordManifest = OrchestrationResourceManifest<ModelCallRecordSpec>;\n\nexport interface ModelCallRecordResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: ModelCallRecordSpec;\n status?: ModelCallRecordStatus;\n}\n\nexport function createModelClassManifest(name: string, spec: ModelClassSpec): ModelClassManifest {\n return {\n apiVersion: MODEL_CLASS_API_VERSION,\n kind: MODEL_CLASS_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function createModelEndpointManifest(name: string, spec: ModelEndpointSpec): ModelEndpointManifest {\n return {\n apiVersion: MODEL_ENDPOINT_API_VERSION,\n kind: MODEL_ENDPOINT_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function createModelCallRecordManifest(name: string, spec: ModelCallRecordSpec): ModelCallRecordManifest {\n return {\n apiVersion: MODEL_CALL_RECORD_API_VERSION,\n kind: MODEL_CALL_RECORD_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function isModelClass(resource: { apiVersion?: string; kind?: string }): resource is ModelClassResource {\n return resource.apiVersion === MODEL_CLASS_API_VERSION && resource.kind === MODEL_CLASS_KIND;\n}\n\nexport function isModelEndpoint(resource: { apiVersion?: string; kind?: string }): resource is ModelEndpointResource {\n return resource.apiVersion === MODEL_ENDPOINT_API_VERSION && resource.kind === MODEL_ENDPOINT_KIND;\n}\n\nexport function isModelCallRecord(resource: { apiVersion?: string; kind?: string }): resource is ModelCallRecordResource {\n return resource.apiVersion === MODEL_CALL_RECORD_API_VERSION && resource.kind === MODEL_CALL_RECORD_KIND;\n}\n\nexport const SECURITY_PROFILE_API_VERSION = 'security.memeloop.io/v1alpha1';\nexport const SECURITY_PROFILE_KIND = 'SecurityProfile';\n\n/**\n * Reusable security posture referenced by workloads. The profile is applied\n * by trusted admission, never by the workload itself: for restricted and\n * quarantine trust classes the resolved tool-admission default is forced to\n * `deny` regardless of `toolAdmission.defaultAction`.\n */\nexport interface SecurityProfileSpec {\n description?: string;\n /** Trust class this profile applies to. */\n trustClass: NodeTrustClass;\n /** Tool admission overlay merged over the trust-class default policy. */\n toolAdmission?: ToolAdmissionPolicy;\n /** Model access constraints for workloads under this profile. */\n modelPolicy?: {\n allowedModelClasses?: string[];\n maxInputClassification?: DataClassification;\n };\n}\n\nexport interface SecurityProfileStatus extends OrchestrationResourceStatus {\n /** Number of workloads currently referencing this profile. */\n workloadCount?: number;\n}\n\nexport type SecurityProfileManifest = OrchestrationResourceManifest<SecurityProfileSpec>;\n\nexport interface SecurityProfileResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: SecurityProfileSpec;\n status?: SecurityProfileStatus;\n}\n\nexport function createSecurityProfileManifest(name: string, spec: SecurityProfileSpec): SecurityProfileManifest {\n return {\n apiVersion: SECURITY_PROFILE_API_VERSION,\n kind: SECURITY_PROFILE_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function isSecurityProfile(resource: { apiVersion?: string; kind?: string }): resource is SecurityProfileResource {\n return resource.apiVersion === SECURITY_PROFILE_API_VERSION && resource.kind === SECURITY_PROFILE_KIND;\n}\n\nexport const POLICY_DECISION_API_VERSION = 'security.memeloop.io/v1alpha1';\nexport const POLICY_DECISION_KIND = 'PolicyDecision';\n\nexport type PersistedPolicyDecisionKind =\n | 'resource-admission'\n | 'placement'\n | 'tool-operation'\n | 'approval'\n | 'transition';\n\n/** Immutable decision evidence; only a pending approval's status may resolve. */\nexport interface PolicyDecisionSpec {\n subjectRef: {\n apiVersion: string;\n kind: string;\n name: string;\n namespace?: string;\n uid: string;\n generation: number;\n };\n decisionKind: PersistedPolicyDecisionKind;\n policyDigest: string;\n inputDigest: string;\n requestFingerprint: string;\n idempotencyKey: string;\n fencingEpoch: number;\n requestedBy: string;\n reasons: string[];\n obligations: string[];\n decidedAt: string;\n initialOutcome: 'allow' | 'deny' | 'pending';\n approval?: {\n subjectDigest: string;\n requestedBy: string;\n requestedAt: string;\n expiresAt: string;\n };\n}\n\nexport interface PolicyDecisionStatus extends OrchestrationResourceStatus {\n outcome: 'allow' | 'deny' | 'pending';\n decidedBy: string;\n decidedAt: string;\n reasons: string[];\n resolutionInputDigest?: string;\n}\n\nexport type PolicyDecisionManifest = OrchestrationResourceManifest<PolicyDecisionSpec>;\n\nexport interface PolicyDecisionResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: PolicyDecisionSpec;\n status?: PolicyDecisionStatus;\n}\n\nexport function createPolicyDecisionManifest(\n name: string,\n spec: PolicyDecisionSpec,\n): PolicyDecisionManifest {\n return {\n apiVersion: POLICY_DECISION_API_VERSION,\n kind: POLICY_DECISION_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function isPolicyDecision(\n resource: { apiVersion?: string; kind?: string },\n): resource is PolicyDecisionResource {\n return resource.apiVersion === POLICY_DECISION_API_VERSION &&\n resource.kind === POLICY_DECISION_KIND;\n}\n\nexport const AUDIT_RECORD_API_VERSION = 'audit.memeloop.io/v1alpha1';\nexport const AUDIT_RECORD_KIND = 'AuditRecord';\n\n/**\n * Immutable, metadata-only audit/telemetry evidence. The record digest covers\n * every field except itself and links to the preceding record in the named\n * stream. Raw request/response bodies and credentials have no representation.\n */\nexport interface AuditRecordSpec {\n stream: string;\n sequence: number;\n resourceUid: string;\n recordKind: 'audit' | 'event' | 'metric' | 'trace';\n receivedAt: string;\n actor: {\n id: string;\n kind: 'controller' | 'verifier' | 'admin';\n };\n policyDigest: string;\n capabilityDigest: string;\n effect: 'read' | 'create' | 'update' | 'delete' | 'execute' | 'decision' | 'security';\n provenance: {\n source: 'controller' | 'gateway' | 'driver' | 'worker' | 'operator';\n producer: string;\n subject?: string;\n };\n attributes: Record<string, string>;\n data:\n | {\n kind: 'audit';\n action: string;\n outcome: 'success' | 'denied' | 'failure';\n reasonCode?: string;\n }\n | {\n kind: 'event';\n name: string;\n severity: 'debug' | 'info' | 'warning' | 'error' | 'critical';\n }\n | {\n kind: 'metric';\n name: string;\n value: number;\n unit: string;\n }\n | {\n kind: 'trace';\n name: string;\n traceId: string;\n spanId: string;\n durationMs: number;\n status: 'ok' | 'error';\n };\n previousDigest?: string;\n recordDigest: string;\n requestFingerprint: string;\n idempotencyDigest: string;\n fencingEpoch: number;\n}\n\nexport type AuditRecordManifest = OrchestrationResourceManifest<AuditRecordSpec>;\n\nexport interface AuditRecordResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: AuditRecordSpec;\n status?: OrchestrationResourceStatus;\n}\n\nexport function createAuditRecordManifest(\n name: string,\n spec: AuditRecordSpec,\n): AuditRecordManifest {\n return {\n apiVersion: AUDIT_RECORD_API_VERSION,\n kind: AUDIT_RECORD_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function isAuditRecord(\n resource: { apiVersion?: string; kind?: string },\n): resource is AuditRecordResource {\n return resource.apiVersion === AUDIT_RECORD_API_VERSION &&\n resource.kind === AUDIT_RECORD_KIND;\n}\n\nexport const NETWORK_CLASS_API_VERSION = 'network.memeloop.io/v1alpha1';\nexport const NETWORK_CLASS_KIND = 'NetworkClass';\n\nexport const NETWORK_ATTACHMENT_API_VERSION = 'network.memeloop.io/v1alpha1';\nexport const NETWORK_ATTACHMENT_KIND = 'NetworkAttachment';\n\nexport interface NetworkEgressRule {\n /** Host, domain suffix, or CIDR, e.g. `api.openai.com` or `10.0.0.0/8`. */\n target: string;\n ports?: number[];\n protocol?: 'tcp' | 'udp' | 'http' | 'https' | 'any';\n action: 'allow' | 'deny';\n}\n\n/**\n * CNI-like network desired state. `enforcement: required` means the workload\n * must not start unless the driver can enforce every configured feature;\n * `best-effort` allows partial enforcement with recorded degradation.\n */\nexport interface NetworkClassSpec {\n description?: string;\n /** NetworkDriver name responsible for this class. */\n driver: string;\n dns?: {\n policy?: 'default' | 'none' | 'custom';\n servers?: string[];\n searchDomains?: string[];\n };\n proxy?: {\n httpProxy?: string;\n httpsProxy?: string;\n noProxy?: string[];\n /** When true, traffic bypassing the proxy must be blocked. */\n mandatory?: boolean;\n };\n ingress?: {\n defaultAction?: 'allow' | 'deny';\n allow?: Array<{\n from?: string;\n ports?: number[];\n }>;\n };\n egress?: {\n defaultAction: 'allow' | 'deny';\n rules?: NetworkEgressRule[];\n };\n serviceAccess?: {\n allowControlPlane?: boolean;\n allowClusterServices?: boolean;\n allowModelGateway?: boolean;\n };\n bandwidth?: {\n ingressKbps?: number;\n egressKbps?: number;\n };\n dataPolicy?: {\n classification?: DataClassification;\n retention?: string;\n };\n enforcement: 'required' | 'best-effort';\n}\n\nexport interface NetworkClassStatus extends OrchestrationResourceStatus {\n attachmentCount?: number;\n}\n\nexport type NetworkClassManifest = OrchestrationResourceManifest<NetworkClassSpec>;\n\nexport interface NetworkClassResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: NetworkClassSpec;\n status?: NetworkClassStatus;\n}\n\nexport interface NetworkAttachmentSpec {\n networkClassRef: {\n apiVersion: string;\n kind: string;\n name: string;\n };\n workloadRef?: OrchestrationOwnerReference;\n /** Exact AgentRun whose sandbox and authority this attachment belongs to. */\n runRef?: OrchestrationOwnerReference;\n nodeId?: string;\n}\n\nexport interface NetworkAttachmentStatus extends OrchestrationResourceStatus {\n phase?: 'Pending' | 'Preparing' | 'Attached' | 'Failed' | 'Detached';\n /** Node and driver selected independently from workload execution. */\n assignedNode?: string;\n assignedDriver?: string;\n /** Fences the placement decision and the NetworkClass version it validated. */\n binding?: {\n leaseEpoch: string;\n networkClassResourceVersion: string;\n boundAt: string;\n };\n /**\n * Durable claim written before prepare() may create host-side state.\n * A new lease epoch must not blindly repeat an unconfirmed prepare.\n */\n executionClaim?: {\n leaseEpoch: string;\n claimedAt: string;\n };\n /** Opaque driver handle; consumers must never parse it. */\n handle?: string;\n addresses?: string[];\n routes?: string[];\n dns?: {\n servers?: string[];\n };\n /** Features the driver could not enforce under a best-effort class. */\n degraded?: string[];\n attachedAt?: string;\n /** Set by the workload owner after execution; the node driver must release before Detached. */\n releaseRequestedAt?: string;\n detachedAt?: string;\n error?: OrchestrationErrorData;\n}\n\nexport type NetworkAttachmentManifest = OrchestrationResourceManifest<NetworkAttachmentSpec>;\n\nexport interface NetworkAttachmentResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: NetworkAttachmentSpec;\n status?: NetworkAttachmentStatus;\n}\n\nexport function createNetworkClassManifest(name: string, spec: NetworkClassSpec): NetworkClassManifest {\n return {\n apiVersion: NETWORK_CLASS_API_VERSION,\n kind: NETWORK_CLASS_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function createNetworkAttachmentManifest(name: string, spec: NetworkAttachmentSpec): NetworkAttachmentManifest {\n return {\n apiVersion: NETWORK_ATTACHMENT_API_VERSION,\n kind: NETWORK_ATTACHMENT_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function isNetworkClass(resource: { apiVersion?: string; kind?: string }): resource is NetworkClassResource {\n return resource.apiVersion === NETWORK_CLASS_API_VERSION && resource.kind === NETWORK_CLASS_KIND;\n}\n\nexport function isNetworkAttachment(resource: { apiVersion?: string; kind?: string }): resource is NetworkAttachmentResource {\n return resource.apiVersion === NETWORK_ATTACHMENT_API_VERSION && resource.kind === NETWORK_ATTACHMENT_KIND;\n}\n\nexport const STORAGE_CLASS_API_VERSION = 'storage.memeloop.io/v1alpha1';\nexport const STORAGE_CLASS_KIND = 'StorageClass';\nexport const VOLUME_CLAIM_API_VERSION = 'storage.memeloop.io/v1alpha1';\nexport const VOLUME_CLAIM_KIND = 'AgentVolumeClaim';\nexport const VOLUME_API_VERSION = 'storage.memeloop.io/v1alpha1';\nexport const VOLUME_KIND = 'AgentVolume';\nexport const SNAPSHOT_API_VERSION = 'storage.memeloop.io/v1alpha1';\nexport const SNAPSHOT_KIND = 'AgentSnapshot';\n\nexport type VolumeAccessMode = 'ReadWriteOnce' | 'ReadOnlyMany' | 'ReadWriteMany';\n\n/** CSI-like storage class: provisioning and replication policy. */\nexport interface StorageClassSpec {\n description?: string;\n /** StorageDriver name responsible for this class. */\n driver: string;\n replication?: {\n /** Desired replica count across fault domains (1 = no replication). */\n factor?: number;\n /** Fault-domain labels replicas must be spread across (e.g. `node`, `zone`). */\n faultDomains?: string[];\n /** Rebuild replicas automatically after loss. */\n autoRebuild?: boolean;\n };\n encryption?: {\n enabled?: boolean;\n /** Reference to a key in the credential domain (never key material). */\n keyRef?: string;\n };\n allowedAccessModes?: VolumeAccessMode[];\n snapshotSupport?: boolean;\n backup?: {\n /** Cron-like schedule expression evaluated by the backup controller. */\n schedule?: string;\n retentionCount?: number;\n };\n dataPolicy?: {\n classification?: DataClassification;\n retention?: string;\n };\n}\n\nexport interface StorageClassStatus extends OrchestrationResourceStatus {\n volumeCount?: number;\n healthyVolumeCount?: number;\n}\n\nexport type StorageClassManifest = OrchestrationResourceManifest<StorageClassSpec>;\n\nexport interface StorageClassResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: StorageClassSpec;\n status?: StorageClassStatus;\n}\n\n/** PVC-like claim: a workload's request for storage. */\nexport interface AgentVolumeClaimSpec {\n storageClassRef: {\n apiVersion: string;\n kind: string;\n name: string;\n };\n accessMode: VolumeAccessMode;\n sizeBytes?: number;\n selector?: Record<string, string>;\n /** Restore from a snapshot when provisioning. */\n dataSourceRef?: {\n apiVersion: string;\n kind: string;\n name: string;\n };\n}\n\nexport interface AgentVolumeClaimStatus extends OrchestrationResourceStatus {\n phase?: 'Pending' | 'Provisioning' | 'Bound' | 'Lost' | 'Failed';\n assignedNode?: string;\n assignedDriver?: string;\n binding?: {\n leaseEpoch: string;\n storageClassResourceVersion: string;\n boundAt: string;\n };\n provisionClaim?: {\n leaseEpoch: string;\n claimedAt: string;\n };\n volumeRef?: {\n apiVersion: string;\n kind: string;\n name: string;\n uid?: string;\n };\n error?: OrchestrationErrorData;\n}\n\nexport type AgentVolumeClaimManifest = OrchestrationResourceManifest<AgentVolumeClaimSpec>;\n\nexport interface AgentVolumeClaimResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: AgentVolumeClaimSpec;\n status?: AgentVolumeClaimStatus;\n}\n\nexport interface AgentVolumeReplicaStatus {\n nodeId: string;\n state: 'healthy' | 'degraded' | 'rebuilding' | 'offline';\n /** Verified content hash of this replica (must equal the volume contentHash). */\n contentHash?: string;\n updatedAt?: string;\n}\n\n/** PV-like provisioned volume. `driverHandle` is opaque and never parsed by consumers. */\nexport interface AgentVolumeSpec {\n storageClassRef: {\n apiVersion: string;\n kind: string;\n name: string;\n };\n claimRef?: OrchestrationOwnerReference;\n /** Opaque driver handle for the provisioned volume. */\n driverHandle: string;\n capacityBytes?: number;\n topology?: {\n nodeId?: string;\n zone?: string;\n };\n accessModes?: VolumeAccessMode[];\n}\n\nexport interface AgentVolumeStatus extends OrchestrationResourceStatus {\n phase?: 'Pending' | 'Available' | 'Bound' | 'Published' | 'Failed';\n replicas?: AgentVolumeReplicaStatus[];\n /** Last verified content hash; the replication source of truth. */\n contentHash?: string;\n /** Current primary replica node; transfers originate only from the primary. */\n primaryNodeId?: string;\n /** Monotonically increasing fencing epoch, bumped on every primary change. */\n primaryEpoch?: number;\n publishedTo?: Array<{\n nodeId?: string;\n workloadRef?: OrchestrationOwnerReference;\n }>;\n health?: 'healthy' | 'degraded' | 'rebuilding' | 'failed';\n}\n\nexport type AgentVolumeManifest = OrchestrationResourceManifest<AgentVolumeSpec>;\n\nexport interface AgentVolumeResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: AgentVolumeSpec;\n status?: AgentVolumeStatus;\n}\n\n/** Point-in-time snapshot of a volume; restorable into new claims. */\nexport interface AgentSnapshotSpec {\n sourceVolumeRef: {\n apiVersion: string;\n kind: string;\n name: string;\n };\n snapshotClass?: string;\n}\n\nexport interface AgentSnapshotStatus extends OrchestrationResourceStatus {\n phase?: 'Pending' | 'Ready' | 'Failed';\n readyToUse?: boolean;\n restoreSizeBytes?: number;\n /** Opaque driver handle for the snapshot. */\n driverHandle?: string;\n createdAt?: string;\n}\n\nexport type AgentSnapshotManifest = OrchestrationResourceManifest<AgentSnapshotSpec>;\n\nexport interface AgentSnapshotResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: AgentSnapshotSpec;\n status?: AgentSnapshotStatus;\n}\n\nexport function createStorageClassManifest(name: string, spec: StorageClassSpec): StorageClassManifest {\n return {\n apiVersion: STORAGE_CLASS_API_VERSION,\n kind: STORAGE_CLASS_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function createVolumeClaimManifest(name: string, spec: AgentVolumeClaimSpec): AgentVolumeClaimManifest {\n return {\n apiVersion: VOLUME_CLAIM_API_VERSION,\n kind: VOLUME_CLAIM_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function createVolumeManifest(name: string, spec: AgentVolumeSpec): AgentVolumeManifest {\n return {\n apiVersion: VOLUME_API_VERSION,\n kind: VOLUME_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function createSnapshotManifest(name: string, spec: AgentSnapshotSpec): AgentSnapshotManifest {\n return {\n apiVersion: SNAPSHOT_API_VERSION,\n kind: SNAPSHOT_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function isStorageClass(resource: { apiVersion?: string; kind?: string }): resource is StorageClassResource {\n return resource.apiVersion === STORAGE_CLASS_API_VERSION && resource.kind === STORAGE_CLASS_KIND;\n}\n\nexport function isVolumeClaim(resource: { apiVersion?: string; kind?: string }): resource is AgentVolumeClaimResource {\n return resource.apiVersion === VOLUME_CLAIM_API_VERSION && resource.kind === VOLUME_CLAIM_KIND;\n}\n\nexport function isVolume(resource: { apiVersion?: string; kind?: string }): resource is AgentVolumeResource {\n return resource.apiVersion === VOLUME_API_VERSION && resource.kind === VOLUME_KIND;\n}\n\nexport function isSnapshot(resource: { apiVersion?: string; kind?: string }): resource is AgentSnapshotResource {\n return resource.apiVersion === SNAPSHOT_API_VERSION && resource.kind === SNAPSHOT_KIND;\n}\n\nexport const CREDENTIAL_GRANT_API_VERSION = 'security.memeloop.io/v1alpha1';\nexport const CREDENTIAL_GRANT_KIND = 'CredentialGrant';\n\n/**\n * JIT credential authorization (plan 24.46). The resource records grant\n * metadata only — the opaque handle lives in the credential domain and raw\n * secret material never appears in spec or status.\n */\nexport interface CredentialGrantSpec {\n runRef: {\n apiVersion: string;\n kind: string;\n name: string;\n uid: string;\n };\n attempt: number;\n /** Fingerprint of the worker's ephemeral public key. */\n workerKey: string;\n /** Target system the credential acts on (e.g. `ssh://node-7`, `model:openai/gpt-4o`). */\n target: string;\n /** Operation the credential authorizes (e.g. `exec`, `generate`, `read`). */\n method: string;\n /** Audience the resulting handle is valid for. */\n audience: string;\n policyDigest: string;\n budget?: {\n maxCalls?: number;\n maxCost?: number;\n currency?: string;\n };\n /** Requested TTL in milliseconds; the broker caps it. */\n ttlMs?: number;\n}\n\nexport interface CredentialGrantStatus extends OrchestrationResourceStatus {\n phase?: 'Pending' | 'Issuing' | 'Issued' | 'Renewed' | 'Revoked' | 'Expired' | 'Failed';\n assignedNode?: string;\n assignedBroker?: string;\n binding?: {\n leaseEpoch: string;\n boundAt: string;\n };\n issuanceClaim?: {\n leaseEpoch: string;\n claimedAt: string;\n };\n /** Opaque handle reference in the credential domain — never the handle itself. */\n handleRef?: string;\n issuedAt?: string;\n expiresAt?: string;\n renewedAt?: string;\n revokedAt?: string;\n /** Exposure assessment used to decide post-task rotation. */\n exposure?: 'none' | 'worker-visible' | 'potentially-exposed';\n rotationRequired?: boolean;\n rotationReason?: string;\n error?: OrchestrationErrorData;\n}\n\nexport type CredentialGrantManifest = OrchestrationResourceManifest<CredentialGrantSpec>;\n\nexport interface CredentialGrantResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: CredentialGrantSpec;\n status?: CredentialGrantStatus;\n}\n\nexport function createCredentialGrantManifest(name: string, spec: CredentialGrantSpec): CredentialGrantManifest {\n return {\n apiVersion: CREDENTIAL_GRANT_API_VERSION,\n kind: CREDENTIAL_GRANT_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function isCredentialGrant(resource: { apiVersion?: string; kind?: string }): resource is CredentialGrantResource {\n return resource.apiVersion === CREDENTIAL_GRANT_API_VERSION && resource.kind === CREDENTIAL_GRANT_KIND;\n}\n\nexport const ARTIFACT_RECORD_API_VERSION = 'artifacts.memeloop.io/v1alpha1';\nexport const ARTIFACT_RECORD_KIND = 'ArtifactRecord';\n\nexport type ArtifactTrust = 'trusted' | 'restricted' | 'quarantine' | 'untrusted';\n\nexport type ArtifactDestination = 'prompt' | 'volume' | 'backup' | 'knowledge';\n\nexport type ArtifactReviewKind = 'scan' | 'sanitize' | 'verify';\n\nexport interface ArtifactReviewEvidence {\n kind: ArtifactReviewKind;\n outcome: 'passed' | 'failed';\n reviewer: string;\n contentHash: string;\n policyDigest: string;\n destinations: ArtifactDestination[];\n /** Narrow properties certified by the reviewer; never implies general trust. */\n properties?: string[];\n recordedAt: string;\n}\n\n/**\n * Content-addressed artifact with provenance and trust (plan 24.47). Derived\n * content inherits the lowest trust of its inputs; untrusted or unverified\n * content cannot enter trusted prompts, volumes, backups, or knowledge\n * ingestion without explicit policy and a verifier pass.\n */\nexport interface ArtifactRecordSpec {\n /** Content hash (e.g. `sha256:...`); the storage address. */\n contentHash: string;\n sizeBytes?: number;\n mimeType?: string;\n /** Producing run and its trust at production time. */\n producer?: {\n runRef?: OrchestrationOwnerReference;\n trust: ArtifactTrust;\n };\n /** Parent artifacts this one derives from. */\n parents?: Array<{\n apiVersion: string;\n kind: string;\n name: string;\n }>;\n trust: ArtifactTrust;\n}\n\nexport interface ArtifactRecordStatus extends OrchestrationResourceStatus {\n /** Append-only evidence written only by the trusted artifact review actor. */\n reviews?: ArtifactReviewEvidence[];\n quarantined?: boolean;\n quarantineReason?: string;\n /** Downstream artifact names derived from this one (lineage). */\n derivedBy?: string[];\n}\n\nexport type ArtifactRecordManifest = OrchestrationResourceManifest<ArtifactRecordSpec>;\n\nexport interface ArtifactRecordResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: ArtifactRecordSpec;\n status?: ArtifactRecordStatus;\n}\n\nexport function createArtifactRecordManifest(name: string, spec: ArtifactRecordSpec): ArtifactRecordManifest {\n return {\n apiVersion: ARTIFACT_RECORD_API_VERSION,\n kind: ARTIFACT_RECORD_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function isArtifactRecord(resource: { apiVersion?: string; kind?: string }): resource is ArtifactRecordResource {\n return resource.apiVersion === ARTIFACT_RECORD_API_VERSION && resource.kind === ARTIFACT_RECORD_KIND;\n}\n\n// ─── DriverManifest (drivers.memeloop.io/v1alpha1) ────────────────────\n\nexport const DRIVER_MANIFEST_API_VERSION = 'drivers.memeloop.io/v1alpha1';\nexport const DRIVER_MANIFEST_KIND = 'DriverManifest';\n\nexport type InfrastructureDriverType =\n | 'control-store'\n | 'loop-runtime'\n | 'tool-catalog'\n | 'tool-execution'\n | 'model-provider'\n | 'network'\n | 'storage'\n | 'credential'\n | 'artifact'\n | 'identity-attestation'\n | 'policy-approval'\n | 'audit-telemetry'\n | 'external-orchestrator';\n\nexport type DriverManifestConformance =\n | {\n suiteVersion: string;\n status: 'not-run';\n }\n | {\n suiteVersion: string;\n status: 'failed';\n failedAt: string;\n failure: string;\n }\n | {\n suiteVersion: string;\n status: 'passed';\n passedAt: string;\n /** Content digest of the exact golden fixture/result bundle. */\n fixtureDigest: string;\n };\n\n/**\n * Control-plane representation of a registered driver (plan §11, 24.62).\n * A RuntimeClass/NetworkClass/ModelClass/scheduler can only reference a\n * driver whose manifest is registered and conformance-checked; external\n * orchestrator drivers register through the CLI discovery loader.\n */\nexport interface DriverManifestSpec {\n driverType: InfrastructureDriverType;\n /** Driver package version (from getCapabilities or the package manifest). */\n version: string;\n execution: {\n location: 'controller' | 'node' | 'worker' | 'external';\n transport: 'in-process' | 'stdio' | 'utility-process' | 'http' | 'peer-rpc' | 'container-api' | 'other';\n };\n supportedTrustClasses: NodeTrustClass[];\n resourceKinds: string[];\n capabilities: Record<string, boolean | string | number>;\n downgradeBehavior: 'reject' | 'explicit-degrade';\n requiredHostPrivileges: string[];\n isolation: {\n boundary: 'none' | 'process' | 'namespace' | 'host' | 'external';\n threatAssumptions: string[];\n };\n configuration: {\n /** Stable reference to the schema used to validate non-secret configuration. */\n schemaRef: string;\n /** Names of opaque SecretRef fields; never secret values. */\n secretRefs: string[];\n };\n health: {\n mode: 'method' | 'endpoint';\n endpoint?: string;\n };\n lifecycle: {\n discoverable: boolean;\n hotReload: boolean;\n gracefulShutdown: boolean;\n };\n conformance: DriverManifestConformance;\n supportsCancellation: boolean;\n supportsBackpressure: boolean;\n supportsAdoption: boolean;\n supportsFencing: boolean;\n /** External orchestrators: the resource kinds this driver manages. */\n manages?: Array<'AgentWorkload' | 'ToolOperation'>;\n /** External orchestrators: co-located scheduling support. */\n supportsColocation?: boolean;\n}\n\nexport interface DriverManifestStatus extends OrchestrationResourceStatus {\n phase?: 'Pending' | 'Ready' | 'Failed';\n registeredAt?: string;\n error?: OrchestrationErrorData;\n}\n\nexport type DriverManifestManifest = OrchestrationResourceManifest<DriverManifestSpec>;\n\nexport interface DriverManifestResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: DriverManifestSpec;\n status?: DriverManifestStatus;\n}\n\nexport function createDriverManifestManifest(name: string, spec: DriverManifestSpec): DriverManifestManifest {\n return {\n apiVersion: DRIVER_MANIFEST_API_VERSION,\n kind: DRIVER_MANIFEST_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function isDriverManifest(resource: { apiVersion?: string; kind?: string }): resource is DriverManifestResource {\n return resource.apiVersion === DRIVER_MANIFEST_API_VERSION && resource.kind === DRIVER_MANIFEST_KIND;\n}\n\n/** A class may only select a manifest whose current conformance evidence passed. */\nexport function isDriverManifestAdmitted(resource: DriverManifestResource): boolean {\n return resource.status?.phase === 'Ready' && resource.spec.conformance.status === 'passed';\n}\n","import type { DetailReference } from '../conversation/index.js';\n\n/**\n * Tools may attach this key to their return object so `agentToolLoop` persists\n * `summary` + optional `detailRef` instead of `JSON.stringify` of the whole payload (plan §5.2.1).\n */\nexport const MEMELOOP_STRUCTURED_TOOL_KEY = '__memeloopToolResult' as const;\n\n/** Truncate tool summary for persisted `ChatMessage` / LLM context (plan §5.2.1). */\nexport function truncateToolSummary(s: string, max = 2000): string {\n if (s.length <= max) return s;\n return `${s.slice(0, max - 3)}...`;\n}\n\nexport interface MemeloopStructuredToolPayload {\n /** Short text for the tool message body (≤2000 chars recommended). */\n summary: string;\n detailRef?: DetailReference;\n /**\n * When set, `agentToolLoop` pauses after persisting this tool row until `waitForTerminalSession` resolves\n * (terminal `await` mode, plan §16.4.1).\n */\n awaitSessionId?: string;\n}\n\nexport function extractMemeloopStructuredToolPayload(\n raw: unknown,\n): MemeloopStructuredToolPayload | null {\n if (raw === null || typeof raw !== 'object') return null;\n const o = raw as Record<string, unknown>;\n const payload = o[MEMELOOP_STRUCTURED_TOOL_KEY];\n if (payload === null || typeof payload !== 'object') return null;\n const p = payload as Record<string, unknown>;\n if (typeof p.summary !== 'string' || p.summary.length === 0) return null;\n const awaitSessionId = typeof p.awaitSessionId === 'string' && p.awaitSessionId.length > 0\n ? p.awaitSessionId\n : undefined;\n return {\n summary: p.summary,\n detailRef: p.detailRef as MemeloopStructuredToolPayload['detailRef'],\n awaitSessionId,\n };\n}\n","import { createChatMessage, type DetailReference } from '../../conversation/index.js';\nimport type { AgentOrchestrationClient, OrchestrationResourceReference } from '../../orchestration/client.js';\nimport { reconcileUnknownEffect } from '../../orchestration/drivers/unknownEffect.js';\nimport { OrchestrationError } from '../../orchestration/errors.js';\nimport { createToolOperationManifest, TOOL_OPERATION_API_VERSION, TOOL_OPERATION_KIND, type ToolOperationResource } from '../../orchestration/resources.js';\nimport { TOOL_PARAMETER_PARSE_ERROR_KEY } from '../../promptUtilities/responsePatternUtility.js';\nimport { nextLamportClockForConversation } from '../../storage/nextLamport.js';\nimport { extractMemeloopStructuredToolPayload, truncateToolSummary } from '../../tools/structuredToolResult.js';\nimport type { AgentFrameworkContext } from '../../types.js';\nimport { executeHooks, hasHooks } from '../hooks/registry.js';\n\nimport type { AgentLoopStep } from '../types.js';\nimport type { PendingToolCall } from './toolUseGate.js';\n\ntype ToolRunRow = {\n text: string;\n isError: boolean;\n payload?: unknown;\n detailRef?: DetailReference;\n awaitSessionId?: string;\n};\n\ntype CompletedToolCall = ToolRunRow & { call: PendingToolCall };\n\nconst TOOL_OPERATION_DEFAULT_TIMEOUT_MS = 60_000;\nconst TOOL_OPERATION_POLL_INTERVAL_MS = 250;\n\nlet toolOperationCounter = 0;\nlet toolResultMessageCounter = 0;\n\nfunction isTerminalToolOperationPhase(phase: string | undefined): boolean {\n return phase === 'Completed' || phase === 'Failed' || phase === 'Cancelled';\n}\n\n/** Deterministic stringify (sorted object keys) for stable idempotency keys. */\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== 'object') return JSON.stringify(value) ?? 'undefined';\n if (Array.isArray(value)) return `[${value.map(stableStringify).join(',')}]`;\n const entries = Object.entries(value as Record<string, unknown>)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, item]) => `${JSON.stringify(key)}:${stableStringify(item)}`);\n return `{${entries.join(',')}}`;\n}\n\n/** Browser-safe FNV-1a hash for idempotency keys (not a security primitive). */\nfunction fnv1aHex(input: string): string {\n let hash = 0x81_1c_9d_c5;\n for (let index = 0; index < input.length; index += 1) {\n hash = Math.imul(hash ^ input.charCodeAt(index), 0x01_00_01_93) >>> 0;\n }\n return hash.toString(16).padStart(8, '0');\n}\n\nfunction isTransientGetError(error: unknown): boolean {\n return (\n error instanceof OrchestrationError &&\n (error.code === 'UNAVAILABLE' || error.code === 'TIMEOUT' || error.code === 'INTERNAL')\n );\n}\n\n/**\n * Poll a ToolOperation until terminal. Transient `get` failures are treated\n * as possible unknown-effect situations: reconciliation decides whether to\n * keep waiting (`retry`) or stop and surface the required intervention,\n * never blindly repeating the operation.\n */\nasync function waitForToolOperationTerminal(\n client: AgentOrchestrationClient,\n reference: OrchestrationResourceReference,\n timeoutMs: number,\n applied?: ToolOperationResource,\n): Promise<ToolOperationResource> {\n const deadline = Date.now() + timeoutMs;\n let last: ToolOperationResource | null = applied ?? null;\n while (Date.now() < deadline) {\n let resource: Awaited<ReturnType<AgentOrchestrationClient['get']>> | undefined;\n try {\n resource = await client.get(reference);\n } catch (error) {\n if (!isTransientGetError(error)) throw error;\n const basis = last ?? applied;\n if (!basis) throw error;\n const decision = reconcileUnknownEffect(basis, { resultObserved: false });\n if (decision.action === 'retry') {\n // The operation itself is safe to keep awaiting; do not re-apply.\n } else {\n throw new Error(\n `ToolOperation ${reference.name ?? '<unknown>'} effect unknown after transport failure: ` +\n `${decision.action} — ${decision.reason}`,\n );\n }\n }\n if (resource) {\n last = resource as unknown as ToolOperationResource;\n if (isTerminalToolOperationPhase(last.status?.phase)) {\n return last;\n }\n }\n await new Promise<void>((resolve) => {\n setTimeout(resolve, TOOL_OPERATION_POLL_INTERVAL_MS);\n });\n }\n if (last) {\n return last;\n }\n throw new Error(`ToolOperation ${reference.name ?? '<unknown>'} was not observed before timeout`);\n}\n\nfunction toolOperationRow(resource: ToolOperationResource): ToolRunRow {\n const status = resource.status;\n if (status?.phase === 'Completed') {\n const value = status.result?.value;\n if (value != null && typeof value === 'object') {\n const structured = extractMemeloopStructuredToolPayload(value);\n if (structured) {\n return {\n text: structured.summary,\n isError: false,\n detailRef: structured.detailRef,\n awaitSessionId: structured.awaitSessionId,\n };\n }\n if ('error' in value && typeof value.error === 'string') {\n return { text: value.error, isError: true };\n }\n if ('result' in value && value.result != null) {\n return {\n text: typeof value.result === 'string' ? value.result : JSON.stringify(value.result),\n payload: typeof value.result === 'string' ? undefined : value.result,\n isError: false,\n };\n }\n }\n return { text: typeof value === 'string' ? value : JSON.stringify(value), isError: false };\n }\n if (status?.phase === 'Failed' || status?.phase === 'Cancelled') {\n return {\n text: status.result?.error?.message ?? `ToolOperation ${status.phase}`,\n isError: true,\n };\n }\n return {\n text: `ToolOperation did not reach a terminal phase (last phase: ${status?.phase ?? 'unknown'})`,\n isError: true,\n };\n}\n\nasync function executeToolOperation(\n context: AgentFrameworkContext,\n conversationId: string,\n call: PendingToolCall,\n occurrence: number,\n): Promise<ToolRunRow | null> {\n const client = context.orchestration;\n if (!client) return null;\n\n try {\n const caps = await client.getCapabilities();\n if (\n !caps.resourceKinds.includes(TOOL_OPERATION_KIND) ||\n !caps.operations.includes('apply') ||\n !caps.operations.includes('get')\n ) {\n return null;\n }\n } catch {\n return null;\n }\n\n const timeoutMs = context.agentToolLoop?.toolOperationTimeoutMs ?? TOOL_OPERATION_DEFAULT_TIMEOUT_MS;\n // Stable per logical call: controller retries re-deliver the same operation,\n // while a new identical call (next occurrence) produces a distinct key.\n const idempotencyKey = `${conversationId}:${\n fnv1aHex(stableStringify({\n toolId: call.toolId,\n parameters: call.parameters,\n }))\n }:${occurrence}`;\n\n toolOperationCounter += 1;\n const operation = createToolOperationManifest(\n `${call.toolId}-${Date.now().toString(36)}-${toolOperationCounter.toString(36)}`,\n {\n toolRef: { kind: 'BuiltinTool', name: call.toolId },\n effect: context.tools.getToolEffect?.(call.toolId) ?? 'execute',\n arguments: call.parameters,\n idempotencyKey,\n timeoutMs,\n policy: { auditLevel: 'metadata' },\n },\n );\n\n try {\n const applied = await client.apply(operation);\n if (applied.apiVersion !== TOOL_OPERATION_API_VERSION || applied.kind !== TOOL_OPERATION_KIND) {\n return { text: 'ToolOperation apply returned an unexpected resource kind', isError: true };\n }\n let resource = applied as unknown as ToolOperationResource;\n if (!isTerminalToolOperationPhase(resource.status?.phase)) {\n const reference: OrchestrationResourceReference = {\n apiVersion: applied.apiVersion,\n kind: applied.kind,\n name: applied.metadata.name,\n namespace: applied.metadata.namespace,\n };\n resource = await waitForToolOperationTerminal(client, reference, timeoutMs, resource);\n }\n return toolOperationRow(resource);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { text: `ToolOperation execution error: ${message}`, isError: true };\n }\n}\n\nasync function executeRegistryTool(\n context: AgentFrameworkContext,\n toolId: string,\n parameters: Record<string, unknown>,\n): Promise<ToolRunRow> {\n const normalizedId = toolId.includes('-')\n ? toolId.replace(/-([a-z])/g, (_m, c: string) => c.toUpperCase())\n : toolId;\n const impl = (context.tools.getTool(toolId) ?? context.tools.getTool(normalizedId)) as\n | ((arguments_: Record<string, unknown>) => unknown)\n | undefined;\n\n if (typeof impl !== 'function') {\n return {\n text: `No tool registered for \"${toolId}\".`,\n isError: true,\n };\n }\n\n try {\n const raw = await impl(parameters);\n if (raw != null && typeof raw === 'object') {\n const o = raw as { error?: string; result?: unknown };\n if (typeof o.error === 'string' && o.error.length > 0) {\n return { text: o.error, isError: true };\n }\n if ('result' in o) {\n return {\n text: typeof o.result === 'string' ? o.result : JSON.stringify(o.result),\n payload: typeof o.result === 'string' ? undefined : o.result,\n isError: false,\n };\n }\n const structured = extractMemeloopStructuredToolPayload(raw);\n if (structured) {\n return {\n text: structured.summary,\n isError: false,\n detailRef: structured.detailRef,\n awaitSessionId: structured.awaitSessionId,\n };\n }\n }\n return { text: typeof raw === 'string' ? raw : JSON.stringify(raw), isError: false };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (context.logger?.warn) {\n context.logger.warn('[agentToolLoop] tool execution error', toolId, message);\n } else {\n console.warn('[agentToolLoop] tool execution error', toolId, message);\n }\n return { text: message, isError: true };\n }\n}\n\nasync function executeWithGuards(\n context: AgentFrameworkContext,\n options: AgentFrameworkContext['agentToolLoop'],\n conversationId: string,\n recentToolCalls: string[],\n call: PendingToolCall,\n): Promise<ToolRunRow> {\n const parameterParseError = call.parameters[TOOL_PARAMETER_PARSE_ERROR_KEY];\n if (typeof parameterParseError === 'string') {\n return { text: parameterParseError, isError: true };\n }\n\n const signature = `${call.toolId}:${JSON.stringify(call.parameters)}`;\n recentToolCalls.push(signature);\n const threshold = Math.max(2, options?.doomLoopThreshold ?? 3);\n const last = recentToolCalls.slice(-threshold);\n if (last.length === threshold && last.every((x) => x === signature)) {\n return { text: 'Blocked by doom-loop guard', isError: true };\n }\n\n // Occurrence of this exact call in the conversation; distinguishes a new\n // logical call from a controller retry of a previous one.\n const occurrence = recentToolCalls.filter((entry) => entry === signature).length;\n const row = (await executeToolOperation(context, conversationId, call, occurrence)) ??\n (await executeRegistryTool(context, call.toolId, call.parameters));\n\n if (hasHooks('PostToolUse')) {\n await executeHooks('PostToolUse', context, {\n toolId: call.toolId,\n parameters: call.parameters,\n result: row.text,\n isError: row.isError,\n conversationId,\n });\n }\n\n return row;\n}\n\nasync function persistToolResult(\n context: AgentFrameworkContext,\n conversationId: string,\n call: PendingToolCall,\n row: ToolRunRow,\n): Promise<void> {\n toolResultMessageCounter += 1;\n const lamportTool = await nextLamportClockForConversation(context.storage, conversationId);\n await context.storage.appendMessage(createChatMessage({\n // Counter suffix keeps message identity unique for identical calls within\n // the same millisecond (parallel tools or fast consecutive rounds).\n messageId: `${conversationId}:t:${call.toolId}:${Date.now().toString(36)}:${toolResultMessageCounter.toString(36)}`,\n conversationId,\n originNodeId: 'local',\n lamportClock: lamportTool,\n role: 'tool',\n parts: [{\n type: 'tool-result',\n toolName: call.toolId,\n parameters: call.parameters,\n result: row.text,\n isError: row.isError,\n payload: row.payload,\n detailRef: row.detailRef,\n }],\n detailRef: row.detailRef,\n metadata: {\n isToolResult: true,\n isError: row.isError,\n toolId: call.toolId,\n toolParameters: call.parameters,\n },\n }));\n}\n\nasync function persistTerminalAwaitCompletion(\n context: AgentFrameworkContext,\n options: AgentFrameworkContext['agentToolLoop'],\n conversationId: string,\n call: PendingToolCall,\n row: ToolRunRow,\n): Promise<void> {\n const sid = row.awaitSessionId;\n const wait = options?.waitForTerminalSession;\n if (!sid || !wait || row.isError) return;\n const done = await wait(sid);\n const lamportTool = await nextLamportClockForConversation(context.storage, conversationId);\n const body = truncateToolSummary(\n `[terminal.await done] session=${sid}\\nexitCode: ${done.exitCode ?? 'null'}\\n---\\n${done.truncatedOutput}`,\n );\n await context.storage.appendMessage(createChatMessage({\n messageId: `${conversationId}:t:${call.toolId}:await:${Date.now().toString(36)}:${toolResultMessageCounter.toString(36)}`,\n conversationId,\n originNodeId: 'local',\n lamportClock: lamportTool,\n role: 'tool',\n parts: [{\n type: 'tool-result',\n toolName: call.toolId,\n parameters: call.parameters,\n result: body,\n detailRef: row.detailRef\n ? { ...row.detailRef, exitCode: done.exitCode ?? row.detailRef.exitCode }\n : undefined,\n }],\n detailRef: row.detailRef\n ? { ...row.detailRef, exitCode: done.exitCode ?? row.detailRef.exitCode }\n : undefined,\n metadata: {\n isToolResult: true,\n toolId: call.toolId,\n toolParameters: call.parameters,\n awaitSessionId: sid,\n },\n }));\n}\n\nfunction toolStep(row: CompletedToolCall, parallel: boolean): AgentLoopStep {\n return {\n type: 'tool',\n data: {\n toolId: row.call.toolId,\n parameters: row.call.parameters,\n parallel,\n result: row.text,\n isError: row.isError,\n },\n };\n}\n\nexport async function* runRegistryToolCalls(options: {\n context: AgentFrameworkContext;\n agentToolLoopOptions: AgentFrameworkContext['agentToolLoop'];\n conversationId: string;\n calls: PendingToolCall[];\n parallel: boolean;\n recentToolCalls: string[];\n}): AsyncGenerator<AgentLoopStep, void, unknown> {\n const { context, agentToolLoopOptions, conversationId, calls, parallel, recentToolCalls } = options;\n\n if (parallel) {\n const results = await Promise.all(\n calls.map(\n async (call): Promise<CompletedToolCall> => ({\n call,\n ...(await executeWithGuards(\n context,\n agentToolLoopOptions,\n conversationId,\n recentToolCalls,\n call,\n )),\n }),\n ),\n );\n for (const row of results) {\n yield toolStep(row, true);\n }\n for (const row of results) {\n await persistToolResult(context, conversationId, row.call, row);\n }\n for (const row of results) {\n await persistTerminalAwaitCompletion(\n context,\n agentToolLoopOptions,\n conversationId,\n row.call,\n row,\n );\n }\n return;\n }\n\n for (const call of calls) {\n const row = await executeWithGuards(\n context,\n agentToolLoopOptions,\n conversationId,\n recentToolCalls,\n call,\n );\n yield toolStep({ call, ...row }, false);\n await persistToolResult(context, conversationId, call, row);\n await persistTerminalAwaitCompletion(context, agentToolLoopOptions, conversationId, call, row);\n }\n}\n","import type { MergedPermissions, PermissionAction, PermissionSet } from './types.js';\n\n/**\n * Test whether a tool name matches a wildcard pattern.\n *\n * Supported patterns:\n * - `*` → matches everything\n * - `file.*` → matches any tool starting with `file.`\n * - `shell(*)` → matches tools like `shell(rm)`, `shell(ls)` (literal parens)\n * - exact name → matches only that exact tool name\n *\n * Patterns are converted to anchored regexes internally.\n */\nexport function matchPattern(toolName: string, pattern: string): boolean {\n // Exact match short-circuit\n if (pattern === toolName) return true;\n if (pattern === '*') return true;\n\n // Escape all regex special characters, then convert escaped * back to wildcard .*\n const escaped = pattern\n .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\\\\\*/g, '.*');\n\n return new RegExp(`^${escaped}$`).test(toolName);\n}\n\n/**\n * Merge multiple permission sets from lowest to highest priority.\n *\n * Sets are processed in order; later rules override earlier ones for the same tool pattern.\n * Within a single set, rules are processed in order (last wins).\n *\n * @param sets - Ordered from lowest to highest priority (e.g. default → agent → user → session)\n * @returns Flattened `MergedPermissions` with all unique patterns per action.\n */\nexport function mergePermissionSets(sets: PermissionSet[]): MergedPermissions {\n // Map from action to a Map of pattern → action (deduplicated by pattern, last wins)\n const merged = new Map<PermissionAction, Map<string, PermissionAction>>();\n merged.set('allow', new Map());\n merged.set('deny', new Map());\n merged.set('ask', new Map());\n\n for (const set of sets) {\n for (const rule of set.rules) {\n // Remove this pattern from any OTHER action maps (to avoid contradictions)\n for (const [action, map] of merged) {\n if (action !== rule.action) {\n map.delete(rule.toolPattern);\n }\n }\n // Set pattern in its action map\n merged.get(rule.action)!.set(rule.toolPattern, rule.action);\n }\n }\n\n return {\n allow: [...merged.get('allow')!.keys()],\n deny: [...merged.get('deny')!.keys()],\n ask: [...merged.get('ask')!.keys()],\n };\n}\n\n/**\n * Check what action applies to a given tool name under merged permissions.\n *\n * Precedence: exact patterns always beat wildcards.\n * Within same specificity: deny > ask > allow.\n */\nexport function checkPermission(\n toolName: string,\n merged: MergedPermissions,\n): PermissionAction {\n const isWildcard = (p: string) => p.includes('*');\n\n // Exact patterns first: deny > ask > allow\n for (const pattern of merged.deny) {\n if (!isWildcard(pattern) && matchPattern(toolName, pattern)) return 'deny';\n }\n for (const pattern of merged.ask) {\n if (!isWildcard(pattern) && matchPattern(toolName, pattern)) return 'ask';\n }\n for (const pattern of merged.allow) {\n if (!isWildcard(pattern) && matchPattern(toolName, pattern)) return 'allow';\n }\n\n // Wildcard patterns: deny > ask > allow\n for (const pattern of merged.deny) {\n if (isWildcard(pattern) && matchPattern(toolName, pattern)) return 'deny';\n }\n for (const pattern of merged.ask) {\n if (isWildcard(pattern) && matchPattern(toolName, pattern)) return 'ask';\n }\n for (const pattern of merged.allow) {\n if (isWildcard(pattern) && matchPattern(toolName, pattern)) return 'allow';\n }\n\n // Fallback: when no rules are configured at all, allow everything (backward compat).\n // When rules exist but none match, deny (secure default).\n const hasAnyRules = merged.allow.length > 0 || merged.deny.length > 0 || merged.ask.length > 0;\n return hasAnyRules ? 'deny' : 'allow';\n}\n","import { matchPattern } from '../../permission/engine.js';\nimport type { PermissionAction } from '../../permission/types.js';\n\nimport type { NodeTrustClass, SecurityProfileResource, ToolAdmissionAction, ToolAdmissionPolicy, ToolAdmissionRule, ToolOperationResource } from '../resources.js';\n\nexport type { NodeTrustClass, ToolAdmissionAction, ToolAdmissionPolicy, ToolAdmissionRule } from '../resources.js';\n\nexport interface ToolAdmissionDecision {\n action: ToolAdmissionAction;\n source: 'rule' | 'default';\n reason?: string;\n matchedRule?: ToolAdmissionRule;\n}\n\n/**\n * Default trusted admission posture per node trust class. Trusted nodes keep\n * the historical allow-by-default posture; restricted and quarantine nodes\n * deny everything unless an explicit rule allows it.\n */\nexport function defaultAdmissionPolicyForTrustClass(trustClass: NodeTrustClass): ToolAdmissionPolicy {\n switch (trustClass) {\n case 'restricted':\n case 'quarantine':\n return { defaultAction: 'deny', rules: [] };\n default:\n return { defaultAction: 'allow', rules: [] };\n }\n}\n\n/**\n * Resolve the effective trusted admission policy for a workload from its\n * SecurityProfile and the node's trust class. Profile rules are evaluated\n * first (they can allow specific tools on restricted nodes); the trust-class\n * default applies after. For restricted/quarantine the resolved default is\n * forced to `deny` — a profile cannot override it.\n */\nexport function resolveAdmissionPolicy(\n profile: Pick<SecurityProfileResource, 'spec'> | undefined,\n trustClass: NodeTrustClass,\n): ToolAdmissionPolicy {\n const base = defaultAdmissionPolicyForTrustClass(trustClass);\n const overlay = profile?.spec.toolAdmission;\n if (!overlay) return base;\n const defaultAction = trustClass === 'trusted' ? overlay.defaultAction ?? base.defaultAction : 'deny';\n return {\n defaultAction,\n rules: [...(overlay.rules ?? []), ...(base.rules ?? [])],\n };\n}\n\n/**\n * Model-facing implied permission default for a trust class. Used by the\n * AgentToolLoop permission gate when no explicit wildcard rule exists.\n */\nexport function defaultPermissionActionForTrustClass(trustClass: NodeTrustClass | undefined): PermissionAction {\n return trustClass === 'restricted' || trustClass === 'quarantine' ? 'deny' : 'allow';\n}\n\nexport function evaluateToolAdmission(\n policy: ToolAdmissionPolicy,\n operation: Pick<ToolOperationResource, 'spec'>,\n): ToolAdmissionDecision {\n const toolName = operation.spec.toolRef.name;\n const effect = operation.spec.effect;\n for (const rule of policy.rules ?? []) {\n if (!matchPattern(toolName, rule.toolPattern)) continue;\n if (rule.effects && !rule.effects.includes(effect)) continue;\n return {\n action: rule.action,\n source: 'rule',\n reason: rule.reason,\n matchedRule: rule,\n };\n }\n return { action: policy.defaultAction, source: 'default' };\n}\n","/**\n * TidGi `approval.ts` 逐行迁移(pending 队列 + UI 监听)。\n */\nimport type { ApprovalDecision, ToolApprovalConfig, ToolApprovalRequest } from './types.js';\n\nconst pendingApprovals = new Map<\n string,\n {\n request: ToolApprovalRequest;\n resolve: (decision: 'allow' | 'deny') => void;\n }\n>();\n\nconst approvalListeners = new Set<(request: ToolApprovalRequest) => void>();\n\nexport function onApprovalRequest(listener: (request: ToolApprovalRequest) => void): () => void {\n approvalListeners.add(listener);\n return () => {\n approvalListeners.delete(listener);\n };\n}\n\nexport function evaluateApproval(\n approval: ToolApprovalConfig | undefined,\n toolName: string,\n parameters: Record<string, unknown>,\n): ApprovalDecision {\n if (!approval || approval.mode === 'auto') {\n return 'allow';\n }\n\n const callContent = JSON.stringify({ tool: toolName, parameters });\n\n if (approval.denyPatterns?.length) {\n for (const pattern of approval.denyPatterns) {\n try {\n if (new RegExp(pattern, 'i').test(callContent)) {\n return 'deny';\n }\n } catch {\n /* invalid regex */\n }\n }\n }\n\n if (approval.allowPatterns?.length) {\n for (const pattern of approval.allowPatterns) {\n try {\n if (new RegExp(pattern, 'i').test(callContent)) {\n return 'allow';\n }\n } catch {\n /* invalid regex */\n }\n }\n }\n\n return 'pending';\n}\n\nexport function requestApproval(request: ToolApprovalRequest, timeoutMs: number = 60_000): Promise<'allow' | 'deny'> {\n return new Promise<'allow' | 'deny'>((resolve) => {\n pendingApprovals.set(request.approvalId, { request, resolve });\n\n for (const listener of approvalListeners) {\n try {\n listener(request);\n } catch {\n /* ignore listener errors */\n }\n }\n\n if (timeoutMs > 0) {\n setTimeout(() => {\n if (pendingApprovals.has(request.approvalId)) {\n pendingApprovals.delete(request.approvalId);\n resolve('deny');\n }\n }, timeoutMs);\n }\n });\n}\n\nexport function resolveApproval(approvalId: string, decision: 'allow' | 'deny'): void {\n const pending = pendingApprovals.get(approvalId);\n if (pending) {\n pendingApprovals.delete(approvalId);\n pending.resolve(decision);\n }\n}\n\nexport function getPendingApprovals(): ToolApprovalRequest[] {\n return [...pendingApprovals.values()].map((p) => p.request);\n}\n\nexport function cancelPendingApprovals(agentId: string): void {\n for (const [id, pending] of pendingApprovals) {\n if (pending.request.agentId === agentId) {\n pendingApprovals.delete(id);\n pending.resolve('deny');\n }\n }\n}\n","import { createChatMessage } from '../../conversation/index.js';\nimport { defaultPermissionActionForTrustClass } from '../../orchestration/security/admission.js';\nimport type { MergedPermissions, PermissionAction, PermissionSet } from '../../permission/index.js';\nimport { checkPermission, mergePermissionSets } from '../../permission/index.js';\nimport type { ToolCallingMatch } from '../../promptUtilities/responsePatternUtility.js';\nimport { nextLamportClockForConversation } from '../../storage/nextLamport.js';\nimport { requestApproval } from '../../tools/approval.js';\nimport type { AgentFrameworkContext } from '../../types.js';\nimport { executeHooks, hasHooks } from '../hooks/registry.js';\nimport type { HookHandler, HookResult, PreToolUseData } from '../hooks/types.js';\n\nimport type { AgentLoopStep } from '../types.js';\n\nexport type PendingToolCall = ToolCallingMatch & { found: true };\n\n/**\n * Build layered permission sets from context options.\n *\n * Layers (lowest to highest priority):\n * 1. default - `toolPermissions.default` (e.g. \"allow\")\n * 2. agent - `toolPermissions.perAgent[definitionId]`\n * 3. user - persisted in SQLite (loaded via permission storage)\n * 4. session - `toolPermissions.rules` (global rules)\n *\n * When no wildcard rule exists, an implied default is derived from the\n * host-bound trust class: restricted/quarantine workers deny by default,\n * trusted workers keep the historical allow default.\n */\nexport function buildLayeredPermissions(\n options: AgentFrameworkContext['agentToolLoop'],\n definitionId: string,\n userSet?: PermissionSet,\n): MergedPermissions {\n const globalPerms = options?.toolPermissions;\n const sets: PermissionSet[] = [];\n\n if (globalPerms?.default) {\n sets.push({\n source: 'default',\n rules: [{ toolPattern: '*', action: globalPerms.default }],\n });\n }\n\n const scoped = globalPerms?.perAgent?.[definitionId];\n if (scoped) {\n if (scoped.default) {\n sets.push({\n source: `agent:${definitionId}:default`,\n rules: [{ toolPattern: '*', action: scoped.default }],\n });\n }\n if (scoped.rules && scoped.rules.length > 0) {\n sets.push({\n source: `agent:${definitionId}`,\n rules: scoped.rules.map((r) => ({ toolPattern: r.pattern, action: r.action })),\n });\n }\n }\n\n if (userSet && userSet.rules.length > 0) {\n sets.push(userSet);\n }\n\n if (globalPerms?.rules && globalPerms.rules.length > 0) {\n sets.push({\n source: 'session',\n rules: globalPerms.rules.map((r) => ({ toolPattern: r.pattern, action: r.action })),\n });\n }\n\n if (!sets.some((s) => s.rules.some((r) => r.toolPattern === '*'))) {\n sets.unshift({\n source: 'implied-default',\n rules: [{ toolPattern: '*', action: defaultPermissionActionForTrustClass(options?.trustClass) }],\n });\n }\n\n return mergePermissionSets(sets);\n}\n\nexport function createPermissionPreToolUseHook(\n options: AgentFrameworkContext['agentToolLoop'],\n definitionId: string,\n userSet?: PermissionSet,\n): HookHandler {\n const mergedPermissions = buildLayeredPermissions(options, definitionId, userSet);\n return async (_context, data) => {\n const toolId = typeof data.toolId === 'string' ? data.toolId : '';\n const action = checkPermission(toolId, mergedPermissions);\n if (action === 'allow') {\n return { allowed: true, permissionAction: 'allow' };\n }\n return {\n allowed: true,\n permissionAction: action,\n reason: action === 'deny' ? 'Denied by tool permission' : undefined,\n };\n };\n}\n\nfunction applyModifiedCall(\n call: PendingToolCall,\n modified?: Record<string, unknown>,\n): PendingToolCall {\n if (!modified) return call;\n const toolId = typeof modified.toolId === 'string' ? modified.toolId : call.toolId;\n const parameters = modified.parameters != null && typeof modified.parameters === 'object'\n ? (modified.parameters as Record<string, unknown>)\n : call.parameters;\n return { ...call, toolId, parameters };\n}\n\nfunction normalizePreToolUseResult(result: HookResult): {\n action: PermissionAction;\n reason?: string;\n} {\n if (!result.allowed) {\n return { action: 'deny', reason: result.reason ?? 'Blocked by PreToolUse hook' };\n }\n if (result.permissionAction === 'ask' || result.permissionAction === 'deny') {\n return { action: result.permissionAction, reason: result.reason };\n }\n return { action: 'allow', reason: result.reason };\n}\n\nasync function persistDeniedToolResult(\n context: AgentFrameworkContext,\n conversationId: string,\n call: PendingToolCall,\n errorText: string,\n): Promise<void> {\n const lamportTool = await nextLamportClockForConversation(context.storage, conversationId);\n await context.storage.appendMessage(createChatMessage({\n messageId: `${conversationId}:t:${call.toolId}:${Date.now().toString(36)}`,\n conversationId,\n originNodeId: 'local',\n lamportClock: lamportTool,\n role: 'tool',\n parts: [{\n type: 'tool-result',\n toolName: call.toolId,\n parameters: call.parameters,\n result: errorText,\n isError: true,\n }],\n metadata: {\n isToolResult: true,\n isError: true,\n toolId: call.toolId,\n toolParameters: call.parameters,\n },\n }));\n}\n\nasync function* resolveAskAction(\n conversationId: string,\n call: PendingToolCall,\n): AsyncGenerator<AgentLoopStep, PermissionAction, unknown> {\n yield {\n type: 'permission_request' as const,\n data: { tool: call.toolId, args: call.parameters },\n };\n const decision = await requestApproval(\n {\n approvalId: `${conversationId}:${Date.now().toString(36)}:${call.toolId}`,\n agentId: conversationId,\n toolName: call.toolId,\n parameters: call.parameters,\n created: new Date(),\n },\n 60_000,\n );\n return decision === 'allow' ? 'allow' : 'deny';\n}\n\nasync function runPreToolUseHook(\n context: AgentFrameworkContext,\n data: PreToolUseData,\n): Promise<HookResult> {\n if (!hasHooks('PreToolUse')) return { allowed: true };\n return executeHooks('PreToolUse', context, data);\n}\n\nexport async function* gateToolCallsWithPreToolUse(\n context: AgentFrameworkContext,\n options: AgentFrameworkContext['agentToolLoop'],\n definitionId: string,\n conversationId: string,\n calls: PendingToolCall[],\n): AsyncGenerator<AgentLoopStep, PendingToolCall[], unknown> {\n const permissionHook = createPermissionPreToolUseHook(options, definitionId);\n const allowedCalls: PendingToolCall[] = [];\n\n for (const originalCall of calls) {\n let call = originalCall;\n const permissionResult = await permissionHook(context, {\n toolId: call.toolId,\n parameters: call.parameters,\n conversationId,\n });\n call = applyModifiedCall(call, permissionResult.modified);\n\n let { action, reason } = normalizePreToolUseResult(permissionResult);\n if (action === 'ask') {\n action = yield* resolveAskAction(conversationId, call);\n reason = action === 'deny' ? 'Tool approval denied or timed out' : reason;\n }\n if (action === 'deny') {\n const errorText = reason ?? 'Denied by tool permission';\n yield {\n type: 'tool' as const,\n data: {\n toolId: call.toolId,\n parameters: call.parameters,\n parallel: false,\n result: errorText,\n isError: true,\n },\n };\n await persistDeniedToolResult(context, conversationId, call, errorText);\n continue;\n }\n\n const hookResult = await runPreToolUseHook(context, {\n toolId: call.toolId,\n parameters: call.parameters,\n conversationId,\n });\n call = applyModifiedCall(call, hookResult.modified);\n ({ action, reason } = normalizePreToolUseResult(hookResult));\n if (action === 'ask') {\n action = yield* resolveAskAction(conversationId, call);\n reason = action === 'deny' ? 'Tool approval denied or timed out' : reason;\n }\n if (action === 'deny') {\n const errorText = reason ?? 'Blocked by PreToolUse hook';\n yield {\n type: 'tool' as const,\n data: {\n toolId: call.toolId,\n parameters: call.parameters,\n parallel: false,\n result: errorText,\n isError: true,\n },\n };\n await persistDeniedToolResult(context, conversationId, call, errorText);\n continue;\n }\n\n allowedCalls.push(call);\n }\n\n return allowedCalls;\n}\n","import { type ChatMessage, createChatMessage } from '../../conversation/index.js';\n\nimport { responseConcat } from '../../promptUtilities/responseConcat.js';\nimport { matchAllToolCallings, type ToolCallingMatch } from '../../promptUtilities/responsePatternUtility.js';\nimport { nextLamportClockForConversation } from '../../storage/nextLamport.js';\nimport { createHooksWithPlugins, resolvePromptPluginMap, runResponseCompleteHooks } from '../../tools/pluginRegistry.js';\nimport type { DefineToolAgentFrameworkContext } from '../../tools/types.js';\nimport type { AgentFrameworkContext, AgentInstanceModel } from '../../types.js';\nimport { executeHooks, hasHooks } from '../hooks/registry.js';\nimport type { AgentStopData } from '../hooks/types.js';\nimport type { AgentLoopInput, AgentLoopStep } from '../types.js';\nimport type { AgentToolLoopIterationGenerator, AgentToolLoopState, AgentToolLoopTurnStartResult } from './contracts.js';\nimport { prepareIterationHistory } from './historyCompaction.js';\nimport { chunkToText, streamLlm } from './llmStream.js';\nimport { buildLlmMessages, inferDefinitionId, resolveAgentDefinitionModel } from './modelMessages.js';\nimport { runRegistryToolCalls } from './toolCallRunner.js';\nimport { gateToolCallsWithPreToolUse } from './toolUseGate.js';\n\nconst DEFAULT_MAX_ITERATIONS = 256;\n\nfunction toolCallHandledInAgentMessages(\n agentMessages: ChatMessage[],\n assistantContent: string,\n call: ToolCallingMatch & { found: true },\n): boolean {\n let assistantIndex = -1;\n for (let index = agentMessages.length - 1; index >= 0; index -= 1) {\n const message = agentMessages[index];\n if (message.role === 'assistant' && message.content === assistantContent) {\n assistantIndex = index;\n break;\n }\n }\n if (assistantIndex < 0) return false;\n const after = agentMessages.slice(assistantIndex + 1);\n return after.some(\n message =>\n message.role === 'tool' &&\n (message.metadata?.toolId === call.toolId ||\n (typeof message.content === 'string' && message.content.includes(`Tool: ${call.toolId}`))),\n );\n}\n\nfunction resolveMaxIterations(context: AgentFrameworkContext): number {\n const configured = context.agentToolLoop?.maxIterations;\n return configured != null && configured > 0 ? configured : DEFAULT_MAX_ITERATIONS;\n}\n\nfunction pluginToolCallSignature(calls: Array<ToolCallingMatch & { found: true }>): string {\n return calls.map(call => `${call.toolId}:${JSON.stringify(call.parameters)}`).join('|');\n}\n\nasync function blockRepeatedPluginToolCalls(\n context: AgentFrameworkContext,\n input: AgentLoopInput,\n state: AgentToolLoopState,\n calls: Array<ToolCallingMatch & { found: true }>,\n hookContext: DefineToolAgentFrameworkContext,\n): Promise<{ blocked: false } | { blocked: true; message: string }> {\n if (calls.length === 0) return { blocked: false };\n\n const signature = pluginToolCallSignature(calls);\n state.recentToolCalls.push(signature);\n const threshold = Math.max(2, context.agentToolLoop?.doomLoopThreshold ?? 3);\n const last = state.recentToolCalls.slice(-threshold);\n if (last.length !== threshold || !last.every(entry => entry === signature)) {\n return { blocked: false };\n }\n\n const message = `Blocked by doom-loop guard: the model repeated the same tool call ${threshold} times. ` +\n 'Change the arguments or approach before trying again.';\n const firstCall = calls[0];\n const lamportClock = await nextLamportClockForConversation(\n context.storage,\n input.conversationId,\n );\n const toolMessage = createChatMessage({\n messageId: `${input.conversationId}:t:doom-loop:${state.iteration}:${Date.now().toString(36)}`,\n conversationId: input.conversationId,\n originNodeId: 'local',\n lamportClock,\n role: 'tool',\n parts: [{\n type: 'tool-result',\n toolName: firstCall.toolId,\n parameters: firstCall.parameters,\n result: message,\n isError: true,\n }],\n metadata: {\n isToolResult: true,\n isError: true,\n toolId: firstCall.toolId,\n toolParameters: firstCall.parameters,\n doomLoopBlocked: true,\n },\n });\n hookContext.agent.messages.push(toolMessage);\n await context.storage.appendMessage(toolMessage);\n return { blocked: true, message };\n}\n\nexport function createAgentToolLoopState(context: AgentFrameworkContext): AgentToolLoopState {\n return {\n iteration: 0,\n maxIterations: resolveMaxIterations(context),\n recentToolCalls: [],\n agentStarted: false,\n agentStopped: false,\n };\n}\n\nfunction markAgentToolLoopStop(state: AgentToolLoopState, reason: AgentStopData['reason']): void {\n state.stopReason ??= reason;\n}\n\nfunction finishAgentToolLoopThinking(\n state: AgentToolLoopState,\n reason: AgentStopData['reason'],\n data: Record<string, unknown>,\n): AgentLoopStep {\n markAgentToolLoopStop(state, reason);\n return { type: 'thinking', data };\n}\n\nexport async function startAgentToolLoopTurn(\n context: AgentFrameworkContext,\n input: AgentLoopInput,\n state: AgentToolLoopState,\n): Promise<AgentToolLoopTurnStartResult> {\n const now = Date.now();\n const lamportClock = await nextLamportClockForConversation(\n context.storage,\n input.conversationId,\n );\n const hostUserMessage = input.userMessage;\n const userMessage = context.normalizeMessage?.({\n ...hostUserMessage,\n messageId: hostUserMessage?.messageId ?? `${input.conversationId}:${now.toString(36)}`,\n conversationId: input.conversationId,\n originNodeId: hostUserMessage?.originNodeId ?? 'local',\n timestamp: hostUserMessage?.timestamp ?? now,\n lamportClock: hostUserMessage?.lamportClock ?? lamportClock,\n role: 'user',\n content: hostUserMessage?.content ?? input.message,\n }) ?? {\n ...hostUserMessage,\n messageId: hostUserMessage?.messageId ?? `${input.conversationId}:${now.toString(36)}`,\n conversationId: input.conversationId,\n originNodeId: hostUserMessage?.originNodeId ?? 'local',\n timestamp: hostUserMessage?.timestamp ?? now,\n lamportClock: hostUserMessage?.lamportClock ?? lamportClock,\n role: 'user',\n content: hostUserMessage?.content ?? input.message,\n };\n\n if (input.resumeSession && input.resumeSession.length > 0) {\n await context.storage.insertMessagesIfAbsent(input.resumeSession);\n }\n\n await context.storage.appendMessage(userMessage);\n\n if (hasHooks('UserPromptSubmit')) {\n const hookResult = await executeHooks('UserPromptSubmit', context, {\n message: input.message,\n conversationId: input.conversationId,\n });\n if (!hookResult.allowed) {\n return {\n action: 'stop',\n step: {\n type: 'thinking',\n data: {\n status: 'blocked',\n conversationId: input.conversationId,\n reason: hookResult.reason ?? 'Blocked by UserPromptSubmit hook',\n },\n },\n };\n }\n }\n\n const initialDefinitionId = await inferDefinitionId(context.storage, input.conversationId);\n if (hasHooks('AgentStart')) {\n const hookResult = await executeHooks('AgentStart', context, {\n conversationId: input.conversationId,\n definitionId: initialDefinitionId,\n });\n if (!hookResult.allowed) {\n return {\n action: 'stop',\n step: {\n type: 'thinking',\n data: {\n status: 'blocked',\n conversationId: input.conversationId,\n reason: hookResult.reason ?? 'Blocked by AgentStart hook',\n },\n },\n };\n }\n }\n state.agentStarted = true;\n return { action: 'continue' };\n}\n\nexport async function* runAgentToolLoopIteration(\n context: AgentFrameworkContext,\n input: AgentLoopInput,\n state: AgentToolLoopState,\n): AgentToolLoopIterationGenerator {\n const options = context.agentToolLoop ?? {};\n const enableToolLoop = options.enableToolLoop !== false;\n const fallbackRegistry = options.fallbackRegistryTools !== false;\n const checkpointOptions = options.sessionCheckpoint;\n\n if (state.iteration >= state.maxIterations) {\n yield finishAgentToolLoopThinking(state, 'max-iterations', {\n status: 'max-iterations',\n conversationId: input.conversationId,\n maxIterations: state.maxIterations,\n });\n return { action: 'stop', reason: 'max-iterations' };\n }\n\n state.iteration += 1;\n const iteration = state.iteration;\n\n if (options.isCancelled?.(input.conversationId)) {\n yield finishAgentToolLoopThinking(state, 'cancelled', {\n status: 'cancelled',\n conversationId: input.conversationId,\n });\n return { action: 'stop', reason: 'cancelled' };\n }\n\n const rawHistory = await context.storage.getMessages(input.conversationId, {\n mode: 'full-content',\n });\n\n const { history, steps: compactionSteps } = await prepareIterationHistory({\n context,\n conversationId: input.conversationId,\n iteration,\n rawHistory,\n agentToolLoopOptions: options,\n });\n for (const step of compactionSteps) {\n yield step;\n }\n\n const runtimeAgent = context.resolveAgentRuntimeView\n ? await context.resolveAgentRuntimeView(input.conversationId, history)\n : ({ id: input.conversationId, messages: history } as AgentInstanceModel);\n\n const hookContext: DefineToolAgentFrameworkContext = {\n ...context,\n agent: runtimeAgent,\n persistAgentMessage: async message => {\n await context.storage.appendMessage(message);\n },\n };\n\n yield {\n type: 'thinking',\n data: {\n status: 'calling-llm',\n conversationId: input.conversationId,\n messageCount: history.length,\n iteration,\n },\n };\n\n // Prompt plugins may inspect the live agent (for example Desktop's\n // persistent goal/todo tool). Give prompt concatenation the same enriched\n // context used by response hooks instead of the host-only base context.\n const messages = await buildLlmMessages(hookContext, input.conversationId, history);\n const request = { conversationId: input.conversationId, messages };\n // Include the iteration so rounds started within the same millisecond keep\n // distinct message identity; otherwise a later round replaces an earlier\n // round's assistant message and duplicate-output detection misfires.\n const assistantMessageId = `${input.conversationId}:a:${iteration}:${Date.now().toString(36)}`;\n const assistantLamportClock = await nextLamportClockForConversation(\n context.storage,\n input.conversationId,\n );\n const buildAssistantMessage = (content: string) =>\n context.normalizeMessage?.({\n messageId: assistantMessageId,\n conversationId: input.conversationId,\n originNodeId: 'local',\n timestamp: Date.now(),\n lamportClock: assistantLamportClock,\n role: 'assistant',\n content,\n }) ?? {\n messageId: assistantMessageId,\n conversationId: input.conversationId,\n originNodeId: 'local',\n timestamp: Date.now(),\n lamportClock: assistantLamportClock,\n role: 'assistant' as const,\n content,\n };\n const updateAssistantView = (message: ChatMessage) => {\n const existingIndex = hookContext.agent.messages.findIndex(\n item => item.messageId === message.messageId,\n );\n if (existingIndex >= 0) {\n hookContext.agent.messages[existingIndex] = message;\n } else {\n hookContext.agent.messages.push(message);\n }\n };\n let assistantText = '';\n for await (const chunk of streamLlm(context, request)) {\n assistantText += chunkToText(chunk);\n // Conversation stores are append-only. Keep streaming partials in the\n // in-memory agent view/UI only; persist the immutable final message once.\n const transientAssistantMessage = buildAssistantMessage(assistantText);\n updateAssistantView(transientAssistantMessage);\n try {\n await context.onTransientMessage?.(transientAssistantMessage);\n } catch (error) {\n // A renderer/update subscriber must not turn a successful model stream\n // into a failed turn or prevent the immutable final message from being\n // persisted.\n context.logger?.warn?.('[agentToolLoop] transient message subscriber failed:', error);\n }\n yield { type: 'message', data: chunk };\n }\n\n const definitionId = await inferDefinitionId(context.storage, input.conversationId);\n const agentDefinition = await resolveAgentDefinitionModel(context, definitionId);\n const frameworkConfig = agentDefinition?.agentFrameworkConfig as\n | { prompts?: unknown[]; plugins?: unknown[]; response?: unknown[] }\n | undefined;\n const hasPlugins = Boolean(\n frameworkConfig?.plugins && Array.isArray(frameworkConfig.plugins) && frameworkConfig.plugins.length > 0,\n );\n\n const assistantMessage = buildAssistantMessage(assistantText);\n updateAssistantView(assistantMessage);\n await hookContext.persistAgentMessage?.(assistantMessage);\n\n const { calls, parallel } = matchAllToolCallings(assistantText);\n\n if (hasPlugins && frameworkConfig) {\n const doomLoop = await blockRepeatedPluginToolCalls(\n context,\n input,\n state,\n calls,\n hookContext,\n );\n if (doomLoop.blocked) {\n yield {\n type: 'tool',\n data: {\n toolId: calls[0].toolId,\n parameters: calls[0].parameters,\n parallel,\n result: doomLoop.message,\n isError: true,\n },\n };\n yield finishAgentToolLoopThinking(state, 'error', {\n status: 'blocked',\n conversationId: input.conversationId,\n reason: doomLoop.message,\n });\n return { action: 'stop', reason: 'error' };\n }\n\n const { hooks } = await createHooksWithPlugins(\n frameworkConfig as { plugins: Array<{ toolId: string }> },\n {\n pluginRegistry: resolvePromptPluginMap(context),\n },\n );\n const responseCompletePayload: {\n agentFrameworkContext: DefineToolAgentFrameworkContext;\n response: { status: 'done'; content: string };\n agentFrameworkConfig: {\n plugins?: import('../../tools/types.js').FrameworkPluginToolConfig[];\n };\n requestId: undefined;\n toolConfig: import('../../tools/types.js').FrameworkPluginToolConfig;\n actions?: { yieldNextRoundTo?: 'human' | 'self' };\n } = {\n agentFrameworkContext: hookContext,\n response: { status: 'done', content: assistantText },\n agentFrameworkConfig: frameworkConfig as {\n plugins?: import('../../tools/types.js').FrameworkPluginToolConfig[];\n },\n requestId: undefined,\n toolConfig: { id: '_memeloop', toolId: '_memeloop' },\n actions: {},\n };\n await runResponseCompleteHooks(hooks, responseCompletePayload);\n\n await context.storage.insertMessagesIfAbsent(hookContext.agent.messages);\n\n const postProcess = await responseConcat(\n frameworkConfig as {\n response?: import('../../tools/types.js').AgentResponse[];\n plugins?: import('../../tools/types.js').FrameworkPluginToolConfig[];\n },\n assistantText,\n hookContext,\n hookContext.agent.messages,\n );\n\n const yieldTarget = responseCompletePayload.actions?.yieldNextRoundTo ?? postProcess.yieldNextRoundTo;\n\n if (yieldTarget === 'human') {\n yield finishAgentToolLoopThinking(state, 'completed', {\n status: 'input-required',\n conversationId: input.conversationId,\n });\n return { action: 'stop', reason: 'completed' };\n }\n if (yieldTarget === 'self') {\n return { action: 'continue' };\n }\n }\n\n if (calls.length === 0) {\n markAgentToolLoopStop(state, 'completed');\n return { action: 'stop', reason: 'completed' };\n }\n\n if (!enableToolLoop) {\n markAgentToolLoopStop(state, 'completed');\n return { action: 'stop', reason: 'completed' };\n }\n\n const pending = calls.filter(\n call => !toolCallHandledInAgentMessages(hookContext.agent.messages, assistantText, call),\n );\n\n if (pending.length === 0) {\n if (hasPlugins && calls.length > 0) {\n return { action: 'continue' };\n }\n markAgentToolLoopStop(state, 'completed');\n return { action: 'stop', reason: 'completed' };\n }\n\n if (!fallbackRegistry && hasPlugins) {\n return { action: 'continue' };\n }\n\n const allowedCalls = yield* gateToolCallsWithPreToolUse(\n context,\n options,\n definitionId,\n input.conversationId,\n pending,\n );\n\n if (allowedCalls.length === 0) {\n return { action: 'continue' };\n }\n\n yield* runRegistryToolCalls({\n context,\n agentToolLoopOptions: options,\n conversationId: input.conversationId,\n calls: allowedCalls,\n parallel,\n recentToolCalls: state.recentToolCalls,\n });\n\n if (checkpointOptions?.enabled) {\n const checkpointStore = checkpointOptions.store;\n if (!checkpointStore) {\n if (context.logger?.warn) {\n context.logger.warn('[agentToolLoop] checkpoint enabled without a checkpoint store');\n } else {\n console.warn('[agentToolLoop] checkpoint enabled without a checkpoint store');\n }\n return { action: 'continue' };\n }\n try {\n const allMessages = await context.storage.getMessages(input.conversationId, {\n mode: 'full-content',\n });\n await checkpointStore.saveCheckpoint(input.conversationId, allMessages);\n } catch (error) {\n if (context.logger?.warn) {\n context.logger.warn('[agentToolLoop] checkpoint save failed:', error);\n } else {\n console.warn('[agentToolLoop] checkpoint save failed:', error);\n }\n }\n }\n\n return { action: 'continue' };\n}\n\nexport async function stopAgentToolLoopTurn(\n context: AgentFrameworkContext,\n input: AgentLoopInput,\n state: AgentToolLoopState,\n reason?: AgentStopData['reason'],\n): Promise<void> {\n if (reason) markAgentToolLoopStop(state, reason);\n if (state.agentStarted && !state.agentStopped && state.stopReason && hasHooks('AgentStop')) {\n state.agentStopped = true;\n await executeHooks('AgentStop', context, {\n conversationId: input.conversationId,\n reason: state.stopReason,\n });\n }\n}\n","import type { AgentFrameworkContext } from '../../types.js';\nimport type { AgentLoopGenerator, AgentLoopInput } from '../types.js';\nimport { createAgentToolLoopState, runAgentToolLoopIteration, startAgentToolLoopTurn, stopAgentToolLoopTurn } from './turnPrimitives.js';\n\n/**\n * Direct agent/tool runner with no dynamic script-loader dependency.\n *\n * This is the portable path used by React Native. Hosts that need deployable\n * script references use `createAgentToolLoopDefinition` from the full entry.\n */\nexport function createAgentToolLoopRunner(\n context: AgentFrameworkContext,\n): (input: AgentLoopInput) => AgentLoopGenerator {\n return async function* agentToolLoopRunner(input): AgentLoopGenerator {\n const state = createAgentToolLoopState(context);\n try {\n const start = await startAgentToolLoopTurn(context, input, state);\n if (start.step) yield start.step;\n if (start.action === 'stop') return;\n\n while (true) {\n const result = yield* runAgentToolLoopIteration(context, input, state);\n if (result.action === 'stop') return;\n }\n } catch (error) {\n await stopAgentToolLoopTurn(context, input, state, 'error');\n throw error;\n } finally {\n await stopAgentToolLoopTurn(context, input, state);\n }\n };\n}\n","/**\n * AgentToolLoop runner — convenience API for driving a full loop turn.\n */\n\nimport type { AgentFrameworkContext, AgentInstanceState } from '../../types.js';\nimport type { AgentLoopGenerator, AgentLoopInput, AgentLoopStep } from '../types.js';\nimport { createAgentToolLoopRunner } from './directRunner.js';\n\nexport interface RunAgentToolLoopTurnCallbacks {\n onStep?: (step: AgentLoopStep) => void | Promise<void>;\n onProgress?: (\n status: string,\n data: Record<string, unknown>,\n step: AgentLoopStep,\n ) => void | Promise<void>;\n agentToolLoop?: (input: AgentLoopInput) => AgentLoopGenerator;\n}\n\nexport interface RunAgentToolLoopTurnResult {\n state: AgentInstanceState;\n stepCount: number;\n}\n\nexport function resolveAgentToolLoopTerminalState(\n step: AgentLoopStep,\n current: AgentInstanceState,\n): AgentInstanceState {\n if (step.type !== 'thinking') return current;\n const data = step.data as { status?: string };\n if (data.status === 'input-required') return 'input-required';\n if (data.status === 'cancelled') return 'canceled';\n if (data.status === 'max-iterations') return 'completed';\n if (data.status === 'blocked') return 'failed';\n if (data.status === 'calling-llm') return 'working';\n return current;\n}\n\nexport async function runAgentToolLoopTurn(\n context: AgentFrameworkContext,\n input: AgentLoopInput,\n callbacks: RunAgentToolLoopTurnCallbacks = {},\n): Promise<RunAgentToolLoopTurnResult> {\n const agentToolLoop = callbacks.agentToolLoop ?? createAgentToolLoopRunner(context);\n let terminalState: AgentInstanceState = 'completed';\n let stepCount = 0;\n\n for await (const step of agentToolLoop(input)) {\n stepCount += 1;\n terminalState = resolveAgentToolLoopTerminalState(step, terminalState);\n await callbacks.onStep?.(step);\n\n if (step.type === 'thinking' && step.data && typeof step.data === 'object') {\n const data = step.data as Record<string, unknown>;\n const status = data.status;\n if (typeof status === 'string') {\n await callbacks.onProgress?.(status, data, step);\n }\n }\n }\n\n return {\n state: terminalState === 'working' || terminalState === 'submitted' ? 'completed' : terminalState,\n stepCount,\n };\n}\n","// Generated by scripts/generate-profile-sources.mjs. Edit src/loopProfiles/*.json instead.\n\n/** Builtin Loop Profile JSON sources, embedded at build time. */\nexport const builtinProfileSources: Readonly<Record<string, string>> = {\n 'code-assistant': [\n '{',\n ' \"id\": \"memeloop:code-assistant\",',\n ' \"name\": \"代码助手\",',\n ' \"description\": \"专注于代码编写、重构和调试的助手。\",',\n ' \"loopId\": \"agent-tool-loop\",',\n ' \"systemPrompt\": \"You are a senior software engineer helping the user write and refactor code.\",',\n ' \"tools\": [',\n ' \"workspacesList\",',\n ' \"modelContextProtocol\",',\n ' \"spawnAgent\",',\n ' \"askQuestion\",',\n ' \"getErrors\",',\n ' \"webFetch\"',\n ' ],',\n ' \"plugins\": [',\n ' { \"id\": \"builtin:mcp-client\" },',\n ' { \"id\": \"builtin:mcp-forward\" },',\n ' { \"id\": \"builtin:spawn-agent\" },',\n ' { \"id\": \"builtin:ask-question\" }',\n ' ],',\n ' \"agentTools\": [',\n ' {',\n ' \"toolId\": \"workspacesList\",',\n ' \"parameters\": {',\n ' \"workspacesListParam\": { \"targetId\": \"builtin-system\", \"position\": \"after\" }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"modelContextProtocol\",',\n ' \"parameters\": {',\n ' \"modelContextProtocolParam\": {',\n ' \"serverUrl\": \"http://127.0.0.1:38385/mcp\",',\n ' \"timeoutSecond\": 30,',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" },',\n ' \"toolResultDuration\": 1',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"spawnAgent\",',\n ' \"parameters\": {',\n ' \"spawnAgentParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" },',\n ' \"toolResultDuration\": 2,',\n ' \"defaultTimeoutMs\": 120000',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"askQuestion\",',\n ' \"parameters\": {',\n ' \"askQuestionParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" }',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"getErrors\",',\n ' \"parameters\": {',\n ' \"getErrorsParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" }',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"webFetch\",',\n ' \"parameters\": {',\n ' \"webFetchParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" },',\n ' \"toolResultDuration\": 1',\n ' }',\n ' }',\n ' }',\n ' ],',\n ' \"agentFrameworkConfig\": {',\n ' \"prompts\": [',\n ' {',\n ' \"id\": \"builtin-system\",',\n ' \"role\": \"system\",',\n ' \"text\": \"You are a senior software engineer helping the user write and refactor code. Prefer small, safe edits; use file.read and file.search before changing code; use terminal.execute for build/tests when appropriate.\"',\n ' }',\n ' ],',\n ' \"plugins\": [{ \"toolId\": \"fullReplacement\" }],',\n ' \"response\": []',\n ' },',\n ' \"modelConfig\": {',\n ' \"provider\": \"memeloop\",',\n ' \"model\": \"claude-opus-4.6\",',\n ' \"temperature\": 0.2,',\n ' \"maxTokens\": 4096',\n ' },',\n ' \"version\": \"1.0.0\"',\n '}',\n '',\n ].join('\\n'),\n 'frontend-ui-ux': [\n '{',\n ' \"id\": \"memeloop:frontend-ui-ux\",',\n ' \"name\": \"Frontend UI/UX\",',\n ' \"description\": \"Designer-turned-developer who crafts stunning UI/UX even without design mockups.\",',\n ' \"loopId\": \"agent-tool-loop\",',\n ' \"systemPrompt\": \"You are a designer-turned-developer who crafts stunning UI/UX even without design mockups.\\\\n\\\\nWhen working on frontend tasks:\\\\n- Prioritize visual polish and user experience above all else\\\\n- Use consistent spacing, typography, and color schemes\\\\n- Apply modern design patterns: rounded corners, subtle shadows, smooth transitions\\\\n- Ensure responsive design across mobile, tablet, and desktop breakpoints\\\\n- Prefer accessible patterns: semantic HTML, ARIA labels, keyboard navigation\\\\n- Optimize for perceived performance: skeleton loaders, optimistic updates, progressive enhancement\\\\n- Use component composition over monolithic layouts\\\\n- Match the existing design system when extending an existing UI\",',\n ' \"tools\": [',\n ' \"workspacesList\",',\n ' \"wikiSearch\",',\n ' \"wikiOperation\",',\n ' \"modelContextProtocol\",',\n ' \"spawnAgent\",',\n ' \"askQuestion\",',\n ' \"webFetch\"',\n ' ],',\n ' \"plugins\": [',\n ' { \"id\": \"builtin:mcp-client\" },',\n ' { \"id\": \"builtin:mcp-forward\" },',\n ' { \"id\": \"builtin:spawn-agent\" },',\n ' { \"id\": \"builtin:ask-question\" }',\n ' ],',\n ' \"agentTools\": [',\n ' {',\n ' \"toolId\": \"workspacesList\",',\n ' \"parameters\": {',\n ' \"workspacesListParam\": { \"targetId\": \"builtin-system\", \"position\": \"after\" }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"wikiSearch\",',\n ' \"parameters\": {',\n ' \"wikiSearchParam\": {',\n ' \"sourceType\": \"wiki\",',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" },',\n ' \"toolResultDuration\": 1',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"wikiOperation\",',\n ' \"parameters\": {',\n ' \"wikiOperationParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" },',\n ' \"toolResultDuration\": 1',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"modelContextProtocol\",',\n ' \"parameters\": {',\n ' \"modelContextProtocolParam\": {',\n ' \"serverUrl\": \"http://127.0.0.1:38385/mcp\",',\n ' \"timeoutSecond\": 30,',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" },',\n ' \"toolResultDuration\": 1',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"spawnAgent\",',\n ' \"parameters\": {',\n ' \"spawnAgentParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" },',\n ' \"toolResultDuration\": 2,',\n ' \"defaultTimeoutMs\": 120000',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"askQuestion\",',\n ' \"parameters\": {',\n ' \"askQuestionParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" }',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"webFetch\",',\n ' \"parameters\": {',\n ' \"webFetchParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" },',\n ' \"toolResultDuration\": 1',\n ' }',\n ' }',\n ' }',\n ' ],',\n ' \"agentFrameworkConfig\": {',\n ' \"prompts\": [',\n ' {',\n ' \"id\": \"builtin-system\",',\n ' \"role\": \"system\",',\n ' \"text\": \"You are a designer-turned-developer who crafts stunning UI/UX even without design mockups.\\\\n\\\\nWhen working on frontend tasks:\\\\n- Prioritize visual polish and user experience above all else\\\\n- Use consistent spacing, typography, and color schemes\\\\n- Apply modern design patterns: rounded corners, subtle shadows, smooth transitions\\\\n- Ensure responsive design across mobile, tablet, and desktop breakpoints\\\\n- Prefer accessible patterns: semantic HTML, ARIA labels, keyboard navigation\\\\n- Optimize for perceived performance: skeleton loaders, optimistic updates, progressive enhancement\\\\n- Use component composition over monolithic layouts\\\\n- Match the existing design system when extending an existing UI\"',\n ' }',\n ' ],',\n ' \"plugins\": [],',\n ' \"response\": []',\n ' },',\n ' \"modelConfig\": {',\n ' \"provider\": \"memeloop\",',\n ' \"model\": \"claude-opus-4.6\",',\n ' \"temperature\": 0.3,',\n ' \"maxTokens\": 4096',\n ' },',\n ' \"version\": \"1.0.0\"',\n '}',\n '',\n ].join('\\n'),\n 'general-assistant': [\n '{',\n ' \"id\": \"memeloop:general-assistant\",',\n ' \"name\": \"通用助手\",',\n ' \"description\": \"可靠的通用智能体,用于对话、Wiki 知识工作、目标推进和日常计算机操作。\",',\n ' \"loopId\": \"agent-tool-loop\",',\n ' \"systemPrompt\": \"You are MemeLoop, a reliable general-purpose agent for conversation, knowledge work, goal completion, and everyday computer tasks.\\\\n\\\\nOperating contract:\\\\n- Treat the user request as the active goal. For a task with three or more meaningful steps, use an enabled planning tool listed in the injected tool instructions to create a short plan, keep exactly one item in progress, and update it as work advances. Continue until the goal is achieved or genuinely blocked.\\\\n- Use tools for actions and for facts that must be read from the user\\'s environment. Never claim that an action succeeded without a successful tool result. Never invent search results, file contents, counts, or completion evidence.\\\\n- Use the exact tool name and parameter schema shown in the tool list. When calling a tool, output ONLY one tool call in this exact XML format:\\\\n<tool_use name=\\\\\"TOOL_NAME\\\\\">{\\\\\"param\\\\\":\\\\\"value\\\\\"}</tool_use>\\\\n The JSON must be valid. Never wrap the call in markdown or add text before or after it. After the tool result, reassess the goal and continue.\\\\n- If a tool fails, read the error and change the arguments or approach. Do not repeat an identical failed call more than once, and do not retry the same approach more than twice.\\\\n- For Wiki work, use an injected available workspace name or ID; do not guess one. Search before relying on stored knowledge. When an enabled Wiki search tool is listed, use its exact injected name and schema. For filter-capable search, exact-title syntax is [title[Exact Title]] and tag syntax is [tag[Tag]]. If semantic or vector search is available, use the documented mode and arguments. After a write, verify important content with an exact-title search. If verification fails, report that honestly.\\\\n- Save durable facts, decisions, plans, and user-requested memories to Wiki when useful. Do not store credentials or other sensitive data unless the user explicitly asks.\\\\n- For UI or computer actions, inspect the current state before acting, prefer reversible changes, verify the resulting state, and ask before destructive actions or consequential external communication.\\\\n- Do not ask for confirmation before an explicitly requested reversible action when the target is already known. Ask a concise question only when missing information materially changes the result. Otherwise make safe, explicit assumptions and proceed.\\\\n- In the final response, lead with the outcome, cite concrete verification, and state any remaining limitation briefly.\",',\n ' \"tools\": [',\n ' \"workspacesList\",',\n ' \"wikiSearch\",',\n ' \"wikiOperation\",',\n ' \"modelContextProtocol\",',\n ' \"spawnAgent\",',\n ' \"askQuestion\"',\n ' ],',\n ' \"plugins\": [',\n ' { \"id\": \"builtin:mcp-client\" },',\n ' { \"id\": \"builtin:mcp-forward\" },',\n ' { \"id\": \"builtin:spawn-agent\" },',\n ' { \"id\": \"builtin:ask-question\" },',\n ' { \"id\": \"builtin:todo-write\" }',\n ' ],',\n ' \"agentTools\": [',\n ' {',\n ' \"toolId\": \"workspacesList\",',\n ' \"parameters\": {',\n ' \"workspacesListParam\": { \"targetId\": \"builtin-system\", \"position\": \"after\" }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"wikiSearch\",',\n ' \"parameters\": {',\n ' \"wikiSearchParam\": {',\n ' \"sourceType\": \"wiki\",',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" },',\n ' \"toolResultDuration\": 1',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"wikiOperation\",',\n ' \"parameters\": {',\n ' \"wikiOperationParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" },',\n ' \"toolResultDuration\": 1',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"modelContextProtocol\",',\n ' \"parameters\": {',\n ' \"modelContextProtocolParam\": {',\n ' \"serverUrl\": \"http://127.0.0.1:38385/mcp\",',\n ' \"timeoutSecond\": 30,',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" },',\n ' \"toolResultDuration\": 1',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"spawnAgent\",',\n ' \"parameters\": {',\n ' \"spawnAgentParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" },',\n ' \"toolResultDuration\": 2,',\n ' \"defaultTimeoutMs\": 120000',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"askQuestion\",',\n ' \"parameters\": {',\n ' \"askQuestionParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" }',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"todo\",',\n ' \"parameters\": {',\n ' \"todoParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" },',\n ' \"todoInjectionTargetId\": \"builtin-system\",',\n ' \"toolResultDuration\": 1',\n ' }',\n ' }',\n ' }',\n ' ],',\n ' \"agentFrameworkConfig\": {',\n ' \"prompts\": [',\n ' {',\n ' \"id\": \"builtin-system\",',\n ' \"role\": \"system\",',\n ' \"text\": \"You are MemeLoop, a reliable general-purpose agent for conversation, knowledge work, goal completion, and everyday computer tasks.\\\\n\\\\nOperating contract:\\\\n- Treat the user request as the active goal. For a task with three or more meaningful steps, use an enabled planning tool listed in the injected tool instructions to create a short plan, keep exactly one item in progress, and update it as work advances. Continue until the goal is achieved or genuinely blocked.\\\\n- Use tools for actions and for facts that must be read from the user\\'s environment. Never claim that an action succeeded without a successful tool result. Never invent search results, file contents, counts, or completion evidence.\\\\n- Use the exact tool name and parameter schema shown in the tool list. When calling a tool, output ONLY one tool call in this exact XML format:\\\\n<tool_use name=\\\\\"TOOL_NAME\\\\\">{\\\\\"param\\\\\":\\\\\"value\\\\\"}</tool_use>\\\\n The JSON must be valid. Never wrap the call in markdown or add text before or after it. After the tool result, reassess the goal and continue.\\\\n- If a tool fails, read the error and change the arguments or approach. Do not repeat an identical failed call more than once, and do not retry the same approach more than twice.\\\\n- For Wiki work, use an injected available workspace name or ID; do not guess one. Search before relying on stored knowledge. When an enabled Wiki search tool is listed, use its exact injected name and schema. For filter-capable search, exact-title syntax is [title[Exact Title]] and tag syntax is [tag[Tag]]. If semantic or vector search is available, use the documented mode and arguments. After a write, verify important content with an exact-title search. If verification fails, report that honestly.\\\\n- Save durable facts, decisions, plans, and user-requested memories to Wiki when useful. Do not store credentials or other sensitive data unless the user explicitly asks.\\\\n- For UI or computer actions, inspect the current state before acting, prefer reversible changes, verify the resulting state, and ask before destructive actions or consequential external communication.\\\\n- Do not ask for confirmation before an explicitly requested reversible action when the target is already known. Ask a concise question only when missing information materially changes the result. Otherwise make safe, explicit assumptions and proceed.\\\\n- In the final response, lead with the outcome, cite concrete verification, and state any remaining limitation briefly.\"',\n ' }',\n ' ],',\n ' \"plugins\": [{ \"toolId\": \"fullReplacement\" }],',\n ' \"response\": []',\n ' },',\n ' \"modelConfig\": {',\n ' \"provider\": \"memeloop\",',\n ' \"model\": \"claude-opus-4.6\",',\n ' \"temperature\": 0.5,',\n ' \"maxTokens\": 4096',\n ' },',\n ' \"version\": \"1.1.1\"',\n '}',\n '',\n ].join('\\n'),\n 'git-master': [\n '{',\n ' \"id\": \"memeloop:git-master\",',\n ' \"name\": \"Git Master\",',\n ' \"description\": \"Expert git workflow management with safety-first approach.\",',\n ' \"loopId\": \"agent-tool-loop\",',\n ' \"systemPrompt\": \"You are an expert in git workflow management. Follow these rules:\\\\n\\\\nGit Safety Protocol:\\\\n- NEVER update the git config\\\\n- NEVER run destructive/irreversible git commands (push --force, hard reset, etc.) unless the user explicitly requests them\\\\n- NEVER skip hooks (--no-verify, --no-gpg-sign, etc.) unless the user explicitly requests it\\\\n- NEVER force push to main/master; warn the user if they request it\\\\n- Avoid git commit --amend. ONLY use --amend when ALL conditions are met:\\\\n (1) User explicitly requested amend, OR the commit succeeded and pre-commit hooks auto-modified files that need including\\\\n (2) HEAD commit was created by you in this conversation\\\\n (3) Commit has NOT been pushed to remote\\\\n- If commit FAILED or was REJECTED by hook, NEVER amend — fix the issue and create a NEW commit\\\\n- If you already pushed to remote, NEVER amend unless user explicitly requests it (requires force push)\\\\n\\\\nCommitting:\\\\n- NEVER commit changes unless the user explicitly asks\\\\n- Run: git status, git diff, git log (recent commits)\\\\n- Analyze all staged changes and draft a concise commit message\\\\n- Summarize nature of changes: add/update/fix/refactor/test/docs\\\\n- Do NOT commit files that likely contain secrets\\\\n\\\\nPull Requests:\\\\n- Check branch status, divergence from base, full commit history\\\\n- Create PR with descriptive title and summary body\\\\n- Return the PR URL when done\",',\n ' \"tools\": [\"workspacesList\", \"git\", \"askQuestion\"],',\n ' \"plugins\": [{ \"id\": \"builtin:ask-question\" }],',\n ' \"agentTools\": [',\n ' {',\n ' \"toolId\": \"workspacesList\",',\n ' \"parameters\": {',\n ' \"workspacesListParam\": { \"targetId\": \"builtin-system\", \"position\": \"after\" }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"git\",',\n ' \"parameters\": {',\n ' \"gitParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" }',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"askQuestion\",',\n ' \"parameters\": {',\n ' \"askQuestionParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" }',\n ' }',\n ' }',\n ' }',\n ' ],',\n ' \"agentFrameworkConfig\": {',\n ' \"prompts\": [',\n ' {',\n ' \"id\": \"builtin-system\",',\n ' \"role\": \"system\",',\n ' \"text\": \"You are an expert in git workflow management. Follow these rules:\\\\n\\\\nGit Safety Protocol:\\\\n- NEVER update the git config\\\\n- NEVER run destructive/irreversible git commands (push --force, hard reset, etc.) unless the user explicitly requests them\\\\n- NEVER skip hooks (--no-verify, --no-gpg-sign, etc.) unless the user explicitly requests it\\\\n- NEVER force push to main/master; warn the user if they request it\\\\n- Avoid git commit --amend. ONLY use --amend when ALL conditions are met:\\\\n (1) User explicitly requested amend, OR the commit succeeded and pre-commit hooks auto-modified files that need including\\\\n (2) HEAD commit was created by you in this conversation\\\\n (3) Commit has NOT been pushed to remote\\\\n- If commit FAILED or was REJECTED by hook, NEVER amend — fix the issue and create a NEW commit\\\\n- If you already pushed to remote, NEVER amend unless user explicitly requests it (requires force push)\\\\n\\\\nCommitting:\\\\n- NEVER commit changes unless the user explicitly asks\\\\n- Run: git status, git diff, git log (recent commits)\\\\n- Analyze all staged changes and draft a concise commit message\\\\n- Summarize nature of changes: add/update/fix/refactor/test/docs\\\\n- Do NOT commit files that likely contain secrets\\\\n\\\\nPull Requests:\\\\n- Check branch status, divergence from base, full commit history\\\\n- Create PR with descriptive title and summary body\\\\n- Return the PR URL when done\"',\n ' }',\n ' ],',\n ' \"plugins\": [],',\n ' \"response\": []',\n ' },',\n ' \"modelConfig\": {',\n ' \"provider\": \"memeloop\",',\n ' \"model\": \"claude-opus-4.6\",',\n ' \"temperature\": 0.2,',\n ' \"maxTokens\": 4096',\n ' },',\n ' \"version\": \"1.0.0\"',\n '}',\n '',\n ].join('\\n'),\n playwright: [\n '{',\n ' \"id\": \"memeloop:playwright\",',\n ' \"name\": \"Playwright\",',\n ' \"description\": \"Browser automation via Playwright for verification, browsing, information gathering, web scraping, testing, and screenshots.\",',\n ' \"loopId\": \"agent-tool-loop\",',\n ' \"systemPrompt\": \"You have access to Playwright for browser automation. Use it for:\\\\n\\\\nBrowser Automation:\\\\n- Navigate to URLs and verify page content\\\\n- Fill forms, click buttons, and interact with page elements\\\\n- Take screenshots of specific elements or full pages\\\\n- Extract data from web pages (scraping)\\\\n- Test web application functionality end-to-end\\\\n- Automate browser workflows\\\\n- Log into websites and maintain sessions\\\\n\\\\nBest Practices:\\\\n- Use specific selectors (data-testid, id, or unique CSS selectors) over fragile XPath\\\\n- Wait for elements to be visible before interacting\\\\n- Handle page navigation and loading states explicitly\\\\n- Take screenshots at key steps for debugging\\\\n- Clean up browser resources when done\\\\n- Handle timeouts and error states gracefully\\\\n\\\\nAvailable Playwright MCP Tools:\\\\n- browser_navigate: Navigate to a URL\\\\n- browser_click: Click an element\\\\n- browser_type: Type into an input field\\\\n- browser_snapshot: Take accessibility snapshot of page\\\\n- browser_take_screenshot: Capture screenshot\\\\n- browser_fill_form: Fill multiple form fields at once\\\\n- browser_evaluate: Execute JavaScript in page context\\\\n- browser_select_option: Select from dropdown\\\\n- browser_drag: Drag and drop elements\\\\n- browser_hover: Hover over an element\\\\n- browser_press_key: Press a keyboard key\\\\n- browser_handle_dialog: Handle browser dialogs (alert/confirm/prompt)\\\\n- browser_close: Close the browser\",',\n ' \"tools\": [\"modelContextProtocol\", \"askQuestion\"],',\n ' \"plugins\": [',\n ' { \"id\": \"builtin:mcp-client\" },',\n ' { \"id\": \"builtin:mcp-forward\" },',\n ' { \"id\": \"builtin:ask-question\" }',\n ' ],',\n ' \"agentTools\": [',\n ' {',\n ' \"toolId\": \"modelContextProtocol\",',\n ' \"parameters\": {',\n ' \"modelContextProtocolParam\": {',\n ' \"serverUrl\": \"http://127.0.0.1:38385/mcp\",',\n ' \"timeoutSecond\": 30,',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" },',\n ' \"toolResultDuration\": 1',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"askQuestion\",',\n ' \"parameters\": {',\n ' \"askQuestionParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" }',\n ' }',\n ' }',\n ' }',\n ' ],',\n ' \"agentFrameworkConfig\": {',\n ' \"prompts\": [',\n ' {',\n ' \"id\": \"builtin-system\",',\n ' \"role\": \"system\",',\n ' \"text\": \"You have access to Playwright for browser automation. Use it for:\\\\n\\\\nBrowser Automation:\\\\n- Navigate to URLs and verify page content\\\\n- Fill forms, click buttons, and interact with page elements\\\\n- Take screenshots of specific elements or full pages\\\\n- Extract data from web pages (scraping)\\\\n- Test web application functionality end-to-end\\\\n- Automate browser workflows\\\\n- Log into websites and maintain sessions\\\\n\\\\nBest Practices:\\\\n- Use specific selectors (data-testid, id, or unique CSS selectors) over fragile XPath\\\\n- Wait for elements to be visible before interacting\\\\n- Handle page navigation and loading states explicitly\\\\n- Take screenshots at key steps for debugging\\\\n- Clean up browser resources when done\\\\n- Handle timeouts and error states gracefully\\\\n\\\\nAvailable Playwright MCP Tools:\\\\n- browser_navigate: Navigate to a URL\\\\n- browser_click: Click an element\\\\n- browser_type: Type into an input field\\\\n- browser_snapshot: Take accessibility snapshot of page\\\\n- browser_take_screenshot: Capture screenshot\\\\n- browser_fill_form: Fill multiple form fields at once\\\\n- browser_evaluate: Execute JavaScript in page context\\\\n- browser_select_option: Select from dropdown\\\\n- browser_drag: Drag and drop elements\\\\n- browser_hover: Hover over an element\\\\n- browser_press_key: Press a keyboard key\\\\n- browser_handle_dialog: Handle browser dialogs (alert/confirm/prompt)\\\\n- browser_close: Close the browser\"',\n ' }',\n ' ],',\n ' \"plugins\": [],',\n ' \"response\": []',\n ' },',\n ' \"modelConfig\": {',\n ' \"provider\": \"memeloop\",',\n ' \"model\": \"claude-opus-4.6\",',\n ' \"temperature\": 0.3,',\n ' \"maxTokens\": 4096',\n ' },',\n ' \"version\": \"1.0.0\"',\n '}',\n '',\n ].join('\\n'),\n};\n","/**\n * Built-in Loop Profiles.\n *\n * Each profile defines which agent loop to run, which .mjs script to load,\n * which prompts, plugins, and hook plugins to enable.\n *\n * Replaces the old `src/prompt/loadBuiltins.ts`.\n */\n\nimport { getLoopRegistry } from '../loopAPI/registry.js';\nimport type { LoopProfile } from '../loopAPI/types.js';\nimport { builtinProfileSources } from './builtinProfileSources.js';\n\nfunction loadProfile(name: string): LoopProfile {\n const source = builtinProfileSources[name];\n if (!source) {\n throw new Error(`Builtin profile not found: ${name}`);\n }\n return JSON.parse(source) as LoopProfile;\n}\n\n/** Get all built-in Loop Profiles. */\nexport function getBuiltinLoopProfiles(): LoopProfile[] {\n return [\n loadProfile('general-assistant'),\n loadProfile('code-assistant'),\n loadProfile('frontend-ui-ux'),\n loadProfile('git-master'),\n loadProfile('playwright'),\n ];\n}\n\n/** Get a built-in Loop Profile by id. */\nexport function getBuiltinLoopProfile(id: string): LoopProfile | undefined {\n return getBuiltinLoopProfiles().find((p) => p.id === id);\n}\n\n/** Register bundled profiles with the global loop registry. */\nexport function registerBuiltinLoopProfiles(): void {\n const registry = getLoopRegistry();\n for (const profile of getBuiltinLoopProfiles()) {\n registry.registerProfile(profile);\n }\n}\n"],"mappings":"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AAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,kBAAkB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,qBAAqB;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,cAAc;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;;;AC7ZA,SAAS,YAAY,MAA2B;AAC9C,QAAM,SAAS,sBAAsB,IAAI;AACzC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,8BAA8B,IAAI,EAAE;AAAA,EACtD;AACA,SAAO,KAAK,MAAM,MAAM;AAC1B;AAGO,SAAS,yBAAwC;AACtD,SAAO;AAAA,IACL,YAAY,mBAAmB;AAAA,IAC/B,YAAY,gBAAgB;AAAA,IAC5B,YAAY,gBAAgB;AAAA,IAC5B,YAAY,YAAY;AAAA,IACxB,YAAY,YAAY;AAAA,EAC1B;AACF;AAGO,SAAS,sBAAsB,IAAqC;AACzE,SAAO,uBAAuB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACzD;","names":["result","JSON5","max","chunkToText","chunkToText"]}
|
|
1
|
+
{"version":3,"sources":["../src/mobile.ts","../src/llm/fetchProvider.ts","../src/conversation/parts.ts","../src/conversation/factory.ts","../src/tools/pluginRegistry.ts","../src/promptUtilities/responseConcat.ts","../src/promptUtilities/responsePatternUtility.ts","../src/storage/nextLamport.ts","../src/loopAPI/hooks/registry.ts","../src/loopAPI/agent-tool-loop/compaction.ts","../src/loopAPI/agent-tool-loop/historyCompaction.ts","../src/loopAPI/agent-tool-loop/llmStream.ts","../src/promptUtilities/promptConcat.ts","../src/promptUtilities/utilities.ts","../src/loopAPI/agent-tool-loop/toolResultMessage.ts","../src/loopAPI/agent-tool-loop/modelMessages.ts","../src/orchestration/drivers/unknownEffect.ts","../src/orchestration/errors.ts","../src/orchestration/resources.ts","../src/tools/structuredToolResult.ts","../src/loopAPI/agent-tool-loop/toolCallRunner.ts","../src/permission/engine.ts","../src/orchestration/security/admission.ts","../src/tools/approval.ts","../src/loopAPI/agent-tool-loop/toolUseGate.ts","../src/loopAPI/agent-tool-loop/turnPrimitives.ts","../src/loopAPI/agent-tool-loop/directRunner.ts","../src/loopAPI/agent-tool-loop/runner.ts","../src/loopProfiles/builtinProfileSources.ts","../src/loopProfiles/loadBuiltins.ts"],"sourcesContent":["/**\n * React Native entry: fetch-based LLM access and direct agent/tool execution.\n *\n * Deployable JavaScript loop loading is intentionally excluded because Metro\n * cannot transform variable dynamic imports. Remote orchestration remains\n * available from the browser entry.\n */\nexport type * from './agent/agentProfiles.js';\nexport type * from './conversation/types.js';\nexport type * from './device-network/types.js';\nexport { createFetchLLMProvider } from './llm/fetchProvider.js';\nexport type * from './llm/providerRegistry.js';\nexport { resolveAgentToolLoopTerminalState, runAgentToolLoopTurn, type RunAgentToolLoopTurnCallbacks, type RunAgentToolLoopTurnResult } from './loopAPI/agent-tool-loop/runner.js';\nexport type * from './loopAPI/types.js';\nexport { getBuiltinLoopProfile, getBuiltinLoopProfiles } from './loopProfiles/loadBuiltins.js';\nexport type * from './types.js';\n","/**\n * Provider-agnostic LLM provider — wraps a current Vercel AI SDK LanguageModel.\n *\n * The core does NOT depend on @ai-sdk/openai or any specific provider.\n * Hosts inject their own `createModel` factory:\n *\n * import { createOpenAI } from '@ai-sdk/openai';\n * const openai = createOpenAI({ baseURL: '...', apiKey: '...' });\n * const provider = createFetchLLMProvider({\n * name: 'openai',\n * createModel: (id) => openai(id ?? 'gpt-4o-mini'),\n * });\n *\n * Or for Anthropic:\n * import { createAnthropic } from '@ai-sdk/anthropic';\n * const anthropic = createAnthropic({ apiKey: '...' });\n * const provider = createFetchLLMProvider({\n * name: 'claude',\n * createModel: (id) => anthropic(id ?? 'claude-3-5-sonnet-20241022'),\n * });\n *\n * Works with every @ai-sdk/* provider: openai, anthropic, google, deepseek,\n * cohere, mistral, azure, bedrock, groq, ollama, openrouter, together, etc.\n */\n\nimport type { JSONValue, LanguageModel } from 'ai';\nimport { generateText, streamText } from 'ai';\n\nimport type { ILLMProvider } from '../types.js';\n\nexport interface FetchLLMChatRequest {\n messages?: Array<{ role: string; content: string }>;\n model?: string;\n stream?: boolean;\n /** Legacy OpenAI-compatible spelling retained for host adapters. */\n max_tokens?: number;\n /** AI SDK spelling. Takes precedence over max_tokens. */\n maxOutputTokens?: number;\n temperature?: number;\n topP?: number;\n providerOptions?: Record<string, Record<string, JSONValue>>;\n system?: string;\n abortSignal?: AbortSignal;\n}\n\nexport function resolveFetchLLMCallSettings(body: FetchLLMChatRequest): {\n maxOutputTokens: number | undefined;\n temperature: number | undefined;\n topP: number | undefined;\n providerOptions: Record<string, Record<string, JSONValue>> | undefined;\n abortSignal: AbortSignal | undefined;\n} {\n return {\n maxOutputTokens: body.maxOutputTokens ?? body.max_tokens,\n temperature: body.temperature,\n topP: body.topP,\n providerOptions: body.providerOptions,\n abortSignal: body.abortSignal,\n };\n}\n\n// ─── Config ────────────────────────────────────────────────────────────\n\nexport interface FetchLLMProviderConfig {\n /** Display name. */\n name: string;\n /** Serializable default model identity for scheduling and audit records. */\n modelId?: string;\n /**\n * Factory: given an optional model id, return a LanguageModel from any @ai-sdk/* provider.\n * The factory is responsible for picking a default model when `modelId` is omitted.\n */\n createModel: (modelId?: string) => LanguageModel;\n}\n\n// ─── Factory ───────────────────────────────────────────────────────────\n\n/**\n * Create an `ILLMProvider` that delegates to the Vercel AI SDK.\n *\n * Provider-agnostic — hosts supply their own `createModel` factory.\n * Supports every @ai-sdk/* provider (OpenAI, Anthropic, Google, DeepSeek,\n * Groq, Ollama, OpenRouter, Together, Bedrock, Azure, Mistral, Cohere…).\n *\n * @example\n * ```ts\n * import { createOpenAI } from '@ai-sdk/openai';\n * const openai = createOpenAI({ baseURL: 'https://api.openai.com/v1', apiKey });\n * const provider = createFetchLLMProvider({\n * name: 'openai',\n * createModel: (modelId) => openai(modelId ?? 'gpt-4o-mini'),\n * });\n * ```\n */\nexport function createFetchLLMProvider(config: FetchLLMProviderConfig): ILLMProvider {\n return {\n name: config.name,\n ...(config.modelId !== undefined ? { modelId: config.modelId } : {}),\n // Store the factory so hosts can introspect or extend\n model: config.createModel as unknown as LanguageModel,\n async chat(request: unknown) {\n const body = (typeof request === 'object' && request !== null ? request : {}) as FetchLLMChatRequest;\n\n const model = config.createModel(body.model);\n const specificationVersion = (\n model as { specificationVersion?: unknown } | null\n )?.specificationVersion;\n if (\n model === null ||\n typeof model !== 'object' ||\n !['v2', 'v3', 'v4'].includes(String(specificationVersion))\n ) {\n throw new Error(\n `LLM provider '${config.name}' returned an incompatible AI SDK model for '${\n typeof body.model === 'string' ? body.model : (config.modelId ?? 'default')\n }' (expected specificationVersion v2, v3, or v4; received ${String(specificationVersion)})`,\n );\n }\n\n const systemMessages = (body.messages ?? [])\n .filter((message) => message.role === 'system')\n .map((message) => message.content);\n const messages = (body.messages ?? [])\n .filter((message) => message.role !== 'system')\n .map((message) => {\n // AI SDK model messages do not accept a bare textual tool role.\n // MemeLoop stores tool results as role='tool'; promote them to user\n // messages while preserving the result text in conversation history.\n const role = message.role === 'tool' ? 'user' : (message.role as 'user' | 'assistant');\n return {\n role,\n content: message.content,\n };\n });\n\n const system = body.system ?? (\n systemMessages.length > 0 ? systemMessages.join('\\n\\n') : undefined\n );\n const { abortSignal, maxOutputTokens, providerOptions, temperature, topP } = resolveFetchLLMCallSettings(body);\n\n if (body.stream !== false) {\n let streamingError: unknown;\n const result = streamText({\n model,\n instructions: system,\n messages,\n maxOutputTokens,\n temperature,\n topP,\n providerOptions,\n abortSignal,\n onError: ({ error }) => {\n streamingError = error;\n },\n });\n return (async function*() {\n for await (const chunk of result.textStream) {\n yield chunk;\n }\n if (streamingError !== undefined) {\n throw streamingError instanceof Error\n ? streamingError\n : new Error('The model stream failed', { cause: streamingError });\n }\n })();\n }\n\n const result = await generateText({\n model,\n instructions: system,\n messages,\n maxOutputTokens,\n temperature,\n topP,\n providerOptions,\n abortSignal,\n });\n return result.text;\n },\n };\n}\n","import type { AttachmentReference, ChatAttachmentPart, ChatMessage, ChatMessagePart, ChatReasoningPart, ChatToolCallPart, ChatToolResultPart, ToolCall } from './types.js';\n\nexport interface ChatMessageProjection {\n content: string;\n reasoning_content?: string;\n toolCalls?: ToolCall[];\n attachments?: AttachmentReference[];\n}\n\nfunction tryParseJson(value: string): unknown {\n try {\n return JSON.parse(value);\n } catch {\n return undefined;\n }\n}\n\nexport function parseLegacyToolResultContent(content: string): ChatToolResultPart | null {\n const match = /(?:<functions_result>\\s*)?Tool:\\s*(.+?)\\nParameters:\\s*(.+?)\\n(Error|Result):\\s*([\\s\\S]*?)\\s*(?:<\\/functions_result>|$)/su.exec(content.trim());\n if (!match) return null;\n\n const [, rawToolName, rawParameters, kind, rawBody] = match;\n const parsedParameters = tryParseJson(rawParameters.trim());\n const result = rawBody.trim();\n return {\n type: 'tool-result',\n toolName: rawToolName.trim(),\n parameters: parsedParameters,\n result,\n isError: kind === 'Error',\n payload: tryParseJson(result),\n };\n}\n\nfunction isTextPart(part: ChatMessagePart): part is Extract<ChatMessagePart, { type: 'text' }> {\n return part.type === 'text';\n}\n\nfunction isReasoningPart(part: ChatMessagePart): part is ChatReasoningPart {\n return part.type === 'reasoning';\n}\n\nfunction isToolCallPart(part: ChatMessagePart): part is ChatToolCallPart {\n return part.type === 'tool-call';\n}\n\nfunction isAttachmentPart(part: ChatMessagePart): part is ChatAttachmentPart {\n return part.type === 'attachment';\n}\n\nexport function isToolResultPart(part: ChatMessagePart): part is ChatToolResultPart {\n return part.type === 'tool-result';\n}\n\nexport function buildToolResultSummary(part: ChatToolResultPart): string {\n const prefix = part.isError ? 'Error' : 'Result';\n const suffix = part.result.trim();\n if (suffix.length === 0) return `${prefix} from ${part.toolName}`;\n return `${prefix} from ${part.toolName}: ${suffix}`;\n}\n\nexport function projectChatMessageParts(parts: readonly ChatMessagePart[]): ChatMessageProjection {\n const text = parts.filter(isTextPart).map((part) => part.text.trim()).filter(Boolean);\n const reasoning = parts.filter(isReasoningPart).map((part) => part.text.trim()).filter(Boolean);\n const toolCalls = parts\n .filter(isToolCallPart)\n .map((part) => ({ id: part.toolCallId, toolName: part.toolName, arguments: part.arguments }));\n const attachments = parts.filter(isAttachmentPart).map((part) => part.attachment);\n const toolResults = parts.filter(isToolResultPart);\n\n let content = text.join('\\n\\n');\n if (content.length === 0 && toolResults.length > 0) {\n content = toolResults.map(buildToolResultSummary).join('\\n\\n');\n }\n if (content.length === 0 && toolCalls.length > 0) {\n content = toolCalls.map((part) => `Tool call: ${part.toolName}`).join('\\n\\n');\n }\n\n return {\n content,\n reasoning_content: reasoning.length > 0 ? reasoning.join('\\n\\n') : undefined,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n attachments: attachments.length > 0 ? attachments : undefined,\n };\n}\n\nexport function buildLegacyChatMessageParts(input: {\n role: string;\n content?: string;\n reasoning_content?: string;\n toolCalls?: ToolCall[];\n attachments?: AttachmentReference[];\n detailRef?: ChatToolResultPart['detailRef'];\n metadata?: Record<string, unknown>;\n}): ChatMessagePart[] {\n const parts: ChatMessagePart[] = [];\n\n if (input.role !== 'tool' && typeof input.content === 'string' && input.content.trim().length > 0) {\n parts.push({ type: 'text', text: input.content });\n }\n\n if (typeof input.reasoning_content === 'string' && input.reasoning_content.trim().length > 0) {\n parts.push({ type: 'reasoning', text: input.reasoning_content });\n }\n\n if (input.toolCalls) {\n for (const toolCall of input.toolCalls) {\n parts.push({\n type: 'tool-call',\n toolCallId: toolCall.id,\n toolName: toolCall.toolName,\n arguments: toolCall.arguments,\n });\n }\n }\n\n if (input.attachments) {\n for (const attachment of input.attachments) {\n parts.push({ type: 'attachment', attachment });\n }\n }\n\n if (input.role === 'tool') {\n const metadata = input.metadata ?? {};\n const parsed = typeof input.content === 'string' ? parseLegacyToolResultContent(input.content) : null;\n const toolName = typeof metadata.toolId === 'string' && metadata.toolId.length > 0\n ? metadata.toolId\n : parsed?.toolName ?? 'tool';\n const result = parsed?.result ?? (typeof input.content === 'string' ? input.content : '');\n const payload = parsed?.payload ?? tryParseJson(result);\n parts.push({\n type: 'tool-result',\n toolName,\n parameters: metadata.toolParameters ?? parsed?.parameters,\n result,\n isError: metadata.isError === true || parsed?.isError === true,\n payload,\n detailRef: input.detailRef,\n });\n }\n\n return parts;\n}\n\nexport function getChatMessageParts(\n message: Pick<\n ChatMessage,\n 'role' | 'parts' | 'content' | 'reasoning_content' | 'toolCalls' | 'attachments' | 'detailRef' | 'metadata'\n >,\n): ChatMessagePart[] {\n return message.parts ?? buildLegacyChatMessageParts(message);\n}\n","/**\n * Domain factories for creating canonical ChatMessage and AgentInstance objects.\n *\n * These factories ensure that every host (Desktop, Mobile, CLI, Cloud)\n * constructs messages and instances with the same required fields,\n * default values, and clock behavior.\n *\n * Hosts that need a different originNodeId, message ID scheme, or lamport\n * clock source should pass those values explicitly rather than creating\n * their own factory.\n */\nimport type { AgentDefinition } from '../agent/types.js';\nimport type { AgentFrameworkConfig } from '../promptUtilities/types.js';\nimport type { AgentInstance, AgentInstanceLatestStatus } from '../types.js';\nimport { buildLegacyChatMessageParts, projectChatMessageParts } from './parts.js';\nimport type { ChatMessage, ChatRole } from './types.js';\n\n/**\n * Create a canonical ChatMessage with required defaults.\n *\n * @param input.messageId - Unique message identifier. Use nanoid or equivalent.\n * @param input.conversationId - The conversation/agent-instance this message belongs to.\n * @param input.role - Message role (user, assistant, tool, agent, error).\n * @param input.content - Message text content.\n * @param input.originNodeId - Node that originated this message. Core default is \"unknown\";\n * hosts should pass their own identifier (e.g. \"tidgi-desktop\", \"memeloop-cli\").\n * @param input.contentType - MIME type override (default \"text/plain\").\n * @param input.metadata - Optional metadata map.\n * @param input.duration - Processing duration in ms.\n * @param input.lamportClock - Lamport clock value. Defaults to `Date.now()`.\n * @param input.toolCalls - Tool calls associated with assistant messages.\n * @param input.reasoning_content - Reasoning/thinking content.\n * @param input.hidden - Whether the message is hidden from the UI.\n * @param input.detailRef - Reference to large tool output stored elsewhere.\n */\nexport function createChatMessage(input: {\n messageId: string;\n conversationId: string;\n role: ChatRole;\n content?: string;\n originNodeId?: string;\n contentType?: string;\n metadata?: Record<string, unknown>;\n duration?: number | null;\n lamportClock?: number;\n parts?: ChatMessage['parts'];\n toolCalls?: ChatMessage['toolCalls'];\n reasoning_content?: string;\n hidden?: boolean;\n attachments?: ChatMessage['attachments'];\n detailRef?: ChatMessage['detailRef'];\n}): ChatMessage {\n const now = Date.now();\n const parts = input.parts ?? buildLegacyChatMessageParts({\n role: input.role,\n content: input.content,\n reasoning_content: input.reasoning_content,\n toolCalls: input.toolCalls,\n attachments: input.attachments,\n detailRef: input.detailRef,\n metadata: input.metadata,\n });\n const projection = projectChatMessageParts(parts);\n return {\n messageId: input.messageId,\n conversationId: input.conversationId,\n originNodeId: input.originNodeId ?? 'unknown',\n timestamp: now,\n lamportClock: input.lamportClock ?? now,\n role: input.role,\n parts: parts.length > 0 ? parts : undefined,\n content: input.content ?? projection.content,\n contentType: input.contentType ?? 'text/plain',\n metadata: input.metadata,\n duration: input.duration,\n toolCalls: input.toolCalls ?? projection.toolCalls,\n reasoning_content: input.reasoning_content ?? projection.reasoning_content,\n hidden: input.hidden,\n attachments: input.attachments ?? projection.attachments,\n detailRef: input.detailRef,\n };\n}\n\n/**\n * Default status applied to newly created agent instances.\n */\nconst DEFAULT_INSTANCE_STATUS: AgentInstanceLatestStatus = {\n state: 'completed',\n modified: new Date(),\n};\n\n/**\n * Create an AgentInstance from an AgentDefinition.\n *\n * The returned instance has an empty message list, a default \"completed\"\n * status, and copies all definition-level fields as instance defaults.\n *\n * @param definition - The AgentDefinition to base the instance on.\n * @param overrides - Optional overrides for instance-specific fields:\n * - `id`: Instance ID (default: nanoid-equivalent, must be provided by host)\n * - `name`: Display name (default: definition.name)\n * - `status`: Initial status\n * - `volatile`: Whether the instance is ephemeral\n * - `closed`: Whether closed on creation\n * - `isDelegatedAgentRun`, `parentAgentRunId`: Delegated agent relationship\n * - `agentFrameworkConfig`: Per-instance framework config override\n */\nexport function createAgentInstanceFromDefinition(\n definition: AgentDefinition,\n overrides: {\n id: string;\n name?: string;\n status?: AgentInstanceLatestStatus;\n volatile?: boolean;\n closed?: boolean;\n isDelegatedAgentRun?: boolean;\n parentAgentRunId?: string;\n agentFrameworkConfig?: AgentFrameworkConfig;\n },\n): AgentInstance {\n const now = new Date();\n return {\n ...definition,\n id: overrides.id,\n agentDefId: definition.id,\n name: overrides.name ?? definition.name,\n status: overrides.status ?? DEFAULT_INSTANCE_STATUS,\n messages: [],\n created: now,\n modified: now,\n closed: overrides.closed ?? false,\n volatile: overrides.volatile ?? false,\n isDelegatedAgentRun: overrides.isDelegatedAgentRun,\n parentAgentRunId: overrides.parentAgentRunId,\n agentFrameworkConfig: overrides.agentFrameworkConfig,\n };\n}\n","import type { HookSlot, PromptConcatHooks, PromptConcatTool, TapAsyncHandler } from './types.js';\n\nconst defaultPluginRegistry = new Map<string, PromptConcatTool>();\n/**\n * 默认全局注册表。生产与常规定义工具共用此 Map。\n * 测试或沙箱可用 {@link runWithPluginRegistry} 替换为独立 Map,避免用例间泄漏。\n */\nexport const pluginRegistry = defaultPluginRegistry;\n\n/**\n * 当前活跃的插件注册表覆盖(用于测试隔离)。\n * 不使用 AsyncLocalStorage,改用模块级变量 + try/finally,避免对 node:async_hooks 的依赖。\n */\nlet activeOverride: Map<string, PromptConcatTool> | null = null;\n\nexport function getActivePluginRegistry(): Map<string, PromptConcatTool> {\n return activeOverride ?? defaultPluginRegistry;\n}\n\nexport function runWithPluginRegistry<T>(\n registry: Map<string, PromptConcatTool>,\n function_: () => T,\n): T {\n const previous = activeOverride;\n activeOverride = registry;\n try {\n return function_();\n } finally {\n activeOverride = previous;\n }\n}\n\n/** Lightweight hook slot:tapAsync 注册,promise 串行执行(对齐 TidGi tapable AsyncSeriesHook) */\nfunction createHookSlot(): HookSlot & {\n handlers: TapAsyncHandler[];\n} {\n const handlers: TapAsyncHandler[] = [];\n return {\n handlers,\n tapAsync(_name, function_) {\n handlers.push(function_);\n },\n async promise(context: unknown) {\n for (const function_ of handlers) {\n await new Promise<void>((resolve) => {\n function_(context, resolve);\n });\n }\n },\n };\n}\n\nexport function createAgentFrameworkHooks(): PromptConcatHooks {\n return {\n processPrompts: createHookSlot(),\n finalizePrompts: createHookSlot(),\n postProcess: createHookSlot(),\n userMessageReceived: createHookSlot(),\n agentStatusChanged: createHookSlot(),\n toolExecuted: createHookSlot(),\n responseUpdate: createHookSlot(),\n responseComplete: createHookSlot(),\n };\n}\n\nconst hookHandlers: {\n processPrompts?: TapAsyncHandler[];\n} = {};\n\nexport async function runProcessPromptsHooks<TContext>(\n _hooks: PromptConcatHooks,\n context: TContext,\n): Promise<TContext> {\n const slot = _hooks.processPrompts as {\n handlers?: TapAsyncHandler[];\n };\n const fns = slot?.handlers ?? hookHandlers.processPrompts ?? [];\n for (const function_ of fns) {\n await new Promise<void>((resolve) => {\n function_(context, resolve);\n });\n }\n return context;\n}\n\nexport async function runResponseCompleteHooks(\n hooks: PromptConcatHooks,\n context: unknown,\n): Promise<void> {\n await hooks.responseComplete.promise(context);\n}\n\nexport async function runPostProcessHooks(\n hooks: PromptConcatHooks,\n context: unknown,\n): Promise<void> {\n await hooks.postProcess.promise(context);\n}\n\nexport async function runToolExecutedHooks(\n hooks: PromptConcatHooks,\n context: unknown,\n): Promise<void> {\n await hooks.toolExecuted.promise(context);\n}\n\n/**\n * TidGi `createHooksWithPlugins`:按 agentFrameworkConfig.plugins 把插件注册表里的工具挂到 hooks。\n */\n/** 从 Agent 上下文解析插件表:优先 `tools.getPromptPlugins()`,否则 ALS / 全局默认。 */\nexport function resolvePromptPluginMap(context: {\n tools?: { getPromptPlugins?: () => Map<string, PromptConcatTool> };\n}): Map<string, PromptConcatTool> {\n const fromTools = context.tools?.getPromptPlugins?.();\n if (fromTools) return fromTools;\n return getActivePluginRegistry();\n}\n\nexport async function createHooksWithPlugins(\n agentFrameworkConfig: {\n plugins?: Array<{ toolId: string; [key: string]: unknown }>;\n },\n options?: { pluginRegistry?: Map<string, PromptConcatTool> },\n): Promise<{\n hooks: PromptConcatHooks;\n pluginConfigs: Array<{ toolId: string; [key: string]: unknown }>;\n}> {\n const reg = options?.pluginRegistry ?? getActivePluginRegistry();\n const hooks = createAgentFrameworkHooks();\n if (agentFrameworkConfig.plugins) {\n for (const pluginConfig of agentFrameworkConfig.plugins) {\n const { toolId } = pluginConfig;\n const plugin = reg.get(toolId);\n if (plugin) {\n plugin(hooks);\n }\n }\n }\n return {\n hooks,\n pluginConfigs: agentFrameworkConfig.plugins ?? [],\n };\n}\n","/**\n * TidGi `responseConcat.ts` 迁移:postProcess 钩子链 + responses 合并。\n */\nimport type { ChatMessage } from '../conversation/index.js';\nimport { createAgentFrameworkHooks, resolvePromptPluginMap, runPostProcessHooks } from '../tools/pluginRegistry.js';\nimport type { AgentResponse, DefineToolAgentFrameworkContext, FrameworkPluginToolConfig } from '../tools/types.js';\nimport type { YieldNextRoundTarget } from '../tools/types.js';\nimport type { ToolCallingMatch } from './responsePatternUtility.js';\nimport type { IPrompt } from './types.js';\n\nfunction cloneResponses(responses: AgentResponse[]): AgentResponse[] {\n return structuredClone(responses);\n}\n\nexport async function responseConcat(\n agentFrameworkConfig: { response?: AgentResponse[]; plugins?: FrameworkPluginToolConfig[] },\n llmResponse: string,\n agentFrameworkContext: DefineToolAgentFrameworkContext,\n messages: ChatMessage[],\n): Promise<{\n processedResponse: string;\n yieldNextRoundTo?: YieldNextRoundTarget;\n toolCallInfo?: ToolCallingMatch;\n}> {\n const responses: AgentResponse[] = Array.isArray(agentFrameworkConfig?.response)\n ? cloneResponses(agentFrameworkConfig.response)\n : [];\n const toolConfigs = (\n Array.isArray(agentFrameworkConfig.plugins) ? agentFrameworkConfig.plugins : []\n ).filter((t) => t.enabled !== false);\n\n const hooks = createAgentFrameworkHooks();\n const pluginMap = resolvePromptPluginMap(agentFrameworkContext);\n for (const tool of toolConfigs) {\n const builtInTool = pluginMap.get(tool.toolId);\n if (builtInTool) {\n builtInTool(hooks);\n }\n }\n\n let yieldNextRoundTo: YieldNextRoundTarget | undefined;\n let toolCallInfo: ToolCallingMatch | undefined;\n\n for (const tool of toolConfigs) {\n const responseContext = {\n agentFrameworkContext,\n messages,\n prompts: [] as IPrompt[],\n toolConfig: tool,\n llmResponse,\n responses,\n metadata: {},\n actions: {} as { yieldNextRoundTo?: YieldNextRoundTarget; toolCalling?: ToolCallingMatch },\n };\n\n await runPostProcessHooks(hooks, responseContext);\n\n if (responseContext.actions?.yieldNextRoundTo) {\n yieldNextRoundTo = responseContext.actions.yieldNextRoundTo;\n if (responseContext.actions.toolCalling) {\n toolCallInfo = responseContext.actions.toolCalling;\n }\n }\n }\n\n const processedResponse = flattenResponses(responses);\n\n return {\n processedResponse: processedResponse || llmResponse,\n yieldNextRoundTo,\n toolCallInfo,\n };\n}\n\nfunction flattenResponses(responses: AgentResponse[]): string {\n if (responses.length === 0) {\n return '';\n }\n return responses\n .filter((response) => response.enabled !== false)\n .map((response) => response.text || '')\n .join('\\n\\n')\n .trim();\n}\n","/**\n * 从 TidGi-Desktop `responsePatternUtility.ts` 迁移:解析 LLM 输出中的 XML 风格 tool 调用。\n * 仅做数据解析,不执行任何代码。\n */\nimport JSON5 from 'json5';\n\nconst MAX_FALLBACK_INPUT_LENGTH = 1000;\nexport const TOOL_PARAMETER_PARSE_ERROR_KEY = '__memeloopToolParameterParseError';\n\nexport type ToolCallingMatch =\n | { found: false }\n | {\n found: true;\n toolId: string;\n parameters: Record<string, unknown>;\n originalText: string;\n };\n\ninterface ToolPattern {\n name: string;\n pattern: RegExp;\n extractToolId: (match: RegExpExecArray) => string;\n extractParams: (match: RegExpExecArray) => string;\n extractOriginalText: (match: RegExpExecArray) => string;\n}\n\nfunction parseToolParameters(parametersText: string): Record<string, unknown> {\n if (!parametersText || !parametersText.trim()) {\n return {};\n }\n\n const trimmedText = parametersText.trim();\n\n try {\n return JSON.parse(trimmedText) as Record<string, unknown>;\n } catch {\n /* try JSON5 */\n }\n\n try {\n return JSON5.parse(trimmedText);\n } catch {\n /* fall through */\n }\n\n return {\n [TOOL_PARAMETER_PARSE_ERROR_KEY]: `Invalid tool arguments JSON. Return one valid JSON object inside the tool tag. Received: ${\n trimmedText.substring(0, MAX_FALLBACK_INPUT_LENGTH)\n }`,\n };\n}\n\nfunction extractFunctionCallsParameters(text: string): Record<string, unknown> {\n const parameters: Record<string, unknown> = {};\n const parameterRegex = /<parameter\\s+name=\"([^\"]+)\"[^>]*>([^<]*)<\\/parameter>/g;\n let m: RegExpExecArray | null;\n while ((m = parameterRegex.exec(text)) !== null) {\n parameters[m[1]] = m[2].trim();\n }\n return parameters;\n}\n\nconst toolPatterns: ToolPattern[] = [\n {\n name: 'tool_use',\n pattern: /<tool_use\\s+name=\"([^\"]+)\"[^>]*>(.*?)<\\/tool_use>/gis,\n extractToolId: (match) => match[1],\n extractParams: (match) => match[2],\n extractOriginalText: (match) => match[0],\n },\n {\n name: 'function_call',\n pattern: /<function_call\\s+name=\"([^\"]+)\"[^>]*>(.*?)<\\/function_call>/gis,\n extractToolId: (match) => match[1],\n extractParams: (match) => match[2],\n extractOriginalText: (match) => match[0],\n },\n {\n name: 'function_calls_invoke',\n pattern: /<invoke\\s+name=\"([^\"]+)\"[^>]*>(.*?)<\\/invoke>/gis,\n extractToolId: (match) => match[1],\n extractParams: (match) => JSON.stringify(extractFunctionCallsParameters(match[2])),\n extractOriginalText: (match) => match[0],\n },\n];\n\nexport function matchToolCalling(responseText: string): ToolCallingMatch {\n try {\n for (const toolPattern of toolPatterns) {\n toolPattern.pattern.lastIndex = 0;\n\n const match = toolPattern.pattern.exec(responseText);\n if (match) {\n const toolId = toolPattern.extractToolId(match);\n const parametersText = toolPattern.extractParams(match);\n const originalText = toolPattern.extractOriginalText(match);\n\n return {\n found: true,\n toolId,\n parameters: parseToolParameters(parametersText),\n originalText,\n };\n }\n }\n\n return { found: false };\n } catch {\n return { found: false };\n }\n}\n\nexport function matchAllToolCallings(responseText: string): {\n calls: Array<ToolCallingMatch & { found: true }>;\n parallel: boolean;\n} {\n const calls: Array<ToolCallingMatch & { found: true }> = [];\n const parallel = /<parallel_tool_calls>/i.test(responseText);\n\n try {\n for (const toolPattern of toolPatterns) {\n toolPattern.pattern.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = toolPattern.pattern.exec(responseText)) !== null) {\n calls.push({\n found: true,\n toolId: toolPattern.extractToolId(match),\n parameters: parseToolParameters(toolPattern.extractParams(match)),\n originalText: toolPattern.extractOriginalText(match),\n });\n }\n }\n } catch {\n /* ignore */\n }\n\n return { calls, parallel };\n}\n","import type { ConversationEventStore } from './ports.js';\n\n/**\n * 下一条消息的 Lamport 时钟:取会话内已有消息的最大 lamportClock + 1。\n * Depends only on the narrow ConversationEventStore port (plan 24.41).\n */\nexport async function nextLamportClockForConversation(\n storage: ConversationEventStore,\n conversationId: string,\n): Promise<number> {\n if (typeof storage.getMaxLamportClockForConversation === 'function') {\n const max = await storage.getMaxLamportClockForConversation(conversationId);\n return max + 1;\n }\n const msgs = await storage.getMessages(conversationId, { mode: 'full-content' });\n let max = 0;\n for (const m of msgs) {\n if (typeof m.lamportClock === 'number' && m.lamportClock > max) {\n max = m.lamportClock;\n }\n }\n return max + 1;\n}\n","/**\n * Hook registry for managing lifecycle hook handlers.\n * Hooks execute in registration order (first registered, first executed).\n *\n * Converted from module-level singletons to an instance class for test isolation\n * and multi-runtime support. Backward-compatible function exports delegate to a\n * default global instance.\n */\n\nimport type { HookContext, HookHandler, HookResult, HookType } from './types.js';\n\n/** Type matching the hook handler maps. */\ntype HookHandlerMap = Map<string, HookHandler>;\n\n/**\n * Instance-level hook registry. Each instance maintains its own handler state.\n */\nexport class HookRegistry {\n private readonly hookRegistry = new Map<HookType, HookHandlerMap>();\n private readonly hookOrder: Map<HookType, HookHandler[]> = new Map();\n\n /**\n * Register a hook handler for a specific lifecycle event.\n */\n registerHook(type: HookType, handler: HookHandler, name?: string): void {\n const key = name ?? `hook:${Date.now().toString(36)}:${Math.random().toString(36).slice(2, 8)}`;\n const handlers = this.hookOrder.get(type) ?? [];\n handlers.push(handler);\n this.hookOrder.set(type, handlers);\n\n const map = this.hookRegistry.get(type) ?? new Map<string, HookHandler>();\n map.set(key, handler);\n this.hookRegistry.set(type, map);\n }\n\n /**\n * Unregister a specific hook handler by name.\n */\n unregisterHook(type: HookType, name: string): boolean {\n const map = this.hookRegistry.get(type);\n if (!map) return false;\n const deleted = map.delete(name);\n if (deleted) {\n this.hookOrder.set(type, Array.from(map.values()));\n }\n return deleted;\n }\n\n /**\n * Execute all registered hooks for a given type in registration order.\n */\n async executeHooks(\n type: HookType,\n context: HookContext,\n data: Record<string, unknown>,\n ): Promise<HookResult> {\n const handlers = this.hookOrder.get(type);\n if (!handlers || handlers.length === 0) {\n return { allowed: true };\n }\n\n let currentData = data;\n let mergedModified: Record<string, unknown> | undefined;\n let permissionAction: HookResult['permissionAction'];\n for (const handler of handlers) {\n try {\n const result = await handler(context, currentData);\n if (result.modified) {\n mergedModified = { ...(mergedModified ?? {}), ...result.modified };\n currentData = { ...currentData, ...result.modified };\n }\n if (result.permissionAction && result.permissionAction !== 'allow') {\n permissionAction = result.permissionAction;\n }\n if (!result.allowed) {\n return {\n ...result,\n modified: mergedModified ?? result.modified,\n permissionAction: permissionAction ?? result.permissionAction,\n };\n }\n } catch (error) {\n return {\n allowed: false,\n reason: error instanceof Error ? error.message : 'Hook execution failed',\n modified: mergedModified,\n permissionAction,\n };\n }\n }\n\n const finalResult: HookResult = { allowed: true };\n if (mergedModified) finalResult.modified = mergedModified;\n if (permissionAction) finalResult.permissionAction = permissionAction;\n return finalResult;\n }\n\n /**\n * Check if any hooks are registered for a given type.\n */\n hasHooks(type: HookType): boolean {\n const map = this.hookRegistry.get(type);\n return map != null && map.size > 0;\n }\n\n /**\n * Remove all registered hooks of all types.\n */\n clearHooks(): void {\n this.hookRegistry.clear();\n this.hookOrder.clear();\n }\n\n /**\n * List all hook types that have at least one registered handler.\n */\n listRegisteredHookTypes(): HookType[] {\n const types: HookType[] = [];\n for (const [type, map] of this.hookRegistry) {\n if (map.size > 0) {\n types.push(type);\n }\n }\n return types;\n }\n\n /**\n * Get the count of registered handlers for a hook type.\n */\n getHookCount(type: HookType): number {\n const map = this.hookRegistry.get(type);\n return map?.size ?? 0;\n }\n}\n\n// ─── Default global instance + backward-compatible function exports ───\n\nconst defaultHookRegistry = new HookRegistry();\n\nexport function getDefaultHookRegistry(): HookRegistry {\n return defaultHookRegistry;\n}\n\nexport function registerHook(type: HookType, handler: HookHandler, name?: string): void {\n defaultHookRegistry.registerHook(type, handler, name);\n}\n\nexport function unregisterHook(type: HookType, name: string): boolean {\n return defaultHookRegistry.unregisterHook(type, name);\n}\n\nexport async function executeHooks(\n type: HookType,\n context: HookContext,\n data: Record<string, unknown>,\n): Promise<HookResult> {\n return defaultHookRegistry.executeHooks(type, context, data);\n}\n\nexport function hasHooks(type: HookType): boolean {\n return defaultHookRegistry.hasHooks(type);\n}\n\nexport function clearHooks(): void {\n defaultHookRegistry.clearHooks();\n}\n\nexport function listRegisteredHookTypes(): HookType[] {\n return defaultHookRegistry.listRegisteredHookTypes();\n}\n\n/**\n * Get the count of registered handlers for a hook type.\n */\nexport function getHookCount(type: HookType): number {\n return defaultHookRegistry.getHookCount(type);\n}\n","import type { ChatMessage } from '../../conversation/index.js';\nimport type { ILLMProvider } from '../../types.js';\n\nexport interface CompactionOptions {\n /** Maximum token count to aim for after compaction (estimated by char count / 3.5). Default: 0 (no limit). */\n maxTokens?: number;\n /** Number of recent message turns (user+assistant pairs) to preserve. Default: 4. */\n recentTurnsToKeep?: number;\n /** Whether to attempt LLM summarization. Falls back to truncation if LLM unavailable or fails. Default: true. */\n useLlmSummary?: boolean;\n /** Optional LLM provider for summarization. */\n llmProvider?: ILLMProvider;\n}\n\nexport interface CompactionResult {\n /** Compacted messages (summary + recent turns). */\n messages: ChatMessage[];\n /** True if compaction reduced the message count. */\n compacted: boolean;\n /** Number of messages dropped. */\n droppedCount: number;\n /** Summary text generated or fallback notice. */\n summaryText: string;\n}\n\n/**\n * Counts \"turns\" in message history. A turn is a user→assistant pair.\n * Tool messages are grouped with the preceding assistant message.\n */\nfunction countTurns(messages: ChatMessage[]): number {\n let turns = 0;\n for (const message of messages) {\n if (message.role === 'user') {\n turns++;\n }\n }\n return turns;\n}\n\n/**\n * Estimate token count from message content (rough: chars / 3.5).\n */\nfunction estimateTokens(messages: ChatMessage[]): number {\n let total = 0;\n for (const message of messages) {\n const content = typeof message.content === 'string' ? message.content : JSON.stringify(message.content);\n total += content.length / 3.5;\n }\n return Math.ceil(total);\n}\n\n/**\n * Build a fallback summary string from the dropped messages.\n */\nfunction buildTruncationSummary(dropped: ChatMessage[], totalDropped: number): string {\n const turns = countTurns(dropped);\n const oldest = dropped[0];\n const newest = dropped[dropped.length - 1];\n const oldestTime = oldest?.timestamp ? new Date(oldest.timestamp).toISOString() : 'unknown';\n const newestTime = newest?.timestamp ? new Date(newest.timestamp).toISOString() : 'unknown';\n\n return `[context-summary] ${totalDropped} earlier messages (${turns} turns, ${oldestTime} → ${newestTime}) were compacted. Key topics: see recent messages below.`;\n}\n\n/**\n * Creates a summary ChatMessage from the compaction result.\n */\nfunction createSummaryMessage(\n conversationId: string,\n summaryText: string,\n baseMessage: ChatMessage,\n): ChatMessage {\n return {\n messageId: `${conversationId}:compacted:${Date.now().toString(36)}`,\n conversationId,\n originNodeId: baseMessage.originNodeId,\n timestamp: Date.now(),\n lamportClock: -1, // Will be replaced by AgentToolLoop\n role: 'assistant',\n content: summaryText,\n metadata: { compacted: true },\n };\n}\n\n/**\n * Deterministic compaction: keeps recent N turns and replaces older messages\n * with a single summary message.\n */\nexport function compactMessages(\n messages: ChatMessage[],\n options: Omit<CompactionOptions, 'llmProvider' | 'useLlmSummary'> = {},\n): CompactionResult {\n const recentTurnsToKeep = options.recentTurnsToKeep ?? 4;\n\n if (messages.length <= recentTurnsToKeep * 2) {\n return { messages, compacted: false, droppedCount: 0, summaryText: '' };\n }\n\n // Find the cutoff point: keep the last recentTurnsToKeep user messages + everything after them\n const userIndices: number[] = [];\n for (let index = 0; index < messages.length; index++) {\n if (messages[index].role === 'user') {\n userIndices.push(index);\n }\n }\n\n if (userIndices.length <= recentTurnsToKeep) {\n return { messages, compacted: false, droppedCount: 0, summaryText: '' };\n }\n\n // The first message to keep starts at the recentTurnsToKeep-th user message from the end\n const keepStartIndex = userIndices[userIndices.length - recentTurnsToKeep];\n const dropped = messages.slice(0, keepStartIndex);\n const kept = messages.slice(keepStartIndex);\n\n if (dropped.length === 0) {\n return { messages, compacted: false, droppedCount: 0, summaryText: '' };\n }\n\n const conversationId = messages[0]?.conversationId ?? 'unknown';\n const summaryText = buildTruncationSummary(dropped, dropped.length);\n const summaryMessage = createSummaryMessage(conversationId, summaryText, messages[0]);\n\n const compacted: ChatMessage[] = [summaryMessage, ...kept];\n\n // Also prune tool outputs older than the cutoff in the kept section\n // (we already dropped them in the \"dropped\" section)\n\n return {\n messages: compacted,\n compacted: true,\n droppedCount: dropped.length,\n summaryText,\n };\n}\n\n/**\n * Checks whether compaction is needed based on message count threshold.\n * @returns true if message count exceeds threshold (default 50).\n */\nexport function shouldCompact(messages: ChatMessage[], threshold?: number): boolean {\n const t = threshold ?? 50;\n return messages.length > t;\n}\n\n/**\n * Auto-compact: estimates token usage, and if it exceeds maxTokens,\n * performs compaction to keep the context within bounds.\n *\n * Uses the LLM provider for summarization if available, falling back to\n * simple truncation + turn counting.\n */\nexport async function autoCompact(\n messages: ChatMessage[],\n options: CompactionOptions = {},\n): Promise<CompactionResult> {\n const recentTurnsToKeep = options.recentTurnsToKeep ?? 4;\n\n // If we're within budget, no need to compact\n if (options.maxTokens && options.maxTokens > 0) {\n const currentTokens = estimateTokens(messages);\n if (currentTokens <= options.maxTokens) {\n return { messages, compacted: false, droppedCount: 0, summaryText: '' };\n }\n }\n\n // If LLM summarization is requested and provider model is available, try it\n if (options.useLlmSummary !== false && options.llmProvider?.model != null) {\n try {\n const result = await llmCompact(messages, options.llmProvider, recentTurnsToKeep);\n if (result) return result;\n } catch {\n // Fall through to truncation\n }\n }\n\n // Fallback: deterministic truncation\n return compactMessages(messages, { ...options });\n}\n\n/**\n * LLM-based compaction: asks the model to summarize the older conversation turns.\n */\nasync function llmCompact(\n messages: ChatMessage[],\n llmProvider: ILLMProvider,\n recentTurnsToKeep: number,\n): Promise<CompactionResult | null> {\n const userIndices: number[] = [];\n for (let index = 0; index < messages.length; index++) {\n if (messages[index].role === 'user') {\n userIndices.push(index);\n }\n }\n\n if (userIndices.length <= recentTurnsToKeep) {\n return null;\n }\n\n const keepStartIndex = userIndices[userIndices.length - recentTurnsToKeep];\n const toSummarize = messages.slice(0, keepStartIndex);\n const kept = messages.slice(keepStartIndex);\n\n if (toSummarize.length === 0) return null;\n\n const conversationId = messages[0]?.conversationId ?? 'unknown';\n\n // Build a text representation of the messages to summarize\n const conversationText = toSummarize\n .map((m) => {\n const content = typeof m.content === 'string' ? m.content : JSON.stringify(m.content);\n const toolId = typeof m.metadata?.toolId === 'string' ? m.metadata.toolId : 'unknown';\n const roleLabel = m.role === 'tool' ? `[tool: ${toolId}]` : `[${m.role}]`;\n // Keep tool outputs brief in summary\n if (m.role === 'tool' && content.length > 500) {\n return `${roleLabel} ${content.slice(0, 500)}... (truncated)`;\n }\n return `${roleLabel} ${content}`;\n })\n .join('\\n\\n');\n\n const prompt =\n `Summarize the following conversation excerpt. Be concise but capture key decisions, action items, tool calls, and important context. Focus on information useful for continuing the conversation.\n\n<conversation>\n${conversationText.slice(0, 8000)}\n</conversation>\n\nProvide a brief summary (3-5 paragraphs) of the key points.`;\n\n try {\n const summaryText = await generateSummary(llmProvider, prompt);\n if (!summaryText || summaryText.length < 10) return null;\n\n const summaryMessage = createSummaryMessage(\n conversationId,\n `[context-summary] ${summaryText}`,\n messages[0],\n );\n\n return {\n messages: [summaryMessage, ...kept],\n compacted: true,\n droppedCount: toSummarize.length,\n summaryText,\n };\n } catch {\n return null; // Fall back to truncation\n }\n}\n\nasync function generateSummary(llmProvider: ILLMProvider, prompt: string): Promise<string | null> {\n if (typeof llmProvider.chat !== 'function') return null;\n const raw = llmProvider.chat({ messages: [{ role: 'user', content: prompt }] });\n let resolved: unknown = raw;\n if (resolved != null && typeof (resolved as Promise<unknown>).then === 'function') {\n resolved = await (resolved as Promise<unknown>);\n }\n if (\n resolved != null &&\n typeof (resolved as AsyncIterable<unknown>)[Symbol.asyncIterator] === 'function'\n ) {\n let text = '';\n for await (const chunk of resolved as AsyncIterable<unknown>) {\n text += chunkToText(chunk);\n }\n return text || null;\n }\n if (typeof resolved === 'string') return resolved;\n return null;\n}\n\nfunction chunkToText(chunk: unknown): string {\n if (typeof chunk === 'string') return chunk;\n if (chunk != null && typeof chunk === 'object' && 'content' in chunk) {\n const content = (chunk as { content?: unknown }).content;\n return typeof content === 'string' ? content : JSON.stringify(content);\n }\n return JSON.stringify(chunk);\n}\n","import type { ChatMessage } from '../../conversation/index.js';\nimport { nextLamportClockForConversation } from '../../storage/nextLamport.js';\nimport type { AgentFrameworkContext } from '../../types.js';\nimport { executeHooks, hasHooks } from '../hooks/registry.js';\nimport { autoCompact as autoCompactMessages, shouldCompact } from './compaction.js';\n\nimport type { AgentLoopStep } from '../types.js';\n\ntype ContextCompactionModified = {\n history?: unknown;\n skipDefault?: unknown;\n compacted?: unknown;\n droppedCount?: unknown;\n summaryText?: unknown;\n persistSummaryMessage?: unknown;\n};\n\ntype AutoCompactResult = {\n messages: ChatMessage[];\n compacted: boolean;\n droppedCount: number;\n summaryText: string;\n};\n\ntype AutoCompactFunction = (\n messages: ChatMessage[],\n options: {\n recentTurnsToKeep: number;\n maxTokens: number;\n llmProvider: unknown;\n },\n) => Promise<AutoCompactResult>;\n\nfunction compactHistory(\n history: ChatMessage[],\n options: AgentFrameworkContext['agentToolLoop'],\n): ChatMessage[] {\n const maxMessages = options?.contextCompaction?.maxMessages ?? 0;\n if (maxMessages <= 0 || history.length <= maxMessages) return history;\n const dropped = history.length - maxMessages;\n const tail = history.slice(-maxMessages);\n const summaryMessage: ChatMessage = {\n ...tail[0],\n messageId: `${tail[0]?.conversationId ?? 'unknown'}:summary:${Date.now().toString(36)}`,\n role: 'assistant',\n content: `[context-summary] ${dropped} earlier messages were compacted.`,\n };\n if (options?.contextCompaction?.replayLastUserMessage === false) return tail;\n const lastUser = [...history].reverse().find((message) => message.role === 'user');\n if (!lastUser) return [summaryMessage, ...tail];\n if (tail.some((message) => message.messageId === lastUser.messageId)) return tail;\n return [summaryMessage, lastUser, ...tail];\n}\n\nfunction asChatMessages(value: unknown): ChatMessage[] | undefined {\n if (!Array.isArray(value)) return undefined;\n if (!value.every((message) => message != null && typeof message === 'object')) return undefined;\n return value as ChatMessage[];\n}\n\nfunction buildCompactedStep(\n conversationId: string,\n iteration: number,\n droppedCount: unknown,\n summaryText: unknown,\n): AgentLoopStep {\n return {\n type: 'thinking',\n data: {\n status: 'compacted',\n conversationId,\n droppedCount: typeof droppedCount === 'number' ? droppedCount : 0,\n summaryText: typeof summaryText === 'string' ? summaryText : '',\n iteration,\n },\n };\n}\n\nasync function persistSummaryMessage(\n context: AgentFrameworkContext,\n conversationId: string,\n summaryMessage: ChatMessage | undefined,\n): Promise<void> {\n if (!summaryMessage) return;\n const lamportSummary = await nextLamportClockForConversation(context.storage, conversationId);\n await context.storage.appendMessage({\n ...summaryMessage,\n lamportClock: lamportSummary,\n });\n}\n\nasync function maybeApplyContextCompactionHook(options: {\n context: AgentFrameworkContext;\n conversationId: string;\n iteration: number;\n history: ChatMessage[];\n agentToolLoopOptions: AgentFrameworkContext['agentToolLoop'];\n}): Promise<{ handled: boolean; history: ChatMessage[]; steps: AgentLoopStep[] }> {\n const { context, conversationId, iteration, history, agentToolLoopOptions } = options;\n if (!hasHooks('ContextCompaction')) {\n return { handled: false, history, steps: [] };\n }\n\n const hookResult = await executeHooks('ContextCompaction', context, {\n conversationId,\n iteration,\n history,\n autoCompact: agentToolLoopOptions?.autoCompact,\n contextCompaction: agentToolLoopOptions?.contextCompaction,\n });\n const modified = hookResult.modified as ContextCompactionModified | undefined;\n const modifiedHistory = asChatMessages(modified?.history);\n const nextHistory = modifiedHistory ?? history;\n const skipDefault = !hookResult.allowed || modifiedHistory != null || modified?.skipDefault === true;\n if (!skipDefault) {\n return { handled: false, history: nextHistory, steps: [] };\n }\n\n const steps = modified?.compacted === true\n ? [buildCompactedStep(conversationId, iteration, modified.droppedCount, modified.summaryText)]\n : [];\n if (modified?.persistSummaryMessage === true) {\n await persistSummaryMessage(context, conversationId, nextHistory[0]);\n }\n\n return { handled: true, history: nextHistory, steps };\n}\n\nasync function applyBuiltInAutoCompact(options: {\n context: AgentFrameworkContext;\n conversationId: string;\n iteration: number;\n history: ChatMessage[];\n agentToolLoopOptions: AgentFrameworkContext['agentToolLoop'];\n}): Promise<{ history: ChatMessage[]; steps: AgentLoopStep[] }> {\n const { context, conversationId, iteration, agentToolLoopOptions } = options;\n let history = options.history;\n const autoCompactOptions = agentToolLoopOptions?.autoCompact;\n if (!autoCompactOptions) {\n return { history, steps: [] };\n }\n\n const threshold = autoCompactOptions.threshold ?? 50;\n if (!shouldCompact(history, threshold)) {\n return { history, steps: [] };\n }\n\n try {\n const result = await (autoCompactMessages as unknown as AutoCompactFunction)(history, {\n recentTurnsToKeep: autoCompactOptions.recentTurnsToKeep ?? 4,\n maxTokens: autoCompactOptions.maxTokens ?? 0,\n llmProvider: context.llmProvider,\n });\n if (!result.compacted) {\n return { history, steps: [] };\n }\n\n history = result.messages;\n await persistSummaryMessage(context, conversationId, result.messages[0]);\n return {\n history,\n steps: [\n buildCompactedStep(conversationId, iteration, result.droppedCount, result.summaryText),\n ],\n };\n } catch (error) {\n if (context.logger?.warn) {\n context.logger.warn('[agentToolLoop] auto-compact failed:', error);\n } else {\n console.warn('[agentToolLoop] auto-compact failed:', error);\n }\n return { history, steps: [] };\n }\n}\n\nexport async function prepareIterationHistory(options: {\n context: AgentFrameworkContext;\n conversationId: string;\n iteration: number;\n rawHistory: ChatMessage[];\n agentToolLoopOptions: AgentFrameworkContext['agentToolLoop'];\n}): Promise<{ history: ChatMessage[]; steps: AgentLoopStep[] }> {\n const { agentToolLoopOptions } = options;\n const hookResult = await maybeApplyContextCompactionHook({\n ...options,\n history: options.rawHistory,\n });\n if (hookResult.handled) {\n return hookResult;\n }\n\n const autoCompactResult = await applyBuiltInAutoCompact({\n ...options,\n history: hookResult.history,\n });\n return {\n history: compactHistory(autoCompactResult.history, agentToolLoopOptions),\n steps: autoCompactResult.steps,\n };\n}\n","type LegacyLlmContext = {\n llmProvider: {\n chat?: unknown;\n };\n};\n\ntype LegacyChatFunction = (request: unknown) => unknown;\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n value != null && typeof (value as AsyncIterable<unknown>)[Symbol.asyncIterator] === 'function'\n );\n}\n\nexport function chunkToText(chunk: unknown): string {\n if (typeof chunk === 'string') return chunk;\n if (chunk != null && typeof chunk === 'object' && 'content' in chunk) {\n const content = (chunk as { content?: unknown }).content;\n return typeof content === 'string' ? content : JSON.stringify(content);\n }\n return JSON.stringify(chunk);\n}\n\nexport async function* streamLlm(\n context: LegacyLlmContext,\n request: unknown,\n): AsyncGenerator<unknown, void, unknown> {\n const chatFunction = context.llmProvider.chat;\n\n if (typeof chatFunction !== 'function') {\n throw new Error(\n \"LLM provider does not support legacy chat() method. Use AI SDK's streamText instead.\",\n );\n }\n const raw = (chatFunction as LegacyChatFunction)(request);\n let resolved: unknown = raw;\n if (resolved != null && typeof (resolved as Promise<unknown>).then === 'function') {\n resolved = await (resolved as Promise<unknown>);\n }\n if (isAsyncIterable(resolved)) {\n for await (const chunk of resolved) {\n yield chunk;\n }\n return;\n }\n yield resolved;\n}\n","import type { ChatMessage } from '../conversation/index.js';\n\nimport { createAgentFrameworkHooks, resolvePromptPluginMap, runProcessPromptsHooks } from '../tools/pluginRegistry.js';\nimport type { AgentFrameworkContext } from '../types.js';\nimport type { AgentPromptDescription, PromptNode, PromptPluginConfig } from './types.js';\n\n/** 将 prompt 节点 `id` 映射到 agentFrameworkConfig.prompts 树中的索引路径(供 UI / schema 注解)。 */\nexport function collectPromptSourcePaths(\n prompts: PromptNode[],\n basePath = 'agentFrameworkConfig.prompts',\n): Record<string, string> {\n const out: Record<string, string> = {};\n function walk(nodes: PromptNode[], prefix: string): void {\n nodes.forEach((n, index) => {\n const p = `${prefix}.${index}`;\n if (n.id) {\n out[n.id] = p;\n }\n if (n.children?.length) {\n walk(n.children, `${p}.children`);\n }\n });\n }\n walk(prompts, basePath);\n return out;\n}\n\nconst logger = {\n debug: (..._arguments: unknown[]) => {},\n info: (..._arguments: unknown[]) => {},\n warn: (..._arguments: unknown[]) => {},\n error: (..._arguments: unknown[]) => {},\n};\n\nexport interface PromptConcatContext {\n messages: ChatMessage[];\n}\n\n/** 扁平化后的 LLM 消息(不依赖 peer `ai` 包导出,避免 d.ts 与 SDK 主版本不一致) */\nexport type PromptFlatModelMessage = {\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: unknown;\n};\n\nexport function findPromptById(\n prompts: PromptNode[],\n id: string,\n): { prompt: PromptNode; parent: PromptNode[]; index: number } | undefined {\n for (let index = 0; index < prompts.length; index++) {\n const prompt = prompts[index];\n if (prompt.id === id) {\n return { prompt, parent: prompts, index };\n }\n if (prompt.children) {\n const found = findPromptById(prompt.children, id);\n if (found) return found;\n }\n }\n return undefined;\n}\n\nexport function flattenPrompts(prompts: PromptNode[]): PromptFlatModelMessage[] {\n const result: PromptFlatModelMessage[] = [];\n\n function processPrompt(prompt: PromptNode): string {\n let text = prompt.text ?? '';\n if (prompt.children) {\n for (const child of prompt.children) {\n if (!child.role) {\n text += processPrompt(child);\n }\n }\n }\n return text;\n }\n\n function collectRolePrompts(nodes: PromptNode[]): void {\n for (const prompt of nodes) {\n if (prompt.enabled === false) continue;\n\n const content = processPrompt(prompt);\n if (content.trim() || prompt.role) {\n result.push({\n role: prompt.role ?? 'system',\n content: content.trim(),\n });\n }\n\n if (prompt.children) {\n collectRolePrompts(prompt.children);\n }\n }\n }\n\n collectRolePrompts(prompts);\n return result;\n}\n\nexport interface PromptConcatPluginPreview {\n id: string;\n toolId?: string;\n caption?: string;\n}\n\nexport interface PromptConcatStreamState {\n processedPrompts: PromptNode[];\n flatPrompts: PromptFlatModelMessage[];\n step: 'flatten' | 'complete' | 'plugin' | 'finalize';\n isComplete: boolean;\n /** prompt 节点 id → JSON 路径(如 agentFrameworkConfig.prompts.0) */\n sourcePaths?: Record<string, string>;\n /** Desktop UI: plugin currently being processed. */\n currentPlugin?: PromptConcatPluginPreview;\n /** Desktop UI: progress value between 0 and 1. */\n progress?: number;\n}\n\nexport interface PromptConcatOptions {\n readAttachmentFile?: (path: string) => Promise<Uint8Array>;\n}\n\nexport async function* promptConcatStream(\n agentConfig: Pick<AgentPromptDescription, 'agentFrameworkConfig'>,\n messages: ChatMessage[],\n agentFrameworkContext: AgentFrameworkContext,\n options?: PromptConcatOptions,\n): AsyncGenerator<PromptConcatStreamState, PromptConcatStreamState, unknown> {\n const frameworkConfig = agentConfig.agentFrameworkConfig;\n const promptConfigs: PromptNode[] = frameworkConfig?.prompts ?? [];\n const plugins: PromptPluginConfig[] = frameworkConfig?.plugins ?? [];\n\n const hooks = createAgentFrameworkHooks();\n const pluginMap = resolvePromptPluginMap(agentFrameworkContext);\n for (const plugin of plugins) {\n const entry = pluginMap.get(plugin.toolId);\n if (entry) entry(hooks);\n }\n\n // Run processPrompts hooks once per plugin so each handler sees its own toolConfig.\n // Desktop defineTool handlers check toolConfig.toolId and skip non-matching plugins.\n let processedContext = { prompts: promptConfigs };\n for (let index = 0; index < plugins.length; index++) {\n const plugin = plugins[index];\n processedContext = await runProcessPromptsHooks(hooks, {\n prompts: processedContext.prompts,\n messages,\n toolConfig: plugin as never,\n pluginIndex: index,\n agentFrameworkContext,\n });\n }\n\n const processed = processedContext.prompts;\n const flat = flattenPrompts(processed);\n\n // 如果最后一条消息是 user,把其内容追加到 prompts\n const last = messages[messages.length - 1];\n if (last && last.role === 'user') {\n const content = last.content;\n const fileMeta = (last as ChatMessage & { metadata?: { file?: { path?: string } } }).metadata\n ?.file;\n if (fileMeta?.path && options?.readAttachmentFile) {\n try {\n const buf = await options.readAttachmentFile(fileMeta.path);\n flat.push({\n role: 'user',\n content: [\n { type: 'image', image: buf },\n { type: 'text', text: content },\n ],\n });\n } catch (error) {\n logger.error('failed to read attached file', { error, path: fileMeta.path });\n }\n } else if (fileMeta?.path && !options?.readAttachmentFile) {\n flat.push({\n role: 'user',\n content: `[attached path: ${fileMeta.path}]\\n${content}`,\n });\n } else {\n flat.push({ role: 'user', content });\n }\n }\n\n const state: PromptConcatStreamState = {\n processedPrompts: processed,\n flatPrompts: flat,\n step: 'complete',\n isComplete: true,\n sourcePaths: collectPromptSourcePaths(processed),\n };\n\n yield state;\n return state;\n}\n","import type { ChatMessage } from '../conversation/index.js';\n\nexport function normalizeRoleForLlm(role: string): 'user' | 'assistant' | 'system' | 'tool' {\n if (role === 'assistant' || role === 'system' || role === 'tool') return role;\n return 'user';\n}\n\n/**\n * 丢弃早于 `now - maxAgeMs` 的历史消息(按 `ChatMessage.timestamp`,毫秒)。\n * `maxAgeMs <= 0` 时不裁剪。\n */\nexport function filterOldMessagesByDuration(\n messages: ChatMessage[],\n maxAgeMs: number,\n now: number = Date.now(),\n): ChatMessage[] {\n if (maxAgeMs <= 0) return messages;\n const cutoff = now - maxAgeMs;\n return messages.filter((m) => typeof m.timestamp === 'number' && m.timestamp >= cutoff);\n}\n\nexport function getFinalPromptResult(parts: string[]): string {\n return parts.filter(Boolean).join('\\n\\n');\n}\n","export function formatToolResultMessage(\n toolName: string,\n parameters: Record<string, unknown>,\n body: string,\n isError: boolean,\n): string {\n return `<functions_result>\nTool: ${toolName}\nParameters: ${JSON.stringify(parameters)}\n${isError ? 'Error' : 'Result'}: ${body}\n</functions_result>`;\n}\n","import type { AgentDefinition } from '../../agent/types.js';\nimport { type ChatMessage, getChatMessageParts, isToolResultPart } from '../../conversation/index.js';\nimport { promptConcatStream } from '../../promptUtilities/promptConcat.js';\nimport type { PromptNode, PromptPluginConfig } from '../../promptUtilities/types.js';\nimport { filterOldMessagesByDuration } from '../../promptUtilities/utilities.js';\nimport type { AgentFrameworkContext } from '../../types.js';\nimport { formatToolResultMessage } from './toolResultMessage.js';\n\nexport type LlmRequestMessage = {\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: unknown;\n};\n\nfunction chatMessageToModelMessage(message: ChatMessage): LlmRequestMessage {\n const role: LlmRequestMessage['role'] = message.role === 'agent' || message.role === 'error'\n ? 'assistant'\n : message.role === 'tool'\n ? 'tool'\n : message.role === 'user'\n ? 'user'\n : 'assistant';\n\n if (role === 'tool') {\n const toolResults = getChatMessageParts(message).filter(isToolResultPart);\n if (toolResults.length > 0) {\n return {\n role,\n content: toolResults.map((part) =>\n formatToolResultMessage(\n part.toolName,\n (part.parameters && typeof part.parameters === 'object' ? part.parameters : {}) as Record<string, unknown>,\n part.result,\n part.isError === true,\n )\n ).join('\\n\\n'),\n };\n }\n }\n\n return {\n role,\n content: message.content,\n };\n}\n\nexport async function resolveAgentDefinitionModel(\n context: AgentFrameworkContext,\n definitionId: string,\n): Promise<AgentDefinition | null> {\n if (context.resolveAgentDefinition) {\n return context.resolveAgentDefinition(definitionId);\n }\n return context.storage.getAgentDefinition(definitionId);\n}\n\nexport async function inferDefinitionId(\n storage: AgentFrameworkContext['storage'],\n conversationId: string,\n): Promise<string> {\n try {\n const meta = await storage.getConversationMeta(conversationId);\n if (meta?.definitionId) return meta.definitionId;\n } catch {\n /* optional on old mocks */\n }\n const parts = conversationId.split(':');\n if (parts.length >= 2) {\n return parts.slice(0, -1).join(':');\n }\n return conversationId;\n}\n\nexport async function buildLlmMessages(\n context: AgentFrameworkContext,\n conversationId: string,\n history: ChatMessage[],\n): Promise<LlmRequestMessage[]> {\n const definitionId = await inferDefinitionId(context.storage, conversationId);\n const definition = await resolveAgentDefinitionModel(context, definitionId);\n const fw = definition?.agentFrameworkConfig as\n | { prompts?: unknown[]; plugins?: unknown[] }\n | undefined;\n const maxHistoryAgeMs = context.agentToolLoop?.maxHistoryAgeMs ?? 0;\n const historyForPrompt = maxHistoryAgeMs > 0 ? filterOldMessagesByDuration(history, maxHistoryAgeMs) : history;\n\n if (fw?.prompts && Array.isArray(fw.prompts) && fw.prompts.length > 0) {\n const readAttachmentFile = context.agentToolLoop?.readAttachmentFile;\n const gen = promptConcatStream(\n {\n agentFrameworkConfig: {\n prompts: fw.prompts as PromptNode[],\n plugins: (fw.plugins ?? []) as PromptPluginConfig[],\n response: [],\n },\n },\n historyForPrompt,\n context,\n readAttachmentFile ? { readAttachmentFile } : undefined,\n );\n let lastFlat: LlmRequestMessage[] = [];\n for await (const state of gen) {\n lastFlat = state.flatPrompts as LlmRequestMessage[];\n }\n const withoutTrailingUser = lastFlat.length > 0 && lastFlat[lastFlat.length - 1]?.role === 'user'\n ? lastFlat.slice(0, -1)\n : lastFlat;\n return [...withoutTrailingUser, ...historyForPrompt.map(chatMessageToModelMessage)];\n }\n\n const systemText = typeof definition?.systemPrompt === 'string' ? definition.systemPrompt.trim() : '';\n if (systemText.length > 0) {\n return [\n { role: 'system', content: systemText },\n ...historyForPrompt.map(chatMessageToModelMessage),\n ];\n }\n\n return historyForPrompt.map(chatMessageToModelMessage);\n}\n","import type { OrchestrationCondition } from '../client.js';\nimport type { ToolOperationResource, ToolOperationStatus } from '../resources.js';\n\n/**\n * Condition type raised on a ToolOperation whose executor crashed or\n * disconnected after a side effect may have occurred. While this condition is\n * `True`, controllers must follow the recorded reconciliation decision instead\n * of blindly repeating the operation.\n */\nexport const TOOL_OPERATION_CONDITION_EFFECT_UNKNOWN = 'EffectUnknown';\n\n/**\n * Evidence gathered by driver/controller inspection after an executor crash or\n * disconnect. Evidence is produced by the trusted side (driver checkpoints,\n * verifier probes, artifact records), never by the possibly-failed executor's\n * own claim alone.\n */\nexport interface UnknownEffectEvidence {\n /**\n * The executor produced a result before the disconnect and only the\n * completion acknowledgement was lost. The caller is responsible for\n * attaching the observed result when applying the decision.\n */\n resultObserved?: boolean;\n /** Reference to independent verification evidence (artifact, verifier run). */\n evidenceRef?: string;\n /** ISO timestamp of the observed disconnect/crash. */\n disconnectedAt?: string;\n}\n\nexport type UnknownEffectAction = 'retry' | 'succeeded' | 'verification-required' | 'manual-intervention';\n\nexport interface UnknownEffectDecision {\n action: UnknownEffectAction;\n reason: string;\n}\n\nconst DEFAULT_MAX_ATTEMPTS = 3;\n\nfunction attemptsOf(operation: ToolOperationResource): number {\n return operation.status?.attempts ?? 0;\n}\n\nfunction maxAttemptsOf(operation: ToolOperationResource): number {\n return operation.spec.retry?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;\n}\n\n/**\n * Decide how to reconcile an operation whose effect is unknown. The decision\n * never blindly repeats destructive work:\n *\n * 1. An observed result means only the ack was lost → `succeeded`.\n * 2. `read` effects have no side effects → `retry` (within attempt budget).\n * 3. `retry.nonRetryable` operations are never repeated → `manual-intervention`.\n * 4. Operations with an `idempotencyKey` dedupe at the executor/store, so a\n * repeated delivery is safe → `retry` (within attempt budget).\n * 5. Everything else requires independent verification before any retry →\n * `verification-required`.\n */\nexport function reconcileUnknownEffect(\n operation: ToolOperationResource,\n evidence: UnknownEffectEvidence,\n): UnknownEffectDecision {\n if (evidence.resultObserved) {\n return { action: 'succeeded', reason: 'result was observed before the disconnect; only the ack was lost' };\n }\n\n if (operation.spec.retry?.nonRetryable) {\n return { action: 'manual-intervention', reason: 'operation is marked nonRetryable and its effect is unknown' };\n }\n\n const attempts = attemptsOf(operation);\n const maxAttempts = maxAttemptsOf(operation);\n const withinBudget = attempts < maxAttempts;\n\n if (operation.spec.effect === 'read') {\n if (withinBudget) {\n return { action: 'retry', reason: `read effect has no side effects (attempt ${attempts + 1}/${maxAttempts})` };\n }\n return { action: 'verification-required', reason: `read retry budget exhausted (${attempts}/${maxAttempts})` };\n }\n\n if (operation.spec.idempotencyKey) {\n if (withinBudget) {\n return {\n action: 'retry',\n reason: `idempotencyKey deduplicates repeated delivery (attempt ${attempts + 1}/${maxAttempts})`,\n };\n }\n return {\n action: 'verification-required',\n reason: `idempotent retry budget exhausted (${attempts}/${maxAttempts}); verify before further attempts`,\n };\n }\n\n return {\n action: 'verification-required',\n reason: `effect '${operation.spec.effect}' without idempotencyKey must be verified before any retry`,\n };\n}\n\nfunction effectUnknownCondition(decision: UnknownEffectDecision, at: string): OrchestrationCondition {\n return {\n type: TOOL_OPERATION_CONDITION_EFFECT_UNKNOWN,\n status: 'True',\n reason: decision.action,\n message: decision.reason,\n lastTransitionTime: at,\n };\n}\n\n/**\n * Apply a reconciliation decision to an operation, producing the next status:\n *\n * - `retry` → back to `Pending` (requeue) with the EffectUnknown condition.\n * - `succeeded` → `Completed` (caller attaches the observed result separately).\n * - `verification-required` / `manual-intervention` → stays `Running` with the\n * EffectUnknown condition; the operation is not repeated until a verifier or\n * operator clears the condition.\n */\nexport function applyUnknownEffectDecision(\n operation: ToolOperationResource,\n decision: UnknownEffectDecision,\n at: string = new Date().toISOString(),\n): ToolOperationResource {\n const conditions = [\n ...(operation.status?.conditions ?? []).filter((c) => c.type !== TOOL_OPERATION_CONDITION_EFFECT_UNKNOWN),\n effectUnknownCondition(decision, at),\n ];\n\n const base: ToolOperationStatus = {\n ...operation.status,\n conditions,\n };\n\n if (decision.action === 'retry') {\n return { ...operation, status: { ...base, phase: 'Pending' } };\n }\n if (decision.action === 'succeeded') {\n return {\n ...operation,\n status: { ...base, phase: 'Completed', completedAt: at },\n };\n }\n return { ...operation, status: { ...base, phase: 'Running' } };\n}\n","export const ORCHESTRATION_ERROR_CODES = [\n 'UNSUPPORTED',\n 'FORBIDDEN',\n 'CONFLICT',\n 'STALE_EPOCH',\n 'NOT_FOUND',\n 'INVALID',\n 'EXHAUSTED',\n 'UNAVAILABLE',\n 'TIMEOUT',\n 'CANCELLED',\n 'UNKNOWN_EFFECT',\n 'WATCH_COMPACTED',\n 'INTERNAL',\n] as const;\n\nexport type OrchestrationErrorCode = typeof ORCHESTRATION_ERROR_CODES[number];\n\nexport interface OrchestrationErrorData {\n code: OrchestrationErrorCode;\n message: string;\n retryable: boolean;\n retryAfterMs?: number;\n reason?: string;\n details?: Record<string, unknown>;\n}\n\nexport class OrchestrationError extends Error {\n readonly code: OrchestrationErrorCode;\n readonly retryable: boolean;\n readonly retryAfterMs?: number;\n readonly reason?: string;\n readonly details?: Record<string, unknown>;\n\n constructor(data: OrchestrationErrorData) {\n super(data.message);\n this.name = 'OrchestrationError';\n this.code = data.code;\n this.retryable = data.retryable;\n this.retryAfterMs = data.retryAfterMs;\n this.reason = data.reason;\n this.details = data.details;\n }\n\n toJSON(): OrchestrationErrorData {\n return {\n code: this.code,\n message: this.message,\n retryable: this.retryable,\n retryAfterMs: this.retryAfterMs,\n reason: this.reason,\n details: this.details,\n };\n }\n}\n\nexport function isOrchestrationError(error: unknown): error is OrchestrationError {\n return error instanceof OrchestrationError;\n}\n\nexport function toOrchestrationErrorData(\n error: unknown,\n fallback: Pick<OrchestrationErrorData, 'code' | 'retryable'> = {\n code: 'INTERNAL',\n retryable: false,\n },\n): OrchestrationErrorData {\n if (isOrchestrationError(error)) return error.toJSON();\n return {\n ...fallback,\n message: error instanceof Error ? error.message : String(error),\n };\n}\n","import type { OrchestrationObjectMetadata, OrchestrationOwnerReference, OrchestrationResourceManifest, OrchestrationResourceStatus, OrchestrationTypeMeta } from './client.js';\nimport type { OrchestrationErrorData } from './errors.js';\n\nexport const AGENT_WORKLOAD_API_VERSION = 'workload.memeloop.io/v1alpha1';\nexport const AGENT_WORKLOAD_KIND = 'AgentWorkload';\n\nexport const AGENT_RUN_API_VERSION = 'run.memeloop.io/v1alpha1';\nexport const AGENT_RUN_KIND = 'AgentRun';\n\n/**\n * Host-asserted trust classification of a node or workload. The trust class\n * is bound by the host; it is never self-reported by the workload, the model,\n * or a `.mjs` script.\n */\nexport type NodeTrustClass = 'trusted' | 'restricted' | 'quarantine';\n\nexport type AgentTrustLevel = NodeTrustClass;\n\n/** Ordered data classifications; higher ranks are more sensitive. */\nexport type DataClassification = 'public' | 'internal' | 'confidential' | 'restricted';\n\nexport type ToolAdmissionAction = 'allow' | 'deny' | 'require-approval';\n\n/**\n * Declarative trusted-admission rule. Rules are evaluated in order; the first\n * matching rule wins (firewall semantics). A rule matches when `toolPattern`\n * matches the tool reference name and either `effects` is omitted (all\n * effects) or contains the operation effect.\n */\nexport interface ToolAdmissionRule {\n toolPattern: string;\n effects?: ToolOperationEffect[];\n action: ToolAdmissionAction;\n reason?: string;\n}\n\nexport interface ToolAdmissionPolicy {\n /** Applied when no rule matches. Restricted/quarantine profiles resolve to `deny` regardless of this field. */\n defaultAction: ToolAdmissionAction;\n rules?: ToolAdmissionRule[];\n}\n\nexport interface AgentWorkloadModelPolicy {\n modelClass?: string;\n allowedModelNames?: string[];\n budget?: {\n maxTokens?: number;\n maxCost?: number;\n };\n}\n\nexport interface AgentWorkloadToolPolicy {\n allowedToolClasses?: string[];\n /** Tool classes that must have a healthy executor on the selected node. */\n requiredToolClasses?: string[];\n allowedToolIds?: string[];\n defaultAction?: 'allow' | 'ask' | 'deny';\n rules?: Array<{ pattern: string; action: 'allow' | 'ask' | 'deny' }>;\n}\n\nexport interface AgentWorkloadNetworkPolicy {\n networkClass?: string;\n egress?: 'none' | 'same-node' | 'restricted' | 'open';\n /** Minimum boundary that must enforce this policy before the workload binds. */\n minimumEnforcement?: 'none' | 'process' | 'namespace' | 'host' | 'external';\n}\n\nexport interface AgentWorkloadVolumeClaim {\n name: string;\n claimRef: string;\n}\n\nexport interface AgentWorkloadStoragePolicy {\n storageClass?: string;\n volumes?: AgentWorkloadVolumeClaim[];\n}\n\nexport interface AgentWorkloadCredentialPolicy {\n /** Credential broker class required on the selected node. */\n brokerClass?: string;\n /** Audiences for which the node must be able to request scoped grants. */\n audiences?: string[];\n /** Target classes for which scoped grants may be issued. */\n targets?: string[];\n}\n\nexport interface AgentWorkloadResourceRequirements {\n cpuMillicores?: number;\n memoryBytes?: number;\n gpuCount?: number;\n diskBytes?: number;\n bandwidthKbps?: number;\n}\n\nexport interface AgentWorkloadPlacement {\n /**\n * Registered external-orchestrator driver name. When set, the external\n * orchestration controller owns placement and the local node binder skips\n * this workload. External placement is always explicit; there is no silent\n * spillover from the local runtime.\n */\n orchestrator?: string;\n nodeSelector?: Record<string, string>;\n requiredNode?: string;\n antiAffinity?: string[];\n /** Soft co-location preference; never overrides a hard security filter. */\n preferredNode?: string;\n /** Taints the workload tolerates. Nodes with taints not listed here are filtered out. */\n tolerations?: string[];\n /**\n * Maximum data classification the workload may carry. Nodes with a lower\n * `maxDataClassification` than the workload's effective classification are\n * filtered out. Quarantine nodes are always treated as `public`-only.\n */\n dataClassification?: DataClassification;\n /** Allowed residency labels (for example `local`, `cn`, or `eu-west`). */\n dataResidency?: string[];\n /** Require a currently verified node attestation. */\n requireAttestation?: boolean;\n /** Fleet batch constraints enforced before a target binds. */\n rollout?: {\n batchId: string;\n excludedFaultDomains?: string[];\n maxConcurrentPerFaultDomain?: number;\n };\n}\n\nexport type AgentWorkloadCompletionPolicy = 'complete' | 'detach' | 'daemon';\n\nexport interface AgentWorkloadSpec {\n profileId?: string;\n scriptReference?: string;\n promptReference?: string;\n trust?: AgentTrustLevel;\n /** RuntimeClass selected for script workloads (plan 24.18); declarative only. */\n runtimeClass?: string;\n /**\n * Non-secret environment variables for the workload (plan 24.14 `env`).\n * Secret-shaped values are rejected at admission (deployGeneratedScript)\n * and stripped again at launch (plan 24.35), so specs persisted in the\n * ControlStore never carry provider keys.\n */\n env?: Record<string, string>;\n /** Name of a SecurityProfile resource governing admission and model access. */\n securityProfileRef?: string;\n placement?: AgentWorkloadPlacement;\n modelPolicy?: AgentWorkloadModelPolicy;\n toolPolicy?: AgentWorkloadToolPolicy;\n networkPolicy?: AgentWorkloadNetworkPolicy;\n storagePolicy?: AgentWorkloadStoragePolicy;\n credentialPolicy?: AgentWorkloadCredentialPolicy;\n resources?: AgentWorkloadResourceRequirements;\n /** Content-addressed artifacts whose locality may influence placement. */\n artifactReferences?: string[];\n /** Durable checkpoint whose locality may influence placement. */\n checkpointReference?: string;\n completionPolicy?: AgentWorkloadCompletionPolicy;\n ownerReferences?: OrchestrationOwnerReference[];\n}\n\nexport interface AgentWorkloadStatus extends OrchestrationResourceStatus {\n phase?: 'Pending' | 'Scheduling' | 'Running' | 'Completed' | 'Failed';\n /** Node the binding controller scheduled this workload onto. */\n assignedNode?: string;\n /** Durable trusted policy decision that authorized the current binding. */\n placementDecisionRef?: string;\n /** Policy snapshot digest bound to placementDecisionRef. */\n placementPolicyDigest?: string;\n /** External driver selected for this workload, when any. */\n assignedDriver?: string;\n /** Opaque native workload identifier returned by the external driver. */\n externalId?: string;\n /** Non-secret, string-only backend metadata used for diagnostics/adoption. */\n externalMetadata?: Record<string, string>;\n runs?: Array<{\n apiVersion: string;\n kind: string;\n name?: string;\n namespace?: string;\n uid?: string;\n }>;\n lastRunResult?: string;\n}\n\nexport interface AgentWorkloadCondition {\n type: string;\n status: 'True' | 'False' | 'Unknown';\n}\n\nexport type AgentWorkloadManifest = OrchestrationResourceManifest<AgentWorkloadSpec>;\n\nexport interface AgentWorkloadResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: AgentWorkloadSpec;\n status?: AgentWorkloadStatus;\n}\n\nexport interface AgentRunSpec {\n workloadRef: {\n apiVersion: string;\n kind: string;\n name?: string;\n namespace?: string;\n uid?: string;\n };\n promptReference?: string;\n retry?: number;\n timeoutMs?: number;\n}\n\nexport interface AgentRunStatus extends OrchestrationResourceStatus {\n phase?: 'Pending' | 'Starting' | 'Running' | 'Completed' | 'Failed' | 'Cancelled';\n /**\n * Durable claim written before invoking a LoopRuntimeDriver. A different\n * daemon instance that observes Starting/Running must adopt through a\n * managed driver or fail UNKNOWN_EFFECT; it must never blindly start again.\n */\n runtimeExecutionClaim?: {\n controllerInstanceId: string;\n claimedAt: string;\n };\n /** Independently selected serving endpoint for this run's model calls. */\n assignedModelEndpoint?: {\n apiVersion: string;\n kind: string;\n name: string;\n namespace?: string;\n uid: string;\n };\n /** Fences the model binding decision to the controller leadership epoch. */\n modelBinding?: {\n leaseEpoch: string;\n endpointResourceVersion: string;\n boundAt: string;\n };\n /** NetworkAttachment that must reach Attached before this run starts. */\n networkAttachmentRef?: {\n apiVersion: string;\n kind: string;\n name: string;\n namespace?: string;\n uid: string;\n };\n volumePhase?: 'Pending' | 'Publishing' | 'Ready' | 'Releasing' | 'Released' | 'Failed';\n volumePublishClaim?: {\n leaseEpoch: string;\n claimedAt: string;\n };\n volumeBindings?: Array<{\n name: string;\n claimRef: { name: string; uid: string };\n volumeRef: { name: string; uid: string };\n assignedDriver: string;\n assignedNode: string;\n /** Managed node-stage handle used for ordered publish cleanup. */\n stageHandle?: string;\n publishHandle: string;\n readOnly: boolean;\n }>;\n volumeReleaseRequestedAt?: string;\n volumeError?: OrchestrationErrorData;\n outputReference?: string;\n summary?: string;\n exitCode?: number;\n}\n\nexport interface AgentRunCondition {\n type: string;\n status: 'True' | 'False' | 'Unknown';\n}\n\nexport type AgentRunManifest = OrchestrationResourceManifest<AgentRunSpec>;\n\nexport interface AgentRunResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: AgentRunSpec;\n status?: AgentRunStatus;\n}\n\nexport function createAgentWorkloadManifest(name: string, spec: AgentWorkloadSpec): AgentWorkloadManifest {\n return {\n apiVersion: AGENT_WORKLOAD_API_VERSION,\n kind: AGENT_WORKLOAD_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function createAgentRunManifest(name: string, spec: AgentRunSpec): AgentRunManifest {\n return {\n apiVersion: AGENT_RUN_API_VERSION,\n kind: AGENT_RUN_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function isAgentWorkload(resource: { apiVersion?: string; kind?: string }): resource is AgentWorkloadResource {\n return resource.apiVersion === AGENT_WORKLOAD_API_VERSION && resource.kind === AGENT_WORKLOAD_KIND;\n}\n\nexport function isAgentRun(resource: { apiVersion?: string; kind?: string }): resource is AgentRunResource {\n return resource.apiVersion === AGENT_RUN_API_VERSION && resource.kind === AGENT_RUN_KIND;\n}\n\nexport function agentWorkloadReference(name: string, namespace?: string): {\n apiVersion: string;\n kind: string;\n name: string;\n namespace?: string;\n} {\n return {\n apiVersion: AGENT_WORKLOAD_API_VERSION,\n kind: AGENT_WORKLOAD_KIND,\n name,\n namespace,\n };\n}\n\nexport const TOOL_OPERATION_API_VERSION = 'execution.memeloop.io/v1alpha1';\nexport const TOOL_OPERATION_KIND = 'ToolOperation';\n\nexport type ToolOperationEffect = 'read' | 'create' | 'update' | 'delete' | 'execute' | 'unknown';\n\nexport interface ToolOperationToolReference {\n apiVersion?: string;\n kind: string;\n name: string;\n namespace?: string;\n /** Expected input/output schema digest; executors with another digest are rejected. */\n schemaDigest?: string;\n}\n\nexport interface ToolOperationRetryPolicy {\n maxAttempts?: number;\n nonRetryable?: boolean;\n fencingToken?: string;\n}\n\nexport interface ToolOperationPolicy {\n requireApproval?: boolean;\n auditLevel?: 'none' | 'metadata' | 'payload';\n}\n\nexport interface ToolOperationSpec {\n toolRef: ToolOperationToolReference;\n arguments?: Record<string, unknown>;\n effect: ToolOperationEffect;\n idempotencyKey?: string;\n timeoutMs?: number;\n retry?: ToolOperationRetryPolicy;\n policy?: ToolOperationPolicy;\n /** Explicit registered external-orchestrator driver selection. */\n placement?: {\n orchestrator?: string;\n requiredNode?: string;\n preferredNode?: string;\n nodeSelector?: Record<string, string>;\n minimumTrust?: NodeTrustClass;\n };\n}\n\nexport interface ToolOperationResult {\n value?: unknown;\n error?: OrchestrationErrorData;\n evidenceRef?: string;\n}\n\nexport interface ToolOperationApprovalEvidence {\n approvalId: string;\n decision: 'allow' | 'deny';\n /** Trusted human/service identity. Model-provided identities are invalid. */\n actor: string;\n decidedAt: string;\n reason?: string;\n}\n\nexport interface ToolOperationStatus extends OrchestrationResourceStatus {\n phase?: 'Pending' | 'Running' | 'Completed' | 'Failed' | 'Cancelled';\n result?: ToolOperationResult;\n attempts?: number;\n startedAt?: string;\n completedAt?: string;\n /** Trusted approval evidence returned by the host-bound approval driver. */\n approval?: ToolOperationApprovalEvidence;\n assignedDriver?: string;\n assignedNode?: string;\n assignedExecutor?: {\n apiVersion: string;\n kind: string;\n name: string;\n namespace?: string;\n uid?: string;\n };\n /**\n * Durable claim written before a local effect starts. A different fencing\n * epoch observing Running must reconcile unknown effect instead of blindly\n * repeating the operation.\n */\n executionClaim?: {\n leaseEpoch: string;\n claimedAt: string;\n };\n externalId?: string;\n externalMetadata?: Record<string, string>;\n}\n\nexport type ToolOperationManifest = OrchestrationResourceManifest<ToolOperationSpec>;\n\nexport interface ToolOperationResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: ToolOperationSpec;\n status?: ToolOperationStatus;\n}\n\nexport function createToolOperationManifest(name: string, spec: ToolOperationSpec): ToolOperationManifest {\n return {\n apiVersion: TOOL_OPERATION_API_VERSION,\n kind: TOOL_OPERATION_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function isToolOperation(resource: { apiVersion?: string; kind?: string }): resource is ToolOperationResource {\n return resource.apiVersion === TOOL_OPERATION_API_VERSION && resource.kind === TOOL_OPERATION_KIND;\n}\n\nexport function agentRunReference(name: string, namespace?: string): {\n apiVersion: string;\n kind: string;\n name: string;\n namespace?: string;\n} {\n return {\n apiVersion: AGENT_RUN_API_VERSION,\n kind: AGENT_RUN_KIND,\n name,\n namespace,\n };\n}\n\nexport const TOOL_CLASS_API_VERSION = 'tool.memeloop.io/v1alpha1';\nexport const TOOL_CLASS_KIND = 'ToolClass';\n\nexport const TOOL_EXECUTOR_API_VERSION = 'tool.memeloop.io/v1alpha1';\nexport const TOOL_EXECUTOR_KIND = 'ToolExecutor';\n\nexport type ToolRiskLevel = 'none' | 'low' | 'medium' | 'high' | 'critical';\n\nexport interface ToolClassSchema {\n input: Record<string, unknown>;\n output?: Record<string, unknown>;\n required?: string[];\n}\n\nexport interface ToolClassSpec {\n description?: string;\n version?: string;\n schema: ToolClassSchema;\n schemaDigest?: string;\n risk?: ToolRiskLevel;\n effects?: ToolOperationEffect[];\n allowedTargets?: string[];\n categories?: string[];\n}\n\nexport interface ToolClassStatus extends OrchestrationResourceStatus {\n endpointCount?: number;\n healthyEndpointCount?: number;\n}\n\nexport type ToolClassManifest = OrchestrationResourceManifest<ToolClassSpec>;\n\nexport interface ToolClassResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: ToolClassSpec;\n status?: ToolClassStatus;\n}\n\nexport interface ToolExecutorCapability {\n toolClassRef: {\n apiVersion: string;\n kind: string;\n name: string;\n };\n schemaDigest: string;\n effects?: ToolOperationEffect[];\n endpoint: string;\n capacity?: {\n maxConcurrent?: number;\n queueDepth?: number;\n };\n health?: {\n lastHeartbeat?: string;\n healthy: boolean;\n };\n}\n\nexport interface ToolExecutorSpec {\n nodeId?: string;\n selectors?: Record<string, string>;\n capabilities: ToolExecutorCapability[];\n trust?: 'trusted' | 'restricted' | 'quarantine';\n}\n\nexport interface ToolExecutorStatus extends OrchestrationResourceStatus {\n heartbeat?: string;\n healthy?: boolean;\n}\n\nexport type ToolExecutorManifest = OrchestrationResourceManifest<ToolExecutorSpec>;\n\nexport interface ToolExecutorResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: ToolExecutorSpec;\n status?: ToolExecutorStatus;\n}\n\nexport function createToolClassManifest(name: string, spec: ToolClassSpec): ToolClassManifest {\n return {\n apiVersion: TOOL_CLASS_API_VERSION,\n kind: TOOL_CLASS_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function createToolExecutorManifest(name: string, spec: ToolExecutorSpec): ToolExecutorManifest {\n return {\n apiVersion: TOOL_EXECUTOR_API_VERSION,\n kind: TOOL_EXECUTOR_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function isToolClass(resource: { apiVersion?: string; kind?: string }): resource is ToolClassResource {\n return resource.apiVersion === TOOL_CLASS_API_VERSION && resource.kind === TOOL_CLASS_KIND;\n}\n\nexport function isToolExecutor(resource: { apiVersion?: string; kind?: string }): resource is ToolExecutorResource {\n return resource.apiVersion === TOOL_EXECUTOR_API_VERSION && resource.kind === TOOL_EXECUTOR_KIND;\n}\n\nexport const MODEL_CLASS_API_VERSION = 'models.memeloop.io/v1alpha1';\nexport const MODEL_CLASS_KIND = 'ModelClass';\n\nexport const MODEL_ENDPOINT_API_VERSION = 'models.memeloop.io/v1alpha1';\nexport const MODEL_ENDPOINT_KIND = 'ModelEndpoint';\n\nexport const MODEL_CALL_RECORD_API_VERSION = 'models.memeloop.io/v1alpha1';\nexport const MODEL_CALL_RECORD_KIND = 'ModelCallRecord';\n\nexport type ModelModality = 'text' | 'vision' | 'audio' | 'embedding';\n\nexport interface ModelClassCapabilities {\n streaming?: boolean;\n toolUse?: boolean;\n jsonMode?: boolean;\n systemPrompt?: boolean;\n}\n\n/**\n * Declarative model catalog entry. Carries identity, digest, capabilities,\n * residency, and cost metadata only — raw provider SDK clients, base URLs with\n * embedded credentials, and API keys must never appear here.\n */\nexport interface ModelClassSpec {\n description?: string;\n /** Provider family identifier, e.g. `openai`, `anthropic`, `ollama`. */\n provider: string;\n /** Provider model name, e.g. `gpt-4o-mini`, `qwen2.5:7b`. */\n model: string;\n version?: string;\n /** Content digest: local weights hash or provider snapshot identifier. */\n digest?: string;\n modalities?: ModelModality[];\n contextWindow?: number;\n maxOutputTokens?: number;\n capabilities?: ModelClassCapabilities;\n /** `local`, `cloud`, or a region/zone label constraining data residency. */\n dataResidency?: string;\n cost?: {\n inputPerMillion?: number;\n outputPerMillion?: number;\n currency?: string;\n };\n}\n\nexport interface ModelClassStatus extends OrchestrationResourceStatus {\n endpointCount?: number;\n healthyEndpointCount?: number;\n}\n\nexport type ModelClassManifest = OrchestrationResourceManifest<ModelClassSpec>;\n\nexport interface ModelClassResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: ModelClassSpec;\n status?: ModelClassStatus;\n}\n\n/**\n * Schedulable model serving endpoint. The endpoint string is an opaque driver\n * handle (e.g. `ollama://node-1/qwen2.5:7b` or `gateway://default`) and must\n * not embed credentials.\n */\nexport interface ModelEndpointSpec {\n modelClassRef: {\n apiVersion: string;\n kind: string;\n name: string;\n };\n /** Must match the referenced ModelClass digest for schedulability. */\n modelDigest?: string;\n nodeId?: string;\n trust?: 'trusted' | 'restricted' | 'quarantine';\n endpoint: string;\n capacity?: {\n maxConcurrent?: number;\n tokensPerMinute?: number;\n };\n dataPolicy?: {\n classification?: string;\n retention?: string;\n };\n}\n\nexport interface ModelEndpointStatus extends OrchestrationResourceStatus {\n healthy?: boolean;\n heartbeat?: string;\n activeCalls?: number;\n}\n\nexport type ModelEndpointManifest = OrchestrationResourceManifest<ModelEndpointSpec>;\n\nexport interface ModelEndpointResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: ModelEndpointSpec;\n status?: ModelEndpointStatus;\n}\n\n/**\n * Audit and usage record for a single model call. Records carry usage and\n * classification metadata, never raw prompts, completions, or credentials.\n */\nexport interface ModelCallRecordSpec {\n modelClassRef: {\n apiVersion: string;\n kind: string;\n name: string;\n };\n /** Immutable model artifact/provider snapshot selected for this call. */\n modelDigest?: string;\n endpointRef?: {\n apiVersion: string;\n kind: string;\n name: string;\n };\n runRef?: OrchestrationOwnerReference;\n /** Immutable attempt number from the authorizing ModelAccessHandle. */\n runAttempt?: number;\n /** Bound actor identity asserted by the host, not self-reported. */\n caller?: string;\n /** Name of the ModelAccessHandle authorizing this call. */\n accessHandleRef?: string;\n /** Admission/policy snapshot bound into the authorizing handle. */\n policyDigest?: string;\n inputClassification?: string;\n outputClassification?: string;\n}\n\nexport interface ModelCallRecordStatus extends OrchestrationResourceStatus {\n phase?: 'Running' | 'Completed' | 'Failed' | 'Cancelled';\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n cost?: number;\n currency?: string;\n };\n latencyMs?: number;\n startedAt?: string;\n completedAt?: string;\n error?: OrchestrationErrorData;\n}\n\nexport type ModelCallRecordManifest = OrchestrationResourceManifest<ModelCallRecordSpec>;\n\nexport interface ModelCallRecordResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: ModelCallRecordSpec;\n status?: ModelCallRecordStatus;\n}\n\nexport function createModelClassManifest(name: string, spec: ModelClassSpec): ModelClassManifest {\n return {\n apiVersion: MODEL_CLASS_API_VERSION,\n kind: MODEL_CLASS_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function createModelEndpointManifest(name: string, spec: ModelEndpointSpec): ModelEndpointManifest {\n return {\n apiVersion: MODEL_ENDPOINT_API_VERSION,\n kind: MODEL_ENDPOINT_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function createModelCallRecordManifest(name: string, spec: ModelCallRecordSpec): ModelCallRecordManifest {\n return {\n apiVersion: MODEL_CALL_RECORD_API_VERSION,\n kind: MODEL_CALL_RECORD_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function isModelClass(resource: { apiVersion?: string; kind?: string }): resource is ModelClassResource {\n return resource.apiVersion === MODEL_CLASS_API_VERSION && resource.kind === MODEL_CLASS_KIND;\n}\n\nexport function isModelEndpoint(resource: { apiVersion?: string; kind?: string }): resource is ModelEndpointResource {\n return resource.apiVersion === MODEL_ENDPOINT_API_VERSION && resource.kind === MODEL_ENDPOINT_KIND;\n}\n\nexport function isModelCallRecord(resource: { apiVersion?: string; kind?: string }): resource is ModelCallRecordResource {\n return resource.apiVersion === MODEL_CALL_RECORD_API_VERSION && resource.kind === MODEL_CALL_RECORD_KIND;\n}\n\nexport const SECURITY_PROFILE_API_VERSION = 'security.memeloop.io/v1alpha1';\nexport const SECURITY_PROFILE_KIND = 'SecurityProfile';\n\n/**\n * Reusable security posture referenced by workloads. The profile is applied\n * by trusted admission, never by the workload itself: for restricted and\n * quarantine trust classes the resolved tool-admission default is forced to\n * `deny` regardless of `toolAdmission.defaultAction`.\n */\nexport interface SecurityProfileSpec {\n description?: string;\n /** Trust class this profile applies to. */\n trustClass: NodeTrustClass;\n /** Tool admission overlay merged over the trust-class default policy. */\n toolAdmission?: ToolAdmissionPolicy;\n /** Model access constraints for workloads under this profile. */\n modelPolicy?: {\n allowedModelClasses?: string[];\n maxInputClassification?: DataClassification;\n };\n}\n\nexport interface SecurityProfileStatus extends OrchestrationResourceStatus {\n /** Number of workloads currently referencing this profile. */\n workloadCount?: number;\n}\n\nexport type SecurityProfileManifest = OrchestrationResourceManifest<SecurityProfileSpec>;\n\nexport interface SecurityProfileResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: SecurityProfileSpec;\n status?: SecurityProfileStatus;\n}\n\nexport function createSecurityProfileManifest(name: string, spec: SecurityProfileSpec): SecurityProfileManifest {\n return {\n apiVersion: SECURITY_PROFILE_API_VERSION,\n kind: SECURITY_PROFILE_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function isSecurityProfile(resource: { apiVersion?: string; kind?: string }): resource is SecurityProfileResource {\n return resource.apiVersion === SECURITY_PROFILE_API_VERSION && resource.kind === SECURITY_PROFILE_KIND;\n}\n\nexport const POLICY_DECISION_API_VERSION = 'security.memeloop.io/v1alpha1';\nexport const POLICY_DECISION_KIND = 'PolicyDecision';\n\nexport type PersistedPolicyDecisionKind =\n | 'resource-admission'\n | 'placement'\n | 'tool-operation'\n | 'approval'\n | 'transition';\n\n/** Immutable decision evidence; only a pending approval's status may resolve. */\nexport interface PolicyDecisionSpec {\n subjectRef: {\n apiVersion: string;\n kind: string;\n name: string;\n namespace?: string;\n uid: string;\n generation: number;\n };\n decisionKind: PersistedPolicyDecisionKind;\n policyDigest: string;\n inputDigest: string;\n requestFingerprint: string;\n idempotencyKey: string;\n fencingEpoch: number;\n requestedBy: string;\n reasons: string[];\n obligations: string[];\n decidedAt: string;\n initialOutcome: 'allow' | 'deny' | 'pending';\n approval?: {\n subjectDigest: string;\n requestedBy: string;\n requestedAt: string;\n expiresAt: string;\n };\n}\n\nexport interface PolicyDecisionStatus extends OrchestrationResourceStatus {\n outcome: 'allow' | 'deny' | 'pending';\n decidedBy: string;\n decidedAt: string;\n reasons: string[];\n resolutionInputDigest?: string;\n}\n\nexport type PolicyDecisionManifest = OrchestrationResourceManifest<PolicyDecisionSpec>;\n\nexport interface PolicyDecisionResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: PolicyDecisionSpec;\n status?: PolicyDecisionStatus;\n}\n\nexport function createPolicyDecisionManifest(\n name: string,\n spec: PolicyDecisionSpec,\n): PolicyDecisionManifest {\n return {\n apiVersion: POLICY_DECISION_API_VERSION,\n kind: POLICY_DECISION_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function isPolicyDecision(\n resource: { apiVersion?: string; kind?: string },\n): resource is PolicyDecisionResource {\n return resource.apiVersion === POLICY_DECISION_API_VERSION &&\n resource.kind === POLICY_DECISION_KIND;\n}\n\nexport const AUDIT_RECORD_API_VERSION = 'audit.memeloop.io/v1alpha1';\nexport const AUDIT_RECORD_KIND = 'AuditRecord';\n\n/**\n * Immutable, metadata-only audit/telemetry evidence. The record digest covers\n * every field except itself and links to the preceding record in the named\n * stream. Raw request/response bodies and credentials have no representation.\n */\nexport interface AuditRecordSpec {\n stream: string;\n sequence: number;\n resourceUid: string;\n recordKind: 'audit' | 'event' | 'metric' | 'trace';\n receivedAt: string;\n actor: {\n id: string;\n kind: 'controller' | 'verifier' | 'admin';\n };\n policyDigest: string;\n capabilityDigest: string;\n effect: 'read' | 'create' | 'update' | 'delete' | 'execute' | 'decision' | 'security';\n provenance: {\n source: 'controller' | 'gateway' | 'driver' | 'worker' | 'operator';\n producer: string;\n subject?: string;\n };\n attributes: Record<string, string>;\n data:\n | {\n kind: 'audit';\n action: string;\n outcome: 'success' | 'denied' | 'failure';\n reasonCode?: string;\n }\n | {\n kind: 'event';\n name: string;\n severity: 'debug' | 'info' | 'warning' | 'error' | 'critical';\n }\n | {\n kind: 'metric';\n name: string;\n value: number;\n unit: string;\n }\n | {\n kind: 'trace';\n name: string;\n traceId: string;\n spanId: string;\n durationMs: number;\n status: 'ok' | 'error';\n };\n previousDigest?: string;\n recordDigest: string;\n requestFingerprint: string;\n idempotencyDigest: string;\n fencingEpoch: number;\n}\n\nexport type AuditRecordManifest = OrchestrationResourceManifest<AuditRecordSpec>;\n\nexport interface AuditRecordResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: AuditRecordSpec;\n status?: OrchestrationResourceStatus;\n}\n\nexport function createAuditRecordManifest(\n name: string,\n spec: AuditRecordSpec,\n): AuditRecordManifest {\n return {\n apiVersion: AUDIT_RECORD_API_VERSION,\n kind: AUDIT_RECORD_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function isAuditRecord(\n resource: { apiVersion?: string; kind?: string },\n): resource is AuditRecordResource {\n return resource.apiVersion === AUDIT_RECORD_API_VERSION &&\n resource.kind === AUDIT_RECORD_KIND;\n}\n\nexport const NETWORK_CLASS_API_VERSION = 'network.memeloop.io/v1alpha1';\nexport const NETWORK_CLASS_KIND = 'NetworkClass';\n\nexport const NETWORK_ATTACHMENT_API_VERSION = 'network.memeloop.io/v1alpha1';\nexport const NETWORK_ATTACHMENT_KIND = 'NetworkAttachment';\n\nexport interface NetworkEgressRule {\n /** Host, domain suffix, or CIDR, e.g. `api.openai.com` or `10.0.0.0/8`. */\n target: string;\n ports?: number[];\n protocol?: 'tcp' | 'udp' | 'http' | 'https' | 'any';\n action: 'allow' | 'deny';\n}\n\n/**\n * CNI-like network desired state. `enforcement: required` means the workload\n * must not start unless the driver can enforce every configured feature;\n * `best-effort` allows partial enforcement with recorded degradation.\n */\nexport interface NetworkClassSpec {\n description?: string;\n /** NetworkDriver name responsible for this class. */\n driver: string;\n dns?: {\n policy?: 'default' | 'none' | 'custom';\n servers?: string[];\n searchDomains?: string[];\n };\n proxy?: {\n httpProxy?: string;\n httpsProxy?: string;\n noProxy?: string[];\n /** When true, traffic bypassing the proxy must be blocked. */\n mandatory?: boolean;\n };\n ingress?: {\n defaultAction?: 'allow' | 'deny';\n allow?: Array<{\n from?: string;\n ports?: number[];\n }>;\n };\n egress?: {\n defaultAction: 'allow' | 'deny';\n rules?: NetworkEgressRule[];\n };\n serviceAccess?: {\n allowControlPlane?: boolean;\n allowClusterServices?: boolean;\n allowModelGateway?: boolean;\n };\n bandwidth?: {\n ingressKbps?: number;\n egressKbps?: number;\n };\n dataPolicy?: {\n classification?: DataClassification;\n retention?: string;\n };\n enforcement: 'required' | 'best-effort';\n}\n\nexport interface NetworkClassStatus extends OrchestrationResourceStatus {\n attachmentCount?: number;\n}\n\nexport type NetworkClassManifest = OrchestrationResourceManifest<NetworkClassSpec>;\n\nexport interface NetworkClassResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: NetworkClassSpec;\n status?: NetworkClassStatus;\n}\n\nexport interface NetworkAttachmentSpec {\n networkClassRef: {\n apiVersion: string;\n kind: string;\n name: string;\n };\n workloadRef?: OrchestrationOwnerReference;\n /** Exact AgentRun whose sandbox and authority this attachment belongs to. */\n runRef?: OrchestrationOwnerReference;\n nodeId?: string;\n}\n\nexport interface NetworkAttachmentStatus extends OrchestrationResourceStatus {\n phase?: 'Pending' | 'Preparing' | 'Attached' | 'Failed' | 'Detached';\n /** Node and driver selected independently from workload execution. */\n assignedNode?: string;\n assignedDriver?: string;\n /** Fences the placement decision and the NetworkClass version it validated. */\n binding?: {\n leaseEpoch: string;\n networkClassResourceVersion: string;\n boundAt: string;\n };\n /**\n * Durable claim written before prepare() may create host-side state.\n * A new lease epoch must not blindly repeat an unconfirmed prepare.\n */\n executionClaim?: {\n leaseEpoch: string;\n claimedAt: string;\n };\n /** Opaque driver handle; consumers must never parse it. */\n handle?: string;\n addresses?: string[];\n routes?: string[];\n dns?: {\n servers?: string[];\n };\n /** Features the driver could not enforce under a best-effort class. */\n degraded?: string[];\n attachedAt?: string;\n /** Set by the workload owner after execution; the node driver must release before Detached. */\n releaseRequestedAt?: string;\n detachedAt?: string;\n error?: OrchestrationErrorData;\n}\n\nexport type NetworkAttachmentManifest = OrchestrationResourceManifest<NetworkAttachmentSpec>;\n\nexport interface NetworkAttachmentResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: NetworkAttachmentSpec;\n status?: NetworkAttachmentStatus;\n}\n\nexport function createNetworkClassManifest(name: string, spec: NetworkClassSpec): NetworkClassManifest {\n return {\n apiVersion: NETWORK_CLASS_API_VERSION,\n kind: NETWORK_CLASS_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function createNetworkAttachmentManifest(name: string, spec: NetworkAttachmentSpec): NetworkAttachmentManifest {\n return {\n apiVersion: NETWORK_ATTACHMENT_API_VERSION,\n kind: NETWORK_ATTACHMENT_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function isNetworkClass(resource: { apiVersion?: string; kind?: string }): resource is NetworkClassResource {\n return resource.apiVersion === NETWORK_CLASS_API_VERSION && resource.kind === NETWORK_CLASS_KIND;\n}\n\nexport function isNetworkAttachment(resource: { apiVersion?: string; kind?: string }): resource is NetworkAttachmentResource {\n return resource.apiVersion === NETWORK_ATTACHMENT_API_VERSION && resource.kind === NETWORK_ATTACHMENT_KIND;\n}\n\nexport const STORAGE_CLASS_API_VERSION = 'storage.memeloop.io/v1alpha1';\nexport const STORAGE_CLASS_KIND = 'StorageClass';\nexport const VOLUME_CLAIM_API_VERSION = 'storage.memeloop.io/v1alpha1';\nexport const VOLUME_CLAIM_KIND = 'AgentVolumeClaim';\nexport const VOLUME_API_VERSION = 'storage.memeloop.io/v1alpha1';\nexport const VOLUME_KIND = 'AgentVolume';\nexport const SNAPSHOT_API_VERSION = 'storage.memeloop.io/v1alpha1';\nexport const SNAPSHOT_KIND = 'AgentSnapshot';\n\nexport type VolumeAccessMode = 'ReadWriteOnce' | 'ReadOnlyMany' | 'ReadWriteMany';\n\n/** CSI-like storage class: provisioning and replication policy. */\nexport interface StorageClassSpec {\n description?: string;\n /** StorageDriver name responsible for this class. */\n driver: string;\n replication?: {\n /** Desired replica count across fault domains (1 = no replication). */\n factor?: number;\n /** Fault-domain labels replicas must be spread across (e.g. `node`, `zone`). */\n faultDomains?: string[];\n /** Rebuild replicas automatically after loss. */\n autoRebuild?: boolean;\n };\n encryption?: {\n enabled?: boolean;\n /** Reference to a key in the credential domain (never key material). */\n keyRef?: string;\n };\n allowedAccessModes?: VolumeAccessMode[];\n snapshotSupport?: boolean;\n backup?: {\n /** Cron-like schedule expression evaluated by the backup controller. */\n schedule?: string;\n retentionCount?: number;\n };\n dataPolicy?: {\n classification?: DataClassification;\n retention?: string;\n };\n}\n\nexport interface StorageClassStatus extends OrchestrationResourceStatus {\n volumeCount?: number;\n healthyVolumeCount?: number;\n}\n\nexport type StorageClassManifest = OrchestrationResourceManifest<StorageClassSpec>;\n\nexport interface StorageClassResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: StorageClassSpec;\n status?: StorageClassStatus;\n}\n\n/** PVC-like claim: a workload's request for storage. */\nexport interface AgentVolumeClaimSpec {\n storageClassRef: {\n apiVersion: string;\n kind: string;\n name: string;\n };\n accessMode: VolumeAccessMode;\n sizeBytes?: number;\n selector?: Record<string, string>;\n /** Restore from a snapshot when provisioning. */\n dataSourceRef?: {\n apiVersion: string;\n kind: string;\n name: string;\n };\n}\n\nexport interface AgentVolumeClaimStatus extends OrchestrationResourceStatus {\n phase?: 'Pending' | 'Provisioning' | 'Bound' | 'Lost' | 'Failed';\n assignedNode?: string;\n assignedDriver?: string;\n binding?: {\n leaseEpoch: string;\n storageClassResourceVersion: string;\n boundAt: string;\n };\n provisionClaim?: {\n leaseEpoch: string;\n claimedAt: string;\n };\n volumeRef?: {\n apiVersion: string;\n kind: string;\n name: string;\n uid?: string;\n };\n error?: OrchestrationErrorData;\n}\n\nexport type AgentVolumeClaimManifest = OrchestrationResourceManifest<AgentVolumeClaimSpec>;\n\nexport interface AgentVolumeClaimResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: AgentVolumeClaimSpec;\n status?: AgentVolumeClaimStatus;\n}\n\nexport interface AgentVolumeReplicaStatus {\n nodeId: string;\n state: 'healthy' | 'degraded' | 'rebuilding' | 'offline';\n /** Verified content hash of this replica (must equal the volume contentHash). */\n contentHash?: string;\n updatedAt?: string;\n}\n\n/** PV-like provisioned volume. `driverHandle` is opaque and never parsed by consumers. */\nexport interface AgentVolumeSpec {\n storageClassRef: {\n apiVersion: string;\n kind: string;\n name: string;\n };\n claimRef?: OrchestrationOwnerReference;\n /** Opaque driver handle for the provisioned volume. */\n driverHandle: string;\n capacityBytes?: number;\n topology?: {\n nodeId?: string;\n zone?: string;\n };\n accessModes?: VolumeAccessMode[];\n}\n\nexport interface AgentVolumeStatus extends OrchestrationResourceStatus {\n phase?: 'Pending' | 'Available' | 'Bound' | 'Published' | 'Failed';\n replicas?: AgentVolumeReplicaStatus[];\n /** Last verified content hash; the replication source of truth. */\n contentHash?: string;\n /** Current primary replica node; transfers originate only from the primary. */\n primaryNodeId?: string;\n /** Monotonically increasing fencing epoch, bumped on every primary change. */\n primaryEpoch?: number;\n publishedTo?: Array<{\n nodeId?: string;\n workloadRef?: OrchestrationOwnerReference;\n }>;\n health?: 'healthy' | 'degraded' | 'rebuilding' | 'failed';\n}\n\nexport type AgentVolumeManifest = OrchestrationResourceManifest<AgentVolumeSpec>;\n\nexport interface AgentVolumeResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: AgentVolumeSpec;\n status?: AgentVolumeStatus;\n}\n\n/** Point-in-time snapshot of a volume; restorable into new claims. */\nexport interface AgentSnapshotSpec {\n sourceVolumeRef: {\n apiVersion: string;\n kind: string;\n name: string;\n };\n snapshotClass?: string;\n}\n\nexport interface AgentSnapshotStatus extends OrchestrationResourceStatus {\n phase?: 'Pending' | 'Ready' | 'Failed';\n readyToUse?: boolean;\n restoreSizeBytes?: number;\n /** Opaque driver handle for the snapshot. */\n driverHandle?: string;\n createdAt?: string;\n}\n\nexport type AgentSnapshotManifest = OrchestrationResourceManifest<AgentSnapshotSpec>;\n\nexport interface AgentSnapshotResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: AgentSnapshotSpec;\n status?: AgentSnapshotStatus;\n}\n\nexport function createStorageClassManifest(name: string, spec: StorageClassSpec): StorageClassManifest {\n return {\n apiVersion: STORAGE_CLASS_API_VERSION,\n kind: STORAGE_CLASS_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function createVolumeClaimManifest(name: string, spec: AgentVolumeClaimSpec): AgentVolumeClaimManifest {\n return {\n apiVersion: VOLUME_CLAIM_API_VERSION,\n kind: VOLUME_CLAIM_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function createVolumeManifest(name: string, spec: AgentVolumeSpec): AgentVolumeManifest {\n return {\n apiVersion: VOLUME_API_VERSION,\n kind: VOLUME_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function createSnapshotManifest(name: string, spec: AgentSnapshotSpec): AgentSnapshotManifest {\n return {\n apiVersion: SNAPSHOT_API_VERSION,\n kind: SNAPSHOT_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function isStorageClass(resource: { apiVersion?: string; kind?: string }): resource is StorageClassResource {\n return resource.apiVersion === STORAGE_CLASS_API_VERSION && resource.kind === STORAGE_CLASS_KIND;\n}\n\nexport function isVolumeClaim(resource: { apiVersion?: string; kind?: string }): resource is AgentVolumeClaimResource {\n return resource.apiVersion === VOLUME_CLAIM_API_VERSION && resource.kind === VOLUME_CLAIM_KIND;\n}\n\nexport function isVolume(resource: { apiVersion?: string; kind?: string }): resource is AgentVolumeResource {\n return resource.apiVersion === VOLUME_API_VERSION && resource.kind === VOLUME_KIND;\n}\n\nexport function isSnapshot(resource: { apiVersion?: string; kind?: string }): resource is AgentSnapshotResource {\n return resource.apiVersion === SNAPSHOT_API_VERSION && resource.kind === SNAPSHOT_KIND;\n}\n\nexport const CREDENTIAL_GRANT_API_VERSION = 'security.memeloop.io/v1alpha1';\nexport const CREDENTIAL_GRANT_KIND = 'CredentialGrant';\n\n/**\n * JIT credential authorization (plan 24.46). The resource records grant\n * metadata only — the opaque handle lives in the credential domain and raw\n * secret material never appears in spec or status.\n */\nexport interface CredentialGrantSpec {\n runRef: {\n apiVersion: string;\n kind: string;\n name: string;\n uid: string;\n };\n attempt: number;\n /** Fingerprint of the worker's ephemeral public key. */\n workerKey: string;\n /** Target system the credential acts on (e.g. `ssh://node-7`, `model:openai/gpt-4o`). */\n target: string;\n /** Operation the credential authorizes (e.g. `exec`, `generate`, `read`). */\n method: string;\n /** Audience the resulting handle is valid for. */\n audience: string;\n policyDigest: string;\n budget?: {\n maxCalls?: number;\n maxCost?: number;\n currency?: string;\n };\n /** Requested TTL in milliseconds; the broker caps it. */\n ttlMs?: number;\n}\n\nexport interface CredentialGrantStatus extends OrchestrationResourceStatus {\n phase?: 'Pending' | 'Issuing' | 'Issued' | 'Renewed' | 'Revoked' | 'Expired' | 'Failed';\n assignedNode?: string;\n assignedBroker?: string;\n binding?: {\n leaseEpoch: string;\n boundAt: string;\n };\n issuanceClaim?: {\n leaseEpoch: string;\n claimedAt: string;\n };\n /** Opaque handle reference in the credential domain — never the handle itself. */\n handleRef?: string;\n issuedAt?: string;\n expiresAt?: string;\n renewedAt?: string;\n revokedAt?: string;\n /** Exposure assessment used to decide post-task rotation. */\n exposure?: 'none' | 'worker-visible' | 'potentially-exposed';\n rotationRequired?: boolean;\n rotationReason?: string;\n error?: OrchestrationErrorData;\n}\n\nexport type CredentialGrantManifest = OrchestrationResourceManifest<CredentialGrantSpec>;\n\nexport interface CredentialGrantResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: CredentialGrantSpec;\n status?: CredentialGrantStatus;\n}\n\nexport function createCredentialGrantManifest(name: string, spec: CredentialGrantSpec): CredentialGrantManifest {\n return {\n apiVersion: CREDENTIAL_GRANT_API_VERSION,\n kind: CREDENTIAL_GRANT_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function isCredentialGrant(resource: { apiVersion?: string; kind?: string }): resource is CredentialGrantResource {\n return resource.apiVersion === CREDENTIAL_GRANT_API_VERSION && resource.kind === CREDENTIAL_GRANT_KIND;\n}\n\nexport const ARTIFACT_RECORD_API_VERSION = 'artifacts.memeloop.io/v1alpha1';\nexport const ARTIFACT_RECORD_KIND = 'ArtifactRecord';\n\nexport type ArtifactTrust = 'trusted' | 'restricted' | 'quarantine' | 'untrusted';\n\nexport type ArtifactDestination = 'prompt' | 'volume' | 'backup' | 'knowledge';\n\nexport type ArtifactReviewKind = 'scan' | 'sanitize' | 'verify';\n\nexport interface ArtifactReviewEvidence {\n kind: ArtifactReviewKind;\n outcome: 'passed' | 'failed';\n reviewer: string;\n contentHash: string;\n policyDigest: string;\n destinations: ArtifactDestination[];\n /** Narrow properties certified by the reviewer; never implies general trust. */\n properties?: string[];\n recordedAt: string;\n}\n\n/**\n * Content-addressed artifact with provenance and trust (plan 24.47). Derived\n * content inherits the lowest trust of its inputs; untrusted or unverified\n * content cannot enter trusted prompts, volumes, backups, or knowledge\n * ingestion without explicit policy and a verifier pass.\n */\nexport interface ArtifactRecordSpec {\n /** Content hash (e.g. `sha256:...`); the storage address. */\n contentHash: string;\n sizeBytes?: number;\n mimeType?: string;\n /** Producing run and its trust at production time. */\n producer?: {\n runRef?: OrchestrationOwnerReference;\n trust: ArtifactTrust;\n };\n /** Parent artifacts this one derives from. */\n parents?: Array<{\n apiVersion: string;\n kind: string;\n name: string;\n }>;\n trust: ArtifactTrust;\n}\n\nexport interface ArtifactRecordStatus extends OrchestrationResourceStatus {\n /** Append-only evidence written only by the trusted artifact review actor. */\n reviews?: ArtifactReviewEvidence[];\n quarantined?: boolean;\n quarantineReason?: string;\n /** Downstream artifact names derived from this one (lineage). */\n derivedBy?: string[];\n}\n\nexport type ArtifactRecordManifest = OrchestrationResourceManifest<ArtifactRecordSpec>;\n\nexport interface ArtifactRecordResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: ArtifactRecordSpec;\n status?: ArtifactRecordStatus;\n}\n\nexport function createArtifactRecordManifest(name: string, spec: ArtifactRecordSpec): ArtifactRecordManifest {\n return {\n apiVersion: ARTIFACT_RECORD_API_VERSION,\n kind: ARTIFACT_RECORD_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function isArtifactRecord(resource: { apiVersion?: string; kind?: string }): resource is ArtifactRecordResource {\n return resource.apiVersion === ARTIFACT_RECORD_API_VERSION && resource.kind === ARTIFACT_RECORD_KIND;\n}\n\n// ─── DriverManifest (drivers.memeloop.io/v1alpha1) ────────────────────\n\nexport const DRIVER_MANIFEST_API_VERSION = 'drivers.memeloop.io/v1alpha1';\nexport const DRIVER_MANIFEST_KIND = 'DriverManifest';\n\nexport type InfrastructureDriverType =\n | 'control-store'\n | 'loop-runtime'\n | 'tool-catalog'\n | 'tool-execution'\n | 'model-provider'\n | 'network'\n | 'storage'\n | 'credential'\n | 'artifact'\n | 'identity-attestation'\n | 'policy-approval'\n | 'audit-telemetry'\n | 'external-orchestrator';\n\nexport type DriverManifestConformance =\n | {\n suiteVersion: string;\n status: 'not-run';\n }\n | {\n suiteVersion: string;\n status: 'failed';\n failedAt: string;\n failure: string;\n }\n | {\n suiteVersion: string;\n status: 'passed';\n passedAt: string;\n /** Content digest of the exact golden fixture/result bundle. */\n fixtureDigest: string;\n };\n\n/**\n * Control-plane representation of a registered driver (plan §11, 24.62).\n * A RuntimeClass/NetworkClass/ModelClass/scheduler can only reference a\n * driver whose manifest is registered and conformance-checked; external\n * orchestrator drivers register through the CLI discovery loader.\n */\nexport interface DriverManifestSpec {\n driverType: InfrastructureDriverType;\n /** Driver package version (from getCapabilities or the package manifest). */\n version: string;\n execution: {\n location: 'controller' | 'node' | 'worker' | 'external';\n transport: 'in-process' | 'stdio' | 'utility-process' | 'http' | 'peer-rpc' | 'container-api' | 'other';\n };\n supportedTrustClasses: NodeTrustClass[];\n resourceKinds: string[];\n capabilities: Record<string, boolean | string | number>;\n downgradeBehavior: 'reject' | 'explicit-degrade';\n requiredHostPrivileges: string[];\n isolation: {\n boundary: 'none' | 'process' | 'namespace' | 'host' | 'external';\n threatAssumptions: string[];\n };\n configuration: {\n /** Stable reference to the schema used to validate non-secret configuration. */\n schemaRef: string;\n /** Names of opaque SecretRef fields; never secret values. */\n secretRefs: string[];\n };\n health: {\n mode: 'method' | 'endpoint';\n endpoint?: string;\n };\n lifecycle: {\n discoverable: boolean;\n hotReload: boolean;\n gracefulShutdown: boolean;\n };\n conformance: DriverManifestConformance;\n supportsCancellation: boolean;\n supportsBackpressure: boolean;\n supportsAdoption: boolean;\n supportsFencing: boolean;\n /** External orchestrators: the resource kinds this driver manages. */\n manages?: Array<'AgentWorkload' | 'ToolOperation'>;\n /** External orchestrators: co-located scheduling support. */\n supportsColocation?: boolean;\n}\n\nexport interface DriverManifestStatus extends OrchestrationResourceStatus {\n phase?: 'Pending' | 'Ready' | 'Failed';\n registeredAt?: string;\n error?: OrchestrationErrorData;\n}\n\nexport type DriverManifestManifest = OrchestrationResourceManifest<DriverManifestSpec>;\n\nexport interface DriverManifestResource extends OrchestrationTypeMeta {\n metadata: OrchestrationObjectMetadata;\n spec: DriverManifestSpec;\n status?: DriverManifestStatus;\n}\n\nexport function createDriverManifestManifest(name: string, spec: DriverManifestSpec): DriverManifestManifest {\n return {\n apiVersion: DRIVER_MANIFEST_API_VERSION,\n kind: DRIVER_MANIFEST_KIND,\n metadata: { name },\n spec,\n };\n}\n\nexport function isDriverManifest(resource: { apiVersion?: string; kind?: string }): resource is DriverManifestResource {\n return resource.apiVersion === DRIVER_MANIFEST_API_VERSION && resource.kind === DRIVER_MANIFEST_KIND;\n}\n\n/** A class may only select a manifest whose current conformance evidence passed. */\nexport function isDriverManifestAdmitted(resource: DriverManifestResource): boolean {\n return resource.status?.phase === 'Ready' && resource.spec.conformance.status === 'passed';\n}\n","import type { DetailReference } from '../conversation/index.js';\n\n/**\n * Tools may attach this key to their return object so `agentToolLoop` persists\n * `summary` + optional `detailRef` instead of `JSON.stringify` of the whole payload (plan §5.2.1).\n */\nexport const MEMELOOP_STRUCTURED_TOOL_KEY = '__memeloopToolResult' as const;\n\n/** Truncate tool summary for persisted `ChatMessage` / LLM context (plan §5.2.1). */\nexport function truncateToolSummary(s: string, max = 2000): string {\n if (s.length <= max) return s;\n return `${s.slice(0, max - 3)}...`;\n}\n\nexport interface MemeloopStructuredToolPayload {\n /** Short text for the tool message body (≤2000 chars recommended). */\n summary: string;\n detailRef?: DetailReference;\n /**\n * When set, `agentToolLoop` pauses after persisting this tool row until `waitForTerminalSession` resolves\n * (terminal `await` mode, plan §16.4.1).\n */\n awaitSessionId?: string;\n}\n\nexport function extractMemeloopStructuredToolPayload(\n raw: unknown,\n): MemeloopStructuredToolPayload | null {\n if (raw === null || typeof raw !== 'object') return null;\n const o = raw as Record<string, unknown>;\n const payload = o[MEMELOOP_STRUCTURED_TOOL_KEY];\n if (payload === null || typeof payload !== 'object') return null;\n const p = payload as Record<string, unknown>;\n if (typeof p.summary !== 'string' || p.summary.length === 0) return null;\n const awaitSessionId = typeof p.awaitSessionId === 'string' && p.awaitSessionId.length > 0\n ? p.awaitSessionId\n : undefined;\n return {\n summary: p.summary,\n detailRef: p.detailRef as MemeloopStructuredToolPayload['detailRef'],\n awaitSessionId,\n };\n}\n","import { createChatMessage, type DetailReference } from '../../conversation/index.js';\nimport type { AgentOrchestrationClient, OrchestrationResourceReference } from '../../orchestration/client.js';\nimport { reconcileUnknownEffect } from '../../orchestration/drivers/unknownEffect.js';\nimport { OrchestrationError } from '../../orchestration/errors.js';\nimport { createToolOperationManifest, TOOL_OPERATION_API_VERSION, TOOL_OPERATION_KIND, type ToolOperationResource } from '../../orchestration/resources.js';\nimport { TOOL_PARAMETER_PARSE_ERROR_KEY } from '../../promptUtilities/responsePatternUtility.js';\nimport { nextLamportClockForConversation } from '../../storage/nextLamport.js';\nimport { extractMemeloopStructuredToolPayload, truncateToolSummary } from '../../tools/structuredToolResult.js';\nimport type { AgentFrameworkContext } from '../../types.js';\nimport { executeHooks, hasHooks } from '../hooks/registry.js';\n\nimport type { AgentLoopStep } from '../types.js';\nimport type { PendingToolCall } from './toolUseGate.js';\n\ntype ToolRunRow = {\n text: string;\n isError: boolean;\n payload?: unknown;\n detailRef?: DetailReference;\n awaitSessionId?: string;\n};\n\ntype CompletedToolCall = ToolRunRow & { call: PendingToolCall };\n\nconst TOOL_OPERATION_DEFAULT_TIMEOUT_MS = 60_000;\nconst TOOL_OPERATION_POLL_INTERVAL_MS = 250;\n\nlet toolOperationCounter = 0;\nlet toolResultMessageCounter = 0;\n\nfunction isTerminalToolOperationPhase(phase: string | undefined): boolean {\n return phase === 'Completed' || phase === 'Failed' || phase === 'Cancelled';\n}\n\n/** Deterministic stringify (sorted object keys) for stable idempotency keys. */\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== 'object') return JSON.stringify(value) ?? 'undefined';\n if (Array.isArray(value)) return `[${value.map(stableStringify).join(',')}]`;\n const entries = Object.entries(value as Record<string, unknown>)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, item]) => `${JSON.stringify(key)}:${stableStringify(item)}`);\n return `{${entries.join(',')}}`;\n}\n\n/** Browser-safe FNV-1a hash for idempotency keys (not a security primitive). */\nfunction fnv1aHex(input: string): string {\n let hash = 0x81_1c_9d_c5;\n for (let index = 0; index < input.length; index += 1) {\n hash = Math.imul(hash ^ input.charCodeAt(index), 0x01_00_01_93) >>> 0;\n }\n return hash.toString(16).padStart(8, '0');\n}\n\nfunction isTransientGetError(error: unknown): boolean {\n return (\n error instanceof OrchestrationError &&\n (error.code === 'UNAVAILABLE' || error.code === 'TIMEOUT' || error.code === 'INTERNAL')\n );\n}\n\n/**\n * Poll a ToolOperation until terminal. Transient `get` failures are treated\n * as possible unknown-effect situations: reconciliation decides whether to\n * keep waiting (`retry`) or stop and surface the required intervention,\n * never blindly repeating the operation.\n */\nasync function waitForToolOperationTerminal(\n client: AgentOrchestrationClient,\n reference: OrchestrationResourceReference,\n timeoutMs: number,\n applied?: ToolOperationResource,\n): Promise<ToolOperationResource> {\n const deadline = Date.now() + timeoutMs;\n let last: ToolOperationResource | null = applied ?? null;\n while (Date.now() < deadline) {\n let resource: Awaited<ReturnType<AgentOrchestrationClient['get']>> | undefined;\n try {\n resource = await client.get(reference);\n } catch (error) {\n if (!isTransientGetError(error)) throw error;\n const basis = last ?? applied;\n if (!basis) throw error;\n const decision = reconcileUnknownEffect(basis, { resultObserved: false });\n if (decision.action === 'retry') {\n // The operation itself is safe to keep awaiting; do not re-apply.\n } else {\n throw new Error(\n `ToolOperation ${reference.name ?? '<unknown>'} effect unknown after transport failure: ` +\n `${decision.action} — ${decision.reason}`,\n );\n }\n }\n if (resource) {\n last = resource as unknown as ToolOperationResource;\n if (isTerminalToolOperationPhase(last.status?.phase)) {\n return last;\n }\n }\n await new Promise<void>((resolve) => {\n setTimeout(resolve, TOOL_OPERATION_POLL_INTERVAL_MS);\n });\n }\n if (last) {\n return last;\n }\n throw new Error(`ToolOperation ${reference.name ?? '<unknown>'} was not observed before timeout`);\n}\n\nfunction toolOperationRow(resource: ToolOperationResource): ToolRunRow {\n const status = resource.status;\n if (status?.phase === 'Completed') {\n const value = status.result?.value;\n if (value != null && typeof value === 'object') {\n const structured = extractMemeloopStructuredToolPayload(value);\n if (structured) {\n return {\n text: structured.summary,\n isError: false,\n detailRef: structured.detailRef,\n awaitSessionId: structured.awaitSessionId,\n };\n }\n if ('error' in value && typeof value.error === 'string') {\n return { text: value.error, isError: true };\n }\n if ('result' in value && value.result != null) {\n return {\n text: typeof value.result === 'string' ? value.result : JSON.stringify(value.result),\n payload: typeof value.result === 'string' ? undefined : value.result,\n isError: false,\n };\n }\n }\n return { text: typeof value === 'string' ? value : JSON.stringify(value), isError: false };\n }\n if (status?.phase === 'Failed' || status?.phase === 'Cancelled') {\n return {\n text: status.result?.error?.message ?? `ToolOperation ${status.phase}`,\n isError: true,\n };\n }\n return {\n text: `ToolOperation did not reach a terminal phase (last phase: ${status?.phase ?? 'unknown'})`,\n isError: true,\n };\n}\n\nasync function executeToolOperation(\n context: AgentFrameworkContext,\n conversationId: string,\n call: PendingToolCall,\n occurrence: number,\n): Promise<ToolRunRow | null> {\n const client = context.orchestration;\n if (!client) return null;\n\n try {\n const caps = await client.getCapabilities();\n if (\n !caps.resourceKinds.includes(TOOL_OPERATION_KIND) ||\n !caps.operations.includes('apply') ||\n !caps.operations.includes('get')\n ) {\n return null;\n }\n } catch {\n return null;\n }\n\n const timeoutMs = context.agentToolLoop?.toolOperationTimeoutMs ?? TOOL_OPERATION_DEFAULT_TIMEOUT_MS;\n // Stable per logical call: controller retries re-deliver the same operation,\n // while a new identical call (next occurrence) produces a distinct key.\n const idempotencyKey = `${conversationId}:${\n fnv1aHex(stableStringify({\n toolId: call.toolId,\n parameters: call.parameters,\n }))\n }:${occurrence}`;\n\n toolOperationCounter += 1;\n const operation = createToolOperationManifest(\n `${call.toolId}-${Date.now().toString(36)}-${toolOperationCounter.toString(36)}`,\n {\n toolRef: { kind: 'BuiltinTool', name: call.toolId },\n effect: context.tools.getToolEffect?.(call.toolId) ?? 'execute',\n arguments: call.parameters,\n idempotencyKey,\n timeoutMs,\n policy: { auditLevel: 'metadata' },\n },\n );\n\n try {\n const applied = await client.apply(operation);\n if (applied.apiVersion !== TOOL_OPERATION_API_VERSION || applied.kind !== TOOL_OPERATION_KIND) {\n return { text: 'ToolOperation apply returned an unexpected resource kind', isError: true };\n }\n let resource = applied as unknown as ToolOperationResource;\n if (!isTerminalToolOperationPhase(resource.status?.phase)) {\n const reference: OrchestrationResourceReference = {\n apiVersion: applied.apiVersion,\n kind: applied.kind,\n name: applied.metadata.name,\n namespace: applied.metadata.namespace,\n };\n resource = await waitForToolOperationTerminal(client, reference, timeoutMs, resource);\n }\n return toolOperationRow(resource);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { text: `ToolOperation execution error: ${message}`, isError: true };\n }\n}\n\nasync function executeRegistryTool(\n context: AgentFrameworkContext,\n toolId: string,\n parameters: Record<string, unknown>,\n): Promise<ToolRunRow> {\n const normalizedId = toolId.includes('-')\n ? toolId.replace(/-([a-z])/g, (_m, c: string) => c.toUpperCase())\n : toolId;\n const impl = (context.tools.getTool(toolId) ?? context.tools.getTool(normalizedId)) as\n | ((arguments_: Record<string, unknown>) => unknown)\n | undefined;\n\n if (typeof impl !== 'function') {\n return {\n text: `No tool registered for \"${toolId}\".`,\n isError: true,\n };\n }\n\n try {\n const raw = await impl(parameters);\n if (raw != null && typeof raw === 'object') {\n const o = raw as { error?: string; result?: unknown };\n if (typeof o.error === 'string' && o.error.length > 0) {\n return { text: o.error, isError: true };\n }\n if ('result' in o) {\n return {\n text: typeof o.result === 'string' ? o.result : JSON.stringify(o.result),\n payload: typeof o.result === 'string' ? undefined : o.result,\n isError: false,\n };\n }\n const structured = extractMemeloopStructuredToolPayload(raw);\n if (structured) {\n return {\n text: structured.summary,\n isError: false,\n detailRef: structured.detailRef,\n awaitSessionId: structured.awaitSessionId,\n };\n }\n }\n return { text: typeof raw === 'string' ? raw : JSON.stringify(raw), isError: false };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (context.logger?.warn) {\n context.logger.warn('[agentToolLoop] tool execution error', toolId, message);\n } else {\n console.warn('[agentToolLoop] tool execution error', toolId, message);\n }\n return { text: message, isError: true };\n }\n}\n\nasync function executeWithGuards(\n context: AgentFrameworkContext,\n options: AgentFrameworkContext['agentToolLoop'],\n conversationId: string,\n recentToolCalls: string[],\n call: PendingToolCall,\n): Promise<ToolRunRow> {\n const parameterParseError = call.parameters[TOOL_PARAMETER_PARSE_ERROR_KEY];\n if (typeof parameterParseError === 'string') {\n return { text: parameterParseError, isError: true };\n }\n\n const signature = `${call.toolId}:${JSON.stringify(call.parameters)}`;\n recentToolCalls.push(signature);\n const threshold = Math.max(2, options?.doomLoopThreshold ?? 3);\n const last = recentToolCalls.slice(-threshold);\n if (last.length === threshold && last.every((x) => x === signature)) {\n return { text: 'Blocked by doom-loop guard', isError: true };\n }\n\n // Occurrence of this exact call in the conversation; distinguishes a new\n // logical call from a controller retry of a previous one.\n const occurrence = recentToolCalls.filter((entry) => entry === signature).length;\n const row = (await executeToolOperation(context, conversationId, call, occurrence)) ??\n (await executeRegistryTool(context, call.toolId, call.parameters));\n\n if (hasHooks('PostToolUse')) {\n await executeHooks('PostToolUse', context, {\n toolId: call.toolId,\n parameters: call.parameters,\n result: row.text,\n isError: row.isError,\n conversationId,\n });\n }\n\n return row;\n}\n\nasync function persistToolResult(\n context: AgentFrameworkContext,\n conversationId: string,\n call: PendingToolCall,\n row: ToolRunRow,\n): Promise<void> {\n toolResultMessageCounter += 1;\n const lamportTool = await nextLamportClockForConversation(context.storage, conversationId);\n await context.storage.appendMessage(createChatMessage({\n // Counter suffix keeps message identity unique for identical calls within\n // the same millisecond (parallel tools or fast consecutive rounds).\n messageId: `${conversationId}:t:${call.toolId}:${Date.now().toString(36)}:${toolResultMessageCounter.toString(36)}`,\n conversationId,\n originNodeId: 'local',\n lamportClock: lamportTool,\n role: 'tool',\n parts: [{\n type: 'tool-result',\n toolName: call.toolId,\n parameters: call.parameters,\n result: row.text,\n isError: row.isError,\n payload: row.payload,\n detailRef: row.detailRef,\n }],\n detailRef: row.detailRef,\n metadata: {\n isToolResult: true,\n isError: row.isError,\n toolId: call.toolId,\n toolParameters: call.parameters,\n },\n }));\n}\n\nasync function persistTerminalAwaitCompletion(\n context: AgentFrameworkContext,\n options: AgentFrameworkContext['agentToolLoop'],\n conversationId: string,\n call: PendingToolCall,\n row: ToolRunRow,\n): Promise<void> {\n const sid = row.awaitSessionId;\n const wait = options?.waitForTerminalSession;\n if (!sid || !wait || row.isError) return;\n const done = await wait(sid);\n const lamportTool = await nextLamportClockForConversation(context.storage, conversationId);\n const body = truncateToolSummary(\n `[terminal.await done] session=${sid}\\nexitCode: ${done.exitCode ?? 'null'}\\n---\\n${done.truncatedOutput}`,\n );\n await context.storage.appendMessage(createChatMessage({\n messageId: `${conversationId}:t:${call.toolId}:await:${Date.now().toString(36)}:${toolResultMessageCounter.toString(36)}`,\n conversationId,\n originNodeId: 'local',\n lamportClock: lamportTool,\n role: 'tool',\n parts: [{\n type: 'tool-result',\n toolName: call.toolId,\n parameters: call.parameters,\n result: body,\n detailRef: row.detailRef\n ? { ...row.detailRef, exitCode: done.exitCode ?? row.detailRef.exitCode }\n : undefined,\n }],\n detailRef: row.detailRef\n ? { ...row.detailRef, exitCode: done.exitCode ?? row.detailRef.exitCode }\n : undefined,\n metadata: {\n isToolResult: true,\n toolId: call.toolId,\n toolParameters: call.parameters,\n awaitSessionId: sid,\n },\n }));\n}\n\nfunction toolStep(row: CompletedToolCall, parallel: boolean): AgentLoopStep {\n return {\n type: 'tool',\n data: {\n toolId: row.call.toolId,\n parameters: row.call.parameters,\n parallel,\n result: row.text,\n isError: row.isError,\n },\n };\n}\n\nexport async function* runRegistryToolCalls(options: {\n context: AgentFrameworkContext;\n agentToolLoopOptions: AgentFrameworkContext['agentToolLoop'];\n conversationId: string;\n calls: PendingToolCall[];\n parallel: boolean;\n recentToolCalls: string[];\n}): AsyncGenerator<AgentLoopStep, void, unknown> {\n const { context, agentToolLoopOptions, conversationId, calls, parallel, recentToolCalls } = options;\n\n if (parallel) {\n const results = await Promise.all(\n calls.map(\n async (call): Promise<CompletedToolCall> => ({\n call,\n ...(await executeWithGuards(\n context,\n agentToolLoopOptions,\n conversationId,\n recentToolCalls,\n call,\n )),\n }),\n ),\n );\n for (const row of results) {\n yield toolStep(row, true);\n }\n for (const row of results) {\n await persistToolResult(context, conversationId, row.call, row);\n }\n for (const row of results) {\n await persistTerminalAwaitCompletion(\n context,\n agentToolLoopOptions,\n conversationId,\n row.call,\n row,\n );\n }\n return;\n }\n\n for (const call of calls) {\n const row = await executeWithGuards(\n context,\n agentToolLoopOptions,\n conversationId,\n recentToolCalls,\n call,\n );\n yield toolStep({ call, ...row }, false);\n await persistToolResult(context, conversationId, call, row);\n await persistTerminalAwaitCompletion(context, agentToolLoopOptions, conversationId, call, row);\n }\n}\n","import type { MergedPermissions, PermissionAction, PermissionSet } from './types.js';\n\n/**\n * Test whether a tool name matches a wildcard pattern.\n *\n * Supported patterns:\n * - `*` → matches everything\n * - `file.*` → matches any tool starting with `file.`\n * - `shell(*)` → matches tools like `shell(rm)`, `shell(ls)` (literal parens)\n * - exact name → matches only that exact tool name\n *\n * Patterns are converted to anchored regexes internally.\n */\nexport function matchPattern(toolName: string, pattern: string): boolean {\n // Exact match short-circuit\n if (pattern === toolName) return true;\n if (pattern === '*') return true;\n\n // Escape all regex special characters, then convert escaped * back to wildcard .*\n const escaped = pattern\n .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\\\\\*/g, '.*');\n\n return new RegExp(`^${escaped}$`).test(toolName);\n}\n\n/**\n * Merge multiple permission sets from lowest to highest priority.\n *\n * Sets are processed in order; later rules override earlier ones for the same tool pattern.\n * Within a single set, rules are processed in order (last wins).\n *\n * @param sets - Ordered from lowest to highest priority (e.g. default → agent → user → session)\n * @returns Flattened `MergedPermissions` with all unique patterns per action.\n */\nexport function mergePermissionSets(sets: PermissionSet[]): MergedPermissions {\n // Map from action to a Map of pattern → action (deduplicated by pattern, last wins)\n const merged = new Map<PermissionAction, Map<string, PermissionAction>>();\n merged.set('allow', new Map());\n merged.set('deny', new Map());\n merged.set('ask', new Map());\n\n for (const set of sets) {\n for (const rule of set.rules) {\n // Remove this pattern from any OTHER action maps (to avoid contradictions)\n for (const [action, map] of merged) {\n if (action !== rule.action) {\n map.delete(rule.toolPattern);\n }\n }\n // Set pattern in its action map\n merged.get(rule.action)!.set(rule.toolPattern, rule.action);\n }\n }\n\n return {\n allow: [...merged.get('allow')!.keys()],\n deny: [...merged.get('deny')!.keys()],\n ask: [...merged.get('ask')!.keys()],\n };\n}\n\n/**\n * Check what action applies to a given tool name under merged permissions.\n *\n * Precedence: exact patterns always beat wildcards.\n * Within same specificity: deny > ask > allow.\n */\nexport function checkPermission(\n toolName: string,\n merged: MergedPermissions,\n): PermissionAction {\n const isWildcard = (p: string) => p.includes('*');\n\n // Exact patterns first: deny > ask > allow\n for (const pattern of merged.deny) {\n if (!isWildcard(pattern) && matchPattern(toolName, pattern)) return 'deny';\n }\n for (const pattern of merged.ask) {\n if (!isWildcard(pattern) && matchPattern(toolName, pattern)) return 'ask';\n }\n for (const pattern of merged.allow) {\n if (!isWildcard(pattern) && matchPattern(toolName, pattern)) return 'allow';\n }\n\n // Wildcard patterns: deny > ask > allow\n for (const pattern of merged.deny) {\n if (isWildcard(pattern) && matchPattern(toolName, pattern)) return 'deny';\n }\n for (const pattern of merged.ask) {\n if (isWildcard(pattern) && matchPattern(toolName, pattern)) return 'ask';\n }\n for (const pattern of merged.allow) {\n if (isWildcard(pattern) && matchPattern(toolName, pattern)) return 'allow';\n }\n\n // Fallback: when no rules are configured at all, allow everything (backward compat).\n // When rules exist but none match, deny (secure default).\n const hasAnyRules = merged.allow.length > 0 || merged.deny.length > 0 || merged.ask.length > 0;\n return hasAnyRules ? 'deny' : 'allow';\n}\n","import { matchPattern } from '../../permission/engine.js';\nimport type { PermissionAction } from '../../permission/types.js';\n\nimport type { NodeTrustClass, SecurityProfileResource, ToolAdmissionAction, ToolAdmissionPolicy, ToolAdmissionRule, ToolOperationResource } from '../resources.js';\n\nexport type { NodeTrustClass, ToolAdmissionAction, ToolAdmissionPolicy, ToolAdmissionRule } from '../resources.js';\n\nexport interface ToolAdmissionDecision {\n action: ToolAdmissionAction;\n source: 'rule' | 'default';\n reason?: string;\n matchedRule?: ToolAdmissionRule;\n}\n\n/**\n * Default trusted admission posture per node trust class. Trusted nodes keep\n * the historical allow-by-default posture; restricted and quarantine nodes\n * deny everything unless an explicit rule allows it.\n */\nexport function defaultAdmissionPolicyForTrustClass(trustClass: NodeTrustClass): ToolAdmissionPolicy {\n switch (trustClass) {\n case 'restricted':\n case 'quarantine':\n return { defaultAction: 'deny', rules: [] };\n default:\n return { defaultAction: 'allow', rules: [] };\n }\n}\n\n/**\n * Resolve the effective trusted admission policy for a workload from its\n * SecurityProfile and the node's trust class. Profile rules are evaluated\n * first (they can allow specific tools on restricted nodes); the trust-class\n * default applies after. For restricted/quarantine the resolved default is\n * forced to `deny` — a profile cannot override it.\n */\nexport function resolveAdmissionPolicy(\n profile: Pick<SecurityProfileResource, 'spec'> | undefined,\n trustClass: NodeTrustClass,\n): ToolAdmissionPolicy {\n const base = defaultAdmissionPolicyForTrustClass(trustClass);\n const overlay = profile?.spec.toolAdmission;\n if (!overlay) return base;\n const defaultAction = trustClass === 'trusted' ? overlay.defaultAction ?? base.defaultAction : 'deny';\n return {\n defaultAction,\n rules: [...(overlay.rules ?? []), ...(base.rules ?? [])],\n };\n}\n\n/**\n * Model-facing implied permission default for a trust class. Used by the\n * AgentToolLoop permission gate when no explicit wildcard rule exists.\n */\nexport function defaultPermissionActionForTrustClass(trustClass: NodeTrustClass | undefined): PermissionAction {\n return trustClass === 'restricted' || trustClass === 'quarantine' ? 'deny' : 'allow';\n}\n\nexport function evaluateToolAdmission(\n policy: ToolAdmissionPolicy,\n operation: Pick<ToolOperationResource, 'spec'>,\n): ToolAdmissionDecision {\n const toolName = operation.spec.toolRef.name;\n const effect = operation.spec.effect;\n for (const rule of policy.rules ?? []) {\n if (!matchPattern(toolName, rule.toolPattern)) continue;\n if (rule.effects && !rule.effects.includes(effect)) continue;\n return {\n action: rule.action,\n source: 'rule',\n reason: rule.reason,\n matchedRule: rule,\n };\n }\n return { action: policy.defaultAction, source: 'default' };\n}\n","/**\n * TidGi `approval.ts` 逐行迁移(pending 队列 + UI 监听)。\n */\nimport type { ApprovalDecision, ToolApprovalConfig, ToolApprovalRequest } from './types.js';\n\nconst pendingApprovals = new Map<\n string,\n {\n request: ToolApprovalRequest;\n resolve: (decision: 'allow' | 'deny') => void;\n }\n>();\n\nconst approvalListeners = new Set<(request: ToolApprovalRequest) => void>();\n\nexport function onApprovalRequest(listener: (request: ToolApprovalRequest) => void): () => void {\n approvalListeners.add(listener);\n return () => {\n approvalListeners.delete(listener);\n };\n}\n\nexport function evaluateApproval(\n approval: ToolApprovalConfig | undefined,\n toolName: string,\n parameters: Record<string, unknown>,\n): ApprovalDecision {\n if (!approval || approval.mode === 'auto') {\n return 'allow';\n }\n\n const callContent = JSON.stringify({ tool: toolName, parameters });\n\n if (approval.denyPatterns?.length) {\n for (const pattern of approval.denyPatterns) {\n try {\n if (new RegExp(pattern, 'i').test(callContent)) {\n return 'deny';\n }\n } catch {\n /* invalid regex */\n }\n }\n }\n\n if (approval.allowPatterns?.length) {\n for (const pattern of approval.allowPatterns) {\n try {\n if (new RegExp(pattern, 'i').test(callContent)) {\n return 'allow';\n }\n } catch {\n /* invalid regex */\n }\n }\n }\n\n return 'pending';\n}\n\nexport function requestApproval(request: ToolApprovalRequest, timeoutMs: number = 60_000): Promise<'allow' | 'deny'> {\n return new Promise<'allow' | 'deny'>((resolve) => {\n pendingApprovals.set(request.approvalId, { request, resolve });\n\n for (const listener of approvalListeners) {\n try {\n listener(request);\n } catch {\n /* ignore listener errors */\n }\n }\n\n if (timeoutMs > 0) {\n setTimeout(() => {\n if (pendingApprovals.has(request.approvalId)) {\n pendingApprovals.delete(request.approvalId);\n resolve('deny');\n }\n }, timeoutMs);\n }\n });\n}\n\nexport function resolveApproval(approvalId: string, decision: 'allow' | 'deny'): void {\n const pending = pendingApprovals.get(approvalId);\n if (pending) {\n pendingApprovals.delete(approvalId);\n pending.resolve(decision);\n }\n}\n\nexport function getPendingApprovals(): ToolApprovalRequest[] {\n return [...pendingApprovals.values()].map((p) => p.request);\n}\n\nexport function cancelPendingApprovals(agentId: string): void {\n for (const [id, pending] of pendingApprovals) {\n if (pending.request.agentId === agentId) {\n pendingApprovals.delete(id);\n pending.resolve('deny');\n }\n }\n}\n","import { createChatMessage } from '../../conversation/index.js';\nimport { defaultPermissionActionForTrustClass } from '../../orchestration/security/admission.js';\nimport type { MergedPermissions, PermissionAction, PermissionSet } from '../../permission/index.js';\nimport { checkPermission, mergePermissionSets } from '../../permission/index.js';\nimport type { ToolCallingMatch } from '../../promptUtilities/responsePatternUtility.js';\nimport { nextLamportClockForConversation } from '../../storage/nextLamport.js';\nimport { requestApproval } from '../../tools/approval.js';\nimport type { AgentFrameworkContext } from '../../types.js';\nimport { executeHooks, hasHooks } from '../hooks/registry.js';\nimport type { HookHandler, HookResult, PreToolUseData } from '../hooks/types.js';\n\nimport type { AgentLoopStep } from '../types.js';\n\nexport type PendingToolCall = ToolCallingMatch & { found: true };\n\n/**\n * Build layered permission sets from context options.\n *\n * Layers (lowest to highest priority):\n * 1. default - `toolPermissions.default` (e.g. \"allow\")\n * 2. agent - `toolPermissions.perAgent[definitionId]`\n * 3. user - persisted in SQLite (loaded via permission storage)\n * 4. session - `toolPermissions.rules` (global rules)\n *\n * When no wildcard rule exists, an implied default is derived from the\n * host-bound trust class: restricted/quarantine workers deny by default,\n * trusted workers keep the historical allow default.\n */\nexport function buildLayeredPermissions(\n options: AgentFrameworkContext['agentToolLoop'],\n definitionId: string,\n userSet?: PermissionSet,\n): MergedPermissions {\n const globalPerms = options?.toolPermissions;\n const sets: PermissionSet[] = [];\n\n if (globalPerms?.default) {\n sets.push({\n source: 'default',\n rules: [{ toolPattern: '*', action: globalPerms.default }],\n });\n }\n\n const scoped = globalPerms?.perAgent?.[definitionId];\n if (scoped) {\n if (scoped.default) {\n sets.push({\n source: `agent:${definitionId}:default`,\n rules: [{ toolPattern: '*', action: scoped.default }],\n });\n }\n if (scoped.rules && scoped.rules.length > 0) {\n sets.push({\n source: `agent:${definitionId}`,\n rules: scoped.rules.map((r) => ({ toolPattern: r.pattern, action: r.action })),\n });\n }\n }\n\n if (userSet && userSet.rules.length > 0) {\n sets.push(userSet);\n }\n\n if (globalPerms?.rules && globalPerms.rules.length > 0) {\n sets.push({\n source: 'session',\n rules: globalPerms.rules.map((r) => ({ toolPattern: r.pattern, action: r.action })),\n });\n }\n\n if (!sets.some((s) => s.rules.some((r) => r.toolPattern === '*'))) {\n sets.unshift({\n source: 'implied-default',\n rules: [{ toolPattern: '*', action: defaultPermissionActionForTrustClass(options?.trustClass) }],\n });\n }\n\n return mergePermissionSets(sets);\n}\n\nexport function createPermissionPreToolUseHook(\n options: AgentFrameworkContext['agentToolLoop'],\n definitionId: string,\n userSet?: PermissionSet,\n): HookHandler {\n const mergedPermissions = buildLayeredPermissions(options, definitionId, userSet);\n return async (_context, data) => {\n const toolId = typeof data.toolId === 'string' ? data.toolId : '';\n const action = checkPermission(toolId, mergedPermissions);\n if (action === 'allow') {\n return { allowed: true, permissionAction: 'allow' };\n }\n return {\n allowed: true,\n permissionAction: action,\n reason: action === 'deny' ? 'Denied by tool permission' : undefined,\n };\n };\n}\n\nfunction applyModifiedCall(\n call: PendingToolCall,\n modified?: Record<string, unknown>,\n): PendingToolCall {\n if (!modified) return call;\n const toolId = typeof modified.toolId === 'string' ? modified.toolId : call.toolId;\n const parameters = modified.parameters != null && typeof modified.parameters === 'object'\n ? (modified.parameters as Record<string, unknown>)\n : call.parameters;\n return { ...call, toolId, parameters };\n}\n\nfunction normalizePreToolUseResult(result: HookResult): {\n action: PermissionAction;\n reason?: string;\n} {\n if (!result.allowed) {\n return { action: 'deny', reason: result.reason ?? 'Blocked by PreToolUse hook' };\n }\n if (result.permissionAction === 'ask' || result.permissionAction === 'deny') {\n return { action: result.permissionAction, reason: result.reason };\n }\n return { action: 'allow', reason: result.reason };\n}\n\nasync function persistDeniedToolResult(\n context: AgentFrameworkContext,\n conversationId: string,\n call: PendingToolCall,\n errorText: string,\n): Promise<void> {\n const lamportTool = await nextLamportClockForConversation(context.storage, conversationId);\n await context.storage.appendMessage(createChatMessage({\n messageId: `${conversationId}:t:${call.toolId}:${Date.now().toString(36)}`,\n conversationId,\n originNodeId: 'local',\n lamportClock: lamportTool,\n role: 'tool',\n parts: [{\n type: 'tool-result',\n toolName: call.toolId,\n parameters: call.parameters,\n result: errorText,\n isError: true,\n }],\n metadata: {\n isToolResult: true,\n isError: true,\n toolId: call.toolId,\n toolParameters: call.parameters,\n },\n }));\n}\n\nasync function* resolveAskAction(\n conversationId: string,\n call: PendingToolCall,\n): AsyncGenerator<AgentLoopStep, PermissionAction, unknown> {\n yield {\n type: 'permission_request' as const,\n data: { tool: call.toolId, args: call.parameters },\n };\n const decision = await requestApproval(\n {\n approvalId: `${conversationId}:${Date.now().toString(36)}:${call.toolId}`,\n agentId: conversationId,\n toolName: call.toolId,\n parameters: call.parameters,\n created: new Date(),\n },\n 60_000,\n );\n return decision === 'allow' ? 'allow' : 'deny';\n}\n\nasync function runPreToolUseHook(\n context: AgentFrameworkContext,\n data: PreToolUseData,\n): Promise<HookResult> {\n if (!hasHooks('PreToolUse')) return { allowed: true };\n return executeHooks('PreToolUse', context, data);\n}\n\nexport async function* gateToolCallsWithPreToolUse(\n context: AgentFrameworkContext,\n options: AgentFrameworkContext['agentToolLoop'],\n definitionId: string,\n conversationId: string,\n calls: PendingToolCall[],\n): AsyncGenerator<AgentLoopStep, PendingToolCall[], unknown> {\n const permissionHook = createPermissionPreToolUseHook(options, definitionId);\n const allowedCalls: PendingToolCall[] = [];\n\n for (const originalCall of calls) {\n let call = originalCall;\n const permissionResult = await permissionHook(context, {\n toolId: call.toolId,\n parameters: call.parameters,\n conversationId,\n });\n call = applyModifiedCall(call, permissionResult.modified);\n\n let { action, reason } = normalizePreToolUseResult(permissionResult);\n if (action === 'ask') {\n action = yield* resolveAskAction(conversationId, call);\n reason = action === 'deny' ? 'Tool approval denied or timed out' : reason;\n }\n if (action === 'deny') {\n const errorText = reason ?? 'Denied by tool permission';\n yield {\n type: 'tool' as const,\n data: {\n toolId: call.toolId,\n parameters: call.parameters,\n parallel: false,\n result: errorText,\n isError: true,\n },\n };\n await persistDeniedToolResult(context, conversationId, call, errorText);\n continue;\n }\n\n const hookResult = await runPreToolUseHook(context, {\n toolId: call.toolId,\n parameters: call.parameters,\n conversationId,\n });\n call = applyModifiedCall(call, hookResult.modified);\n ({ action, reason } = normalizePreToolUseResult(hookResult));\n if (action === 'ask') {\n action = yield* resolveAskAction(conversationId, call);\n reason = action === 'deny' ? 'Tool approval denied or timed out' : reason;\n }\n if (action === 'deny') {\n const errorText = reason ?? 'Blocked by PreToolUse hook';\n yield {\n type: 'tool' as const,\n data: {\n toolId: call.toolId,\n parameters: call.parameters,\n parallel: false,\n result: errorText,\n isError: true,\n },\n };\n await persistDeniedToolResult(context, conversationId, call, errorText);\n continue;\n }\n\n allowedCalls.push(call);\n }\n\n return allowedCalls;\n}\n","import { type ChatMessage, createChatMessage } from '../../conversation/index.js';\n\nimport { responseConcat } from '../../promptUtilities/responseConcat.js';\nimport { matchAllToolCallings, type ToolCallingMatch } from '../../promptUtilities/responsePatternUtility.js';\nimport { nextLamportClockForConversation } from '../../storage/nextLamport.js';\nimport { createHooksWithPlugins, resolvePromptPluginMap, runResponseCompleteHooks } from '../../tools/pluginRegistry.js';\nimport type { DefineToolAgentFrameworkContext } from '../../tools/types.js';\nimport type { AgentFrameworkContext, AgentInstanceModel } from '../../types.js';\nimport { executeHooks, hasHooks } from '../hooks/registry.js';\nimport type { AgentStopData } from '../hooks/types.js';\nimport type { AgentLoopInput, AgentLoopStep } from '../types.js';\nimport type { AgentToolLoopIterationGenerator, AgentToolLoopState, AgentToolLoopTurnStartResult } from './contracts.js';\nimport { prepareIterationHistory } from './historyCompaction.js';\nimport { chunkToText, streamLlm } from './llmStream.js';\nimport { buildLlmMessages, inferDefinitionId, resolveAgentDefinitionModel } from './modelMessages.js';\nimport { runRegistryToolCalls } from './toolCallRunner.js';\nimport { gateToolCallsWithPreToolUse } from './toolUseGate.js';\n\nconst DEFAULT_MAX_ITERATIONS = 256;\n\nfunction toolCallHandledInAgentMessages(\n agentMessages: ChatMessage[],\n assistantContent: string,\n call: ToolCallingMatch & { found: true },\n): boolean {\n let assistantIndex = -1;\n for (let index = agentMessages.length - 1; index >= 0; index -= 1) {\n const message = agentMessages[index];\n if (message.role === 'assistant' && message.content === assistantContent) {\n assistantIndex = index;\n break;\n }\n }\n if (assistantIndex < 0) return false;\n const after = agentMessages.slice(assistantIndex + 1);\n return after.some(\n message =>\n message.role === 'tool' &&\n (message.metadata?.toolId === call.toolId ||\n (typeof message.content === 'string' && message.content.includes(`Tool: ${call.toolId}`))),\n );\n}\n\nfunction resolveMaxIterations(context: AgentFrameworkContext): number {\n const configured = context.agentToolLoop?.maxIterations;\n return configured != null && configured > 0 ? configured : DEFAULT_MAX_ITERATIONS;\n}\n\nfunction pluginToolCallSignature(calls: Array<ToolCallingMatch & { found: true }>): string {\n return calls.map(call => `${call.toolId}:${JSON.stringify(call.parameters)}`).join('|');\n}\n\nasync function blockRepeatedPluginToolCalls(\n context: AgentFrameworkContext,\n input: AgentLoopInput,\n state: AgentToolLoopState,\n calls: Array<ToolCallingMatch & { found: true }>,\n hookContext: DefineToolAgentFrameworkContext,\n): Promise<{ blocked: false } | { blocked: true; message: string }> {\n if (calls.length === 0) return { blocked: false };\n\n const signature = pluginToolCallSignature(calls);\n state.recentToolCalls.push(signature);\n const threshold = Math.max(2, context.agentToolLoop?.doomLoopThreshold ?? 3);\n const last = state.recentToolCalls.slice(-threshold);\n if (last.length !== threshold || !last.every(entry => entry === signature)) {\n return { blocked: false };\n }\n\n const message = `Blocked by doom-loop guard: the model repeated the same tool call ${threshold} times. ` +\n 'Change the arguments or approach before trying again.';\n const firstCall = calls[0];\n const lamportClock = await nextLamportClockForConversation(\n context.storage,\n input.conversationId,\n );\n const toolMessage = createChatMessage({\n messageId: `${input.conversationId}:t:doom-loop:${state.iteration}:${Date.now().toString(36)}`,\n conversationId: input.conversationId,\n originNodeId: 'local',\n lamportClock,\n role: 'tool',\n parts: [{\n type: 'tool-result',\n toolName: firstCall.toolId,\n parameters: firstCall.parameters,\n result: message,\n isError: true,\n }],\n metadata: {\n isToolResult: true,\n isError: true,\n toolId: firstCall.toolId,\n toolParameters: firstCall.parameters,\n doomLoopBlocked: true,\n },\n });\n hookContext.agent.messages.push(toolMessage);\n await context.storage.appendMessage(toolMessage);\n return { blocked: true, message };\n}\n\nexport function createAgentToolLoopState(context: AgentFrameworkContext): AgentToolLoopState {\n return {\n iteration: 0,\n maxIterations: resolveMaxIterations(context),\n recentToolCalls: [],\n agentStarted: false,\n agentStopped: false,\n };\n}\n\nfunction markAgentToolLoopStop(state: AgentToolLoopState, reason: AgentStopData['reason']): void {\n state.stopReason ??= reason;\n}\n\nfunction finishAgentToolLoopThinking(\n state: AgentToolLoopState,\n reason: AgentStopData['reason'],\n data: Record<string, unknown>,\n): AgentLoopStep {\n markAgentToolLoopStop(state, reason);\n return { type: 'thinking', data };\n}\n\nexport async function startAgentToolLoopTurn(\n context: AgentFrameworkContext,\n input: AgentLoopInput,\n state: AgentToolLoopState,\n): Promise<AgentToolLoopTurnStartResult> {\n const now = Date.now();\n const lamportClock = await nextLamportClockForConversation(\n context.storage,\n input.conversationId,\n );\n const hostUserMessage = input.userMessage;\n const userMessage = context.normalizeMessage?.({\n ...hostUserMessage,\n messageId: hostUserMessage?.messageId ?? `${input.conversationId}:${now.toString(36)}`,\n conversationId: input.conversationId,\n originNodeId: hostUserMessage?.originNodeId ?? 'local',\n timestamp: hostUserMessage?.timestamp ?? now,\n lamportClock: hostUserMessage?.lamportClock ?? lamportClock,\n role: 'user',\n content: hostUserMessage?.content ?? input.message,\n }) ?? {\n ...hostUserMessage,\n messageId: hostUserMessage?.messageId ?? `${input.conversationId}:${now.toString(36)}`,\n conversationId: input.conversationId,\n originNodeId: hostUserMessage?.originNodeId ?? 'local',\n timestamp: hostUserMessage?.timestamp ?? now,\n lamportClock: hostUserMessage?.lamportClock ?? lamportClock,\n role: 'user',\n content: hostUserMessage?.content ?? input.message,\n };\n\n if (input.resumeSession && input.resumeSession.length > 0) {\n await context.storage.insertMessagesIfAbsent(input.resumeSession);\n }\n\n await context.storage.appendMessage(userMessage);\n\n if (hasHooks('UserPromptSubmit')) {\n const hookResult = await executeHooks('UserPromptSubmit', context, {\n message: input.message,\n conversationId: input.conversationId,\n });\n if (!hookResult.allowed) {\n return {\n action: 'stop',\n step: {\n type: 'thinking',\n data: {\n status: 'blocked',\n conversationId: input.conversationId,\n reason: hookResult.reason ?? 'Blocked by UserPromptSubmit hook',\n },\n },\n };\n }\n }\n\n const initialDefinitionId = await inferDefinitionId(context.storage, input.conversationId);\n if (hasHooks('AgentStart')) {\n const hookResult = await executeHooks('AgentStart', context, {\n conversationId: input.conversationId,\n definitionId: initialDefinitionId,\n });\n if (!hookResult.allowed) {\n return {\n action: 'stop',\n step: {\n type: 'thinking',\n data: {\n status: 'blocked',\n conversationId: input.conversationId,\n reason: hookResult.reason ?? 'Blocked by AgentStart hook',\n },\n },\n };\n }\n }\n state.agentStarted = true;\n return { action: 'continue' };\n}\n\nexport async function* runAgentToolLoopIteration(\n context: AgentFrameworkContext,\n input: AgentLoopInput,\n state: AgentToolLoopState,\n): AgentToolLoopIterationGenerator {\n const options = context.agentToolLoop ?? {};\n const enableToolLoop = options.enableToolLoop !== false;\n const fallbackRegistry = options.fallbackRegistryTools !== false;\n const checkpointOptions = options.sessionCheckpoint;\n\n if (state.iteration >= state.maxIterations) {\n yield finishAgentToolLoopThinking(state, 'max-iterations', {\n status: 'max-iterations',\n conversationId: input.conversationId,\n maxIterations: state.maxIterations,\n });\n return { action: 'stop', reason: 'max-iterations' };\n }\n\n state.iteration += 1;\n const iteration = state.iteration;\n\n if (options.isCancelled?.(input.conversationId)) {\n yield finishAgentToolLoopThinking(state, 'cancelled', {\n status: 'cancelled',\n conversationId: input.conversationId,\n });\n return { action: 'stop', reason: 'cancelled' };\n }\n\n const rawHistory = await context.storage.getMessages(input.conversationId, {\n mode: 'full-content',\n });\n\n const { history, steps: compactionSteps } = await prepareIterationHistory({\n context,\n conversationId: input.conversationId,\n iteration,\n rawHistory,\n agentToolLoopOptions: options,\n });\n for (const step of compactionSteps) {\n yield step;\n }\n\n const runtimeAgent = context.resolveAgentRuntimeView\n ? await context.resolveAgentRuntimeView(input.conversationId, history)\n : ({ id: input.conversationId, messages: history } as AgentInstanceModel);\n\n const hookContext: DefineToolAgentFrameworkContext = {\n ...context,\n agent: runtimeAgent,\n persistAgentMessage: async message => {\n await context.storage.appendMessage(message);\n },\n };\n\n yield {\n type: 'thinking',\n data: {\n status: 'calling-llm',\n conversationId: input.conversationId,\n messageCount: history.length,\n iteration,\n },\n };\n\n // Prompt plugins may inspect the live agent (for example Desktop's\n // persistent goal/todo tool). Give prompt concatenation the same enriched\n // context used by response hooks instead of the host-only base context.\n const messages = await buildLlmMessages(hookContext, input.conversationId, history);\n const request = { conversationId: input.conversationId, messages };\n // Include the iteration so rounds started within the same millisecond keep\n // distinct message identity; otherwise a later round replaces an earlier\n // round's assistant message and duplicate-output detection misfires.\n const assistantMessageId = `${input.conversationId}:a:${iteration}:${Date.now().toString(36)}`;\n const assistantLamportClock = await nextLamportClockForConversation(\n context.storage,\n input.conversationId,\n );\n const buildAssistantMessage = (content: string) =>\n context.normalizeMessage?.({\n messageId: assistantMessageId,\n conversationId: input.conversationId,\n originNodeId: 'local',\n timestamp: Date.now(),\n lamportClock: assistantLamportClock,\n role: 'assistant',\n content,\n }) ?? {\n messageId: assistantMessageId,\n conversationId: input.conversationId,\n originNodeId: 'local',\n timestamp: Date.now(),\n lamportClock: assistantLamportClock,\n role: 'assistant' as const,\n content,\n };\n const updateAssistantView = (message: ChatMessage) => {\n const existingIndex = hookContext.agent.messages.findIndex(\n item => item.messageId === message.messageId,\n );\n if (existingIndex >= 0) {\n hookContext.agent.messages[existingIndex] = message;\n } else {\n hookContext.agent.messages.push(message);\n }\n };\n let assistantText = '';\n for await (const chunk of streamLlm(context, request)) {\n assistantText += chunkToText(chunk);\n // Conversation stores are append-only. Keep streaming partials in the\n // in-memory agent view/UI only; persist the immutable final message once.\n const transientAssistantMessage = buildAssistantMessage(assistantText);\n updateAssistantView(transientAssistantMessage);\n try {\n await context.onTransientMessage?.(transientAssistantMessage);\n } catch (error) {\n // A renderer/update subscriber must not turn a successful model stream\n // into a failed turn or prevent the immutable final message from being\n // persisted.\n context.logger?.warn?.('[agentToolLoop] transient message subscriber failed:', error);\n }\n yield { type: 'message', data: chunk };\n }\n\n const definitionId = await inferDefinitionId(context.storage, input.conversationId);\n const agentDefinition = await resolveAgentDefinitionModel(context, definitionId);\n const frameworkConfig = agentDefinition?.agentFrameworkConfig as\n | { prompts?: unknown[]; plugins?: unknown[]; response?: unknown[] }\n | undefined;\n const hasPlugins = Boolean(\n frameworkConfig?.plugins && Array.isArray(frameworkConfig.plugins) && frameworkConfig.plugins.length > 0,\n );\n\n const assistantMessage = buildAssistantMessage(assistantText);\n updateAssistantView(assistantMessage);\n await hookContext.persistAgentMessage?.(assistantMessage);\n\n const { calls, parallel } = matchAllToolCallings(assistantText);\n\n if (hasPlugins && frameworkConfig) {\n const doomLoop = await blockRepeatedPluginToolCalls(\n context,\n input,\n state,\n calls,\n hookContext,\n );\n if (doomLoop.blocked) {\n yield {\n type: 'tool',\n data: {\n toolId: calls[0].toolId,\n parameters: calls[0].parameters,\n parallel,\n result: doomLoop.message,\n isError: true,\n },\n };\n yield finishAgentToolLoopThinking(state, 'error', {\n status: 'blocked',\n conversationId: input.conversationId,\n reason: doomLoop.message,\n });\n return { action: 'stop', reason: 'error' };\n }\n\n const { hooks } = await createHooksWithPlugins(\n frameworkConfig as { plugins: Array<{ toolId: string }> },\n {\n pluginRegistry: resolvePromptPluginMap(context),\n },\n );\n const responseCompletePayload: {\n agentFrameworkContext: DefineToolAgentFrameworkContext;\n response: { status: 'done'; content: string };\n agentFrameworkConfig: {\n plugins?: import('../../tools/types.js').FrameworkPluginToolConfig[];\n };\n requestId: undefined;\n toolConfig: import('../../tools/types.js').FrameworkPluginToolConfig;\n actions?: { yieldNextRoundTo?: 'human' | 'self' };\n } = {\n agentFrameworkContext: hookContext,\n response: { status: 'done', content: assistantText },\n agentFrameworkConfig: frameworkConfig as {\n plugins?: import('../../tools/types.js').FrameworkPluginToolConfig[];\n },\n requestId: undefined,\n toolConfig: { id: '_memeloop', toolId: '_memeloop' },\n actions: {},\n };\n await runResponseCompleteHooks(hooks, responseCompletePayload);\n\n await context.storage.insertMessagesIfAbsent(hookContext.agent.messages);\n\n const postProcess = await responseConcat(\n frameworkConfig as {\n response?: import('../../tools/types.js').AgentResponse[];\n plugins?: import('../../tools/types.js').FrameworkPluginToolConfig[];\n },\n assistantText,\n hookContext,\n hookContext.agent.messages,\n );\n\n const yieldTarget = responseCompletePayload.actions?.yieldNextRoundTo ?? postProcess.yieldNextRoundTo;\n\n if (yieldTarget === 'human') {\n yield finishAgentToolLoopThinking(state, 'completed', {\n status: 'input-required',\n conversationId: input.conversationId,\n });\n return { action: 'stop', reason: 'completed' };\n }\n if (yieldTarget === 'self') {\n return { action: 'continue' };\n }\n }\n\n if (calls.length === 0) {\n markAgentToolLoopStop(state, 'completed');\n return { action: 'stop', reason: 'completed' };\n }\n\n if (!enableToolLoop) {\n markAgentToolLoopStop(state, 'completed');\n return { action: 'stop', reason: 'completed' };\n }\n\n const pending = calls.filter(\n call => !toolCallHandledInAgentMessages(hookContext.agent.messages, assistantText, call),\n );\n\n if (pending.length === 0) {\n if (hasPlugins && calls.length > 0) {\n return { action: 'continue' };\n }\n markAgentToolLoopStop(state, 'completed');\n return { action: 'stop', reason: 'completed' };\n }\n\n if (!fallbackRegistry && hasPlugins) {\n return { action: 'continue' };\n }\n\n const allowedCalls = yield* gateToolCallsWithPreToolUse(\n context,\n options,\n definitionId,\n input.conversationId,\n pending,\n );\n\n if (allowedCalls.length === 0) {\n return { action: 'continue' };\n }\n\n yield* runRegistryToolCalls({\n context,\n agentToolLoopOptions: options,\n conversationId: input.conversationId,\n calls: allowedCalls,\n parallel,\n recentToolCalls: state.recentToolCalls,\n });\n\n if (checkpointOptions?.enabled) {\n const checkpointStore = checkpointOptions.store;\n if (!checkpointStore) {\n if (context.logger?.warn) {\n context.logger.warn('[agentToolLoop] checkpoint enabled without a checkpoint store');\n } else {\n console.warn('[agentToolLoop] checkpoint enabled without a checkpoint store');\n }\n return { action: 'continue' };\n }\n try {\n const allMessages = await context.storage.getMessages(input.conversationId, {\n mode: 'full-content',\n });\n await checkpointStore.saveCheckpoint(input.conversationId, allMessages);\n } catch (error) {\n if (context.logger?.warn) {\n context.logger.warn('[agentToolLoop] checkpoint save failed:', error);\n } else {\n console.warn('[agentToolLoop] checkpoint save failed:', error);\n }\n }\n }\n\n return { action: 'continue' };\n}\n\nexport async function stopAgentToolLoopTurn(\n context: AgentFrameworkContext,\n input: AgentLoopInput,\n state: AgentToolLoopState,\n reason?: AgentStopData['reason'],\n): Promise<void> {\n if (reason) markAgentToolLoopStop(state, reason);\n if (state.agentStarted && !state.agentStopped && state.stopReason && hasHooks('AgentStop')) {\n state.agentStopped = true;\n await executeHooks('AgentStop', context, {\n conversationId: input.conversationId,\n reason: state.stopReason,\n });\n }\n}\n","import type { AgentFrameworkContext } from '../../types.js';\nimport type { AgentLoopGenerator, AgentLoopInput } from '../types.js';\nimport { createAgentToolLoopState, runAgentToolLoopIteration, startAgentToolLoopTurn, stopAgentToolLoopTurn } from './turnPrimitives.js';\n\n/**\n * Direct agent/tool runner with no dynamic script-loader dependency.\n *\n * This is the portable path used by React Native. Hosts that need deployable\n * script references use `createAgentToolLoopDefinition` from the full entry.\n */\nexport function createAgentToolLoopRunner(\n context: AgentFrameworkContext,\n): (input: AgentLoopInput) => AgentLoopGenerator {\n return async function* agentToolLoopRunner(input): AgentLoopGenerator {\n const state = createAgentToolLoopState(context);\n try {\n const start = await startAgentToolLoopTurn(context, input, state);\n if (start.step) yield start.step;\n if (start.action === 'stop') return;\n\n while (true) {\n const result = yield* runAgentToolLoopIteration(context, input, state);\n if (result.action === 'stop') return;\n }\n } catch (error) {\n await stopAgentToolLoopTurn(context, input, state, 'error');\n throw error;\n } finally {\n await stopAgentToolLoopTurn(context, input, state);\n }\n };\n}\n","/**\n * AgentToolLoop runner — convenience API for driving a full loop turn.\n */\n\nimport type { AgentFrameworkContext, AgentInstanceState } from '../../types.js';\nimport type { AgentLoopGenerator, AgentLoopInput, AgentLoopStep } from '../types.js';\nimport { createAgentToolLoopRunner } from './directRunner.js';\n\nexport interface RunAgentToolLoopTurnCallbacks {\n onStep?: (step: AgentLoopStep) => void | Promise<void>;\n onProgress?: (\n status: string,\n data: Record<string, unknown>,\n step: AgentLoopStep,\n ) => void | Promise<void>;\n agentToolLoop?: (input: AgentLoopInput) => AgentLoopGenerator;\n}\n\nexport interface RunAgentToolLoopTurnResult {\n state: AgentInstanceState;\n stepCount: number;\n}\n\nexport function resolveAgentToolLoopTerminalState(\n step: AgentLoopStep,\n current: AgentInstanceState,\n): AgentInstanceState {\n if (step.type !== 'thinking') return current;\n const data = step.data as { status?: string };\n if (data.status === 'input-required') return 'input-required';\n if (data.status === 'cancelled') return 'canceled';\n if (data.status === 'max-iterations') return 'completed';\n if (data.status === 'blocked') return 'failed';\n if (data.status === 'calling-llm') return 'working';\n return current;\n}\n\nexport async function runAgentToolLoopTurn(\n context: AgentFrameworkContext,\n input: AgentLoopInput,\n callbacks: RunAgentToolLoopTurnCallbacks = {},\n): Promise<RunAgentToolLoopTurnResult> {\n const agentToolLoop = callbacks.agentToolLoop ?? createAgentToolLoopRunner(context);\n let terminalState: AgentInstanceState = 'completed';\n let stepCount = 0;\n\n for await (const step of agentToolLoop(input)) {\n stepCount += 1;\n terminalState = resolveAgentToolLoopTerminalState(step, terminalState);\n await callbacks.onStep?.(step);\n\n if (step.type === 'thinking' && step.data && typeof step.data === 'object') {\n const data = step.data as Record<string, unknown>;\n const status = data.status;\n if (typeof status === 'string') {\n await callbacks.onProgress?.(status, data, step);\n }\n }\n }\n\n return {\n state: terminalState === 'working' || terminalState === 'submitted' ? 'completed' : terminalState,\n stepCount,\n };\n}\n","// Generated by scripts/generate-profile-sources.mjs. Edit src/loopProfiles/*.json instead.\n\n/** Builtin Loop Profile JSON sources, embedded at build time. */\nexport const builtinProfileSources: Readonly<Record<string, string>> = {\n 'code-assistant': [\n '{',\n ' \"id\": \"memeloop:code-assistant\",',\n ' \"name\": \"代码助手\",',\n ' \"description\": \"专注于代码编写、重构和调试的助手。\",',\n ' \"loopId\": \"agent-tool-loop\",',\n ' \"systemPrompt\": \"You are a senior software engineer helping the user write and refactor code.\",',\n ' \"tools\": [',\n ' \"workspacesList\",',\n ' \"modelContextProtocol\",',\n ' \"spawnAgent\",',\n ' \"askQuestion\",',\n ' \"getErrors\",',\n ' \"webFetch\"',\n ' ],',\n ' \"plugins\": [',\n ' { \"id\": \"builtin:mcp-client\" },',\n ' { \"id\": \"builtin:mcp-forward\" },',\n ' { \"id\": \"builtin:spawn-agent\" },',\n ' { \"id\": \"builtin:ask-question\" }',\n ' ],',\n ' \"agentTools\": [',\n ' {',\n ' \"toolId\": \"workspacesList\",',\n ' \"parameters\": {',\n ' \"workspacesListParam\": { \"targetId\": \"builtin-system\", \"position\": \"after\" }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"modelContextProtocol\",',\n ' \"parameters\": {',\n ' \"modelContextProtocolParam\": {',\n ' \"serverUrl\": \"http://127.0.0.1:38385/mcp\",',\n ' \"timeoutSecond\": 30,',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" },',\n ' \"toolResultDuration\": 1',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"spawnAgent\",',\n ' \"parameters\": {',\n ' \"spawnAgentParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" },',\n ' \"toolResultDuration\": 2,',\n ' \"defaultTimeoutMs\": 120000',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"askQuestion\",',\n ' \"parameters\": {',\n ' \"askQuestionParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" }',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"getErrors\",',\n ' \"parameters\": {',\n ' \"getErrorsParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" }',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"webFetch\",',\n ' \"parameters\": {',\n ' \"webFetchParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" },',\n ' \"toolResultDuration\": 1',\n ' }',\n ' }',\n ' }',\n ' ],',\n ' \"agentFrameworkConfig\": {',\n ' \"prompts\": [',\n ' {',\n ' \"id\": \"builtin-system\",',\n ' \"role\": \"system\",',\n ' \"text\": \"You are a senior software engineer helping the user write and refactor code. Prefer small, safe edits; use file.read and file.search before changing code; use terminal.execute for build/tests when appropriate.\"',\n ' }',\n ' ],',\n ' \"plugins\": [{ \"toolId\": \"fullReplacement\" }],',\n ' \"response\": []',\n ' },',\n ' \"modelConfig\": {',\n ' \"provider\": \"memeloop\",',\n ' \"model\": \"claude-opus-4.6\",',\n ' \"temperature\": 0.2,',\n ' \"maxTokens\": 4096',\n ' },',\n ' \"version\": \"1.0.0\"',\n '}',\n '',\n ].join('\\n'),\n 'frontend-ui-ux': [\n '{',\n ' \"id\": \"memeloop:frontend-ui-ux\",',\n ' \"name\": \"Frontend UI/UX\",',\n ' \"description\": \"Designer-turned-developer who crafts stunning UI/UX even without design mockups.\",',\n ' \"loopId\": \"agent-tool-loop\",',\n ' \"systemPrompt\": \"You are a designer-turned-developer who crafts stunning UI/UX even without design mockups.\\\\n\\\\nWhen working on frontend tasks:\\\\n- Prioritize visual polish and user experience above all else\\\\n- Use consistent spacing, typography, and color schemes\\\\n- Apply modern design patterns: rounded corners, subtle shadows, smooth transitions\\\\n- Ensure responsive design across mobile, tablet, and desktop breakpoints\\\\n- Prefer accessible patterns: semantic HTML, ARIA labels, keyboard navigation\\\\n- Optimize for perceived performance: skeleton loaders, optimistic updates, progressive enhancement\\\\n- Use component composition over monolithic layouts\\\\n- Match the existing design system when extending an existing UI\",',\n ' \"tools\": [',\n ' \"workspacesList\",',\n ' \"wikiSearch\",',\n ' \"wikiOperation\",',\n ' \"modelContextProtocol\",',\n ' \"spawnAgent\",',\n ' \"askQuestion\",',\n ' \"webFetch\"',\n ' ],',\n ' \"plugins\": [',\n ' { \"id\": \"builtin:mcp-client\" },',\n ' { \"id\": \"builtin:mcp-forward\" },',\n ' { \"id\": \"builtin:spawn-agent\" },',\n ' { \"id\": \"builtin:ask-question\" }',\n ' ],',\n ' \"agentTools\": [',\n ' {',\n ' \"toolId\": \"workspacesList\",',\n ' \"parameters\": {',\n ' \"workspacesListParam\": { \"targetId\": \"builtin-system\", \"position\": \"after\" }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"wikiSearch\",',\n ' \"parameters\": {',\n ' \"wikiSearchParam\": {',\n ' \"sourceType\": \"wiki\",',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" },',\n ' \"toolResultDuration\": 1',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"wikiOperation\",',\n ' \"parameters\": {',\n ' \"wikiOperationParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" },',\n ' \"toolResultDuration\": 1',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"modelContextProtocol\",',\n ' \"parameters\": {',\n ' \"modelContextProtocolParam\": {',\n ' \"serverUrl\": \"http://127.0.0.1:38385/mcp\",',\n ' \"timeoutSecond\": 30,',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" },',\n ' \"toolResultDuration\": 1',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"spawnAgent\",',\n ' \"parameters\": {',\n ' \"spawnAgentParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" },',\n ' \"toolResultDuration\": 2,',\n ' \"defaultTimeoutMs\": 120000',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"askQuestion\",',\n ' \"parameters\": {',\n ' \"askQuestionParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" }',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"webFetch\",',\n ' \"parameters\": {',\n ' \"webFetchParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" },',\n ' \"toolResultDuration\": 1',\n ' }',\n ' }',\n ' }',\n ' ],',\n ' \"agentFrameworkConfig\": {',\n ' \"prompts\": [',\n ' {',\n ' \"id\": \"builtin-system\",',\n ' \"role\": \"system\",',\n ' \"text\": \"You are a designer-turned-developer who crafts stunning UI/UX even without design mockups.\\\\n\\\\nWhen working on frontend tasks:\\\\n- Prioritize visual polish and user experience above all else\\\\n- Use consistent spacing, typography, and color schemes\\\\n- Apply modern design patterns: rounded corners, subtle shadows, smooth transitions\\\\n- Ensure responsive design across mobile, tablet, and desktop breakpoints\\\\n- Prefer accessible patterns: semantic HTML, ARIA labels, keyboard navigation\\\\n- Optimize for perceived performance: skeleton loaders, optimistic updates, progressive enhancement\\\\n- Use component composition over monolithic layouts\\\\n- Match the existing design system when extending an existing UI\"',\n ' }',\n ' ],',\n ' \"plugins\": [],',\n ' \"response\": []',\n ' },',\n ' \"modelConfig\": {',\n ' \"provider\": \"memeloop\",',\n ' \"model\": \"claude-opus-4.6\",',\n ' \"temperature\": 0.3,',\n ' \"maxTokens\": 4096',\n ' },',\n ' \"version\": \"1.0.0\"',\n '}',\n '',\n ].join('\\n'),\n 'general-assistant': [\n '{',\n ' \"id\": \"memeloop:general-assistant\",',\n ' \"name\": \"通用助手\",',\n ' \"description\": \"可靠的通用智能体,用于对话、Wiki 知识工作、目标推进和日常计算机操作。\",',\n ' \"loopId\": \"agent-tool-loop\",',\n ' \"systemPrompt\": \"You are MemeLoop, a reliable general-purpose agent for conversation, knowledge work, goal completion, and everyday computer tasks.\\\\n\\\\nOperating contract:\\\\n- Treat the user request as the active goal. For a task with three or more meaningful steps, use an enabled planning tool listed in the injected tool instructions to create a short plan, keep exactly one item in progress, and update it as work advances. Continue until the goal is achieved or genuinely blocked.\\\\n- Use tools for actions and for facts that must be read from the user\\'s environment. Never claim that an action succeeded without a successful tool result. Never invent search results, file contents, counts, or completion evidence.\\\\n- Use the exact tool name and parameter schema shown in the tool list. When calling a tool, output ONLY one tool call in this exact XML format:\\\\n<tool_use name=\\\\\"TOOL_NAME\\\\\">{\\\\\"param\\\\\":\\\\\"value\\\\\"}</tool_use>\\\\n The JSON must be valid. Never wrap the call in markdown or add text before or after it. After the tool result, reassess the goal and continue.\\\\n- If a tool fails, read the error and change the arguments or approach. Do not repeat an identical failed call more than once, and do not retry the same approach more than twice.\\\\n- For Wiki work, use an injected available workspace name or ID; do not guess one. Search before relying on stored knowledge. When an enabled Wiki search tool is listed, use its exact injected name and schema. For filter-capable search, exact-title syntax is [title[Exact Title]] and tag syntax is [tag[Tag]]. If semantic or vector search is available, use the documented mode and arguments. After a write, verify important content with an exact-title search. If verification fails, report that honestly.\\\\n- Save durable facts, decisions, plans, and user-requested memories to Wiki when useful. Do not store credentials or other sensitive data unless the user explicitly asks.\\\\n- For UI or computer actions, inspect the current state before acting, prefer reversible changes, verify the resulting state, and ask before destructive actions or consequential external communication.\\\\n- Do not ask for confirmation before an explicitly requested reversible action when the target is already known. Ask a concise question only when missing information materially changes the result. Otherwise make safe, explicit assumptions and proceed.\\\\n- In the final response, lead with the outcome, cite concrete verification, and state any remaining limitation briefly.\",',\n ' \"tools\": [',\n ' \"workspacesList\",',\n ' \"wikiSearch\",',\n ' \"wikiOperation\",',\n ' \"modelContextProtocol\",',\n ' \"spawnAgent\",',\n ' \"askQuestion\"',\n ' ],',\n ' \"plugins\": [',\n ' { \"id\": \"builtin:mcp-client\" },',\n ' { \"id\": \"builtin:mcp-forward\" },',\n ' { \"id\": \"builtin:spawn-agent\" },',\n ' { \"id\": \"builtin:ask-question\" },',\n ' { \"id\": \"builtin:todo-write\" }',\n ' ],',\n ' \"agentTools\": [',\n ' {',\n ' \"toolId\": \"workspacesList\",',\n ' \"parameters\": {',\n ' \"workspacesListParam\": { \"targetId\": \"builtin-system\", \"position\": \"after\" }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"wikiSearch\",',\n ' \"parameters\": {',\n ' \"wikiSearchParam\": {',\n ' \"sourceType\": \"wiki\",',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" },',\n ' \"toolResultDuration\": 1',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"wikiOperation\",',\n ' \"parameters\": {',\n ' \"wikiOperationParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" },',\n ' \"toolResultDuration\": 1',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"modelContextProtocol\",',\n ' \"parameters\": {',\n ' \"modelContextProtocolParam\": {',\n ' \"serverUrl\": \"http://127.0.0.1:38385/mcp\",',\n ' \"timeoutSecond\": 30,',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" },',\n ' \"toolResultDuration\": 1',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"spawnAgent\",',\n ' \"parameters\": {',\n ' \"spawnAgentParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" },',\n ' \"toolResultDuration\": 2,',\n ' \"defaultTimeoutMs\": 120000',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"askQuestion\",',\n ' \"parameters\": {',\n ' \"askQuestionParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" }',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"todo\",',\n ' \"parameters\": {',\n ' \"todoParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" },',\n ' \"todoInjectionTargetId\": \"builtin-system\",',\n ' \"toolResultDuration\": 1',\n ' }',\n ' }',\n ' }',\n ' ],',\n ' \"agentFrameworkConfig\": {',\n ' \"prompts\": [',\n ' {',\n ' \"id\": \"builtin-system\",',\n ' \"role\": \"system\",',\n ' \"text\": \"You are MemeLoop, a reliable general-purpose agent for conversation, knowledge work, goal completion, and everyday computer tasks.\\\\n\\\\nOperating contract:\\\\n- Treat the user request as the active goal. For a task with three or more meaningful steps, use an enabled planning tool listed in the injected tool instructions to create a short plan, keep exactly one item in progress, and update it as work advances. Continue until the goal is achieved or genuinely blocked.\\\\n- Use tools for actions and for facts that must be read from the user\\'s environment. Never claim that an action succeeded without a successful tool result. Never invent search results, file contents, counts, or completion evidence.\\\\n- Use the exact tool name and parameter schema shown in the tool list. When calling a tool, output ONLY one tool call in this exact XML format:\\\\n<tool_use name=\\\\\"TOOL_NAME\\\\\">{\\\\\"param\\\\\":\\\\\"value\\\\\"}</tool_use>\\\\n The JSON must be valid. Never wrap the call in markdown or add text before or after it. After the tool result, reassess the goal and continue.\\\\n- If a tool fails, read the error and change the arguments or approach. Do not repeat an identical failed call more than once, and do not retry the same approach more than twice.\\\\n- For Wiki work, use an injected available workspace name or ID; do not guess one. Search before relying on stored knowledge. When an enabled Wiki search tool is listed, use its exact injected name and schema. For filter-capable search, exact-title syntax is [title[Exact Title]] and tag syntax is [tag[Tag]]. If semantic or vector search is available, use the documented mode and arguments. After a write, verify important content with an exact-title search. If verification fails, report that honestly.\\\\n- Save durable facts, decisions, plans, and user-requested memories to Wiki when useful. Do not store credentials or other sensitive data unless the user explicitly asks.\\\\n- For UI or computer actions, inspect the current state before acting, prefer reversible changes, verify the resulting state, and ask before destructive actions or consequential external communication.\\\\n- Do not ask for confirmation before an explicitly requested reversible action when the target is already known. Ask a concise question only when missing information materially changes the result. Otherwise make safe, explicit assumptions and proceed.\\\\n- In the final response, lead with the outcome, cite concrete verification, and state any remaining limitation briefly.\"',\n ' }',\n ' ],',\n ' \"plugins\": [{ \"toolId\": \"fullReplacement\" }],',\n ' \"response\": []',\n ' },',\n ' \"modelConfig\": {',\n ' \"provider\": \"memeloop\",',\n ' \"model\": \"claude-opus-4.6\",',\n ' \"temperature\": 0.5,',\n ' \"maxTokens\": 4096',\n ' },',\n ' \"version\": \"1.1.1\"',\n '}',\n '',\n ].join('\\n'),\n 'git-master': [\n '{',\n ' \"id\": \"memeloop:git-master\",',\n ' \"name\": \"Git Master\",',\n ' \"description\": \"Expert git workflow management with safety-first approach.\",',\n ' \"loopId\": \"agent-tool-loop\",',\n ' \"systemPrompt\": \"You are an expert in git workflow management. Follow these rules:\\\\n\\\\nGit Safety Protocol:\\\\n- NEVER update the git config\\\\n- NEVER run destructive/irreversible git commands (push --force, hard reset, etc.) unless the user explicitly requests them\\\\n- NEVER skip hooks (--no-verify, --no-gpg-sign, etc.) unless the user explicitly requests it\\\\n- NEVER force push to main/master; warn the user if they request it\\\\n- Avoid git commit --amend. ONLY use --amend when ALL conditions are met:\\\\n (1) User explicitly requested amend, OR the commit succeeded and pre-commit hooks auto-modified files that need including\\\\n (2) HEAD commit was created by you in this conversation\\\\n (3) Commit has NOT been pushed to remote\\\\n- If commit FAILED or was REJECTED by hook, NEVER amend — fix the issue and create a NEW commit\\\\n- If you already pushed to remote, NEVER amend unless user explicitly requests it (requires force push)\\\\n\\\\nCommitting:\\\\n- NEVER commit changes unless the user explicitly asks\\\\n- Run: git status, git diff, git log (recent commits)\\\\n- Analyze all staged changes and draft a concise commit message\\\\n- Summarize nature of changes: add/update/fix/refactor/test/docs\\\\n- Do NOT commit files that likely contain secrets\\\\n\\\\nPull Requests:\\\\n- Check branch status, divergence from base, full commit history\\\\n- Create PR with descriptive title and summary body\\\\n- Return the PR URL when done\",',\n ' \"tools\": [\"workspacesList\", \"git\", \"askQuestion\"],',\n ' \"plugins\": [{ \"id\": \"builtin:ask-question\" }],',\n ' \"agentTools\": [',\n ' {',\n ' \"toolId\": \"workspacesList\",',\n ' \"parameters\": {',\n ' \"workspacesListParam\": { \"targetId\": \"builtin-system\", \"position\": \"after\" }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"git\",',\n ' \"parameters\": {',\n ' \"gitParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" }',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"askQuestion\",',\n ' \"parameters\": {',\n ' \"askQuestionParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" }',\n ' }',\n ' }',\n ' }',\n ' ],',\n ' \"agentFrameworkConfig\": {',\n ' \"prompts\": [',\n ' {',\n ' \"id\": \"builtin-system\",',\n ' \"role\": \"system\",',\n ' \"text\": \"You are an expert in git workflow management. Follow these rules:\\\\n\\\\nGit Safety Protocol:\\\\n- NEVER update the git config\\\\n- NEVER run destructive/irreversible git commands (push --force, hard reset, etc.) unless the user explicitly requests them\\\\n- NEVER skip hooks (--no-verify, --no-gpg-sign, etc.) unless the user explicitly requests it\\\\n- NEVER force push to main/master; warn the user if they request it\\\\n- Avoid git commit --amend. ONLY use --amend when ALL conditions are met:\\\\n (1) User explicitly requested amend, OR the commit succeeded and pre-commit hooks auto-modified files that need including\\\\n (2) HEAD commit was created by you in this conversation\\\\n (3) Commit has NOT been pushed to remote\\\\n- If commit FAILED or was REJECTED by hook, NEVER amend — fix the issue and create a NEW commit\\\\n- If you already pushed to remote, NEVER amend unless user explicitly requests it (requires force push)\\\\n\\\\nCommitting:\\\\n- NEVER commit changes unless the user explicitly asks\\\\n- Run: git status, git diff, git log (recent commits)\\\\n- Analyze all staged changes and draft a concise commit message\\\\n- Summarize nature of changes: add/update/fix/refactor/test/docs\\\\n- Do NOT commit files that likely contain secrets\\\\n\\\\nPull Requests:\\\\n- Check branch status, divergence from base, full commit history\\\\n- Create PR with descriptive title and summary body\\\\n- Return the PR URL when done\"',\n ' }',\n ' ],',\n ' \"plugins\": [],',\n ' \"response\": []',\n ' },',\n ' \"modelConfig\": {',\n ' \"provider\": \"memeloop\",',\n ' \"model\": \"claude-opus-4.6\",',\n ' \"temperature\": 0.2,',\n ' \"maxTokens\": 4096',\n ' },',\n ' \"version\": \"1.0.0\"',\n '}',\n '',\n ].join('\\n'),\n playwright: [\n '{',\n ' \"id\": \"memeloop:playwright\",',\n ' \"name\": \"Playwright\",',\n ' \"description\": \"Browser automation via Playwright for verification, browsing, information gathering, web scraping, testing, and screenshots.\",',\n ' \"loopId\": \"agent-tool-loop\",',\n ' \"systemPrompt\": \"You have access to Playwright for browser automation. Use it for:\\\\n\\\\nBrowser Automation:\\\\n- Navigate to URLs and verify page content\\\\n- Fill forms, click buttons, and interact with page elements\\\\n- Take screenshots of specific elements or full pages\\\\n- Extract data from web pages (scraping)\\\\n- Test web application functionality end-to-end\\\\n- Automate browser workflows\\\\n- Log into websites and maintain sessions\\\\n\\\\nBest Practices:\\\\n- Use specific selectors (data-testid, id, or unique CSS selectors) over fragile XPath\\\\n- Wait for elements to be visible before interacting\\\\n- Handle page navigation and loading states explicitly\\\\n- Take screenshots at key steps for debugging\\\\n- Clean up browser resources when done\\\\n- Handle timeouts and error states gracefully\\\\n\\\\nAvailable Playwright MCP Tools:\\\\n- browser_navigate: Navigate to a URL\\\\n- browser_click: Click an element\\\\n- browser_type: Type into an input field\\\\n- browser_snapshot: Take accessibility snapshot of page\\\\n- browser_take_screenshot: Capture screenshot\\\\n- browser_fill_form: Fill multiple form fields at once\\\\n- browser_evaluate: Execute JavaScript in page context\\\\n- browser_select_option: Select from dropdown\\\\n- browser_drag: Drag and drop elements\\\\n- browser_hover: Hover over an element\\\\n- browser_press_key: Press a keyboard key\\\\n- browser_handle_dialog: Handle browser dialogs (alert/confirm/prompt)\\\\n- browser_close: Close the browser\",',\n ' \"tools\": [\"modelContextProtocol\", \"askQuestion\"],',\n ' \"plugins\": [',\n ' { \"id\": \"builtin:mcp-client\" },',\n ' { \"id\": \"builtin:mcp-forward\" },',\n ' { \"id\": \"builtin:ask-question\" }',\n ' ],',\n ' \"agentTools\": [',\n ' {',\n ' \"toolId\": \"modelContextProtocol\",',\n ' \"parameters\": {',\n ' \"modelContextProtocolParam\": {',\n ' \"serverUrl\": \"http://127.0.0.1:38385/mcp\",',\n ' \"timeoutSecond\": 30,',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" },',\n ' \"toolResultDuration\": 1',\n ' }',\n ' }',\n ' },',\n ' {',\n ' \"toolId\": \"askQuestion\",',\n ' \"parameters\": {',\n ' \"askQuestionParam\": {',\n ' \"toolListPosition\": { \"targetId\": \"builtin-system\", \"position\": \"after\" }',\n ' }',\n ' }',\n ' }',\n ' ],',\n ' \"agentFrameworkConfig\": {',\n ' \"prompts\": [',\n ' {',\n ' \"id\": \"builtin-system\",',\n ' \"role\": \"system\",',\n ' \"text\": \"You have access to Playwright for browser automation. Use it for:\\\\n\\\\nBrowser Automation:\\\\n- Navigate to URLs and verify page content\\\\n- Fill forms, click buttons, and interact with page elements\\\\n- Take screenshots of specific elements or full pages\\\\n- Extract data from web pages (scraping)\\\\n- Test web application functionality end-to-end\\\\n- Automate browser workflows\\\\n- Log into websites and maintain sessions\\\\n\\\\nBest Practices:\\\\n- Use specific selectors (data-testid, id, or unique CSS selectors) over fragile XPath\\\\n- Wait for elements to be visible before interacting\\\\n- Handle page navigation and loading states explicitly\\\\n- Take screenshots at key steps for debugging\\\\n- Clean up browser resources when done\\\\n- Handle timeouts and error states gracefully\\\\n\\\\nAvailable Playwright MCP Tools:\\\\n- browser_navigate: Navigate to a URL\\\\n- browser_click: Click an element\\\\n- browser_type: Type into an input field\\\\n- browser_snapshot: Take accessibility snapshot of page\\\\n- browser_take_screenshot: Capture screenshot\\\\n- browser_fill_form: Fill multiple form fields at once\\\\n- browser_evaluate: Execute JavaScript in page context\\\\n- browser_select_option: Select from dropdown\\\\n- browser_drag: Drag and drop elements\\\\n- browser_hover: Hover over an element\\\\n- browser_press_key: Press a keyboard key\\\\n- browser_handle_dialog: Handle browser dialogs (alert/confirm/prompt)\\\\n- browser_close: Close the browser\"',\n ' }',\n ' ],',\n ' \"plugins\": [],',\n ' \"response\": []',\n ' },',\n ' \"modelConfig\": {',\n ' \"provider\": \"memeloop\",',\n ' \"model\": \"claude-opus-4.6\",',\n ' \"temperature\": 0.3,',\n ' \"maxTokens\": 4096',\n ' },',\n ' \"version\": \"1.0.0\"',\n '}',\n '',\n ].join('\\n'),\n};\n","/**\n * Built-in Loop Profiles.\n *\n * Each profile defines which agent loop to run, which .mjs script to load,\n * which prompts, plugins, and hook plugins to enable.\n *\n * Replaces the old `src/prompt/loadBuiltins.ts`.\n */\n\nimport { getLoopRegistry } from '../loopAPI/registry.js';\nimport type { LoopProfile } from '../loopAPI/types.js';\nimport { builtinProfileSources } from './builtinProfileSources.js';\n\nfunction loadProfile(name: string): LoopProfile {\n const source = builtinProfileSources[name];\n if (!source) {\n throw new Error(`Builtin profile not found: ${name}`);\n }\n return JSON.parse(source) as LoopProfile;\n}\n\n/** Get all built-in Loop Profiles. */\nexport function getBuiltinLoopProfiles(): LoopProfile[] {\n return [\n loadProfile('general-assistant'),\n loadProfile('code-assistant'),\n loadProfile('frontend-ui-ux'),\n loadProfile('git-master'),\n loadProfile('playwright'),\n ];\n}\n\n/** Get a built-in Loop Profile by id. */\nexport function getBuiltinLoopProfile(id: string): LoopProfile | undefined {\n return getBuiltinLoopProfiles().find((p) => p.id === id);\n}\n\n/** Register bundled profiles with the global loop registry. */\nexport function registerBuiltinLoopProfiles(): void {\n const registry = getLoopRegistry();\n for (const profile of getBuiltinLoopProfiles()) {\n registry.registerProfile(profile);\n }\n}\n"],"mappings":"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IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,kBAAkB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,qBAAqB;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,cAAc;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;;;AC7ZA,SAAS,YAAY,MAA2B;AAC9C,QAAM,SAAS,sBAAsB,IAAI;AACzC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,8BAA8B,IAAI,EAAE;AAAA,EACtD;AACA,SAAO,KAAK,MAAM,MAAM;AAC1B;AAGO,SAAS,yBAAwC;AACtD,SAAO;AAAA,IACL,YAAY,mBAAmB;AAAA,IAC/B,YAAY,gBAAgB;AAAA,IAC5B,YAAY,gBAAgB;AAAA,IAC5B,YAAY,YAAY;AAAA,IACxB,YAAY,YAAY;AAAA,EAC1B;AACF;AAGO,SAAS,sBAAsB,IAAqC;AACzE,SAAO,uBAAuB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACzD;","names":["result","JSON5","max","chunkToText","chunkToText"]}
|