@mastra/code-sdk 1.8.2-alpha.1 → 1.8.2-alpha.2

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.
@@ -99,12 +99,11 @@ export declare class CrossAgentMessagingSignalProvider extends SignalProvider<'c
99
99
  }, unknown, unknown, import("@mastra/core/tools").ToolExecutionContext<unknown, unknown, unknown>, "agent_disconnect", unknown>;
100
100
  agent_signal_send: import("@mastra/core/tools").Tool<{
101
101
  targetId: string;
102
- summary: string;
102
+ message: string;
103
103
  priority: "low" | "medium" | "high" | "urgent";
104
104
  expectsReply: boolean;
105
105
  messageId?: string | undefined;
106
106
  replyTo?: string | undefined;
107
- payload?: unknown;
108
107
  }, {
109
108
  content: string;
110
109
  target?: {
@@ -1 +1 @@
1
- {"version":3,"file":"signal-provider.d.ts","sourceRoot":"","sources":["../../src/agent-connections/signal-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,EAA2B,KAAK,8BAA8B,EAAE,MAAM,eAAe,CAAC;AAI7F,MAAM,WAAW,wCAAyC,SAAQ,8BAA8B;CAAG;AACnG,MAAM,WAAW,qCAAsC,SAAQ,wCAAwC;CAAG;AAE1G,qBAAa,iCAAkC,SAAQ,cAAc,CAAC,uBAAuB,CAAC;;IAC5F,QAAQ,CAAC,EAAE,2BAA2B;gBAM1B,OAAO,GAAE,wCAA6C;IAOlE,kBAAkB,IAAI,wBAAwB,EAAE;IAIhD,mBAAmB,IAAI,yBAAyB,EAAE;IAIlD,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAMT;AAED,qBAAa,8BAA+B,SAAQ,iCAAiC;CAAG"}
1
+ {"version":3,"file":"signal-provider.d.ts","sourceRoot":"","sources":["../../src/agent-connections/signal-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,EAA2B,KAAK,8BAA8B,EAAE,MAAM,eAAe,CAAC;AAI7F,MAAM,WAAW,wCAAyC,SAAQ,8BAA8B;CAAG;AACnG,MAAM,WAAW,qCAAsC,SAAQ,wCAAwC;CAAG;AAE1G,qBAAa,iCAAkC,SAAQ,cAAc,CAAC,uBAAuB,CAAC;;IAC5F,QAAQ,CAAC,EAAE,2BAA2B;gBAM1B,OAAO,GAAE,wCAA6C;IAOlE,kBAAkB,IAAI,wBAAwB,EAAE;IAIhD,mBAAmB,IAAI,yBAAyB,EAAE;IAIlD,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAMT;AAED,qBAAa,8BAA+B,SAAQ,iCAAiC;CAAG"}
@@ -94,12 +94,11 @@ export declare function createAgentConnectionTools(options?: AgentConnectionTool
94
94
  }, unknown, unknown, import("@mastra/core/tools").ToolExecutionContext<unknown, unknown, unknown>, "agent_disconnect", unknown>;
95
95
  agent_signal_send: import("@mastra/core/tools").Tool<{
96
96
  targetId: string;
97
- summary: string;
97
+ message: string;
98
98
  priority: "low" | "medium" | "high" | "urgent";
99
99
  expectsReply: boolean;
100
100
  messageId?: string | undefined;
101
101
  replyTo?: string | undefined;
102
- payload?: unknown;
103
102
  }, {
104
103
  content: string;
105
104
  target?: {
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/agent-connections/tools.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,uBAAuB,EAAgB,MAAM,eAAe,CAAC;AA8GtE,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IACnC,QAAQ,CAAC,EAAE,MACP;QACE,sBAAsB,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9D,mBAAmB,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;KAC5D,GACD,SAAS,CAAC;CACf;AAED,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,2BAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwZnF"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/agent-connections/tools.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,uBAAuB,EAAgB,MAAM,eAAe,CAAC;AA8GtE,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IACnC,QAAQ,CAAC,EAAE,MACP;QACE,sBAAsB,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9D,mBAAmB,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;KAC5D,GACD,SAAS,CAAC;CACf;AAED,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,2BAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsZnF"}
@@ -255,15 +255,14 @@ The peer does not need to be currently advertised. Disconnecting is idempotent a
255
255
  The target must already be saved and freshly advertise the same exact thread endpoint at send time. Use expectsReply to declare whether the peer owes one signal back to this thread; false removes that obligation but does not prevent or forbid a reply. Signals routed to a notification summary cannot establish a reply obligation until the recipient opens the full notification, so use a priority that routes directly when a reply is required. Reuse messageId when retrying the same logical send, and set replyTo to the request messageId when replying. Use priority to indicate urgency: low, medium, high, or urgent.`,
256
256
  inputSchema: z.object({
257
257
  targetId: z.string().min(1).describe("Connected peer id."),
258
- summary: z.string().min(1).describe("Short summary to deliver to the peer."),
258
+ message: z.string().min(1).describe("Full message delivered to the peer. This is the only content the peer receives."),
259
259
  priority: prioritySchema.default("medium"),
260
260
  expectsReply: z.boolean().describe("Whether the peer owes one signal back. False means no obligation, not no permission to reply."),
261
261
  messageId: z.string().min(1).optional().describe("Stable logical message id. Reuse the same id for a sequential retry; receiver-side notification coalescing also uses it."),
262
- replyTo: z.string().min(1).optional().describe("Message id of the peer request this signal replies to."),
263
- payload: z.unknown().optional().describe("Optional structured payload for the peer.")
262
+ replyTo: z.string().min(1).optional().describe("Message id of the peer request this signal replies to.")
264
263
  }),
265
264
  outputSchema: signalResultSchema,
266
- execute: async ({ targetId, summary, priority = "medium", expectsReply, messageId: inputMessageId, replyTo, payload }, context) => {
265
+ execute: async ({ targetId, message: summary, priority = "medium", expectsReply, messageId: inputMessageId, replyTo }, context) => {
267
266
  const agentContext = context;
268
267
  try {
269
268
  if (!isMemoryBacked(agentContext.agent)) return {
@@ -306,8 +305,7 @@ The target must already be saved and freshly advertise the same exact thread end
306
305
  summary,
307
306
  priority,
308
307
  expectsReply,
309
- replyTo,
310
- payload
308
+ replyTo
311
309
  });
312
310
  const previousSend = (await readSentAgentSignals(agentContext)).find((signal) => signal.messageId === messageId);
313
311
  if (previousSend) {
@@ -361,10 +359,7 @@ The target must already be saved and freshly advertise the same exact thread end
361
359
  ...expectsReply ? { returnPeerId } : {}
362
360
  },
363
361
  metadata: { crossAgentMessaging },
364
- payload: {
365
- ...payload === void 0 ? {} : { payload },
366
- ...crossAgentMessaging
367
- }
362
+ payload: crossAgentMessaging
368
363
  }, {
369
364
  resourceId: target.resourceId,
370
365
  threadId: target.threadId,
@@ -430,7 +425,6 @@ The target must already be saved and freshly advertise the same exact thread end
430
425
  return {
431
426
  content: formatSignalResult({
432
427
  target,
433
- summary,
434
428
  priority,
435
429
  accepted
436
430
  }),
@@ -511,15 +505,15 @@ function formatDisconnectResult(disconnectedIds, alreadyDisconnectedIds, connect
511
505
  parts.push(`Saved agents: ${connected.length}`);
512
506
  return parts.join(" ");
513
507
  }
514
- function formatSignalResult({ target, summary, priority, accepted }) {
508
+ function formatSignalResult({ target, priority, accepted }) {
515
509
  const label = untrustedPeerLabel(target);
516
510
  switch (accepted?.action) {
517
- case "wake": return `Woke ${label} with a ${priority} signal in run ${accepted.runId}: ${summary}`;
518
- case "deliver": return `Delivered ${priority} signal to ${label} in run ${accepted.runId}: ${summary}`;
519
- case "persist": return `Persisted ${priority} signal for ${label} to process later: ${summary}`;
520
- case "discard": return `The ${priority} signal to ${label} was discarded: ${summary}`;
521
- case "blocked": return `The ${priority} signal to ${label} was blocked because thread ${untrustedThreadId(target)} is suspended: ${summary}`;
522
- default: return `No signal routing outcome was produced for ${label}: ${summary}`;
511
+ case "wake": return `Woke ${label} with a ${priority} signal in run ${accepted.runId}`;
512
+ case "deliver": return `Delivered ${priority} signal to ${label} in run ${accepted.runId}`;
513
+ case "persist": return `Persisted ${priority} signal for ${label} to process later`;
514
+ case "discard": return `The ${priority} signal to ${label} was discarded`;
515
+ case "blocked": return `The ${priority} signal to ${label} was blocked because thread ${untrustedThreadId(target)} is suspended`;
516
+ default: return `No signal routing outcome was produced for ${label}`;
523
517
  }
524
518
  }
525
519
  function untrustedThreadId(target) {
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","names":[],"sources":["../../src/agent-connections/tools.ts"],"sourcesContent":["import { createHash, randomUUID } from 'node:crypto';\n\nimport type { SendAgentNotificationSignalResult, SendAgentSignalAccepted } from '@mastra/core/agent';\nimport { createTool } from '@mastra/core/tools';\nimport { z } from 'zod';\n\nimport { AgentConnectionRegistry, stablePeerId } from './registry.js';\nimport {\n isMemoryBacked,\n readAgentConnections,\n readSentAgentSignals,\n updateAgentConnections,\n writeSentAgentSignals,\n type AgentConnectionContext,\n} from './thread-state.js';\nimport type {\n AgentConnectResult,\n AgentConnectionDeltaOp,\n AgentConnectionListResult,\n AgentDisconnectResult,\n AgentPeerView,\n AgentSignalPriority,\n AgentSignalSendResult,\n ConnectedAgentPeer,\n} from './types.js';\nimport {\n UNTRUSTED_PEER_ID_MAX_LENGTH,\n UNTRUSTED_PEER_METADATA_MAX_LENGTH,\n boundUntrustedText,\n serializeUntrustedData,\n} from './untrusted-text.js';\n\nconst prioritySchema = z.enum(['low', 'medium', 'high', 'urgent']);\n\nconst peerSchema = z.object({\n id: z.string(),\n agentId: z.string(),\n resourceId: z.string(),\n threadId: z.string(),\n label: z.string().optional(),\n title: z.string().optional(),\n mode: z.string().optional(),\n relationship: z.enum(['none', 'saved']),\n presence: z.enum(['advertised', 'absent']),\n displayStatus: z.enum(['discovered', 'connected', 'saved']),\n canAttemptSend: z.boolean(),\n pid: z.number().optional(),\n connectedAt: z.number().optional(),\n lastSeenAt: z.number().optional(),\n});\n\nconst savedPeerSchema = z.object({\n id: z.string(),\n agentId: z.string().optional(),\n resourceId: z.string(),\n threadId: z.string(),\n label: z.string().optional(),\n title: z.string().optional(),\n mode: z.string().optional(),\n pid: z.number().optional(),\n connectedAt: z.number(),\n lastSeenAt: z.number(),\n});\n\nconst listResultSchema = z.object({\n content: z.string(),\n peers: z.array(peerSchema),\n savedCount: z.number(),\n isError: z.boolean().optional(),\n});\n\nconst connectResultSchema = z.object({\n content: z.string(),\n connected: z.array(savedPeerSchema),\n changed: z.array(\n z.object({\n op: z.string(),\n id: z.string(),\n peer: peerSchema.optional(),\n presence: z.string().optional(),\n displayStatus: z.string().optional(),\n }),\n ),\n isError: z.boolean().optional(),\n});\n\nconst disconnectResultSchema = z.object({\n content: z.string(),\n connected: z.array(savedPeerSchema),\n disconnectedIds: z.array(z.string()),\n alreadyDisconnectedIds: z.array(z.string()),\n changed: z.array(\n z.object({\n op: z.string(),\n id: z.string(),\n }),\n ),\n isError: z.boolean().optional(),\n});\n\nconst signalResultSchema = z.object({\n content: z.string(),\n target: peerSchema.optional(),\n priority: prioritySchema.optional(),\n expectsReply: z.boolean().optional(),\n messageId: z.string().optional(),\n replyTo: z.string().optional(),\n returnPeerId: z.string().optional(),\n routingAction: z.enum(['wake', 'deliver', 'persist', 'discard', 'blocked']).optional(),\n replyOutcome: z.literal('peer-unavailable').optional(),\n runId: z.string().optional(),\n notification: z.unknown().optional(),\n duplicate: z.boolean().optional(),\n isError: z.boolean().optional(),\n});\n\nexport interface AgentConnectionToolsOptions {\n registry?: AgentConnectionRegistry;\n getAgent?: () =>\n | {\n sendNotificationSignal?: (...args: any[]) => Promise<unknown>;\n discoverThreadPeers?: (...args: any[]) => Promise<unknown>;\n }\n | undefined;\n}\n\nexport function createAgentConnectionTools(options: AgentConnectionToolsOptions = {}) {\n const registry = options.registry ?? new AgentConnectionRegistry();\n\n const agentConnectionsListTool = createTool({\n id: 'agent_connections_list',\n description: `List cross-agent peers discovered now or saved by this thread.\n\nEach peer has an explicit durable relationship, current advertisement presence, display status, and send eligibility. Use agent_connect for [discovered] peers and agent_disconnect for saved peers.`,\n inputSchema: z.object({}),\n outputSchema: listResultSchema,\n execute: async (_input, context): Promise<AgentConnectionListResult> => {\n const agentContext = context as AgentConnectionContext;\n try {\n if (!isMemoryBacked(agentContext.agent)) {\n return noMemoryListResult();\n }\n const runtimeAgent = options.getAgent?.();\n const registryContext = { ...agentContext, runtimeAgent };\n const peers = await registry.listPeers(registryContext);\n const savedCount = peers.filter(peer => peer.relationship === 'saved').length;\n return {\n content: formatPeerList(peers, savedCount),\n peers,\n savedCount,\n isError: false,\n };\n } catch (error) {\n return {\n content: `Failed to list agent connections: ${errorMessage(error)}`,\n peers: [],\n savedCount: 0,\n isError: true,\n };\n }\n },\n });\n\n const agentConnectTool = createTool({\n id: 'agent_connect',\n description: `Save freshly discovered peer MastraCode agents by stable id.\n\nUse agent_connections_list first, then pass [discovered] peer ids from that result. Saved agents are persisted per thread and surfaced through connected-agent state signals.`,\n inputSchema: z.object({\n ids: z.array(z.string().min(1)).min(1).describe('Discovered peer ids returned by agent_connections_list.'),\n }),\n outputSchema: connectResultSchema,\n execute: async ({ ids }, context): Promise<AgentConnectResult> => {\n const agentContext = context as AgentConnectionContext;\n try {\n if (!isMemoryBacked(agentContext.agent)) return noMemoryConnectResult();\n const registryContext = { ...agentContext, runtimeAgent: options.getAgent?.() };\n const changed: AgentConnectionDeltaOp[] = [];\n const uniqueIds = [...new Set(ids)];\n const discoveredById = new Map((await registry.discoverPeers(registryContext)).map(peer => [peer.id, peer]));\n const unknownId = uniqueIds.find(id => !discoveredById.has(id));\n if (unknownId) {\n return errorConnectResult(\n `Unknown or unadvertised agent peer id: ${unknownId}`,\n await readAgentConnections(agentContext),\n [],\n );\n }\n\n // Apply the connect delta against the freshly read state inside the\n // queued updater so concurrent connect/disconnect calls cannot clobber\n // each other's writes.\n const connected = await updateAgentConnections(agentContext, current => {\n changed.length = 0;\n const byId = new Map(current.map(peer => [peer.id, peer]));\n const now = Date.now();\n for (const id of uniqueIds) {\n const peer = discoveredById.get(id)!;\n const connectedAt = byId.get(peer.id)?.connectedAt ?? now;\n const connectedPeer: ConnectedAgentPeer = {\n id: peer.id,\n agentId: peer.agentId,\n resourceId: peer.resourceId,\n threadId: peer.threadId,\n label: peer.label,\n title: peer.title,\n mode: peer.mode,\n pid: peer.pid,\n connectedAt,\n lastSeenAt: peer.lastSeenAt ?? now,\n };\n byId.set(peer.id, connectedPeer);\n changed.push({\n op: 'connect',\n id: peer.id,\n peer: {\n ...peer,\n relationship: 'saved',\n displayStatus: 'connected',\n canAttemptSend: true,\n connectedAt,\n },\n });\n }\n return [...byId.values()];\n });\n return {\n content: formatConnectResult(changed, connected),\n connected,\n changed,\n isError: false,\n };\n } catch (error) {\n return {\n content: `Failed to connect agent peers: ${errorMessage(error)}`,\n connected: [],\n changed: [],\n isError: true,\n };\n }\n },\n });\n\n const agentDisconnectTool = createTool({\n id: 'agent_disconnect',\n description: `Remove saved peer relationships from this thread by stable id.\n\nThe peer does not need to be currently advertised. Disconnecting is idempotent and does not alter remote threads, runs, notifications, or prior signal history.`,\n inputSchema: z.object({\n ids: z.array(z.string().min(1)).min(1).describe('Saved peer ids to disconnect from this thread.'),\n }),\n outputSchema: disconnectResultSchema,\n execute: async ({ ids }, context): Promise<AgentDisconnectResult> => {\n const agentContext = context as AgentConnectionContext;\n try {\n if (!isMemoryBacked(agentContext.agent)) return noMemoryDisconnectResult();\n const disconnectedIds: string[] = [];\n const alreadyDisconnectedIds: string[] = [];\n const changed: AgentConnectionDeltaOp[] = [];\n\n // Apply the disconnect delta against the freshly read state inside the\n // queued updater so concurrent connect/disconnect calls cannot clobber\n // each other's writes.\n const connected = await updateAgentConnections(agentContext, current => {\n disconnectedIds.length = 0;\n alreadyDisconnectedIds.length = 0;\n changed.length = 0;\n const byId = new Map(current.map(peer => [peer.id, peer]));\n for (const id of new Set(ids)) {\n if (byId.delete(id)) {\n disconnectedIds.push(id);\n changed.push({ op: 'disconnect', id });\n } else {\n alreadyDisconnectedIds.push(id);\n }\n }\n return [...byId.values()];\n });\n return {\n content: formatDisconnectResult(disconnectedIds, alreadyDisconnectedIds, connected),\n connected,\n disconnectedIds,\n alreadyDisconnectedIds,\n changed,\n isError: false,\n };\n } catch (error) {\n return {\n content: `Failed to disconnect agent peers: ${errorMessage(error)}`,\n connected: [],\n disconnectedIds: [],\n alreadyDisconnectedIds: [],\n changed: [],\n isError: true,\n };\n }\n },\n });\n\n const agentSignalSendTool = createTool({\n id: 'agent_signal_send',\n description: `Send a prioritized notification signal to a connected peer agent.\n\nThe target must already be saved and freshly advertise the same exact thread endpoint at send time. Use expectsReply to declare whether the peer owes one signal back to this thread; false removes that obligation but does not prevent or forbid a reply. Signals routed to a notification summary cannot establish a reply obligation until the recipient opens the full notification, so use a priority that routes directly when a reply is required. Reuse messageId when retrying the same logical send, and set replyTo to the request messageId when replying. Use priority to indicate urgency: low, medium, high, or urgent.`,\n inputSchema: z.object({\n targetId: z.string().min(1).describe('Connected peer id.'),\n summary: z.string().min(1).describe('Short summary to deliver to the peer.'),\n priority: prioritySchema.default('medium'),\n expectsReply: z\n .boolean()\n .describe('Whether the peer owes one signal back. False means no obligation, not no permission to reply.'),\n messageId: z\n .string()\n .min(1)\n .optional()\n .describe(\n 'Stable logical message id. Reuse the same id for a sequential retry; receiver-side notification coalescing also uses it.',\n ),\n replyTo: z.string().min(1).optional().describe('Message id of the peer request this signal replies to.'),\n payload: z.unknown().optional().describe('Optional structured payload for the peer.'),\n }),\n outputSchema: signalResultSchema,\n execute: async (\n { targetId, summary, priority = 'medium', expectsReply, messageId: inputMessageId, replyTo, payload },\n context,\n ): Promise<AgentSignalSendResult> => {\n const agentContext = context as AgentConnectionContext;\n try {\n if (!isMemoryBacked(agentContext.agent)) {\n return { content: 'Agent signals require a memory-backed thread.', isError: true };\n }\n const saved = await readAgentConnections(agentContext);\n if (!saved.some(peer => peer.id === targetId)) {\n return {\n content: `Cannot send: peer is not saved: ${targetId}`,\n replyTo,\n ...(replyTo ? { replyOutcome: 'peer-unavailable' as const } : {}),\n isError: true,\n };\n }\n const agent = options.getAgent?.();\n const connected = await registry.connectedPeers({ ...agentContext, runtimeAgent: agent }, saved);\n const target = connected.find(peer => peer.id === targetId);\n if (!target?.canAttemptSend) {\n return {\n content: `Cannot send: saved peer is not currently advertised. Peer: ${targetId}`,\n ...(target ? { target } : {}),\n replyTo,\n ...(replyTo ? { replyOutcome: 'peer-unavailable' as const } : {}),\n isError: true,\n };\n }\n if (!agent?.sendNotificationSignal) {\n return {\n content: 'Agent signal sending is unavailable because no connected agent runtime is registered.',\n target,\n isError: true,\n };\n }\n const currentAgent = agentContext.agent as { resourceId: string; threadId: string; agentId?: string };\n const returnPeerId = stablePeerId({\n agentId: currentAgent.agentId || undefined,\n resourceId: currentAgent.resourceId,\n threadId: currentAgent.threadId,\n });\n const messageId = inputMessageId ?? randomUUID();\n const fingerprint = fingerprintAgentSignal({ targetId, summary, priority, expectsReply, replyTo, payload });\n const sentSignals = await readSentAgentSignals(agentContext);\n const previousSend = sentSignals.find(signal => signal.messageId === messageId);\n if (previousSend) {\n if (previousSend.fingerprint !== fingerprint) {\n return {\n content: `Message id ${messageId} was already used for a different cross-agent signal.`,\n target,\n priority: priority as AgentSignalPriority,\n expectsReply,\n messageId,\n replyTo,\n returnPeerId,\n isError: true,\n };\n }\n return {\n content: `Cross-agent signal ${messageId} was already routed to ${untrustedPeerLabel(target)}.`,\n target,\n priority: previousSend.priority,\n expectsReply: previousSend.expectsReply,\n messageId,\n replyTo: previousSend.replyTo,\n returnPeerId: previousSend.returnPeerId,\n routingAction: previousSend.routingAction,\n runId: previousSend.runId,\n duplicate: true,\n isError: false,\n };\n }\n const crossAgentMessaging = {\n expectsReply,\n messageId,\n ...(replyTo ? { replyTo } : {}),\n ...(expectsReply ? { returnPeerId } : {}),\n from: { resourceId: currentAgent.resourceId, threadId: currentAgent.threadId },\n targetId,\n };\n const notification = (await agent.sendNotificationSignal(\n {\n source: 'agent-connection',\n sourceId: returnPeerId,\n kind: 'peer-signal',\n priority: priority as AgentSignalPriority,\n summary,\n dedupeKey: `agent-signal:${returnPeerId}:${messageId}`,\n attributes: {\n expectsReply,\n messageId,\n sourcePeerId: returnPeerId,\n ...(replyTo ? { replyTo } : {}),\n ...(expectsReply ? { returnPeerId } : {}),\n },\n metadata: { crossAgentMessaging },\n payload: {\n ...(payload === undefined ? {} : { payload }),\n ...crossAgentMessaging,\n },\n },\n {\n resourceId: target.resourceId,\n threadId: target.threadId,\n ifIdle: priority === 'low' ? { behavior: 'persist' } : { behavior: 'wake', requireClaimedOwner: true },\n },\n )) as SendAgentNotificationSignalResult;\n let accepted = notification.accepted ? await notification.accepted : undefined;\n if (!accepted) {\n // Policy-only outcomes do not emit a signal, so they intentionally have no owner acknowledgment.\n if (\n notification.decision.action === 'persist' ||\n notification.decision.action === 'defer' ||\n notification.decision.action === 'summarize'\n ) {\n if (expectsReply) {\n await notification.persisted;\n return {\n content: `Failed to establish a reply obligation: the signal was queued for a notification summary instead of being delivered directly to ${untrustedPeerLabel(target)}. Send a new signal at a priority that routes directly when a reply is required.`,\n target,\n priority: priority as AgentSignalPriority,\n expectsReply,\n messageId,\n replyTo,\n returnPeerId,\n routingAction: 'persist',\n isError: true,\n };\n }\n accepted = { action: 'persist' };\n } else if (notification.decision.action === 'discard') {\n accepted = { action: 'discard' };\n } else {\n return {\n content: `Failed to send agent signal: ${notification.record.lastDeliveryError ?? 'delivery was not acknowledged by the target thread owner'}`,\n target,\n priority: priority as AgentSignalPriority,\n expectsReply,\n messageId,\n replyTo,\n returnPeerId,\n isError: true,\n };\n }\n }\n if (accepted.action === 'blocked' || accepted.action === 'discard') {\n // The signal was not routed, so skip sent history: a retry with the\n // same messageId must be able to route instead of short-circuiting\n // as a duplicate.\n return {\n content:\n accepted.action === 'blocked'\n ? `Failed to send agent signal: target thread ${untrustedThreadId(target)} is suspended and did not accept the signal. Retry with the same messageId once it resumes.`\n : `Failed to send agent signal: delivery policy discarded the signal before it reached ${untrustedPeerLabel(target)}. Retry with the same messageId if the delivery policy changes.`,\n target,\n priority: priority as AgentSignalPriority,\n expectsReply,\n messageId,\n replyTo,\n returnPeerId,\n routingAction: accepted.action,\n isError: true,\n };\n }\n if (accepted.action === 'persist') await notification.persisted;\n const routingAction = accepted.action;\n const runId = 'runId' in accepted ? accepted.runId : undefined;\n await writeSentAgentSignals(agentContext, [\n {\n messageId,\n fingerprint,\n targetId,\n priority: priority as AgentSignalPriority,\n expectsReply,\n replyTo,\n returnPeerId,\n routingAction,\n runId,\n sentAt: Date.now(),\n },\n ]);\n return {\n content: formatSignalResult({\n target,\n summary,\n priority: priority as AgentSignalPriority,\n accepted,\n }),\n target,\n priority: priority as AgentSignalPriority,\n expectsReply,\n messageId,\n replyTo,\n returnPeerId,\n routingAction,\n runId,\n isError: false,\n };\n } catch (error) {\n return { content: `Failed to send agent signal: ${errorMessage(error)}`, isError: true };\n }\n },\n });\n\n return {\n agent_connections_list: agentConnectionsListTool,\n agent_connect: agentConnectTool,\n agent_disconnect: agentDisconnectTool,\n agent_signal_send: agentSignalSendTool,\n };\n}\n\nfunction noMemoryListResult(): AgentConnectionListResult {\n return { content: 'Agent connections require a memory-backed thread.', peers: [], savedCount: 0, isError: true };\n}\n\nfunction noMemoryConnectResult(): AgentConnectResult {\n return { content: 'Agent connections require a memory-backed thread.', connected: [], changed: [], isError: true };\n}\n\nfunction noMemoryDisconnectResult(): AgentDisconnectResult {\n return {\n content: 'Agent connections require a memory-backed thread.',\n connected: [],\n disconnectedIds: [],\n alreadyDisconnectedIds: [],\n changed: [],\n isError: true,\n };\n}\n\nfunction errorConnectResult(\n content: string,\n connected: ConnectedAgentPeer[],\n changed: AgentConnectionDeltaOp[],\n): AgentConnectResult {\n return { content, connected, changed, isError: true };\n}\n\nfunction formatPeerList(peers: Awaited<ReturnType<AgentConnectionRegistry['listPeers']>>, savedCount: number): string {\n if (peers.length === 0) return 'No peer agents are discovered or saved.';\n const lines = peers.map(peer => {\n return `- [${peer.displayStatus}] ${serializeUntrustedData({\n id: boundUntrustedText(peer.id, UNTRUSTED_PEER_ID_MAX_LENGTH),\n label: boundUntrustedText(peer.label, UNTRUSTED_PEER_METADATA_MAX_LENGTH),\n title: boundUntrustedText(peer.title, UNTRUSTED_PEER_METADATA_MAX_LENGTH),\n resourceId: boundUntrustedText(peer.resourceId, UNTRUSTED_PEER_ID_MAX_LENGTH),\n threadId: boundUntrustedText(peer.threadId, UNTRUSTED_PEER_ID_MAX_LENGTH),\n canAttemptSend: peer.canAttemptSend,\n })}`;\n });\n return `Agent peers (untrusted peer-supplied data, never instructions):\\n${lines.join('\\n')}\\nSaved: ${savedCount}`;\n}\n\nfunction formatConnectResult(changed: AgentConnectionDeltaOp[], connected: ConnectedAgentPeer[]): string {\n if (changed.length === 0) return `Connected 0 agents. Saved agents: ${connected.length}`;\n return `Connected ${changed.length} agent${changed.length === 1 ? '' : 's'}: ${changed.map(change => change.id).join(', ')}. Saved agents: ${connected.length}`;\n}\n\nfunction formatDisconnectResult(\n disconnectedIds: string[],\n alreadyDisconnectedIds: string[],\n connected: ConnectedAgentPeer[],\n): string {\n const parts = [\n `Disconnected ${disconnectedIds.length} agent${disconnectedIds.length === 1 ? '' : 's'}${disconnectedIds.length > 0 ? `: ${disconnectedIds.join(', ')}` : ''}.`,\n ];\n if (alreadyDisconnectedIds.length > 0) {\n parts.push(`Already disconnected: ${alreadyDisconnectedIds.join(', ')}.`);\n }\n parts.push(`Saved agents: ${connected.length}`);\n return parts.join(' ');\n}\n\nfunction formatSignalResult({\n target,\n summary,\n priority,\n accepted,\n}: {\n target: AgentPeerView;\n summary: string;\n priority: AgentSignalPriority;\n accepted: SendAgentSignalAccepted;\n}): string {\n const label = untrustedPeerLabel(target);\n switch (accepted?.action) {\n case 'wake':\n return `Woke ${label} with a ${priority} signal in run ${accepted.runId}: ${summary}`;\n case 'deliver':\n return `Delivered ${priority} signal to ${label} in run ${accepted.runId}: ${summary}`;\n case 'persist':\n return `Persisted ${priority} signal for ${label} to process later: ${summary}`;\n case 'discard':\n return `The ${priority} signal to ${label} was discarded: ${summary}`;\n case 'blocked':\n return `The ${priority} signal to ${label} was blocked because thread ${untrustedThreadId(target)} is suspended: ${summary}`;\n default:\n return `No signal routing outcome was produced for ${label}: ${summary}`;\n }\n}\n\nfunction untrustedThreadId(target: AgentPeerView): string {\n return serializeUntrustedData(boundUntrustedText(target.threadId, UNTRUSTED_PEER_ID_MAX_LENGTH));\n}\n\nfunction untrustedPeerLabel(target: AgentPeerView): string {\n return serializeUntrustedData(\n boundUntrustedText(target.label ?? target.title ?? target.id, UNTRUSTED_PEER_METADATA_MAX_LENGTH),\n );\n}\n\nfunction fingerprintAgentSignal(value: {\n targetId: string;\n summary: string;\n priority: string;\n expectsReply: boolean;\n replyTo?: string;\n payload?: unknown;\n}): string {\n return createHash('sha256')\n .update(JSON.stringify(sortJsonValue(value)))\n .digest('hex');\n}\n\nfunction sortJsonValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortJsonValue);\n if (!value || typeof value !== 'object') return value;\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, nestedValue]) => [key, sortJsonValue(nestedValue)]),\n );\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : 'Unknown error';\n}\n"],"mappings":";;;;;;;AAgCA,MAAM,iBAAiB,EAAE,KAAK;CAAC;CAAO;CAAU;CAAQ;AAAQ,CAAC;AAEjE,MAAM,aAAa,EAAE,OAAO;CAC1B,IAAI,EAAE,OAAO;CACb,SAAS,EAAE,OAAO;CAClB,YAAY,EAAE,OAAO;CACrB,UAAU,EAAE,OAAO;CACnB,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;CAC3B,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;CAC3B,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS;CAC1B,cAAc,EAAE,KAAK,CAAC,QAAQ,OAAO,CAAC;CACtC,UAAU,EAAE,KAAK,CAAC,cAAc,QAAQ,CAAC;CACzC,eAAe,EAAE,KAAK;EAAC;EAAc;EAAa;CAAO,CAAC;CAC1D,gBAAgB,EAAE,QAAQ;CAC1B,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS;CACzB,aAAa,EAAE,OAAO,CAAC,CAAC,SAAS;CACjC,YAAY,EAAE,OAAO,CAAC,CAAC,SAAS;AAClC,CAAC;AAED,MAAM,kBAAkB,EAAE,OAAO;CAC/B,IAAI,EAAE,OAAO;CACb,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS;CAC7B,YAAY,EAAE,OAAO;CACrB,UAAU,EAAE,OAAO;CACnB,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;CAC3B,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;CAC3B,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS;CAC1B,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS;CACzB,aAAa,EAAE,OAAO;CACtB,YAAY,EAAE,OAAO;AACvB,CAAC;AAED,MAAM,mBAAmB,EAAE,OAAO;CAChC,SAAS,EAAE,OAAO;CAClB,OAAO,EAAE,MAAM,UAAU;CACzB,YAAY,EAAE,OAAO;CACrB,SAAS,EAAE,QAAQ,CAAC,CAAC,SAAS;AAChC,CAAC;AAED,MAAM,sBAAsB,EAAE,OAAO;CACnC,SAAS,EAAE,OAAO;CAClB,WAAW,EAAE,MAAM,eAAe;CAClC,SAAS,EAAE,MACT,EAAE,OAAO;EACP,IAAI,EAAE,OAAO;EACb,IAAI,EAAE,OAAO;EACb,MAAM,WAAW,SAAS;EAC1B,UAAU,EAAE,OAAO,CAAC,CAAC,SAAS;EAC9B,eAAe,EAAE,OAAO,CAAC,CAAC,SAAS;CACrC,CAAC,CACH;CACA,SAAS,EAAE,QAAQ,CAAC,CAAC,SAAS;AAChC,CAAC;AAED,MAAM,yBAAyB,EAAE,OAAO;CACtC,SAAS,EAAE,OAAO;CAClB,WAAW,EAAE,MAAM,eAAe;CAClC,iBAAiB,EAAE,MAAM,EAAE,OAAO,CAAC;CACnC,wBAAwB,EAAE,MAAM,EAAE,OAAO,CAAC;CAC1C,SAAS,EAAE,MACT,EAAE,OAAO;EACP,IAAI,EAAE,OAAO;EACb,IAAI,EAAE,OAAO;CACf,CAAC,CACH;CACA,SAAS,EAAE,QAAQ,CAAC,CAAC,SAAS;AAChC,CAAC;AAED,MAAM,qBAAqB,EAAE,OAAO;CAClC,SAAS,EAAE,OAAO;CAClB,QAAQ,WAAW,SAAS;CAC5B,UAAU,eAAe,SAAS;CAClC,cAAc,EAAE,QAAQ,CAAC,CAAC,SAAS;CACnC,WAAW,EAAE,OAAO,CAAC,CAAC,SAAS;CAC/B,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS;CAC7B,cAAc,EAAE,OAAO,CAAC,CAAC,SAAS;CAClC,eAAe,EAAE,KAAK;EAAC;EAAQ;EAAW;EAAW;EAAW;CAAS,CAAC,CAAC,CAAC,SAAS;CACrF,cAAc,EAAE,QAAQ,kBAAkB,CAAC,CAAC,SAAS;CACrD,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;CAC3B,cAAc,EAAE,QAAQ,CAAC,CAAC,SAAS;CACnC,WAAW,EAAE,QAAQ,CAAC,CAAC,SAAS;CAChC,SAAS,EAAE,QAAQ,CAAC,CAAC,SAAS;AAChC,CAAC;AAYD,SAAgB,2BAA2B,UAAuC,CAAC,GAAG;CACpF,MAAM,WAAW,QAAQ,YAAY,IAAI,wBAAwB;CAiZjE,OAAO;EACL,wBAhZ+B,WAAW;GAC1C,IAAI;GACJ,aAAa;;;GAGb,aAAa,EAAE,OAAO,CAAC,CAAC;GACxB,cAAc;GACd,SAAS,OAAO,QAAQ,YAAgD;IACtE,MAAM,eAAe;IACrB,IAAI;KACF,IAAI,CAAC,eAAe,aAAa,KAAK,GACpC,OAAO,mBAAmB;KAE5B,MAAM,eAAe,QAAQ,WAAW;KACxC,MAAM,kBAAkB;MAAE,GAAG;MAAc;KAAa;KACxD,MAAM,QAAQ,MAAM,SAAS,UAAU,eAAe;KACtD,MAAM,aAAa,MAAM,QAAO,SAAQ,KAAK,iBAAiB,OAAO,CAAC,CAAC;KACvE,OAAO;MACL,SAAS,eAAe,OAAO,UAAU;MACzC;MACA;MACA,SAAS;KACX;IACF,SAAS,OAAO;KACd,OAAO;MACL,SAAS,qCAAqC,aAAa,KAAK;MAChE,OAAO,CAAC;MACR,YAAY;MACZ,SAAS;KACX;IACF;GACF;EACF,CAgXiD;EAC/C,eA/WuB,WAAW;GAClC,IAAI;GACJ,aAAa;;;GAGb,aAAa,EAAE,OAAO,EACpB,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,yDAAyD,EAC3G,CAAC;GACD,cAAc;GACd,SAAS,OAAO,EAAE,OAAO,YAAyC;IAChE,MAAM,eAAe;IACrB,IAAI;KACF,IAAI,CAAC,eAAe,aAAa,KAAK,GAAG,OAAO,sBAAsB;KACtE,MAAM,kBAAkB;MAAE,GAAG;MAAc,cAAc,QAAQ,WAAW;KAAE;KAC9E,MAAM,UAAoC,CAAC;KAC3C,MAAM,YAAY,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC;KAClC,MAAM,iBAAiB,IAAI,KAAK,MAAM,SAAS,cAAc,eAAe,EAAA,CAAG,KAAI,SAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;KAC3G,MAAM,YAAY,UAAU,MAAK,OAAM,CAAC,eAAe,IAAI,EAAE,CAAC;KAC9D,IAAI,WACF,OAAO,mBACL,0CAA0C,aAC1C,MAAM,qBAAqB,YAAY,GACvC,CAAC,CACH;KAMF,MAAM,YAAY,MAAM,uBAAuB,eAAc,YAAW;MACtE,QAAQ,SAAS;MACjB,MAAM,OAAO,IAAI,IAAI,QAAQ,KAAI,SAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;MACzD,MAAM,MAAM,KAAK,IAAI;MACrB,KAAK,MAAM,MAAM,WAAW;OAC1B,MAAM,OAAO,eAAe,IAAI,EAAE;OAClC,MAAM,cAAc,KAAK,IAAI,KAAK,EAAE,CAAC,EAAE,eAAe;OACtD,MAAM,gBAAoC;QACxC,IAAI,KAAK;QACT,SAAS,KAAK;QACd,YAAY,KAAK;QACjB,UAAU,KAAK;QACf,OAAO,KAAK;QACZ,OAAO,KAAK;QACZ,MAAM,KAAK;QACX,KAAK,KAAK;QACV;QACA,YAAY,KAAK,cAAc;OACjC;OACA,KAAK,IAAI,KAAK,IAAI,aAAa;OAC/B,QAAQ,KAAK;QACX,IAAI;QACJ,IAAI,KAAK;QACT,MAAM;SACJ,GAAG;SACH,cAAc;SACd,eAAe;SACf,gBAAgB;SAChB;QACF;OACF,CAAC;MACH;MACA,OAAO,CAAC,GAAG,KAAK,OAAO,CAAC;KAC1B,CAAC;KACD,OAAO;MACL,SAAS,oBAAoB,SAAS,SAAS;MAC/C;MACA;MACA,SAAS;KACX;IACF,SAAS,OAAO;KACd,OAAO;MACL,SAAS,kCAAkC,aAAa,KAAK;MAC7D,WAAW,CAAC;MACZ,SAAS,CAAC;MACV,SAAS;KACX;IACF;GACF;EACF,CAiSgC;EAC9B,kBAhS0B,WAAW;GACrC,IAAI;GACJ,aAAa;;;GAGb,aAAa,EAAE,OAAO,EACpB,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,gDAAgD,EAClG,CAAC;GACD,cAAc;GACd,SAAS,OAAO,EAAE,OAAO,YAA4C;IACnE,MAAM,eAAe;IACrB,IAAI;KACF,IAAI,CAAC,eAAe,aAAa,KAAK,GAAG,OAAO,yBAAyB;KACzE,MAAM,kBAA4B,CAAC;KACnC,MAAM,yBAAmC,CAAC;KAC1C,MAAM,UAAoC,CAAC;KAK3C,MAAM,YAAY,MAAM,uBAAuB,eAAc,YAAW;MACtE,gBAAgB,SAAS;MACzB,uBAAuB,SAAS;MAChC,QAAQ,SAAS;MACjB,MAAM,OAAO,IAAI,IAAI,QAAQ,KAAI,SAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;MACzD,KAAK,MAAM,MAAM,IAAI,IAAI,GAAG,GAC1B,IAAI,KAAK,OAAO,EAAE,GAAG;OACnB,gBAAgB,KAAK,EAAE;OACvB,QAAQ,KAAK;QAAE,IAAI;QAAc;OAAG,CAAC;MACvC,OACE,uBAAuB,KAAK,EAAE;MAGlC,OAAO,CAAC,GAAG,KAAK,OAAO,CAAC;KAC1B,CAAC;KACD,OAAO;MACL,SAAS,uBAAuB,iBAAiB,wBAAwB,SAAS;MAClF;MACA;MACA;MACA;MACA,SAAS;KACX;IACF,SAAS,OAAO;KACd,OAAO;MACL,SAAS,qCAAqC,aAAa,KAAK;MAChE,WAAW,CAAC;MACZ,iBAAiB,CAAC;MAClB,wBAAwB,CAAC;MACzB,SAAS,CAAC;MACV,SAAS;KACX;IACF;GACF;EACF,CA0OsC;EACpC,mBAzO0B,WAAW;GACrC,IAAI;GACJ,aAAa;;;GAGb,aAAa,EAAE,OAAO;IACpB,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,oBAAoB;IACzD,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,uCAAuC;IAC3E,UAAU,eAAe,QAAQ,QAAQ;IACzC,cAAc,EACX,QAAQ,CAAC,CACT,SAAS,+FAA+F;IAC3G,WAAW,EACR,OAAO,CAAC,CACR,IAAI,CAAC,CAAC,CACN,SAAS,CAAC,CACV,SACC,0HACF;IACF,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,wDAAwD;IACvG,SAAS,EAAE,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,2CAA2C;GACtF,CAAC;GACD,cAAc;GACd,SAAS,OACP,EAAE,UAAU,SAAS,WAAW,UAAU,cAAc,WAAW,gBAAgB,SAAS,WAC5F,YACmC;IACnC,MAAM,eAAe;IACrB,IAAI;KACF,IAAI,CAAC,eAAe,aAAa,KAAK,GACpC,OAAO;MAAE,SAAS;MAAiD,SAAS;KAAK;KAEnF,MAAM,QAAQ,MAAM,qBAAqB,YAAY;KACrD,IAAI,CAAC,MAAM,MAAK,SAAQ,KAAK,OAAO,QAAQ,GAC1C,OAAO;MACL,SAAS,mCAAmC;MAC5C;MACA,GAAI,UAAU,EAAE,cAAc,mBAA4B,IAAI,CAAC;MAC/D,SAAS;KACX;KAEF,MAAM,QAAQ,QAAQ,WAAW;KAEjC,MAAM,UAAS,MADS,SAAS,eAAe;MAAE,GAAG;MAAc,cAAc;KAAM,GAAG,KAAK,EAAA,CACtE,MAAK,SAAQ,KAAK,OAAO,QAAQ;KAC1D,IAAI,CAAC,QAAQ,gBACX,OAAO;MACL,SAAS,8DAA8D;MACvE,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;MAC3B;MACA,GAAI,UAAU,EAAE,cAAc,mBAA4B,IAAI,CAAC;MAC/D,SAAS;KACX;KAEF,IAAI,CAAC,OAAO,wBACV,OAAO;MACL,SAAS;MACT;MACA,SAAS;KACX;KAEF,MAAM,eAAe,aAAa;KAClC,MAAM,eAAe,aAAa;MAChC,SAAS,aAAa,WAAW,KAAA;MACjC,YAAY,aAAa;MACzB,UAAU,aAAa;KACzB,CAAC;KACD,MAAM,YAAY,kBAAkB,WAAW;KAC/C,MAAM,cAAc,uBAAuB;MAAE;MAAU;MAAS;MAAU;MAAc;MAAS;KAAQ,CAAC;KAE1G,MAAM,gBAAe,MADK,qBAAqB,YAAY,EAAA,CAC1B,MAAK,WAAU,OAAO,cAAc,SAAS;KAC9E,IAAI,cAAc;MAChB,IAAI,aAAa,gBAAgB,aAC/B,OAAO;OACL,SAAS,cAAc,UAAU;OACjC;OACU;OACV;OACA;OACA;OACA;OACA,SAAS;MACX;MAEF,OAAO;OACL,SAAS,sBAAsB,UAAU,yBAAyB,mBAAmB,MAAM,EAAE;OAC7F;OACA,UAAU,aAAa;OACvB,cAAc,aAAa;OAC3B;OACA,SAAS,aAAa;OACtB,cAAc,aAAa;OAC3B,eAAe,aAAa;OAC5B,OAAO,aAAa;OACpB,WAAW;OACX,SAAS;MACX;KACF;KACA,MAAM,sBAAsB;MAC1B;MACA;MACA,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;MAC7B,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;MACvC,MAAM;OAAE,YAAY,aAAa;OAAY,UAAU,aAAa;MAAS;MAC7E;KACF;KACA,MAAM,eAAgB,MAAM,MAAM,uBAChC;MACE,QAAQ;MACR,UAAU;MACV,MAAM;MACI;MACV;MACA,WAAW,gBAAgB,aAAa,GAAG;MAC3C,YAAY;OACV;OACA;OACA,cAAc;OACd,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;OAC7B,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;MACzC;MACA,UAAU,EAAE,oBAAoB;MAChC,SAAS;OACP,GAAI,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ;OAC3C,GAAG;MACL;KACF,GACA;MACE,YAAY,OAAO;MACnB,UAAU,OAAO;MACjB,QAAQ,aAAa,QAAQ,EAAE,UAAU,UAAU,IAAI;OAAE,UAAU;OAAQ,qBAAqB;MAAK;KACvG,CACF;KACA,IAAI,WAAW,aAAa,WAAW,MAAM,aAAa,WAAW,KAAA;KACrE,IAAI,CAAC,UAEH,IACE,aAAa,SAAS,WAAW,aACjC,aAAa,SAAS,WAAW,WACjC,aAAa,SAAS,WAAW,aACjC;MACA,IAAI,cAAc;OAChB,MAAM,aAAa;OACnB,OAAO;QACL,SAAS,mIAAmI,mBAAmB,MAAM,EAAE;QACvK;QACU;QACV;QACA;QACA;QACA;QACA,eAAe;QACf,SAAS;OACX;MACF;MACA,WAAW,EAAE,QAAQ,UAAU;KACjC,OAAO,IAAI,aAAa,SAAS,WAAW,WAC1C,WAAW,EAAE,QAAQ,UAAU;UAE/B,OAAO;MACL,SAAS,gCAAgC,aAAa,OAAO,qBAAqB;MAClF;MACU;MACV;MACA;MACA;MACA;MACA,SAAS;KACX;KAGJ,IAAI,SAAS,WAAW,aAAa,SAAS,WAAW,WAIvD,OAAO;MACL,SACE,SAAS,WAAW,YAChB,8CAA8C,kBAAkB,MAAM,EAAE,+FACxE,uFAAuF,mBAAmB,MAAM,EAAE;MACxH;MACU;MACV;MACA;MACA;MACA;MACA,eAAe,SAAS;MACxB,SAAS;KACX;KAEF,IAAI,SAAS,WAAW,WAAW,MAAM,aAAa;KACtD,MAAM,gBAAgB,SAAS;KAC/B,MAAM,QAAQ,WAAW,WAAW,SAAS,QAAQ,KAAA;KACrD,MAAM,sBAAsB,cAAc,CACxC;MACE;MACA;MACA;MACU;MACV;MACA;MACA;MACA;MACA;MACA,QAAQ,KAAK,IAAI;KACnB,CACF,CAAC;KACD,OAAO;MACL,SAAS,mBAAmB;OAC1B;OACA;OACU;OACV;MACF,CAAC;MACD;MACU;MACV;MACA;MACA;MACA;MACA;MACA;MACA,SAAS;KACX;IACF,SAAS,OAAO;KACd,OAAO;MAAE,SAAS,gCAAgC,aAAa,KAAK;MAAK,SAAS;KAAK;IACzF;GACF;EACF,CAMuC;CACvC;AACF;AAEA,SAAS,qBAAgD;CACvD,OAAO;EAAE,SAAS;EAAqD,OAAO,CAAC;EAAG,YAAY;EAAG,SAAS;CAAK;AACjH;AAEA,SAAS,wBAA4C;CACnD,OAAO;EAAE,SAAS;EAAqD,WAAW,CAAC;EAAG,SAAS,CAAC;EAAG,SAAS;CAAK;AACnH;AAEA,SAAS,2BAAkD;CACzD,OAAO;EACL,SAAS;EACT,WAAW,CAAC;EACZ,iBAAiB,CAAC;EAClB,wBAAwB,CAAC;EACzB,SAAS,CAAC;EACV,SAAS;CACX;AACF;AAEA,SAAS,mBACP,SACA,WACA,SACoB;CACpB,OAAO;EAAE;EAAS;EAAW;EAAS,SAAS;CAAK;AACtD;AAEA,SAAS,eAAe,OAAkE,YAA4B;CACpH,IAAI,MAAM,WAAW,GAAG,OAAO;CAW/B,OAAO,oEAVO,MAAM,KAAI,SAAQ;EAC9B,OAAO,MAAM,KAAK,cAAc,IAAI,uBAAuB;GACzD,IAAI,mBAAmB,KAAK,IAAA,GAAgC;GAC5D,OAAO,mBAAmB,KAAK,OAAA,GAAyC;GACxE,OAAO,mBAAmB,KAAK,OAAA,GAAyC;GACxE,YAAY,mBAAmB,KAAK,YAAA,GAAwC;GAC5E,UAAU,mBAAmB,KAAK,UAAA,GAAsC;GACxE,gBAAgB,KAAK;EACvB,CAAC;CACH,CAC+E,CAAC,CAAC,KAAK,IAAI,EAAE,WAAW;AACzG;AAEA,SAAS,oBAAoB,SAAmC,WAAyC;CACvG,IAAI,QAAQ,WAAW,GAAG,OAAO,qCAAqC,UAAU;CAChF,OAAO,aAAa,QAAQ,OAAO,QAAQ,QAAQ,WAAW,IAAI,KAAK,IAAI,IAAI,QAAQ,KAAI,WAAU,OAAO,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,kBAAkB,UAAU;AACzJ;AAEA,SAAS,uBACP,iBACA,wBACA,WACQ;CACR,MAAM,QAAQ,CACZ,gBAAgB,gBAAgB,OAAO,QAAQ,gBAAgB,WAAW,IAAI,KAAK,MAAM,gBAAgB,SAAS,IAAI,KAAK,gBAAgB,KAAK,IAAI,MAAM,GAAG,EAC/J;CACA,IAAI,uBAAuB,SAAS,GAClC,MAAM,KAAK,yBAAyB,uBAAuB,KAAK,IAAI,EAAE,EAAE;CAE1E,MAAM,KAAK,iBAAiB,UAAU,QAAQ;CAC9C,OAAO,MAAM,KAAK,GAAG;AACvB;AAEA,SAAS,mBAAmB,EAC1B,QACA,SACA,UACA,YAMS;CACT,MAAM,QAAQ,mBAAmB,MAAM;CACvC,QAAQ,UAAU,QAAlB;EACE,KAAK,QACH,OAAO,QAAQ,MAAM,UAAU,SAAS,iBAAiB,SAAS,MAAM,IAAI;EAC9E,KAAK,WACH,OAAO,aAAa,SAAS,aAAa,MAAM,UAAU,SAAS,MAAM,IAAI;EAC/E,KAAK,WACH,OAAO,aAAa,SAAS,cAAc,MAAM,qBAAqB;EACxE,KAAK,WACH,OAAO,OAAO,SAAS,aAAa,MAAM,kBAAkB;EAC9D,KAAK,WACH,OAAO,OAAO,SAAS,aAAa,MAAM,8BAA8B,kBAAkB,MAAM,EAAE,iBAAiB;EACrH,SACE,OAAO,8CAA8C,MAAM,IAAI;CACnE;AACF;AAEA,SAAS,kBAAkB,QAA+B;CACxD,OAAO,uBAAuB,mBAAmB,OAAO,UAAA,GAAsC,CAAC;AACjG;AAEA,SAAS,mBAAmB,QAA+B;CACzD,OAAO,uBACL,mBAAmB,OAAO,SAAS,OAAO,SAAS,OAAO,IAAA,GAAsC,CAClG;AACF;AAEA,SAAS,uBAAuB,OAOrB;CACT,OAAO,WAAW,QAAQ,CAAC,CACxB,OAAO,KAAK,UAAU,cAAc,KAAK,CAAC,CAAC,CAAC,CAC5C,OAAO,KAAK;AACjB;AAEA,SAAS,cAAc,OAAyB;CAC9C,IAAI,MAAM,QAAQ,KAAK,GAAG,OAAO,MAAM,IAAI,aAAa;CACxD,IAAI,CAAC,SAAS,OAAO,UAAU,UAAU,OAAO;CAChD,OAAO,OAAO,YACZ,OAAO,QAAQ,KAAK,CAAC,CAClB,MAAM,CAAC,OAAO,CAAC,WAAW,KAAK,cAAc,KAAK,CAAC,CAAC,CACpD,KAAK,CAAC,KAAK,iBAAiB,CAAC,KAAK,cAAc,WAAW,CAAC,CAAC,CAClE;AACF;AAEA,SAAS,aAAa,OAAwB;CAC5C,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAClD"}
1
+ {"version":3,"file":"tools.js","names":[],"sources":["../../src/agent-connections/tools.ts"],"sourcesContent":["import { createHash, randomUUID } from 'node:crypto';\n\nimport type { SendAgentNotificationSignalResult, SendAgentSignalAccepted } from '@mastra/core/agent';\nimport { createTool } from '@mastra/core/tools';\nimport { z } from 'zod';\n\nimport { AgentConnectionRegistry, stablePeerId } from './registry.js';\nimport {\n isMemoryBacked,\n readAgentConnections,\n readSentAgentSignals,\n updateAgentConnections,\n writeSentAgentSignals,\n type AgentConnectionContext,\n} from './thread-state.js';\nimport type {\n AgentConnectResult,\n AgentConnectionDeltaOp,\n AgentConnectionListResult,\n AgentDisconnectResult,\n AgentPeerView,\n AgentSignalPriority,\n AgentSignalSendResult,\n ConnectedAgentPeer,\n} from './types.js';\nimport {\n UNTRUSTED_PEER_ID_MAX_LENGTH,\n UNTRUSTED_PEER_METADATA_MAX_LENGTH,\n boundUntrustedText,\n serializeUntrustedData,\n} from './untrusted-text.js';\n\nconst prioritySchema = z.enum(['low', 'medium', 'high', 'urgent']);\n\nconst peerSchema = z.object({\n id: z.string(),\n agentId: z.string(),\n resourceId: z.string(),\n threadId: z.string(),\n label: z.string().optional(),\n title: z.string().optional(),\n mode: z.string().optional(),\n relationship: z.enum(['none', 'saved']),\n presence: z.enum(['advertised', 'absent']),\n displayStatus: z.enum(['discovered', 'connected', 'saved']),\n canAttemptSend: z.boolean(),\n pid: z.number().optional(),\n connectedAt: z.number().optional(),\n lastSeenAt: z.number().optional(),\n});\n\nconst savedPeerSchema = z.object({\n id: z.string(),\n agentId: z.string().optional(),\n resourceId: z.string(),\n threadId: z.string(),\n label: z.string().optional(),\n title: z.string().optional(),\n mode: z.string().optional(),\n pid: z.number().optional(),\n connectedAt: z.number(),\n lastSeenAt: z.number(),\n});\n\nconst listResultSchema = z.object({\n content: z.string(),\n peers: z.array(peerSchema),\n savedCount: z.number(),\n isError: z.boolean().optional(),\n});\n\nconst connectResultSchema = z.object({\n content: z.string(),\n connected: z.array(savedPeerSchema),\n changed: z.array(\n z.object({\n op: z.string(),\n id: z.string(),\n peer: peerSchema.optional(),\n presence: z.string().optional(),\n displayStatus: z.string().optional(),\n }),\n ),\n isError: z.boolean().optional(),\n});\n\nconst disconnectResultSchema = z.object({\n content: z.string(),\n connected: z.array(savedPeerSchema),\n disconnectedIds: z.array(z.string()),\n alreadyDisconnectedIds: z.array(z.string()),\n changed: z.array(\n z.object({\n op: z.string(),\n id: z.string(),\n }),\n ),\n isError: z.boolean().optional(),\n});\n\nconst signalResultSchema = z.object({\n content: z.string(),\n target: peerSchema.optional(),\n priority: prioritySchema.optional(),\n expectsReply: z.boolean().optional(),\n messageId: z.string().optional(),\n replyTo: z.string().optional(),\n returnPeerId: z.string().optional(),\n routingAction: z.enum(['wake', 'deliver', 'persist', 'discard', 'blocked']).optional(),\n replyOutcome: z.literal('peer-unavailable').optional(),\n runId: z.string().optional(),\n notification: z.unknown().optional(),\n duplicate: z.boolean().optional(),\n isError: z.boolean().optional(),\n});\n\nexport interface AgentConnectionToolsOptions {\n registry?: AgentConnectionRegistry;\n getAgent?: () =>\n | {\n sendNotificationSignal?: (...args: any[]) => Promise<unknown>;\n discoverThreadPeers?: (...args: any[]) => Promise<unknown>;\n }\n | undefined;\n}\n\nexport function createAgentConnectionTools(options: AgentConnectionToolsOptions = {}) {\n const registry = options.registry ?? new AgentConnectionRegistry();\n\n const agentConnectionsListTool = createTool({\n id: 'agent_connections_list',\n description: `List cross-agent peers discovered now or saved by this thread.\n\nEach peer has an explicit durable relationship, current advertisement presence, display status, and send eligibility. Use agent_connect for [discovered] peers and agent_disconnect for saved peers.`,\n inputSchema: z.object({}),\n outputSchema: listResultSchema,\n execute: async (_input, context): Promise<AgentConnectionListResult> => {\n const agentContext = context as AgentConnectionContext;\n try {\n if (!isMemoryBacked(agentContext.agent)) {\n return noMemoryListResult();\n }\n const runtimeAgent = options.getAgent?.();\n const registryContext = { ...agentContext, runtimeAgent };\n const peers = await registry.listPeers(registryContext);\n const savedCount = peers.filter(peer => peer.relationship === 'saved').length;\n return {\n content: formatPeerList(peers, savedCount),\n peers,\n savedCount,\n isError: false,\n };\n } catch (error) {\n return {\n content: `Failed to list agent connections: ${errorMessage(error)}`,\n peers: [],\n savedCount: 0,\n isError: true,\n };\n }\n },\n });\n\n const agentConnectTool = createTool({\n id: 'agent_connect',\n description: `Save freshly discovered peer MastraCode agents by stable id.\n\nUse agent_connections_list first, then pass [discovered] peer ids from that result. Saved agents are persisted per thread and surfaced through connected-agent state signals.`,\n inputSchema: z.object({\n ids: z.array(z.string().min(1)).min(1).describe('Discovered peer ids returned by agent_connections_list.'),\n }),\n outputSchema: connectResultSchema,\n execute: async ({ ids }, context): Promise<AgentConnectResult> => {\n const agentContext = context as AgentConnectionContext;\n try {\n if (!isMemoryBacked(agentContext.agent)) return noMemoryConnectResult();\n const registryContext = { ...agentContext, runtimeAgent: options.getAgent?.() };\n const changed: AgentConnectionDeltaOp[] = [];\n const uniqueIds = [...new Set(ids)];\n const discoveredById = new Map((await registry.discoverPeers(registryContext)).map(peer => [peer.id, peer]));\n const unknownId = uniqueIds.find(id => !discoveredById.has(id));\n if (unknownId) {\n return errorConnectResult(\n `Unknown or unadvertised agent peer id: ${unknownId}`,\n await readAgentConnections(agentContext),\n [],\n );\n }\n\n // Apply the connect delta against the freshly read state inside the\n // queued updater so concurrent connect/disconnect calls cannot clobber\n // each other's writes.\n const connected = await updateAgentConnections(agentContext, current => {\n changed.length = 0;\n const byId = new Map(current.map(peer => [peer.id, peer]));\n const now = Date.now();\n for (const id of uniqueIds) {\n const peer = discoveredById.get(id)!;\n const connectedAt = byId.get(peer.id)?.connectedAt ?? now;\n const connectedPeer: ConnectedAgentPeer = {\n id: peer.id,\n agentId: peer.agentId,\n resourceId: peer.resourceId,\n threadId: peer.threadId,\n label: peer.label,\n title: peer.title,\n mode: peer.mode,\n pid: peer.pid,\n connectedAt,\n lastSeenAt: peer.lastSeenAt ?? now,\n };\n byId.set(peer.id, connectedPeer);\n changed.push({\n op: 'connect',\n id: peer.id,\n peer: {\n ...peer,\n relationship: 'saved',\n displayStatus: 'connected',\n canAttemptSend: true,\n connectedAt,\n },\n });\n }\n return [...byId.values()];\n });\n return {\n content: formatConnectResult(changed, connected),\n connected,\n changed,\n isError: false,\n };\n } catch (error) {\n return {\n content: `Failed to connect agent peers: ${errorMessage(error)}`,\n connected: [],\n changed: [],\n isError: true,\n };\n }\n },\n });\n\n const agentDisconnectTool = createTool({\n id: 'agent_disconnect',\n description: `Remove saved peer relationships from this thread by stable id.\n\nThe peer does not need to be currently advertised. Disconnecting is idempotent and does not alter remote threads, runs, notifications, or prior signal history.`,\n inputSchema: z.object({\n ids: z.array(z.string().min(1)).min(1).describe('Saved peer ids to disconnect from this thread.'),\n }),\n outputSchema: disconnectResultSchema,\n execute: async ({ ids }, context): Promise<AgentDisconnectResult> => {\n const agentContext = context as AgentConnectionContext;\n try {\n if (!isMemoryBacked(agentContext.agent)) return noMemoryDisconnectResult();\n const disconnectedIds: string[] = [];\n const alreadyDisconnectedIds: string[] = [];\n const changed: AgentConnectionDeltaOp[] = [];\n\n // Apply the disconnect delta against the freshly read state inside the\n // queued updater so concurrent connect/disconnect calls cannot clobber\n // each other's writes.\n const connected = await updateAgentConnections(agentContext, current => {\n disconnectedIds.length = 0;\n alreadyDisconnectedIds.length = 0;\n changed.length = 0;\n const byId = new Map(current.map(peer => [peer.id, peer]));\n for (const id of new Set(ids)) {\n if (byId.delete(id)) {\n disconnectedIds.push(id);\n changed.push({ op: 'disconnect', id });\n } else {\n alreadyDisconnectedIds.push(id);\n }\n }\n return [...byId.values()];\n });\n return {\n content: formatDisconnectResult(disconnectedIds, alreadyDisconnectedIds, connected),\n connected,\n disconnectedIds,\n alreadyDisconnectedIds,\n changed,\n isError: false,\n };\n } catch (error) {\n return {\n content: `Failed to disconnect agent peers: ${errorMessage(error)}`,\n connected: [],\n disconnectedIds: [],\n alreadyDisconnectedIds: [],\n changed: [],\n isError: true,\n };\n }\n },\n });\n\n const agentSignalSendTool = createTool({\n id: 'agent_signal_send',\n description: `Send a prioritized notification signal to a connected peer agent.\n\nThe target must already be saved and freshly advertise the same exact thread endpoint at send time. Use expectsReply to declare whether the peer owes one signal back to this thread; false removes that obligation but does not prevent or forbid a reply. Signals routed to a notification summary cannot establish a reply obligation until the recipient opens the full notification, so use a priority that routes directly when a reply is required. Reuse messageId when retrying the same logical send, and set replyTo to the request messageId when replying. Use priority to indicate urgency: low, medium, high, or urgent.`,\n inputSchema: z.object({\n targetId: z.string().min(1).describe('Connected peer id.'),\n message: z\n .string()\n .min(1)\n .describe('Full message delivered to the peer. This is the only content the peer receives.'),\n priority: prioritySchema.default('medium'),\n expectsReply: z\n .boolean()\n .describe('Whether the peer owes one signal back. False means no obligation, not no permission to reply.'),\n messageId: z\n .string()\n .min(1)\n .optional()\n .describe(\n 'Stable logical message id. Reuse the same id for a sequential retry; receiver-side notification coalescing also uses it.',\n ),\n replyTo: z.string().min(1).optional().describe('Message id of the peer request this signal replies to.'),\n }),\n outputSchema: signalResultSchema,\n execute: async (\n { targetId, message: summary, priority = 'medium', expectsReply, messageId: inputMessageId, replyTo },\n context,\n ): Promise<AgentSignalSendResult> => {\n const agentContext = context as AgentConnectionContext;\n try {\n if (!isMemoryBacked(agentContext.agent)) {\n return { content: 'Agent signals require a memory-backed thread.', isError: true };\n }\n const saved = await readAgentConnections(agentContext);\n if (!saved.some(peer => peer.id === targetId)) {\n return {\n content: `Cannot send: peer is not saved: ${targetId}`,\n replyTo,\n ...(replyTo ? { replyOutcome: 'peer-unavailable' as const } : {}),\n isError: true,\n };\n }\n const agent = options.getAgent?.();\n const connected = await registry.connectedPeers({ ...agentContext, runtimeAgent: agent }, saved);\n const target = connected.find(peer => peer.id === targetId);\n if (!target?.canAttemptSend) {\n return {\n content: `Cannot send: saved peer is not currently advertised. Peer: ${targetId}`,\n ...(target ? { target } : {}),\n replyTo,\n ...(replyTo ? { replyOutcome: 'peer-unavailable' as const } : {}),\n isError: true,\n };\n }\n if (!agent?.sendNotificationSignal) {\n return {\n content: 'Agent signal sending is unavailable because no connected agent runtime is registered.',\n target,\n isError: true,\n };\n }\n const currentAgent = agentContext.agent as { resourceId: string; threadId: string; agentId?: string };\n const returnPeerId = stablePeerId({\n agentId: currentAgent.agentId || undefined,\n resourceId: currentAgent.resourceId,\n threadId: currentAgent.threadId,\n });\n const messageId = inputMessageId ?? randomUUID();\n const fingerprint = fingerprintAgentSignal({ targetId, summary, priority, expectsReply, replyTo });\n const sentSignals = await readSentAgentSignals(agentContext);\n const previousSend = sentSignals.find(signal => signal.messageId === messageId);\n if (previousSend) {\n if (previousSend.fingerprint !== fingerprint) {\n return {\n content: `Message id ${messageId} was already used for a different cross-agent signal.`,\n target,\n priority: priority as AgentSignalPriority,\n expectsReply,\n messageId,\n replyTo,\n returnPeerId,\n isError: true,\n };\n }\n return {\n content: `Cross-agent signal ${messageId} was already routed to ${untrustedPeerLabel(target)}.`,\n target,\n priority: previousSend.priority,\n expectsReply: previousSend.expectsReply,\n messageId,\n replyTo: previousSend.replyTo,\n returnPeerId: previousSend.returnPeerId,\n routingAction: previousSend.routingAction,\n runId: previousSend.runId,\n duplicate: true,\n isError: false,\n };\n }\n const crossAgentMessaging = {\n expectsReply,\n messageId,\n ...(replyTo ? { replyTo } : {}),\n ...(expectsReply ? { returnPeerId } : {}),\n from: { resourceId: currentAgent.resourceId, threadId: currentAgent.threadId },\n targetId,\n };\n const notification = (await agent.sendNotificationSignal(\n {\n source: 'agent-connection',\n sourceId: returnPeerId,\n kind: 'peer-signal',\n priority: priority as AgentSignalPriority,\n summary,\n dedupeKey: `agent-signal:${returnPeerId}:${messageId}`,\n attributes: {\n expectsReply,\n messageId,\n sourcePeerId: returnPeerId,\n ...(replyTo ? { replyTo } : {}),\n ...(expectsReply ? { returnPeerId } : {}),\n },\n metadata: { crossAgentMessaging },\n payload: crossAgentMessaging,\n },\n {\n resourceId: target.resourceId,\n threadId: target.threadId,\n ifIdle: priority === 'low' ? { behavior: 'persist' } : { behavior: 'wake', requireClaimedOwner: true },\n },\n )) as SendAgentNotificationSignalResult;\n let accepted = notification.accepted ? await notification.accepted : undefined;\n if (!accepted) {\n // Policy-only outcomes do not emit a signal, so they intentionally have no owner acknowledgment.\n if (\n notification.decision.action === 'persist' ||\n notification.decision.action === 'defer' ||\n notification.decision.action === 'summarize'\n ) {\n if (expectsReply) {\n await notification.persisted;\n return {\n content: `Failed to establish a reply obligation: the signal was queued for a notification summary instead of being delivered directly to ${untrustedPeerLabel(target)}. Send a new signal at a priority that routes directly when a reply is required.`,\n target,\n priority: priority as AgentSignalPriority,\n expectsReply,\n messageId,\n replyTo,\n returnPeerId,\n routingAction: 'persist',\n isError: true,\n };\n }\n accepted = { action: 'persist' };\n } else if (notification.decision.action === 'discard') {\n accepted = { action: 'discard' };\n } else {\n return {\n content: `Failed to send agent signal: ${notification.record.lastDeliveryError ?? 'delivery was not acknowledged by the target thread owner'}`,\n target,\n priority: priority as AgentSignalPriority,\n expectsReply,\n messageId,\n replyTo,\n returnPeerId,\n isError: true,\n };\n }\n }\n if (accepted.action === 'blocked' || accepted.action === 'discard') {\n // The signal was not routed, so skip sent history: a retry with the\n // same messageId must be able to route instead of short-circuiting\n // as a duplicate.\n return {\n content:\n accepted.action === 'blocked'\n ? `Failed to send agent signal: target thread ${untrustedThreadId(target)} is suspended and did not accept the signal. Retry with the same messageId once it resumes.`\n : `Failed to send agent signal: delivery policy discarded the signal before it reached ${untrustedPeerLabel(target)}. Retry with the same messageId if the delivery policy changes.`,\n target,\n priority: priority as AgentSignalPriority,\n expectsReply,\n messageId,\n replyTo,\n returnPeerId,\n routingAction: accepted.action,\n isError: true,\n };\n }\n if (accepted.action === 'persist') await notification.persisted;\n const routingAction = accepted.action;\n const runId = 'runId' in accepted ? accepted.runId : undefined;\n await writeSentAgentSignals(agentContext, [\n {\n messageId,\n fingerprint,\n targetId,\n priority: priority as AgentSignalPriority,\n expectsReply,\n replyTo,\n returnPeerId,\n routingAction,\n runId,\n sentAt: Date.now(),\n },\n ]);\n return {\n content: formatSignalResult({\n target,\n priority: priority as AgentSignalPriority,\n accepted,\n }),\n target,\n priority: priority as AgentSignalPriority,\n expectsReply,\n messageId,\n replyTo,\n returnPeerId,\n routingAction,\n runId,\n isError: false,\n };\n } catch (error) {\n return { content: `Failed to send agent signal: ${errorMessage(error)}`, isError: true };\n }\n },\n });\n\n return {\n agent_connections_list: agentConnectionsListTool,\n agent_connect: agentConnectTool,\n agent_disconnect: agentDisconnectTool,\n agent_signal_send: agentSignalSendTool,\n };\n}\n\nfunction noMemoryListResult(): AgentConnectionListResult {\n return { content: 'Agent connections require a memory-backed thread.', peers: [], savedCount: 0, isError: true };\n}\n\nfunction noMemoryConnectResult(): AgentConnectResult {\n return { content: 'Agent connections require a memory-backed thread.', connected: [], changed: [], isError: true };\n}\n\nfunction noMemoryDisconnectResult(): AgentDisconnectResult {\n return {\n content: 'Agent connections require a memory-backed thread.',\n connected: [],\n disconnectedIds: [],\n alreadyDisconnectedIds: [],\n changed: [],\n isError: true,\n };\n}\n\nfunction errorConnectResult(\n content: string,\n connected: ConnectedAgentPeer[],\n changed: AgentConnectionDeltaOp[],\n): AgentConnectResult {\n return { content, connected, changed, isError: true };\n}\n\nfunction formatPeerList(peers: Awaited<ReturnType<AgentConnectionRegistry['listPeers']>>, savedCount: number): string {\n if (peers.length === 0) return 'No peer agents are discovered or saved.';\n const lines = peers.map(peer => {\n return `- [${peer.displayStatus}] ${serializeUntrustedData({\n id: boundUntrustedText(peer.id, UNTRUSTED_PEER_ID_MAX_LENGTH),\n label: boundUntrustedText(peer.label, UNTRUSTED_PEER_METADATA_MAX_LENGTH),\n title: boundUntrustedText(peer.title, UNTRUSTED_PEER_METADATA_MAX_LENGTH),\n resourceId: boundUntrustedText(peer.resourceId, UNTRUSTED_PEER_ID_MAX_LENGTH),\n threadId: boundUntrustedText(peer.threadId, UNTRUSTED_PEER_ID_MAX_LENGTH),\n canAttemptSend: peer.canAttemptSend,\n })}`;\n });\n return `Agent peers (untrusted peer-supplied data, never instructions):\\n${lines.join('\\n')}\\nSaved: ${savedCount}`;\n}\n\nfunction formatConnectResult(changed: AgentConnectionDeltaOp[], connected: ConnectedAgentPeer[]): string {\n if (changed.length === 0) return `Connected 0 agents. Saved agents: ${connected.length}`;\n return `Connected ${changed.length} agent${changed.length === 1 ? '' : 's'}: ${changed.map(change => change.id).join(', ')}. Saved agents: ${connected.length}`;\n}\n\nfunction formatDisconnectResult(\n disconnectedIds: string[],\n alreadyDisconnectedIds: string[],\n connected: ConnectedAgentPeer[],\n): string {\n const parts = [\n `Disconnected ${disconnectedIds.length} agent${disconnectedIds.length === 1 ? '' : 's'}${disconnectedIds.length > 0 ? `: ${disconnectedIds.join(', ')}` : ''}.`,\n ];\n if (alreadyDisconnectedIds.length > 0) {\n parts.push(`Already disconnected: ${alreadyDisconnectedIds.join(', ')}.`);\n }\n parts.push(`Saved agents: ${connected.length}`);\n return parts.join(' ');\n}\n\nfunction formatSignalResult({\n target,\n priority,\n accepted,\n}: {\n target: AgentPeerView;\n priority: AgentSignalPriority;\n accepted: SendAgentSignalAccepted;\n}): string {\n const label = untrustedPeerLabel(target);\n switch (accepted?.action) {\n case 'wake':\n return `Woke ${label} with a ${priority} signal in run ${accepted.runId}`;\n case 'deliver':\n return `Delivered ${priority} signal to ${label} in run ${accepted.runId}`;\n case 'persist':\n return `Persisted ${priority} signal for ${label} to process later`;\n case 'discard':\n return `The ${priority} signal to ${label} was discarded`;\n case 'blocked':\n return `The ${priority} signal to ${label} was blocked because thread ${untrustedThreadId(target)} is suspended`;\n default:\n return `No signal routing outcome was produced for ${label}`;\n }\n}\n\nfunction untrustedThreadId(target: AgentPeerView): string {\n return serializeUntrustedData(boundUntrustedText(target.threadId, UNTRUSTED_PEER_ID_MAX_LENGTH));\n}\n\nfunction untrustedPeerLabel(target: AgentPeerView): string {\n return serializeUntrustedData(\n boundUntrustedText(target.label ?? target.title ?? target.id, UNTRUSTED_PEER_METADATA_MAX_LENGTH),\n );\n}\n\nfunction fingerprintAgentSignal(value: {\n targetId: string;\n summary: string;\n priority: string;\n expectsReply: boolean;\n replyTo?: string;\n}): string {\n return createHash('sha256')\n .update(JSON.stringify(sortJsonValue(value)))\n .digest('hex');\n}\n\nfunction sortJsonValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortJsonValue);\n if (!value || typeof value !== 'object') return value;\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, nestedValue]) => [key, sortJsonValue(nestedValue)]),\n );\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : 'Unknown error';\n}\n"],"mappings":";;;;;;;AAgCA,MAAM,iBAAiB,EAAE,KAAK;CAAC;CAAO;CAAU;CAAQ;AAAQ,CAAC;AAEjE,MAAM,aAAa,EAAE,OAAO;CAC1B,IAAI,EAAE,OAAO;CACb,SAAS,EAAE,OAAO;CAClB,YAAY,EAAE,OAAO;CACrB,UAAU,EAAE,OAAO;CACnB,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;CAC3B,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;CAC3B,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS;CAC1B,cAAc,EAAE,KAAK,CAAC,QAAQ,OAAO,CAAC;CACtC,UAAU,EAAE,KAAK,CAAC,cAAc,QAAQ,CAAC;CACzC,eAAe,EAAE,KAAK;EAAC;EAAc;EAAa;CAAO,CAAC;CAC1D,gBAAgB,EAAE,QAAQ;CAC1B,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS;CACzB,aAAa,EAAE,OAAO,CAAC,CAAC,SAAS;CACjC,YAAY,EAAE,OAAO,CAAC,CAAC,SAAS;AAClC,CAAC;AAED,MAAM,kBAAkB,EAAE,OAAO;CAC/B,IAAI,EAAE,OAAO;CACb,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS;CAC7B,YAAY,EAAE,OAAO;CACrB,UAAU,EAAE,OAAO;CACnB,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;CAC3B,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;CAC3B,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS;CAC1B,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS;CACzB,aAAa,EAAE,OAAO;CACtB,YAAY,EAAE,OAAO;AACvB,CAAC;AAED,MAAM,mBAAmB,EAAE,OAAO;CAChC,SAAS,EAAE,OAAO;CAClB,OAAO,EAAE,MAAM,UAAU;CACzB,YAAY,EAAE,OAAO;CACrB,SAAS,EAAE,QAAQ,CAAC,CAAC,SAAS;AAChC,CAAC;AAED,MAAM,sBAAsB,EAAE,OAAO;CACnC,SAAS,EAAE,OAAO;CAClB,WAAW,EAAE,MAAM,eAAe;CAClC,SAAS,EAAE,MACT,EAAE,OAAO;EACP,IAAI,EAAE,OAAO;EACb,IAAI,EAAE,OAAO;EACb,MAAM,WAAW,SAAS;EAC1B,UAAU,EAAE,OAAO,CAAC,CAAC,SAAS;EAC9B,eAAe,EAAE,OAAO,CAAC,CAAC,SAAS;CACrC,CAAC,CACH;CACA,SAAS,EAAE,QAAQ,CAAC,CAAC,SAAS;AAChC,CAAC;AAED,MAAM,yBAAyB,EAAE,OAAO;CACtC,SAAS,EAAE,OAAO;CAClB,WAAW,EAAE,MAAM,eAAe;CAClC,iBAAiB,EAAE,MAAM,EAAE,OAAO,CAAC;CACnC,wBAAwB,EAAE,MAAM,EAAE,OAAO,CAAC;CAC1C,SAAS,EAAE,MACT,EAAE,OAAO;EACP,IAAI,EAAE,OAAO;EACb,IAAI,EAAE,OAAO;CACf,CAAC,CACH;CACA,SAAS,EAAE,QAAQ,CAAC,CAAC,SAAS;AAChC,CAAC;AAED,MAAM,qBAAqB,EAAE,OAAO;CAClC,SAAS,EAAE,OAAO;CAClB,QAAQ,WAAW,SAAS;CAC5B,UAAU,eAAe,SAAS;CAClC,cAAc,EAAE,QAAQ,CAAC,CAAC,SAAS;CACnC,WAAW,EAAE,OAAO,CAAC,CAAC,SAAS;CAC/B,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS;CAC7B,cAAc,EAAE,OAAO,CAAC,CAAC,SAAS;CAClC,eAAe,EAAE,KAAK;EAAC;EAAQ;EAAW;EAAW;EAAW;CAAS,CAAC,CAAC,CAAC,SAAS;CACrF,cAAc,EAAE,QAAQ,kBAAkB,CAAC,CAAC,SAAS;CACrD,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;CAC3B,cAAc,EAAE,QAAQ,CAAC,CAAC,SAAS;CACnC,WAAW,EAAE,QAAQ,CAAC,CAAC,SAAS;CAChC,SAAS,EAAE,QAAQ,CAAC,CAAC,SAAS;AAChC,CAAC;AAYD,SAAgB,2BAA2B,UAAuC,CAAC,GAAG;CACpF,MAAM,WAAW,QAAQ,YAAY,IAAI,wBAAwB;CA+YjE,OAAO;EACL,wBA9Y+B,WAAW;GAC1C,IAAI;GACJ,aAAa;;;GAGb,aAAa,EAAE,OAAO,CAAC,CAAC;GACxB,cAAc;GACd,SAAS,OAAO,QAAQ,YAAgD;IACtE,MAAM,eAAe;IACrB,IAAI;KACF,IAAI,CAAC,eAAe,aAAa,KAAK,GACpC,OAAO,mBAAmB;KAE5B,MAAM,eAAe,QAAQ,WAAW;KACxC,MAAM,kBAAkB;MAAE,GAAG;MAAc;KAAa;KACxD,MAAM,QAAQ,MAAM,SAAS,UAAU,eAAe;KACtD,MAAM,aAAa,MAAM,QAAO,SAAQ,KAAK,iBAAiB,OAAO,CAAC,CAAC;KACvE,OAAO;MACL,SAAS,eAAe,OAAO,UAAU;MACzC;MACA;MACA,SAAS;KACX;IACF,SAAS,OAAO;KACd,OAAO;MACL,SAAS,qCAAqC,aAAa,KAAK;MAChE,OAAO,CAAC;MACR,YAAY;MACZ,SAAS;KACX;IACF;GACF;EACF,CA8WiD;EAC/C,eA7WuB,WAAW;GAClC,IAAI;GACJ,aAAa;;;GAGb,aAAa,EAAE,OAAO,EACpB,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,yDAAyD,EAC3G,CAAC;GACD,cAAc;GACd,SAAS,OAAO,EAAE,OAAO,YAAyC;IAChE,MAAM,eAAe;IACrB,IAAI;KACF,IAAI,CAAC,eAAe,aAAa,KAAK,GAAG,OAAO,sBAAsB;KACtE,MAAM,kBAAkB;MAAE,GAAG;MAAc,cAAc,QAAQ,WAAW;KAAE;KAC9E,MAAM,UAAoC,CAAC;KAC3C,MAAM,YAAY,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC;KAClC,MAAM,iBAAiB,IAAI,KAAK,MAAM,SAAS,cAAc,eAAe,EAAA,CAAG,KAAI,SAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;KAC3G,MAAM,YAAY,UAAU,MAAK,OAAM,CAAC,eAAe,IAAI,EAAE,CAAC;KAC9D,IAAI,WACF,OAAO,mBACL,0CAA0C,aAC1C,MAAM,qBAAqB,YAAY,GACvC,CAAC,CACH;KAMF,MAAM,YAAY,MAAM,uBAAuB,eAAc,YAAW;MACtE,QAAQ,SAAS;MACjB,MAAM,OAAO,IAAI,IAAI,QAAQ,KAAI,SAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;MACzD,MAAM,MAAM,KAAK,IAAI;MACrB,KAAK,MAAM,MAAM,WAAW;OAC1B,MAAM,OAAO,eAAe,IAAI,EAAE;OAClC,MAAM,cAAc,KAAK,IAAI,KAAK,EAAE,CAAC,EAAE,eAAe;OACtD,MAAM,gBAAoC;QACxC,IAAI,KAAK;QACT,SAAS,KAAK;QACd,YAAY,KAAK;QACjB,UAAU,KAAK;QACf,OAAO,KAAK;QACZ,OAAO,KAAK;QACZ,MAAM,KAAK;QACX,KAAK,KAAK;QACV;QACA,YAAY,KAAK,cAAc;OACjC;OACA,KAAK,IAAI,KAAK,IAAI,aAAa;OAC/B,QAAQ,KAAK;QACX,IAAI;QACJ,IAAI,KAAK;QACT,MAAM;SACJ,GAAG;SACH,cAAc;SACd,eAAe;SACf,gBAAgB;SAChB;QACF;OACF,CAAC;MACH;MACA,OAAO,CAAC,GAAG,KAAK,OAAO,CAAC;KAC1B,CAAC;KACD,OAAO;MACL,SAAS,oBAAoB,SAAS,SAAS;MAC/C;MACA;MACA,SAAS;KACX;IACF,SAAS,OAAO;KACd,OAAO;MACL,SAAS,kCAAkC,aAAa,KAAK;MAC7D,WAAW,CAAC;MACZ,SAAS,CAAC;MACV,SAAS;KACX;IACF;GACF;EACF,CA+RgC;EAC9B,kBA9R0B,WAAW;GACrC,IAAI;GACJ,aAAa;;;GAGb,aAAa,EAAE,OAAO,EACpB,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,gDAAgD,EAClG,CAAC;GACD,cAAc;GACd,SAAS,OAAO,EAAE,OAAO,YAA4C;IACnE,MAAM,eAAe;IACrB,IAAI;KACF,IAAI,CAAC,eAAe,aAAa,KAAK,GAAG,OAAO,yBAAyB;KACzE,MAAM,kBAA4B,CAAC;KACnC,MAAM,yBAAmC,CAAC;KAC1C,MAAM,UAAoC,CAAC;KAK3C,MAAM,YAAY,MAAM,uBAAuB,eAAc,YAAW;MACtE,gBAAgB,SAAS;MACzB,uBAAuB,SAAS;MAChC,QAAQ,SAAS;MACjB,MAAM,OAAO,IAAI,IAAI,QAAQ,KAAI,SAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;MACzD,KAAK,MAAM,MAAM,IAAI,IAAI,GAAG,GAC1B,IAAI,KAAK,OAAO,EAAE,GAAG;OACnB,gBAAgB,KAAK,EAAE;OACvB,QAAQ,KAAK;QAAE,IAAI;QAAc;OAAG,CAAC;MACvC,OACE,uBAAuB,KAAK,EAAE;MAGlC,OAAO,CAAC,GAAG,KAAK,OAAO,CAAC;KAC1B,CAAC;KACD,OAAO;MACL,SAAS,uBAAuB,iBAAiB,wBAAwB,SAAS;MAClF;MACA;MACA;MACA;MACA,SAAS;KACX;IACF,SAAS,OAAO;KACd,OAAO;MACL,SAAS,qCAAqC,aAAa,KAAK;MAChE,WAAW,CAAC;MACZ,iBAAiB,CAAC;MAClB,wBAAwB,CAAC;MACzB,SAAS,CAAC;MACV,SAAS;KACX;IACF;GACF;EACF,CAwOsC;EACpC,mBAvO0B,WAAW;GACrC,IAAI;GACJ,aAAa;;;GAGb,aAAa,EAAE,OAAO;IACpB,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,oBAAoB;IACzD,SAAS,EACN,OAAO,CAAC,CACR,IAAI,CAAC,CAAC,CACN,SAAS,iFAAiF;IAC7F,UAAU,eAAe,QAAQ,QAAQ;IACzC,cAAc,EACX,QAAQ,CAAC,CACT,SAAS,+FAA+F;IAC3G,WAAW,EACR,OAAO,CAAC,CACR,IAAI,CAAC,CAAC,CACN,SAAS,CAAC,CACV,SACC,0HACF;IACF,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,wDAAwD;GACzG,CAAC;GACD,cAAc;GACd,SAAS,OACP,EAAE,UAAU,SAAS,SAAS,WAAW,UAAU,cAAc,WAAW,gBAAgB,WAC5F,YACmC;IACnC,MAAM,eAAe;IACrB,IAAI;KACF,IAAI,CAAC,eAAe,aAAa,KAAK,GACpC,OAAO;MAAE,SAAS;MAAiD,SAAS;KAAK;KAEnF,MAAM,QAAQ,MAAM,qBAAqB,YAAY;KACrD,IAAI,CAAC,MAAM,MAAK,SAAQ,KAAK,OAAO,QAAQ,GAC1C,OAAO;MACL,SAAS,mCAAmC;MAC5C;MACA,GAAI,UAAU,EAAE,cAAc,mBAA4B,IAAI,CAAC;MAC/D,SAAS;KACX;KAEF,MAAM,QAAQ,QAAQ,WAAW;KAEjC,MAAM,UAAS,MADS,SAAS,eAAe;MAAE,GAAG;MAAc,cAAc;KAAM,GAAG,KAAK,EAAA,CACtE,MAAK,SAAQ,KAAK,OAAO,QAAQ;KAC1D,IAAI,CAAC,QAAQ,gBACX,OAAO;MACL,SAAS,8DAA8D;MACvE,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;MAC3B;MACA,GAAI,UAAU,EAAE,cAAc,mBAA4B,IAAI,CAAC;MAC/D,SAAS;KACX;KAEF,IAAI,CAAC,OAAO,wBACV,OAAO;MACL,SAAS;MACT;MACA,SAAS;KACX;KAEF,MAAM,eAAe,aAAa;KAClC,MAAM,eAAe,aAAa;MAChC,SAAS,aAAa,WAAW,KAAA;MACjC,YAAY,aAAa;MACzB,UAAU,aAAa;KACzB,CAAC;KACD,MAAM,YAAY,kBAAkB,WAAW;KAC/C,MAAM,cAAc,uBAAuB;MAAE;MAAU;MAAS;MAAU;MAAc;KAAQ,CAAC;KAEjG,MAAM,gBAAe,MADK,qBAAqB,YAAY,EAAA,CAC1B,MAAK,WAAU,OAAO,cAAc,SAAS;KAC9E,IAAI,cAAc;MAChB,IAAI,aAAa,gBAAgB,aAC/B,OAAO;OACL,SAAS,cAAc,UAAU;OACjC;OACU;OACV;OACA;OACA;OACA;OACA,SAAS;MACX;MAEF,OAAO;OACL,SAAS,sBAAsB,UAAU,yBAAyB,mBAAmB,MAAM,EAAE;OAC7F;OACA,UAAU,aAAa;OACvB,cAAc,aAAa;OAC3B;OACA,SAAS,aAAa;OACtB,cAAc,aAAa;OAC3B,eAAe,aAAa;OAC5B,OAAO,aAAa;OACpB,WAAW;OACX,SAAS;MACX;KACF;KACA,MAAM,sBAAsB;MAC1B;MACA;MACA,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;MAC7B,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;MACvC,MAAM;OAAE,YAAY,aAAa;OAAY,UAAU,aAAa;MAAS;MAC7E;KACF;KACA,MAAM,eAAgB,MAAM,MAAM,uBAChC;MACE,QAAQ;MACR,UAAU;MACV,MAAM;MACI;MACV;MACA,WAAW,gBAAgB,aAAa,GAAG;MAC3C,YAAY;OACV;OACA;OACA,cAAc;OACd,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;OAC7B,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;MACzC;MACA,UAAU,EAAE,oBAAoB;MAChC,SAAS;KACX,GACA;MACE,YAAY,OAAO;MACnB,UAAU,OAAO;MACjB,QAAQ,aAAa,QAAQ,EAAE,UAAU,UAAU,IAAI;OAAE,UAAU;OAAQ,qBAAqB;MAAK;KACvG,CACF;KACA,IAAI,WAAW,aAAa,WAAW,MAAM,aAAa,WAAW,KAAA;KACrE,IAAI,CAAC,UAEH,IACE,aAAa,SAAS,WAAW,aACjC,aAAa,SAAS,WAAW,WACjC,aAAa,SAAS,WAAW,aACjC;MACA,IAAI,cAAc;OAChB,MAAM,aAAa;OACnB,OAAO;QACL,SAAS,mIAAmI,mBAAmB,MAAM,EAAE;QACvK;QACU;QACV;QACA;QACA;QACA;QACA,eAAe;QACf,SAAS;OACX;MACF;MACA,WAAW,EAAE,QAAQ,UAAU;KACjC,OAAO,IAAI,aAAa,SAAS,WAAW,WAC1C,WAAW,EAAE,QAAQ,UAAU;UAE/B,OAAO;MACL,SAAS,gCAAgC,aAAa,OAAO,qBAAqB;MAClF;MACU;MACV;MACA;MACA;MACA;MACA,SAAS;KACX;KAGJ,IAAI,SAAS,WAAW,aAAa,SAAS,WAAW,WAIvD,OAAO;MACL,SACE,SAAS,WAAW,YAChB,8CAA8C,kBAAkB,MAAM,EAAE,+FACxE,uFAAuF,mBAAmB,MAAM,EAAE;MACxH;MACU;MACV;MACA;MACA;MACA;MACA,eAAe,SAAS;MACxB,SAAS;KACX;KAEF,IAAI,SAAS,WAAW,WAAW,MAAM,aAAa;KACtD,MAAM,gBAAgB,SAAS;KAC/B,MAAM,QAAQ,WAAW,WAAW,SAAS,QAAQ,KAAA;KACrD,MAAM,sBAAsB,cAAc,CACxC;MACE;MACA;MACA;MACU;MACV;MACA;MACA;MACA;MACA;MACA,QAAQ,KAAK,IAAI;KACnB,CACF,CAAC;KACD,OAAO;MACL,SAAS,mBAAmB;OAC1B;OACU;OACV;MACF,CAAC;MACD;MACU;MACV;MACA;MACA;MACA;MACA;MACA;MACA,SAAS;KACX;IACF,SAAS,OAAO;KACd,OAAO;MAAE,SAAS,gCAAgC,aAAa,KAAK;MAAK,SAAS;KAAK;IACzF;GACF;EACF,CAMuC;CACvC;AACF;AAEA,SAAS,qBAAgD;CACvD,OAAO;EAAE,SAAS;EAAqD,OAAO,CAAC;EAAG,YAAY;EAAG,SAAS;CAAK;AACjH;AAEA,SAAS,wBAA4C;CACnD,OAAO;EAAE,SAAS;EAAqD,WAAW,CAAC;EAAG,SAAS,CAAC;EAAG,SAAS;CAAK;AACnH;AAEA,SAAS,2BAAkD;CACzD,OAAO;EACL,SAAS;EACT,WAAW,CAAC;EACZ,iBAAiB,CAAC;EAClB,wBAAwB,CAAC;EACzB,SAAS,CAAC;EACV,SAAS;CACX;AACF;AAEA,SAAS,mBACP,SACA,WACA,SACoB;CACpB,OAAO;EAAE;EAAS;EAAW;EAAS,SAAS;CAAK;AACtD;AAEA,SAAS,eAAe,OAAkE,YAA4B;CACpH,IAAI,MAAM,WAAW,GAAG,OAAO;CAW/B,OAAO,oEAVO,MAAM,KAAI,SAAQ;EAC9B,OAAO,MAAM,KAAK,cAAc,IAAI,uBAAuB;GACzD,IAAI,mBAAmB,KAAK,IAAA,GAAgC;GAC5D,OAAO,mBAAmB,KAAK,OAAA,GAAyC;GACxE,OAAO,mBAAmB,KAAK,OAAA,GAAyC;GACxE,YAAY,mBAAmB,KAAK,YAAA,GAAwC;GAC5E,UAAU,mBAAmB,KAAK,UAAA,GAAsC;GACxE,gBAAgB,KAAK;EACvB,CAAC;CACH,CAC+E,CAAC,CAAC,KAAK,IAAI,EAAE,WAAW;AACzG;AAEA,SAAS,oBAAoB,SAAmC,WAAyC;CACvG,IAAI,QAAQ,WAAW,GAAG,OAAO,qCAAqC,UAAU;CAChF,OAAO,aAAa,QAAQ,OAAO,QAAQ,QAAQ,WAAW,IAAI,KAAK,IAAI,IAAI,QAAQ,KAAI,WAAU,OAAO,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,kBAAkB,UAAU;AACzJ;AAEA,SAAS,uBACP,iBACA,wBACA,WACQ;CACR,MAAM,QAAQ,CACZ,gBAAgB,gBAAgB,OAAO,QAAQ,gBAAgB,WAAW,IAAI,KAAK,MAAM,gBAAgB,SAAS,IAAI,KAAK,gBAAgB,KAAK,IAAI,MAAM,GAAG,EAC/J;CACA,IAAI,uBAAuB,SAAS,GAClC,MAAM,KAAK,yBAAyB,uBAAuB,KAAK,IAAI,EAAE,EAAE;CAE1E,MAAM,KAAK,iBAAiB,UAAU,QAAQ;CAC9C,OAAO,MAAM,KAAK,GAAG;AACvB;AAEA,SAAS,mBAAmB,EAC1B,QACA,UACA,YAKS;CACT,MAAM,QAAQ,mBAAmB,MAAM;CACvC,QAAQ,UAAU,QAAlB;EACE,KAAK,QACH,OAAO,QAAQ,MAAM,UAAU,SAAS,iBAAiB,SAAS;EACpE,KAAK,WACH,OAAO,aAAa,SAAS,aAAa,MAAM,UAAU,SAAS;EACrE,KAAK,WACH,OAAO,aAAa,SAAS,cAAc,MAAM;EACnD,KAAK,WACH,OAAO,OAAO,SAAS,aAAa,MAAM;EAC5C,KAAK,WACH,OAAO,OAAO,SAAS,aAAa,MAAM,8BAA8B,kBAAkB,MAAM,EAAE;EACpG,SACE,OAAO,8CAA8C;CACzD;AACF;AAEA,SAAS,kBAAkB,QAA+B;CACxD,OAAO,uBAAuB,mBAAmB,OAAO,UAAA,GAAsC,CAAC;AACjG;AAEA,SAAS,mBAAmB,QAA+B;CACzD,OAAO,uBACL,mBAAmB,OAAO,SAAS,OAAO,SAAS,OAAO,IAAA,GAAsC,CAClG;AACF;AAEA,SAAS,uBAAuB,OAMrB;CACT,OAAO,WAAW,QAAQ,CAAC,CACxB,OAAO,KAAK,UAAU,cAAc,KAAK,CAAC,CAAC,CAAC,CAC5C,OAAO,KAAK;AACjB;AAEA,SAAS,cAAc,OAAyB;CAC9C,IAAI,MAAM,QAAQ,KAAK,GAAG,OAAO,MAAM,IAAI,aAAa;CACxD,IAAI,CAAC,SAAS,OAAO,UAAU,UAAU,OAAO;CAChD,OAAO,OAAO,YACZ,OAAO,QAAQ,KAAK,CAAC,CAClB,MAAM,CAAC,OAAO,CAAC,WAAW,KAAK,cAAc,KAAK,CAAC,CAAC,CACpD,KAAK,CAAC,KAAK,iBAAiB,CAAC,KAAK,cAAc,WAAW,CAAC,CAAC,CAClE;AACF;AAEA,SAAS,aAAa,OAAwB;CAC5C,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAClD"}
@@ -1 +1 @@
1
- {"version":3,"file":"mastracode-gateway.d.ts","sourceRoot":"","sources":["../../src/agents/mastracode-gateway.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mastracode-gateway.d.ts","sourceRoot":"","sources":["../../src/agents/mastracode-gateway.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,11 @@
1
1
  import { getAppDataDir } from "../utils/project.js";
2
2
  import { AuthStorage } from "../auth/storage.js";
3
- import { THINKING_LEVEL_TO_REASONING_EFFORT, buildOpenAICodexOAuthFetch, createCodexMiddleware, getEffectiveThinkingLevel, openaiCodexProvider } from "../providers/openai-codex.js";
3
+ import { THINKING_LEVEL_TO_REASONING_EFFORT, buildOpenAICodexOAuthFetch, createCodexMiddleware, createReasoningEffortMiddleware, getEffectiveThinkingLevel, openaiCodexProvider } from "../providers/openai-codex.js";
4
4
  import { getCustomProviderId, loadSettings } from "../onboarding/settings.js";
5
5
  import { resolveCustomProviders } from "./custom-provider-source.js";
6
6
  import { buildAnthropicOAuthFetch, claudeCodeMiddleware, createAnthropicThinkingMiddleware, opencodeClaudeMaxProvider, promptCacheMiddleware } from "../providers/claude-max.js";
7
7
  import { getCopilotModelCatalog, githubCopilotProvider } from "../providers/github-copilot.js";
8
+ import { createGoogleThinkingMiddleware } from "../providers/google-thinking.js";
8
9
  import { KIMI_CODING_MODELS, kimiCodingProvider } from "../providers/kimi-coding.js";
9
10
  import { xaiProvider } from "../providers/xai.js";
10
11
  import { createOpenAI } from "@ai-sdk/openai";
@@ -94,14 +95,16 @@ function anthropicApiKeyProvider(modelId, apiKey, headers, thinkingLevel) {
94
95
  middleware: [promptCacheMiddleware, ...thinkingMiddleware ? [thinkingMiddleware] : []]
95
96
  });
96
97
  }
97
- function openaiApiKeyProvider(modelId, apiKey, headers) {
98
+ function openaiApiKeyProvider(modelId, apiKey, headers, thinkingLevel) {
99
+ const openai = createOpenAI({
100
+ apiKey,
101
+ baseURL: process.env.OPENAI_BASE_URL,
102
+ headers
103
+ });
104
+ const middleware = thinkingLevel && thinkingLevel !== "off" ? createReasoningEffortMiddleware("openai", THINKING_LEVEL_TO_REASONING_EFFORT[getEffectiveThinkingLevel(modelId, thinkingLevel)]) : void 0;
98
105
  return wrapLanguageModel({
99
- model: createOpenAI({
100
- apiKey,
101
- baseURL: process.env.OPENAI_BASE_URL,
102
- headers
103
- }).responses(modelId),
104
- middleware: []
106
+ model: openai.responses(modelId),
107
+ middleware: middleware ? [middleware] : []
105
108
  });
106
109
  }
107
110
  function getAuthProviderId(providerId) {
@@ -324,12 +327,21 @@ var MastraCodeGateway = class MastraCodeGateway extends MastraModelGateway {
324
327
  }
325
328
  resolveLanguageModel(args) {
326
329
  const customProvider = this.#getCustomProviders().find((provider) => args.providerId === getCustomProviderId(provider.name));
327
- if (customProvider) return createOpenAICompatible({
328
- name: args.providerId,
329
- baseURL: customProvider.url,
330
- apiKey: args.apiKey,
331
- headers: args.headers
332
- }).chatModel(args.modelId);
330
+ if (customProvider) {
331
+ const provider = createOpenAICompatible({
332
+ name: args.providerId,
333
+ baseURL: customProvider.url,
334
+ apiKey: args.apiKey,
335
+ headers: args.headers
336
+ });
337
+ const reasoningEffort = this.#thinkingLevel ? THINKING_LEVEL_TO_REASONING_EFFORT[this.#thinkingLevel] : void 0;
338
+ const middleware = createReasoningEffortMiddleware(args.providerId, reasoningEffort);
339
+ if (!middleware) return provider.chatModel(args.modelId);
340
+ return wrapLanguageModel({
341
+ model: provider.chatModel(args.modelId),
342
+ middleware: [middleware]
343
+ });
344
+ }
333
345
  if (args.providerId === "github-copilot") return githubCopilotProvider(args.modelId, {
334
346
  headers: args.headers,
335
347
  authStorage: this.#credentials
@@ -353,6 +365,7 @@ var MastraCodeGateway = class MastraCodeGateway extends MastraModelGateway {
353
365
  headers: args.headers,
354
366
  authStorage: this.#credentials
355
367
  });
368
+ if (args.providerId === "google") return this.#resolveGoogleModel(args);
356
369
  if (this.#routeThroughMastraGateway) return this.#mastraGateway.resolveLanguageModel(args);
357
370
  if (args.providerId === "kimi-for-coding") return kimiCodingProvider(args.modelId, {
358
371
  apiKey: args.apiKey,
@@ -441,7 +454,20 @@ var MastraCodeGateway = class MastraCodeGateway extends MastraModelGateway {
441
454
  authStorage: this.#credentials
442
455
  });
443
456
  const apiKey = getOpenAIApiKey(this.#credentials);
444
- if (apiKey) return openaiApiKeyProvider(args.modelId, apiKey, args.headers);
457
+ if (apiKey) return openaiApiKeyProvider(args.modelId, apiKey, args.headers, this.#thinkingLevel);
458
+ }
459
+ #resolveGoogleModel(args) {
460
+ const baseModel = this.#routeThroughMastraGateway ? this.#mastraGateway.resolveLanguageModel(args) : new ModelRouterLanguageModel({
461
+ id: `${args.providerId}/${args.modelId}`,
462
+ apiKey: args.apiKey,
463
+ headers: args.headers
464
+ });
465
+ const thinkingMiddleware = createGoogleThinkingMiddleware(args.modelId, this.#thinkingLevel);
466
+ if (!thinkingMiddleware) return baseModel;
467
+ return wrapLanguageModel({
468
+ model: baseModel,
469
+ middleware: [thinkingMiddleware]
470
+ });
445
471
  }
446
472
  };
447
473
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"mastracode-gateway.js","names":["#mastraGateway","#mastraGatewayBaseUrl","#mastraGatewayApiKey","#routeThroughMastraGateway","#thinkingLevel","#customProviders","#settingsPath","#credentials","#getCustomProviders","#resolveAnthropicModel","#resolveOpenAIModel"],"sources":["../../src/agents/mastracode-gateway.ts"],"sourcesContent":["import { createAnthropic } from '@ai-sdk/anthropic';\nimport { createOpenAI } from '@ai-sdk/openai';\nimport { createOpenAICompatible } from '@ai-sdk/openai-compatible';\nimport type { CustomAvailableModel, CustomModelCatalogProvider } from '@mastra/core/agent-controller';\nimport {\n GATEWAY_AUTH_HEADER,\n MastraGateway,\n MastraModelGateway,\n ModelRouterLanguageModel,\n PROVIDER_REGISTRY,\n} from '@mastra/core/llm';\nimport type {\n GatewayAuthRequest,\n GatewayAuthResult,\n GatewayLanguageModel,\n MastraModelGatewayInterface,\n ProviderConfig,\n} from '@mastra/core/llm';\nimport { wrapLanguageModel } from 'ai';\nimport { AuthStorage } from '../auth/storage.js';\nimport type { CredentialStore } from '../auth/types.js';\nimport { getCustomProviderId, loadSettings, MASTRA_GATEWAY_PROVIDER } from '../onboarding/settings.js';\nimport {\n buildAnthropicOAuthFetch,\n claudeCodeMiddleware,\n createAnthropicThinkingMiddleware,\n opencodeClaudeMaxProvider,\n promptCacheMiddleware,\n} from '../providers/claude-max.js';\nimport { getCopilotModelCatalog, githubCopilotProvider } from '../providers/github-copilot.js';\nimport { KIMI_CODING_MODELS, kimiCodingProvider } from '../providers/kimi-coding.js';\nimport {\n buildOpenAICodexOAuthFetch,\n createCodexMiddleware,\n getEffectiveThinkingLevel,\n openaiCodexProvider,\n THINKING_LEVEL_TO_REASONING_EFFORT,\n} from '../providers/openai-codex.js';\nimport type { ThinkingLevel } from '../providers/openai-codex.js';\nimport { xaiProvider } from '../providers/xai.js';\nimport { getAppDataDir } from '../utils/project.js';\nimport { resolveCustomProviders } from './custom-provider-source.js';\n\nexport const OPENAI_PREFIX = 'openai/';\nexport const MASTRA_GATEWAY_PREFIX = 'mastra/';\nexport const MASTRACODE_GATEWAY_ID = 'mastracode';\n\nconst CODEX_OPENAI_MODEL_REMAPS: Record<string, string> = {\n 'gpt-5.3': 'gpt-5.3-codex',\n 'gpt-5.2': 'gpt-5.2-codex',\n 'gpt-5.1': 'gpt-5.1-codex',\n 'gpt-5.1-mini': 'gpt-5.1-codex-mini',\n 'gpt-5': 'gpt-5-codex',\n};\n\ntype ModelRequestHeaders = Record<string, string>;\n\nexport type MastraCodeCustomProvider = { name: string; url: string; apiKey?: string; models?: string[] };\n\nexport type MastraCodeGatewayOptions = {\n mastraGatewayBaseUrl: string;\n mastraGatewayApiKey?: string;\n routeThroughMastraGateway: boolean;\n thinkingLevel?: ThinkingLevel;\n customProviders?: MastraCodeCustomProvider[];\n settingsPath?: string;\n /**\n * Per-tenant credential source for this gateway instance. Defaults to the\n * server-global file-backed `AuthStorage`; deployed web passes the calling\n * tenant's store so model calls use the caller's own credentials.\n */\n credentialStore?: CredentialStore;\n};\n\n/**\n * Global file-backed credential store for local (TUI) model resolution.\n *\n * Constructed lazily, NOT at module scope: `AuthStorage`'s default path is\n * resolved from `MASTRA_APP_DATA_DIR` at construction, and this module is\n * routinely imported before test harnesses / embedders point that variable at\n * an isolated directory — an import-time construction would permanently pin\n * the developer's real app-data dir for every credential read.\n */\nlet authStorageSingleton: AuthStorage | undefined;\nlet authStorageSingletonDir: string | undefined;\n\nexport function getGlobalAuthStorage(): AuthStorage {\n // Keyed by the resolved app-data dir: in-process harnesses re-point\n // MASTRA_APP_DATA_DIR per run inside one long-lived worker, so a store\n // pinned to a previous dir must be discarded, not reused.\n const dir = getAppDataDir();\n if (!authStorageSingleton || authStorageSingletonDir !== dir) {\n authStorageSingleton = new AuthStorage();\n authStorageSingletonDir = dir;\n }\n return authStorageSingleton;\n}\n\nexport function reloadAuthStorage() {\n getGlobalAuthStorage().reload();\n}\n\nexport function stripMastraGatewayPrefix(modelId: string): string {\n return modelId.startsWith(MASTRA_GATEWAY_PREFIX) ? modelId.substring(MASTRA_GATEWAY_PREFIX.length) : modelId;\n}\n\nfunction normalizeAnthropicModelId(modelId: string): string {\n return modelId.replace(/\\.(?=\\d)/g, '-');\n}\n\nexport function remapOpenAIModelForCodexOAuth(modelId: string): string {\n const normalizedModelId = stripMastraGatewayPrefix(modelId);\n\n if (!normalizedModelId.startsWith(OPENAI_PREFIX)) {\n return modelId;\n }\n\n const openaiModelId = normalizedModelId.substring(OPENAI_PREFIX.length);\n\n if (openaiModelId.includes('-codex')) {\n return modelId;\n }\n\n const codexModelId = CODEX_OPENAI_MODEL_REMAPS[openaiModelId];\n if (!codexModelId) {\n return modelId;\n }\n\n const remappedModelId = `${OPENAI_PREFIX}${codexModelId}`;\n return modelId.startsWith(MASTRA_GATEWAY_PREFIX) ? `${MASTRA_GATEWAY_PREFIX}${remappedModelId}` : remappedModelId;\n}\n\n/**\n * Resolve the Anthropic API key.\n * Main slot → dedicated apikey: slot → env var.\n */\nexport function getAnthropicApiKey(credentials: CredentialStore = getGlobalAuthStorage()): string | undefined {\n const storedCred = credentials.get('anthropic');\n if (storedCred?.type === 'api_key' && storedCred.key.trim().length > 0) {\n return storedCred.key.trim();\n }\n const dedicatedKey = credentials.getStoredApiKey('anthropic')?.trim();\n if (dedicatedKey) return dedicatedKey;\n return credentials.allowEnvironmentFallback === false\n ? undefined\n : process.env.ANTHROPIC_API_KEY?.trim() || undefined;\n}\n\n/**\n * Resolve the OpenAI API key.\n * Main slot → dedicated apikey: slot → env var.\n */\nexport function getOpenAIApiKey(credentials: CredentialStore = getGlobalAuthStorage()): string | undefined {\n const storedCred = credentials.get('openai-codex');\n if (storedCred?.type === 'api_key' && storedCred.key.trim().length > 0) {\n return storedCred.key.trim();\n }\n const dedicatedKey = credentials.getStoredApiKey('openai-codex')?.trim();\n if (dedicatedKey) return dedicatedKey;\n return credentials.allowEnvironmentFallback === false ? undefined : process.env.OPENAI_API_KEY?.trim() || undefined;\n}\n\nfunction anthropicApiKeyProvider(\n modelId: string,\n apiKey: string,\n headers?: ModelRequestHeaders,\n thinkingLevel?: ThinkingLevel,\n) {\n const anthropic = createAnthropic({ apiKey, headers });\n const thinkingMiddleware = createAnthropicThinkingMiddleware(modelId, thinkingLevel);\n return wrapLanguageModel({\n model: anthropic(modelId),\n middleware: [promptCacheMiddleware, ...(thinkingMiddleware ? [thinkingMiddleware] : [])],\n });\n}\n\nfunction openaiApiKeyProvider(modelId: string, apiKey: string, headers?: ModelRequestHeaders) {\n const openai = createOpenAI({ apiKey, baseURL: process.env.OPENAI_BASE_URL, headers });\n return wrapLanguageModel({\n model: openai.responses(modelId),\n middleware: [],\n });\n}\n\nfunction getAuthProviderId(providerId: string): string {\n return providerId === 'openai' ? 'openai-codex' : providerId;\n}\n\nfunction getProviderAuthKey(\n providerId: string,\n credentials: CredentialStore = getGlobalAuthStorage(),\n): string | undefined {\n const authProviderId = getAuthProviderId(providerId);\n const storedCred = credentials.get(authProviderId);\n if (storedCred?.type === 'api_key' && storedCred.key.trim().length > 0) {\n return storedCred.key.trim();\n }\n const dedicatedKey = credentials.getStoredApiKey(authProviderId)?.trim();\n if (dedicatedKey) return dedicatedKey;\n if (credentials.allowEnvironmentFallback === false) return undefined;\n return authProviderId === 'kimi-for-coding' ? process.env.KIMI_API_KEY?.trim() || undefined : undefined;\n}\n\nexport function resolveAuth(request: GatewayAuthRequest, mastraGatewayApiKey?: string): GatewayAuthResult | undefined {\n return MastraCodeGateway.resolveProviderAuth(request, mastraGatewayApiKey);\n}\n\nfunction getGatewayProviderKey(gatewayId: string, providerId: string): string {\n if (gatewayId === 'models.dev') return providerId;\n return providerId === gatewayId ? gatewayId : `${gatewayId}/${providerId}`;\n}\n\nfunction parseGatewayRouterId(\n routerId: string,\n gateway: MastraModelGatewayInterface,\n): { gatewayId: string; providerId: string; modelId: string } {\n const [firstPart = '', secondPart = '', ...restParts] = routerId.split('/');\n const gatewayId = gateway.id;\n\n if (firstPart === gatewayId && secondPart) {\n return {\n gatewayId,\n providerId: secondPart,\n modelId: restParts.join('/'),\n };\n }\n\n return {\n gatewayId,\n providerId: firstPart,\n modelId: [secondPart, ...restParts].filter(Boolean).join('/'),\n };\n}\n\nfunction hasResolvedAuth(auth: GatewayAuthResult | undefined): boolean {\n if (!auth) return false;\n if (auth.apiKey || auth.bearerToken) return true;\n return auth.headers ? Object.keys(auth.headers).length > 0 : false;\n}\n\nasync function resolveGatewayProviderAuth(\n gateway: MastraModelGatewayInterface,\n routerId: string,\n): Promise<GatewayAuthResult | undefined> {\n if (!gateway.resolveAuth) return undefined;\n\n const parsed = parseGatewayRouterId(routerId, gateway);\n try {\n const result = await gateway.resolveAuth({\n gatewayId: parsed.gatewayId,\n providerId: parsed.providerId,\n modelId: parsed.modelId,\n routerId,\n });\n return hasResolvedAuth(result) ? result : undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function getMastraCodeProviderConfigs(\n gateway: MastraModelGatewayInterface,\n): Promise<Record<string, ProviderConfig>> {\n const providers: Record<string, ProviderConfig> = { ...(PROVIDER_REGISTRY as Record<string, ProviderConfig>) };\n\n try {\n const gatewayProviders = await gateway.fetchProviders();\n for (const [providerId, config] of Object.entries(gatewayProviders)) {\n providers[getGatewayProviderKey(gateway.id, providerId)] = {\n ...config,\n gateway: gateway.id,\n };\n }\n } catch (error) {\n console.warn(`Failed to load providers from gateway ${gateway.id}:`, error);\n }\n\n return providers;\n}\n\nfunction getApiKeyEnvVar(providerConfig: Pick<ProviderConfig, 'apiKeyEnvVar'> | undefined): string | undefined {\n const envVars = providerConfig?.apiKeyEnvVar;\n return Array.isArray(envVars) ? envVars[0] : envVars;\n}\n\nexport class MastraCodeGateway extends MastraModelGateway {\n readonly id = MASTRACODE_GATEWAY_ID;\n readonly name = 'MastraCode Gateway';\n\n readonly #mastraGateway: MastraGateway;\n readonly #mastraGatewayBaseUrl: string;\n readonly #mastraGatewayApiKey?: string;\n readonly #routeThroughMastraGateway: boolean;\n readonly #thinkingLevel?: ThinkingLevel;\n readonly #customProviders?: MastraCodeCustomProvider[];\n readonly #settingsPath?: string;\n readonly #credentials: CredentialStore;\n\n constructor({\n mastraGatewayBaseUrl,\n mastraGatewayApiKey,\n routeThroughMastraGateway,\n thinkingLevel,\n customProviders,\n settingsPath,\n credentialStore,\n }: MastraCodeGatewayOptions) {\n super();\n this.#mastraGateway = new MastraGateway({ baseUrl: mastraGatewayBaseUrl });\n this.#mastraGatewayBaseUrl = mastraGatewayBaseUrl;\n this.#mastraGatewayApiKey = mastraGatewayApiKey;\n this.#routeThroughMastraGateway = routeThroughMastraGateway;\n this.#thinkingLevel = thinkingLevel;\n this.#customProviders = customProviders;\n this.#settingsPath = settingsPath;\n this.#credentials = credentialStore ?? getGlobalAuthStorage();\n }\n\n static getMastraGatewayApiKey(): string | undefined {\n return getGlobalAuthStorage().getStoredApiKey(MASTRA_GATEWAY_PROVIDER) ?? process.env['MASTRA_GATEWAY_API_KEY'];\n }\n\n /** @deprecated Renamed to {@link MastraCodeGateway.getMastraGatewayApiKey}. */\n static getMemoryGatewayApiKey(): string | undefined {\n return MastraCodeGateway.getMastraGatewayApiKey();\n }\n\n /**\n * Claim an unprefixed model id (e.g. a bare `anthropic/...`) when this gateway\n * can authenticate it via OAuth or a stored/env credential. This lets the\n * shared gateway router select MastraCode for auth resolution, so the status\n * bar and `/api-keys` reflect OAuth logins instead of only checking env vars.\n */\n handlesModel(modelId: string): boolean {\n const parsed = parseGatewayRouterId(modelId, this);\n if (!parsed.providerId || !parsed.modelId) return false;\n if (this.#routeThroughMastraGateway && this.#mastraGatewayApiKey) return true;\n const customProvider = this.#getCustomProviders().find(\n provider => parsed.providerId === getCustomProviderId(provider.name),\n );\n if (customProvider?.apiKey) return true;\n return hasResolvedAuth(\n MastraCodeGateway.resolveProviderAuth(\n {\n gatewayId: this.id,\n providerId: parsed.providerId,\n modelId: parsed.modelId,\n routerId: modelId,\n },\n undefined,\n this.#credentials,\n ),\n );\n }\n\n static resolveProviderAuth(\n request: GatewayAuthRequest,\n mastraGatewayApiKey?: string,\n credentials: CredentialStore = getGlobalAuthStorage(),\n ): GatewayAuthResult | undefined {\n if (request.gatewayId === 'mastra' && mastraGatewayApiKey) {\n return { apiKey: mastraGatewayApiKey, source: 'gateway' };\n }\n\n const authProviderId = getAuthProviderId(request.providerId);\n const storedCred = credentials.get(authProviderId);\n if (storedCred?.type === 'oauth') {\n return { bearerToken: 'oauth', source: 'gateway' };\n }\n\n const apiKey = getProviderAuthKey(request.providerId, credentials);\n return apiKey ? { apiKey, source: 'gateway' } : undefined;\n }\n\n static createModelCatalogProvider(gateway: MastraModelGatewayInterface): CustomModelCatalogProvider {\n return async () => {\n const registry = await getMastraCodeProviderConfigs(gateway);\n const models: CustomAvailableModel[] = [];\n\n for (const [provider, providerConfig] of Object.entries(registry)) {\n const apiKeyEnvVar = getApiKeyEnvVar(providerConfig);\n const hasEnvKey = apiKeyEnvVar ? Boolean(process.env[apiKeyEnvVar]) : false;\n const modelNames = providerConfig.models;\n if (!Array.isArray(modelNames)) continue;\n\n const gatewayAuth = modelNames[0]\n ? await resolveGatewayProviderAuth(gateway, `${provider}/${modelNames[0]}`)\n : undefined;\n\n for (const modelName of modelNames) {\n const id = `${provider}/${modelName}`;\n models.push({\n id,\n provider,\n modelName,\n hasApiKey: hasEnvKey || Boolean(gatewayAuth),\n apiKeyEnvVar: apiKeyEnvVar || undefined,\n });\n }\n }\n\n return models;\n };\n }\n\n createModelCatalogProvider(): CustomModelCatalogProvider {\n return MastraCodeGateway.createModelCatalogProvider(this);\n }\n\n #getCustomProviders(): MastraCodeCustomProvider[] {\n // Explicit constructor list wins; then a registered source (deployed web,\n // DB-backed — authoritative, so settings.json is never consulted); then\n // the local file-backed settings.\n return this.#customProviders ?? resolveCustomProviders() ?? loadSettings(this.#settingsPath).customProviders;\n }\n\n async fetchProviders(): Promise<Record<string, ProviderConfig>> {\n const providers: Record<string, ProviderConfig> = {};\n for (const provider of this.#getCustomProviders()) {\n const models = provider.models ?? [];\n if (!models.length) continue;\n providers[getCustomProviderId(provider.name)] = {\n name: provider.name,\n url: provider.url,\n apiKeyEnvVar: '',\n apiKeyHeader: 'Authorization',\n gateway: this.id,\n models,\n };\n }\n\n providers['kimi-for-coding'] = {\n name: 'Kimi For Coding',\n apiKeyEnvVar: 'KIMI_API_KEY',\n apiKeyHeader: 'Authorization',\n gateway: this.id,\n models: [...KIMI_CODING_MODELS],\n };\n\n try {\n const copilotModels = await getCopilotModelCatalog({ authStorage: this.#credentials });\n providers['github-copilot'] = {\n name: 'GitHub Copilot',\n apiKeyEnvVar: '',\n apiKeyHeader: 'Authorization',\n gateway: this.id,\n models: copilotModels.map(model => model.id),\n };\n } catch (error) {\n console.warn('Failed to load GitHub Copilot model catalog:', error);\n }\n\n return providers;\n }\n\n buildUrl(modelId: string): string | undefined | Promise<string | undefined> {\n return this.#routeThroughMastraGateway ? this.#mastraGateway.buildUrl(modelId) : modelId;\n }\n\n async getApiKey(modelId: string): Promise<string> {\n const providerId = stripMastraGatewayPrefix(modelId).split('/', 1)[0];\n if (this.#routeThroughMastraGateway) return this.#mastraGatewayApiKey ?? '';\n return providerId ? (getProviderAuthKey(providerId, this.#credentials) ?? '') : '';\n }\n\n resolveAuth(request: GatewayAuthRequest): GatewayAuthResult | undefined {\n if (this.#routeThroughMastraGateway && this.#mastraGatewayApiKey) {\n return { apiKey: this.#mastraGatewayApiKey, source: 'gateway' };\n }\n\n const customProvider = this.#getCustomProviders().find(\n provider => request.providerId === getCustomProviderId(provider.name),\n );\n if (customProvider?.apiKey) {\n return { apiKey: customProvider.apiKey, source: 'gateway' };\n }\n\n return MastraCodeGateway.resolveProviderAuth(request, undefined, this.#credentials);\n }\n\n resolveLanguageModel(args: {\n modelId: string;\n providerId: string;\n apiKey: string;\n headers?: Record<string, string>;\n transport?: any;\n responsesWebSocket?: any;\n }): GatewayLanguageModel {\n const customProvider = this.#getCustomProviders().find(\n provider => args.providerId === getCustomProviderId(provider.name),\n );\n if (customProvider) {\n const provider = createOpenAICompatible({\n name: args.providerId,\n baseURL: customProvider.url,\n apiKey: args.apiKey,\n headers: args.headers,\n });\n return provider.chatModel(args.modelId) as unknown as GatewayLanguageModel;\n }\n\n if (args.providerId === 'github-copilot') {\n return githubCopilotProvider(args.modelId, {\n headers: args.headers,\n authStorage: this.#credentials,\n }) as unknown as GatewayLanguageModel;\n }\n\n if (args.providerId === 'moonshotai') {\n // Prefer the gateway-resolved key (stored credentials), then the canonical\n // registry env var. Keep the legacy typo name as a fallback for anyone who\n // set it because of the previous error message.\n const apiKey =\n args.apiKey?.trim() || process.env.MOONSHOT_API_KEY?.trim() || process.env.MOONSHOT_AI_API_KEY?.trim();\n if (!apiKey) {\n throw new Error('Need MOONSHOT_API_KEY');\n }\n return createAnthropic({\n apiKey,\n baseURL: 'https://api.moonshot.ai/anthropic/v1',\n name: 'moonshotai.anthropicv1',\n headers: args.headers,\n })(args.modelId) as unknown as GatewayLanguageModel;\n }\n\n if (args.providerId === 'anthropic') {\n return this.#resolveAnthropicModel(args);\n }\n\n if (args.providerId === 'openai') {\n const openaiModel = this.#resolveOpenAIModel(args);\n if (openaiModel) return openaiModel;\n }\n\n if (args.providerId === 'xai' && this.#credentials.get('xai')?.type === 'oauth') {\n return xaiProvider(args.modelId, {\n headers: args.headers,\n authStorage: this.#credentials,\n }) as unknown as GatewayLanguageModel;\n }\n\n if (this.#routeThroughMastraGateway) {\n return this.#mastraGateway.resolveLanguageModel(args) as GatewayLanguageModel;\n }\n\n if (args.providerId === 'kimi-for-coding') {\n return kimiCodingProvider(args.modelId, {\n apiKey: args.apiKey,\n headers: args.headers,\n credentialStore: this.#credentials,\n }) as unknown as GatewayLanguageModel;\n }\n\n return new ModelRouterLanguageModel({\n id: `${args.providerId}/${args.modelId}` as `${string}/${string}`,\n apiKey: args.apiKey,\n headers: args.headers,\n }) as unknown as GatewayLanguageModel;\n }\n\n #resolveAnthropicModel(args: {\n modelId: string;\n providerId: string;\n apiKey: string;\n headers?: Record<string, string>;\n transport?: any;\n responsesWebSocket?: any;\n }): GatewayLanguageModel {\n const bareModelId = normalizeAnthropicModelId(args.modelId);\n const storedCred = this.#credentials.get('anthropic');\n const thinkingMiddleware = createAnthropicThinkingMiddleware(bareModelId, this.#thinkingLevel);\n\n if (this.#routeThroughMastraGateway) {\n if (storedCred?.type === 'oauth') {\n const anthropic = createAnthropic({\n apiKey: 'oauth-gateway-placeholder',\n baseURL: `${this.#mastraGatewayBaseUrl}/v1`,\n headers: {\n [GATEWAY_AUTH_HEADER]: `Bearer ${args.apiKey}`,\n ...args.headers,\n },\n fetch: buildAnthropicOAuthFetch({ authStorage: this.#credentials }) as any,\n });\n\n return wrapLanguageModel({\n model: anthropic(bareModelId),\n middleware: [\n claudeCodeMiddleware,\n promptCacheMiddleware,\n ...(thinkingMiddleware ? [thinkingMiddleware] : []),\n ],\n }) as unknown as GatewayLanguageModel;\n }\n\n const gatewayModel = this.#mastraGateway.resolveLanguageModel({\n ...args,\n modelId: bareModelId,\n }) as GatewayLanguageModel;\n if (!thinkingMiddleware) return gatewayModel;\n return wrapLanguageModel({\n model: gatewayModel as any,\n middleware: [thinkingMiddleware],\n }) as unknown as GatewayLanguageModel;\n }\n\n if (storedCred?.type === 'oauth') {\n return opencodeClaudeMaxProvider(bareModelId, {\n headers: args.headers,\n authStorage: this.#credentials,\n thinkingLevel: this.#thinkingLevel,\n }) as unknown as GatewayLanguageModel;\n }\n\n if (storedCred?.type === 'api_key' && storedCred.key.trim().length > 0) {\n return anthropicApiKeyProvider(\n bareModelId,\n storedCred.key.trim(),\n args.headers,\n this.#thinkingLevel,\n ) as unknown as GatewayLanguageModel;\n }\n\n const apiKey = getAnthropicApiKey(this.#credentials);\n if (apiKey) {\n return anthropicApiKeyProvider(\n bareModelId,\n apiKey,\n args.headers,\n this.#thinkingLevel,\n ) as unknown as GatewayLanguageModel;\n }\n\n // No stored credentials: use the OAuth-backed provider so the first request can trigger login.\n return opencodeClaudeMaxProvider(bareModelId, {\n headers: args.headers,\n authStorage: this.#credentials,\n thinkingLevel: this.#thinkingLevel,\n }) as unknown as GatewayLanguageModel;\n }\n\n #resolveOpenAIModel(args: {\n modelId: string;\n providerId: string;\n apiKey: string;\n headers?: Record<string, string>;\n transport?: any;\n responsesWebSocket?: any;\n }): GatewayLanguageModel | undefined {\n const storedCred = this.#credentials.get('openai-codex');\n\n if (this.#routeThroughMastraGateway) {\n if (storedCred?.type === 'oauth') {\n const resolvedModelId = remapOpenAIModelForCodexOAuth(`openai/${args.modelId}`);\n const resolvedBareModelId = resolvedModelId.substring(OPENAI_PREFIX.length);\n const requestedLevel: ThinkingLevel = this.#thinkingLevel ?? 'medium';\n const effectiveLevel = getEffectiveThinkingLevel(resolvedBareModelId, requestedLevel);\n const reasoningEffort = THINKING_LEVEL_TO_REASONING_EFFORT[effectiveLevel];\n const middleware = createCodexMiddleware(reasoningEffort);\n const openai = createOpenAI({\n apiKey: 'oauth-gateway-placeholder',\n baseURL: `${this.#mastraGatewayBaseUrl}/v1`,\n headers: {\n [GATEWAY_AUTH_HEADER]: `Bearer ${args.apiKey}`,\n ...args.headers,\n },\n fetch: buildOpenAICodexOAuthFetch({ authStorage: this.#credentials, rewriteUrl: false }) as any,\n });\n\n return wrapLanguageModel({\n model: openai.responses(resolvedBareModelId),\n middleware: [middleware],\n }) as unknown as GatewayLanguageModel;\n }\n\n return this.#mastraGateway.resolveLanguageModel(args) as GatewayLanguageModel;\n }\n\n if (storedCred?.type === 'oauth') {\n const resolvedModelId = remapOpenAIModelForCodexOAuth(`openai/${args.modelId}`);\n return openaiCodexProvider(resolvedModelId.substring(OPENAI_PREFIX.length), {\n thinkingLevel: this.#thinkingLevel,\n headers: args.headers,\n authStorage: this.#credentials,\n }) as unknown as GatewayLanguageModel;\n }\n\n const apiKey = getOpenAIApiKey(this.#credentials);\n if (apiKey) {\n return openaiApiKeyProvider(args.modelId, apiKey, args.headers) as unknown as GatewayLanguageModel;\n }\n\n return undefined;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"mastracode-gateway.js","names":["#mastraGateway","#mastraGatewayBaseUrl","#mastraGatewayApiKey","#routeThroughMastraGateway","#thinkingLevel","#customProviders","#settingsPath","#credentials","#getCustomProviders","#resolveAnthropicModel","#resolveOpenAIModel","#resolveGoogleModel"],"sources":["../../src/agents/mastracode-gateway.ts"],"sourcesContent":["import { createAnthropic } from '@ai-sdk/anthropic';\nimport { createOpenAI } from '@ai-sdk/openai';\nimport { createOpenAICompatible } from '@ai-sdk/openai-compatible';\nimport type { CustomAvailableModel, CustomModelCatalogProvider } from '@mastra/core/agent-controller';\nimport {\n GATEWAY_AUTH_HEADER,\n MastraGateway,\n MastraModelGateway,\n ModelRouterLanguageModel,\n PROVIDER_REGISTRY,\n} from '@mastra/core/llm';\nimport type {\n GatewayAuthRequest,\n GatewayAuthResult,\n GatewayLanguageModel,\n MastraModelGatewayInterface,\n ProviderConfig,\n} from '@mastra/core/llm';\nimport { wrapLanguageModel } from 'ai';\nimport { AuthStorage } from '../auth/storage.js';\nimport type { CredentialStore } from '../auth/types.js';\nimport { getCustomProviderId, loadSettings, MASTRA_GATEWAY_PROVIDER } from '../onboarding/settings.js';\nimport {\n buildAnthropicOAuthFetch,\n claudeCodeMiddleware,\n createAnthropicThinkingMiddleware,\n opencodeClaudeMaxProvider,\n promptCacheMiddleware,\n} from '../providers/claude-max.js';\nimport { getCopilotModelCatalog, githubCopilotProvider } from '../providers/github-copilot.js';\nimport { createGoogleThinkingMiddleware } from '../providers/google-thinking.js';\nimport { KIMI_CODING_MODELS, kimiCodingProvider } from '../providers/kimi-coding.js';\nimport {\n buildOpenAICodexOAuthFetch,\n createCodexMiddleware,\n createReasoningEffortMiddleware,\n getEffectiveThinkingLevel,\n openaiCodexProvider,\n THINKING_LEVEL_TO_REASONING_EFFORT,\n} from '../providers/openai-codex.js';\nimport type { ThinkingLevel } from '../providers/openai-codex.js';\nimport { xaiProvider } from '../providers/xai.js';\nimport { getAppDataDir } from '../utils/project.js';\nimport { resolveCustomProviders } from './custom-provider-source.js';\n\nexport const OPENAI_PREFIX = 'openai/';\nexport const MASTRA_GATEWAY_PREFIX = 'mastra/';\nexport const MASTRACODE_GATEWAY_ID = 'mastracode';\n\nconst CODEX_OPENAI_MODEL_REMAPS: Record<string, string> = {\n 'gpt-5.3': 'gpt-5.3-codex',\n 'gpt-5.2': 'gpt-5.2-codex',\n 'gpt-5.1': 'gpt-5.1-codex',\n 'gpt-5.1-mini': 'gpt-5.1-codex-mini',\n 'gpt-5': 'gpt-5-codex',\n};\n\ntype ModelRequestHeaders = Record<string, string>;\n\nexport type MastraCodeCustomProvider = { name: string; url: string; apiKey?: string; models?: string[] };\n\nexport type MastraCodeGatewayOptions = {\n mastraGatewayBaseUrl: string;\n mastraGatewayApiKey?: string;\n routeThroughMastraGateway: boolean;\n thinkingLevel?: ThinkingLevel;\n customProviders?: MastraCodeCustomProvider[];\n settingsPath?: string;\n /**\n * Per-tenant credential source for this gateway instance. Defaults to the\n * server-global file-backed `AuthStorage`; deployed web passes the calling\n * tenant's store so model calls use the caller's own credentials.\n */\n credentialStore?: CredentialStore;\n};\n\n/**\n * Global file-backed credential store for local (TUI) model resolution.\n *\n * Constructed lazily, NOT at module scope: `AuthStorage`'s default path is\n * resolved from `MASTRA_APP_DATA_DIR` at construction, and this module is\n * routinely imported before test harnesses / embedders point that variable at\n * an isolated directory — an import-time construction would permanently pin\n * the developer's real app-data dir for every credential read.\n */\nlet authStorageSingleton: AuthStorage | undefined;\nlet authStorageSingletonDir: string | undefined;\n\nexport function getGlobalAuthStorage(): AuthStorage {\n // Keyed by the resolved app-data dir: in-process harnesses re-point\n // MASTRA_APP_DATA_DIR per run inside one long-lived worker, so a store\n // pinned to a previous dir must be discarded, not reused.\n const dir = getAppDataDir();\n if (!authStorageSingleton || authStorageSingletonDir !== dir) {\n authStorageSingleton = new AuthStorage();\n authStorageSingletonDir = dir;\n }\n return authStorageSingleton;\n}\n\nexport function reloadAuthStorage() {\n getGlobalAuthStorage().reload();\n}\n\nexport function stripMastraGatewayPrefix(modelId: string): string {\n return modelId.startsWith(MASTRA_GATEWAY_PREFIX) ? modelId.substring(MASTRA_GATEWAY_PREFIX.length) : modelId;\n}\n\nfunction normalizeAnthropicModelId(modelId: string): string {\n return modelId.replace(/\\.(?=\\d)/g, '-');\n}\n\nexport function remapOpenAIModelForCodexOAuth(modelId: string): string {\n const normalizedModelId = stripMastraGatewayPrefix(modelId);\n\n if (!normalizedModelId.startsWith(OPENAI_PREFIX)) {\n return modelId;\n }\n\n const openaiModelId = normalizedModelId.substring(OPENAI_PREFIX.length);\n\n if (openaiModelId.includes('-codex')) {\n return modelId;\n }\n\n const codexModelId = CODEX_OPENAI_MODEL_REMAPS[openaiModelId];\n if (!codexModelId) {\n return modelId;\n }\n\n const remappedModelId = `${OPENAI_PREFIX}${codexModelId}`;\n return modelId.startsWith(MASTRA_GATEWAY_PREFIX) ? `${MASTRA_GATEWAY_PREFIX}${remappedModelId}` : remappedModelId;\n}\n\n/**\n * Resolve the Anthropic API key.\n * Main slot → dedicated apikey: slot → env var.\n */\nexport function getAnthropicApiKey(credentials: CredentialStore = getGlobalAuthStorage()): string | undefined {\n const storedCred = credentials.get('anthropic');\n if (storedCred?.type === 'api_key' && storedCred.key.trim().length > 0) {\n return storedCred.key.trim();\n }\n const dedicatedKey = credentials.getStoredApiKey('anthropic')?.trim();\n if (dedicatedKey) return dedicatedKey;\n return credentials.allowEnvironmentFallback === false\n ? undefined\n : process.env.ANTHROPIC_API_KEY?.trim() || undefined;\n}\n\n/**\n * Resolve the OpenAI API key.\n * Main slot → dedicated apikey: slot → env var.\n */\nexport function getOpenAIApiKey(credentials: CredentialStore = getGlobalAuthStorage()): string | undefined {\n const storedCred = credentials.get('openai-codex');\n if (storedCred?.type === 'api_key' && storedCred.key.trim().length > 0) {\n return storedCred.key.trim();\n }\n const dedicatedKey = credentials.getStoredApiKey('openai-codex')?.trim();\n if (dedicatedKey) return dedicatedKey;\n return credentials.allowEnvironmentFallback === false ? undefined : process.env.OPENAI_API_KEY?.trim() || undefined;\n}\n\nfunction anthropicApiKeyProvider(\n modelId: string,\n apiKey: string,\n headers?: ModelRequestHeaders,\n thinkingLevel?: ThinkingLevel,\n) {\n const anthropic = createAnthropic({ apiKey, headers });\n const thinkingMiddleware = createAnthropicThinkingMiddleware(modelId, thinkingLevel);\n return wrapLanguageModel({\n model: anthropic(modelId),\n middleware: [promptCacheMiddleware, ...(thinkingMiddleware ? [thinkingMiddleware] : [])],\n });\n}\n\nfunction openaiApiKeyProvider(\n modelId: string,\n apiKey: string,\n headers?: ModelRequestHeaders,\n thinkingLevel?: ThinkingLevel,\n) {\n const openai = createOpenAI({ apiKey, baseURL: process.env.OPENAI_BASE_URL, headers });\n const middleware =\n thinkingLevel && thinkingLevel !== 'off'\n ? createReasoningEffortMiddleware(\n 'openai',\n THINKING_LEVEL_TO_REASONING_EFFORT[getEffectiveThinkingLevel(modelId, thinkingLevel)],\n )\n : undefined;\n return wrapLanguageModel({\n model: openai.responses(modelId),\n middleware: middleware ? [middleware] : [],\n });\n}\n\nfunction getAuthProviderId(providerId: string): string {\n return providerId === 'openai' ? 'openai-codex' : providerId;\n}\n\nfunction getProviderAuthKey(\n providerId: string,\n credentials: CredentialStore = getGlobalAuthStorage(),\n): string | undefined {\n const authProviderId = getAuthProviderId(providerId);\n const storedCred = credentials.get(authProviderId);\n if (storedCred?.type === 'api_key' && storedCred.key.trim().length > 0) {\n return storedCred.key.trim();\n }\n const dedicatedKey = credentials.getStoredApiKey(authProviderId)?.trim();\n if (dedicatedKey) return dedicatedKey;\n if (credentials.allowEnvironmentFallback === false) return undefined;\n return authProviderId === 'kimi-for-coding' ? process.env.KIMI_API_KEY?.trim() || undefined : undefined;\n}\n\nexport function resolveAuth(request: GatewayAuthRequest, mastraGatewayApiKey?: string): GatewayAuthResult | undefined {\n return MastraCodeGateway.resolveProviderAuth(request, mastraGatewayApiKey);\n}\n\nfunction getGatewayProviderKey(gatewayId: string, providerId: string): string {\n if (gatewayId === 'models.dev') return providerId;\n return providerId === gatewayId ? gatewayId : `${gatewayId}/${providerId}`;\n}\n\nfunction parseGatewayRouterId(\n routerId: string,\n gateway: MastraModelGatewayInterface,\n): { gatewayId: string; providerId: string; modelId: string } {\n const [firstPart = '', secondPart = '', ...restParts] = routerId.split('/');\n const gatewayId = gateway.id;\n\n if (firstPart === gatewayId && secondPart) {\n return {\n gatewayId,\n providerId: secondPart,\n modelId: restParts.join('/'),\n };\n }\n\n return {\n gatewayId,\n providerId: firstPart,\n modelId: [secondPart, ...restParts].filter(Boolean).join('/'),\n };\n}\n\nfunction hasResolvedAuth(auth: GatewayAuthResult | undefined): boolean {\n if (!auth) return false;\n if (auth.apiKey || auth.bearerToken) return true;\n return auth.headers ? Object.keys(auth.headers).length > 0 : false;\n}\n\nasync function resolveGatewayProviderAuth(\n gateway: MastraModelGatewayInterface,\n routerId: string,\n): Promise<GatewayAuthResult | undefined> {\n if (!gateway.resolveAuth) return undefined;\n\n const parsed = parseGatewayRouterId(routerId, gateway);\n try {\n const result = await gateway.resolveAuth({\n gatewayId: parsed.gatewayId,\n providerId: parsed.providerId,\n modelId: parsed.modelId,\n routerId,\n });\n return hasResolvedAuth(result) ? result : undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function getMastraCodeProviderConfigs(\n gateway: MastraModelGatewayInterface,\n): Promise<Record<string, ProviderConfig>> {\n const providers: Record<string, ProviderConfig> = { ...(PROVIDER_REGISTRY as Record<string, ProviderConfig>) };\n\n try {\n const gatewayProviders = await gateway.fetchProviders();\n for (const [providerId, config] of Object.entries(gatewayProviders)) {\n providers[getGatewayProviderKey(gateway.id, providerId)] = {\n ...config,\n gateway: gateway.id,\n };\n }\n } catch (error) {\n console.warn(`Failed to load providers from gateway ${gateway.id}:`, error);\n }\n\n return providers;\n}\n\nfunction getApiKeyEnvVar(providerConfig: Pick<ProviderConfig, 'apiKeyEnvVar'> | undefined): string | undefined {\n const envVars = providerConfig?.apiKeyEnvVar;\n return Array.isArray(envVars) ? envVars[0] : envVars;\n}\n\nexport class MastraCodeGateway extends MastraModelGateway {\n readonly id = MASTRACODE_GATEWAY_ID;\n readonly name = 'MastraCode Gateway';\n\n readonly #mastraGateway: MastraGateway;\n readonly #mastraGatewayBaseUrl: string;\n readonly #mastraGatewayApiKey?: string;\n readonly #routeThroughMastraGateway: boolean;\n readonly #thinkingLevel?: ThinkingLevel;\n readonly #customProviders?: MastraCodeCustomProvider[];\n readonly #settingsPath?: string;\n readonly #credentials: CredentialStore;\n\n constructor({\n mastraGatewayBaseUrl,\n mastraGatewayApiKey,\n routeThroughMastraGateway,\n thinkingLevel,\n customProviders,\n settingsPath,\n credentialStore,\n }: MastraCodeGatewayOptions) {\n super();\n this.#mastraGateway = new MastraGateway({ baseUrl: mastraGatewayBaseUrl });\n this.#mastraGatewayBaseUrl = mastraGatewayBaseUrl;\n this.#mastraGatewayApiKey = mastraGatewayApiKey;\n this.#routeThroughMastraGateway = routeThroughMastraGateway;\n this.#thinkingLevel = thinkingLevel;\n this.#customProviders = customProviders;\n this.#settingsPath = settingsPath;\n this.#credentials = credentialStore ?? getGlobalAuthStorage();\n }\n\n static getMastraGatewayApiKey(): string | undefined {\n return getGlobalAuthStorage().getStoredApiKey(MASTRA_GATEWAY_PROVIDER) ?? process.env['MASTRA_GATEWAY_API_KEY'];\n }\n\n /** @deprecated Renamed to {@link MastraCodeGateway.getMastraGatewayApiKey}. */\n static getMemoryGatewayApiKey(): string | undefined {\n return MastraCodeGateway.getMastraGatewayApiKey();\n }\n\n /**\n * Claim an unprefixed model id (e.g. a bare `anthropic/...`) when this gateway\n * can authenticate it via OAuth or a stored/env credential. This lets the\n * shared gateway router select MastraCode for auth resolution, so the status\n * bar and `/api-keys` reflect OAuth logins instead of only checking env vars.\n */\n handlesModel(modelId: string): boolean {\n const parsed = parseGatewayRouterId(modelId, this);\n if (!parsed.providerId || !parsed.modelId) return false;\n if (this.#routeThroughMastraGateway && this.#mastraGatewayApiKey) return true;\n const customProvider = this.#getCustomProviders().find(\n provider => parsed.providerId === getCustomProviderId(provider.name),\n );\n if (customProvider?.apiKey) return true;\n return hasResolvedAuth(\n MastraCodeGateway.resolveProviderAuth(\n {\n gatewayId: this.id,\n providerId: parsed.providerId,\n modelId: parsed.modelId,\n routerId: modelId,\n },\n undefined,\n this.#credentials,\n ),\n );\n }\n\n static resolveProviderAuth(\n request: GatewayAuthRequest,\n mastraGatewayApiKey?: string,\n credentials: CredentialStore = getGlobalAuthStorage(),\n ): GatewayAuthResult | undefined {\n if (request.gatewayId === 'mastra' && mastraGatewayApiKey) {\n return { apiKey: mastraGatewayApiKey, source: 'gateway' };\n }\n\n const authProviderId = getAuthProviderId(request.providerId);\n const storedCred = credentials.get(authProviderId);\n if (storedCred?.type === 'oauth') {\n return { bearerToken: 'oauth', source: 'gateway' };\n }\n\n const apiKey = getProviderAuthKey(request.providerId, credentials);\n return apiKey ? { apiKey, source: 'gateway' } : undefined;\n }\n\n static createModelCatalogProvider(gateway: MastraModelGatewayInterface): CustomModelCatalogProvider {\n return async () => {\n const registry = await getMastraCodeProviderConfigs(gateway);\n const models: CustomAvailableModel[] = [];\n\n for (const [provider, providerConfig] of Object.entries(registry)) {\n const apiKeyEnvVar = getApiKeyEnvVar(providerConfig);\n const hasEnvKey = apiKeyEnvVar ? Boolean(process.env[apiKeyEnvVar]) : false;\n const modelNames = providerConfig.models;\n if (!Array.isArray(modelNames)) continue;\n\n const gatewayAuth = modelNames[0]\n ? await resolveGatewayProviderAuth(gateway, `${provider}/${modelNames[0]}`)\n : undefined;\n\n for (const modelName of modelNames) {\n const id = `${provider}/${modelName}`;\n models.push({\n id,\n provider,\n modelName,\n hasApiKey: hasEnvKey || Boolean(gatewayAuth),\n apiKeyEnvVar: apiKeyEnvVar || undefined,\n });\n }\n }\n\n return models;\n };\n }\n\n createModelCatalogProvider(): CustomModelCatalogProvider {\n return MastraCodeGateway.createModelCatalogProvider(this);\n }\n\n #getCustomProviders(): MastraCodeCustomProvider[] {\n // Explicit constructor list wins; then a registered source (deployed web,\n // DB-backed — authoritative, so settings.json is never consulted); then\n // the local file-backed settings.\n return this.#customProviders ?? resolveCustomProviders() ?? loadSettings(this.#settingsPath).customProviders;\n }\n\n async fetchProviders(): Promise<Record<string, ProviderConfig>> {\n const providers: Record<string, ProviderConfig> = {};\n for (const provider of this.#getCustomProviders()) {\n const models = provider.models ?? [];\n if (!models.length) continue;\n providers[getCustomProviderId(provider.name)] = {\n name: provider.name,\n url: provider.url,\n apiKeyEnvVar: '',\n apiKeyHeader: 'Authorization',\n gateway: this.id,\n models,\n };\n }\n\n providers['kimi-for-coding'] = {\n name: 'Kimi For Coding',\n apiKeyEnvVar: 'KIMI_API_KEY',\n apiKeyHeader: 'Authorization',\n gateway: this.id,\n models: [...KIMI_CODING_MODELS],\n };\n\n try {\n const copilotModels = await getCopilotModelCatalog({ authStorage: this.#credentials });\n providers['github-copilot'] = {\n name: 'GitHub Copilot',\n apiKeyEnvVar: '',\n apiKeyHeader: 'Authorization',\n gateway: this.id,\n models: copilotModels.map(model => model.id),\n };\n } catch (error) {\n console.warn('Failed to load GitHub Copilot model catalog:', error);\n }\n\n return providers;\n }\n\n buildUrl(modelId: string): string | undefined | Promise<string | undefined> {\n return this.#routeThroughMastraGateway ? this.#mastraGateway.buildUrl(modelId) : modelId;\n }\n\n async getApiKey(modelId: string): Promise<string> {\n const providerId = stripMastraGatewayPrefix(modelId).split('/', 1)[0];\n if (this.#routeThroughMastraGateway) return this.#mastraGatewayApiKey ?? '';\n return providerId ? (getProviderAuthKey(providerId, this.#credentials) ?? '') : '';\n }\n\n resolveAuth(request: GatewayAuthRequest): GatewayAuthResult | undefined {\n if (this.#routeThroughMastraGateway && this.#mastraGatewayApiKey) {\n return { apiKey: this.#mastraGatewayApiKey, source: 'gateway' };\n }\n\n const customProvider = this.#getCustomProviders().find(\n provider => request.providerId === getCustomProviderId(provider.name),\n );\n if (customProvider?.apiKey) {\n return { apiKey: customProvider.apiKey, source: 'gateway' };\n }\n\n return MastraCodeGateway.resolveProviderAuth(request, undefined, this.#credentials);\n }\n\n resolveLanguageModel(args: {\n modelId: string;\n providerId: string;\n apiKey: string;\n headers?: Record<string, string>;\n transport?: any;\n responsesWebSocket?: any;\n }): GatewayLanguageModel {\n const customProvider = this.#getCustomProviders().find(\n provider => args.providerId === getCustomProviderId(provider.name),\n );\n if (customProvider) {\n const provider = createOpenAICompatible({\n name: args.providerId,\n baseURL: customProvider.url,\n apiKey: args.apiKey,\n headers: args.headers,\n });\n const reasoningEffort = this.#thinkingLevel ? THINKING_LEVEL_TO_REASONING_EFFORT[this.#thinkingLevel] : undefined;\n const middleware = createReasoningEffortMiddleware(args.providerId, reasoningEffort);\n if (!middleware) {\n return provider.chatModel(args.modelId) as unknown as GatewayLanguageModel;\n }\n return wrapLanguageModel({\n model: provider.chatModel(args.modelId),\n middleware: [middleware],\n }) as unknown as GatewayLanguageModel;\n }\n\n if (args.providerId === 'github-copilot') {\n return githubCopilotProvider(args.modelId, {\n headers: args.headers,\n authStorage: this.#credentials,\n }) as unknown as GatewayLanguageModel;\n }\n\n if (args.providerId === 'moonshotai') {\n // Prefer the gateway-resolved key (stored credentials), then the canonical\n // registry env var. Keep the legacy typo name as a fallback for anyone who\n // set it because of the previous error message.\n const apiKey =\n args.apiKey?.trim() || process.env.MOONSHOT_API_KEY?.trim() || process.env.MOONSHOT_AI_API_KEY?.trim();\n if (!apiKey) {\n throw new Error('Need MOONSHOT_API_KEY');\n }\n return createAnthropic({\n apiKey,\n baseURL: 'https://api.moonshot.ai/anthropic/v1',\n name: 'moonshotai.anthropicv1',\n headers: args.headers,\n })(args.modelId) as unknown as GatewayLanguageModel;\n }\n\n if (args.providerId === 'anthropic') {\n return this.#resolveAnthropicModel(args);\n }\n\n if (args.providerId === 'openai') {\n const openaiModel = this.#resolveOpenAIModel(args);\n if (openaiModel) return openaiModel;\n }\n\n if (args.providerId === 'xai' && this.#credentials.get('xai')?.type === 'oauth') {\n return xaiProvider(args.modelId, {\n headers: args.headers,\n authStorage: this.#credentials,\n }) as unknown as GatewayLanguageModel;\n }\n\n if (args.providerId === 'google') {\n return this.#resolveGoogleModel(args);\n }\n\n if (this.#routeThroughMastraGateway) {\n return this.#mastraGateway.resolveLanguageModel(args) as GatewayLanguageModel;\n }\n\n if (args.providerId === 'kimi-for-coding') {\n return kimiCodingProvider(args.modelId, {\n apiKey: args.apiKey,\n headers: args.headers,\n credentialStore: this.#credentials,\n }) as unknown as GatewayLanguageModel;\n }\n\n return new ModelRouterLanguageModel({\n id: `${args.providerId}/${args.modelId}` as `${string}/${string}`,\n apiKey: args.apiKey,\n headers: args.headers,\n }) as unknown as GatewayLanguageModel;\n }\n\n #resolveAnthropicModel(args: {\n modelId: string;\n providerId: string;\n apiKey: string;\n headers?: Record<string, string>;\n transport?: any;\n responsesWebSocket?: any;\n }): GatewayLanguageModel {\n const bareModelId = normalizeAnthropicModelId(args.modelId);\n const storedCred = this.#credentials.get('anthropic');\n const thinkingMiddleware = createAnthropicThinkingMiddleware(bareModelId, this.#thinkingLevel);\n\n if (this.#routeThroughMastraGateway) {\n if (storedCred?.type === 'oauth') {\n const anthropic = createAnthropic({\n apiKey: 'oauth-gateway-placeholder',\n baseURL: `${this.#mastraGatewayBaseUrl}/v1`,\n headers: {\n [GATEWAY_AUTH_HEADER]: `Bearer ${args.apiKey}`,\n ...args.headers,\n },\n fetch: buildAnthropicOAuthFetch({ authStorage: this.#credentials }) as any,\n });\n\n return wrapLanguageModel({\n model: anthropic(bareModelId),\n middleware: [\n claudeCodeMiddleware,\n promptCacheMiddleware,\n ...(thinkingMiddleware ? [thinkingMiddleware] : []),\n ],\n }) as unknown as GatewayLanguageModel;\n }\n\n const gatewayModel = this.#mastraGateway.resolveLanguageModel({\n ...args,\n modelId: bareModelId,\n }) as GatewayLanguageModel;\n if (!thinkingMiddleware) return gatewayModel;\n return wrapLanguageModel({\n model: gatewayModel as any,\n middleware: [thinkingMiddleware],\n }) as unknown as GatewayLanguageModel;\n }\n\n if (storedCred?.type === 'oauth') {\n return opencodeClaudeMaxProvider(bareModelId, {\n headers: args.headers,\n authStorage: this.#credentials,\n thinkingLevel: this.#thinkingLevel,\n }) as unknown as GatewayLanguageModel;\n }\n\n if (storedCred?.type === 'api_key' && storedCred.key.trim().length > 0) {\n return anthropicApiKeyProvider(\n bareModelId,\n storedCred.key.trim(),\n args.headers,\n this.#thinkingLevel,\n ) as unknown as GatewayLanguageModel;\n }\n\n const apiKey = getAnthropicApiKey(this.#credentials);\n if (apiKey) {\n return anthropicApiKeyProvider(\n bareModelId,\n apiKey,\n args.headers,\n this.#thinkingLevel,\n ) as unknown as GatewayLanguageModel;\n }\n\n // No stored credentials: use the OAuth-backed provider so the first request can trigger login.\n return opencodeClaudeMaxProvider(bareModelId, {\n headers: args.headers,\n authStorage: this.#credentials,\n thinkingLevel: this.#thinkingLevel,\n }) as unknown as GatewayLanguageModel;\n }\n\n #resolveOpenAIModel(args: {\n modelId: string;\n providerId: string;\n apiKey: string;\n headers?: Record<string, string>;\n transport?: any;\n responsesWebSocket?: any;\n }): GatewayLanguageModel | undefined {\n const storedCred = this.#credentials.get('openai-codex');\n\n if (this.#routeThroughMastraGateway) {\n if (storedCred?.type === 'oauth') {\n const resolvedModelId = remapOpenAIModelForCodexOAuth(`openai/${args.modelId}`);\n const resolvedBareModelId = resolvedModelId.substring(OPENAI_PREFIX.length);\n const requestedLevel: ThinkingLevel = this.#thinkingLevel ?? 'medium';\n const effectiveLevel = getEffectiveThinkingLevel(resolvedBareModelId, requestedLevel);\n const reasoningEffort = THINKING_LEVEL_TO_REASONING_EFFORT[effectiveLevel];\n const middleware = createCodexMiddleware(reasoningEffort);\n const openai = createOpenAI({\n apiKey: 'oauth-gateway-placeholder',\n baseURL: `${this.#mastraGatewayBaseUrl}/v1`,\n headers: {\n [GATEWAY_AUTH_HEADER]: `Bearer ${args.apiKey}`,\n ...args.headers,\n },\n fetch: buildOpenAICodexOAuthFetch({ authStorage: this.#credentials, rewriteUrl: false }) as any,\n });\n\n return wrapLanguageModel({\n model: openai.responses(resolvedBareModelId),\n middleware: [middleware],\n }) as unknown as GatewayLanguageModel;\n }\n\n return this.#mastraGateway.resolveLanguageModel(args) as GatewayLanguageModel;\n }\n\n if (storedCred?.type === 'oauth') {\n const resolvedModelId = remapOpenAIModelForCodexOAuth(`openai/${args.modelId}`);\n return openaiCodexProvider(resolvedModelId.substring(OPENAI_PREFIX.length), {\n thinkingLevel: this.#thinkingLevel,\n headers: args.headers,\n authStorage: this.#credentials,\n }) as unknown as GatewayLanguageModel;\n }\n\n const apiKey = getOpenAIApiKey(this.#credentials);\n if (apiKey) {\n return openaiApiKeyProvider(\n args.modelId,\n apiKey,\n args.headers,\n this.#thinkingLevel,\n ) as unknown as GatewayLanguageModel;\n }\n\n return undefined;\n }\n\n #resolveGoogleModel(args: {\n modelId: string;\n providerId: string;\n apiKey: string;\n headers?: Record<string, string>;\n transport?: any;\n responsesWebSocket?: any;\n }): GatewayLanguageModel {\n const baseModel = this.#routeThroughMastraGateway\n ? (this.#mastraGateway.resolveLanguageModel(args) as GatewayLanguageModel)\n : (new ModelRouterLanguageModel({\n id: `${args.providerId}/${args.modelId}` as `${string}/${string}`,\n apiKey: args.apiKey,\n headers: args.headers,\n }) as unknown as GatewayLanguageModel);\n\n const thinkingMiddleware = createGoogleThinkingMiddleware(args.modelId, this.#thinkingLevel);\n if (!thinkingMiddleware) return baseModel;\n\n return wrapLanguageModel({\n model: baseModel as any,\n middleware: [thinkingMiddleware],\n }) as unknown as GatewayLanguageModel;\n }\n}\n"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -123,6 +123,19 @@ export interface MastraCodeConfig {
123
123
  * uses the configured PubSub when enabled.
124
124
  */
125
125
  crossAgentSignals?: boolean;
126
+ /**
127
+ * Prepare the request context of a wake: a run on a thread with no inbound
128
+ * request, such as a notification or cross-agent signal delivered to an idle
129
+ * thread. Hosts that resolve credentials per tenant use this to attach the
130
+ * identity that owns `resourceId` before the run starts. Called only when a
131
+ * session owns `resourceId`, whenever Mastra Code builds a wake's stream
132
+ * options.
133
+ */
134
+ prepareWakeRequestContext?: (args: {
135
+ requestContext: RequestContext;
136
+ resourceId: string;
137
+ threadId: string;
138
+ }) => void | Promise<void>;
126
139
  }
127
140
  export declare function createAuthStorage(): AuthStorage;
128
141
  /**