memeloop 0.2.8 → 0.2.9

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.
Files changed (36) hide show
  1. package/dist/{chunk-NVJCRIEK.js → chunk-34B7MUI6.js} +2 -2
  2. package/dist/{chunk-DACM5AMS.js → chunk-7W4FMKMO.js} +190 -56
  3. package/dist/chunk-7W4FMKMO.js.map +1 -0
  4. package/dist/{chunk-OD6U6VAR.js → chunk-GH5RDPLJ.js} +2 -2
  5. package/dist/{chunk-OD6U6VAR.js.map → chunk-GH5RDPLJ.js.map} +1 -1
  6. package/dist/device-network/cloudDeviceFetchClient.d.ts +9 -7
  7. package/dist/device-network/cloudDeviceFetchClient.d.ts.map +1 -1
  8. package/dist/device-network/deviceCloudConnectionCoordinator.d.ts +5 -5
  9. package/dist/device-network/deviceCloudConnectionCoordinator.d.ts.map +1 -1
  10. package/dist/device-network/deviceOrchestrationTransport.d.ts +7 -0
  11. package/dist/device-network/deviceOrchestrationTransport.d.ts.map +1 -1
  12. package/dist/device-network/standardDeviceCloudConnectionAdapter.d.ts +16 -8
  13. package/dist/device-network/standardDeviceCloudConnectionAdapter.d.ts.map +1 -1
  14. package/dist/device-network/types.d.ts +4 -2
  15. package/dist/device-network/types.d.ts.map +1 -1
  16. package/dist/device-network-portable.cjs +190 -55
  17. package/dist/device-network-portable.cjs.map +1 -1
  18. package/dist/device-network-portable.js +189 -55
  19. package/dist/device-network-portable.js.map +1 -1
  20. package/dist/device-network.cjs +190 -55
  21. package/dist/device-network.cjs.map +1 -1
  22. package/dist/device-network.js +4 -2
  23. package/dist/index.cjs +488 -180
  24. package/dist/index.cjs.map +1 -1
  25. package/dist/index.js +302 -127
  26. package/dist/index.js.map +1 -1
  27. package/dist/loop-api.cjs +1 -1
  28. package/dist/loop-api.cjs.map +1 -1
  29. package/dist/loop-api.js +1 -1
  30. package/dist/mobile.cjs.map +1 -1
  31. package/dist/orchestration/externalOrchestrationController.d.ts.map +1 -1
  32. package/dist/orchestration/workloadExecutionController.d.ts.map +1 -1
  33. package/dist/plugin/loader.d.ts +1 -1
  34. package/package.json +2 -1
  35. package/dist/chunk-DACM5AMS.js.map +0 -1
  36. /package/dist/{chunk-NVJCRIEK.js.map → chunk-34B7MUI6.js.map} +0 -0
@@ -539,7 +539,7 @@ function readDataIdentifier(value, property, field) {
539
539
 
540
540
  // src/plugin/loader.ts
541
541
  import { satisfies, valid, validRange } from "semver";
542
- var MEMELOOP_PLUGIN_API_VERSION = "0.2.8";
542
+ var MEMELOOP_PLUGIN_API_VERSION = "0.2.9";
543
543
  var dangerousManifestKeys = /* @__PURE__ */ new Set(["__proto__", "prototype", "constructor"]);
544
544
  var manifestKeys = /* @__PURE__ */ new Set(["name", "version", "description", "exports", "author", "minMemeloopVersion"]);
545
545
  var exportKeys = /* @__PURE__ */ new Set([
@@ -964,4 +964,4 @@ export {
964
964
  PluginLifecycleTimeoutError,
965
965
  PluginLoader
966
966
  };
967
- //# sourceMappingURL=chunk-OD6U6VAR.js.map
967
+ //# sourceMappingURL=chunk-GH5RDPLJ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/permission/storage.ts","../src/loopAPI/agent-tool-loop/runner.ts","../src/loopAPI/tokenTracker.ts","../src/plugin/registry.ts","../src/plugin/loader.ts"],"sourcesContent":["import type { PermissionSet } from './types.js';\n\nexport interface PermissionSqlStatement {\n get(...arguments_: unknown[]): unknown;\n run(...arguments_: unknown[]): unknown;\n}\n\nexport interface PermissionSqlDatabase {\n prepare(sql: string): PermissionSqlStatement;\n}\n\nconst TABLE_NAME = 'permissions';\nconst STORAGE_KEY = 'user';\n\n/**\n * Load user-level permission set from SQLite.\n *\n * The `permissions` table stores JSON blobs keyed by `source`.\n * Returns an empty set if no persisted rules exist.\n */\nexport function loadUserPermissions(database: PermissionSqlDatabase): PermissionSet {\n try {\n const row = database\n .prepare(`SELECT rulesJson FROM ${TABLE_NAME} WHERE source = ? LIMIT 1`)\n .get(STORAGE_KEY) as { rulesJson: string } | undefined;\n\n if (row?.rulesJson) {\n return JSON.parse(row.rulesJson) as PermissionSet;\n }\n } catch {\n /* Table may not exist yet; return empty */\n }\n\n return { rules: [], source: 'user' };\n}\n\n/**\n * Persist user-level permission set to SQLite.\n *\n * Uses INSERT OR REPLACE so first-time saves work without explicit table detection.\n */\nexport function saveUserPermissions(database: PermissionSqlDatabase, set: PermissionSet): void {\n database.prepare(\n `INSERT OR REPLACE INTO ${TABLE_NAME} (source, rulesJson, updatedAt)\n VALUES (?, ?, ?)`,\n ).run(set.source, JSON.stringify(set), Date.now());\n}\n\n/** SQL statement to create the permissions table during migration. */\nexport const PERMISSIONS_TABLE_DDL = `\n CREATE TABLE IF NOT EXISTS ${TABLE_NAME} (\n source TEXT PRIMARY KEY,\n rulesJson TEXT NOT NULL,\n updatedAt INTEGER NOT NULL\n );\n`;\n","/**\n * AgentToolLoop runner — convenience API for driving a full loop turn.\n */\n\nimport type { AgentFrameworkContext, AgentInstanceState } from '../../types.js';\nimport type { AgentLoopGenerator, AgentLoopInput, AgentLoopStep } from '../types.js';\nimport { createAgentToolLoopRunner } from './directRunner.js';\n\nexport interface RunAgentToolLoopTurnCallbacks {\n onStep?: (step: AgentLoopStep) => void | Promise<void>;\n onProgress?: (\n status: string,\n data: Record<string, unknown>,\n step: AgentLoopStep,\n ) => void | Promise<void>;\n agentToolLoop?: (input: AgentLoopInput) => AgentLoopGenerator;\n}\n\nexport interface RunAgentToolLoopTurnResult {\n state: AgentInstanceState;\n stepCount: number;\n}\n\nexport function resolveAgentToolLoopTerminalState(\n step: AgentLoopStep,\n current: AgentInstanceState,\n): AgentInstanceState {\n if (step.type !== 'thinking') return current;\n const data = step.data as { status?: string };\n if (data.status === 'input-required') return 'input-required';\n if (data.status === 'cancelled') return 'canceled';\n if (data.status === 'max-iterations') return 'completed';\n if (data.status === 'blocked') return 'failed';\n if (data.status === 'calling-llm') return 'working';\n return current;\n}\n\nexport async function runAgentToolLoopTurn(\n context: AgentFrameworkContext,\n input: AgentLoopInput,\n callbacks: RunAgentToolLoopTurnCallbacks = {},\n): Promise<RunAgentToolLoopTurnResult> {\n const agentToolLoop = callbacks.agentToolLoop ?? createAgentToolLoopRunner(context);\n let terminalState: AgentInstanceState = 'completed';\n let stepCount = 0;\n\n for await (const step of agentToolLoop(input)) {\n stepCount += 1;\n terminalState = resolveAgentToolLoopTerminalState(step, terminalState);\n await callbacks.onStep?.(step);\n\n if (step.type === 'thinking' && step.data && typeof step.data === 'object') {\n const data = step.data as Record<string, unknown>;\n const status = data.status;\n if (typeof status === 'string') {\n await callbacks.onProgress?.(status, data, step);\n }\n }\n }\n\n return {\n state: terminalState === 'working' || terminalState === 'submitted' ? 'completed' : terminalState,\n stepCount,\n };\n}\n","/**\n * Token counting and auto-compaction trigger.\n * Tracks token usage per conversation and triggers compaction when approaching limits.\n *\n * Based on: Claude Code autoCompact + OpenCode autoCompact@95%\n */\n\n/** Rough token estimation: ~4 chars per token (conservative) */\nexport function estimateTokens(text: string): number {\n return Math.ceil(text.length / 3.5);\n}\n\n/** Estimate token count for a messages array */\nexport function estimateMessagesTokens(messages: Array<{ content: unknown }>): number {\n let total = 0;\n for (const message of messages) {\n const content = typeof message.content === 'string' ? message.content : JSON.stringify(message.content ?? '');\n total += estimateTokens(content);\n }\n return total;\n}\n\nexport interface TokenTrackerConfig {\n /** Maximum context window in tokens (default: 200000) */\n contextWindow?: number;\n /** Trigger compaction when usage exceeds this fraction (default: 0.90) */\n compactionThreshold?: number;\n /** Buffer tokens reserved for output (default: 16000) */\n outputBuffer?: number;\n}\n\nexport interface TokenUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n contextWindow: number;\n usagePercent: number;\n shouldCompact: boolean;\n}\n\n/**\n * Tracks token usage and decides when to trigger auto-compaction.\n */\nexport class TokenTracker {\n private promptTokens = 0;\n private completionTokens = 0;\n private readonly contextWindow: number;\n private readonly compactionThreshold: number;\n private readonly outputBuffer: number;\n private compacting = false;\n private consecutiveCompactionFailures = 0;\n private maxConsecutiveFailures = 3;\n\n constructor(config?: TokenTrackerConfig) {\n this.contextWindow = config?.contextWindow ?? 200_000;\n this.compactionThreshold = config?.compactionThreshold ?? 0.9;\n this.outputBuffer = config?.outputBuffer ?? 16_000;\n }\n\n /** Record token usage from an LLM response */\n recordUsage(promptTokens: number, completionTokens: number): void {\n this.promptTokens += promptTokens;\n this.completionTokens += completionTokens;\n }\n\n /** Manually set the prompt token count (e.g., from estimation) */\n setPromptTokens(tokens: number): void {\n this.promptTokens = tokens;\n }\n\n /** Get current usage */\n getUsage(): TokenUsage {\n const total = this.promptTokens + this.completionTokens;\n const effectiveWindow = this.contextWindow - this.outputBuffer;\n const usagePercent = total / effectiveWindow;\n return {\n promptTokens: this.promptTokens,\n completionTokens: this.completionTokens,\n totalTokens: total,\n contextWindow: this.contextWindow,\n usagePercent: Math.min(usagePercent, 1.0),\n shouldCompact: usagePercent >= this.compactionThreshold && !this.compacting,\n };\n }\n\n /** Check if auto-compaction should be triggered */\n shouldTriggerCompaction(): boolean {\n if (this.consecutiveCompactionFailures >= this.maxConsecutiveFailures) return false;\n return this.getUsage().shouldCompact;\n }\n\n /** Mark that compaction is starting */\n markCompactionStart(): void {\n this.compacting = true;\n }\n\n /** Mark that compaction succeeded — reset token counts */\n markCompactionSuccess(estimatedPostTokens: number): void {\n this.compacting = false;\n this.promptTokens = estimatedPostTokens;\n this.completionTokens = 0;\n this.consecutiveCompactionFailures = 0;\n }\n\n /** Mark that compaction failed */\n markCompactionFailure(): void {\n this.compacting = false;\n this.consecutiveCompactionFailures++;\n }\n\n /** Reset all counters */\n reset(): void {\n this.promptTokens = 0;\n this.completionTokens = 0;\n this.compacting = false;\n this.consecutiveCompactionFailures = 0;\n }\n\n /** Get a human-readable summary */\n formatUsage(): string {\n const usage = this.getUsage();\n const promptK = (usage.promptTokens / 1000).toFixed(1);\n const windowK = (usage.contextWindow / 1000).toFixed(0);\n const pct = (usage.usagePercent * 100).toFixed(1);\n return `${promptK}K/${windowK}K tokens (${pct}%)`;\n }\n}\n\n/** Interface for a compaction engine that can summarize conversation history */\nexport interface CompactionEngine {\n compact(\n messages: Array<{ role: string; content: unknown }>,\n conversationId: string,\n ): Promise<void>;\n}\n\n/**\n * Auto-compaction hook — call this after each LLM response.\n * Triggers compaction when token usage exceeds threshold.\n *\n * @returns true if compaction was triggered\n */\nexport async function maybeAutoCompact(\n tracker: TokenTracker,\n compactionEngine: CompactionEngine,\n messages: Array<{ role: string; content: unknown }>,\n conversationId: string,\n): Promise<boolean> {\n if (!tracker.shouldTriggerCompaction()) return false;\n\n tracker.markCompactionStart();\n try {\n await compactionEngine.compact(messages, conversationId);\n const estimatedPost = estimateTokens('Summary of previous conversation context.');\n tracker.markCompactionSuccess(estimatedPost);\n return true;\n } catch {\n tracker.markCompactionFailure();\n return false;\n }\n}\n","/**\n * Plugin registry: bridges plugin exports to memeloop's tool and hook registries.\n *\n * Provides a `createPluginAPI()` factory that plugins call during `activate()`\n * to register their tools and hooks with the host runtime.\n *\n * Converted from module-level singletons to an instance class for test isolation\n * and multi-runtime support.\n */\n\nimport type { AgentProfile } from '../agent/agentProfiles.js';\nimport type { ProviderConfig, ProviderRegistration } from '../llm/providerRegistry.js';\nimport { HookRegistry } from '../loopAPI/hooks/registry.js';\nimport type { HookHandler, HookRegistrationRegistry, HookType } from '../loopAPI/hooks/types.js';\nimport type { AgentLoopDefinition, LoopPlugin, LoopProfile } from '../loopAPI/types.js';\nimport type { ToolOperationEffect } from '../orchestration/resources.js';\nimport { ToolSchemaRegistry } from '../tools/schemaRegistry.js';\nimport type { OwnedToolSchemaRegistry } from '../tools/schemaRegistry.js';\nimport type { ILLMProvider } from '../types.js';\nimport type { PluginAPI } from './types.js';\n\n/** Tool-registry capabilities required by an unloadable plugin host. */\nexport interface PluginToolRegistry {\n registerTool(\n id: string,\n impl: unknown,\n schema?: unknown,\n effect?: ToolOperationEffect,\n ): void;\n /** Permission-independent registration lookup. */\n hasTool(id: string): boolean;\n unregisterTool(id: string): boolean;\n registerOwnedTool(\n id: string,\n impl: unknown,\n schema?: unknown,\n effect?: ToolOperationEffect,\n ): () => boolean;\n}\n\nexport interface PluginAgentProfileRegistry {\n registerAgentProfile(profile: AgentProfile): () => boolean;\n}\n\nexport interface PluginLoopRegistry {\n registerLoop(definition: AgentLoopDefinition): () => void;\n registerProfile(profile: LoopProfile): () => void;\n registerPlugin(plugin: LoopPlugin): () => void;\n}\n\nexport interface PluginProviderRegistry {\n register(\n owner: { ownerId: string; kind: 'plugin' },\n provider: ILLMProvider,\n config: Omit<ProviderConfig, 'name'>,\n ): ProviderRegistration;\n}\n\n/** Plugin API factory options. */\nexport interface PluginAPIOptions {\n /** Stable manifest name used to own and later remove every registration. */\n pluginName: string;\n toolRegistry?: PluginToolRegistry;\n agentProfileRegistry?: PluginAgentProfileRegistry;\n loopRegistry?: PluginLoopRegistry;\n providerRegistry?: PluginProviderRegistry;\n logger?: PluginAPI['logger'];\n}\n\nexport interface PluginRegistryManagerOptions {\n hookRegistry?: HookRegistrationRegistry;\n schemaRegistry?: OwnedToolSchemaRegistry;\n}\n\n/**\n * Track which tools/plugins belong to each plugin so we can clean up on unload.\n */\ninterface PluginRegistration {\n pluginName: string;\n tools: string[];\n hooks: Array<{ type: HookType; name: string }>;\n agentProfiles: string[];\n loopDefinitions: string[];\n loopProfiles: string[];\n loopPlugins: string[];\n modelProviders: string[];\n staged: Array<() => () => void>;\n cleanup: Array<() => void>;\n registering: boolean;\n accepting: boolean;\n inFlight: Set<Promise<unknown>>;\n detached: boolean;\n}\n\nexport class PluginUnavailableError extends Error {\n readonly code = 'PLUGIN_UNAVAILABLE' as const;\n\n constructor(readonly pluginName: string) {\n super(`Plugin is not accepting requests: ${pluginName}`);\n this.name = 'PluginUnavailableError';\n }\n}\n\nexport interface PluginRegistrationSnapshot {\n pluginName: string;\n tools: string[];\n hooks: Array<{ type: HookType; name: string }>;\n agentProfiles: string[];\n loopDefinitions: string[];\n loopProfiles: string[];\n loopPlugins: string[];\n modelProviders: string[];\n}\n\n/**\n * Instance-level plugin registration manager.\n */\nexport class PluginRegistryManager {\n private readonly pluginRegistrations = new Map<string, PluginRegistration>();\n private readonly hookRegistry: HookRegistrationRegistry;\n private readonly schemaRegistry: OwnedToolSchemaRegistry;\n\n constructor(options: PluginRegistryManagerOptions = {}) {\n this.hookRegistry = options.hookRegistry ?? new HookRegistry();\n this.schemaRegistry = options.schemaRegistry ?? new ToolSchemaRegistry();\n }\n\n private ensureRegistration(pluginName: string): PluginRegistration {\n const existing = this.pluginRegistrations.get(pluginName);\n if (existing) return existing;\n const reg: PluginRegistration = {\n pluginName,\n tools: [],\n hooks: [],\n agentProfiles: [],\n loopDefinitions: [],\n loopProfiles: [],\n loopPlugins: [],\n modelProviders: [],\n staged: [],\n cleanup: [],\n registering: true,\n accepting: false,\n inFlight: new Set(),\n detached: false,\n };\n this.pluginRegistrations.set(pluginName, reg);\n return reg;\n }\n\n /**\n * Create a PluginAPI instance that plugins use to register their capabilities.\n */\n createPluginAPI(options: PluginAPIOptions): PluginAPI {\n const toolRegistry = options.toolRegistry;\n const hookRegistry = this.hookRegistry;\n const schemaRegistry = this.schemaRegistry;\n const agentProfileRegistry = options.agentProfileRegistry;\n const loopRegistry = options.loopRegistry;\n const providerRegistry = options.providerRegistry;\n const logger = options.logger ?? {\n debug: (...arguments_: unknown[]) => {\n console.debug('[plugin]', ...arguments_);\n },\n info: (...arguments_: unknown[]) => {\n console.info('[plugin]', ...arguments_);\n },\n warn: (...arguments_: unknown[]) => {\n console.warn('[plugin]', ...arguments_);\n },\n error: (...arguments_: unknown[]) => {\n console.error('[plugin]', ...arguments_);\n },\n };\n const pluginName = options.pluginName?.trim();\n if (!pluginName || hasControlCharacters(pluginName)) {\n throw new TypeError('Plugin API requires a stable pluginName');\n }\n const registration = this.ensureRegistration(pluginName);\n let hookIndex = registration.hooks.length;\n const trackPromise = <T>(promise: Promise<T>): Promise<T> => {\n registration.inFlight.add(promise);\n void promise.then(\n () => registration.inFlight.delete(promise),\n () => registration.inFlight.delete(promise),\n );\n return promise;\n };\n const guardAsyncIterable = <T>(source: AsyncIterable<T>): AsyncIterable<T> => ({\n async *[Symbol.asyncIterator]() {\n if (!registration.accepting) {\n throw new PluginUnavailableError(registration.pluginName);\n }\n let release!: () => void;\n const lease = new Promise<void>(resolve => {\n release = resolve;\n });\n registration.inFlight.add(lease);\n try {\n yield* source;\n } finally {\n registration.inFlight.delete(lease);\n release();\n }\n },\n });\n const isAsyncIterable = (value: unknown): value is AsyncIterable<unknown> =>\n value !== null &&\n (typeof value === 'object' || typeof value === 'function') &&\n typeof (value as AsyncIterable<unknown>)[Symbol.asyncIterator] === 'function';\n const guardResult = (result: unknown): unknown => {\n if (\n result !== null &&\n (typeof result === 'object' || typeof result === 'function') &&\n typeof (result as PromiseLike<unknown>).then === 'function'\n ) {\n return trackPromise(Promise.resolve(result).then(value => isAsyncIterable(value) ? guardAsyncIterable(value) : value));\n }\n return isAsyncIterable(result) ? guardAsyncIterable(result) : result;\n };\n const invokeCapability = (invoke: () => unknown): unknown => {\n if (!registration.accepting) {\n throw new PluginUnavailableError(registration.pluginName);\n }\n return guardResult(invoke());\n };\n const ownRegistration = (\n id: string,\n registrations: string[],\n capability: string,\n register: () => () => void,\n ): void => {\n if (!registration.registering) throw new PluginUnavailableError(registration.pluginName);\n if (registrations.includes(id)) {\n throw new Error(`Plugin ${capability} is already registered by this plugin: ${id}`);\n }\n registrations.push(id);\n registration.staged.push(register);\n };\n\n return {\n logger,\n\n registerTool(\n toolId: string,\n impl: (...arguments_: unknown[]) => unknown,\n schema?: unknown,\n effect?: ToolOperationEffect,\n ) {\n if (!registration.registering) {\n throw new PluginUnavailableError(registration.pluginName);\n }\n if (typeof impl !== 'function') {\n throw new TypeError(`Plugin tool implementation must be callable: ${toolId}`);\n }\n if (\n !toolRegistry ||\n typeof toolRegistry.hasTool !== 'function' ||\n typeof toolRegistry.unregisterTool !== 'function' ||\n typeof toolRegistry.registerOwnedTool !== 'function'\n ) {\n throw new Error(`Plugin tool requires an unloadable tool registry: ${toolId}`);\n }\n if (registration.tools.includes(toolId) || toolRegistry.hasTool(toolId)) {\n throw new Error(`Plugin tool conflicts with an existing tool: ${toolId}`);\n }\n const ownedImplementation = (...arguments_: unknown[]): unknown => invokeCapability(() => impl(...arguments_));\n registration.tools.push(toolId);\n registration.staged.push(() => {\n const unregisterSchema = schema !== undefined\n ? schemaRegistry.registerOwnedToolParameterSchema(toolId, schema, {\n displayName: toolId,\n description: `Plugin tool: ${toolId}`,\n })\n : undefined;\n let unregisterTool: (() => boolean) | undefined;\n try {\n unregisterTool = effect === undefined\n ? toolRegistry.registerOwnedTool(toolId, ownedImplementation, schema)\n : toolRegistry.registerOwnedTool(toolId, ownedImplementation, schema, effect);\n } catch (error) {\n // A structural host may throw after mutating. Best-effort rollback\n // makes registration atomic from the plugin's perspective.\n toolRegistry.unregisterTool(toolId);\n unregisterSchema?.();\n throw error;\n }\n return () => {\n unregisterTool?.();\n unregisterSchema?.();\n };\n });\n },\n\n registerHook(type: HookType, handler: HookHandler, name?: string) {\n if (!registration.registering) {\n throw new PluginUnavailableError(registration.pluginName);\n }\n if (typeof handler !== 'function') {\n throw new TypeError(`Plugin hook handler must be callable: ${type}`);\n }\n const hookName = pluginName\n ? `plugin-hook:${pluginName}:${type}:${name ?? hookIndex++}`\n : name ?? `plugin-hook:anonymous:${type}:${hookIndex++}`;\n if (\n registration.hooks.some(hook => hook.type === type && hook.name === hookName) ||\n hookRegistry.hasHook(type, hookName)\n ) {\n throw new Error(`Plugin hook conflicts with an existing hook: ${hookName}`);\n }\n registration.hooks.push({ type, name: hookName });\n registration.staged.push(() => {\n if (hookRegistry.hasHook(type, hookName)) {\n throw new Error(`Plugin hook conflicts with an existing hook: ${hookName}`);\n }\n const guardedHandler: HookHandler = (context, data) => invokeCapability(() => handler(context, data)) as Promise<Awaited<ReturnType<HookHandler>>>;\n const unregisterHook = hookRegistry.registerOwnedHook(type, guardedHandler, hookName);\n return () => {\n unregisterHook();\n };\n });\n },\n\n registerAgentProfile(profile: AgentProfile) {\n const id = readDataIdentifier(profile, 'id', 'agent profile');\n if (!agentProfileRegistry) throw new Error(`Plugin agent profile registry is unavailable: ${id}`);\n ownRegistration(id, registration.agentProfiles, 'agent profile', () => {\n const dispose = agentProfileRegistry.registerAgentProfile(profile);\n return () => {\n dispose();\n };\n });\n },\n\n registerLoopDefinition(definition: AgentLoopDefinition) {\n const id = readDataIdentifier(definition, 'id', 'loop definition');\n if (!loopRegistry) throw new Error(`Plugin loop registry is unavailable: ${id}`);\n if (typeof definition.createRunner !== 'function') {\n throw new TypeError(`Plugin loop definition createRunner must be callable: ${id}`);\n }\n const guardedDefinition: AgentLoopDefinition = {\n ...definition,\n createRunner: loopContext => {\n const runner = invokeCapability(() => definition.createRunner(loopContext)) as ReturnType<AgentLoopDefinition['createRunner']>;\n return input => invokeCapability(() => runner(input)) as ReturnType<typeof runner>;\n },\n };\n ownRegistration(id, registration.loopDefinitions, 'loop definition', () => loopRegistry.registerLoop(guardedDefinition));\n },\n\n registerLoopProfile(profile: LoopProfile) {\n const id = readDataIdentifier(profile, 'id', 'loop profile');\n if (!loopRegistry) throw new Error(`Plugin loop registry is unavailable: ${id}`);\n ownRegistration(id, registration.loopProfiles, 'loop profile', () => loopRegistry.registerProfile(profile));\n },\n\n registerLoopPlugin(plugin: LoopPlugin) {\n const id = readDataIdentifier(plugin, 'id', 'loop plugin');\n if (!loopRegistry) throw new Error(`Plugin loop registry is unavailable: ${id}`);\n const guardedPlugin: LoopPlugin = plugin.install === undefined\n ? { ...plugin }\n : {\n ...plugin,\n install: (loopContext, config) => invokeCapability(() => plugin.install!(loopContext, config)) as ReturnType<NonNullable<LoopPlugin['install']>>,\n };\n ownRegistration(id, registration.loopPlugins, 'loop plugin', () => loopRegistry.registerPlugin(guardedPlugin));\n },\n\n registerModelProvider(provider: ILLMProvider, config: Omit<ProviderConfig, 'name'>) {\n const id = readDataIdentifier(provider, 'name', 'model provider');\n if (!providerRegistry) throw new Error(`Plugin provider registry is unavailable: ${id}`);\n if (typeof provider.chat !== 'function') {\n throw new TypeError(`Plugin model provider chat must be callable: ${id}`);\n }\n const guardedProvider: ILLMProvider = {\n name: id,\n ...(provider.modelId === undefined ? {} : { modelId: provider.modelId }),\n ...(provider.model === undefined ? {} : { model: provider.model }),\n chat: request => invokeCapability(() => provider.chat(request)) as ReturnType<ILLMProvider['chat']>,\n };\n ownRegistration(id, registration.modelProviders, 'model provider', () => {\n const owned = providerRegistry.register(\n { ownerId: pluginName, kind: 'plugin' },\n guardedProvider,\n config,\n );\n return () => {\n owned.dispose();\n };\n });\n },\n };\n }\n\n registerPluginHooks(\n pluginName: string,\n hooks: Array<readonly [HookType, HookHandler, string?]>,\n ): void {\n const reg = this.ensureRegistration(pluginName);\n if (!reg.registering) throw new PluginUnavailableError(pluginName);\n const hookCount = reg.hooks.length;\n const stagedCount = reg.staged.length;\n try {\n for (const [type, handler, name] of hooks) {\n if (typeof handler !== 'function') {\n throw new TypeError(`Plugin hook handler must be callable: ${type}`);\n }\n const hookName = `plugin-hook:${pluginName}:${type}:${name ?? reg.hooks.length}`;\n if (this.hookRegistry.hasHook(type, hookName)) {\n throw new Error(`Plugin hook conflicts with an existing hook: ${hookName}`);\n }\n reg.hooks.push({ type, name: hookName });\n reg.staged.push(() => {\n if (this.hookRegistry.hasHook(type, hookName)) {\n throw new Error(`Plugin hook conflicts with an existing hook: ${hookName}`);\n }\n const guardedHandler: HookHandler = async (context, data) => {\n if (!reg.accepting) throw new PluginUnavailableError(pluginName);\n const result = Promise.resolve(handler(context, data));\n reg.inFlight.add(result);\n try {\n return await result;\n } finally {\n reg.inFlight.delete(result);\n }\n };\n const unregisterHook = this.hookRegistry.registerOwnedHook(type, guardedHandler, hookName);\n return () => {\n unregisterHook();\n };\n });\n }\n this.activatePluginRegistrations(pluginName);\n } catch (error) {\n reg.hooks.splice(hookCount);\n reg.staged.splice(stagedCount);\n throw error;\n }\n }\n\n getPluginRegistrations(pluginName: string): PluginRegistrationSnapshot | undefined {\n const registration = this.pluginRegistrations.get(pluginName);\n if (!registration) return undefined;\n return {\n pluginName: registration.pluginName,\n tools: [...registration.tools],\n hooks: registration.hooks.map(hook => ({ ...hook })),\n agentProfiles: [...registration.agentProfiles],\n loopDefinitions: [...registration.loopDefinitions],\n loopProfiles: [...registration.loopProfiles],\n loopPlugins: [...registration.loopPlugins],\n modelProviders: [...registration.modelProviders],\n };\n }\n\n /** Stop accepting new registrations and tool requests before unload. */\n suspendPluginRegistrations(pluginName: string): boolean {\n const registration = this.pluginRegistrations.get(pluginName);\n if (!registration) return false;\n registration.registering = false;\n registration.accepting = false;\n return true;\n }\n\n /** Atomically publish registrations only after activation and manifest validation succeed. */\n activatePluginRegistrations(pluginName: string): boolean {\n const registration = this.pluginRegistrations.get(pluginName);\n if (!registration || !registration.registering || registration.detached) return false;\n const published: Array<() => void> = [];\n try {\n for (const publish of registration.staged) published.push(publish());\n } catch (error) {\n for (const cleanup of published.reverse()) {\n try {\n cleanup();\n } catch {\n // Preserve the commit failure; the loader will perform final teardown.\n }\n }\n throw error;\n }\n registration.staged.length = 0;\n registration.cleanup.push(...published);\n registration.registering = false;\n registration.accepting = true;\n return true;\n }\n\n /** Wait for the plugin's already-started asynchronous tool calls to settle. */\n async drainPluginRegistrations(pluginName: string): Promise<void> {\n const registration = this.pluginRegistrations.get(pluginName);\n if (!registration || registration.inFlight.size === 0) return;\n await Promise.allSettled([...registration.inFlight]);\n }\n\n clearPluginRegistrations(): void {\n const errors: unknown[] = [];\n for (const pluginName of [...this.pluginRegistrations.keys()]) {\n try {\n this.unregisterPluginRegistrations(pluginName);\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length > 0) {\n throw new AggregateError(errors, 'One or more plugin registrations failed to clean up');\n }\n }\n\n unregisterPluginRegistrations(pluginName: string): boolean {\n const detached = this.detachPluginRegistrations(pluginName);\n if (!detached) return false;\n this.finalizePluginRegistrations(pluginName);\n return true;\n }\n\n /** Remove routes/hooks immediately while retaining in-flight tracking for drain. */\n detachPluginRegistrations(pluginName: string): boolean {\n const registration = this.pluginRegistrations.get(pluginName);\n if (!registration) return false;\n registration.registering = false;\n registration.accepting = false;\n if (registration.detached) return true;\n registration.detached = true;\n registration.staged.length = 0;\n const errors: unknown[] = [];\n for (const cleanup of [...registration.cleanup].reverse()) {\n try {\n cleanup();\n } catch (error) {\n errors.push(error);\n }\n }\n registration.cleanup.length = 0;\n if (errors.length > 0) {\n throw new AggregateError(errors, `Plugin registration cleanup failed: ${pluginName}`);\n }\n return true;\n }\n\n /** Forget a detached plugin only after all started work has drained. */\n finalizePluginRegistrations(pluginName: string): boolean {\n const registration = this.pluginRegistrations.get(pluginName);\n if (!registration) return false;\n if (!registration.detached || registration.inFlight.size > 0) return false;\n this.pluginRegistrations.delete(pluginName);\n return true;\n }\n}\n\nfunction hasControlCharacters(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n if (code <= 0x1f || code === 0x7f) return true;\n }\n return false;\n}\n\nfunction readDataIdentifier(value: object, property: string, field: string): string {\n const descriptor = Object.getOwnPropertyDescriptor(value, property);\n if (\n !descriptor || descriptor.get !== undefined || descriptor.set !== undefined ||\n typeof descriptor.value !== 'string' || descriptor.value.trim().length === 0 ||\n descriptor.value.length > 1_024 || hasControlCharacters(descriptor.value)\n ) throw new TypeError(`Plugin ${field} must have a bounded data-property ${property}`);\n return descriptor.value;\n}\n","import { satisfies, valid, validRange } from 'semver';\nimport type { HookType } from '../loopAPI/hooks/types.js';\nimport { PluginRegistryManager } from './registry.js';\nimport type { PluginAPIOptions } from './registry.js';\nimport type { LoadedPlugin, PluginCleanup, PluginManifest, PluginModule } from './types.js';\n\ninterface LoadedPluginHandle {\n info: LoadedPlugin;\n module: PluginModule;\n cleanup?: PluginCleanup;\n unloading: boolean;\n}\n\n/** Runtime version used for plugin compatibility checks. Keep aligned with the package version. */\nexport const MEMELOOP_PLUGIN_API_VERSION = '0.2.8';\n\nconst dangerousManifestKeys = new Set(['__proto__', 'prototype', 'constructor']);\nconst manifestKeys = new Set(['name', 'version', 'description', 'exports', 'author', 'minMemeloopVersion']);\nconst exportKeys = new Set([\n 'tools',\n 'hooks',\n 'agentProfiles',\n 'loopDefinitions',\n 'loopProfiles',\n 'loopPlugins',\n 'modelProviders',\n]);\nfunction hasControlCharacters(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n if (code <= 0x1f || code === 0x7f) return true;\n }\n return false;\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return false;\n const prototype: unknown = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction hasOnlySafeKeys(record: Record<string, unknown>, allowed: ReadonlySet<string>): boolean {\n return Object.keys(record).every(key => !dangerousManifestKeys.has(key) && allowed.has(key));\n}\n\nconst hookTypes = new Set<string>([\n 'PreToolUse',\n 'PostToolUse',\n 'UserPromptSubmit',\n 'AgentStart',\n 'AgentStop',\n]);\n\nfunction isHookType(value: unknown): value is HookType {\n return typeof value === 'string' && hookTypes.has(value);\n}\n\nexport function validatePluginManifest(object: unknown): PluginManifest | null {\n if (!isPlainRecord(object) || !hasOnlySafeKeys(object, manifestKeys)) return null;\n const manifest = object;\n if (\n typeof manifest.name !== 'string' ||\n manifest.name.trim().length === 0 || manifest.name.trim().length > 256 ||\n hasControlCharacters(manifest.name) ||\n typeof manifest.version !== 'string' ||\n manifest.version.trim().length === 0 || manifest.version.trim().length > 64 ||\n (manifest.description !== undefined && (\n typeof manifest.description !== 'string' || manifest.description.length > 16_384\n )) ||\n (manifest.author !== undefined && (\n typeof manifest.author !== 'string' || manifest.author.length > 512\n )) ||\n valid(manifest.version.trim()) === null\n ) {\n return null;\n }\n const exports_ = validateExports(manifest.exports);\n if (exports_ === null) return null;\n const minimumVersion = typeof manifest.minMemeloopVersion === 'string'\n ? manifest.minMemeloopVersion.trim()\n : undefined;\n if (\n minimumVersion !== undefined &&\n (minimumVersion.length === 0 || minimumVersion.length > 256 || validRange(minimumVersion) === null)\n ) return null;\n return {\n name: manifest.name.trim(),\n version: manifest.version.trim(),\n description: typeof manifest.description === 'string' ? manifest.description : '',\n exports: exports_,\n author: typeof manifest.author === 'string' ? manifest.author : undefined,\n minMemeloopVersion: minimumVersion,\n };\n}\n\nfunction validateExports(object: unknown): PluginManifest['exports'] | null {\n if (object === undefined) return undefined;\n if (!isPlainRecord(object) || !hasOnlySafeKeys(object, exportKeys)) return null;\n const exportsRecord = object;\n const tools = normalizeExportIdentifiers(exportsRecord.tools, 256);\n const agentProfiles = normalizeExportIdentifiers(exportsRecord.agentProfiles, 256);\n const loopDefinitions = normalizeExportIdentifiers(exportsRecord.loopDefinitions, 256);\n const loopProfiles = normalizeExportIdentifiers(exportsRecord.loopProfiles, 256);\n const loopPlugins = normalizeExportIdentifiers(exportsRecord.loopPlugins, 256);\n const modelProviders = normalizeExportIdentifiers(exportsRecord.modelProviders, 256);\n if (\n tools === null || agentProfiles === null || loopDefinitions === null ||\n loopProfiles === null || loopPlugins === null || modelProviders === null\n ) return null;\n if (exportsRecord.hooks !== undefined && !Array.isArray(exportsRecord.hooks)) return null;\n const hooks = exportsRecord.hooks as unknown[] | undefined;\n if ((hooks?.length ?? 0) > 64) return null;\n if (hooks?.some(hook => !isHookType(hook))) return null;\n const normalizedHooks = hooks as HookType[] | undefined;\n if (normalizedHooks && new Set(normalizedHooks).size !== normalizedHooks.length) return null;\n return {\n tools,\n hooks: normalizedHooks,\n ...(agentProfiles === undefined ? {} : { agentProfiles }),\n ...(loopDefinitions === undefined ? {} : { loopDefinitions }),\n ...(loopProfiles === undefined ? {} : { loopProfiles }),\n ...(loopPlugins === undefined ? {} : { loopPlugins }),\n ...(modelProviders === undefined ? {} : { modelProviders }),\n };\n}\n\nfunction normalizeExportIdentifiers(value: unknown, maximum: number): string[] | undefined | null {\n if (value === undefined) return undefined;\n if (!Array.isArray(value) || value.length > maximum) return null;\n const normalized: string[] = [];\n for (const item of value) {\n if (\n typeof item !== 'string' || item.trim().length === 0 || item.trim().length > 256 ||\n hasControlCharacters(item)\n ) return null;\n normalized.push(item.trim());\n }\n return new Set(normalized).size === normalized.length ? normalized : null;\n}\n\nexport interface LoadPluginModuleOptions {\n manifest: PluginManifest;\n module: PluginModule;\n /** Host services used to construct a plugin-scoped, unloadable API. */\n apiOptions?: Omit<PluginAPIOptions, 'pluginName'>;\n source?: string;\n}\n\nexport interface PluginLoaderOptions {\n registryManager?: PluginRegistryManager;\n apiOptions?: Omit<PluginAPIOptions, 'pluginName'>;\n /** Host memeloop version used to enforce manifest.minMemeloopVersion. */\n memeloopVersion?: string;\n /** Maximum time allowed for activate() to settle. */\n activationTimeoutMs?: number;\n /** Maximum time allowed for an unload cleanup callback to settle. */\n cleanupTimeoutMs?: number;\n /** Maximum time allowed for already-started plugin tool calls to drain. */\n drainTimeoutMs?: number;\n}\n\nexport class PluginLifecycleTimeoutError extends Error {\n readonly code = 'PLUGIN_LIFECYCLE_TIMEOUT' as const;\n\n constructor(readonly phase: 'activate' | 'cleanup' | 'drain', readonly pluginName: string) {\n super(`Plugin ${phase} timed out: ${pluginName}`);\n this.name = 'PluginLifecycleTimeoutError';\n }\n}\n\nfunction validateTimeout(value: number, field: string): number {\n if (!Number.isSafeInteger(value) || value <= 0 || value > 300_000) {\n throw new RangeError(`${field} must be an integer between 1 and 300000`);\n }\n return value;\n}\n\nasync function withLifecycleTimeout<T>(\n operation: Promise<T>,\n timeoutMs: number,\n phase: PluginLifecycleTimeoutError['phase'],\n pluginName: string,\n): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => {\n reject(new PluginLifecycleTimeoutError(phase, pluginName));\n }, timeoutMs);\n });\n try {\n return await Promise.race([operation, timeout]);\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n }\n}\n\n/** Runtime-scoped plugin lifecycle owner. */\nexport class PluginLoader {\n private readonly loadedPlugins = new Map<string, LoadedPluginHandle>();\n private readonly loadingPlugins = new Set<string>();\n private readonly registryManager: PluginRegistryManager;\n private readonly apiOptions: Omit<PluginAPIOptions, 'pluginName'>;\n private readonly memeloopVersion: string;\n private readonly activationTimeoutMs: number;\n private readonly cleanupTimeoutMs: number;\n private readonly drainTimeoutMs: number;\n\n constructor(options: PluginLoaderOptions = {}) {\n this.registryManager = options.registryManager ?? new PluginRegistryManager();\n this.apiOptions = options.apiOptions ?? {};\n this.memeloopVersion = options.memeloopVersion ?? MEMELOOP_PLUGIN_API_VERSION;\n this.activationTimeoutMs = validateTimeout(options.activationTimeoutMs ?? 10_000, 'activationTimeoutMs');\n this.cleanupTimeoutMs = validateTimeout(options.cleanupTimeoutMs ?? 10_000, 'cleanupTimeoutMs');\n this.drainTimeoutMs = validateTimeout(options.drainTimeoutMs ?? 10_000, 'drainTimeoutMs');\n if (valid(this.memeloopVersion) === null) {\n throw new Error(`Invalid memeloop plugin API version: ${this.memeloopVersion}`);\n }\n }\n\n private validateDeclaredExports(manifest: PluginManifest): void {\n const registration = this.registryManager.getPluginRegistrations(manifest.name);\n const sameSet = <T>(left: ReadonlySet<T>, right: ReadonlySet<T>): boolean => left.size === right.size && [...left].every(value => right.has(value));\n const capabilitySets = [\n ['tools', registration?.tools ?? [], manifest.exports?.tools ?? []],\n ['hooks', registration?.hooks.map(hook => hook.type) ?? [], manifest.exports?.hooks ?? []],\n ['agentProfiles', registration?.agentProfiles ?? [], manifest.exports?.agentProfiles ?? []],\n ['loopDefinitions', registration?.loopDefinitions ?? [], manifest.exports?.loopDefinitions ?? []],\n ['loopProfiles', registration?.loopProfiles ?? [], manifest.exports?.loopProfiles ?? []],\n ['loopPlugins', registration?.loopPlugins ?? [], manifest.exports?.loopPlugins ?? []],\n ['modelProviders', registration?.modelProviders ?? [], manifest.exports?.modelProviders ?? []],\n ] as const;\n const mismatch = capabilitySets.find(([, actual, declared]) => !sameSet(new Set(actual), new Set(declared)));\n if (mismatch) {\n const [capability, actual, declared] = mismatch;\n throw new Error(\n `Plugin exports do not match registrations: ${manifest.name} ` +\n `(capability: ${capability}; declared: ${declared.join(', ') || 'none'}; ` +\n `registered: ${actual.join(', ') || 'none'})`,\n );\n }\n }\n\n async loadPluginModule(options: LoadPluginModuleOptions): Promise<LoadedPlugin | null> {\n const { manifest, module, apiOptions, source = '' } = options;\n const validManifest = validatePluginManifest(manifest);\n if (!validManifest) return null;\n if (!module || typeof module.activate !== 'function') return null;\n if (module.name !== validManifest.name) return null;\n if (\n validManifest.minMemeloopVersion &&\n !satisfies(\n this.memeloopVersion,\n valid(validManifest.minMemeloopVersion)\n ? `>=${validManifest.minMemeloopVersion}`\n : validManifest.minMemeloopVersion,\n { includePrerelease: true },\n )\n ) {\n throw new Error(\n `Plugin ${validManifest.name} requires memeloop ${validManifest.minMemeloopVersion}; ` +\n `runtime is ${this.memeloopVersion}`,\n );\n }\n\n if (this.loadedPlugins.has(validManifest.name) || this.loadingPlugins.has(validManifest.name)) {\n throw new Error(`Plugin is already loaded: ${validManifest.name}`);\n }\n\n this.loadingPlugins.add(validManifest.name);\n const api = this.registryManager.createPluginAPI({\n ...this.apiOptions,\n ...apiOptions,\n pluginName: validManifest.name,\n });\n try {\n let cleanup: PluginCleanup | undefined;\n const activation = Promise.resolve().then(() => module.activate(api));\n try {\n const activatedCleanup = await withLifecycleTimeout(\n activation,\n this.activationTimeoutMs,\n 'activate',\n validManifest.name,\n );\n cleanup = typeof activatedCleanup === 'function' ? activatedCleanup : undefined;\n this.validateDeclaredExports(validManifest);\n if (!this.registryManager.activatePluginRegistrations(validManifest.name)) {\n throw new Error(`Plugin activation could not be committed: ${validManifest.name}`);\n }\n } catch (activationError) {\n this.registryManager.suspendPluginRegistrations(validManifest.name);\n if (activationError instanceof PluginLifecycleTimeoutError) {\n // activate() cannot be forcibly cancelled. Close its API immediately,\n // and dispose a cleanup callback if the late activation eventually\n // returns one.\n void activation.then(\n lateCleanup => {\n if (typeof lateCleanup !== 'function') return;\n void withLifecycleTimeout(\n Promise.resolve().then(() => lateCleanup()),\n this.cleanupTimeoutMs,\n 'cleanup',\n validManifest.name,\n ).catch(() => undefined);\n },\n () => undefined,\n );\n }\n const rollbackErrors: unknown[] = [activationError];\n try {\n this.registryManager.detachPluginRegistrations(validManifest.name);\n } catch (detachError) {\n rollbackErrors.push(detachError);\n }\n try {\n await withLifecycleTimeout(\n this.registryManager.drainPluginRegistrations(validManifest.name),\n this.drainTimeoutMs,\n 'drain',\n validManifest.name,\n );\n } catch (drainError) {\n rollbackErrors.push(drainError);\n }\n if (cleanup) {\n try {\n await withLifecycleTimeout(\n Promise.resolve().then(() => cleanup?.()),\n this.cleanupTimeoutMs,\n 'cleanup',\n validManifest.name,\n );\n } catch (cleanupError) {\n rollbackErrors.push(cleanupError);\n }\n }\n try {\n if (!this.registryManager.finalizePluginRegistrations(validManifest.name)) {\n throw new Error(`Plugin activation rollback could not be finalized: ${validManifest.name}`);\n }\n } catch (rollbackError) {\n rollbackErrors.push(rollbackError);\n }\n if (rollbackErrors.length > 1) {\n throw new AggregateError(\n rollbackErrors,\n `Plugin activation failed and rollback was incomplete: ${validManifest.name}`,\n { cause: activationError },\n );\n }\n throw activationError;\n }\n const info = loadedPluginInfo(validManifest, source);\n const loaded: LoadedPluginHandle = {\n info,\n module,\n cleanup,\n unloading: false,\n };\n this.loadedPlugins.set(validManifest.name, loaded);\n return info;\n } finally {\n this.loadingPlugins.delete(validManifest.name);\n }\n }\n\n async loadPluginModules(plugins: LoadPluginModuleOptions[]): Promise<LoadedPlugin[]> {\n const loaded: LoadedPlugin[] = [];\n try {\n for (const plugin of plugins) {\n const result = await this.loadPluginModule(plugin);\n if (result) loaded.push(result);\n }\n return loaded;\n } catch (error) {\n const rollbackErrors: unknown[] = [error];\n for (const plugin of [...loaded].reverse()) {\n try {\n await this.unloadPlugin(plugin.manifest.name);\n } catch (rollbackError) {\n rollbackErrors.push(rollbackError);\n }\n }\n if (rollbackErrors.length > 1) {\n throw new AggregateError(rollbackErrors, 'Plugin batch failed and rollback was incomplete', {\n cause: error,\n });\n }\n throw error;\n }\n }\n\n async unloadPlugin(name: string): Promise<boolean> {\n const loaded = this.loadedPlugins.get(name);\n if (!loaded) return false;\n if (loaded.unloading) {\n throw new PluginLifecycleTimeoutError('drain', name);\n }\n loaded.unloading = true;\n\n const errors: unknown[] = [];\n this.registryManager.suspendPluginRegistrations(name);\n try {\n this.registryManager.detachPluginRegistrations(name);\n } catch (error) {\n errors.push(error);\n }\n try {\n await withLifecycleTimeout(\n this.registryManager.drainPluginRegistrations(name),\n this.drainTimeoutMs,\n 'drain',\n name,\n );\n } catch (error) {\n if (error instanceof PluginLifecycleTimeoutError) {\n this.scheduleQuarantinedCleanup(name, loaded);\n throw error;\n }\n errors.push(error);\n }\n try {\n try {\n if (loaded.cleanup) {\n await withLifecycleTimeout(\n Promise.resolve().then(() => loaded.cleanup?.()),\n this.cleanupTimeoutMs,\n 'cleanup',\n name,\n );\n }\n } catch (error) {\n errors.push(error);\n }\n try {\n this.registryManager.finalizePluginRegistrations(name);\n } catch (error) {\n errors.push(error);\n }\n } finally {\n this.loadedPlugins.delete(name);\n }\n\n if (errors.length > 0) {\n throw new AggregateError(errors, `Plugin cleanup failed: ${name}`);\n }\n return true;\n }\n\n listPlugins(): LoadedPlugin[] {\n return Array.from(this.loadedPlugins.values(), loaded => loaded.info);\n }\n\n getLoadedPlugin(name: string): LoadedPlugin | undefined {\n const loaded = this.loadedPlugins.get(name);\n return loaded?.info;\n }\n\n isPluginLoaded(name: string): boolean {\n return this.loadedPlugins.has(name);\n }\n\n async unloadAllPlugins(): Promise<void> {\n const errors: unknown[] = [];\n for (const name of [...this.loadedPlugins.keys()]) {\n try {\n await this.unloadPlugin(name);\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length > 0) {\n throw new AggregateError(errors, 'One or more plugins failed to unload');\n }\n }\n\n private scheduleQuarantinedCleanup(name: string, loaded: LoadedPluginHandle): void {\n void this.registryManager.drainPluginRegistrations(name).then(async () => {\n try {\n if (loaded.cleanup) {\n await withLifecycleTimeout(\n Promise.resolve().then(() => loaded.cleanup?.()),\n this.cleanupTimeoutMs,\n 'cleanup',\n name,\n );\n }\n } catch {\n // The instance remains detached; cleanup failure cannot restore routes.\n } finally {\n this.registryManager.finalizePluginRegistrations(name);\n if (this.loadedPlugins.get(name) === loaded) this.loadedPlugins.delete(name);\n }\n }, () => undefined);\n }\n}\n\nfunction loadedPluginInfo(manifest: PluginManifest, source: string): LoadedPlugin {\n const exports_ = manifest.exports\n ? Object.freeze({\n tools: manifest.exports.tools ? Object.freeze([...manifest.exports.tools]) : undefined,\n hooks: manifest.exports.hooks ? Object.freeze([...manifest.exports.hooks]) : undefined,\n agentProfiles: manifest.exports.agentProfiles\n ? Object.freeze([...manifest.exports.agentProfiles])\n : undefined,\n loopDefinitions: manifest.exports.loopDefinitions\n ? Object.freeze([...manifest.exports.loopDefinitions])\n : undefined,\n loopProfiles: manifest.exports.loopProfiles\n ? Object.freeze([...manifest.exports.loopProfiles])\n : undefined,\n loopPlugins: manifest.exports.loopPlugins\n ? Object.freeze([...manifest.exports.loopPlugins])\n : undefined,\n modelProviders: manifest.exports.modelProviders\n ? Object.freeze([...manifest.exports.modelProviders])\n : undefined,\n })\n : undefined;\n return Object.freeze({\n manifest: Object.freeze({ ...manifest, exports: exports_ }),\n source,\n loadedAt: new Date().toISOString(),\n });\n}\n"],"mappings":"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","names":["hasControlCharacters"]}
1
+ {"version":3,"sources":["../src/permission/storage.ts","../src/loopAPI/agent-tool-loop/runner.ts","../src/loopAPI/tokenTracker.ts","../src/plugin/registry.ts","../src/plugin/loader.ts"],"sourcesContent":["import type { PermissionSet } from './types.js';\n\nexport interface PermissionSqlStatement {\n get(...arguments_: unknown[]): unknown;\n run(...arguments_: unknown[]): unknown;\n}\n\nexport interface PermissionSqlDatabase {\n prepare(sql: string): PermissionSqlStatement;\n}\n\nconst TABLE_NAME = 'permissions';\nconst STORAGE_KEY = 'user';\n\n/**\n * Load user-level permission set from SQLite.\n *\n * The `permissions` table stores JSON blobs keyed by `source`.\n * Returns an empty set if no persisted rules exist.\n */\nexport function loadUserPermissions(database: PermissionSqlDatabase): PermissionSet {\n try {\n const row = database\n .prepare(`SELECT rulesJson FROM ${TABLE_NAME} WHERE source = ? LIMIT 1`)\n .get(STORAGE_KEY) as { rulesJson: string } | undefined;\n\n if (row?.rulesJson) {\n return JSON.parse(row.rulesJson) as PermissionSet;\n }\n } catch {\n /* Table may not exist yet; return empty */\n }\n\n return { rules: [], source: 'user' };\n}\n\n/**\n * Persist user-level permission set to SQLite.\n *\n * Uses INSERT OR REPLACE so first-time saves work without explicit table detection.\n */\nexport function saveUserPermissions(database: PermissionSqlDatabase, set: PermissionSet): void {\n database.prepare(\n `INSERT OR REPLACE INTO ${TABLE_NAME} (source, rulesJson, updatedAt)\n VALUES (?, ?, ?)`,\n ).run(set.source, JSON.stringify(set), Date.now());\n}\n\n/** SQL statement to create the permissions table during migration. */\nexport const PERMISSIONS_TABLE_DDL = `\n CREATE TABLE IF NOT EXISTS ${TABLE_NAME} (\n source TEXT PRIMARY KEY,\n rulesJson TEXT NOT NULL,\n updatedAt INTEGER NOT NULL\n );\n`;\n","/**\n * AgentToolLoop runner — convenience API for driving a full loop turn.\n */\n\nimport type { AgentFrameworkContext, AgentInstanceState } from '../../types.js';\nimport type { AgentLoopGenerator, AgentLoopInput, AgentLoopStep } from '../types.js';\nimport { createAgentToolLoopRunner } from './directRunner.js';\n\nexport interface RunAgentToolLoopTurnCallbacks {\n onStep?: (step: AgentLoopStep) => void | Promise<void>;\n onProgress?: (\n status: string,\n data: Record<string, unknown>,\n step: AgentLoopStep,\n ) => void | Promise<void>;\n agentToolLoop?: (input: AgentLoopInput) => AgentLoopGenerator;\n}\n\nexport interface RunAgentToolLoopTurnResult {\n state: AgentInstanceState;\n stepCount: number;\n}\n\nexport function resolveAgentToolLoopTerminalState(\n step: AgentLoopStep,\n current: AgentInstanceState,\n): AgentInstanceState {\n if (step.type !== 'thinking') return current;\n const data = step.data as { status?: string };\n if (data.status === 'input-required') return 'input-required';\n if (data.status === 'cancelled') return 'canceled';\n if (data.status === 'max-iterations') return 'completed';\n if (data.status === 'blocked') return 'failed';\n if (data.status === 'calling-llm') return 'working';\n return current;\n}\n\nexport async function runAgentToolLoopTurn(\n context: AgentFrameworkContext,\n input: AgentLoopInput,\n callbacks: RunAgentToolLoopTurnCallbacks = {},\n): Promise<RunAgentToolLoopTurnResult> {\n const agentToolLoop = callbacks.agentToolLoop ?? createAgentToolLoopRunner(context);\n let terminalState: AgentInstanceState = 'completed';\n let stepCount = 0;\n\n for await (const step of agentToolLoop(input)) {\n stepCount += 1;\n terminalState = resolveAgentToolLoopTerminalState(step, terminalState);\n await callbacks.onStep?.(step);\n\n if (step.type === 'thinking' && step.data && typeof step.data === 'object') {\n const data = step.data as Record<string, unknown>;\n const status = data.status;\n if (typeof status === 'string') {\n await callbacks.onProgress?.(status, data, step);\n }\n }\n }\n\n return {\n state: terminalState === 'working' || terminalState === 'submitted' ? 'completed' : terminalState,\n stepCount,\n };\n}\n","/**\n * Token counting and auto-compaction trigger.\n * Tracks token usage per conversation and triggers compaction when approaching limits.\n *\n * Based on: Claude Code autoCompact + OpenCode autoCompact@95%\n */\n\n/** Rough token estimation: ~4 chars per token (conservative) */\nexport function estimateTokens(text: string): number {\n return Math.ceil(text.length / 3.5);\n}\n\n/** Estimate token count for a messages array */\nexport function estimateMessagesTokens(messages: Array<{ content: unknown }>): number {\n let total = 0;\n for (const message of messages) {\n const content = typeof message.content === 'string' ? message.content : JSON.stringify(message.content ?? '');\n total += estimateTokens(content);\n }\n return total;\n}\n\nexport interface TokenTrackerConfig {\n /** Maximum context window in tokens (default: 200000) */\n contextWindow?: number;\n /** Trigger compaction when usage exceeds this fraction (default: 0.90) */\n compactionThreshold?: number;\n /** Buffer tokens reserved for output (default: 16000) */\n outputBuffer?: number;\n}\n\nexport interface TokenUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n contextWindow: number;\n usagePercent: number;\n shouldCompact: boolean;\n}\n\n/**\n * Tracks token usage and decides when to trigger auto-compaction.\n */\nexport class TokenTracker {\n private promptTokens = 0;\n private completionTokens = 0;\n private readonly contextWindow: number;\n private readonly compactionThreshold: number;\n private readonly outputBuffer: number;\n private compacting = false;\n private consecutiveCompactionFailures = 0;\n private maxConsecutiveFailures = 3;\n\n constructor(config?: TokenTrackerConfig) {\n this.contextWindow = config?.contextWindow ?? 200_000;\n this.compactionThreshold = config?.compactionThreshold ?? 0.9;\n this.outputBuffer = config?.outputBuffer ?? 16_000;\n }\n\n /** Record token usage from an LLM response */\n recordUsage(promptTokens: number, completionTokens: number): void {\n this.promptTokens += promptTokens;\n this.completionTokens += completionTokens;\n }\n\n /** Manually set the prompt token count (e.g., from estimation) */\n setPromptTokens(tokens: number): void {\n this.promptTokens = tokens;\n }\n\n /** Get current usage */\n getUsage(): TokenUsage {\n const total = this.promptTokens + this.completionTokens;\n const effectiveWindow = this.contextWindow - this.outputBuffer;\n const usagePercent = total / effectiveWindow;\n return {\n promptTokens: this.promptTokens,\n completionTokens: this.completionTokens,\n totalTokens: total,\n contextWindow: this.contextWindow,\n usagePercent: Math.min(usagePercent, 1.0),\n shouldCompact: usagePercent >= this.compactionThreshold && !this.compacting,\n };\n }\n\n /** Check if auto-compaction should be triggered */\n shouldTriggerCompaction(): boolean {\n if (this.consecutiveCompactionFailures >= this.maxConsecutiveFailures) return false;\n return this.getUsage().shouldCompact;\n }\n\n /** Mark that compaction is starting */\n markCompactionStart(): void {\n this.compacting = true;\n }\n\n /** Mark that compaction succeeded — reset token counts */\n markCompactionSuccess(estimatedPostTokens: number): void {\n this.compacting = false;\n this.promptTokens = estimatedPostTokens;\n this.completionTokens = 0;\n this.consecutiveCompactionFailures = 0;\n }\n\n /** Mark that compaction failed */\n markCompactionFailure(): void {\n this.compacting = false;\n this.consecutiveCompactionFailures++;\n }\n\n /** Reset all counters */\n reset(): void {\n this.promptTokens = 0;\n this.completionTokens = 0;\n this.compacting = false;\n this.consecutiveCompactionFailures = 0;\n }\n\n /** Get a human-readable summary */\n formatUsage(): string {\n const usage = this.getUsage();\n const promptK = (usage.promptTokens / 1000).toFixed(1);\n const windowK = (usage.contextWindow / 1000).toFixed(0);\n const pct = (usage.usagePercent * 100).toFixed(1);\n return `${promptK}K/${windowK}K tokens (${pct}%)`;\n }\n}\n\n/** Interface for a compaction engine that can summarize conversation history */\nexport interface CompactionEngine {\n compact(\n messages: Array<{ role: string; content: unknown }>,\n conversationId: string,\n ): Promise<void>;\n}\n\n/**\n * Auto-compaction hook — call this after each LLM response.\n * Triggers compaction when token usage exceeds threshold.\n *\n * @returns true if compaction was triggered\n */\nexport async function maybeAutoCompact(\n tracker: TokenTracker,\n compactionEngine: CompactionEngine,\n messages: Array<{ role: string; content: unknown }>,\n conversationId: string,\n): Promise<boolean> {\n if (!tracker.shouldTriggerCompaction()) return false;\n\n tracker.markCompactionStart();\n try {\n await compactionEngine.compact(messages, conversationId);\n const estimatedPost = estimateTokens('Summary of previous conversation context.');\n tracker.markCompactionSuccess(estimatedPost);\n return true;\n } catch {\n tracker.markCompactionFailure();\n return false;\n }\n}\n","/**\n * Plugin registry: bridges plugin exports to memeloop's tool and hook registries.\n *\n * Provides a `createPluginAPI()` factory that plugins call during `activate()`\n * to register their tools and hooks with the host runtime.\n *\n * Converted from module-level singletons to an instance class for test isolation\n * and multi-runtime support.\n */\n\nimport type { AgentProfile } from '../agent/agentProfiles.js';\nimport type { ProviderConfig, ProviderRegistration } from '../llm/providerRegistry.js';\nimport { HookRegistry } from '../loopAPI/hooks/registry.js';\nimport type { HookHandler, HookRegistrationRegistry, HookType } from '../loopAPI/hooks/types.js';\nimport type { AgentLoopDefinition, LoopPlugin, LoopProfile } from '../loopAPI/types.js';\nimport type { ToolOperationEffect } from '../orchestration/resources.js';\nimport { ToolSchemaRegistry } from '../tools/schemaRegistry.js';\nimport type { OwnedToolSchemaRegistry } from '../tools/schemaRegistry.js';\nimport type { ILLMProvider } from '../types.js';\nimport type { PluginAPI } from './types.js';\n\n/** Tool-registry capabilities required by an unloadable plugin host. */\nexport interface PluginToolRegistry {\n registerTool(\n id: string,\n impl: unknown,\n schema?: unknown,\n effect?: ToolOperationEffect,\n ): void;\n /** Permission-independent registration lookup. */\n hasTool(id: string): boolean;\n unregisterTool(id: string): boolean;\n registerOwnedTool(\n id: string,\n impl: unknown,\n schema?: unknown,\n effect?: ToolOperationEffect,\n ): () => boolean;\n}\n\nexport interface PluginAgentProfileRegistry {\n registerAgentProfile(profile: AgentProfile): () => boolean;\n}\n\nexport interface PluginLoopRegistry {\n registerLoop(definition: AgentLoopDefinition): () => void;\n registerProfile(profile: LoopProfile): () => void;\n registerPlugin(plugin: LoopPlugin): () => void;\n}\n\nexport interface PluginProviderRegistry {\n register(\n owner: { ownerId: string; kind: 'plugin' },\n provider: ILLMProvider,\n config: Omit<ProviderConfig, 'name'>,\n ): ProviderRegistration;\n}\n\n/** Plugin API factory options. */\nexport interface PluginAPIOptions {\n /** Stable manifest name used to own and later remove every registration. */\n pluginName: string;\n toolRegistry?: PluginToolRegistry;\n agentProfileRegistry?: PluginAgentProfileRegistry;\n loopRegistry?: PluginLoopRegistry;\n providerRegistry?: PluginProviderRegistry;\n logger?: PluginAPI['logger'];\n}\n\nexport interface PluginRegistryManagerOptions {\n hookRegistry?: HookRegistrationRegistry;\n schemaRegistry?: OwnedToolSchemaRegistry;\n}\n\n/**\n * Track which tools/plugins belong to each plugin so we can clean up on unload.\n */\ninterface PluginRegistration {\n pluginName: string;\n tools: string[];\n hooks: Array<{ type: HookType; name: string }>;\n agentProfiles: string[];\n loopDefinitions: string[];\n loopProfiles: string[];\n loopPlugins: string[];\n modelProviders: string[];\n staged: Array<() => () => void>;\n cleanup: Array<() => void>;\n registering: boolean;\n accepting: boolean;\n inFlight: Set<Promise<unknown>>;\n detached: boolean;\n}\n\nexport class PluginUnavailableError extends Error {\n readonly code = 'PLUGIN_UNAVAILABLE' as const;\n\n constructor(readonly pluginName: string) {\n super(`Plugin is not accepting requests: ${pluginName}`);\n this.name = 'PluginUnavailableError';\n }\n}\n\nexport interface PluginRegistrationSnapshot {\n pluginName: string;\n tools: string[];\n hooks: Array<{ type: HookType; name: string }>;\n agentProfiles: string[];\n loopDefinitions: string[];\n loopProfiles: string[];\n loopPlugins: string[];\n modelProviders: string[];\n}\n\n/**\n * Instance-level plugin registration manager.\n */\nexport class PluginRegistryManager {\n private readonly pluginRegistrations = new Map<string, PluginRegistration>();\n private readonly hookRegistry: HookRegistrationRegistry;\n private readonly schemaRegistry: OwnedToolSchemaRegistry;\n\n constructor(options: PluginRegistryManagerOptions = {}) {\n this.hookRegistry = options.hookRegistry ?? new HookRegistry();\n this.schemaRegistry = options.schemaRegistry ?? new ToolSchemaRegistry();\n }\n\n private ensureRegistration(pluginName: string): PluginRegistration {\n const existing = this.pluginRegistrations.get(pluginName);\n if (existing) return existing;\n const reg: PluginRegistration = {\n pluginName,\n tools: [],\n hooks: [],\n agentProfiles: [],\n loopDefinitions: [],\n loopProfiles: [],\n loopPlugins: [],\n modelProviders: [],\n staged: [],\n cleanup: [],\n registering: true,\n accepting: false,\n inFlight: new Set(),\n detached: false,\n };\n this.pluginRegistrations.set(pluginName, reg);\n return reg;\n }\n\n /**\n * Create a PluginAPI instance that plugins use to register their capabilities.\n */\n createPluginAPI(options: PluginAPIOptions): PluginAPI {\n const toolRegistry = options.toolRegistry;\n const hookRegistry = this.hookRegistry;\n const schemaRegistry = this.schemaRegistry;\n const agentProfileRegistry = options.agentProfileRegistry;\n const loopRegistry = options.loopRegistry;\n const providerRegistry = options.providerRegistry;\n const logger = options.logger ?? {\n debug: (...arguments_: unknown[]) => {\n console.debug('[plugin]', ...arguments_);\n },\n info: (...arguments_: unknown[]) => {\n console.info('[plugin]', ...arguments_);\n },\n warn: (...arguments_: unknown[]) => {\n console.warn('[plugin]', ...arguments_);\n },\n error: (...arguments_: unknown[]) => {\n console.error('[plugin]', ...arguments_);\n },\n };\n const pluginName = options.pluginName?.trim();\n if (!pluginName || hasControlCharacters(pluginName)) {\n throw new TypeError('Plugin API requires a stable pluginName');\n }\n const registration = this.ensureRegistration(pluginName);\n let hookIndex = registration.hooks.length;\n const trackPromise = <T>(promise: Promise<T>): Promise<T> => {\n registration.inFlight.add(promise);\n void promise.then(\n () => registration.inFlight.delete(promise),\n () => registration.inFlight.delete(promise),\n );\n return promise;\n };\n const guardAsyncIterable = <T>(source: AsyncIterable<T>): AsyncIterable<T> => ({\n async *[Symbol.asyncIterator]() {\n if (!registration.accepting) {\n throw new PluginUnavailableError(registration.pluginName);\n }\n let release!: () => void;\n const lease = new Promise<void>(resolve => {\n release = resolve;\n });\n registration.inFlight.add(lease);\n try {\n yield* source;\n } finally {\n registration.inFlight.delete(lease);\n release();\n }\n },\n });\n const isAsyncIterable = (value: unknown): value is AsyncIterable<unknown> =>\n value !== null &&\n (typeof value === 'object' || typeof value === 'function') &&\n typeof (value as AsyncIterable<unknown>)[Symbol.asyncIterator] === 'function';\n const guardResult = (result: unknown): unknown => {\n if (\n result !== null &&\n (typeof result === 'object' || typeof result === 'function') &&\n typeof (result as PromiseLike<unknown>).then === 'function'\n ) {\n return trackPromise(Promise.resolve(result).then(value => isAsyncIterable(value) ? guardAsyncIterable(value) : value));\n }\n return isAsyncIterable(result) ? guardAsyncIterable(result) : result;\n };\n const invokeCapability = (invoke: () => unknown): unknown => {\n if (!registration.accepting) {\n throw new PluginUnavailableError(registration.pluginName);\n }\n return guardResult(invoke());\n };\n const ownRegistration = (\n id: string,\n registrations: string[],\n capability: string,\n register: () => () => void,\n ): void => {\n if (!registration.registering) throw new PluginUnavailableError(registration.pluginName);\n if (registrations.includes(id)) {\n throw new Error(`Plugin ${capability} is already registered by this plugin: ${id}`);\n }\n registrations.push(id);\n registration.staged.push(register);\n };\n\n return {\n logger,\n\n registerTool(\n toolId: string,\n impl: (...arguments_: unknown[]) => unknown,\n schema?: unknown,\n effect?: ToolOperationEffect,\n ) {\n if (!registration.registering) {\n throw new PluginUnavailableError(registration.pluginName);\n }\n if (typeof impl !== 'function') {\n throw new TypeError(`Plugin tool implementation must be callable: ${toolId}`);\n }\n if (\n !toolRegistry ||\n typeof toolRegistry.hasTool !== 'function' ||\n typeof toolRegistry.unregisterTool !== 'function' ||\n typeof toolRegistry.registerOwnedTool !== 'function'\n ) {\n throw new Error(`Plugin tool requires an unloadable tool registry: ${toolId}`);\n }\n if (registration.tools.includes(toolId) || toolRegistry.hasTool(toolId)) {\n throw new Error(`Plugin tool conflicts with an existing tool: ${toolId}`);\n }\n const ownedImplementation = (...arguments_: unknown[]): unknown => invokeCapability(() => impl(...arguments_));\n registration.tools.push(toolId);\n registration.staged.push(() => {\n const unregisterSchema = schema !== undefined\n ? schemaRegistry.registerOwnedToolParameterSchema(toolId, schema, {\n displayName: toolId,\n description: `Plugin tool: ${toolId}`,\n })\n : undefined;\n let unregisterTool: (() => boolean) | undefined;\n try {\n unregisterTool = effect === undefined\n ? toolRegistry.registerOwnedTool(toolId, ownedImplementation, schema)\n : toolRegistry.registerOwnedTool(toolId, ownedImplementation, schema, effect);\n } catch (error) {\n // A structural host may throw after mutating. Best-effort rollback\n // makes registration atomic from the plugin's perspective.\n toolRegistry.unregisterTool(toolId);\n unregisterSchema?.();\n throw error;\n }\n return () => {\n unregisterTool?.();\n unregisterSchema?.();\n };\n });\n },\n\n registerHook(type: HookType, handler: HookHandler, name?: string) {\n if (!registration.registering) {\n throw new PluginUnavailableError(registration.pluginName);\n }\n if (typeof handler !== 'function') {\n throw new TypeError(`Plugin hook handler must be callable: ${type}`);\n }\n const hookName = pluginName\n ? `plugin-hook:${pluginName}:${type}:${name ?? hookIndex++}`\n : name ?? `plugin-hook:anonymous:${type}:${hookIndex++}`;\n if (\n registration.hooks.some(hook => hook.type === type && hook.name === hookName) ||\n hookRegistry.hasHook(type, hookName)\n ) {\n throw new Error(`Plugin hook conflicts with an existing hook: ${hookName}`);\n }\n registration.hooks.push({ type, name: hookName });\n registration.staged.push(() => {\n if (hookRegistry.hasHook(type, hookName)) {\n throw new Error(`Plugin hook conflicts with an existing hook: ${hookName}`);\n }\n const guardedHandler: HookHandler = (context, data) => invokeCapability(() => handler(context, data)) as Promise<Awaited<ReturnType<HookHandler>>>;\n const unregisterHook = hookRegistry.registerOwnedHook(type, guardedHandler, hookName);\n return () => {\n unregisterHook();\n };\n });\n },\n\n registerAgentProfile(profile: AgentProfile) {\n const id = readDataIdentifier(profile, 'id', 'agent profile');\n if (!agentProfileRegistry) throw new Error(`Plugin agent profile registry is unavailable: ${id}`);\n ownRegistration(id, registration.agentProfiles, 'agent profile', () => {\n const dispose = agentProfileRegistry.registerAgentProfile(profile);\n return () => {\n dispose();\n };\n });\n },\n\n registerLoopDefinition(definition: AgentLoopDefinition) {\n const id = readDataIdentifier(definition, 'id', 'loop definition');\n if (!loopRegistry) throw new Error(`Plugin loop registry is unavailable: ${id}`);\n if (typeof definition.createRunner !== 'function') {\n throw new TypeError(`Plugin loop definition createRunner must be callable: ${id}`);\n }\n const guardedDefinition: AgentLoopDefinition = {\n ...definition,\n createRunner: loopContext => {\n const runner = invokeCapability(() => definition.createRunner(loopContext)) as ReturnType<AgentLoopDefinition['createRunner']>;\n return input => invokeCapability(() => runner(input)) as ReturnType<typeof runner>;\n },\n };\n ownRegistration(id, registration.loopDefinitions, 'loop definition', () => loopRegistry.registerLoop(guardedDefinition));\n },\n\n registerLoopProfile(profile: LoopProfile) {\n const id = readDataIdentifier(profile, 'id', 'loop profile');\n if (!loopRegistry) throw new Error(`Plugin loop registry is unavailable: ${id}`);\n ownRegistration(id, registration.loopProfiles, 'loop profile', () => loopRegistry.registerProfile(profile));\n },\n\n registerLoopPlugin(plugin: LoopPlugin) {\n const id = readDataIdentifier(plugin, 'id', 'loop plugin');\n if (!loopRegistry) throw new Error(`Plugin loop registry is unavailable: ${id}`);\n const guardedPlugin: LoopPlugin = plugin.install === undefined\n ? { ...plugin }\n : {\n ...plugin,\n install: (loopContext, config) => invokeCapability(() => plugin.install!(loopContext, config)) as ReturnType<NonNullable<LoopPlugin['install']>>,\n };\n ownRegistration(id, registration.loopPlugins, 'loop plugin', () => loopRegistry.registerPlugin(guardedPlugin));\n },\n\n registerModelProvider(provider: ILLMProvider, config: Omit<ProviderConfig, 'name'>) {\n const id = readDataIdentifier(provider, 'name', 'model provider');\n if (!providerRegistry) throw new Error(`Plugin provider registry is unavailable: ${id}`);\n if (typeof provider.chat !== 'function') {\n throw new TypeError(`Plugin model provider chat must be callable: ${id}`);\n }\n const guardedProvider: ILLMProvider = {\n name: id,\n ...(provider.modelId === undefined ? {} : { modelId: provider.modelId }),\n ...(provider.model === undefined ? {} : { model: provider.model }),\n chat: request => invokeCapability(() => provider.chat(request)) as ReturnType<ILLMProvider['chat']>,\n };\n ownRegistration(id, registration.modelProviders, 'model provider', () => {\n const owned = providerRegistry.register(\n { ownerId: pluginName, kind: 'plugin' },\n guardedProvider,\n config,\n );\n return () => {\n owned.dispose();\n };\n });\n },\n };\n }\n\n registerPluginHooks(\n pluginName: string,\n hooks: Array<readonly [HookType, HookHandler, string?]>,\n ): void {\n const reg = this.ensureRegistration(pluginName);\n if (!reg.registering) throw new PluginUnavailableError(pluginName);\n const hookCount = reg.hooks.length;\n const stagedCount = reg.staged.length;\n try {\n for (const [type, handler, name] of hooks) {\n if (typeof handler !== 'function') {\n throw new TypeError(`Plugin hook handler must be callable: ${type}`);\n }\n const hookName = `plugin-hook:${pluginName}:${type}:${name ?? reg.hooks.length}`;\n if (this.hookRegistry.hasHook(type, hookName)) {\n throw new Error(`Plugin hook conflicts with an existing hook: ${hookName}`);\n }\n reg.hooks.push({ type, name: hookName });\n reg.staged.push(() => {\n if (this.hookRegistry.hasHook(type, hookName)) {\n throw new Error(`Plugin hook conflicts with an existing hook: ${hookName}`);\n }\n const guardedHandler: HookHandler = async (context, data) => {\n if (!reg.accepting) throw new PluginUnavailableError(pluginName);\n const result = Promise.resolve(handler(context, data));\n reg.inFlight.add(result);\n try {\n return await result;\n } finally {\n reg.inFlight.delete(result);\n }\n };\n const unregisterHook = this.hookRegistry.registerOwnedHook(type, guardedHandler, hookName);\n return () => {\n unregisterHook();\n };\n });\n }\n this.activatePluginRegistrations(pluginName);\n } catch (error) {\n reg.hooks.splice(hookCount);\n reg.staged.splice(stagedCount);\n throw error;\n }\n }\n\n getPluginRegistrations(pluginName: string): PluginRegistrationSnapshot | undefined {\n const registration = this.pluginRegistrations.get(pluginName);\n if (!registration) return undefined;\n return {\n pluginName: registration.pluginName,\n tools: [...registration.tools],\n hooks: registration.hooks.map(hook => ({ ...hook })),\n agentProfiles: [...registration.agentProfiles],\n loopDefinitions: [...registration.loopDefinitions],\n loopProfiles: [...registration.loopProfiles],\n loopPlugins: [...registration.loopPlugins],\n modelProviders: [...registration.modelProviders],\n };\n }\n\n /** Stop accepting new registrations and tool requests before unload. */\n suspendPluginRegistrations(pluginName: string): boolean {\n const registration = this.pluginRegistrations.get(pluginName);\n if (!registration) return false;\n registration.registering = false;\n registration.accepting = false;\n return true;\n }\n\n /** Atomically publish registrations only after activation and manifest validation succeed. */\n activatePluginRegistrations(pluginName: string): boolean {\n const registration = this.pluginRegistrations.get(pluginName);\n if (!registration || !registration.registering || registration.detached) return false;\n const published: Array<() => void> = [];\n try {\n for (const publish of registration.staged) published.push(publish());\n } catch (error) {\n for (const cleanup of published.reverse()) {\n try {\n cleanup();\n } catch {\n // Preserve the commit failure; the loader will perform final teardown.\n }\n }\n throw error;\n }\n registration.staged.length = 0;\n registration.cleanup.push(...published);\n registration.registering = false;\n registration.accepting = true;\n return true;\n }\n\n /** Wait for the plugin's already-started asynchronous tool calls to settle. */\n async drainPluginRegistrations(pluginName: string): Promise<void> {\n const registration = this.pluginRegistrations.get(pluginName);\n if (!registration || registration.inFlight.size === 0) return;\n await Promise.allSettled([...registration.inFlight]);\n }\n\n clearPluginRegistrations(): void {\n const errors: unknown[] = [];\n for (const pluginName of [...this.pluginRegistrations.keys()]) {\n try {\n this.unregisterPluginRegistrations(pluginName);\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length > 0) {\n throw new AggregateError(errors, 'One or more plugin registrations failed to clean up');\n }\n }\n\n unregisterPluginRegistrations(pluginName: string): boolean {\n const detached = this.detachPluginRegistrations(pluginName);\n if (!detached) return false;\n this.finalizePluginRegistrations(pluginName);\n return true;\n }\n\n /** Remove routes/hooks immediately while retaining in-flight tracking for drain. */\n detachPluginRegistrations(pluginName: string): boolean {\n const registration = this.pluginRegistrations.get(pluginName);\n if (!registration) return false;\n registration.registering = false;\n registration.accepting = false;\n if (registration.detached) return true;\n registration.detached = true;\n registration.staged.length = 0;\n const errors: unknown[] = [];\n for (const cleanup of [...registration.cleanup].reverse()) {\n try {\n cleanup();\n } catch (error) {\n errors.push(error);\n }\n }\n registration.cleanup.length = 0;\n if (errors.length > 0) {\n throw new AggregateError(errors, `Plugin registration cleanup failed: ${pluginName}`);\n }\n return true;\n }\n\n /** Forget a detached plugin only after all started work has drained. */\n finalizePluginRegistrations(pluginName: string): boolean {\n const registration = this.pluginRegistrations.get(pluginName);\n if (!registration) return false;\n if (!registration.detached || registration.inFlight.size > 0) return false;\n this.pluginRegistrations.delete(pluginName);\n return true;\n }\n}\n\nfunction hasControlCharacters(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n if (code <= 0x1f || code === 0x7f) return true;\n }\n return false;\n}\n\nfunction readDataIdentifier(value: object, property: string, field: string): string {\n const descriptor = Object.getOwnPropertyDescriptor(value, property);\n if (\n !descriptor || descriptor.get !== undefined || descriptor.set !== undefined ||\n typeof descriptor.value !== 'string' || descriptor.value.trim().length === 0 ||\n descriptor.value.length > 1_024 || hasControlCharacters(descriptor.value)\n ) throw new TypeError(`Plugin ${field} must have a bounded data-property ${property}`);\n return descriptor.value;\n}\n","import { satisfies, valid, validRange } from 'semver';\nimport type { HookType } from '../loopAPI/hooks/types.js';\nimport { PluginRegistryManager } from './registry.js';\nimport type { PluginAPIOptions } from './registry.js';\nimport type { LoadedPlugin, PluginCleanup, PluginManifest, PluginModule } from './types.js';\n\ninterface LoadedPluginHandle {\n info: LoadedPlugin;\n module: PluginModule;\n cleanup?: PluginCleanup;\n unloading: boolean;\n}\n\n/** Runtime version used for plugin compatibility checks. Keep aligned with the package version. */\nexport const MEMELOOP_PLUGIN_API_VERSION = '0.2.9';\n\nconst dangerousManifestKeys = new Set(['__proto__', 'prototype', 'constructor']);\nconst manifestKeys = new Set(['name', 'version', 'description', 'exports', 'author', 'minMemeloopVersion']);\nconst exportKeys = new Set([\n 'tools',\n 'hooks',\n 'agentProfiles',\n 'loopDefinitions',\n 'loopProfiles',\n 'loopPlugins',\n 'modelProviders',\n]);\nfunction hasControlCharacters(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n if (code <= 0x1f || code === 0x7f) return true;\n }\n return false;\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return false;\n const prototype: unknown = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction hasOnlySafeKeys(record: Record<string, unknown>, allowed: ReadonlySet<string>): boolean {\n return Object.keys(record).every(key => !dangerousManifestKeys.has(key) && allowed.has(key));\n}\n\nconst hookTypes = new Set<string>([\n 'PreToolUse',\n 'PostToolUse',\n 'UserPromptSubmit',\n 'AgentStart',\n 'AgentStop',\n]);\n\nfunction isHookType(value: unknown): value is HookType {\n return typeof value === 'string' && hookTypes.has(value);\n}\n\nexport function validatePluginManifest(object: unknown): PluginManifest | null {\n if (!isPlainRecord(object) || !hasOnlySafeKeys(object, manifestKeys)) return null;\n const manifest = object;\n if (\n typeof manifest.name !== 'string' ||\n manifest.name.trim().length === 0 || manifest.name.trim().length > 256 ||\n hasControlCharacters(manifest.name) ||\n typeof manifest.version !== 'string' ||\n manifest.version.trim().length === 0 || manifest.version.trim().length > 64 ||\n (manifest.description !== undefined && (\n typeof manifest.description !== 'string' || manifest.description.length > 16_384\n )) ||\n (manifest.author !== undefined && (\n typeof manifest.author !== 'string' || manifest.author.length > 512\n )) ||\n valid(manifest.version.trim()) === null\n ) {\n return null;\n }\n const exports_ = validateExports(manifest.exports);\n if (exports_ === null) return null;\n const minimumVersion = typeof manifest.minMemeloopVersion === 'string'\n ? manifest.minMemeloopVersion.trim()\n : undefined;\n if (\n minimumVersion !== undefined &&\n (minimumVersion.length === 0 || minimumVersion.length > 256 || validRange(minimumVersion) === null)\n ) return null;\n return {\n name: manifest.name.trim(),\n version: manifest.version.trim(),\n description: typeof manifest.description === 'string' ? manifest.description : '',\n exports: exports_,\n author: typeof manifest.author === 'string' ? manifest.author : undefined,\n minMemeloopVersion: minimumVersion,\n };\n}\n\nfunction validateExports(object: unknown): PluginManifest['exports'] | null {\n if (object === undefined) return undefined;\n if (!isPlainRecord(object) || !hasOnlySafeKeys(object, exportKeys)) return null;\n const exportsRecord = object;\n const tools = normalizeExportIdentifiers(exportsRecord.tools, 256);\n const agentProfiles = normalizeExportIdentifiers(exportsRecord.agentProfiles, 256);\n const loopDefinitions = normalizeExportIdentifiers(exportsRecord.loopDefinitions, 256);\n const loopProfiles = normalizeExportIdentifiers(exportsRecord.loopProfiles, 256);\n const loopPlugins = normalizeExportIdentifiers(exportsRecord.loopPlugins, 256);\n const modelProviders = normalizeExportIdentifiers(exportsRecord.modelProviders, 256);\n if (\n tools === null || agentProfiles === null || loopDefinitions === null ||\n loopProfiles === null || loopPlugins === null || modelProviders === null\n ) return null;\n if (exportsRecord.hooks !== undefined && !Array.isArray(exportsRecord.hooks)) return null;\n const hooks = exportsRecord.hooks as unknown[] | undefined;\n if ((hooks?.length ?? 0) > 64) return null;\n if (hooks?.some(hook => !isHookType(hook))) return null;\n const normalizedHooks = hooks as HookType[] | undefined;\n if (normalizedHooks && new Set(normalizedHooks).size !== normalizedHooks.length) return null;\n return {\n tools,\n hooks: normalizedHooks,\n ...(agentProfiles === undefined ? {} : { agentProfiles }),\n ...(loopDefinitions === undefined ? {} : { loopDefinitions }),\n ...(loopProfiles === undefined ? {} : { loopProfiles }),\n ...(loopPlugins === undefined ? {} : { loopPlugins }),\n ...(modelProviders === undefined ? {} : { modelProviders }),\n };\n}\n\nfunction normalizeExportIdentifiers(value: unknown, maximum: number): string[] | undefined | null {\n if (value === undefined) return undefined;\n if (!Array.isArray(value) || value.length > maximum) return null;\n const normalized: string[] = [];\n for (const item of value) {\n if (\n typeof item !== 'string' || item.trim().length === 0 || item.trim().length > 256 ||\n hasControlCharacters(item)\n ) return null;\n normalized.push(item.trim());\n }\n return new Set(normalized).size === normalized.length ? normalized : null;\n}\n\nexport interface LoadPluginModuleOptions {\n manifest: PluginManifest;\n module: PluginModule;\n /** Host services used to construct a plugin-scoped, unloadable API. */\n apiOptions?: Omit<PluginAPIOptions, 'pluginName'>;\n source?: string;\n}\n\nexport interface PluginLoaderOptions {\n registryManager?: PluginRegistryManager;\n apiOptions?: Omit<PluginAPIOptions, 'pluginName'>;\n /** Host memeloop version used to enforce manifest.minMemeloopVersion. */\n memeloopVersion?: string;\n /** Maximum time allowed for activate() to settle. */\n activationTimeoutMs?: number;\n /** Maximum time allowed for an unload cleanup callback to settle. */\n cleanupTimeoutMs?: number;\n /** Maximum time allowed for already-started plugin tool calls to drain. */\n drainTimeoutMs?: number;\n}\n\nexport class PluginLifecycleTimeoutError extends Error {\n readonly code = 'PLUGIN_LIFECYCLE_TIMEOUT' as const;\n\n constructor(readonly phase: 'activate' | 'cleanup' | 'drain', readonly pluginName: string) {\n super(`Plugin ${phase} timed out: ${pluginName}`);\n this.name = 'PluginLifecycleTimeoutError';\n }\n}\n\nfunction validateTimeout(value: number, field: string): number {\n if (!Number.isSafeInteger(value) || value <= 0 || value > 300_000) {\n throw new RangeError(`${field} must be an integer between 1 and 300000`);\n }\n return value;\n}\n\nasync function withLifecycleTimeout<T>(\n operation: Promise<T>,\n timeoutMs: number,\n phase: PluginLifecycleTimeoutError['phase'],\n pluginName: string,\n): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => {\n reject(new PluginLifecycleTimeoutError(phase, pluginName));\n }, timeoutMs);\n });\n try {\n return await Promise.race([operation, timeout]);\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n }\n}\n\n/** Runtime-scoped plugin lifecycle owner. */\nexport class PluginLoader {\n private readonly loadedPlugins = new Map<string, LoadedPluginHandle>();\n private readonly loadingPlugins = new Set<string>();\n private readonly registryManager: PluginRegistryManager;\n private readonly apiOptions: Omit<PluginAPIOptions, 'pluginName'>;\n private readonly memeloopVersion: string;\n private readonly activationTimeoutMs: number;\n private readonly cleanupTimeoutMs: number;\n private readonly drainTimeoutMs: number;\n\n constructor(options: PluginLoaderOptions = {}) {\n this.registryManager = options.registryManager ?? new PluginRegistryManager();\n this.apiOptions = options.apiOptions ?? {};\n this.memeloopVersion = options.memeloopVersion ?? MEMELOOP_PLUGIN_API_VERSION;\n this.activationTimeoutMs = validateTimeout(options.activationTimeoutMs ?? 10_000, 'activationTimeoutMs');\n this.cleanupTimeoutMs = validateTimeout(options.cleanupTimeoutMs ?? 10_000, 'cleanupTimeoutMs');\n this.drainTimeoutMs = validateTimeout(options.drainTimeoutMs ?? 10_000, 'drainTimeoutMs');\n if (valid(this.memeloopVersion) === null) {\n throw new Error(`Invalid memeloop plugin API version: ${this.memeloopVersion}`);\n }\n }\n\n private validateDeclaredExports(manifest: PluginManifest): void {\n const registration = this.registryManager.getPluginRegistrations(manifest.name);\n const sameSet = <T>(left: ReadonlySet<T>, right: ReadonlySet<T>): boolean => left.size === right.size && [...left].every(value => right.has(value));\n const capabilitySets = [\n ['tools', registration?.tools ?? [], manifest.exports?.tools ?? []],\n ['hooks', registration?.hooks.map(hook => hook.type) ?? [], manifest.exports?.hooks ?? []],\n ['agentProfiles', registration?.agentProfiles ?? [], manifest.exports?.agentProfiles ?? []],\n ['loopDefinitions', registration?.loopDefinitions ?? [], manifest.exports?.loopDefinitions ?? []],\n ['loopProfiles', registration?.loopProfiles ?? [], manifest.exports?.loopProfiles ?? []],\n ['loopPlugins', registration?.loopPlugins ?? [], manifest.exports?.loopPlugins ?? []],\n ['modelProviders', registration?.modelProviders ?? [], manifest.exports?.modelProviders ?? []],\n ] as const;\n const mismatch = capabilitySets.find(([, actual, declared]) => !sameSet(new Set(actual), new Set(declared)));\n if (mismatch) {\n const [capability, actual, declared] = mismatch;\n throw new Error(\n `Plugin exports do not match registrations: ${manifest.name} ` +\n `(capability: ${capability}; declared: ${declared.join(', ') || 'none'}; ` +\n `registered: ${actual.join(', ') || 'none'})`,\n );\n }\n }\n\n async loadPluginModule(options: LoadPluginModuleOptions): Promise<LoadedPlugin | null> {\n const { manifest, module, apiOptions, source = '' } = options;\n const validManifest = validatePluginManifest(manifest);\n if (!validManifest) return null;\n if (!module || typeof module.activate !== 'function') return null;\n if (module.name !== validManifest.name) return null;\n if (\n validManifest.minMemeloopVersion &&\n !satisfies(\n this.memeloopVersion,\n valid(validManifest.minMemeloopVersion)\n ? `>=${validManifest.minMemeloopVersion}`\n : validManifest.minMemeloopVersion,\n { includePrerelease: true },\n )\n ) {\n throw new Error(\n `Plugin ${validManifest.name} requires memeloop ${validManifest.minMemeloopVersion}; ` +\n `runtime is ${this.memeloopVersion}`,\n );\n }\n\n if (this.loadedPlugins.has(validManifest.name) || this.loadingPlugins.has(validManifest.name)) {\n throw new Error(`Plugin is already loaded: ${validManifest.name}`);\n }\n\n this.loadingPlugins.add(validManifest.name);\n const api = this.registryManager.createPluginAPI({\n ...this.apiOptions,\n ...apiOptions,\n pluginName: validManifest.name,\n });\n try {\n let cleanup: PluginCleanup | undefined;\n const activation = Promise.resolve().then(() => module.activate(api));\n try {\n const activatedCleanup = await withLifecycleTimeout(\n activation,\n this.activationTimeoutMs,\n 'activate',\n validManifest.name,\n );\n cleanup = typeof activatedCleanup === 'function' ? activatedCleanup : undefined;\n this.validateDeclaredExports(validManifest);\n if (!this.registryManager.activatePluginRegistrations(validManifest.name)) {\n throw new Error(`Plugin activation could not be committed: ${validManifest.name}`);\n }\n } catch (activationError) {\n this.registryManager.suspendPluginRegistrations(validManifest.name);\n if (activationError instanceof PluginLifecycleTimeoutError) {\n // activate() cannot be forcibly cancelled. Close its API immediately,\n // and dispose a cleanup callback if the late activation eventually\n // returns one.\n void activation.then(\n lateCleanup => {\n if (typeof lateCleanup !== 'function') return;\n void withLifecycleTimeout(\n Promise.resolve().then(() => lateCleanup()),\n this.cleanupTimeoutMs,\n 'cleanup',\n validManifest.name,\n ).catch(() => undefined);\n },\n () => undefined,\n );\n }\n const rollbackErrors: unknown[] = [activationError];\n try {\n this.registryManager.detachPluginRegistrations(validManifest.name);\n } catch (detachError) {\n rollbackErrors.push(detachError);\n }\n try {\n await withLifecycleTimeout(\n this.registryManager.drainPluginRegistrations(validManifest.name),\n this.drainTimeoutMs,\n 'drain',\n validManifest.name,\n );\n } catch (drainError) {\n rollbackErrors.push(drainError);\n }\n if (cleanup) {\n try {\n await withLifecycleTimeout(\n Promise.resolve().then(() => cleanup?.()),\n this.cleanupTimeoutMs,\n 'cleanup',\n validManifest.name,\n );\n } catch (cleanupError) {\n rollbackErrors.push(cleanupError);\n }\n }\n try {\n if (!this.registryManager.finalizePluginRegistrations(validManifest.name)) {\n throw new Error(`Plugin activation rollback could not be finalized: ${validManifest.name}`);\n }\n } catch (rollbackError) {\n rollbackErrors.push(rollbackError);\n }\n if (rollbackErrors.length > 1) {\n throw new AggregateError(\n rollbackErrors,\n `Plugin activation failed and rollback was incomplete: ${validManifest.name}`,\n { cause: activationError },\n );\n }\n throw activationError;\n }\n const info = loadedPluginInfo(validManifest, source);\n const loaded: LoadedPluginHandle = {\n info,\n module,\n cleanup,\n unloading: false,\n };\n this.loadedPlugins.set(validManifest.name, loaded);\n return info;\n } finally {\n this.loadingPlugins.delete(validManifest.name);\n }\n }\n\n async loadPluginModules(plugins: LoadPluginModuleOptions[]): Promise<LoadedPlugin[]> {\n const loaded: LoadedPlugin[] = [];\n try {\n for (const plugin of plugins) {\n const result = await this.loadPluginModule(plugin);\n if (result) loaded.push(result);\n }\n return loaded;\n } catch (error) {\n const rollbackErrors: unknown[] = [error];\n for (const plugin of [...loaded].reverse()) {\n try {\n await this.unloadPlugin(plugin.manifest.name);\n } catch (rollbackError) {\n rollbackErrors.push(rollbackError);\n }\n }\n if (rollbackErrors.length > 1) {\n throw new AggregateError(rollbackErrors, 'Plugin batch failed and rollback was incomplete', {\n cause: error,\n });\n }\n throw error;\n }\n }\n\n async unloadPlugin(name: string): Promise<boolean> {\n const loaded = this.loadedPlugins.get(name);\n if (!loaded) return false;\n if (loaded.unloading) {\n throw new PluginLifecycleTimeoutError('drain', name);\n }\n loaded.unloading = true;\n\n const errors: unknown[] = [];\n this.registryManager.suspendPluginRegistrations(name);\n try {\n this.registryManager.detachPluginRegistrations(name);\n } catch (error) {\n errors.push(error);\n }\n try {\n await withLifecycleTimeout(\n this.registryManager.drainPluginRegistrations(name),\n this.drainTimeoutMs,\n 'drain',\n name,\n );\n } catch (error) {\n if (error instanceof PluginLifecycleTimeoutError) {\n this.scheduleQuarantinedCleanup(name, loaded);\n throw error;\n }\n errors.push(error);\n }\n try {\n try {\n if (loaded.cleanup) {\n await withLifecycleTimeout(\n Promise.resolve().then(() => loaded.cleanup?.()),\n this.cleanupTimeoutMs,\n 'cleanup',\n name,\n );\n }\n } catch (error) {\n errors.push(error);\n }\n try {\n this.registryManager.finalizePluginRegistrations(name);\n } catch (error) {\n errors.push(error);\n }\n } finally {\n this.loadedPlugins.delete(name);\n }\n\n if (errors.length > 0) {\n throw new AggregateError(errors, `Plugin cleanup failed: ${name}`);\n }\n return true;\n }\n\n listPlugins(): LoadedPlugin[] {\n return Array.from(this.loadedPlugins.values(), loaded => loaded.info);\n }\n\n getLoadedPlugin(name: string): LoadedPlugin | undefined {\n const loaded = this.loadedPlugins.get(name);\n return loaded?.info;\n }\n\n isPluginLoaded(name: string): boolean {\n return this.loadedPlugins.has(name);\n }\n\n async unloadAllPlugins(): Promise<void> {\n const errors: unknown[] = [];\n for (const name of [...this.loadedPlugins.keys()]) {\n try {\n await this.unloadPlugin(name);\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length > 0) {\n throw new AggregateError(errors, 'One or more plugins failed to unload');\n }\n }\n\n private scheduleQuarantinedCleanup(name: string, loaded: LoadedPluginHandle): void {\n void this.registryManager.drainPluginRegistrations(name).then(async () => {\n try {\n if (loaded.cleanup) {\n await withLifecycleTimeout(\n Promise.resolve().then(() => loaded.cleanup?.()),\n this.cleanupTimeoutMs,\n 'cleanup',\n name,\n );\n }\n } catch {\n // The instance remains detached; cleanup failure cannot restore routes.\n } finally {\n this.registryManager.finalizePluginRegistrations(name);\n if (this.loadedPlugins.get(name) === loaded) this.loadedPlugins.delete(name);\n }\n }, () => undefined);\n }\n}\n\nfunction loadedPluginInfo(manifest: PluginManifest, source: string): LoadedPlugin {\n const exports_ = manifest.exports\n ? Object.freeze({\n tools: manifest.exports.tools ? Object.freeze([...manifest.exports.tools]) : undefined,\n hooks: manifest.exports.hooks ? Object.freeze([...manifest.exports.hooks]) : undefined,\n agentProfiles: manifest.exports.agentProfiles\n ? Object.freeze([...manifest.exports.agentProfiles])\n : undefined,\n loopDefinitions: manifest.exports.loopDefinitions\n ? Object.freeze([...manifest.exports.loopDefinitions])\n : undefined,\n loopProfiles: manifest.exports.loopProfiles\n ? Object.freeze([...manifest.exports.loopProfiles])\n : undefined,\n loopPlugins: manifest.exports.loopPlugins\n ? Object.freeze([...manifest.exports.loopPlugins])\n : undefined,\n modelProviders: manifest.exports.modelProviders\n ? Object.freeze([...manifest.exports.modelProviders])\n : undefined,\n })\n : undefined;\n return Object.freeze({\n manifest: Object.freeze({ ...manifest, exports: exports_ }),\n source,\n loadedAt: new Date().toISOString(),\n });\n}\n"],"mappings":"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","names":["hasControlCharacters"]}
@@ -1,22 +1,24 @@
1
- import type { CloudDeviceClient, CloudDeviceRecord, DeviceConnectionGrant, DeviceRelayReservationToken } from './types.js';
1
+ import type { CloudDeviceClient, CloudDeviceRecord, DeviceCloudCommitFence, DeviceConnectionGrant, DeviceRelayReservationToken } from './types.js';
2
2
  type Awaitable<T> = T | Promise<T>;
3
3
  type ConnectionGrantRequest = Parameters<CloudDeviceClient['createConnectionGrant']>[0];
4
4
  export type CloudDeviceFetch = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
5
5
  export type CloudDeviceAccessTokenSupplier = (signal: AbortSignal) => Awaitable<string | undefined>;
6
6
  export interface DeviceCloudTokenStorage {
7
7
  loadConnectionGrant(input: ConnectionGrantRequest): Awaitable<unknown>;
8
- saveConnectionGrant(input: ConnectionGrantRequest, grant: DeviceConnectionGrant): Awaitable<void>;
8
+ /** The final durable write must atomically reject a stale generation fence. */
9
+ saveConnectionGrant(input: ConnectionGrantRequest, grant: DeviceConnectionGrant, fence?: DeviceCloudCommitFence): Awaitable<void>;
9
10
  loadRelayReservation(peerId: string): Awaitable<unknown>;
10
- saveRelayReservation(peerId: string, token: DeviceRelayReservationToken): Awaitable<void>;
11
+ /** The final durable write must atomically reject a stale generation fence. */
12
+ saveRelayReservation(peerId: string, token: DeviceRelayReservationToken, fence?: DeviceCloudCommitFence): Awaitable<void>;
11
13
  clear(): Awaitable<void>;
12
14
  }
13
15
  export declare class MemoryDeviceCloudTokenStorage implements DeviceCloudTokenStorage {
14
16
  private readonly grants;
15
17
  private readonly relayReservations;
16
18
  loadConnectionGrant(input: ConnectionGrantRequest): DeviceConnectionGrant | undefined;
17
- saveConnectionGrant(input: ConnectionGrantRequest, grant: DeviceConnectionGrant): void;
19
+ saveConnectionGrant(input: ConnectionGrantRequest, grant: DeviceConnectionGrant, fence?: DeviceCloudCommitFence): void;
18
20
  loadRelayReservation(peerId: string): DeviceRelayReservationToken | undefined;
19
- saveRelayReservation(peerId: string, token: DeviceRelayReservationToken): void;
21
+ saveRelayReservation(peerId: string, token: DeviceRelayReservationToken, fence?: DeviceCloudCommitFence): void;
20
22
  clear(): void;
21
23
  }
22
24
  export type CloudDeviceFetchErrorCode = 'cloud_request_failed' | 'cloud_http_error' | 'cloud_response_invalid_json' | 'cloud_response_invalid_shape' | 'cloud_response_too_large';
@@ -72,10 +74,10 @@ export declare class CloudDeviceFetchClient implements CloudDeviceClient {
72
74
  issuer: 'memeloop-cloud';
73
75
  publicKeyMultibase: string;
74
76
  }>;
75
- createConnectionGrant(input: ConnectionGrantRequest, signal?: AbortSignal): Promise<DeviceConnectionGrant>;
77
+ createConnectionGrant(input: ConnectionGrantRequest, signal?: AbortSignal, fence?: DeviceCloudCommitFence): Promise<DeviceConnectionGrant>;
76
78
  createRelayReservation(input: {
77
79
  peerId: string;
78
- }, signal?: AbortSignal): Promise<DeviceRelayReservationToken>;
80
+ }, signal?: AbortSignal, fence?: DeviceCloudCommitFence): Promise<DeviceRelayReservationToken>;
79
81
  heartbeat(input: Parameters<CloudDeviceClient['heartbeat']>[0], signal?: AbortSignal): Promise<{
80
82
  ok: boolean;
81
83
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"cloudDeviceFetchClient.d.ts","sourceRoot":"","sources":["../../src/device-network/cloudDeviceFetchClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cloudDeviceFetchClient.d.ts","sourceRoot":"","sources":["../../src/device-network/cloudDeviceFetchClient.ts"],"names":[],"mappings":"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"}
@@ -27,11 +27,11 @@ export interface DeviceCloudStepResult {
27
27
  export interface DeviceCloudConnectionAdapter<Configuration> {
28
28
  isConfigured(configuration: Configuration | undefined): configuration is Configuration;
29
29
  relayRequiredForOnline(configuration: Configuration): boolean;
30
- ensureAuthorizer(configuration: Configuration, signal: AbortSignal): Promise<DeviceCloudStepResult | undefined>;
31
- registerDevice(configuration: Configuration, signal: AbortSignal): Promise<DeviceCloudStepResult | undefined>;
32
- ensureRelay(configuration: Configuration, signal: AbortSignal): Promise<DeviceCloudStepResult | undefined>;
33
- heartbeat(configuration: Configuration, signal: AbortSignal): Promise<DeviceCloudStepResult | undefined>;
34
- syncDirectory(configuration: Configuration, signal: AbortSignal): Promise<DeviceCloudStepResult | undefined>;
30
+ ensureAuthorizer(configuration: Configuration, signal: AbortSignal, fence: DeviceCloudCommitFence): Promise<DeviceCloudStepResult | undefined>;
31
+ registerDevice(configuration: Configuration, signal: AbortSignal, fence: DeviceCloudCommitFence): Promise<DeviceCloudStepResult | undefined>;
32
+ ensureRelay(configuration: Configuration, signal: AbortSignal, fence: DeviceCloudCommitFence): Promise<DeviceCloudStepResult | undefined>;
33
+ heartbeat(configuration: Configuration, signal: AbortSignal, fence: DeviceCloudCommitFence): Promise<DeviceCloudStepResult | undefined>;
34
+ syncDirectory(configuration: Configuration, signal: AbortSignal, fence: DeviceCloudCommitFence): Promise<DeviceCloudStepResult | undefined>;
35
35
  /**
36
36
  * Optional background anti-entropy hooks. The coordinator keeps one run per
37
37
  * peer and generation, retries incomplete bounded results, and aborts every
@@ -1 +1 @@
1
- {"version":3,"file":"deviceCloudConnectionCoordinator.d.ts","sourceRoot":"","sources":["../../src/device-network/deviceCloudConnectionCoordinator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deviceCloudConnectionCoordinator.d.ts","sourceRoot":"","sources":["../../src/device-network/deviceCloudConnectionCoordinator.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,13 @@
1
1
  import type { RemoteOrchestrationRequest, RemoteOrchestrationResponse, RemoteOrchestrationTransport, RemoteOrchestrationTransportOptions } from '../orchestration/remoteClient.js';
2
2
  import type { DeviceConnectionGrant, DeviceNetworkService, MemeLoopDuplexStream } from './types.js';
3
3
  export declare const DEVICE_ORCHESTRATION_PROTOCOL: "/memeloop/orchestration/2.0.0";
4
+ export declare const DEVICE_ORCHESTRATION_FRAME_LIMITS: Readonly<{
5
+ maxPayloadBytes: number;
6
+ requestIdleTimeoutMs: 10000;
7
+ requestTotalTimeoutMs: 30000;
8
+ watchIdleTimeoutMs: 90000;
9
+ watchBookmarkIntervalMs: 30000;
10
+ }>;
4
11
  export interface DeviceOrchestrationTransportOptions {
5
12
  deviceNetwork: Pick<DeviceNetworkService, 'openStream'>;
6
13
  peerId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"deviceOrchestrationTransport.d.ts","sourceRoot":"","sources":["../../src/device-network/deviceOrchestrationTransport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,4BAA4B,EAAE,mCAAmC,EAAE,MAAM,kCAAkC,CAAC;AAEnL,OAAO,KAAK,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEpG,eAAO,MAAM,6BAA6B,EAAG,+BAAwC,CAAC;AAOtF,MAAM,WAAW,mCAAmC;IAClD,aAAa,EAAE,IAAI,CAAC,oBAAoB,EAAE,YAAY,CAAC,CAAC;IACxD,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CACd,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,WAAW,KACjB,qBAAqB,GAAG,SAAS,GAAG,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAAC;IACpF,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,qCAAqC;IACpD,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,SAAS,CAAC,EAAE,CAAC,cAAc,EAAE,qBAAqB,GAAG,SAAS,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/F;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,OAAO,CACL,OAAO,EAAE,0BAA0B,EACnC,OAAO,CAAC,EAAE,mCAAmC,GAC5C,OAAO,CAAC,2BAA2B,CAAC,CAAC;IACxC,KAAK,CACH,OAAO,EAAE,0BAA0B,EACnC,OAAO,CAAC,EAAE,mCAAmC,GAC5C,aAAa,CAAC,2BAA2B,CAAC,CAAC;CAC/C,CAAC;AAEF,MAAM,WAAW,uCAAuC;IACtD,cAAc,EAAE,CACd,YAAY,EAAE,MAAM,KACjB,0BAA0B,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;IACtE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,gCAAgC,GAAG,CAC7C,KAAK,EAAE,qCAAqC,KACzC,OAAO,CAAC,IAAI,CAAC,CAAC;AA4GnB;;;;GAIG;AACH,wBAAgB,kCAAkC,CAChD,OAAO,EAAE,mCAAmC,GAC3C,4BAA4B,CA4F9B;AAqJD,6EAA6E;AAC7E,wBAAgB,sCAAsC,CACpD,OAAO,EAAE,uCAAuC,GAC/C,gCAAgC,CAgClC"}
1
+ {"version":3,"file":"deviceOrchestrationTransport.d.ts","sourceRoot":"","sources":["../../src/device-network/deviceOrchestrationTransport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,4BAA4B,EAAE,mCAAmC,EAAE,MAAM,kCAAkC,CAAC;AAEnL,OAAO,KAAK,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEpG,eAAO,MAAM,6BAA6B,EAAG,+BAAwC,CAAC;AACtF,eAAO,MAAM,iCAAiC;;;;;;EAM5C,CAAC;AAOH,MAAM,WAAW,mCAAmC;IAClD,aAAa,EAAE,IAAI,CAAC,oBAAoB,EAAE,YAAY,CAAC,CAAC;IACxD,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CACd,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,WAAW,KACjB,qBAAqB,GAAG,SAAS,GAAG,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAAC;IACpF,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,qCAAqC;IACpD,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,SAAS,CAAC,EAAE,CAAC,cAAc,EAAE,qBAAqB,GAAG,SAAS,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/F;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,OAAO,CACL,OAAO,EAAE,0BAA0B,EACnC,OAAO,CAAC,EAAE,mCAAmC,GAC5C,OAAO,CAAC,2BAA2B,CAAC,CAAC;IACxC,KAAK,CACH,OAAO,EAAE,0BAA0B,EACnC,OAAO,CAAC,EAAE,mCAAmC,GAC5C,aAAa,CAAC,2BAA2B,CAAC,CAAC;CAC/C,CAAC;AAEF,MAAM,WAAW,uCAAuC;IACtD,cAAc,EAAE,CACd,YAAY,EAAE,MAAM,KACjB,0BAA0B,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;IACtE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,gCAAgC,GAAG,CAC7C,KAAK,EAAE,qCAAqC,KACzC,OAAO,CAAC,IAAI,CAAC,CAAC;AA4GnB;;;;GAIG;AACH,wBAAgB,kCAAkC,CAChD,OAAO,EAAE,mCAAmC,GAC3C,4BAA4B,CA4F9B;AAqJD,6EAA6E;AAC7E,wBAAgB,sCAAsC,CACpD,OAAO,EAAE,uCAAuC,GAC/C,gCAAgC,CAwClC"}
@@ -70,18 +70,26 @@ export declare class StandardDeviceCloudConnectionAdapter implements DeviceCloud
70
70
  constructor(options: StandardDeviceCloudConnectionAdapterOptions);
71
71
  isConfigured(configuration: CloudDeviceClient | undefined): configuration is CloudDeviceClient;
72
72
  relayRequiredForOnline(_configuration: CloudDeviceClient): boolean;
73
- ensureAuthorizer(client: CloudDeviceClient, signal: AbortSignal): Promise<DeviceCloudStepResult>;
74
- registerDevice(client: CloudDeviceClient, signal: AbortSignal): Promise<undefined>;
75
- ensureRelay(client: CloudDeviceClient, signal: AbortSignal): Promise<DeviceCloudStepResult | undefined>;
76
- heartbeat(client: CloudDeviceClient, signal: AbortSignal): Promise<undefined>;
73
+ ensureAuthorizer(client: CloudDeviceClient, signal: AbortSignal, _fence?: DeviceCloudCommitFence): Promise<DeviceCloudStepResult>;
74
+ registerDevice(client: CloudDeviceClient, signal: AbortSignal, _fence?: DeviceCloudCommitFence): Promise<undefined>;
75
+ ensureRelay(client: CloudDeviceClient, signal: AbortSignal, fence?: DeviceCloudCommitFence): Promise<DeviceCloudStepResult | undefined>;
76
+ heartbeat(client: CloudDeviceClient, signal: AbortSignal, _fence?: DeviceCloudCommitFence): Promise<undefined>;
77
77
  dispose(client: CloudDeviceClient, signal: AbortSignal): Promise<void>;
78
- syncDirectory(client: CloudDeviceClient, signal: AbortSignal): Promise<DeviceCloudStepResult>;
78
+ syncDirectory(client: CloudDeviceClient, signal: AbortSignal, _fence?: DeviceCloudCommitFence): Promise<DeviceCloudStepResult>;
79
79
  listBackgroundSyncPeerIds(_client: CloudDeviceClient, signal: AbortSignal): readonly string[];
80
80
  syncDevice(client: CloudDeviceClient, peerId: string, signal: AbortSignal): Promise<SyncResult>;
81
- classifyError(error: unknown): 'offline' | 'error';
81
+ classifyError(error: unknown): 'offline' | 'error' | 'registration-invalid';
82
82
  private currentRelayReservations;
83
83
  }
84
- /** True only when another device can plausibly dial the address without a relay. */
85
- export declare function hasValidDirectCloudDeviceAddress(addresses: readonly string[]): boolean;
84
+ /**
85
+ * True only when another device can dial a complete direct transport address.
86
+ *
87
+ * Merely finding a public-looking host is insufficient: `/ip4/8.8.8.8`,
88
+ * `tcp/0`, and an unknown transport are not usable paths and must not let a
89
+ * host report `online` without a relay. The optional PeerId pins advertised
90
+ * addresses to the local identity while retaining the standalone classifier
91
+ * used by hosts that append `/p2p/<peerId>` later.
92
+ */
93
+ export declare function hasValidDirectCloudDeviceAddress(addresses: readonly string[], expectedPeerId?: string): boolean;
86
94
  export {};
87
95
  //# sourceMappingURL=standardDeviceCloudConnectionAdapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"standardDeviceCloudConnectionAdapter.d.ts","sourceRoot":"","sources":["../../src/device-network/standardDeviceCloudConnectionAdapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"standardDeviceCloudConnectionAdapter.d.ts","sourceRoot":"","sources":["../../src/device-network/standardDeviceCloudConnectionAdapter.ts"],"names":[],"mappings":"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"}
@@ -160,6 +160,8 @@ export interface PairingSession {
160
160
  }
161
161
  export interface LocalPairingRequestOptions {
162
162
  multiaddrs?: string[];
163
+ /** Cancels dialing and the in-flight pairing frame exchange. */
164
+ signal?: AbortSignal;
163
165
  }
164
166
  export interface SyncProgress {
165
167
  passes: number;
@@ -251,10 +253,10 @@ export interface CloudDeviceClient {
251
253
  rpcMethodScope: DeviceConnectionGrantStringScope;
252
254
  conversationScope: DeviceConnectionGrantStringScope;
253
255
  definitionScope: DeviceConnectionGrantStringScope;
254
- }, signal?: AbortSignal): Promise<DeviceConnectionGrant>;
256
+ }, signal?: AbortSignal, fence?: DeviceCloudCommitFence): Promise<DeviceConnectionGrant>;
255
257
  createRelayReservation(input: {
256
258
  peerId: string;
257
- }, signal?: AbortSignal): Promise<DeviceRelayReservationToken>;
259
+ }, signal?: AbortSignal, fence?: DeviceCloudCommitFence): Promise<DeviceRelayReservationToken>;
258
260
  createBindingNonce(signal?: AbortSignal): Promise<{
259
261
  nonce: string;
260
262
  accountId: string;