@copilotkitnext/core 1.54.0 → 1.54.1-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1309 -183
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +495 -15
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +495 -15
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1301 -198
- package/dist/index.mjs.map +1 -1
- package/dist/index.umd.js +1400 -206
- package/dist/index.umd.js.map +1 -1
- package/package.json +4 -4
package/dist/index.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.js","names":["EMPTY","HttpAgent","HttpAgent","HttpAgent","AbstractAgent","AG_UI_CHANNEL_EVENT","EventType","Observable","Socket"],"sources":["../src/agent.ts","../src/core/agent-registry.ts","../src/core/context-store.ts","../src/core/suggestion-engine.ts","../src/core/run-handler.ts","../src/core/state-manager.ts","../src/core/core.ts","../src/types.ts","../src/utils/markdown.ts","../src/intelligence-agent.ts"],"sourcesContent":["import {\n BaseEvent,\n HttpAgent,\n HttpAgentConfig,\n RunAgentInput,\n runHttpRequest,\n transformHttpEventStream,\n} from \"@ag-ui/client\";\nimport { Observable, EMPTY } from \"rxjs\";\nimport { catchError } from \"rxjs/operators\";\nimport { CopilotRuntimeTransport } from \"./types\";\n\n/**\n * Check if an error is a ZodError (validation error).\n * These can occur when the SSE stream is aborted/truncated mid-event.\n */\nfunction isZodError(error: unknown): boolean {\n return (\n error !== null &&\n typeof error === \"object\" &&\n \"name\" in error &&\n (error as { name: string }).name === \"ZodError\"\n );\n}\n\n/**\n * Wrap an Observable to catch and suppress ZodErrors that occur during stream abort.\n * These errors are expected when the connection is cancelled mid-stream.\n */\nfunction withAbortErrorHandling(\n observable: Observable<BaseEvent>,\n): Observable<BaseEvent> {\n return observable.pipe(\n catchError((error) => {\n if (isZodError(error)) {\n // Suppress ZodErrors - these occur when the stream is aborted mid-event\n // and the parser receives incomplete data\n return EMPTY;\n }\n // Re-throw other errors\n throw error;\n }),\n );\n}\n\nexport interface ProxiedCopilotRuntimeAgentConfig extends Omit<\n HttpAgentConfig,\n \"url\"\n> {\n runtimeUrl?: string;\n transport?: CopilotRuntimeTransport;\n credentials?: RequestCredentials;\n}\n\nexport class ProxiedCopilotRuntimeAgent extends HttpAgent {\n runtimeUrl?: string;\n credentials?: RequestCredentials;\n private transport: CopilotRuntimeTransport;\n private singleEndpointUrl?: string;\n\n constructor(config: ProxiedCopilotRuntimeAgentConfig) {\n const normalizedRuntimeUrl = config.runtimeUrl\n ? config.runtimeUrl.replace(/\\/$/, \"\")\n : undefined;\n const transport = config.transport ?? \"rest\";\n const runUrl =\n transport === \"single\"\n ? (normalizedRuntimeUrl ?? config.runtimeUrl ?? \"\")\n : `${normalizedRuntimeUrl ?? config.runtimeUrl}/agent/${encodeURIComponent(config.agentId ?? \"\")}/run`;\n\n if (!runUrl) {\n throw new Error(\n \"ProxiedCopilotRuntimeAgent requires a runtimeUrl when transport is set to 'single'.\",\n );\n }\n\n super({\n ...config,\n url: runUrl,\n });\n this.runtimeUrl = normalizedRuntimeUrl ?? config.runtimeUrl;\n this.credentials = config.credentials;\n this.transport = transport;\n if (this.transport === \"single\") {\n this.singleEndpointUrl = this.runtimeUrl;\n }\n }\n\n abortRun(): void {\n if (!this.agentId || !this.threadId) {\n return;\n }\n\n if (typeof fetch === \"undefined\") {\n return;\n }\n\n if (this.transport === \"single\") {\n if (!this.singleEndpointUrl) {\n return;\n }\n\n const headers = new Headers({\n ...this.headers,\n \"Content-Type\": \"application/json\",\n });\n void fetch(this.singleEndpointUrl, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n method: \"agent/stop\",\n params: {\n agentId: this.agentId,\n threadId: this.threadId,\n },\n }),\n ...(this.credentials ? { credentials: this.credentials } : {}),\n }).catch((error) => {\n console.error(\"ProxiedCopilotRuntimeAgent: stop request failed\", error);\n });\n return;\n }\n\n if (!this.runtimeUrl) {\n return;\n }\n\n const stopPath = `${this.runtimeUrl}/agent/${encodeURIComponent(this.agentId)}/stop/${encodeURIComponent(this.threadId)}`;\n const origin =\n typeof window !== \"undefined\" && window.location\n ? window.location.origin\n : \"http://localhost\";\n const base = new URL(this.runtimeUrl, origin);\n const stopUrl = new URL(stopPath, base);\n\n void fetch(stopUrl.toString(), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.headers,\n },\n ...(this.credentials ? { credentials: this.credentials } : {}),\n }).catch((error) => {\n console.error(\"ProxiedCopilotRuntimeAgent: stop request failed\", error);\n });\n }\n\n connect(input: RunAgentInput): Observable<BaseEvent> {\n if (this.transport === \"single\") {\n if (!this.singleEndpointUrl) {\n throw new Error(\"Single endpoint transport requires a runtimeUrl\");\n }\n\n const requestInit = this.createSingleRouteRequestInit(\n input,\n \"agent/connect\",\n {\n agentId: this.agentId!,\n },\n );\n const httpEvents = runHttpRequest(this.singleEndpointUrl, requestInit);\n return withAbortErrorHandling(transformHttpEventStream(httpEvents));\n }\n\n const httpEvents = runHttpRequest(\n `${this.runtimeUrl}/agent/${this.agentId}/connect`,\n this.requestInit(input),\n );\n return withAbortErrorHandling(transformHttpEventStream(httpEvents));\n }\n\n public run(input: RunAgentInput): Observable<BaseEvent> {\n if (this.transport === \"single\") {\n if (!this.singleEndpointUrl) {\n throw new Error(\"Single endpoint transport requires a runtimeUrl\");\n }\n\n const requestInit = this.createSingleRouteRequestInit(\n input,\n \"agent/run\",\n {\n agentId: this.agentId!,\n },\n );\n const httpEvents = runHttpRequest(this.singleEndpointUrl, requestInit);\n return withAbortErrorHandling(transformHttpEventStream(httpEvents));\n }\n\n // Wrap the parent's Observable with error handling for abort scenarios\n return withAbortErrorHandling(super.run(input));\n }\n\n public override clone(): ProxiedCopilotRuntimeAgent {\n const cloned = super.clone() as ProxiedCopilotRuntimeAgent;\n cloned.runtimeUrl = this.runtimeUrl;\n cloned.credentials = this.credentials;\n cloned.transport = this.transport;\n cloned.singleEndpointUrl = this.singleEndpointUrl;\n return cloned;\n }\n\n private createSingleRouteRequestInit(\n input: RunAgentInput,\n method: string,\n params?: Record<string, string>,\n ): RequestInit {\n if (!this.agentId) {\n throw new Error(\n \"ProxiedCopilotRuntimeAgent requires agentId to make runtime requests\",\n );\n }\n\n const baseInit = super.requestInit(input);\n const headers = new Headers(baseInit.headers ?? {});\n headers.set(\"Content-Type\", \"application/json\");\n headers.set(\"Accept\", headers.get(\"Accept\") ?? \"text/event-stream\");\n\n let originalBody: unknown = undefined;\n if (typeof baseInit.body === \"string\") {\n try {\n originalBody = JSON.parse(baseInit.body);\n } catch (error) {\n console.warn(\n \"ProxiedCopilotRuntimeAgent: failed to parse request body for single route transport\",\n error,\n );\n originalBody = undefined;\n }\n }\n\n const envelope: Record<string, unknown> = {\n method,\n };\n\n if (params && Object.keys(params).length > 0) {\n envelope.params = params;\n }\n\n if (originalBody !== undefined) {\n envelope.body = originalBody;\n }\n\n return {\n ...baseInit,\n headers,\n body: JSON.stringify(envelope),\n ...(this.credentials ? { credentials: this.credentials } : {}),\n };\n }\n}\n","import { AbstractAgent, HttpAgent } from \"@ag-ui/client\";\nimport { logger, RuntimeInfo, AgentDescription } from \"@copilotkitnext/shared\";\nimport { ProxiedCopilotRuntimeAgent } from \"../agent\";\nimport type { CopilotKitCore } from \"./core\";\nimport {\n CopilotKitCoreErrorCode,\n CopilotKitCoreRuntimeConnectionStatus,\n CopilotKitCoreFriendsAccess,\n} from \"./core\";\nimport { CopilotRuntimeTransport } from \"../types\";\n\nexport interface CopilotKitCoreAddAgentParams {\n id: string;\n agent: AbstractAgent;\n}\n\n/**\n * Manages agent registration, lifecycle, and runtime connectivity for CopilotKitCore.\n * Handles both local development agents and remote runtime agents.\n */\nexport class AgentRegistry {\n private _agents: Record<string, AbstractAgent> = {};\n private localAgents: Record<string, AbstractAgent> = {};\n private remoteAgents: Record<string, AbstractAgent> = {};\n\n private _runtimeUrl?: string;\n private _runtimeVersion?: string;\n private _runtimeConnectionStatus: CopilotKitCoreRuntimeConnectionStatus =\n CopilotKitCoreRuntimeConnectionStatus.Disconnected;\n private _runtimeTransport: CopilotRuntimeTransport = \"rest\";\n private _audioFileTranscriptionEnabled: boolean = false;\n private _a2uiEnabled: boolean = false;\n\n constructor(private core: CopilotKitCore) {}\n\n /**\n * Get all agents as a readonly record\n */\n get agents(): Readonly<Record<string, AbstractAgent>> {\n return this._agents;\n }\n\n get runtimeUrl(): string | undefined {\n return this._runtimeUrl;\n }\n\n get runtimeVersion(): string | undefined {\n return this._runtimeVersion;\n }\n\n get runtimeConnectionStatus(): CopilotKitCoreRuntimeConnectionStatus {\n return this._runtimeConnectionStatus;\n }\n\n get runtimeTransport(): CopilotRuntimeTransport {\n return this._runtimeTransport;\n }\n\n get audioFileTranscriptionEnabled(): boolean {\n return this._audioFileTranscriptionEnabled;\n }\n\n get a2uiEnabled(): boolean {\n return this._a2uiEnabled;\n }\n\n /**\n * Initialize agents from configuration\n */\n initialize(agents: Record<string, AbstractAgent>): void {\n this.localAgents = this.assignAgentIds(agents);\n this.applyHeadersToAgents(this.localAgents);\n this._agents = this.localAgents;\n }\n\n /**\n * Set the runtime URL and update connection\n */\n setRuntimeUrl(runtimeUrl: string | undefined): void {\n const normalizedRuntimeUrl = runtimeUrl\n ? runtimeUrl.replace(/\\/$/, \"\")\n : undefined;\n\n if (this._runtimeUrl === normalizedRuntimeUrl) {\n return;\n }\n\n this._runtimeUrl = normalizedRuntimeUrl;\n void this.updateRuntimeConnection();\n }\n\n setRuntimeTransport(runtimeTransport: CopilotRuntimeTransport): void {\n if (this._runtimeTransport === runtimeTransport) {\n return;\n }\n\n this._runtimeTransport = runtimeTransport;\n void this.updateRuntimeConnection();\n }\n\n /**\n * Set all agents at once (for development use)\n */\n setAgents__unsafe_dev_only(agents: Record<string, AbstractAgent>): void {\n // Validate all agents before making any changes\n Object.entries(agents).forEach(([id, agent]) => {\n if (agent) {\n this.validateAndAssignAgentId(id, agent);\n }\n });\n this.localAgents = agents;\n this._agents = { ...this.localAgents, ...this.remoteAgents };\n this.applyHeadersToAgents(this._agents);\n void this.notifyAgentsChanged();\n }\n\n /**\n * Add a single agent (for development use)\n */\n addAgent__unsafe_dev_only({ id, agent }: CopilotKitCoreAddAgentParams): void {\n this.validateAndAssignAgentId(id, agent);\n this.localAgents[id] = agent;\n this.applyHeadersToAgent(agent);\n this._agents = { ...this.localAgents, ...this.remoteAgents };\n void this.notifyAgentsChanged();\n }\n\n /**\n * Remove an agent by ID (for development use)\n */\n removeAgent__unsafe_dev_only(id: string): void {\n delete this.localAgents[id];\n this._agents = { ...this.localAgents, ...this.remoteAgents };\n void this.notifyAgentsChanged();\n }\n\n /**\n * Get an agent by ID\n */\n getAgent(id: string): AbstractAgent | undefined {\n if (id in this._agents) {\n return this._agents[id] as AbstractAgent;\n }\n\n // Silently return undefined if we're still loading runtime agents\n if (\n this.runtimeUrl !== undefined &&\n (this.runtimeConnectionStatus ===\n CopilotKitCoreRuntimeConnectionStatus.Disconnected ||\n this.runtimeConnectionStatus ===\n CopilotKitCoreRuntimeConnectionStatus.Connecting)\n ) {\n return undefined;\n }\n\n console.warn(`Agent ${id} not found`);\n return undefined;\n }\n\n /**\n * Apply current headers to an agent\n */\n applyHeadersToAgent(agent: AbstractAgent): void {\n if (agent instanceof HttpAgent) {\n agent.headers = {\n ...(this.core as unknown as CopilotKitCoreFriendsAccess).headers,\n };\n }\n }\n\n /**\n * Apply current headers to all agents\n */\n applyHeadersToAgents(agents: Record<string, AbstractAgent>): void {\n Object.values(agents).forEach((agent) => {\n this.applyHeadersToAgent(agent);\n });\n }\n\n /**\n * Apply current credentials to an agent\n */\n applyCredentialsToAgent(agent: AbstractAgent): void {\n if (agent instanceof ProxiedCopilotRuntimeAgent) {\n agent.credentials = (\n this.core as unknown as CopilotKitCoreFriendsAccess\n ).credentials;\n }\n }\n\n /**\n * Apply current credentials to all agents\n */\n applyCredentialsToAgents(agents: Record<string, AbstractAgent>): void {\n Object.values(agents).forEach((agent) => {\n this.applyCredentialsToAgent(agent);\n });\n }\n\n /**\n * Update runtime connection and fetch remote agents\n */\n private async updateRuntimeConnection(): Promise<void> {\n // Skip fetching on the server (SSR)\n if (typeof window === \"undefined\") {\n return;\n }\n\n if (!this.runtimeUrl) {\n this._runtimeConnectionStatus =\n CopilotKitCoreRuntimeConnectionStatus.Disconnected;\n this._runtimeVersion = undefined;\n this._audioFileTranscriptionEnabled = false;\n this._a2uiEnabled = false;\n this.remoteAgents = {};\n this._agents = this.localAgents;\n\n await this.notifyRuntimeStatusChanged(\n CopilotKitCoreRuntimeConnectionStatus.Disconnected,\n );\n await this.notifyAgentsChanged();\n return;\n }\n\n this._runtimeConnectionStatus =\n CopilotKitCoreRuntimeConnectionStatus.Connecting;\n await this.notifyRuntimeStatusChanged(\n CopilotKitCoreRuntimeConnectionStatus.Connecting,\n );\n\n try {\n const runtimeInfoResponse = await this.fetchRuntimeInfo();\n const {\n version,\n ...runtimeInfo\n }: {\n agents: Record<string, AgentDescription>;\n version: string;\n } = runtimeInfoResponse;\n\n const credentials = (this.core as unknown as CopilotKitCoreFriendsAccess)\n .credentials;\n const agents: Record<string, AbstractAgent> = Object.fromEntries(\n Object.entries(runtimeInfo.agents).map(([id, { description }]) => {\n const agent = new ProxiedCopilotRuntimeAgent({\n runtimeUrl: this.runtimeUrl,\n agentId: id, // Runtime agents always have their ID set correctly\n description: description,\n transport: this._runtimeTransport,\n credentials,\n });\n this.applyHeadersToAgent(agent);\n return [id, agent];\n }),\n );\n\n this.remoteAgents = agents;\n this._agents = { ...this.localAgents, ...this.remoteAgents };\n this._runtimeConnectionStatus =\n CopilotKitCoreRuntimeConnectionStatus.Connected;\n this._runtimeVersion = version;\n this._audioFileTranscriptionEnabled =\n runtimeInfoResponse.audioFileTranscriptionEnabled ?? false;\n this._a2uiEnabled = runtimeInfoResponse.a2uiEnabled ?? false;\n\n await this.notifyRuntimeStatusChanged(\n CopilotKitCoreRuntimeConnectionStatus.Connected,\n );\n await this.notifyAgentsChanged();\n } catch (error) {\n this._runtimeConnectionStatus =\n CopilotKitCoreRuntimeConnectionStatus.Error;\n this._runtimeVersion = undefined;\n this._audioFileTranscriptionEnabled = false;\n this._a2uiEnabled = false;\n this.remoteAgents = {};\n this._agents = this.localAgents;\n\n await this.notifyRuntimeStatusChanged(\n CopilotKitCoreRuntimeConnectionStatus.Error,\n );\n await this.notifyAgentsChanged();\n\n const message =\n error instanceof Error ? error.message : JSON.stringify(error);\n logger.warn(\n `Failed to load runtime info (${this.runtimeUrl}/info): ${message}`,\n );\n const runtimeError =\n error instanceof Error ? error : new Error(String(error));\n await (this.core as unknown as CopilotKitCoreFriendsAccess).emitError({\n error: runtimeError,\n code: CopilotKitCoreErrorCode.RUNTIME_INFO_FETCH_FAILED,\n context: {\n runtimeUrl: this.runtimeUrl,\n },\n });\n }\n }\n\n private async fetchRuntimeInfo(): Promise<RuntimeInfo> {\n if (!this.runtimeUrl) {\n throw new Error(\"Runtime URL is not set\");\n }\n\n const baseHeaders = (this.core as unknown as CopilotKitCoreFriendsAccess)\n .headers;\n const credentials = (this.core as unknown as CopilotKitCoreFriendsAccess)\n .credentials;\n const headers: Record<string, string> = {\n ...baseHeaders,\n };\n\n if (this._runtimeTransport === \"single\") {\n if (!headers[\"Content-Type\"]) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n const response = await fetch(this.runtimeUrl, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ method: \"info\" }),\n ...(credentials ? { credentials } : {}),\n });\n if (\"ok\" in response && !(response as Response).ok) {\n throw new Error(\n `Runtime info request failed with status ${response.status}`,\n );\n }\n return (await response.json()) as RuntimeInfo;\n }\n\n const response = await fetch(`${this.runtimeUrl}/info`, {\n headers,\n ...(credentials ? { credentials } : {}),\n });\n if (\"ok\" in response && !(response as Response).ok) {\n throw new Error(\n `Runtime info request failed with status ${response.status}`,\n );\n }\n return (await response.json()) as RuntimeInfo;\n }\n\n /**\n * Assign agent IDs to a record of agents\n */\n private assignAgentIds(\n agents: Record<string, AbstractAgent>,\n ): Record<string, AbstractAgent> {\n Object.entries(agents).forEach(([id, agent]) => {\n if (agent) {\n this.validateAndAssignAgentId(id, agent);\n }\n });\n return agents;\n }\n\n /**\n * Validate and assign an agent ID\n */\n private validateAndAssignAgentId(\n registrationId: string,\n agent: AbstractAgent,\n ): void {\n if (agent.agentId && agent.agentId !== registrationId) {\n throw new Error(\n `Agent registration mismatch: Agent with ID \"${agent.agentId}\" cannot be registered under key \"${registrationId}\". ` +\n `The agent ID must match the registration key or be undefined.`,\n );\n }\n if (!agent.agentId) {\n agent.agentId = registrationId;\n }\n }\n\n /**\n * Notify subscribers of runtime status changes\n */\n private async notifyRuntimeStatusChanged(\n status: CopilotKitCoreRuntimeConnectionStatus,\n ): Promise<void> {\n await (\n this.core as unknown as CopilotKitCoreFriendsAccess\n ).notifySubscribers(\n (subscriber) =>\n subscriber.onRuntimeConnectionStatusChanged?.({\n copilotkit: this.core,\n status,\n }),\n \"Error in CopilotKitCore subscriber (onRuntimeConnectionStatusChanged):\",\n );\n }\n\n /**\n * Notify subscribers of agent changes\n */\n private async notifyAgentsChanged(): Promise<void> {\n await (\n this.core as unknown as CopilotKitCoreFriendsAccess\n ).notifySubscribers(\n (subscriber) =>\n subscriber.onAgentsChanged?.({\n copilotkit: this.core,\n agents: this._agents,\n }),\n \"Subscriber onAgentsChanged error:\",\n );\n }\n}\n","import { Context } from \"@ag-ui/client\";\nimport { randomUUID } from \"@copilotkitnext/shared\";\nimport type { CopilotKitCore } from \"./core\";\nimport { CopilotKitCoreFriendsAccess } from \"./core\";\n\n/**\n * Manages context storage and lifecycle for CopilotKitCore.\n * Context represents additional information available to agents during execution.\n */\nexport class ContextStore {\n private _context: Record<string, Context> = {};\n\n constructor(private core: CopilotKitCore) {}\n\n /**\n * Get all context entries as a readonly record\n */\n get context(): Readonly<Record<string, Context>> {\n return this._context;\n }\n\n /**\n * Add a new context entry\n * @returns The ID of the created context entry\n */\n addContext({ description, value }: Context): string {\n const id = randomUUID();\n this._context[id] = { description, value };\n void this.notifySubscribers();\n return id;\n }\n\n /**\n * Remove a context entry by ID\n */\n removeContext(id: string): void {\n delete this._context[id];\n void this.notifySubscribers();\n }\n\n /**\n * Notify all subscribers of context changes\n */\n private async notifySubscribers(): Promise<void> {\n await (\n this.core as unknown as CopilotKitCoreFriendsAccess\n ).notifySubscribers(\n (subscriber) =>\n subscriber.onContextChanged?.({\n copilotkit: this.core,\n context: this._context,\n }),\n \"Subscriber onContextChanged error:\",\n );\n }\n}\n","import { AbstractAgent, Message, Tool, Context } from \"@ag-ui/client\";\nimport { randomUUID, partialJSONParse } from \"@copilotkitnext/shared\";\nimport type { CopilotKitCore } from \"./core\";\nimport type { CopilotKitCoreGetSuggestionsResult } from \"./core\";\nimport { CopilotKitCoreFriendsAccess } from \"./core\";\nimport {\n DynamicSuggestionsConfig,\n StaticSuggestionsConfig,\n Suggestion,\n SuggestionsConfig,\n} from \"../types\";\n\n/**\n * Manages suggestion generation, streaming, and lifecycle for CopilotKitCore.\n * Handles both dynamic (AI-generated) and static suggestions.\n */\nexport class SuggestionEngine {\n private _suggestionsConfig: Record<string, SuggestionsConfig> = {};\n private _suggestions: Record<string, Record<string, Suggestion[]>> = {};\n private _runningSuggestions: Record<string, AbstractAgent[]> = {};\n\n constructor(private core: CopilotKitCore) {}\n\n /**\n * Initialize with suggestion configs\n */\n initialize(suggestionsConfig: SuggestionsConfig[]): void {\n for (const config of suggestionsConfig) {\n this._suggestionsConfig[randomUUID()] = config;\n }\n }\n\n /**\n * Add a suggestion configuration\n * @returns The ID of the created config\n */\n addSuggestionsConfig(config: SuggestionsConfig): string {\n const id = randomUUID();\n this._suggestionsConfig[id] = config;\n void this.notifySuggestionsConfigChanged();\n return id;\n }\n\n /**\n * Remove a suggestion configuration by ID\n */\n removeSuggestionsConfig(id: string): void {\n delete this._suggestionsConfig[id];\n void this.notifySuggestionsConfigChanged();\n }\n\n /**\n * Reload suggestions for a specific agent\n * This triggers generation of new suggestions based on current configs\n */\n public reloadSuggestions(agentId: string): void {\n this.clearSuggestions(agentId);\n\n // Get agent to check message count for availability filtering\n const agent = (\n this.core as unknown as CopilotKitCoreFriendsAccess\n ).getAgent(agentId);\n if (!agent) {\n return;\n }\n\n const messageCount = agent.messages?.length ?? 0;\n let hasAnySuggestions = false;\n\n for (const config of Object.values(this._suggestionsConfig)) {\n // Check if config applies to this agent\n if (\n config.consumerAgentId !== undefined &&\n config.consumerAgentId !== \"*\" &&\n config.consumerAgentId !== agentId\n ) {\n continue;\n }\n\n // Check availability based on message count\n if (!this.shouldShowSuggestions(config, messageCount)) {\n continue;\n }\n\n const suggestionId = randomUUID();\n\n if (isDynamicSuggestionsConfig(config)) {\n if (!hasAnySuggestions) {\n hasAnySuggestions = true;\n void this.notifySuggestionsStartedLoading(agentId);\n }\n void this.generateSuggestions(suggestionId, config, agentId);\n } else if (isStaticSuggestionsConfig(config)) {\n this.addStaticSuggestions(suggestionId, config, agentId);\n }\n }\n }\n\n /**\n * Clear all suggestions for a specific agent\n */\n public clearSuggestions(agentId: string): void {\n const runningAgents = this._runningSuggestions[agentId];\n if (runningAgents) {\n for (const agent of runningAgents) {\n agent.abortRun();\n }\n delete this._runningSuggestions[agentId];\n }\n this._suggestions[agentId] = {};\n\n void this.notifySuggestionsChanged(agentId, []);\n }\n\n /**\n * Get current suggestions for an agent\n */\n public getSuggestions(agentId: string): CopilotKitCoreGetSuggestionsResult {\n const suggestions = Object.values(this._suggestions[agentId] ?? {}).flat();\n const isLoading = (this._runningSuggestions[agentId]?.length ?? 0) > 0;\n return { suggestions, isLoading };\n }\n\n /**\n * Generate suggestions using a provider agent\n */\n private async generateSuggestions(\n suggestionId: string,\n config: DynamicSuggestionsConfig,\n consumerAgentId: string,\n ): Promise<void> {\n let agent: AbstractAgent | undefined = undefined;\n try {\n const suggestionsProviderAgent = (\n this.core as unknown as CopilotKitCoreFriendsAccess\n ).getAgent(config.providerAgentId ?? \"default\");\n if (!suggestionsProviderAgent) {\n throw new Error(\n `Suggestions provider agent not found: ${config.providerAgentId}`,\n );\n }\n const suggestionsConsumerAgent = (\n this.core as unknown as CopilotKitCoreFriendsAccess\n ).getAgent(consumerAgentId);\n if (!suggestionsConsumerAgent) {\n throw new Error(\n `Suggestions consumer agent not found: ${consumerAgentId}`,\n );\n }\n\n const clonedAgent: AbstractAgent = suggestionsProviderAgent.clone();\n agent = clonedAgent;\n //agent.agentId = suggestionId;\n agent.threadId = suggestionId;\n agent.messages = JSON.parse(\n JSON.stringify(suggestionsConsumerAgent.messages),\n );\n agent.state = JSON.parse(JSON.stringify(suggestionsConsumerAgent.state));\n\n // Initialize suggestion storage for this agent/suggestion combo\n this._suggestions[consumerAgentId] = {\n ...(this._suggestions[consumerAgentId] ?? {}),\n [suggestionId]: [],\n };\n this._runningSuggestions[consumerAgentId] = [\n ...(this._runningSuggestions[consumerAgentId] ?? []),\n agent,\n ];\n\n agent.addMessage({\n id: suggestionId,\n role: \"user\",\n content: [\n `Suggest what the user could say next. Provide clear, highly relevant suggestions by calling the \\`copilotkitSuggest\\` tool.`,\n `Provide at least ${config.minSuggestions ?? 1} and at most ${config.maxSuggestions ?? 3} suggestions.`,\n `The user has the following tools available: ${JSON.stringify((this.core as unknown as CopilotKitCoreFriendsAccess).buildFrontendTools(consumerAgentId))}.`,\n ` ${config.instructions}`,\n ].join(\"\\n\"),\n });\n\n await agent.runAgent(\n {\n context: Object.values(\n (this.core as unknown as CopilotKitCoreFriendsAccess).context,\n ),\n forwardedProps: {\n ...(this.core as unknown as CopilotKitCoreFriendsAccess).properties,\n toolChoice: {\n type: \"function\",\n function: { name: \"copilotkitSuggest\" },\n },\n },\n tools: [SUGGEST_TOOL],\n },\n {\n onMessagesChanged: ({ messages }: { messages: Message[] }) => {\n this.extractSuggestions(\n messages,\n suggestionId,\n consumerAgentId,\n true,\n );\n },\n },\n );\n } catch (error) {\n console.warn(\"Error generating suggestions:\", error);\n } finally {\n // Finalize suggestions by marking them as no longer loading\n this.finalizeSuggestions(suggestionId, consumerAgentId);\n\n // Remove this agent from running suggestions\n const runningAgents = this._runningSuggestions[consumerAgentId];\n if (agent && runningAgents) {\n const filteredAgents = runningAgents.filter((a) => a !== agent);\n this._runningSuggestions[consumerAgentId] = filteredAgents;\n\n // If no more suggestions are running, emit loading end event\n if (filteredAgents.length === 0) {\n delete this._runningSuggestions[consumerAgentId];\n await this.notifySuggestionsFinishedLoading(consumerAgentId);\n }\n }\n }\n }\n\n /**\n * Finalize suggestions by marking them as no longer loading\n */\n private finalizeSuggestions(\n suggestionId: string,\n consumerAgentId: string,\n ): void {\n const agentSuggestions = this._suggestions[consumerAgentId];\n const currentSuggestions = agentSuggestions?.[suggestionId];\n\n if (\n agentSuggestions &&\n currentSuggestions &&\n currentSuggestions.length > 0\n ) {\n // Filter out empty suggestions and mark remaining as no longer loading\n const finalizedSuggestions = currentSuggestions\n .filter(\n (suggestion) => suggestion.title !== \"\" || suggestion.message !== \"\",\n )\n .map((suggestion) => ({\n ...suggestion,\n isLoading: false,\n }));\n\n if (finalizedSuggestions.length > 0) {\n agentSuggestions[suggestionId] = finalizedSuggestions;\n } else {\n delete agentSuggestions[suggestionId];\n }\n\n // Get all aggregated suggestions for this agent\n const allSuggestions = Object.values(\n this._suggestions[consumerAgentId] ?? {},\n ).flat();\n\n void this.notifySuggestionsChanged(\n consumerAgentId,\n allSuggestions,\n \"finalized\",\n );\n }\n }\n\n /**\n * Extract suggestions from messages (called during streaming)\n */\n extractSuggestions(\n messages: Message[],\n suggestionId: string,\n consumerAgentId: string,\n isRunning: boolean,\n ): void {\n const idx = messages.findIndex((message) => message.id === suggestionId);\n if (idx == -1) {\n return;\n }\n\n const suggestions: Suggestion[] = [];\n const newMessages = messages.slice(idx + 1);\n\n for (const message of newMessages) {\n if (message.role === \"assistant\" && message.toolCalls) {\n for (const toolCall of message.toolCalls) {\n if (toolCall.function.name === \"copilotkitSuggest\") {\n // Join all argument chunks into a single string for parsing\n // arguments can be either a string or an array of strings\n const fullArgs = Array.isArray(toolCall.function.arguments)\n ? toolCall.function.arguments.join(\"\")\n : toolCall.function.arguments;\n const parsed = partialJSONParse(fullArgs);\n if (\n parsed &&\n typeof parsed === \"object\" &&\n \"suggestions\" in parsed\n ) {\n const parsedSuggestions = (parsed as any).suggestions;\n if (Array.isArray(parsedSuggestions)) {\n for (const item of parsedSuggestions) {\n if (item && typeof item === \"object\" && \"title\" in item) {\n suggestions.push({\n title: item.title ?? \"\",\n message: item.message ?? \"\",\n isLoading: false, // Will be set correctly below\n });\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Set isLoading for the last suggestion if still running\n if (isRunning && suggestions.length > 0) {\n suggestions[suggestions.length - 1]!.isLoading = true;\n }\n\n const agentSuggestions = this._suggestions[consumerAgentId];\n if (agentSuggestions) {\n agentSuggestions[suggestionId] = suggestions;\n\n // Get all aggregated suggestions for this agent\n const allSuggestions = Object.values(\n this._suggestions[consumerAgentId] ?? {},\n ).flat();\n\n void this.notifySuggestionsChanged(\n consumerAgentId,\n allSuggestions,\n \"suggestions changed\",\n );\n }\n }\n\n /**\n * Notify subscribers of suggestions config changes\n */\n private async notifySuggestionsConfigChanged(): Promise<void> {\n await (\n this.core as unknown as CopilotKitCoreFriendsAccess\n ).notifySubscribers(\n (subscriber) =>\n subscriber.onSuggestionsConfigChanged?.({\n copilotkit: this.core,\n suggestionsConfig: this._suggestionsConfig,\n }),\n \"Subscriber onSuggestionsConfigChanged error:\",\n );\n }\n\n /**\n * Notify subscribers of suggestions changes\n */\n private async notifySuggestionsChanged(\n agentId: string,\n suggestions: Suggestion[],\n context: string = \"\",\n ): Promise<void> {\n await (\n this.core as unknown as CopilotKitCoreFriendsAccess\n ).notifySubscribers(\n (subscriber) =>\n subscriber.onSuggestionsChanged?.({\n copilotkit: this.core,\n agentId,\n suggestions,\n }),\n `Subscriber onSuggestionsChanged error: ${context}`,\n );\n }\n\n /**\n * Notify subscribers that suggestions started loading\n */\n private async notifySuggestionsStartedLoading(\n agentId: string,\n ): Promise<void> {\n await (\n this.core as unknown as CopilotKitCoreFriendsAccess\n ).notifySubscribers(\n (subscriber) =>\n subscriber.onSuggestionsStartedLoading?.({\n copilotkit: this.core,\n agentId,\n }),\n \"Subscriber onSuggestionsStartedLoading error:\",\n );\n }\n\n /**\n * Notify subscribers that suggestions finished loading\n */\n private async notifySuggestionsFinishedLoading(\n agentId: string,\n ): Promise<void> {\n await (\n this.core as unknown as CopilotKitCoreFriendsAccess\n ).notifySubscribers(\n (subscriber) =>\n subscriber.onSuggestionsFinishedLoading?.({\n copilotkit: this.core,\n agentId,\n }),\n \"Subscriber onSuggestionsFinishedLoading error:\",\n );\n }\n\n /**\n * Check if suggestions should be shown based on availability and message count\n */\n private shouldShowSuggestions(\n config: SuggestionsConfig,\n messageCount: number,\n ): boolean {\n const availability = config.available;\n\n // Default behavior if no availability specified\n if (!availability) {\n if (isDynamicSuggestionsConfig(config)) {\n return messageCount > 0; // Default: after-first-message\n } else {\n return messageCount === 0; // Default: before-first-message\n }\n }\n\n switch (availability) {\n case \"disabled\":\n return false;\n case \"before-first-message\":\n return messageCount === 0;\n case \"after-first-message\":\n return messageCount > 0;\n case \"always\":\n return true;\n default:\n return false;\n }\n }\n\n /**\n * Add static suggestions directly without AI generation\n */\n private addStaticSuggestions(\n suggestionId: string,\n config: StaticSuggestionsConfig,\n consumerAgentId: string,\n ): void {\n // Mark all as not loading since they're static\n const suggestions = config.suggestions.map((s) => ({\n ...s,\n isLoading: false,\n }));\n\n // Store suggestions\n this._suggestions[consumerAgentId] = {\n ...(this._suggestions[consumerAgentId] ?? {}),\n [suggestionId]: suggestions,\n };\n\n // Notify subscribers\n const allSuggestions = Object.values(\n this._suggestions[consumerAgentId] ?? {},\n ).flat();\n\n void this.notifySuggestionsChanged(\n consumerAgentId,\n allSuggestions,\n \"static suggestions added\",\n );\n }\n}\n\n/**\n * Type guard for dynamic suggestions config\n */\nfunction isDynamicSuggestionsConfig(\n config: SuggestionsConfig,\n): config is DynamicSuggestionsConfig {\n return \"instructions\" in config;\n}\n\n/**\n * Type guard for static suggestions config\n */\nfunction isStaticSuggestionsConfig(\n config: SuggestionsConfig,\n): config is StaticSuggestionsConfig {\n return \"suggestions\" in config;\n}\n\n/**\n * The tool definition for AI-generated suggestions\n */\nconst SUGGEST_TOOL: Tool = {\n name: \"copilotkitSuggest\",\n description: \"Suggest what the user could say next\",\n parameters: {\n type: \"object\",\n properties: {\n suggestions: {\n type: \"array\",\n description: \"List of suggestions shown to the user as buttons.\",\n items: {\n type: \"object\",\n properties: {\n title: {\n type: \"string\",\n description:\n \"The title of the suggestion. This is shown as a button and should be short.\",\n },\n message: {\n type: \"string\",\n description:\n \"The message to send when the suggestion is clicked. This should be a clear, complete sentence \" +\n \"and will be sent as an instruction to the AI.\",\n },\n },\n required: [\"title\", \"message\"],\n },\n },\n },\n required: [\"suggestions\"],\n },\n};\n","import {\n AbstractAgent,\n AgentSubscriber,\n HttpAgent,\n Message,\n RunAgentResult,\n Tool,\n} from \"@ag-ui/client\";\nimport { randomUUID, logger, schemaToJsonSchema } from \"@copilotkitnext/shared\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport type { CopilotKitCore, CopilotKitCoreFriendsAccess } from \"./core\";\nimport { CopilotKitCoreErrorCode } from \"./core\";\nimport type { FrontendTool } from \"../types\";\n\nexport interface CopilotKitCoreRunAgentParams {\n agent: AbstractAgent;\n forwardedProps?: Record<string, unknown>;\n}\n\nexport interface CopilotKitCoreConnectAgentParams {\n agent: AbstractAgent;\n}\n\nexport interface CopilotKitCoreGetToolParams {\n toolName: string;\n agentId?: string;\n}\n\n/**\n * Parameters for programmatic tool execution via `copilotkit.runTool()`.\n */\nexport interface CopilotKitCoreRunToolParams {\n /** Name of the registered frontend tool to execute. */\n name: string;\n /** Optional agent ID. If omitted, uses the default agent lookup. */\n agentId?: string;\n /** Parameters to pass to the tool handler. */\n parameters?: Record<string, unknown>;\n /**\n * Whether to trigger an LLM follow-up after tool execution.\n * - `false` (default): execute tool, add messages to history, done.\n * - `\"generate\"`: after execution, trigger another agent run so the LLM responds to the tool result.\n * - Any other string: add a user message with this text, then trigger another agent run.\n */\n followUp?: string | false;\n}\n\n/**\n * Result of programmatic tool execution via `copilotkit.runTool()`.\n */\nexport interface CopilotKitCoreRunToolResult {\n /** The unique ID of the tool call. */\n toolCallId: string;\n /** The stringified result from the tool handler. */\n result: string;\n /** Error message if the handler failed. */\n error?: string;\n}\n\n/**\n * Internal result from the shared tool handler execution logic.\n */\ninterface ExecuteToolHandlerResult {\n result: string;\n error?: string;\n isArgumentError: boolean;\n}\n\n/**\n * Handles agent execution, tool calling, and agent connectivity for CopilotKitCore.\n * Manages the complete lifecycle of agent runs including tool execution and follow-ups.\n */\nexport class RunHandler {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _tools: FrontendTool<any>[] = [];\n\n constructor(private core: CopilotKitCore) {}\n\n /**\n * Typed access to CopilotKitCore's internal (\"friend\") methods.\n * Centralises the single unavoidable cast so call-sites stay clean.\n */\n private get _internal(): CopilotKitCoreFriendsAccess {\n return this.core as unknown as CopilotKitCoreFriendsAccess;\n }\n\n /**\n * Get all tools as a readonly array\n */\n get tools(): Readonly<FrontendTool<any>[]> {\n return this._tools;\n }\n\n /**\n * Initialize with tools\n */\n initialize(tools: FrontendTool<any>[]): void {\n this._tools = tools;\n }\n\n /**\n * Add a tool to the registry\n */\n addTool<T extends Record<string, unknown> = Record<string, unknown>>(\n tool: FrontendTool<T>,\n ): void {\n // Check if a tool with the same name and agentId already exists\n const existingToolIndex = this._tools.findIndex(\n (t) => t.name === tool.name && t.agentId === tool.agentId,\n );\n\n if (existingToolIndex !== -1) {\n logger.warn(\n `Tool already exists: '${tool.name}' for agent '${tool.agentId || \"global\"}', skipping.`,\n );\n return;\n }\n\n this._tools.push(tool);\n }\n\n /**\n * Remove a tool by name and optionally by agentId\n */\n removeTool(id: string, agentId?: string): void {\n this._tools = this._tools.filter((tool) => {\n // Remove tool if both name and agentId match\n if (agentId !== undefined) {\n return !(tool.name === id && tool.agentId === agentId);\n }\n // If no agentId specified, only remove global tools with matching name\n return !(tool.name === id && !tool.agentId);\n });\n }\n\n /**\n * Get a tool by name and optionally by agentId.\n * If agentId is provided, it will first look for an agent-specific tool,\n * then fall back to a global tool with the same name.\n */\n getTool(params: CopilotKitCoreGetToolParams): FrontendTool<any> | undefined {\n const { toolName, agentId } = params;\n\n // If agentId is provided, first look for agent-specific tool\n if (agentId) {\n const agentTool = this._tools.find(\n (tool) => tool.name === toolName && tool.agentId === agentId,\n );\n if (agentTool) {\n return agentTool;\n }\n }\n\n // Fall back to global tool (no agentId)\n return this._tools.find((tool) => tool.name === toolName && !tool.agentId);\n }\n\n /**\n * Set all tools at once. Replaces existing tools.\n */\n setTools(tools: FrontendTool<any>[]): void {\n this._tools = [...tools];\n }\n\n /**\n * Connect an agent (establish initial connection)\n */\n async connectAgent({\n agent,\n }: CopilotKitCoreConnectAgentParams): Promise<RunAgentResult> {\n try {\n // Detach any active run before connecting to avoid previous runs interfering\n await agent.detachActiveRun();\n agent.setMessages([]);\n agent.setState({});\n\n if (agent instanceof HttpAgent) {\n agent.headers = {\n ...this._internal.headers,\n };\n }\n\n const runAgentResult = await agent.connectAgent(\n {\n forwardedProps: this._internal.properties,\n tools: this.buildFrontendTools(agent.agentId),\n context: Object.values(this._internal.context),\n },\n this.createAgentErrorSubscriber(agent),\n );\n\n return this.processAgentResult({ runAgentResult, agent });\n } catch (error) {\n const connectError =\n error instanceof Error ? error : new Error(String(error));\n const context: Record<string, any> = {};\n if (agent.agentId) {\n context.agentId = agent.agentId;\n }\n await this._internal.emitError({\n error: connectError,\n code: CopilotKitCoreErrorCode.AGENT_CONNECT_FAILED,\n context,\n });\n return { newMessages: [] };\n }\n }\n\n /**\n * Run an agent\n */\n async runAgent({\n agent,\n forwardedProps,\n }: CopilotKitCoreRunAgentParams): Promise<RunAgentResult> {\n // Agent ID is guaranteed to be set by validateAndAssignAgentId\n if (agent.agentId) {\n void this._internal.suggestionEngine.clearSuggestions(agent.agentId);\n }\n\n if (agent instanceof HttpAgent) {\n agent.headers = {\n ...this._internal.headers,\n };\n }\n\n try {\n const runAgentResult = await agent.runAgent(\n {\n forwardedProps: {\n ...this._internal.properties,\n ...forwardedProps,\n },\n tools: this.buildFrontendTools(agent.agentId),\n context: Object.values(this._internal.context),\n },\n this.createAgentErrorSubscriber(agent),\n );\n return this.processAgentResult({ runAgentResult, agent });\n } catch (error) {\n const runError =\n error instanceof Error ? error : new Error(String(error));\n const context: Record<string, any> = {};\n if (agent.agentId) {\n context.agentId = agent.agentId;\n }\n await this._internal.emitError({\n error: runError,\n code: CopilotKitCoreErrorCode.AGENT_RUN_FAILED,\n context,\n });\n return { newMessages: [] };\n }\n }\n\n /**\n * Process agent result and execute tools\n */\n private async processAgentResult({\n runAgentResult,\n agent,\n }: {\n runAgentResult: RunAgentResult;\n agent: AbstractAgent;\n }): Promise<RunAgentResult> {\n const { newMessages } = runAgentResult;\n // Agent ID is guaranteed to be set by validateAndAssignAgentId\n const agentId = agent.agentId!;\n\n let needsFollowUp = false;\n\n for (const message of newMessages) {\n if (message.role === \"assistant\") {\n for (const toolCall of message.toolCalls || []) {\n if (\n newMessages.findIndex(\n (m) => m.role === \"tool\" && m.toolCallId === toolCall.id,\n ) === -1\n ) {\n const tool = this.getTool({\n toolName: toolCall.function.name,\n agentId: agent.agentId,\n });\n if (tool) {\n const followUp = await this.executeSpecificTool(\n tool,\n toolCall,\n message,\n agent,\n agentId,\n );\n if (followUp) {\n needsFollowUp = true;\n }\n } else {\n // Wildcard fallback for undefined tools\n const wildcardTool = this.getTool({\n toolName: \"*\",\n agentId: agent.agentId,\n });\n if (wildcardTool) {\n const followUp = await this.executeWildcardTool(\n wildcardTool,\n toolCall,\n message,\n agent,\n agentId,\n );\n if (followUp) {\n needsFollowUp = true;\n }\n }\n }\n }\n }\n }\n }\n\n if (needsFollowUp) {\n // Yield to the framework scheduler before the follow-up run so that any\n // deferred state updates (e.g. React useEffect in useAgentContext) can\n // complete and write fresh values into the context store before runAgent\n // reads it. The base implementation is a no-op; React overrides this.\n await this._internal.waitForPendingFrameworkUpdates();\n return await this.runAgent({ agent });\n }\n\n void this._internal.suggestionEngine.reloadSuggestions(agentId);\n\n return runAgentResult;\n }\n\n /**\n * Shared handler execution logic used by executeSpecificTool, executeWildcardTool, and runTool.\n * Handles arg parsing, subscriber notifications, handler invocation, result stringification,\n * and error handling.\n */\n private async executeToolHandler({\n tool,\n toolCall,\n agent,\n agentId,\n handlerArgs,\n toolType,\n messageId,\n }: {\n tool: FrontendTool<any>;\n toolCall: { id: string; function: { name: string; arguments: string } };\n agent: AbstractAgent;\n agentId: string;\n handlerArgs: unknown;\n toolType: string;\n messageId?: string;\n }): Promise<ExecuteToolHandlerResult> {\n let toolCallResult = \"\";\n let errorMessage: string | undefined;\n let isArgumentError = false;\n\n let parsedArgs: unknown;\n try {\n const raw =\n typeof handlerArgs === \"string\" ? JSON.parse(handlerArgs) : handlerArgs;\n parsedArgs = ensureObjectArgs(raw, toolCall.function.name);\n } catch (error) {\n const parseError =\n error instanceof Error ? error : new Error(String(error));\n errorMessage = parseError.message;\n isArgumentError = true;\n await this._internal.emitError({\n error: parseError,\n code: CopilotKitCoreErrorCode.TOOL_ARGUMENT_PARSE_FAILED,\n context: {\n agentId,\n toolCallId: toolCall.id,\n toolName: toolCall.function.name,\n rawArguments: handlerArgs,\n toolType,\n ...(messageId ? { messageId } : {}),\n },\n });\n }\n\n await this._internal.notifySubscribers(\n (subscriber) =>\n subscriber.onToolExecutionStart?.({\n copilotkit: this.core,\n toolCallId: toolCall.id,\n agentId,\n toolName: toolCall.function.name,\n args: parsedArgs,\n }),\n \"Subscriber onToolExecutionStart error:\",\n );\n\n if (!errorMessage) {\n try {\n const result = await tool.handler!(parsedArgs as any, {\n toolCall: toolCall as any,\n agent,\n });\n if (result === undefined || result === null) {\n toolCallResult = \"\";\n } else if (typeof result === \"string\") {\n toolCallResult = result;\n } else {\n toolCallResult = JSON.stringify(result);\n }\n } catch (error) {\n const handlerError =\n error instanceof Error ? error : new Error(String(error));\n errorMessage = handlerError.message;\n await this._internal.emitError({\n error: handlerError,\n code: CopilotKitCoreErrorCode.TOOL_HANDLER_FAILED,\n context: {\n agentId,\n toolCallId: toolCall.id,\n toolName: toolCall.function.name,\n parsedArgs,\n toolType,\n ...(messageId ? { messageId } : {}),\n },\n });\n }\n }\n\n if (errorMessage) {\n toolCallResult = `Error: ${errorMessage}`;\n }\n\n await this._internal.notifySubscribers(\n (subscriber) =>\n subscriber.onToolExecutionEnd?.({\n copilotkit: this.core,\n toolCallId: toolCall.id,\n agentId,\n toolName: toolCall.function.name,\n result: errorMessage ? \"\" : toolCallResult,\n error: errorMessage,\n }),\n \"Subscriber onToolExecutionEnd error:\",\n );\n\n return { result: toolCallResult, error: errorMessage, isArgumentError };\n }\n\n /**\n * Execute a specific tool\n */\n private async executeSpecificTool(\n tool: FrontendTool<any>,\n toolCall: any,\n message: Message,\n agent: AbstractAgent,\n agentId: string,\n ): Promise<boolean> {\n // Check if tool is constrained to a specific agent\n if (tool?.agentId && tool.agentId !== agent.agentId) {\n // Tool is not available for this agent, skip it\n return false;\n }\n\n let handlerResult: ExecuteToolHandlerResult = {\n result: \"\",\n error: undefined,\n isArgumentError: false,\n };\n\n if (tool?.handler) {\n handlerResult = await this.executeToolHandler({\n tool,\n toolCall,\n agent,\n agentId,\n handlerArgs: toolCall.function.arguments,\n toolType: \"specific\",\n messageId: message.id,\n });\n }\n\n {\n const messageIndex = agent.messages.findIndex((m) => m.id === message.id);\n if (messageIndex === -1) {\n // Parent message no longer in agent's messages (e.g. thread was switched\n // while the tool handler was still executing). Skip result insertion and\n // do not request a follow-up to avoid mutating the wrong thread.\n return false;\n }\n const toolMessage = {\n id: randomUUID(),\n role: \"tool\" as const,\n toolCallId: toolCall.id,\n content: handlerResult.result,\n };\n agent.messages.splice(messageIndex + 1, 0, toolMessage);\n\n if (!handlerResult.error && tool?.followUp !== false) {\n return true; // Needs follow-up\n }\n }\n\n return false;\n }\n\n /**\n * Execute a wildcard tool.\n * Wildcard tools receive args wrapped as `{toolName, args}`, which differs from\n * specific tools, so this method keeps its own arg-wrapping logic rather than\n * delegating to `executeToolHandler`.\n */\n private async executeWildcardTool(\n wildcardTool: FrontendTool<any>,\n toolCall: any,\n message: Message,\n agent: AbstractAgent,\n agentId: string,\n ): Promise<boolean> {\n // Check if wildcard tool is constrained to a specific agent\n if (wildcardTool?.agentId && wildcardTool.agentId !== agent.agentId) {\n // Wildcard tool is not available for this agent, skip it\n return false;\n }\n\n let toolCallResult = \"\";\n let errorMessage: string | undefined;\n let isArgumentError = false;\n\n if (wildcardTool?.handler) {\n let parsedArgs: unknown;\n try {\n parsedArgs = ensureObjectArgs(\n JSON.parse(toolCall.function.arguments),\n toolCall.function.name,\n );\n } catch (error) {\n const parseError =\n error instanceof Error ? error : new Error(String(error));\n errorMessage = parseError.message;\n isArgumentError = true;\n await this._internal.emitError({\n error: parseError,\n code: CopilotKitCoreErrorCode.TOOL_ARGUMENT_PARSE_FAILED,\n context: {\n agentId: agentId,\n toolCallId: toolCall.id,\n toolName: toolCall.function.name,\n rawArguments: toolCall.function.arguments,\n toolType: \"wildcard\",\n messageId: message.id,\n },\n });\n }\n\n const wildcardArgs = {\n toolName: toolCall.function.name,\n args: parsedArgs,\n };\n\n await this._internal.notifySubscribers(\n (subscriber) =>\n subscriber.onToolExecutionStart?.({\n copilotkit: this.core,\n toolCallId: toolCall.id,\n agentId: agentId,\n toolName: toolCall.function.name,\n args: wildcardArgs,\n }),\n \"Subscriber onToolExecutionStart error:\",\n );\n\n if (!errorMessage) {\n try {\n const result = await wildcardTool.handler(wildcardArgs as any, {\n toolCall,\n agent,\n });\n if (result === undefined || result === null) {\n toolCallResult = \"\";\n } else if (typeof result === \"string\") {\n toolCallResult = result;\n } else {\n toolCallResult = JSON.stringify(result);\n }\n } catch (error) {\n const handlerError =\n error instanceof Error ? error : new Error(String(error));\n errorMessage = handlerError.message;\n await this._internal.emitError({\n error: handlerError,\n code: CopilotKitCoreErrorCode.TOOL_HANDLER_FAILED,\n context: {\n agentId: agentId,\n toolCallId: toolCall.id,\n toolName: toolCall.function.name,\n parsedArgs: wildcardArgs,\n toolType: \"wildcard\",\n messageId: message.id,\n },\n });\n }\n }\n\n if (errorMessage) {\n toolCallResult = `Error: ${errorMessage}`;\n }\n\n await this._internal.notifySubscribers(\n (subscriber) =>\n subscriber.onToolExecutionEnd?.({\n copilotkit: this.core,\n toolCallId: toolCall.id,\n agentId: agentId,\n toolName: toolCall.function.name,\n result: errorMessage ? \"\" : toolCallResult,\n error: errorMessage,\n }),\n \"Subscriber onToolExecutionEnd error:\",\n );\n }\n\n {\n const messageIndex = agent.messages.findIndex((m) => m.id === message.id);\n if (messageIndex === -1) {\n // Parent message no longer in agent's messages (e.g. thread was switched\n // while the tool handler was still executing). Skip result insertion and\n // do not request a follow-up to avoid mutating the wrong thread.\n return false;\n }\n const toolMessage = {\n id: randomUUID(),\n role: \"tool\" as const,\n toolCallId: toolCall.id,\n content: toolCallResult,\n };\n agent.messages.splice(messageIndex + 1, 0, toolMessage);\n\n if (!errorMessage && wildcardTool?.followUp !== false) {\n return true; // Needs follow-up\n }\n }\n\n return false;\n }\n\n /**\n * Programmatically execute a registered frontend tool without going through an LLM turn.\n * The handler runs, render components show up in the UI, and both the tool call and\n * result messages are added to `agent.messages`.\n */\n async runTool(\n params: CopilotKitCoreRunToolParams,\n ): Promise<CopilotKitCoreRunToolResult> {\n const { name, agentId, parameters = {}, followUp = false } = params;\n\n // 1. Look up the tool\n const tool = this.getTool({ toolName: name, agentId });\n if (!tool) {\n const error = new Error(`Tool not found: ${name}`);\n await this._internal.emitError({\n error,\n code: CopilotKitCoreErrorCode.TOOL_NOT_FOUND,\n context: { toolName: name, agentId },\n });\n throw error;\n }\n\n // 2. Look up the agent\n const resolvedAgentId = agentId ?? \"default\";\n const agent = this._internal.getAgent(resolvedAgentId);\n if (!agent) {\n const error = new Error(`Agent not found: ${resolvedAgentId}`);\n await this._internal.emitError({\n error,\n code: CopilotKitCoreErrorCode.AGENT_NOT_FOUND,\n context: { agentId: resolvedAgentId },\n });\n throw error;\n }\n\n // 3. Create assistant message with tool call\n const toolCallId = randomUUID();\n const assistantMessage: Message = {\n id: randomUUID(),\n role: \"assistant\",\n content: \"\",\n toolCalls: [\n {\n id: toolCallId,\n type: \"function\",\n function: {\n name,\n arguments: JSON.stringify(parameters),\n },\n },\n ],\n };\n\n // 4. Push assistant message into agent's messages\n agent.messages.push(assistantMessage);\n\n // 5. Execute the tool handler (if it has one)\n let handlerResult: ExecuteToolHandlerResult = {\n result: \"\",\n error: undefined,\n isArgumentError: false,\n };\n\n if (tool.handler) {\n handlerResult = await this.executeToolHandler({\n tool,\n toolCall: assistantMessage.toolCalls![0],\n agent,\n agentId: resolvedAgentId,\n handlerArgs: parameters,\n toolType: \"runTool\",\n });\n }\n\n // 6. Create and insert tool result message\n const toolResultMessage: Message = {\n id: randomUUID(),\n role: \"tool\",\n toolCallId,\n content: handlerResult.result,\n };\n\n const assistantIndex = agent.messages.findIndex(\n (m) => m.id === assistantMessage.id,\n );\n if (assistantIndex !== -1) {\n agent.messages.splice(assistantIndex + 1, 0, toolResultMessage);\n } else {\n // Fallback: push to end if assistant message was removed\n agent.messages.push(toolResultMessage);\n }\n\n // 7. Handle followUp (only if no error)\n if (!handlerResult.error && followUp !== false) {\n if (typeof followUp === \"string\" && followUp !== \"generate\") {\n // Custom text: add a user message first\n const userMessage: Message = {\n id: randomUUID(),\n role: \"user\",\n content: followUp,\n };\n agent.messages.push(userMessage);\n }\n // Yield to the framework scheduler so deferred state updates (e.g. React\n // useEffect in useAgentContext) can complete before the follow-up run reads\n // the context store. Mirrors the same yield in processAgentResult.\n await this._internal.waitForPendingFrameworkUpdates();\n // Trigger agent run for both \"generate\" and custom text\n await this.runAgent({ agent });\n }\n\n // 8. Return result\n return {\n toolCallId,\n result: handlerResult.result,\n error: handlerResult.error,\n };\n }\n\n /**\n * Build frontend tools for an agent\n */\n buildFrontendTools(agentId?: string): Tool[] {\n return this._tools\n .filter(\n (tool) =>\n tool.available !== false &&\n (!tool.agentId || tool.agentId === agentId),\n )\n .map((tool) => ({\n name: tool.name,\n description: tool.description ?? \"\",\n parameters: createToolSchema(tool),\n }));\n }\n\n /**\n * Create an agent error subscriber\n */\n private createAgentErrorSubscriber(agent: AbstractAgent): AgentSubscriber {\n const emitAgentError = async (\n error: Error,\n code: CopilotKitCoreErrorCode,\n extraContext: Record<string, any> = {},\n ) => {\n const context: Record<string, any> = { ...extraContext };\n if (agent.agentId) {\n context.agentId = agent.agentId;\n }\n await this._internal.emitError({\n error,\n code,\n context,\n });\n };\n\n return {\n onRunFailed: async ({ error }: { error: Error }) => {\n await emitAgentError(\n error,\n CopilotKitCoreErrorCode.AGENT_RUN_FAILED_EVENT,\n {\n source: \"onRunFailed\",\n },\n );\n },\n onRunErrorEvent: async ({ event }) => {\n const eventError =\n event?.rawEvent instanceof Error\n ? event.rawEvent\n : event?.rawEvent?.error instanceof Error\n ? event.rawEvent.error\n : undefined;\n\n const errorMessage =\n typeof event?.rawEvent?.error === \"string\"\n ? event.rawEvent.error\n : (event?.message ?? \"Agent run error\");\n\n const rawError = eventError ?? new Error(errorMessage);\n\n if (event?.code && !(rawError as any).code) {\n (rawError as any).code = event.code;\n }\n\n await emitAgentError(\n rawError,\n CopilotKitCoreErrorCode.AGENT_RUN_ERROR_EVENT,\n {\n source: \"onRunErrorEvent\",\n event,\n runtimeErrorCode: event?.code,\n },\n );\n },\n };\n }\n}\n\n/**\n * Empty tool schema constant\n */\nconst EMPTY_TOOL_SCHEMA = {\n type: \"object\",\n properties: {},\n} as const satisfies Record<string, unknown>;\n\n/**\n * Create a JSON schema from a tool's parameters\n */\nfunction createToolSchema(tool: FrontendTool<any>): Record<string, unknown> {\n if (!tool.parameters) {\n return { ...EMPTY_TOOL_SCHEMA };\n }\n\n const rawSchema = schemaToJsonSchema(tool.parameters, { zodToJsonSchema });\n\n if (!rawSchema || typeof rawSchema !== \"object\") {\n return { ...EMPTY_TOOL_SCHEMA };\n }\n\n const { $schema, ...schema } = rawSchema as Record<string, unknown>;\n\n if (typeof schema.type !== \"string\") {\n schema.type = \"object\";\n }\n if (typeof schema.properties !== \"object\" || schema.properties === null) {\n schema.properties = {};\n }\n\n stripAdditionalProperties(schema);\n return schema;\n}\n\nfunction stripAdditionalProperties(schema: unknown): void {\n if (!schema || typeof schema !== \"object\") {\n return;\n }\n\n if (Array.isArray(schema)) {\n schema.forEach(stripAdditionalProperties);\n return;\n }\n\n const record = schema as Record<string, unknown>;\n\n if (record.additionalProperties !== undefined) {\n delete record.additionalProperties;\n }\n\n for (const value of Object.values(record)) {\n stripAdditionalProperties(value);\n }\n}\n\n/**\n * Ensures parsed tool arguments are a plain object.\n * Throws for non-object values so the caller's catch block can emit\n * a structured TOOL_ARGUMENT_PARSE_FAILED error.\n *\n * @internal Exported for testing only.\n */\nexport function ensureObjectArgs(\n parsed: unknown,\n toolName: string,\n): Record<string, unknown> {\n if (typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n throw new Error(\n `Tool arguments for ${toolName} parsed to non-object (${typeof parsed})`,\n );\n}\n","import {\n AbstractAgent,\n Message,\n State,\n RunAgentInput,\n RunStartedEvent,\n RunFinishedEvent,\n StateSnapshotEvent,\n StateDeltaEvent,\n MessagesSnapshotEvent,\n} from \"@ag-ui/client\";\nimport type { CopilotKitCore } from \"./core\";\n\n/**\n * Manages state and message tracking by run for CopilotKitCore.\n * Tracks agent state snapshots and message-to-run associations.\n */\nexport class StateManager {\n // State tracking: agentId -> threadId -> runId -> state\n private stateByRun: Map<string, Map<string, Map<string, State>>> = new Map();\n\n // Message tracking: agentId -> threadId -> messageId -> runId\n private messageToRun: Map<string, Map<string, Map<string, string>>> =\n new Map();\n\n // Agent subscriptions for cleanup\n private agentSubscriptions: Map<string, () => void> = new Map();\n\n constructor(private core: CopilotKitCore) {}\n\n /**\n * Initialize state tracking for an agent\n */\n initialize(): void {\n // Will be called when CopilotKitCore is initialized\n }\n\n /**\n * Subscribe to an agent's events to track state and messages\n */\n subscribeToAgent(agent: AbstractAgent): void {\n if (!agent.agentId) {\n return; // Skip agents without IDs\n }\n\n const agentId = agent.agentId;\n\n // Unsubscribe existing subscription if any\n this.unsubscribeFromAgent(agentId);\n\n // Subscribe to agent events\n const { unsubscribe } = agent.subscribe({\n onRunStartedEvent: ({ event, state }) => {\n this.handleRunStarted(agent, event, state);\n },\n onRunFinishedEvent: ({ event, state }) => {\n this.handleRunFinished(agent, event, state);\n },\n onStateSnapshotEvent: ({ event, input, state }) => {\n this.handleStateSnapshot(agent, event, input, state);\n },\n onStateDeltaEvent: ({ event, input, state }) => {\n this.handleStateDelta(agent, event, input, state);\n },\n onMessagesSnapshotEvent: ({ event, input, messages }) => {\n this.handleMessagesSnapshot(agent, event, input, messages);\n },\n onNewMessage: ({ message, input }) => {\n this.handleNewMessage(agent, message, input);\n },\n });\n\n this.agentSubscriptions.set(agentId, unsubscribe);\n }\n\n /**\n * Unsubscribe from an agent's events\n */\n unsubscribeFromAgent(agentId: string): void {\n const unsubscribe = this.agentSubscriptions.get(agentId);\n if (unsubscribe) {\n unsubscribe();\n this.agentSubscriptions.delete(agentId);\n }\n }\n\n /**\n * Get state for a specific run\n * Returns a deep copy to prevent external mutations\n */\n getStateByRun(\n agentId: string,\n threadId: string,\n runId: string,\n ): State | undefined {\n const state = this.stateByRun.get(agentId)?.get(threadId)?.get(runId);\n if (!state) return undefined;\n // Return a deep copy to prevent mutations\n return JSON.parse(JSON.stringify(state));\n }\n\n /**\n * Get runId associated with a message\n */\n getRunIdForMessage(\n agentId: string,\n threadId: string,\n messageId: string,\n ): string | undefined {\n return this.messageToRun.get(agentId)?.get(threadId)?.get(messageId);\n }\n\n /**\n * Get all states for an agent's thread\n */\n getStatesForThread(agentId: string, threadId: string): Map<string, State> {\n return this.stateByRun.get(agentId)?.get(threadId) ?? new Map();\n }\n\n /**\n * Get all run IDs for an agent's thread\n */\n getRunIdsForThread(agentId: string, threadId: string): string[] {\n const threadStates = this.stateByRun.get(agentId)?.get(threadId);\n return threadStates ? Array.from(threadStates.keys()) : [];\n }\n\n /**\n * Handle run started event\n */\n private handleRunStarted(\n agent: AbstractAgent,\n event: RunStartedEvent,\n state: State,\n ): void {\n if (!agent.agentId) return;\n\n const { threadId, runId } = event;\n this.saveState(agent.agentId, threadId, runId, state);\n }\n\n /**\n * Handle run finished event\n */\n private handleRunFinished(\n agent: AbstractAgent,\n event: RunFinishedEvent,\n state: State,\n ): void {\n if (!agent.agentId) return;\n\n const { threadId, runId } = event;\n this.saveState(agent.agentId, threadId, runId, state);\n }\n\n /**\n * Handle state snapshot event\n */\n private handleStateSnapshot(\n agent: AbstractAgent,\n event: StateSnapshotEvent,\n input: RunAgentInput,\n state: State,\n ): void {\n if (!agent.agentId) return;\n\n const { threadId, runId } = input;\n // Merge snapshot into current state\n const mergedState = { ...state, ...event.snapshot };\n this.saveState(agent.agentId, threadId, runId, mergedState);\n }\n\n /**\n * Handle state delta event\n */\n private handleStateDelta(\n agent: AbstractAgent,\n event: StateDeltaEvent,\n input: RunAgentInput,\n state: State,\n ): void {\n if (!agent.agentId) return;\n\n const { threadId, runId } = input;\n // State is already updated by the agent, just save it\n this.saveState(agent.agentId, threadId, runId, state);\n }\n\n /**\n * Handle messages snapshot event\n */\n private handleMessagesSnapshot(\n agent: AbstractAgent,\n event: MessagesSnapshotEvent,\n input: RunAgentInput,\n messages: Message[],\n ): void {\n if (!agent.agentId) return;\n\n const { threadId, runId } = input;\n\n // Associate all messages in the snapshot with this run\n for (const message of event.messages) {\n this.associateMessageWithRun(agent.agentId, threadId, message.id, runId);\n }\n }\n\n /**\n * Handle new message event\n */\n private handleNewMessage(\n agent: AbstractAgent,\n message: Message,\n input?: RunAgentInput,\n ): void {\n if (!agent.agentId || !input) return;\n\n const { threadId, runId } = input;\n this.associateMessageWithRun(agent.agentId, threadId, message.id, runId);\n }\n\n /**\n * Save state for a specific run\n */\n private saveState(\n agentId: string,\n threadId: string,\n runId: string,\n state: State,\n ): void {\n // Ensure nested maps exist\n if (!this.stateByRun.has(agentId)) {\n this.stateByRun.set(agentId, new Map());\n }\n const agentStates = this.stateByRun.get(agentId)!;\n\n if (!agentStates.has(threadId)) {\n agentStates.set(threadId, new Map());\n }\n const threadStates = agentStates.get(threadId)!;\n\n // Deep copy the state to prevent mutations\n threadStates.set(runId, JSON.parse(JSON.stringify(state)));\n }\n\n /**\n * Associate a message with a run\n */\n private associateMessageWithRun(\n agentId: string,\n threadId: string,\n messageId: string,\n runId: string,\n ): void {\n // Ensure nested maps exist\n if (!this.messageToRun.has(agentId)) {\n this.messageToRun.set(agentId, new Map());\n }\n const agentMessages = this.messageToRun.get(agentId)!;\n\n if (!agentMessages.has(threadId)) {\n agentMessages.set(threadId, new Map());\n }\n const threadMessages = agentMessages.get(threadId)!;\n\n threadMessages.set(messageId, runId);\n }\n\n /**\n * Clear all state for an agent\n */\n clearAgentState(agentId: string): void {\n this.stateByRun.delete(agentId);\n this.messageToRun.delete(agentId);\n }\n\n /**\n * Clear all state for a thread\n */\n clearThreadState(agentId: string, threadId: string): void {\n this.stateByRun.get(agentId)?.delete(threadId);\n this.messageToRun.get(agentId)?.delete(threadId);\n }\n}\n","import { AbstractAgent, Context, State } from \"@ag-ui/client\";\nimport {\n FrontendTool,\n SuggestionsConfig,\n Suggestion,\n CopilotRuntimeTransport,\n} from \"../types\";\nimport { AgentRegistry, CopilotKitCoreAddAgentParams } from \"./agent-registry\";\nimport { ContextStore } from \"./context-store\";\nimport { SuggestionEngine } from \"./suggestion-engine\";\nimport {\n RunHandler,\n CopilotKitCoreRunAgentParams,\n CopilotKitCoreConnectAgentParams,\n CopilotKitCoreGetToolParams,\n CopilotKitCoreRunToolParams,\n CopilotKitCoreRunToolResult,\n} from \"./run-handler\";\nimport { StateManager } from \"./state-manager\";\n\n/** Configuration options for `CopilotKitCore`. */\nexport interface CopilotKitCoreConfig {\n /** The endpoint of the CopilotRuntime. */\n runtimeUrl?: string;\n /** Transport style for CopilotRuntime endpoints. Defaults to REST. */\n runtimeTransport?: CopilotRuntimeTransport;\n /** Mapping from agent name to its `AbstractAgent` instance. For development only - production requires CopilotRuntime. */\n agents__unsafe_dev_only?: Record<string, AbstractAgent>;\n /** Headers appended to every HTTP request made by `CopilotKitCore`. */\n headers?: Record<string, string>;\n /** Credentials mode for fetch requests (e.g., \"include\" for HTTP-only cookies). */\n credentials?: RequestCredentials;\n /** Properties sent as `forwardedProps` to the AG-UI agent. */\n properties?: Record<string, unknown>;\n /** Ordered collection of frontend tools available to the core. */\n tools?: FrontendTool<any>[];\n /** Suggestions config for the core. */\n suggestionsConfig?: SuggestionsConfig[];\n}\n\nexport type { CopilotKitCoreAddAgentParams };\nexport type {\n CopilotKitCoreRunAgentParams,\n CopilotKitCoreConnectAgentParams,\n CopilotKitCoreGetToolParams,\n CopilotKitCoreRunToolParams,\n CopilotKitCoreRunToolResult,\n};\n\nexport interface CopilotKitCoreStopAgentParams {\n agent: AbstractAgent;\n}\n\nexport type CopilotKitCoreGetSuggestionsResult = {\n suggestions: Suggestion[];\n isLoading: boolean;\n};\n\nexport enum CopilotKitCoreErrorCode {\n RUNTIME_INFO_FETCH_FAILED = \"runtime_info_fetch_failed\",\n AGENT_CONNECT_FAILED = \"agent_connect_failed\",\n AGENT_RUN_FAILED = \"agent_run_failed\",\n AGENT_RUN_FAILED_EVENT = \"agent_run_failed_event\",\n AGENT_RUN_ERROR_EVENT = \"agent_run_error_event\",\n TOOL_ARGUMENT_PARSE_FAILED = \"tool_argument_parse_failed\",\n TOOL_HANDLER_FAILED = \"tool_handler_failed\",\n TOOL_NOT_FOUND = \"tool_not_found\",\n AGENT_NOT_FOUND = \"agent_not_found\",\n // Transcription errors\n TRANSCRIPTION_FAILED = \"transcription_failed\",\n TRANSCRIPTION_SERVICE_NOT_CONFIGURED = \"transcription_service_not_configured\",\n TRANSCRIPTION_INVALID_AUDIO = \"transcription_invalid_audio\",\n TRANSCRIPTION_RATE_LIMITED = \"transcription_rate_limited\",\n TRANSCRIPTION_AUTH_FAILED = \"transcription_auth_failed\",\n TRANSCRIPTION_NETWORK_ERROR = \"transcription_network_error\",\n}\n\nexport interface CopilotKitCoreSubscriber {\n onRuntimeConnectionStatusChanged?: (event: {\n copilotkit: CopilotKitCore;\n status: CopilotKitCoreRuntimeConnectionStatus;\n }) => void | Promise<void>;\n onToolExecutionStart?: (event: {\n copilotkit: CopilotKitCore;\n toolCallId: string;\n agentId: string;\n toolName: string;\n args: unknown;\n }) => void | Promise<void>;\n onToolExecutionEnd?: (event: {\n copilotkit: CopilotKitCore;\n toolCallId: string;\n agentId: string;\n toolName: string;\n result: string;\n error?: string;\n }) => void | Promise<void>;\n onAgentsChanged?: (event: {\n copilotkit: CopilotKitCore;\n agents: Readonly<Record<string, AbstractAgent>>;\n }) => void | Promise<void>;\n onContextChanged?: (event: {\n copilotkit: CopilotKitCore;\n context: Readonly<Record<string, Context>>;\n }) => void | Promise<void>;\n onSuggestionsConfigChanged?: (event: {\n copilotkit: CopilotKitCore;\n suggestionsConfig: Readonly<Record<string, SuggestionsConfig>>;\n }) => void | Promise<void>;\n onSuggestionsChanged?: (event: {\n copilotkit: CopilotKitCore;\n agentId: string;\n suggestions: Suggestion[];\n }) => void | Promise<void>;\n onSuggestionsStartedLoading?: (event: {\n copilotkit: CopilotKitCore;\n agentId: string;\n }) => void | Promise<void>;\n onSuggestionsFinishedLoading?: (event: {\n copilotkit: CopilotKitCore;\n agentId: string;\n }) => void | Promise<void>;\n onPropertiesChanged?: (event: {\n copilotkit: CopilotKitCore;\n properties: Readonly<Record<string, unknown>>;\n }) => void | Promise<void>;\n onHeadersChanged?: (event: {\n copilotkit: CopilotKitCore;\n headers: Readonly<Record<string, string>>;\n }) => void | Promise<void>;\n onError?: (event: {\n copilotkit: CopilotKitCore;\n error: Error;\n code: CopilotKitCoreErrorCode;\n context: Record<string, any>;\n }) => void | Promise<void>;\n}\n\n// Subscription object returned by subscribe()\nexport interface CopilotKitCoreSubscription {\n unsubscribe: () => void;\n}\n\nexport enum CopilotKitCoreRuntimeConnectionStatus {\n Disconnected = \"disconnected\",\n Connected = \"connected\",\n Connecting = \"connecting\",\n Error = \"error\",\n}\n\n/**\n * Internal interface for delegate classes to access CopilotKitCore methods.\n * This provides type safety while allowing controlled access to private functionality.\n */\nexport interface CopilotKitCoreFriendsAccess {\n // Notification methods\n notifySubscribers(\n handler: (subscriber: CopilotKitCoreSubscriber) => void | Promise<void>,\n errorMessage: string,\n ): Promise<void>;\n\n emitError(params: {\n error: Error;\n code: CopilotKitCoreErrorCode;\n context?: Record<string, any>;\n }): Promise<void>;\n\n // Getters for internal state\n readonly headers: Readonly<Record<string, string>>;\n readonly credentials: RequestCredentials | undefined;\n readonly properties: Readonly<Record<string, unknown>>;\n readonly context: Readonly<Record<string, Context>>;\n\n // Internal methods\n buildFrontendTools(agentId?: string): import(\"@ag-ui/client\").Tool[];\n getAgent(id: string): AbstractAgent | undefined;\n\n // References to delegate subsystems\n readonly suggestionEngine: {\n clearSuggestions(agentId: string): void;\n reloadSuggestions(agentId: string): void;\n };\n\n /**\n * Called before each follow-up agent run (after tool execution).\n * See CopilotKitCore.waitForPendingFrameworkUpdates for details.\n */\n waitForPendingFrameworkUpdates(): Promise<void>;\n}\n\nexport class CopilotKitCore {\n private _headers: Record<string, string>;\n private _credentials?: RequestCredentials;\n private _properties: Record<string, unknown>;\n\n private subscribers: Set<CopilotKitCoreSubscriber> = new Set();\n\n // Delegate classes\n private agentRegistry: AgentRegistry;\n private contextStore: ContextStore;\n private suggestionEngine: SuggestionEngine;\n private runHandler: RunHandler;\n private stateManager: StateManager;\n\n constructor({\n runtimeUrl,\n runtimeTransport = \"rest\",\n headers = {},\n credentials,\n properties = {},\n agents__unsafe_dev_only = {},\n tools = [],\n suggestionsConfig = [],\n }: CopilotKitCoreConfig) {\n this._headers = headers;\n this._credentials = credentials;\n this._properties = properties;\n\n // Initialize delegate classes\n this.agentRegistry = new AgentRegistry(this);\n this.contextStore = new ContextStore(this);\n this.suggestionEngine = new SuggestionEngine(this);\n this.runHandler = new RunHandler(this);\n this.stateManager = new StateManager(this);\n\n // Initialize each subsystem\n this.agentRegistry.initialize(agents__unsafe_dev_only);\n this.runHandler.initialize(tools);\n this.suggestionEngine.initialize(suggestionsConfig);\n this.stateManager.initialize();\n\n this.agentRegistry.setRuntimeTransport(runtimeTransport);\n this.agentRegistry.setRuntimeUrl(runtimeUrl);\n\n // Subscribe to agent changes to track state for new agents\n this.subscribe({\n onAgentsChanged: ({ agents }) => {\n Object.values(agents).forEach((agent) => {\n if (agent.agentId) {\n this.stateManager.subscribeToAgent(agent);\n }\n });\n },\n });\n }\n\n /**\n * Internal method used by delegate classes and subclasses to notify subscribers\n */\n protected async notifySubscribers(\n handler: (subscriber: CopilotKitCoreSubscriber) => void | Promise<void>,\n errorMessage: string,\n ): Promise<void> {\n await Promise.all(\n Array.from(this.subscribers).map(async (subscriber) => {\n try {\n await handler(subscriber);\n } catch (error) {\n console.error(errorMessage, error);\n }\n }),\n );\n }\n\n /**\n * Internal method used by delegate classes to emit errors\n */\n private async emitError({\n error,\n code,\n context = {},\n }: {\n error: Error;\n code: CopilotKitCoreErrorCode;\n context?: Record<string, any>;\n }): Promise<void> {\n await this.notifySubscribers(\n (subscriber) =>\n subscriber.onError?.({\n copilotkit: this,\n error,\n code,\n context,\n }),\n \"Subscriber onError error:\",\n );\n }\n\n /**\n * Snapshot accessors\n */\n get context(): Readonly<Record<string, Context>> {\n return this.contextStore.context;\n }\n\n get agents(): Readonly<Record<string, AbstractAgent>> {\n return this.agentRegistry.agents;\n }\n\n get tools(): Readonly<FrontendTool<any>[]> {\n return this.runHandler.tools;\n }\n\n get runtimeUrl(): string | undefined {\n return this.agentRegistry.runtimeUrl;\n }\n\n setRuntimeUrl(runtimeUrl: string | undefined): void {\n this.agentRegistry.setRuntimeUrl(runtimeUrl);\n }\n\n get runtimeTransport(): CopilotRuntimeTransport {\n return this.agentRegistry.runtimeTransport;\n }\n\n setRuntimeTransport(runtimeTransport: CopilotRuntimeTransport): void {\n this.agentRegistry.setRuntimeTransport(runtimeTransport);\n }\n\n get runtimeVersion(): string | undefined {\n return this.agentRegistry.runtimeVersion;\n }\n\n get headers(): Readonly<Record<string, string>> {\n return this._headers;\n }\n\n get credentials(): RequestCredentials | undefined {\n return this._credentials;\n }\n\n get properties(): Readonly<Record<string, unknown>> {\n return this._properties;\n }\n\n get runtimeConnectionStatus(): CopilotKitCoreRuntimeConnectionStatus {\n return this.agentRegistry.runtimeConnectionStatus;\n }\n\n get audioFileTranscriptionEnabled(): boolean {\n return this.agentRegistry.audioFileTranscriptionEnabled;\n }\n\n get a2uiEnabled(): boolean {\n return this.agentRegistry.a2uiEnabled;\n }\n\n /**\n * Configuration updates\n */\n setHeaders(headers: Record<string, string>): void {\n this._headers = headers;\n this.agentRegistry.applyHeadersToAgents(\n this.agentRegistry.agents as Record<string, AbstractAgent>,\n );\n void this.notifySubscribers(\n (subscriber) =>\n subscriber.onHeadersChanged?.({\n copilotkit: this,\n headers: this.headers,\n }),\n \"Subscriber onHeadersChanged error:\",\n );\n }\n\n setCredentials(credentials: RequestCredentials | undefined): void {\n this._credentials = credentials;\n this.agentRegistry.applyCredentialsToAgents(\n this.agentRegistry.agents as Record<string, AbstractAgent>,\n );\n }\n\n setProperties(properties: Record<string, unknown>): void {\n this._properties = properties;\n void this.notifySubscribers(\n (subscriber) =>\n subscriber.onPropertiesChanged?.({\n copilotkit: this,\n properties: this.properties,\n }),\n \"Subscriber onPropertiesChanged error:\",\n );\n }\n\n /**\n * Agent management (delegated to AgentRegistry)\n */\n setAgents__unsafe_dev_only(agents: Record<string, AbstractAgent>): void {\n this.agentRegistry.setAgents__unsafe_dev_only(agents);\n }\n\n addAgent__unsafe_dev_only(params: CopilotKitCoreAddAgentParams): void {\n this.agentRegistry.addAgent__unsafe_dev_only(params);\n }\n\n removeAgent__unsafe_dev_only(id: string): void {\n this.agentRegistry.removeAgent__unsafe_dev_only(id);\n }\n\n getAgent(id: string): AbstractAgent | undefined {\n return this.agentRegistry.getAgent(id);\n }\n\n /**\n * Context management (delegated to ContextStore)\n */\n addContext(context: Context): string {\n return this.contextStore.addContext(context);\n }\n\n removeContext(id: string): void {\n this.contextStore.removeContext(id);\n }\n\n /**\n * Suggestions management (delegated to SuggestionEngine)\n */\n addSuggestionsConfig(config: SuggestionsConfig): string {\n return this.suggestionEngine.addSuggestionsConfig(config);\n }\n\n removeSuggestionsConfig(id: string): void {\n this.suggestionEngine.removeSuggestionsConfig(id);\n }\n\n reloadSuggestions(agentId: string): void {\n this.suggestionEngine.reloadSuggestions(agentId);\n }\n\n clearSuggestions(agentId: string): void {\n this.suggestionEngine.clearSuggestions(agentId);\n }\n\n getSuggestions(agentId: string): CopilotKitCoreGetSuggestionsResult {\n return this.suggestionEngine.getSuggestions(agentId);\n }\n\n /**\n * Tool management (delegated to RunHandler)\n */\n addTool<T extends Record<string, unknown> = Record<string, unknown>>(\n tool: FrontendTool<T>,\n ): void {\n this.runHandler.addTool(tool);\n }\n\n removeTool(id: string, agentId?: string): void {\n this.runHandler.removeTool(id, agentId);\n }\n\n getTool(params: CopilotKitCoreGetToolParams): FrontendTool<any> | undefined {\n return this.runHandler.getTool(params);\n }\n\n setTools(tools: FrontendTool<any>[]): void {\n this.runHandler.setTools(tools);\n }\n\n /**\n * Subscription lifecycle\n */\n subscribe(subscriber: CopilotKitCoreSubscriber): CopilotKitCoreSubscription {\n this.subscribers.add(subscriber);\n\n // Return subscription with unsubscribe method\n return {\n unsubscribe: () => {\n this.subscribers.delete(subscriber);\n },\n };\n }\n\n /**\n * Agent connectivity (delegated to RunHandler)\n */\n async connectAgent(\n params: CopilotKitCoreConnectAgentParams,\n ): Promise<import(\"@ag-ui/client\").RunAgentResult> {\n return this.runHandler.connectAgent(params);\n }\n\n stopAgent(params: CopilotKitCoreStopAgentParams): void {\n params.agent.abortRun();\n }\n\n async runAgent(\n params: CopilotKitCoreRunAgentParams,\n ): Promise<import(\"@ag-ui/client\").RunAgentResult> {\n return this.runHandler.runAgent(params);\n }\n\n /**\n * Programmatically execute a registered frontend tool without going through an LLM turn.\n * The handler runs, render components show up in the UI, and both the tool call and\n * result messages are added to `agent.messages`.\n */\n async runTool(\n params: CopilotKitCoreRunToolParams,\n ): Promise<CopilotKitCoreRunToolResult> {\n return this.runHandler.runTool(params);\n }\n\n /**\n * State management (delegated to StateManager)\n */\n getStateByRun(\n agentId: string,\n threadId: string,\n runId: string,\n ): State | undefined {\n return this.stateManager.getStateByRun(agentId, threadId, runId);\n }\n\n getRunIdForMessage(\n agentId: string,\n threadId: string,\n messageId: string,\n ): string | undefined {\n return this.stateManager.getRunIdForMessage(agentId, threadId, messageId);\n }\n\n getRunIdsForThread(agentId: string, threadId: string): string[] {\n return this.stateManager.getRunIdsForThread(agentId, threadId);\n }\n\n /**\n * Internal method used by RunHandler to build frontend tools\n */\n private buildFrontendTools(agentId?: string): import(\"@ag-ui/client\").Tool[] {\n return this.runHandler.buildFrontendTools(agentId);\n }\n\n /**\n * Called before each follow-up agent run (after tool execution).\n *\n * When a frontend tool handler calls framework state setters (e.g. React's\n * setState), those updates are batched and deferred — they do not take effect\n * until the framework's scheduler runs (React uses MessageChannel).\n * useAgentContext registers context via useLayoutEffect, which runs\n * synchronously after React commits that deferred batch.\n *\n * Without yielding here, the follow-up runAgent reads the context store\n * synchronously while the deferred updates are still pending, producing stale\n * context for the next agent turn.\n *\n * Override in framework-specific subclasses to yield to the framework\n * scheduler before the follow-up run. The base implementation is a no-op\n * because non-React environments have no deferred state to flush.\n */\n async waitForPendingFrameworkUpdates(): Promise<void> {}\n}\n","import { AbstractAgent, ToolCall } from \"@ag-ui/client\";\nimport type { StandardSchemaV1 } from \"@copilotkitnext/shared\";\n\n/**\n * Status of a tool call execution\n */\nexport enum ToolCallStatus {\n InProgress = \"inProgress\",\n Executing = \"executing\",\n Complete = \"complete\",\n}\n\nexport type CopilotRuntimeTransport = \"rest\" | \"single\";\n\n/**\n * Context passed to a frontend tool handler\n */\nexport type FrontendToolHandlerContext = {\n toolCall: ToolCall;\n agent: AbstractAgent;\n};\n\nexport type FrontendTool<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = {\n name: string;\n description?: string;\n parameters?: StandardSchemaV1<any, T>;\n handler?: (args: T, context: FrontendToolHandlerContext) => Promise<unknown>;\n followUp?: boolean;\n /**\n * Optional agent ID to constrain this tool to a specific agent.\n * If specified, this tool will only be available to the specified agent.\n */\n agentId?: string;\n /**\n * Whether this tool is available to the agent.\n * Set to false to hide the tool from the agent without unregistering it.\n * Defaults to true when not specified.\n */\n available?: boolean;\n};\n\nexport type Suggestion = {\n title: string;\n message: string;\n /** Indicates whether this suggestion is still being generated. */\n isLoading: boolean;\n};\n\nexport type SuggestionAvailability =\n | \"before-first-message\"\n | \"after-first-message\"\n | \"always\"\n | \"disabled\";\n\nexport type DynamicSuggestionsConfig = {\n /**\n * A prompt or instructions for the GPT to generate suggestions.\n */\n instructions: string;\n /**\n * The minimum number of suggestions to generate. Defaults to `1`.\n * @default 1\n */\n minSuggestions?: number;\n /**\n * The maximum number of suggestions to generate. Defaults to `3`.\n * @default 1\n */\n maxSuggestions?: number;\n\n /**\n * When the suggestions are available. Defaults to \"after-first-message\".\n */\n available?: SuggestionAvailability;\n\n /**\n * The agent ID of the provider of the suggestions. Defaults to `\"default\"`.\n */\n providerAgentId?: string;\n\n /**\n * The agent ID of the consumer of the suggestions. Defaults to `\"*\"` (all agents).\n */\n consumerAgentId?: string;\n};\n\nexport type StaticSuggestionsConfig = {\n /**\n * The suggestions to display.\n */\n suggestions: Omit<Suggestion, \"isLoading\">[];\n\n /**\n * When the suggestions are available. Defaults to \"before-first-message\".\n */\n available?: SuggestionAvailability;\n\n /**\n * The agent ID of the consumer of the suggestions. Defaults to `\"*\"` (all agents).\n */\n consumerAgentId?: string;\n};\n\nexport type SuggestionsConfig =\n | DynamicSuggestionsConfig\n | StaticSuggestionsConfig;\n","export function completePartialMarkdown(input: string): string {\n let s = input;\n\n // Handle code fences first - use FIRST unmatched fence for proper nesting\n const fenceMatches = Array.from(s.matchAll(/^(\\s*)(`{3,}|~{3,})/gm));\n if (fenceMatches.length % 2 === 1) {\n const [, indent, fence] = fenceMatches[0]!;\n s += `\\n${indent}${fence}`;\n }\n\n // Identify incomplete links at the end and close them\n const incompleteLinkMatch = s.match(/\\[([^\\]]*)\\]\\(([^)]*)$/);\n if (incompleteLinkMatch) {\n s += \")\";\n }\n\n // State-based parsing\n interface OpenElement {\n type: string;\n marker: string;\n position: number;\n }\n\n const openElements: OpenElement[] = [];\n const chars = Array.from(s);\n\n // First pass: identify code block boundaries and inline code to avoid processing their content\n const codeBlockRanges: Array<{ start: number; end: number }> = [];\n const inlineCodeRanges: Array<{ start: number; end: number }> = [];\n\n // Find code block ranges\n let tempCodeFenceCount = 0;\n let currentCodeBlockStart = -1;\n\n for (let i = 0; i < chars.length; i++) {\n if (i === 0 || chars[i - 1] === \"\\n\") {\n const lineMatch = s.substring(i).match(/^(\\s*)(`{3,}|~{3,})/);\n if (lineMatch) {\n tempCodeFenceCount++;\n if (tempCodeFenceCount % 2 === 1) {\n currentCodeBlockStart = i;\n } else if (currentCodeBlockStart !== -1) {\n codeBlockRanges.push({\n start: currentCodeBlockStart,\n end: i + lineMatch[0].length,\n });\n currentCodeBlockStart = -1;\n }\n i += lineMatch[0].length - 1;\n }\n }\n }\n\n // Find inline code ranges\n for (let i = 0; i < chars.length; i++) {\n if (chars[i] === \"`\") {\n // Check if escaped\n let backslashCount = 0;\n for (let j = i - 1; j >= 0 && chars[j] === \"\\\\\"; j--) {\n backslashCount++;\n }\n if (backslashCount % 2 === 0) {\n // Not escaped - find the closing backtick\n for (let j = i + 1; j < chars.length; j++) {\n if (chars[j] === \"`\") {\n let closingBackslashCount = 0;\n for (let k = j - 1; k >= 0 && chars[k] === \"\\\\\"; k--) {\n closingBackslashCount++;\n }\n if (closingBackslashCount % 2 === 0) {\n inlineCodeRanges.push({ start: i, end: j + 1 });\n i = j;\n break;\n }\n }\n }\n }\n }\n }\n\n // Helper function to check if position is in code\n const isInCode = (pos: number): boolean => {\n return (\n codeBlockRanges.some((range) => pos >= range.start && pos < range.end) ||\n inlineCodeRanges.some((range) => pos >= range.start && pos < range.end)\n );\n };\n\n // Second pass: process markdown elements, skipping code regions\n for (let i = 0; i < chars.length; i++) {\n const char = chars[i];\n const nextChar = chars[i + 1];\n const prevChar = chars[i - 1];\n\n if (isInCode(i)) {\n continue;\n }\n\n // Handle brackets (but not if they're part of already-complete links)\n if (char === \"[\") {\n // Check if this is part of a complete link [text](url)\n let isCompleteLink = false;\n let bracketDepth = 1;\n let j = i + 1;\n\n // Find the matching ]\n while (j < chars.length && bracketDepth > 0) {\n if (chars[j] === \"[\" && !isInCode(j)) bracketDepth++;\n if (chars[j] === \"]\" && !isInCode(j)) bracketDepth--;\n j++;\n }\n\n // Check if followed by (\n if (bracketDepth === 0 && chars[j] === \"(\") {\n // Find the closing )\n let parenDepth = 1;\n j++;\n while (j < chars.length && parenDepth > 0) {\n if (chars[j] === \"(\" && !isInCode(j)) parenDepth++;\n if (chars[j] === \")\" && !isInCode(j)) parenDepth--;\n j++;\n }\n if (parenDepth === 0) {\n isCompleteLink = true;\n i = j - 1;\n continue;\n }\n }\n\n // This is a standalone bracket, treat as markdown\n if (!isCompleteLink) {\n const existingIndex = openElements.findIndex(\n (el) => el.type === \"bracket\",\n );\n if (existingIndex !== -1) {\n openElements.splice(existingIndex, 1);\n } else {\n openElements.push({ type: \"bracket\", marker: \"[\", position: i });\n }\n }\n }\n\n // Handle double emphasis first (**, __, ~~) - these take precedence\n else if (char === \"*\" && nextChar === \"*\") {\n const existingIndex = openElements.findIndex(\n (el) => el.type === \"bold_star\",\n );\n if (existingIndex !== -1) {\n openElements.splice(existingIndex, 1);\n } else {\n openElements.push({ type: \"bold_star\", marker: \"**\", position: i });\n }\n i++; // Skip next character\n } else if (char === \"_\" && nextChar === \"_\") {\n const existingIndex = openElements.findIndex(\n (el) => el.type === \"bold_underscore\",\n );\n if (existingIndex !== -1) {\n openElements.splice(existingIndex, 1);\n } else {\n openElements.push({\n type: \"bold_underscore\",\n marker: \"__\",\n position: i,\n });\n }\n i++; // Skip next character\n } else if (char === \"~\" && nextChar === \"~\") {\n const existingIndex = openElements.findIndex(\n (el) => el.type === \"strike\",\n );\n if (existingIndex !== -1) {\n openElements.splice(existingIndex, 1);\n } else {\n openElements.push({ type: \"strike\", marker: \"~~\", position: i });\n }\n i++; // Skip next character\n }\n\n // Handle single emphasis (*, _) - only if not part of double\n else if (char === \"*\" && prevChar !== \"*\" && nextChar !== \"*\") {\n const existingIndex = openElements.findIndex(\n (el) => el.type === \"italic_star\",\n );\n if (existingIndex !== -1) {\n openElements.splice(existingIndex, 1);\n } else {\n openElements.push({ type: \"italic_star\", marker: \"*\", position: i });\n }\n } else if (char === \"_\" && prevChar !== \"_\" && nextChar !== \"_\") {\n const existingIndex = openElements.findIndex(\n (el) => el.type === \"italic_underscore\",\n );\n if (existingIndex !== -1) {\n openElements.splice(existingIndex, 1);\n } else {\n openElements.push({\n type: \"italic_underscore\",\n marker: \"_\",\n position: i,\n });\n }\n }\n }\n\n // Handle remaining unmatched backticks (outside of inline code ranges)\n let backtickCount = 0;\n for (let i = 0; i < chars.length; i++) {\n if (chars[i] === \"`\" && !isInCode(i)) {\n backtickCount++;\n }\n }\n if (backtickCount % 2 === 1) {\n s += \"`\";\n }\n\n // Close remaining open elements in reverse order (LIFO stack semantics)\n openElements.sort((a, b) => b.position - a.position);\n\n const closers = openElements.map((el) => {\n switch (el.type) {\n case \"bracket\":\n return \"]\";\n case \"bold_star\":\n return \"**\";\n case \"bold_underscore\":\n return \"__\";\n case \"strike\":\n return \"~~\";\n case \"italic_star\":\n return \"*\";\n case \"italic_underscore\":\n return \"_\";\n default:\n return \"\";\n }\n });\n\n let result = s + closers.join(\"\");\n\n // Handle parentheses ONLY if not inside code\n const finalFenceMatches = Array.from(\n result.matchAll(/^(\\s*)(`{3,}|~{3,})/gm),\n );\n const hasUnclosedBacktick = (result.match(/`/g) || []).length % 2 === 1;\n const hasUnclosedCodeFence = finalFenceMatches.length % 2 === 1;\n\n let shouldCloseParens = !hasUnclosedBacktick && !hasUnclosedCodeFence;\n\n if (shouldCloseParens) {\n const lastOpenParen = result.lastIndexOf(\"(\");\n if (lastOpenParen !== -1) {\n // Check if this paren is inside a backtick pair\n const beforeParen = result.substring(0, lastOpenParen);\n const backticksBeforeParen = (beforeParen.match(/`/g) || []).length;\n if (backticksBeforeParen % 2 === 1) {\n shouldCloseParens = false;\n }\n }\n }\n\n if (shouldCloseParens) {\n const openParens = (result.match(/\\(/g) || []).length;\n const closeParens = (result.match(/\\)/g) || []).length;\n if (openParens > closeParens) {\n result += \")\".repeat(openParens - closeParens);\n }\n }\n\n return result;\n}\n","import {\n AbstractAgent,\n RunAgentInput,\n EventType,\n BaseEvent,\n} from \"@ag-ui/client\";\nimport { Observable } from \"rxjs\";\nimport { Socket, Channel } from \"phoenix\";\nimport {\n AG_UI_CHANNEL_EVENT,\n phoenixExponentialBackoff,\n} from \"@copilotkitnext/shared\";\n\nexport interface IntelligenceAgentConfig {\n /** Phoenix websocket URL, e.g. \"ws://localhost:4000/socket\" */\n url: string;\n /** Runtime REST URL, e.g. \"http://localhost:4000\" */\n runtimeUrl: string;\n /** Agent identifier for REST endpoints */\n agentId: string;\n /** Optional params sent on socket connect (e.g. auth token) */\n socketParams?: Record<string, string>;\n /** Optional headers sent with REST requests */\n headers?: Record<string, string>;\n /** Optional credentials mode for fetch requests */\n credentials?: RequestCredentials;\n}\n\nexport class IntelligenceAgent extends AbstractAgent {\n private config: IntelligenceAgentConfig;\n private socket: Socket | null = null;\n private activeChannel: Channel | null = null;\n private threadId: string | null = null;\n\n constructor(config: IntelligenceAgentConfig) {\n super();\n this.config = config;\n }\n\n clone(): IntelligenceAgent {\n return new IntelligenceAgent(this.config);\n }\n\n abortRun(): void {\n if (this.activeChannel && this.threadId) {\n // Defer cleanup until the push is acknowledged so socket.disconnect()\n // doesn't clear the push buffer before the stop signal is sent.\n // The 5-second fallback handles the case where the socket is down and\n // Phoenix never flushes the buffered push (its .receive(\"timeout\") only\n // fires for pushes that were actually sent but not replied to).\n const fallback = setTimeout(() => this.cleanup(), 5_000);\n const clear = () => {\n clearTimeout(fallback);\n this.cleanup();\n };\n\n this.activeChannel\n .push(AG_UI_CHANNEL_EVENT, {\n type: EventType.CUSTOM,\n name: \"stop\",\n value: { threadId: this.threadId },\n })\n .receive(\"ok\", clear)\n .receive(\"error\", clear)\n .receive(\"timeout\", clear);\n } else {\n this.cleanup();\n }\n }\n\n /**\n * Connect to a Phoenix channel scoped to the thread, trigger the run via\n * REST, and relay server-pushed AG-UI events to the Observable subscriber.\n *\n * The server pushes each AG-UI event using its EventType string as the\n * Phoenix event name (e.g. \"TEXT_MESSAGE_CHUNK\", \"TOOL_CALL_START\"), with\n * the full BaseEvent as payload. RUN_FINISHED and RUN_ERROR are terminal\n * events that complete or error the Observable.\n */\n run(input: RunAgentInput): Observable<BaseEvent> {\n return new Observable<BaseEvent>((observer) => {\n this.threadId = input.threadId;\n\n // 1. Establish socket connection with explicit exponential backoff.\n //\n // reconnectAfterMs — controls how long Phoenix waits before\n // reconnecting the underlying WebSocket after an unclean close.\n // 100ms base, doubling up to a 10s cap.\n //\n // rejoinAfterMs — controls how long Phoenix waits before\n // re-joining a channel that entered the \"errored\" state (e.g.\n // after a socket reconnect). 1s base, doubling up to 30s cap.\n //\n // These must be set explicitly because the default Phoenix\n // behaviour uses a stepped (non-exponential) schedule, and —\n // more importantly — any socket.onError / channel.onError\n // callback that calls cleanup() / disconnect() will set\n // `closeWasClean = true` and reset the reconnect timer,\n // silently disabling all automatic retries.\n const socket = new Socket(this.config.url, {\n params: this.config.socketParams ?? {},\n reconnectAfterMs: phoenixExponentialBackoff(100, 10_000),\n rejoinAfterMs: phoenixExponentialBackoff(1_000, 30_000),\n });\n this.socket = socket;\n socket.connect();\n\n // 2. Join a channel scoped to this thread/run\n const channel = socket.channel(`agent:${input.threadId}`, {\n runId: input.runId,\n });\n this.activeChannel = channel;\n\n // 3. Listen for AG-UI events pushed by the server\n channel.on(AG_UI_CHANNEL_EVENT, (payload: BaseEvent) => {\n observer.next(payload);\n\n if (payload.type === EventType.RUN_FINISHED) {\n observer.complete();\n this.cleanup();\n } else if (payload.type === EventType.RUN_ERROR) {\n observer.error(\n new Error(\n (payload as BaseEvent & { message?: string }).message ??\n \"Run error\",\n ),\n );\n this.cleanup();\n }\n });\n\n // 4. Connection error handling — let Phoenix retry automatically.\n //\n // IMPORTANT: We intentionally do NOT call this.cleanup() in\n // these handlers. Calling cleanup() triggers socket.disconnect()\n // which sets closeWasClean = true and resets the reconnect timer,\n // permanently killing Phoenix's built-in retry loop. Instead we\n // count consecutive failures and only give up after the threshold.\n //\n // socket.onOpen resets the counter so transient blips don't\n // accumulate across successful reconnections.\n const MAX_CONSECUTIVE_ERRORS = 5;\n let consecutiveErrors = 0;\n\n socket.onError(() => {\n consecutiveErrors++;\n if (consecutiveErrors >= MAX_CONSECUTIVE_ERRORS) {\n observer.error(\n new Error(\n `WebSocket connection failed after ${MAX_CONSECUTIVE_ERRORS} consecutive errors`,\n ),\n );\n this.cleanup();\n }\n // Otherwise: Phoenix will automatically attempt to reconnect\n // using the exponential backoff schedule configured above.\n });\n\n socket.onOpen(() => {\n // A successful (re)connection resets the error counter so that\n // a brief network interruption followed by recovery doesn't\n // count toward the fatal threshold.\n consecutiveErrors = 0;\n });\n\n // Channel errors (e.g. socket dropped mid-join) trigger an\n // automatic rejoin via Phoenix's rejoinAfterMs timer. We do NOT\n // call cleanup() here — that would leave the channel and cancel\n // the rejoin timer, defeating the retry mechanism.\n channel.onError(() => {\n // No-op: Phoenix handles channel rejoin automatically.\n });\n\n // 5. Join the channel, then trigger the run via REST\n channel\n .join()\n .receive(\"ok\", () => {\n const { runtimeUrl, agentId, headers, credentials } = this.config;\n const runPath = `${runtimeUrl}/agent/${encodeURIComponent(agentId)}/run`;\n const origin =\n typeof window !== \"undefined\" && window.location\n ? window.location.origin\n : \"http://localhost\";\n const runUrl = new URL(runPath, new URL(runtimeUrl, origin));\n\n fetch(runUrl.toString(), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n body: JSON.stringify({\n threadId: input.threadId,\n runId: input.runId,\n messages: input.messages,\n tools: input.tools,\n context: input.context,\n state: input.state,\n forwardedProps: input.forwardedProps,\n }),\n ...(credentials ? { credentials } : {}),\n }).catch((error) => {\n observer.error(\n new Error(`REST run request failed: ${error.message ?? error}`),\n );\n this.cleanup();\n });\n })\n .receive(\"error\", (resp) => {\n observer.error(\n new Error(`Failed to join channel: ${JSON.stringify(resp)}`),\n );\n this.cleanup();\n })\n .receive(\"timeout\", () => {\n observer.error(new Error(\"Timed out joining channel\"));\n this.cleanup();\n });\n\n // 6. Teardown on unsubscribe\n return () => {\n this.cleanup();\n };\n });\n }\n\n /**\n * Reconnect to an existing thread by joining the Phoenix channel in\n * \"connect\" mode and requesting the server replay history.\n */\n protected connect(input: RunAgentInput): Observable<BaseEvent> {\n return new Observable<BaseEvent>((observer) => {\n this.threadId = input.threadId;\n\n // Same backoff configuration as run() — see comments there for details.\n const socket = new Socket(this.config.url, {\n params: this.config.socketParams ?? {},\n reconnectAfterMs: phoenixExponentialBackoff(100, 10_000),\n rejoinAfterMs: phoenixExponentialBackoff(1_000, 30_000),\n });\n this.socket = socket;\n socket.connect();\n\n const channel = socket.channel(`agent:${input.threadId}`, {\n mode: \"connect\",\n });\n this.activeChannel = channel;\n\n channel.on(AG_UI_CHANNEL_EVENT, (payload: BaseEvent) => {\n observer.next(payload);\n\n if (\n payload.type === EventType.RUN_FINISHED ||\n payload.type === EventType.RUN_ERROR\n ) {\n observer.complete();\n this.cleanup();\n }\n });\n\n // Let Phoenix handle transient errors via automatic retry.\n // See run() for detailed explanation of why we don't call cleanup() here.\n const MAX_CONSECUTIVE_ERRORS = 5;\n let consecutiveErrors = 0;\n\n socket.onError(() => {\n consecutiveErrors++;\n if (consecutiveErrors >= MAX_CONSECUTIVE_ERRORS) {\n observer.error(\n new Error(\n `WebSocket connection failed after ${MAX_CONSECUTIVE_ERRORS} consecutive errors`,\n ),\n );\n this.cleanup();\n }\n });\n\n socket.onOpen(() => {\n consecutiveErrors = 0;\n });\n\n // No-op: Phoenix handles channel rejoin automatically.\n channel.onError(() => {});\n\n channel\n .join()\n .receive(\"ok\", () => {\n channel.push(EventType.CUSTOM, {\n type: EventType.CUSTOM,\n name: \"connect\",\n value: { threadId: input.threadId },\n });\n })\n .receive(\"error\", (resp) => {\n observer.error(\n new Error(`Failed to join channel: ${JSON.stringify(resp)}`),\n );\n this.cleanup();\n })\n .receive(\"timeout\", () => {\n observer.error(new Error(\"Timed out joining channel\"));\n this.cleanup();\n });\n\n return () => {\n this.cleanup();\n };\n });\n }\n\n private cleanup(): void {\n if (this.activeChannel) {\n this.activeChannel.leave();\n this.activeChannel = null;\n }\n if (this.socket) {\n this.socket.disconnect();\n this.socket = null;\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.js","names":["Observable","Socket","NEVER","EMPTY","AbstractAgent","Subject","EMPTY","EventType","Notification","EMPTY","HttpAgent","RUNTIME_MODE_SSE","RUNTIME_MODE_INTELLIGENCE","RUNTIME_MODE_SSE","HttpAgent","HttpAgent","Subscription","BehaviorSubject","Subject","asapScheduler"],"sources":["../src/utils/phoenix-observable.ts","../src/intelligence-agent.ts","../src/agent.ts","../src/core/agent-registry.ts","../src/core/context-store.ts","../src/core/suggestion-engine.ts","../src/core/run-handler.ts","../src/core/state-manager.ts","../src/core/core.ts","../src/types.ts","../src/utils/markdown.ts","../src/utils/micro-redux.ts","../src/threads.ts"],"sourcesContent":["import { Socket } from \"phoenix\";\nimport { EMPTY, NEVER, Observable, concat, defer, of, throwError } from \"rxjs\";\nimport {\n filter,\n finalize,\n mergeMap,\n scan,\n shareReplay,\n switchMap,\n take,\n} from \"rxjs/operators\";\n\n/**\n * Minimal Phoenix push contract used by the observable adapters.\n */\nexport interface ɵPhoenixPushLike {\n receive(status: string, callback: (payload?: unknown) => unknown): unknown;\n}\n\n/**\n * Minimal Phoenix channel contract used by the observable adapters.\n */\nexport interface ɵPhoenixChannelLike {\n on(event: string, callback: (payload: unknown) => void): number;\n off(event: string, ref?: number): void;\n onError?(callback: (reason?: unknown) => void): unknown;\n join(params?: Record<string, unknown>): ɵPhoenixPushLike;\n push?(event: string, payload: unknown): ɵPhoenixPushLike;\n leave(): void;\n}\n\n/**\n * Minimal Phoenix socket contract used by the observable adapters.\n */\nexport interface ɵPhoenixSocketLike {\n connect(): void;\n disconnect(): void;\n channel(topic: string, params?: Record<string, unknown>): ɵPhoenixChannelLike;\n onError(callback: (error?: unknown) => void): unknown;\n onOpen(callback: () => void): unknown;\n}\n\n/**\n * Socket lifecycle notifications exposed by {@link ɵphoenixSocket$}.\n */\nexport type ɵPhoenixSocketSignal =\n | { type: \"open\" }\n | { type: \"error\"; error?: unknown };\n\n/**\n * Terminal outcomes of a Phoenix channel join attempt.\n */\nexport type ɵPhoenixJoinOutcome =\n | { type: \"joined\" }\n | { type: \"error\"; response?: unknown }\n | { type: \"timeout\" };\n\n/**\n * Active Phoenix socket session plus its derived lifecycle stream.\n */\nexport interface ɵPhoenixSocketSession {\n socket: ɵPhoenixSocketLike;\n signals$: Observable<ɵPhoenixSocketSignal>;\n}\n\n/**\n * Active Phoenix channel session plus its derived join-outcome stream.\n */\nexport interface ɵPhoenixChannelSession {\n channel: ɵPhoenixChannelLike;\n joinOutcome$: Observable<ɵPhoenixJoinOutcome>;\n}\n\n/**\n * Options for creating a cold Phoenix socket session stream.\n */\nexport interface ɵPhoenixSocketOptions {\n url: string;\n options?: Record<string, unknown>;\n}\n\n/**\n * Options for creating a cold Phoenix channel session stream from a socket stream.\n */\nexport interface ɵPhoenixChannelOptions {\n socket$: Observable<ɵPhoenixSocketSession>;\n topic: string;\n params?: Record<string, unknown>;\n leaveOnUnsubscribe?: boolean;\n}\n\n/**\n * Adapt Phoenix socket open/error callbacks into an observable signal stream.\n *\n * The returned observable is shared and replayable by the caller when needed,\n * but this helper itself does not own socket connection teardown.\n */\nfunction ɵcreatePhoenixSocketSignals$(\n socket: ɵPhoenixSocketLike,\n): Observable<ɵPhoenixSocketSignal> {\n return new Observable<ɵPhoenixSocketSignal>((observer) => {\n socket.onOpen(() => observer.next({ type: \"open\" }));\n socket.onError((error) => observer.next({ type: \"error\", error }));\n });\n}\n\n/**\n * Adapt a Phoenix channel join attempt into a single-outcome observable.\n */\nfunction ɵcreatePhoenixJoinOutcome$(\n channel: ɵPhoenixChannelLike,\n): Observable<ɵPhoenixJoinOutcome> {\n return new Observable<ɵPhoenixJoinOutcome>((observer) => {\n channel\n .join()\n .receive(\"ok\", () => {\n observer.next({ type: \"joined\" });\n observer.complete();\n })\n .receive(\"error\", (response?: unknown) => {\n observer.next({ type: \"error\", response });\n observer.complete();\n })\n .receive(\"timeout\", () => {\n observer.next({ type: \"timeout\" });\n observer.complete();\n });\n });\n}\n\n/**\n * Create a cold Phoenix socket session.\n *\n * The socket is constructed and connected on subscription, and disconnected on\n * teardown. Each subscription creates an isolated socket instance.\n */\nexport function ɵphoenixSocket$(\n options: ɵPhoenixSocketOptions,\n): Observable<ɵPhoenixSocketSession> {\n return defer(() => {\n const socket = new Socket(\n options.url,\n options.options as ConstructorParameters<typeof Socket>[1],\n ) as ɵPhoenixSocketLike;\n const signals$ = ɵcreatePhoenixSocketSignals$(socket).pipe(\n shareReplay({ bufferSize: 1, refCount: true }),\n );\n\n socket.connect();\n\n return concat(\n of({\n socket,\n signals$,\n }),\n NEVER,\n ).pipe(finalize(() => socket.disconnect()));\n });\n}\n\n/**\n * Create a cold Phoenix channel session from a socket session stream.\n *\n * A channel is created and joined for each active socket session. If the\n * upstream socket session changes, the previous channel is left before the\n * next one becomes active.\n */\nexport function ɵphoenixChannel$(\n options: ɵPhoenixChannelOptions,\n): Observable<ɵPhoenixChannelSession> {\n return options.socket$.pipe(\n switchMap(({ socket }) =>\n defer(() => {\n const channel = socket.channel(options.topic, options.params);\n const joinOutcome$ = ɵcreatePhoenixJoinOutcome$(channel).pipe(\n shareReplay({ bufferSize: 1, refCount: true }),\n );\n\n return concat(\n of({\n channel,\n joinOutcome$,\n }),\n NEVER,\n ).pipe(\n finalize(() => {\n if (options.leaveOnUnsubscribe !== false) {\n channel.leave();\n }\n }),\n );\n }),\n ),\n );\n}\n\n/**\n * Observe a named Phoenix channel event as an observable payload stream.\n */\nexport function ɵobservePhoenixEvent$<T>(\n channel: ɵPhoenixChannelLike,\n eventName: string,\n): Observable<T> {\n return new Observable<T>((observer) => {\n const ref = channel.on(eventName, (payload) => observer.next(payload as T));\n\n return () => {\n channel.off(eventName, ref);\n };\n });\n}\n\n/**\n * Flatten channel sessions into their join-outcome stream.\n */\nexport function ɵobservePhoenixJoinOutcome$(\n channel$: Observable<ɵPhoenixChannelSession>,\n): Observable<ɵPhoenixJoinOutcome> {\n return channel$.pipe(switchMap((session) => session.joinOutcome$));\n}\n\n/**\n * Complete when a channel joins successfully, or error if the join fails.\n */\nexport function ɵjoinPhoenixChannel$(\n channel$: Observable<ɵPhoenixChannelSession>,\n): Observable<never> {\n return ɵobservePhoenixJoinOutcome$(channel$).pipe(\n take(1),\n mergeMap((outcome) => {\n if (outcome.type === \"joined\") {\n return EMPTY;\n }\n\n throw outcome.type === \"timeout\"\n ? new Error(\"Timed out joining channel\")\n : new Error(\n `Failed to join channel: ${JSON.stringify(outcome.response)}`,\n );\n }),\n );\n}\n\n/**\n * Flatten socket sessions into their lifecycle signal stream.\n */\nexport function ɵobservePhoenixSocketSignals$(\n socket$: Observable<ɵPhoenixSocketSession>,\n): Observable<ɵPhoenixSocketSignal> {\n return socket$.pipe(switchMap((session) => session.signals$));\n}\n\n/**\n * Error after a socket emits the configured number of consecutive error\n * signals, resetting the counter after each successful open signal.\n */\nexport function ɵobservePhoenixSocketHealth$(\n socketSignals$: Observable<ɵPhoenixSocketSignal>,\n maxConsecutiveErrors: number,\n): Observable<never> {\n return socketSignals$.pipe(\n scan(\n (consecutiveErrors, signal) =>\n signal.type === \"open\" ? 0 : consecutiveErrors + 1,\n 0,\n ),\n filter((consecutiveErrors) => consecutiveErrors >= maxConsecutiveErrors),\n take(1),\n mergeMap((consecutiveErrors) =>\n throwError(\n () =>\n new Error(\n `WebSocket connection failed after ${consecutiveErrors} consecutive errors`,\n ),\n ),\n ),\n );\n}\n","import {\n AbstractAgent,\n RunAgentInput,\n RunAgentParameters,\n RunAgentResult,\n AgentSubscriber,\n EventType,\n BaseEvent,\n randomUUID,\n transformChunks,\n structuredClone_,\n} from \"@ag-ui/client\";\nimport {\n EMPTY,\n Subject,\n Notification,\n Observable,\n concat,\n defer,\n dematerialize,\n from,\n lastValueFrom,\n merge,\n switchMap,\n} from \"rxjs\";\nimport {\n catchError,\n endWith,\n finalize,\n ignoreElements,\n mergeMap,\n share,\n shareReplay,\n switchMap as switchMapOperator,\n take,\n takeUntil,\n tap,\n} from \"rxjs/operators\";\nimport type { Socket, Channel } from \"phoenix\";\nimport { phoenixExponentialBackoff } from \"@copilotkitnext/shared\";\nimport {\n ɵphoenixChannel$,\n ɵphoenixSocket$,\n type ɵPhoenixChannelSession,\n type ɵPhoenixSocketSession,\n ɵjoinPhoenixChannel$,\n ɵobservePhoenixSocketSignals$,\n ɵobservePhoenixSocketHealth$,\n ɵobservePhoenixEvent$,\n} from \"./utils/phoenix-observable\";\n\nconst CLIENT_AG_UI_EVENT = \"ag_ui_event\";\nconst STOP_RUN_EVENT = \"stop_run\";\ninterface ThreadJoinCredentials {\n joinToken: string;\n}\n\ninterface IntelligenceAgentSharedState {\n lastSeenEventIds: Map<string, string>;\n}\n\ninterface ConnectBootstrapPlan {\n mode: \"bootstrap\";\n latestEventId: string | null;\n events: BaseEvent[];\n}\n\ninterface ConnectLivePlan {\n mode: \"live\";\n joinToken: string;\n joinFromEventId: string | null;\n events: BaseEvent[];\n}\n\ntype NormalizedConnectPlan = ConnectBootstrapPlan | ConnectLivePlan;\n\nexport interface IntelligenceAgentConfig {\n /** Phoenix websocket URL, e.g. \"ws://localhost:4000/socket\" */\n url: string;\n /** Runtime REST URL, e.g. \"http://localhost:4000\" */\n runtimeUrl: string;\n /** Agent identifier for REST endpoints */\n agentId: string;\n /** Optional params sent on socket connect (e.g. auth token) */\n socketParams?: Record<string, string>;\n /** Optional headers sent with REST requests */\n headers?: Record<string, string>;\n /** Optional credentials mode for fetch requests */\n credentials?: RequestCredentials;\n}\n\nexport class IntelligenceAgent extends AbstractAgent {\n private config: IntelligenceAgentConfig;\n private socket: Socket | null = null;\n private activeChannel: Channel | null = null;\n private runId: string | null = null;\n private sharedState: IntelligenceAgentSharedState;\n\n constructor(\n config: IntelligenceAgentConfig,\n sharedState: IntelligenceAgentSharedState = {\n lastSeenEventIds: new Map<string, string>(),\n },\n ) {\n super();\n this.config = config;\n this.sharedState = sharedState;\n }\n\n clone(): IntelligenceAgent {\n return new IntelligenceAgent(this.config, this.sharedState);\n }\n\n /**\n * Override of AbstractAgent.connectAgent that removes the `verifyEvents` step.\n *\n * Background: AbstractAgent's connectAgent pipeline runs events through\n * `verifyEvents`, which validates that the stream follows the AG-UI protocol\n * lifecycle — specifically, it expects a RUN_STARTED event before any content\n * events and a RUN_FINISHED/RUN_ERROR event to complete the stream.\n *\n * IntelligenceAgent uses long-lived WebSocket connections rather than\n * request-scoped SSE streams. When connecting to replay historical messages\n * for an existing thread, the connection semantics don't map to a single\n * agent run start/stop cycle. The replayed events may not include\n * RUN_STARTED/RUN_FINISHED bookends (or may contain events from multiple\n * past runs), which causes verifyEvents to either never complete or to\n * error out.\n *\n * This override replicates the base connectAgent implementation exactly,\n * substituting only `transformChunks` (which is still needed for message\n * reassembly) and omitting `verifyEvents`.\n *\n * TODO: Remove this override once AG-UI's AbstractAgent supports opting out\n * of verifyEvents for transports with different connection life-cycles.\n */\n override async connectAgent(\n parameters?: RunAgentParameters,\n subscriber?: AgentSubscriber,\n ): Promise<RunAgentResult> {\n // Access private fields through a type escape hatch — these are set/read\n // by the base class and must be managed identically to the original.\n // Using `any` because these fields are private in AbstractAgent, and\n // intersecting private+public members of the same name produces `never`.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const self = this as any;\n\n try {\n this.isRunning = true;\n this.agentId = this.agentId ?? randomUUID();\n\n const input = this.prepareRunAgentInput(parameters);\n let result: RunAgentResult[\"result\"];\n const previousMessageIds = new Set(this.messages.map((m) => m.id));\n const subscribers: AgentSubscriber[] = [\n {\n onRunFinishedEvent: (event) => {\n result = event.result;\n },\n },\n ...this.subscribers,\n subscriber ?? {},\n ];\n\n await this.onInitialize(input, subscribers);\n\n self.activeRunDetach$ = new Subject<void>();\n let resolveCompletion: (() => void) | undefined;\n self.activeRunCompletionPromise = new Promise<void>((resolve) => {\n resolveCompletion = resolve;\n });\n\n const source$ = defer(() => this.connect(input)).pipe(\n // transformChunks reassembles partial/streamed messages — still needed.\n transformChunks(this.debug),\n // NOTE: verifyEvents is intentionally omitted here. See JSDoc above.\n takeUntil(self.activeRunDetach$),\n );\n\n const applied$ = this.apply(input, source$, subscribers);\n const processed$ = this.processApplyEvents(input, applied$, subscribers);\n\n await lastValueFrom(\n processed$.pipe(\n catchError((error) => {\n this.isRunning = false;\n return this.onError(input, error, subscribers);\n }),\n finalize(() => {\n this.isRunning = false;\n this.onFinalize(input, subscribers);\n resolveCompletion?.();\n resolveCompletion = undefined;\n self.activeRunCompletionPromise = undefined;\n self.activeRunDetach$ = undefined;\n }),\n ),\n { defaultValue: undefined },\n );\n\n const newMessages = structuredClone_(this.messages).filter(\n (m) => !previousMessageIds.has(m.id),\n );\n return { result, newMessages };\n } finally {\n this.isRunning = false;\n }\n }\n\n abortRun(): void {\n if (this.activeChannel && this.runId) {\n // Defer cleanup until the push is acknowledged so socket.disconnect()\n // doesn't clear the push buffer before the stop signal is sent.\n // The 5-second fallback handles the case where the socket is down and\n // Phoenix never flushes the buffered push (its .receive(\"timeout\") only\n // fires for pushes that were actually sent but not replied to).\n // detachActiveRun() gracefully tears down the connectAgent() pipeline;\n // cleanup() follows as a safety net for the run() path.\n const fallback = setTimeout(() => clear(), 5_000);\n const clear = () => {\n clearTimeout(fallback);\n void this.detachActiveRun();\n this.cleanup();\n };\n\n this.activeChannel\n .push(STOP_RUN_EVENT, { run_id: this.runId })\n .receive(\"ok\", clear)\n .receive(\"error\", clear)\n .receive(\"timeout\", clear);\n } else {\n void this.detachActiveRun();\n this.cleanup();\n }\n }\n\n /**\n * Trigger the run via REST, then join the realtime thread channel and relay\n * server-pushed AG-UI events to the Observable subscriber.\n */\n run(input: RunAgentInput): Observable<BaseEvent> {\n this.threadId = input.threadId;\n this.runId = input.runId;\n\n return defer(() => this.requestJoinCredentials$(\"run\", input)).pipe(\n switchMap((credentials) =>\n this.observeThread$(input, credentials, {\n completeOnRunError: false,\n streamMode: \"run\",\n }),\n ),\n );\n }\n\n /**\n * Reconnect to an existing thread by fetching websocket credentials and\n * joining the realtime thread channel.\n */\n protected connect(input: RunAgentInput): Observable<BaseEvent> {\n this.threadId = input.threadId;\n this.runId = input.runId;\n\n return defer(() => this.requestConnectPlan$(input)).pipe(\n switchMap((plan) => {\n if (plan === null) {\n return EMPTY;\n }\n\n if (plan.mode === \"bootstrap\") {\n this.setLastSeenEventId(input.threadId, plan.latestEventId);\n // Capture run_id from replay events so abortRun sends the\n // correct ID to the backend (the client-generated runId from\n // prepareRunAgentInput won't match the actual backend run).\n for (const event of plan.events) {\n this.updateRunIdFromEvent(event);\n }\n return from(plan.events);\n }\n\n this.setLastSeenEventId(input.threadId, plan.joinFromEventId);\n\n // Capture run_id from replay events (same rationale as bootstrap).\n for (const event of plan.events) {\n this.updateRunIdFromEvent(event);\n }\n\n return concat(\n from(plan.events),\n this.observeThread$(\n input,\n { joinToken: plan.joinToken },\n {\n completeOnRunError: true,\n streamMode: \"connect\",\n replayCursor: plan.joinFromEventId,\n },\n ),\n );\n }),\n );\n }\n\n /**\n * Tear down a specific channel + socket pair that belongs to one pipeline.\n * Only nulls instance references when they still point to the owned resource,\n * so a concurrent pipeline's resources are never clobbered.\n */\n private cleanupOwned(\n ownChannel: Channel | null,\n ownSocket: Socket | null,\n ): void {\n if (ownChannel) {\n ownChannel.leave();\n if (this.activeChannel === ownChannel) {\n this.activeChannel = null;\n }\n }\n if (ownSocket) {\n ownSocket.disconnect();\n if (this.socket === ownSocket) {\n this.socket = null;\n }\n }\n if (this.threadId) {\n this.sharedState.lastSeenEventIds.delete(this.threadId);\n }\n this.runId = null;\n }\n\n private cleanup(): void {\n this.cleanupOwned(this.activeChannel, this.socket);\n }\n\n private requestJoinCredentials$(\n mode: \"run\",\n input: RunAgentInput,\n ): Observable<ThreadJoinCredentials> {\n return defer(async () => {\n try {\n const response = await fetch(this.buildRuntimeUrl(mode), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.config.headers,\n },\n body: JSON.stringify({\n threadId: input.threadId,\n runId: input.runId,\n messages: input.messages,\n tools: input.tools,\n context: input.context,\n state: input.state,\n forwardedProps: input.forwardedProps,\n }),\n ...(this.config.credentials\n ? { credentials: this.config.credentials }\n : {}),\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new Error(\n text || response.statusText || String(response.status),\n );\n }\n\n const payload =\n (await response.json()) as Partial<ThreadJoinCredentials>;\n if (!payload.joinToken) {\n throw new Error(\"missing joinToken\");\n }\n\n return { joinToken: payload.joinToken };\n } catch (error) {\n throw new Error(\n `REST ${mode} request failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n });\n }\n\n private requestConnectPlan$(\n input: RunAgentInput,\n ): Observable<NormalizedConnectPlan | null> {\n return defer(async () => {\n try {\n const response = await fetch(this.buildRuntimeUrl(\"connect\"), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.config.headers,\n },\n body: JSON.stringify({\n threadId: input.threadId,\n runId: input.runId,\n messages: input.messages,\n tools: input.tools,\n context: input.context,\n state: input.state,\n forwardedProps: input.forwardedProps,\n lastSeenEventId: this.getReconnectCursor(input),\n }),\n ...(this.config.credentials\n ? { credentials: this.config.credentials }\n : {}),\n });\n\n if (response.status === 204) {\n return null;\n }\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new Error(\n text || response.statusText || String(response.status),\n );\n }\n\n return this.normalizeConnectPlan(await response.json());\n } catch (error) {\n throw new Error(\n `REST connect request failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n });\n }\n\n private normalizeConnectPlan(payload: unknown): NormalizedConnectPlan {\n const envelope =\n payload && typeof payload === \"object\"\n ? (payload as Record<string, unknown>)\n : null;\n\n if (envelope?.mode === \"bootstrap\") {\n return {\n mode: \"bootstrap\",\n latestEventId:\n typeof envelope.latestEventId === \"string\"\n ? envelope.latestEventId\n : null,\n events: Array.isArray(envelope.events)\n ? (envelope.events as BaseEvent[])\n : [],\n };\n }\n\n if (envelope?.mode === \"live\") {\n if (\n typeof envelope.joinToken !== \"string\" ||\n envelope.joinToken.length === 0\n ) {\n throw new Error(\"missing joinToken\");\n }\n\n return {\n mode: \"live\",\n joinToken: envelope.joinToken,\n joinFromEventId:\n typeof envelope.joinFromEventId === \"string\"\n ? envelope.joinFromEventId\n : null,\n events: Array.isArray(envelope.events)\n ? (envelope.events as BaseEvent[])\n : [],\n };\n }\n\n throw new Error(\"invalid connect plan\");\n }\n\n private observeThread$(\n input: RunAgentInput,\n credentials: ThreadJoinCredentials,\n options: {\n completeOnRunError: boolean;\n streamMode: \"run\" | \"connect\";\n replayCursor?: string | null;\n },\n ): Observable<BaseEvent> {\n return defer(() => {\n // Capture references to the socket and channel created by THIS pipeline\n // so the finalize closure only tears down its own resources. Without\n // this, a fire-and-forget detachActiveRun() from run-handler can race:\n // the old pipeline's deferred cleanup reads from `this.socket` /\n // `this.activeChannel`, which by then may already point to the NEW\n // pipeline's resources — destroying the live connection and preventing\n // the stop signal from ever reaching the backend.\n let ownSocket: Socket | null = null;\n let ownChannel: Channel | null = null;\n\n const socket$ = ɵphoenixSocket$({\n url: this.config.url,\n options: {\n params: {\n ...(this.config.socketParams ?? {}),\n join_token: credentials.joinToken,\n },\n reconnectAfterMs: phoenixExponentialBackoff(100, 10_000),\n rejoinAfterMs: phoenixExponentialBackoff(1_000, 30_000),\n },\n }).pipe(\n tap(({ socket }) => {\n ownSocket = socket as Socket;\n this.socket = ownSocket;\n }),\n shareReplay({ bufferSize: 1, refCount: true }),\n );\n const { topic, params } = this.createThreadChannelDescriptor(\n input,\n options.streamMode,\n options.replayCursor,\n );\n const channel$ = ɵphoenixChannel$({\n socket$,\n topic,\n params,\n }).pipe(\n tap(({ channel }) => {\n ownChannel = channel as Channel;\n this.activeChannel = ownChannel;\n }),\n shareReplay({ bufferSize: 1, refCount: true }),\n );\n const threadEvents$ = this.observeThreadEvents$(\n input.threadId,\n channel$,\n options,\n ).pipe(share());\n const threadCompleted$ = threadEvents$.pipe(\n ignoreElements(),\n endWith(null),\n take(1),\n );\n\n return merge(\n this.joinThreadChannel$(channel$),\n this.observeSocketHealth$(socket$).pipe(takeUntil(threadCompleted$)),\n threadEvents$,\n ).pipe(finalize(() => this.cleanupOwned(ownChannel, ownSocket)));\n });\n }\n\n private joinThreadChannel$(\n channel$: Observable<ɵPhoenixChannelSession>,\n ): Observable<never> {\n return ɵjoinPhoenixChannel$(channel$);\n }\n\n private observeSocketHealth$(\n socket$: Observable<ɵPhoenixSocketSession>,\n ): Observable<never> {\n return ɵobservePhoenixSocketHealth$(\n ɵobservePhoenixSocketSignals$(socket$),\n 5,\n );\n }\n\n private observeThreadEvents$(\n threadId: string,\n channel$: Observable<ɵPhoenixChannelSession>,\n options: { completeOnRunError: boolean },\n ): Observable<BaseEvent> {\n return channel$.pipe(\n switchMapOperator(({ channel }) =>\n this.observeChannelEvent$<BaseEvent>(channel, CLIENT_AG_UI_EVENT),\n ),\n tap((payload) => {\n this.updateLastSeenEventId(threadId, payload);\n this.updateRunIdFromEvent(payload);\n }),\n mergeMap((payload) =>\n from(\n this.createThreadNotifications(payload, options.completeOnRunError),\n ),\n ),\n dematerialize(),\n );\n }\n\n private observeChannelEvent$<T>(\n channel: Channel,\n eventName: string,\n ): Observable<T> {\n return ɵobservePhoenixEvent$<T>(channel, eventName);\n }\n\n private createThreadNotifications(\n payload: BaseEvent,\n completeOnRunError: boolean,\n ): Array<Notification<BaseEvent>> {\n if (payload.type === EventType.RUN_FINISHED) {\n return [Notification.createNext(payload), Notification.createComplete()];\n }\n\n if (payload.type === EventType.RUN_ERROR) {\n const errorMessage =\n (payload as BaseEvent & { message?: string }).message ?? \"Run error\";\n\n return completeOnRunError\n ? [Notification.createNext(payload), Notification.createComplete()]\n : [\n Notification.createNext(payload),\n Notification.createError(new Error(errorMessage)),\n ];\n }\n\n return [Notification.createNext(payload)];\n }\n\n private buildRuntimeUrl(mode: \"run\" | \"connect\"): string {\n const path = `${this.config.runtimeUrl}/agent/${encodeURIComponent(this.config.agentId)}/${mode}`;\n const origin =\n typeof window !== \"undefined\" && window.location\n ? window.location.origin\n : \"http://localhost\";\n\n return new URL(path, new URL(this.config.runtimeUrl, origin)).toString();\n }\n\n private createThreadChannelDescriptor(\n input: RunAgentInput,\n streamMode: \"run\" | \"connect\",\n replayCursor?: string | null,\n ): { topic: string; params: Record<string, unknown> } {\n const params =\n streamMode === \"run\"\n ? {\n stream_mode: \"run\",\n run_id: input.runId,\n }\n : {\n stream_mode: \"connect\",\n last_seen_event_id:\n replayCursor === undefined\n ? this.getReconnectCursor(input)\n : replayCursor,\n };\n\n return {\n topic: `thread:${input.threadId}`,\n params,\n };\n }\n\n private getLastSeenEventId(threadId: string): string | null {\n return this.sharedState.lastSeenEventIds.get(threadId) ?? null;\n }\n\n private getReconnectCursor(input: RunAgentInput): string | null {\n return this.hasLocalThreadMessages(input)\n ? this.getLastSeenEventId(input.threadId)\n : null;\n }\n\n private hasLocalThreadMessages(input: RunAgentInput): boolean {\n return Array.isArray(input.messages) && input.messages.length > 0;\n }\n\n private updateLastSeenEventId(threadId: string, payload: BaseEvent): void {\n const eventId = this.readEventId(payload);\n if (!eventId) {\n return;\n }\n\n this.sharedState.lastSeenEventIds.set(threadId, eventId);\n }\n\n private setLastSeenEventId(threadId: string, eventId: string | null): void {\n if (!eventId) {\n return;\n }\n\n this.sharedState.lastSeenEventIds.set(threadId, eventId);\n }\n\n /**\n * Keep `this.runId` in sync with the backend's actual run ID.\n *\n * During a `connect` (resume) flow the client generates a fresh `runId`\n * via `prepareRunAgentInput`, but the backend is running under its own\n * run ID. If the client later sends `STOP_RUN_EVENT` with the wrong\n * `runId`, the gateway's runner channel will not match it and the agent\n * keeps running. Extracting the run ID from live events fixes this.\n *\n * The runner normalises events to `run_id` (snake_case) before pushing\n * to the gateway, so we check both `runId` and `run_id`.\n */\n private updateRunIdFromEvent(payload: BaseEvent): void {\n const record = payload as BaseEvent & {\n runId?: string;\n run_id?: string;\n };\n const eventRunId = record.runId ?? record.run_id;\n if (typeof eventRunId === \"string\" && eventRunId.length > 0) {\n this.runId = eventRunId;\n }\n }\n\n private readEventId(payload: BaseEvent): string | null {\n const metadata = (payload as BaseEvent & { metadata?: unknown }).metadata;\n if (!metadata || typeof metadata !== \"object\") {\n return null;\n }\n\n const runnerEventId = (metadata as { cpki_event_id?: unknown })\n .cpki_event_id;\n return typeof runnerEventId === \"string\" ? runnerEventId : null;\n }\n}\n","import {\n AbstractAgent,\n AgentSubscriber,\n BaseEvent,\n HttpAgent,\n HttpAgentConfig,\n RunAgentInput,\n RunAgentParameters,\n RunAgentResult,\n runHttpRequest,\n transformHttpEventStream,\n} from \"@ag-ui/client\";\nimport { Observable, EMPTY, defer, from } from \"rxjs\";\nimport { catchError, switchMap } from \"rxjs/operators\";\nimport {\n RUNTIME_MODE_SSE,\n RUNTIME_MODE_INTELLIGENCE,\n type IntelligenceRuntimeInfo,\n type RuntimeInfo,\n type RuntimeMode,\n} from \"@copilotkitnext/shared\";\nimport { IntelligenceAgent } from \"./intelligence-agent\";\nimport { CopilotRuntimeTransport } from \"./types\";\n\ntype ResolvedRuntimeMode = RuntimeMode | \"pending\";\n\ninterface RunnableAgent {\n connect(input: RunAgentInput): Observable<BaseEvent>;\n run(input: RunAgentInput): Observable<BaseEvent>;\n}\n\nfunction hasHeaders(\n agent: AbstractAgent,\n): agent is AbstractAgent & { headers?: Record<string, string> } {\n return \"headers\" in agent;\n}\n\nfunction hasCredentials(\n agent: AbstractAgent,\n): agent is AbstractAgent & { credentials?: RequestCredentials } {\n return \"credentials\" in agent;\n}\n\nfunction isZodError(error: unknown): boolean {\n return (\n error !== null &&\n typeof error === \"object\" &&\n \"name\" in error &&\n (error as { name: string }).name === \"ZodError\"\n );\n}\n\nfunction withAbortErrorHandling(\n observable: Observable<BaseEvent>,\n): Observable<BaseEvent> {\n return observable.pipe(\n catchError((error) => {\n if (isZodError(error)) {\n return EMPTY;\n }\n throw error;\n }),\n );\n}\n\nexport interface ProxiedCopilotRuntimeAgentConfig extends Omit<\n HttpAgentConfig,\n \"url\"\n> {\n runtimeUrl?: string;\n transport?: CopilotRuntimeTransport;\n credentials?: RequestCredentials;\n runtimeMode?: ResolvedRuntimeMode;\n intelligence?: IntelligenceRuntimeInfo;\n}\n\nexport class ProxiedCopilotRuntimeAgent extends HttpAgent {\n runtimeUrl?: string;\n credentials?: RequestCredentials;\n private transport: CopilotRuntimeTransport;\n private singleEndpointUrl?: string;\n private runtimeMode: ResolvedRuntimeMode;\n private intelligence?: IntelligenceRuntimeInfo;\n private delegate?: AbstractAgent;\n private runtimeInfoPromise?: Promise<void>;\n\n constructor(config: ProxiedCopilotRuntimeAgentConfig) {\n const normalizedRuntimeUrl = config.runtimeUrl\n ? config.runtimeUrl.replace(/\\/$/, \"\")\n : undefined;\n const transport = config.transport ?? \"rest\";\n const runUrl =\n transport === \"single\"\n ? (normalizedRuntimeUrl ?? config.runtimeUrl ?? \"\")\n : `${normalizedRuntimeUrl ?? config.runtimeUrl}/agent/${encodeURIComponent(config.agentId ?? \"\")}/run`;\n\n if (!runUrl) {\n throw new Error(\n \"ProxiedCopilotRuntimeAgent requires a runtimeUrl when transport is set to 'single'.\",\n );\n }\n\n super({\n ...config,\n url: runUrl,\n });\n this.runtimeUrl = normalizedRuntimeUrl ?? config.runtimeUrl;\n this.credentials = config.credentials;\n this.transport = transport;\n this.runtimeMode = config.runtimeMode ?? RUNTIME_MODE_SSE;\n this.intelligence = config.intelligence;\n if (this.transport === \"single\") {\n this.singleEndpointUrl = this.runtimeUrl;\n }\n }\n\n override async detachActiveRun(): Promise<void> {\n if (this.delegate) {\n await this.delegate.detachActiveRun();\n }\n await super.detachActiveRun();\n }\n\n abortRun(): void {\n if (this.delegate) {\n this.syncDelegate(this.delegate);\n this.delegate.abortRun();\n // Also detach the proxy's own runAgent pipeline so the proxy's\n // isRunning resets and onRunFinalized fires even if the delegate's\n // observable doesn't propagate a clean completion.\n void this.detachActiveRun();\n return;\n }\n\n if (!this.agentId || !this.threadId) {\n return;\n }\n\n if (typeof fetch === \"undefined\") {\n return;\n }\n\n if (this.transport === \"single\") {\n if (!this.singleEndpointUrl) {\n return;\n }\n\n const headers = new Headers({\n ...this.headers,\n \"Content-Type\": \"application/json\",\n });\n void fetch(this.singleEndpointUrl, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n method: \"agent/stop\",\n params: {\n agentId: this.agentId,\n threadId: this.threadId,\n },\n }),\n ...(this.credentials ? { credentials: this.credentials } : {}),\n }).catch((error) => {\n console.error(\"ProxiedCopilotRuntimeAgent: stop request failed\", error);\n });\n return;\n }\n\n if (!this.runtimeUrl) {\n return;\n }\n\n const stopPath = `${this.runtimeUrl}/agent/${encodeURIComponent(this.agentId)}/stop/${encodeURIComponent(this.threadId)}`;\n const origin =\n typeof window !== \"undefined\" && window.location\n ? window.location.origin\n : \"http://localhost\";\n const base = new URL(this.runtimeUrl, origin);\n const stopUrl = new URL(stopPath, base);\n\n void fetch(stopUrl.toString(), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.headers,\n },\n ...(this.credentials ? { credentials: this.credentials } : {}),\n }).catch((error) => {\n console.error(\"ProxiedCopilotRuntimeAgent: stop request failed\", error);\n });\n }\n\n override async connectAgent(\n parameters?: RunAgentParameters,\n subscriber?: AgentSubscriber,\n ): Promise<RunAgentResult> {\n if (this.runtimeMode !== RUNTIME_MODE_INTELLIGENCE) {\n return super.connectAgent(parameters, subscriber);\n }\n\n // If the delegate already has an active run (e.g. from a previous\n // connectAgent call that hasn't finished yet), detach it first. This\n // ensures only one run is active on the delegate at a time — without it,\n // two parallel runs would both pump events into the shared delegate,\n // and both bridge subscriptions would copy the interleaved messages to\n // the proxy, causing the UI to flicker between the two conversations.\n if (this.delegate) {\n await this.delegate.detachActiveRun();\n }\n\n // Ensure the delegate exists and is synced with the proxy's current state.\n await this.resolveDelegate();\n const delegate = this.delegate!;\n\n // Subscribe a bridging observer FIRST so it fires before the forwarded\n // UI subscribers. This keeps proxy.messages in sync with the delegate\n // in real-time — otherwise the UI re-renders (triggered by the\n // forwarded onMessagesChanged) but reads stale proxy.messages because\n // the final sync only happens after connectAgent resolves.\n const bridgeSub = delegate.subscribe({\n onMessagesChanged: () => {\n this.setMessages([...delegate.messages]);\n },\n onStateChanged: () => {\n this.setState({ ...delegate.state });\n },\n // Mirror isRunning so the proxy reflects the delegate's run lifecycle.\n // Without this, UI components read proxy.isRunning (always false) even\n // though the delegate is actively running, causing the stop button to\n // never appear.\n onRunInitialized: () => {\n this.isRunning = true;\n },\n onRunFinalized: () => {\n this.isRunning = false;\n },\n onRunFailed: () => {\n this.isRunning = false;\n },\n });\n\n // Forward the proxy's subscribers to the delegate so that UI hooks\n // (e.g. useAgent's onMessagesChanged) receive real-time updates as\n // the delegate processes events during connectAgent.\n const forwardedSubs = this.subscribers.map((s) => delegate.subscribe(s));\n\n try {\n const result = await delegate.connectAgent(parameters, subscriber);\n\n // Final sync to guarantee the proxy reflects the delegate's end state.\n this.setMessages([...delegate.messages]);\n this.setState({ ...delegate.state });\n\n return result;\n } finally {\n // Ensure the proxy's isRunning is reset — the bridging subscription\n // may have already handled this, but if the delegate threw before\n // firing onRunFinalized the proxy would be stuck in isRunning=true.\n this.isRunning = false;\n // Remove forwarded subscribers to avoid duplicate notifications on\n // subsequent calls (they'll be re-forwarded next time).\n bridgeSub.unsubscribe();\n for (const sub of forwardedSubs) {\n sub.unsubscribe();\n }\n }\n }\n\n connect(input: RunAgentInput): Observable<BaseEvent> {\n if (this.runtimeMode === RUNTIME_MODE_INTELLIGENCE) {\n return this.#connectViaDelegate(input);\n }\n return this.#connectViaHttp(input);\n }\n\n public run(input: RunAgentInput): Observable<BaseEvent> {\n if (this.runtimeMode === RUNTIME_MODE_INTELLIGENCE) {\n return this.#runViaDelegate(input);\n }\n return this.#runViaHttp(input);\n }\n\n #connectViaDelegate(input: RunAgentInput): Observable<BaseEvent> {\n return defer(() => from(this.resolveDelegate())).pipe(\n switchMap((delegate) => withAbortErrorHandling(delegate.connect(input))),\n );\n }\n\n #connectViaHttp(input: RunAgentInput): Observable<BaseEvent> {\n if (this.transport === \"single\") {\n if (!this.singleEndpointUrl) {\n throw new Error(\"Single endpoint transport requires a runtimeUrl\");\n }\n\n const requestInit = this.createSingleRouteRequestInit(\n input,\n \"agent/connect\",\n {\n agentId: this.agentId!,\n },\n );\n const httpEvents = runHttpRequest(this.singleEndpointUrl, requestInit);\n return withAbortErrorHandling(transformHttpEventStream(httpEvents));\n }\n\n const httpEvents = runHttpRequest(\n `${this.runtimeUrl}/agent/${this.agentId}/connect`,\n this.requestInit(input),\n );\n return withAbortErrorHandling(transformHttpEventStream(httpEvents));\n }\n\n #runViaDelegate(input: RunAgentInput): Observable<BaseEvent> {\n return defer(() => from(this.resolveDelegate())).pipe(\n switchMap((delegate) => withAbortErrorHandling(delegate.run(input))),\n );\n }\n\n #runViaHttp(input: RunAgentInput): Observable<BaseEvent> {\n if (this.transport === \"single\") {\n if (!this.singleEndpointUrl) {\n throw new Error(\"Single endpoint transport requires a runtimeUrl\");\n }\n\n const requestInit = this.createSingleRouteRequestInit(\n input,\n \"agent/run\",\n {\n agentId: this.agentId!,\n },\n );\n const httpEvents = runHttpRequest(this.singleEndpointUrl, requestInit);\n return withAbortErrorHandling(transformHttpEventStream(httpEvents));\n }\n\n return withAbortErrorHandling(super.run(input));\n }\n\n public override clone(): ProxiedCopilotRuntimeAgent {\n const cloned = new ProxiedCopilotRuntimeAgent({\n runtimeUrl: this.runtimeUrl,\n agentId: this.agentId,\n description: this.description,\n headers: { ...this.headers },\n credentials: this.credentials,\n transport: this.transport,\n runtimeMode: this.runtimeMode,\n intelligence: this.intelligence,\n });\n cloned.threadId = this.threadId;\n cloned.setState(this.state);\n cloned.setMessages(this.messages);\n if (this.delegate) {\n cloned.delegate = this.delegate.clone();\n cloned.syncDelegate(cloned.delegate);\n }\n return cloned;\n }\n\n private async resolveDelegate(): Promise<RunnableAgent> {\n await this.ensureRuntimeMode();\n\n if (!this.delegate) {\n if (this.runtimeMode !== RUNTIME_MODE_INTELLIGENCE) {\n throw new Error(\"A delegate is only created for Intelligence mode\");\n }\n this.delegate = this.createIntelligenceDelegate();\n }\n\n this.syncDelegate(this.delegate);\n\n // AbstractAgent declares connect() as protected, but concrete delegates\n // (IntelligenceAgent, HttpAgent) expose both connect() and run() publicly.\n return this.delegate as unknown as RunnableAgent;\n }\n\n private async ensureRuntimeMode(): Promise<void> {\n if (this.runtimeMode !== \"pending\") {\n return;\n }\n\n if (!this.runtimeUrl) {\n throw new Error(\"Runtime URL is not set\");\n }\n\n this.runtimeInfoPromise ??= this.fetchRuntimeInfo().then((runtimeInfo) => {\n this.runtimeMode = runtimeInfo.mode ?? RUNTIME_MODE_SSE;\n this.intelligence = runtimeInfo.intelligence;\n });\n\n await this.runtimeInfoPromise;\n }\n\n private async fetchRuntimeInfo(): Promise<RuntimeInfo> {\n const headers: Record<string, string> = {\n ...this.headers,\n };\n\n let init: RequestInit;\n let url: string;\n\n if (this.transport === \"single\") {\n if (!this.singleEndpointUrl) {\n throw new Error(\"Single endpoint transport requires a runtimeUrl\");\n }\n if (!headers[\"Content-Type\"]) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n url = this.runtimeUrl!;\n init = { method: \"POST\", body: JSON.stringify({ method: \"info\" }) };\n } else {\n url = `${this.runtimeUrl}/info`;\n init = {};\n }\n\n const response = await fetch(url, {\n ...init,\n headers,\n ...(this.credentials ? { credentials: this.credentials } : {}),\n });\n if (!response.ok) {\n throw new Error(\n `Runtime info request failed with status ${response.status}`,\n );\n }\n return (await response.json()) as RuntimeInfo;\n }\n\n private createSingleRouteRequestInit(\n input: RunAgentInput,\n method: string,\n params?: Record<string, string>,\n ): RequestInit {\n if (!this.agentId) {\n throw new Error(\n \"ProxiedCopilotRuntimeAgent requires agentId to make runtime requests\",\n );\n }\n\n const baseInit = super.requestInit(input);\n const headers = new Headers(baseInit.headers ?? {});\n headers.set(\"Content-Type\", \"application/json\");\n headers.set(\"Accept\", headers.get(\"Accept\") ?? \"text/event-stream\");\n\n let originalBody: unknown = undefined;\n if (typeof baseInit.body === \"string\") {\n try {\n originalBody = JSON.parse(baseInit.body);\n } catch (error) {\n console.warn(\n \"ProxiedCopilotRuntimeAgent: failed to parse request body for single route transport\",\n error,\n );\n }\n }\n\n const envelope: Record<string, unknown> = { method };\n\n if (params && Object.keys(params).length > 0) {\n envelope.params = params;\n }\n\n if (originalBody !== undefined) {\n envelope.body = originalBody;\n }\n\n return {\n ...baseInit,\n headers,\n body: JSON.stringify(envelope),\n ...(this.credentials ? { credentials: this.credentials } : {}),\n };\n }\n\n private createIntelligenceDelegate(): AbstractAgent {\n if (!this.runtimeUrl || !this.agentId || !this.intelligence?.wsUrl) {\n throw new Error(\n \"Intelligence mode requires runtimeUrl, agentId, and intelligence websocket metadata\",\n );\n }\n\n return new IntelligenceAgent({\n url: this.intelligence.wsUrl,\n runtimeUrl: this.runtimeUrl,\n agentId: this.agentId,\n headers: { ...this.headers },\n credentials: this.credentials,\n });\n }\n\n private syncDelegate(delegate: AbstractAgent): void {\n delegate.agentId = this.agentId;\n delegate.description = this.description;\n delegate.threadId = this.threadId;\n delegate.setMessages(this.messages);\n delegate.setState(this.state);\n\n if (hasHeaders(delegate)) {\n delegate.headers = { ...this.headers };\n }\n\n if (hasCredentials(delegate)) {\n delegate.credentials = this.credentials;\n }\n }\n}\n","import { AbstractAgent, HttpAgent } from \"@ag-ui/client\";\nimport {\n logger,\n RuntimeInfo,\n AgentDescription,\n RuntimeMode,\n IntelligenceRuntimeInfo,\n RUNTIME_MODE_SSE,\n RUNTIME_MODE_INTELLIGENCE,\n} from \"@copilotkitnext/shared\";\nimport { ProxiedCopilotRuntimeAgent } from \"../agent\";\nimport type { CopilotKitCore } from \"./core\";\nimport {\n CopilotKitCoreErrorCode,\n CopilotKitCoreRuntimeConnectionStatus,\n CopilotKitCoreFriendsAccess,\n} from \"./core\";\nimport { CopilotRuntimeTransport } from \"../types\";\n\nexport interface CopilotKitCoreAddAgentParams {\n id: string;\n agent: AbstractAgent;\n}\n\n/**\n * Manages agent registration, lifecycle, and runtime connectivity for CopilotKitCore.\n * Handles both local development agents and remote runtime agents.\n */\nexport class AgentRegistry {\n private _agents: Record<string, AbstractAgent> = {};\n private localAgents: Record<string, AbstractAgent> = {};\n private remoteAgents: Record<string, AbstractAgent> = {};\n\n private _runtimeUrl?: string;\n private _runtimeVersion?: string;\n private _runtimeConnectionStatus: CopilotKitCoreRuntimeConnectionStatus =\n CopilotKitCoreRuntimeConnectionStatus.Disconnected;\n private _runtimeTransport: CopilotRuntimeTransport = \"rest\";\n private _audioFileTranscriptionEnabled: boolean = false;\n private _runtimeMode: RuntimeMode = RUNTIME_MODE_SSE;\n private _intelligence?: IntelligenceRuntimeInfo;\n private _a2uiEnabled: boolean = false;\n\n constructor(private core: CopilotKitCore) {}\n\n /**\n * Get all agents as a readonly record\n */\n get agents(): Readonly<Record<string, AbstractAgent>> {\n return this._agents;\n }\n\n get runtimeUrl(): string | undefined {\n return this._runtimeUrl;\n }\n\n get runtimeVersion(): string | undefined {\n return this._runtimeVersion;\n }\n\n get runtimeConnectionStatus(): CopilotKitCoreRuntimeConnectionStatus {\n return this._runtimeConnectionStatus;\n }\n\n get runtimeTransport(): CopilotRuntimeTransport {\n return this._runtimeTransport;\n }\n\n get audioFileTranscriptionEnabled(): boolean {\n return this._audioFileTranscriptionEnabled;\n }\n\n get runtimeMode(): RuntimeMode {\n return this._runtimeMode;\n }\n\n get intelligence(): IntelligenceRuntimeInfo | undefined {\n return this._intelligence;\n }\n\n get a2uiEnabled(): boolean {\n return this._a2uiEnabled;\n }\n\n /**\n * Initialize agents from configuration\n */\n initialize(agents: Record<string, AbstractAgent>): void {\n this.localAgents = this.assignAgentIds(agents);\n this.applyHeadersToAgents(this.localAgents);\n this._agents = this.localAgents;\n }\n\n /**\n * Set the runtime URL and update connection\n */\n setRuntimeUrl(runtimeUrl: string | undefined): void {\n const normalizedRuntimeUrl = runtimeUrl\n ? runtimeUrl.replace(/\\/$/, \"\")\n : undefined;\n\n if (this._runtimeUrl === normalizedRuntimeUrl) {\n return;\n }\n\n this._runtimeUrl = normalizedRuntimeUrl;\n void this.updateRuntimeConnection();\n }\n\n setRuntimeTransport(runtimeTransport: CopilotRuntimeTransport): void {\n if (this._runtimeTransport === runtimeTransport) {\n return;\n }\n\n this._runtimeTransport = runtimeTransport;\n void this.updateRuntimeConnection();\n }\n\n /**\n * Set all agents at once (for development use)\n */\n setAgents__unsafe_dev_only(agents: Record<string, AbstractAgent>): void {\n // Validate all agents before making any changes\n Object.entries(agents).forEach(([id, agent]) => {\n if (agent) {\n this.validateAndAssignAgentId(id, agent);\n }\n });\n this.localAgents = agents;\n this._agents = { ...this.localAgents, ...this.remoteAgents };\n this.applyHeadersToAgents(this._agents);\n void this.notifyAgentsChanged();\n }\n\n /**\n * Add a single agent (for development use)\n */\n addAgent__unsafe_dev_only({ id, agent }: CopilotKitCoreAddAgentParams): void {\n this.validateAndAssignAgentId(id, agent);\n this.localAgents[id] = agent;\n this.applyHeadersToAgent(agent);\n this._agents = { ...this.localAgents, ...this.remoteAgents };\n void this.notifyAgentsChanged();\n }\n\n /**\n * Remove an agent by ID (for development use)\n */\n removeAgent__unsafe_dev_only(id: string): void {\n delete this.localAgents[id];\n this._agents = { ...this.localAgents, ...this.remoteAgents };\n void this.notifyAgentsChanged();\n }\n\n /**\n * Get an agent by ID\n */\n getAgent(id: string): AbstractAgent | undefined {\n if (id in this._agents) {\n return this._agents[id] as AbstractAgent;\n }\n\n // Silently return undefined if we're still loading runtime agents\n if (\n this.runtimeUrl !== undefined &&\n (this.runtimeConnectionStatus ===\n CopilotKitCoreRuntimeConnectionStatus.Disconnected ||\n this.runtimeConnectionStatus ===\n CopilotKitCoreRuntimeConnectionStatus.Connecting)\n ) {\n return undefined;\n }\n\n console.warn(`Agent ${id} not found`);\n return undefined;\n }\n\n /**\n * Apply current headers to an agent\n */\n applyHeadersToAgent(agent: AbstractAgent): void {\n if (agent instanceof HttpAgent) {\n agent.headers = {\n ...(this.core as unknown as CopilotKitCoreFriendsAccess).headers,\n };\n }\n }\n\n /**\n * Apply current headers to all agents\n */\n applyHeadersToAgents(agents: Record<string, AbstractAgent>): void {\n Object.values(agents).forEach((agent) => {\n this.applyHeadersToAgent(agent);\n });\n }\n\n /**\n * Apply current credentials to an agent\n */\n applyCredentialsToAgent(agent: AbstractAgent): void {\n if (agent instanceof ProxiedCopilotRuntimeAgent) {\n agent.credentials = (\n this.core as unknown as CopilotKitCoreFriendsAccess\n ).credentials;\n }\n }\n\n /**\n * Apply current credentials to all agents\n */\n applyCredentialsToAgents(agents: Record<string, AbstractAgent>): void {\n Object.values(agents).forEach((agent) => {\n this.applyCredentialsToAgent(agent);\n });\n }\n\n /**\n * Update runtime connection and fetch remote agents\n */\n private async updateRuntimeConnection(): Promise<void> {\n // Skip fetching on the server (SSR)\n if (typeof window === \"undefined\") {\n return;\n }\n\n if (!this.runtimeUrl) {\n this._runtimeConnectionStatus =\n CopilotKitCoreRuntimeConnectionStatus.Disconnected;\n this._runtimeVersion = undefined;\n this._audioFileTranscriptionEnabled = false;\n this._runtimeMode = RUNTIME_MODE_SSE;\n this._intelligence = undefined;\n this._a2uiEnabled = false;\n this.remoteAgents = {};\n this._agents = this.localAgents;\n\n await this.notifyRuntimeStatusChanged(\n CopilotKitCoreRuntimeConnectionStatus.Disconnected,\n );\n await this.notifyAgentsChanged();\n return;\n }\n\n this._runtimeConnectionStatus =\n CopilotKitCoreRuntimeConnectionStatus.Connecting;\n await this.notifyRuntimeStatusChanged(\n CopilotKitCoreRuntimeConnectionStatus.Connecting,\n );\n\n try {\n const runtimeInfoResponse = await this.fetchRuntimeInfo();\n const {\n version,\n ...runtimeInfo\n }: {\n agents: Record<string, AgentDescription>;\n version: string;\n mode?: RuntimeMode;\n intelligence?: IntelligenceRuntimeInfo;\n } = runtimeInfoResponse;\n\n const credentials = (this.core as unknown as CopilotKitCoreFriendsAccess)\n .credentials;\n const agents: Record<string, AbstractAgent> = Object.fromEntries(\n Object.entries(runtimeInfo.agents).map(([id, { description }]) => {\n const agent = new ProxiedCopilotRuntimeAgent({\n runtimeUrl: this.runtimeUrl,\n agentId: id, // Runtime agents always have their ID set correctly\n description: description,\n transport: this._runtimeTransport,\n credentials,\n runtimeMode: runtimeInfoResponse.mode ?? RUNTIME_MODE_SSE,\n intelligence: runtimeInfoResponse.intelligence,\n });\n this.applyHeadersToAgent(agent);\n return [id, agent];\n }),\n );\n\n this.remoteAgents = agents;\n this._agents = { ...this.localAgents, ...this.remoteAgents };\n this._runtimeConnectionStatus =\n CopilotKitCoreRuntimeConnectionStatus.Connected;\n this._runtimeVersion = version;\n this._audioFileTranscriptionEnabled =\n runtimeInfoResponse.audioFileTranscriptionEnabled ?? false;\n this._runtimeMode = runtimeInfoResponse.mode ?? RUNTIME_MODE_SSE;\n this._intelligence = runtimeInfoResponse.intelligence;\n this._a2uiEnabled = runtimeInfoResponse.a2uiEnabled ?? false;\n\n await this.notifyRuntimeStatusChanged(\n CopilotKitCoreRuntimeConnectionStatus.Connected,\n );\n await this.notifyAgentsChanged();\n } catch (error) {\n this._runtimeConnectionStatus =\n CopilotKitCoreRuntimeConnectionStatus.Error;\n this._runtimeVersion = undefined;\n this._audioFileTranscriptionEnabled = false;\n this._runtimeMode = RUNTIME_MODE_SSE;\n this._intelligence = undefined;\n this._a2uiEnabled = false;\n this.remoteAgents = {};\n this._agents = this.localAgents;\n\n await this.notifyRuntimeStatusChanged(\n CopilotKitCoreRuntimeConnectionStatus.Error,\n );\n await this.notifyAgentsChanged();\n\n const message =\n error instanceof Error ? error.message : JSON.stringify(error);\n logger.warn(\n `Failed to load runtime info (${this.runtimeUrl}/info): ${message}`,\n );\n const runtimeError =\n error instanceof Error ? error : new Error(String(error));\n await (this.core as unknown as CopilotKitCoreFriendsAccess).emitError({\n error: runtimeError,\n code: CopilotKitCoreErrorCode.RUNTIME_INFO_FETCH_FAILED,\n context: {\n runtimeUrl: this.runtimeUrl,\n },\n });\n }\n }\n\n private async fetchRuntimeInfo(): Promise<RuntimeInfo> {\n if (!this.runtimeUrl) {\n throw new Error(\"Runtime URL is not set\");\n }\n\n const baseHeaders = (this.core as unknown as CopilotKitCoreFriendsAccess)\n .headers;\n const credentials = (this.core as unknown as CopilotKitCoreFriendsAccess)\n .credentials;\n const headers: Record<string, string> = {\n ...baseHeaders,\n };\n\n if (this._runtimeTransport === \"single\") {\n if (!headers[\"Content-Type\"]) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n const response = await fetch(this.runtimeUrl, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ method: \"info\" }),\n ...(credentials ? { credentials } : {}),\n });\n if (\"ok\" in response && !(response as Response).ok) {\n throw new Error(\n `Runtime info request failed with status ${response.status}`,\n );\n }\n return (await response.json()) as RuntimeInfo;\n }\n\n const response = await fetch(`${this.runtimeUrl}/info`, {\n headers,\n ...(credentials ? { credentials } : {}),\n });\n if (\"ok\" in response && !(response as Response).ok) {\n throw new Error(\n `Runtime info request failed with status ${response.status}`,\n );\n }\n return (await response.json()) as RuntimeInfo;\n }\n\n /**\n * Assign agent IDs to a record of agents\n */\n private assignAgentIds(\n agents: Record<string, AbstractAgent>,\n ): Record<string, AbstractAgent> {\n Object.entries(agents).forEach(([id, agent]) => {\n if (agent) {\n this.validateAndAssignAgentId(id, agent);\n }\n });\n return agents;\n }\n\n /**\n * Validate and assign an agent ID\n */\n private validateAndAssignAgentId(\n registrationId: string,\n agent: AbstractAgent,\n ): void {\n if (agent.agentId && agent.agentId !== registrationId) {\n throw new Error(\n `Agent registration mismatch: Agent with ID \"${agent.agentId}\" cannot be registered under key \"${registrationId}\". ` +\n `The agent ID must match the registration key or be undefined.`,\n );\n }\n if (!agent.agentId) {\n agent.agentId = registrationId;\n }\n }\n\n /**\n * Notify subscribers of runtime status changes\n */\n private async notifyRuntimeStatusChanged(\n status: CopilotKitCoreRuntimeConnectionStatus,\n ): Promise<void> {\n await (\n this.core as unknown as CopilotKitCoreFriendsAccess\n ).notifySubscribers(\n (subscriber) =>\n subscriber.onRuntimeConnectionStatusChanged?.({\n copilotkit: this.core,\n status,\n }),\n \"Error in CopilotKitCore subscriber (onRuntimeConnectionStatusChanged):\",\n );\n }\n\n /**\n * Notify subscribers of agent changes\n */\n private async notifyAgentsChanged(): Promise<void> {\n await (\n this.core as unknown as CopilotKitCoreFriendsAccess\n ).notifySubscribers(\n (subscriber) =>\n subscriber.onAgentsChanged?.({\n copilotkit: this.core,\n agents: this._agents,\n }),\n \"Subscriber onAgentsChanged error:\",\n );\n }\n}\n","import { Context } from \"@ag-ui/client\";\nimport { randomUUID } from \"@copilotkitnext/shared\";\nimport type { CopilotKitCore } from \"./core\";\nimport { CopilotKitCoreFriendsAccess } from \"./core\";\n\n/**\n * Manages context storage and lifecycle for CopilotKitCore.\n * Context represents additional information available to agents during execution.\n */\nexport class ContextStore {\n private _context: Record<string, Context> = {};\n\n constructor(private core: CopilotKitCore) {}\n\n /**\n * Get all context entries as a readonly record\n */\n get context(): Readonly<Record<string, Context>> {\n return this._context;\n }\n\n /**\n * Add a new context entry\n * @returns The ID of the created context entry\n */\n addContext({ description, value }: Context): string {\n const id = randomUUID();\n this._context[id] = { description, value };\n void this.notifySubscribers();\n return id;\n }\n\n /**\n * Remove a context entry by ID\n */\n removeContext(id: string): void {\n delete this._context[id];\n void this.notifySubscribers();\n }\n\n /**\n * Notify all subscribers of context changes\n */\n private async notifySubscribers(): Promise<void> {\n await (\n this.core as unknown as CopilotKitCoreFriendsAccess\n ).notifySubscribers(\n (subscriber) =>\n subscriber.onContextChanged?.({\n copilotkit: this.core,\n context: this._context,\n }),\n \"Subscriber onContextChanged error:\",\n );\n }\n}\n","import { AbstractAgent, Message, Tool, Context } from \"@ag-ui/client\";\nimport { randomUUID, partialJSONParse } from \"@copilotkitnext/shared\";\nimport type { CopilotKitCore } from \"./core\";\nimport type { CopilotKitCoreGetSuggestionsResult } from \"./core\";\nimport { CopilotKitCoreFriendsAccess } from \"./core\";\nimport {\n DynamicSuggestionsConfig,\n StaticSuggestionsConfig,\n Suggestion,\n SuggestionsConfig,\n} from \"../types\";\n\n/**\n * Manages suggestion generation, streaming, and lifecycle for CopilotKitCore.\n * Handles both dynamic (AI-generated) and static suggestions.\n */\nexport class SuggestionEngine {\n private _suggestionsConfig: Record<string, SuggestionsConfig> = {};\n private _suggestions: Record<string, Record<string, Suggestion[]>> = {};\n private _runningSuggestions: Record<string, AbstractAgent[]> = {};\n\n constructor(private core: CopilotKitCore) {}\n\n /**\n * Initialize with suggestion configs\n */\n initialize(suggestionsConfig: SuggestionsConfig[]): void {\n for (const config of suggestionsConfig) {\n this._suggestionsConfig[randomUUID()] = config;\n }\n }\n\n /**\n * Add a suggestion configuration\n * @returns The ID of the created config\n */\n addSuggestionsConfig(config: SuggestionsConfig): string {\n const id = randomUUID();\n this._suggestionsConfig[id] = config;\n void this.notifySuggestionsConfigChanged();\n return id;\n }\n\n /**\n * Remove a suggestion configuration by ID\n */\n removeSuggestionsConfig(id: string): void {\n delete this._suggestionsConfig[id];\n void this.notifySuggestionsConfigChanged();\n }\n\n /**\n * Reload suggestions for a specific agent\n * This triggers generation of new suggestions based on current configs\n */\n public reloadSuggestions(agentId: string): void {\n this.clearSuggestions(agentId);\n\n // Get agent to check message count for availability filtering\n const agent = (\n this.core as unknown as CopilotKitCoreFriendsAccess\n ).getAgent(agentId);\n if (!agent) {\n return;\n }\n\n const messageCount = agent.messages?.length ?? 0;\n let hasAnySuggestions = false;\n\n for (const config of Object.values(this._suggestionsConfig)) {\n // Check if config applies to this agent\n if (\n config.consumerAgentId !== undefined &&\n config.consumerAgentId !== \"*\" &&\n config.consumerAgentId !== agentId\n ) {\n continue;\n }\n\n // Check availability based on message count\n if (!this.shouldShowSuggestions(config, messageCount)) {\n continue;\n }\n\n const suggestionId = randomUUID();\n\n if (isDynamicSuggestionsConfig(config)) {\n if (!hasAnySuggestions) {\n hasAnySuggestions = true;\n void this.notifySuggestionsStartedLoading(agentId);\n }\n void this.generateSuggestions(suggestionId, config, agentId);\n } else if (isStaticSuggestionsConfig(config)) {\n this.addStaticSuggestions(suggestionId, config, agentId);\n }\n }\n }\n\n /**\n * Clear all suggestions for a specific agent\n */\n public clearSuggestions(agentId: string): void {\n const runningAgents = this._runningSuggestions[agentId];\n if (runningAgents) {\n for (const agent of runningAgents) {\n agent.abortRun();\n }\n delete this._runningSuggestions[agentId];\n }\n this._suggestions[agentId] = {};\n\n void this.notifySuggestionsChanged(agentId, []);\n }\n\n /**\n * Get current suggestions for an agent\n */\n public getSuggestions(agentId: string): CopilotKitCoreGetSuggestionsResult {\n const suggestions = Object.values(this._suggestions[agentId] ?? {}).flat();\n const isLoading = (this._runningSuggestions[agentId]?.length ?? 0) > 0;\n return { suggestions, isLoading };\n }\n\n /**\n * Generate suggestions using a provider agent\n */\n private async generateSuggestions(\n suggestionId: string,\n config: DynamicSuggestionsConfig,\n consumerAgentId: string,\n ): Promise<void> {\n let agent: AbstractAgent | undefined = undefined;\n try {\n const suggestionsProviderAgent = (\n this.core as unknown as CopilotKitCoreFriendsAccess\n ).getAgent(config.providerAgentId ?? \"default\");\n if (!suggestionsProviderAgent) {\n throw new Error(\n `Suggestions provider agent not found: ${config.providerAgentId}`,\n );\n }\n const suggestionsConsumerAgent = (\n this.core as unknown as CopilotKitCoreFriendsAccess\n ).getAgent(consumerAgentId);\n if (!suggestionsConsumerAgent) {\n throw new Error(\n `Suggestions consumer agent not found: ${consumerAgentId}`,\n );\n }\n\n const clonedAgent: AbstractAgent = suggestionsProviderAgent.clone();\n agent = clonedAgent;\n //agent.agentId = suggestionId;\n agent.threadId = suggestionId;\n agent.messages = JSON.parse(\n JSON.stringify(suggestionsConsumerAgent.messages),\n );\n agent.state = JSON.parse(JSON.stringify(suggestionsConsumerAgent.state));\n\n // Initialize suggestion storage for this agent/suggestion combo\n this._suggestions[consumerAgentId] = {\n ...(this._suggestions[consumerAgentId] ?? {}),\n [suggestionId]: [],\n };\n this._runningSuggestions[consumerAgentId] = [\n ...(this._runningSuggestions[consumerAgentId] ?? []),\n agent,\n ];\n\n agent.addMessage({\n id: suggestionId,\n role: \"user\",\n content: [\n `Suggest what the user could say next. Provide clear, highly relevant suggestions by calling the \\`copilotkitSuggest\\` tool.`,\n `Provide at least ${config.minSuggestions ?? 1} and at most ${config.maxSuggestions ?? 3} suggestions.`,\n `The user has the following tools available: ${JSON.stringify((this.core as unknown as CopilotKitCoreFriendsAccess).buildFrontendTools(consumerAgentId))}.`,\n ` ${config.instructions}`,\n ].join(\"\\n\"),\n });\n\n await agent.runAgent(\n {\n context: Object.values(\n (this.core as unknown as CopilotKitCoreFriendsAccess).context,\n ),\n forwardedProps: {\n ...(this.core as unknown as CopilotKitCoreFriendsAccess).properties,\n toolChoice: {\n type: \"function\",\n function: { name: \"copilotkitSuggest\" },\n },\n },\n tools: [SUGGEST_TOOL],\n },\n {\n onMessagesChanged: ({ messages }: { messages: Message[] }) => {\n this.extractSuggestions(\n messages,\n suggestionId,\n consumerAgentId,\n true,\n );\n },\n },\n );\n } catch (error) {\n console.warn(\"Error generating suggestions:\", error);\n } finally {\n // Finalize suggestions by marking them as no longer loading\n this.finalizeSuggestions(suggestionId, consumerAgentId);\n\n // Remove this agent from running suggestions\n const runningAgents = this._runningSuggestions[consumerAgentId];\n if (agent && runningAgents) {\n const filteredAgents = runningAgents.filter((a) => a !== agent);\n this._runningSuggestions[consumerAgentId] = filteredAgents;\n\n // If no more suggestions are running, emit loading end event\n if (filteredAgents.length === 0) {\n delete this._runningSuggestions[consumerAgentId];\n await this.notifySuggestionsFinishedLoading(consumerAgentId);\n }\n }\n }\n }\n\n /**\n * Finalize suggestions by marking them as no longer loading\n */\n private finalizeSuggestions(\n suggestionId: string,\n consumerAgentId: string,\n ): void {\n const agentSuggestions = this._suggestions[consumerAgentId];\n const currentSuggestions = agentSuggestions?.[suggestionId];\n\n if (\n agentSuggestions &&\n currentSuggestions &&\n currentSuggestions.length > 0\n ) {\n // Filter out empty suggestions and mark remaining as no longer loading\n const finalizedSuggestions = currentSuggestions\n .filter(\n (suggestion) => suggestion.title !== \"\" || suggestion.message !== \"\",\n )\n .map((suggestion) => ({\n ...suggestion,\n isLoading: false,\n }));\n\n if (finalizedSuggestions.length > 0) {\n agentSuggestions[suggestionId] = finalizedSuggestions;\n } else {\n delete agentSuggestions[suggestionId];\n }\n\n // Get all aggregated suggestions for this agent\n const allSuggestions = Object.values(\n this._suggestions[consumerAgentId] ?? {},\n ).flat();\n\n void this.notifySuggestionsChanged(\n consumerAgentId,\n allSuggestions,\n \"finalized\",\n );\n }\n }\n\n /**\n * Extract suggestions from messages (called during streaming)\n */\n extractSuggestions(\n messages: Message[],\n suggestionId: string,\n consumerAgentId: string,\n isRunning: boolean,\n ): void {\n const idx = messages.findIndex((message) => message.id === suggestionId);\n if (idx == -1) {\n return;\n }\n\n const suggestions: Suggestion[] = [];\n const newMessages = messages.slice(idx + 1);\n\n for (const message of newMessages) {\n if (message.role === \"assistant\" && message.toolCalls) {\n for (const toolCall of message.toolCalls) {\n if (toolCall.function.name === \"copilotkitSuggest\") {\n // Join all argument chunks into a single string for parsing\n // arguments can be either a string or an array of strings\n const fullArgs = Array.isArray(toolCall.function.arguments)\n ? toolCall.function.arguments.join(\"\")\n : toolCall.function.arguments;\n const parsed = partialJSONParse(fullArgs);\n if (\n parsed &&\n typeof parsed === \"object\" &&\n \"suggestions\" in parsed\n ) {\n const parsedSuggestions = (parsed as any).suggestions;\n if (Array.isArray(parsedSuggestions)) {\n for (const item of parsedSuggestions) {\n if (item && typeof item === \"object\" && \"title\" in item) {\n suggestions.push({\n title: item.title ?? \"\",\n message: item.message ?? \"\",\n isLoading: false, // Will be set correctly below\n });\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Set isLoading for the last suggestion if still running\n if (isRunning && suggestions.length > 0) {\n suggestions[suggestions.length - 1]!.isLoading = true;\n }\n\n const agentSuggestions = this._suggestions[consumerAgentId];\n if (agentSuggestions) {\n agentSuggestions[suggestionId] = suggestions;\n\n // Get all aggregated suggestions for this agent\n const allSuggestions = Object.values(\n this._suggestions[consumerAgentId] ?? {},\n ).flat();\n\n void this.notifySuggestionsChanged(\n consumerAgentId,\n allSuggestions,\n \"suggestions changed\",\n );\n }\n }\n\n /**\n * Notify subscribers of suggestions config changes\n */\n private async notifySuggestionsConfigChanged(): Promise<void> {\n await (\n this.core as unknown as CopilotKitCoreFriendsAccess\n ).notifySubscribers(\n (subscriber) =>\n subscriber.onSuggestionsConfigChanged?.({\n copilotkit: this.core,\n suggestionsConfig: this._suggestionsConfig,\n }),\n \"Subscriber onSuggestionsConfigChanged error:\",\n );\n }\n\n /**\n * Notify subscribers of suggestions changes\n */\n private async notifySuggestionsChanged(\n agentId: string,\n suggestions: Suggestion[],\n context: string = \"\",\n ): Promise<void> {\n await (\n this.core as unknown as CopilotKitCoreFriendsAccess\n ).notifySubscribers(\n (subscriber) =>\n subscriber.onSuggestionsChanged?.({\n copilotkit: this.core,\n agentId,\n suggestions,\n }),\n `Subscriber onSuggestionsChanged error: ${context}`,\n );\n }\n\n /**\n * Notify subscribers that suggestions started loading\n */\n private async notifySuggestionsStartedLoading(\n agentId: string,\n ): Promise<void> {\n await (\n this.core as unknown as CopilotKitCoreFriendsAccess\n ).notifySubscribers(\n (subscriber) =>\n subscriber.onSuggestionsStartedLoading?.({\n copilotkit: this.core,\n agentId,\n }),\n \"Subscriber onSuggestionsStartedLoading error:\",\n );\n }\n\n /**\n * Notify subscribers that suggestions finished loading\n */\n private async notifySuggestionsFinishedLoading(\n agentId: string,\n ): Promise<void> {\n await (\n this.core as unknown as CopilotKitCoreFriendsAccess\n ).notifySubscribers(\n (subscriber) =>\n subscriber.onSuggestionsFinishedLoading?.({\n copilotkit: this.core,\n agentId,\n }),\n \"Subscriber onSuggestionsFinishedLoading error:\",\n );\n }\n\n /**\n * Check if suggestions should be shown based on availability and message count\n */\n private shouldShowSuggestions(\n config: SuggestionsConfig,\n messageCount: number,\n ): boolean {\n const availability = config.available;\n\n // Default behavior if no availability specified\n if (!availability) {\n if (isDynamicSuggestionsConfig(config)) {\n return messageCount > 0; // Default: after-first-message\n } else {\n return messageCount === 0; // Default: before-first-message\n }\n }\n\n switch (availability) {\n case \"disabled\":\n return false;\n case \"before-first-message\":\n return messageCount === 0;\n case \"after-first-message\":\n return messageCount > 0;\n case \"always\":\n return true;\n default:\n return false;\n }\n }\n\n /**\n * Add static suggestions directly without AI generation\n */\n private addStaticSuggestions(\n suggestionId: string,\n config: StaticSuggestionsConfig,\n consumerAgentId: string,\n ): void {\n // Mark all as not loading since they're static\n const suggestions = config.suggestions.map((s) => ({\n ...s,\n isLoading: false,\n }));\n\n // Store suggestions\n this._suggestions[consumerAgentId] = {\n ...(this._suggestions[consumerAgentId] ?? {}),\n [suggestionId]: suggestions,\n };\n\n // Notify subscribers\n const allSuggestions = Object.values(\n this._suggestions[consumerAgentId] ?? {},\n ).flat();\n\n void this.notifySuggestionsChanged(\n consumerAgentId,\n allSuggestions,\n \"static suggestions added\",\n );\n }\n}\n\n/**\n * Type guard for dynamic suggestions config\n */\nfunction isDynamicSuggestionsConfig(\n config: SuggestionsConfig,\n): config is DynamicSuggestionsConfig {\n return \"instructions\" in config;\n}\n\n/**\n * Type guard for static suggestions config\n */\nfunction isStaticSuggestionsConfig(\n config: SuggestionsConfig,\n): config is StaticSuggestionsConfig {\n return \"suggestions\" in config;\n}\n\n/**\n * The tool definition for AI-generated suggestions\n */\nconst SUGGEST_TOOL: Tool = {\n name: \"copilotkitSuggest\",\n description: \"Suggest what the user could say next\",\n parameters: {\n type: \"object\",\n properties: {\n suggestions: {\n type: \"array\",\n description: \"List of suggestions shown to the user as buttons.\",\n items: {\n type: \"object\",\n properties: {\n title: {\n type: \"string\",\n description:\n \"The title of the suggestion. This is shown as a button and should be short.\",\n },\n message: {\n type: \"string\",\n description:\n \"The message to send when the suggestion is clicked. This should be a clear, complete sentence \" +\n \"and will be sent as an instruction to the AI.\",\n },\n },\n required: [\"title\", \"message\"],\n },\n },\n },\n required: [\"suggestions\"],\n },\n};\n","import {\n AbstractAgent,\n AgentSubscriber,\n HttpAgent,\n Message,\n RunAgentResult,\n Tool,\n ToolCall,\n} from \"@ag-ui/client\";\nimport { randomUUID, logger, schemaToJsonSchema } from \"@copilotkitnext/shared\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport type { CopilotKitCore, CopilotKitCoreFriendsAccess } from \"./core\";\nimport { CopilotKitCoreErrorCode } from \"./core\";\nimport type { FrontendTool } from \"../types\";\n\nexport interface CopilotKitCoreRunAgentParams {\n agent: AbstractAgent;\n forwardedProps?: Record<string, unknown>;\n}\n\nexport interface CopilotKitCoreConnectAgentParams {\n agent: AbstractAgent;\n}\n\nexport interface CopilotKitCoreGetToolParams {\n toolName: string;\n agentId?: string;\n}\n\n/**\n * Parameters for programmatic tool execution via `copilotkit.runTool()`.\n */\nexport interface CopilotKitCoreRunToolParams {\n /** Name of the registered frontend tool to execute. */\n name: string;\n /** Optional agent ID. If omitted, uses the default agent lookup. */\n agentId?: string;\n /** Parameters to pass to the tool handler. */\n parameters?: Record<string, unknown>;\n /**\n * Whether to trigger an LLM follow-up after tool execution.\n * - `false` (default): execute tool, add messages to history, done.\n * - `\"generate\"`: after execution, trigger another agent run so the LLM responds to the tool result.\n * - Any other string: add a user message with this text, then trigger another agent run.\n */\n followUp?: string | false;\n}\n\n/**\n * Result of programmatic tool execution via `copilotkit.runTool()`.\n */\nexport interface CopilotKitCoreRunToolResult {\n /** The unique ID of the tool call. */\n toolCallId: string;\n /** The stringified result from the tool handler. */\n result: string;\n /** Error message if the handler failed. */\n error?: string;\n}\n\n/**\n * Internal result from the shared tool handler execution logic.\n */\ninterface ExecuteToolHandlerResult {\n result: string;\n error?: string;\n isArgumentError: boolean;\n}\n\n/**\n * Handles agent execution, tool calling, and agent connectivity for CopilotKitCore.\n * Manages the complete lifecycle of agent runs including tool execution and follow-ups.\n */\nexport class RunHandler {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _tools: FrontendTool<any>[] = [];\n\n constructor(private core: CopilotKitCore) {}\n\n /**\n * Typed access to CopilotKitCore's internal (\"friend\") methods.\n * Centralises the single unavoidable cast so call-sites stay clean.\n */\n private get _internal(): CopilotKitCoreFriendsAccess {\n return this.core as unknown as CopilotKitCoreFriendsAccess;\n }\n\n /**\n * Get all tools as a readonly array\n */\n get tools(): Readonly<FrontendTool<any>[]> {\n return this._tools;\n }\n\n /**\n * Initialize with tools\n */\n initialize(tools: FrontendTool<any>[]): void {\n this._tools = tools;\n }\n\n /**\n * Add a tool to the registry\n */\n addTool<T extends Record<string, unknown> = Record<string, unknown>>(\n tool: FrontendTool<T>,\n ): void {\n // Check if a tool with the same name and agentId already exists\n const existingToolIndex = this._tools.findIndex(\n (t) => t.name === tool.name && t.agentId === tool.agentId,\n );\n\n if (existingToolIndex !== -1) {\n logger.warn(\n `Tool already exists: '${tool.name}' for agent '${tool.agentId || \"global\"}', skipping.`,\n );\n return;\n }\n\n this._tools.push(tool);\n }\n\n /**\n * Remove a tool by name and optionally by agentId\n */\n removeTool(id: string, agentId?: string): void {\n this._tools = this._tools.filter((tool) => {\n // Remove tool if both name and agentId match\n if (agentId !== undefined) {\n return !(tool.name === id && tool.agentId === agentId);\n }\n // If no agentId specified, only remove global tools with matching name\n return !(tool.name === id && !tool.agentId);\n });\n }\n\n /**\n * Get a tool by name and optionally by agentId.\n * If agentId is provided, it will first look for an agent-specific tool,\n * then fall back to a global tool with the same name.\n */\n getTool(params: CopilotKitCoreGetToolParams): FrontendTool<any> | undefined {\n const { toolName, agentId } = params;\n\n // If agentId is provided, first look for agent-specific tool\n if (agentId) {\n const agentTool = this._tools.find(\n (tool) => tool.name === toolName && tool.agentId === agentId,\n );\n if (agentTool) {\n return agentTool;\n }\n }\n\n // Fall back to global tool (no agentId)\n return this._tools.find((tool) => tool.name === toolName && !tool.agentId);\n }\n\n /**\n * Set all tools at once. Replaces existing tools.\n */\n setTools(tools: FrontendTool<any>[]): void {\n this._tools = [...tools];\n }\n\n /**\n * Connect an agent (establish initial connection)\n */\n async connectAgent({\n agent,\n }: CopilotKitCoreConnectAgentParams): Promise<RunAgentResult> {\n try {\n // Detach any active run before connecting to avoid previous runs interfering\n await agent.detachActiveRun();\n agent.setMessages([]);\n agent.setState({});\n\n if (agent instanceof HttpAgent) {\n agent.headers = {\n ...this._internal.headers,\n };\n }\n\n const runAgentResult = await agent.connectAgent(\n {\n forwardedProps: this._internal.properties,\n tools: this.buildFrontendTools(agent.agentId),\n context: Object.values(this._internal.context),\n },\n this.createAgentErrorSubscriber(agent),\n );\n\n return this.processAgentResult({ runAgentResult, agent });\n } catch (error) {\n const connectError =\n error instanceof Error ? error : new Error(String(error));\n const context: Record<string, any> = {};\n if (agent.agentId) {\n context.agentId = agent.agentId;\n }\n await this._internal.emitError({\n error: connectError,\n code: CopilotKitCoreErrorCode.AGENT_CONNECT_FAILED,\n context,\n });\n return { newMessages: [] };\n }\n }\n\n /**\n * Run an agent\n */\n async runAgent({\n agent,\n forwardedProps,\n }: CopilotKitCoreRunAgentParams): Promise<RunAgentResult> {\n // Agent ID is guaranteed to be set by validateAndAssignAgentId\n if (agent.agentId) {\n void this._internal.suggestionEngine.clearSuggestions(agent.agentId);\n }\n\n if (agent instanceof HttpAgent) {\n agent.headers = {\n ...this._internal.headers,\n };\n }\n\n // Signal any active run to detach (e.g. a long-lived connectAgent pipeline)\n // before starting a new run. We intentionally fire-and-forget rather than\n // awaiting: the detach merely completes the previous observable pipeline, and\n // `agent.runAgent()` below will create a fresh pipeline anyway. Awaiting\n // caused a deadlock when `connectAgent` was still resolving its internal\n // promise (e.g. ConnectNotImplementedError cleanup) at the moment the user\n // triggered a run.\n if (agent.detachActiveRun) {\n void agent.detachActiveRun();\n }\n\n try {\n const runAgentResult = await agent.runAgent(\n {\n forwardedProps: {\n ...this._internal.properties,\n ...forwardedProps,\n },\n tools: this.buildFrontendTools(agent.agentId),\n context: Object.values(this._internal.context),\n },\n this.createAgentErrorSubscriber(agent),\n );\n return this.processAgentResult({ runAgentResult, agent });\n } catch (error) {\n const runError =\n error instanceof Error ? error : new Error(String(error));\n const context: Record<string, any> = {};\n if (agent.agentId) {\n context.agentId = agent.agentId;\n }\n await this._internal.emitError({\n error: runError,\n code: CopilotKitCoreErrorCode.AGENT_RUN_FAILED,\n context,\n });\n return { newMessages: [] };\n }\n }\n\n /**\n * Process agent result and execute tools\n */\n private async processAgentResult({\n runAgentResult,\n agent,\n }: {\n runAgentResult: RunAgentResult;\n agent: AbstractAgent;\n }): Promise<RunAgentResult> {\n const { newMessages } = runAgentResult;\n // Agent ID is guaranteed to be set by validateAndAssignAgentId\n const agentId = agent.agentId!;\n\n let needsFollowUp = false;\n\n for (const message of newMessages) {\n if (message.role === \"assistant\") {\n for (const toolCall of message.toolCalls || []) {\n if (\n newMessages.findIndex(\n (m) => m.role === \"tool\" && m.toolCallId === toolCall.id,\n ) === -1\n ) {\n const tool = this.getTool({\n toolName: toolCall.function.name,\n agentId: agent.agentId,\n });\n if (tool) {\n const followUp = await this.executeSpecificTool(\n tool,\n toolCall,\n message,\n agent,\n agentId,\n );\n if (followUp) {\n needsFollowUp = true;\n }\n } else {\n // Wildcard fallback for undefined tools\n const wildcardTool = this.getTool({\n toolName: \"*\",\n agentId: agent.agentId,\n });\n if (wildcardTool) {\n const followUp = await this.executeWildcardTool(\n wildcardTool,\n toolCall,\n message,\n agent,\n agentId,\n );\n if (followUp) {\n needsFollowUp = true;\n }\n }\n }\n }\n }\n }\n }\n\n if (needsFollowUp) {\n // Yield to the framework scheduler before the follow-up run so that any\n // deferred state updates (e.g. React useEffect in useAgentContext) can\n // complete and write fresh values into the context store before runAgent\n // reads it. The base implementation is a no-op; React overrides this.\n await this._internal.waitForPendingFrameworkUpdates();\n return await this.runAgent({ agent });\n }\n\n void this._internal.suggestionEngine.reloadSuggestions(agentId);\n\n return runAgentResult;\n }\n\n /**\n * Shared handler execution logic used by executeSpecificTool, executeWildcardTool, and runTool.\n * Handles arg parsing, subscriber notifications, handler invocation, result stringification,\n * and error handling.\n */\n private async executeToolHandler({\n tool,\n toolCall,\n agent,\n agentId,\n handlerArgs,\n toolType,\n messageId,\n }: {\n tool: FrontendTool<any>;\n toolCall: { id: string; function: { name: string; arguments: string } };\n agent: AbstractAgent;\n agentId: string;\n handlerArgs: unknown;\n toolType: string;\n messageId?: string;\n }): Promise<ExecuteToolHandlerResult> {\n let toolCallResult = \"\";\n let errorMessage: string | undefined;\n let isArgumentError = false;\n\n let parsedArgs: unknown;\n try {\n parsedArgs = parseToolArguments(handlerArgs, toolCall.function.name);\n } catch (error) {\n const parseError =\n error instanceof Error ? error : new Error(String(error));\n errorMessage = parseError.message;\n isArgumentError = true;\n await this._internal.emitError({\n error: parseError,\n code: CopilotKitCoreErrorCode.TOOL_ARGUMENT_PARSE_FAILED,\n context: {\n agentId,\n toolCallId: toolCall.id,\n toolName: toolCall.function.name,\n rawArguments: handlerArgs,\n toolType,\n ...(messageId ? { messageId } : {}),\n },\n });\n }\n\n await this._internal.notifySubscribers(\n (subscriber) =>\n subscriber.onToolExecutionStart?.({\n copilotkit: this.core,\n toolCallId: toolCall.id,\n agentId,\n toolName: toolCall.function.name,\n args: parsedArgs,\n }),\n \"Subscriber onToolExecutionStart error:\",\n );\n\n if (!errorMessage) {\n try {\n const result = await tool.handler!(parsedArgs as any, {\n toolCall: toolCall as any,\n agent,\n });\n if (result === undefined || result === null) {\n toolCallResult = \"\";\n } else if (typeof result === \"string\") {\n toolCallResult = result;\n } else {\n toolCallResult = JSON.stringify(result);\n }\n } catch (error) {\n const handlerError =\n error instanceof Error ? error : new Error(String(error));\n errorMessage = handlerError.message;\n await this._internal.emitError({\n error: handlerError,\n code: CopilotKitCoreErrorCode.TOOL_HANDLER_FAILED,\n context: {\n agentId,\n toolCallId: toolCall.id,\n toolName: toolCall.function.name,\n parsedArgs,\n toolType,\n ...(messageId ? { messageId } : {}),\n },\n });\n }\n }\n\n if (errorMessage) {\n toolCallResult = `Error: ${errorMessage}`;\n }\n\n await this._internal.notifySubscribers(\n (subscriber) =>\n subscriber.onToolExecutionEnd?.({\n copilotkit: this.core,\n toolCallId: toolCall.id,\n agentId,\n toolName: toolCall.function.name,\n result: errorMessage ? \"\" : toolCallResult,\n error: errorMessage,\n }),\n \"Subscriber onToolExecutionEnd error:\",\n );\n\n return { result: toolCallResult, error: errorMessage, isArgumentError };\n }\n\n /**\n * Execute a specific tool\n */\n private async executeSpecificTool(\n tool: FrontendTool<any>,\n toolCall: ToolCall,\n message: Message,\n agent: AbstractAgent,\n agentId: string,\n ): Promise<boolean> {\n // Check if tool is constrained to a specific agent\n if (tool?.agentId && tool.agentId !== agent.agentId) {\n // Tool is not available for this agent, skip it\n return false;\n }\n\n let handlerResult: ExecuteToolHandlerResult = {\n result: \"\",\n error: undefined,\n isArgumentError: false,\n };\n\n if (tool?.handler) {\n handlerResult = await this.executeToolHandler({\n tool,\n toolCall,\n agent,\n agentId,\n handlerArgs: toolCall.function.arguments,\n toolType: \"specific\",\n messageId: message.id,\n });\n }\n\n {\n const messageIndex = agent.messages.findIndex((m) => m.id === message.id);\n if (messageIndex === -1) {\n // Parent message no longer in agent's messages (e.g. thread was switched\n // while the tool handler was still executing). Skip result insertion and\n // do not request a follow-up to avoid mutating the wrong thread.\n return false;\n }\n const toolMessage = {\n id: randomUUID(),\n role: \"tool\" as const,\n toolCallId: toolCall.id,\n content: handlerResult.result,\n };\n agent.messages.splice(messageIndex + 1, 0, toolMessage);\n\n if (!handlerResult.error && tool?.followUp !== false) {\n return true; // Needs follow-up\n }\n }\n\n return false;\n }\n\n /**\n * Execute a wildcard tool.\n * Wildcard tools receive args wrapped as `{toolName, args}`, which differs from\n * specific tools, so this method keeps its own arg-wrapping logic rather than\n * delegating to `executeToolHandler`.\n */\n private async executeWildcardTool(\n wildcardTool: FrontendTool<any>,\n toolCall: ToolCall,\n message: Message,\n agent: AbstractAgent,\n agentId: string,\n ): Promise<boolean> {\n // Check if wildcard tool is constrained to a specific agent\n if (wildcardTool?.agentId && wildcardTool.agentId !== agent.agentId) {\n // Wildcard tool is not available for this agent, skip it\n return false;\n }\n\n let toolCallResult = \"\";\n let errorMessage: string | undefined;\n let isArgumentError = false;\n\n if (wildcardTool?.handler) {\n let parsedArgs: unknown;\n try {\n parsedArgs = parseToolArguments(\n toolCall.function.arguments,\n toolCall.function.name,\n );\n } catch (error) {\n const parseError =\n error instanceof Error ? error : new Error(String(error));\n errorMessage = parseError.message;\n isArgumentError = true;\n await this._internal.emitError({\n error: parseError,\n code: CopilotKitCoreErrorCode.TOOL_ARGUMENT_PARSE_FAILED,\n context: {\n agentId: agentId,\n toolCallId: toolCall.id,\n toolName: toolCall.function.name,\n rawArguments: toolCall.function.arguments,\n toolType: \"wildcard\",\n messageId: message.id,\n },\n });\n }\n\n const wildcardArgs = {\n toolName: toolCall.function.name,\n args: parsedArgs,\n };\n\n await this._internal.notifySubscribers(\n (subscriber) =>\n subscriber.onToolExecutionStart?.({\n copilotkit: this.core,\n toolCallId: toolCall.id,\n agentId: agentId,\n toolName: toolCall.function.name,\n args: wildcardArgs,\n }),\n \"Subscriber onToolExecutionStart error:\",\n );\n\n if (!errorMessage) {\n try {\n const result = await wildcardTool.handler(wildcardArgs as any, {\n toolCall,\n agent,\n });\n if (result === undefined || result === null) {\n toolCallResult = \"\";\n } else if (typeof result === \"string\") {\n toolCallResult = result;\n } else {\n toolCallResult = JSON.stringify(result);\n }\n } catch (error) {\n const handlerError =\n error instanceof Error ? error : new Error(String(error));\n errorMessage = handlerError.message;\n await this._internal.emitError({\n error: handlerError,\n code: CopilotKitCoreErrorCode.TOOL_HANDLER_FAILED,\n context: {\n agentId: agentId,\n toolCallId: toolCall.id,\n toolName: toolCall.function.name,\n parsedArgs: wildcardArgs,\n toolType: \"wildcard\",\n messageId: message.id,\n },\n });\n }\n }\n\n if (errorMessage) {\n toolCallResult = `Error: ${errorMessage}`;\n }\n\n await this._internal.notifySubscribers(\n (subscriber) =>\n subscriber.onToolExecutionEnd?.({\n copilotkit: this.core,\n toolCallId: toolCall.id,\n agentId: agentId,\n toolName: toolCall.function.name,\n result: errorMessage ? \"\" : toolCallResult,\n error: errorMessage,\n }),\n \"Subscriber onToolExecutionEnd error:\",\n );\n }\n\n {\n const messageIndex = agent.messages.findIndex((m) => m.id === message.id);\n if (messageIndex === -1) {\n // Parent message no longer in agent's messages (e.g. thread was switched\n // while the tool handler was still executing). Skip result insertion and\n // do not request a follow-up to avoid mutating the wrong thread.\n return false;\n }\n const toolMessage = {\n id: randomUUID(),\n role: \"tool\" as const,\n toolCallId: toolCall.id,\n content: toolCallResult,\n };\n agent.messages.splice(messageIndex + 1, 0, toolMessage);\n\n if (!errorMessage && wildcardTool?.followUp !== false) {\n return true; // Needs follow-up\n }\n }\n\n return false;\n }\n\n /**\n * Programmatically execute a registered frontend tool without going through an LLM turn.\n * The handler runs, render components show up in the UI, and both the tool call and\n * result messages are added to `agent.messages`.\n */\n async runTool(\n params: CopilotKitCoreRunToolParams,\n ): Promise<CopilotKitCoreRunToolResult> {\n const { name, agentId, parameters = {}, followUp = false } = params;\n\n // 1. Look up the tool\n const tool = this.getTool({ toolName: name, agentId });\n if (!tool) {\n const error = new Error(`Tool not found: ${name}`);\n await this._internal.emitError({\n error,\n code: CopilotKitCoreErrorCode.TOOL_NOT_FOUND,\n context: { toolName: name, agentId },\n });\n throw error;\n }\n\n // 2. Look up the agent\n const resolvedAgentId = agentId ?? \"default\";\n const agent = this._internal.getAgent(resolvedAgentId);\n if (!agent) {\n const error = new Error(`Agent not found: ${resolvedAgentId}`);\n await this._internal.emitError({\n error,\n code: CopilotKitCoreErrorCode.AGENT_NOT_FOUND,\n context: { agentId: resolvedAgentId },\n });\n throw error;\n }\n\n // 3. Create assistant message with tool call\n const toolCallId = randomUUID();\n const assistantMessage: Message = {\n id: randomUUID(),\n role: \"assistant\",\n content: \"\",\n toolCalls: [\n {\n id: toolCallId,\n type: \"function\",\n function: {\n name,\n arguments: JSON.stringify(parameters),\n },\n },\n ],\n };\n\n // 4. Push assistant message into agent's messages\n agent.messages.push(assistantMessage);\n\n // 5. Execute the tool handler (if it has one)\n let handlerResult: ExecuteToolHandlerResult = {\n result: \"\",\n error: undefined,\n isArgumentError: false,\n };\n\n if (tool.handler) {\n handlerResult = await this.executeToolHandler({\n tool,\n toolCall: assistantMessage.toolCalls![0],\n agent,\n agentId: resolvedAgentId,\n handlerArgs: parameters,\n toolType: \"runTool\",\n });\n }\n\n // 6. Create and insert tool result message\n const toolResultMessage: Message = {\n id: randomUUID(),\n role: \"tool\",\n toolCallId,\n content: handlerResult.result,\n };\n\n const assistantIndex = agent.messages.findIndex(\n (m) => m.id === assistantMessage.id,\n );\n if (assistantIndex !== -1) {\n agent.messages.splice(assistantIndex + 1, 0, toolResultMessage);\n } else {\n // Fallback: push to end if assistant message was removed\n agent.messages.push(toolResultMessage);\n }\n\n // 7. Handle followUp (only if no error)\n if (!handlerResult.error && followUp !== false) {\n if (typeof followUp === \"string\" && followUp !== \"generate\") {\n // Custom text: add a user message first\n const userMessage: Message = {\n id: randomUUID(),\n role: \"user\",\n content: followUp,\n };\n agent.messages.push(userMessage);\n }\n // Yield to the framework scheduler so deferred state updates (e.g. React\n // useEffect in useAgentContext) can complete before the follow-up run reads\n // the context store. Mirrors the same yield in processAgentResult.\n await this._internal.waitForPendingFrameworkUpdates();\n // Trigger agent run for both \"generate\" and custom text\n await this.runAgent({ agent });\n }\n\n // 8. Return result\n return {\n toolCallId,\n result: handlerResult.result,\n error: handlerResult.error,\n };\n }\n\n /**\n * Build frontend tools for an agent\n */\n buildFrontendTools(agentId?: string): Tool[] {\n return this._tools\n .filter(\n (tool) =>\n tool.available !== false &&\n (!tool.agentId || tool.agentId === agentId),\n )\n .map((tool) => ({\n name: tool.name,\n description: tool.description ?? \"\",\n parameters: createToolSchema(tool),\n }));\n }\n\n /**\n * Create an agent error subscriber\n */\n private createAgentErrorSubscriber(agent: AbstractAgent): AgentSubscriber {\n const emitAgentError = async (\n error: Error,\n code: CopilotKitCoreErrorCode,\n extraContext: Record<string, any> = {},\n ) => {\n const context: Record<string, any> = { ...extraContext };\n if (agent.agentId) {\n context.agentId = agent.agentId;\n }\n await this._internal.emitError({\n error,\n code,\n context,\n });\n };\n\n return {\n onRunFailed: async ({ error }: { error: Error }) => {\n await emitAgentError(\n error,\n CopilotKitCoreErrorCode.AGENT_RUN_FAILED_EVENT,\n {\n source: \"onRunFailed\",\n },\n );\n },\n onRunErrorEvent: async ({ event }) => {\n const eventError =\n event?.rawEvent instanceof Error\n ? event.rawEvent\n : event?.rawEvent?.error instanceof Error\n ? event.rawEvent.error\n : undefined;\n\n const errorMessage =\n typeof event?.rawEvent?.error === \"string\"\n ? event.rawEvent.error\n : (event?.message ?? \"Agent run error\");\n\n const rawError = eventError ?? new Error(errorMessage);\n\n if (event?.code && !(rawError as any).code) {\n (rawError as any).code = event.code;\n }\n\n await emitAgentError(\n rawError,\n CopilotKitCoreErrorCode.AGENT_RUN_ERROR_EVENT,\n {\n source: \"onRunErrorEvent\",\n event,\n runtimeErrorCode: event?.code,\n },\n );\n },\n };\n }\n}\n\n/**\n * Empty tool schema constant\n */\nconst EMPTY_TOOL_SCHEMA = {\n type: \"object\",\n properties: {},\n} as const satisfies Record<string, unknown>;\n\n/**\n * Create a JSON schema from a tool's parameters\n */\nfunction createToolSchema(tool: FrontendTool<any>): Record<string, unknown> {\n if (!tool.parameters) {\n return { ...EMPTY_TOOL_SCHEMA };\n }\n\n const rawSchema = schemaToJsonSchema(tool.parameters, { zodToJsonSchema });\n\n if (!rawSchema || typeof rawSchema !== \"object\") {\n return { ...EMPTY_TOOL_SCHEMA };\n }\n\n const { $schema, ...schema } = rawSchema as Record<string, unknown>;\n\n if (typeof schema.type !== \"string\") {\n schema.type = \"object\";\n }\n if (typeof schema.properties !== \"object\" || schema.properties === null) {\n schema.properties = {};\n }\n\n stripAdditionalProperties(schema);\n return schema;\n}\n\nfunction stripAdditionalProperties(schema: unknown): void {\n if (!schema || typeof schema !== \"object\") {\n return;\n }\n\n if (Array.isArray(schema)) {\n schema.forEach(stripAdditionalProperties);\n return;\n }\n\n const record = schema as Record<string, unknown>;\n\n if (record.additionalProperties !== undefined) {\n delete record.additionalProperties;\n }\n\n for (const value of Object.values(record)) {\n stripAdditionalProperties(value);\n }\n}\n\n/**\n * Ensures parsed tool arguments are a plain object.\n * Throws for non-object values so the caller's catch block can emit\n * a structured TOOL_ARGUMENT_PARSE_FAILED error.\n *\n * @internal Exported for testing only.\n */\nexport function ensureObjectArgs(\n parsed: unknown,\n toolName: string,\n): Record<string, unknown> {\n if (typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n throw new Error(\n `Tool arguments for ${toolName} parsed to non-object (${typeof parsed})`,\n );\n}\n\n/**\n * Parses raw tool call arguments into a validated object.\n *\n * Some LLM providers (e.g. @ai-sdk/openai-compatible) may send empty string \"\",\n * null, or undefined instead of \"{}\". This function normalises those cases to an\n * empty object so callers don't crash on JSON.parse(\"\").\n *\n * A debug-level warning is emitted when the fallback triggers so silent coercion\n * is observable in logs.\n *\n * @internal Exported for testing only.\n */\nexport function parseToolArguments(\n rawArgs: unknown,\n toolName: string,\n): Record<string, unknown> {\n if (rawArgs === \"\" || rawArgs === null || rawArgs === undefined) {\n logger.debug(\n `[parseToolArguments] Tool \"${toolName}\" received empty/null/undefined arguments — defaulting to {}`,\n );\n return {};\n }\n const parsed = typeof rawArgs === \"string\" ? JSON.parse(rawArgs) : rawArgs;\n return ensureObjectArgs(parsed, toolName);\n}\n","import {\n AbstractAgent,\n Message,\n State,\n RunAgentInput,\n RunStartedEvent,\n RunFinishedEvent,\n StateSnapshotEvent,\n StateDeltaEvent,\n MessagesSnapshotEvent,\n} from \"@ag-ui/client\";\nimport type { CopilotKitCore } from \"./core\";\n\n/**\n * Manages state and message tracking by run for CopilotKitCore.\n * Tracks agent state snapshots and message-to-run associations.\n */\nexport class StateManager {\n // State tracking: agentId -> threadId -> runId -> state\n private stateByRun: Map<string, Map<string, Map<string, State>>> = new Map();\n\n // Message tracking: agentId -> threadId -> messageId -> runId\n private messageToRun: Map<string, Map<string, Map<string, string>>> =\n new Map();\n\n // Agent subscriptions for cleanup\n private agentSubscriptions: Map<string, () => void> = new Map();\n\n constructor(private core: CopilotKitCore) {}\n\n /**\n * Initialize state tracking for an agent\n */\n initialize(): void {\n // Will be called when CopilotKitCore is initialized\n }\n\n /**\n * Subscribe to an agent's events to track state and messages\n */\n subscribeToAgent(agent: AbstractAgent): void {\n if (!agent.agentId) {\n return; // Skip agents without IDs\n }\n\n const agentId = agent.agentId;\n\n // Unsubscribe existing subscription if any\n this.unsubscribeFromAgent(agentId);\n\n // Subscribe to agent events\n const { unsubscribe } = agent.subscribe({\n onRunStartedEvent: ({ event, state }) => {\n this.handleRunStarted(agent, event, state);\n },\n onRunFinishedEvent: ({ event, state }) => {\n this.handleRunFinished(agent, event, state);\n },\n onStateSnapshotEvent: ({ event, input, state }) => {\n this.handleStateSnapshot(agent, event, input, state);\n },\n onStateDeltaEvent: ({ event, input, state }) => {\n this.handleStateDelta(agent, event, input, state);\n },\n onMessagesSnapshotEvent: ({ event, input, messages }) => {\n this.handleMessagesSnapshot(agent, event, input, messages);\n },\n onNewMessage: ({ message, input }) => {\n this.handleNewMessage(agent, message, input);\n },\n });\n\n this.agentSubscriptions.set(agentId, unsubscribe);\n }\n\n /**\n * Unsubscribe from an agent's events\n */\n unsubscribeFromAgent(agentId: string): void {\n const unsubscribe = this.agentSubscriptions.get(agentId);\n if (unsubscribe) {\n unsubscribe();\n this.agentSubscriptions.delete(agentId);\n }\n }\n\n /**\n * Get state for a specific run\n * Returns a deep copy to prevent external mutations\n */\n getStateByRun(\n agentId: string,\n threadId: string,\n runId: string,\n ): State | undefined {\n const state = this.stateByRun.get(agentId)?.get(threadId)?.get(runId);\n if (!state) return undefined;\n // Return a deep copy to prevent mutations\n return JSON.parse(JSON.stringify(state));\n }\n\n /**\n * Get runId associated with a message\n */\n getRunIdForMessage(\n agentId: string,\n threadId: string,\n messageId: string,\n ): string | undefined {\n return this.messageToRun.get(agentId)?.get(threadId)?.get(messageId);\n }\n\n /**\n * Get all states for an agent's thread\n */\n getStatesForThread(agentId: string, threadId: string): Map<string, State> {\n return this.stateByRun.get(agentId)?.get(threadId) ?? new Map();\n }\n\n /**\n * Get all run IDs for an agent's thread\n */\n getRunIdsForThread(agentId: string, threadId: string): string[] {\n const threadStates = this.stateByRun.get(agentId)?.get(threadId);\n return threadStates ? Array.from(threadStates.keys()) : [];\n }\n\n /**\n * Handle run started event\n */\n private handleRunStarted(\n agent: AbstractAgent,\n event: RunStartedEvent,\n state: State,\n ): void {\n if (!agent.agentId) return;\n\n const { threadId, runId } = event;\n this.saveState(agent.agentId, threadId, runId, state);\n }\n\n /**\n * Handle run finished event\n */\n private handleRunFinished(\n agent: AbstractAgent,\n event: RunFinishedEvent,\n state: State,\n ): void {\n if (!agent.agentId) return;\n\n const { threadId, runId } = event;\n this.saveState(agent.agentId, threadId, runId, state);\n }\n\n /**\n * Handle state snapshot event\n */\n private handleStateSnapshot(\n agent: AbstractAgent,\n event: StateSnapshotEvent,\n input: RunAgentInput,\n state: State,\n ): void {\n if (!agent.agentId) return;\n\n const { threadId, runId } = input;\n // Merge snapshot into current state\n const mergedState = { ...state, ...event.snapshot };\n this.saveState(agent.agentId, threadId, runId, mergedState);\n }\n\n /**\n * Handle state delta event\n */\n private handleStateDelta(\n agent: AbstractAgent,\n event: StateDeltaEvent,\n input: RunAgentInput,\n state: State,\n ): void {\n if (!agent.agentId) return;\n\n const { threadId, runId } = input;\n // State is already updated by the agent, just save it\n this.saveState(agent.agentId, threadId, runId, state);\n }\n\n /**\n * Handle messages snapshot event\n */\n private handleMessagesSnapshot(\n agent: AbstractAgent,\n event: MessagesSnapshotEvent,\n input: RunAgentInput,\n messages: Message[],\n ): void {\n if (!agent.agentId) return;\n\n const { threadId, runId } = input;\n\n // Associate all messages in the snapshot with this run\n for (const message of event.messages) {\n this.associateMessageWithRun(agent.agentId, threadId, message.id, runId);\n }\n }\n\n /**\n * Handle new message event\n */\n private handleNewMessage(\n agent: AbstractAgent,\n message: Message,\n input?: RunAgentInput,\n ): void {\n if (!agent.agentId || !input) return;\n\n const { threadId, runId } = input;\n this.associateMessageWithRun(agent.agentId, threadId, message.id, runId);\n }\n\n /**\n * Save state for a specific run\n */\n private saveState(\n agentId: string,\n threadId: string,\n runId: string,\n state: State,\n ): void {\n // Ensure nested maps exist\n if (!this.stateByRun.has(agentId)) {\n this.stateByRun.set(agentId, new Map());\n }\n const agentStates = this.stateByRun.get(agentId)!;\n\n if (!agentStates.has(threadId)) {\n agentStates.set(threadId, new Map());\n }\n const threadStates = agentStates.get(threadId)!;\n\n // Deep copy the state to prevent mutations\n threadStates.set(runId, JSON.parse(JSON.stringify(state)));\n }\n\n /**\n * Associate a message with a run\n */\n private associateMessageWithRun(\n agentId: string,\n threadId: string,\n messageId: string,\n runId: string,\n ): void {\n // Ensure nested maps exist\n if (!this.messageToRun.has(agentId)) {\n this.messageToRun.set(agentId, new Map());\n }\n const agentMessages = this.messageToRun.get(agentId)!;\n\n if (!agentMessages.has(threadId)) {\n agentMessages.set(threadId, new Map());\n }\n const threadMessages = agentMessages.get(threadId)!;\n\n threadMessages.set(messageId, runId);\n }\n\n /**\n * Clear all state for an agent\n */\n clearAgentState(agentId: string): void {\n this.stateByRun.delete(agentId);\n this.messageToRun.delete(agentId);\n }\n\n /**\n * Clear all state for a thread\n */\n clearThreadState(agentId: string, threadId: string): void {\n this.stateByRun.get(agentId)?.delete(threadId);\n this.messageToRun.get(agentId)?.delete(threadId);\n }\n}\n","import { AbstractAgent, Context, State } from \"@ag-ui/client\";\nimport {\n FrontendTool,\n SuggestionsConfig,\n Suggestion,\n CopilotRuntimeTransport,\n RuntimeMode,\n IntelligenceRuntimeInfo,\n} from \"../types\";\nimport { AgentRegistry, CopilotKitCoreAddAgentParams } from \"./agent-registry\";\nimport { ContextStore } from \"./context-store\";\nimport { SuggestionEngine } from \"./suggestion-engine\";\nimport {\n RunHandler,\n CopilotKitCoreRunAgentParams,\n CopilotKitCoreConnectAgentParams,\n CopilotKitCoreGetToolParams,\n CopilotKitCoreRunToolParams,\n CopilotKitCoreRunToolResult,\n} from \"./run-handler\";\nimport { StateManager } from \"./state-manager\";\n\n/** Configuration options for `CopilotKitCore`. */\nexport interface CopilotKitCoreConfig {\n /** The endpoint of the CopilotRuntime. */\n runtimeUrl?: string;\n /** Transport style for CopilotRuntime endpoints. Defaults to REST. */\n runtimeTransport?: CopilotRuntimeTransport;\n /** Mapping from agent name to its `AbstractAgent` instance. For development only - production requires CopilotRuntime. */\n agents__unsafe_dev_only?: Record<string, AbstractAgent>;\n /** Headers appended to every HTTP request made by `CopilotKitCore`. */\n headers?: Record<string, string>;\n /** Credentials mode for fetch requests (e.g., \"include\" for HTTP-only cookies). */\n credentials?: RequestCredentials;\n /** Properties sent as `forwardedProps` to the AG-UI agent. */\n properties?: Record<string, unknown>;\n /** Ordered collection of frontend tools available to the core. */\n tools?: FrontendTool<any>[];\n /** Suggestions config for the core. */\n suggestionsConfig?: SuggestionsConfig[];\n}\n\nexport type { CopilotKitCoreAddAgentParams };\nexport type {\n CopilotKitCoreRunAgentParams,\n CopilotKitCoreConnectAgentParams,\n CopilotKitCoreGetToolParams,\n CopilotKitCoreRunToolParams,\n CopilotKitCoreRunToolResult,\n};\n\nexport interface CopilotKitCoreStopAgentParams {\n agent: AbstractAgent;\n}\n\nexport type CopilotKitCoreGetSuggestionsResult = {\n suggestions: Suggestion[];\n isLoading: boolean;\n};\n\nexport enum CopilotKitCoreErrorCode {\n RUNTIME_INFO_FETCH_FAILED = \"runtime_info_fetch_failed\",\n AGENT_CONNECT_FAILED = \"agent_connect_failed\",\n AGENT_RUN_FAILED = \"agent_run_failed\",\n AGENT_RUN_FAILED_EVENT = \"agent_run_failed_event\",\n AGENT_RUN_ERROR_EVENT = \"agent_run_error_event\",\n TOOL_ARGUMENT_PARSE_FAILED = \"tool_argument_parse_failed\",\n TOOL_HANDLER_FAILED = \"tool_handler_failed\",\n TOOL_NOT_FOUND = \"tool_not_found\",\n AGENT_NOT_FOUND = \"agent_not_found\",\n // Transcription errors\n TRANSCRIPTION_FAILED = \"transcription_failed\",\n TRANSCRIPTION_SERVICE_NOT_CONFIGURED = \"transcription_service_not_configured\",\n TRANSCRIPTION_INVALID_AUDIO = \"transcription_invalid_audio\",\n TRANSCRIPTION_RATE_LIMITED = \"transcription_rate_limited\",\n TRANSCRIPTION_AUTH_FAILED = \"transcription_auth_failed\",\n TRANSCRIPTION_NETWORK_ERROR = \"transcription_network_error\",\n}\n\nexport interface CopilotKitCoreSubscriber {\n onRuntimeConnectionStatusChanged?: (event: {\n copilotkit: CopilotKitCore;\n status: CopilotKitCoreRuntimeConnectionStatus;\n }) => void | Promise<void>;\n onToolExecutionStart?: (event: {\n copilotkit: CopilotKitCore;\n toolCallId: string;\n agentId: string;\n toolName: string;\n args: unknown;\n }) => void | Promise<void>;\n onToolExecutionEnd?: (event: {\n copilotkit: CopilotKitCore;\n toolCallId: string;\n agentId: string;\n toolName: string;\n result: string;\n error?: string;\n }) => void | Promise<void>;\n onAgentsChanged?: (event: {\n copilotkit: CopilotKitCore;\n agents: Readonly<Record<string, AbstractAgent>>;\n }) => void | Promise<void>;\n onContextChanged?: (event: {\n copilotkit: CopilotKitCore;\n context: Readonly<Record<string, Context>>;\n }) => void | Promise<void>;\n onSuggestionsConfigChanged?: (event: {\n copilotkit: CopilotKitCore;\n suggestionsConfig: Readonly<Record<string, SuggestionsConfig>>;\n }) => void | Promise<void>;\n onSuggestionsChanged?: (event: {\n copilotkit: CopilotKitCore;\n agentId: string;\n suggestions: Suggestion[];\n }) => void | Promise<void>;\n onSuggestionsStartedLoading?: (event: {\n copilotkit: CopilotKitCore;\n agentId: string;\n }) => void | Promise<void>;\n onSuggestionsFinishedLoading?: (event: {\n copilotkit: CopilotKitCore;\n agentId: string;\n }) => void | Promise<void>;\n onPropertiesChanged?: (event: {\n copilotkit: CopilotKitCore;\n properties: Readonly<Record<string, unknown>>;\n }) => void | Promise<void>;\n onHeadersChanged?: (event: {\n copilotkit: CopilotKitCore;\n headers: Readonly<Record<string, string>>;\n }) => void | Promise<void>;\n onError?: (event: {\n copilotkit: CopilotKitCore;\n error: Error;\n code: CopilotKitCoreErrorCode;\n context: Record<string, any>;\n }) => void | Promise<void>;\n}\n\n// Subscription object returned by subscribe()\nexport interface CopilotKitCoreSubscription {\n unsubscribe: () => void;\n}\n\nexport enum CopilotKitCoreRuntimeConnectionStatus {\n Disconnected = \"disconnected\",\n Connected = \"connected\",\n Connecting = \"connecting\",\n Error = \"error\",\n}\n\n/**\n * Internal interface for delegate classes to access CopilotKitCore methods.\n * This provides type safety while allowing controlled access to private functionality.\n */\nexport interface CopilotKitCoreFriendsAccess {\n // Notification methods\n notifySubscribers(\n handler: (subscriber: CopilotKitCoreSubscriber) => void | Promise<void>,\n errorMessage: string,\n ): Promise<void>;\n\n emitError(params: {\n error: Error;\n code: CopilotKitCoreErrorCode;\n context?: Record<string, any>;\n }): Promise<void>;\n\n // Getters for internal state\n readonly headers: Readonly<Record<string, string>>;\n readonly credentials: RequestCredentials | undefined;\n readonly properties: Readonly<Record<string, unknown>>;\n readonly context: Readonly<Record<string, Context>>;\n\n // Internal methods\n buildFrontendTools(agentId?: string): import(\"@ag-ui/client\").Tool[];\n getAgent(id: string): AbstractAgent | undefined;\n\n // References to delegate subsystems\n readonly suggestionEngine: {\n clearSuggestions(agentId: string): void;\n reloadSuggestions(agentId: string): void;\n };\n\n /**\n * Called before each follow-up agent run (after tool execution).\n * See CopilotKitCore.waitForPendingFrameworkUpdates for details.\n */\n waitForPendingFrameworkUpdates(): Promise<void>;\n}\n\nexport class CopilotKitCore {\n private _headers: Record<string, string>;\n private _credentials?: RequestCredentials;\n private _properties: Record<string, unknown>;\n\n private subscribers: Set<CopilotKitCoreSubscriber> = new Set();\n\n // Delegate classes\n private agentRegistry: AgentRegistry;\n private contextStore: ContextStore;\n private suggestionEngine: SuggestionEngine;\n private runHandler: RunHandler;\n private stateManager: StateManager;\n\n constructor({\n runtimeUrl,\n runtimeTransport = \"rest\",\n headers = {},\n credentials,\n properties = {},\n agents__unsafe_dev_only = {},\n tools = [],\n suggestionsConfig = [],\n }: CopilotKitCoreConfig) {\n this._headers = headers;\n this._credentials = credentials;\n this._properties = properties;\n\n // Initialize delegate classes\n this.agentRegistry = new AgentRegistry(this);\n this.contextStore = new ContextStore(this);\n this.suggestionEngine = new SuggestionEngine(this);\n this.runHandler = new RunHandler(this);\n this.stateManager = new StateManager(this);\n\n // Initialize each subsystem\n this.agentRegistry.initialize(agents__unsafe_dev_only);\n this.runHandler.initialize(tools);\n this.suggestionEngine.initialize(suggestionsConfig);\n this.stateManager.initialize();\n\n this.agentRegistry.setRuntimeTransport(runtimeTransport);\n this.agentRegistry.setRuntimeUrl(runtimeUrl);\n\n // Subscribe to agent changes to track state for new agents\n this.subscribe({\n onAgentsChanged: ({ agents }) => {\n Object.values(agents).forEach((agent) => {\n if (agent.agentId) {\n this.stateManager.subscribeToAgent(agent);\n }\n });\n },\n });\n }\n\n /**\n * Internal method used by delegate classes and subclasses to notify subscribers\n */\n protected async notifySubscribers(\n handler: (subscriber: CopilotKitCoreSubscriber) => void | Promise<void>,\n errorMessage: string,\n ): Promise<void> {\n await Promise.all(\n Array.from(this.subscribers).map(async (subscriber) => {\n try {\n await handler(subscriber);\n } catch (error) {\n console.error(errorMessage, error);\n }\n }),\n );\n }\n\n /**\n * Internal method used by delegate classes to emit errors\n */\n private async emitError({\n error,\n code,\n context = {},\n }: {\n error: Error;\n code: CopilotKitCoreErrorCode;\n context?: Record<string, any>;\n }): Promise<void> {\n await this.notifySubscribers(\n (subscriber) =>\n subscriber.onError?.({\n copilotkit: this,\n error,\n code,\n context,\n }),\n \"Subscriber onError error:\",\n );\n }\n\n /**\n * Snapshot accessors\n */\n get context(): Readonly<Record<string, Context>> {\n return this.contextStore.context;\n }\n\n get agents(): Readonly<Record<string, AbstractAgent>> {\n return this.agentRegistry.agents;\n }\n\n get tools(): Readonly<FrontendTool<any>[]> {\n return this.runHandler.tools;\n }\n\n get runtimeUrl(): string | undefined {\n return this.agentRegistry.runtimeUrl;\n }\n\n setRuntimeUrl(runtimeUrl: string | undefined): void {\n this.agentRegistry.setRuntimeUrl(runtimeUrl);\n }\n\n get runtimeTransport(): CopilotRuntimeTransport {\n return this.agentRegistry.runtimeTransport;\n }\n\n setRuntimeTransport(runtimeTransport: CopilotRuntimeTransport): void {\n this.agentRegistry.setRuntimeTransport(runtimeTransport);\n }\n\n get runtimeVersion(): string | undefined {\n return this.agentRegistry.runtimeVersion;\n }\n\n get headers(): Readonly<Record<string, string>> {\n return this._headers;\n }\n\n get credentials(): RequestCredentials | undefined {\n return this._credentials;\n }\n\n get properties(): Readonly<Record<string, unknown>> {\n return this._properties;\n }\n\n get runtimeConnectionStatus(): CopilotKitCoreRuntimeConnectionStatus {\n return this.agentRegistry.runtimeConnectionStatus;\n }\n\n get audioFileTranscriptionEnabled(): boolean {\n return this.agentRegistry.audioFileTranscriptionEnabled;\n }\n\n get runtimeMode(): RuntimeMode {\n return this.agentRegistry.runtimeMode;\n }\n\n get intelligence(): IntelligenceRuntimeInfo | undefined {\n return this.agentRegistry.intelligence;\n }\n\n get a2uiEnabled(): boolean {\n return this.agentRegistry.a2uiEnabled;\n }\n\n /**\n * Configuration updates\n */\n setHeaders(headers: Record<string, string>): void {\n this._headers = headers;\n this.agentRegistry.applyHeadersToAgents(\n this.agentRegistry.agents as Record<string, AbstractAgent>,\n );\n void this.notifySubscribers(\n (subscriber) =>\n subscriber.onHeadersChanged?.({\n copilotkit: this,\n headers: this.headers,\n }),\n \"Subscriber onHeadersChanged error:\",\n );\n }\n\n setCredentials(credentials: RequestCredentials | undefined): void {\n this._credentials = credentials;\n this.agentRegistry.applyCredentialsToAgents(\n this.agentRegistry.agents as Record<string, AbstractAgent>,\n );\n }\n\n setProperties(properties: Record<string, unknown>): void {\n this._properties = properties;\n void this.notifySubscribers(\n (subscriber) =>\n subscriber.onPropertiesChanged?.({\n copilotkit: this,\n properties: this.properties,\n }),\n \"Subscriber onPropertiesChanged error:\",\n );\n }\n\n /**\n * Agent management (delegated to AgentRegistry)\n */\n setAgents__unsafe_dev_only(agents: Record<string, AbstractAgent>): void {\n this.agentRegistry.setAgents__unsafe_dev_only(agents);\n }\n\n addAgent__unsafe_dev_only(params: CopilotKitCoreAddAgentParams): void {\n this.agentRegistry.addAgent__unsafe_dev_only(params);\n }\n\n removeAgent__unsafe_dev_only(id: string): void {\n this.agentRegistry.removeAgent__unsafe_dev_only(id);\n }\n\n getAgent(id: string): AbstractAgent | undefined {\n return this.agentRegistry.getAgent(id);\n }\n\n /**\n * Context management (delegated to ContextStore)\n */\n addContext(context: Context): string {\n return this.contextStore.addContext(context);\n }\n\n removeContext(id: string): void {\n this.contextStore.removeContext(id);\n }\n\n /**\n * Suggestions management (delegated to SuggestionEngine)\n */\n addSuggestionsConfig(config: SuggestionsConfig): string {\n return this.suggestionEngine.addSuggestionsConfig(config);\n }\n\n removeSuggestionsConfig(id: string): void {\n this.suggestionEngine.removeSuggestionsConfig(id);\n }\n\n reloadSuggestions(agentId: string): void {\n this.suggestionEngine.reloadSuggestions(agentId);\n }\n\n clearSuggestions(agentId: string): void {\n this.suggestionEngine.clearSuggestions(agentId);\n }\n\n getSuggestions(agentId: string): CopilotKitCoreGetSuggestionsResult {\n return this.suggestionEngine.getSuggestions(agentId);\n }\n\n /**\n * Tool management (delegated to RunHandler)\n */\n addTool<T extends Record<string, unknown> = Record<string, unknown>>(\n tool: FrontendTool<T>,\n ): void {\n this.runHandler.addTool(tool);\n }\n\n removeTool(id: string, agentId?: string): void {\n this.runHandler.removeTool(id, agentId);\n }\n\n getTool(params: CopilotKitCoreGetToolParams): FrontendTool<any> | undefined {\n return this.runHandler.getTool(params);\n }\n\n setTools(tools: FrontendTool<any>[]): void {\n this.runHandler.setTools(tools);\n }\n\n /**\n * Subscription lifecycle\n */\n subscribe(subscriber: CopilotKitCoreSubscriber): CopilotKitCoreSubscription {\n this.subscribers.add(subscriber);\n\n // Return subscription with unsubscribe method\n return {\n unsubscribe: () => {\n this.subscribers.delete(subscriber);\n },\n };\n }\n\n /**\n * Agent connectivity (delegated to RunHandler)\n */\n async connectAgent(\n params: CopilotKitCoreConnectAgentParams,\n ): Promise<import(\"@ag-ui/client\").RunAgentResult> {\n return this.runHandler.connectAgent(params);\n }\n\n stopAgent(params: CopilotKitCoreStopAgentParams): void {\n params.agent.abortRun();\n }\n\n async runAgent(\n params: CopilotKitCoreRunAgentParams,\n ): Promise<import(\"@ag-ui/client\").RunAgentResult> {\n return this.runHandler.runAgent(params);\n }\n\n /**\n * Programmatically execute a registered frontend tool without going through an LLM turn.\n * The handler runs, render components show up in the UI, and both the tool call and\n * result messages are added to `agent.messages`.\n */\n async runTool(\n params: CopilotKitCoreRunToolParams,\n ): Promise<CopilotKitCoreRunToolResult> {\n return this.runHandler.runTool(params);\n }\n\n /**\n * State management (delegated to StateManager)\n */\n getStateByRun(\n agentId: string,\n threadId: string,\n runId: string,\n ): State | undefined {\n return this.stateManager.getStateByRun(agentId, threadId, runId);\n }\n\n getRunIdForMessage(\n agentId: string,\n threadId: string,\n messageId: string,\n ): string | undefined {\n return this.stateManager.getRunIdForMessage(agentId, threadId, messageId);\n }\n\n getRunIdsForThread(agentId: string, threadId: string): string[] {\n return this.stateManager.getRunIdsForThread(agentId, threadId);\n }\n\n /**\n * Internal method used by RunHandler to build frontend tools\n */\n private buildFrontendTools(agentId?: string): import(\"@ag-ui/client\").Tool[] {\n return this.runHandler.buildFrontendTools(agentId);\n }\n\n /**\n * Called before each follow-up agent run (after tool execution).\n *\n * When a frontend tool handler calls framework state setters (e.g. React's\n * setState), those updates are batched and deferred — they do not take effect\n * until the framework's scheduler runs (React uses MessageChannel).\n * useAgentContext registers context via useLayoutEffect, which runs\n * synchronously after React commits that deferred batch.\n *\n * Without yielding here, the follow-up runAgent reads the context store\n * synchronously while the deferred updates are still pending, producing stale\n * context for the next agent turn.\n *\n * Override in framework-specific subclasses to yield to the framework\n * scheduler before the follow-up run. The base implementation is a no-op\n * because non-React environments have no deferred state to flush.\n */\n async waitForPendingFrameworkUpdates(): Promise<void> {}\n}\n","import { AbstractAgent, ToolCall } from \"@ag-ui/client\";\nimport type {\n IntelligenceRuntimeInfo,\n RuntimeMode,\n} from \"@copilotkitnext/shared\";\nimport type { StandardSchemaV1 } from \"@copilotkitnext/shared\";\n\n/**\n * Status of a tool call execution\n */\nexport enum ToolCallStatus {\n InProgress = \"inProgress\",\n Executing = \"executing\",\n Complete = \"complete\",\n}\n\nexport type CopilotRuntimeTransport = \"rest\" | \"single\";\nexport type { RuntimeMode, IntelligenceRuntimeInfo };\n\n/**\n * Context passed to a frontend tool handler\n */\nexport type FrontendToolHandlerContext = {\n toolCall: ToolCall;\n agent: AbstractAgent;\n};\n\nexport type FrontendTool<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = {\n name: string;\n description?: string;\n parameters?: StandardSchemaV1<any, T>;\n handler?: (args: T, context: FrontendToolHandlerContext) => Promise<unknown>;\n followUp?: boolean;\n /**\n * Optional agent ID to constrain this tool to a specific agent.\n * If specified, this tool will only be available to the specified agent.\n */\n agentId?: string;\n /**\n * Whether this tool is available to the agent.\n * Set to false to hide the tool from the agent without unregistering it.\n * Defaults to true when not specified.\n */\n available?: boolean;\n};\n\nexport type Suggestion = {\n title: string;\n message: string;\n /** Indicates whether this suggestion is still being generated. */\n isLoading: boolean;\n};\n\nexport type SuggestionAvailability =\n | \"before-first-message\"\n | \"after-first-message\"\n | \"always\"\n | \"disabled\";\n\nexport type DynamicSuggestionsConfig = {\n /**\n * A prompt or instructions for the GPT to generate suggestions.\n */\n instructions: string;\n /**\n * The minimum number of suggestions to generate. Defaults to `1`.\n * @default 1\n */\n minSuggestions?: number;\n /**\n * The maximum number of suggestions to generate. Defaults to `3`.\n * @default 1\n */\n maxSuggestions?: number;\n\n /**\n * When the suggestions are available. Defaults to \"after-first-message\".\n */\n available?: SuggestionAvailability;\n\n /**\n * The agent ID of the provider of the suggestions. Defaults to `\"default\"`.\n */\n providerAgentId?: string;\n\n /**\n * The agent ID of the consumer of the suggestions. Defaults to `\"*\"` (all agents).\n */\n consumerAgentId?: string;\n};\n\nexport type StaticSuggestionsConfig = {\n /**\n * The suggestions to display.\n */\n suggestions: Omit<Suggestion, \"isLoading\">[];\n\n /**\n * When the suggestions are available. Defaults to \"before-first-message\".\n */\n available?: SuggestionAvailability;\n\n /**\n * The agent ID of the consumer of the suggestions. Defaults to `\"*\"` (all agents).\n */\n consumerAgentId?: string;\n};\n\nexport type SuggestionsConfig =\n | DynamicSuggestionsConfig\n | StaticSuggestionsConfig;\n","export function completePartialMarkdown(input: string): string {\n let s = input;\n\n // Handle code fences first - use FIRST unmatched fence for proper nesting\n const fenceMatches = Array.from(s.matchAll(/^(\\s*)(`{3,}|~{3,})/gm));\n if (fenceMatches.length % 2 === 1) {\n const [, indent, fence] = fenceMatches[0]!;\n s += `\\n${indent}${fence}`;\n }\n\n // Identify incomplete links at the end and close them\n const incompleteLinkMatch = s.match(/\\[([^\\]]*)\\]\\(([^)]*)$/);\n if (incompleteLinkMatch) {\n s += \")\";\n }\n\n // State-based parsing\n interface OpenElement {\n type: string;\n marker: string;\n position: number;\n }\n\n const openElements: OpenElement[] = [];\n const chars = Array.from(s);\n\n // First pass: identify code block boundaries and inline code to avoid processing their content\n const codeBlockRanges: Array<{ start: number; end: number }> = [];\n const inlineCodeRanges: Array<{ start: number; end: number }> = [];\n\n // Find code block ranges\n let tempCodeFenceCount = 0;\n let currentCodeBlockStart = -1;\n\n for (let i = 0; i < chars.length; i++) {\n if (i === 0 || chars[i - 1] === \"\\n\") {\n const lineMatch = s.substring(i).match(/^(\\s*)(`{3,}|~{3,})/);\n if (lineMatch) {\n tempCodeFenceCount++;\n if (tempCodeFenceCount % 2 === 1) {\n currentCodeBlockStart = i;\n } else if (currentCodeBlockStart !== -1) {\n codeBlockRanges.push({\n start: currentCodeBlockStart,\n end: i + lineMatch[0].length,\n });\n currentCodeBlockStart = -1;\n }\n i += lineMatch[0].length - 1;\n }\n }\n }\n\n // Find inline code ranges\n for (let i = 0; i < chars.length; i++) {\n if (chars[i] === \"`\") {\n // Check if escaped\n let backslashCount = 0;\n for (let j = i - 1; j >= 0 && chars[j] === \"\\\\\"; j--) {\n backslashCount++;\n }\n if (backslashCount % 2 === 0) {\n // Not escaped - find the closing backtick\n for (let j = i + 1; j < chars.length; j++) {\n if (chars[j] === \"`\") {\n let closingBackslashCount = 0;\n for (let k = j - 1; k >= 0 && chars[k] === \"\\\\\"; k--) {\n closingBackslashCount++;\n }\n if (closingBackslashCount % 2 === 0) {\n inlineCodeRanges.push({ start: i, end: j + 1 });\n i = j;\n break;\n }\n }\n }\n }\n }\n }\n\n // Helper function to check if position is in code\n const isInCode = (pos: number): boolean => {\n return (\n codeBlockRanges.some((range) => pos >= range.start && pos < range.end) ||\n inlineCodeRanges.some((range) => pos >= range.start && pos < range.end)\n );\n };\n\n // Second pass: process markdown elements, skipping code regions\n for (let i = 0; i < chars.length; i++) {\n const char = chars[i];\n const nextChar = chars[i + 1];\n const prevChar = chars[i - 1];\n\n if (isInCode(i)) {\n continue;\n }\n\n // Handle brackets (but not if they're part of already-complete links)\n if (char === \"[\") {\n // Check if this is part of a complete link [text](url)\n let isCompleteLink = false;\n let bracketDepth = 1;\n let j = i + 1;\n\n // Find the matching ]\n while (j < chars.length && bracketDepth > 0) {\n if (chars[j] === \"[\" && !isInCode(j)) bracketDepth++;\n if (chars[j] === \"]\" && !isInCode(j)) bracketDepth--;\n j++;\n }\n\n // Check if followed by (\n if (bracketDepth === 0 && chars[j] === \"(\") {\n // Find the closing )\n let parenDepth = 1;\n j++;\n while (j < chars.length && parenDepth > 0) {\n if (chars[j] === \"(\" && !isInCode(j)) parenDepth++;\n if (chars[j] === \")\" && !isInCode(j)) parenDepth--;\n j++;\n }\n if (parenDepth === 0) {\n isCompleteLink = true;\n i = j - 1;\n continue;\n }\n }\n\n // This is a standalone bracket, treat as markdown\n if (!isCompleteLink) {\n const existingIndex = openElements.findIndex(\n (el) => el.type === \"bracket\",\n );\n if (existingIndex !== -1) {\n openElements.splice(existingIndex, 1);\n } else {\n openElements.push({ type: \"bracket\", marker: \"[\", position: i });\n }\n }\n }\n\n // Handle double emphasis first (**, __, ~~) - these take precedence\n else if (char === \"*\" && nextChar === \"*\") {\n const existingIndex = openElements.findIndex(\n (el) => el.type === \"bold_star\",\n );\n if (existingIndex !== -1) {\n openElements.splice(existingIndex, 1);\n } else {\n openElements.push({ type: \"bold_star\", marker: \"**\", position: i });\n }\n i++; // Skip next character\n } else if (char === \"_\" && nextChar === \"_\") {\n const existingIndex = openElements.findIndex(\n (el) => el.type === \"bold_underscore\",\n );\n if (existingIndex !== -1) {\n openElements.splice(existingIndex, 1);\n } else {\n openElements.push({\n type: \"bold_underscore\",\n marker: \"__\",\n position: i,\n });\n }\n i++; // Skip next character\n } else if (char === \"~\" && nextChar === \"~\") {\n const existingIndex = openElements.findIndex(\n (el) => el.type === \"strike\",\n );\n if (existingIndex !== -1) {\n openElements.splice(existingIndex, 1);\n } else {\n openElements.push({ type: \"strike\", marker: \"~~\", position: i });\n }\n i++; // Skip next character\n }\n\n // Handle single emphasis (*, _) - only if not part of double\n else if (char === \"*\" && prevChar !== \"*\" && nextChar !== \"*\") {\n const existingIndex = openElements.findIndex(\n (el) => el.type === \"italic_star\",\n );\n if (existingIndex !== -1) {\n openElements.splice(existingIndex, 1);\n } else {\n openElements.push({ type: \"italic_star\", marker: \"*\", position: i });\n }\n } else if (char === \"_\" && prevChar !== \"_\" && nextChar !== \"_\") {\n const existingIndex = openElements.findIndex(\n (el) => el.type === \"italic_underscore\",\n );\n if (existingIndex !== -1) {\n openElements.splice(existingIndex, 1);\n } else {\n openElements.push({\n type: \"italic_underscore\",\n marker: \"_\",\n position: i,\n });\n }\n }\n }\n\n // Handle remaining unmatched backticks (outside of inline code ranges)\n let backtickCount = 0;\n for (let i = 0; i < chars.length; i++) {\n if (chars[i] === \"`\" && !isInCode(i)) {\n backtickCount++;\n }\n }\n if (backtickCount % 2 === 1) {\n s += \"`\";\n }\n\n // Close remaining open elements in reverse order (LIFO stack semantics)\n openElements.sort((a, b) => b.position - a.position);\n\n const closers = openElements.map((el) => {\n switch (el.type) {\n case \"bracket\":\n return \"]\";\n case \"bold_star\":\n return \"**\";\n case \"bold_underscore\":\n return \"__\";\n case \"strike\":\n return \"~~\";\n case \"italic_star\":\n return \"*\";\n case \"italic_underscore\":\n return \"_\";\n default:\n return \"\";\n }\n });\n\n let result = s + closers.join(\"\");\n\n // Handle parentheses ONLY if not inside code\n const finalFenceMatches = Array.from(\n result.matchAll(/^(\\s*)(`{3,}|~{3,})/gm),\n );\n const hasUnclosedBacktick = (result.match(/`/g) || []).length % 2 === 1;\n const hasUnclosedCodeFence = finalFenceMatches.length % 2 === 1;\n\n let shouldCloseParens = !hasUnclosedBacktick && !hasUnclosedCodeFence;\n\n if (shouldCloseParens) {\n const lastOpenParen = result.lastIndexOf(\"(\");\n if (lastOpenParen !== -1) {\n // Check if this paren is inside a backtick pair\n const beforeParen = result.substring(0, lastOpenParen);\n const backticksBeforeParen = (beforeParen.match(/`/g) || []).length;\n if (backticksBeforeParen % 2 === 1) {\n shouldCloseParens = false;\n }\n }\n }\n\n if (shouldCloseParens) {\n const openParens = (result.match(/\\(/g) || []).length;\n const closeParens = (result.match(/\\)/g) || []).length;\n if (openParens > closeParens) {\n result += \")\".repeat(openParens - closeParens);\n }\n }\n\n return result;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n BehaviorSubject,\n Observable,\n OperatorFunction,\n Subject,\n Subscription,\n asapScheduler,\n} from \"rxjs\";\nimport { distinctUntilChanged, filter, map, observeOn } from \"rxjs/operators\";\n\n/**\n * The minimal action shape used by this micro-redux implementation.\n */\nexport interface AnyAction {\n type: string;\n}\n\n/**\n * A typed action creator function with a `type` literal and runtime matcher.\n */\nexport type ActionCreator<\n Type extends string,\n Args extends unknown[] = unknown[],\n Action extends AnyAction & { type: Type } = { type: Type },\n> = ((...args: Args) => Action) & {\n type: Type;\n match(action: AnyAction): action is Action;\n};\n\n/**\n * Extracts the action type produced by an action creator.\n */\nexport type ActionFromCreator<T> = T extends (...args: any[]) => infer A\n ? A\n : never;\n\n/**\n * Extracts a union of actions produced by a tuple/array of action creators.\n */\nexport type ActionFromCreators<\n Creators extends readonly ActionCreator<string, any[], any>[],\n> = ActionFromCreator<Creators[number]>;\n\n/**\n * A reducer transforms state in response to actions.\n */\nexport type Reducer<State, Action extends AnyAction = AnyAction> = (\n state: State | undefined,\n action: Action,\n) => State;\n\n/**\n * A selector derives a value from state.\n */\nexport type Selector<State, Result> = (state: State) => Result;\n\n/**\n * Marker config for action creators that accept no payload.\n */\nexport interface EmptyActionConfig {\n readonly kind: \"empty\";\n}\n\nconst PROPS_MARKER: unique symbol = Symbol(\"props_marker\");\n\n/**\n * Marker config for action creators that require payload props.\n */\nexport interface PropsActionConfig<Props extends Record<string, unknown>> {\n readonly kind: \"props\";\n readonly [PROPS_MARKER]?: Props;\n}\n\n/**\n * Supported action creator config node in an action group.\n */\nexport type ActionConfig =\n | EmptyActionConfig\n | PropsActionConfig<Record<string, unknown>>;\n\n/**\n * Shape of an action group declaration object.\n */\nexport type ActionGroupConfig = Record<string, ActionConfig>;\n\n/**\n * Maps an action group declaration to a strongly typed action-creator object.\n */\nexport type ActionGroupResult<\n Source extends string,\n Config extends ActionGroupConfig,\n> = {\n [K in keyof Config & string]: Config[K] extends PropsActionConfig<infer P>\n ? ActionCreator<`[${Source}] ${K}`, [P], { type: `[${Source}] ${K}` } & P>\n : ActionCreator<`[${Source}] ${K}`, [], { type: `[${Source}] ${K}` }>;\n};\n\ninterface OnReducerEntry<\n State,\n Action extends AnyAction = AnyAction,\n Creators extends readonly ActionCreator<string, any[], any>[] =\n readonly ActionCreator<string, any[], any>[],\n> {\n creators: Creators;\n reducer: (state: State, action: Action) => State;\n}\n\ntype ActionFromOnReducerEntry<TEntry> =\n TEntry extends OnReducerEntry<any, infer TAction, any> ? TAction : never;\n\n/**\n * Effect contract for streams that emit actions to dispatch.\n */\nexport interface DispatchingEffect<\n State,\n InputAction extends AnyAction = AnyAction,\n OutputAction extends AnyAction = AnyAction,\n> {\n run: (\n actions$: Observable<InputAction>,\n state$: Observable<State>,\n ) => Observable<OutputAction>;\n dispatch: true;\n}\n\n/**\n * Effect contract for side-effect-only streams whose emissions are ignored.\n */\nexport interface NonDispatchingEffect<\n State,\n InputAction extends AnyAction = AnyAction,\n> {\n run: (\n actions$: Observable<InputAction>,\n state$: Observable<State>,\n ) => Observable<unknown>;\n dispatch: false;\n}\n\n/**\n * Union of supported effect shapes.\n */\nexport type Effect<\n State,\n InputAction extends AnyAction = AnyAction,\n OutputAction extends AnyAction = AnyAction,\n> =\n | DispatchingEffect<State, InputAction, OutputAction>\n | NonDispatchingEffect<State, InputAction>;\n\n/**\n * Lifecycle actions dispatched by the store.\n */\nexport type StoreLifecycleAction =\n | { type: \"@@micro-redux/init\" }\n | { type: \"@@micro-redux/stop\" };\n\n/**\n * Options for a dispatching effect.\n */\nexport interface DispatchingEffectOptions {\n dispatch?: true;\n}\n\n/**\n * Options for a non-dispatching effect.\n */\nexport interface NonDispatchingEffectOptions {\n dispatch: false;\n}\n\nconst INTERNAL_ACTION_TYPES = {\n boot: \"@@micro-redux/boot\",\n init: \"@@micro-redux/init\",\n stop: \"@@micro-redux/stop\",\n} as const;\n\nconst INTERNAL_BOOT_ACTION: AnyAction = { type: INTERNAL_ACTION_TYPES.boot };\n\n/**\n * Builds a typed action creator from a type string and payload factory.\n */\nfunction createTypedActionCreator<\n Type extends string,\n Args extends unknown[],\n Payload extends Record<string, unknown>,\n>(\n type: Type,\n factory: (...args: Args) => Payload,\n): ActionCreator<Type, Args, { type: Type } & Payload> {\n const creator = ((...args: Args) => ({\n ...factory(...args),\n type,\n })) as ActionCreator<Type, Args, { type: Type } & Payload>;\n\n creator.type = type;\n creator.match = (action: AnyAction): action is { type: Type } & Payload =>\n action.type === type;\n\n return creator;\n}\n\n/**\n * Declares a payload-based action config for `createActionGroup`.\n *\n * @example\n * ```ts\n * const actions = createActionGroup(\"User\", {\n * loaded: props<{ id: string }>(),\n * });\n * ```\n */\nexport function props<\n Props extends Record<string, unknown>,\n>(): PropsActionConfig<Props> {\n return { kind: \"props\" };\n}\n\n/**\n * Declares a no-payload action config for `createActionGroup`.\n *\n * @example\n * ```ts\n * const actions = createActionGroup(\"User\", {\n * reset: empty(),\n * });\n * ```\n */\nexport function empty(): EmptyActionConfig {\n return { kind: \"empty\" };\n}\n\n/**\n * Creates a namespaced group of typed action creators.\n *\n * Action types are formatted as: `[Source] actionName`.\n */\nexport function createActionGroup<\n const Source extends string,\n const Config extends ActionGroupConfig,\n>(source: Source, config: Config): ActionGroupResult<Source, Config> {\n const group = {} as ActionGroupResult<Source, Config>;\n\n for (const eventName of Object.keys(config) as Array<keyof Config & string>) {\n const eventConfig = config[eventName];\n if (!eventConfig) {\n continue;\n }\n\n const actionType = `[${source}] ${eventName}` as const;\n\n if (eventConfig.kind === \"props\") {\n group[eventName] = createTypedActionCreator(\n actionType,\n (payload: Record<string, unknown>) => ({ ...payload }),\n ) as ActionGroupResult<Source, Config>[typeof eventName];\n continue;\n }\n\n group[eventName] = createTypedActionCreator(\n actionType,\n () => ({}),\n ) as ActionGroupResult<Source, Config>[typeof eventName];\n }\n\n return group;\n}\n\n/**\n * Registers one reducer handler for one or more action creators.\n *\n * @throws Error when called without at least one action creator and reducer.\n */\nexport function on<\n State,\n const Creators extends readonly ActionCreator<string, any[], any>[],\n Action extends ActionFromCreators<Creators>,\n>(\n ...args: [\n ...creators: Creators,\n reducer: (state: State, action: Action) => State,\n ]\n): OnReducerEntry<State, Action, Creators> {\n if (args.length < 2) {\n throw new Error(\"on requires at least one action creator and one reducer\");\n }\n\n const reducer = args[args.length - 1] as (\n state: State,\n action: Action,\n ) => State;\n const creators = args.slice(0, -1) as unknown as Creators;\n\n return {\n creators,\n reducer,\n };\n}\n\n/**\n * Creates a reducer from an initial state and `on(...)` handler entries.\n *\n * Unknown action types return the current state unchanged.\n */\nexport function createReducer<\n State,\n const Entries extends readonly OnReducerEntry<any, any, any>[],\n>(\n initialState: State,\n ...entries: Entries\n): Reducer<State, ActionFromOnReducerEntry<Entries[number]>> {\n type ReducerAction = ActionFromOnReducerEntry<Entries[number]>;\n\n const reducerMap = new Map<\n string,\n Array<(state: State, action: ReducerAction) => State>\n >();\n\n for (const entry of entries) {\n for (const creator of entry.creators) {\n const handlers = reducerMap.get(creator.type) ?? [];\n handlers.push(\n entry.reducer as unknown as (\n state: State,\n action: ReducerAction,\n ) => State,\n );\n reducerMap.set(creator.type, handlers);\n }\n }\n\n return (state: State | undefined, action: ReducerAction): State => {\n const currentState = state ?? initialState;\n const handlers = reducerMap.get(action.type);\n\n if (!handlers || handlers.length === 0) {\n return currentState;\n }\n\n let nextState = currentState;\n for (const handler of handlers) {\n nextState = handler(nextState, action);\n }\n return nextState;\n };\n}\n\n/**\n * Creates a memoized selector from a single projector.\n */\nexport function createSelector<State, Result>(\n projector: (state: State) => Result,\n): Selector<State, Result>;\n\n/**\n * Creates a memoized selector from input selectors and a projector.\n *\n * Memoization uses one-entry caching over the latest input selector values.\n */\nexport function createSelector<\n State,\n const Selectors extends readonly Selector<State, unknown>[],\n Result,\n>(\n ...args: [\n ...selectors: Selectors,\n projector: (\n ...inputs: { [K in keyof Selectors]: ReturnType<Selectors[K]> }\n ) => Result,\n ]\n): Selector<State, Result>;\n\n/**\n * Creates a selector that caches and reuses the last computed result\n * when all input references are unchanged.\n */\nexport function createSelector<State, Result>(\n ...args:\n | [(state: State) => Result]\n | [\n ...selectors: Array<Selector<State, unknown>>,\n projector: (...inputs: unknown[]) => Result,\n ]\n): Selector<State, Result> {\n if (args.length === 1) {\n const projector = args[0] as (state: State) => Result;\n let hasCached = false;\n let lastState: State | undefined;\n let lastResult: Result;\n\n return (state: State): Result => {\n if (hasCached && state === lastState) {\n return lastResult;\n }\n\n lastState = state;\n lastResult = projector(state);\n hasCached = true;\n return lastResult;\n };\n }\n\n const projector = args[args.length - 1] as (...inputs: unknown[]) => Result;\n const selectors = args.slice(0, -1) as Array<Selector<State, unknown>>;\n\n let hasCached = false;\n let lastInputs: unknown[] = [];\n let lastResult: Result;\n\n return (state: State): Result => {\n const inputs = selectors.map((selector) => selector(state));\n\n if (\n hasCached &&\n inputs.length === lastInputs.length &&\n inputs.every((value, index) => value === lastInputs[index])\n ) {\n return lastResult;\n }\n\n lastInputs = inputs;\n lastResult = projector(...inputs);\n hasCached = true;\n return lastResult;\n };\n}\n\n/**\n * RxJS operator that maps state emissions through a selector and suppresses\n * unchanged projected values via reference equality.\n */\nexport function select<State, Result>(\n selector: Selector<State, Result>,\n): OperatorFunction<State, Result> {\n return (source$) => source$.pipe(map(selector), distinctUntilChanged());\n}\n\n/**\n * RxJS operator that filters an action stream by action creators and narrows\n * the output action type to the matched creator union.\n *\n * @throws Error when called without at least one action creator.\n */\nexport function ofType<\n const Creators extends readonly ActionCreator<string, any[], AnyAction>[],\n>(\n ...creators: Creators\n): OperatorFunction<AnyAction, ActionFromCreators<Creators>> {\n if (creators.length === 0) {\n throw new Error(\"ofType requires at least one action creator\");\n }\n\n const actionTypes = new Set(creators.map((creator) => creator.type));\n return (source$) => {\n return source$.pipe(\n filter((action: AnyAction): action is ActionFromCreators<Creators> => {\n return actionTypes.has(action.type);\n }),\n );\n };\n}\n\n/**\n * Creates a dispatching effect. Emitted actions are automatically dispatched.\n */\nexport function createEffect<\n State,\n InputAction extends AnyAction,\n OutputAction extends AnyAction,\n>(\n factory: (\n actions$: Observable<InputAction>,\n state$: Observable<State>,\n ) => Observable<OutputAction>,\n options?: DispatchingEffectOptions,\n): DispatchingEffect<State, InputAction, OutputAction>;\n\n/**\n * Creates a non-dispatching effect. Emitted values are ignored.\n */\nexport function createEffect<State, InputAction extends AnyAction>(\n factory: (\n actions$: Observable<InputAction>,\n state$: Observable<State>,\n ) => Observable<unknown>,\n options: NonDispatchingEffectOptions,\n): NonDispatchingEffect<State, InputAction>;\n\n/**\n * Creates an effect descriptor consumed by `createStore`.\n */\nexport function createEffect<\n State,\n InputAction extends AnyAction,\n OutputAction extends AnyAction,\n>(\n factory: (\n actions$: Observable<InputAction>,\n state$: Observable<State>,\n ) => Observable<OutputAction>,\n options: DispatchingEffectOptions | NonDispatchingEffectOptions = {},\n): Effect<State, InputAction, OutputAction> {\n if (options.dispatch === false) {\n return {\n run: factory,\n dispatch: false,\n };\n }\n\n return {\n run: factory,\n dispatch: true,\n };\n}\n\n/**\n * Store interface returned by `createStore`.\n */\nexport interface Store<State, Action extends AnyAction = AnyAction> {\n dispatch(action: Action): void;\n getState(): State;\n readonly state$: Observable<State>;\n readonly actions$: Observable<Action | StoreLifecycleAction>;\n select<Result>(selector: Selector<State, Result>): Observable<Result>;\n init(): void;\n stop(): void;\n}\n\n/**\n * Creates a small observable store with reducer + effects.\n *\n * Behavior:\n * - `init()` starts effects and dispatches `@@micro-redux/init`.\n * - `stop()` dispatches `@@micro-redux/stop` and unsubscribes all effects.\n * - Effect action observation is scheduled on `asapScheduler` to avoid\n * synchronous re-entrancy in the effect loop.\n * - Any effect error triggers fail-fast teardown and errors both `actions$`\n * and `state$`.\n */\nexport function createStore<\n State,\n Action extends AnyAction = AnyAction,\n>(options: {\n reducer: Reducer<State, Action | StoreLifecycleAction>;\n effects?: Array<Effect<State, Action | StoreLifecycleAction, Action>>;\n}): Store<State, Action> {\n const reducer = options.reducer;\n const effects = options.effects ?? [];\n\n let hasFatalError = false;\n let isRunning = false;\n let effectSubscriptions = new Subscription();\n\n let currentState = reducer(\n undefined,\n INTERNAL_BOOT_ACTION as Action | StoreLifecycleAction,\n );\n const stateSubject = new BehaviorSubject<State>(currentState);\n const actionsSubject = new Subject<Action | StoreLifecycleAction>();\n\n const dispatchInternal = (action: Action | StoreLifecycleAction): void => {\n if (hasFatalError) {\n throw new Error(\"Store is in a failed state due to an effect error\");\n }\n\n currentState = reducer(currentState, action);\n stateSubject.next(currentState);\n actionsSubject.next(action);\n };\n\n const failFast = (error: unknown): void => {\n if (hasFatalError) {\n return;\n }\n\n hasFatalError = true;\n isRunning = false;\n effectSubscriptions.unsubscribe();\n effectSubscriptions = new Subscription();\n\n actionsSubject.error(error);\n stateSubject.error(error);\n };\n\n const startEffects = (): void => {\n for (const effect of effects) {\n const scheduledActions$ = actionsSubject\n .asObservable()\n .pipe(observeOn(asapScheduler));\n const state$ = stateSubject.asObservable();\n\n if (effect.dispatch) {\n const subscription = effect.run(scheduledActions$, state$).subscribe({\n next: (effectAction) => {\n if (hasFatalError) {\n return;\n }\n dispatchInternal(effectAction);\n },\n error: (error) => {\n failFast(error);\n },\n });\n\n effectSubscriptions.add(subscription);\n continue;\n }\n\n const subscription = effect.run(scheduledActions$, state$).subscribe({\n error: (error) => {\n failFast(error);\n },\n });\n\n effectSubscriptions.add(subscription);\n }\n };\n\n return {\n dispatch(action: Action): void {\n dispatchInternal(action);\n },\n getState(): State {\n return currentState;\n },\n get state$(): Observable<State> {\n return stateSubject.asObservable();\n },\n get actions$(): Observable<Action | StoreLifecycleAction> {\n return actionsSubject.asObservable();\n },\n select<Result>(selector: Selector<State, Result>): Observable<Result> {\n return stateSubject.asObservable().pipe(select(selector));\n },\n init(): void {\n if (hasFatalError || isRunning) {\n return;\n }\n\n isRunning = true;\n startEffects();\n\n if (hasFatalError) {\n return;\n }\n\n dispatchInternal({ type: INTERNAL_ACTION_TYPES.init });\n },\n stop(): void {\n if (hasFatalError || !isRunning) {\n return;\n }\n\n dispatchInternal({ type: INTERNAL_ACTION_TYPES.stop });\n effectSubscriptions.unsubscribe();\n effectSubscriptions = new Subscription();\n isRunning = false;\n },\n };\n}\n","import { phoenixExponentialBackoff } from \"@copilotkitnext/shared\";\nimport type { Observable } from \"rxjs\";\nimport { defer, firstValueFrom, merge, of } from \"rxjs\";\nimport { fromFetch } from \"rxjs/fetch\";\nimport {\n catchError,\n filter,\n map,\n mergeMap,\n share,\n shareReplay,\n switchMap,\n take,\n takeUntil,\n timeout,\n withLatestFrom,\n} from \"rxjs/operators\";\nimport {\n createActionGroup,\n createEffect,\n createReducer,\n createSelector,\n createStore,\n empty,\n ofType,\n on,\n props,\n type Store,\n} from \"./utils/micro-redux\";\nimport {\n ɵphoenixChannel$,\n ɵphoenixSocket$,\n type ɵPhoenixChannelSession,\n ɵobservePhoenixEvent$,\n ɵobservePhoenixJoinOutcome$,\n ɵobservePhoenixSocketHealth$,\n ɵobservePhoenixSocketSignals$,\n} from \"./utils/phoenix-observable\";\n\nconst THREADS_CHANNEL_EVENT = \"thread_metadata\";\nconst THREAD_SUBSCRIBE_PATH = \"/threads/subscribe\";\nconst MAX_SOCKET_RETRIES = 5;\nconst REQUEST_TIMEOUT_MS = 15_000;\n\ninterface ThreadRecord {\n id: string;\n tenantId: string;\n agentId: string;\n createdById: string;\n name: string | null;\n archived: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface ThreadRuntimeContext {\n runtimeUrl: string;\n headers: Record<string, string>;\n wsUrl?: string;\n userId: string;\n agentId: string;\n}\n\ntype ThreadMetadataEvent =\n | {\n operation: \"created\" | \"renamed\" | \"archived\" | \"unarchived\" | \"updated\";\n threadId: string;\n userId: string;\n tenantId: string;\n occurredAt: string;\n thread: ThreadRecord;\n }\n | {\n operation: \"deleted\";\n threadId: string;\n userId: string;\n tenantId: string;\n occurredAt: string;\n deleted: {\n id: string;\n };\n };\n\ninterface ThreadListResponse {\n threads: ThreadRecord[];\n}\n\ninterface ThreadMetadataCredentialsResponse {\n joinToken: string;\n}\n\ninterface MutationRequest {\n requestId: string;\n path: string;\n method: \"PATCH\" | \"POST\" | \"DELETE\";\n body: Record<string, unknown>;\n}\n\ntype MutationOutcome =\n | { requestId: string; ok: true }\n | { requestId: string; ok: false; error: Error };\n\ninterface ThreadEnvironment {\n fetch: typeof fetch;\n}\n\ninterface ThreadState {\n threads: ThreadRecord[];\n isLoading: boolean;\n error: Error | null;\n context: ThreadRuntimeContext | null;\n sessionId: number;\n metadataCredentialsRequested: boolean;\n}\n\nconst initialThreadState: ThreadState = {\n threads: [],\n isLoading: false,\n error: null,\n context: null,\n sessionId: 0,\n metadataCredentialsRequested: false,\n};\n\nconst threadAdapterEvents = createActionGroup(\"Thread Adapter\", {\n started: empty(),\n stopped: empty(),\n contextChanged: props<{ context: ThreadRuntimeContext | null }>(),\n renameRequested: props<{\n requestId: string;\n threadId: string;\n name: string;\n }>(),\n archiveRequested: props<{ requestId: string; threadId: string }>(),\n deleteRequested: props<{ requestId: string; threadId: string }>(),\n});\n\nconst threadRestEvents = createActionGroup(\"Thread REST\", {\n listRequested: props<{ sessionId: number }>(),\n listSucceeded: props<{\n sessionId: number;\n threads: ThreadRecord[];\n }>(),\n listFailed: props<{ sessionId: number; error: Error }>(),\n metadataCredentialsRequested: props<{ sessionId: number }>(),\n metadataCredentialsSucceeded: props<{\n sessionId: number;\n joinToken: string;\n }>(),\n metadataCredentialsFailed: props<{ sessionId: number; error: Error }>(),\n mutationFinished: props<{ outcome: MutationOutcome }>(),\n});\n\nconst threadSocketEvents = createActionGroup(\"Thread Socket\", {\n opened: props<{ sessionId: number }>(),\n errored: props<{ sessionId: number }>(),\n joinFailed: props<{ sessionId: number }>(),\n joinTimedOut: props<{ sessionId: number }>(),\n metadataReceived: props<{\n sessionId: number;\n payload: ThreadMetadataEvent;\n }>(),\n});\n\nconst threadDomainEvents = createActionGroup(\"Thread Domain\", {\n threadUpserted: props<{ sessionId: number; thread: ThreadRecord }>(),\n threadDeleted: props<{ sessionId: number; threadId: string }>(),\n});\n\nfunction sortThreadsByUpdatedAt(threads: ThreadRecord[]): ThreadRecord[] {\n return [...threads].sort((left, right) =>\n right.updatedAt.localeCompare(left.updatedAt),\n );\n}\n\nfunction upsertThread(\n threads: ThreadRecord[],\n thread: ThreadRecord,\n): ThreadRecord[] {\n const existingIndex = threads.findIndex((item) => item.id === thread.id);\n if (existingIndex === -1) {\n return sortThreadsByUpdatedAt([...threads, thread]);\n }\n\n const next = [...threads];\n next[existingIndex] = thread;\n return sortThreadsByUpdatedAt(next);\n}\n\nconst threadReducer = createReducer<ThreadState>(\n initialThreadState,\n on(threadAdapterEvents.contextChanged, (state, { context }) => ({\n ...state,\n context,\n sessionId: state.sessionId + 1,\n threads: [],\n isLoading: Boolean(context),\n error: null,\n metadataCredentialsRequested: false,\n })),\n on(threadAdapterEvents.stopped, (state) => ({\n ...state,\n threads: [],\n isLoading: false,\n error: null,\n metadataCredentialsRequested: false,\n })),\n on(threadRestEvents.listRequested, (state, { sessionId }) => {\n if (sessionId !== state.sessionId || !state.context) {\n return state;\n }\n\n return {\n ...state,\n isLoading: true,\n error: null,\n };\n }),\n on(threadRestEvents.listSucceeded, (state, { sessionId, threads }) => {\n if (sessionId !== state.sessionId) {\n return state;\n }\n\n return {\n ...state,\n threads: sortThreadsByUpdatedAt(threads),\n isLoading: false,\n error: null,\n };\n }),\n on(threadRestEvents.listFailed, (state, { sessionId, error }) => {\n if (sessionId !== state.sessionId) {\n return state;\n }\n\n return {\n ...state,\n isLoading: false,\n error,\n };\n }),\n on(\n threadRestEvents.metadataCredentialsFailed,\n (state, { sessionId, error }) => {\n if (sessionId !== state.sessionId) {\n return state;\n }\n\n return {\n ...state,\n error,\n };\n },\n ),\n on(threadRestEvents.metadataCredentialsRequested, (state, { sessionId }) => {\n if (sessionId !== state.sessionId) {\n return state;\n }\n\n return {\n ...state,\n metadataCredentialsRequested: true,\n };\n }),\n on(threadRestEvents.mutationFinished, (state, { outcome }) => ({\n ...state,\n error: outcome.ok ? state.error : outcome.error,\n })),\n on(threadDomainEvents.threadUpserted, (state, { sessionId, thread }) => {\n if (sessionId !== state.sessionId) {\n return state;\n }\n\n return {\n ...state,\n threads: upsertThread(state.threads, thread),\n };\n }),\n on(threadDomainEvents.threadDeleted, (state, { sessionId, threadId }) => {\n if (sessionId !== state.sessionId) {\n return state;\n }\n\n return {\n ...state,\n threads: state.threads.filter((thread) => thread.id !== threadId),\n };\n }),\n);\n\nconst selectThreads = createSelector((state: ThreadState) => state.threads);\nconst selectThreadsIsLoading = createSelector(\n (state: ThreadState) => state.isLoading,\n);\nconst selectThreadsError = createSelector((state: ThreadState) => state.error);\n\ninterface ThreadStore {\n start(): void;\n stop(): void;\n setContext(context: ThreadRuntimeContext | null): void;\n renameThread(threadId: string, name: string): Promise<void>;\n archiveThread(threadId: string): Promise<void>;\n deleteThread(threadId: string): Promise<void>;\n getState(): ThreadState;\n select: Store<ThreadState>[\"select\"];\n}\n\nlet threadRequestId = 0;\n\nfunction createThreadRequestId(): string {\n threadRequestId += 1;\n return `thread-request-${threadRequestId}`;\n}\n\nfunction createThreadFetchObservable(\n environment: ThreadEnvironment,\n context: ThreadRuntimeContext,\n sessionId: number,\n): Observable<\n | ReturnType<typeof threadRestEvents.listSucceeded>\n | ReturnType<typeof threadRestEvents.listFailed>\n> {\n return defer(() => {\n const params = new URLSearchParams({\n userId: context.userId,\n agentId: context.agentId,\n });\n return fromFetch(`${context.runtimeUrl}/threads?${params.toString()}`, {\n selector: (response) => {\n if (!response.ok) {\n throw new Error(`Failed to fetch threads: ${response.status}`);\n }\n\n return response.json() as Promise<ThreadListResponse>;\n },\n fetch: environment.fetch,\n method: \"GET\",\n headers: { ...context.headers },\n }).pipe(\n timeout({\n first: REQUEST_TIMEOUT_MS,\n with: () => {\n throw new Error(\"Request timed out\");\n },\n }),\n map((data) =>\n threadRestEvents.listSucceeded({\n sessionId,\n threads: data.threads,\n }),\n ),\n catchError((error) => {\n return of(\n threadRestEvents.listFailed({\n sessionId,\n error: error instanceof Error ? error : new Error(String(error)),\n }),\n );\n }),\n );\n });\n}\n\nfunction createThreadMetadataCredentialsObservable(\n environment: ThreadEnvironment,\n context: ThreadRuntimeContext,\n sessionId: number,\n): Observable<\n | ReturnType<typeof threadRestEvents.metadataCredentialsSucceeded>\n | ReturnType<typeof threadRestEvents.metadataCredentialsFailed>\n> {\n return defer(() => {\n return fromFetch(`${context.runtimeUrl}${THREAD_SUBSCRIBE_PATH}`, {\n selector: async (response) => {\n if (!response.ok) {\n throw new Error(\n `Failed to fetch thread metadata credentials: ${response.status}`,\n );\n }\n\n return response.json() as Promise<ThreadMetadataCredentialsResponse>;\n },\n fetch: environment.fetch,\n method: \"POST\",\n headers: {\n ...context.headers,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n userId: context.userId,\n }),\n }).pipe(\n timeout({\n first: REQUEST_TIMEOUT_MS,\n with: () => {\n throw new Error(\"Request timed out\");\n },\n }),\n map((data) => {\n if (typeof data.joinToken !== \"string\" || data.joinToken.length === 0) {\n throw new Error(\"missing joinToken\");\n }\n\n return threadRestEvents.metadataCredentialsSucceeded({\n sessionId,\n joinToken: data.joinToken,\n });\n }),\n catchError((error) => {\n return of(\n threadRestEvents.metadataCredentialsFailed({\n sessionId,\n error: error instanceof Error ? error : new Error(String(error)),\n }),\n );\n }),\n );\n });\n}\n\nfunction createThreadMutationObservable(\n environment: ThreadEnvironment,\n context: ThreadRuntimeContext,\n request: MutationRequest,\n): Observable<ReturnType<typeof threadRestEvents.mutationFinished>> {\n return defer(() => {\n return fromFetch(`${context.runtimeUrl}${request.path}`, {\n selector: async (response) => {\n if (!response.ok) {\n throw new Error(`Request failed: ${response.status}`);\n }\n\n return null;\n },\n fetch: environment.fetch,\n method: request.method,\n headers: {\n ...context.headers,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(request.body),\n }).pipe(\n map(() =>\n threadRestEvents.mutationFinished({\n outcome: {\n requestId: request.requestId,\n ok: true,\n },\n }),\n ),\n catchError((error) => {\n return of(\n threadRestEvents.mutationFinished({\n outcome: {\n requestId: request.requestId,\n ok: false,\n error: error instanceof Error ? error : new Error(String(error)),\n },\n }),\n );\n }),\n );\n });\n}\n\nfunction createThreadStore(environment: ThreadEnvironment): ThreadStore {\n const bootstrapEffect = createEffect(\n (\n actions$,\n state$,\n ): Observable<ReturnType<typeof threadRestEvents.listRequested>> =>\n actions$.pipe(\n ofType(threadAdapterEvents.contextChanged),\n withLatestFrom(state$),\n filter(([, state]) => Boolean(state.context)),\n map(([, state]) =>\n threadRestEvents.listRequested({ sessionId: state.sessionId }),\n ),\n ),\n );\n\n const fetchEffect = createEffect((actions$, state$) =>\n actions$.pipe(\n ofType(threadRestEvents.listRequested),\n switchMap((action) =>\n state$.pipe(\n map((state) => state.context),\n filter((context): context is ThreadRuntimeContext =>\n Boolean(context),\n ),\n take(1),\n map((context) => ({ action, context })),\n takeUntil(\n actions$.pipe(\n ofType(\n threadAdapterEvents.contextChanged,\n threadAdapterEvents.stopped,\n ),\n ),\n ),\n switchMap(({ action: currentAction, context }) =>\n createThreadFetchObservable(\n environment,\n context,\n currentAction.sessionId,\n ),\n ),\n ),\n ),\n ),\n );\n\n const metadataCredentialsEffect = createEffect((actions$, state$) =>\n actions$.pipe(\n ofType(threadRestEvents.listSucceeded),\n withLatestFrom(state$),\n filter(([action, state]) => {\n return (\n action.sessionId === state.sessionId &&\n !state.metadataCredentialsRequested &&\n Boolean(state.context?.wsUrl)\n );\n }),\n map(([action]) =>\n threadRestEvents.metadataCredentialsRequested({\n sessionId: action.sessionId,\n }),\n ),\n ),\n );\n\n const metadataCredentialsFetchEffect = createEffect((actions$, state$) =>\n actions$.pipe(\n ofType(threadRestEvents.metadataCredentialsRequested),\n switchMap((action) =>\n state$.pipe(\n map((state) => state.context),\n filter((context): context is ThreadRuntimeContext =>\n Boolean(context),\n ),\n take(1),\n map((context) => ({ action, context })),\n takeUntil(\n actions$.pipe(\n ofType(\n threadAdapterEvents.contextChanged,\n threadAdapterEvents.stopped,\n ),\n ),\n ),\n switchMap(({ action: currentAction, context }) =>\n createThreadMetadataCredentialsObservable(\n environment,\n context,\n currentAction.sessionId,\n ),\n ),\n ),\n ),\n ),\n );\n\n const socketEffect = createEffect((actions$, state$) =>\n actions$.pipe(\n ofType(threadRestEvents.metadataCredentialsSucceeded),\n withLatestFrom(state$),\n filter(([action, state]) => {\n return (\n action.sessionId === state.sessionId && Boolean(state.context?.wsUrl)\n );\n }),\n switchMap(([action, state]) => {\n const context = state.context as ThreadRuntimeContext;\n const joinToken = action.joinToken as string;\n const shutdown$ = actions$.pipe(\n ofType(\n threadAdapterEvents.contextChanged,\n threadAdapterEvents.stopped,\n ),\n );\n\n return defer(() => {\n const socket$ = ɵphoenixSocket$({\n url: context.wsUrl!,\n options: {\n params: { join_token: joinToken },\n reconnectAfterMs: phoenixExponentialBackoff(100, 10_000),\n rejoinAfterMs: phoenixExponentialBackoff(1_000, 30_000),\n },\n }).pipe(shareReplay({ bufferSize: 1, refCount: true }));\n const channel$ = ɵphoenixChannel$({\n socket$,\n topic: `user_meta:${context.userId}`,\n }).pipe(shareReplay({ bufferSize: 1, refCount: true }));\n const socketSignals$ =\n ɵobservePhoenixSocketSignals$(socket$).pipe(share());\n const fatalSocketShutdown$ = ɵobservePhoenixSocketHealth$(\n socketSignals$,\n MAX_SOCKET_RETRIES,\n ).pipe(\n catchError(() => {\n console.warn(\n `[threads] WebSocket failed after ${MAX_SOCKET_RETRIES} attempts, giving up`,\n );\n return of(undefined);\n }),\n share(),\n );\n const socketLifecycle$ = socketSignals$.pipe(\n map((signal) =>\n signal.type === \"open\"\n ? threadSocketEvents.opened({ sessionId: action.sessionId })\n : threadSocketEvents.errored({ sessionId: action.sessionId }),\n ),\n );\n const metadata$ = channel$.pipe(\n switchMap(({ channel }: ɵPhoenixChannelSession) =>\n ɵobservePhoenixEvent$<ThreadMetadataEvent>(\n channel,\n THREADS_CHANNEL_EVENT,\n ),\n ),\n map((payload) =>\n threadSocketEvents.metadataReceived({\n sessionId: action.sessionId,\n payload,\n }),\n ),\n );\n const joinOutcome$ = ɵobservePhoenixJoinOutcome$(channel$).pipe(\n filter((outcome) => outcome.type !== \"joined\"),\n map((outcome) =>\n outcome.type === \"timeout\"\n ? threadSocketEvents.joinTimedOut({\n sessionId: action.sessionId,\n })\n : threadSocketEvents.joinFailed({\n sessionId: action.sessionId,\n }),\n ),\n );\n\n return merge(socketLifecycle$, metadata$, joinOutcome$).pipe(\n takeUntil(merge(shutdown$, fatalSocketShutdown$)),\n );\n });\n }),\n ),\n );\n\n const realtimeMappingEffect = createEffect((actions$, state$) =>\n actions$.pipe(\n ofType(threadSocketEvents.metadataReceived),\n withLatestFrom(state$),\n filter(([action, state]) => {\n return (\n action.sessionId === state.sessionId &&\n action.payload.userId === state.context?.userId\n );\n }),\n map(([action]) => {\n if (action.payload.operation === \"deleted\") {\n return threadDomainEvents.threadDeleted({\n sessionId: action.sessionId,\n threadId: action.payload.deleted.id,\n });\n }\n\n return threadDomainEvents.threadUpserted({\n sessionId: action.sessionId,\n thread: action.payload.thread,\n });\n }),\n ),\n );\n\n const mutationEffect = createEffect((actions$, state$) =>\n actions$.pipe(\n ofType(\n threadAdapterEvents.renameRequested,\n threadAdapterEvents.archiveRequested,\n threadAdapterEvents.deleteRequested,\n ),\n withLatestFrom(state$),\n mergeMap(([action, state]) => {\n const context = state.context;\n if (!context?.runtimeUrl) {\n const requestId = action.requestId;\n return of(\n threadRestEvents.mutationFinished({\n outcome: {\n requestId,\n ok: false,\n error: new Error(\"Runtime URL is not configured\"),\n },\n }),\n );\n }\n\n const commonBody = {\n userId: context.userId,\n agentId: context.agentId,\n };\n\n if (threadAdapterEvents.renameRequested.match(action)) {\n return createThreadMutationObservable(environment, context, {\n requestId: action.requestId,\n method: \"PATCH\",\n path: `/threads/${encodeURIComponent(action.threadId)}`,\n body: {\n ...commonBody,\n name: action.name,\n },\n });\n }\n\n if (threadAdapterEvents.archiveRequested.match(action)) {\n return createThreadMutationObservable(environment, context, {\n requestId: action.requestId,\n method: \"POST\",\n path: `/threads/${encodeURIComponent(action.threadId)}/archive`,\n body: commonBody,\n });\n }\n\n return createThreadMutationObservable(environment, context, {\n requestId: action.requestId,\n method: \"DELETE\",\n path: `/threads/${encodeURIComponent(action.threadId)}`,\n body: commonBody,\n });\n }),\n ),\n );\n\n const store = createStore({\n reducer: threadReducer,\n effects: [\n bootstrapEffect,\n fetchEffect,\n metadataCredentialsEffect,\n metadataCredentialsFetchEffect,\n socketEffect,\n realtimeMappingEffect,\n mutationEffect,\n ],\n });\n\n function trackMutation(\n dispatchAction:\n | ReturnType<typeof threadAdapterEvents.renameRequested>\n | ReturnType<typeof threadAdapterEvents.archiveRequested>\n | ReturnType<typeof threadAdapterEvents.deleteRequested>,\n ): Promise<void> {\n const completion$ = merge(\n store.actions$.pipe(\n ofType(threadRestEvents.mutationFinished),\n filter(\n (action) => action.outcome.requestId === dispatchAction.requestId,\n ),\n map((action) => action.outcome),\n ),\n store.actions$.pipe(\n ofType(threadAdapterEvents.stopped),\n map(\n () =>\n ({\n requestId: dispatchAction.requestId,\n ok: false,\n error: new Error(\n \"Thread store stopped before mutation completed\",\n ),\n }) satisfies MutationOutcome,\n ),\n ),\n ).pipe(take(1));\n\n const resultPromise = firstValueFrom(completion$).then((outcome) => {\n if (outcome.ok) {\n return;\n }\n\n throw outcome.error;\n });\n\n store.dispatch(dispatchAction);\n return resultPromise;\n }\n\n return {\n start(): void {\n store.init();\n store.dispatch(threadAdapterEvents.started());\n },\n stop(): void {\n store.dispatch(threadAdapterEvents.stopped());\n store.stop();\n },\n setContext(context: ThreadRuntimeContext | null): void {\n store.dispatch(threadAdapterEvents.contextChanged({ context }));\n },\n renameThread(threadId: string, name: string): Promise<void> {\n return trackMutation(\n threadAdapterEvents.renameRequested({\n requestId: createThreadRequestId(),\n threadId,\n name,\n }),\n );\n },\n archiveThread(threadId: string): Promise<void> {\n return trackMutation(\n threadAdapterEvents.archiveRequested({\n requestId: createThreadRequestId(),\n threadId,\n }),\n );\n },\n deleteThread(threadId: string): Promise<void> {\n return trackMutation(\n threadAdapterEvents.deleteRequested({\n requestId: createThreadRequestId(),\n threadId,\n }),\n );\n },\n getState(): ThreadState {\n return store.getState();\n },\n select: store.select.bind(store),\n };\n}\n\nexport type ɵThread = ThreadRecord;\nexport type ɵThreadRuntimeContext = ThreadRuntimeContext;\nexport type ɵThreadMetadataEvent = ThreadMetadataEvent;\nexport type ɵThreadEnvironment = ThreadEnvironment;\nexport type ɵThreadStore = ThreadStore;\nexport const ɵthreadAdapterEvents = threadAdapterEvents;\nexport const ɵselectThreads = selectThreads;\nexport const ɵselectThreadsIsLoading = selectThreadsIsLoading;\nexport const ɵselectThreadsError = selectThreadsError;\nexport { createThreadStore as ɵcreateThreadStore };\n"],"mappings":"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"}
|