@alvin0/ai-agent-sdk-core 0.1.5 → 0.1.6

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.
@@ -1 +1 @@
1
- {"version":3,"file":"team.js","names":[],"sources":["../../../src/agent/team/team.ts"],"sourcesContent":["import type { AgentRunEvent } from '../mode/run-agent.ts'\nimport { defineTool, type ToolDefinition } from '../tool/definition.ts'\nimport type { ContentBlock } from '../../message/index.ts'\nimport { createUserMessage } from '../../message/index.ts'\nimport { waitForSettlement } from '../../async/index.ts'\nimport { AgentSdkError } from '../../errors/index.ts'\nimport { timeoutValue } from '../../platform/config.ts'\nimport type {\n TeamMemberAttachmentOptions, TeamPort, TeamSessionPort, TeamToolAccess,\n} from './contracts.ts'\nimport type {\n AgentMemberOutcome, AgentMessageRecord, AgentTeamEvent, AgentTeamMember, AgentTeamOptions,\n LinkAgentOptions, LinkedAgentResult, SendAgentMessageRequest, SendAgentMessageResult,\n} from './types.ts'\nimport {\n messageToolSchema, parseMessageTool, parseWaitTool, emptyObject, messageContent, memberName,\n boundedString, positiveInteger, byteLength, errorMessage, asJson, deepCloneFreeze, newTeamId,\n newMessageId, abortable, combineSignals, withTimeout, TEAM_TOOL_NAMES,\n DEFAULT_MIN_WAIT_TIMEOUT_MS,\n DEFAULT_WAIT_TIMEOUT_MS,\n} from './common.ts'\n\n/** Shared control plane for local sessions and interoperable remote A2A peers. */\n\ninterface LocalMemberRuntime {\n readonly kind: 'local'\n readonly name: string\n readonly description?: string\n readonly instructions?: string\n readonly role: 'lead' | 'peer'\n /** Which team verbs it was attached with; shapes its routing guidance. */\n readonly access: TeamToolAccess | false\n readonly session: TeamSessionPort\n wakeRequestedSeq: number\n wakeConsumedSeq: number\n wakeTask: Promise<void> | undefined\n wakeController: AbortController | undefined\n error: string | undefined\n /** How its last run ended, for a coordinator that did not await the run. */\n outcome: AgentMemberOutcome | undefined\n /**\n * Set while the host is holding this member back, and resolved when it lets\n * it start. See {@link AgentTeam.markPending}.\n */\n pendingStart: Promise<void> | undefined\n /**\n * Aborted when the user steers something into this member mid-turn.\n *\n * A member parked in `wait_agents` is not listening to its own conversation:\n * the wait is bounded by its own budget, so a correction typed while it waits\n * sits unread for as long as that budget lasts. Codex's `wait_agent` \"ends\n * early when new user input is steered into the active turn\" for the same\n * reason. Replaced after each notification, so one interruption ends one\n * wait.\n */\n steerController: AbortController | undefined\n}\n\ninterface RemoteMemberRuntime {\n readonly kind: 'remote'\n readonly name: string\n readonly description?: string\n readonly role: 'peer'\n readonly transport: LinkAgentOptions['transport']\n tail: Promise<void>\n pending: number\n readonly controllers: Set<AbortController>\n error: string | undefined\n}\n\ntype AddressableMember = LocalMemberRuntime | RemoteMemberRuntime\n\n\n/**\n * Connect long-lived local AgentSessions and remote protocol peers behind one\n * roster and one model-facing messaging surface.\n */\nexport class AgentTeam implements TeamPort {\n readonly id: string\n private readonly maxMembers: number\n private readonly maxMessageBytes: number\n private readonly maxLinkedResultBytes: number\n private readonly maxMessages: number\n private readonly maxMailboxBytes: number\n private readonly maxMetadataBytes: number\n private readonly disposeTimeoutMs: number\n private readonly operationTimeoutMs: number\n private readonly observerTimeoutMs: number\n private readonly waitTimeoutMs: number\n private readonly minWaitTimeoutMs: number\n private onEvent: ((event: AgentTeamEvent) => void) | undefined\n private onAgentEvent: AgentTeamOptions['onAgentEvent']\n private readonly roster = new Map<string, LocalMemberRuntime>()\n private readonly links = new Map<string, RemoteMemberRuntime>()\n private readonly mailbox: AgentMessageRecord[] = []\n private mailboxBytes = 0\n private pendingMessages = 0\n private pendingMailboxBytes = 0\n private readonly lifecycle = new AbortController()\n private readonly waitEdges = new Map<string, Map<string, number>>()\n private disposed = false\n private disposeTask: Promise<void> | undefined\n\n constructor(\n options: AgentTeamOptions = {},\n private readonly ownRemoteTask?: (signal: AbortSignal) => () => void,\n ) {\n this.id = boundedString(options.id ?? newTeamId(), 'team id', 1024)\n this.maxMembers = positiveInteger(options.maxMembers ?? 8, 'maxMembers')\n this.maxMessageBytes = positiveInteger(options.maxMessageBytes ?? 64 * 1024, 'maxMessageBytes')\n this.maxLinkedResultBytes = positiveInteger(\n options.maxLinkedResultBytes ?? 1024 * 1024,\n 'maxLinkedResultBytes',\n )\n this.maxMessages = positiveInteger(options.maxMessages ?? 10_000, 'maxMessages')\n this.maxMailboxBytes = positiveInteger(options.maxMailboxBytes ?? 64 * 1024 * 1024, 'maxMailboxBytes')\n this.maxMetadataBytes = positiveInteger(options.maxMetadataBytes ?? 8 * 1024, 'maxMetadataBytes')\n this.disposeTimeoutMs = timeoutValue(options.disposeTimeoutMs ?? 30_000)\n this.operationTimeoutMs = timeoutValue(options.operationTimeoutMs ?? 10 * 60_000)\n this.observerTimeoutMs = timeoutValue(options.observerTimeoutMs ?? 1_000)\n this.waitTimeoutMs = timeoutValue(options.waitTimeoutMs ?? DEFAULT_WAIT_TIMEOUT_MS)\n // A floor above the ceiling would clamp every call up to a budget the host\n // said was too long; the host's own maximum wins.\n this.minWaitTimeoutMs = Math.min(\n timeoutValue(options.minWaitTimeoutMs ?? DEFAULT_MIN_WAIT_TIMEOUT_MS),\n this.waitTimeoutMs,\n )\n this.onEvent = options.onEvent\n this.onAgentEvent = options.onAgentEvent\n }\n\n /** Called by AgentSession after its tool catalog is assembled. */\n attach(session: TeamSessionPort, options: TeamMemberAttachmentOptions = {}): void {\n this.assertActive()\n const name = memberName(options.name ?? session.definition.id)\n this.assertAddressAvailable(name)\n this.assertCapacity()\n const role = options.role ?? (this.roster.size === 0 ? 'lead' : 'peer')\n if (role === 'lead' && [...this.roster.values()].some(member => member.role === 'lead')) {\n throw new Error(`A2A team '${this.id}' already has a lead`)\n }\n const access: TeamToolAccess | false = options.tools === false ? false : options.tools === 'reporting' ? 'reporting' : 'full'\n const member: LocalMemberRuntime = {\n kind: 'local', name, role, access, session,\n wakeRequestedSeq: 0, wakeConsumedSeq: 0,\n wakeTask: undefined, wakeController: undefined, error: undefined, outcome: undefined,\n pendingStart: undefined, steerController: undefined,\n ...(options.description === undefined ? {} : {\n description: boundedString(options.description, 'member description', this.maxMetadataBytes),\n }),\n ...(options.instructions === undefined ? {} : {\n instructions: boundedString(options.instructions, 'member instructions', this.maxMetadataBytes),\n }),\n }\n this.roster.set(name, member)\n this.emit({ type: 'member-attached', member: this.view(member) })\n }\n\n /** Link one remote transport, including an official A2A protocol client. */\n linkAgent(options: LinkAgentOptions): () => void {\n this.assertActive()\n const name = memberName(options.name)\n this.assertAddressAvailable(name)\n this.assertCapacity()\n if (typeof options.transport?.send !== 'function') {\n throw new TypeError('linked agent transport must implement send()')\n }\n const member: RemoteMemberRuntime = {\n kind: 'remote', name, role: 'peer', transport: options.transport,\n tail: Promise.resolve(), pending: 0, controllers: new Set(), error: undefined,\n ...(options.description === undefined ? {} : {\n description: boundedString(options.description, 'linked agent description', this.maxMetadataBytes),\n }),\n }\n this.links.set(name, member)\n this.emit({ type: 'member-linked', member: this.view(member) })\n return () => {\n if (this.links.get(name) !== member) return\n if (member.pending > 0) throw new Error(`cannot unlink running A2A member '${name}'`)\n this.links.delete(name)\n }\n }\n\n /** Remove exactly one idle local session registration. */\n detach(name: string): void {\n this.assertActive()\n const member = this.requireLocalMember(name)\n if (member.session.isRunning || member.wakeTask !== undefined) {\n throw new Error(`cannot detach running A2A member '${member.name}'`)\n }\n this.roster.delete(member.name)\n }\n\n /** Current detached roster: local members first, then remote links. */\n members(): readonly AgentTeamMember[] {\n return Object.freeze([\n ...this.roster.values(),\n ...this.links.values(),\n ].map(member => this.view(member)))\n }\n\n /** Immutable audit log. Local target history remains its resumable receipt. */\n messages(): readonly AgentMessageRecord[] {\n return deepCloneFreeze(this.mailbox)\n }\n\n /** Deliver to a local mailbox or dispatch through a linked remote transport. */\n async sendMessage(request: SendAgentMessageRequest): Promise<SendAgentMessageResult> {\n this.assertActive()\n request.signal?.throwIfAborted()\n const sender = this.requireLocalMember(request.from)\n const target = this.requireAddress(request.target)\n if (target.kind === 'local' && sender === target) throw new Error('an A2A member cannot message itself')\n const delivery = request.delivery ?? 'quiet'\n if (delivery !== 'quiet' && delivery !== 'wakeup') {\n throw new TypeError(\"A2A delivery must be 'quiet' or 'wakeup'\")\n }\n if (target.kind === 'remote' && delivery === 'quiet') {\n throw new Error(\n `remote A2A member '${target.name}' cannot accept quiet injection; use followup_task or delivery 'wakeup'`,\n )\n }\n const id = newMessageId()\n const content = messageContent(request.message, this.maxMessageBytes)\n const framed = deepCloneFreeze([\n { type: 'text' as const, text: `A2A message ${id} from ${sender.name}:` },\n ...content,\n ])\n const contentBytes = byteLength(framed)\n if (contentBytes > this.maxMessageBytes) {\n throw new Error(`A2A message exceeds the ${this.maxMessageBytes}-byte limit`)\n }\n const reservedBytes = target.kind === 'remote'\n ? contentBytes + this.maxLinkedResultBytes\n : contentBytes\n const releaseReservation = this.reserveMailbox(reservedBytes)\n\n let result: LinkedAgentResult | undefined\n try {\n if (target.kind === 'local') {\n const message = createUserMessage({\n source: {\n kind: 'agent-message' as const,\n teamId: this.id, messageId: id, sender: sender.name,\n senderAgentId: sender.session.definition.id,\n },\n content: framed,\n })\n const seq = target.session.inject(message)\n if (delivery === 'wakeup') this.scheduleWake(target, seq)\n } else {\n result = await this.dispatchRemote(target, {\n teamId: this.id, messageId: id, sender: sender.name,\n senderAgentId: sender.session.definition.id, content: framed,\n ...(request.signal === undefined ? {} : { signal: request.signal }),\n })\n }\n\n const record: AgentMessageRecord = deepCloneFreeze({\n id, teamId: this.id, sender: sender.name,\n senderAgentId: sender.session.definition.id,\n target: target.name,\n targetAgentId: target.kind === 'local'\n ? target.session.definition.id\n : target.transport.agentId,\n delivery, content: framed, status: 'accepted' as const,\n createdAt: new Date().toISOString(),\n ...(result === undefined ? {} : { result }),\n })\n const retainedBytes = contentBytes + (result === undefined ? 0 : byteLength(result))\n this.mailbox.push(record)\n this.mailboxBytes += retainedBytes\n this.emit({ type: 'message-accepted', message: deepCloneFreeze(record) })\n return deepCloneFreeze({\n messageId: id, status: 'accepted' as const, delivery, target: target.name,\n ...(result === undefined ? {} : { result }),\n })\n } finally {\n releaseReservation()\n }\n }\n\n /** Wake-up alias used by hosts and model tools. */\n followup(\n from: string,\n target: string,\n message: string | readonly ContentBlock[],\n signal?: AbortSignal,\n ): Promise<SendAgentMessageResult> {\n return this.sendMessage({\n from, target, message, delivery: 'wakeup',\n ...(signal === undefined ? {} : { signal }),\n })\n }\n\n /** Wait until all local wake-up work or remote dispatches settle. */\n async whenIdle(name: string, signal?: AbortSignal): Promise<void> {\n const member = this.requireAddress(name)\n if (member.kind === 'remote') {\n while (true) {\n const tail = member.tail\n await abortable(tail, signal)\n if (tail === member.tail && member.pending === 0) break\n }\n return\n }\n while (true) {\n const requested = member.wakeRequestedSeq\n const task = member.wakeTask\n // A member the host is holding back has not finished; it has not begun.\n // Waiting on its session would be answered at once, and the waiter would\n // read that as work completed.\n const held = member.pendingStart\n if (held !== undefined) await abortable(held, signal)\n if (task !== undefined) await abortable(task, signal)\n await member.session.whenIdle(signal)\n if (member.wakeTask === undefined && !member.session.isRunning\n && member.pendingStart === undefined\n && member.wakeConsumedSeq >= member.wakeRequestedSeq\n && requested === member.wakeRequestedSeq) return\n }\n }\n\n /**\n * Report that the user steered something into a local member mid-turn.\n *\n * Ends whatever that member is currently waiting on. A member parked in\n * `wait_agents` would otherwise finish its budget before reading a correction\n * that has been sitting in its history the whole time; Codex ends its\n * `wait_agent` early on steered input for the same reason.\n * @param name - Local member address.\n */\n notifySteer(name: string): void {\n const member = this.requireLocalMember(name)\n const controller = member.steerController\n member.steerController = undefined\n controller?.abort(new Error('user input steered into the active turn'))\n }\n\n /**\n * Schedule one turn for a local member over context it already has.\n *\n * A wake-up delivery carries a message; this carries nothing. It exists for\n * the case where the context arrived earlier and quietly — appended to a\n * member that was mid-turn, on the assumption its next model round would read\n * it — and that round never came. Without this the message sits in history\n * with nothing left to read it.\n * @param name - Local member address.\n */\n wake(name: string): void {\n const member = this.requireLocalMember(name)\n this.scheduleWake(member, member.wakeRequestedSeq + 1)\n }\n\n /** Cancel team-owned scheduled work for one member without mutating its history. */\n async cancel(name: string, reason: unknown = new Error('A2A member work cancelled')): Promise<void> {\n const member = this.requireAddress(name)\n if (member.kind === 'remote') {\n for (const controller of member.controllers) controller.abort(reason)\n await withTimeout(\n member.tail,\n this.disposeTimeoutMs,\n `A2A member '${member.name}' did not cancel within ${this.disposeTimeoutMs}ms`,\n 'TEAM_CANCELLATION_TIMEOUT',\n )\n return\n }\n member.wakeConsumedSeq = member.wakeRequestedSeq\n const controller = member.wakeController\n const task = member.wakeTask\n controller?.abort(reason)\n if (task !== undefined) {\n await withTimeout(\n task,\n this.disposeTimeoutMs,\n `A2A member '${member.name}' did not cancel within ${this.disposeTimeoutMs}ms`,\n 'TEAM_CANCELLATION_TIMEOUT',\n )\n }\n }\n\n /** Permanently close this control plane and cancel every team-owned operation. */\n dispose(reason: unknown = new Error('A2A team disposed')): Promise<void> {\n if (this.disposeTask !== undefined) return this.disposeTask\n this.disposed = true\n this.lifecycle.abort(reason)\n const settling = Promise.allSettled([\n ...[...this.roster.values()].map(member => this.cancel(member.name, reason)),\n ...[...this.links.values()].map(member => this.cancel(member.name, reason)),\n ]).then(results => {\n this.roster.clear()\n this.links.clear()\n this.emit({ type: 'team-disposed', teamId: this.id })\n this.mailbox.length = 0\n this.mailboxBytes = 0\n this.waitEdges.clear()\n this.onEvent = undefined\n this.onAgentEvent = undefined\n const failure = results.find((result): result is PromiseRejectedResult => result.status === 'rejected')\n if (failure !== undefined) {\n throw new AgentSdkError(\n `A2A team '${this.id}' did not dispose within ${this.disposeTimeoutMs}ms`,\n 'TEAM_DISPOSE_TIMEOUT',\n { cause: failure.reason },\n )\n }\n })\n this.disposeTask = withTimeout(\n settling,\n this.disposeTimeoutMs,\n `A2A team '${this.id}' did not dispose within ${this.disposeTimeoutMs}ms`,\n 'TEAM_DISPOSE_TIMEOUT',\n )\n return this.disposeTask\n }\n\n /** Model-facing tools bound to one immutable local sender identity. */\n toolsFor(sender: string, access: TeamToolAccess = 'full'): readonly ToolDefinition<any>[] {\n this.assertActive()\n const name = memberName(sender)\n // Called before `attach`, so the access level arrives as an argument\n // rather than being looked up on the member that does not exist yet.\n const coordinating = access === 'full'\n // Coordination is not exploration. A lead that has spent its tool budget\n // still has to be able to hand the work over and collect it; blocking\n // these is what strands a team run with finished members and no report.\n return Object.freeze([\n defineTool({\n name: TEAM_TOOL_NAMES.list,\n budgetExempt: true,\n description: 'List local and remote addressable agents, their protocols, supported delivery modes, and status.',\n parameters: { type: 'object', properties: {}, additionalProperties: false },\n parse: raw => emptyObject(raw, 'list_agents'),\n execute: () => asJson(this.members()),\n isConcurrencySafe: () => true,\n }),\n defineTool({\n name: TEAM_TOOL_NAMES.send,\n budgetExempt: true,\n description: 'Send quiet context to another local agent from list_agents, other than yourself.'\n + ' This does not start a task or return its final result. Remote A2A peers require followup_task.',\n parameters: messageToolSchema('Message to add to the target context.'),\n parse: parseMessageTool,\n execute: async ({ target, message }, ctx) => asJson(await this.sendMessage({\n from: name, target, message, delivery: 'quiet', signal: ctx.signal,\n })),\n }),\n ...!coordinating ? [] : [defineTool({\n name: TEAM_TOOL_NAMES.followup,\n budgetExempt: true,\n description: 'Send active work to a local agent or interoperable remote A2A peer and wait for its accepted result.',\n parameters: messageToolSchema('Follow-up instruction the target must process.'),\n parse: parseMessageTool,\n execute: async ({ target, message }, ctx) => asJson(\n await this.followup(name, target, message, ctx.signal),\n ),\n })],\n ...!coordinating ? [] : [defineTool({\n name: TEAM_TOOL_NAMES.wait,\n budgetExempt: true,\n description: 'Wait until one of the selected local or remote agents finishes its scheduled'\n + ' work, then return their current roster state. Returns early with interrupted=true when'\n + ' the user sends you something while you wait, so read that before waiting again.',\n parameters: {\n type: 'object',\n properties: {\n targets: {\n type: 'array', items: { type: 'string' }, minItems: 1,\n description: 'Exact agent names returned by list_agents.',\n },\n timeoutMs: {\n type: 'number',\n description:\n `Give up after this long and report instead, default ${String(this.waitTimeoutMs)}.`\n + ` Anything under ${String(this.minWaitTimeoutMs)} is raised to it: a wait too short to`\n + ` finish anything costs a model round and returns the roster unchanged.`,\n },\n },\n required: ['targets'], additionalProperties: false,\n },\n parse: parseWaitTool,\n execute: async ({ targets, timeoutMs }, ctx) => {\n const release = this.beginWait(name, targets)\n const budget = timeoutMs === undefined\n ? this.waitTimeoutMs\n : Math.min(\n Math.max(timeoutValue(timeoutMs), this.minWaitTimeoutMs),\n this.waitTimeoutMs,\n )\n try {\n // Returns as soon as the FIRST target settles, and always within\n // the budget. Waiting for all of them, forever, is what turned one\n // slow agent into a window that looked hung: a coordinator that\n // gets the roster back can decide for itself whether to wait again.\n //\n // The budget is enforced HERE rather than only by handing members a\n // deadline signal: a member that does not honour the signal would\n // otherwise hold the wait open past its own timeout, and a timeout\n // a callee can ignore is not a timeout.\n // A wait that cannot be interrupted is a wait the user cannot\n // correct: the caller is parked here, so its own new input has\n // nothing else to end it before the budget runs out.\n const steer = new AbortController()\n const caller = this.roster.get(memberName(sender))\n if (caller !== undefined) caller.steerController = steer\n const signal = combineSignals(ctx.signal, AbortSignal.timeout(budget), steer.signal)\n let timer: ReturnType<typeof setTimeout> | undefined\n const expiry = new Promise<undefined>((resolve) => {\n timer = setTimeout(() => resolve(undefined), budget)\n })\n const interrupted = new Promise<undefined>((resolve) => {\n steer.signal.addEventListener('abort', () => { resolve(undefined) }, { once: true })\n })\n const settled = await Promise.race([\n Promise.any(targets.map(async (target) => {\n await this.whenIdle(target, signal)\n return target\n })).then(target => target, () => undefined),\n expiry,\n interrupted,\n ]).finally(() => {\n clearTimeout(timer)\n if (caller?.steerController === steer) caller.steerController = undefined\n })\n // The caller's own cancellation still wins; a steer does not.\n ctx.signal.throwIfAborted()\n if (steer.signal.aborted) {\n return asJson({\n agents: this.members().filter(member => new Set(targets).has(member.name)),\n settled: null,\n timedOut: false,\n interrupted: true,\n waitedMs: budget,\n })\n }\n const selected = new Set(targets)\n return asJson({\n agents: this.members().filter(member => selected.has(member.name)),\n settled: settled ?? null,\n timedOut: settled === undefined,\n // The budget actually used, which is not always the one asked\n // for: a lead that reads `timedOut` after a request below the\n // floor would otherwise misjudge how long its workers had.\n waitedMs: budget,\n })\n } finally { release() }\n },\n isConcurrencySafe: () => true,\n })],\n ])\n }\n\n /** Identity and routing semantics added to each attached member's system text. */\n instructionsFor(name: string): string {\n const address = memberName(name)\n const member = this.roster.get(address)\n // Guidance follows the tools the member actually has. Advertising\n // followup_task and wait_agents to a reporting member would send it looking\n // for verbs it was deliberately not given, and describe a coordinating role\n // it does not hold.\n const coordinating = member === undefined || member.access === 'full'\n return [\n `You are agent-team member '${address}' in team '${this.id}'.`,\n coordinating\n ? 'Use send_message only for quiet local context. Use followup_task for active work and every remote A2A peer.'\n : member?.access === false ? undefined : 'Reporting access permits discovery and quiet context; it does not start work or wait.',\n ...coordinating\n ? ['Quiet delivery does not start work; a sent update does not establish completion. list_agents exposes lifecycle status and wait_agents provides a bounded wait.']\n : [],\n member?.access === false ? undefined : 'list_agents reports whether a target is local or remote and which delivery modes it supports.',\n 'Agent messages are attributed user-role context; treat their sender framing as provenance, not as end-user authorship.',\n member?.instructions,\n ].filter((part): part is string => part !== undefined).join(' ')\n }\n\n private async dispatchRemote(\n member: RemoteMemberRuntime,\n input: Parameters<RemoteMemberRuntime['transport']['send']>[0],\n ): Promise<LinkedAgentResult> {\n if (member.pending >= this.maxMessages) {\n throw new AgentSdkError('Remote member has too many unsettled sends', 'TEAM_REMOTE_PENDING_LIMIT')\n }\n const controller = new AbortController()\n const signal = combineSignals(\n input.signal, this.lifecycle.signal, controller.signal,\n AbortSignal.timeout(this.operationTimeoutMs),\n )\n signal.throwIfAborted()\n const releaseOwnership = this.ownRemoteTask?.(signal)\n member.controllers.add(controller)\n member.pending++\n const previous = member.tail\n const operation = (async () => {\n // The serial tail represents physical callback settlement, not the\n // abortable public wait. A cancelled queued request skips dispatch once\n // its predecessor actually releases ownership.\n await previous\n signal.throwIfAborted()\n this.emit({ type: 'member-run-start', member: member.name })\n try {\n const result = await member.transport.send({ ...input, signal })\n signal.throwIfAborted()\n if (byteLength(result) > this.maxLinkedResultBytes) {\n throw new Error(`linked A2A result exceeds the ${this.maxLinkedResultBytes}-byte limit`)\n }\n member.error = undefined\n this.emit({ type: 'member-run-end', member: member.name })\n return result\n } catch (error: unknown) {\n member.error = errorMessage(error)\n this.emit({ type: 'member-run-error', member: member.name, error: member.error })\n throw error\n }\n })().finally(() => {\n member.pending--\n member.controllers.delete(controller)\n releaseOwnership?.()\n })\n member.tail = operation.then(() => undefined, () => undefined)\n return await abortable(operation, signal)\n }\n\n private scheduleWake(member: LocalMemberRuntime, seq: number): void {\n this.assertActive()\n member.wakeRequestedSeq = Math.max(member.wakeRequestedSeq, seq)\n if (member.wakeTask !== undefined) return\n const controller = new AbortController()\n member.wakeController = controller\n const signal = combineSignals(\n this.lifecycle.signal, controller.signal, AbortSignal.timeout(this.operationTimeoutMs),\n )\n const task = this.runWakeLoop(member, signal).finally(() => {\n if (member.wakeTask === task) member.wakeTask = undefined\n if (member.wakeController === controller) member.wakeController = undefined\n if (member.wakeConsumedSeq < member.wakeRequestedSeq) {\n this.scheduleWake(member, member.wakeRequestedSeq)\n }\n })\n member.wakeTask = task\n }\n\n /** Serialized content ceiling used by host-generated notifications. */\n get messageByteLimit(): number { return this.maxMessageBytes }\n\n private async runWakeLoop(member: LocalMemberRuntime, signal: AbortSignal): Promise<void> {\n let cancellationReported = false\n try {\n while (member.wakeConsumedSeq < member.wakeRequestedSeq) {\n signal.throwIfAborted()\n await member.session.whenIdle(signal)\n const through = member.wakeRequestedSeq\n this.emit({ type: 'member-run-start', member: member.name })\n try {\n const response = await member.session.runPending({\n signal,\n onEvent: event => this.observeAgentEvent(member.name, event),\n })\n if (signal.aborted) {\n member.wakeConsumedSeq = through\n this.emit({ type: 'member-run-cancelled', member: member.name })\n cancellationReported = true\n continue\n }\n member.error = undefined\n // Recorded so a coordinator can read the member's answer from the\n // roster. `runPending` hands it to whoever awaited the run, and with\n // a wake-up delivery that is nobody.\n const failure = responseFailure(response)\n member.error = failure\n member.outcome = failure === undefined\n ? { kind: 'completed', text: responseText(response) }\n : { kind: 'failed', message: failure, ...(responseText(response) === '' ? {} : { text: responseText(response) }) }\n member.wakeConsumedSeq = through\n if (failure === undefined) this.emit({ type: 'member-run-end', member: member.name })\n else this.emit({ type: 'member-run-error', member: member.name, error: failure })\n } catch (error: unknown) {\n if (signal.aborted) {\n member.error = undefined\n member.wakeConsumedSeq = through\n this.emit({ type: 'member-run-cancelled', member: member.name })\n cancellationReported = true\n continue\n }\n if (member.session.isRunning) continue\n member.error = errorMessage(error)\n member.outcome = { kind: 'failed', message: member.error }\n member.wakeConsumedSeq = through\n this.emit({ type: 'member-run-error', member: member.name, error: member.error })\n }\n }\n } catch (error: unknown) {\n if (!signal.aborted) throw error\n member.error = undefined\n member.wakeConsumedSeq = member.wakeRequestedSeq\n if (!cancellationReported) this.emit({ type: 'member-run-cancelled', member: member.name })\n }\n }\n\n private requireLocalMember(value: string): LocalMemberRuntime {\n const name = memberName(value)\n const member = this.roster.get(name)\n if (member === undefined) throw new Error(`unknown local A2A member '${name}'`)\n return member\n }\n\n /**\n * Record that `sender` is blocked until `targets` are idle.\n *\n * The `wait_agents` tool calls this, and so must any HOST that blocks one\n * member on another. An unrecorded edge is invisible here, which is worse\n * than having no detection at all: the cycle it completes gets waved through,\n * and both sides then wait for each other until a timeout expires.\n *\n * `spawn_agent` used to be such a host — it awaited the worker it created —\n * and needed an edge declared for it. It no longer waits, so the cycle it\n * could close no longer exists.\n * @param sender - The member that will block.\n * @param targets - Members it is waiting for.\n * @returns A release; call it when the wait ends, however it ends.\n * @throws `TEAM_WAIT_CYCLE` when the wait would close a cycle.\n */\n beginWait(sender: string, targets: readonly string[]): () => void {\n for (const target of targets) {\n this.requireAddress(target)\n if (target === sender || this.hasWaitPath(target, sender, new Set())) {\n throw new AgentSdkError('wait_agents would create a coordination cycle', 'TEAM_WAIT_CYCLE')\n }\n }\n let outgoing = this.waitEdges.get(sender)\n if (outgoing === undefined) {\n outgoing = new Map()\n this.waitEdges.set(sender, outgoing)\n }\n for (const target of targets) outgoing.set(target, (outgoing.get(target) ?? 0) + 1)\n let active = true\n return () => {\n if (!active) return\n active = false\n const edges = this.waitEdges.get(sender)\n if (edges === undefined) return\n for (const target of targets) {\n const count = edges.get(target) ?? 0\n if (count <= 1) edges.delete(target); else edges.set(target, count - 1)\n }\n if (edges.size === 0) this.waitEdges.delete(sender)\n }\n }\n\n private hasWaitPath(from: string, target: string, visited: Set<string>): boolean {\n if (from === target) return true\n if (visited.has(from)) return false\n visited.add(from)\n for (const next of this.waitEdges.get(from)?.keys() ?? []) {\n if (this.hasWaitPath(next, target, visited)) return true\n }\n return false\n }\n\n private requireAddress(value: string): AddressableMember {\n const name = memberName(value)\n const member = this.roster.get(name) ?? this.links.get(name)\n if (member === undefined) throw new Error(`unknown A2A member '${name}'`)\n return member\n }\n\n private assertAddressAvailable(name: string): void {\n if (this.roster.has(name) || this.links.has(name)) {\n throw new Error(`A2A member '${name}' is already attached or linked`)\n }\n }\n\n private assertCapacity(): void {\n if (this.roster.size + this.links.size >= this.maxMembers) {\n throw new Error(`A2A team '${this.id}' reached its ${this.maxMembers}-member limit`)\n }\n }\n\n private assertActive(): void {\n if (this.disposed) throw new Error(`A2A team '${this.id}' is disposed`)\n }\n\n private reserveMailbox(contentBytes: number): () => void {\n if (this.mailbox.length + this.pendingMessages >= this.maxMessages) {\n throw new Error(`A2A team '${this.id}' reached its ${this.maxMessages}-message mailbox limit`)\n }\n if (this.mailboxBytes + this.pendingMailboxBytes + contentBytes > this.maxMailboxBytes) {\n throw new Error(`A2A team '${this.id}' reached its ${this.maxMailboxBytes}-byte mailbox limit`)\n }\n this.pendingMessages++\n this.pendingMailboxBytes += contentBytes\n let released = false\n return () => {\n if (released) return\n released = true\n this.pendingMessages--\n this.pendingMailboxBytes -= contentBytes\n }\n }\n\n /**\n * Record how a member's run ended.\n *\n * For a host that starts a member's run itself and therefore owns the result\n * the member's own bookkeeping never sees — `spawn_agent` running a worker\n * concurrently. Without this the roster could report that a worker had\n * stopped but not what it concluded, which is the whole point of asking.\n * @param name - Member address.\n * @param outcome - How the run ended.\n */\n recordOutcome(name: string, outcome: AgentMemberOutcome): void {\n const member = this.requireLocalMember(name)\n member.outcome = outcome\n member.error = outcome.kind === 'failed' ? outcome.message : undefined\n }\n\n /**\n * Declare that a member exists but has deliberately not been started.\n *\n * A host that orders work — starting one member only once another has\n * finished — needs the roster to say so, and `wait_agents` to believe it. A\n * member whose session has never run looks exactly like one that has\n * finished: idle, not running, nothing outstanding. A coordinator told that\n * would wait on it, be answered at once, read no outcome, and conclude the\n * work was done.\n *\n * The promise is what `whenIdle` waits on, so the pending state cannot be a\n * flag that a waiter has to poll.\n * @param name - Local member address.\n * @param until - Resolves when the host starts it; undefined clears the state.\n */\n markPending(name: string, until: Promise<void> | undefined): void {\n this.requireLocalMember(name).pendingStart = until\n }\n\n private view(member: AddressableMember): AgentTeamMember {\n if (member.kind === 'remote') {\n return Object.freeze({\n name: member.name, agentId: member.transport.agentId, kind: 'remote' as const,\n role: member.role,\n status: member.error === undefined ? (member.pending > 0 ? 'running' : 'idle') : 'failed',\n protocol: member.transport.protocol,\n deliveries: Object.freeze(['wakeup'] as const),\n ...(member.description === undefined ? {} : { description: member.description }),\n ...(member.error === undefined ? {} : { error: member.error }),\n })\n }\n return Object.freeze({\n name: member.name, agentId: member.session.definition.id, kind: 'local' as const,\n conversationId: member.session.conversationId, role: member.role,\n status: member.error !== undefined\n ? 'failed'\n : member.pendingStart !== undefined\n ? 'pending'\n : member.session.isRunning || member.wakeTask !== undefined ? 'running' : 'idle',\n protocol: 'in-process', deliveries: Object.freeze(['quiet', 'wakeup'] as const),\n ...(member.description === undefined ? {} : { description: member.description }),\n ...(member.error === undefined ? {} : { error: member.error }),\n ...(member.outcome === undefined ? {} : { outcome: member.outcome }),\n })\n }\n\n private emit(event: AgentTeamEvent): void {\n try { this.onEvent?.(event) } catch { /* observers do not own control-plane correctness */ }\n }\n\n private async observeAgentEvent(member: string, event: AgentRunEvent): Promise<void> {\n if (this.onAgentEvent === undefined) return\n const observer = Promise.resolve().then(() => this.onAgentEvent?.(member, event))\n await waitForSettlement(observer, this.observerTimeoutMs)\n }\n}\n\n/**\n * The answer text out of a run result.\n *\n * `TeamSessionPort.runPending` returns `unknown` on purpose — the port exists so\n * the control plane does not depend on the concrete session — so the one field\n * needed here is read structurally.\n * @param response - Whatever the member's run resolved with.\n * @returns Its text, or the empty string.\n */\nfunction responseText(response: unknown): string {\n const text = (response as { text?: unknown } | null)?.text\n return typeof text === 'string' ? text : ''\n}\n\n/** Session implementations may resolve an incomplete terminal response rather than reject. */\nfunction responseFailure(response: unknown): string | undefined {\n if (response === null || typeof response !== 'object') return undefined\n const value = response as { completed?: unknown; outcome?: { completed?: unknown; reason?: { kind?: unknown; failure?: { message?: unknown } } }; stopReason?: { kind?: unknown } }\n const reason = value.outcome?.reason ?? value.stopReason\n if (value.outcome?.completed === false || value.completed === false\n || reason?.kind === 'error' || reason?.kind === 'max-tokens' || reason?.kind === 'aborted' || reason?.kind === 'usage-unavailable') {\n const message = value.outcome?.reason?.failure?.message\n return typeof message === 'string' ? message : `member run did not complete (${String(reason?.kind ?? 'unknown')})`\n }\n return undefined\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"team.js","names":[],"sources":["../../../src/agent/team/team.ts"],"sourcesContent":["import type { AgentRunEvent } from '../mode/run-agent.ts'\nimport { defineTool, type ToolDefinition } from '../tool/definition.ts'\nimport type { ContentBlock } from '../../message/index.ts'\nimport { createUserMessage } from '../../message/index.ts'\nimport { waitForSettlement } from '../../async/index.ts'\nimport { AgentSdkError } from '../../errors/index.ts'\nimport { timeoutValue } from '../../platform/config.ts'\nimport type {\n TeamMemberAttachmentOptions, TeamPort, TeamSessionPort, TeamToolAccess,\n} from './contracts.ts'\nimport type {\n AgentMemberOutcome, AgentMessageRecord, AgentTeamEvent, AgentTeamMember, AgentTeamOptions,\n LinkAgentOptions, LinkedAgentResult, SendAgentMessageRequest, SendAgentMessageResult,\n} from './types.ts'\nimport {\n messageToolSchema, parseMessageTool, parseWaitTool, emptyObject, messageContent, memberName,\n boundedString, positiveInteger, byteLength, errorMessage, asJson, deepCloneFreeze, newTeamId,\n newMessageId, abortable, combineSignals, withTimeout, TEAM_TOOL_NAMES,\n DEFAULT_MIN_WAIT_TIMEOUT_MS,\n DEFAULT_WAIT_TIMEOUT_MS,\n} from './common.ts'\n\n/** Shared control plane for local sessions and interoperable remote A2A peers. */\n\ninterface LocalMemberRuntime {\n readonly kind: 'local'\n readonly name: string\n readonly description?: string\n readonly instructions?: string\n readonly role: 'lead' | 'peer'\n /** Which team verbs it was attached with; shapes its routing guidance. */\n readonly access: TeamToolAccess | false\n readonly session: TeamSessionPort\n wakeRequestedSeq: number\n wakeConsumedSeq: number\n wakeTask: Promise<void> | undefined\n wakeController: AbortController | undefined\n error: string | undefined\n /** How its last run ended, for a coordinator that did not await the run. */\n outcome: AgentMemberOutcome | undefined\n /**\n * Set while the host is holding this member back, and resolved when it lets\n * it start. See {@link AgentTeam.markPending}.\n */\n pendingStart: Promise<void> | undefined\n /**\n * Aborted when the user steers something into this member mid-turn.\n *\n * A member parked in `wait_agents` is not listening to its own conversation:\n * the wait is bounded by its own budget, so a correction typed while it waits\n * sits unread for as long as that budget lasts. Codex's `wait_agent` \"ends\n * early when new user input is steered into the active turn\" for the same\n * reason. Replaced after each notification, so one interruption ends one\n * wait.\n */\n steerController: AbortController | undefined\n}\n\ninterface RemoteMemberRuntime {\n readonly kind: 'remote'\n readonly name: string\n readonly description?: string\n readonly role: 'peer'\n readonly transport: LinkAgentOptions['transport']\n tail: Promise<void>\n pending: number\n readonly controllers: Set<AbortController>\n error: string | undefined\n}\n\ntype AddressableMember = LocalMemberRuntime | RemoteMemberRuntime\n\n\n/**\n * Connect long-lived local AgentSessions and remote protocol peers behind one\n * roster and one model-facing messaging surface.\n */\nexport class AgentTeam implements TeamPort {\n readonly id: string\n private readonly maxMembers: number\n private readonly maxMessageBytes: number\n private readonly maxLinkedResultBytes: number\n private readonly maxMessages: number\n private readonly maxMailboxBytes: number\n private readonly maxMetadataBytes: number\n private readonly disposeTimeoutMs: number\n private readonly operationTimeoutMs: number\n private readonly observerTimeoutMs: number\n private readonly waitTimeoutMs: number\n private readonly minWaitTimeoutMs: number\n private onEvent: ((event: AgentTeamEvent) => void) | undefined\n private onAgentEvent: AgentTeamOptions['onAgentEvent']\n private readonly roster = new Map<string, LocalMemberRuntime>()\n private readonly links = new Map<string, RemoteMemberRuntime>()\n private readonly mailbox: AgentMessageRecord[] = []\n private mailboxBytes = 0\n private pendingMessages = 0\n private pendingMailboxBytes = 0\n private readonly lifecycle = new AbortController()\n private readonly waitEdges = new Map<string, Map<string, number>>()\n private disposed = false\n private disposeTask: Promise<void> | undefined\n\n constructor(\n options: AgentTeamOptions = {},\n private readonly ownRemoteTask?: (signal: AbortSignal) => () => void,\n ) {\n this.id = boundedString(options.id ?? newTeamId(), 'team id', 1024)\n this.maxMembers = positiveInteger(options.maxMembers ?? 8, 'maxMembers')\n this.maxMessageBytes = positiveInteger(options.maxMessageBytes ?? 64 * 1024, 'maxMessageBytes')\n this.maxLinkedResultBytes = positiveInteger(\n options.maxLinkedResultBytes ?? 1024 * 1024,\n 'maxLinkedResultBytes',\n )\n this.maxMessages = positiveInteger(options.maxMessages ?? 10_000, 'maxMessages')\n this.maxMailboxBytes = positiveInteger(options.maxMailboxBytes ?? 64 * 1024 * 1024, 'maxMailboxBytes')\n this.maxMetadataBytes = positiveInteger(options.maxMetadataBytes ?? 8 * 1024, 'maxMetadataBytes')\n this.disposeTimeoutMs = timeoutValue(options.disposeTimeoutMs ?? 30_000)\n this.operationTimeoutMs = timeoutValue(options.operationTimeoutMs ?? 10 * 60_000)\n this.observerTimeoutMs = timeoutValue(options.observerTimeoutMs ?? 1_000)\n this.waitTimeoutMs = timeoutValue(options.waitTimeoutMs ?? DEFAULT_WAIT_TIMEOUT_MS)\n // A floor above the ceiling would clamp every call up to a budget the host\n // said was too long; the host's own maximum wins.\n this.minWaitTimeoutMs = Math.min(\n timeoutValue(options.minWaitTimeoutMs ?? DEFAULT_MIN_WAIT_TIMEOUT_MS),\n this.waitTimeoutMs,\n )\n this.onEvent = options.onEvent\n this.onAgentEvent = options.onAgentEvent\n }\n\n /** Called by AgentSession after its tool catalog is assembled. */\n attach(session: TeamSessionPort, options: TeamMemberAttachmentOptions = {}): void {\n this.assertActive()\n const name = memberName(options.name ?? session.definition.id)\n this.assertAddressAvailable(name)\n this.assertCapacity()\n const role = options.role ?? (this.roster.size === 0 ? 'lead' : 'peer')\n if (role === 'lead' && [...this.roster.values()].some(member => member.role === 'lead')) {\n throw new Error(`A2A team '${this.id}' already has a lead`)\n }\n const access: TeamToolAccess | false = options.tools === false ? false : options.tools === 'reporting' ? 'reporting' : 'full'\n const member: LocalMemberRuntime = {\n kind: 'local', name, role, access, session,\n wakeRequestedSeq: 0, wakeConsumedSeq: 0,\n wakeTask: undefined, wakeController: undefined, error: undefined, outcome: undefined,\n pendingStart: undefined, steerController: undefined,\n ...(options.description === undefined ? {} : {\n description: boundedString(options.description, 'member description', this.maxMetadataBytes),\n }),\n ...(options.instructions === undefined ? {} : {\n instructions: boundedString(options.instructions, 'member instructions', this.maxMetadataBytes),\n }),\n }\n this.roster.set(name, member)\n this.emit({ type: 'member-attached', member: this.view(member) })\n }\n\n /** Link one remote transport, including an official A2A protocol client. */\n linkAgent(options: LinkAgentOptions): () => void {\n this.assertActive()\n const name = memberName(options.name)\n this.assertAddressAvailable(name)\n this.assertCapacity()\n if (typeof options.transport?.send !== 'function') {\n throw new TypeError('linked agent transport must implement send()')\n }\n const member: RemoteMemberRuntime = {\n kind: 'remote', name, role: 'peer', transport: options.transport,\n tail: Promise.resolve(), pending: 0, controllers: new Set(), error: undefined,\n ...(options.description === undefined ? {} : {\n description: boundedString(options.description, 'linked agent description', this.maxMetadataBytes),\n }),\n }\n this.links.set(name, member)\n this.emit({ type: 'member-linked', member: this.view(member) })\n return () => {\n if (this.links.get(name) !== member) return\n if (member.pending > 0) throw new Error(`cannot unlink running A2A member '${name}'`)\n this.links.delete(name)\n }\n }\n\n /** Remove exactly one idle local session registration. */\n detach(name: string): void {\n this.assertActive()\n const member = this.requireLocalMember(name)\n if (member.session.isRunning || member.wakeTask !== undefined) {\n throw new Error(`cannot detach running A2A member '${member.name}'`)\n }\n this.roster.delete(member.name)\n }\n\n /** Current detached roster: local members first, then remote links. */\n members(): readonly AgentTeamMember[] {\n return Object.freeze([\n ...this.roster.values(),\n ...this.links.values(),\n ].map(member => this.view(member)))\n }\n\n /** Immutable audit log. Local target history remains its resumable receipt. */\n messages(): readonly AgentMessageRecord[] {\n return deepCloneFreeze(this.mailbox)\n }\n\n /** Deliver to a local mailbox or dispatch through a linked remote transport. */\n async sendMessage(request: SendAgentMessageRequest): Promise<SendAgentMessageResult> {\n this.assertActive()\n request.signal?.throwIfAborted()\n const sender = this.requireLocalMember(request.from)\n const target = this.requireAddress(request.target)\n if (target.kind === 'local' && sender === target) throw new Error('an A2A member cannot message itself')\n const delivery = request.delivery ?? 'quiet'\n if (delivery !== 'quiet' && delivery !== 'wakeup') {\n throw new TypeError(\"A2A delivery must be 'quiet' or 'wakeup'\")\n }\n if (target.kind === 'remote' && delivery === 'quiet') {\n throw new Error(\n `remote A2A member '${target.name}' cannot accept quiet injection; use followup_task or delivery 'wakeup'`,\n )\n }\n const id = newMessageId()\n const content = messageContent(request.message, this.maxMessageBytes)\n const framed = deepCloneFreeze([\n { type: 'text' as const, text: `A2A message ${id} from ${sender.name}:` },\n ...content,\n ])\n const contentBytes = byteLength(framed)\n if (contentBytes > this.maxMessageBytes) {\n throw new Error(`A2A message exceeds the ${this.maxMessageBytes}-byte limit`)\n }\n const reservedBytes = target.kind === 'remote'\n ? contentBytes + this.maxLinkedResultBytes\n : contentBytes\n const releaseReservation = this.reserveMailbox(reservedBytes)\n\n let result: LinkedAgentResult | undefined\n try {\n if (target.kind === 'local') {\n const message = createUserMessage({\n source: {\n kind: 'agent-message' as const,\n teamId: this.id, messageId: id, sender: sender.name,\n senderAgentId: sender.session.definition.id,\n },\n content: framed,\n })\n const seq = target.session.inject(message)\n if (delivery === 'wakeup') this.scheduleWake(target, seq)\n } else {\n result = await this.dispatchRemote(target, {\n teamId: this.id, messageId: id, sender: sender.name,\n senderAgentId: sender.session.definition.id, content: framed,\n ...(request.signal === undefined ? {} : { signal: request.signal }),\n })\n }\n\n const record: AgentMessageRecord = deepCloneFreeze({\n id, teamId: this.id, sender: sender.name,\n senderAgentId: sender.session.definition.id,\n target: target.name,\n targetAgentId: target.kind === 'local'\n ? target.session.definition.id\n : target.transport.agentId,\n delivery, content: framed, status: 'accepted' as const,\n createdAt: new Date().toISOString(),\n ...(result === undefined ? {} : { result }),\n })\n const retainedBytes = contentBytes + (result === undefined ? 0 : byteLength(result))\n this.mailbox.push(record)\n this.mailboxBytes += retainedBytes\n this.emit({ type: 'message-accepted', message: deepCloneFreeze(record) })\n return deepCloneFreeze({\n messageId: id, status: 'accepted' as const, delivery, target: target.name,\n ...(result === undefined ? {} : { result }),\n })\n } finally {\n releaseReservation()\n }\n }\n\n /** Wake-up alias used by hosts and model tools. */\n followup(\n from: string,\n target: string,\n message: string | readonly ContentBlock[],\n signal?: AbortSignal,\n ): Promise<SendAgentMessageResult> {\n return this.sendMessage({\n from, target, message, delivery: 'wakeup',\n ...(signal === undefined ? {} : { signal }),\n })\n }\n\n /** Wait until all local wake-up work or remote dispatches settle. */\n async whenIdle(name: string, signal?: AbortSignal): Promise<void> {\n const member = this.requireAddress(name)\n if (member.kind === 'remote') {\n while (true) {\n const tail = member.tail\n await abortable(tail, signal)\n if (tail === member.tail && member.pending === 0) break\n }\n return\n }\n while (true) {\n const requested = member.wakeRequestedSeq\n const task = member.wakeTask\n // A member the host is holding back has not finished; it has not begun.\n // Waiting on its session would be answered at once, and the waiter would\n // read that as work completed.\n const held = member.pendingStart\n if (held !== undefined) await abortable(held, signal)\n if (task !== undefined) await abortable(task, signal)\n await member.session.whenIdle(signal)\n if (member.wakeTask === undefined && !member.session.isRunning\n && member.pendingStart === undefined\n && member.wakeConsumedSeq >= member.wakeRequestedSeq\n && requested === member.wakeRequestedSeq) return\n }\n }\n\n /**\n * Report that the user steered something into a local member mid-turn.\n *\n * Ends whatever that member is currently waiting on. A member parked in\n * `wait_agents` would otherwise finish its budget before reading a correction\n * that has been sitting in its history the whole time; Codex ends its\n * `wait_agent` early on steered input for the same reason.\n * @param name - Local member address.\n */\n notifySteer(name: string): void {\n const member = this.requireLocalMember(name)\n const controller = member.steerController\n member.steerController = undefined\n controller?.abort(new Error('user input steered into the active turn'))\n }\n\n /**\n * Schedule one turn for a local member over context it already has.\n *\n * A wake-up delivery carries a message; this carries nothing. It exists for\n * the case where the context arrived earlier and quietly — appended to a\n * member that was mid-turn, on the assumption its next model round would read\n * it — and that round never came. Without this the message sits in history\n * with nothing left to read it.\n * @param name - Local member address.\n */\n wake(name: string): void {\n const member = this.requireLocalMember(name)\n this.scheduleWake(member, member.wakeRequestedSeq + 1)\n }\n\n /** Cancel team-owned scheduled work for one member without mutating its history. */\n async cancel(name: string, reason: unknown = new Error('A2A member work cancelled')): Promise<void> {\n const member = this.requireAddress(name)\n if (member.kind === 'remote') {\n for (const controller of member.controllers) controller.abort(reason)\n await withTimeout(\n member.tail,\n this.disposeTimeoutMs,\n `A2A member '${member.name}' did not cancel within ${this.disposeTimeoutMs}ms`,\n 'TEAM_CANCELLATION_TIMEOUT',\n )\n return\n }\n member.wakeConsumedSeq = member.wakeRequestedSeq\n const controller = member.wakeController\n const task = member.wakeTask\n controller?.abort(reason)\n if (task !== undefined) {\n await withTimeout(\n task,\n this.disposeTimeoutMs,\n `A2A member '${member.name}' did not cancel within ${this.disposeTimeoutMs}ms`,\n 'TEAM_CANCELLATION_TIMEOUT',\n )\n }\n }\n\n /** Permanently close this control plane and cancel every team-owned operation. */\n dispose(reason: unknown = new Error('A2A team disposed')): Promise<void> {\n if (this.disposeTask !== undefined) return this.disposeTask\n this.disposed = true\n this.lifecycle.abort(reason)\n const settling = Promise.allSettled([\n ...[...this.roster.values()].map(member => this.cancel(member.name, reason)),\n ...[...this.links.values()].map(member => this.cancel(member.name, reason)),\n ]).then(results => {\n this.roster.clear()\n this.links.clear()\n this.emit({ type: 'team-disposed', teamId: this.id })\n this.mailbox.length = 0\n this.mailboxBytes = 0\n this.waitEdges.clear()\n this.onEvent = undefined\n this.onAgentEvent = undefined\n const failure = results.find((result): result is PromiseRejectedResult => result.status === 'rejected')\n if (failure !== undefined) {\n throw new AgentSdkError(\n `A2A team '${this.id}' did not dispose within ${this.disposeTimeoutMs}ms`,\n 'TEAM_DISPOSE_TIMEOUT',\n { cause: failure.reason },\n )\n }\n })\n this.disposeTask = withTimeout(\n settling,\n this.disposeTimeoutMs,\n `A2A team '${this.id}' did not dispose within ${this.disposeTimeoutMs}ms`,\n 'TEAM_DISPOSE_TIMEOUT',\n )\n return this.disposeTask\n }\n\n /** Model-facing tools bound to one immutable local sender identity. */\n toolsFor(sender: string, access: TeamToolAccess = 'full'): readonly ToolDefinition<any>[] {\n this.assertActive()\n const name = memberName(sender)\n // Called before `attach`, so the access level arrives as an argument\n // rather than being looked up on the member that does not exist yet.\n const coordinating = access === 'full'\n // Coordination is not exploration. A lead that has spent its tool budget\n // still has to be able to hand the work over and collect it; blocking\n // these is what strands a team run with finished members and no report.\n return Object.freeze([\n defineTool({\n name: TEAM_TOOL_NAMES.list,\n budgetExempt: true,\n description: 'List local and remote addressable agents, their protocols, supported delivery modes, and status.',\n parameters: { type: 'object', properties: {}, additionalProperties: false },\n parse: raw => emptyObject(raw, 'list_agents'),\n execute: () => asJson(this.members()),\n isConcurrencySafe: () => true,\n }),\n defineTool({\n name: TEAM_TOOL_NAMES.send,\n budgetExempt: true,\n description: 'Send quiet context to another local agent from list_agents, other than yourself.'\n + ' This does not start a task or return its final result. Remote A2A peers require followup_task.',\n parameters: messageToolSchema('Message to add to the target context.'),\n parse: parseMessageTool,\n execute: async ({ target, message }, ctx) => asJson(await this.sendMessage({\n from: name, target, message, delivery: 'quiet', signal: ctx.signal,\n })),\n }),\n ...!coordinating ? [] : [defineTool({\n name: TEAM_TOOL_NAMES.followup,\n budgetExempt: true,\n description: 'Send active work to a local agent or interoperable remote A2A peer and wait for its accepted result.',\n parameters: messageToolSchema('Follow-up instruction the target must process.'),\n parse: parseMessageTool,\n execute: async ({ target, message }, ctx) => asJson(\n await this.followup(name, target, message, ctx.signal),\n ),\n })],\n ...!coordinating ? [] : [defineTool({\n name: TEAM_TOOL_NAMES.wait,\n budgetExempt: true,\n description: 'Wait until one of the selected local or remote agents finishes its scheduled'\n + ' work, then return their current roster state. Returns early with interrupted=true when'\n + ' the user sends you something while you wait, so read that before waiting again.',\n parameters: {\n type: 'object',\n properties: {\n targets: {\n type: 'array', items: { type: 'string' }, minItems: 1,\n description: 'Exact agent names returned by list_agents.',\n },\n timeoutMs: {\n type: 'number',\n description:\n `Give up after this long and report instead, default ${String(this.waitTimeoutMs)}.`\n + ` Anything under ${String(this.minWaitTimeoutMs)} is raised to it: a wait too short to`\n + ` finish anything costs a model round and returns the roster unchanged.`,\n },\n },\n required: ['targets'], additionalProperties: false,\n },\n parse: parseWaitTool,\n execute: async ({ targets, timeoutMs }, ctx) => {\n const release = this.beginWait(name, targets)\n const budget = timeoutMs === undefined\n ? this.waitTimeoutMs\n : Math.min(\n Math.max(timeoutValue(timeoutMs), this.minWaitTimeoutMs),\n this.waitTimeoutMs,\n )\n try {\n // Returns as soon as the FIRST target settles, and always within\n // the budget. Waiting for all of them, forever, is what turned one\n // slow agent into a window that looked hung: a coordinator that\n // gets the roster back can decide for itself whether to wait again.\n //\n // The budget is enforced HERE rather than only by handing members a\n // deadline signal: a member that does not honour the signal would\n // otherwise hold the wait open past its own timeout, and a timeout\n // a callee can ignore is not a timeout.\n // A wait that cannot be interrupted is a wait the user cannot\n // correct: the caller is parked here, so its own new input has\n // nothing else to end it before the budget runs out.\n const steer = new AbortController()\n const caller = this.roster.get(memberName(sender))\n if (caller !== undefined) caller.steerController = steer\n const signal = combineSignals(ctx.signal, AbortSignal.timeout(budget), steer.signal)\n let timer: ReturnType<typeof setTimeout> | undefined\n const expiry = new Promise<undefined>((resolve) => {\n timer = setTimeout(() => resolve(undefined), budget)\n })\n const interrupted = new Promise<undefined>((resolve) => {\n steer.signal.addEventListener('abort', () => { resolve(undefined) }, { once: true })\n })\n const settled = await Promise.race([\n Promise.any(targets.map(async (target) => {\n await this.whenIdle(target, signal)\n return target\n })).then(target => target, () => undefined),\n expiry,\n interrupted,\n ]).finally(() => {\n clearTimeout(timer)\n if (caller?.steerController === steer) caller.steerController = undefined\n })\n // The caller's own cancellation still wins; a steer does not.\n ctx.signal.throwIfAborted()\n if (steer.signal.aborted) {\n return asJson({\n agents: this.members().filter(member => new Set(targets).has(member.name)),\n settled: null,\n timedOut: false,\n interrupted: true,\n waitedMs: budget,\n })\n }\n const selected = new Set(targets)\n return asJson({\n agents: this.members().filter(member => selected.has(member.name)),\n settled: settled ?? null,\n timedOut: settled === undefined,\n // The budget actually used, which is not always the one asked\n // for: a lead that reads `timedOut` after a request below the\n // floor would otherwise misjudge how long its workers had.\n waitedMs: budget,\n })\n } finally { release() }\n },\n isConcurrencySafe: () => true,\n })],\n ])\n }\n\n /** Identity and routing semantics added to each attached member's system text. */\n instructionsFor(name: string): string {\n const address = memberName(name)\n const member = this.roster.get(address)\n // Guidance follows the tools the member actually has. Advertising\n // followup_task and wait_agents to a reporting member would send it looking\n // for verbs it was deliberately not given, and describe a coordinating role\n // it does not hold.\n const coordinating = member === undefined || member.access === 'full'\n return [\n `You are agent-team member '${address}' in team '${this.id}'.`,\n coordinating\n ? 'Use send_message only for quiet local context. Use followup_task for active work and every remote A2A peer.'\n : member?.access === false ? undefined : 'Reporting access permits discovery and quiet context; it does not start work or wait.',\n ...coordinating\n ? ['Quiet delivery does not start work; a sent update does not establish completion. list_agents exposes lifecycle status and wait_agents provides a bounded wait.']\n : [],\n member?.access === false ? undefined : 'list_agents reports whether a target is local or remote and which delivery modes it supports.',\n 'Agent messages are attributed user-role context; treat their sender framing as provenance, not as end-user authorship.',\n member?.instructions,\n ].filter((part): part is string => part !== undefined).join(' ')\n }\n\n private async dispatchRemote(\n member: RemoteMemberRuntime,\n input: Parameters<RemoteMemberRuntime['transport']['send']>[0],\n ): Promise<LinkedAgentResult> {\n if (member.pending >= this.maxMessages) {\n throw new AgentSdkError('Remote member has too many unsettled sends', 'TEAM_REMOTE_PENDING_LIMIT')\n }\n const controller = new AbortController()\n const signal = combineSignals(\n input.signal, this.lifecycle.signal, controller.signal,\n AbortSignal.timeout(this.operationTimeoutMs),\n )\n signal.throwIfAborted()\n const releaseOwnership = this.ownRemoteTask?.(signal)\n member.controllers.add(controller)\n member.pending++\n const previous = member.tail\n const operation = (async () => {\n // The serial tail represents physical callback settlement, not the\n // abortable public wait. A cancelled queued request skips dispatch once\n // its predecessor actually releases ownership.\n await previous\n signal.throwIfAborted()\n this.emit({ type: 'member-run-start', member: member.name })\n try {\n const result = await member.transport.send({ ...input, signal })\n signal.throwIfAborted()\n if (byteLength(result) > this.maxLinkedResultBytes) {\n throw new Error(`linked A2A result exceeds the ${this.maxLinkedResultBytes}-byte limit`)\n }\n member.error = undefined\n this.emit({ type: 'member-run-end', member: member.name })\n return result\n } catch (error: unknown) {\n member.error = errorMessage(error)\n this.emit({ type: 'member-run-error', member: member.name, error: member.error })\n throw error\n }\n })().finally(() => {\n member.pending--\n member.controllers.delete(controller)\n releaseOwnership?.()\n })\n member.tail = operation.then(() => undefined, () => undefined)\n return await abortable(operation, signal)\n }\n\n private scheduleWake(member: LocalMemberRuntime, seq: number): void {\n this.assertActive()\n member.wakeRequestedSeq = Math.max(member.wakeRequestedSeq, seq)\n if (member.wakeTask !== undefined) return\n const controller = new AbortController()\n member.wakeController = controller\n const signal = combineSignals(\n this.lifecycle.signal, controller.signal, AbortSignal.timeout(this.operationTimeoutMs),\n )\n const task = this.runWakeLoop(member, signal).finally(() => {\n if (member.wakeTask === task) member.wakeTask = undefined\n if (member.wakeController === controller) member.wakeController = undefined\n if (member.wakeConsumedSeq < member.wakeRequestedSeq) {\n this.scheduleWake(member, member.wakeRequestedSeq)\n }\n })\n member.wakeTask = task\n }\n\n /** Serialized content ceiling used by host-generated notifications. */\n get messageByteLimit(): number { return this.maxMessageBytes }\n\n private async runWakeLoop(member: LocalMemberRuntime, signal: AbortSignal): Promise<void> {\n let cancellationReported = false\n try {\n while (member.wakeConsumedSeq < member.wakeRequestedSeq) {\n signal.throwIfAborted()\n await member.session.whenIdle(signal)\n const through = member.wakeRequestedSeq\n // The run that was active may already have answered this delivery\n // (it answers a person's queued input before it ends, and delivers\n // anything queued with it). Running again would only repeat itself.\n if (member.session.hasUnansweredInput?.() === false) {\n member.wakeConsumedSeq = through\n continue\n }\n this.emit({ type: 'member-run-start', member: member.name })\n try {\n const response = await member.session.runPending({\n signal,\n onEvent: event => this.observeAgentEvent(member.name, event),\n })\n if (signal.aborted) {\n member.wakeConsumedSeq = through\n this.emit({ type: 'member-run-cancelled', member: member.name })\n cancellationReported = true\n continue\n }\n member.error = undefined\n // Recorded so a coordinator can read the member's answer from the\n // roster. `runPending` hands it to whoever awaited the run, and with\n // a wake-up delivery that is nobody.\n const failure = responseFailure(response)\n member.error = failure\n member.outcome = failure === undefined\n ? { kind: 'completed', text: responseText(response) }\n : { kind: 'failed', message: failure, ...(responseText(response) === '' ? {} : { text: responseText(response) }) }\n member.wakeConsumedSeq = through\n if (failure === undefined) this.emit({ type: 'member-run-end', member: member.name })\n else this.emit({ type: 'member-run-error', member: member.name, error: failure })\n } catch (error: unknown) {\n if (signal.aborted) {\n member.error = undefined\n member.wakeConsumedSeq = through\n this.emit({ type: 'member-run-cancelled', member: member.name })\n cancellationReported = true\n continue\n }\n if (member.session.isRunning) continue\n member.error = errorMessage(error)\n member.outcome = { kind: 'failed', message: member.error }\n member.wakeConsumedSeq = through\n this.emit({ type: 'member-run-error', member: member.name, error: member.error })\n }\n }\n } catch (error: unknown) {\n if (!signal.aborted) throw error\n member.error = undefined\n member.wakeConsumedSeq = member.wakeRequestedSeq\n if (!cancellationReported) this.emit({ type: 'member-run-cancelled', member: member.name })\n }\n }\n\n private requireLocalMember(value: string): LocalMemberRuntime {\n const name = memberName(value)\n const member = this.roster.get(name)\n if (member === undefined) throw new Error(`unknown local A2A member '${name}'`)\n return member\n }\n\n /**\n * Record that `sender` is blocked until `targets` are idle.\n *\n * The `wait_agents` tool calls this, and so must any HOST that blocks one\n * member on another. An unrecorded edge is invisible here, which is worse\n * than having no detection at all: the cycle it completes gets waved through,\n * and both sides then wait for each other until a timeout expires.\n *\n * `spawn_agent` used to be such a host — it awaited the worker it created —\n * and needed an edge declared for it. It no longer waits, so the cycle it\n * could close no longer exists.\n * @param sender - The member that will block.\n * @param targets - Members it is waiting for.\n * @returns A release; call it when the wait ends, however it ends.\n * @throws `TEAM_WAIT_CYCLE` when the wait would close a cycle.\n */\n beginWait(sender: string, targets: readonly string[]): () => void {\n for (const target of targets) {\n this.requireAddress(target)\n if (target === sender || this.hasWaitPath(target, sender, new Set())) {\n throw new AgentSdkError('wait_agents would create a coordination cycle', 'TEAM_WAIT_CYCLE')\n }\n }\n let outgoing = this.waitEdges.get(sender)\n if (outgoing === undefined) {\n outgoing = new Map()\n this.waitEdges.set(sender, outgoing)\n }\n for (const target of targets) outgoing.set(target, (outgoing.get(target) ?? 0) + 1)\n let active = true\n return () => {\n if (!active) return\n active = false\n const edges = this.waitEdges.get(sender)\n if (edges === undefined) return\n for (const target of targets) {\n const count = edges.get(target) ?? 0\n if (count <= 1) edges.delete(target); else edges.set(target, count - 1)\n }\n if (edges.size === 0) this.waitEdges.delete(sender)\n }\n }\n\n private hasWaitPath(from: string, target: string, visited: Set<string>): boolean {\n if (from === target) return true\n if (visited.has(from)) return false\n visited.add(from)\n for (const next of this.waitEdges.get(from)?.keys() ?? []) {\n if (this.hasWaitPath(next, target, visited)) return true\n }\n return false\n }\n\n private requireAddress(value: string): AddressableMember {\n const name = memberName(value)\n const member = this.roster.get(name) ?? this.links.get(name)\n if (member === undefined) throw new Error(`unknown A2A member '${name}'`)\n return member\n }\n\n private assertAddressAvailable(name: string): void {\n if (this.roster.has(name) || this.links.has(name)) {\n throw new Error(`A2A member '${name}' is already attached or linked`)\n }\n }\n\n private assertCapacity(): void {\n if (this.roster.size + this.links.size >= this.maxMembers) {\n throw new Error(`A2A team '${this.id}' reached its ${this.maxMembers}-member limit`)\n }\n }\n\n private assertActive(): void {\n if (this.disposed) throw new Error(`A2A team '${this.id}' is disposed`)\n }\n\n private reserveMailbox(contentBytes: number): () => void {\n if (this.mailbox.length + this.pendingMessages >= this.maxMessages) {\n throw new Error(`A2A team '${this.id}' reached its ${this.maxMessages}-message mailbox limit`)\n }\n if (this.mailboxBytes + this.pendingMailboxBytes + contentBytes > this.maxMailboxBytes) {\n throw new Error(`A2A team '${this.id}' reached its ${this.maxMailboxBytes}-byte mailbox limit`)\n }\n this.pendingMessages++\n this.pendingMailboxBytes += contentBytes\n let released = false\n return () => {\n if (released) return\n released = true\n this.pendingMessages--\n this.pendingMailboxBytes -= contentBytes\n }\n }\n\n /**\n * Record how a member's run ended.\n *\n * For a host that starts a member's run itself and therefore owns the result\n * the member's own bookkeeping never sees — `spawn_agent` running a worker\n * concurrently. Without this the roster could report that a worker had\n * stopped but not what it concluded, which is the whole point of asking.\n * @param name - Member address.\n * @param outcome - How the run ended.\n */\n recordOutcome(name: string, outcome: AgentMemberOutcome): void {\n const member = this.requireLocalMember(name)\n member.outcome = outcome\n member.error = outcome.kind === 'failed' ? outcome.message : undefined\n }\n\n /**\n * Declare that a member exists but has deliberately not been started.\n *\n * A host that orders work — starting one member only once another has\n * finished — needs the roster to say so, and `wait_agents` to believe it. A\n * member whose session has never run looks exactly like one that has\n * finished: idle, not running, nothing outstanding. A coordinator told that\n * would wait on it, be answered at once, read no outcome, and conclude the\n * work was done.\n *\n * The promise is what `whenIdle` waits on, so the pending state cannot be a\n * flag that a waiter has to poll.\n * @param name - Local member address.\n * @param until - Resolves when the host starts it; undefined clears the state.\n */\n markPending(name: string, until: Promise<void> | undefined): void {\n this.requireLocalMember(name).pendingStart = until\n }\n\n private view(member: AddressableMember): AgentTeamMember {\n if (member.kind === 'remote') {\n return Object.freeze({\n name: member.name, agentId: member.transport.agentId, kind: 'remote' as const,\n role: member.role,\n status: member.error === undefined ? (member.pending > 0 ? 'running' : 'idle') : 'failed',\n protocol: member.transport.protocol,\n deliveries: Object.freeze(['wakeup'] as const),\n ...(member.description === undefined ? {} : { description: member.description }),\n ...(member.error === undefined ? {} : { error: member.error }),\n })\n }\n return Object.freeze({\n name: member.name, agentId: member.session.definition.id, kind: 'local' as const,\n conversationId: member.session.conversationId, role: member.role,\n status: member.error !== undefined\n ? 'failed'\n : member.pendingStart !== undefined\n ? 'pending'\n : member.session.isRunning || member.wakeTask !== undefined ? 'running' : 'idle',\n protocol: 'in-process', deliveries: Object.freeze(['quiet', 'wakeup'] as const),\n ...(member.description === undefined ? {} : { description: member.description }),\n ...(member.error === undefined ? {} : { error: member.error }),\n ...(member.outcome === undefined ? {} : { outcome: member.outcome }),\n })\n }\n\n private emit(event: AgentTeamEvent): void {\n try { this.onEvent?.(event) } catch { /* observers do not own control-plane correctness */ }\n }\n\n private async observeAgentEvent(member: string, event: AgentRunEvent): Promise<void> {\n if (this.onAgentEvent === undefined) return\n const observer = Promise.resolve().then(() => this.onAgentEvent?.(member, event))\n await waitForSettlement(observer, this.observerTimeoutMs)\n }\n}\n\n/**\n * The answer text out of a run result.\n *\n * `TeamSessionPort.runPending` returns `unknown` on purpose — the port exists so\n * the control plane does not depend on the concrete session — so the one field\n * needed here is read structurally.\n * @param response - Whatever the member's run resolved with.\n * @returns Its text, or the empty string.\n */\nfunction responseText(response: unknown): string {\n const text = (response as { text?: unknown } | null)?.text\n return typeof text === 'string' ? text : ''\n}\n\n/** Session implementations may resolve an incomplete terminal response rather than reject. */\nfunction responseFailure(response: unknown): string | undefined {\n if (response === null || typeof response !== 'object') return undefined\n const value = response as { completed?: unknown; outcome?: { completed?: unknown; reason?: { kind?: unknown; failure?: { message?: unknown } } }; stopReason?: { kind?: unknown } }\n const reason = value.outcome?.reason ?? value.stopReason\n if (value.outcome?.completed === false || value.completed === false\n || reason?.kind === 'error' || reason?.kind === 'max-tokens' || reason?.kind === 'aborted' || reason?.kind === 'usage-unavailable') {\n const message = value.outcome?.reason?.failure?.message\n return typeof message === 'string' ? message : `member run did not complete (${String(reason?.kind ?? 'unknown')})`\n }\n return undefined\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{isJsonValue as e}from"../../primitives/json.js";import{detachedFrozen as t}from"../../primitives/snapshot.js";import{AgentSdkError as n}from"../../errors/agent-sdk-error.js";import{freezeMessage as r}from"../../message/message.js";import{capabilityIdentityError as i,inheritCapabilityIdentityConflict as a}from"../../errors/capability-identity.js";import{createRunTerminalRecord as o}from"../../agent/accounting/delivery/terminal.js";import{atDeadline as s}from"../lifecycle/bounded.js";import{AgentRunError as c}from"../../agent/accounting/error.js";import{TOOL_ERROR_CODES as l}from"../../agent/tool/errors.js";import{compactRuntimeSession as u,configureRuntimeSessionModel as d,streamPendingRuntimeSession as f,streamRuntimeSession as p}from"../../agent/define/session/runtime-binding.js";import{assertAgentIdentitySnapshot as m}from"../identity/agent.js";import{publicMessage as h}from"./public-message.js";import{finalizeRuntimeRunReport as g}from"../observation/final-report.js";import{snapshotToolSources as _}from"../tool-source/snapshot.js";import{createRuntimeMemoryPersistence as v}from"../memory/run.js";import{validateMemoryResumeBinding as y}from"../memory/resume.js";import{captureInvocationOptions as b,captureRuntimeSessionOptions as x}from"./options.js";import{projectNativeToolEvent as S}from"./native-event.js";const C=new WeakMap;function w(e,t){let n=Object.freeze({model:t.model,generate(n,r){return O(e,t).run(n,r)},stream(n,r){return O(e,t).stream(n,r)},createSession(n){return O(e,t,n)},resumeSession(n,r){return O(e,t,r,n)}});return C.set(n,Object.freeze({host:e,definition:t})),n}function T(e,t,r,i,a){let o=C.get(t);if(o?.host!==e)throw new n(`Runtime team members must be agents from the same runtime`,`TEAM_AGENT_OWNERSHIP_INVALID`);let s=O(e,o.definition,r,void 0,i,a);return Object.freeze({view:s,port:s.teamPort})}function E(e,t,r,i){let a=C.get(t);if(a?.host!==e)throw new n(`Runtime team members must be agents from the same runtime`,`TEAM_AGENT_OWNERSHIP_INVALID`);m({tools:[...a.definition.legacy.tools,...r.tools??[]],nativeTools:a.definition.legacy.nativeTools,skills:[...a.definition.legacy.skills,...r.skills??[]],...a.definition.legacy.skillIds===void 0?{}:{allowedSkillIds:a.definition.legacy.skillIds},additionalToolNames:i})}var D=class{host;session;nativeProvider;ownerSignal;active;observerTimeoutMs;teamPort;constructor(e,t,n,r,i=3e4,a){this.host=e,this.session=t,this.nativeProvider=n,this.ownerSignal=a,this.observerTimeoutMs=i;let o=this;this.teamPort=Object.freeze({definition:Object.freeze({id:r}),get conversationId(){return o.conversationId},get isRunning(){return o.isRunning},inject(e){return o.injectForTeam(e)},whenIdle(e){return o.whenIdle(e)},runPending(e={}){return o.runPendingForTeam(e)}})}get conversationId(){return this.session.conversationId}get isRunning(){return this.active!==void 0}stream(e,t){if(typeof e!=`string`){if(typeof e!=`object`||!e||e.role!==`user`)throw TypeError(`Runtime input must be text or a user message`);e=r(e)}let n=b(t,this.host.selection),i=this.start(e,n);return j(i.legacy,i.report,i.result,this.nativeProvider,n.includeTraceEvents===!0)}start(n,r){let i=this.beginOperation(),a;try{let e=this.ownerSignal===void 0?r.signal:r.signal===void 0?this.ownerSignal:AbortSignal.any([r.signal,this.ownerSignal]);a=this.host.operations.acquire(`agent-run`,{...e===void 0?{}:{signal:e}})}catch(e){throw this.finishOperation(i),e}let o,s=r.structuredOutput,c;try{c=n===void 0?f(this.session,{signal:a.signal,...k(r)}):p(this.session,n,{signal:a.signal,...k(r),...s===void 0?{}:{outputFormat:{type:`json_schema`,name:s.name,schema:s.schema.jsonSchema},validateOutput:n=>{let r=s.schema.parse(n);if(!e(r))throw TypeError(`structured output parser must return lossless JSON synchronously`);o=t(r)}},...r.imagePolicy===void 0?{}:{imagePolicy:r.imagePolicy},...r.documentPolicy===void 0?{}:{documentPolicy:r.documentPolicy}},r.additionalInstructions)}catch(e){throw a.settle(),this.finishOperation(i),e}let l=()=>c.abort();a.signal.addEventListener(`abort`,l,{once:!0}),a.signal.aborted&&l(),a.whenSealed.then(()=>c.seal()).catch(()=>void 0);let u=this.runtimeReport(c.report,c.toolSourceSnapshots,a.signal),d=this.runtimeResult(c.result,u,()=>o),m=Promise.race([c.eventsSettled,a.whenSealed]),h=Promise.allSettled([m,d,u]).then(()=>{a.signal.removeEventListener(`abort`,l),a.settle(),this.finishOperation(i)}).then(()=>d);return h.catch(()=>void 0),u.catch(()=>void 0),Object.freeze({legacy:c,report:u,result:h})}async run(e,t){let n=b(t,this.host.selection),r=this.stream(e,n);try{for await(let e of r)if(n.onEvent!==void 0)try{await this.observe(n.onEvent,e,r)}catch(e){throw r.abort(),L(e,await r.report,`RUN_EVENT_OBSERVER_FAILED`)}}catch(e){if(I(e)===`RUN_EVENT_OBSERVER_FAILED`)throw e;return await r.result}return await r.result}inject(e){if(this.host.operations.assertActive(),this.assertOwnerActive(),this.active!==void 0)throw Error(`Cannot inject while a runtime session is active`);return this.session.inject(e)}injectForTeam(e){return this.host.operations.assertActive(),this.assertOwnerActive(),this.session.inject(e)}snapshot(){return this.session.snapshot()}compact(e){let t=b(e,this.host.selection),n=this.beginOperation(),r;try{r=this.host.operations.execute(`manual-compaction`,{...this.ownerSignal===void 0?t.signal===void 0?{}:{signal:t.signal}:{signal:t.signal===void 0?this.ownerSignal:AbortSignal.any([t.signal,this.ownerSignal])}},async e=>{let n=await u(this.session,{signal:e.signal,...k(t)}),r=o(n.report),i=await this.host.observation.checkpointTerminal(r,e.signal),a=g(r,n.report.delivery,i,this.host.observation.mode,this.host.observation.requiredBoundary);if(n.failure!==void 0)throw L(n.failure,a,a.errors.at(-1)?.code??I(n.failure));return n.result===null?null:Object.freeze({...n.result,status:`completed`,report:a})})}catch(e){throw this.finishOperation(n),e}return r.finally(()=>this.finishOperation(n))}reset(){if(this.host.operations.assertActive(),this.assertOwnerActive(),this.active!==void 0)throw Error(`Cannot reset while a runtime session is active`);this.session.reset()}whenIdle(e){let t=this.active?.done;return t===void 0?Promise.resolve():e?.aborted?Promise.reject(new n(`Runtime idle wait was aborted`,`RUNTIME_OPERATION_ABORTED`)):new Promise((r,i)=>{let a=()=>void 0,o=e=>{a(),e===void 0?r():i(e)};e!==void 0&&(a=this.host.resources.onAbort(e,()=>o(new n(`Runtime idle wait was aborted`,`RUNTIME_OPERATION_ABORTED`)))),t.then(()=>o())})}async runPendingForTeam(e){let t=this.start(void 0,{...e.signal===void 0?{}:{signal:e.signal}});try{for await(let n of t.legacy)await e.onEvent?.(n)}catch(e){throw t.legacy.abort(),await t.result.catch(()=>void 0),e}return await t.result}beginOperation(){if(this.assertOwnerActive(),this.active!==void 0)throw Error(`Cannot start while a runtime session is active`);let e,t={done:new Promise(t=>{e=t}),resolve:e};return this.active=t,t}finishOperation(e){this.active===e&&(this.active=void 0,e.resolve())}assertOwnerActive(){if(this.ownerSignal?.aborted===!0)throw new n(`Runtime team session is closed`,`TEAM_CLOSED`)}async runtimeReport(e,t,n){let[r,i]=await Promise.all([e,t]),a=o(r,i),s=await this.host.observation.checkpointTerminal(a,n);return g(a,r.delivery,s,this.host.observation.mode,this.host.observation.requiredBoundary)}async runtimeResult(e,t,n){try{let r=await e,i=await t;if(i.status!==`success`)throw L(void 0,i,i.errors.at(-1)?.code??`AGENT_RUN_FAILED`);let a=n();return Object.freeze({runId:i.runId,traceId:i.traceId,completed:r.outcome.completed,stopReason:r.outcome.reason.kind,text:r.text,...a===void 0?{}:{output:a},...r.message===void 0?{}:{message:h(r.message)},usage:i.usage,report:i})}catch(e){throw L(e,await t,I(e))}}async observe(e,t,r){let i=this.host.resources.platform.monotonicNow()+this.observerTimeoutMs;try{await s(this.host.resources,i,()=>e(t),void 0)}catch{throw r.abort(),new n(`Runtime event observer did not complete`,`RUN_EVENT_OBSERVER_FAILED`)}}};function O(e,t,n={},r,i,a){e.operations.assertActive(),n=x(n),m({tools:[...t.legacy.tools,...n.tools??[]],nativeTools:t.legacy.nativeTools,skills:[...t.legacy.skills,...n.skills??[]],...t.legacy.skillIds===void 0?{}:{allowedSkillIds:t.legacy.skillIds}});let o=n.memory===!1?void 0:n.memory??t.memory;r!==void 0&&y(r,o);let s=A(t.toolSources,n.toolSources??[]),c=n.runtimeLimits,{maxSteps:l,maxToolCalls:u,...f}=c??{},p=c?.maxSteps===void 0&&c?.maxToolCalls===void 0?t.legacy:t.legacy.with({...c.maxSteps===void 0?{}:{maxTurns:c.maxSteps},...c.maxToolCalls===void 0?{}:{maxToolCalls:c.maxToolCalls}}),h={registry:e.registry,observation:e.observation,observationResource:e.resource,...n.tools===void 0?{}:{tools:n.tools},...n.skills===void 0?{}:{skills:n.skills},...n.skillCwd===void 0?{}:{skillCwd:n.skillCwd},...n.userInput===void 0?{}:{userInput:n.userInput},...n.approvals===void 0?{}:{approvals:n.approvals},...n.spillStore===void 0?{}:{spillStore:n.spillStore},...n.experimentalPrograms===void 0?{}:{experimentalPrograms:n.experimentalPrograms},...n.interceptors===void 0?{}:{interceptors:n.interceptors},...n.contextSections===void 0?{}:{contextSections:n.contextSections},...n.hooks===void 0?{}:{hooks:n.hooks},...n.usagePolicy===void 0?{}:{usagePolicy:n.usagePolicy},...n.historyLimits===void 0?{}:{historyLimits:n.historyLimits},...n.ledgerLimits===void 0?{}:{ledgerLimits:n.ledgerLimits},...n.eventBufferLimits===void 0?{}:{eventBufferLimits:n.eventBufferLimits},...n.compaction===void 0?{}:{compaction:n.compaction},...i===void 0?{}:{team:i},...Object.keys(f).length===0?{}:{runtimeLimits:f}},g=r===void 0?p.createSession({...h,...n.conversationId===void 0?{}:{conversationId:n.conversationId}}):p.resumeSession({...h,snapshot:r});return d(g,{provider:t.model.provider,model:t.model.id,...t.effort===void 0?{}:{reasoningEffort:t.effort},...t.maxTokens===void 0?{}:{maxTokens:t.maxTokens},logger:t=>e.observation.correlatedLogger(t,{scope:`sdk.agent.run`}),...s.length===0?{}:{prepareTools:(e,t,n)=>_(s,e,t,n)},...o===void 0?{}:{memory:v(o,t.legacy.id,f.memoryOperationTimeoutMs)}}),new D(e,g,t.model.provider,t.legacy.id,c?.observerTimeoutMs,a)}function k(e){return{...e.model===void 0?{}:{model:{provider:e.model.provider,model:e.model.id}},...e.maxTokens===void 0?{}:{maxTokens:e.maxTokens}}}function A(e,t){let n=[...e,...t],r=new Map;for(let[e,t]of n.entries()){let n=r.get(t.id);if(n!==void 0)throw i(`TOOL_SOURCE_ID_CONFLICT`,`tool-source-id`,n,e);r.set(t.id,e)}return Object.freeze(n)}function j(e,t,n,r,i){let a=!1;return Object.freeze({runId:e.runId,report:t,result:n,abort:()=>e.abort(),[Symbol.asyncIterator](){return a?(async function*(){throw Error(`A runtime run handle can only be iterated once`)})():(a=!0,M(e,t,r,i))}})}async function*M(e,t,n,r){let i=0,a=!1,o=()=>({runId:e.runId,traceId:e.traceId,sequence:++i,schemaVersion:1});try{for await(let t of e){let e=N(t,n,r);e!==void 0&&(yield Object.freeze({...o(),...e}))}let i=await t;if(i.status===`success`)yield Object.freeze({...o(),type:`usage`,usage:i.usage,report:i});else{let e=i.errors.at(-1)??R(i);yield Object.freeze({...o(),type:`error`,error:e,report:i})}a=!0}catch{let e=await t,n=e.errors.at(-1)??R(e);yield Object.freeze({...o(),type:`error`,error:n,report:e}),a=!0}finally{a||e.abort()}}function N(e,t,n){if(e.type===`usage-progress`)return{type:`usage-progress`,usage:e.usage,...e.attemptId===void 0?{}:{attemptId:e.attemptId}};if(n&&(e.type===`span-start`||e.type===`span-end`))return e;if(e.type===`text-delta`)return{type:e.phase===`commentary`?`commentary-delta`:`assistant-delta`,text:e.text,index:e.index,phase:e.phase,blockId:`${e.trace.spanId}:${e.index}`};if(e.type===`assistant-message`)return{type:`assistant-message`,message:h(e.message)};if(e.type===`text-end`||e.type===`reasoning-delta`){let{trace:t,...n}=e;return{...n,blockId:`${t.spanId}:${e.index}`}}if(e.type===`image-delta`){let{trace:t,...n}=e;return{...n,blockId:`${t.spanId}:${e.itemId}`}}if(e.type===`compaction-start`||e.type===`compaction-end`||e.type===`turn-start`||e.type===`step-start`||e.type===`step-end`||e.type===`assistant-text`||e.type===`assistant-reasoning`){let{trace:t,...n}=e;return n}if(e.type===`tool-call`)return{type:`tool-call`,callId:e.call.callId,name:e.call.toolName,input:F(e.call.rawArguments)};if(e.type===`tool-result`)return{type:`tool-result`,callId:e.call.callId,name:e.call.toolName,status:P(e.result),output:e.result};if(e.type===`assistant-native-tool`)return S(e.call,t);if(e.type===`approval-request`)return{type:`approval-request`,request:e.request};if(e.type===`user-input-request`)return{type:`user-input-request`,request:e.request};if(e.type===`user-input-response`)return{type:`user-input-response`,requestId:e.request.requestId,response:e.response}}function P(e){return e.isError?e.error.code===l.ABORTED||e.error.code===l.ABORTED_BEFORE_DISPATCH?`aborted`:e.error.code===l.UNKNOWN_TOOL||e.error.code===l.INVALID_ARGUMENTS||e.error.code===l.MALFORMED_ARGUMENTS||e.error.code===l.DENIED||e.error.code===l.BUDGET_EXHAUSTED||e.error.code===l.CHECKPOINT_FAILED?`rejected`:`failed`:e.meta?.declined===!0?`declined`:`completed`}function F(e){try{return JSON.parse(e)}catch{return e}}function I(e){return e instanceof n?e.code:`AGENT_RUN_FAILED`}function L(e,t,n){return a(new c(`Agent run did not complete`,n,t),e)}function R(e){return Object.freeze({code:`AGENT_RUN_FAILED`,stage:`agent-run`,message:`Agent operation failed`,usageCoverage:e.usage.coverage,possiblyBilledAttemptsWithoutUsage:e.usage.coverage.possiblyBilledAttemptsWithoutUsage})}export{w as createRuntimeAgent,T as createRuntimeTeamMemberSession,E as preflightRuntimeTeamMember};
1
+ import{isJsonValue as e}from"../../primitives/json.js";import{detachedFrozen as t}from"../../primitives/snapshot.js";import{AgentSdkError as n}from"../../errors/agent-sdk-error.js";import{freezeMessage as r}from"../../message/message.js";import{capabilityIdentityError as i,inheritCapabilityIdentityConflict as a}from"../../errors/capability-identity.js";import{createRunTerminalRecord as o}from"../../agent/accounting/delivery/terminal.js";import{atDeadline as s}from"../lifecycle/bounded.js";import{AgentRunError as c}from"../../agent/accounting/error.js";import{TOOL_ERROR_CODES as l}from"../../agent/tool/errors.js";import{compactRuntimeSession as u,configureRuntimeSessionModel as d,streamPendingRuntimeSession as f,streamRuntimeSession as p}from"../../agent/define/session/runtime-binding.js";import{assertAgentIdentitySnapshot as m}from"../identity/agent.js";import{publicMessage as h}from"./public-message.js";import{finalizeRuntimeRunReport as g}from"../observation/final-report.js";import{snapshotToolSources as _}from"../tool-source/snapshot.js";import{createRuntimeMemoryPersistence as v}from"../memory/run.js";import{validateMemoryResumeBinding as y}from"../memory/resume.js";import{captureInvocationOptions as b,captureRuntimeSessionOptions as x}from"./options.js";import{projectNativeToolEvent as S}from"./native-event.js";const C=new WeakMap;function w(e,t){let n=Object.freeze({model:t.model,generate(n,r){return O(e,t).run(n,r)},stream(n,r){return O(e,t).stream(n,r)},createSession(n){return O(e,t,n)},resumeSession(n,r){return O(e,t,r,n)}});return C.set(n,Object.freeze({host:e,definition:t})),n}function T(e,t,r,i,a){let o=C.get(t);if(o?.host!==e)throw new n(`Runtime team members must be agents from the same runtime`,`TEAM_AGENT_OWNERSHIP_INVALID`);let s=O(e,o.definition,r,void 0,i,a);return Object.freeze({view:s,port:s.teamPort})}function E(e,t,r,i){let a=C.get(t);if(a?.host!==e)throw new n(`Runtime team members must be agents from the same runtime`,`TEAM_AGENT_OWNERSHIP_INVALID`);m({tools:[...a.definition.legacy.tools,...r.tools??[]],nativeTools:a.definition.legacy.nativeTools,skills:[...a.definition.legacy.skills,...r.skills??[]],...a.definition.legacy.skillIds===void 0?{}:{allowedSkillIds:a.definition.legacy.skillIds},additionalToolNames:i})}var D=class{host;session;nativeProvider;ownerSignal;active;observerTimeoutMs;teamPort;constructor(e,t,n,r,i=3e4,a){this.host=e,this.session=t,this.nativeProvider=n,this.ownerSignal=a,this.observerTimeoutMs=i;let o=this;this.teamPort=Object.freeze({definition:Object.freeze({id:r}),get conversationId(){return o.conversationId},get isRunning(){return o.isRunning},inject(e){return o.injectForTeam(e)},whenIdle(e){return o.whenIdle(e)},hasUnansweredInput(){return o.session.hasUnansweredInput()},runPending(e={}){return o.runPendingForTeam(e)}})}get conversationId(){return this.session.conversationId}get isRunning(){return this.active!==void 0}stream(e,t){if(typeof e!=`string`){if(typeof e!=`object`||!e||e.role!==`user`)throw TypeError(`Runtime input must be text or a user message`);e=r(e)}let n=b(t,this.host.selection),i=this.start(e,n);return j(i.legacy,i.report,i.result,this.nativeProvider,n.includeTraceEvents===!0)}start(n,r){let i=this.beginOperation(),a;try{let e=this.ownerSignal===void 0?r.signal:r.signal===void 0?this.ownerSignal:AbortSignal.any([r.signal,this.ownerSignal]);a=this.host.operations.acquire(`agent-run`,{...e===void 0?{}:{signal:e}})}catch(e){throw this.finishOperation(i),e}let o,s=r.structuredOutput,c;try{c=n===void 0?f(this.session,{signal:a.signal,...k(r)}):p(this.session,n,{signal:a.signal,...k(r),...s===void 0?{}:{outputFormat:{type:`json_schema`,name:s.name,schema:s.schema.jsonSchema},validateOutput:n=>{let r=s.schema.parse(n);if(!e(r))throw TypeError(`structured output parser must return lossless JSON synchronously`);o=t(r)}},...r.imagePolicy===void 0?{}:{imagePolicy:r.imagePolicy},...r.documentPolicy===void 0?{}:{documentPolicy:r.documentPolicy}},r.additionalInstructions)}catch(e){throw a.settle(),this.finishOperation(i),e}let l=()=>c.abort();a.signal.addEventListener(`abort`,l,{once:!0}),a.signal.aborted&&l(),a.whenSealed.then(()=>c.seal()).catch(()=>void 0);let u=this.runtimeReport(c.report,c.toolSourceSnapshots,a.signal),d=this.runtimeResult(c.result,u,()=>o),m=Promise.race([c.eventsSettled,a.whenSealed]),h=Promise.allSettled([m,d,u]).then(()=>{a.signal.removeEventListener(`abort`,l),a.settle(),this.finishOperation(i)}).then(()=>d);return h.catch(()=>void 0),u.catch(()=>void 0),Object.freeze({legacy:c,report:u,result:h})}async run(e,t){let n=b(t,this.host.selection),r=this.stream(e,n);try{for await(let e of r)if(n.onEvent!==void 0)try{await this.observe(n.onEvent,e,r)}catch(e){throw r.abort(),L(e,await r.report,`RUN_EVENT_OBSERVER_FAILED`)}}catch(e){if(I(e)===`RUN_EVENT_OBSERVER_FAILED`)throw e;return await r.result}return await r.result}inject(e){return this.host.operations.assertActive(),this.assertOwnerActive(),this.session.inject(e)}injectForTeam(e){return this.host.operations.assertActive(),this.assertOwnerActive(),this.session.inject(e)}snapshot(){return this.session.snapshot()}compact(e){let t=b(e,this.host.selection),n=this.beginOperation(),r;try{r=this.host.operations.execute(`manual-compaction`,{...this.ownerSignal===void 0?t.signal===void 0?{}:{signal:t.signal}:{signal:t.signal===void 0?this.ownerSignal:AbortSignal.any([t.signal,this.ownerSignal])}},async e=>{let n=await u(this.session,{signal:e.signal,...k(t)}),r=o(n.report),i=await this.host.observation.checkpointTerminal(r,e.signal),a=g(r,n.report.delivery,i,this.host.observation.mode,this.host.observation.requiredBoundary);if(n.failure!==void 0)throw L(n.failure,a,a.errors.at(-1)?.code??I(n.failure));return n.result===null?null:Object.freeze({...n.result,status:`completed`,report:a})})}catch(e){throw this.finishOperation(n),e}return r.finally(()=>this.finishOperation(n))}reset(){if(this.host.operations.assertActive(),this.assertOwnerActive(),this.active!==void 0)throw Error(`Cannot reset while a runtime session is active`);this.session.reset()}whenIdle(e){let t=this.active?.done;return t===void 0?Promise.resolve():e?.aborted?Promise.reject(new n(`Runtime idle wait was aborted`,`RUNTIME_OPERATION_ABORTED`)):new Promise((r,i)=>{let a=()=>void 0,o=e=>{a(),e===void 0?r():i(e)};e!==void 0&&(a=this.host.resources.onAbort(e,()=>o(new n(`Runtime idle wait was aborted`,`RUNTIME_OPERATION_ABORTED`)))),t.then(()=>o())})}async runPendingForTeam(e){let t=this.start(void 0,{...e.signal===void 0?{}:{signal:e.signal}});try{for await(let n of t.legacy)await e.onEvent?.(n)}catch(e){throw t.legacy.abort(),await t.result.catch(()=>void 0),e}return await t.result}beginOperation(){if(this.assertOwnerActive(),this.active!==void 0)throw Error(`Cannot start while a runtime session is active`);let e,t={done:new Promise(t=>{e=t}),resolve:e};return this.active=t,t}finishOperation(e){this.active===e&&(this.active=void 0,e.resolve())}assertOwnerActive(){if(this.ownerSignal?.aborted===!0)throw new n(`Runtime team session is closed`,`TEAM_CLOSED`)}async runtimeReport(e,t,n){let[r,i]=await Promise.all([e,t]),a=o(r,i),s=await this.host.observation.checkpointTerminal(a,n);return g(a,r.delivery,s,this.host.observation.mode,this.host.observation.requiredBoundary)}async runtimeResult(e,t,n){try{let r=await e,i=await t;if(i.status!==`success`)throw L(void 0,i,i.errors.at(-1)?.code??`AGENT_RUN_FAILED`);let a=n();return Object.freeze({runId:i.runId,traceId:i.traceId,completed:r.outcome.completed,stopReason:r.outcome.reason.kind,text:r.text,...a===void 0?{}:{output:a},...r.message===void 0?{}:{message:h(r.message)},usage:i.usage,report:i})}catch(e){throw L(e,await t,I(e))}}async observe(e,t,r){let i=this.host.resources.platform.monotonicNow()+this.observerTimeoutMs;try{await s(this.host.resources,i,()=>e(t),void 0)}catch{throw r.abort(),new n(`Runtime event observer did not complete`,`RUN_EVENT_OBSERVER_FAILED`)}}};function O(e,t,n={},r,i,a){e.operations.assertActive(),n=x(n),m({tools:[...t.legacy.tools,...n.tools??[]],nativeTools:t.legacy.nativeTools,skills:[...t.legacy.skills,...n.skills??[]],...t.legacy.skillIds===void 0?{}:{allowedSkillIds:t.legacy.skillIds}});let o=n.memory===!1?void 0:n.memory??t.memory;r!==void 0&&y(r,o);let s=A(t.toolSources,n.toolSources??[]),c=n.runtimeLimits,{maxSteps:l,maxToolCalls:u,...f}=c??{},p=c?.maxSteps===void 0&&c?.maxToolCalls===void 0?t.legacy:t.legacy.with({...c.maxSteps===void 0?{}:{maxTurns:c.maxSteps},...c.maxToolCalls===void 0?{}:{maxToolCalls:c.maxToolCalls}}),h={registry:e.registry,observation:e.observation,observationResource:e.resource,...n.tools===void 0?{}:{tools:n.tools},...n.skills===void 0?{}:{skills:n.skills},...n.skillCwd===void 0?{}:{skillCwd:n.skillCwd},...n.userInput===void 0?{}:{userInput:n.userInput},...n.approvals===void 0?{}:{approvals:n.approvals},...n.spillStore===void 0?{}:{spillStore:n.spillStore},...n.experimentalPrograms===void 0?{}:{experimentalPrograms:n.experimentalPrograms},...n.interceptors===void 0?{}:{interceptors:n.interceptors},...n.contextSections===void 0?{}:{contextSections:n.contextSections},...n.hooks===void 0?{}:{hooks:n.hooks},...n.usagePolicy===void 0?{}:{usagePolicy:n.usagePolicy},...n.historyLimits===void 0?{}:{historyLimits:n.historyLimits},...n.ledgerLimits===void 0?{}:{ledgerLimits:n.ledgerLimits},...n.eventBufferLimits===void 0?{}:{eventBufferLimits:n.eventBufferLimits},...n.compaction===void 0?{}:{compaction:n.compaction},...i===void 0?{}:{team:i},...Object.keys(f).length===0?{}:{runtimeLimits:f}},g=r===void 0?p.createSession({...h,...n.conversationId===void 0?{}:{conversationId:n.conversationId}}):p.resumeSession({...h,snapshot:r});return d(g,{provider:t.model.provider,model:t.model.id,...t.effort===void 0?{}:{reasoningEffort:t.effort},...t.maxTokens===void 0?{}:{maxTokens:t.maxTokens},logger:t=>e.observation.correlatedLogger(t,{scope:`sdk.agent.run`}),...s.length===0?{}:{prepareTools:(e,t,n)=>_(s,e,t,n)},...o===void 0?{}:{memory:v(o,t.legacy.id,f.memoryOperationTimeoutMs)}}),new D(e,g,t.model.provider,t.legacy.id,c?.observerTimeoutMs,a)}function k(e){return{...e.model===void 0?{}:{model:{provider:e.model.provider,model:e.model.id}},...e.maxTokens===void 0?{}:{maxTokens:e.maxTokens}}}function A(e,t){let n=[...e,...t],r=new Map;for(let[e,t]of n.entries()){let n=r.get(t.id);if(n!==void 0)throw i(`TOOL_SOURCE_ID_CONFLICT`,`tool-source-id`,n,e);r.set(t.id,e)}return Object.freeze(n)}function j(e,t,n,r,i){let a=!1;return Object.freeze({runId:e.runId,report:t,result:n,abort:()=>e.abort(),[Symbol.asyncIterator](){return a?(async function*(){throw Error(`A runtime run handle can only be iterated once`)})():(a=!0,M(e,t,r,i))}})}async function*M(e,t,n,r){let i=0,a=!1,o=()=>({runId:e.runId,traceId:e.traceId,sequence:++i,schemaVersion:1});try{for await(let t of e){let e=N(t,n,r);e!==void 0&&(yield Object.freeze({...o(),...e}))}let i=await t;if(i.status===`success`)yield Object.freeze({...o(),type:`usage`,usage:i.usage,report:i});else{let e=i.errors.at(-1)??R(i);yield Object.freeze({...o(),type:`error`,error:e,report:i})}a=!0}catch{let e=await t,n=e.errors.at(-1)??R(e);yield Object.freeze({...o(),type:`error`,error:n,report:e}),a=!0}finally{a||e.abort()}}function N(e,t,n){if(e.type===`usage-progress`)return{type:`usage-progress`,usage:e.usage,...e.attemptId===void 0?{}:{attemptId:e.attemptId}};if(n&&(e.type===`span-start`||e.type===`span-end`))return e;if(e.type===`text-delta`)return{type:e.phase===`commentary`?`commentary-delta`:`assistant-delta`,text:e.text,index:e.index,phase:e.phase,blockId:`${e.trace.spanId}:${e.index}`};if(e.type===`assistant-message`)return{type:`assistant-message`,message:h(e.message)};if(e.type===`text-end`||e.type===`reasoning-delta`){let{trace:t,...n}=e;return{...n,blockId:`${t.spanId}:${e.index}`}}if(e.type===`image-delta`){let{trace:t,...n}=e;return{...n,blockId:`${t.spanId}:${e.itemId}`}}if(e.type===`compaction-start`||e.type===`compaction-end`||e.type===`turn-start`||e.type===`step-start`||e.type===`step-end`||e.type===`assistant-text`||e.type===`assistant-reasoning`){let{trace:t,...n}=e;return n}if(e.type===`tool-call`)return{type:`tool-call`,callId:e.call.callId,name:e.call.toolName,input:F(e.call.rawArguments)};if(e.type===`tool-result`)return{type:`tool-result`,callId:e.call.callId,name:e.call.toolName,status:P(e.result),output:e.result};if(e.type===`assistant-native-tool`)return S(e.call,t);if(e.type===`approval-request`)return{type:`approval-request`,request:e.request};if(e.type===`user-input-request`)return{type:`user-input-request`,request:e.request};if(e.type===`user-input-response`)return{type:`user-input-response`,requestId:e.request.requestId,response:e.response}}function P(e){return e.isError?e.error.code===l.ABORTED||e.error.code===l.ABORTED_BEFORE_DISPATCH?`aborted`:e.error.code===l.UNKNOWN_TOOL||e.error.code===l.INVALID_ARGUMENTS||e.error.code===l.MALFORMED_ARGUMENTS||e.error.code===l.DENIED||e.error.code===l.BUDGET_EXHAUSTED||e.error.code===l.CHECKPOINT_FAILED?`rejected`:`failed`:e.meta?.declined===!0?`declined`:`completed`}function F(e){try{return JSON.parse(e)}catch{return e}}function I(e){return e instanceof n?e.code:`AGENT_RUN_FAILED`}function L(e,t,n){return a(new c(`Agent run did not complete`,n,t),e)}function R(e){return Object.freeze({code:`AGENT_RUN_FAILED`,stage:`agent-run`,message:`Agent operation failed`,usageCoverage:e.usage.coverage,possiblyBilledAttemptsWithoutUsage:e.usage.coverage.possiblyBilledAttemptsWithoutUsage})}export{w as createRuntimeAgent,T as createRuntimeTeamMemberSession,E as preflightRuntimeTeamMember};
2
2
  //# sourceMappingURL=session.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","names":[],"sources":["../../../src/composition/agent/session.ts"],"sourcesContent":["import { publicMessage } from './public-message.ts'\nimport type { AgentInput } from '../../agent/define/session/types.ts'\nimport { isJsonValue, detachedFrozen, type JsonValue } from '../../primitives/index.ts'\nimport { freezeMessage } from '../../message/index.ts'\nimport { AgentRunError } from '../../agent/accounting/error.ts'\nimport type { RunReport } from '../exporter/delivery-types.ts'\nimport { configureRuntimeSessionModel, streamRuntimeSession, type AgentSession } from '../../agent/define/session.ts'\nimport {\n compactRuntimeSession, streamPendingRuntimeSession, type RuntimeSessionRunHandle,\n} from '../../agent/define/session/runtime-binding.ts'\nimport type { AgentRunHandle as LegacyRunHandle } from '../../agent/define/session/types.ts'\nimport type { AgentRunEvent } from '../../agent/mode/run-agent.ts'\nimport type { ToolExecutionResult } from '../../agent/tool/definition.ts'\nimport { TOOL_ERROR_CODES } from '../../agent/tool/errors.ts'\nimport { AgentSdkError } from '../../errors/agent-sdk-error.ts'\nimport type { ModelRegistry } from '../../runtime/registry.ts'\nimport type { ProviderSelection } from '../provider/types.ts'\nimport { atDeadline } from '../lifecycle/bounded.ts'\nimport type { RuntimeOperations } from '../lifecycle/operations.ts'\nimport type { RuntimeObservationPort } from '../observation/port.ts'\nimport { createRunTerminalRecord } from '../delivery/terminal.ts'\nimport { finalizeRuntimeRunReport, type RuntimeRunReport } from '../observation/final-report.ts'\nimport type { RuntimeObservationResource } from '../delivery/resource.ts'\nimport type { RuntimeResources } from '../../platform/resources.ts'\nimport { snapshotToolSources } from '../tool-source/snapshot.ts'\nimport { capabilityIdentityError, inheritCapabilityIdentityConflict } from '../identity/error.ts'\nimport type { CapturedToolSource } from '../tool-source/types.ts'\nimport type { ToolSourceRunReference } from '../tool-source/types.ts'\nimport { createRuntimeMemoryPersistence } from '../memory/run.ts'\nimport { validateMemoryResumeBinding } from '../memory/resume.ts'\nimport type { BoundRuntimeAgentDefinition } from './definition.ts'\nimport { captureInvocationOptions, captureRuntimeSessionOptions, type CapturedInvocationOptions } from './options.ts'\nimport { projectNativeToolEvent } from './native-event.ts'\nimport type {\n RuntimeAgent, RuntimeAgentInvocationOptions, RuntimeAgentResponse, RuntimeAgentRunEvent,\n RuntimeAgentRunHandle, RuntimeAgentSession, RuntimeAgentSessionOptions, RuntimeAgentSessionSnapshot,\n} from './types.ts'\nimport type { CompactionResult } from '../../agent/memory/compaction.ts'\nimport type { AgentTeamMemberOptions } from '../../agent/define/session/types.ts'\nimport type { TeamSessionPort } from '../../agent/team/contracts.ts'\nimport { assertAgentIdentitySnapshot } from '../identity/agent.ts'\n\nexport interface RuntimeAgentHost {\n readonly registry: ModelRegistry\n /**\n * The runtime's captured provider routes.\n *\n * Held so a per-invocation model override resolves against exactly the same\n * configuration the agent binding used, rather than a second view of it.\n */\n readonly selection: ProviderSelection\n readonly operations: RuntimeOperations\n readonly observation: RuntimeObservationPort\n readonly resource: RuntimeObservationResource\n readonly resources: RuntimeResources\n}\n\ninterface RuntimeAgentBinding {\n readonly host: RuntimeAgentHost\n readonly definition: BoundRuntimeAgentDefinition\n}\n\nconst runtimeAgentBindings = new WeakMap<RuntimeAgent, RuntimeAgentBinding>()\n\nexport function createRuntimeAgent(host: RuntimeAgentHost, definition: BoundRuntimeAgentDefinition): RuntimeAgent {\n const agent = Object.freeze({\n model: definition.model,\n generate(input: AgentInput, options?: RuntimeAgentInvocationOptions) { return createRuntimeSession(host, definition).run(input, options) },\n stream(input: AgentInput, options?: RuntimeAgentInvocationOptions) { return createRuntimeSession(host, definition).stream(input, options) },\n createSession(options?: RuntimeAgentSessionOptions) { return createRuntimeSession(host, definition, options) },\n resumeSession(snapshot: RuntimeAgentSessionSnapshot, options?: RuntimeAgentSessionOptions) {\n return createRuntimeSession(host, definition, options, snapshot)\n },\n })\n runtimeAgentBindings.set(agent, Object.freeze({ host, definition }))\n return agent\n}\n\nexport function createRuntimeTeamMemberSession(\n host: RuntimeAgentHost,\n agent: RuntimeAgent,\n options: RuntimeAgentSessionOptions,\n team: AgentTeamMemberOptions,\n ownerSignal: AbortSignal,\n): { readonly view: RuntimeAgentSession; readonly port: TeamSessionPort } {\n const binding = runtimeAgentBindings.get(agent)\n if (binding?.host !== host) throw new AgentSdkError(\n 'Runtime team members must be agents from the same runtime', 'TEAM_AGENT_OWNERSHIP_INVALID',\n )\n const view = createRuntimeSession(host, binding.definition, options, undefined, team, ownerSignal)\n return Object.freeze({ view, port: view.teamPort })\n}\n\nexport function preflightRuntimeTeamMember(\n host: RuntimeAgentHost,\n agent: RuntimeAgent,\n options: RuntimeAgentSessionOptions,\n additionalToolNames: readonly string[],\n): void {\n const binding = runtimeAgentBindings.get(agent)\n if (binding?.host !== host) throw new AgentSdkError(\n 'Runtime team members must be agents from the same runtime', 'TEAM_AGENT_OWNERSHIP_INVALID',\n )\n assertAgentIdentitySnapshot({\n tools: [...binding.definition.legacy.tools, ...options.tools ?? []],\n nativeTools: binding.definition.legacy.nativeTools,\n skills: [...binding.definition.legacy.skills, ...options.skills ?? []] as never,\n ...(binding.definition.legacy.skillIds === undefined ? {} : {\n allowedSkillIds: binding.definition.legacy.skillIds,\n }),\n additionalToolNames,\n })\n}\n\nexport function runtimeOwnsAgent(host: RuntimeAgentHost, agent: unknown): agent is RuntimeAgent {\n return typeof agent === 'object' && agent !== null && runtimeAgentBindings.get(agent as RuntimeAgent)?.host === host\n}\n\nclass RuntimeAgentSessionValue implements RuntimeAgentSession {\n private active: SessionOperation | undefined\n private readonly observerTimeoutMs: number\n readonly teamPort: TeamSessionPort\n\n constructor(\n private readonly host: RuntimeAgentHost,\n private readonly session: AgentSession,\n private readonly nativeProvider: string,\n definitionId: string,\n observerTimeoutMs = 30_000,\n private readonly ownerSignal?: AbortSignal,\n ) {\n this.observerTimeoutMs = observerTimeoutMs\n const owner = this\n this.teamPort = Object.freeze({\n definition: Object.freeze({ id: definitionId }),\n get conversationId() { return owner.conversationId },\n get isRunning() { return owner.isRunning },\n inject(input: Parameters<TeamSessionPort['inject']>[0]) { return owner.injectForTeam(input) },\n whenIdle(signal?: AbortSignal) { return owner.whenIdle(signal) },\n runPending(invocation = {}) { return owner.runPendingForTeam(invocation) },\n })\n }\n\n get conversationId(): string { return this.session.conversationId }\n get isRunning(): boolean { return this.active !== undefined }\n\n stream(input: AgentInput, rawOptions?: RuntimeAgentInvocationOptions): RuntimeAgentRunHandle {\n if (typeof input !== 'string') {\n if (input === null || typeof input !== 'object' || input.role !== 'user') throw new TypeError('Runtime input must be text or a user message')\n input = freezeMessage(input)\n }\n const options = captureInvocationOptions(rawOptions, this.host.selection)\n const started = this.start(input, options)\n return runtimeHandle(started.legacy, started.report, started.result, this.nativeProvider, options.includeTraceEvents === true)\n }\n\n private start(input: AgentInput | undefined, options: CapturedInvocationOptions): StartedRuntimeRun {\n const operation = this.beginOperation()\n let lease: ReturnType<RuntimeOperations['acquire']>\n try {\n const signal = this.ownerSignal === undefined\n ? options.signal\n : options.signal === undefined ? this.ownerSignal : AbortSignal.any([options.signal, this.ownerSignal])\n lease = this.host.operations.acquire('agent-run', {\n ...(signal === undefined ? {} : { signal }),\n })\n } catch (error) { this.finishOperation(operation); throw error }\n let output: JsonValue | undefined\n const structured = options.structuredOutput\n let legacy: RuntimeSessionRunHandle\n try {\n legacy = input === undefined\n ? streamPendingRuntimeSession(this.session, { signal: lease.signal, ...modelOverlay(options) })\n : streamRuntimeSession(this.session, input, { signal: lease.signal, ...modelOverlay(options),\n ...(structured === undefined ? {} : {\n outputFormat: { type: 'json_schema' as const, name: structured.name, schema: structured.schema.jsonSchema },\n validateOutput: (value: unknown) => {\n const parsed = structured.schema.parse(value)\n if (!isJsonValue(parsed)) throw new TypeError('structured output parser must return lossless JSON synchronously')\n output = detachedFrozen(parsed)\n },\n }), ...(options.imagePolicy === undefined ? {} : { imagePolicy: options.imagePolicy }),\n ...(options.documentPolicy === undefined ? {} : { documentPolicy: options.documentPolicy }) }, options.additionalInstructions)\n } catch (error) { lease.settle(); this.finishOperation(operation); throw error }\n const abort = (): void => legacy.abort()\n lease.signal.addEventListener('abort', abort, { once: true })\n if (lease.signal.aborted) abort()\n void lease.whenSealed.then(() => legacy.seal()).catch(() => undefined)\n const report = this.runtimeReport(legacy.report, legacy.toolSourceSnapshots, lease.signal)\n const internalResult = this.runtimeResult(legacy.result, report, () => output)\n const eventsSettled = Promise.race([legacy.eventsSettled, lease.whenSealed])\n const released = Promise.allSettled([eventsSettled, internalResult, report]).then(() => {\n lease.signal.removeEventListener('abort', abort)\n lease.settle()\n this.finishOperation(operation)\n })\n const result = released.then(() => internalResult)\n void result.catch(() => undefined)\n void report.catch(() => undefined)\n return Object.freeze({ legacy, report, result })\n }\n\n async run(input: AgentInput, rawOptions?: RuntimeAgentInvocationOptions): Promise<RuntimeAgentResponse> {\n const options = captureInvocationOptions(rawOptions, this.host.selection)\n const handle = this.stream(input, options)\n try {\n for await (const event of handle) {\n if (options.onEvent !== undefined) {\n try { await this.observe(options.onEvent, event, handle) }\n catch (error) {\n handle.abort()\n const report = await handle.report\n throw runtimeFailure(error, report, 'RUN_EVENT_OBSERVER_FAILED')\n }\n }\n }\n } catch (error) { if (codeOf(error) === 'RUN_EVENT_OBSERVER_FAILED') throw error; return await handle.result }\n return await handle.result\n }\n\n inject(input: AgentInput): number {\n this.host.operations.assertActive()\n this.assertOwnerActive()\n if (this.active !== undefined) throw new Error('Cannot inject while a runtime session is active')\n return this.session.inject(input)\n }\n\n private injectForTeam(input: Parameters<TeamSessionPort['inject']>[0]): number {\n this.host.operations.assertActive()\n this.assertOwnerActive()\n return this.session.inject(input)\n }\n\n snapshot(): RuntimeAgentSessionSnapshot { return this.session.snapshot() }\n\n compact(rawOptions?: RuntimeAgentInvocationOptions): Promise<CompactionResult | null> {\n const options = captureInvocationOptions(rawOptions, this.host.selection)\n const operation = this.beginOperation()\n let pending: Promise<CompactionResult | null>\n try {\n pending = this.host.operations.execute('manual-compaction', {\n ...(this.ownerSignal === undefined\n ? options.signal === undefined ? {} : { signal: options.signal }\n : { signal: options.signal === undefined ? this.ownerSignal : AbortSignal.any([options.signal, this.ownerSignal]) }),\n }, async lease => {\n const outcome = await compactRuntimeSession(this.session, { signal: lease.signal, ...modelOverlay(options) })\n const record = createRunTerminalRecord(outcome.report)\n const terminal = await this.host.observation.checkpointTerminal(record, lease.signal)\n const report = finalizeRuntimeRunReport(record, outcome.report.delivery, terminal,\n this.host.observation.mode, this.host.observation.requiredBoundary)\n if (outcome.failure !== undefined) throw runtimeFailure(\n outcome.failure,\n report,\n report.errors.at(-1)?.code ?? codeOf(outcome.failure),\n )\n return outcome.result === null ? null : Object.freeze({ ...outcome.result, status: 'completed' as const, report })\n })\n } catch (error) { this.finishOperation(operation); throw error }\n return pending.finally(() => this.finishOperation(operation))\n }\n\n reset(): void {\n this.host.operations.assertActive()\n this.assertOwnerActive()\n if (this.active !== undefined) throw new Error('Cannot reset while a runtime session is active')\n this.session.reset()\n }\n\n whenIdle(signal?: AbortSignal): Promise<void> {\n const pending = this.active?.done\n if (pending === undefined) return Promise.resolve()\n if (signal?.aborted) return Promise.reject(new AgentSdkError('Runtime idle wait was aborted', 'RUNTIME_OPERATION_ABORTED'))\n return new Promise((resolve, reject) => {\n let release = (): void => undefined\n const finish = (error?: Error): void => { release(); error === undefined ? resolve() : reject(error) }\n if (signal !== undefined) release = this.host.resources.onAbort(signal,\n () => finish(new AgentSdkError('Runtime idle wait was aborted', 'RUNTIME_OPERATION_ABORTED')))\n void pending.then(() => finish())\n })\n }\n\n private async runPendingForTeam(invocation: {\n readonly signal?: AbortSignal\n readonly onEvent?: (event: AgentRunEvent) => void | Promise<void>\n }): Promise<unknown> {\n const started = this.start(undefined, {\n ...(invocation.signal === undefined ? {} : { signal: invocation.signal }),\n })\n try {\n for await (const event of started.legacy) await invocation.onEvent?.(event)\n } catch (error) {\n started.legacy.abort()\n await started.result.catch(() => undefined)\n throw error\n }\n return await started.result\n }\n\n private beginOperation(): SessionOperation {\n this.assertOwnerActive()\n if (this.active !== undefined) throw new Error('Cannot start while a runtime session is active')\n let resolve!: () => void\n const operation: SessionOperation = { done: new Promise(done => { resolve = done }), resolve }\n this.active = operation\n return operation\n }\n\n private finishOperation(operation: SessionOperation): void {\n if (this.active !== operation) return\n this.active = undefined\n operation.resolve()\n }\n\n private assertOwnerActive(): void {\n if (this.ownerSignal?.aborted === true) {\n throw new AgentSdkError('Runtime team session is closed', 'TEAM_CLOSED')\n }\n }\n\n private async runtimeReport(\n legacy: Promise<RunReport>,\n sourceSnapshots: Promise<readonly ToolSourceRunReference[]>,\n signal: AbortSignal,\n ): Promise<RuntimeRunReport> {\n const [previous, sources] = await Promise.all([legacy, sourceSnapshots])\n const record = createRunTerminalRecord(previous, sources)\n const terminal = await this.host.observation.checkpointTerminal(record, signal)\n return finalizeRuntimeRunReport(record, previous.delivery, terminal,\n this.host.observation.mode, this.host.observation.requiredBoundary)\n }\n\n private async runtimeResult(\n legacy: Promise<Awaited<LegacyRunHandle['result']>>,\n report: Promise<RuntimeRunReport>,\n output: () => JsonValue | undefined,\n ): Promise<RuntimeAgentResponse> {\n try {\n const response = await legacy\n const final = await report\n if (final.status !== 'success') {\n throw runtimeFailure(undefined, final, final.errors.at(-1)?.code ?? 'AGENT_RUN_FAILED')\n }\n const parsedOutput = output()\n return Object.freeze({ runId: final.runId, traceId: final.traceId,\n completed: response.outcome.completed, stopReason: response.outcome.reason.kind,\n text: response.text, ...(parsedOutput === undefined ? {} : { output: parsedOutput }),\n ...(response.message === undefined ? {} : { message: publicMessage(response.message) }),\n usage: final.usage, report: final })\n } catch (error) {\n const final = await report\n throw runtimeFailure(error, final, codeOf(error))\n }\n }\n\n private async observe(\n observer: NonNullable<RuntimeAgentInvocationOptions['onEvent']>,\n event: RuntimeAgentRunEvent,\n handle: RuntimeAgentRunHandle,\n ): Promise<void> {\n const deadlineAt = this.host.resources.platform.monotonicNow() + this.observerTimeoutMs\n try { await atDeadline(this.host.resources, deadlineAt, () => observer(event), undefined) }\n catch { handle.abort(); throw new AgentSdkError('Runtime event observer did not complete', 'RUN_EVENT_OBSERVER_FAILED') }\n }\n}\n\nfunction createRuntimeSession(\n host: RuntimeAgentHost,\n definition: BoundRuntimeAgentDefinition,\n options: RuntimeAgentSessionOptions = {},\n snapshot?: RuntimeAgentSessionSnapshot,\n team?: AgentTeamMemberOptions,\n ownerSignal?: AbortSignal,\n): RuntimeAgentSessionValue {\n host.operations.assertActive()\n options = captureRuntimeSessionOptions(options)\n assertAgentIdentitySnapshot({\n tools: [...definition.legacy.tools, ...options.tools ?? []],\n nativeTools: definition.legacy.nativeTools,\n skills: [...definition.legacy.skills, ...options.skills ?? []] as never,\n ...(definition.legacy.skillIds === undefined ? {} : { allowedSkillIds: definition.legacy.skillIds }),\n })\n const memory = options.memory === false ? undefined : options.memory ?? definition.memory\n if (snapshot !== undefined) validateMemoryResumeBinding(snapshot, memory)\n const toolSources = combineToolSources(definition.toolSources, options.toolSources ?? [])\n const limits = options.runtimeLimits\n const { maxSteps: _maxSteps, maxToolCalls: _maxToolCalls, ...agentRuntimeLimits } = limits ?? {}\n const selected = limits?.maxSteps === undefined && limits?.maxToolCalls === undefined\n ? definition.legacy : definition.legacy.with({\n ...(limits.maxSteps === undefined ? {} : { maxTurns: limits.maxSteps }),\n ...(limits.maxToolCalls === undefined ? {} : { maxToolCalls: limits.maxToolCalls }),\n })\n const shared = { registry: host.registry, observation: host.observation, observationResource: host.resource,\n ...(options.tools === undefined ? {} : { tools: options.tools }),\n ...(options.skills === undefined ? {} : { skills: options.skills as never }),\n ...(options.skillCwd === undefined ? {} : { skillCwd: options.skillCwd }),\n ...(options.userInput === undefined ? {} : { userInput: options.userInput }),\n ...(options.approvals === undefined ? {} : { approvals: options.approvals }),\n ...(options.spillStore === undefined ? {} : { spillStore: options.spillStore }),\n ...(options.experimentalPrograms === undefined ? {} : { experimentalPrograms: options.experimentalPrograms }),\n ...(options.interceptors === undefined ? {} : { interceptors: options.interceptors }),\n ...(options.contextSections === undefined ? {} : { contextSections: options.contextSections }),\n ...(options.hooks === undefined ? {} : { hooks: options.hooks }),\n ...(options.usagePolicy === undefined ? {} : { usagePolicy: options.usagePolicy }),\n ...(options.historyLimits === undefined ? {} : { historyLimits: options.historyLimits }),\n ...(options.ledgerLimits === undefined ? {} : { ledgerLimits: options.ledgerLimits }),\n ...(options.eventBufferLimits === undefined ? {} : { eventBufferLimits: options.eventBufferLimits }),\n ...(options.compaction === undefined ? {} : { compaction: options.compaction }),\n ...(team === undefined ? {} : { team }),\n ...(Object.keys(agentRuntimeLimits).length === 0 ? {} : { runtimeLimits: agentRuntimeLimits }),\n }\n const session = snapshot === undefined\n ? selected.createSession({ ...shared, ...(options.conversationId === undefined ? {} : { conversationId: options.conversationId }) })\n : selected.resumeSession({ ...shared, snapshot })\n configureRuntimeSessionModel(session, { provider: definition.model.provider, model: definition.model.id,\n ...(definition.effort === undefined ? {} : { reasoningEffort: definition.effort }),\n ...(definition.maxTokens === undefined ? {} : { maxTokens: definition.maxTokens }),\n logger: correlation => host.observation.correlatedLogger(correlation, { scope: 'sdk.agent.run' }),\n ...(toolSources.length === 0 ? {} : {\n prepareTools: (signal, logger, occupiedNames) => snapshotToolSources(\n toolSources, signal, logger, occupiedNames,\n ),\n }),\n ...(memory === undefined ? {} : {\n memory: createRuntimeMemoryPersistence(\n memory,\n definition.legacy.id,\n agentRuntimeLimits.memoryOperationTimeoutMs,\n ),\n }),\n })\n return new RuntimeAgentSessionValue(\n host, session, definition.model.provider, definition.legacy.id, limits?.observerTimeoutMs, ownerSignal,\n )\n}\n\n/** Project one captured invocation onto the low-level per-run model overlay. */\nfunction modelOverlay(options: CapturedInvocationOptions): {\n readonly model?: { readonly provider: string; readonly model: string }\n readonly maxTokens?: number\n} {\n return {\n ...(options.model === undefined ? {} : { model: { provider: options.model.provider, model: options.model.id } }),\n ...(options.maxTokens === undefined ? {} : { maxTokens: options.maxTokens }),\n }\n}\n\ninterface SessionOperation {\n readonly done: Promise<void>\n readonly resolve: () => void\n}\n\ninterface StartedRuntimeRun {\n readonly legacy: RuntimeSessionRunHandle\n readonly report: Promise<RuntimeRunReport>\n readonly result: Promise<RuntimeAgentResponse>\n}\n\nfunction combineToolSources(\n defined: readonly CapturedToolSource[],\n additional: readonly CapturedToolSource[],\n): readonly CapturedToolSource[] {\n const all = [...defined, ...additional]\n const seen = new Map<string, number>()\n for (const [index, source] of all.entries()) {\n const first = seen.get(source.id)\n if (first !== undefined) throw capabilityIdentityError(\n 'TOOL_SOURCE_ID_CONFLICT', 'tool-source-id', first, index,\n )\n seen.set(source.id, index)\n }\n return Object.freeze(all)\n}\n\nfunction runtimeHandle(\n source: LegacyRunHandle & { readonly traceId: string; abort(reason?: unknown): void },\n report: Promise<RuntimeRunReport>, result: Promise<RuntimeAgentResponse>, nativeProvider: string,\n includeTraceEvents: boolean,\n): RuntimeAgentRunHandle {\n let iterated = false\n return Object.freeze({ runId: source.runId, report, result, abort: () => source.abort(),\n [Symbol.asyncIterator](): AsyncIterator<RuntimeAgentRunEvent> {\n if (iterated) return (async function* () { throw new Error('A runtime run handle can only be iterated once') })()\n iterated = true\n return projectEvents(source, report, nativeProvider, includeTraceEvents)\n } })\n}\n\nasync function* projectEvents(\n source: LegacyRunHandle & { readonly traceId: string; abort(reason?: unknown): void },\n report: Promise<RuntimeRunReport>,\n nativeProvider: string,\n includeTraceEvents: boolean,\n): AsyncGenerator<RuntimeAgentRunEvent> {\n let sequence = 0, completed = false\n const context = () => ({ runId: source.runId, traceId: source.traceId, sequence: ++sequence, schemaVersion: 1 as const })\n try {\n for await (const event of source) {\n const projected = projectEvent(event, nativeProvider, includeTraceEvents)\n if (projected !== undefined) yield Object.freeze({ ...context(), ...projected }) as RuntimeAgentRunEvent\n }\n const terminal = await report\n if (terminal.status === 'success') {\n yield Object.freeze({ ...context(), type: 'usage', usage: terminal.usage, report: terminal })\n } else {\n const error = terminal.errors.at(-1) ?? fallbackError(terminal)\n yield Object.freeze({ ...context(), type: 'error', error, report: terminal })\n }\n completed = true\n } catch {\n const terminal = await report\n const error = terminal.errors.at(-1) ?? fallbackError(terminal)\n yield Object.freeze({ ...context(), type: 'error', error, report: terminal })\n completed = true\n } finally { if (!completed) source.abort() }\n}\n\ntype WithoutEventContext<T> = T extends unknown ? Omit<T, 'runId' | 'traceId' | 'sequence' | 'schemaVersion'> : never\ntype ProjectedEvent = WithoutEventContext<RuntimeAgentRunEvent>\n\nfunction projectEvent(event: AgentRunEvent, nativeProvider: string, includeTraceEvents: boolean): ProjectedEvent | undefined {\n if (event.type === 'usage-progress') return { type: 'usage-progress', usage: event.usage,\n ...(event.attemptId === undefined ? {} : { attemptId: event.attemptId }) }\n // Runtime consumers such as Edge hosts may persist an execution trace. Keep\n // the SDK's span lifecycle intact; unlike transcript events, spans carry the\n // identity and nesting needed to reconstruct the call tree.\n if (includeTraceEvents && (event.type === 'span-start' || event.type === 'span-end')) return event\n if (event.type === 'text-delta') return {\n type: event.phase === 'commentary' ? 'commentary-delta' : 'assistant-delta',\n text: event.text, index: event.index, phase: event.phase, blockId: `${event.trace.spanId}:${event.index}`,\n }\n if (event.type === 'assistant-message') return { type: 'assistant-message', message: publicMessage(event.message) }\n if (event.type === 'text-end' || event.type === 'reasoning-delta') {\n const { trace, ...content } = event\n return { ...content, blockId: `${trace.spanId}:${event.index}` }\n }\n if (event.type === 'image-delta') {\n const { trace, ...content } = event\n return { ...content, blockId: `${trace.spanId}:${event.itemId}` }\n }\n if (event.type === 'compaction-start' || event.type === 'compaction-end'\n || event.type === 'turn-start' || event.type === 'step-start' || event.type === 'step-end'\n || event.type === 'assistant-text' || event.type === 'assistant-reasoning') {\n const { trace: _trace, ...content } = event\n return content\n }\n if (event.type === 'tool-call') return { type: 'tool-call', callId: event.call.callId,\n name: event.call.toolName, input: parseInput(event.call.rawArguments) }\n if (event.type === 'tool-result') return { type: 'tool-result', callId: event.call.callId,\n name: event.call.toolName, status: toolResultStatus(event.result), output: event.result }\n if (event.type === 'assistant-native-tool') return projectNativeToolEvent(event.call, nativeProvider)\n if (event.type === 'approval-request') return { type: 'approval-request', request: event.request }\n if (event.type === 'user-input-request') return { type: 'user-input-request', request: event.request }\n if (event.type === 'user-input-response') return { type: 'user-input-response', requestId: event.request.requestId,\n response: event.response }\n return undefined\n}\n\nfunction toolResultStatus(\n result: ToolExecutionResult,\n): 'completed' | 'failed' | 'aborted' | 'rejected' | 'declined' {\n // A call the loop refused to run is neither success nor failure: nothing\n // broke, and nothing was done. Reporting it as either misleads a UI — and a\n // red row for a budget decision is what makes a finished run look crashed.\n if (!result.isError) return result.meta?.['declined'] === true ? 'declined' : 'completed'\n if (result.error.code === TOOL_ERROR_CODES.ABORTED\n || result.error.code === TOOL_ERROR_CODES.ABORTED_BEFORE_DISPATCH) return 'aborted'\n if (result.error.code === TOOL_ERROR_CODES.UNKNOWN_TOOL\n || result.error.code === TOOL_ERROR_CODES.INVALID_ARGUMENTS\n || result.error.code === TOOL_ERROR_CODES.MALFORMED_ARGUMENTS\n || result.error.code === TOOL_ERROR_CODES.DENIED\n || result.error.code === TOOL_ERROR_CODES.BUDGET_EXHAUSTED\n || result.error.code === TOOL_ERROR_CODES.CHECKPOINT_FAILED) return 'rejected'\n return 'failed'\n}\n\nfunction parseInput(value: string): unknown { try { return JSON.parse(value) as unknown } catch { return value } }\nfunction codeOf(value: unknown): string {\n return value instanceof AgentSdkError ? value.code : 'AGENT_RUN_FAILED'\n}\nfunction runtimeFailure(value: unknown, report: RuntimeRunReport, code: string): AgentRunError {\n return inheritCapabilityIdentityConflict(\n new AgentRunError('Agent run did not complete', code, report as never), value,\n )\n}\nfunction fallbackError(report: RuntimeRunReport): RuntimeRunReport['errors'][number] {\n return Object.freeze({ code: 'AGENT_RUN_FAILED', stage: 'agent-run', message: 'Agent operation failed',\n usageCoverage: report.usage.coverage,\n possiblyBilledAttemptsWithoutUsage: report.usage.coverage.possiblyBilledAttemptsWithoutUsage })\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"session.js","names":[],"sources":["../../../src/composition/agent/session.ts"],"sourcesContent":["import { publicMessage } from './public-message.ts'\nimport type { AgentInput } from '../../agent/define/session/types.ts'\nimport { isJsonValue, detachedFrozen, type JsonValue } from '../../primitives/index.ts'\nimport { freezeMessage } from '../../message/index.ts'\nimport { AgentRunError } from '../../agent/accounting/error.ts'\nimport type { RunReport } from '../exporter/delivery-types.ts'\nimport { configureRuntimeSessionModel, streamRuntimeSession, type AgentSession } from '../../agent/define/session.ts'\nimport {\n compactRuntimeSession, streamPendingRuntimeSession, type RuntimeSessionRunHandle,\n} from '../../agent/define/session/runtime-binding.ts'\nimport type { AgentRunHandle as LegacyRunHandle } from '../../agent/define/session/types.ts'\nimport type { AgentRunEvent } from '../../agent/mode/run-agent.ts'\nimport type { ToolExecutionResult } from '../../agent/tool/definition.ts'\nimport { TOOL_ERROR_CODES } from '../../agent/tool/errors.ts'\nimport { AgentSdkError } from '../../errors/agent-sdk-error.ts'\nimport type { ModelRegistry } from '../../runtime/registry.ts'\nimport type { ProviderSelection } from '../provider/types.ts'\nimport { atDeadline } from '../lifecycle/bounded.ts'\nimport type { RuntimeOperations } from '../lifecycle/operations.ts'\nimport type { RuntimeObservationPort } from '../observation/port.ts'\nimport { createRunTerminalRecord } from '../delivery/terminal.ts'\nimport { finalizeRuntimeRunReport, type RuntimeRunReport } from '../observation/final-report.ts'\nimport type { RuntimeObservationResource } from '../delivery/resource.ts'\nimport type { RuntimeResources } from '../../platform/resources.ts'\nimport { snapshotToolSources } from '../tool-source/snapshot.ts'\nimport { capabilityIdentityError, inheritCapabilityIdentityConflict } from '../identity/error.ts'\nimport type { CapturedToolSource } from '../tool-source/types.ts'\nimport type { ToolSourceRunReference } from '../tool-source/types.ts'\nimport { createRuntimeMemoryPersistence } from '../memory/run.ts'\nimport { validateMemoryResumeBinding } from '../memory/resume.ts'\nimport type { BoundRuntimeAgentDefinition } from './definition.ts'\nimport { captureInvocationOptions, captureRuntimeSessionOptions, type CapturedInvocationOptions } from './options.ts'\nimport { projectNativeToolEvent } from './native-event.ts'\nimport type {\n RuntimeAgent, RuntimeAgentInvocationOptions, RuntimeAgentResponse, RuntimeAgentRunEvent,\n RuntimeAgentRunHandle, RuntimeAgentSession, RuntimeAgentSessionOptions, RuntimeAgentSessionSnapshot,\n} from './types.ts'\nimport type { CompactionResult } from '../../agent/memory/compaction.ts'\nimport type { AgentTeamMemberOptions } from '../../agent/define/session/types.ts'\nimport type { TeamSessionPort } from '../../agent/team/contracts.ts'\nimport { assertAgentIdentitySnapshot } from '../identity/agent.ts'\n\nexport interface RuntimeAgentHost {\n readonly registry: ModelRegistry\n /**\n * The runtime's captured provider routes.\n *\n * Held so a per-invocation model override resolves against exactly the same\n * configuration the agent binding used, rather than a second view of it.\n */\n readonly selection: ProviderSelection\n readonly operations: RuntimeOperations\n readonly observation: RuntimeObservationPort\n readonly resource: RuntimeObservationResource\n readonly resources: RuntimeResources\n}\n\ninterface RuntimeAgentBinding {\n readonly host: RuntimeAgentHost\n readonly definition: BoundRuntimeAgentDefinition\n}\n\nconst runtimeAgentBindings = new WeakMap<RuntimeAgent, RuntimeAgentBinding>()\n\nexport function createRuntimeAgent(host: RuntimeAgentHost, definition: BoundRuntimeAgentDefinition): RuntimeAgent {\n const agent = Object.freeze({\n model: definition.model,\n generate(input: AgentInput, options?: RuntimeAgentInvocationOptions) { return createRuntimeSession(host, definition).run(input, options) },\n stream(input: AgentInput, options?: RuntimeAgentInvocationOptions) { return createRuntimeSession(host, definition).stream(input, options) },\n createSession(options?: RuntimeAgentSessionOptions) { return createRuntimeSession(host, definition, options) },\n resumeSession(snapshot: RuntimeAgentSessionSnapshot, options?: RuntimeAgentSessionOptions) {\n return createRuntimeSession(host, definition, options, snapshot)\n },\n })\n runtimeAgentBindings.set(agent, Object.freeze({ host, definition }))\n return agent\n}\n\nexport function createRuntimeTeamMemberSession(\n host: RuntimeAgentHost,\n agent: RuntimeAgent,\n options: RuntimeAgentSessionOptions,\n team: AgentTeamMemberOptions,\n ownerSignal: AbortSignal,\n): { readonly view: RuntimeAgentSession; readonly port: TeamSessionPort } {\n const binding = runtimeAgentBindings.get(agent)\n if (binding?.host !== host) throw new AgentSdkError(\n 'Runtime team members must be agents from the same runtime', 'TEAM_AGENT_OWNERSHIP_INVALID',\n )\n const view = createRuntimeSession(host, binding.definition, options, undefined, team, ownerSignal)\n return Object.freeze({ view, port: view.teamPort })\n}\n\nexport function preflightRuntimeTeamMember(\n host: RuntimeAgentHost,\n agent: RuntimeAgent,\n options: RuntimeAgentSessionOptions,\n additionalToolNames: readonly string[],\n): void {\n const binding = runtimeAgentBindings.get(agent)\n if (binding?.host !== host) throw new AgentSdkError(\n 'Runtime team members must be agents from the same runtime', 'TEAM_AGENT_OWNERSHIP_INVALID',\n )\n assertAgentIdentitySnapshot({\n tools: [...binding.definition.legacy.tools, ...options.tools ?? []],\n nativeTools: binding.definition.legacy.nativeTools,\n skills: [...binding.definition.legacy.skills, ...options.skills ?? []] as never,\n ...(binding.definition.legacy.skillIds === undefined ? {} : {\n allowedSkillIds: binding.definition.legacy.skillIds,\n }),\n additionalToolNames,\n })\n}\n\nexport function runtimeOwnsAgent(host: RuntimeAgentHost, agent: unknown): agent is RuntimeAgent {\n return typeof agent === 'object' && agent !== null && runtimeAgentBindings.get(agent as RuntimeAgent)?.host === host\n}\n\nclass RuntimeAgentSessionValue implements RuntimeAgentSession {\n private active: SessionOperation | undefined\n private readonly observerTimeoutMs: number\n readonly teamPort: TeamSessionPort\n\n constructor(\n private readonly host: RuntimeAgentHost,\n private readonly session: AgentSession,\n private readonly nativeProvider: string,\n definitionId: string,\n observerTimeoutMs = 30_000,\n private readonly ownerSignal?: AbortSignal,\n ) {\n this.observerTimeoutMs = observerTimeoutMs\n const owner = this\n this.teamPort = Object.freeze({\n definition: Object.freeze({ id: definitionId }),\n get conversationId() { return owner.conversationId },\n get isRunning() { return owner.isRunning },\n inject(input: Parameters<TeamSessionPort['inject']>[0]) { return owner.injectForTeam(input) },\n whenIdle(signal?: AbortSignal) { return owner.whenIdle(signal) },\n hasUnansweredInput() { return owner.session.hasUnansweredInput() },\n runPending(invocation = {}) { return owner.runPendingForTeam(invocation) },\n })\n }\n\n get conversationId(): string { return this.session.conversationId }\n get isRunning(): boolean { return this.active !== undefined }\n\n stream(input: AgentInput, rawOptions?: RuntimeAgentInvocationOptions): RuntimeAgentRunHandle {\n if (typeof input !== 'string') {\n if (input === null || typeof input !== 'object' || input.role !== 'user') throw new TypeError('Runtime input must be text or a user message')\n input = freezeMessage(input)\n }\n const options = captureInvocationOptions(rawOptions, this.host.selection)\n const started = this.start(input, options)\n return runtimeHandle(started.legacy, started.report, started.result, this.nativeProvider, options.includeTraceEvents === true)\n }\n\n private start(input: AgentInput | undefined, options: CapturedInvocationOptions): StartedRuntimeRun {\n const operation = this.beginOperation()\n let lease: ReturnType<RuntimeOperations['acquire']>\n try {\n const signal = this.ownerSignal === undefined\n ? options.signal\n : options.signal === undefined ? this.ownerSignal : AbortSignal.any([options.signal, this.ownerSignal])\n lease = this.host.operations.acquire('agent-run', {\n ...(signal === undefined ? {} : { signal }),\n })\n } catch (error) { this.finishOperation(operation); throw error }\n let output: JsonValue | undefined\n const structured = options.structuredOutput\n let legacy: RuntimeSessionRunHandle\n try {\n legacy = input === undefined\n ? streamPendingRuntimeSession(this.session, { signal: lease.signal, ...modelOverlay(options) })\n : streamRuntimeSession(this.session, input, { signal: lease.signal, ...modelOverlay(options),\n ...(structured === undefined ? {} : {\n outputFormat: { type: 'json_schema' as const, name: structured.name, schema: structured.schema.jsonSchema },\n validateOutput: (value: unknown) => {\n const parsed = structured.schema.parse(value)\n if (!isJsonValue(parsed)) throw new TypeError('structured output parser must return lossless JSON synchronously')\n output = detachedFrozen(parsed)\n },\n }), ...(options.imagePolicy === undefined ? {} : { imagePolicy: options.imagePolicy }),\n ...(options.documentPolicy === undefined ? {} : { documentPolicy: options.documentPolicy }) }, options.additionalInstructions)\n } catch (error) { lease.settle(); this.finishOperation(operation); throw error }\n const abort = (): void => legacy.abort()\n lease.signal.addEventListener('abort', abort, { once: true })\n if (lease.signal.aborted) abort()\n void lease.whenSealed.then(() => legacy.seal()).catch(() => undefined)\n const report = this.runtimeReport(legacy.report, legacy.toolSourceSnapshots, lease.signal)\n const internalResult = this.runtimeResult(legacy.result, report, () => output)\n const eventsSettled = Promise.race([legacy.eventsSettled, lease.whenSealed])\n const released = Promise.allSettled([eventsSettled, internalResult, report]).then(() => {\n lease.signal.removeEventListener('abort', abort)\n lease.settle()\n this.finishOperation(operation)\n })\n const result = released.then(() => internalResult)\n void result.catch(() => undefined)\n void report.catch(() => undefined)\n return Object.freeze({ legacy, report, result })\n }\n\n async run(input: AgentInput, rawOptions?: RuntimeAgentInvocationOptions): Promise<RuntimeAgentResponse> {\n const options = captureInvocationOptions(rawOptions, this.host.selection)\n const handle = this.stream(input, options)\n try {\n for await (const event of handle) {\n if (options.onEvent !== undefined) {\n try { await this.observe(options.onEvent, event, handle) }\n catch (error) {\n handle.abort()\n const report = await handle.report\n throw runtimeFailure(error, report, 'RUN_EVENT_OBSERVER_FAILED')\n }\n }\n }\n } catch (error) { if (codeOf(error) === 'RUN_EVENT_OBSERVER_FAILED') throw error; return await handle.result }\n return await handle.result\n }\n\n inject(input: AgentInput): number {\n this.host.operations.assertActive()\n this.assertOwnerActive()\n // A run in flight is the case steering exists for. The underlying session\n // holds the message until the round that could not see it has finished,\n // then delivers it in arrival order. Refusing here left the runtime\n // surface unable to steer at all, while the same call on a bare session\n // (and injectForTeam below) is accepted.\n return this.session.inject(input)\n }\n\n private injectForTeam(input: Parameters<TeamSessionPort['inject']>[0]): number {\n this.host.operations.assertActive()\n this.assertOwnerActive()\n return this.session.inject(input)\n }\n\n snapshot(): RuntimeAgentSessionSnapshot { return this.session.snapshot() }\n\n compact(rawOptions?: RuntimeAgentInvocationOptions): Promise<CompactionResult | null> {\n const options = captureInvocationOptions(rawOptions, this.host.selection)\n const operation = this.beginOperation()\n let pending: Promise<CompactionResult | null>\n try {\n pending = this.host.operations.execute('manual-compaction', {\n ...(this.ownerSignal === undefined\n ? options.signal === undefined ? {} : { signal: options.signal }\n : { signal: options.signal === undefined ? this.ownerSignal : AbortSignal.any([options.signal, this.ownerSignal]) }),\n }, async lease => {\n const outcome = await compactRuntimeSession(this.session, { signal: lease.signal, ...modelOverlay(options) })\n const record = createRunTerminalRecord(outcome.report)\n const terminal = await this.host.observation.checkpointTerminal(record, lease.signal)\n const report = finalizeRuntimeRunReport(record, outcome.report.delivery, terminal,\n this.host.observation.mode, this.host.observation.requiredBoundary)\n if (outcome.failure !== undefined) throw runtimeFailure(\n outcome.failure,\n report,\n report.errors.at(-1)?.code ?? codeOf(outcome.failure),\n )\n return outcome.result === null ? null : Object.freeze({ ...outcome.result, status: 'completed' as const, report })\n })\n } catch (error) { this.finishOperation(operation); throw error }\n return pending.finally(() => this.finishOperation(operation))\n }\n\n reset(): void {\n this.host.operations.assertActive()\n this.assertOwnerActive()\n if (this.active !== undefined) throw new Error('Cannot reset while a runtime session is active')\n this.session.reset()\n }\n\n whenIdle(signal?: AbortSignal): Promise<void> {\n const pending = this.active?.done\n if (pending === undefined) return Promise.resolve()\n if (signal?.aborted) return Promise.reject(new AgentSdkError('Runtime idle wait was aborted', 'RUNTIME_OPERATION_ABORTED'))\n return new Promise((resolve, reject) => {\n let release = (): void => undefined\n const finish = (error?: Error): void => { release(); error === undefined ? resolve() : reject(error) }\n if (signal !== undefined) release = this.host.resources.onAbort(signal,\n () => finish(new AgentSdkError('Runtime idle wait was aborted', 'RUNTIME_OPERATION_ABORTED')))\n void pending.then(() => finish())\n })\n }\n\n private async runPendingForTeam(invocation: {\n readonly signal?: AbortSignal\n readonly onEvent?: (event: AgentRunEvent) => void | Promise<void>\n }): Promise<unknown> {\n const started = this.start(undefined, {\n ...(invocation.signal === undefined ? {} : { signal: invocation.signal }),\n })\n try {\n for await (const event of started.legacy) await invocation.onEvent?.(event)\n } catch (error) {\n started.legacy.abort()\n await started.result.catch(() => undefined)\n throw error\n }\n return await started.result\n }\n\n private beginOperation(): SessionOperation {\n this.assertOwnerActive()\n if (this.active !== undefined) throw new Error('Cannot start while a runtime session is active')\n let resolve!: () => void\n const operation: SessionOperation = { done: new Promise(done => { resolve = done }), resolve }\n this.active = operation\n return operation\n }\n\n private finishOperation(operation: SessionOperation): void {\n if (this.active !== operation) return\n this.active = undefined\n operation.resolve()\n }\n\n private assertOwnerActive(): void {\n if (this.ownerSignal?.aborted === true) {\n throw new AgentSdkError('Runtime team session is closed', 'TEAM_CLOSED')\n }\n }\n\n private async runtimeReport(\n legacy: Promise<RunReport>,\n sourceSnapshots: Promise<readonly ToolSourceRunReference[]>,\n signal: AbortSignal,\n ): Promise<RuntimeRunReport> {\n const [previous, sources] = await Promise.all([legacy, sourceSnapshots])\n const record = createRunTerminalRecord(previous, sources)\n const terminal = await this.host.observation.checkpointTerminal(record, signal)\n return finalizeRuntimeRunReport(record, previous.delivery, terminal,\n this.host.observation.mode, this.host.observation.requiredBoundary)\n }\n\n private async runtimeResult(\n legacy: Promise<Awaited<LegacyRunHandle['result']>>,\n report: Promise<RuntimeRunReport>,\n output: () => JsonValue | undefined,\n ): Promise<RuntimeAgentResponse> {\n try {\n const response = await legacy\n const final = await report\n if (final.status !== 'success') {\n throw runtimeFailure(undefined, final, final.errors.at(-1)?.code ?? 'AGENT_RUN_FAILED')\n }\n const parsedOutput = output()\n return Object.freeze({ runId: final.runId, traceId: final.traceId,\n completed: response.outcome.completed, stopReason: response.outcome.reason.kind,\n text: response.text, ...(parsedOutput === undefined ? {} : { output: parsedOutput }),\n ...(response.message === undefined ? {} : { message: publicMessage(response.message) }),\n usage: final.usage, report: final })\n } catch (error) {\n const final = await report\n throw runtimeFailure(error, final, codeOf(error))\n }\n }\n\n private async observe(\n observer: NonNullable<RuntimeAgentInvocationOptions['onEvent']>,\n event: RuntimeAgentRunEvent,\n handle: RuntimeAgentRunHandle,\n ): Promise<void> {\n const deadlineAt = this.host.resources.platform.monotonicNow() + this.observerTimeoutMs\n try { await atDeadline(this.host.resources, deadlineAt, () => observer(event), undefined) }\n catch { handle.abort(); throw new AgentSdkError('Runtime event observer did not complete', 'RUN_EVENT_OBSERVER_FAILED') }\n }\n}\n\nfunction createRuntimeSession(\n host: RuntimeAgentHost,\n definition: BoundRuntimeAgentDefinition,\n options: RuntimeAgentSessionOptions = {},\n snapshot?: RuntimeAgentSessionSnapshot,\n team?: AgentTeamMemberOptions,\n ownerSignal?: AbortSignal,\n): RuntimeAgentSessionValue {\n host.operations.assertActive()\n options = captureRuntimeSessionOptions(options)\n assertAgentIdentitySnapshot({\n tools: [...definition.legacy.tools, ...options.tools ?? []],\n nativeTools: definition.legacy.nativeTools,\n skills: [...definition.legacy.skills, ...options.skills ?? []] as never,\n ...(definition.legacy.skillIds === undefined ? {} : { allowedSkillIds: definition.legacy.skillIds }),\n })\n const memory = options.memory === false ? undefined : options.memory ?? definition.memory\n if (snapshot !== undefined) validateMemoryResumeBinding(snapshot, memory)\n const toolSources = combineToolSources(definition.toolSources, options.toolSources ?? [])\n const limits = options.runtimeLimits\n const { maxSteps: _maxSteps, maxToolCalls: _maxToolCalls, ...agentRuntimeLimits } = limits ?? {}\n const selected = limits?.maxSteps === undefined && limits?.maxToolCalls === undefined\n ? definition.legacy : definition.legacy.with({\n ...(limits.maxSteps === undefined ? {} : { maxTurns: limits.maxSteps }),\n ...(limits.maxToolCalls === undefined ? {} : { maxToolCalls: limits.maxToolCalls }),\n })\n const shared = { registry: host.registry, observation: host.observation, observationResource: host.resource,\n ...(options.tools === undefined ? {} : { tools: options.tools }),\n ...(options.skills === undefined ? {} : { skills: options.skills as never }),\n ...(options.skillCwd === undefined ? {} : { skillCwd: options.skillCwd }),\n ...(options.userInput === undefined ? {} : { userInput: options.userInput }),\n ...(options.approvals === undefined ? {} : { approvals: options.approvals }),\n ...(options.spillStore === undefined ? {} : { spillStore: options.spillStore }),\n ...(options.experimentalPrograms === undefined ? {} : { experimentalPrograms: options.experimentalPrograms }),\n ...(options.interceptors === undefined ? {} : { interceptors: options.interceptors }),\n ...(options.contextSections === undefined ? {} : { contextSections: options.contextSections }),\n ...(options.hooks === undefined ? {} : { hooks: options.hooks }),\n ...(options.usagePolicy === undefined ? {} : { usagePolicy: options.usagePolicy }),\n ...(options.historyLimits === undefined ? {} : { historyLimits: options.historyLimits }),\n ...(options.ledgerLimits === undefined ? {} : { ledgerLimits: options.ledgerLimits }),\n ...(options.eventBufferLimits === undefined ? {} : { eventBufferLimits: options.eventBufferLimits }),\n ...(options.compaction === undefined ? {} : { compaction: options.compaction }),\n ...(team === undefined ? {} : { team }),\n ...(Object.keys(agentRuntimeLimits).length === 0 ? {} : { runtimeLimits: agentRuntimeLimits }),\n }\n const session = snapshot === undefined\n ? selected.createSession({ ...shared, ...(options.conversationId === undefined ? {} : { conversationId: options.conversationId }) })\n : selected.resumeSession({ ...shared, snapshot })\n configureRuntimeSessionModel(session, { provider: definition.model.provider, model: definition.model.id,\n ...(definition.effort === undefined ? {} : { reasoningEffort: definition.effort }),\n ...(definition.maxTokens === undefined ? {} : { maxTokens: definition.maxTokens }),\n logger: correlation => host.observation.correlatedLogger(correlation, { scope: 'sdk.agent.run' }),\n ...(toolSources.length === 0 ? {} : {\n prepareTools: (signal, logger, occupiedNames) => snapshotToolSources(\n toolSources, signal, logger, occupiedNames,\n ),\n }),\n ...(memory === undefined ? {} : {\n memory: createRuntimeMemoryPersistence(\n memory,\n definition.legacy.id,\n agentRuntimeLimits.memoryOperationTimeoutMs,\n ),\n }),\n })\n return new RuntimeAgentSessionValue(\n host, session, definition.model.provider, definition.legacy.id, limits?.observerTimeoutMs, ownerSignal,\n )\n}\n\n/** Project one captured invocation onto the low-level per-run model overlay. */\nfunction modelOverlay(options: CapturedInvocationOptions): {\n readonly model?: { readonly provider: string; readonly model: string }\n readonly maxTokens?: number\n} {\n return {\n ...(options.model === undefined ? {} : { model: { provider: options.model.provider, model: options.model.id } }),\n ...(options.maxTokens === undefined ? {} : { maxTokens: options.maxTokens }),\n }\n}\n\ninterface SessionOperation {\n readonly done: Promise<void>\n readonly resolve: () => void\n}\n\ninterface StartedRuntimeRun {\n readonly legacy: RuntimeSessionRunHandle\n readonly report: Promise<RuntimeRunReport>\n readonly result: Promise<RuntimeAgentResponse>\n}\n\nfunction combineToolSources(\n defined: readonly CapturedToolSource[],\n additional: readonly CapturedToolSource[],\n): readonly CapturedToolSource[] {\n const all = [...defined, ...additional]\n const seen = new Map<string, number>()\n for (const [index, source] of all.entries()) {\n const first = seen.get(source.id)\n if (first !== undefined) throw capabilityIdentityError(\n 'TOOL_SOURCE_ID_CONFLICT', 'tool-source-id', first, index,\n )\n seen.set(source.id, index)\n }\n return Object.freeze(all)\n}\n\nfunction runtimeHandle(\n source: LegacyRunHandle & { readonly traceId: string; abort(reason?: unknown): void },\n report: Promise<RuntimeRunReport>, result: Promise<RuntimeAgentResponse>, nativeProvider: string,\n includeTraceEvents: boolean,\n): RuntimeAgentRunHandle {\n let iterated = false\n return Object.freeze({ runId: source.runId, report, result, abort: () => source.abort(),\n [Symbol.asyncIterator](): AsyncIterator<RuntimeAgentRunEvent> {\n if (iterated) return (async function* () { throw new Error('A runtime run handle can only be iterated once') })()\n iterated = true\n return projectEvents(source, report, nativeProvider, includeTraceEvents)\n } })\n}\n\nasync function* projectEvents(\n source: LegacyRunHandle & { readonly traceId: string; abort(reason?: unknown): void },\n report: Promise<RuntimeRunReport>,\n nativeProvider: string,\n includeTraceEvents: boolean,\n): AsyncGenerator<RuntimeAgentRunEvent> {\n let sequence = 0, completed = false\n const context = () => ({ runId: source.runId, traceId: source.traceId, sequence: ++sequence, schemaVersion: 1 as const })\n try {\n for await (const event of source) {\n const projected = projectEvent(event, nativeProvider, includeTraceEvents)\n if (projected !== undefined) yield Object.freeze({ ...context(), ...projected }) as RuntimeAgentRunEvent\n }\n const terminal = await report\n if (terminal.status === 'success') {\n yield Object.freeze({ ...context(), type: 'usage', usage: terminal.usage, report: terminal })\n } else {\n const error = terminal.errors.at(-1) ?? fallbackError(terminal)\n yield Object.freeze({ ...context(), type: 'error', error, report: terminal })\n }\n completed = true\n } catch {\n const terminal = await report\n const error = terminal.errors.at(-1) ?? fallbackError(terminal)\n yield Object.freeze({ ...context(), type: 'error', error, report: terminal })\n completed = true\n } finally { if (!completed) source.abort() }\n}\n\ntype WithoutEventContext<T> = T extends unknown ? Omit<T, 'runId' | 'traceId' | 'sequence' | 'schemaVersion'> : never\ntype ProjectedEvent = WithoutEventContext<RuntimeAgentRunEvent>\n\nfunction projectEvent(event: AgentRunEvent, nativeProvider: string, includeTraceEvents: boolean): ProjectedEvent | undefined {\n if (event.type === 'usage-progress') return { type: 'usage-progress', usage: event.usage,\n ...(event.attemptId === undefined ? {} : { attemptId: event.attemptId }) }\n // Runtime consumers such as Edge hosts may persist an execution trace. Keep\n // the SDK's span lifecycle intact; unlike transcript events, spans carry the\n // identity and nesting needed to reconstruct the call tree.\n if (includeTraceEvents && (event.type === 'span-start' || event.type === 'span-end')) return event\n if (event.type === 'text-delta') return {\n type: event.phase === 'commentary' ? 'commentary-delta' : 'assistant-delta',\n text: event.text, index: event.index, phase: event.phase, blockId: `${event.trace.spanId}:${event.index}`,\n }\n if (event.type === 'assistant-message') return { type: 'assistant-message', message: publicMessage(event.message) }\n if (event.type === 'text-end' || event.type === 'reasoning-delta') {\n const { trace, ...content } = event\n return { ...content, blockId: `${trace.spanId}:${event.index}` }\n }\n if (event.type === 'image-delta') {\n const { trace, ...content } = event\n return { ...content, blockId: `${trace.spanId}:${event.itemId}` }\n }\n if (event.type === 'compaction-start' || event.type === 'compaction-end'\n || event.type === 'turn-start' || event.type === 'step-start' || event.type === 'step-end'\n || event.type === 'assistant-text' || event.type === 'assistant-reasoning') {\n const { trace: _trace, ...content } = event\n return content\n }\n if (event.type === 'tool-call') return { type: 'tool-call', callId: event.call.callId,\n name: event.call.toolName, input: parseInput(event.call.rawArguments) }\n if (event.type === 'tool-result') return { type: 'tool-result', callId: event.call.callId,\n name: event.call.toolName, status: toolResultStatus(event.result), output: event.result }\n if (event.type === 'assistant-native-tool') return projectNativeToolEvent(event.call, nativeProvider)\n if (event.type === 'approval-request') return { type: 'approval-request', request: event.request }\n if (event.type === 'user-input-request') return { type: 'user-input-request', request: event.request }\n if (event.type === 'user-input-response') return { type: 'user-input-response', requestId: event.request.requestId,\n response: event.response }\n return undefined\n}\n\nfunction toolResultStatus(\n result: ToolExecutionResult,\n): 'completed' | 'failed' | 'aborted' | 'rejected' | 'declined' {\n // A call the loop refused to run is neither success nor failure: nothing\n // broke, and nothing was done. Reporting it as either misleads a UI — and a\n // red row for a budget decision is what makes a finished run look crashed.\n if (!result.isError) return result.meta?.['declined'] === true ? 'declined' : 'completed'\n if (result.error.code === TOOL_ERROR_CODES.ABORTED\n || result.error.code === TOOL_ERROR_CODES.ABORTED_BEFORE_DISPATCH) return 'aborted'\n if (result.error.code === TOOL_ERROR_CODES.UNKNOWN_TOOL\n || result.error.code === TOOL_ERROR_CODES.INVALID_ARGUMENTS\n || result.error.code === TOOL_ERROR_CODES.MALFORMED_ARGUMENTS\n || result.error.code === TOOL_ERROR_CODES.DENIED\n || result.error.code === TOOL_ERROR_CODES.BUDGET_EXHAUSTED\n || result.error.code === TOOL_ERROR_CODES.CHECKPOINT_FAILED) return 'rejected'\n return 'failed'\n}\n\nfunction parseInput(value: string): unknown { try { return JSON.parse(value) as unknown } catch { return value } }\nfunction codeOf(value: unknown): string {\n return value instanceof AgentSdkError ? value.code : 'AGENT_RUN_FAILED'\n}\nfunction runtimeFailure(value: unknown, report: RuntimeRunReport, code: string): AgentRunError {\n return inheritCapabilityIdentityConflict(\n new AgentRunError('Agent run did not complete', code, report as never), value,\n )\n}\nfunction fallbackError(report: RuntimeRunReport): RuntimeRunReport['errors'][number] {\n return Object.freeze({ code: 'AGENT_RUN_FAILED', stage: 'agent-run', message: 'Agent operation failed',\n usageCoverage: report.usage.coverage,\n possiblyBilledAttemptsWithoutUsage: report.usage.coverage.possiblyBilledAttemptsWithoutUsage })\n}\n"],"mappings":"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"}