ctx.subagents.interrupt() stops one live continuable child's current turn
via Agent.cancel(cause, { keepInbox: true }) under either a human durable
parent address or an exact live ancestor Agent. Fire-and-return: admission
is synchronous, quiescence is not awaited. Pending inbox work, the
Activation, and published descendants are preserved; only a later waking
send resumes the parked FIFO queue. Absent, one-shot, and disposing
targets are accepted no-ops.
The new Host RPC subagent.interrupt calls only that primitive with user
authority — no catalog, history, persistence, or parent-registry lookup —
so a live child stays stoppable while its parent Agent is offline.
Refs #1535
90 lines
3.3 KiB
TypeScript
90 lines
3.3 KiB
TypeScript
/** Zod schemas for the browser-safe subagent domain. */
|
|
|
|
import { z } from 'zod'
|
|
import type { MessageId } from '@deepseek-ai/dsh-llm/brand'
|
|
import type { RequestPayload, ResponseValue } from './rpc-map.ts'
|
|
import type { Wire } from './rpc.schema.ts'
|
|
import {
|
|
contentBlockSchema, historyEntrySchema, sessionIdSchema, sessionProjectionsBlockSchema,
|
|
} from './sessions.schema.ts'
|
|
import type { SubagentListEntry } from './subagents.ts'
|
|
|
|
/** Healthy and diagnostic durable catalog rows. */
|
|
export const subagentListEntrySchema = z.union([
|
|
z.object({
|
|
kind: z.literal('child'),
|
|
id: sessionIdSchema,
|
|
mode: z.literal('one-shot'),
|
|
activity: z.union([z.literal('running'), z.literal('inactive')]),
|
|
hasChildren: z.boolean(),
|
|
label: z.string().optional(),
|
|
}),
|
|
z.object({
|
|
kind: z.literal('child'),
|
|
id: sessionIdSchema,
|
|
mode: z.literal('continuable'),
|
|
activity: z.union([z.literal('running'), z.literal('inactive')]),
|
|
hasChildren: z.boolean(),
|
|
label: z.string(),
|
|
}),
|
|
z.object({
|
|
kind: z.literal('diagnostic'),
|
|
id: sessionIdSchema,
|
|
reason: z.union([z.literal('corrupt'), z.literal('unsupported'), z.literal('unavailable')]),
|
|
}),
|
|
]) satisfies z.ZodType<Wire<SubagentListEntry>>
|
|
|
|
/** subagent.list request payload. */
|
|
export const subagentListRequestSchema = z.object({
|
|
parentSessionId: sessionIdSchema,
|
|
}) satisfies z.ZodType<Wire<RequestPayload<'subagent.list'>>>
|
|
|
|
/** subagent.list response value. */
|
|
export const subagentListValueSchema = z.object({
|
|
entries: z.array(subagentListEntrySchema),
|
|
parentAvailable: z.boolean(),
|
|
}) satisfies z.ZodType<Wire<ResponseValue<'subagent.list'>>>
|
|
|
|
/** subagent.history request payload. */
|
|
export const subagentHistoryRequestSchema = z.object({
|
|
parentSessionId: sessionIdSchema,
|
|
childSessionId: sessionIdSchema,
|
|
mode: z.union([z.literal('one-shot'), z.literal('continuable')]),
|
|
beforeSeq: z.number().int().nonnegative().optional(),
|
|
maxMessages: z.number().int().positive().optional(),
|
|
}) satisfies z.ZodType<Wire<RequestPayload<'subagent.history'>>>
|
|
|
|
/** subagent.history response value. */
|
|
export const subagentHistoryValueSchema = z.object({
|
|
events: z.array(historyEntrySchema),
|
|
hasMore: z.boolean(),
|
|
projections: sessionProjectionsBlockSchema.optional(),
|
|
}) as unknown as z.ZodType<Wire<ResponseValue<'subagent.history'>>>
|
|
|
|
/** subagent.prompt request payload. */
|
|
export const subagentPromptRequestSchema = z.object({
|
|
parentSessionId: sessionIdSchema,
|
|
childSessionId: sessionIdSchema,
|
|
mode: z.literal('continuable'),
|
|
content: z.array(contentBlockSchema),
|
|
}) as unknown as z.ZodType<RequestPayload<'subagent.prompt'>>
|
|
|
|
/** subagent.interrupt request payload. */
|
|
export const subagentInterruptRequestSchema = z.object({
|
|
parentSessionId: sessionIdSchema,
|
|
childSessionId: sessionIdSchema,
|
|
mode: z.literal('continuable'),
|
|
}) satisfies z.ZodType<Wire<RequestPayload<'subagent.interrupt'>>>
|
|
|
|
/** subagent.interrupt response value. */
|
|
export const subagentInterruptValueSchema = z.object({
|
|
accepted: z.literal(true),
|
|
}) satisfies z.ZodType<Wire<ResponseValue<'subagent.interrupt'>>>
|
|
|
|
const messageIdSchema = z.string() as unknown as z.ZodType<MessageId>
|
|
|
|
/** subagent.prompt response value. */
|
|
export const subagentPromptValueSchema = z.object({
|
|
messageId: messageIdSchema,
|
|
}) satisfies z.ZodType<Wire<ResponseValue<'subagent.prompt'>>>
|