memeloop 0.0.1 → 0.1.1
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/README.md +63 -0
- package/dist/browser.cjs +1413 -0
- package/dist/browser.cjs.map +1 -0
- package/dist/browser.d.cts +3066 -0
- package/dist/browser.d.ts +3066 -0
- package/dist/browser.js +43 -0
- package/dist/chunk-2C6BJZI3.js +382 -0
- package/dist/chunk-2C6BJZI3.js.map +1 -0
- package/dist/chunk-426CJUZP.js +630 -0
- package/dist/chunk-426CJUZP.js.map +1 -0
- package/dist/chunk-7ZDTB4VZ.js +63 -0
- package/dist/chunk-7ZDTB4VZ.js.map +1 -0
- package/dist/chunk-AZFYDWIN.js +98 -0
- package/dist/chunk-AZFYDWIN.js.map +1 -0
- package/dist/chunk-BGPU4RR7.js +367 -0
- package/dist/chunk-BGPU4RR7.js.map +1 -0
- package/dist/chunk-CCEFAOSH.js +496 -0
- package/dist/chunk-CCEFAOSH.js.map +1 -0
- package/dist/chunk-FWSY5HOA.js +63 -0
- package/dist/chunk-FWSY5HOA.js.map +1 -0
- package/dist/chunk-GYIOMQMY.js +8726 -0
- package/dist/chunk-GYIOMQMY.js.map +1 -0
- package/dist/chunk-K6P63KD4.js +68 -0
- package/dist/chunk-K6P63KD4.js.map +1 -0
- package/dist/chunk-KFS2EJT6.js +42 -0
- package/dist/chunk-KFS2EJT6.js.map +1 -0
- package/dist/chunk-MAJWHAKR.js +3637 -0
- package/dist/chunk-MAJWHAKR.js.map +1 -0
- package/dist/chunk-MRKY4HGF.js +205 -0
- package/dist/chunk-MRKY4HGF.js.map +1 -0
- package/dist/chunk-T7FSXWFR.js +2744 -0
- package/dist/chunk-T7FSXWFR.js.map +1 -0
- package/dist/chunk-VZKQX5PP.js +1 -0
- package/dist/chunk-VZKQX5PP.js.map +1 -0
- package/dist/chunk-WAI6BODI.js +175 -0
- package/dist/chunk-WAI6BODI.js.map +1 -0
- package/dist/chunk-YMNXDNDW.js +798 -0
- package/dist/chunk-YMNXDNDW.js.map +1 -0
- package/dist/conversation.cjs +208 -0
- package/dist/conversation.cjs.map +1 -0
- package/dist/conversation.d.cts +100 -0
- package/dist/conversation.d.ts +100 -0
- package/dist/conversation.js +21 -0
- package/dist/conversation.js.map +1 -0
- package/dist/device-network-portable.cjs +702 -0
- package/dist/device-network-portable.cjs.map +1 -0
- package/dist/device-network-portable.d.cts +110 -0
- package/dist/device-network-portable.d.ts +110 -0
- package/dist/device-network-portable.js +53 -0
- package/dist/device-network-portable.js.map +1 -0
- package/dist/device-network.cjs +906 -0
- package/dist/device-network.cjs.map +1 -0
- package/dist/device-network.d.cts +6 -0
- package/dist/device-network.d.ts +6 -0
- package/dist/device-network.js +59 -0
- package/dist/device-network.js.map +1 -0
- package/dist/fetchProvider-WWnWnQFP.d.ts +91 -0
- package/dist/fetchProvider-toTHy5Nu.d.cts +91 -0
- package/dist/index.cjs +28051 -5459
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +94 -1320
- package/dist/index.d.ts +94 -1320
- package/dist/index.js +10616 -2420
- package/dist/index.js.map +1 -1
- package/dist/interface-IrKBFtL1.d.cts +493 -0
- package/dist/interface-IrKBFtL1.d.ts +493 -0
- package/dist/llm-providers.cjs +43 -8
- package/dist/llm-providers.cjs.map +1 -1
- package/dist/llm-providers.d.cts +2 -1
- package/dist/llm-providers.d.ts +2 -1
- package/dist/llm-providers.js +4 -2
- package/dist/llm-providers.js.map +1 -1
- package/dist/loop-api.cjs +5227 -2010
- package/dist/loop-api.cjs.map +1 -1
- package/dist/loop-api.d.cts +11 -5
- package/dist/loop-api.d.ts +11 -5
- package/dist/loop-api.js +86 -49
- package/dist/mobile.cjs +2711 -0
- package/dist/mobile.cjs.map +1 -0
- package/dist/mobile.d.cts +6 -0
- package/dist/mobile.d.ts +6 -0
- package/dist/mobile.js +22 -0
- package/dist/mobile.js.map +1 -0
- package/dist/orchestration-portable-BHB_YrNN.d.ts +2192 -0
- package/dist/orchestration-portable-mvYBvGBb.d.cts +2192 -0
- package/dist/orchestration-portable.cjs +9553 -0
- package/dist/orchestration-portable.cjs.map +1 -0
- package/dist/orchestration-portable.d.cts +5 -0
- package/dist/orchestration-portable.d.ts +5 -0
- package/dist/orchestration-portable.js +290 -0
- package/dist/orchestration-portable.js.map +1 -0
- package/dist/pairingInvite-BXPWY3aM.d.cts +149 -0
- package/dist/pairingInvite-Cuz0wuq9.d.ts +149 -0
- package/dist/promptConcat-0WNFTg4l.d.ts +516 -0
- package/dist/promptConcat-D6wr5V-V.d.cts +516 -0
- package/dist/providerRegistry-Bi6pAvSj.d.ts +86 -0
- package/dist/providerRegistry-CPsktuiX.d.cts +86 -0
- package/dist/registry-D0kbxksn.d.cts +393 -0
- package/dist/registry-DDbvhlhs.d.ts +393 -0
- package/dist/remoteClient-B_spK019.d.ts +87 -0
- package/dist/remoteClient-CBggnRy3.d.cts +87 -0
- package/dist/runtime-PGWR6FIV.js +18 -0
- package/dist/runtime-PGWR6FIV.js.map +1 -0
- package/dist/scriptDeploymentPipeline-CXJcC82H.d.ts +2464 -0
- package/dist/scriptDeploymentPipeline-yG1ZhVVI.d.cts +2464 -0
- package/dist/syncCloudDevices-BEqwgrhD.d.ts +49 -0
- package/dist/syncCloudDevices-Ds_Kcgrv.d.cts +49 -0
- package/dist/types-7pYti-k9.d.cts +255 -0
- package/dist/types-CdFVSntj.d.ts +255 -0
- package/package.json +110 -35
- package/dist/anthropic.cjs +0 -72
- package/dist/anthropic.cjs.map +0 -1
- package/dist/anthropic.d.cts +0 -21
- package/dist/anthropic.d.ts +0 -21
- package/dist/anthropic.js +0 -21
- package/dist/anthropic.js.map +0 -1
- package/dist/azure.cjs +0 -72
- package/dist/azure.cjs.map +0 -1
- package/dist/azure.d.cts +0 -21
- package/dist/azure.d.ts +0 -21
- package/dist/azure.js +0 -21
- package/dist/azure.js.map +0 -1
- package/dist/chunk-3CN7DFBL.js +0 -4894
- package/dist/chunk-3CN7DFBL.js.map +0 -1
- package/dist/chunk-4AZ4D7U5.js +0 -32
- package/dist/chunk-4AZ4D7U5.js.map +0 -1
- package/dist/chunk-6ON4XSOV.js +0 -63
- package/dist/chunk-6ON4XSOV.js.map +0 -1
- package/dist/chunk-DJQNGIXX.js +0 -4793
- package/dist/chunk-DJQNGIXX.js.map +0 -1
- package/dist/chunk-FKQP6AOQ.js +0 -32
- package/dist/chunk-FKQP6AOQ.js.map +0 -1
- package/dist/chunk-OVJ7JJBA.js +0 -35
- package/dist/chunk-OVJ7JJBA.js.map +0 -1
- package/dist/chunk-P4UZ7IXC.js +0 -42
- package/dist/chunk-YHJ2AEFR.js +0 -4933
- package/dist/chunk-YHJ2AEFR.js.map +0 -1
- package/dist/chunk-YVK7RYRO.js +0 -4973
- package/dist/chunk-YVK7RYRO.js.map +0 -1
- package/dist/code-assistant.json +0 -114
- package/dist/cohere.cjs +0 -72
- package/dist/cohere.cjs.map +0 -1
- package/dist/cohere.d.cts +0 -21
- package/dist/cohere.d.ts +0 -21
- package/dist/cohere.js +0 -21
- package/dist/cohere.js.map +0 -1
- package/dist/deepseek.cjs +0 -72
- package/dist/deepseek.cjs.map +0 -1
- package/dist/deepseek.d.cts +0 -21
- package/dist/deepseek.d.ts +0 -21
- package/dist/deepseek.js +0 -21
- package/dist/deepseek.js.map +0 -1
- package/dist/dist-65U7OYRG.js +0 -1257
- package/dist/dist-65U7OYRG.js.map +0 -1
- package/dist/fetchProvider-Cu4WkU5O.d.cts +0 -819
- package/dist/fetchProvider-Cu4WkU5O.d.ts +0 -819
- package/dist/frontend-ui-ux.json +0 -105
- package/dist/general-assistant.json +0 -95
- package/dist/git-master.json +0 -51
- package/dist/google-vertex.cjs +0 -72
- package/dist/google-vertex.cjs.map +0 -1
- package/dist/google-vertex.d.cts +0 -21
- package/dist/google-vertex.d.ts +0 -21
- package/dist/google-vertex.js +0 -21
- package/dist/google-vertex.js.map +0 -1
- package/dist/google.cjs +0 -72
- package/dist/google.cjs.map +0 -1
- package/dist/google.d.cts +0 -21
- package/dist/google.d.ts +0 -21
- package/dist/google.js +0 -21
- package/dist/google.js.map +0 -1
- package/dist/groq.cjs +0 -72
- package/dist/groq.cjs.map +0 -1
- package/dist/groq.d.cts +0 -21
- package/dist/groq.d.ts +0 -21
- package/dist/groq.js +0 -21
- package/dist/groq.js.map +0 -1
- package/dist/index.d.mts +0 -3203
- package/dist/index.mjs +0 -7064
- package/dist/index.mjs.map +0 -1
- package/dist/mistral.cjs +0 -72
- package/dist/mistral.cjs.map +0 -1
- package/dist/mistral.d.cts +0 -21
- package/dist/mistral.d.ts +0 -21
- package/dist/mistral.js +0 -21
- package/dist/mistral.js.map +0 -1
- package/dist/multipart-parser-EJCXIUHC.js +0 -372
- package/dist/multipart-parser-EJCXIUHC.js.map +0 -1
- package/dist/openai.cjs +0 -72
- package/dist/openai.cjs.map +0 -1
- package/dist/openai.d.cts +0 -21
- package/dist/openai.d.ts +0 -21
- package/dist/openai.js +0 -21
- package/dist/openai.js.map +0 -1
- package/dist/perplexity.cjs +0 -72
- package/dist/perplexity.cjs.map +0 -1
- package/dist/perplexity.d.cts +0 -21
- package/dist/perplexity.d.ts +0 -21
- package/dist/perplexity.js +0 -21
- package/dist/perplexity.js.map +0 -1
- package/dist/playwright.json +0 -52
- package/dist/promptConcat-BJdazTg5.d.cts +0 -1832
- package/dist/promptConcat-BJdazTg5.d.ts +0 -1832
- package/dist/promptConcat-CAkpni_8.d.cts +0 -1834
- package/dist/promptConcat-CAkpni_8.d.ts +0 -1834
- package/dist/promptConcat-CfH5-GAE.d.cts +0 -1036
- package/dist/promptConcat-ChcAZOOL.d.ts +0 -1036
- package/dist/promptConcat-G5TnJVRy.d.cts +0 -1800
- package/dist/promptConcat-G5TnJVRy.d.ts +0 -1800
- package/dist/promptConcat-L72eowzp.d.ts +0 -1090
- package/dist/promptConcat-eLHdN7K8.d.cts +0 -1090
- package/dist/src-VTSXKG72.js +0 -1409
- package/dist/src-VTSXKG72.js.map +0 -1
- package/dist/togetherai.cjs +0 -72
- package/dist/togetherai.cjs.map +0 -1
- package/dist/togetherai.d.cts +0 -21
- package/dist/togetherai.d.ts +0 -21
- package/dist/togetherai.js +0 -21
- package/dist/togetherai.js.map +0 -1
- package/dist/types-B0Jm2l38.d.cts +0 -767
- package/dist/types-B0Jm2l38.d.ts +0 -767
- package/dist/xai.cjs +0 -72
- package/dist/xai.cjs.map +0 -1
- package/dist/xai.d.cts +0 -21
- package/dist/xai.d.ts +0 -21
- package/dist/xai.js +0 -21
- package/dist/xai.js.map +0 -1
- /package/dist/{chunk-P4UZ7IXC.js.map → browser.js.map} +0 -0
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/agentLoops/llm-io/compaction.ts","../src/tools/pluginRegistry.ts","../src/promptUtilities/responseConcat.ts","../src/promptUtilities/responsePatternUtility.ts","../src/storage/nextLamport.ts","../src/agentLoops/hooks/registry.ts","../src/agentLoops/llm-io/historyCompaction.ts","../src/agentLoops/llm-io/llmStream.ts","../src/promptUtilities/promptConcat.ts","../src/promptUtilities/utilities.ts","../src/agentLoops/llm-io/modelMessages.ts","../src/tools/structuredToolResult.ts","../src/agentLoops/llm-io/toolResultMessage.ts","../src/agentLoops/llm-io/toolCallRunner.ts","../src/permission/engine.ts","../src/permission/storage.ts","../src/tools/approval.ts","../src/agentLoops/llm-io/toolUseGate.ts","../src/agentLoops/llm-io/loop.ts","../src/agentLoops/llm-io/runner.ts","../src/agentLoops/registry.ts","../src/agentLoops/sub-agent/scriptLoader.ts","../src/agentLoops/sub-agent/loop.ts","../src/agentLoops/plugins/builtinLoopsPlugin.ts","../src/tools/schemaRegistry.ts","../src/tools/builtins/askQuestion.ts","../src/tools/builtins/questionWaitRegistry.ts","../src/tools/builtins/askUserQuestion.ts","../src/tools/builtins/mcpClient.ts","../src/tools/builtins/mcpForward.ts","../src/tools/builtins/remoteAgent.ts","../src/tools/builtins/spawnAgent.ts","../src/agent/agentProfiles.ts","../src/agent/agentProfileRegistry.ts","../src/tools/builtins/task.ts","../src/tools/builtins/todoWrite.ts","../src/agentLoops/plugins/builtinToolsPlugin.ts","../src/agentLoops/tokenTracker.ts","../src/loopProfiles/code-assistant.json","../src/loopProfiles/frontend-ui-ux.json","../src/loopProfiles/general-assistant.json","../src/loopProfiles/git-master.json","../src/loopProfiles/playwright.json","../src/loopProfiles/loadBuiltins.ts","../src/promptUtilities/builtinPromptPlugins.ts","../src/runtime.ts","../src/sync/attachmentRpcCodec.ts","../src/sync/chatSyncEngine.ts","../src/sync/peerNodeAdapter.ts","../src/types.ts","../src/storage/sessionStorage.ts","../src/agent/categories.ts","../src/agent/tiddlerTemplateConverter.ts","../src/agent-management/AgentSessionController.ts","../src/agent-management/AgentDefinitionEditorController.ts","../src/agent-management/AgentCreationController.ts","../src/agent-management/PromptPreviewController.ts","../src/llm/providerRegistry.ts","../src/network/gitProxyUrlPolicy.ts","../src/device-network/libp2pDeviceNetworkService.ts","../src/device-network/memoryDeviceNetworkService.ts","../src/im/channelManager.ts","../src/im/imPlatformLimits.ts","../src/im/slashCommands.ts","../src/im/streamAgentReplyToIm.ts","../src/im/textRenderer.ts","../src/im/tools.ts","../src/sync/protocol.ts","../src/conversation/factory.ts","../src/plugin/loader.ts","../src/plugin/registry.ts","../src/tools/builtins/imBuiltinTools.ts","../src/tools/builtins/index.ts","../src/tools/parallelExecution.ts","../src/tools/schemaToToolContent.ts","../src/tools/defineTool.ts","../src/tools/hostAgentTools.ts","../src/tools/toolRegistry.ts"],"sourcesContent":["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 TaskAgent\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 { HookSlot, PromptConcatHooks, PromptConcatTool } 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: Array<(context: any, callback: () => void) => void>;\n} {\n const handlers: Array<(context: any, callback: () => void) => void> = [];\n return {\n handlers,\n tapAsync(_name: string, function_: (context: any, callback: () => void) => void) {\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?: Array<(context: any, callback: () => void) => void>;\n} = {};\n\nexport async function runProcessPromptsHooks<TContext>(\n _hooks: PromptConcatHooks,\n context: TContext,\n): Promise<TContext> {\n const slot = _hooks.processPrompts as {\n handlers?: Array<(context_: any, callback: () => void) => void>;\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;\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 { input: trimmedText.substring(0, MAX_FALLBACK_INPUT_LENGTH) };\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 { IAgentStorage } from '../types.js';\n\n/**\n * 下一条消息的 Lamport 时钟:取会话内已有消息的最大 lamportClock + 1。\n */\nexport async function nextLamportClockForConversation(\n storage: IAgentStorage,\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 { 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['taskAgent'],\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 taskAgentOptions: AgentFrameworkContext['taskAgent'];\n}): Promise<{ handled: boolean; history: ChatMessage[]; steps: AgentLoopStep[] }> {\n const { context, conversationId, iteration, history, taskAgentOptions } = 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: taskAgentOptions?.autoCompact,\n contextCompaction: taskAgentOptions?.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 taskAgentOptions: AgentFrameworkContext['taskAgent'];\n}): Promise<{ history: ChatMessage[]; steps: AgentLoopStep[] }> {\n const { context, conversationId, iteration, taskAgentOptions } = options;\n let history = options.history;\n const autoCompactOptions = taskAgentOptions?.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('[taskAgent] auto-compact failed:', error);\n } else {\n console.warn('[taskAgent] 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 taskAgentOptions: AgentFrameworkContext['taskAgent'];\n}): Promise<{ history: ChatMessage[]; steps: AgentLoopStep[] }> {\n const { taskAgentOptions } = 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, taskAgentOptions),\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 | Buffer>;\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","import type { AgentDefinition } from '../../agent/types.js';\nimport type { ChatMessage } 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';\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 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.taskAgent?.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.taskAgent?.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 { DetailReference } from '../conversation/index.js';\n\n/**\n * Tools may attach this key to their return object so `taskAgent` 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, `taskAgent` 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","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 { DetailReference } from '../../conversation/index.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 { formatToolResultMessage } from './toolResultMessage.js';\nimport type { PendingToolCall } from './toolUseGate.js';\n\ntype ToolRunRow = {\n text: string;\n isError: boolean;\n detailRef?: DetailReference;\n awaitSessionId?: string;\n};\n\ntype CompletedToolCall = ToolRunRow & { call: PendingToolCall };\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 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('[taskAgent] tool execution error', toolId, message);\n } else {\n console.warn('[taskAgent] tool execution error', toolId, message);\n }\n return { text: message, isError: true };\n }\n}\n\nasync function executeWithGuards(\n context: AgentFrameworkContext,\n options: AgentFrameworkContext['taskAgent'],\n conversationId: string,\n recentToolCalls: string[],\n call: PendingToolCall,\n): Promise<ToolRunRow> {\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 const row = 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 const lamportTool = await nextLamportClockForConversation(context.storage, conversationId);\n await context.storage.appendMessage({\n messageId: `${conversationId}:t:${call.toolId}:${Date.now().toString(36)}`,\n conversationId,\n originNodeId: 'local',\n timestamp: Date.now(),\n lamportClock: lamportTool,\n role: 'tool',\n content: formatToolResultMessage(call.toolId, call.parameters, row.text, row.isError),\n detailRef: row.detailRef,\n });\n}\n\nasync function persistTerminalAwaitCompletion(\n context: AgentFrameworkContext,\n options: AgentFrameworkContext['taskAgent'],\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({\n messageId: `${conversationId}:t:${call.toolId}:await:${Date.now().toString(36)}`,\n conversationId,\n originNodeId: 'local',\n timestamp: Date.now(),\n lamportClock: lamportTool,\n role: 'tool',\n content: formatToolResultMessage(call.toolId, call.parameters, body, false),\n detailRef: row.detailRef\n ? { ...row.detailRef, exitCode: done.exitCode ?? row.detailRef.exitCode }\n : undefined,\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 taskAgentOptions: AgentFrameworkContext['taskAgent'];\n conversationId: string;\n calls: PendingToolCall[];\n parallel: boolean;\n recentToolCalls: string[];\n}): AsyncGenerator<AgentLoopStep, void, unknown> {\n const { context, taskAgentOptions, 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 taskAgentOptions,\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 taskAgentOptions,\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 taskAgentOptions,\n conversationId,\n recentToolCalls,\n call,\n );\n yield toolStep({ call, ...row }, false);\n await persistToolResult(context, conversationId, call, row);\n await persistTerminalAwaitCompletion(context, taskAgentOptions, 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 type { PermissionSet } from './types.js';\n\nexport interface PermissionSqlStatement {\n get(...arguments_: unknown[]): unknown;\n run(...arguments_: unknown[]): unknown;\n}\n\nexport interface PermissionSqlDatabase {\n prepare(sql: string): PermissionSqlStatement;\n}\n\nconst TABLE_NAME = 'permissions';\nconst STORAGE_KEY = 'user';\n\n/**\n * Load user-level permission set from SQLite.\n *\n * The `permissions` table stores JSON blobs keyed by `source`.\n * Returns an empty set if no persisted rules exist.\n */\nexport function loadUserPermissions(database: PermissionSqlDatabase): PermissionSet {\n try {\n const row = database\n .prepare(`SELECT rulesJson FROM ${TABLE_NAME} WHERE source = ? LIMIT 1`)\n .get(STORAGE_KEY) as { rulesJson: string } | undefined;\n\n if (row?.rulesJson) {\n return JSON.parse(row.rulesJson) as PermissionSet;\n }\n } catch {\n /* Table may not exist yet; return empty */\n }\n\n return { rules: [], source: 'user' };\n}\n\n/**\n * Persist user-level permission set to SQLite.\n *\n * Uses INSERT OR REPLACE so first-time saves work without explicit table detection.\n */\nexport function saveUserPermissions(database: PermissionSqlDatabase, set: PermissionSet): void {\n database.prepare(\n `INSERT OR REPLACE INTO ${TABLE_NAME} (source, rulesJson, updatedAt)\n VALUES (?, ?, ?)`,\n ).run(set.source, JSON.stringify(set), Date.now());\n}\n\n/** SQL statement to create the permissions table during migration. */\nexport const PERMISSIONS_TABLE_DDL = `\n CREATE TABLE IF NOT EXISTS ${TABLE_NAME} (\n source TEXT PRIMARY KEY,\n rulesJson TEXT NOT NULL,\n updatedAt INTEGER NOT NULL\n );\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 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';\nimport { formatToolResultMessage } from './toolResultMessage.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 */\nexport function buildLayeredPermissions(\n options: AgentFrameworkContext['taskAgent'],\n definitionId: string,\n userSet?: PermissionSet,\n): MergedPermissions {\n const global = options?.toolPermissions;\n const sets: PermissionSet[] = [];\n\n if (global?.default) {\n sets.push({\n source: 'default',\n rules: [{ toolPattern: '*', action: global.default }],\n });\n }\n\n const scoped = global?.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 (global?.rules && global.rules.length > 0) {\n sets.push({\n source: 'session',\n rules: global.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: 'allow' }],\n });\n }\n\n return mergePermissionSets(sets);\n}\n\nexport function createPermissionPreToolUseHook(\n options: AgentFrameworkContext['taskAgent'],\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({\n messageId: `${conversationId}:t:${call.toolId}:${Date.now().toString(36)}`,\n conversationId,\n originNodeId: 'local',\n timestamp: Date.now(),\n lamportClock: lamportTool,\n role: 'tool',\n content: formatToolResultMessage(call.toolId, call.parameters, errorText, true),\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['taskAgent'],\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 } 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';\n\nexport type { AgentLoopGenerator, AgentLoopInput, AgentLoopStep } from '../types.js';\nimport type { AgentLoopGenerator, AgentLoopInput, AgentLoopStep } from '../types.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--) {\n const m = agentMessages[index];\n if (m.role === 'assistant' && m.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 (m) =>\n m.role === 'tool' &&\n (m.metadata?.toolId === call.toolId ||\n (typeof m.content === 'string' && m.content.includes(`Tool: ${call.toolId}`))),\n );\n}\n\n/**\n * TaskAgent:TidGi `basicPromptConcatHandler` 对齐版。\n *\n * - defineTool:`createHooksWithPlugins` + `responseComplete` + `responseConcat`(postProcess)\n * - 回退:`IToolRegistry` 执行未被插件处理的 tool 调用\n */\nexport function createTaskAgent(\n context: AgentFrameworkContext,\n): (input: AgentLoopInput) => AgentLoopGenerator {\n return async function* taskAgent(input: AgentLoopInput): AgentLoopGenerator {\n let agentStarted = false;\n let agentStopped = false;\n let stopReason: AgentStopData['reason'] | undefined;\n const markStop = (reason: AgentStopData['reason']): void => {\n stopReason ??= reason;\n };\n const finishThinking = (\n reason: AgentStopData['reason'],\n data: Record<string, unknown>,\n ): AgentLoopStep => {\n markStop(reason);\n return { type: 'thinking', data };\n };\n const options = context.taskAgent ?? {};\n const enableToolLoop = options.enableToolLoop !== false;\n const fallbackRegistry = options.fallbackRegistryTools !== false;\n const maxIterations = options.maxIterations != null && options.maxIterations > 0\n ? options.maxIterations\n : DEFAULT_MAX_ITERATIONS;\n const checkpointOptions = options.sessionCheckpoint;\n\n try {\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 // Resume session: load previous messages before appending new user message\n if (input.resumeSession && input.resumeSession.length > 0) {\n // Insert resume messages into storage (skip duplicates via messageId)\n await context.storage.insertMessagesIfAbsent(input.resumeSession);\n }\n\n await context.storage.appendMessage(userMessage);\n\n // Execute UserPromptSubmit hooks\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 yield {\n type: 'thinking',\n data: {\n status: 'blocked',\n conversationId: input.conversationId,\n reason: hookResult.reason ?? 'Blocked by UserPromptSubmit hook',\n },\n };\n return;\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 yield {\n type: 'thinking',\n data: {\n status: 'blocked',\n conversationId: input.conversationId,\n reason: hookResult.reason ?? 'Blocked by AgentStart hook',\n },\n };\n return;\n }\n }\n agentStarted = true;\n\n let iteration = 0;\n const recentToolCalls: string[] = [];\n\n while (iteration < maxIterations) {\n iteration++;\n\n if (options.isCancelled?.(input.conversationId)) {\n yield finishThinking('cancelled', {\n status: 'cancelled',\n conversationId: input.conversationId,\n });\n return;\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 taskAgentOptions: 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 (m) => {\n await context.storage.appendMessage(m);\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 const messages = await buildLlmMessages(context, input.conversationId, history);\n const request = { conversationId: input.conversationId, messages };\n let assistantText = '';\n for await (const c of streamLlm(context, request)) {\n assistantText += chunkToText(c);\n yield { type: 'message', data: c };\n }\n\n const definitionId = await inferDefinitionId(context.storage, input.conversationId);\n const agentDefinition = await resolveAgentDefinitionModel(context, definitionId);\n const fw = agentDefinition?.agentFrameworkConfig as\n | { prompts?: unknown[]; plugins?: unknown[]; response?: unknown[] }\n | undefined;\n const hasPlugins = Boolean(\n fw?.plugins && Array.isArray(fw.plugins) && fw.plugins.length > 0,\n );\n\n const assistantMessage = context.normalizeMessage?.({\n messageId: `${input.conversationId}:a:${Date.now().toString(36)}`,\n conversationId: input.conversationId,\n originNodeId: 'local',\n timestamp: Date.now(),\n lamportClock: await nextLamportClockForConversation(\n context.storage,\n input.conversationId,\n ),\n role: 'assistant',\n content: assistantText,\n }) ?? {\n messageId: `${input.conversationId}:a:${Date.now().toString(36)}`,\n conversationId: input.conversationId,\n originNodeId: 'local',\n timestamp: Date.now(),\n lamportClock: await nextLamportClockForConversation(\n context.storage,\n input.conversationId,\n ),\n role: 'assistant',\n content: assistantText,\n };\n hookContext.agent.messages.push(assistantMessage);\n await hookContext.persistAgentMessage?.(assistantMessage);\n\n const { calls, parallel } = matchAllToolCallings(assistantText);\n\n if (hasPlugins && fw) {\n const { hooks } = await createHooksWithPlugins(\n fw as { plugins: Array<{ toolId: string }> },\n {\n pluginRegistry: resolvePromptPluginMap(context),\n },\n );\n const rcPayload: {\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: fw 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, rcPayload);\n\n await context.storage.insertMessagesIfAbsent(hookContext.agent.messages);\n\n const post = await responseConcat(\n fw 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 = rcPayload.actions?.yieldNextRoundTo ?? post.yieldNextRoundTo;\n\n if (yieldTarget === 'human') {\n yield finishThinking('completed', {\n status: 'input-required',\n conversationId: input.conversationId,\n });\n return;\n }\n if (yieldTarget === 'self') {\n continue;\n }\n }\n\n if (calls.length === 0) {\n markStop('completed');\n return;\n }\n\n if (!enableToolLoop) {\n markStop('completed');\n return;\n }\n\n const pending = calls.filter(\n (c) => !toolCallHandledInAgentMessages(hookContext.agent.messages, assistantText, c),\n );\n\n if (pending.length === 0) {\n if (hasPlugins && calls.length > 0) {\n continue;\n }\n markStop('completed');\n return;\n }\n\n if (!fallbackRegistry && hasPlugins) {\n 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 continue;\n }\n\n yield* runRegistryToolCalls({\n context,\n taskAgentOptions: options,\n conversationId: input.conversationId,\n calls: allowedCalls,\n parallel,\n recentToolCalls,\n });\n\n // Save session checkpoint after each completed turn\n if (checkpointOptions?.enabled) {\n const checkpointStore = checkpointOptions.store;\n if (!checkpointStore) {\n if (context.logger?.warn) {\n context.logger.warn('[taskAgent] checkpoint enabled without a checkpoint store');\n } else {\n console.warn('[taskAgent] checkpoint enabled without a checkpoint store');\n }\n 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('[taskAgent] checkpoint save failed:', error);\n } else {\n console.warn('[taskAgent] checkpoint save failed:', error);\n }\n }\n }\n\n continue;\n }\n\n yield finishThinking('max-iterations', {\n status: 'max-iterations',\n conversationId: input.conversationId,\n maxIterations,\n });\n } catch (error) {\n markStop('error');\n throw error;\n } finally {\n if (agentStarted && !agentStopped && stopReason && hasHooks('AgentStop')) {\n agentStopped = true;\n await executeHooks('AgentStop', context, {\n conversationId: input.conversationId,\n reason: stopReason,\n });\n }\n }\n };\n}\n","/**\n * LLM_IO_Loop 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 { createTaskAgent } from './loop.js';\n\nexport interface RunTaskAgentTurnCallbacks {\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 taskAgent?: (input: AgentLoopInput) => AgentLoopGenerator;\n}\n\nexport interface RunTaskAgentTurnResult {\n state: AgentInstanceState;\n stepCount: number;\n}\n\nexport function resolveTaskAgentTerminalState(\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 runTaskAgentTurn(\n context: AgentFrameworkContext,\n input: AgentLoopInput,\n callbacks: RunTaskAgentTurnCallbacks = {},\n): Promise<RunTaskAgentTurnResult> {\n const taskAgent = callbacks.taskAgent ?? createTaskAgent(context);\n let terminalState: AgentInstanceState = 'completed';\n let stepCount = 0;\n\n for await (const step of taskAgent(input)) {\n stepCount += 1;\n terminalState = resolveTaskAgentTerminalState(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","/**\n * Agent loop registry.\n *\n * Discovers, registers, and resolves loop types, loop profiles, and loop plugins.\n * Core does NOT hard-import any loop implementation; all are registered by host or plugin.\n */\n\nimport type { AgentLoopDefinition, AgentLoopGenerator, AgentLoopInput, LoopPlugin, LoopProfile, LoopProfilePluginEntry } from './types.js';\n\ntype LoopPluginSelection = string | LoopProfilePluginEntry;\n\nfunction normalizePluginSelections(\n selected?: LoopPluginSelection[],\n): Map<string, LoopProfilePluginEntry> | undefined {\n if (!selected) return undefined;\n\n const result = new Map<string, LoopProfilePluginEntry>();\n for (const entry of selected) {\n if (typeof entry === 'string') {\n result.set(entry, { id: entry, enabled: true });\n continue;\n }\n if (entry.enabled === false) continue;\n result.set(entry.id, entry);\n }\n return result;\n}\n\n// ─── Loop Registry ─────────────────────────────────────────────────────\n\nclass LoopRegistryImpl {\n private readonly loops = new Map<string, AgentLoopDefinition>();\n private readonly profiles = new Map<string, LoopProfile>();\n private readonly plugins = new Map<string, LoopPlugin>();\n\n // ── Loop registration ──\n\n registerLoop(definition: AgentLoopDefinition): void {\n if (!definition.id) throw new Error('Loop definition must have an id');\n this.loops.set(definition.id, definition);\n }\n\n getLoop(id: string): AgentLoopDefinition | undefined {\n return this.loops.get(id);\n }\n\n listLoops(): AgentLoopDefinition[] {\n return Array.from(this.loops.values());\n }\n\n // ── Profile registration ──\n\n registerProfile(profile: LoopProfile): void {\n if (!profile.id) throw new Error('Loop profile must have an id');\n this.profiles.set(profile.id, profile);\n }\n\n getProfile(id: string): LoopProfile | undefined {\n return this.profiles.get(id);\n }\n\n listProfiles(): LoopProfile[] {\n return Array.from(this.profiles.values());\n }\n\n // ── Plugin registration ──\n\n registerPlugin(plugin: LoopPlugin): void {\n if (!plugin.id) throw new Error('Loop plugin must have an id');\n this.plugins.set(plugin.id, plugin);\n }\n\n getPlugin(id: string): LoopPlugin | undefined {\n return this.plugins.get(id);\n }\n\n listPlugins(): LoopPlugin[] {\n return Array.from(this.plugins.values());\n }\n\n installPluginsForLoop(\n loopId: string,\n target: { [key: string]: unknown },\n selected?: LoopPluginSelection[],\n ): void {\n const selectedEntries = normalizePluginSelections(selected);\n\n for (const plugin of this.plugins.values()) {\n const entry = selectedEntries?.get(plugin.id);\n if (selectedEntries && !entry) continue;\n if (plugin.targetLoopId && plugin.targetLoopId !== '*' && plugin.targetLoopId !== loopId) {\n continue;\n }\n if (plugin.install) {\n plugin.install(target, entry?.config);\n }\n }\n }\n\n installPluginsForProfile(profile: LoopProfile, target: { [key: string]: unknown }): void {\n this.installPluginsForLoop(profile.loopId ?? 'llm-io', target, profile.plugins ?? []);\n }\n\n createRunnerForProfile(\n profile: LoopProfile,\n context: { [key: string]: unknown } = {},\n ): ((input: AgentLoopInput) => AgentLoopGenerator) | null {\n const loopId = profile.loopId ?? 'llm-io';\n this.installPluginsForProfile(profile, context);\n return this.createRunner(loopId, { ...context, profile });\n }\n\n // ── Lifecycle ──\n\n createRunner(\n loopId: string,\n context: { [key: string]: unknown } = {},\n ): ((input: AgentLoopInput) => AgentLoopGenerator) | null {\n const definition = this.loops.get(loopId);\n if (!definition) return null;\n return definition.createRunner(context);\n }\n\n reset(): void {\n this.loops.clear();\n this.profiles.clear();\n this.plugins.clear();\n }\n}\n\n// ─── Global singleton ─────────────────────────────────────────────────\n\nlet defaultRegistry: LoopRegistryImpl | null = null;\n\nexport function getLoopRegistry(): LoopRegistryImpl {\n if (!defaultRegistry) {\n defaultRegistry = new LoopRegistryImpl();\n }\n return defaultRegistry;\n}\n\nexport function resetLoopRegistry(): void {\n if (defaultRegistry) {\n defaultRegistry.reset();\n }\n defaultRegistry = null;\n}\n\nexport type { LoopRegistryImpl };\n","import type { SubAgentLoopScript } from './loop.js';\n\nexport interface LoadSubAgentLoopScriptOptions {\n importModule?: (specifier: string) => Promise<unknown>;\n}\n\nfunction getExportedScript(moduleExports: unknown): unknown {\n if (typeof moduleExports === 'function') return moduleExports;\n if (!moduleExports || typeof moduleExports !== 'object') return undefined;\n\n const record = moduleExports as Record<string, unknown>;\n return record.default ?? record.run;\n}\n\nexport async function loadSubAgentLoopScript(\n scriptSpecifier: string,\n options: LoadSubAgentLoopScriptOptions = {},\n): Promise<SubAgentLoopScript> {\n const importModule = options.importModule ?? ((specifier: string) => import(specifier));\n const moduleExports: unknown = await importModule(scriptSpecifier);\n const exportedScript = getExportedScript(moduleExports);\n\n if (typeof exportedScript !== 'function') {\n throw new TypeError(\n `SubAgent loop script \"${scriptSpecifier}\" must export a default function or named run function.`,\n );\n }\n\n return exportedScript as SubAgentLoopScript;\n}\n","/**\n * SubAgent_Loop — a loop that orchestrates child agents.\n *\n * This loop does NOT call the LLM directly. Instead it coordinates child agents:\n * - running a child agent and feeding its result to another child agent (review / verify)\n * - splitting work across multiple parallel child agents\n * - looping back to a child agent with feedback when a reviewer rejects the output\n *\n * The loop script (.mjs) holds the orchestration logic. This file provides the\n * runtime that invokes the script and manages child agent runs.\n */\n\nimport type { AgentLoopDefinition, AgentLoopGenerator, AgentLoopInput, AgentLoopRuntime, AgentLoopStep, LoopProfile } from '../types.js';\nimport { loadSubAgentLoopScript } from './scriptLoader.js';\n\nconst LOOP_ID = 'sub-agent';\nconst LOOP_NAME = 'SubAgent Loop';\nconst LOOP_DESC = 'Orchestrates child agents to collaborate on a task. Supports sequential chaining, parallel execution, and feedback loops.';\n\nexport interface SubAgentLoopScriptArguments {\n input: AgentLoopInput;\n context: SubAgentLoopContext;\n profile?: LoopProfile;\n runtime?: Partial<AgentLoopRuntime>;\n runAgent: (input: SubAgentRunAgentInput) => Promise<SubAgentRunAgentResult>;\n runAgents: (inputs: SubAgentRunAgentInput[]) => Promise<SubAgentRunAgentResult[]>;\n emit: (step: AgentLoopStep) => void;\n finish: (message: string | AgentLoopStep) => void;\n isCancelled: () => boolean;\n log: (event: string, data?: Record<string, unknown>) => void;\n state: AgentLoopRuntime['state'];\n checkpoint: AgentLoopRuntime['checkpoint'];\n}\n\nexport interface SubAgentRunAgentInput {\n /** Child profile id. `profile` is accepted as an ergonomic alias for scripts. */\n profileId?: string;\n profile?: string;\n prompt: string;\n conversationId?: string;\n}\n\nexport interface SubAgentRunAgentResult {\n profileId: string;\n conversationId: string;\n steps: AgentLoopStep[];\n text: string;\n}\n\nexport type SubAgentLoopScriptResult =\n | AgentLoopGenerator\n | AgentLoopStep\n | AgentLoopStep[]\n | string\n | undefined;\n\nexport type SubAgentLoopScript = (\n scriptArguments: SubAgentLoopScriptArguments,\n) => SubAgentLoopScriptResult | Promise<SubAgentLoopScriptResult>;\n\nexport interface SubAgentLoopContext {\n [key: string]: unknown;\n profile?: LoopProfile;\n runtime?: Partial<AgentLoopRuntime>;\n childProfiles?: string[];\n script?: SubAgentLoopScript;\n loadScript?: (\n script: string,\n context: SubAgentLoopContext,\n ) => SubAgentLoopScript | Promise<SubAgentLoopScript>;\n}\n\nfunction isAsyncIterable(value: unknown): value is AgentLoopGenerator {\n return Boolean(value && typeof value === 'object' && Symbol.asyncIterator in value);\n}\n\nfunction messageStep(message: string): AgentLoopStep {\n return { type: 'message', data: message };\n}\n\nfunction stepText(step: AgentLoopStep): string | undefined {\n if (step.type !== 'message') return undefined;\n if (typeof step.data === 'string') return step.data;\n if (step.data && typeof step.data === 'object' && 'content' in step.data) {\n const content = (step.data as { content?: unknown }).content;\n return typeof content === 'string' ? content : undefined;\n }\n return undefined;\n}\n\nfunction createScriptArguments(\n input: AgentLoopInput,\n context: SubAgentLoopContext,\n emittedSteps: AgentLoopStep[],\n): SubAgentLoopScriptArguments {\n const emit = (step: AgentLoopStep): void => {\n emittedSteps.push(step);\n context.runtime?.emit?.(step);\n };\n\n const log = (event: string, data?: Record<string, unknown>): void => {\n context.runtime?.log?.(event, data);\n };\n\n const isCancelled = (): boolean => context.runtime?.signal?.cancelled === true;\n\n const runAgent = async (childInput: SubAgentRunAgentInput): Promise<SubAgentRunAgentResult> => {\n if (isCancelled()) throw new Error('SubAgent_Loop cancelled before child agent start');\n const profileId = childInput.profileId ?? childInput.profile;\n if (!profileId) throw new Error('ctx.runAgent requires profileId or profile');\n if (!context.runtime?.runChildAgent) throw new Error('ctx.runAgent requires runtime.runChildAgent');\n\n const childConversationId = childInput.conversationId ?? `${input.conversationId}:child:${profileId}:${Date.now().toString(36)}`;\n emit({\n type: 'thinking',\n data: { status: 'child-agent-started', profileId, conversationId: childConversationId },\n });\n\n const steps: AgentLoopStep[] = [];\n const chunks: string[] = [];\n try {\n for await (\n const step of context.runtime.runChildAgent({\n profileId,\n prompt: childInput.prompt,\n conversationId: childConversationId,\n })\n ) {\n if (isCancelled()) throw new Error('SubAgent_Loop cancelled during child agent run');\n steps.push(step);\n const text = stepText(step);\n if (text) chunks.push(text);\n emit({\n type: 'thinking',\n data: { status: 'child-agent-step', profileId, conversationId: childConversationId, step },\n });\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n emit({\n type: 'thinking',\n data: { status: 'child-agent-failed', profileId, conversationId: childConversationId, error: message },\n });\n throw error;\n }\n\n emit({\n type: 'thinking',\n data: { status: 'child-agent-completed', profileId, conversationId: childConversationId },\n });\n return { profileId, conversationId: childConversationId, steps, text: chunks.join('').trim() };\n };\n\n return {\n input,\n context,\n profile: context.profile,\n runtime: context.runtime,\n runAgent,\n runAgents: inputs => Promise.all(inputs.map(runAgent)),\n emit,\n finish: message => {\n emit(typeof message === 'string' ? messageStep(message) : message);\n },\n isCancelled,\n log,\n state: context.runtime?.state ?? {\n get: async () => undefined,\n set: async () => undefined,\n update: async () => undefined,\n },\n checkpoint: context.runtime?.checkpoint ?? (async () => undefined),\n };\n}\n\nasync function* drainEmittedSteps(steps: AgentLoopStep[]): AgentLoopGenerator {\n while (steps.length > 0) {\n const step = steps.shift();\n if (step) yield step;\n }\n}\n\nasync function* runScript(\n script: SubAgentLoopScript,\n input: AgentLoopInput,\n context: SubAgentLoopContext,\n): AgentLoopGenerator {\n const emittedSteps: AgentLoopStep[] = [];\n const scriptArguments = createScriptArguments(input, context, emittedSteps);\n const result = await script(scriptArguments);\n\n yield* drainEmittedSteps(emittedSteps);\n if (isAsyncIterable(result)) {\n yield* result;\n yield* drainEmittedSteps(emittedSteps);\n } else if (typeof result === 'string') {\n yield messageStep(result);\n } else if (Array.isArray(result)) {\n yield* result;\n } else if (result) {\n yield result;\n }\n}\n\nfunction asSubAgentContext(context: { [key: string]: unknown }): SubAgentLoopContext {\n return context as SubAgentLoopContext;\n}\n\nasync function resolveScript(\n context: SubAgentLoopContext,\n): Promise<SubAgentLoopScript | undefined> {\n if (context.script) return context.script;\n const scriptPath = context.profile?.script;\n if (!scriptPath) return undefined;\n if (context.loadScript) return context.loadScript(scriptPath, context);\n return loadSubAgentLoopScript(scriptPath);\n}\n\nasync function* runConfiguredChildProfiles(\n input: AgentLoopInput,\n context: SubAgentLoopContext,\n): AgentLoopGenerator {\n const childProfiles = context.childProfiles ?? [];\n const runChildAgent = context.runtime?.runChildAgent;\n const summaries: string[] = [];\n const failures: string[] = [];\n\n for (let index = 0; index < childProfiles.length; index += 1) {\n if (context.runtime?.signal?.cancelled) {\n yield {\n type: 'thinking',\n data: { status: 'cancelled', conversationId: input.conversationId },\n };\n return;\n }\n\n const profileId = childProfiles[index];\n const childConversationId = `${input.conversationId}:child:${index}`;\n yield {\n type: 'thinking',\n data: { status: 'child-agent-started', profileId, conversationId: childConversationId },\n };\n\n if (!runChildAgent) {\n yield {\n type: 'thinking',\n data: { status: 'child-agent-unavailable', profileId, conversationId: childConversationId },\n };\n continue;\n }\n\n try {\n for await (\n const step of runChildAgent({\n profileId,\n prompt: input.message,\n conversationId: childConversationId,\n })\n ) {\n yield {\n type: 'thinking',\n data: { status: 'child-agent-step', profileId, conversationId: childConversationId, step },\n };\n const text = stepText(step);\n if (text) summaries.push(text);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n failures.push(`${profileId}: ${message}`);\n yield {\n type: 'thinking',\n data: { status: 'child-agent-failed', profileId, conversationId: childConversationId, error: message },\n };\n continue;\n }\n\n yield {\n type: 'thinking',\n data: { status: 'child-agent-completed', profileId, conversationId: childConversationId },\n };\n }\n\n yield {\n type: 'message',\n data: [\n summaries.length > 0 ? summaries.join('\\n\\n') : 'No child agent output.',\n failures.length > 0 ? `Failed child agents:\\n${failures.join('\\n')}` : '',\n ].filter(Boolean).join('\\n\\n'),\n };\n}\n\n/**\n * Create the SubAgent_Loop definition and register it with the loop registry.\n */\nexport function createSubAgentLoopDefinition(): AgentLoopDefinition {\n return {\n id: LOOP_ID,\n name: LOOP_NAME,\n description: LOOP_DESC,\n createRunner: (rawContext) => {\n return async function* subAgentLoop(input) {\n const context = asSubAgentContext(rawContext);\n const script = await resolveScript(context);\n\n yield {\n type: 'thinking',\n data: { status: 'sub-agent-loop-started', conversationId: input.conversationId },\n };\n context.runtime?.log?.('sub-agent-loop-started', {\n conversationId: input.conversationId,\n profileId: context.profile?.id,\n });\n\n if (script) {\n yield* runScript(script, input, context);\n yield {\n type: 'thinking',\n data: { status: 'completed', conversationId: input.conversationId },\n };\n return;\n }\n\n if (context.childProfiles && context.childProfiles.length > 0) {\n yield* runConfiguredChildProfiles(input, context);\n yield {\n type: 'thinking',\n data: { status: 'completed', conversationId: input.conversationId },\n };\n return;\n }\n\n yield {\n type: 'thinking',\n data: { status: 'script-missing', conversationId: input.conversationId },\n };\n yield {\n type: 'message',\n data: 'SubAgent_Loop requires a loop script or childProfiles configuration.',\n };\n yield {\n type: 'thinking',\n data: { status: 'completed', conversationId: input.conversationId },\n };\n };\n },\n };\n}\n\n/** Export loop id for consumers. */\nexport function getSubAgentLoopId(): string {\n return LOOP_ID;\n}\n","/**\n * Built-in loop registrations — installed at startup so getLoopRegistry().createRunner('llm-io') works.\n *\n * This module allows hosts to skip manual registerLoop() for the built-in loop types.\n * Hosts can still override by calling registerLoop() with the same id after.\n */\n\nimport type { AgentFrameworkContext } from '../../types.js';\nimport { createTaskAgent } from '../llm-io/loop.js';\nimport { getLoopRegistry } from '../registry.js';\nimport { createSubAgentLoopDefinition, getSubAgentLoopId } from '../sub-agent/loop.js';\nimport type { AgentLoopDefinition } from '../types.js';\n\nexport const LLM_IO_LOOP_ID = 'llm-io';\nexport const SUB_AGENT_LOOP_ID = getSubAgentLoopId();\n\nfunction createLlmIoLoopDefinition(name: string): AgentLoopDefinition {\n return {\n id: LLM_IO_LOOP_ID,\n name,\n description: 'LLM I/O loop — the classic ReAct agent loop that calls the LLM and executes tools.',\n createRunner: (rawContext) => {\n const context = rawContext as unknown as AgentFrameworkContext;\n return createTaskAgent(context);\n },\n };\n}\n\n/**\n * Register the default built-in loops (llm-io and sub-agent) with the loop registry.\n * Safe to call multiple times — skips already-registered loops.\n */\nexport function registerBuiltinLoops(): void {\n const registry = getLoopRegistry();\n\n if (!registry.getLoop(LLM_IO_LOOP_ID)) {\n registry.registerLoop(createLlmIoLoopDefinition('LLM_IO_Loop'));\n }\n\n if (!registry.getLoop(SUB_AGENT_LOOP_ID)) {\n registry.registerLoop(createSubAgentLoopDefinition());\n }\n}\n","const toolSchemas = new Map<string, unknown>();\nconst toolMetadata = new Map<string, { displayName: string; description: string }>();\n\nexport function registerToolParameterSchema(\n toolId: string,\n schema: unknown,\n metadata?: { displayName: string; description: string },\n): void {\n toolSchemas.set(toolId, schema);\n if (metadata) {\n toolMetadata.set(toolId, metadata);\n }\n}\n\nexport function getToolParameterSchema(toolId: string): unknown {\n return toolSchemas.get(toolId);\n}\n\nexport function getToolMetadata(\n toolId: string,\n): { displayName: string; description: string } | undefined {\n return toolMetadata.get(toolId);\n}\n","import { z } from \"zod\";\n\nimport { waitForQuestionAnswer } from \"./questionWaitRegistry.js\";\nimport type { BuiltinToolContext } from \"./types.js\";\n\nexport const askQuestionConfigSchema = z.object({\n question: z.string().min(1),\n /**\n * Desktop / TidGi 的 LLM 工具参数里通常不会显式携带 conversationId,\n * 由宿主侧上下文负责关联;这里允许缺省,交给宿主回调侧做路由。\n */\n conversationId: z.string().min(1).optional(),\n timeoutMs: z.number().int().positive().max(3_600_000).optional(),\n inputType: z.enum([\"single-select\", \"multi-select\", \"text\"]).optional(),\n options: z\n .array(\n z.object({\n label: z.string(),\n description: z.string().optional(),\n }),\n )\n .optional(),\n allowFreeform: z.boolean().optional().default(true),\n});\n\n/**\n * Must match `tool_use name=\"ask-question\"` extracted by responsePatternUtility.\n */\nexport const ASK_QUESTION_TOOL_ID = \"ask-question\";\n\nexport async function askQuestionImpl(\n arguments_: Record<string, unknown>,\n context: BuiltinToolContext,\n): Promise<{ result: string } | { error: string }> {\n const parsed = askQuestionConfigSchema.safeParse(arguments_);\n if (!parsed.success) {\n return { error: \"invalid_askQuestion_args\" };\n }\n const { question, conversationId, timeoutMs, inputType, options, allowFreeform } = parsed.data;\n const questionId = crypto.randomUUID();\n const timeout = timeoutMs ?? 300_000;\n context.notifyAskQuestion?.({\n questionId,\n question,\n conversationId,\n inputType,\n options,\n allowFreeform,\n });\n try {\n const answer = await waitForQuestionAnswer(questionId, timeout);\n return { result: answer };\n } catch (error) {\n return { error: error instanceof Error ? error.message : \"askQuestion_failed\" };\n }\n}\n","type Pending = {\n resolve: (answer: string) => void;\n reject: (error: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n};\n\nconst pending = new Map<string, Pending>();\n\nexport function resolveQuestionAnswer(questionId: string, answer: string): boolean {\n const p = pending.get(questionId);\n if (!p) return false;\n clearTimeout(p.timer);\n pending.delete(questionId);\n p.resolve(answer);\n return true;\n}\n\nexport function waitForQuestionAnswer(questionId: string, timeoutMs: number): Promise<string> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n pending.delete(questionId);\n reject(new Error(\"askQuestion_timeout\"));\n }, timeoutMs);\n pending.set(questionId, { resolve, reject, timer });\n });\n}\n","/**\n * AskUserQuestion Tool — Pause agent execution and ask user for input.\n *\n * Uses the existing askQuestion pattern (notifyAskQuestion + waitForQuestionAnswer)\n * but provides a dedicated tool ID for explicit user question prompting.\n */\nimport { z } from 'zod';\n\nimport { waitForQuestionAnswer } from './questionWaitRegistry.js';\nimport type { BuiltinToolContext } from './types.js';\n\nexport const askUserQuestionConfigSchema = z.object({\n question: z.string().min(1).describe('The question to ask the user'),\n inputType: z\n .enum(['text', 'single-select', 'multi-select'])\n .optional()\n .default('text')\n .describe('Type of input expected: text, single-select, or multi-select'),\n options: z\n .array(\n z.object({\n label: z.string().min(1),\n description: z.string().optional(),\n }),\n )\n .optional()\n .describe('Options for single-select or multi-select input types'),\n allowFreeform: z\n .boolean()\n .optional()\n .default(true)\n .describe('Allow free-text input even for select types'),\n timeoutMs: z\n .number()\n .int()\n .positive()\n .max(3_600_000)\n .optional()\n .default(300_000)\n .describe('Timeout in milliseconds (default 5 minutes)'),\n});\n\nexport const ASK_USER_QUESTION_TOOL_ID = 'askUserQuestion';\n\nexport async function askUserQuestionImpl(\n arguments_: Record<string, unknown>,\n context: BuiltinToolContext,\n): Promise<{ result: string } | { error: string }> {\n const parsed = askUserQuestionConfigSchema.safeParse(arguments_);\n if (!parsed.success) {\n return { error: `invalid_askUserQuestion_args: ${parsed.error.message}` };\n }\n\n const { question, inputType, options, allowFreeform, timeoutMs } = parsed.data;\n const questionId = crypto.randomUUID();\n const conversationId = context.agent?.id ?? context.activeToolConversationId;\n\n context.notifyAskQuestion?.({\n questionId,\n question,\n conversationId,\n inputType,\n options,\n allowFreeform,\n });\n\n try {\n const answer = await waitForQuestionAnswer(questionId, timeoutMs);\n return { result: answer };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'askUserQuestion_failed';\n return { error: message };\n }\n}\n","import type { BuiltinToolImpl } from \"./types.js\";\n\nconst TOOL_ID = \"mcpClient\";\n\nexport const mcpClientConfigSchema = {\n type: \"object\",\n properties: {\n nodeId: { type: \"string\", description: \"Target node ID\" },\n serverName: { type: \"string\", description: \"MCP server name on that node\" },\n toolName: { type: \"string\", description: \"Tool to invoke\" },\n args: { type: \"object\", description: \"Tool arguments\" },\n },\n required: [\"nodeId\", \"serverName\", \"toolName\"],\n} as const;\n\nexport const mcpClientImpl: BuiltinToolImpl = async (arguments_, context) => {\n const nodeId = arguments_.nodeId as string | undefined;\n const serverName = arguments_.serverName as string | undefined;\n const toolName = arguments_.toolName as string | undefined;\n const toolArguments = (arguments_.args as Record<string, unknown>) ?? {};\n\n if (!nodeId || !serverName || !toolName) {\n return {\n error: \"mcpClient requires nodeId, serverName, and toolName\",\n };\n }\n\n if (!context.mcpCallRemote) {\n return {\n error:\n \"MCP proxy not configured (no mcpCallRemote in context). Connect to nodes that expose MCP.\",\n };\n }\n\n try {\n const result = await context.mcpCallRemote(nodeId, serverName, toolName, toolArguments);\n return { result };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { error: `MCP call failed: ${message}` };\n }\n};\n\nexport function getMcpClientToolId(): string {\n return TOOL_ID;\n}\n","import type { BuiltinToolImpl } from \"./types.js\";\n\nconst TOOL_ID = \"mcpForward\";\n\nexport const mcpForwardConfigSchema = {\n type: \"object\",\n properties: {\n action: {\n type: \"string\",\n enum: [\"list\", \"listTools\"],\n description:\n \"Action: 'list' returns nodes with MCP servers, 'listTools' returns all available MCP tools across nodes\",\n },\n },\n} as const;\n\ninterface McpServerInfo {\n name: string;\n}\n\ninterface McpToolInfo {\n nodeId: string;\n serverName: string;\n name: string;\n description?: string;\n}\n\n/**\n * MCP forwarding tool: discover MCP servers and tools on connected nodes.\n * - action=list: returns nodes with their MCP servers\n * - action=listTools: returns all available MCP tools across all nodes\n */\nexport const mcpForwardImpl: BuiltinToolImpl = async (arguments_, context) => {\n const action = (arguments_.action as string | undefined) ?? \"list\";\n\n if (!context.getPeers) {\n return { error: \"Peer list not configured (no getPeers).\" };\n }\n\n if (!context.sendRpcToNode) {\n return { error: \"Remote node RPC not configured (no sendRpcToNode).\" };\n }\n\n const peers = await context.getPeers();\n const online = peers.filter((p) => p.reachability.state === \"online\");\n\n if (action === \"list\") {\n // List devices with their MCP servers\n const result: Array<{ nodeId: string; name: string; mcpServers: McpServerInfo[] }> = [];\n\n for (const node of online) {\n try {\n const response = (await context.sendRpcToNode(\n node.peerId,\n \"memeloop.mcp.listServers\",\n {},\n )) as {\n servers?: McpServerInfo[];\n };\n const servers = Array.isArray(response?.servers) ? response.servers : [];\n if (servers.length > 0) {\n result.push({\n nodeId: node.peerId,\n name: node.displayName,\n mcpServers: servers,\n });\n }\n } catch {\n // Skip devices that don't support MCP or fail to respond\n }\n }\n\n return { nodes: result };\n }\n\n if (action === \"listTools\") {\n // List all MCP tools across all devices\n const allTools: McpToolInfo[] = [];\n\n for (const node of online) {\n try {\n const response = (await context.sendRpcToNode(\n node.peerId,\n \"memeloop.mcp.listTools\",\n {},\n )) as {\n tools?: Array<{ serverName: string; name: string; description?: string }>;\n };\n const tools = Array.isArray(response?.tools) ? response.tools : [];\n for (const tool of tools) {\n allTools.push({\n nodeId: node.peerId,\n serverName: tool.serverName,\n name: tool.name,\n description: tool.description,\n });\n }\n } catch {\n // Skip devices that don't support MCP or fail to respond\n }\n }\n\n return { tools: allTools };\n }\n\n return { error: `Unknown action: ${action}` };\n};\n\nexport function getMcpForwardToolId(): string {\n return TOOL_ID;\n}\n","import { MEMELOOP_STRUCTURED_TOOL_KEY, truncateToolSummary } from '../structuredToolResult.js';\nimport type { BuiltinToolContext, BuiltinToolImpl } from './types.js';\n\nconst TOOL_ID = 'remoteAgent';\nconst REMOTE_LOG_POLL_INTERVAL_MS = 500;\nconst REMOTE_LOG_IDLE_POLLS = 2;\n\ntype RemoteConversationMessage = {\n messageId?: string;\n role?: string;\n content?: unknown;\n};\n\nfunction messageContentToText(content: unknown): string {\n if (typeof content === 'string') return content;\n if (content == null) return '';\n try {\n return JSON.stringify(content);\n } catch {\n return Object.prototype.toString.call(content);\n }\n}\n\nfunction getRemoteStreamChunkContent(chunk: unknown): unknown {\n if (chunk != null && typeof chunk === 'object' && 'content' in chunk) {\n return Reflect.get(chunk, 'content');\n }\n\n return undefined;\n}\n\nfunction summarizeRemoteMessages(messages: RemoteConversationMessage[]): string {\n const relevant = messages.filter((message) => message.role && message.role !== 'user');\n if (relevant.length === 0) {\n return '(task dispatched; waiting for remote output)';\n }\n const joined = relevant\n .map((message) => {\n const role = typeof message.role === 'string' ? message.role : 'message';\n const content = messageContentToText(message.content).trim();\n return content.length > 0 ? `[${role}] ${content}` : '';\n })\n .filter((line) => line.length > 0)\n .join('\\n');\n return joined.trim() || '(task dispatched; remote messages had no readable content)';\n}\n\nasync function collectRemoteConversationSummary(\n sendRpc: NonNullable<BuiltinToolContext['sendRpcToNode']>,\n nodeId: string,\n conversationId: string,\n timeoutMs: number,\n): Promise<string> {\n const startedAt = Date.now();\n const knownMessageIds = new Set<string>();\n const collectedMessages: RemoteConversationMessage[] = [];\n let idlePolls = 0;\n\n while (Date.now() - startedAt < timeoutMs) {\n const response = (await sendRpc(nodeId, 'memeloop.chat.pullSubAgentLog', {\n conversationId,\n knownMessageIds: [...knownMessageIds],\n })) as { messages?: RemoteConversationMessage[] };\n const newMessages = Array.isArray(response?.messages) ? response.messages : [];\n\n if (newMessages.length > 0) {\n idlePolls = 0;\n for (const message of newMessages) {\n if (typeof message.messageId === 'string' && message.messageId.length > 0) {\n knownMessageIds.add(message.messageId);\n }\n collectedMessages.push(message);\n }\n } else if (collectedMessages.some((message) => message.role && message.role !== 'user')) {\n idlePolls += 1;\n if (idlePolls >= REMOTE_LOG_IDLE_POLLS) {\n break;\n }\n }\n\n await new Promise((resolve) => setTimeout(resolve, REMOTE_LOG_POLL_INTERVAL_MS));\n }\n\n return summarizeRemoteMessages(collectedMessages);\n}\n\nexport const remoteAgentConfigSchema = {\n type: 'object',\n properties: {\n nodeId: { type: 'string', description: 'Target node ID to run the sub-agent on' },\n definitionId: { type: 'string', description: 'Agent definition ID on that node' },\n message: { type: 'string', description: 'Task message for the remote agent' },\n },\n required: ['nodeId', 'definitionId', 'message'],\n} as const;\n\n/** List nodes and their definitions (for tool description / agent choice). No args. */\nexport const remoteAgentListImpl: BuiltinToolImpl = async (_arguments, context) => {\n const getPeers = context.getPeers ? async () => context.getPeers?.() : undefined;\n const sendRpc = context.sendRpcToNode\n ? async (nodeId: string, method: string, parameters: unknown) => context.sendRpcToNode?.(nodeId, method, parameters)\n : undefined;\n\n if (!getPeers) {\n return { nodes: [], error: 'Peer list not configured (no getPeers).' };\n }\n\n const peers = (await getPeers()) ?? [];\n const online = peers.filter((p) => p.reachability.state === 'online');\n const result: { nodeId: string; name: string; definitions?: unknown[] }[] = [];\n\n for (const node of online) {\n const entry: { nodeId: string; name: string; definitions?: unknown[] } = {\n nodeId: node.peerId,\n name: node.displayName,\n };\n if (sendRpc) {\n try {\n const response = (await sendRpc(\n node.peerId,\n 'memeloop.agent.getDefinitions',\n {},\n )) as { definitions?: unknown[] };\n entry.definitions = Array.isArray(response?.definitions) ? response.definitions : [];\n } catch {\n entry.definitions = [];\n }\n }\n result.push(entry);\n }\n\n return { nodes: result };\n};\n\nexport const remoteAgentImpl: BuiltinToolImpl = async (arguments_, context) => {\n const nodeId = arguments_.nodeId as string | undefined;\n const definitionId = arguments_.definitionId as string | undefined;\n const message = arguments_.message as string | undefined;\n\n if (!nodeId || !definitionId || typeof message !== 'string') {\n return remoteAgentListImpl(arguments_, context);\n }\n\n const sendRpc = context.sendRpcToNode\n ? async (nodeId: string, method: string, parameters: unknown) => context.sendRpcToNode?.(nodeId, method, parameters)\n : undefined;\n if (!sendRpc) {\n return {\n error: 'Remote node RPC not configured (no sendRpcToNode). Connect to peer nodes first.',\n };\n }\n\n try {\n const createResult = (await sendRpc(nodeId, 'memeloop.agent.create', {\n definitionId,\n })) as { conversationId?: string };\n const conversationId = createResult?.conversationId;\n if (!conversationId) {\n return { error: 'Remote agent.create did not return conversationId', raw: createResult };\n }\n\n await sendRpc(nodeId, 'memeloop.agent.send', {\n conversationId,\n message,\n });\n\n const subscribeStream = (\n context as BuiltinToolContext & {\n subscribeRemoteStream?: (\n nodeId: string,\n conversationId: string,\n onChunk: (chunk: unknown) => void,\n ) => () => void;\n }\n ).subscribeRemoteStream;\n const streamWaitMs = context.remoteAgentStreamTimeoutMs ?? 30_000;\n const chunks: string[] = [];\n if (subscribeStream) {\n await new Promise<void>((resolve) => {\n const unsub = subscribeStream(nodeId, conversationId, (chunk) => {\n if (typeof chunk === 'string') chunks.push(chunk);\n else {\n const chunkContent = getRemoteStreamChunkContent(chunk);\n if (chunkContent !== undefined) {\n chunks.push(messageContentToText(chunkContent));\n }\n }\n });\n setTimeout(() => {\n unsub();\n resolve();\n }, streamWaitMs);\n });\n }\n\n const fullSummary = chunks.length > 0\n ? chunks.join('').trim()\n : await collectRemoteConversationSummary(sendRpc, nodeId, conversationId, streamWaitMs);\n const shortSummary = truncateToolSummary(fullSummary);\n return {\n summary: fullSummary,\n remoteNodeId: nodeId,\n remoteConversationId: conversationId,\n definitionId,\n [MEMELOOP_STRUCTURED_TOOL_KEY]: {\n summary: shortSummary,\n detailRef: {\n type: 'sub-agent',\n conversationId,\n nodeId,\n },\n },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : messageContentToText(error);\n return { error: `remoteAgent failed: ${message}` };\n }\n};\n\nexport function getRemoteAgentToolId(): string {\n return TOOL_ID;\n}\n","import { MEMELOOP_STRUCTURED_TOOL_KEY, truncateToolSummary } from \"../structuredToolResult.js\";\nimport type { BuiltinToolImpl } from \"./types.js\";\n\nconst TOOL_ID = \"spawnAgent\";\n\nexport const spawnAgentConfigSchema = {\n type: \"object\",\n properties: {\n definitionId: { type: \"string\", description: \"Agent definition ID to use for the sub-agent\" },\n message: { type: \"string\", description: \"User message / task for the sub-agent\" },\n },\n required: [\"definitionId\", \"message\"],\n} as const;\n\nexport const spawnAgentImpl: BuiltinToolImpl = async (arguments_, context) => {\n const definitionId = arguments_.definitionId as string | undefined;\n const message = arguments_.message as string | undefined;\n\n if (!definitionId || typeof message !== \"string\") {\n return { error: \"spawnAgent requires definitionId and message\" };\n }\n\n if (!context.runLocalAgent) {\n return {\n error: \"Local agent runner not configured (no runLocalAgent in context).\",\n };\n }\n\n const conversationId = `spawn:${definitionId}:${Date.now().toString(36)}`;\n const chunks: string[] = [];\n\n try {\n for await (const step of context.runLocalAgent({ conversationId, message })) {\n if (step.type === \"message\" && typeof step.data === \"string\") {\n chunks.push(step.data);\n }\n if (\n step.type === \"message\" &&\n step.data != null &&\n typeof step.data === \"object\" &&\n \"content\" in step.data\n ) {\n const c = (step.data as { content?: string }).content;\n if (typeof c === \"string\") chunks.push(c);\n }\n }\n const fullSummary = chunks.join(\"\").trim() || \"(no text output)\";\n const shortSummary = truncateToolSummary(fullSummary);\n const nodeId = context.localNodeId?.trim() || \"local\";\n return {\n summary: fullSummary,\n conversationId,\n definitionId,\n [MEMELOOP_STRUCTURED_TOOL_KEY]: {\n summary: shortSummary,\n detailRef: {\n type: \"sub-agent\",\n conversationId,\n nodeId,\n },\n },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { error: `spawnAgent failed: ${message}`, conversationId };\n }\n};\n\nexport function getSpawnAgentToolId(): string {\n return TOOL_ID;\n}\n","import type { AgentDefinition as ProtocolAgentDefinition } from './types.js';\n\n/**\n * Extended agent definition used by the agent profile registry.\n * Wraps the protocol-level AgentDefinition with additional runtime metadata.\n */\nexport interface AgentProfile {\n /** Unique ID for this agent (matches protocol id convention like \"memeloop:build\") */\n id: string;\n /** Display name */\n name: string;\n /** Agent type / role */\n type: AgentProfileType;\n /** System prompt / instructions for the agent */\n prompt: string;\n /** Tool permission rules (mutually exclusive with permissive defaults) */\n permissions: ToolPermissionRules;\n /** Optional model override (provider/model string) */\n model?: string;\n /** Underlying protocol-compatible definition for framework integration */\n protocolDef: ProtocolAgentDefinition;\n}\n\nexport type AgentProfileType = 'build' | 'plan' | 'explore' | 'oracle' | 'librarian';\n\nexport interface ToolPermissionRules {\n /** Default action for tools not matching any rule */\n default: 'allow' | 'ask' | 'deny';\n /** Per-tool or wildcard rules */\n rules: Array<{ pattern: string; action: 'allow' | 'ask' | 'deny' }>;\n}\n\nfunction makeBuiltinDefinition(\n id: string,\n name: string,\n type: AgentProfileType,\n prompt: string,\n permissions: ToolPermissionRules,\n model?: string,\n): AgentProfile {\n const systemPrompt = prompt;\n const tools: string[] = []; // runtime tools; permissions govern access\n return {\n id,\n name,\n type,\n prompt,\n permissions,\n model,\n protocolDef: {\n id,\n name,\n description: prompt.slice(0, 200),\n systemPrompt,\n tools,\n version: '1.0.0',\n modelConfig: model\n ? {\n provider: model.split('/')[0] ?? 'memeloop',\n model: model.split('/').slice(1).join('/') || model,\n }\n : undefined,\n },\n };\n}\n\n/**\n * Build agent: full access, default model.\n * Primary agent for executing tasks, writing code, running commands.\n */\nexport const buildAgent: AgentProfile = makeBuiltinDefinition(\n 'memeloop:build',\n 'Build Agent',\n 'build',\n \"You are a build agent capable of executing tasks, writing and editing files, running commands, and making changes. Use tools to accomplish the user's goals efficiently.\",\n { default: 'allow', rules: [] },\n);\n\n/**\n * Plan agent: read-only, denies file edits and terminal execution.\n * Used for high-level planning and task decomposition.\n */\nexport const planAgent: AgentProfile = makeBuiltinDefinition(\n 'memeloop:plan',\n 'Plan Agent',\n 'plan',\n 'You are a planning agent. Your role is to analyze requirements, decompose tasks, and create structured plans. You CANNOT write files or execute terminal commands. Only use read and search tools.',\n {\n default: 'deny',\n rules: [\n { pattern: 'file.read', action: 'allow' },\n { pattern: 'file.search', action: 'allow' },\n { pattern: 'file.list', action: 'allow' },\n { pattern: 'grep.search', action: 'allow' },\n { pattern: 'glob.*', action: 'allow' },\n ],\n },\n);\n\n/**\n * Explore agent: read + search tools only.\n * Fast search and codebase exploration without modification.\n */\nexport const exploreAgent: AgentProfile = makeBuiltinDefinition(\n 'memeloop:explore',\n 'Explore Agent',\n 'explore',\n 'You are an exploration agent specialized in fast codebase search and discovery. You have read and search tools. Do NOT modify files or run terminal commands. Focus on finding relevant code, files, and patterns.',\n {\n default: 'deny',\n rules: [\n { pattern: 'file.read', action: 'allow' },\n { pattern: 'file.search', action: 'allow' },\n { pattern: 'file.list', action: 'allow' },\n { pattern: 'grep.search', action: 'allow' },\n { pattern: 'glob.*', action: 'allow' },\n { pattern: 'lsp.*', action: 'allow' },\n ],\n },\n);\n\n/**\n * Oracle agent: read-only, for architecture consultation and code review.\n */\nexport const oracleAgent: AgentProfile = makeBuiltinDefinition(\n 'memeloop:oracle',\n 'Oracle Agent',\n 'oracle',\n 'You are an oracle agent specialized in architecture analysis, code review, and constraint verification. You have read access only. Review code, identify issues, and provide expert architectural guidance.',\n {\n default: 'deny',\n rules: [\n { pattern: 'file.read', action: 'allow' },\n { pattern: 'file.search', action: 'allow' },\n { pattern: 'file.list', action: 'allow' },\n { pattern: 'grep.search', action: 'allow' },\n { pattern: 'glob.*', action: 'allow' },\n { pattern: 'lsp.*', action: 'allow' },\n ],\n },\n);\n\n/**\n * Librarian agent: read + web search tools only.\n * External documentation lookup and context gathering.\n */\nexport const librarianAgent: AgentProfile = makeBuiltinDefinition(\n 'memeloop:librarian',\n 'Librarian Agent',\n 'librarian',\n 'You are a librarian agent specialized in external documentation lookup, web search, and context gathering. Use web search tools to find relevant documentation, APIs, and examples. Do NOT modify files or run terminal commands.',\n {\n default: 'deny',\n rules: [\n { pattern: 'file.read', action: 'allow' },\n { pattern: 'file.search', action: 'allow' },\n { pattern: 'file.list', action: 'allow' },\n { pattern: 'web.*', action: 'allow' },\n { pattern: 'grep.search', action: 'allow' },\n { pattern: 'glob.*', action: 'allow' },\n ],\n },\n);\n\n/** Built-in agent profiles used by the task delegation tool. */\nexport const BUILTIN_AGENT_PROFILES: AgentProfile[] = [\n buildAgent,\n planAgent,\n exploreAgent,\n oracleAgent,\n librarianAgent,\n];\n","import type { AgentProfile, AgentProfileType } from './agentProfiles.js';\nimport { BUILTIN_AGENT_PROFILES } from './agentProfiles.js';\n\n/**\n * Registry for agent profiles used by task delegation.\n * Pre-seeded with built-in profiles (build, plan, explore, oracle, librarian).\n */\nexport class AgentProfileRegistry {\n private readonly profiles = new Map<string, AgentProfile>();\n\n constructor() {\n this.seedDefaults();\n }\n\n /** Seed the registry with built-in agent profiles. */\n private seedDefaults(): void {\n for (const profile of BUILTIN_AGENT_PROFILES) {\n this.profiles.set(profile.id, profile);\n }\n }\n\n /**\n * Register a new agent profile or override an existing one.\n * Throws if the profile is invalid.\n */\n registerAgentProfile(profile: AgentProfile): void {\n if (!profile.id || typeof profile.id !== 'string' || profile.id.trim().length === 0) {\n throw new Error('Agent profile must have a non-empty id');\n }\n if (!profile.name || typeof profile.name !== 'string') {\n throw new Error('Agent profile must have a name');\n }\n if (!profile.type || typeof profile.type !== 'string') {\n throw new Error('Agent profile must have a type');\n }\n if (!profile.prompt || typeof profile.prompt !== 'string') {\n throw new Error('Agent profile must have a prompt');\n }\n if (!profile.permissions || typeof profile.permissions.default !== 'string') {\n throw new Error('Agent profile must have valid permissions');\n }\n this.profiles.set(profile.id, profile);\n }\n\n /**\n * Get an agent profile by ID.\n * Returns undefined if not found.\n */\n getAgentProfile(id: string): AgentProfile | undefined {\n return this.profiles.get(id);\n }\n\n /**\n * List all registered agent profiles.\n */\n listAgentProfiles(): AgentProfile[] {\n return Array.from(this.profiles.values());\n }\n\n /**\n * List agent profiles filtered by type.\n */\n listAgentProfilesByType(type: AgentProfileType): AgentProfile[] {\n return this.listAgentProfiles().filter((profile) => profile.type === type);\n }\n\n /**\n * Remove an agent profile by ID.\n */\n unregisterAgentProfile(id: string): boolean {\n return this.profiles.delete(id);\n }\n\n /**\n * Reset the registry to only built-in defaults.\n */\n reset(): void {\n this.profiles.clear();\n this.seedDefaults();\n }\n}\n\n/** Shared singleton instance for convenience. */\nlet defaultRegistry: AgentProfileRegistry | null = null;\n\nexport function getAgentProfileRegistry(): AgentProfileRegistry {\n if (!defaultRegistry) {\n defaultRegistry = new AgentProfileRegistry();\n }\n return defaultRegistry;\n}\n\nexport function resetAgentProfileRegistry(): void {\n if (defaultRegistry) {\n defaultRegistry.reset();\n }\n defaultRegistry = null;\n}\n","import { getAgentProfileRegistry } from '../../agent/agentProfileRegistry.js';\nimport { MEMELOOP_STRUCTURED_TOOL_KEY, truncateToolSummary } from '../structuredToolResult.js';\nimport type { BuiltinToolImpl } from './types.js';\n\nconst TOOL_ID = 'task';\n\nexport const taskToolConfigSchema = {\n type: 'object',\n properties: {\n agent: {\n type: 'string',\n description: \"Agent ID to delegate to (e.g. 'memeloop:build', 'memeloop:explore')\",\n },\n prompt: {\n type: 'string',\n description: 'Task prompt / instructions for the delegated agent',\n },\n background: {\n type: 'boolean',\n description: 'If true, runs asynchronously and returns a task ID immediately',\n },\n },\n required: ['agent', 'prompt'],\n} as const;\n\n/**\n * Check if we're already nested too deep in sub-agents.\n * The conversationId format for sub-agents is `agentId:timestamp`.\n * We check the current conversation for nesting depth heuristics.\n */\nfunction isTooDeeplyNested(context: { activeToolConversationId?: string }): boolean {\n const cid = context.activeToolConversationId;\n if (!cid) return false;\n // Count how many colons indicate nesting depth\n const depth = cid.split(':').length - 1;\n // Allow up to 2 levels of nesting (agent:sub:timestamp = 2 colons)\n return depth > 2;\n}\n\n/**\n * Set up per-agent tool permissions on the framework context so that\n * the TaskAgent's resolveToolPermission picks up the agent's restrictions.\n */\nfunction applyAgentPermissions(\n context: { taskAgent?: { toolPermissions?: Record<string, unknown> } },\n agentId: string,\n defaultAction: 'allow' | 'ask' | 'deny',\n rules: Array<{ pattern: string; action: 'allow' | 'ask' | 'deny' }>,\n): void {\n const tp = context.taskAgent ?? (context.taskAgent = {});\n const tperm = (tp.toolPermissions ?? (tp.toolPermissions = {})) as {\n perAgent?: Record<\n string,\n { default?: string; rules?: Array<{ pattern: string; action: string }> }\n >;\n };\n const perAgent = tperm.perAgent ?? (tperm.perAgent = {});\n perAgent[agentId] = { default: defaultAction, rules };\n}\n\nexport const taskToolImpl: BuiltinToolImpl = async (arguments_, context) => {\n const agentId = arguments_.agent as string | undefined;\n const prompt = arguments_.prompt as string | undefined;\n const background = arguments_.background as boolean | undefined;\n\n if (!agentId || typeof prompt !== 'string' || prompt.trim().length === 0) {\n return { error: \"task requires 'agent' (string) and 'prompt' (non-empty string)\" };\n }\n\n if (isTooDeeplyNested(context)) {\n return {\n error: 'Maximum agent nesting depth exceeded. Cannot delegate further.',\n };\n }\n\n const registry = getAgentProfileRegistry();\n const agentProfile = registry.getAgentProfile(agentId);\n if (!agentProfile) {\n const available = registry\n .listAgentProfiles()\n .map((a) => a.id)\n .join(', ');\n return {\n error: `Agent \"${agentId}\" not found in registry. Available: [${available}]`,\n };\n }\n\n // Apply agent-specific tool permission rules\n applyAgentPermissions(\n context as { taskAgent?: { toolPermissions?: Record<string, unknown> } },\n agentProfile.id,\n agentProfile.permissions.default,\n agentProfile.permissions.rules,\n );\n\n const timestamp = Date.now().toString(36);\n const conversationId = `${agentProfile.id}:${timestamp}`;\n\n const runLocal = context.runLocalAgent?.bind(context);\n if (!runLocal) {\n return {\n error: 'Local agent runner not configured (no runLocalAgent in context).',\n };\n }\n\n // Helper to collect text from generator steps\n async function collectOutput(\n gen: AsyncIterable<{ type: string; data?: unknown }>,\n ): Promise<{ text: string; conversationId: string }> {\n const chunks: string[] = [];\n for await (const step of gen) {\n if (step.type === 'message') {\n if (typeof step.data === 'string') {\n chunks.push(step.data);\n } else if (step.data != null && typeof step.data === 'object' && 'content' in step.data) {\n const c = (step.data as { content?: string }).content;\n if (typeof c === 'string') chunks.push(c);\n }\n }\n }\n return { text: chunks.join('').trim() || '(no text output)', conversationId };\n }\n\n if (background) {\n // Fire-and-forget: collect output asynchronously without awaiting\n const gen = runLocal({ conversationId, message: prompt });\n void collectOutput(gen).catch(() => {\n /* background errors are non-fatal */\n });\n\n const nodeId = context.localNodeId?.trim() || 'local';\n return {\n summary: `Background task \"${agentId}\" launched. Task ID: ${conversationId}`,\n conversationId,\n agentId,\n taskId: conversationId,\n background: true,\n [MEMELOOP_STRUCTURED_TOOL_KEY]: {\n summary: `[bg-task] ${agentId}: ${conversationId}`,\n detailRef: {\n type: 'sub-agent' as const,\n conversationId,\n nodeId,\n },\n },\n };\n }\n\n // Synchronous: run inline and return result\n try {\n const gen = runLocal({ conversationId, message: prompt });\n const { text, conversationId: cid } = await collectOutput(gen);\n\n const shortSummary = truncateToolSummary(text);\n const nodeId = context.localNodeId?.trim() || 'local';\n return {\n result: text,\n conversationId: cid,\n agentId,\n [MEMELOOP_STRUCTURED_TOOL_KEY]: {\n summary: shortSummary,\n detailRef: {\n type: 'sub-agent' as const,\n conversationId: cid,\n nodeId,\n },\n },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n error: `Task execution failed: ${message}`,\n conversationId,\n agentId,\n };\n }\n};\n\nexport function getTaskToolId(): string {\n return TOOL_ID;\n}\n","/**\n * TodoWrite Tool — Manage structured todo lists stored in conversation context.\n *\n * Supports operations: create, update, complete, list, remove.\n * Todo state is stored in-memory per conversation, keyed by conversationId.\n */\nimport { z } from 'zod';\n\nimport type { BuiltinToolContext } from './types.js';\n\nexport const todoWriteConfigSchema = z.object({\n action: z\n .enum(['create', 'update', 'complete', 'list', 'remove'])\n .describe('Action: create, update, complete, list, or remove'),\n id: z.string().min(1).optional().describe('Todo item ID (required for update/complete/remove)'),\n content: z.string().min(1).optional().describe('Todo item content (required for create/update)'),\n status: z\n .enum(['pending', 'in_progress', 'completed', 'cancelled'])\n .optional()\n .describe(\"Status (defaults to 'pending' for create)\"),\n priority: z\n .enum(['high', 'medium', 'low'])\n .optional()\n .default('medium')\n .describe('Priority level'),\n});\n\nexport const TODO_WRITE_TOOL_ID = 'todoWrite';\n\ninterface TodoItem {\n id: string;\n content: string;\n status: 'pending' | 'in_progress' | 'completed' | 'cancelled';\n priority: 'high' | 'medium' | 'low';\n createdAt: number;\n updatedAt: number;\n}\n\n/**\n * In-memory per-conversation todo store.\n * In production this could be backed by IAgentStorage for persistence.\n */\nconst conversationTodos = new Map<string, Map<string, TodoItem>>();\n\n/** Exported for test cleanup. */\nexport function __clearTodoStore(): void {\n conversationTodos.clear();\n}\n\nfunction getConversationTodos(\n conversationId: string,\n): Map<string, TodoItem> {\n let todos = conversationTodos.get(conversationId);\n if (!todos) {\n todos = new Map<string, TodoItem>();\n conversationTodos.set(conversationId, todos);\n }\n return todos;\n}\n\nfunction formatTodoList(todos: Map<string, TodoItem>): string {\n if (todos.size === 0) {\n return '(No todos)';\n }\n\n const statusOrder: Record<string, number> = {\n in_progress: 0,\n pending: 1,\n completed: 2,\n cancelled: 3,\n };\n\n const sorted = [...todos.values()].sort(\n (a, b) =>\n (statusOrder[a.status] ?? 99) - (statusOrder[b.status] ?? 99) ||\n b.updatedAt - a.updatedAt,\n );\n\n const statusIcons: Record<string, string> = {\n pending: '○',\n in_progress: '◉',\n completed: '✓',\n cancelled: '✗',\n };\n\n return sorted\n .map(\n (t) => `${statusIcons[t.status] ?? '?'} [${t.priority}] ${t.content} (id: ${t.id})`,\n )\n .join('\\n');\n}\n\nfunction getConversationId(context: BuiltinToolContext): string {\n return context.agent?.id ?? context.activeToolConversationId ?? 'default';\n}\n\nexport async function todoWriteImpl(\n arguments_: Record<string, unknown>,\n context: BuiltinToolContext,\n): Promise<{ result: string } | { error: string }> {\n const parsed = todoWriteConfigSchema.safeParse(arguments_);\n if (!parsed.success) {\n return { error: `invalid_todoWrite_args: ${parsed.error.message}` };\n }\n\n const { action, id, content, status, priority } = parsed.data;\n const conversationId = getConversationId(context);\n const todos = getConversationTodos(conversationId);\n const now = Date.now();\n\n switch (action) {\n case 'create': {\n if (!content) {\n return { error: 'content is required for create action' };\n }\n const newId = id ?? crypto.randomUUID();\n if (todos.has(newId)) {\n return { error: `Todo with id '${newId}' already exists. Use update action.` };\n }\n const item: TodoItem = {\n id: newId,\n content,\n status: status ?? 'pending',\n priority,\n createdAt: now,\n updatedAt: now,\n };\n todos.set(newId, item);\n return {\n result: `Todo created: [${item.priority}] ${item.content} (id: ${item.id})\\n\\n${formatTodoList(todos)}`,\n };\n }\n\n case 'update': {\n if (!id) {\n return { error: 'id is required for update action' };\n }\n const existing = todos.get(id);\n if (!existing) {\n return { error: `Todo with id '${id}' not found` };\n }\n if (content !== undefined) existing.content = content;\n if (status !== undefined) existing.status = status;\n existing.priority = priority ?? existing.priority;\n existing.updatedAt = now;\n return {\n result: `Todo updated: [${existing.priority}] ${existing.content} (id: ${existing.id}, status: ${existing.status})\\n\\n${formatTodoList(todos)}`,\n };\n }\n\n case 'complete': {\n if (!id) {\n return { error: 'id is required for complete action' };\n }\n const existing = todos.get(id);\n if (!existing) {\n return { error: `Todo with id '${id}' not found` };\n }\n existing.status = 'completed';\n existing.updatedAt = now;\n return {\n result: `Todo completed: [${existing.priority}] ${existing.content} (id: ${existing.id})\\n\\n${formatTodoList(todos)}`,\n };\n }\n\n case 'remove': {\n if (!id) {\n // Remove all completed/cancelled todos\n let removed = 0;\n for (const [key, item] of todos) {\n if (item.status === 'completed' || item.status === 'cancelled') {\n todos.delete(key);\n removed++;\n }\n }\n return {\n result: `Removed ${removed} completed/cancelled todo(s)\\n\\n${formatTodoList(todos)}`,\n };\n }\n const removed = todos.delete(id);\n return {\n result: removed\n ? `Todo removed: ${id}\\n\\n${formatTodoList(todos)}`\n : `Todo with id '${id}' not found\\n\\n${formatTodoList(todos)}`,\n };\n }\n\n case 'list':\n default: {\n return {\n result: `Todo list (${todos.size} items):\\n\\n${formatTodoList(todos)}`,\n };\n }\n }\n}\n","/**\n * Builtin tool plugins — registers core tools as LoopPlugin entries.\n *\n * Each tool is a separate LoopPlugin that can be overridden by user/host plugins\n * with the same id. The plugin.install callback calls the tool registry to\n * register the tool implementation.\n *\n * These are registered in the loop registry at startup and loaded by\n * `registerBuiltinTools` via plugin discovery.\n */\n\nimport { registerToolParameterSchema } from '../../tools/schemaRegistry.js';\nimport type { IToolRegistry } from '../../types.js';\nimport { getLoopRegistry } from '../registry.js';\nimport type { LoopPlugin } from '../types.js';\n\n// ─── Import tool implementations ─────────────────────────────────────\n\nimport { ASK_QUESTION_TOOL_ID, askQuestionConfigSchema, askQuestionImpl } from '../../tools/builtins/askQuestion.js';\nimport { ASK_USER_QUESTION_TOOL_ID, askUserQuestionConfigSchema, askUserQuestionImpl } from '../../tools/builtins/askUserQuestion.js';\nimport { getMcpClientToolId, mcpClientConfigSchema, mcpClientImpl } from '../../tools/builtins/mcpClient.js';\nimport { getMcpForwardToolId, mcpForwardConfigSchema, mcpForwardImpl } from '../../tools/builtins/mcpForward.js';\nimport { getRemoteAgentToolId, remoteAgentConfigSchema, remoteAgentImpl } from '../../tools/builtins/remoteAgent.js';\nimport { getSpawnAgentToolId, spawnAgentConfigSchema, spawnAgentImpl } from '../../tools/builtins/spawnAgent.js';\nimport { getTaskToolId, taskToolConfigSchema, taskToolImpl } from '../../tools/builtins/task.js';\nimport { TODO_WRITE_TOOL_ID, todoWriteConfigSchema, todoWriteImpl } from '../../tools/builtins/todoWrite.js';\nimport type { BuiltinToolContext, BuiltinToolImpl } from '../../tools/builtins/types.js';\n\n// ─── Plugin id constants ───────────────────────────────────────────\n\nexport const PLUGIN_MCP_CLIENT = 'builtin:mcp-client';\nexport const PLUGIN_MCP_FORWARD = 'builtin:mcp-forward';\nexport const PLUGIN_SPAWN_AGENT = 'builtin:spawn-agent';\nexport const PLUGIN_REMOTE_AGENT = 'builtin:remote-agent';\nexport const PLUGIN_ASK_QUESTION = 'builtin:ask-question';\nexport const PLUGIN_TODO_WRITE = 'builtin:todo-write';\nexport const PLUGIN_ASK_USER_QUESTION = 'builtin:ask-user-question';\nexport const PLUGIN_TASK = 'builtin:task';\n\nexport const BUILTIN_TOOL_PLUGIN_IDS = [\n PLUGIN_MCP_CLIENT,\n PLUGIN_MCP_FORWARD,\n PLUGIN_SPAWN_AGENT,\n PLUGIN_REMOTE_AGENT,\n PLUGIN_ASK_QUESTION,\n PLUGIN_TODO_WRITE,\n PLUGIN_ASK_USER_QUESTION,\n PLUGIN_TASK,\n] as const;\n\ninterface BuiltinToolPluginOptions {\n id: string;\n toolId: string;\n schema: unknown;\n metadata: { displayName: string; description: string };\n implementation: BuiltinToolImpl;\n}\n\nfunction getToolRegistry(context: { [key: string]: unknown }): IToolRegistry | undefined {\n return context.toolRegistry as IToolRegistry | undefined;\n}\n\nfunction createBuiltinToolPlugin(options: BuiltinToolPluginOptions): LoopPlugin {\n return {\n id: options.id,\n targetLoopId: '*',\n install: (context) => {\n const registry = getToolRegistry(context);\n if (!registry) return;\n\n const builtinContext = context as unknown as BuiltinToolContext;\n registry.registerTool(options.toolId, (arguments_: Record<string, unknown>) => options.implementation(arguments_, builtinContext));\n registerToolParameterSchema(options.toolId, options.schema, options.metadata);\n },\n };\n}\n\nconst builtinToolPlugins: LoopPlugin[] = [\n createBuiltinToolPlugin({\n id: PLUGIN_MCP_CLIENT,\n toolId: getMcpClientToolId(),\n schema: mcpClientConfigSchema,\n metadata: {\n displayName: 'MCP Client',\n description: 'Call a tool on a remote MCP server (transparent proxy). Requires nodeId, serverName, toolName, and optional args.',\n },\n implementation: mcpClientImpl,\n }),\n createBuiltinToolPlugin({\n id: PLUGIN_MCP_FORWARD,\n toolId: getMcpForwardToolId(),\n schema: mcpForwardConfigSchema,\n metadata: {\n displayName: 'MCP Forward',\n description: \"Discover MCP servers and tools on connected nodes. Use action='list' for nodes with servers, action='listTools' for all available tools.\",\n },\n implementation: mcpForwardImpl,\n }),\n createBuiltinToolPlugin({\n id: PLUGIN_SPAWN_AGENT,\n toolId: getSpawnAgentToolId(),\n schema: spawnAgentConfigSchema,\n metadata: {\n displayName: 'Spawn Agent',\n description: 'Run a local sub-agent with the given definition and message. Returns summary.',\n },\n implementation: spawnAgentImpl,\n }),\n createBuiltinToolPlugin({\n id: PLUGIN_REMOTE_AGENT,\n toolId: getRemoteAgentToolId(),\n schema: remoteAgentConfigSchema,\n metadata: {\n displayName: 'Remote Agent',\n description: 'Create and run a sub-agent on a remote node. Requires nodeId, definitionId, message. List nodes with no args.',\n },\n implementation: remoteAgentImpl,\n }),\n createBuiltinToolPlugin({\n id: PLUGIN_ASK_QUESTION,\n toolId: ASK_QUESTION_TOOL_ID,\n schema: askQuestionConfigSchema,\n metadata: {\n displayName: 'Ask Question',\n description: 'Block until the user answers (via memeloop.agent.resolveQuestion RPC). Args: question, conversationId, optional timeoutMs.',\n },\n implementation: askQuestionImpl,\n }),\n createBuiltinToolPlugin({\n id: PLUGIN_TODO_WRITE,\n toolId: TODO_WRITE_TOOL_ID,\n schema: todoWriteConfigSchema,\n metadata: {\n displayName: 'Todo Write',\n description: 'Manage structured todo lists: create, update, complete, list, remove. Todos scoped per conversation.',\n },\n implementation: todoWriteImpl,\n }),\n createBuiltinToolPlugin({\n id: PLUGIN_ASK_USER_QUESTION,\n toolId: ASK_USER_QUESTION_TOOL_ID,\n schema: askUserQuestionConfigSchema,\n metadata: {\n displayName: 'Ask User Question',\n description: 'Pause agent and ask user a question. Supports text, single-select, and multi-select input types. Blocks until answered.',\n },\n implementation: askUserQuestionImpl,\n }),\n createBuiltinToolPlugin({\n id: PLUGIN_TASK,\n toolId: getTaskToolId(),\n schema: taskToolConfigSchema,\n metadata: {\n displayName: 'Task Delegation',\n description: 'Delegate a task to a specialized sub-agent (build, plan, explore, oracle, librarian). Supports sync (default) and background modes.',\n },\n implementation: taskToolImpl,\n }),\n];\n\nexport function getBuiltinToolPlugins(): LoopPlugin[] {\n return builtinToolPlugins;\n}\n\n/** Register all builtin tool plugins with the loop registry. */\nexport function registerBuiltinToolPlugins(): void {\n const loopRegistry = getLoopRegistry();\n\n for (const plugin of builtinToolPlugins) {\n if (loopRegistry.getPlugin(plugin.id)) continue;\n loopRegistry.registerPlugin(plugin);\n }\n}\n","/**\n * Token counting and auto-compaction trigger.\n * Tracks token usage per conversation and triggers compaction when approaching limits.\n *\n * Based on: Claude Code autoCompact + OpenCode autoCompact@95%\n */\n\n/** Rough token estimation: ~4 chars per token (conservative) */\nexport function estimateTokens(text: string): number {\n return Math.ceil(text.length / 3.5);\n}\n\n/** Estimate token count for a messages array */\nexport function estimateMessagesTokens(messages: Array<{ content: unknown }>): 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 += estimateTokens(content);\n }\n return total;\n}\n\nexport interface TokenTrackerConfig {\n /** Maximum context window in tokens (default: 200000) */\n contextWindow?: number;\n /** Trigger compaction when usage exceeds this fraction (default: 0.90) */\n compactionThreshold?: number;\n /** Buffer tokens reserved for output (default: 16000) */\n outputBuffer?: number;\n}\n\nexport interface TokenUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n contextWindow: number;\n usagePercent: number;\n shouldCompact: boolean;\n}\n\n/**\n * Tracks token usage and decides when to trigger auto-compaction.\n */\nexport class TokenTracker {\n private promptTokens = 0;\n private completionTokens = 0;\n private readonly contextWindow: number;\n private readonly compactionThreshold: number;\n private readonly outputBuffer: number;\n private compacting = false;\n private consecutiveCompactionFailures = 0;\n private maxConsecutiveFailures = 3;\n\n constructor(config?: TokenTrackerConfig) {\n this.contextWindow = config?.contextWindow ?? 200_000;\n this.compactionThreshold = config?.compactionThreshold ?? 0.9;\n this.outputBuffer = config?.outputBuffer ?? 16_000;\n }\n\n /** Record token usage from an LLM response */\n recordUsage(promptTokens: number, completionTokens: number): void {\n this.promptTokens += promptTokens;\n this.completionTokens += completionTokens;\n }\n\n /** Manually set the prompt token count (e.g., from estimation) */\n setPromptTokens(tokens: number): void {\n this.promptTokens = tokens;\n }\n\n /** Get current usage */\n getUsage(): TokenUsage {\n const total = this.promptTokens + this.completionTokens;\n const effectiveWindow = this.contextWindow - this.outputBuffer;\n const usagePercent = total / effectiveWindow;\n return {\n promptTokens: this.promptTokens,\n completionTokens: this.completionTokens,\n totalTokens: total,\n contextWindow: this.contextWindow,\n usagePercent: Math.min(usagePercent, 1.0),\n shouldCompact: usagePercent >= this.compactionThreshold && !this.compacting,\n };\n }\n\n /** Check if auto-compaction should be triggered */\n shouldTriggerCompaction(): boolean {\n if (this.consecutiveCompactionFailures >= this.maxConsecutiveFailures) return false;\n return this.getUsage().shouldCompact;\n }\n\n /** Mark that compaction is starting */\n markCompactionStart(): void {\n this.compacting = true;\n }\n\n /** Mark that compaction succeeded — reset token counts */\n markCompactionSuccess(estimatedPostTokens: number): void {\n this.compacting = false;\n this.promptTokens = estimatedPostTokens;\n this.completionTokens = 0;\n this.consecutiveCompactionFailures = 0;\n }\n\n /** Mark that compaction failed */\n markCompactionFailure(): void {\n this.compacting = false;\n this.consecutiveCompactionFailures++;\n }\n\n /** Reset all counters */\n reset(): void {\n this.promptTokens = 0;\n this.completionTokens = 0;\n this.compacting = false;\n this.consecutiveCompactionFailures = 0;\n }\n\n /** Get a human-readable summary */\n formatUsage(): string {\n const usage = this.getUsage();\n const promptK = (usage.promptTokens / 1000).toFixed(1);\n const windowK = (usage.contextWindow / 1000).toFixed(0);\n const pct = (usage.usagePercent * 100).toFixed(1);\n return `${promptK}K/${windowK}K tokens (${pct}%)`;\n }\n}\n\n/** Interface for a compaction engine that can summarize conversation history */\nexport interface CompactionEngine {\n compact(\n messages: Array<{ role: string; content: unknown }>,\n conversationId: string,\n ): Promise<void>;\n}\n\n/**\n * Auto-compaction hook — call this after each LLM response.\n * Triggers compaction when token usage exceeds threshold.\n *\n * @returns true if compaction was triggered\n */\nexport async function maybeAutoCompact(\n tracker: TokenTracker,\n compactionEngine: CompactionEngine,\n messages: Array<{ role: string; content: unknown }>,\n conversationId: string,\n): Promise<boolean> {\n if (!tracker.shouldTriggerCompaction()) return false;\n\n tracker.markCompactionStart();\n try {\n await compactionEngine.compact(messages, conversationId);\n const estimatedPost = estimateTokens('Summary of previous conversation context.');\n tracker.markCompactionSuccess(estimatedPost);\n return true;\n } catch {\n tracker.markCompactionFailure();\n return false;\n }\n}\n","{\n \"id\": \"memeloop:code-assistant\",\n \"name\": \"代码助手\",\n \"description\": \"专注于代码编写、重构和调试的助手。\",\n \"loopId\": \"llm-io\",\n \"systemPrompt\": \"You are a senior software engineer helping the user write and refactor code.\",\n \"tools\": [\n \"workspacesList\",\n \"wikiSearch\",\n \"wikiOperation\",\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\": \"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\": \"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 \"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\": \"llm-io\",\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 \"id\": \"memeloop:general-assistant\",\n \"name\": \"通用助手\",\n \"description\": \"通用自然语言助理,用于日常问答和简单任务。\",\n \"loopId\": \"llm-io\",\n \"systemPrompt\": \"You are a helpful general-purpose assistant. When you need to use a tool, output ONLY the tool call in this exact XML format:\\n<tool_use name=\\\"TOOL_NAME\\\">{\\\"param\\\":\\\"value\\\"}</tool_use>\\nNever wrap tool calls in markdown code blocks or add explanatory text before/after the tool call in the same message. After receiving the tool result, continue responding normally.\",\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 ],\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 \"agentFrameworkConfig\": {\n \"prompts\": [\n {\n \"id\": \"builtin-system\",\n \"role\": \"system\",\n \"text\": \"You are a helpful general-purpose assistant. When you need to use a tool, output ONLY the tool call in this exact XML format:\\n<tool_use name=\\\"TOOL_NAME\\\">{\\\"param\\\":\\\"value\\\"}</tool_use>\\nNever wrap tool calls in markdown code blocks or add explanatory text before/after the tool call in the same message. After receiving the tool result, continue responding normally.\"\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.0.0\"\n}\n","{\n \"id\": \"memeloop:git-master\",\n \"name\": \"Git Master\",\n \"description\": \"Expert git workflow management with safety-first approach.\",\n \"loopId\": \"llm-io\",\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 \"id\": \"memeloop:playwright\",\n \"name\": \"Playwright\",\n \"description\": \"Browser automation via Playwright for verification, browsing, information gathering, web scraping, testing, and screenshots.\",\n \"loopId\": \"llm-io\",\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 * 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 '../agentLoops/registry.js';\nimport type { LoopProfile } from '../agentLoops/types.js';\n\n// Built-in profiles are imported as JSON.\n// Each JSON file is a LoopProfile with loopId defaulting to \"llm-io\".\nimport codeAssistant from './code-assistant.json';\nimport frontendUiUx from './frontend-ui-ux.json';\nimport generalAssistant from './general-assistant.json';\nimport gitMaster from './git-master.json';\nimport playwright from './playwright.json';\n\n/** Get all built-in Loop Profiles. */\nexport function getBuiltinLoopProfiles(): LoopProfile[] {\n return [\n generalAssistant,\n codeAssistant,\n frontendUiUx,\n gitMaster,\n playwright,\n ] as unknown as LoopProfile[];\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","import { getActivePluginRegistry } from '../tools/pluginRegistry.js';\nimport type { PromptConcatHooks, PromptConcatTool } from '../tools/types.js';\n\nimport type { PromptNode } from './types.js';\n\nexport const FULL_REPLACEMENT_PLUGIN_TOOL_ID = 'fullReplacement';\nexport const DYNAMIC_POSITION_PLUGIN_TOOL_ID = 'dynamicPosition';\n\nfunction registerFullReplacement(reg: Map<string, PromptConcatTool>): void {\n if (reg.has(FULL_REPLACEMENT_PLUGIN_TOOL_ID)) return;\n reg.set(FULL_REPLACEMENT_PLUGIN_TOOL_ID, (hooks: PromptConcatHooks) => {\n hooks.processPrompts.tapAsync(\n 'fullReplacementLite',\n (context: { messages: unknown[] }, callback) => {\n const msgs = context.messages;\n if (!Array.isArray(msgs)) {\n callback();\n return;\n }\n const maxChars = Number(process.env.MEMELOOP_FULL_REPLACEMENT_MAX_CHARS ?? 48_000);\n if (!Number.isFinite(maxChars) || maxChars <= 0) {\n callback();\n return;\n }\n let total = 0;\n const kept: unknown[] = [];\n for (let index = msgs.length - 1; index >= 0; index--) {\n const m = msgs[index] as { content?: unknown };\n const c = typeof m?.content === 'string'\n ? m.content\n : m?.content != null\n ? JSON.stringify(m.content)\n : '';\n total += c.length;\n if (total > maxChars) break;\n kept.push(m);\n }\n kept.reverse();\n context.messages = kept;\n callback();\n },\n );\n });\n}\n\n/**\n * TidGi `dynamicPosition` 极简版:根级 `prompt` 若带 `dynamicPosition: \"deferToEnd\"`,\n * 在用户轮次 ≥2 时将该节点移到同级列表末尾(多轮后再强调尾部 system/user 块)。\n */\nfunction registerDynamicPosition(reg: Map<string, PromptConcatTool>): void {\n if (reg.has(DYNAMIC_POSITION_PLUGIN_TOOL_ID)) return;\n reg.set(DYNAMIC_POSITION_PLUGIN_TOOL_ID, (hooks: PromptConcatHooks) => {\n hooks.processPrompts.tapAsync(\n 'dynamicPositionLite',\n (context: { messages: unknown[]; prompts?: PromptNode[] }, callback) => {\n const prompts = context.prompts;\n const messages = context.messages;\n if (!Array.isArray(prompts) || prompts.length < 2 || !Array.isArray(messages)) {\n callback();\n return;\n }\n const userTurns = messages.filter((m) => (m as { role?: string })?.role === 'user').length;\n if (userTurns < 2) {\n callback();\n return;\n }\n const deferred: PromptNode[] = [];\n const rest: PromptNode[] = [];\n for (const n of prompts) {\n if (n?.dynamicPosition === 'deferToEnd') deferred.push(n);\n else rest.push(n);\n }\n if (deferred.length === 0) {\n callback();\n return;\n }\n context.prompts = [...rest, ...deferred] as typeof context.prompts;\n callback();\n },\n );\n });\n}\n\n/**\n * 注册内置 prompt 插件(fullReplacement、dynamicPosition)。\n * @param target 若传入(如节点 `ToolRegistry` 上的 Map),只写入该表;否则写入活动注册表(全局或 ALS)。\n */\nexport function registerBuiltinPromptPlugins(target?: Map<string, PromptConcatTool>): void {\n const reg = target ?? getActivePluginRegistry();\n registerFullReplacement(reg);\n registerDynamicPosition(reg);\n}\n","import type { ChatMessage } from './conversation/index.js';\nimport type { ConversationMeta } from './sync/protocol.js';\n\nimport { registerBuiltinLoops } from './agentLoops/plugins/builtinLoopsPlugin.js';\nimport { registerBuiltinToolPlugins } from './agentLoops/plugins/builtinToolsPlugin.js';\nimport { getLoopRegistry } from './agentLoops/registry.js';\nimport type { AgentLoopGenerator, AgentLoopInput, LoopProfile } from './agentLoops/types.js';\nimport { getBuiltinLoopProfile } from './loopProfiles/loadBuiltins.js';\nimport { registerBuiltinPromptPlugins } from './promptUtilities/builtinPromptPlugins.js';\nimport { nextLamportClockForConversation } from './storage/nextLamport.js';\nimport type { AgentFrameworkContext } from './types.js';\n\nexport interface CreateAgentOptions {\n definitionId: string;\n initialMessage?: string;\n}\n\nexport interface SendMessageOptions {\n conversationId: string;\n message: string;\n}\n\nexport interface MemeLoopRuntime {\n createAgent(options: CreateAgentOptions): Promise<{ conversationId: string }>;\n sendMessage(options: SendMessageOptions): Promise<void>;\n cancelAgent(conversationId: string): Promise<void>;\n subscribeToUpdates(conversationId: string, listener: (update: unknown) => void): () => void;\n}\n\nasync function drainAgentLoop(\n gen: AgentLoopGenerator,\n conversationId: string,\n notify: (conversationId: string, update: unknown) => void,\n): Promise<void> {\n try {\n for await (const step of gen) {\n notify(conversationId, { type: 'agent-step', step });\n }\n notify(conversationId, { type: 'agent-done' });\n } catch (error) {\n notify(conversationId, {\n type: 'agent-error',\n error: error instanceof Error ? error.message : String(error),\n });\n }\n}\n\nfunction inferDefinitionIdFromConversationId(conversationId: string): string {\n const parts = conversationId.split(':');\n if (parts.length >= 2) return parts.slice(0, -1).join(':');\n return conversationId;\n}\n\nasync function resolveDefinitionId(\n context: AgentFrameworkContext,\n conversationId: string,\n): Promise<string> {\n try {\n const meta = await context.storage.getConversationMeta(conversationId);\n if (meta?.definitionId) return meta.definitionId;\n } catch {\n /* optional for old storage adapters */\n }\n return inferDefinitionIdFromConversationId(conversationId);\n}\n\nasync function resolveLoopProfile(\n context: AgentFrameworkContext,\n definitionId: string,\n): Promise<LoopProfile | null> {\n const definition = (context.resolveAgentDefinition ? await context.resolveAgentDefinition(definitionId) : null) ??\n (await context.storage.getAgentDefinition(definitionId)) ??\n getBuiltinLoopProfile(definitionId) ??\n null;\n if (!definition) return null;\n return definition as unknown as LoopProfile;\n}\n\nasync function createProfileRunner(\n context: AgentFrameworkContext,\n definitionId: string,\n): Promise<((input: AgentLoopInput) => AgentLoopGenerator) | null> {\n const profile = await resolveLoopProfile(context, definitionId);\n if (!profile) return null;\n\n registerBuiltinLoops();\n registerBuiltinToolPlugins();\n registerBuiltinPromptPlugins(context.tools.getPromptPlugins?.());\n\n const runnerContext = {\n ...context,\n runtime: {\n runChildAgent: context.runChildAgent,\n log: (event: string, data?: Record<string, unknown>) => context.logger?.debug?.(event, data),\n emit: () => undefined,\n signal: { cancelled: false },\n },\n toolRegistry: context.tools,\n } as { [key: string]: unknown };\n return getLoopRegistry().createRunnerForProfile(profile, runnerContext);\n}\n\nexport function createMemeLoopRuntime(context: AgentFrameworkContext): MemeLoopRuntime {\n const listeners = new Map<string, Set<(update: unknown) => void>>();\n const cancellation = context.conversationCancellation;\n\n function notify(conversationId: string, update: unknown) {\n const set = listeners.get(conversationId);\n if (!set) return;\n for (const listener of set) {\n listener(update);\n }\n }\n\n async function runAgentLoop(input: AgentLoopInput, definitionId: string): Promise<boolean> {\n const run = context.runTaskAgent ?? await createProfileRunner(context, definitionId);\n if (!run) return false;\n void drainAgentLoop(run(input), input.conversationId, notify);\n return true;\n }\n\n async function* runChildAgent(input: Parameters<NonNullable<AgentFrameworkContext['runChildAgent']>>[0]): AgentLoopGenerator {\n const run = await createProfileRunner(context, input.profileId);\n if (!run) {\n yield {\n type: 'message',\n data: `Child agent profile not found: ${input.profileId}`,\n };\n return;\n }\n yield* run({ conversationId: input.conversationId, message: input.prompt });\n }\n\n context.runChildAgent ??= runChildAgent;\n\n return {\n async createAgent(options) {\n const now = Date.now();\n const conversationId = `${options.definitionId}:${now.toString(36)}`;\n cancellation?.delete(conversationId);\n\n const meta: ConversationMeta = {\n conversationId,\n title: options.definitionId,\n lastMessagePreview: context.runTaskAgent ? '' : options.initialMessage ?? '',\n lastMessageTimestamp: now,\n messageCount: context.runTaskAgent || !options.initialMessage ? 0 : 1,\n originNodeId: 'local',\n definitionId: options.definitionId,\n isUserInitiated: true,\n };\n await context.storage.upsertConversationMetadata(meta);\n\n if (options.initialMessage) {\n const started = await runAgentLoop(\n { conversationId, message: options.initialMessage },\n options.definitionId,\n );\n if (started) {\n notify(conversationId, { type: 'created', conversationId });\n return { conversationId };\n }\n }\n\n if (options.initialMessage) {\n const message: ChatMessage = {\n messageId: `${conversationId}:m1`,\n conversationId,\n originNodeId: meta.originNodeId,\n timestamp: now,\n lamportClock: 1,\n role: 'user',\n content: options.initialMessage,\n };\n await context.storage.appendMessage(message);\n }\n\n notify(conversationId, { type: 'created', conversationId });\n return { conversationId };\n },\n async sendMessage(options) {\n cancellation?.delete(options.conversationId);\n const definitionId = await resolveDefinitionId(context, options.conversationId);\n const started = await runAgentLoop(\n { conversationId: options.conversationId, message: options.message },\n definitionId,\n );\n if (started) {\n notify(options.conversationId, { type: 'message-queued' });\n return;\n }\n\n const now = Date.now();\n const lamportClock = await nextLamportClockForConversation(\n context.storage,\n options.conversationId,\n );\n const message: ChatMessage = {\n messageId: `${options.conversationId}:${now.toString(36)}`,\n conversationId: options.conversationId,\n originNodeId: 'local',\n timestamp: now,\n lamportClock,\n role: 'user',\n content: options.message,\n };\n await context.storage.appendMessage(message);\n notify(options.conversationId, { type: 'message-queued' });\n },\n async cancelAgent(conversationId) {\n cancellation?.add(conversationId);\n notify(conversationId, { type: 'cancelled' });\n },\n subscribeToUpdates(conversationId, listener) {\n const set = listeners.get(conversationId) ?? new Set();\n set.add(listener);\n listeners.set(conversationId, set);\n return () => {\n const current = listeners.get(conversationId);\n if (!current) return;\n current.delete(listener);\n if (current.size === 0) {\n listeners.delete(conversationId);\n }\n };\n },\n };\n}\n","/**\n * 将节点 RPC `memeloop.storage.getAttachmentBlob` 的返回值解码为同步引擎可用的 BLOB。\n */\n\nexport function decodeAttachmentBlobRpc(\n result: unknown,\n): { data: Uint8Array; filename: string; mimeType: string; size: number } | null {\n if (result == null || typeof result !== 'object') return null;\n const r = result as {\n found?: boolean;\n error?: string;\n dataBase64?: string;\n filename?: string;\n mimeType?: string;\n size?: number;\n };\n if (r.error || !r.found || typeof r.dataBase64 !== 'string') return null;\n const data = Buffer.from(r.dataBase64, 'base64');\n if (!data.length) return null;\n return {\n data: new Uint8Array(data),\n filename: typeof r.filename === 'string' ? r.filename : 'attachment',\n mimeType: typeof r.mimeType === 'string' ? r.mimeType : 'application/octet-stream',\n size: typeof r.size === 'number' && r.size > 0 ? r.size : data.length,\n };\n}\n","import type { AttachmentReference, ChatMessage } from '../conversation/index.js';\nimport type { ConversationMeta } from './protocol.js';\n\nimport type { IAgentStorage } from '../types.js';\n\nexport interface ChatSyncPeer {\n nodeId: string;\n /**\n * 取远端当前的 versionVector,并返回对方缺失的会话元数据。\n */\n exchangeVersionVector(localVersion: Record<string, number>): Promise<{\n remoteVersion: Record<string, number>;\n missingForRemote: ConversationMeta[];\n }>;\n\n /**\n * 将本地缺失的 metadata 从该 peer 拉回来。\n */\n pullMissingMetadata(sinceVersion: Record<string, number>): Promise<ConversationMeta[]>;\n\n /**\n * 按需拉取消息正文(TidGi / 审查单 Phase 4:消息级同步)。\n * 返回远端有而本地 unknownMessageIds 之外的新消息。\n */\n pullMissingMessages?(conversationId: string, knownMessageIds: string[]): Promise<ChatMessage[]>;\n\n /**\n * 按 contentHash 拉取附件二进制(与 `ChatMessage.attachments` / `AttachmentRef` 对齐)。\n * 典型实现:对 peer 发 `memeloop.storage.getAttachmentBlob` RPC。\n */\n pullAttachmentBlob?(\n contentHash: string,\n ): Promise<{ data: Uint8Array; filename: string; mimeType: string; size: number } | null>;\n}\n\nexport interface ChatSyncEngineOptions {\n nodeId: string;\n storage: IAgentStorage;\n peers: () => ChatSyncPeer[];\n}\n\nexport class ChatSyncEngine {\n private readonly nodeId: string;\n private readonly storage: IAgentStorage;\n private readonly getPeers: () => ChatSyncPeer[];\n private versionVector: Record<string, number> = {};\n\n constructor(options: ChatSyncEngineOptions) {\n this.nodeId = options.nodeId;\n this.storage = options.storage;\n this.getPeers = options.peers;\n this.versionVector[this.nodeId] = 0;\n }\n\n /**\n * 在本节点新产生一条消息时调用,增加本节点的 lamportClock。\n */\n public bumpLocalVersion(): void {\n this.versionVector[this.nodeId] = (this.versionVector[this.nodeId] ?? 0) + 1;\n }\n\n /**\n * 执行一次与所有 peer 的增量同步(metadata 级别),并尽力拉取缺失消息。\n */\n public async syncOnce(): Promise<void> {\n const peers = this.getPeers();\n if (peers.length === 0) return;\n\n const localVersion = { ...this.versionVector };\n const pulledConversations = new Set<string>();\n\n for (const peer of peers) {\n const { remoteVersion, missingForRemote } = await peer.exchangeVersionVector(localVersion);\n\n const missingForLocal = await peer.pullMissingMetadata(this.versionVector);\n\n for (const meta of missingForLocal) {\n await this.storage.upsertConversationMetadata(meta);\n pulledConversations.add(meta.conversationId);\n }\n\n for (const [nodeId, clock] of Object.entries(remoteVersion)) {\n const current = this.versionVector[nodeId] ?? 0;\n if (clock > current) {\n this.versionVector[nodeId] = clock;\n }\n }\n\n if (missingForRemote.length > 0) {\n this.bumpLocalVersion();\n }\n }\n\n for (const conversationId of pulledConversations) {\n await this.pullMessagesForConversationFromPeers(conversationId, peers);\n }\n }\n\n /**\n * Anti-entropy:先 syncOnce,再对已知会话逐个向各 peer 拉取缺失消息(参考审查单「定期对账」)。\n */\n public async antiEntropyOnce(): Promise<void> {\n await this.syncOnce();\n const list = await this.storage.listConversations({ limit: 500 });\n const peers = this.getPeers();\n for (const meta of list) {\n await this.pullMessagesForConversationFromPeers(meta.conversationId, peers);\n }\n }\n\n private async pullMessagesForConversationFromPeers(\n conversationId: string,\n peers: ChatSyncPeer[],\n ): Promise<void> {\n const localMsgs = await this.storage.getMessages(conversationId, { mode: 'full-content' });\n const knownIds = localMsgs.map((m) => m.messageId);\n\n for (const peer of peers) {\n if (!peer.pullMissingMessages) continue;\n try {\n const incoming = await peer.pullMissingMessages(conversationId, knownIds);\n if (incoming.length > 0) {\n await this.storage.insertMessagesIfAbsent(incoming);\n await this.ensureAttachmentsFromMessages(incoming, peers);\n }\n } catch {\n /* 单 peer 失败不阻塞 */\n }\n }\n }\n\n /** 从消息元数据收集 `attachments[].contentHash`,对本地缺失 BLOB 的哈希向各 peer 拉取并 `saveAttachment`。 */\n private async ensureAttachmentsFromMessages(\n messages: ChatMessage[],\n peers: ChatSyncPeer[],\n ): Promise<void> {\n const hashes = new Set<string>();\n for (const m of messages) {\n for (const a of m.attachments ?? []) {\n if (a.contentHash) hashes.add(a.contentHash);\n }\n }\n for (const h of hashes) {\n const reference = await this.storage.getAttachment(h);\n if (reference) {\n const reader = this.storage.readAttachmentData?.bind(this.storage);\n if (!reader) continue;\n const bytes = await reader(h);\n if (bytes && bytes.length > 0) continue;\n }\n\n for (const peer of peers) {\n const pull = peer.pullAttachmentBlob?.bind(peer);\n if (!pull) continue;\n try {\n const blob = await pull(h);\n if (blob?.data?.length) {\n const ar: AttachmentReference = {\n contentHash: h,\n filename: blob.filename,\n mimeType: blob.mimeType,\n size: blob.size > 0 ? blob.size : blob.data.length,\n };\n await this.storage.saveAttachment(ar, blob.data);\n break;\n }\n } catch {\n /* try next peer */\n }\n }\n }\n }\n\n public getVersionVector(): Record<string, number> {\n return { ...this.versionVector };\n }\n\n public getStorage(): IAgentStorage {\n return this.storage;\n }\n}\n","import type { ChatMessage } from '../conversation/index.js';\nimport type { ConversationMeta } from './protocol.js';\n\nimport type { ChatSyncPeer } from './chatSyncEngine.js';\n\nexport interface PeerNodeTransport {\n nodeId: string;\n exchangeVersionVector(\n targetNodeId: string,\n localVersion: Record<string, number>,\n ): Promise<{\n remoteVersion: Record<string, number>;\n missingForRemote: ConversationMeta[];\n }>;\n pullMissingMetadata(\n targetNodeId: string,\n sinceVersion: Record<string, number>,\n ): Promise<ConversationMeta[]>;\n pullMissingMessages?(\n targetNodeId: string,\n conversationId: string,\n knownMessageIds: string[],\n ): Promise<ChatMessage[]>;\n\n /** 从指定节点拉取附件 BLOB(如 `memeloop.storage.getAttachmentBlob`)。 */\n pullAttachmentBlob?(\n targetNodeId: string,\n contentHash: string,\n ): Promise<{ data: Uint8Array; filename: string; mimeType: string; size: number } | null>;\n}\n\nexport class PeerNodeSyncAdapter implements ChatSyncPeer {\n public readonly nodeId: string;\n private readonly transport: PeerNodeTransport;\n\n constructor(nodeId: string, transport: PeerNodeTransport) {\n this.nodeId = nodeId;\n this.transport = transport;\n }\n\n exchangeVersionVector(localVersion: Record<string, number>) {\n return this.transport.exchangeVersionVector(this.nodeId, localVersion);\n }\n\n pullMissingMetadata(sinceVersion: Record<string, number>) {\n return this.transport.pullMissingMetadata(this.nodeId, sinceVersion);\n }\n\n pullMissingMessages(conversationId: string, knownMessageIds: string[]): Promise<ChatMessage[]> {\n const function_ = this.transport.pullMissingMessages?.bind(this.transport);\n if (!function_) {\n return Promise.resolve([]);\n }\n return function_(this.nodeId, conversationId, knownMessageIds);\n }\n\n pullAttachmentBlob(contentHash: string) {\n const function_ = this.transport.pullAttachmentBlob?.bind(this.transport);\n if (!function_) {\n return Promise.resolve(null);\n }\n return function_(this.nodeId, contentHash);\n }\n}\n","import type { AgentDefinition, AgentInstanceMeta } from './agent/types.js';\nimport type { AttachmentReference } from './conversation/index.js';\nimport type { ChatMessage } from './conversation/index.js';\nimport type { AgentFrameworkConfig } from './promptUtilities/types.js';\nimport type { ConversationMeta } from './sync/protocol.js';\n\nimport type { AgentLoopGenerator, AgentLoopInput, AgentLoopRuntime } from './agentLoops/types.js';\nimport type { CheckpointStore } from './storage/sessionStorage.js';\n\nexport type ConversationQueryMode = 'metadata-only' | 'full-content' | 'on-demand';\n\nexport interface ListConversationsOptions {\n limit?: number;\n offset?: number;\n}\n\nexport interface GetMessagesOptions {\n mode?: ConversationQueryMode;\n}\n\nexport interface IAgentStorage {\n listConversations(options?: ListConversationsOptions): Promise<ConversationMeta[]>;\n\n getMessages(conversationId: string, options?: GetMessagesOptions): Promise<ChatMessage[]>;\n\n appendMessage(message: ChatMessage): Promise<void>;\n\n /**\n * Upsert conversation directory row (sync / Solid / peer metadata).\n */\n upsertConversationMetadata(meta: ConversationMeta): Promise<void>;\n\n /**\n * Insert messages if messageId not present (merge from remote / Pod); refreshes per-conversation messageCount.\n */\n insertMessagesIfAbsent(messages: ChatMessage[]): Promise<void>;\n\n getAttachment(contentHash: string): Promise<AttachmentReference | null>;\n\n saveAttachment(reference: AttachmentReference, data: Buffer | Uint8Array): Promise<void>;\n\n /**\n * 读取已落库的附件二进制(用于节点间 RPC `memeloop.storage.getAttachmentBlob`)。\n * 未实现时远端同步应通过其它通道拉取附件。\n */\n readAttachmentData?(contentHash: string): Promise<Uint8Array | null>;\n\n getAgentDefinition(id: string): Promise<AgentDefinition | null>;\n\n /**\n * 若实现,可用 `SELECT MAX(lamportClock)` 避免为时钟扫描全量消息。\n */\n getMaxLamportClockForConversation?(conversationId: string): Promise<number>;\n\n saveAgentInstance(meta: AgentInstanceMeta): Promise<void>;\n\n /**\n * 读取会话目录行(用于 TaskAgent 解析 definitionId 等)。\n */\n getConversationMeta(conversationId: string): Promise<ConversationMeta | null>;\n\n /** IM 用户与会话绑定(memeloop-cli + SQLite 持久化)。 */\n getImBinding?(\n channelId: string,\n imUserId: string,\n ): Promise<import('./im/protocol.js').IMChannelBinding | null>;\n setImBinding?(record: import('./im/protocol.js').IMChannelBinding): Promise<void>;\n}\n\nexport interface MemeLoopLogger {\n debug?(message: string, ...arguments_: unknown[]): void;\n info?(message: string, ...arguments_: unknown[]): void;\n warn?(message: string, ...arguments_: unknown[]): void;\n error?(message: string, ...arguments_: unknown[]): void;\n}\n\nexport interface ILLMProvider {\n name: string;\n model?: unknown;\n\n chat(request: unknown): AsyncIterable<unknown> | Promise<unknown>;\n}\n\n/**\n * LLM Provider interface - now compatible with Vercel AI SDK's LanguageModelV1.\n * The `model` field holds the actual LanguageModelV1 instance from @ai-sdk/openai, @ai-sdk/anthropic, etc.\n */\n/* eslint-disable @typescript-eslint/no-redundant-type-constituents */\nexport interface IToolRegistry {\n registerTool(id: string, impl: unknown): void;\n getTool(id: string): unknown | undefined;\n listTools(): string[];\n /**\n * Prompt-concat 插件表(defineTool 注册的 `PromptConcatTool`),按运行时隔离。\n * 未实现时回退到进程级默认注册表(见 pluginRegistry)。\n */\n getPromptPlugins?: () => Map<\n string,\n (hooks: import('./tools/types.js').PromptConcatHooks) => void\n >;\n}\n\nexport interface IChatSyncAdapter {\n start(): Promise<void>;\n stop(): Promise<void>;\n}\n\nexport interface INetworkService {\n start(): Promise<void>;\n stop(): Promise<void>;\n}\n\nexport interface LlmIoLoopOptions {\n /** 最大 LLM↔工具往返次数,0 表示不限制(仍受内部安全上限约束) */\n maxIterations?: number;\n /** 是否解析 `<tool_use>` / `<function_call>` 并通过 IToolRegistry 执行(默认 true) */\n enableToolLoop?: boolean;\n /** 取消检查(例如用户点停止);按会话维度 */\n isCancelled?: (conversationId: string) => boolean;\n /** promptConcat 附件注入(与 PromptConcatOptions 一致) */\n readAttachmentFile?: (path: string) => Promise<Uint8Array | Buffer>;\n /** 超过该时长的历史消息不送入 LLM(毫秒);0 或未设置表示不裁剪 */\n maxHistoryAgeMs?: number;\n /**\n * 在已配置 `defineTool` / plugins 时,对未被 `onResponseComplete` 处理的 tool 调用回退到 `IToolRegistry`(默认 true)。\n */\n fallbackRegistryTools?: boolean;\n /**\n * 工具权限规则(默认 allow)。\n * 支持 wildcard,如 \"terminal.*\" / \"file.read\"。\n */\n toolPermissions?: {\n default?: 'allow' | 'ask' | 'deny';\n rules?: Array<{ pattern: string; action: 'allow' | 'ask' | 'deny' }>;\n perAgent?: Record<\n string,\n {\n default?: 'allow' | 'ask' | 'deny';\n rules?: Array<{ pattern: string; action: 'allow' | 'ask' | 'deny' }>;\n }\n >;\n };\n /** 相同 tool+input 连续触发阈值(默认 3) */\n doomLoopThreshold?: number;\n /** 历史压缩窗口:超过后只保留最近 N 条 + 最后一条用户消息 */\n contextCompaction?: { maxMessages?: number; replayLastUserMessage?: boolean };\n /**\n * Auto-compaction: when message count exceeds threshold, summarizes old\n * conversation turns via truncation or LLM summarization. Default: disabled.\n */\n autoCompact?: {\n /** Trigger compaction when message count exceeds this (default: 50) */\n threshold?: number;\n /** Number of recent turns to preserve (default: 4) */\n recentTurnsToKeep?: number;\n /** Maximum token estimate before compaction; 0 disables token-based compaction */\n maxTokens?: number;\n };\n /** Session checkpoint: save conversation history after each turn for resume. */\n sessionCheckpoint?: {\n /** Enable checkpoint saves. Default: false. */\n enabled?: boolean;\n /** Store provided by the runtime host. */\n store?: CheckpointStore;\n /** Custom checkpoint directory (default: ~/.memeloop/sessions/) */\n directory?: string;\n };\n /**\n * After a tool returns `__memeloopToolResult.awaitSessionId`, TaskAgent waits here before the next LLM round\n * (terminal `mode: 'await'`).\n */\n waitForTerminalSession?: (sessionId: string) => Promise<{\n exitCode: number | null;\n truncatedOutput: string;\n }>;\n}\n\nexport interface AgentFrameworkContext {\n storage: IAgentStorage;\n llmProvider: ILLMProvider;\n tools: IToolRegistry;\n syncAdapters: IChatSyncAdapter[];\n network: INetworkService;\n /** Let host runtimes preserve platform-specific message aliases/metadata while core owns the loop. */\n normalizeMessage?: (message: ChatMessage) => ChatMessage;\n\n /** TaskAgent ReAct 行为(从 TidGi-Desktop taskAgent 迁移) */\n taskAgent?: LlmIoLoopOptions;\n /**\n * 由宿主注入(如 memeloop-cli):存在时 `createMemeLoopRuntime` 在用户发消息后运行完整 TaskAgent 管线。\n */\n runTaskAgent?: (input: AgentLoopInput) => AgentLoopGenerator;\n /** Run a child agent for orchestration loops such as SubAgent_Loop. */\n runChildAgent?: AgentLoopRuntime['runChildAgent'];\n /**\n * Build the agent view supplied to defineTool hooks for a conversation.\n */\n resolveAgentRuntimeView?: (\n conversationId: string,\n messages: ChatMessage[],\n ) => Promise<AgentInstanceModel>;\n /**\n * defineTool / TidGi 兼容:当前轮次的 agent 视图(`agent.messages` 与 `ChatMessage` 由 TaskAgent 同步)。\n */\n agent?: { id: string; messages: ChatMessage[] };\n /** 将 `ChatMessage` 持久化(可选,由 runtime 注入) */\n persistAgentMessage?: (message: ChatMessage) => Promise<void>;\n /**\n * 由 `createMemeLoopRuntime` 写入取消标记,`taskAgent.isCancelled` 应与此集合一致(如 memeloop-cli)。\n */\n conversationCancellation?: Set<string>;\n /**\n * 解析 AgentDefinition(如节点合并 YAML + 内置 + SQLite)。未设置时仅用 `storage.getAgentDefinition`。\n */\n resolveAgentDefinition?: (definitionId: string) => Promise<AgentDefinition | null>;\n /** 未注入时 TaskAgent 等对关键路径使用 console.warn/error。 */\n logger?: MemeLoopLogger;\n /** TidGi defineTool compatibility: legacy plugins call this without arguments. */\n isCancelled?: () => boolean;\n}\n\nexport type AgentInstanceState =\n | 'submitted'\n | 'working'\n | 'input-required'\n | 'completed'\n | 'canceled'\n | 'failed'\n | 'unknown';\n\nexport interface AgentInstanceLatestStatus {\n state: AgentInstanceState;\n message?: ChatMessage;\n /** Human-readable sub-status for the header — shown while agent is working. */\n progress?: string;\n created?: Date;\n modified?: Date;\n}\n\nexport interface AgentInstanceModel extends Omit<AgentDefinition, 'name'> {\n agentDefId: string;\n name?: string;\n agentFrameworkConfig?: AgentFrameworkConfig;\n messages: ChatMessage[];\n status: AgentInstanceLatestStatus;\n created: Date;\n modified?: Date;\n closed?: boolean;\n volatile?: boolean;\n isSubAgent?: boolean;\n parentAgentId?: string;\n}\n\nexport type { AgentInstanceModel as AgentInstance };\n\nexport function isUserInitiatedConversation(meta: ConversationMeta): boolean {\n return meta.isUserInitiated;\n}\n\nexport function createInstanceDeltaFromDefinition(\n definition: AgentDefinition,\n overrides: Partial<AgentDefinition>,\n): Partial<AgentDefinition> {\n const delta: Partial<AgentDefinition> = {};\n for (const key of Object.keys(overrides) as Array<Extract<keyof AgentDefinition, string>>) {\n const value = overrides[key];\n if (value !== undefined && value !== definition[key]) {\n (delta as Record<string, unknown>)[key] = value;\n }\n }\n return delta;\n}\n","import type { ChatMessage } from '../conversation/index.js';\n\nexport interface CheckpointRecord {\n conversationId: string;\n messages: ChatMessage[];\n savedAt: string;\n messageCount: number;\n lastMessagePreview: string;\n}\n\nexport interface CheckpointSummary {\n conversationId: string;\n savedAt: string;\n messageCount: number;\n lastMessagePreview: string;\n}\n\nexport interface CheckpointStore {\n saveCheckpoint(conversationId: string, messages: ChatMessage[]): Promise<CheckpointRecord>;\n loadCheckpoint(conversationId: string): Promise<CheckpointRecord | null>;\n listCheckpoints(): Promise<CheckpointSummary[]>;\n deleteCheckpoint(conversationId: string): Promise<boolean>;\n}\n\nexport interface SessionStorageOptions {\n records?: CheckpointRecord[];\n}\n\nexport function createCheckpointRecord(\n conversationId: string,\n messages: ChatMessage[],\n savedAt = new Date().toISOString(),\n): CheckpointRecord {\n const lastMessage = messages[messages.length - 1];\n const preview = lastMessage && typeof lastMessage.content === 'string' ? lastMessage.content.slice(0, 200) : '';\n\n return {\n conversationId,\n messages: [...messages],\n savedAt,\n messageCount: messages.length,\n lastMessagePreview: preview,\n };\n}\n\nexport function parseCheckpointRecord(raw: string): CheckpointRecord | null {\n try {\n const record = JSON.parse(raw) as unknown;\n return isCheckpointRecord(record) ? record : null;\n } catch {\n return null;\n }\n}\n\nexport function serializeCheckpointRecord(record: CheckpointRecord): string {\n return JSON.stringify(record, null, 2);\n}\n\nexport class InMemoryCheckpointStore implements CheckpointStore {\n private readonly records = new Map<string, CheckpointRecord>();\n\n constructor(options: SessionStorageOptions = {}) {\n for (const record of options.records ?? []) {\n this.records.set(record.conversationId, cloneCheckpointRecord(record));\n }\n }\n\n async saveCheckpoint(conversationId: string, messages: ChatMessage[]): Promise<CheckpointRecord> {\n const record = createCheckpointRecord(conversationId, messages);\n this.records.set(conversationId, cloneCheckpointRecord(record));\n return cloneCheckpointRecord(record);\n }\n\n async loadCheckpoint(conversationId: string): Promise<CheckpointRecord | null> {\n const record = this.records.get(conversationId);\n return record ? cloneCheckpointRecord(record) : null;\n }\n\n async listCheckpoints(): Promise<CheckpointSummary[]> {\n return [...this.records.values()]\n .map(toCheckpointSummary)\n .sort((a, b) => b.savedAt.localeCompare(a.savedAt));\n }\n\n async deleteCheckpoint(conversationId: string): Promise<boolean> {\n return this.records.delete(conversationId);\n }\n}\n\nexport class SessionStorage extends InMemoryCheckpointStore {}\n\nfunction isCheckpointRecord(record: unknown): record is CheckpointRecord {\n if (!record || typeof record !== 'object') return false;\n const candidate = record as Record<string, unknown>;\n return (\n typeof candidate.conversationId === 'string' &&\n Array.isArray(candidate.messages) &&\n typeof candidate.savedAt === 'string' &&\n typeof candidate.messageCount === 'number' &&\n typeof candidate.lastMessagePreview === 'string'\n );\n}\n\nfunction cloneCheckpointRecord(record: CheckpointRecord): CheckpointRecord {\n return {\n ...record,\n messages: [...record.messages],\n };\n}\n\nfunction toCheckpointSummary(record: CheckpointRecord): CheckpointSummary {\n return {\n conversationId: record.conversationId,\n savedAt: record.savedAt,\n messageCount: record.messageCount,\n lastMessagePreview: record.lastMessagePreview,\n };\n}\n","/**\n * Task category system for routing tasks to appropriate agent configurations.\n * Each category maps to a model, temperature, and description for delegation decisions.\n */\n\nexport type TaskCategory =\n | 'visual-engineering'\n | 'ultrabrain'\n | 'artistry'\n | 'quick'\n | 'unspecified-low'\n | 'unspecified-high'\n | 'writing';\n\nexport interface CategoryConfig {\n /** Model identifier (e.g., \"default\", \"gpt-4o\", \"claude-opus\") */\n model: string;\n /** LLM temperature (0.0 = deterministic, 1.0 = creative) */\n temperature: number;\n /** Human-readable description of the category's purpose */\n description: string;\n}\n\nconst CATEGORY_CONFIGS: Record<TaskCategory, CategoryConfig> = {\n 'visual-engineering': {\n model: 'default',\n temperature: 0.3,\n description: 'UI/UX visual engineering tasks requiring precise rendering and layout',\n },\n ultrabrain: {\n model: 'default',\n temperature: 0.1,\n description: 'Deep logical reasoning, architecture decisions, and complex problem-solving',\n },\n artistry: {\n model: 'default',\n temperature: 0.8,\n description: 'Creative writing, design, and artistic generation tasks',\n },\n quick: {\n model: 'default',\n temperature: 0.2,\n description: 'Fast, straightforward tasks with minimal deliberation needed',\n },\n 'unspecified-low': {\n model: 'default',\n temperature: 0.5,\n description: 'Unclassified tasks of moderate complexity and effort',\n },\n 'unspecified-high': {\n model: 'default',\n temperature: 0.4,\n description: 'Unclassified tasks requiring substantial effort across multiple systems',\n },\n writing: {\n model: 'default',\n temperature: 0.7,\n description: 'Documentation, prose, technical writing, and content generation',\n },\n};\n\n/**\n * Get the configuration for a task category.\n * @throws {Error} if the category is unknown\n */\nexport function getCategoryConfig(category: TaskCategory): CategoryConfig {\n const config = CATEGORY_CONFIGS[category];\n if (!config) {\n throw new Error(`Unknown task category: ${category}`);\n }\n return { ...config };\n}\n\n/**\n * Type guard: check if a string is a valid TaskCategory.\n */\nexport function isTaskCategory(value: string): value is TaskCategory {\n return value in CATEGORY_CONFIGS;\n}\n\n/** All registered category identifiers (read-only). */\nexport const ALL_CATEGORIES = Object.keys(CATEGORY_CONFIGS) as TaskCategory[];\n\n/**\n * Resolve a category string (or fallback to \"unspecified-low\").\n * Never throws; always returns a valid config.\n */\nexport function resolveCategory(category: string): CategoryConfig {\n if (isTaskCategory(category)) {\n return getCategoryConfig(category);\n }\n return getCategoryConfig('unspecified-low');\n}\n","/**\n * Convert TiddlyWiki tiddler fields into memeloop AgentDefinition.\n *\n * Tiddlers tagged `$:/tags/AI/Template` carry agent configuration in their text field (JSON).\n * This pure function handles the parsing and field mapping.\n */\nimport type { AgentDefinition } from '../agent/types.js';\nimport type { AgentFrameworkConfig, PromptNode, PromptPluginConfig } from '../promptUtilities/types.js';\n\n/** Minimal tiddler fields shape consumed by the converter. */\nexport interface TiddlerFieldsForAgent {\n title: string;\n text?: string;\n caption?: string;\n description?: string;\n avatar_url?: string;\n handler_id?: string;\n agentFrameworkID?: string;\n ai_api_config?: string | Record<string, unknown>;\n agent_tools?: string | unknown[];\n}\n\n/**\n * Validate and convert a wiki tiddler to an AgentDefinition.\n * Returns null if the tiddler cannot be parsed.\n */\nexport function tiddlerToAgentDefinition(\n tiddler: TiddlerFieldsForAgent,\n workspaceName?: string,\n): AgentDefinition | null {\n if (!tiddler || !tiddler.title || typeof tiddler.text !== 'string') return null;\n\n let agentFrameworkConfig: Record<string, unknown>;\n try {\n const parsed = JSON.parse(tiddler.text) as unknown;\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n return null;\n }\n agentFrameworkConfig = parsed as Record<string, unknown>;\n } catch {\n return null;\n }\n\n const getString = (field: unknown, fallback = ''): string =>\n typeof field === 'string'\n ? field\n : field && typeof field === 'object'\n ? JSON.stringify(field)\n : fallback;\n\n const parseJSON = (field: unknown): Record<string, unknown> | unknown[] | undefined => {\n if (typeof field === 'string') {\n try {\n const parsed = JSON.parse(field) as unknown;\n if (typeof parsed === 'object' && parsed !== null) {\n return parsed as Record<string, unknown> | unknown[];\n }\n } catch {\n /* ignore */\n }\n }\n return undefined;\n };\n\n const id = `wiki-template-${getString(tiddler.title).replace(/[^a-zA-Z0-9-_]/g, '-')}`;\n const name = getString(tiddler.caption) || getString(tiddler.title);\n const description = getString(tiddler.description) || `Agent template from ${workspaceName || 'wiki'}`;\n\n const modelConfigRaw = parseJSON(tiddler.ai_api_config);\n const rawAsRecord = modelConfigRaw && typeof modelConfigRaw === 'object' && !Array.isArray(modelConfigRaw)\n ? modelConfigRaw\n : undefined;\n const modelConfig = rawAsRecord\n ? {\n provider: typeof rawAsRecord.provider === 'string' ? rawAsRecord.provider : '',\n model: typeof rawAsRecord.model === 'string' ? rawAsRecord.model : '',\n }\n : undefined;\n\n const toolsRaw = parseJSON(tiddler.agent_tools);\n const toolNames = Array.isArray(toolsRaw)\n ? (toolsRaw as Array<Record<string, unknown>>)\n .filter((t) => typeof t?.toolId === 'string')\n .map((t) => String(t.toolId))\n : [];\n\n return {\n id,\n name,\n description,\n systemPrompt: '',\n tools: toolNames,\n modelConfig,\n // Keep the original config as promptSchema for the UI editor\n promptSchema: agentFrameworkConfig,\n agentFrameworkConfig: {\n prompts: Array.isArray(agentFrameworkConfig.prompts)\n ? (agentFrameworkConfig.prompts as PromptNode[])\n : [],\n plugins: Array.isArray(agentFrameworkConfig.plugins)\n ? (agentFrameworkConfig.plugins as PromptPluginConfig[])\n : [],\n response: Array.isArray(agentFrameworkConfig.response)\n ? agentFrameworkConfig.response\n : undefined,\n } as AgentFrameworkConfig,\n version: '1',\n };\n}\n","/**\n * AgentSessionController — headless controller for an active agent conversation session.\n *\n * Manages agent runtime state, message sending, streaming, delete/retry turns,\n * and subscription to live agent updates.\n *\n * No React, DOM, Electron, MUI, Zustand, or RxJS dependency.\n */\n\nimport type { ChatMessage } from '../conversation/index.js';\nimport type { AgentConversationClient, AgentInstanceClient, AgentRuntimeView, WikiTiddlerAttachment } from './types.js';\n\n/** Read-only snapshot of the session state. */\nexport interface AgentSessionSnapshot {\n agent: AgentRuntimeView | null;\n loading: boolean;\n error: Error | null;\n messages: ChatMessage[];\n orderedMessageIds: string[];\n streamingMessageIds: Set<string>;\n}\n\n/** Listener for snapshot changes. */\nexport type AgentSessionListener = (snapshot: AgentSessionSnapshot) => void;\n\n/** Options for creating an AgentSessionController. */\nexport interface AgentSessionControllerOptions {\n agentInstanceClient: AgentInstanceClient;\n conversationClient: AgentConversationClient;\n /** Polling interval in ms for agent status updates. Default 500. */\n pollInterval?: number;\n}\n\n/**\n * Headless controller for an agent conversation session.\n *\n * Call {@link start} to load an agent, then {@link subscribe} to receive snapshot\n * updates. Use {@link sendMessage}, {@link deleteTurn}, {@link retryTurn}, {@link cancel}\n * to drive the conversation.\n *\n * Host UI frameworks (React, Ink) subscribe via {@link subscribe} and render\n * the snapshot.\n */\nexport class AgentSessionController {\n private readonly options: Required<AgentSessionControllerOptions>;\n private listener: AgentSessionListener | null = null;\n private snapshot: AgentSessionSnapshot = {\n agent: null,\n loading: false,\n error: null,\n messages: [],\n orderedMessageIds: [],\n streamingMessageIds: new Set(),\n };\n private unsubAgentUpdates: (() => void) | null = null;\n private unsubMessages: (() => void) | null = null;\n private pollingTimer: ReturnType<typeof setInterval> | null = null;\n private agentId: string | null = null;\n\n constructor(options: AgentSessionControllerOptions) {\n this.options = {\n pollInterval: 500,\n ...options,\n };\n }\n\n // ── Lifecycle ─────────────────────────────────────────────────\n\n /**\n * Start a session for the given agent ID.\n * Fetches the agent, subscribes to live updates, and loads messages.\n */\n async start(agentId: string): Promise<void> {\n this.agentId = agentId;\n this.emitPartial({ loading: true, error: null });\n\n try {\n const [agent, rawMessages] = await Promise.all([\n this.options.agentInstanceClient.fetchAgent(agentId),\n this.options.conversationClient.getMessages(agentId),\n ]);\n\n const orderedMessageIds = rawMessages.map((m) => m.messageId);\n const messagesMap = new Map<string, ChatMessage>();\n for (const m of rawMessages) messagesMap.set(m.messageId, m);\n\n this.emitPartial({\n agent,\n loading: false,\n messages: rawMessages,\n orderedMessageIds,\n streamingMessageIds: new Set(),\n });\n\n // Subscribe to live agent updates\n this.unsubAgentUpdates = this.options.agentInstanceClient.subscribeToUpdates(\n agentId,\n this.handleAgentUpdate,\n );\n\n // Subscribe to new messages\n this.unsubMessages = this.options.conversationClient.subscribeToMessages(\n agentId,\n this.handleNewMessage,\n );\n\n // Poll for status changes\n this.startPolling(agentId);\n } catch (error_) {\n this.emitPartial({\n loading: false,\n error: error_ instanceof Error ? error_ : new Error(String(error_)),\n });\n }\n }\n\n /** Stop the session and clean up subscriptions. */\n stop(): void {\n this.stopPolling();\n this.unsubAgentUpdates?.();\n this.unsubAgentUpdates = null;\n this.unsubMessages?.();\n this.unsubMessages = null;\n this.agentId = null;\n }\n\n // ── Actions ───────────────────────────────────────────────────\n\n /** Send a user message. */\n async sendMessage(\n content: string,\n file?: File,\n wikiTiddlers?: WikiTiddlerAttachment[],\n ): Promise<void> {\n if (!this.agentId) return;\n this.emitPartial({ error: null });\n try {\n await this.options.conversationClient.sendMessage(this.agentId, content, file, wikiTiddlers);\n } catch (error_) {\n this.emitPartial({\n error: error_ instanceof Error ? error_ : new Error(String(error_)),\n });\n }\n }\n\n /** Cancel the current agent operation. */\n async cancel(): Promise<void> {\n if (!this.agentId) return;\n try {\n await this.options.agentInstanceClient.cancelAgent(this.agentId);\n } catch (error_) {\n this.emitPartial({\n error: error_ instanceof Error ? error_ : new Error(String(error_)),\n });\n }\n }\n\n /** Delete a turn starting at the given user message ID. */\n async deleteTurn(userMessageId: string): Promise<string | undefined> {\n return this.options.conversationClient.deleteTurn(userMessageId);\n }\n\n /** Retry a turn starting at the given user message ID. */\n async retryTurn(userMessageId: string): Promise<void> {\n return this.options.conversationClient.retryTurn(userMessageId);\n }\n\n // ── Subscription ──────────────────────────────────────────────\n\n /** Subscribe to snapshot changes. Returns unsubscribe function. */\n subscribe(listener: AgentSessionListener): () => void {\n this.listener = listener;\n // Immediately emit current state\n listener({ ...this.snapshot, streamingMessageIds: new Set(this.snapshot.streamingMessageIds) });\n return () => {\n if (this.listener === listener) this.listener = null;\n };\n }\n\n /** Get current snapshot without subscribing. */\n getSnapshot(): AgentSessionSnapshot {\n return this.snapshot;\n }\n\n // ── Private helpers ───────────────────────────────────────────\n\n private emitPartial(partial: Partial<AgentSessionSnapshot>): void {\n this.snapshot = { ...this.snapshot, ...partial };\n if (this.listener) {\n this.listener({\n ...this.snapshot,\n streamingMessageIds: new Set(this.snapshot.streamingMessageIds),\n });\n }\n }\n\n private handleAgentUpdate = (update: Partial<AgentRuntimeView>): void => {\n if (this.snapshot.agent) {\n this.emitPartial({ agent: { ...this.snapshot.agent, ...update } });\n }\n };\n\n private handleNewMessage = (message: ChatMessage): void => {\n const messages = [...this.snapshot.messages.filter((m) => m.messageId !== message.messageId), message];\n const orderedMessageIds = [...new Set([...this.snapshot.orderedMessageIds, message.messageId])];\n this.emitPartial({ messages, orderedMessageIds });\n };\n\n private startPolling(agentId: string): void {\n this.stopPolling();\n this.pollingTimer = setInterval(async () => {\n try {\n const agent = await this.options.agentInstanceClient.fetchAgent(agentId);\n this.emitPartial({ agent });\n } catch {\n // Silently retry on next poll\n }\n }, this.options.pollInterval);\n }\n\n private stopPolling(): void {\n if (this.pollingTimer !== null) {\n clearInterval(this.pollingTimer);\n this.pollingTimer = null;\n }\n }\n}\n","/**\n * AgentDefinitionEditorController — headless controller for editing an agent definition.\n *\n * Manages definition loading, autosave, schema loading, preview agent lifecycle,\n * and scheduled task CRUD.\n *\n * No React, DOM, Electron, MUI, Zustand, or RxJS dependency.\n */\n\nimport type { AgentDefinition } from '../agent/types.js';\nimport type { AgentDefinitionEditorState, AgentDefinitionRepository, AgentInstanceClient, CreateScheduledTaskInput, ScheduledTask, ScheduledTaskClient } from './types.js';\n\n/** Partial state emitted to the listener. */\nexport type EditorStateChange = Partial<AgentDefinitionEditorState>;\n\n/** Listener for editor state changes. */\nexport type EditorStateListener = (change: EditorStateChange) => void;\n\n/** Schedule editor sub-state for the UI layer. */\nexport interface ScheduleEditorState {\n mode: 'none' | 'interval' | 'daily' | 'cron';\n intervalValue: number;\n intervalUnit: 's' | 'min' | 'h';\n dailyTime: string;\n activeHoursStart: string;\n activeHoursEnd: string;\n cronExpression: string;\n timezone: string;\n message: string;\n existingTaskId?: string;\n}\n\n/** Options for creating an AgentDefinitionEditorController. */\nexport interface AgentDefinitionEditorControllerOptions {\n definitionRepository: AgentDefinitionRepository;\n agentInstanceClient: AgentInstanceClient;\n scheduledTaskClient: ScheduledTaskClient;\n /** Debounce interval for autosave in ms. Default 1000. */\n autosaveDebounceMs?: number;\n}\n\n/**\n * Headless controller for editing an agent definition.\n *\n * Call {@link loadDefinition} to start, then {@link subscribe} for state updates.\n */\nexport class AgentDefinitionEditorController {\n private readonly options: Required<AgentDefinitionEditorControllerOptions>;\n private listener: EditorStateListener | null = null;\n private state: AgentDefinitionEditorState = {\n agentDefinition: null,\n agentName: '',\n previewAgentId: null,\n isLoading: false,\n isSaving: false,\n promptSchema: null,\n };\n private autosaveTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(options: AgentDefinitionEditorControllerOptions) {\n this.options = {\n autosaveDebounceMs: 1_000,\n ...options,\n };\n }\n\n // ── Lifecycle ─────────────────────────────────────────────────\n\n /** Load an agent definition and its prompt schema. */\n async loadDefinition(definitionId: string): Promise<void> {\n this.emit({ isLoading: true });\n\n try {\n const [definition, previewAgentId] = await Promise.all([\n this.options.definitionRepository.getAgentDef(definitionId),\n this.findOrCreatePreviewAgent(definitionId),\n ]);\n\n if (!definition) {\n this.emit({ isLoading: false });\n return;\n }\n\n let promptSchema: Record<string, unknown> | null = null;\n if (definition.agentFrameworkID) {\n try {\n promptSchema = await this.options.agentInstanceClient.getFrameworkConfigSchema(\n definition.agentFrameworkID,\n );\n } catch {\n promptSchema = null;\n }\n }\n\n this.state = {\n agentDefinition: definition,\n agentName: definition.name ?? '',\n previewAgentId,\n isLoading: false,\n isSaving: false,\n promptSchema,\n };\n this.emit(this.state);\n } catch (_error) {\n this.emit({ isLoading: false });\n }\n }\n\n /** Update the agent definition field. Triggers debounced autosave. */\n updateDefinition(change: Partial<AgentDefinition> & { id: string }): void {\n if (!this.state.agentDefinition) return;\n const updated = { ...this.state.agentDefinition, ...change };\n this.state = { ...this.state, agentDefinition: updated, agentName: updated.name ?? '' };\n this.emit({ agentDefinition: updated, agentName: this.state.agentName });\n this.scheduleAutosave(updated);\n }\n\n /** Force an immediate save to the repository. */\n async saveNow(): Promise<void> {\n if (!this.state.agentDefinition) return;\n this.emit({ isSaving: true });\n try {\n await this.options.definitionRepository.updateAgentDef({\n id: this.state.agentDefinition.id,\n name: this.state.agentName,\n description: this.state.agentDefinition.description,\n agentFrameworkConfig: this.state.agentDefinition.agentFrameworkConfig,\n aiApiConfig: this.state.agentDefinition.aiApiConfig,\n agentTools: this.state.agentDefinition.agentTools,\n heartbeat: this.state.agentDefinition.heartbeat,\n });\n } catch (_error) {\n // Host should surface errors via its UI layer\n } finally {\n this.emit({ isSaving: false });\n }\n }\n\n /** Reload the prompt schema for a framework ID. */\n async reloadSchema(frameworkId: string): Promise<void> {\n try {\n const schema = await this.options.agentInstanceClient.getFrameworkConfigSchema(frameworkId);\n this.emit({ promptSchema: schema });\n } catch (_error) {\n this.emit({ promptSchema: null });\n }\n }\n\n // ── Preview agent lifecycle ───────────────────────────────────\n\n /** Get or create a preview agent instance tied to this definition. */\n private async findOrCreatePreviewAgent(definitionId: string): Promise<string | null> {\n try {\n const result = await this.options.agentInstanceClient.createAgent(definitionId, {\n preview: true,\n });\n return result.id;\n } catch (_error) {\n return null;\n }\n }\n\n // ── Scheduled tasks ───────────────────────────────────────────\n\n async loadScheduledTasks(): Promise<ScheduledTask[]> {\n if (!this.state.previewAgentId) return [];\n return this.options.scheduledTaskClient.listScheduledTasksForAgent(\n this.state.previewAgentId,\n );\n }\n\n async saveScheduledTask(input: CreateScheduledTaskInput): Promise<ScheduledTask> {\n return this.options.scheduledTaskClient.createScheduledTask(input);\n }\n\n async deleteScheduledTask(taskId: string): Promise<void> {\n return this.options.scheduledTaskClient.deleteScheduledTask(taskId);\n }\n\n // ── Subscription ──────────────────────────────────────────────\n\n subscribe(listener: EditorStateListener): () => void {\n this.listener = listener;\n listener(this.state);\n return () => {\n if (this.listener === listener) this.listener = null;\n };\n }\n\n getState(): AgentDefinitionEditorState {\n return this.state;\n }\n\n // ── Private ───────────────────────────────────────────────────\n\n private emit(change: EditorStateChange): void {\n this.listener?.(change);\n }\n\n private scheduleAutosave(definition: AgentDefinition): void {\n if (this.autosaveTimer !== null) clearTimeout(this.autosaveTimer);\n this.autosaveTimer = setTimeout(() => {\n this.options.definitionRepository.updateAgentDef({\n id: definition.id,\n name: definition.name,\n description: definition.description,\n agentFrameworkConfig: definition.agentFrameworkConfig,\n aiApiConfig: definition.aiApiConfig,\n agentTools: definition.agentTools,\n heartbeat: definition.heartbeat,\n }).catch(() => {});\n }, this.options.autosaveDebounceMs);\n }\n}\n","/**\n * AgentCreationController — headless controller for the \"Create New Agent\" wizard.\n *\n * Manages creation wizard state: current step, template selection, temporary\n * agent definition lifecycle, and preview agent setup.\n *\n * No React, DOM, Electron, MUI, Zustand, or RxJS dependency.\n */\n\nimport type { AgentDefinition } from '../agent/types.js';\nimport type { AgentCreationState, AgentDefinitionRepository, AgentInstanceClient } from './types.js';\n\n/** Listener for creation state changes. */\nexport type CreationStateListener = (state: AgentCreationState) => void;\n\n/** Options for creating an AgentCreationController. */\nexport interface AgentCreationControllerOptions {\n definitionRepository: AgentDefinitionRepository;\n agentInstanceClient: AgentInstanceClient;\n /** Default framework ID for new agents. */\n defaultFrameworkId?: string;\n}\n\n/**\n * Headless controller for the agent creation wizard.\n *\n * Call {@link start}, {@link selectTemplate}, {@link nextStep}, etc. to drive\n * the wizard. Subscribe via {@link subscribe} for state updates.\n */\nexport class AgentCreationController {\n private readonly options: Required<AgentCreationControllerOptions>;\n private listener: CreationStateListener | null = null;\n private state: AgentCreationState = {\n currentStep: 0,\n agentName: '',\n selectedTemplate: null,\n temporaryAgentDefinition: null,\n previewAgentId: null,\n isLoading: false,\n promptSchema: null,\n };\n\n constructor(options: AgentCreationControllerOptions) {\n this.options = {\n defaultFrameworkId: 'memeloopTaskAgent',\n ...options,\n };\n }\n\n /** Initialize the creation wizard, optionally from a saved tab state. */\n async start(definitionId?: string, templateDefinitionId?: string): Promise<void> {\n this.emit({ isLoading: true });\n\n try {\n if (definitionId) {\n // Restore existing temporary definition\n const temporaryDefinition = await this.options.definitionRepository.getAgentDef(definitionId);\n if (temporaryDefinition) {\n this.state = {\n ...this.state,\n temporaryAgentDefinition: temporaryDefinition,\n agentName: temporaryDefinition.name ?? '',\n isLoading: false,\n };\n this.emit(this.state);\n // Load template if available\n if (templateDefinitionId) {\n const template = await this.options.definitionRepository.getAgentDef(templateDefinitionId);\n if (template) {\n this.state = { ...this.state, selectedTemplate: template };\n this.emit(this.state);\n }\n }\n return;\n }\n }\n\n this.emit({ isLoading: false });\n } catch {\n this.emit({ isLoading: false });\n }\n }\n\n /** Select a template for the new agent. */\n selectTemplate(template: AgentDefinition): void {\n this.state = { ...this.state, selectedTemplate: template };\n this.emit(this.state);\n }\n\n /** Update the agent name. */\n setAgentName(name: string): void {\n this.state = { ...this.state, agentName: name };\n this.emit(this.state);\n }\n\n /** Advance to the next wizard step. */\n nextStep(): void {\n this.state = { ...this.state, currentStep: Math.min(this.state.currentStep + 1, 2) };\n this.emit(this.state);\n }\n\n /** Go back to the previous wizard step. */\n previousStep(): void {\n this.state = { ...this.state, currentStep: Math.max(this.state.currentStep - 1, 0) };\n this.emit(this.state);\n }\n\n /** Set the current wizard step directly. */\n setStep(step: number): void {\n this.state = { ...this.state, currentStep: Math.max(0, Math.min(step, 2)) };\n this.emit(this.state);\n }\n\n /** Update the temporary agent definition. */\n updateTemporaryDefinition(change: Partial<AgentDefinition>): void {\n const updated = this.state.temporaryAgentDefinition\n ? { ...this.state.temporaryAgentDefinition, ...change }\n : null;\n this.state = { ...this.state, temporaryAgentDefinition: updated };\n this.emit(this.state);\n }\n\n /** Set the prompt schema for the selected framework. */\n setPromptSchema(schema: Record<string, unknown> | null): void {\n this.state = { ...this.state, promptSchema: schema };\n this.emit(this.state);\n }\n\n /**\n * Create a preview agent instance for the chat-preview step.\n * Should be called when entering step 2 (or the chat preview step).\n */\n async createPreviewAgent(definitionId: string): Promise<void> {\n this.emit({ isLoading: true });\n try {\n const result = await this.options.agentInstanceClient.createAgent(definitionId, {\n preview: true,\n });\n this.state = { ...this.state, previewAgentId: result.id, isLoading: false };\n this.emit(this.state);\n } catch {\n this.emit({ isLoading: false });\n }\n }\n\n /**\n * Finalize creation: persist the temporary definition and create the actual\n * agent instance. Returns the final agent instance ID, or null on failure.\n */\n async finalize(): Promise<string | null> {\n if (!this.state.temporaryAgentDefinition) return null;\n try {\n const definition = await this.options.definitionRepository.createAgentDef(\n this.state.temporaryAgentDefinition,\n );\n const instance = await this.options.agentInstanceClient.createAgent(definition.id);\n return instance.id;\n } catch {\n return null;\n }\n }\n\n /** Clean up temporary resources. */\n async cleanup(): Promise<void> {\n if (this.state.previewAgentId) {\n try {\n await this.options.agentInstanceClient.deleteAgent(this.state.previewAgentId);\n } catch {\n // Best-effort cleanup\n }\n }\n }\n\n // ── Subscription ──────────────────────────────────────────────\n\n subscribe(listener: CreationStateListener): () => void {\n this.listener = listener;\n listener({ ...this.state });\n return () => {\n if (this.listener === listener) this.listener = null;\n };\n }\n\n getState(): AgentCreationState {\n return this.state;\n }\n\n // ── Private ───────────────────────────────────────────────────\n\n private emit(change: AgentCreationState | Partial<AgentCreationState>): void {\n this.state = { ...this.state, ...change };\n this.listener?.({ ...this.state });\n }\n}\n","/**\n * PromptPreviewController — headless controller for generating prompt previews.\n *\n * Manages preview dialog state, progress tracking, and result accumulation.\n *\n * No React, DOM, Electron, MUI, Zustand, or RxJS dependency.\n */\n\nimport type { ChatMessage } from '../conversation/index.js';\nimport type { AgentFrameworkConfig } from '../promptUtilities/types.js';\nimport type { PromptPreviewClient, PromptPreviewDialogState, PromptPreviewResult } from './types.js';\n\n/** Listener for preview dialog state changes. */\nexport type PreviewDialogListener = (state: PromptPreviewDialogState) => void;\n\n/** Options for creating a PromptPreviewController. */\nexport interface PromptPreviewControllerOptions {\n previewClient: PromptPreviewClient;\n}\n\n/**\n * Headless controller for the prompt preview/edit dialog.\n *\n * Call {@link open}, {@link close}, {@link generate} to drive the dialog.\n * Subscribe via {@link subscribe} for state updates.\n */\nexport class PromptPreviewController {\n private readonly options: PromptPreviewControllerOptions;\n private listener: PreviewDialogListener | null = null;\n private state: PromptPreviewDialogState = {\n open: false,\n baseMode: 'preview',\n activeTab: 'tree',\n loading: false,\n progress: 0,\n currentStep: '',\n currentPlugin: null,\n result: null,\n lastUpdated: null,\n formFieldsToScrollTo: [],\n };\n\n constructor(options: PromptPreviewControllerOptions) {\n this.options = options;\n }\n\n /** Open the dialog with an optional base mode. */\n open(baseMode?: 'preview' | 'edit'): void {\n this.state = {\n ...this.state,\n open: true,\n baseMode: baseMode ?? 'preview',\n loading: false,\n progress: 0,\n currentStep: 'Starting...',\n currentPlugin: null,\n result: null,\n lastUpdated: null,\n formFieldsToScrollTo: [],\n };\n this.emit();\n }\n\n /** Close the dialog. */\n close(): void {\n this.state = {\n ...this.state,\n open: false,\n baseMode: 'preview',\n lastUpdated: null,\n formFieldsToScrollTo: [],\n };\n this.emit();\n }\n\n /** Set the active tab in the dialog. */\n setActiveTab(tab: 'flat' | 'tree'): void {\n this.state = { ...this.state, activeTab: tab };\n this.emit();\n }\n\n /** Set form fields to scroll to (for edit mode navigation). */\n setFormFieldsToScrollTo(fieldPaths: string[]): void {\n this.state = { ...this.state, formFieldsToScrollTo: fieldPaths };\n this.emit();\n }\n\n /**\n * Generate a preview of the prompt tree.\n * @param agentFrameworkConfig The agent's framework configuration\n * @param messages Current conversation messages\n * @param inputText Optional input text to include in the preview\n */\n async generate(\n agentFrameworkConfig: AgentFrameworkConfig,\n messages: ChatMessage[],\n inputText?: string,\n ): Promise<PromptPreviewResult | null> {\n this.state = {\n ...this.state,\n loading: true,\n progress: 0,\n currentStep: 'Preparing...',\n };\n this.emit();\n\n try {\n const result = await this.options.previewClient.generatePreview(\n agentFrameworkConfig,\n messages,\n inputText,\n (progress) => {\n this.state = {\n ...this.state,\n progress: progress.progress,\n currentStep: progress.step,\n currentPlugin: progress.currentPlugin ?? null,\n };\n this.emit();\n },\n );\n\n this.state = {\n ...this.state,\n loading: false,\n progress: 1,\n currentStep: 'Complete',\n currentPlugin: null,\n result,\n lastUpdated: new Date(),\n };\n this.emit();\n return result;\n } catch (_error) {\n this.state = {\n ...this.state,\n loading: false,\n progress: 0,\n currentStep: 'Error occurred',\n currentPlugin: null,\n result: null,\n };\n this.emit();\n return null;\n }\n }\n\n // ── Subscription ──────────────────────────────────────────────\n\n subscribe(listener: PreviewDialogListener): () => void {\n this.listener = listener;\n listener({ ...this.state });\n return () => {\n if (this.listener === listener) this.listener = null;\n };\n }\n\n getState(): PromptPreviewDialogState {\n return this.state;\n }\n\n // ── Private ───────────────────────────────────────────────────\n\n private emit(): void {\n this.listener?.({ ...this.state });\n }\n}\n","import type { ILLMProvider } from '../types.js';\n\nexport interface ProviderConfig {\n name: string;\n baseUrl?: string;\n apiKey?: string;\n}\n\nexport interface RegisteredProvider {\n provider: ILLMProvider;\n config: ProviderConfig;\n}\n\nexport class ProviderRegistry {\n private providers = new Map<string, RegisteredProvider>();\n\n register(provider: ILLMProvider, config?: Omit<ProviderConfig, 'name'>): void {\n this.providers.set(provider.name, {\n provider,\n config: {\n name: provider.name,\n baseUrl: config?.baseUrl,\n apiKey: config?.apiKey,\n },\n });\n }\n\n unregister(name: string): void {\n this.providers.delete(name);\n }\n\n get(name: string): ILLMProvider | undefined {\n return this.providers.get(name)?.provider;\n }\n\n getConfig(name: string): ProviderConfig | undefined {\n return this.providers.get(name)?.config;\n }\n\n upsertConfig(config: ProviderConfig): void {\n const existing = this.providers.get(config.name);\n if (!existing) {\n throw new Error(`Provider not found: ${config.name}`);\n }\n this.providers.set(config.name, {\n provider: existing.provider,\n config: {\n name: config.name,\n baseUrl: config.baseUrl,\n apiKey: config.apiKey,\n },\n });\n }\n\n list(): string[] {\n return Array.from(this.providers.keys()).sort();\n }\n\n listConfigs(): ProviderConfig[] {\n return this.list().map((name) => {\n const config = this.providers.get(name)?.config;\n if (!config) {\n throw new Error(`Provider config missing: ${name}`);\n }\n return { ...config };\n });\n }\n\n resolve(modelId: string): { provider: ILLMProvider; providerName: string; modelName?: string } {\n const [providerName, ...rest] = modelId.split('/');\n const registered = this.providers.get(providerName);\n if (!registered) {\n throw new Error(`Provider not found: ${providerName}`);\n }\n return {\n provider: registered.provider,\n providerName,\n modelName: rest.length > 0 ? rest.join('/') : undefined,\n };\n }\n}\n","/**\n * Git HTTP 反向代理目标校验:降低 SSRF 风险(内网/metadata 等)。\n * 仍依赖 getBackendUrl 返回可信基础 URL;此处拦截明显危险的解析结果。\n */\n\nfunction ipv4Parts(host: string): number[] | null {\n const m = /^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/.exec(host);\n if (!m) return null;\n return m.slice(1, 5).map((x) => Number(x));\n}\n\nfunction isPrivateOrLoopbackIpv4(host: string): boolean {\n const p = ipv4Parts(host);\n if (!p || p.some((n) => n > 255)) return false;\n const [a, b] = p;\n if (a === 127 || a === 0) return true;\n if (a === 10) return true;\n if (a === 172 && b >= 16 && b <= 31) return true;\n if (a === 192 && b === 168) return true;\n if (a === 169 && b === 254) return true;\n return false;\n}\n\n/** 若目标 URL 不允许作为 Git 代理上游,返回简短原因;否则 null。 */\nexport function gitProxyTargetBlockReason(url: URL): string | null {\n if (url.username || url.password) {\n return 'credentials_in_url';\n }\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n return 'unsupported_protocol';\n }\n const host = url.hostname.toLowerCase();\n if (\n host === 'localhost' ||\n host.endsWith('.localhost') ||\n host === '0.0.0.0' ||\n host === '[::]' ||\n host === '::'\n ) {\n return 'loopback_or_wildcard';\n }\n if (host.startsWith('127.')) {\n return 'loopback_ipv4';\n }\n if (isPrivateOrLoopbackIpv4(host)) {\n return 'private_ipv4';\n }\n if (host.includes(':') && !host.startsWith('[')) {\n const lower = host.toLowerCase();\n if (lower.startsWith('fe80:') || lower.startsWith('fc') || lower.startsWith('fd')) {\n return 'private_ipv6';\n }\n if (lower === '::1') {\n return 'loopback_ipv6';\n }\n }\n if (host.startsWith('[') && host.endsWith(']')) {\n const inner = host.slice(1, -1).toLowerCase();\n if (inner === '::1' || inner.startsWith('fe80:') || inner.startsWith('fc') || inner.startsWith('fd')) {\n return 'blocked_ipv6_literal';\n }\n }\n const h = host.replace(/^\\[|\\]$/g, '').toLowerCase();\n if (h === 'metadata.google.internal' || h.endsWith('.internal')) {\n return 'internal_hostname';\n }\n return null;\n}\n","import { noise } from '@chainsafe/libp2p-noise';\nimport { yamux } from '@chainsafe/libp2p-yamux';\nimport { identify } from '@libp2p/identify';\nimport type { Libp2p, PeerId, Stream } from '@libp2p/interface';\nimport { mdns } from '@libp2p/mdns';\nimport { peerIdFromString } from '@libp2p/peer-id';\nimport { ping } from '@libp2p/ping';\nimport { tcp } from '@libp2p/tcp';\nimport { webSockets } from '@libp2p/websockets';\nimport { createLibp2p } from 'libp2p';\n\nimport type {\n Device,\n DeviceCapabilities,\n DeviceAccountBindingRequest,\n DeviceNetworkListenOptions,\n DeviceNetworkService,\n DevicePlatform,\n LocalDeviceIdentity,\n MemeLoopDuplexStream,\n MemeLoopProtocol,\n PairingSession,\n SyncResult,\n TrustedDeviceRecord,\n} from './types.js';\n\nexport interface Libp2pDeviceNetworkServiceOptions {\n identity: LocalDeviceIdentity;\n capabilities?: DeviceCapabilities;\n trustedDevices?: TrustedDeviceRecord[];\n listen?: DeviceNetworkListenOptions;\n enableMdns?: boolean;\n autoDialDiscoveredPeers?: boolean;\n}\n\nconst emptyCapabilities: DeviceCapabilities = {\n tools: [],\n mcpServers: [],\n hasWiki: false,\n imChannels: [],\n wikis: [],\n};\n\nconst defaultListen: DeviceNetworkListenOptions = {\n addresses: ['/ip4/0.0.0.0/tcp/0', '/ip4/0.0.0.0/tcp/0/ws'],\n};\n\nexport class Libp2pDeviceNetworkService implements DeviceNetworkService {\n private libp2p?: Libp2p;\n private readonly capabilities: DeviceCapabilities;\n private readonly discoveredDevices = new Map<string, Device>();\n private readonly trustedDevices = new Map<string, TrustedDeviceRecord>();\n private readonly pairingSessions = new Map<string, PairingSession>();\n private readonly listeners = new Set<(devices: Device[]) => void>();\n\n constructor(private readonly options: Libp2pDeviceNetworkServiceOptions) {\n this.capabilities = options.capabilities ?? emptyCapabilities;\n for (const record of options.trustedDevices ?? []) {\n this.trustedDevices.set(record.peerId, record);\n }\n }\n\n public async start(): Promise<void> {\n if (this.libp2p) return;\n this.libp2p = await this.createNode();\n this.registerDiscoveryListeners(this.libp2p);\n await this.registerProtocolHandlers(this.libp2p);\n await this.libp2p.start();\n this.emitDevices();\n }\n\n public async stop(): Promise<void> {\n if (!this.libp2p) return;\n await this.libp2p.stop();\n this.libp2p = undefined;\n this.discoveredDevices.clear();\n this.emitDevices();\n }\n\n public async getLocalDevice(): Promise<Device> {\n const node = this.requireNode();\n return {\n peerId: node.peerId.toString(),\n displayName: this.options.identity.deviceName,\n platform: this.options.identity.platform,\n trustMode: 'local-pairing',\n reachability: {\n state: node.status === 'started' ? 'online' : 'offline',\n paths: node.status === 'started' ? ['lan'] : [],\n },\n capabilities: this.capabilities,\n lastSeen: Date.now(),\n };\n }\n\n public async listDevices(): Promise<Device[]> {\n return [...this.discoveredDevices.values()];\n }\n\n public observeDevices(listener: (devices: Device[]) => void): () => void {\n this.listeners.add(listener);\n void this.listDevices().then(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n public async requestLocalPairing(peerId: string): Promise<PairingSession> {\n const session: PairingSession = {\n sessionId: `pairing-${this.options.identity.peerId}-${peerId}-${Date.now()}`,\n localPeerId: this.options.identity.peerId,\n remotePeerId: peerId,\n confirmCode: this.confirmCode(peerId),\n expiresAt: Date.now() + 5 * 60_000,\n };\n this.pairingSessions.set(session.sessionId, session);\n return session;\n }\n\n public async acceptPairing(sessionId: string): Promise<void> {\n const session = this.pairingSessions.get(sessionId);\n if (!session) throw new Error('pairing_session_not_found');\n if (session.expiresAt < Date.now()) throw new Error('pairing_session_expired');\n const discovered = this.discoveredDevices.get(session.remotePeerId);\n this.trustedDevices.set(session.remotePeerId, {\n peerId: session.remotePeerId,\n publicKeyMultibase: '',\n deviceName: discovered?.displayName ?? session.remotePeerId,\n platform: discovered?.platform ?? 'cli',\n trustMode: 'local-pairing',\n createdAt: Date.now(),\n lastSeen: Date.now(),\n });\n this.pairingSessions.delete(sessionId);\n this.updateDeviceTrust(session.remotePeerId, 'local-pairing');\n this.emitDevices();\n }\n\n public async rejectPairing(sessionId: string): Promise<void> {\n this.pairingSessions.delete(sessionId);\n }\n\n public async removeTrustedDevice(peerId: string): Promise<void> {\n this.trustedDevices.delete(peerId);\n this.updateDeviceTrust(peerId, 'local-pairing');\n this.emitDevices();\n }\n\n public async openStream(peerId: string, protocol: MemeLoopProtocol): Promise<MemeLoopDuplexStream> {\n if (!this.trustedDevices.has(peerId)) throw new Error('device_not_trusted');\n const stream = await this.requireNode().dialProtocol(peerIdFromString(peerId), protocol);\n return this.wrapStream(stream);\n }\n\n public async sendRpc<T>(peerId: string, method: string, parameters: unknown): Promise<T> {\n const stream = await this.openStream(peerId, '/memeloop/rpc/1.0.0');\n const payload = new TextEncoder().encode(JSON.stringify({ jsonrpc: '2.0', id: crypto.randomUUID(), method, params: parameters }));\n await stream.sink(async function*() {\n yield payload;\n }());\n throw new Error('rpc_response_reader_not_implemented');\n }\n\n public async syncWithDevice(peerId: string): Promise<SyncResult> {\n if (!this.trustedDevices.has(peerId)) throw new Error('device_not_trusted');\n return { ok: true, peerId, syncedAt: Date.now() };\n }\n\n public getMultiaddrs(): string[] {\n return this.libp2p?.getMultiaddrs().map((address) => address.toString()) ?? [];\n }\n\n private async createNode(): Promise<Libp2p> {\n const privateKey = await privateKeyFromIdentity(this.options.identity);\n const listen = this.options.listen ?? defaultListen;\n return createLibp2p({\n privateKey,\n addresses: {\n listen: listen.addresses,\n announce: listen.announce,\n },\n transports: [tcp(), webSockets()],\n connectionEncrypters: [noise()],\n streamMuxers: [yamux()],\n peerDiscovery: this.options.enableMdns === false ? [] : [mdns({ serviceTag: 'memeloop' })],\n services: {\n identify: identify(),\n ping: ping(),\n },\n start: false,\n });\n }\n\n private registerDiscoveryListeners(node: Libp2p): void {\n node.addEventListener('peer:discovery', (event) => {\n const detail = event.detail;\n const peerId = detail.id.toString();\n this.discoveredDevices.set(peerId, {\n peerId,\n displayName: peerId,\n platform: 'cli',\n trustMode: this.trustedDevices.has(peerId) ? 'local-pairing' : 'local-pairing',\n reachability: {\n state: 'nearby',\n paths: ['lan'],\n },\n capabilities: emptyCapabilities,\n lastSeen: Date.now(),\n });\n this.emitDevices();\n if (this.options.autoDialDiscoveredPeers === true && detail.multiaddrs.length > 0) {\n void node.dial(detail.multiaddrs).catch(() => undefined);\n }\n });\n node.addEventListener('peer:connect', (event) => {\n this.markPeerOnline(event.detail);\n });\n node.addEventListener('peer:disconnect', (event) => {\n this.markPeerOffline(event.detail);\n });\n }\n\n private async registerProtocolHandlers(node: Libp2p): Promise<void> {\n const protocols: MemeLoopProtocol[] = [\n '/memeloop/pairing/1.0.0',\n '/memeloop/rpc/1.0.0',\n '/memeloop/sync/1.0.0',\n '/memeloop/agent/1.0.0',\n ];\n await node.handle(protocols, (stream, connection) => {\n const remotePeerId = connection.remotePeer.toString();\n if (!this.trustedDevices.has(remotePeerId)) {\n stream.abort(new Error('device_not_trusted'));\n return;\n }\n stream.abort(new Error('protocol_handler_not_registered'));\n });\n }\n\n private wrapStream(stream: Stream): MemeLoopDuplexStream {\n return {\n source: this.streamSource(stream),\n async sink(source) {\n for await (const chunk of source) {\n stream.send(chunk);\n }\n await stream.close();\n },\n close: async () => {\n await stream.close();\n },\n };\n }\n\n private async *streamSource(stream: Stream): AsyncIterable<Uint8Array> {\n for await (const chunk of stream) {\n if (chunk instanceof Uint8Array) {\n yield chunk;\n } else {\n yield chunk.subarray();\n }\n }\n }\n\n private markPeerOnline(peerId: PeerId): void {\n const id = peerId.toString();\n const current = this.discoveredDevices.get(id);\n if (current) {\n current.reachability = { state: 'online', paths: current.reachability.paths };\n current.lastSeen = Date.now();\n this.emitDevices();\n }\n }\n\n private markPeerOffline(peerId: PeerId): void {\n const id = peerId.toString();\n const current = this.discoveredDevices.get(id);\n if (current) {\n current.reachability = { state: 'offline', paths: [] };\n current.lastSeen = Date.now();\n this.emitDevices();\n }\n }\n\n private updateDeviceTrust(peerId: string, trustMode: Device['trustMode']): void {\n const current = this.discoveredDevices.get(peerId);\n if (current) current.trustMode = trustMode;\n }\n\n private confirmCode(peerId: string): string {\n const input = `${this.options.identity.peerId}:${peerId}`;\n let hash = 0;\n for (let index = 0; index < input.length; index += 1) {\n hash = (hash * 31 + input.charCodeAt(index)) >>> 0;\n }\n return (hash % 1_000_000).toString().padStart(6, '0');\n }\n\n private emitDevices(): void {\n const devices = [...this.discoveredDevices.values()];\n for (const listener of this.listeners) listener(devices);\n }\n\n private requireNode(): Libp2p {\n if (!this.libp2p) throw new Error('device_network_not_started');\n return this.libp2p;\n }\n}\n\nexport interface RawSeedDeviceIdentity extends LocalDeviceIdentity {\n privateKeyRawSeedBase64Url: string;\n}\n\nconst PUBLIC_KEY_MULTIBASE_PREFIX = 'libp2p-pub:';\n\nasync function loadCryptoKeys() {\n return import('@libp2p/crypto/keys');\n}\n\nasync function loadUint8arrays() {\n return import('uint8arrays');\n}\n\nexport async function encodePublicKeyMultibase(publicKey: unknown): Promise<string> {\n const { publicKeyToProtobuf } = await loadCryptoKeys();\n const { toString } = await loadUint8arrays();\n const protobuf = publicKeyToProtobuf(publicKey as Awaited<ReturnType<typeof import('@libp2p/crypto/keys').publicKeyFromProtobuf>>);\n return `${PUBLIC_KEY_MULTIBASE_PREFIX}${toString(protobuf, 'base64url')}`;\n}\n\nexport async function decodePublicKeyMultibase(multibase: string): Promise<unknown> {\n if (!multibase.startsWith(PUBLIC_KEY_MULTIBASE_PREFIX)) {\n throw new Error('unsupported_public_key_multibase_prefix');\n }\n const { publicKeyFromProtobuf } = await loadCryptoKeys();\n const { fromString } = await loadUint8arrays();\n const encoded = multibase.slice(PUBLIC_KEY_MULTIBASE_PREFIX.length);\n const protobuf = fromString(encoded, 'base64url');\n return publicKeyFromProtobuf(protobuf);\n}\n\nexport async function createDeviceIdentity(\n platform: DevicePlatform,\n deviceName: string,\n): Promise<RawSeedDeviceIdentity> {\n const { generateKeyPair } = await loadCryptoKeys();\n const { toString } = await loadUint8arrays();\n const privateKey = await generateKeyPair('Ed25519');\n const publicKey = privateKey.publicKey;\n return {\n peerId: publicKey.toString(),\n publicKeyMultibase: await encodePublicKeyMultibase(publicKey),\n privateKeyRef: 'libp2p-raw-seed',\n privateKeyRawSeedBase64Url: toString(privateKey.raw, 'base64url'),\n createdAt: Date.now(),\n deviceName,\n platform,\n };\n}\n\nasync function privateKeyFromIdentity(identity: LocalDeviceIdentity): Promise<unknown> {\n if (identity.privateKeyRawSeedBase64Url) {\n const { privateKeyFromRaw } = await loadCryptoKeys();\n const { fromString } = await loadUint8arrays();\n const raw = fromString(identity.privateKeyRawSeedBase64Url, 'base64url');\n return privateKeyFromRaw(raw);\n }\n throw new Error('unsupported_private_key_format');\n}\n\nexport function buildDeviceBindingMessage(input: {\n accountId: string;\n peerId: string;\n publicKeyMultibase: string;\n nonce: string;\n}): Uint8Array {\n const message = [\n 'memeloop-device-binding-v1',\n `accountId=${input.accountId}`,\n `peerId=${input.peerId}`,\n `publicKey=${input.publicKeyMultibase}`,\n `nonce=${input.nonce}`,\n ].join('\\n');\n return new TextEncoder().encode(message);\n}\n\nexport async function signDeviceBinding(input: {\n identity: LocalDeviceIdentity;\n accountId: string;\n nonce: string;\n}): Promise<string> {\n const { toString } = await loadUint8arrays();\n const privateKey = (await privateKeyFromIdentity(input.identity)) as { publicKey: { toString(): string }; sign(message: Uint8Array): Uint8Array | Promise<Uint8Array> };\n const publicKey = privateKey.publicKey;\n if ((await encodePublicKeyMultibase(publicKey)) !== input.identity.publicKeyMultibase) {\n throw new Error('device_identity_public_key_mismatch');\n }\n const message = buildDeviceBindingMessage({\n accountId: input.accountId,\n peerId: input.identity.peerId,\n publicKeyMultibase: input.identity.publicKeyMultibase,\n nonce: input.nonce,\n });\n const signature = await privateKey.sign(message);\n return toString(signature, 'base64url');\n}\n\nexport async function verifyDeviceBinding(input: DeviceAccountBindingRequest & { accountId: string }): Promise<boolean> {\n try {\n const { fromString } = await loadUint8arrays();\n const publicKey = (await decodePublicKeyMultibase(input.publicKeyMultibase)) as { toString(): string; verify(message: Uint8Array, signature: Uint8Array): boolean | Promise<boolean> };\n if (publicKey.toString() !== input.peerId) {\n return false;\n }\n const message = buildDeviceBindingMessage({\n accountId: input.accountId,\n peerId: input.peerId,\n publicKeyMultibase: input.publicKeyMultibase,\n nonce: input.cloudNonce,\n });\n const signature = fromString(input.signature, 'base64url');\n return await publicKey.verify(message, signature);\n } catch {\n return false;\n }\n}\n","import type {\n Device,\n DeviceCapabilities,\n DeviceNetworkService,\n LocalDeviceIdentity,\n MemeLoopDuplexStream,\n MemeLoopProtocol,\n PairingSession,\n SyncResult,\n TrustedDeviceRecord,\n} from './types.js';\n\nexport interface MemoryDeviceNetworkServiceOptions {\n identity: LocalDeviceIdentity;\n capabilities?: DeviceCapabilities;\n trustedDevices?: TrustedDeviceRecord[];\n}\n\nconst emptyCapabilities: DeviceCapabilities = {\n tools: [],\n mcpServers: [],\n hasWiki: false,\n imChannels: [],\n wikis: [],\n};\n\nfunction toDevice(record: TrustedDeviceRecord, capabilities: DeviceCapabilities): Device {\n return {\n peerId: record.peerId,\n displayName: record.deviceName,\n platform: record.platform,\n trustMode: record.trustMode,\n reachability: {\n state: record.revokedAt ? 'offline' : 'nearby',\n paths: record.revokedAt ? [] : ['lan'],\n },\n capabilities,\n lastSeen: record.lastSeen,\n };\n}\n\nexport class MemoryDeviceNetworkService implements DeviceNetworkService {\n private started = false;\n private readonly capabilities: DeviceCapabilities;\n private readonly trustedDevices = new Map<string, TrustedDeviceRecord>();\n private readonly pairingSessions = new Map<string, PairingSession>();\n private readonly listeners = new Set<(devices: Device[]) => void>();\n\n constructor(private readonly options: MemoryDeviceNetworkServiceOptions) {\n this.capabilities = options.capabilities ?? emptyCapabilities;\n for (const record of options.trustedDevices ?? []) {\n this.trustedDevices.set(record.peerId, record);\n }\n }\n\n public async start(): Promise<void> {\n this.started = true;\n this.emitDevices();\n }\n\n public async stop(): Promise<void> {\n this.started = false;\n this.emitDevices();\n }\n\n public async getLocalDevice(): Promise<Device> {\n return {\n peerId: this.options.identity.peerId,\n displayName: this.options.identity.deviceName,\n platform: this.options.identity.platform,\n trustMode: 'local-pairing',\n reachability: {\n state: this.started ? 'online' : 'offline',\n paths: this.started ? ['lan'] : [],\n },\n capabilities: this.capabilities,\n lastSeen: Date.now(),\n };\n }\n\n public async listDevices(): Promise<Device[]> {\n return [...this.trustedDevices.values()].map((record) => toDevice(record, emptyCapabilities));\n }\n\n public observeDevices(listener: (devices: Device[]) => void): () => void {\n this.listeners.add(listener);\n void this.listDevices().then(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n public async requestLocalPairing(peerId: string): Promise<PairingSession> {\n const session: PairingSession = {\n sessionId: `pairing-${this.options.identity.peerId}-${peerId}-${Date.now()}`,\n localPeerId: this.options.identity.peerId,\n remotePeerId: peerId,\n confirmCode: this.confirmCode(peerId),\n expiresAt: Date.now() + 5 * 60_000,\n };\n this.pairingSessions.set(session.sessionId, session);\n return session;\n }\n\n public async acceptPairing(sessionId: string): Promise<void> {\n const session = this.pairingSessions.get(sessionId);\n if (!session) throw new Error('pairing_session_not_found');\n if (session.expiresAt < Date.now()) throw new Error('pairing_session_expired');\n this.trustedDevices.set(session.remotePeerId, {\n peerId: session.remotePeerId,\n publicKeyMultibase: '',\n deviceName: session.remotePeerId,\n platform: 'cli',\n trustMode: 'local-pairing',\n createdAt: Date.now(),\n lastSeen: Date.now(),\n });\n this.pairingSessions.delete(sessionId);\n this.emitDevices();\n }\n\n public async rejectPairing(sessionId: string): Promise<void> {\n this.pairingSessions.delete(sessionId);\n }\n\n public async removeTrustedDevice(peerId: string): Promise<void> {\n this.trustedDevices.delete(peerId);\n this.emitDevices();\n }\n\n public async openStream(peerId: string, _protocol: MemeLoopProtocol): Promise<MemeLoopDuplexStream> {\n if (!this.trustedDevices.has(peerId)) throw new Error('device_not_trusted');\n return {\n source: (async function* emptySource() {})(),\n async sink() {},\n async close() {},\n };\n }\n\n public async sendRpc<T>(peerId: string, _method: string, _parameters: unknown): Promise<T> {\n if (!this.trustedDevices.has(peerId)) throw new Error('device_not_trusted');\n throw new Error('rpc_handler_not_registered');\n }\n\n public async syncWithDevice(peerId: string): Promise<SyncResult> {\n if (!this.trustedDevices.has(peerId)) throw new Error('device_not_trusted');\n return { ok: true, peerId, syncedAt: Date.now() };\n }\n\n private confirmCode(peerId: string): string {\n const input = `${this.options.identity.peerId}:${peerId}`;\n let hash = 0;\n for (let index = 0; index < input.length; index += 1) {\n hash = (hash * 31 + input.charCodeAt(index)) >>> 0;\n }\n return (hash % 1_000_000).toString().padStart(6, '0');\n }\n\n private emitDevices(): void {\n void this.listDevices().then((devices) => {\n for (const listener of this.listeners) listener(devices);\n });\n }\n}\n","import type { IMChannelBinding } from \"./protocol.js\";\n\nimport type { IIMAdapter, ImAgentDriver, ImInboundMessage } from \"./interface.js\";\n\n/**\n * 管理 IM 用户与会话的绑定;可选 `storage` 使用 IAgentStorage 的 IM 绑定持久化。\n */\nexport class IMChannelManager {\n private readonly bindings = new Map<string, IMChannelBinding>();\n\n constructor(\n private readonly storage?: {\n getImBinding?(c: string, u: string): Promise<IMChannelBinding | null>;\n setImBinding?(r: IMChannelBinding): Promise<void>;\n },\n ) {}\n\n private key(channelId: string, imUserId: string): string {\n return `${channelId}::${imUserId}`;\n }\n\n async getBinding(channelId: string, imUserId: string): Promise<IMChannelBinding | undefined> {\n const k = this.key(channelId, imUserId);\n if (this.storage?.getImBinding) {\n const row = await this.storage.getImBinding(channelId, imUserId);\n if (row) {\n this.bindings.set(k, row);\n return row;\n }\n }\n return this.bindings.get(k);\n }\n\n async setBinding(record: IMChannelBinding): Promise<void> {\n this.bindings.set(this.key(record.channelId, record.imUserId), record);\n if (this.storage?.setImBinding) {\n await this.storage.setImBinding(record);\n }\n }\n\n /**\n * 处理入站文本:无 binding 时创建会话并发送首条用户消息。\n */\n async dispatchInbound(\n message: ImInboundMessage,\n driver: ImAgentDriver,\n options: { defaultDefinitionId: string },\n ): Promise<{ conversationId: string }> {\n const existing = await this.getBinding(message.channelId, message.imUserId);\n if (existing) {\n await driver.sendMessage({\n conversationId: existing.activeConversationId,\n message: message.text,\n });\n return { conversationId: existing.activeConversationId };\n }\n const definitionId = options.defaultDefinitionId;\n const { conversationId } = await driver.createAgent({\n definitionId,\n initialMessage: message.text,\n });\n await this.setBinding({\n channelId: message.channelId,\n imUserId: message.imUserId,\n activeConversationId: conversationId,\n createdAt: Date.now(),\n defaultDefinitionId: definitionId,\n });\n return { conversationId };\n }\n\n async switchConversation(\n channelId: string,\n imUserId: string,\n conversationId: string,\n ): Promise<void> {\n const current = await this.getBinding(channelId, imUserId);\n if (current) {\n await this.setBinding({ ...current, activeConversationId: conversationId });\n } else {\n await this.setBinding({\n channelId,\n imUserId,\n activeConversationId: conversationId,\n createdAt: Date.now(),\n });\n }\n }\n}\n\nexport function pickAdapter(adapters: IIMAdapter[], platform: string): IIMAdapter | undefined {\n return adapters.find((a) => a.platform === platform);\n}\n","/** Plan §20.6.1 — chunk assistant text before sending to IM APIs. */\nexport function imPlatformMaxMessageChars(platform: string): number {\n switch (platform) {\n case 'telegram':\n return 4096;\n case 'discord':\n return 2000;\n case 'lark':\n return 4096;\n case 'wecom':\n return 2048;\n case 'slack':\n return 4000;\n case 'qq':\n return 4500;\n default:\n return 3500;\n }\n}\n","import type { MemeLoopRuntime } from \"../runtime.js\";\nimport type { IAgentStorage } from \"../storage/interface.js\";\n\nimport type { IMChannelManager } from \"./channelManager.js\";\nimport type { ImAgentDriver } from \"./interface.js\";\n\nexport interface ImSlashCommandContext {\n rawText: string;\n channelId: string;\n imUserId: string;\n manager: IMChannelManager;\n storage: IAgentStorage;\n driver: ImAgentDriver;\n runtime: MemeLoopRuntime;\n defaultDefinitionId: string;\n}\n\n/**\n * Plan §20.6.4 — parse `/list`, `/switch`, `/new`, `/agent`, `/status`, `/cancel` locally (no LLM).\n */\nexport async function tryHandleImSlashCommand(context: ImSlashCommandContext): Promise<{\n handled: boolean;\n messages: string[];\n}> {\n const t = context.rawText.trim();\n if (!t.startsWith(\"/\") || t.startsWith(\"//\") || t.length < 2) {\n return { handled: false, messages: [] };\n }\n const parts = t.slice(1).split(/\\s+/).filter(Boolean);\n const cmd = (parts[0] ?? \"\").toLowerCase();\n const rest = parts.slice(1).join(\" \").trim();\n\n const binding = await context.manager.getBinding(context.channelId, context.imUserId);\n const ok = (lines: string[]) => ({ handled: true as const, messages: lines });\n\n if (cmd === \"list\") {\n const list = await context.storage.listConversations({ limit: 50 });\n if (list.length === 0) return ok([\"(暂无会话)\"]);\n const body = list.map(\n (c, index) =>\n `${index + 1}. ${c.title || c.conversationId} — ${c.conversationId.slice(0, 14)}…`,\n );\n return ok([\"可切换会话:\", ...body.map((l) => `• ${l}`)]);\n }\n\n if (cmd === \"switch\") {\n if (!binding) return ok([\"当前无绑定会话,先用 /new 创建。\"]);\n const list = await context.storage.listConversations({ limit: 50 });\n const argument = rest.trim();\n if (!argument) return ok([\"用法:/switch <编号或 conversationId>\"]);\n const n = parseInt(argument, 10);\n let targetId: string | undefined;\n if (!Number.isNaN(n) && n >= 1 && n <= list.length) {\n targetId = list[n - 1]?.conversationId;\n } else {\n targetId = list.find(\n (c) => c.conversationId === argument || c.conversationId.includes(argument),\n )?.conversationId;\n }\n if (!targetId) return ok([`未找到会话:${argument}`]);\n await context.manager.switchConversation(context.channelId, context.imUserId, targetId);\n return ok([`已切换到:${targetId}`]);\n }\n\n if (cmd === \"new\" || cmd === \"agent\") {\n const definitionId = rest || context.defaultDefinitionId;\n const { conversationId } = await context.driver.createAgent({ definitionId });\n await context.manager.setBinding({\n channelId: context.channelId,\n imUserId: context.imUserId,\n activeConversationId: conversationId,\n createdAt: Date.now(),\n defaultDefinitionId: definitionId,\n });\n return ok([`已新建并绑定会话。\\nID:\\`${conversationId}\\`\\n发送消息即可开始。`]);\n }\n\n if (cmd === \"status\") {\n if (!binding) return ok([\"无活跃 IM 绑定。\"]);\n const meta = await context.storage.getConversationMeta(binding.activeConversationId);\n return ok([\n `会话:${binding.activeConversationId}`,\n `定义:${meta?.definitionId ?? \"?\"}`,\n `消息数:${meta?.messageCount ?? \"?\"}`,\n ]);\n }\n\n if (cmd === \"cancel\") {\n if (!binding) return ok([\"无会话可取消。\"]);\n await context.runtime.cancelAgent(binding.activeConversationId);\n return ok([\"已请求取消当前任务。\"]);\n }\n\n return { handled: false, messages: [] };\n}\n","import type { MemeLoopRuntime } from \"../runtime.js\";\n\nimport { imPlatformMaxMessageChars } from \"./imPlatformLimits.js\";\nimport type { TextMessageRenderer } from \"./textRenderer.js\";\n\nexport type ImStreamFlush = (text: string) => Promise<void>;\n\nfunction stringifyImValue(value: unknown): string {\n if (value == null) return \"\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\")\n return String(value);\n try {\n return JSON.stringify(value);\n } catch {\n return \"[unserializable value]\";\n }\n}\n\n/**\n * Subscribe to `runtime` agent updates and forward assistant text + light tool summaries to IM,\n * flushing when the buffer reaches the platform limit (plan §20.6.1).\n */\nexport async function streamRuntimeAgentReplyToIm(options: {\n runtime: MemeLoopRuntime;\n conversationId: string;\n platform: string;\n renderer: TextMessageRenderer;\n flush: ImStreamFlush;\n}): Promise<void> {\n const max = imPlatformMaxMessageChars(options.platform);\n let buf = \"\";\n\n const sendSlice = async (force: boolean): Promise<void> => {\n if (buf.length === 0) return;\n if (force) {\n while (buf.length > 0) {\n const take = Math.min(max, buf.length);\n const chunk = buf.slice(0, take);\n buf = buf.slice(take);\n if (chunk.trim().length > 0) await options.flush(chunk);\n }\n return;\n }\n while (buf.length >= max) {\n const chunk = buf.slice(0, max);\n buf = buf.slice(max);\n await options.flush(chunk);\n }\n };\n\n await new Promise<void>((resolve, reject) => {\n const off = options.runtime.subscribeToUpdates(options.conversationId, (u: unknown) => {\n const o = u as { type?: string; step?: { type?: string; data?: unknown } };\n if (o.type === \"agent-done\") {\n void sendSlice(true)\n .then(() => {\n off();\n resolve();\n })\n .catch(reject);\n return;\n }\n if (o.type === \"agent-error\") {\n off();\n reject(new Error((o as { error?: string }).error ?? \"agent-error\"));\n return;\n }\n if (o.type === \"agent-step\" && o.step?.type === \"message\") {\n const stepData = o.step.data;\n let piece = \"\";\n if (typeof stepData === \"string\") piece = stepData;\n else if (stepData != null && typeof stepData === \"object\" && \"content\" in stepData) {\n const content = (stepData as { content?: unknown }).content;\n piece = stringifyImValue(content);\n } else piece = stringifyImValue(stepData);\n buf += piece;\n void sendSlice(false);\n }\n if (o.type === \"agent-step\" && o.step?.type === \"tool\") {\n const td = o.step.data as {\n toolId?: string;\n parameters?: unknown;\n result?: unknown;\n isError?: boolean;\n };\n const id = td.toolId;\n if (!id) return;\n if (id === \"ask-question\") {\n const p = td.parameters as {\n question?: string;\n options?: Array<{ label: string }>;\n };\n const q = typeof p?.question === \"string\" ? p.question : \"\";\n const optLabels = p?.options\n ?.map((o) => o.label)\n .filter((x): x is string => typeof x === \"string\");\n const askText = options.renderer.renderAskQuestion(q, optLabels);\n buf += (buf && !buf.endsWith(\"\\n\") ? \"\\n\" : \"\") + askText + \"\\n\";\n void sendSlice(true);\n return;\n }\n if (td.isError) {\n buf +=\n (buf && !buf.endsWith(\"\\n\") ? \"\\n\" : \"\") +\n options.renderer.renderError(stringifyImValue(td.result) || \"tool error\") +\n \"\\n\";\n void sendSlice(false);\n return;\n }\n const callLine = options.renderer.renderToolCallSummary(id, td.parameters ?? {});\n const resultLine = options.renderer.renderToolResultSummary(id, td.result ?? null);\n buf +=\n (buf && !buf.endsWith(\"\\n\") ? \"\\n\" : \"\") +\n callLine +\n (resultLine ? `\\n${resultLine}` : \"\") +\n \"\\n\";\n void sendSlice(false);\n }\n });\n });\n}\n","import type { IIMMessageRenderer } from \"./interface.js\";\n\n/** 通用文本/Markdown 友好输出(IM 端以纯文本展示) */\nexport class TextMessageRenderer implements IIMMessageRenderer {\n renderPlainText(content: string): string {\n return content.trim();\n }\n\n renderToolCallSummary(toolName: string, arguments_: unknown): string {\n const s = (() => {\n try {\n const index = JSON.stringify(arguments_);\n if (!index || index === \"{}\") return \"\";\n return index.length > 120 ? `${index.slice(0, 117)}…` : index;\n } catch {\n return \"\";\n }\n })();\n return s ? `🔧 ${toolName}: ${s}` : `🔧 ${toolName}`;\n }\n\n renderToolResultSummary(toolName: string, result: unknown): string | null {\n // IM 默认隐藏工具结果细节:只给一个轻量摘要,避免刷屏。\n if (result == null) return `✅ ${toolName}: done`;\n if (typeof result === \"string\") {\n const t = result.trim();\n if (!t) return `✅ ${toolName}: done`;\n return `✅ ${toolName}: ${t.length > 120 ? `${t.slice(0, 117)}…` : t}`;\n }\n if (typeof result === \"object\") {\n const keys = Object.keys(result as Record<string, unknown>);\n if (keys.length === 0) return `✅ ${toolName}: done`;\n return `✅ ${toolName}: {${keys.slice(0, 6).join(\", \")}${keys.length > 6 ? \", …\" : \"\"}}`;\n }\n if (typeof result === \"symbol\") return `✅ ${toolName}: ${result.toString()}`;\n if (typeof result === \"function\") return `✅ ${toolName}: [function]`;\n if (typeof result === \"number\" || typeof result === \"boolean\" || typeof result === \"bigint\")\n return `✅ ${toolName}: ${String(result)}`;\n return `✅ ${toolName}: done`;\n }\n\n renderToolApproval(toolName: string, arguments_: unknown): string {\n return `⏸ 需要审批执行工具:${toolName}\\n参数:\\n\\`\\`\\`json\\n${JSON.stringify(arguments_, null, 2)}\\n\\`\\`\\`\\n回复 Y 同意 / N 拒绝`;\n }\n\n renderAskQuestion(question: string, options?: string[]): string {\n const lines = options?.length\n ? [`❓ ${question}`, ...options.map((o, index) => `${index + 1}. ${o}`)]\n : [`❓ ${question}`];\n return lines.join(\"\\n\");\n }\n\n renderThinking(_content: string): string | null {\n return null;\n }\n\n renderError(error: string): string {\n return `⚠️ 错误:${error}`;\n }\n\n renderTodoList(todos: Array<{ id: string; text: string; done?: boolean }>): string {\n return [\"📋 Todo\", ...todos.map((t) => `${t.done ? \"[x]\" : \"[ ]\"} ${t.text}`)].join(\"\\n\");\n }\n}\n","import type { IMChannelManager } from './channelManager.js';\nimport type { ImAgentDriver } from './interface.js';\n\n/**\n * IM 会话控制工具(计划 20.4):在带 IM binding 的会话中注入。\n * 这里仅导出工具 schema 描述,实际注册由上层 ToolRegistry 完成。\n */\nexport const imToolDefinitions = [\n {\n name: 'im.listConversations',\n description: '列出可切换的会话(由 memeloop-cli registerImSessionTools 注册,仅 IM 来源会话可用)。',\n },\n {\n name: 'im.switchConversation',\n description: '切换当前 IM 用户绑定的活跃会话。参数:{ conversationId: string }',\n },\n {\n name: 'im.newConversation',\n description: '创建新会话并切换绑定。参数:{ definitionId?: string }',\n },\n {\n name: 'im.summarizeHistory',\n description: '返回当前会话最近消息的纯文本摘要(规则拼接,非 LLM)。参数:{ maxMessages?: number }',\n },\n] as const;\n\nexport interface ImToolsRuntime {\n channelId: string;\n imUserId: string;\n manager: IMChannelManager;\n driver: ImAgentDriver;\n defaultDefinitionId: string;\n}\n\n/** 供工具实现层调用的命令式 API(避免在 core 内耦合 defineTool) */\nexport async function imSwitchConversation(rt: ImToolsRuntime, conversationId: string): Promise<void> {\n await rt.manager.switchConversation(rt.channelId, rt.imUserId, conversationId);\n}\n","export type VersionVector = Record<string, number>;\n\nexport interface ConversationMeta {\n conversationId: string;\n title: string;\n lastMessagePreview: string;\n lastMessageTimestamp: number;\n messageCount: number;\n originNodeId: string;\n definitionId: string;\n instanceDelta?: Record<string, unknown>;\n isUserInitiated: boolean;\n sourceChannel?: {\n channelId: string;\n platform: string;\n imUserId: string;\n };\n}\n\nexport function isConversationMeta(value: unknown): value is ConversationMeta {\n if (value === null || typeof value !== 'object') return false;\n const o = value as Record<string, unknown>;\n return (\n typeof o.conversationId === 'string' &&\n typeof o.title === 'string' &&\n typeof o.originNodeId === 'string' &&\n typeof o.definitionId === 'string' &&\n typeof o.messageCount === 'number' &&\n typeof o.lastMessageTimestamp === 'number' &&\n typeof o.isUserInitiated === 'boolean'\n );\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 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 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 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 content: input.content,\n contentType: input.contentType ?? 'text/plain',\n metadata: input.metadata,\n duration: input.duration,\n toolCalls: input.toolCalls,\n reasoning_content: input.reasoning_content,\n hidden: input.hidden,\n attachments: input.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 * - `isSubAgent`, `parentAgentId`: Sub-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 isSubAgent?: boolean;\n parentAgentId?: 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 isSubAgent: overrides.isSubAgent,\n parentAgentId: overrides.parentAgentId,\n agentFrameworkConfig: overrides.agentFrameworkConfig,\n };\n}\n","import type { HookType } from '../agentLoops/hooks/types.js';\nimport type { LoadedPlugin, PluginManifest, PluginModule } from './types.js';\n\nconst loadedPlugins = new Map<string, LoadedPlugin>();\n\nconst hookTypes = new Set<string>([\n 'PreToolUse',\n 'PostToolUse',\n 'UserPromptSubmit',\n 'ContextCompaction',\n 'AgentStart',\n 'AgentStop',\n]);\n\nfunction isHookType(value: unknown): value is HookType {\n return typeof value === 'string' && hookTypes.has(value);\n}\n\nexport function validatePluginManifest(object: unknown): PluginManifest | null {\n if (!object || typeof object !== 'object') return null;\n const manifest = object as Record<string, unknown>;\n if (\n typeof manifest.name !== 'string' ||\n manifest.name.trim().length === 0 ||\n typeof manifest.version !== 'string' ||\n manifest.version.trim().length === 0\n ) {\n return null;\n }\n return {\n name: manifest.name.trim(),\n version: manifest.version.trim(),\n description: typeof manifest.description === 'string' ? manifest.description : '',\n exports: validateExports(manifest.exports),\n author: typeof manifest.author === 'string' ? manifest.author : undefined,\n minMemeloopVersion: typeof manifest.minMemeloopVersion === 'string' ? manifest.minMemeloopVersion : undefined,\n };\n}\n\nfunction validateExports(object: unknown): PluginManifest['exports'] {\n if (!object || typeof object !== 'object') return undefined;\n const exportsRecord = object as Record<string, unknown>;\n return {\n tools: Array.isArray(exportsRecord.tools)\n ? exportsRecord.tools.filter((tool): tool is string => typeof tool === 'string')\n : undefined,\n hooks: Array.isArray(exportsRecord.hooks) ? exportsRecord.hooks.filter(isHookType) : undefined,\n };\n}\n\nexport interface LoadPluginModuleOptions {\n manifest: PluginManifest;\n module: PluginModule;\n api?: unknown;\n source?: string;\n}\n\nexport async function loadPluginModule(\n options: LoadPluginModuleOptions,\n): Promise<LoadedPlugin | null> {\n const { manifest, module, api, source = '' } = options;\n const validManifest = validatePluginManifest(manifest);\n if (!validManifest) return null;\n\n if (loadedPlugins.has(validManifest.name)) {\n return loadedPlugins.get(validManifest.name) ?? null;\n }\n\n if (!module || typeof module.activate !== 'function') {\n return null;\n }\n\n const cleanup = await module.activate(api as never);\n const loaded: LoadedPlugin = {\n manifest: validManifest,\n source,\n module,\n cleanup: typeof cleanup === 'function' ? cleanup : undefined,\n loadedAt: new Date(),\n };\n\n loadedPlugins.set(validManifest.name, loaded);\n return loaded;\n}\n\nexport async function loadPluginModules(\n plugins: LoadPluginModuleOptions[],\n): Promise<LoadedPlugin[]> {\n const loaded: LoadedPlugin[] = [];\n for (const plugin of plugins) {\n const result = await loadPluginModule(plugin);\n if (result) loaded.push(result);\n }\n return loaded;\n}\n\nexport function unloadPlugin(name: string): boolean {\n const loaded = loadedPlugins.get(name);\n if (!loaded) return false;\n\n try {\n loaded.cleanup?.();\n } catch (error) {\n console.warn(`[plugin] Error during cleanup of \"${name}\":`, error);\n }\n\n loadedPlugins.delete(name);\n return true;\n}\n\nexport function listPlugins(): LoadedPlugin[] {\n return Array.from(loadedPlugins.values());\n}\n\nexport function getLoadedPlugin(name: string): LoadedPlugin | undefined {\n return loadedPlugins.get(name);\n}\n\nexport function isPluginLoaded(name: string): boolean {\n return loadedPlugins.has(name);\n}\n\nexport function unloadAllPlugins(): void {\n for (const name of loadedPlugins.keys()) {\n unloadPlugin(name);\n }\n}\n","/**\n * Plugin registry: bridges plugin exports to memeloop's tool and hook registries.\n *\n * Provides a `createPluginAPI()` factory that plugins call during `activate()`\n * to register their tools and hooks with the host runtime.\n *\n * Converted from module-level singletons to an instance class for test isolation\n * and multi-runtime support.\n */\n\nimport { registerHook } from '../agentLoops/hooks/registry.js';\nimport type { HookHandler, HookType } from '../agentLoops/hooks/types.js';\nimport { registerToolParameterSchema } from '../tools/schemaRegistry.js';\nimport type { PluginAPI } from './types.js';\n\n/** Plugin API factory options. */\nexport interface PluginAPIOptions {\n toolRegistry?: {\n registerTool(id: string, impl: unknown): void;\n };\n logger?: PluginAPI['logger'];\n}\n\n/**\n * Track which tools/plugins belong to each plugin so we can clean up on unload.\n */\ninterface PluginRegistration {\n pluginName: string;\n tools: string[];\n hooks: Array<{ type: HookType; name: string }>;\n}\n\n/**\n * Instance-level plugin registration manager.\n */\nexport class PluginRegistryManager {\n private readonly pluginRegistrations = new Map<string, PluginRegistration>();\n\n private ensureRegistration(pluginName: string): PluginRegistration {\n const existing = this.pluginRegistrations.get(pluginName);\n if (existing) return existing;\n const reg: PluginRegistration = {\n pluginName,\n tools: [],\n hooks: [],\n };\n this.pluginRegistrations.set(pluginName, reg);\n return reg;\n }\n\n /**\n * Create a PluginAPI instance that plugins use to register their capabilities.\n */\n createPluginAPI(options: PluginAPIOptions = {}): PluginAPI {\n const toolRegistry = options.toolRegistry;\n const logger = options.logger ?? {\n debug: (...arguments_: unknown[]) => {\n console.debug('[plugin]', ...arguments_);\n },\n info: (...arguments_: unknown[]) => {\n console.info('[plugin]', ...arguments_);\n },\n warn: (...arguments_: unknown[]) => {\n console.warn('[plugin]', ...arguments_);\n },\n error: (...arguments_: unknown[]) => {\n console.error('[plugin]', ...arguments_);\n },\n };\n\n return {\n logger,\n\n registerTool(toolId: string, impl: (...arguments_: unknown[]) => unknown, schema?: unknown) {\n toolRegistry?.registerTool(toolId, impl);\n if (schema) {\n registerToolParameterSchema(toolId, schema as object, {\n displayName: toolId,\n description: `Plugin tool: ${toolId}`,\n });\n }\n },\n\n registerHook(type: HookType, handler: HookHandler, name?: string) {\n const hookName = name ?? `plugin-hook:${type}:${Date.now().toString(36)}`;\n registerHook(type, handler, hookName);\n },\n };\n }\n\n registerPluginTools(\n pluginName: string,\n tools: Array<readonly [string, (...arguments_: unknown[]) => unknown, unknown?]>,\n ): void {\n const reg = this.ensureRegistration(pluginName);\n for (const [toolId, , schema] of tools) {\n if (schema) {\n registerToolParameterSchema(toolId, schema as object, {\n displayName: toolId,\n description: `Plugin tool: ${toolId}`,\n });\n }\n reg.tools.push(toolId);\n }\n }\n\n registerPluginHooks(\n pluginName: string,\n hooks: Array<readonly [HookType, HookHandler, string?]>,\n ): void {\n const reg = this.ensureRegistration(pluginName);\n for (const [type, handler, name] of hooks) {\n const hookName = name ?? `plugin-hook:${pluginName}:${type}:${reg.hooks.length}`;\n registerHook(type, handler, hookName);\n reg.hooks.push({ type, name: hookName });\n }\n }\n\n getPluginRegistrations(pluginName: string): PluginRegistration | undefined {\n return this.pluginRegistrations.get(pluginName);\n }\n\n clearPluginRegistrations(): void {\n this.pluginRegistrations.clear();\n }\n}\n\n// ─── Default global instance + backward-compatible function exports ───\n\nconst defaultPluginRegistryManager = new PluginRegistryManager();\n\nexport function getDefaultPluginRegistryManager(): PluginRegistryManager {\n return defaultPluginRegistryManager;\n}\n\nexport function createPluginAPI(options: PluginAPIOptions = {}): PluginAPI {\n return defaultPluginRegistryManager.createPluginAPI(options);\n}\n\nexport function registerPluginTools(\n pluginName: string,\n tools: Array<readonly [string, (...arguments_: unknown[]) => unknown, unknown?]>,\n): void {\n defaultPluginRegistryManager.registerPluginTools(pluginName, tools);\n}\n\nexport function registerPluginHooks(\n pluginName: string,\n hooks: Array<readonly [HookType, HookHandler, string?]>,\n): void {\n defaultPluginRegistryManager.registerPluginHooks(pluginName, hooks);\n}\n\nexport function getPluginRegistrations(pluginName: string): PluginRegistration | undefined {\n return defaultPluginRegistryManager.getPluginRegistrations(pluginName);\n}\n\nexport function clearPluginRegistrations(): void {\n defaultPluginRegistryManager.clearPluginRegistrations();\n}\n","import { z } from \"zod\";\n\nimport type { IMChannelManager } from \"../../im/channelManager.js\";\nimport type { MemeLoopRuntime } from \"../../runtime.js\";\nimport type { IToolRegistry } from \"../../types.js\";\nimport type { BuiltinToolContext } from \"./types.js\";\n\nimport { registerToolParameterSchema } from \"../schemaRegistry.js\";\n\nexport const IM_SESSION_TOOL_IDS = [\n \"im.listConversations\",\n \"im.switchConversation\",\n \"im.newConversation\",\n \"im.summarizeHistory\",\n] as const;\n\nconst listSchema = z.object({});\n\nconst switchSchema = z.object({\n conversationId: z.string().min(1),\n});\n\nconst newSchema = z.object({\n definitionId: z.string().min(1).optional(),\n});\n\nconst summarizeSchema = z.object({\n maxMessages: z.number().int().positive().max(200).optional(),\n});\n\nexport interface ImSessionBuiltinRegistration {\n imChannelManager: IMChannelManager;\n getMemeLoopRuntime: () => MemeLoopRuntime;\n}\n\nfunction error(message: string): { error: string } {\n return { error: message };\n}\n\nasync function requireImSource(\n context: BuiltinToolContext,\n conversationId: string,\n): Promise<{ channelId: string; imUserId: string; platform: string } | { error: string }> {\n const meta = await context.storage.getConversationMeta(conversationId);\n const sc = meta?.sourceChannel;\n if (!sc) {\n return { error: \"im_tools_only_in_im_session\" };\n }\n return { channelId: sc.channelId, imUserId: sc.imUserId, platform: sc.platform };\n}\n\nexport async function imListConversationsImpl(\n arguments_: Record<string, unknown>,\n context: BuiltinToolContext,\n _reg: ImSessionBuiltinRegistration,\n): Promise<{ result: string } | { error: string }> {\n const parsed = listSchema.safeParse(arguments_);\n if (!parsed.success) return error(\"invalid_args\");\n const cid = context.activeToolConversationId;\n if (!cid) return error(\"no_active_conversation\");\n const source = await requireImSource(context, cid);\n if (\"error\" in source) return source;\n const all = await context.storage.listConversations({});\n if (all.length === 0) return { result: \"(暂无会话)\" };\n const sorted = [...all].sort((a, b) => b.lastMessageTimestamp - a.lastMessageTimestamp);\n const lines = sorted.map((m, index) => {\n const title = m.title || m.conversationId;\n const t = new Date(m.lastMessageTimestamp).toISOString();\n return `${index + 1}. ${title}\\n id: ${m.conversationId}\\n def: ${m.definitionId} | ${t}`;\n });\n return { result: `可切换的会话:\\n${lines.join(\"\\n\")}` };\n}\n\nexport async function imSwitchConversationImpl(\n arguments_: Record<string, unknown>,\n context: BuiltinToolContext,\n reg: ImSessionBuiltinRegistration,\n): Promise<{ result: string } | { error: string }> {\n const parsed = switchSchema.safeParse(arguments_);\n if (!parsed.success) return error(\"invalid_args\");\n const cid = context.activeToolConversationId;\n if (!cid) return error(\"no_active_conversation\");\n const source = await requireImSource(context, cid);\n if (\"error\" in source) return source;\n await reg.imChannelManager.switchConversation(\n source.channelId,\n source.imUserId,\n parsed.data.conversationId,\n );\n return { result: `已切换到会话:${parsed.data.conversationId}` };\n}\n\nexport async function imNewConversationImpl(\n arguments_: Record<string, unknown>,\n context: BuiltinToolContext,\n reg: ImSessionBuiltinRegistration,\n): Promise<{ result: string } | { error: string }> {\n const parsed = newSchema.safeParse(arguments_);\n if (!parsed.success) return error(\"invalid_args\");\n const cid = context.activeToolConversationId;\n if (!cid) return error(\"no_active_conversation\");\n const source = await requireImSource(context, cid);\n if (\"error\" in source) return source;\n const current = await reg.imChannelManager.getBinding(source.channelId, source.imUserId);\n const definitionId =\n parsed.data.definitionId?.trim() ||\n current?.defaultDefinitionId ||\n \"memeloop:general-assistant\";\n const rt = reg.getMemeLoopRuntime();\n const { conversationId } = await rt.createAgent({ definitionId, initialMessage: \"\" });\n await reg.imChannelManager.setBinding({\n channelId: source.channelId,\n imUserId: source.imUserId,\n activeConversationId: conversationId,\n createdAt: Date.now(),\n defaultDefinitionId: definitionId,\n });\n const meta = await context.storage.getConversationMeta(conversationId);\n if (meta) {\n await context.storage.upsertConversationMetadata({\n ...meta,\n sourceChannel: {\n channelId: source.channelId,\n platform: source.platform,\n imUserId: source.imUserId,\n },\n });\n }\n return {\n result: `已新建并切换到会话:${conversationId}\\ndefinition: ${definitionId}\\n请让用户发送下一条消息以开始对话。`,\n };\n}\n\nexport async function imSummarizeHistoryImpl(\n arguments_: Record<string, unknown>,\n context: BuiltinToolContext,\n _reg: ImSessionBuiltinRegistration,\n): Promise<{ result: string } | { error: string }> {\n const parsed = summarizeSchema.safeParse(arguments_);\n if (!parsed.success) return error(\"invalid_args\");\n const cid = context.activeToolConversationId;\n if (!cid) return error(\"no_active_conversation\");\n const source = await requireImSource(context, cid);\n if (\"error\" in source) return source;\n void source;\n const max = parsed.data.maxMessages ?? 40;\n const msgs = await context.storage.getMessages(cid, { mode: \"full-content\" });\n const tail = msgs.slice(-max);\n if (tail.length === 0) return { result: \"(当前会话尚无消息)\" };\n const lines = tail.map(\n (m) => `[${m.role}] ${m.content.slice(0, 2000)}${m.content.length > 2000 ? \"…\" : \"\"}`,\n );\n return {\n result: `最近 ${tail.length} 条消息摘要(供 IM 上下文):\\n${lines.join(\"\\n---\\n\")}`,\n };\n}\n\n/**\n * 注册 IM 会话专用工具(需节点传入 `imChannelManager` 与 `getMemeLoopRuntime`)。\n */\nexport function registerImSessionBuiltinTools(\n registry: IToolRegistry,\n context: BuiltinToolContext,\n reg: ImSessionBuiltinRegistration,\n): void {\n const bound =\n (function_: typeof imListConversationsImpl) => (arguments_: Record<string, unknown>) =>\n function_(arguments_, context, reg);\n\n registry.registerTool(\"im.listConversations\", bound(imListConversationsImpl));\n registry.registerTool(\"im.switchConversation\", bound(imSwitchConversationImpl));\n registry.registerTool(\"im.newConversation\", bound(imNewConversationImpl));\n registry.registerTool(\"im.summarizeHistory\", bound(imSummarizeHistoryImpl));\n\n registerToolParameterSchema(\"im.listConversations\", listSchema, {\n displayName: \"IM: list conversations\",\n description: \"List conversations the user can switch to (IM sessions only).\",\n });\n registerToolParameterSchema(\"im.switchConversation\", switchSchema, {\n displayName: \"IM: switch conversation\",\n description: \"Switch this IM user binding to another conversationId.\",\n });\n registerToolParameterSchema(\"im.newConversation\", newSchema, {\n displayName: \"IM: new conversation\",\n description: \"Create a new agent conversation and bind this IM user to it.\",\n });\n registerToolParameterSchema(\"im.summarizeHistory\", summarizeSchema, {\n displayName: \"IM: summarize history\",\n description: \"Return a plain-text digest of recent messages in the current conversation.\",\n });\n}\n","import {\n BUILTIN_TOOL_PLUGIN_IDS,\n registerBuiltinToolPlugins,\n} from \"../../agentLoops/plugins/builtinToolsPlugin.js\";\nimport { getLoopRegistry } from \"../../agentLoops/registry.js\";\nimport { registerBuiltinPromptPlugins } from \"../../promptUtilities/builtinPromptPlugins.js\";\nimport type { IToolRegistry } from \"../../types.js\";\nimport { pluginRegistry } from \"../pluginRegistry.js\";\nimport type { BuiltinToolContext } from \"./types.js\";\n\nexport { ASK_QUESTION_TOOL_ID, askQuestionConfigSchema, askQuestionImpl } from \"./askQuestion.js\";\nexport {\n ASK_USER_QUESTION_TOOL_ID,\n askUserQuestionConfigSchema,\n askUserQuestionImpl,\n} from \"./askUserQuestion.js\";\nexport {\n IM_SESSION_TOOL_IDS,\n type ImSessionBuiltinRegistration,\n registerImSessionBuiltinTools,\n} from \"./imBuiltinTools.js\";\nexport { getMcpClientToolId, mcpClientConfigSchema, mcpClientImpl } from \"./mcpClient.js\";\nexport { getMcpForwardToolId, mcpForwardConfigSchema, mcpForwardImpl } from \"./mcpForward.js\";\nexport { resolveQuestionAnswer } from \"./questionWaitRegistry.js\";\nexport {\n getRemoteAgentToolId,\n remoteAgentConfigSchema,\n remoteAgentImpl,\n remoteAgentListImpl,\n} from \"./remoteAgent.js\";\nexport { getSpawnAgentToolId, spawnAgentConfigSchema, spawnAgentImpl } from \"./spawnAgent.js\";\nexport { getTaskToolId, taskToolConfigSchema, taskToolImpl } from \"./task.js\";\nexport {\n __clearTodoStore,\n TODO_WRITE_TOOL_ID,\n todoWriteConfigSchema,\n todoWriteImpl,\n} from \"./todoWrite.js\";\nexport type { BuiltinToolContext, BuiltinToolImpl } from \"./types.js\";\n\n/**\n * Register framework-level builtin tools (agent orchestration, user interaction, MCP).\n *\n * Environment-specific tools (bash, file*, grep, glob, git, webFetch, webSearch, lsp)\n * must be registered by the host environment (e.g. memeloop-cli via registerNodeEnvironmentTools).\n */\nexport function registerBuiltinTools(registry: IToolRegistry, context: BuiltinToolContext): void {\n const promptDestination = registry.getPromptPlugins?.();\n if (promptDestination) {\n for (const [id, tool] of pluginRegistry) {\n promptDestination.set(id, tool);\n }\n registerBuiltinPromptPlugins(promptDestination);\n } else {\n registerBuiltinPromptPlugins();\n }\n\n registerBuiltinToolPlugins();\n getLoopRegistry().installPluginsForLoop(\"*\", { ...context, toolRegistry: registry }, [\n ...BUILTIN_TOOL_PLUGIN_IDS,\n ]);\n}\n","/**\n * TidGi `parallelExecution.ts` 迁移。\n */\nimport type { ToolCallingMatch } from '../promptUtilities/responsePatternUtility.js';\nimport type { ToolExecutionResult } from './defineToolTypes.js';\n\nconst DEFAULT_TOOL_TIMEOUT_MS = 30_000;\nconst DEFAULT_BATCH_TIMEOUT_MS = 120_000;\n\nexport interface ToolCallEntry {\n call: ToolCallingMatch & { found: true };\n executor: (parameters: Record<string, unknown>) => Promise<ToolExecutionResult>;\n timeoutMs?: number;\n}\n\nexport interface ToolCallResult {\n call: ToolCallingMatch & { found: true };\n status: 'fulfilled' | 'rejected' | 'timeout';\n result?: ToolExecutionResult;\n error?: string;\n}\n\nasync function executeWithTimeout(entry: ToolCallEntry): Promise<ToolCallResult> {\n const timeoutMs = entry.timeoutMs ?? DEFAULT_TOOL_TIMEOUT_MS;\n\n return new Promise<ToolCallResult>((resolve) => {\n let settled = false;\n\n const timer = timeoutMs > 0\n ? setTimeout(() => {\n if (!settled) {\n settled = true;\n resolve({\n call: entry.call,\n status: 'timeout',\n error: `Tool \"${entry.call.toolId}\" timed out after ${timeoutMs}ms`,\n });\n }\n }, timeoutMs)\n : undefined;\n\n entry\n .executor(entry.call.parameters ?? {})\n .then((result) => {\n if (!settled) {\n settled = true;\n if (timer) clearTimeout(timer);\n resolve({ call: entry.call, status: 'fulfilled', result });\n }\n })\n .catch((error: unknown) => {\n if (!settled) {\n settled = true;\n if (timer) clearTimeout(timer);\n resolve({\n call: entry.call,\n status: 'rejected',\n result: {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n },\n error: error instanceof Error ? error.message : String(error),\n });\n }\n });\n });\n}\n\nexport async function executeToolCallsParallel(\n entries: ToolCallEntry[],\n batchTimeoutMs: number = DEFAULT_BATCH_TIMEOUT_MS,\n): Promise<ToolCallResult[]> {\n if (entries.length === 0) return [];\n if (entries.length === 1) {\n return [await executeWithTimeout(entries[0])];\n }\n\n const promises = entries.map((entry) => executeWithTimeout(entry));\n\n if (batchTimeoutMs > 0) {\n const batchTimer = new Promise<ToolCallResult[]>((resolve) => {\n setTimeout(() => {\n resolve(\n entries.map((entry) => ({\n call: entry.call,\n status: 'timeout' as const,\n error: `Batch timeout: ${batchTimeoutMs}ms exceeded`,\n })),\n );\n }, batchTimeoutMs);\n });\n\n return Promise.race([Promise.all(promises), batchTimer]);\n }\n\n return Promise.all(promises);\n}\n\nexport async function executeToolCallsSequential(\n entries: ToolCallEntry[],\n): Promise<ToolCallResult[]> {\n const results: ToolCallResult[] = [];\n for (const entry of entries) {\n results.push(await executeWithTimeout(entry));\n }\n return results;\n}\n","/**\n * Generate tool description for prompt injection from zod v4 schema definitions.\n */\nimport type { z } from 'zod';\n\nexport function schemaToToolContent(schema: z.ZodType) {\n const jsonSchema = (schema as unknown as { toJSONSchema?: () => Record<string, unknown> }).toJSONSchema?.() ??\n ({} as Record<string, unknown>);\n\n // zod v4 stores title/description/examples in .meta()\n const meta = Array.isArray((schema as unknown as { meta?: Array<Record<string, unknown>> }).meta)\n ? (schema as unknown as { meta?: Array<Record<string, unknown>> }).meta?.[0]\n : undefined;\n\n const title = (meta?.title as string) || (jsonSchema.title as string) || 'tool';\n const description = (meta?.description as string) || (jsonSchema.description as string) || '';\n const examples = (meta?.examples as Array<Record<string, unknown>>) ||\n (jsonSchema.examples as Array<Record<string, unknown>>) ||\n [];\n\n const props = jsonSchema.properties as Record<string, unknown> | undefined;\n const requiredArray = Array.isArray(jsonSchema.required) ? (jsonSchema.required as string[]) : [];\n\n let parameterLines = '';\n if (props) {\n parameterLines = Object.entries(props)\n .map(([key, value]) => {\n const p = value as Record<string, unknown> | undefined;\n const type = (p?.type as string) || 'string';\n const desc = (p?.description as string) || (p?.title as string) || '';\n const required = requiredArray.includes(key) ? 'required' : 'optional';\n return `- ${key} (${type}, ${required}): ${desc}`;\n })\n .join('\\n');\n }\n\n const exampleSection = examples\n .map((example) => `- <tool_use name=\"${title}\">${JSON.stringify(example)}</tool_use>`)\n .join('\\n');\n\n return `\\n## ${title}\\n**Description**: ${description}\\n**Parameters**:\\n${parameterLines}\\n\\n**Examples**:\\n${exampleSection}\\n`;\n}\n","/**\n * TidGi `defineTool.ts` 逐行迁移;持久化改为 `AgentFrameworkContext.persistAgentMessage`(memeloop)。\n */\nimport type { z } from 'zod';\n\nimport type { ChatMessage } from '../conversation/index.js';\nimport { findPromptById } from '../promptUtilities/promptConcat.js';\nimport { matchAllToolCallings } from '../promptUtilities/responsePatternUtility.js';\nimport type { ToolCallingMatch } from '../promptUtilities/responsePatternUtility.js';\nimport type { IPrompt } from '../promptUtilities/types.js';\nimport { evaluateApproval, requestApproval } from './approval.js';\nimport type {\n AddToolResultOptions,\n InjectContentOptions,\n InjectToolListOptions,\n PostProcessHandlerContext,\n ResponseHandlerContext,\n ToolDefinition,\n ToolExecutionResult,\n ToolHandlerContext,\n} from './defineToolTypes.js';\nimport { executeToolCallsParallel, executeToolCallsSequential } from './parallelExecution.js';\nimport { getActivePluginRegistry } from './pluginRegistry.js';\nimport { schemaToToolContent } from './schemaToToolContent.js';\nimport type { AIResponseContext, PostProcessContext, PromptConcatHookContext, PromptConcatTool } from './types.js';\n\nconst MAX_TOOL_RESULT_CHARS = 32_000;\n\nconst logger = {\n debug: (..._a: unknown[]) => {},\n warn: (...a: unknown[]) => {\n console.warn('[memeloop.defineTool]', ...a);\n },\n error: (...a: unknown[]) => {\n console.error('[memeloop.defineTool]', ...a);\n },\n};\n\nexport type {\n AddToolResultOptions,\n InjectContentOptions,\n InjectToolListOptions,\n PostProcessHandlerContext,\n ResponseHandlerContext,\n ToolDefinition,\n ToolExecutionResult,\n ToolHandlerContext,\n} from './defineToolTypes.js';\n\nexport function defineTool<\n TConfigSchema extends z.ZodType,\n TLLMToolSchemas extends Record<string, z.ZodType> = Record<string, z.ZodType>,\n>(\n definition: ToolDefinition<TConfigSchema, TLLMToolSchemas>,\n): {\n tool: PromptConcatTool;\n toolId: string;\n configSchema: TConfigSchema;\n llmToolSchemas: TLLMToolSchemas | undefined;\n displayName: string;\n description: string;\n} {\n const {\n toolId,\n configSchema,\n llmToolSchemas,\n onProcessPrompts,\n onResponseComplete,\n onPostProcess,\n } = definition;\n const parameterKey = `${toolId}Param`;\n\n const tool: PromptConcatTool = (hooks) => {\n if (onProcessPrompts) {\n hooks.processPrompts.tapAsync(`${toolId}-processPrompts`, async (context, callback) => {\n try {\n const { toolConfig, prompts, messages, agentFrameworkContext } = context as PromptConcatHookContext;\n\n if (toolConfig.toolId !== toolId) {\n callback();\n return;\n }\n\n if (toolConfig.enabled === false) {\n callback();\n return;\n }\n\n const rawConfig: unknown = toolConfig[parameterKey];\n if (!rawConfig) {\n callback();\n return;\n }\n\n const config = configSchema.parse(rawConfig) as z.infer<TConfigSchema>;\n\n const handlerContext: ToolHandlerContext<TConfigSchema> = {\n config,\n toolConfig,\n prompts: prompts,\n messages,\n agentFrameworkContext,\n\n findPrompt: (id: string) => findPromptById(prompts, id),\n\n injectToolList: (options: InjectToolListOptions) => {\n const target = findPromptById(prompts, options.targetId);\n if (!target) {\n logger.warn(`Target prompt not found for tool list injection`, {\n targetId: options.targetId,\n toolId,\n });\n return;\n }\n\n const schemas = options.toolSchemas ?? (llmToolSchemas ? Object.values(llmToolSchemas) : []);\n const toolContent = schemas.map((schema) => schemaToToolContent(schema)).join('\\n\\n');\n\n const pluginIndex = (context as PromptConcatHookContext).pluginIndex;\n const source = pluginIndex !== undefined ? ['plugins', toolConfig.id] : undefined;\n\n const toolPrompt: IPrompt = {\n id: `${toolId}-tool-list-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`,\n text: toolContent,\n caption: options.caption ?? `${definition.displayName} Tools`,\n enabled: true,\n source,\n };\n\n if (options.position === 'child') {\n if (!target.prompt.children) {\n target.prompt.children = [];\n }\n target.prompt.children.push(toolPrompt);\n } else if (options.position === 'before') {\n target.parent.splice(target.index, 0, toolPrompt);\n } else {\n target.parent.splice(target.index + 1, 0, toolPrompt);\n }\n },\n\n injectContent: (options: InjectContentOptions) => {\n const target = findPromptById(prompts, options.targetId);\n if (!target) {\n logger.warn(`Target prompt not found for content injection`, {\n targetId: options.targetId,\n toolId,\n });\n return;\n }\n\n const pluginIndex = (context as PromptConcatHookContext).pluginIndex;\n const source = pluginIndex !== undefined ? ['plugins', toolConfig.id] : undefined;\n\n const contentPrompt: IPrompt = {\n id: options.id ??\n `${toolId}-content-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`,\n text: options.content,\n caption: options.caption ?? 'Injected Content',\n enabled: true,\n source,\n };\n\n if (options.position === 'child') {\n if (!target.prompt.children) {\n target.prompt.children = [];\n }\n target.prompt.children.push(contentPrompt);\n } else if (options.position === 'before') {\n target.parent.splice(target.index, 0, contentPrompt);\n } else {\n target.parent.splice(target.index + 1, 0, contentPrompt);\n }\n },\n };\n\n await onProcessPrompts(handlerContext);\n callback();\n } catch (error) {\n logger.error(`Error in ${toolId} processPrompts handler`, error);\n callback();\n }\n });\n }\n\n if (onResponseComplete) {\n hooks.responseComplete.tapAsync(`${toolId}-responseComplete`, async (context, callback) => {\n try {\n const {\n agentFrameworkContext,\n response,\n agentFrameworkConfig,\n requestId,\n toolConfig: directToolConfig,\n } = context as AIResponseContext & {\n toolConfig?: PromptConcatHookContext['toolConfig'];\n actions?: { yieldNextRoundTo?: 'human' | 'self' };\n };\n\n const configuredToolConfig = agentFrameworkConfig?.plugins?.find(\n (p) => p.toolId === toolId,\n );\n const ourToolConfig = configuredToolConfig ??\n (directToolConfig?.toolId === toolId ? directToolConfig : undefined);\n\n if (!ourToolConfig) {\n callback();\n return;\n }\n\n if (ourToolConfig.enabled === false) {\n callback();\n return;\n }\n\n if (response.status !== 'done' || !response.content) {\n callback();\n return;\n }\n\n const { calls: allCalls, parallel: isParallel } = matchAllToolCallings(response.content);\n const toolCall = allCalls.length > 0 ? allCalls[0] : null;\n\n const rawConfig: unknown = ourToolConfig[parameterKey];\n let config: z.infer<TConfigSchema> | undefined;\n if (rawConfig) {\n try {\n config = configSchema.parse(rawConfig) as z.infer<TConfigSchema>;\n } catch (parseError) {\n logger.warn(`Failed to parse config for ${toolId}`, parseError);\n }\n }\n\n const persist = agentFrameworkContext.persistAgentMessage;\n\n const handlerContext: ResponseHandlerContext<TConfigSchema, TLLMToolSchemas> = {\n config,\n toolConfig: ourToolConfig,\n messages: agentFrameworkContext.agent.messages,\n agentFrameworkContext,\n response,\n toolCall,\n allToolCalls: allCalls,\n isParallel,\n agentFrameworkConfig,\n hooks,\n requestId,\n\n findPrompt: () => undefined,\n\n injectToolList: () => {\n logger.warn('injectToolList is not available in response phase');\n },\n\n injectContent: () => {\n logger.warn('injectContent is not available in response phase');\n },\n\n executeToolCall: async <TToolName extends keyof TLLMToolSchemas>(\n toolName: TToolName,\n executor: (\n parameters: z.infer<TLLMToolSchemas[TToolName]>,\n ) => Promise<ToolExecutionResult>,\n ): Promise<boolean> => {\n const toolNameString = String(toolName);\n if (!toolCall || toolCall.toolId !== toolNameString) {\n return false;\n }\n\n const toolSchema = llmToolSchemas?.[toolName];\n if (!toolSchema) {\n logger.error(`No schema found for tool: ${toolNameString}`);\n return false;\n }\n\n try {\n const validatedParameters = toolSchema.parse(toolCall.parameters) as z.infer<\n TLLMToolSchemas[TToolName]\n >;\n\n const approvalConfig = ourToolConfig.approval;\n const decision = evaluateApproval(\n approvalConfig,\n toolNameString,\n validatedParameters as Record<string, unknown>,\n );\n if (decision === 'deny') {\n handlerContext.addToolResult({\n toolName: toolNameString,\n parameters: validatedParameters,\n result: 'Tool execution denied by approval policy.',\n isError: true,\n duration: 2,\n });\n handlerContext.yieldToSelf();\n return true;\n }\n if (decision === 'pending') {\n const approvalId = `approval-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;\n const userDecision = await requestApproval({\n approvalId,\n agentId: agentFrameworkContext.agent.id,\n toolName: toolNameString,\n parameters: validatedParameters as Record<string, unknown>,\n originalText: toolCall.originalText,\n created: new Date(),\n });\n if (userDecision === 'deny') {\n handlerContext.addToolResult({\n toolName: toolNameString,\n parameters: validatedParameters,\n result: 'Tool execution denied by user.',\n isError: true,\n duration: 2,\n });\n handlerContext.yieldToSelf();\n return true;\n }\n }\n\n const result = await executor(validatedParameters);\n\n const toolResultDuration = (config as { toolResultDuration?: number } | undefined)?.toolResultDuration ?? 1;\n handlerContext.addToolResult({\n toolName: toolNameString,\n parameters: validatedParameters,\n result: result.success\n ? (result.data ?? 'Success')\n : (result.error ?? 'Unknown error'),\n isError: !result.success,\n duration: toolResultDuration,\n });\n\n handlerContext.yieldToSelf();\n\n await hooks.toolExecuted.promise({\n agentFrameworkContext,\n toolResult: result,\n toolInfo: {\n toolId: toolNameString,\n parameters: validatedParameters as Record<string, unknown>,\n originalText: toolCall.originalText,\n },\n requestId,\n });\n\n return true;\n } catch (error) {\n logger.error(`Tool execution failed: ${toolNameString}`, error);\n\n handlerContext.addToolResult({\n toolName: toolNameString,\n parameters: toolCall.parameters,\n result: error instanceof Error ? error.message : String(error),\n isError: true,\n duration: 2,\n });\n\n handlerContext.yieldToSelf();\n\n await hooks.toolExecuted.promise({\n agentFrameworkContext,\n toolResult: {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n },\n toolInfo: {\n toolId: toolNameString,\n parameters: toolCall.parameters || {},\n },\n });\n\n return true;\n }\n },\n\n addToolResult: (options: AddToolResultOptions) => {\n const now = new Date();\n\n let resultContent = options.result;\n if (resultContent.length > MAX_TOOL_RESULT_CHARS) {\n const truncated = resultContent.slice(0, MAX_TOOL_RESULT_CHARS);\n resultContent = `${truncated}\\n\\n[... truncated — result was ${options.result.length} chars, showing first ${MAX_TOOL_RESULT_CHARS}]`;\n }\n\n const toolResultText = `<functions_result>\nTool: ${options.toolName}\nParameters: ${JSON.stringify(options.parameters)}\n${options.isError ? 'Error' : 'Result'}: ${resultContent}\n</functions_result>`;\n\n const toolResultMessage: ChatMessage = {\n messageId: `tool-result-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`,\n conversationId: agentFrameworkContext.agent.id,\n originNodeId: 'local',\n timestamp: now.getTime(),\n lamportClock: 0,\n role: 'tool',\n content: toolResultText,\n duration: options.duration ?? 1,\n metadata: {\n isToolResult: true,\n isError: options.isError ?? false,\n toolId: options.toolName,\n toolParameters: options.parameters,\n isPersisted: false,\n isComplete: true,\n },\n };\n\n agentFrameworkContext.agent.messages.push(toolResultMessage);\n\n const aiMessages = agentFrameworkContext.agent.messages.filter(\n (m) => m.role === 'assistant',\n );\n if (aiMessages.length > 0) {\n const latestAiMessage = aiMessages[aiMessages.length - 1];\n if (\n latestAiMessage.content === response.content &&\n !latestAiMessage.metadata?.containsToolCall\n ) {\n latestAiMessage.duration = 1;\n latestAiMessage.metadata = {\n ...latestAiMessage.metadata,\n containsToolCall: true,\n toolId: options.toolName,\n isPersisted: true,\n };\n\n if (persist) {\n void (async () => {\n try {\n await persist(latestAiMessage);\n } catch (error) {\n logger.warn('Failed to persist AI message with tool call', {\n error,\n messageId: latestAiMessage.messageId,\n });\n }\n })();\n }\n }\n }\n\n if (persist) {\n void (async () => {\n try {\n await persist(toolResultMessage);\n toolResultMessage.metadata = {\n ...toolResultMessage.metadata,\n isPersisted: true,\n };\n } catch (error) {\n logger.warn('Failed to persist tool result', {\n error,\n messageId: toolResultMessage.messageId,\n });\n }\n })();\n }\n },\n\n yieldToSelf: () => {\n const context_ = context as { actions?: { yieldNextRoundTo?: 'human' | 'self' } };\n if (!context_.actions) {\n context_.actions = {};\n }\n context_.actions.yieldNextRoundTo = 'self';\n },\n\n yieldToHuman: () => {\n const context_ = context as { actions?: { yieldNextRoundTo?: 'human' | 'self' } };\n if (!context_.actions) {\n context_.actions = {};\n }\n context_.actions.yieldNextRoundTo = 'human';\n },\n\n executeAllMatchingToolCalls: async <TToolName extends keyof TLLMToolSchemas>(\n toolName: TToolName,\n executor: (\n parameters: z.infer<TLLMToolSchemas[TToolName]>,\n ) => Promise<ToolExecutionResult>,\n options?: { timeoutMs?: number },\n ): Promise<number> => {\n const toolNameString = String(toolName);\n const matchingCalls = allCalls.filter((call) => call.toolId === toolNameString);\n if (matchingCalls.length === 0) return 0;\n\n const toolSchema = llmToolSchemas?.[toolName];\n if (!toolSchema) {\n logger.error(`No schema found for tool: ${toolNameString}`);\n return 0;\n }\n\n const toolResultDuration = (config as { toolResultDuration?: number } | undefined)?.toolResultDuration ?? 1;\n\n const entries: Array<{\n call: ToolCallingMatch & { found: true };\n executor: (parameters: Record<string, unknown>) => Promise<ToolExecutionResult>;\n timeoutMs?: number;\n }> = [];\n\n const approvalConfig = ourToolConfig.approval;\n const batchDecision = evaluateApproval(\n approvalConfig,\n toolNameString,\n matchingCalls[0]?.parameters ?? {},\n );\n if (batchDecision === 'deny') {\n for (const call of matchingCalls) {\n handlerContext.addToolResult({\n toolName: toolNameString,\n parameters: call.parameters,\n result: 'Tool execution denied by approval policy.',\n isError: true,\n duration: toolResultDuration,\n });\n }\n handlerContext.yieldToSelf();\n return matchingCalls.length;\n }\n if (batchDecision === 'pending') {\n const approvalId = `approval-batch-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;\n const userDecision = await requestApproval({\n approvalId,\n agentId: agentFrameworkContext.agent.id,\n toolName: toolNameString,\n parameters: {\n _batchSize: matchingCalls.length,\n _firstCallParams: matchingCalls[0]?.parameters,\n },\n created: new Date(),\n });\n if (userDecision === 'deny') {\n for (const call of matchingCalls) {\n handlerContext.addToolResult({\n toolName: toolNameString,\n parameters: call.parameters,\n result: 'Tool execution denied by user.',\n isError: true,\n duration: toolResultDuration,\n });\n }\n handlerContext.yieldToSelf();\n return matchingCalls.length;\n }\n }\n\n for (const call of matchingCalls) {\n try {\n const validatedParameters = toolSchema.parse(call.parameters) as z.infer<\n TLLMToolSchemas[TToolName]\n >;\n entries.push({\n call,\n executor: async () => executor(validatedParameters),\n timeoutMs: options?.timeoutMs,\n });\n } catch (validationError) {\n handlerContext.addToolResult({\n toolName: toolNameString,\n parameters: call.parameters,\n result: `Parameter validation failed: ${validationError instanceof Error ? validationError.message : String(validationError)}`,\n isError: true,\n duration: toolResultDuration,\n });\n }\n }\n\n if (entries.length === 0) return matchingCalls.length;\n\n let results: Array<{\n call: ToolCallingMatch & { found: true };\n status: string;\n result?: ToolExecutionResult;\n error?: string;\n }>;\n if (isParallel) {\n results = await executeToolCallsParallel(entries);\n } else {\n results = await executeToolCallsSequential(entries);\n }\n\n for (const result of results) {\n const isError = result.status !== 'fulfilled' ||\n (result.result !== undefined && !result.result.success);\n const resultText = result.status === 'timeout'\n ? (result.error ?? 'Tool execution timed out')\n : result.status === 'rejected'\n ? (result.error ?? 'Tool execution failed')\n : result.result?.success\n ? (result.result.data ?? 'Success')\n : (result.result?.error ?? 'Unknown error');\n\n handlerContext.addToolResult({\n toolName: toolNameString,\n parameters: result.call.parameters,\n result: resultText,\n isError,\n duration: toolResultDuration,\n });\n\n await hooks.toolExecuted.promise({\n agentFrameworkContext,\n toolResult: result.result ?? { success: false, error: resultText },\n toolInfo: {\n toolId: toolNameString,\n parameters: result.call.parameters ?? {},\n originalText: result.call.originalText,\n },\n requestId,\n });\n }\n\n handlerContext.yieldToSelf();\n return matchingCalls.length;\n },\n };\n\n await onResponseComplete(handlerContext);\n callback();\n } catch (error) {\n logger.error(`Error in ${toolId} responseComplete handler`, error);\n callback();\n }\n });\n }\n\n if (onPostProcess) {\n hooks.postProcess.tapAsync(\n `${toolId}-postProcess`,\n async (context: PostProcessContext, callback) => {\n try {\n const { toolConfig, prompts, messages, agentFrameworkContext, llmResponse, responses } = context;\n\n if (toolConfig.toolId !== toolId) {\n callback();\n return;\n }\n\n if (toolConfig.enabled === false) {\n callback();\n return;\n }\n\n const rawConfig: unknown = toolConfig[parameterKey];\n if (!rawConfig) {\n callback();\n return;\n }\n\n const config = configSchema.parse(rawConfig) as z.infer<TConfigSchema>;\n\n const handlerContext: PostProcessHandlerContext<TConfigSchema> = {\n config,\n toolConfig,\n prompts: prompts,\n messages,\n agentFrameworkContext,\n llmResponse,\n responses,\n\n findPrompt: (id: string) => findPromptById(prompts, id),\n\n injectToolList: () => {\n logger.warn('injectToolList is not recommended in postProcess phase');\n },\n\n injectContent: () => {\n logger.warn('injectContent is not recommended in postProcess phase');\n },\n };\n\n await onPostProcess(handlerContext);\n callback();\n } catch (error) {\n logger.error(`Error in ${toolId} postProcess handler`, error);\n callback();\n }\n },\n );\n }\n };\n\n getActivePluginRegistry().set(toolId, tool);\n\n return {\n tool,\n toolId,\n configSchema,\n llmToolSchemas,\n displayName: definition.displayName,\n description: definition.description,\n };\n}\n","/**\n * Host agent tool configuration → prompt plugin mapping.\n * Every host (Desktop, CLI, Cloud) that defines agent tools needs this merge logic.\n * Defined once in memeloop so each host doesn't reimplement it.\n */\n\nimport type { AgentDefinitionToolConfig } from '../agent/types.js';\nimport type { AgentFrameworkConfig, PromptPluginConfig } from '../promptUtilities/types.js';\n\nexport type HostAgentToolConfig = AgentDefinitionToolConfig;\n\nfunction isPluginConfig(value: unknown): value is Record<string, unknown> & { toolId?: string } {\n return typeof value === 'object' && value !== null;\n}\n\nexport function mergeAgentToolsIntoFrameworkConfig(\n frameworkConfig: AgentFrameworkConfig | undefined,\n agentTools: HostAgentToolConfig[] | undefined,\n): AgentFrameworkConfig {\n const baseConfig = { ...(frameworkConfig ?? {}) };\n const rawPlugins = Array.isArray(baseConfig.plugins) ? baseConfig.plugins : [];\n const pluginByToolId = new Map<string, Record<string, unknown>>();\n const pluginWithoutToolId: unknown[] = [];\n\n for (const plugin of rawPlugins) {\n if (isPluginConfig(plugin) && typeof plugin.toolId === 'string' && plugin.toolId.length > 0) {\n pluginByToolId.set(plugin.toolId, plugin);\n } else {\n pluginWithoutToolId.push(plugin);\n }\n }\n\n for (const tool of agentTools ?? []) {\n if (!tool.toolId) continue;\n pluginByToolId.set(tool.toolId, {\n id: `${tool.toolId}-agent-tool`,\n toolId: tool.toolId,\n enabled: tool.enabled ?? true,\n ...(tool.parameters ?? {}),\n });\n }\n\n return {\n ...baseConfig,\n prompts: Array.isArray(baseConfig.prompts) ? baseConfig.prompts : [],\n response: Array.isArray(baseConfig.response) ? baseConfig.response : undefined,\n plugins: [...pluginWithoutToolId, ...pluginByToolId.values()] as PromptPluginConfig[],\n };\n}\n","/**\n * Tool definition registry.\n * Converted from module-level singletons to an instance class for test isolation\n * and multi-runtime support.\n */\nimport type { z } from 'zod';\n\nimport { defineTool } from './defineTool.js';\nimport type { DefinedTool, ToolDefinition } from './defineToolTypes.js';\nimport { registerToolParameterSchema } from './schemaRegistry.js';\n\n/**\n * Instance-level tool definition registry.\n */\nexport class ToolDefinitionRegistry {\n private readonly registry = new Map<string, DefinedTool>();\n\n registerToolDefinition<\n TConfigSchema extends z.ZodType,\n TLLMToolSchemas extends Record<string, z.ZodType>,\n >(definition: ToolDefinition<TConfigSchema, TLLMToolSchemas>): DefinedTool<TConfigSchema, TLLMToolSchemas> {\n const toolDefinition = defineTool(definition);\n\n registerToolParameterSchema(toolDefinition.toolId, toolDefinition.configSchema as object, {\n displayName: toolDefinition.displayName,\n description: toolDefinition.description,\n });\n\n this.registry.set(toolDefinition.toolId, toolDefinition as DefinedTool);\n return toolDefinition as DefinedTool<TConfigSchema, TLLMToolSchemas>;\n }\n\n getAllToolDefinitions(): Map<string, DefinedTool> {\n return this.registry;\n }\n\n getToolDefinition(toolId: string): DefinedTool | undefined {\n return this.registry.get(toolId);\n }\n}\n\n// ─── Default global instance + backward-compatible function exports ───\n\nconst defaultToolDefinitionRegistry = new ToolDefinitionRegistry();\n\nexport function getDefaultToolDefinitionRegistry(): ToolDefinitionRegistry {\n return defaultToolDefinitionRegistry;\n}\n\nexport function registerToolDefinition<\n TConfigSchema extends z.ZodType,\n TLLMToolSchemas extends Record<string, z.ZodType>,\n>(definition: ToolDefinition<TConfigSchema, TLLMToolSchemas>): DefinedTool<TConfigSchema, TLLMToolSchemas> {\n return defaultToolDefinitionRegistry.registerToolDefinition(definition);\n}\n\nexport function getAllToolDefinitions(): Map<string, DefinedTool> {\n return defaultToolDefinitionRegistry.getAllToolDefinitions();\n}\n\nexport function getToolDefinition(toolId: string): DefinedTool | undefined {\n return defaultToolDefinitionRegistry.getToolDefinition(toolId);\n}\n"],"mappings":"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","names":["max","error","error","chunkToText","error","error","pending","chunkToText","pending","error","isAsyncIterable","error","error","z","z","error","error","TOOL_ID","TOOL_ID","nodeId","error","message","TOOL_ID","error","message","defaultRegistry","TOOL_ID","error","z","removed","error","emptyCapabilities","o","error","error","logger","z","z","error","logger","error"]}
|