memeloop 0.0.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/dist/anthropic.cjs +72 -0
- package/dist/anthropic.cjs.map +1 -0
- package/dist/anthropic.d.cts +21 -0
- package/dist/anthropic.d.ts +21 -0
- package/dist/anthropic.js +21 -0
- package/dist/anthropic.js.map +1 -0
- package/dist/azure.cjs +72 -0
- package/dist/azure.cjs.map +1 -0
- package/dist/azure.d.cts +21 -0
- package/dist/azure.d.ts +21 -0
- package/dist/azure.js +21 -0
- package/dist/azure.js.map +1 -0
- package/dist/chunk-3CN7DFBL.js +4894 -0
- package/dist/chunk-3CN7DFBL.js.map +1 -0
- package/dist/chunk-4AZ4D7U5.js +32 -0
- package/dist/chunk-4AZ4D7U5.js.map +1 -0
- package/dist/chunk-6ON4XSOV.js +63 -0
- package/dist/chunk-6ON4XSOV.js.map +1 -0
- package/dist/chunk-DJQNGIXX.js +4793 -0
- package/dist/chunk-DJQNGIXX.js.map +1 -0
- package/dist/chunk-FKQP6AOQ.js +32 -0
- package/dist/chunk-FKQP6AOQ.js.map +1 -0
- package/dist/chunk-OVJ7JJBA.js +35 -0
- package/dist/chunk-OVJ7JJBA.js.map +1 -0
- package/dist/chunk-P4UZ7IXC.js +42 -0
- package/dist/chunk-P4UZ7IXC.js.map +1 -0
- package/dist/chunk-YHJ2AEFR.js +4933 -0
- package/dist/chunk-YHJ2AEFR.js.map +1 -0
- package/dist/chunk-YVK7RYRO.js +4973 -0
- package/dist/chunk-YVK7RYRO.js.map +1 -0
- package/dist/code-assistant.json +114 -0
- package/dist/cohere.cjs +72 -0
- package/dist/cohere.cjs.map +1 -0
- package/dist/cohere.d.cts +21 -0
- package/dist/cohere.d.ts +21 -0
- package/dist/cohere.js +21 -0
- package/dist/cohere.js.map +1 -0
- package/dist/deepseek.cjs +72 -0
- package/dist/deepseek.cjs.map +1 -0
- package/dist/deepseek.d.cts +21 -0
- package/dist/deepseek.d.ts +21 -0
- package/dist/deepseek.js +21 -0
- package/dist/deepseek.js.map +1 -0
- package/dist/dist-65U7OYRG.js +1257 -0
- package/dist/dist-65U7OYRG.js.map +1 -0
- package/dist/fetchProvider-Cu4WkU5O.d.cts +819 -0
- package/dist/fetchProvider-Cu4WkU5O.d.ts +819 -0
- package/dist/frontend-ui-ux.json +105 -0
- package/dist/general-assistant.json +95 -0
- package/dist/git-master.json +51 -0
- package/dist/google-vertex.cjs +72 -0
- package/dist/google-vertex.cjs.map +1 -0
- package/dist/google-vertex.d.cts +21 -0
- package/dist/google-vertex.d.ts +21 -0
- package/dist/google-vertex.js +21 -0
- package/dist/google-vertex.js.map +1 -0
- package/dist/google.cjs +72 -0
- package/dist/google.cjs.map +1 -0
- package/dist/google.d.cts +21 -0
- package/dist/google.d.ts +21 -0
- package/dist/google.js +21 -0
- package/dist/google.js.map +1 -0
- package/dist/groq.cjs +72 -0
- package/dist/groq.cjs.map +1 -0
- package/dist/groq.d.cts +21 -0
- package/dist/groq.d.ts +21 -0
- package/dist/groq.js +21 -0
- package/dist/groq.js.map +1 -0
- package/dist/index.cjs +8916 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1816 -0
- package/dist/index.d.mts +3203 -0
- package/dist/index.d.ts +1816 -0
- package/dist/index.js +4040 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +7064 -0
- package/dist/index.mjs.map +1 -0
- package/dist/llm-providers.cjs +311 -0
- package/dist/llm-providers.cjs.map +1 -0
- package/dist/llm-providers.d.cts +111 -0
- package/dist/llm-providers.d.ts +111 -0
- package/dist/llm-providers.js +232 -0
- package/dist/llm-providers.js.map +1 -0
- package/dist/loop-api.cjs +4924 -0
- package/dist/loop-api.cjs.map +1 -0
- package/dist/loop-api.d.cts +11 -0
- package/dist/loop-api.d.ts +11 -0
- package/dist/loop-api.js +189 -0
- package/dist/loop-api.js.map +1 -0
- package/dist/mistral.cjs +72 -0
- package/dist/mistral.cjs.map +1 -0
- package/dist/mistral.d.cts +21 -0
- package/dist/mistral.d.ts +21 -0
- package/dist/mistral.js +21 -0
- package/dist/mistral.js.map +1 -0
- package/dist/multipart-parser-EJCXIUHC.js +372 -0
- package/dist/multipart-parser-EJCXIUHC.js.map +1 -0
- package/dist/openai.cjs +72 -0
- package/dist/openai.cjs.map +1 -0
- package/dist/openai.d.cts +21 -0
- package/dist/openai.d.ts +21 -0
- package/dist/openai.js +21 -0
- package/dist/openai.js.map +1 -0
- package/dist/perplexity.cjs +72 -0
- package/dist/perplexity.cjs.map +1 -0
- package/dist/perplexity.d.cts +21 -0
- package/dist/perplexity.d.ts +21 -0
- package/dist/perplexity.js +21 -0
- package/dist/perplexity.js.map +1 -0
- package/dist/playwright.json +52 -0
- package/dist/promptConcat-BJdazTg5.d.cts +1832 -0
- package/dist/promptConcat-BJdazTg5.d.ts +1832 -0
- package/dist/promptConcat-CAkpni_8.d.cts +1834 -0
- package/dist/promptConcat-CAkpni_8.d.ts +1834 -0
- package/dist/promptConcat-CfH5-GAE.d.cts +1036 -0
- package/dist/promptConcat-ChcAZOOL.d.ts +1036 -0
- package/dist/promptConcat-G5TnJVRy.d.cts +1800 -0
- package/dist/promptConcat-G5TnJVRy.d.ts +1800 -0
- package/dist/promptConcat-L72eowzp.d.ts +1090 -0
- package/dist/promptConcat-eLHdN7K8.d.cts +1090 -0
- package/dist/src-VTSXKG72.js +1409 -0
- package/dist/src-VTSXKG72.js.map +1 -0
- package/dist/togetherai.cjs +72 -0
- package/dist/togetherai.cjs.map +1 -0
- package/dist/togetherai.d.cts +21 -0
- package/dist/togetherai.d.ts +21 -0
- package/dist/togetherai.js +21 -0
- package/dist/togetherai.js.map +1 -0
- package/dist/types-B0Jm2l38.d.cts +767 -0
- package/dist/types-B0Jm2l38.d.ts +767 -0
- package/dist/xai.cjs +72 -0
- package/dist/xai.cjs.map +1 -0
- package/dist/xai.d.cts +21 -0
- package/dist/xai.d.ts +21 -0
- package/dist/xai.js +21 -0
- package/dist/xai.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/sync/attachmentRpcCodec.ts","../src/sync/chatSyncEngine.ts","../src/sync/peerNodeAdapter.ts","../src/types.ts","../src/storage/sessionStorage.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/network/gitProxyUrlPolicy.ts","../src/network/uri.ts","../src/device-network/agentRuntimeRpcHandler.ts","../src/device-network/libp2pDeviceNetworkService.ts","../src/device-network/libp2pSyncProtocol.ts","../src/device-network/libp2pDeviceSyncTransport.ts","../src/device-network/libp2pRpcProtocol.ts","../src/device-network/localTrustDeviceAuthorizer.ts","../src/device-network/cloudDeviceAuthorizer.ts","../src/device-network/memoryDeviceNetworkService.ts","../src/device-network/syncCloudDevices.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/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":["/**\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, AgentLoopScriptPolicy } from './loopAPI/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 /** Read persisted attachment bytes for cross-node RPC `memeloop.storage.getAttachmentBlob`. */\n readAttachmentData?(contentHash: string): Promise<Uint8Array | null>;\n\n getAgentDefinition(id: string): Promise<AgentDefinition | null>;\n\n /** Optional optimization: use `SELECT MAX(lamportClock)` instead of scanning all messages for clock state. */\n getMaxLamportClockForConversation?(conversationId: string): Promise<number>;\n\n saveAgentInstance(meta: AgentInstanceMeta): Promise<void>;\n\n /** Read the conversation metadata row used by AgentToolLoop to resolve `definitionId`. */\n getConversationMeta(conversationId: string): Promise<ConversationMeta | null>;\n\n /** IM user-to-conversation binding (persisted by 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 /** Prompt-concat plugin registry, isolated per runtime. Falls back to the process-level default registry. */\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 AgentToolLoopOptions {\n /** Maximum LLM-to-tool round-trips. `0` means unlimited, still capped internally. */\n maxIterations?: number;\n /** Whether to parse `<tool_use>` / `<function_call>` and execute through `IToolRegistry` (default true). */\n enableToolLoop?: boolean;\n /** Cancellation check, e.g. when the user stops a run. */\n isCancelled?: (conversationId: string) => boolean;\n /** Attachment injection for promptConcat, aligned with `PromptConcatOptions`. */\n readAttachmentFile?: (path: string) => Promise<Uint8Array | Buffer>;\n /** Omit history older than this many milliseconds when building LLM input. `0` disables trimming. */\n maxHistoryAgeMs?: number;\n /**\n * When `defineTool` / plugins are configured, fall back to `IToolRegistry` for tool calls not handled by `onResponseComplete`.\n */\n fallbackRegistryTools?: boolean;\n /**\n * Tool permission rules (default allow).\n * Supports wildcards such as \"terminal.*\" and \"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 /** Threshold for repeated identical tool+input calls (default 3). */\n doomLoopThreshold?: number;\n /** History compaction window: keep the most recent N turns plus the last user message. */\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`, AgentToolLoop waits here before the next LLM round.\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 /** AgentToolLoop ReAct behavior, migrated from the TidGi-Desktop agentToolLoop integration. */\n agentToolLoop?: AgentToolLoopOptions;\n /**\n * Host-injected runner used by `createMemeLoopRuntime` after a user sends a message.\n */\n runAgentToolLoop?: (input: AgentLoopInput) => AgentLoopGenerator;\n /** Run a child agent for orchestration loops such as AgentAgentLoop. */\n runChildAgent?: AgentLoopRuntime['runChildAgent'];\n /** Policy for loading script-backed loops. Defaults to bundled scripts + import specifiers only. */\n loopScriptPolicy?: AgentLoopScriptPolicy;\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 /** Current agent view for defineTool / TidGi compatibility. */\n agent?: { id: string; messages: ChatMessage[] };\n /** Persist a `ChatMessage` if the runtime host supplies this hook. */\n persistAgentMessage?: (message: ChatMessage) => Promise<void>;\n /** Cancellation markers written by `createMemeLoopRuntime`. */\n conversationCancellation?: Set<string>;\n /** Resolve an AgentDefinition from host-specific sources. */\n resolveAgentDefinition?: (definitionId: string) => Promise<AgentDefinition | null>;\n /** Fallback logger used when the host does not inject one. */\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 isDelegatedAgentRun?: boolean;\n parentAgentRunId?: 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 * 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: 'memeloopAgentToolLoop',\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","/**\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","/**\n * memeloop:// URI scheme for cross-node references (e.g. file.read without inlining bytes).\n * Format: memeloop://node/<nodeId>/file/<pathSegments...>\n * Path segments are percent-encoded per RFC 3986.\n */\n\nexport type MemeloopUriKind = 'file';\n\nexport interface ParsedMemeloopFileUri {\n scheme: 'memeloop';\n kind: 'file';\n nodeId: string;\n /** Logical path on the holding node (slashes preserved, not leading slash). */\n filePath: string;\n}\n\nexport type ParsedMemeloopUri = ParsedMemeloopFileUri;\n\nconst PREFIX = 'memeloop://node/';\n\n/**\n * Build `memeloop://node/<nodeId>/file/<encodedPath>` for a file on a node.\n */\nexport function buildMemeloopFileUri(nodeId: string, filePath: string): string {\n const normalized = filePath.replace(/^\\/+/, '');\n const segments = normalized.split('/').filter(Boolean).map(encodeURIComponent);\n return `memeloop://node/${encodeURIComponent(nodeId)}/file/${segments.join('/')}`;\n}\n\n/** Alias for {@link buildMemeloopFileUri} (plan §22.2 / §16.8 `buildMemeloopUri`). */\nexport const buildMemeloopUri = buildMemeloopFileUri;\n\n/**\n * Parse a memeloop URI. Currently only `.../file/...` is supported.\n */\nexport function parseMemeloopUri(uri: string): ParsedMemeloopUri | null {\n const u = uri.trim();\n if (!u.startsWith(PREFIX)) return null;\n const rest = u.slice(PREFIX.length);\n const slash = rest.indexOf('/');\n if (slash <= 0) return null;\n let nodeId: string;\n try {\n nodeId = decodeURIComponent(rest.slice(0, slash));\n } catch {\n return null;\n }\n const afterNode = rest.slice(slash + 1);\n if (!afterNode.startsWith('file/')) return null;\n const pathPart = afterNode.slice('file/'.length);\n if (pathPart.length === 0) {\n return { scheme: 'memeloop', kind: 'file', nodeId, filePath: '' };\n }\n try {\n const filePath = pathPart.split('/').map(decodeURIComponent).join('/');\n return { scheme: 'memeloop', kind: 'file', nodeId, filePath };\n } catch {\n return null;\n }\n}\n","import type { AgentDefinition } from '../agent/types.js';\nimport type { ChatMessage } from '../conversation/index.js';\nimport type { MemeLoopRuntime } from '../runtime.js';\nimport type { ConversationMeta } from '../sync/protocol.js';\nimport type { IAgentStorage } from '../types.js';\nimport type { DeviceRpcHandler } from './types.js';\n\nexport interface AgentRuntimeDeviceRpcHandlerOptions {\n runtime: Pick<MemeLoopRuntime, 'createAgent' | 'sendMessage' | 'cancelAgent'>;\n storage: IAgentStorage;\n getAgentDefinitions?: () => AgentDefinition[] | Promise<AgentDefinition[]>;\n localNodeId?: string;\n}\n\nexport function createAgentRuntimeDeviceRpcHandler(options: AgentRuntimeDeviceRpcHandlerOptions): DeviceRpcHandler {\n return async ({ method, parameters }) => {\n switch (method) {\n case 'memeloop.agent.getDefinitions':\n return { definitions: await options.getAgentDefinitions?.() ?? [] };\n case 'memeloop.agent.create': {\n const rpcParameters = objectParameter(parameters);\n return options.runtime.createAgent({\n definitionId: stringParameter(rpcParameters, 'definitionId'),\n initialMessage: optionalStringParameter(rpcParameters, 'initialMessage'),\n });\n }\n case 'memeloop.agent.send': {\n const rpcParameters = objectParameter(parameters);\n await options.runtime.sendMessage({\n conversationId: stringParameter(rpcParameters, 'conversationId'),\n message: stringParameter(rpcParameters, 'message'),\n definitionId: optionalStringParameter(rpcParameters, 'definitionId'),\n userMessage: chatMessageParameter(rpcParameters, 'userMessage'),\n resumeSession: chatMessageArrayParameter(rpcParameters, 'resumeSession'),\n });\n return { ok: true };\n }\n case 'memeloop.agent.runTurn': {\n const rpcParameters = objectParameter(parameters);\n const conversationId = stringParameter(rpcParameters, 'conversationId');\n const definitionId = stringParameter(rpcParameters, 'definitionId');\n await upsertConversationForRemoteTurn({\n storage: options.storage,\n conversationId,\n definitionId,\n conversation: conversationMetaParameter(rpcParameters, 'conversation'),\n localNodeId: options.localNodeId,\n });\n await options.runtime.sendMessage({\n conversationId,\n definitionId,\n message: stringParameter(rpcParameters, 'message'),\n userMessage: chatMessageParameter(rpcParameters, 'userMessage'),\n resumeSession: chatMessageArrayParameter(rpcParameters, 'resumeSession'),\n });\n return { ok: true, conversationId };\n }\n case 'memeloop.agent.cancel': {\n const rpcParameters = objectParameter(parameters);\n await options.runtime.cancelAgent(stringParameter(rpcParameters, 'conversationId'));\n return { ok: true };\n }\n case 'memeloop.chat.pullAgentRunLog': {\n const rpcParameters = objectParameter(parameters);\n const conversationId = stringParameter(rpcParameters, 'conversationId');\n const known = new Set(stringArrayParameter(rpcParameters, 'knownMessageIds'));\n const messages = await options.storage.getMessages(conversationId, { mode: 'full-content' });\n return { messages: messages.filter((message) => !known.has(message.messageId)) };\n }\n default:\n throw new Error(`rpc_method_not_found:${method}`);\n }\n };\n}\n\nasync function upsertConversationForRemoteTurn(input: {\n storage: IAgentStorage;\n conversationId: string;\n definitionId: string;\n conversation?: ConversationMeta;\n localNodeId?: string;\n}): Promise<void> {\n if (input.conversation) {\n await input.storage.upsertConversationMetadata(input.conversation);\n return;\n }\n const existing = await input.storage.getConversationMeta(input.conversationId).catch(() => null);\n if (existing) return;\n const now = Date.now();\n await input.storage.upsertConversationMetadata({\n conversationId: input.conversationId,\n title: input.definitionId,\n lastMessagePreview: '',\n lastMessageTimestamp: now,\n messageCount: 0,\n originNodeId: input.localNodeId ?? 'remote',\n definitionId: input.definitionId,\n isUserInitiated: true,\n });\n}\n\nfunction objectParameter(value: unknown): Record<string, unknown> {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) throw new Error('invalid_rpc_params');\n return value as Record<string, unknown>;\n}\n\nfunction stringParameter(parameters: Record<string, unknown>, key: string): string {\n const value = parameters[key];\n if (typeof value !== 'string' || value.length === 0) throw new Error('invalid_rpc_params');\n return value;\n}\n\nfunction optionalStringParameter(parameters: Record<string, unknown>, key: string): string | undefined {\n const value = parameters[key];\n if (value === undefined) return undefined;\n if (typeof value !== 'string') throw new Error('invalid_rpc_params');\n return value;\n}\n\nfunction stringArrayParameter(parameters: Record<string, unknown>, key: string): string[] {\n const value = parameters[key];\n if (value === undefined) return [];\n if (!Array.isArray(value)) throw new Error('invalid_rpc_params');\n return value.filter((item): item is string => typeof item === 'string');\n}\n\nfunction chatMessageParameter(parameters: Record<string, unknown>, key: string): ChatMessage | undefined {\n const value = parameters[key];\n if (value === undefined) return undefined;\n if (!isChatMessage(value)) throw new Error('invalid_rpc_params');\n return value;\n}\n\nfunction chatMessageArrayParameter(parameters: Record<string, unknown>, key: string): ChatMessage[] | undefined {\n const value = parameters[key];\n if (value === undefined) return undefined;\n if (!Array.isArray(value)) throw new Error('invalid_rpc_params');\n return value.filter(isChatMessage);\n}\n\nfunction conversationMetaParameter(parameters: Record<string, unknown>, key: string): ConversationMeta | undefined {\n const value = parameters[key];\n if (value === undefined) return undefined;\n if (!isConversationMetaLike(value)) throw new Error('invalid_rpc_params');\n return value;\n}\n\nfunction isChatMessage(value: unknown): value is ChatMessage {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return false;\n const record = value as Record<string, unknown>;\n return (\n typeof record.messageId === 'string' &&\n typeof record.conversationId === 'string' &&\n typeof record.originNodeId === 'string' &&\n typeof record.timestamp === 'number' &&\n typeof record.lamportClock === 'number' &&\n typeof record.role === 'string' &&\n typeof record.content === 'string'\n );\n}\n\nfunction isConversationMetaLike(value: unknown): value is ConversationMeta {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return false;\n const record = value as Record<string, unknown>;\n return (\n typeof record.conversationId === 'string' &&\n typeof record.title === 'string' &&\n typeof record.lastMessageTimestamp === 'number' &&\n typeof record.messageCount === 'number' &&\n typeof record.originNodeId === 'string' &&\n typeof record.definitionId === 'string' &&\n typeof record.isUserInitiated === 'boolean'\n );\n}\n","import { noise } from '@chainsafe/libp2p-noise';\nimport { yamux } from '@chainsafe/libp2p-yamux';\nimport { bootstrap } from '@libp2p/bootstrap';\nimport { circuitRelayTransport } from '@libp2p/circuit-relay-v2';\nimport { identify } from '@libp2p/identify';\nimport type { Libp2p, PeerId, PrivateKey, PublicKey, Stream } from '@libp2p/interface';\nimport { mdns } from '@libp2p/mdns';\nimport { peerIdFromPrivateKey, peerIdFromPublicKey, peerIdFromString } from '@libp2p/peer-id';\nimport { ping } from '@libp2p/ping';\nimport { tcp } from '@libp2p/tcp';\nimport { webSockets } from '@libp2p/websockets';\nimport { type Multiaddr, multiaddr } from '@multiformats/multiaddr';\nimport { createLibp2p } from 'libp2p';\n\nimport { ChatSyncEngine } from '../sync/chatSyncEngine.js';\nimport { PeerNodeSyncAdapter } from '../sync/peerNodeAdapter.js';\nimport type { ConversationMeta, VersionVector } from '../sync/protocol.js';\nimport type { IAgentStorage } from '../types.js';\nimport { Libp2pDeviceSyncTransport } from './libp2pDeviceSyncTransport.js';\nimport { isLibp2pRpcRequest, isLibp2pRpcResponse, LIBP2P_RPC_REQUEST_TYPE, LIBP2P_RPC_RESPONSE_TYPE } from './libp2pRpcProtocol.js';\nimport { type AttachmentBlobWire, isLibp2pSyncRequest, LIBP2P_SYNC_RESPONSE_TYPE, type Libp2pSyncRequest } from './libp2pSyncProtocol.js';\nimport { LocalTrustDeviceAuthorizer } from './localTrustDeviceAuthorizer.js';\nimport type {\n Device,\n DeviceAccountBindingRequest,\n DeviceAuthorizer,\n DeviceCapabilities,\n DeviceConnectionGrant,\n DeviceConnectionGrantVerificationInput,\n DeviceNetworkListenOptions,\n DeviceNetworkService,\n DevicePlatform,\n DeviceRelayReservationToken,\n DeviceRelayReservationTokenVerificationInput,\n DeviceRpcHandler,\n DeviceTrustStore,\n LocalDeviceIdentity,\n LocalPairingRequestOptions,\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 trustStore?: DeviceTrustStore;\n authorizer?: DeviceAuthorizer;\n listen?: DeviceNetworkListenOptions;\n bootstrapMultiaddrs?: string[];\n enableCircuitRelay?: boolean;\n enableMdns?: boolean;\n autoDialDiscoveredPeers?: boolean;\n syncStorage?: IAgentStorage;\n syncVersionVector?: () => VersionVector;\n rpcHandler?: DeviceRpcHandler;\n}\n\nconst emptyCapabilities: DeviceCapabilities = {\n tools: [],\n mcpServers: [],\n hasWiki: false,\n agentLoop: 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\nconst PAIRING_PROTOCOL: MemeLoopProtocol = '/memeloop/pairing/1.0.0';\nconst RPC_PROTOCOL: MemeLoopProtocol = '/memeloop/rpc/1.0.0';\nconst SYNC_PROTOCOL: MemeLoopProtocol = '/memeloop/sync/1.0.0';\nconst RELAY_ADMISSION_PROTOCOL = '/memeloop/relay-admission/1.0.0';\nconst PAIRING_SESSION_TTL_MS = 5 * 60_000;\nconst PAIRING_MESSAGE_MAX_BYTES = 64 * 1024;\nconst RPC_MESSAGE_MAX_BYTES = 16 * 1024 * 1024;\nconst SYNC_MESSAGE_MAX_BYTES = 16 * 1024 * 1024;\nconst RELAY_ADMISSION_MESSAGE_MAX_BYTES = 64 * 1024;\nconst RELAY_ADMISSION_REQUEST_TYPE = 'memeloop-relay-admission-request-v1';\nconst RELAY_ADMISSION_RESPONSE_TYPE = 'memeloop-relay-admission-response-v1';\n\ninterface PairingDeviceEnvelope {\n peerId: string;\n publicKeyMultibase: string;\n deviceName: string;\n platform: DevicePlatform;\n capabilities: DeviceCapabilities;\n multiaddrs: string[];\n}\n\ninterface PairingRequestMessage {\n type: 'memeloop-local-pairing-request-v1';\n sessionId: string;\n requestNonce: string;\n createdAt: number;\n expiresAt: number;\n device: PairingDeviceEnvelope;\n}\n\ninterface PairingResponseMessage {\n type: 'memeloop-local-pairing-response-v1';\n sessionId: string;\n requestNonce: string;\n responseNonce: string;\n accepted: true;\n expiresAt: number;\n device: PairingDeviceEnvelope;\n}\n\ninterface RelayAdmissionRequestMessage {\n type: typeof RELAY_ADMISSION_REQUEST_TYPE;\n token: DeviceRelayReservationToken;\n}\n\ntype RelayAdmissionResponseMessage =\n | { type: typeof RELAY_ADMISSION_RESPONSE_TYPE; ok: true; peerId: string; expiresAt: number }\n | { type: typeof RELAY_ADMISSION_RESPONSE_TYPE; ok: false; reason: string };\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 bootstrapMultiaddrs = new Set<string>();\n private readonly authorizer: DeviceAuthorizer;\n private readonly pairingSessions = new Map<string, PairingSession>();\n private readonly listeners = new Set<(devices: Device[]) => void>();\n private readonly pairingListeners = new Set<(sessions: PairingSession[]) => 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 for (const address of options.bootstrapMultiaddrs ?? []) {\n const trimmed = address.trim();\n if (trimmed) this.bootstrapMultiaddrs.add(trimmed);\n }\n this.authorizer = options.authorizer ?? new LocalTrustDeviceAuthorizer({\n getTrustedDevice: (peerId) => this.trustedDevices.get(peerId),\n });\n }\n\n public async start(): Promise<void> {\n if (this.libp2p) return;\n await this.loadTrustedDevicesFromStore();\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 multiaddrs: this.getMultiaddrs(),\n lastSeen: Date.now(),\n };\n }\n\n public async listDevices(): Promise<Device[]> {\n return this.toVisibleDevices();\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 listPairingSessions(): Promise<PairingSession[]> {\n this.refreshPairingSessionExpiry();\n return [...this.pairingSessions.values()];\n }\n\n public observePairingSessions(listener: (sessions: PairingSession[]) => void): () => void {\n this.pairingListeners.add(listener);\n void this.listPairingSessions().then(listener);\n return () => {\n this.pairingListeners.delete(listener);\n };\n }\n\n public async requestLocalPairing(peerId: string, options: LocalPairingRequestOptions = {}): Promise<PairingSession> {\n const requestNonce = randomPairingNonce();\n const createdAt = Date.now();\n const expiresAt = createdAt + PAIRING_SESSION_TTL_MS;\n const request: PairingRequestMessage = {\n type: 'memeloop-local-pairing-request-v1',\n sessionId: `pairing-${this.options.identity.peerId}-${peerId}-${createdAt}-${requestNonce}`,\n requestNonce,\n createdAt,\n expiresAt,\n device: this.localPairingDevice(),\n };\n const stream = await this.requireNode().dialProtocol(this.pairingDialTarget(peerId, options), PAIRING_PROTOCOL);\n try {\n await writeJsonMessage(stream, request);\n const response = await readJsonMessage<PairingResponseMessage>(stream);\n await stream.close();\n const session = await this.sessionFromPairingResponse(peerId, request, response);\n this.pairingSessions.set(session.sessionId, session);\n this.upsertDiscoveredDeviceFromPairing(session.remotePeerId, response.device);\n this.emitPairingSessions();\n this.emitDevices();\n return session;\n } catch (error) {\n stream.abort(error instanceof Error ? error : new Error('pairing_request_failed'));\n throw error;\n }\n }\n\n public async acceptPairing(sessionId: string): Promise<void> {\n const session = this.requirePairingSession(sessionId);\n if (session.expiresAt < Date.now()) {\n session.status = 'expired';\n this.emitPairingSessions();\n throw new Error('pairing_session_expired');\n }\n if (session.status !== 'pending') throw new Error('pairing_session_not_pending');\n const trustedDevice: TrustedDeviceRecord = {\n peerId: session.remotePeerId,\n publicKeyMultibase: session.remotePublicKeyMultibase,\n deviceName: session.remoteDeviceName,\n platform: session.remotePlatform,\n trustMode: 'local-pairing',\n createdAt: Date.now(),\n lastSeen: Date.now(),\n };\n this.trustedDevices.set(session.remotePeerId, trustedDevice);\n await this.options.trustStore?.saveTrustedDevice(trustedDevice);\n session.status = 'accepted';\n this.updateDeviceTrust(session.remotePeerId, 'local-pairing', true);\n this.emitPairingSessions();\n this.emitDevices();\n }\n\n public async rejectPairing(sessionId: string): Promise<void> {\n const session = this.pairingSessions.get(sessionId);\n if (!session) return;\n session.status = 'rejected';\n this.emitPairingSessions();\n }\n\n public async removeTrustedDevice(peerId: string): Promise<void> {\n this.trustedDevices.delete(peerId);\n await this.options.trustStore?.removeTrustedDevice(peerId);\n this.updateDeviceTrust(peerId, 'local-pairing', false);\n this.emitDevices();\n }\n\n public async openStream(\n peerId: string,\n protocol: MemeLoopProtocol,\n presentedGrant?: DeviceConnectionGrant,\n ): Promise<MemeLoopDuplexStream> {\n const authorized = await this.authorizer.canOpenProtocol({\n remotePeerId: peerId,\n protocol,\n direction: 'outbound',\n presentedGrant,\n });\n if (!authorized) throw new Error('device_not_trusted');\n const addresses = this.discoveredDevices.get(peerId)?.multiaddrs ?? [];\n const dialTarget = addresses.length > 0 ? addresses.map((address) => multiaddr(address)) : peerIdFromString(peerId);\n const stream = await this.requireNode().dialProtocol(dialTarget, protocol, {\n runOnLimitedConnection: true,\n });\n return this.wrapStream(stream);\n }\n\n public async sendRpc<T>(\n peerId: string,\n method: string,\n parameters: unknown,\n presentedGrant?: DeviceConnectionGrant,\n ): Promise<T> {\n const stream = await this.openStream(peerId, RPC_PROTOCOL, presentedGrant);\n const request = {\n type: LIBP2P_RPC_REQUEST_TYPE,\n id: crypto.randomUUID(),\n method,\n params: parameters,\n grant: presentedGrant,\n };\n await writeStreamJson(stream, request);\n const response = await readStreamJson(stream);\n await stream.close();\n if (!isLibp2pRpcResponse(response)) throw new Error('invalid_rpc_response');\n if (response.id !== request.id) throw new Error('rpc_response_id_mismatch');\n if (!response.ok) throw new Error(response.error);\n return response.result as T;\n }\n\n public async syncWithDevice(peerId: string, presentedGrant?: DeviceConnectionGrant): Promise<SyncResult> {\n const authorized = await this.authorizer.canOpenProtocol({\n remotePeerId: peerId,\n protocol: '/memeloop/sync/1.0.0',\n direction: 'outbound',\n presentedGrant,\n });\n if (!authorized) throw new Error('device_not_trusted');\n if (this.options.syncStorage) {\n const transport = new Libp2pDeviceSyncTransport({\n nodeId: this.options.identity.peerId,\n deviceNetwork: this,\n grantProvider: async (remotePeerId) => remotePeerId === peerId ? presentedGrant : undefined,\n });\n const peer = new PeerNodeSyncAdapter(peerId, transport);\n const engine = new ChatSyncEngine({\n nodeId: this.options.identity.peerId,\n storage: this.options.syncStorage,\n peers: () => [peer],\n });\n await engine.syncOnce();\n }\n return { ok: true, peerId, syncedAt: Date.now() };\n }\n\n public getTrustedDevice(peerId: string): TrustedDeviceRecord | undefined {\n return this.trustedDevices.get(peerId);\n }\n\n public upsertTrustedDevice(record: TrustedDeviceRecord): void {\n this.trustedDevices.set(record.peerId, record);\n this.updateDeviceTrust(record.peerId, record.trustMode, true);\n this.emitDevices();\n }\n\n public upsertDiscoveredDevice(device: Device): void {\n const trustedRecord = this.trustedDevices.get(device.peerId);\n this.discoveredDevices.set(device.peerId, {\n ...device,\n displayName: trustedRecord?.deviceName ?? device.displayName,\n platform: trustedRecord?.platform ?? device.platform,\n trustMode: trustedRecord?.trustMode ?? device.trustMode,\n trusted: device.trusted ?? trustedRecord !== undefined,\n lastSeen: device.lastSeen ?? trustedRecord?.lastSeen,\n });\n this.emitDevices();\n }\n\n public async configureRelayReservation(token: DeviceRelayReservationToken): Promise<void> {\n for (const address of [...token.bootstrapMultiaddrs, ...token.relayMultiaddrs]) {\n const trimmed = address.trim();\n if (trimmed) this.bootstrapMultiaddrs.add(trimmed);\n }\n if (!this.libp2p) return;\n await this.admitRelayReservation(token);\n await this.reserveRelayListeners(token.relayMultiaddrs);\n await this.dialBootstrapPeers([...this.bootstrapMultiaddrs]);\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 const peerDiscovery = [\n ...this.createBootstrapDiscovery(),\n ...(this.options.enableMdns === false ? [] : [mdns({ serviceTag: 'memeloop' })]),\n ];\n const transports = this.options.enableCircuitRelay === false\n ? [tcp(), webSockets()]\n : [tcp(), webSockets(), circuitRelayTransport()];\n return createLibp2p({\n privateKey,\n addresses: {\n listen: this.options.enableCircuitRelay === false ? listen.addresses : addRelayListenAddress(listen.addresses),\n announce: listen.announce,\n },\n transports,\n connectionEncrypters: [noise()],\n streamMuxers: [yamux()],\n peerDiscovery,\n services: {\n identify: identify(),\n ping: ping(),\n },\n start: false,\n });\n }\n\n private createBootstrapDiscovery(): ReturnType<typeof bootstrap>[] {\n const list = [...this.bootstrapMultiaddrs];\n if (list.length === 0) return [];\n return [bootstrap({ list, tagName: 'memeloop-bootstrap', tagTTL: Infinity })];\n }\n\n private async dialBootstrapPeers(addresses: string[]): Promise<void> {\n const node = this.requireNode();\n for (const address of addresses) {\n await node.dial(multiaddr(address)).catch(() => undefined);\n }\n }\n\n private async admitRelayReservation(token: DeviceRelayReservationToken): Promise<void> {\n const relayAddresses = token.relayMultiaddrs.map((address) => address.trim()).filter((address) => address.length > 0);\n if (relayAddresses.length === 0) return;\n const node = this.requireNode();\n const errors: string[] = [];\n for (const address of relayAddresses) {\n let stream: Stream | undefined;\n try {\n stream = await node.dialProtocol(multiaddr(address), RELAY_ADMISSION_PROTOCOL);\n const request: RelayAdmissionRequestMessage = {\n type: RELAY_ADMISSION_REQUEST_TYPE,\n token,\n };\n await writeJsonMessage(stream, request, RELAY_ADMISSION_MESSAGE_MAX_BYTES);\n const response = await readJsonMessage<RelayAdmissionResponseMessage>(stream, RELAY_ADMISSION_MESSAGE_MAX_BYTES);\n await stream.close();\n if (isRelayAdmissionResponse(response) && response.ok) return;\n const reason = isRelayAdmissionResponse(response) ? response.reason : 'invalid_relay_admission_response';\n errors.push(`${address}: ${reason}`);\n } catch (error) {\n stream?.abort(error instanceof Error ? error : new Error('relay_admission_failed'));\n errors.push(`${address}: ${error instanceof Error ? error.message : 'relay_admission_failed'}`);\n }\n }\n throw new Error(`relay_admission_failed${errors.length > 0 ? `: ${errors.join('; ')}` : ''}`);\n }\n\n private async reserveRelayListeners(relayMultiaddrs: string[]): Promise<void> {\n const relayAddresses = relayMultiaddrs.map((address) => address.trim()).filter((address) => address.length > 0);\n if (relayAddresses.length === 0) return;\n const transportManager = (this.requireNode() as unknown as Libp2pWithTransportManager).components?.transportManager;\n if (!transportManager) throw new Error('relay_transport_manager_unavailable');\n const errors: string[] = [];\n for (const address of relayAddresses) {\n try {\n await transportManager.listen([relayCircuitMultiaddr(address)]);\n return;\n } catch (error) {\n errors.push(`${address}: ${error instanceof Error ? error.message : 'relay_reservation_failed'}`);\n }\n }\n throw new Error(`relay_reservation_failed${errors.length > 0 ? `: ${errors.join('; ')}` : ''}`);\n }\n\n private async loadTrustedDevicesFromStore(): Promise<void> {\n const records = await this.options.trustStore?.loadTrustedDevices();\n for (const record of records ?? []) {\n this.trustedDevices.set(record.peerId, record);\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 const trustedRecord = this.trustedDevices.get(peerId);\n this.discoveredDevices.set(peerId, {\n peerId,\n displayName: trustedRecord?.deviceName ?? peerId,\n platform: trustedRecord?.platform ?? 'cli',\n trustMode: trustedRecord?.trustMode ?? 'local-pairing',\n trusted: trustedRecord !== undefined,\n reachability: {\n state: 'nearby',\n paths: ['lan'],\n },\n capabilities: emptyCapabilities,\n multiaddrs: detail.multiaddrs.map((address) => address.toString()),\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, async (stream, connection) => {\n const remotePeerId = connection.remotePeer.toString();\n if (stream.protocol === PAIRING_PROTOCOL) {\n if (!await this.authorizer.canOpenProtocol({ remotePeerId, protocol: PAIRING_PROTOCOL, direction: 'inbound' })) {\n stream.abort(new Error('device_not_trusted'));\n return;\n }\n await this.handlePairingStream(stream, remotePeerId).catch((error: unknown) => {\n stream.abort(error instanceof Error ? error : new Error('pairing_handler_failed'));\n });\n return;\n }\n if (stream.protocol === SYNC_PROTOCOL) {\n await this.handleSyncStream(stream, remotePeerId);\n return;\n }\n if (stream.protocol === RPC_PROTOCOL) {\n await this.handleRpcStream(stream, remotePeerId);\n return;\n }\n if (!await this.authorizer.canOpenProtocol({ remotePeerId, protocol: stream.protocol as MemeLoopProtocol, direction: 'inbound' })) {\n stream.abort(new Error('device_not_trusted'));\n return;\n }\n stream.abort(new Error('protocol_handler_not_registered'));\n }, {\n runOnLimitedConnection: true,\n });\n }\n\n private async handleRpcStream(stream: Stream, remotePeerId: string): Promise<void> {\n let requestId = 'unknown';\n try {\n const request = await readJsonMessage<unknown>(stream, RPC_MESSAGE_MAX_BYTES);\n if (!isLibp2pRpcRequest(request)) throw new Error('invalid_rpc_request');\n requestId = request.id;\n const authorized = await this.authorizer.canOpenProtocol({\n remotePeerId,\n protocol: RPC_PROTOCOL,\n direction: 'inbound',\n presentedGrant: request.grant,\n });\n if (!authorized) throw new Error('device_not_trusted');\n if (!this.options.rpcHandler) throw new Error('rpc_handler_not_configured');\n const result = await this.options.rpcHandler({\n remotePeerId,\n method: request.method,\n parameters: request.params,\n presentedGrant: request.grant,\n });\n await writeJsonMessage(stream, {\n type: LIBP2P_RPC_RESPONSE_TYPE,\n id: request.id,\n ok: true,\n result,\n }, RPC_MESSAGE_MAX_BYTES);\n } catch (error) {\n await writeJsonMessage(stream, {\n type: LIBP2P_RPC_RESPONSE_TYPE,\n id: requestId,\n ok: false,\n error: error instanceof Error ? error.message : 'rpc_handler_failed',\n }, RPC_MESSAGE_MAX_BYTES).catch(() => undefined);\n } finally {\n await stream.close().catch(() => undefined);\n }\n }\n\n private async handleSyncStream(stream: Stream, remotePeerId: string): Promise<void> {\n let requestId = 'unknown';\n try {\n const request = await readJsonMessage<unknown>(stream, SYNC_MESSAGE_MAX_BYTES);\n if (!isLibp2pSyncRequest(request)) throw new Error('invalid_sync_request');\n requestId = request.id;\n const authorized = await this.authorizer.canOpenProtocol({\n remotePeerId,\n protocol: SYNC_PROTOCOL,\n direction: 'inbound',\n presentedGrant: request.grant,\n });\n if (!authorized) throw new Error('device_not_trusted');\n const result = await this.handleSyncRequest(request);\n await writeJsonMessage(stream, {\n type: LIBP2P_SYNC_RESPONSE_TYPE,\n id: request.id,\n ok: true,\n result,\n }, SYNC_MESSAGE_MAX_BYTES);\n } catch (error) {\n await writeJsonMessage(stream, {\n type: LIBP2P_SYNC_RESPONSE_TYPE,\n id: requestId,\n ok: false,\n error: error instanceof Error ? error.message : 'sync_handler_failed',\n }, SYNC_MESSAGE_MAX_BYTES).catch(() => undefined);\n } finally {\n await stream.close().catch(() => undefined);\n }\n }\n\n private async handleSyncRequest(request: Libp2pSyncRequest): Promise<unknown> {\n const storage = this.options.syncStorage;\n if (!storage) throw new Error('sync_storage_not_configured');\n switch (request.method) {\n case 'exchangeVersionVector':\n return {\n remoteVersion: this.options.syncVersionVector?.() ?? {},\n missingForRemote: [],\n };\n case 'pullMissingMetadata': {\n const sinceVersion = versionVectorParameter(request.params, 'sinceVersion');\n const conversations = await storage.listConversations({ limit: 500 });\n return conversations.filter((conversation) => shouldSendConversation(conversation, sinceVersion));\n }\n case 'pullMissingMessages': {\n const parameters = objectParameter(request.params);\n const conversationId = stringParameter(parameters, 'conversationId');\n const knownMessageIds = stringArrayParameter(parameters, 'knownMessageIds');\n const messages = await storage.getMessages(conversationId, { mode: 'full-content' });\n const known = new Set(knownMessageIds);\n return messages.filter((message) => !known.has(message.messageId));\n }\n case 'pullAttachmentBlob': {\n const parameters = objectParameter(request.params);\n const contentHash = stringParameter(parameters, 'contentHash');\n return this.readAttachmentBlob(contentHash);\n }\n }\n }\n\n private async readAttachmentBlob(contentHash: string): Promise<AttachmentBlobWire | null> {\n const storage = this.options.syncStorage;\n if (!storage?.readAttachmentData) return null;\n const reference = await storage.getAttachment(contentHash);\n if (!reference) return null;\n const data = await storage.readAttachmentData(contentHash);\n if (!data) return null;\n const { toString } = await loadUint8arrays();\n return {\n dataBase64Url: toString(data, 'base64url'),\n filename: reference.filename,\n mimeType: reference.mimeType,\n size: reference.size,\n };\n }\n\n private pairingDialTarget(peerId: string, options: LocalPairingRequestOptions): PeerId | ReturnType<typeof multiaddr>[] {\n const addresses = options.multiaddrs ?? this.discoveredDevices.get(peerId)?.multiaddrs ?? [];\n if (addresses.length === 0) return peerIdFromString(peerId);\n return addresses.map((address) => multiaddr(address));\n }\n\n private localPairingDevice(): PairingDeviceEnvelope {\n return {\n peerId: this.options.identity.peerId,\n publicKeyMultibase: this.options.identity.publicKeyMultibase,\n deviceName: this.options.identity.deviceName,\n platform: this.options.identity.platform,\n capabilities: this.capabilities,\n multiaddrs: this.getMultiaddrs(),\n };\n }\n\n private async handlePairingStream(stream: Stream, remotePeerId: string): Promise<void> {\n const request = await readJsonMessage<PairingRequestMessage>(stream);\n if (!isPairingRequest(request)) throw new Error('invalid_pairing_request');\n if (request.device.peerId !== remotePeerId) throw new Error('pairing_peer_id_mismatch');\n if (request.expiresAt <= Date.now()) throw new Error('pairing_request_expired');\n await assertPairingDeviceIdentity(request.device);\n const responseNonce = randomPairingNonce();\n const localDevice = this.localPairingDevice();\n const expiresAt = Math.min(request.expiresAt, Date.now() + PAIRING_SESSION_TTL_MS);\n const session: PairingSession = {\n sessionId: request.sessionId,\n localPeerId: this.options.identity.peerId,\n remotePeerId: request.device.peerId,\n remotePublicKeyMultibase: request.device.publicKeyMultibase,\n remoteDeviceName: request.device.deviceName,\n remotePlatform: request.device.platform,\n remoteCapabilities: request.device.capabilities,\n remoteMultiaddrs: request.device.multiaddrs,\n direction: 'inbound',\n status: 'pending',\n confirmCode: await buildPairingConfirmCode({\n initiator: request.device,\n responder: localDevice,\n requestNonce: request.requestNonce,\n responseNonce,\n }),\n createdAt: Date.now(),\n expiresAt,\n };\n this.pairingSessions.set(session.sessionId, session);\n this.upsertDiscoveredDeviceFromPairing(session.remotePeerId, request.device);\n await writeJsonMessage(stream, {\n type: 'memeloop-local-pairing-response-v1',\n sessionId: request.sessionId,\n requestNonce: request.requestNonce,\n responseNonce,\n accepted: true,\n expiresAt,\n device: localDevice,\n });\n await stream.close();\n this.emitPairingSessions();\n this.emitDevices();\n }\n\n private async sessionFromPairingResponse(\n peerId: string,\n request: PairingRequestMessage,\n response: PairingResponseMessage,\n ): Promise<PairingSession> {\n if (!isPairingResponse(response)) throw new Error('invalid_pairing_response');\n if (response.sessionId !== request.sessionId) throw new Error('pairing_session_mismatch');\n if (response.requestNonce !== request.requestNonce) throw new Error('pairing_nonce_mismatch');\n if (response.device.peerId !== peerId) throw new Error('pairing_peer_id_mismatch');\n if (response.expiresAt <= Date.now()) throw new Error('pairing_response_expired');\n await assertPairingDeviceIdentity(response.device);\n return {\n sessionId: request.sessionId,\n localPeerId: this.options.identity.peerId,\n remotePeerId: response.device.peerId,\n remotePublicKeyMultibase: response.device.publicKeyMultibase,\n remoteDeviceName: response.device.deviceName,\n remotePlatform: response.device.platform,\n remoteCapabilities: response.device.capabilities,\n remoteMultiaddrs: response.device.multiaddrs,\n direction: 'outbound',\n status: 'pending',\n confirmCode: await buildPairingConfirmCode({\n initiator: request.device,\n responder: response.device,\n requestNonce: request.requestNonce,\n responseNonce: response.responseNonce,\n }),\n createdAt: request.createdAt,\n expiresAt: Math.min(request.expiresAt, response.expiresAt),\n };\n }\n\n private requirePairingSession(sessionId: string): PairingSession {\n const session = this.pairingSessions.get(sessionId);\n if (!session) throw new Error('pairing_session_not_found');\n return session;\n }\n\n private refreshPairingSessionExpiry(): void {\n const now = Date.now();\n let changed = false;\n for (const session of this.pairingSessions.values()) {\n if (session.status === 'pending' && session.expiresAt <= now) {\n session.status = 'expired';\n changed = true;\n }\n }\n if (changed) this.emitPairingSessions();\n }\n\n private upsertDiscoveredDeviceFromPairing(peerId: string, device: PairingDeviceEnvelope): void {\n const current = this.discoveredDevices.get(peerId);\n this.discoveredDevices.set(peerId, {\n peerId,\n displayName: device.deviceName,\n platform: device.platform,\n trustMode: current?.trustMode ?? 'local-pairing',\n trusted: current?.trusted ?? this.trustedDevices.has(peerId),\n reachability: current?.reachability ?? {\n state: 'nearby',\n paths: device.multiaddrs.length > 0 ? ['lan'] : [],\n },\n capabilities: device.capabilities,\n multiaddrs: device.multiaddrs,\n lastSeen: Date.now(),\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'], trusted: boolean): void {\n const current = this.discoveredDevices.get(peerId);\n if (current) {\n this.discoveredDevices.set(peerId, {\n ...current,\n trustMode,\n trusted,\n });\n }\n }\n\n private toVisibleDevices(): Device[] {\n const visible = new Map(this.discoveredDevices);\n for (const record of this.trustedDevices.values()) {\n const current = visible.get(record.peerId);\n if (current) {\n visible.set(record.peerId, {\n ...current,\n displayName: record.deviceName,\n platform: record.platform,\n trustMode: record.trustMode,\n trusted: !record.revokedAt,\n lastSeen: current.lastSeen ?? record.lastSeen,\n });\n continue;\n }\n if (record.revokedAt) continue;\n visible.set(record.peerId, {\n peerId: record.peerId,\n displayName: record.deviceName,\n platform: record.platform,\n trustMode: record.trustMode,\n trusted: true,\n reachability: {\n state: 'offline',\n paths: [],\n },\n capabilities: emptyCapabilities,\n lastSeen: record.lastSeen,\n });\n }\n return [...visible.values()];\n }\n\n private emitDevices(): void {\n const devices = this.toVisibleDevices();\n for (const listener of this.listeners) listener(devices);\n }\n\n private emitPairingSessions(): void {\n const sessions = [...this.pairingSessions.values()];\n for (const listener of this.pairingListeners) listener(sessions);\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\ninterface Libp2pWithTransportManager {\n components?: {\n transportManager?: {\n listen(addresses: Multiaddr[]): Promise<void>;\n };\n };\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\nfunction randomPairingNonce(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n return [...bytes].map((byte) => byte.toString(16).padStart(2, '0')).join('');\n}\n\nasync function writeJsonMessage(stream: Stream, message: unknown, maxBytes = PAIRING_MESSAGE_MAX_BYTES): Promise<void> {\n const payload = new TextEncoder().encode(JSON.stringify(message));\n if (payload.byteLength > maxBytes) throw new Error('json_message_too_large');\n stream.send(payload);\n}\n\nasync function readJsonMessage<T>(stream: Stream, maxBytes = PAIRING_MESSAGE_MAX_BYTES): Promise<T> {\n const reader = stream[Symbol.asyncIterator]();\n const result = await reader.next();\n if (result.done || !result.value) throw new Error('pairing_message_missing');\n const chunk = result.value instanceof Uint8Array ? result.value : result.value.subarray();\n if (chunk.byteLength > maxBytes) throw new Error('json_message_too_large');\n return JSON.parse(new TextDecoder().decode(chunk)) as T;\n}\n\nasync function writeStreamJson(stream: MemeLoopDuplexStream, message: unknown): Promise<void> {\n const payload = new TextEncoder().encode(JSON.stringify(message));\n await stream.sink(async function*() {\n yield payload;\n }());\n}\n\nasync function readStreamJson(stream: MemeLoopDuplexStream): Promise<unknown> {\n const reader = stream.source[Symbol.asyncIterator]();\n const result = await reader.next();\n if (result.done || !result.value) throw new Error('rpc_response_missing');\n return JSON.parse(new TextDecoder().decode(result.value)) as unknown;\n}\n\nfunction isRelayAdmissionResponse(value: unknown): value is RelayAdmissionResponseMessage {\n if (value === null || typeof value !== 'object') return false;\n const record = value as Record<string, unknown>;\n return record.type === RELAY_ADMISSION_RESPONSE_TYPE && typeof record.ok === 'boolean';\n}\n\nfunction relayCircuitMultiaddr(address: string): Multiaddr {\n const parsed = multiaddr(address);\n return address.includes('/p2p-circuit') ? parsed : parsed.encapsulate('/p2p-circuit');\n}\n\nfunction objectParameter(value: unknown): Record<string, unknown> {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) throw new Error('invalid_sync_params');\n return value as Record<string, unknown>;\n}\n\nfunction stringParameter(parameters: Record<string, unknown>, key: string): string {\n const value = parameters[key];\n if (typeof value !== 'string' || value.length === 0) throw new Error('invalid_sync_params');\n return value;\n}\n\nfunction stringArrayParameter(parameters: Record<string, unknown>, key: string): string[] {\n const value = parameters[key];\n if (!Array.isArray(value)) throw new Error('invalid_sync_params');\n return value.filter((item): item is string => typeof item === 'string');\n}\n\nfunction versionVectorParameter(parameters: unknown, key: string): VersionVector {\n const raw = objectParameter(parameters)[key];\n if (raw === undefined) return {};\n if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) throw new Error('invalid_sync_params');\n const version: VersionVector = {};\n for (const [nodeId, clock] of Object.entries(raw)) {\n if (typeof clock === 'number' && Number.isFinite(clock) && clock >= 0) version[nodeId] = clock;\n }\n return version;\n}\n\nfunction shouldSendConversation(conversation: ConversationMeta, sinceVersion: VersionVector): boolean {\n const clock = Math.max(1, conversation.messageCount);\n return (sinceVersion[conversation.originNodeId] ?? 0) < clock;\n}\n\nfunction isDevicePlatform(value: unknown): value is DevicePlatform {\n return value === 'desktop' || value === 'mobile' || value === 'cli';\n}\n\nfunction normalizePairingCapabilities(value: unknown): DeviceCapabilities {\n const raw = value && typeof value === 'object' && !Array.isArray(value) ? value as Partial<DeviceCapabilities> : {};\n return {\n tools: Array.isArray(raw.tools) ? raw.tools.filter((item): item is string => typeof item === 'string') : [],\n mcpServers: Array.isArray(raw.mcpServers) ? raw.mcpServers.filter((item): item is string => typeof item === 'string') : [],\n hasWiki: raw.hasWiki === true,\n agentLoop: raw.agentLoop === true,\n imChannels: Array.isArray(raw.imChannels) ? raw.imChannels.filter((item): item is string => typeof item === 'string') : [],\n wikis: Array.isArray(raw.wikis)\n ? raw.wikis.filter((item): item is DeviceCapabilities['wikis'][number] => item !== null && typeof item === 'object')\n : [],\n };\n}\n\nfunction normalizePairingDevice(value: unknown): PairingDeviceEnvelope | undefined {\n const raw = value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\n if (!raw) return undefined;\n const peerId = typeof raw.peerId === 'string' ? raw.peerId.trim() : '';\n const publicKeyMultibase = typeof raw.publicKeyMultibase === 'string' ? raw.publicKeyMultibase.trim() : '';\n const deviceName = typeof raw.deviceName === 'string' ? raw.deviceName.trim() : '';\n if (!peerId || !publicKeyMultibase || !deviceName || !isDevicePlatform(raw.platform)) return undefined;\n return {\n peerId,\n publicKeyMultibase,\n deviceName,\n platform: raw.platform,\n capabilities: normalizePairingCapabilities(raw.capabilities),\n multiaddrs: Array.isArray(raw.multiaddrs) ? raw.multiaddrs.filter((item): item is string => typeof item === 'string') : [],\n };\n}\n\nfunction isPairingRequest(value: unknown): value is PairingRequestMessage {\n const raw = value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\n if (!raw || raw.type !== 'memeloop-local-pairing-request-v1') return false;\n return typeof raw.sessionId === 'string' &&\n typeof raw.requestNonce === 'string' &&\n typeof raw.createdAt === 'number' &&\n typeof raw.expiresAt === 'number' &&\n normalizePairingDevice(raw.device) !== undefined;\n}\n\nfunction isPairingResponse(value: unknown): value is PairingResponseMessage {\n const raw = value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\n if (!raw || raw.type !== 'memeloop-local-pairing-response-v1') return false;\n return typeof raw.sessionId === 'string' &&\n typeof raw.requestNonce === 'string' &&\n typeof raw.responseNonce === 'string' &&\n raw.accepted === true &&\n typeof raw.expiresAt === 'number' &&\n normalizePairingDevice(raw.device) !== undefined;\n}\n\nasync function assertPairingDeviceIdentity(device: PairingDeviceEnvelope): Promise<void> {\n const publicKey = await decodePublicKeyMultibase(device.publicKeyMultibase);\n if (peerIdFromPublicKey(publicKey).toString() !== device.peerId) throw new Error('pairing_public_key_peer_id_mismatch');\n}\n\nasync function buildPairingConfirmCode(input: {\n initiator: PairingDeviceEnvelope;\n responder: PairingDeviceEnvelope;\n requestNonce: string;\n responseNonce: string;\n}): Promise<string> {\n const text = [\n 'memeloop-local-pairing-confirm-v1',\n `initiatorPeerId=${input.initiator.peerId}`,\n `initiatorPublicKey=${input.initiator.publicKeyMultibase}`,\n `responderPeerId=${input.responder.peerId}`,\n `responderPublicKey=${input.responder.publicKeyMultibase}`,\n `requestNonce=${input.requestNonce}`,\n `responseNonce=${input.responseNonce}`,\n ].join('\\n');\n const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(text));\n const bytes = new Uint8Array(digest);\n const value = ((bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3]) >>> 0;\n return (value % 1_000_000).toString().padStart(6, '0');\n}\n\nexport async function encodePublicKeyMultibase(publicKey: PublicKey): Promise<string> {\n const { publicKeyToProtobuf } = await loadCryptoKeys();\n const { toString } = await loadUint8arrays();\n const protobuf = publicKeyToProtobuf(publicKey);\n return `${PUBLIC_KEY_MULTIBASE_PREFIX}${toString(protobuf, 'base64url')}`;\n}\n\nexport async function decodePublicKeyMultibase(multibase: string): Promise<PublicKey> {\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: peerIdFromPrivateKey(privateKey).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<PrivateKey> {\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 function buildDeviceConnectionGrantMessage(grant: Omit<DeviceConnectionGrant, 'signature'>): Uint8Array {\n const message = [\n 'memeloop-device-connection-grant-v1',\n `issuer=${grant.issuer}`,\n `accountId=${grant.accountId}`,\n `subjectPeerId=${grant.subjectPeerId}`,\n `allowedPeerIds=${grant.allowedPeerIds.join(',')}`,\n `issuedAt=${grant.issuedAt}`,\n `expiresAt=${grant.expiresAt}`,\n ].join('\\n');\n return new TextEncoder().encode(message);\n}\n\nexport function buildDeviceRelayReservationTokenMessage(token: Omit<DeviceRelayReservationToken, 'signature'>): Uint8Array {\n const message = [\n 'memeloop-device-relay-admission-v1',\n `issuer=${token.issuer}`,\n `accountId=${token.accountId}`,\n `peerId=${token.peerId}`,\n `relayMultiaddrs=${token.relayMultiaddrs.join(',')}`,\n `bootstrapMultiaddrs=${token.bootstrapMultiaddrs.join(',')}`,\n `issuedAt=${token.issuedAt}`,\n `expiresAt=${token.expiresAt}`,\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);\n const publicKey = privateKey.publicKey;\n if ((await encodePublicKeyMultibase(publicKey)) !== input.identity.publicKeyMultibase) {\n throw new Error('device_identity_public_key_mismatch');\n }\n if (peerIdFromPrivateKey(privateKey).toString() !== input.identity.peerId) {\n throw new Error('device_identity_peer_id_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);\n if (peerIdFromPublicKey(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\nexport async function verifyDeviceConnectionGrant(input: DeviceConnectionGrantVerificationInput): Promise<boolean> {\n try {\n const now = input.now ?? Date.now();\n const { grant } = input;\n if (grant.issuer !== 'memeloop-cloud') return false;\n if (grant.issuedAt > grant.expiresAt) return false;\n if (grant.expiresAt <= now) return false;\n if (input.subjectPeerId && grant.subjectPeerId !== input.subjectPeerId) return false;\n if (input.allowedPeerId && !grant.allowedPeerIds.includes(input.allowedPeerId)) return false;\n\n const { fromString } = await loadUint8arrays();\n const publicKey = await decodePublicKeyMultibase(input.verificationPublicKeyMultibase);\n const message = buildDeviceConnectionGrantMessage({\n issuer: grant.issuer,\n accountId: grant.accountId,\n subjectPeerId: grant.subjectPeerId,\n allowedPeerIds: grant.allowedPeerIds,\n issuedAt: grant.issuedAt,\n expiresAt: grant.expiresAt,\n });\n const signature = fromString(grant.signature, 'base64url');\n return await publicKey.verify(message, signature);\n } catch {\n return false;\n }\n}\n\nexport async function verifyDeviceRelayReservationToken(input: DeviceRelayReservationTokenVerificationInput): Promise<boolean> {\n try {\n const now = input.now ?? Date.now();\n const { token } = input;\n if (token.issuer !== 'memeloop-cloud') return false;\n if (token.issuedAt > token.expiresAt) return false;\n if (token.expiresAt <= now) return false;\n if (input.peerId && token.peerId !== input.peerId) return false;\n\n const { fromString } = await loadUint8arrays();\n const publicKey = await decodePublicKeyMultibase(input.verificationPublicKeyMultibase);\n const message = buildDeviceRelayReservationTokenMessage({\n issuer: token.issuer,\n accountId: token.accountId,\n peerId: token.peerId,\n relayMultiaddrs: token.relayMultiaddrs,\n bootstrapMultiaddrs: token.bootstrapMultiaddrs,\n issuedAt: token.issuedAt,\n expiresAt: token.expiresAt,\n });\n const signature = fromString(token.signature, 'base64url');\n return await publicKey.verify(message, signature);\n } catch {\n return false;\n }\n}\n\nfunction addRelayListenAddress(addresses: string[]): string[] {\n return addresses.includes('/p2p-circuit') ? addresses : [...addresses, '/p2p-circuit'];\n}\n","import type { DeviceConnectionGrant } from './types.js';\n\nexport const LIBP2P_SYNC_REQUEST_TYPE = 'memeloop-sync-request-v1';\nexport const LIBP2P_SYNC_RESPONSE_TYPE = 'memeloop-sync-response-v1';\n\nexport type Libp2pSyncMethod =\n | 'exchangeVersionVector'\n | 'pullMissingMetadata'\n | 'pullMissingMessages'\n | 'pullAttachmentBlob';\n\nexport interface Libp2pSyncRequest {\n type: typeof LIBP2P_SYNC_REQUEST_TYPE;\n id: string;\n method: Libp2pSyncMethod;\n params: unknown;\n grant?: DeviceConnectionGrant;\n}\n\nexport type Libp2pSyncResponse =\n | {\n type: typeof LIBP2P_SYNC_RESPONSE_TYPE;\n id: string;\n ok: true;\n result: unknown;\n }\n | {\n type: typeof LIBP2P_SYNC_RESPONSE_TYPE;\n id: string;\n ok: false;\n error: string;\n };\n\nexport interface AttachmentBlobWire {\n dataBase64Url: string;\n filename: string;\n mimeType: string;\n size: number;\n}\n\nconst syncMethods = new Set<Libp2pSyncMethod>([\n 'exchangeVersionVector',\n 'pullMissingMetadata',\n 'pullMissingMessages',\n 'pullAttachmentBlob',\n]);\n\nexport function isLibp2pSyncRequest(value: unknown): value is Libp2pSyncRequest {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return false;\n const record = value as Record<string, unknown>;\n return (\n record.type === LIBP2P_SYNC_REQUEST_TYPE &&\n typeof record.id === 'string' &&\n typeof record.method === 'string' &&\n syncMethods.has(record.method as Libp2pSyncMethod)\n );\n}\n\nexport function isLibp2pSyncResponse(value: unknown): value is Libp2pSyncResponse {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return false;\n const record = value as Record<string, unknown>;\n if (record.type !== LIBP2P_SYNC_RESPONSE_TYPE || typeof record.id !== 'string' || typeof record.ok !== 'boolean') return false;\n if (record.ok) return 'result' in record;\n return typeof record.error === 'string';\n}\n\nfunction isAttachmentBlobWire(value: unknown): value is AttachmentBlobWire {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return false;\n const record = value as Record<string, unknown>;\n return (\n typeof record.dataBase64Url === 'string' &&\n typeof record.filename === 'string' &&\n typeof record.mimeType === 'string' &&\n typeof record.size === 'number'\n );\n}\n\nexport async function attachmentBlobFromWire(value: unknown): Promise<\n {\n data: Uint8Array;\n filename: string;\n mimeType: string;\n size: number;\n } | null\n> {\n if (value === null) return null;\n if (!isAttachmentBlobWire(value)) throw new Error('invalid_sync_response');\n const { fromString } = await import('uint8arrays');\n return {\n data: fromString(value.dataBase64Url, 'base64url'),\n filename: value.filename,\n mimeType: value.mimeType,\n size: value.size,\n };\n}\n","import type { ChatMessage } from '../conversation/index.js';\nimport type { ConversationMeta, VersionVector } from '../sync/protocol.js';\nimport { attachmentBlobFromWire, isLibp2pSyncResponse, LIBP2P_SYNC_REQUEST_TYPE, type Libp2pSyncMethod, type Libp2pSyncRequest } from './libp2pSyncProtocol.js';\nimport type { AttachmentBlob, Device, DeviceConnectionGrant, DeviceNetworkService, DeviceSyncTransport, ExchangeVersionVectorResult, MemeLoopDuplexStream } from './types.js';\n\nexport interface Libp2pDeviceSyncTransportOptions {\n nodeId: string;\n deviceNetwork: Pick<DeviceNetworkService, 'listDevices' | 'openStream'>;\n grantProvider?: (peerId: string) => Promise<DeviceConnectionGrant | undefined>;\n}\n\nexport class Libp2pDeviceSyncTransport implements DeviceSyncTransport {\n public readonly nodeId: string;\n private readonly deviceNetwork: Pick<DeviceNetworkService, 'listDevices' | 'openStream'>;\n private readonly grantProvider?: (peerId: string) => Promise<DeviceConnectionGrant | undefined>;\n\n constructor(options: Libp2pDeviceSyncTransportOptions) {\n this.nodeId = options.nodeId;\n this.deviceNetwork = options.deviceNetwork;\n this.grantProvider = options.grantProvider;\n }\n\n public listPeers(): Promise<Device[]> {\n return this.deviceNetwork.listDevices();\n }\n\n public exchangeVersionVector(peerId: string, localVersion: VersionVector): Promise<ExchangeVersionVectorResult> {\n return this.request(peerId, 'exchangeVersionVector', { localVersion }) as Promise<ExchangeVersionVectorResult>;\n }\n\n public pullMissingMetadata(peerId: string, sinceVersion: VersionVector): Promise<ConversationMeta[]> {\n return this.request(peerId, 'pullMissingMetadata', { sinceVersion }) as Promise<ConversationMeta[]>;\n }\n\n public pullMissingMessages(peerId: string, conversationId: string, knownMessageIds: string[]): Promise<ChatMessage[]> {\n return this.request(peerId, 'pullMissingMessages', { conversationId, knownMessageIds }) as Promise<ChatMessage[]>;\n }\n\n public async pullAttachmentBlob(peerId: string, contentHash: string): Promise<AttachmentBlob | null> {\n const result = await this.request(peerId, 'pullAttachmentBlob', { contentHash });\n return attachmentBlobFromWire(result);\n }\n\n private async request(peerId: string, method: Libp2pSyncMethod, parameters: unknown): Promise<unknown> {\n const grant = await this.grantProvider?.(peerId);\n const stream = await this.deviceNetwork.openStream(peerId, '/memeloop/sync/1.0.0', grant);\n const request: Libp2pSyncRequest = {\n type: LIBP2P_SYNC_REQUEST_TYPE,\n id: crypto.randomUUID(),\n method,\n params: parameters,\n grant,\n };\n await writeJsonToStream(stream, request);\n const response = await readJsonFromStream(stream);\n await stream.close();\n if (!isLibp2pSyncResponse(response)) throw new Error('invalid_sync_response');\n if (response.id !== request.id) throw new Error('sync_response_id_mismatch');\n if (!response.ok) throw new Error(response.error);\n return response.result;\n }\n}\n\nasync function writeJsonToStream(stream: MemeLoopDuplexStream, message: unknown): Promise<void> {\n const payload = new TextEncoder().encode(JSON.stringify(message));\n await stream.sink(async function*() {\n yield payload;\n }());\n}\n\nasync function readJsonFromStream(stream: MemeLoopDuplexStream): Promise<unknown> {\n const reader = stream.source[Symbol.asyncIterator]();\n const result = await reader.next();\n if (result.done || !result.value) throw new Error('sync_response_missing');\n return JSON.parse(new TextDecoder().decode(result.value)) as unknown;\n}\n","import type { DeviceConnectionGrant } from './types.js';\n\nexport const LIBP2P_RPC_REQUEST_TYPE = 'memeloop-rpc-request-v1';\nexport const LIBP2P_RPC_RESPONSE_TYPE = 'memeloop-rpc-response-v1';\n\nexport interface Libp2pRpcRequest {\n type: typeof LIBP2P_RPC_REQUEST_TYPE;\n id: string;\n method: string;\n params: unknown;\n grant?: DeviceConnectionGrant;\n}\n\nexport type Libp2pRpcResponse =\n | {\n type: typeof LIBP2P_RPC_RESPONSE_TYPE;\n id: string;\n ok: true;\n result: unknown;\n }\n | {\n type: typeof LIBP2P_RPC_RESPONSE_TYPE;\n id: string;\n ok: false;\n error: string;\n };\n\nexport function isLibp2pRpcRequest(value: unknown): value is Libp2pRpcRequest {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return false;\n const record = value as Record<string, unknown>;\n return (\n record.type === LIBP2P_RPC_REQUEST_TYPE &&\n typeof record.id === 'string' &&\n typeof record.method === 'string'\n );\n}\n\nexport function isLibp2pRpcResponse(value: unknown): value is Libp2pRpcResponse {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return false;\n const record = value as Record<string, unknown>;\n if (record.type !== LIBP2P_RPC_RESPONSE_TYPE || typeof record.id !== 'string' || typeof record.ok !== 'boolean') return false;\n if (record.ok) return 'result' in record;\n return typeof record.error === 'string';\n}\n","import type { DeviceAuthorizer, MemeLoopProtocol, TrustedDeviceRecord } from './types.js';\n\nexport interface LocalTrustDeviceAuthorizerOptions {\n trustedDevices?: Iterable<TrustedDeviceRecord>;\n getTrustedDevice?: (peerId: string) => TrustedDeviceRecord | undefined;\n allowPairingProtocol?: boolean;\n}\n\nconst PAIRING_PROTOCOL: MemeLoopProtocol = '/memeloop/pairing/1.0.0';\n\nexport class LocalTrustDeviceAuthorizer implements DeviceAuthorizer {\n private readonly trustedDevices = new Map<string, TrustedDeviceRecord>();\n private readonly allowPairingProtocol: boolean;\n\n constructor(private readonly options: LocalTrustDeviceAuthorizerOptions = {}) {\n this.allowPairingProtocol = options.allowPairingProtocol ?? true;\n for (const record of options.trustedDevices ?? []) {\n this.trustedDevices.set(record.peerId, record);\n }\n }\n\n public setTrustedDevice(record: TrustedDeviceRecord): void {\n this.trustedDevices.set(record.peerId, record);\n }\n\n public removeTrustedDevice(peerId: string): void {\n this.trustedDevices.delete(peerId);\n }\n\n public async canOpenProtocol(input: {\n remotePeerId: string;\n protocol: MemeLoopProtocol;\n }): Promise<boolean> {\n const record = this.options.getTrustedDevice?.(input.remotePeerId) ?? this.trustedDevices.get(input.remotePeerId);\n if (record?.revokedAt) return false;\n if (input.protocol === PAIRING_PROTOCOL) return this.allowPairingProtocol;\n return record !== undefined;\n }\n}\n","import { verifyDeviceConnectionGrant } from './libp2pDeviceNetworkService.js';\nimport type { DeviceAuthorizer, MemeLoopProtocol, TrustedDeviceRecord } from './types.js';\n\nexport interface CloudDeviceAuthorizerOptions {\n localPeerId: string;\n grantVerificationPublicKeyMultibase: string;\n getTrustedDevice?: (peerId: string) => TrustedDeviceRecord | undefined;\n allowPairingProtocol?: boolean;\n now?: () => number;\n}\n\nconst PAIRING_PROTOCOL: MemeLoopProtocol = '/memeloop/pairing/1.0.0';\n\nexport class CloudDeviceAuthorizer implements DeviceAuthorizer {\n private readonly allowPairingProtocol: boolean;\n\n constructor(private readonly options: CloudDeviceAuthorizerOptions) {\n this.allowPairingProtocol = options.allowPairingProtocol ?? true;\n }\n\n public async canOpenProtocol(input: Parameters<DeviceAuthorizer['canOpenProtocol']>[0]): Promise<boolean> {\n const record = this.options.getTrustedDevice?.(input.remotePeerId);\n if (record?.revokedAt) return false;\n if (input.protocol === PAIRING_PROTOCOL) return this.allowPairingProtocol;\n if (record) return true;\n if (!input.presentedGrant) return false;\n\n const direction = input.direction ?? 'inbound';\n return verifyDeviceConnectionGrant({\n grant: input.presentedGrant,\n verificationPublicKeyMultibase: this.options.grantVerificationPublicKeyMultibase,\n subjectPeerId: direction === 'outbound' ? this.options.localPeerId : input.remotePeerId,\n allowedPeerId: direction === 'outbound' ? input.remotePeerId : this.options.localPeerId,\n now: this.options.now?.(),\n });\n }\n}\n","import type {\n Device,\n DeviceCapabilities,\n DeviceConnectionGrant,\n DeviceNetworkService,\n LocalDeviceIdentity,\n LocalPairingRequestOptions,\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 agentLoop: 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 trusted: !record.revokedAt,\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 private readonly pairingListeners = new Set<(sessions: PairingSession[]) => 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 listPairingSessions(): Promise<PairingSession[]> {\n return [...this.pairingSessions.values()];\n }\n\n public observePairingSessions(listener: (sessions: PairingSession[]) => void): () => void {\n this.pairingListeners.add(listener);\n void this.listPairingSessions().then(listener);\n return () => {\n this.pairingListeners.delete(listener);\n };\n }\n\n public async requestLocalPairing(peerId: string, _options: LocalPairingRequestOptions = {}): Promise<PairingSession> {\n const createdAt = Date.now();\n const session: PairingSession = {\n sessionId: `pairing-${this.options.identity.peerId}-${peerId}-${createdAt}`,\n localPeerId: this.options.identity.peerId,\n remotePeerId: peerId,\n remotePublicKeyMultibase: '',\n remoteDeviceName: peerId,\n remotePlatform: 'cli',\n remoteCapabilities: emptyCapabilities,\n remoteMultiaddrs: [],\n direction: 'outbound',\n status: 'pending',\n confirmCode: this.confirmCode(peerId),\n createdAt,\n expiresAt: createdAt + 5 * 60_000,\n };\n this.pairingSessions.set(session.sessionId, session);\n this.emitPairingSessions();\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 if (session.status !== 'pending') throw new Error('pairing_session_not_pending');\n this.trustedDevices.set(session.remotePeerId, {\n peerId: session.remotePeerId,\n publicKeyMultibase: session.remotePublicKeyMultibase,\n deviceName: session.remoteDeviceName,\n platform: session.remotePlatform,\n trustMode: 'local-pairing',\n createdAt: Date.now(),\n lastSeen: Date.now(),\n });\n session.status = 'accepted';\n this.emitPairingSessions();\n this.emitDevices();\n }\n\n public async rejectPairing(sessionId: string): Promise<void> {\n const session = this.pairingSessions.get(sessionId);\n if (!session) return;\n session.status = 'rejected';\n this.emitPairingSessions();\n }\n\n public async removeTrustedDevice(peerId: string): Promise<void> {\n this.trustedDevices.delete(peerId);\n this.emitDevices();\n }\n\n public async openStream(\n peerId: string,\n _protocol: MemeLoopProtocol,\n _presentedGrant?: DeviceConnectionGrant,\n ): 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>(\n peerId: string,\n _method: string,\n _parameters: unknown,\n _presentedGrant?: DeviceConnectionGrant,\n ): 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, _presentedGrant?: DeviceConnectionGrant): 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 private emitPairingSessions(): void {\n void this.listPairingSessions().then((sessions) => {\n for (const listener of this.pairingListeners) listener(sessions);\n });\n }\n}\n","import type { CloudDeviceClient, CloudDeviceRecord, DeviceTrustStore, TrustedDeviceRecord } from './types.js';\n\n/**\n * Fetch visible cloud devices and merge them into the local trust store.\n * - Cloud devices become trusted with trustMode = \"cloud-account\".\n * - Already-trusted devices are updated (capabilities, lastSeen, multiaddrs).\n * - Revoked cloud devices are NOT removed from local trust store here\n * (revocation should be handled via heartbeat/grant failure).\n * - Returns the synced cloud device records for caller to emit as discovered devices.\n */\nexport async function syncCloudDevices(input: {\n cloudClient: CloudDeviceClient;\n trustStore: DeviceTrustStore;\n}): Promise<CloudDeviceRecord[]> {\n const cloudDevices = await input.cloudClient.listDevices();\n\n if (cloudDevices.length === 0) return [];\n\n const existingRecords = await input.trustStore.loadTrustedDevices();\n const existingByPeerId = new Map(existingRecords.map((r) => [r.peerId, r]));\n\n for (const cloudDevice of cloudDevices) {\n const existing = existingByPeerId.get(cloudDevice.peerId);\n\n const record: TrustedDeviceRecord = {\n peerId: cloudDevice.peerId,\n publicKeyMultibase: cloudDevice.publicKeyMultibase,\n deviceName: cloudDevice.deviceName,\n platform: cloudDevice.platform,\n trustMode: 'cloud-account',\n accountId: cloudDevice.accountId,\n createdAt: existing?.createdAt ?? Date.now(),\n lastSeen: cloudDevice.lastSeen,\n revokedAt: cloudDevice.revokedAt,\n };\n\n if (existing) {\n // Update mutable fields while preserving trust mode\n existing.lastSeen = cloudDevice.lastSeen;\n existing.revokedAt = cloudDevice.revokedAt;\n // If the device is already trusted via cloud-account, skip persisting again\n // unless key fields changed\n if (\n existing.publicKeyMultibase !== record.publicKeyMultibase ||\n existing.deviceName !== record.deviceName ||\n existing.platform !== record.platform\n ) {\n await input.trustStore.saveTrustedDevice(record);\n }\n } else {\n await input.trustStore.saveTrustedDevice(record);\n }\n }\n\n return cloudDevices;\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) => `${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 }\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 += (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 += (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 }\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","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 = 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 = (function_: typeof imListConversationsImpl) => (arguments_: Record<string, unknown>) => 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 { BUILTIN_TOOL_PLUGIN_IDS, registerBuiltinToolPlugins } from '../../loopAPI/plugins/builtinToolsPlugin.js';\nimport { getLoopRegistry } from '../../loopAPI/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 { ASK_USER_QUESTION_TOOL_ID, askUserQuestionConfigSchema, askUserQuestionImpl } from './askUserQuestion.js';\nexport { IM_SESSION_TOOL_IDS, type ImSessionBuiltinRegistration, registerImSessionBuiltinTools } from './imBuiltinTools.js';\nexport { getMcpClientToolId, mcpClientConfigSchema, mcpClientImpl } from './mcpClient.js';\nexport { getMcpForwardToolId, mcpForwardConfigSchema, mcpForwardImpl } from './mcpForward.js';\nexport { resolveQuestionAnswer } from './questionWaitRegistry.js';\nexport { getRemoteAgentToolId, remoteAgentConfigSchema, remoteAgentImpl, remoteAgentListImpl } from './remoteAgent.js';\nexport { getSpawnAgentToolId, spawnAgentConfigSchema, spawnAgentImpl } from './spawnAgent.js';\nexport { getTaskToolId, taskToolConfigSchema, taskToolImpl } from './task.js';\nexport { __clearTodoStore, TODO_WRITE_TOOL_ID, todoWriteConfigSchema, todoWriteImpl } 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":["PAIRING_PROTOCOL","error","objectParameter","stringParameter","stringArrayParameter","PAIRING_PROTOCOL","emptyCapabilities","o","error","error","error"]}
|