@finalai/agents 0.4.3 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist/modules/agent-client/client.d.mts +1 -18
  2. package/dist/modules/agent-client/client.mjs +5 -39
  3. package/dist/modules/agent-client/client.mjs.map +2 -2
  4. package/dist/modules/agent-client/collection-events.d.mts +1 -1
  5. package/dist/modules/agent-client/collection-events.mjs.map +1 -1
  6. package/dist/modules/agent-client/context.d.mts +1 -2
  7. package/dist/modules/agent-client/context.mjs +0 -1
  8. package/dist/modules/agent-client/context.mjs.map +2 -2
  9. package/dist/modules/agent-client/conversations.d.mts +8 -7
  10. package/dist/modules/agent-client/conversations.mjs +41 -40
  11. package/dist/modules/agent-client/conversations.mjs.map +2 -2
  12. package/dist/modules/agent-client/errors.d.mts +14 -14
  13. package/dist/modules/agent-client/errors.mjs +15 -15
  14. package/dist/modules/agent-client/errors.mjs.map +3 -3
  15. package/dist/modules/agent-client/frame-stream.d.mts +8 -8
  16. package/dist/modules/agent-client/frame-stream.mjs +36 -36
  17. package/dist/modules/agent-client/frame-stream.mjs.map +2 -2
  18. package/dist/modules/agent-client/http.d.mts +2 -2
  19. package/dist/modules/agent-client/http.mjs +10 -10
  20. package/dist/modules/agent-client/http.mjs.map +2 -2
  21. package/dist/modules/agent-client/index.d.mts +2 -2
  22. package/dist/modules/agent-client/index.mjs +6 -6
  23. package/dist/modules/agent-client/index.mjs.map +2 -2
  24. package/dist/modules/agent-client/sessions.d.mts +9 -8
  25. package/dist/modules/agent-client/sessions.mjs +13 -13
  26. package/dist/modules/agent-client/sessions.mjs.map +2 -2
  27. package/examples/release-scout/README.md +1 -1
  28. package/examples/release-scout/client.ts +2 -2
  29. package/package.json +5 -5
@@ -1,14 +1,14 @@
1
1
  import type { JsonObjectIface, JsonValue } from '@finalai/agent-protocol';
2
- import { type AcpFrameEventIface, type AcpPreviewEventIface, type AgentSessionIface, type AgentTurnIface, type AgentTurnPolicy, type AttachmentDownloadIface, type ContentInput, type PendingOutcomeInput, type PendingRequestIface, type PromptAcceptedIface, type RespondPendingResponseIface, type SessionFramesPageIface, type SessionManifestIface } from '@finalai/agent-protocol/agent-platform';
2
+ import { type AcpFrameEventIface, type AcpPreviewEventIface, type AgentSessionIface, type AgentTurnIface, type AgentTurnPolicy, type AttachmentDownloadIface, type ContentInput, type DecisionOutcomeInput, type DecisionRecordIface, type PromptAcceptedIface, type RespondDecisionResponseIface, type SessionFramesPageIface, type SessionManifestIface } from '@finalai/agent-protocol/agent-platform';
3
3
  import { type ClientContextIface, type EnumInput, type SignalOptionsIface } from "./context.mjs";
4
4
  import { type SessionLiveEvent } from "./live-stream.mjs";
5
- /** Answer a pending request by option id (permission) or with a full ACP outcome. */
5
+ /** Answer a decision by option id (permission) or with a full ACP outcome. */
6
6
  export type RespondArgs = {
7
- pendingId: string;
7
+ decisionId: string;
8
8
  optionId: string;
9
9
  } | {
10
- pendingId: string;
11
- outcome: PendingOutcomeInput;
10
+ decisionId: string;
11
+ outcome: DecisionOutcomeInput;
12
12
  };
13
13
  export interface StreamOptionsIface extends SignalOptionsIface {
14
14
  /** Inclusive; defaults to `FIRST_ACP_FRAME_SEQ` (the whole log). Earlier values are clamped. */
@@ -73,11 +73,12 @@ export interface SessionHandleIface {
73
73
  fromSeq: number;
74
74
  limit?: number;
75
75
  }) => Promise<SessionFramesPageIface>;
76
- pending: (options?: SignalOptionsIface) => Promise<PendingRequestIface[]>;
76
+ /** The session's open decisions (`GET /sessions/:id/decisions`). */
77
+ decisions: (options?: SignalOptionsIface) => Promise<DecisionRecordIface[]>;
77
78
  turn: (turnId: string, options?: SignalOptionsIface) => Promise<AgentTurnIface>;
78
79
  /** Reconstruct an accepted response from its durable turn id, without resending its prompt. */
79
80
  response: (turnId: string, options?: SignalOptionsIface) => Promise<TurnHandleIface<string | null>>;
80
- respond: (args: RespondArgs, options?: SignalOptionsIface) => Promise<RespondPendingResponseIface>;
81
+ respond: (args: RespondArgs, options?: SignalOptionsIface) => Promise<RespondDecisionResponseIface>;
81
82
  cancel: (options?: SignalOptionsIface & {
82
83
  reason?: string;
83
84
  }) => Promise<void>;
@@ -119,6 +120,6 @@ export interface SessionsApiIface {
119
120
  get: (sessionId: string, options?: SignalOptionsIface) => Promise<AgentSessionIface>;
120
121
  attach: (sessionId: string) => SessionHandleIface;
121
122
  }
122
- export declare const outcomeOf: (args: RespondArgs) => PendingOutcomeInput;
123
+ export declare const outcomeOf: (args: RespondArgs) => DecisionOutcomeInput;
123
124
  export declare const createSessionHandle: (context: ClientContextIface, sessionId: string) => SessionHandleIface;
124
125
  export declare const createSessionsApi: (context: ClientContextIface) => SessionsApiIface;
@@ -12,12 +12,12 @@ import {
12
12
  FIRST_ACP_FRAME_SEQ,
13
13
  forkSessionRequestSchema,
14
14
  observeSessionRequestSchema,
15
+ decisionRecordListSchema,
15
16
  okResponseSchema,
16
- pendingRequestListSchema,
17
17
  promptAcceptedSchema,
18
18
  promptSessionRequestSchema,
19
- respondPendingRequestSchema,
20
- respondPendingResponseSchema,
19
+ respondDecisionResponseSchema,
20
+ respondDecisionSchema,
21
21
  sessionFramesPageSchema,
22
22
  sessionManifestSchema,
23
23
  sessionSchema,
@@ -109,12 +109,12 @@ const replay = (args) => args.context.http.request({
109
109
  response: sessionFramesPageSchema,
110
110
  signal: args.signal
111
111
  });
112
- const openPending = async (args) => (await args.context.http.request({
112
+ const openDecisions = async (args) => (await args.context.http.request({
113
113
  method: HttpMethod.Get,
114
- path: sessionPath(args.sessionId, "/pending"),
115
- response: pendingRequestListSchema,
114
+ path: sessionPath(args.sessionId, "/decisions"),
115
+ response: decisionRecordListSchema,
116
116
  signal: args.signal
117
- })).pending;
117
+ })).decisions;
118
118
  async function* streamFramesOverHttp(args) {
119
119
  for await (const message of streamServerSentEvents({
120
120
  http: args.context.http,
@@ -171,7 +171,7 @@ const streamPreviews = (args) => {
171
171
  };
172
172
  const frameSources = (args) => ({
173
173
  replay: (page) => replay({ context: args.context, sessionId: args.sessionId, ...page }),
174
- pending: (signal) => openPending({ ...args, signal }),
174
+ decisions: (signal) => openDecisions({ ...args, signal }),
175
175
  httpStream: (stream) => streamFramesOverHttp({ ...args, ...stream })
176
176
  });
177
177
  const createSessionHandle = (context, sessionId) => {
@@ -272,7 +272,7 @@ const createSessionHandle = (context, sessionId) => {
272
272
  liveEvents: (options) => streamSessionLiveEvents({ context, sessionId, signal: options?.signal }),
273
273
  previews: (options) => streamPreviews({ context, sessionId, signal: options?.signal }),
274
274
  frames: (options) => replay({ context, sessionId, ...options }),
275
- pending: (options) => openPending({ context, sessionId, signal: options?.signal }),
275
+ decisions: (options) => openDecisions({ context, sessionId, signal: options?.signal }),
276
276
  turn: (turnId, options) => getTurn({ context, sessionId, turnId, signal: options?.signal }),
277
277
  response: async (turnId, options) => {
278
278
  const receipt = await getTurn({ context, sessionId, turnId, signal: options?.signal });
@@ -290,12 +290,12 @@ const createSessionHandle = (context, sessionId) => {
290
290
  method: HttpMethod.Post,
291
291
  path: sessionPath(sessionId, "/respond"),
292
292
  body: {
293
- schema: respondPendingRequestSchema,
294
- value: { pendingId: args.pendingId, outcome: outcomeOf(args) }
293
+ schema: respondDecisionSchema,
294
+ value: { decisionId: args.decisionId, outcome: outcomeOf(args) }
295
295
  },
296
- response: respondPendingResponseSchema,
296
+ response: respondDecisionResponseSchema,
297
297
  signal: options?.signal,
298
- context: { sessionId, pendingId: args.pendingId }
298
+ context: { sessionId, decisionId: args.decisionId }
299
299
  }),
300
300
  cancel: (options) => post({
301
301
  suffix: "/cancel",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/agent-client/sessions.ts"],
4
- "sourcesContent": ["import type { JsonObjectIface, JsonValue } from '@finalai/agent-protocol';\nimport {\n acpFrameEventSchema,\n acpPreviewEventSchema,\n agentRealtimeFrameSchema,\n AgentRealtimeFrameType,\n AgentRealtimeKind,\n agentRealtimeTopics,\n attachmentDownloadSchema,\n cancelRequestSchema,\n createSessionRequestSchema,\n createSessionResponseSchema,\n FIRST_ACP_FRAME_SEQ,\n forkSessionRequestSchema,\n observeSessionRequestSchema,\n okResponseSchema,\n pendingRequestListSchema,\n promptAcceptedSchema,\n promptSessionRequestSchema,\n respondPendingRequestSchema,\n respondPendingResponseSchema,\n sessionFramesPageSchema,\n sessionManifestSchema,\n sessionSchema,\n setConfigOptionRequestSchema,\n turnSchema,\n type AcpFrameEventIface,\n type AcpPreviewEventIface,\n type AgentSessionIface,\n type AgentTurnIface,\n type AgentTurnPolicy,\n type AttachmentDownloadIface,\n type ContentInput,\n type PendingOutcomeInput,\n type PendingRequestIface,\n type PromptAcceptedIface,\n type RespondPendingResponseIface,\n type SessionFramesPageIface,\n type SessionManifestIface,\n} from '@finalai/agent-protocol/agent-platform';\nimport { createTextCollector, isUserMessageFor, turnEndOf } from \"./acp-frames.mjs\";\nimport { createAsyncQueue, failOnAbort } from \"./async-queue.mjs\";\nimport {\n encodePath,\n type ClientContextIface,\n type EnumInput,\n type SignalOptionsIface,\n} from \"./context.mjs\";\nimport { isTerminalRealtimeError, realtimeSubscriptionError } from \"./errors.mjs\";\nimport { streamServerSentEvents } from \"./event-stream.mjs\";\nimport { streamSessionFrames } from \"./frame-stream.mjs\";\nimport { HttpMethod, type HttpBodyIface } from \"./http.mjs\";\nimport { streamSessionLiveEvents, type SessionLiveEvent } from \"./live-stream.mjs\";\nimport type { RealtimeTransportFrameIface } from \"./realtime.mjs\";\n\n/** Answer a pending request by option id (permission) or with a full ACP outcome. */\nexport type RespondArgs =\n | { pendingId: string; optionId: string }\n | { pendingId: string; outcome: PendingOutcomeInput };\n\nexport interface StreamOptionsIface extends SignalOptionsIface {\n /** Inclusive; defaults to `FIRST_ACP_FRAME_SEQ` (the whole log). Earlier values are clamped. */\n fromSeq?: number;\n /** Keep streaming live frames after replay catches up; defaults to true. */\n follow?: boolean;\n}\n\nexport interface TurnResultIface<MessageId extends string | null = string> {\n messageId: MessageId;\n turnId: string;\n stopReason: string | null;\n /** Visible agent text of the turn. */\n text: string;\n /** Seq of the frame that ended the turn. */\n toSeq: number;\n}\n\n/** An accepted prompt. `stream()` yields this turn's frames; `result()` waits for its end. */\nexport interface TurnHandleIface<MessageId extends string | null = string> extends Omit<\n PromptAcceptedIface,\n 'messageId'\n> {\n messageId: MessageId;\n sessionId: string;\n get: (options?: SignalOptionsIface) => Promise<AgentTurnIface>;\n stream: (options?: SignalOptionsIface) => AsyncIterableIterator<AcpFrameEventIface>;\n result: (options?: SignalOptionsIface) => Promise<TurnResultIface<MessageId>>;\n}\n\nexport interface SendOptionsIface extends SignalOptionsIface {\n turnPolicy?: EnumInput<AgentTurnPolicy>;\n idempotencyKey?: string;\n meta?: JsonObjectIface;\n /** When the person submitted, for the prompt-to-inference trace; defaults to now. */\n clientSubmittedAtMs?: number;\n}\n\nexport interface ForkSessionOptionsIface extends SignalOptionsIface {\n /** Retain this key when retrying an interrupted fork. Defaults to a new key. */\n idempotencyKey?: string;\n title?: string;\n}\n\n/** An I/O-free handle on one session; every method is one HTTP call or one stream. */\nexport interface SessionHandleIface {\n id: string;\n /** Native fork of an idle source on its pinned revision; the standalone child has fresh scopes. */\n fork: (options?: ForkSessionOptionsIface) => Promise<CreatedSessionIface>;\n get: (options?: SignalOptionsIface) => Promise<AgentSessionIface>;\n /** Resolves a `final-attachment:` resource link from this session's frames. */\n attachment: (\n attachmentId: string,\n options?: SignalOptionsIface,\n ) => Promise<AttachmentDownloadIface>;\n send: (content: ContentInput, options?: SendOptionsIface) => Promise<TurnHandleIface>;\n /** Adds content to history without a model call (`_final/session/observe`). */\n observe: (\n content: ContentInput,\n options?: SignalOptionsIface & { idempotencyKey?: string; meta?: JsonObjectIface },\n ) => Promise<void>;\n stream: (options?: StreamOptionsIface) => AsyncIterableIterator<AcpFrameEventIface>;\n /** Full provisional frames and reset notices; never a durable replay cursor or receipt. */\n liveEvents: (options?: SignalOptionsIface) => AsyncIterableIterator<SessionLiveEvent>;\n /**\n * `acp.preview` events: the text of message and thought chunks as the session\n * publishes them, live only (never replayed), for surfaces that render text\n * ahead of the durable frames and the conversation's projected messages.\n */\n previews: (options?: SignalOptionsIface) => AsyncIterableIterator<AcpPreviewEventIface>;\n /** One replay page (`GET /sessions/:id/frames`). */\n frames: (\n options: SignalOptionsIface & { fromSeq: number; limit?: number },\n ) => Promise<SessionFramesPageIface>;\n pending: (options?: SignalOptionsIface) => Promise<PendingRequestIface[]>;\n turn: (turnId: string, options?: SignalOptionsIface) => Promise<AgentTurnIface>;\n /** Reconstruct an accepted response from its durable turn id, without resending its prompt. */\n response: (\n turnId: string,\n options?: SignalOptionsIface,\n ) => Promise<TurnHandleIface<string | null>>;\n respond: (\n args: RespondArgs,\n options?: SignalOptionsIface,\n ) => Promise<RespondPendingResponseIface>;\n cancel: (options?: SignalOptionsIface & { reason?: string }) => Promise<void>;\n /**\n * ACP `session/set_config_option` (model, reasoning, mode, ...): `configId` and a value\n * from the options the harness advertises (`get().configOptions`, `configSelectsOf`).\n * Changing them takes the session's owner, or a conversation owner or admin.\n */\n setConfigOption: (\n args: { configId: string; value: JsonValue },\n options?: SignalOptionsIface,\n ) => Promise<void>;\n close: (options?: SignalOptionsIface) => Promise<void>;\n /** Resolved manifest and resolver report; secret-bearing output requires agents:read and admin secret-binding access. */\n manifest: (options?: SignalOptionsIface) => Promise<SessionManifestIface>;\n}\n\nexport interface CreateSessionArgsIface extends SignalOptionsIface {\n /** Agent slug or id. */\n agent: string;\n /** Pin an author test session to a revision returned by definitions.testRevision. */\n revisionId?: string;\n message?: ContentInput;\n turnPolicy?: EnumInput<AgentTurnPolicy>;\n idempotencyKey?: string;\n title?: string;\n meta?: JsonObjectIface;\n /** When the person submitted `message`; defaults to now. */\n clientSubmittedAtMs?: number;\n}\n\nexport interface CreatedSessionIface {\n session: AgentSessionIface;\n handle: SessionHandleIface;\n /** The first turn when `message` was given. */\n response: TurnHandleIface | null;\n}\n\nexport interface SessionsApiIface {\n create: (args: CreateSessionArgsIface) => Promise<CreatedSessionIface>;\n fork: (sessionId: string, options?: ForkSessionOptionsIface) => Promise<CreatedSessionIface>;\n get: (sessionId: string, options?: SignalOptionsIface) => Promise<AgentSessionIface>;\n attach: (sessionId: string) => SessionHandleIface;\n}\n\nexport const outcomeOf = (args: RespondArgs): PendingOutcomeInput =>\n 'optionId' in args ? { outcome: 'selected', optionId: args.optionId } : args.outcome;\n\nconst sessionPath = (sessionId: string, suffix = ''): string =>\n `/v1/sessions/${encodePath(sessionId)}${suffix}`;\n\ninterface TurnHandleArgsIface<MessageId extends string | null> {\n context: ClientContextIface;\n sessionId: string;\n accepted: Omit<PromptAcceptedIface, 'messageId'> & { messageId: MessageId };\n}\n\nconst turnHandle = <MessageId extends string | null>(\n args: TurnHandleArgsIface<MessageId>,\n): TurnHandleIface<MessageId> => {\n const { context, sessionId, accepted } = args;\n const get = (options?: SignalOptionsIface) =>\n getTurn({ context, sessionId, turnId: accepted.turnId, signal: options?.signal });\n const stream = (options?: SignalOptionsIface): AsyncIterableIterator<AcpFrameEventIface> => {\n // Without the prompt's seq, scan from the start for ACP's user message with this id.\n // `until` runs as frames are queued and `next` as they are consumed, so each tracks its own start.\n let queuedStart = accepted.messageId == null && accepted.fromSeq != null;\n let started = queuedStart;\n const frames = streamSessionFrames({\n sessionId,\n fromSeq: accepted.fromSeq ?? FIRST_ACP_FRAME_SEQ,\n follow: true,\n ...frameSources({ context, sessionId }),\n transport: context.realtime(),\n timing: context.timing,\n signal: options?.signal,\n closeSignal: context.closeSignal,\n terminal: async (signal) => {\n const receipt = await get({ signal });\n return receipt.endedAt == null ? null : { throughSeq: receipt.toSeq ?? 0 };\n },\n until: (event) => {\n if (\n !queuedStart &&\n accepted.messageId != null &&\n isUserMessageFor(event, accepted.messageId)\n )\n queuedStart = true;\n return queuedStart && turnEndOf(event) != null;\n },\n });\n const iterator: AsyncIterableIterator<AcpFrameEventIface> = {\n next: async () => {\n for (;;) {\n const next = await frames.next();\n if (next.done === true || started) return next;\n if (accepted.messageId != null && isUserMessageFor(next.value, accepted.messageId)) {\n started = true;\n return next;\n }\n }\n },\n return: () => frames.return?.() ?? Promise.resolve({ done: true, value: undefined }),\n [Symbol.asyncIterator]: () => iterator,\n };\n return iterator;\n };\n\n const result = async (options?: SignalOptionsIface): Promise<TurnResultIface<MessageId>> => {\n const text = createTextCollector();\n let last: AcpFrameEventIface | null = null;\n for await (const event of stream(options)) {\n text.add(event);\n last = event;\n }\n const end = last == null ? null : turnEndOf(last);\n const receipt = await get(options);\n return {\n messageId: accepted.messageId,\n turnId: accepted.turnId,\n stopReason: receipt.stopReason ?? end?.stopReason ?? null,\n text: text.text(),\n toSeq: receipt.toSeq ?? last?.seq ?? accepted.fromSeq ?? 0,\n };\n };\n\n return { ...accepted, sessionId, get, stream, result };\n};\n\nconst getTurn = (args: {\n context: ClientContextIface;\n sessionId: string;\n turnId: string;\n signal?: AbortSignal;\n}): Promise<AgentTurnIface> =>\n args.context.http.request({\n method: HttpMethod.Get,\n path: sessionPath(args.sessionId, `/turns/${encodePath(args.turnId)}`),\n response: turnSchema,\n signal: args.signal,\n });\n\ninterface ReplayArgsIface extends SignalOptionsIface {\n context: ClientContextIface;\n sessionId: string;\n fromSeq: number;\n limit?: number;\n}\n\nconst replay = (args: ReplayArgsIface): Promise<SessionFramesPageIface> =>\n args.context.http.request({\n method: HttpMethod.Get,\n path: sessionPath(args.sessionId, '/frames'),\n query: { fromSeq: args.fromSeq, limit: args.limit },\n response: sessionFramesPageSchema,\n signal: args.signal,\n });\n\nconst openPending = async (args: {\n context: ClientContextIface;\n sessionId: string;\n signal?: AbortSignal;\n}): Promise<PendingRequestIface[]> =>\n (\n await args.context.http.request({\n method: HttpMethod.Get,\n path: sessionPath(args.sessionId, '/pending'),\n response: pendingRequestListSchema,\n signal: args.signal,\n })\n ).pending;\n\n/** The session's frames over Streamable HTTP (`GET /sessions/:id/frames/stream`), from `fromSeq`. */\nasync function* streamFramesOverHttp(args: {\n context: ClientContextIface;\n sessionId: string;\n fromSeq: number;\n signal: AbortSignal;\n}): AsyncGenerator<AcpFrameEventIface> {\n for await (const message of streamServerSentEvents({\n http: args.context.http,\n path: sessionPath(args.sessionId, '/frames/stream'),\n query: { fromSeq: args.fromSeq },\n signal: AbortSignal.any([args.signal, args.context.closeSignal]),\n })) {\n if (message.event !== AgentRealtimeKind.AcpFrame) continue;\n try {\n const event = acpFrameEventSchema.safeParse(JSON.parse(message.data));\n if (event.success) yield event.data;\n } catch {\n // A malformed event is skipped; replay fills any gap it leaves.\n }\n }\n}\n\n/** Live `acp.preview` events of the session topic. */\nconst streamPreviews = (args: {\n context: ClientContextIface;\n sessionId: string;\n signal?: AbortSignal;\n}): AsyncIterableIterator<AcpPreviewEventIface> => {\n const topic = agentRealtimeTopics.session(args.sessionId);\n let unsubscribe: (() => void) | null = null;\n let detachAbort: () => void = () => {};\n let detachClose: () => void = () => {};\n const queue = createAsyncQueue<AcpPreviewEventIface>(() => {\n unsubscribe?.();\n detachAbort();\n detachClose();\n });\n const onFrame = (raw: RealtimeTransportFrameIface): void => {\n const frame = agentRealtimeFrameSchema.safeParse(raw);\n if (!frame.success) return;\n if (frame.data.type === AgentRealtimeFrameType.Error && isTerminalRealtimeError(frame.data)) {\n queue.fail(\n realtimeSubscriptionError({\n topic: frame.data.topic ?? topic,\n code: frame.data.code ?? 'unknown',\n message: frame.data.message ?? 'Realtime subscription was refused',\n }),\n );\n return;\n }\n if (frame.data.type !== AgentRealtimeFrameType.Event) return;\n if (frame.data.kind !== AgentRealtimeKind.AcpPreview) return;\n const preview = acpPreviewEventSchema.safeParse(frame.data.payload);\n if (preview.success) queue.push(preview.data);\n };\n detachAbort = failOnAbort(queue, args.signal);\n detachClose = failOnAbort(queue, args.context.closeSignal);\n if (!queue.closed()) {\n const stop = args.context.realtime().subscribe(topic, onFrame);\n if (queue.closed()) stop();\n else unsubscribe = stop;\n }\n return queue.iterator;\n};\n\n/** Replay, open pending requests and the Streamable HTTP fallback of one session's frame stream. */\nconst frameSources = (args: { context: ClientContextIface; sessionId: string }) => ({\n replay: (page: { fromSeq: number; limit: number; signal?: AbortSignal }) =>\n replay({ context: args.context, sessionId: args.sessionId, ...page }),\n pending: (signal?: AbortSignal) => openPending({ ...args, signal }),\n httpStream: (stream: { fromSeq: number; signal: AbortSignal }) =>\n streamFramesOverHttp({ ...args, ...stream }),\n});\n\nexport const createSessionHandle = (\n context: ClientContextIface,\n sessionId: string,\n): SessionHandleIface => {\n const { http } = context;\n const post = async (args: {\n suffix: string;\n body?: HttpBodyIface;\n signal?: AbortSignal;\n }): Promise<void> => {\n await http.request({\n method: HttpMethod.Post,\n path: sessionPath(sessionId, args.suffix),\n body: args.body,\n response: okResponseSchema,\n signal: args.signal,\n context: { sessionId },\n });\n };\n\n return {\n id: sessionId,\n fork: async (options) => {\n const created = await http.request({\n method: HttpMethod.Post,\n path: sessionPath(sessionId, '/fork'),\n body: {\n schema: forkSessionRequestSchema,\n value: {\n idempotencyKey: options?.idempotencyKey ?? context.newKey(),\n title: options?.title,\n },\n },\n response: createSessionResponseSchema,\n signal: options?.signal,\n context: { sessionId },\n });\n return {\n session: created.session,\n handle: createSessionHandle(context, created.session.id),\n response: null,\n };\n },\n attachment: (attachmentId, options) =>\n http.request({\n method: HttpMethod.Get,\n path: sessionPath(sessionId, `/attachments/${encodePath(attachmentId)}`),\n response: attachmentDownloadSchema,\n signal: options?.signal,\n }),\n get: (options) =>\n http.request({\n method: HttpMethod.Get,\n path: sessionPath(sessionId),\n response: sessionSchema,\n signal: options?.signal,\n }),\n manifest: (options) =>\n http.request({\n method: HttpMethod.Get,\n path: sessionPath(sessionId, '/manifest'),\n response: sessionManifestSchema,\n signal: options?.signal,\n }),\n send: async (content, options) => {\n const accepted = await http.request({\n method: HttpMethod.Post,\n path: sessionPath(sessionId, '/prompt'),\n body: {\n schema: promptSessionRequestSchema,\n value: {\n content,\n turnPolicy: options?.turnPolicy,\n idempotencyKey: options?.idempotencyKey ?? context.newKey(),\n meta: options?.meta,\n clientSubmittedAtMs: options?.clientSubmittedAtMs ?? context.now(),\n },\n },\n response: promptAcceptedSchema,\n signal: options?.signal,\n context: { sessionId },\n });\n return turnHandle({ context, sessionId, accepted });\n },\n observe: (content, options) =>\n post({\n suffix: '/observe',\n body: {\n schema: observeSessionRequestSchema,\n value: {\n content,\n idempotencyKey: options?.idempotencyKey ?? context.newKey(),\n meta: options?.meta,\n },\n },\n signal: options?.signal,\n }),\n stream: (options) =>\n streamSessionFrames({\n sessionId,\n fromSeq: options?.fromSeq ?? FIRST_ACP_FRAME_SEQ,\n follow: options?.follow ?? true,\n ...frameSources({ context, sessionId }),\n transport: context.realtime(),\n timing: context.timing,\n signal: options?.signal,\n closeSignal: context.closeSignal,\n }),\n liveEvents: (options) =>\n streamSessionLiveEvents({ context, sessionId, signal: options?.signal }),\n previews: (options) => streamPreviews({ context, sessionId, signal: options?.signal }),\n frames: (options) => replay({ context, sessionId, ...options }),\n pending: (options) => openPending({ context, sessionId, signal: options?.signal }),\n turn: (turnId, options) => getTurn({ context, sessionId, turnId, signal: options?.signal }),\n response: async (turnId, options) => {\n const receipt = await getTurn({ context, sessionId, turnId, signal: options?.signal });\n return turnHandle({\n context,\n sessionId,\n accepted: {\n turnId: receipt.id,\n messageId: receipt.promptMessageId,\n fromSeq: receipt.fromSeq,\n },\n });\n },\n respond: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: sessionPath(sessionId, '/respond'),\n body: {\n schema: respondPendingRequestSchema,\n value: { pendingId: args.pendingId, outcome: outcomeOf(args) },\n },\n response: respondPendingResponseSchema,\n signal: options?.signal,\n context: { sessionId, pendingId: args.pendingId },\n }),\n cancel: (options) =>\n post({\n suffix: '/cancel',\n body: { schema: cancelRequestSchema, value: { reason: options?.reason } },\n signal: options?.signal,\n }),\n setConfigOption: (args, options) =>\n post({\n suffix: '/config-option',\n body: { schema: setConfigOptionRequestSchema, value: args },\n signal: options?.signal,\n }),\n close: (options) => post({ suffix: '/close', signal: options?.signal }),\n };\n};\n\nexport const createSessionsApi = (context: ClientContextIface): SessionsApiIface => ({\n create: async (args) => {\n const created = await context.http.request({\n method: HttpMethod.Post,\n path: '/v1/sessions',\n body: {\n schema: createSessionRequestSchema,\n value: {\n agent: args.agent,\n revisionId: args.revisionId,\n message: args.message,\n turnPolicy: args.turnPolicy,\n idempotencyKey:\n args.idempotencyKey ?? (args.message == null ? undefined : context.newKey()),\n title: args.title,\n meta: args.meta,\n clientSubmittedAtMs:\n args.message == null ? undefined : (args.clientSubmittedAtMs ?? context.now()),\n },\n },\n response: createSessionResponseSchema,\n signal: args.signal,\n });\n const handle = createSessionHandle(context, created.session.id);\n return {\n session: created.session,\n handle,\n response:\n created.turn == null\n ? null\n : turnHandle({ context, sessionId: created.session.id, accepted: created.turn }),\n };\n },\n fork: (sessionId, options) => createSessionHandle(context, sessionId).fork(options),\n get: (sessionId, options) => createSessionHandle(context, sessionId).get(options),\n attach: (sessionId) => createSessionHandle(context, sessionId),\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { JsonObjectIface, JsonValue } from '@finalai/agent-protocol';\nimport {\n acpFrameEventSchema,\n acpPreviewEventSchema,\n agentRealtimeFrameSchema,\n AgentRealtimeFrameType,\n AgentRealtimeKind,\n agentRealtimeTopics,\n attachmentDownloadSchema,\n cancelRequestSchema,\n createSessionRequestSchema,\n createSessionResponseSchema,\n FIRST_ACP_FRAME_SEQ,\n forkSessionRequestSchema,\n observeSessionRequestSchema,\n decisionRecordListSchema,\n okResponseSchema,\n promptAcceptedSchema,\n promptSessionRequestSchema,\n respondDecisionResponseSchema,\n respondDecisionSchema,\n sessionFramesPageSchema,\n sessionManifestSchema,\n sessionSchema,\n setConfigOptionRequestSchema,\n turnSchema,\n type AcpFrameEventIface,\n type AcpPreviewEventIface,\n type AgentSessionIface,\n type AgentTurnIface,\n type AgentTurnPolicy,\n type AttachmentDownloadIface,\n type ContentInput,\n type DecisionOutcomeInput,\n type DecisionRecordIface,\n type PromptAcceptedIface,\n type RespondDecisionResponseIface,\n type SessionFramesPageIface,\n type SessionManifestIface,\n} from '@finalai/agent-protocol/agent-platform';\nimport { createTextCollector, isUserMessageFor, turnEndOf } from \"./acp-frames.mjs\";\nimport { createAsyncQueue, failOnAbort } from \"./async-queue.mjs\";\nimport {\n encodePath,\n type ClientContextIface,\n type EnumInput,\n type SignalOptionsIface,\n} from \"./context.mjs\";\nimport { isTerminalRealtimeError, realtimeSubscriptionError } from \"./errors.mjs\";\nimport { streamServerSentEvents } from \"./event-stream.mjs\";\nimport { streamSessionFrames } from \"./frame-stream.mjs\";\nimport { HttpMethod, type HttpBodyIface } from \"./http.mjs\";\nimport { streamSessionLiveEvents, type SessionLiveEvent } from \"./live-stream.mjs\";\nimport type { RealtimeTransportFrameIface } from \"./realtime.mjs\";\n\n/** Answer a decision by option id (permission) or with a full ACP outcome. */\nexport type RespondArgs =\n | { decisionId: string; optionId: string }\n | { decisionId: string; outcome: DecisionOutcomeInput };\n\nexport interface StreamOptionsIface extends SignalOptionsIface {\n /** Inclusive; defaults to `FIRST_ACP_FRAME_SEQ` (the whole log). Earlier values are clamped. */\n fromSeq?: number;\n /** Keep streaming live frames after replay catches up; defaults to true. */\n follow?: boolean;\n}\n\nexport interface TurnResultIface<MessageId extends string | null = string> {\n messageId: MessageId;\n turnId: string;\n stopReason: string | null;\n /** Visible agent text of the turn. */\n text: string;\n /** Seq of the frame that ended the turn. */\n toSeq: number;\n}\n\n/** An accepted prompt. `stream()` yields this turn's frames; `result()` waits for its end. */\nexport interface TurnHandleIface<MessageId extends string | null = string> extends Omit<\n PromptAcceptedIface,\n 'messageId'\n> {\n messageId: MessageId;\n sessionId: string;\n get: (options?: SignalOptionsIface) => Promise<AgentTurnIface>;\n stream: (options?: SignalOptionsIface) => AsyncIterableIterator<AcpFrameEventIface>;\n result: (options?: SignalOptionsIface) => Promise<TurnResultIface<MessageId>>;\n}\n\nexport interface SendOptionsIface extends SignalOptionsIface {\n turnPolicy?: EnumInput<AgentTurnPolicy>;\n idempotencyKey?: string;\n meta?: JsonObjectIface;\n /** When the person submitted, for the prompt-to-inference trace; defaults to now. */\n clientSubmittedAtMs?: number;\n}\n\nexport interface ForkSessionOptionsIface extends SignalOptionsIface {\n /** Retain this key when retrying an interrupted fork. Defaults to a new key. */\n idempotencyKey?: string;\n title?: string;\n}\n\n/** An I/O-free handle on one session; every method is one HTTP call or one stream. */\nexport interface SessionHandleIface {\n id: string;\n /** Native fork of an idle source on its pinned revision; the standalone child has fresh scopes. */\n fork: (options?: ForkSessionOptionsIface) => Promise<CreatedSessionIface>;\n get: (options?: SignalOptionsIface) => Promise<AgentSessionIface>;\n /** Resolves a `final-attachment:` resource link from this session's frames. */\n attachment: (\n attachmentId: string,\n options?: SignalOptionsIface,\n ) => Promise<AttachmentDownloadIface>;\n send: (content: ContentInput, options?: SendOptionsIface) => Promise<TurnHandleIface>;\n /** Adds content to history without a model call (`_final/session/observe`). */\n observe: (\n content: ContentInput,\n options?: SignalOptionsIface & { idempotencyKey?: string; meta?: JsonObjectIface },\n ) => Promise<void>;\n stream: (options?: StreamOptionsIface) => AsyncIterableIterator<AcpFrameEventIface>;\n /** Full provisional frames and reset notices; never a durable replay cursor or receipt. */\n liveEvents: (options?: SignalOptionsIface) => AsyncIterableIterator<SessionLiveEvent>;\n /**\n * `acp.preview` events: the text of message and thought chunks as the session\n * publishes them, live only (never replayed), for surfaces that render text\n * ahead of the durable frames and the conversation's projected messages.\n */\n previews: (options?: SignalOptionsIface) => AsyncIterableIterator<AcpPreviewEventIface>;\n /** One replay page (`GET /sessions/:id/frames`). */\n frames: (\n options: SignalOptionsIface & { fromSeq: number; limit?: number },\n ) => Promise<SessionFramesPageIface>;\n /** The session's open decisions (`GET /sessions/:id/decisions`). */\n decisions: (options?: SignalOptionsIface) => Promise<DecisionRecordIface[]>;\n turn: (turnId: string, options?: SignalOptionsIface) => Promise<AgentTurnIface>;\n /** Reconstruct an accepted response from its durable turn id, without resending its prompt. */\n response: (\n turnId: string,\n options?: SignalOptionsIface,\n ) => Promise<TurnHandleIface<string | null>>;\n respond: (\n args: RespondArgs,\n options?: SignalOptionsIface,\n ) => Promise<RespondDecisionResponseIface>;\n cancel: (options?: SignalOptionsIface & { reason?: string }) => Promise<void>;\n /**\n * ACP `session/set_config_option` (model, reasoning, mode, ...): `configId` and a value\n * from the options the harness advertises (`get().configOptions`, `configSelectsOf`).\n * Changing them takes the session's owner, or a conversation owner or admin.\n */\n setConfigOption: (\n args: { configId: string; value: JsonValue },\n options?: SignalOptionsIface,\n ) => Promise<void>;\n close: (options?: SignalOptionsIface) => Promise<void>;\n /** Resolved manifest and resolver report; secret-bearing output requires agents:read and admin secret-binding access. */\n manifest: (options?: SignalOptionsIface) => Promise<SessionManifestIface>;\n}\n\nexport interface CreateSessionArgsIface extends SignalOptionsIface {\n /** Agent slug or id. */\n agent: string;\n /** Pin an author test session to a revision returned by definitions.testRevision. */\n revisionId?: string;\n message?: ContentInput;\n turnPolicy?: EnumInput<AgentTurnPolicy>;\n idempotencyKey?: string;\n title?: string;\n meta?: JsonObjectIface;\n /** When the person submitted `message`; defaults to now. */\n clientSubmittedAtMs?: number;\n}\n\nexport interface CreatedSessionIface {\n session: AgentSessionIface;\n handle: SessionHandleIface;\n /** The first turn when `message` was given. */\n response: TurnHandleIface | null;\n}\n\nexport interface SessionsApiIface {\n create: (args: CreateSessionArgsIface) => Promise<CreatedSessionIface>;\n fork: (sessionId: string, options?: ForkSessionOptionsIface) => Promise<CreatedSessionIface>;\n get: (sessionId: string, options?: SignalOptionsIface) => Promise<AgentSessionIface>;\n attach: (sessionId: string) => SessionHandleIface;\n}\n\nexport const outcomeOf = (args: RespondArgs): DecisionOutcomeInput =>\n 'optionId' in args ? { outcome: 'selected', optionId: args.optionId } : args.outcome;\n\nconst sessionPath = (sessionId: string, suffix = ''): string =>\n `/v1/sessions/${encodePath(sessionId)}${suffix}`;\n\ninterface TurnHandleArgsIface<MessageId extends string | null> {\n context: ClientContextIface;\n sessionId: string;\n accepted: Omit<PromptAcceptedIface, 'messageId'> & { messageId: MessageId };\n}\n\nconst turnHandle = <MessageId extends string | null>(\n args: TurnHandleArgsIface<MessageId>,\n): TurnHandleIface<MessageId> => {\n const { context, sessionId, accepted } = args;\n const get = (options?: SignalOptionsIface) =>\n getTurn({ context, sessionId, turnId: accepted.turnId, signal: options?.signal });\n const stream = (options?: SignalOptionsIface): AsyncIterableIterator<AcpFrameEventIface> => {\n // Without the prompt's seq, scan from the start for ACP's user message with this id.\n // `until` runs as frames are queued and `next` as they are consumed, so each tracks its own start.\n let queuedStart = accepted.messageId == null && accepted.fromSeq != null;\n let started = queuedStart;\n const frames = streamSessionFrames({\n sessionId,\n fromSeq: accepted.fromSeq ?? FIRST_ACP_FRAME_SEQ,\n follow: true,\n ...frameSources({ context, sessionId }),\n transport: context.realtime(),\n timing: context.timing,\n signal: options?.signal,\n closeSignal: context.closeSignal,\n terminal: async (signal) => {\n const receipt = await get({ signal });\n return receipt.endedAt == null ? null : { throughSeq: receipt.toSeq ?? 0 };\n },\n until: (event) => {\n if (\n !queuedStart &&\n accepted.messageId != null &&\n isUserMessageFor(event, accepted.messageId)\n )\n queuedStart = true;\n return queuedStart && turnEndOf(event) != null;\n },\n });\n const iterator: AsyncIterableIterator<AcpFrameEventIface> = {\n next: async () => {\n for (;;) {\n const next = await frames.next();\n if (next.done === true || started) return next;\n if (accepted.messageId != null && isUserMessageFor(next.value, accepted.messageId)) {\n started = true;\n return next;\n }\n }\n },\n return: () => frames.return?.() ?? Promise.resolve({ done: true, value: undefined }),\n [Symbol.asyncIterator]: () => iterator,\n };\n return iterator;\n };\n\n const result = async (options?: SignalOptionsIface): Promise<TurnResultIface<MessageId>> => {\n const text = createTextCollector();\n let last: AcpFrameEventIface | null = null;\n for await (const event of stream(options)) {\n text.add(event);\n last = event;\n }\n const end = last == null ? null : turnEndOf(last);\n const receipt = await get(options);\n return {\n messageId: accepted.messageId,\n turnId: accepted.turnId,\n stopReason: receipt.stopReason ?? end?.stopReason ?? null,\n text: text.text(),\n toSeq: receipt.toSeq ?? last?.seq ?? accepted.fromSeq ?? 0,\n };\n };\n\n return { ...accepted, sessionId, get, stream, result };\n};\n\nconst getTurn = (args: {\n context: ClientContextIface;\n sessionId: string;\n turnId: string;\n signal?: AbortSignal;\n}): Promise<AgentTurnIface> =>\n args.context.http.request({\n method: HttpMethod.Get,\n path: sessionPath(args.sessionId, `/turns/${encodePath(args.turnId)}`),\n response: turnSchema,\n signal: args.signal,\n });\n\ninterface ReplayArgsIface extends SignalOptionsIface {\n context: ClientContextIface;\n sessionId: string;\n fromSeq: number;\n limit?: number;\n}\n\nconst replay = (args: ReplayArgsIface): Promise<SessionFramesPageIface> =>\n args.context.http.request({\n method: HttpMethod.Get,\n path: sessionPath(args.sessionId, '/frames'),\n query: { fromSeq: args.fromSeq, limit: args.limit },\n response: sessionFramesPageSchema,\n signal: args.signal,\n });\n\nconst openDecisions = async (args: {\n context: ClientContextIface;\n sessionId: string;\n signal?: AbortSignal;\n}): Promise<DecisionRecordIface[]> =>\n (\n await args.context.http.request({\n method: HttpMethod.Get,\n path: sessionPath(args.sessionId, '/decisions'),\n response: decisionRecordListSchema,\n signal: args.signal,\n })\n ).decisions;\n\n/** The session's frames over Streamable HTTP (`GET /sessions/:id/frames/stream`), from `fromSeq`. */\nasync function* streamFramesOverHttp(args: {\n context: ClientContextIface;\n sessionId: string;\n fromSeq: number;\n signal: AbortSignal;\n}): AsyncGenerator<AcpFrameEventIface> {\n for await (const message of streamServerSentEvents({\n http: args.context.http,\n path: sessionPath(args.sessionId, '/frames/stream'),\n query: { fromSeq: args.fromSeq },\n signal: AbortSignal.any([args.signal, args.context.closeSignal]),\n })) {\n if (message.event !== AgentRealtimeKind.AcpFrame) continue;\n try {\n const event = acpFrameEventSchema.safeParse(JSON.parse(message.data));\n if (event.success) yield event.data;\n } catch {\n // A malformed event is skipped; replay fills any gap it leaves.\n }\n }\n}\n\n/** Live `acp.preview` events of the session topic. */\nconst streamPreviews = (args: {\n context: ClientContextIface;\n sessionId: string;\n signal?: AbortSignal;\n}): AsyncIterableIterator<AcpPreviewEventIface> => {\n const topic = agentRealtimeTopics.session(args.sessionId);\n let unsubscribe: (() => void) | null = null;\n let detachAbort: () => void = () => {};\n let detachClose: () => void = () => {};\n const queue = createAsyncQueue<AcpPreviewEventIface>(() => {\n unsubscribe?.();\n detachAbort();\n detachClose();\n });\n const onFrame = (raw: RealtimeTransportFrameIface): void => {\n const frame = agentRealtimeFrameSchema.safeParse(raw);\n if (!frame.success) return;\n if (frame.data.type === AgentRealtimeFrameType.Error && isTerminalRealtimeError(frame.data)) {\n queue.fail(\n realtimeSubscriptionError({\n topic: frame.data.topic ?? topic,\n code: frame.data.code ?? 'unknown',\n message: frame.data.message ?? 'Realtime subscription was refused',\n }),\n );\n return;\n }\n if (frame.data.type !== AgentRealtimeFrameType.Event) return;\n if (frame.data.kind !== AgentRealtimeKind.AcpPreview) return;\n const preview = acpPreviewEventSchema.safeParse(frame.data.payload);\n if (preview.success) queue.push(preview.data);\n };\n detachAbort = failOnAbort(queue, args.signal);\n detachClose = failOnAbort(queue, args.context.closeSignal);\n if (!queue.closed()) {\n const stop = args.context.realtime().subscribe(topic, onFrame);\n if (queue.closed()) stop();\n else unsubscribe = stop;\n }\n return queue.iterator;\n};\n\n/** Replay, open decisions and the Streamable HTTP fallback of one session's frame stream. */\nconst frameSources = (args: { context: ClientContextIface; sessionId: string }) => ({\n replay: (page: { fromSeq: number; limit: number; signal?: AbortSignal }) =>\n replay({ context: args.context, sessionId: args.sessionId, ...page }),\n decisions: (signal?: AbortSignal) => openDecisions({ ...args, signal }),\n httpStream: (stream: { fromSeq: number; signal: AbortSignal }) =>\n streamFramesOverHttp({ ...args, ...stream }),\n});\n\nexport const createSessionHandle = (\n context: ClientContextIface,\n sessionId: string,\n): SessionHandleIface => {\n const { http } = context;\n const post = async (args: {\n suffix: string;\n body?: HttpBodyIface;\n signal?: AbortSignal;\n }): Promise<void> => {\n await http.request({\n method: HttpMethod.Post,\n path: sessionPath(sessionId, args.suffix),\n body: args.body,\n response: okResponseSchema,\n signal: args.signal,\n context: { sessionId },\n });\n };\n\n return {\n id: sessionId,\n fork: async (options) => {\n const created = await http.request({\n method: HttpMethod.Post,\n path: sessionPath(sessionId, '/fork'),\n body: {\n schema: forkSessionRequestSchema,\n value: {\n idempotencyKey: options?.idempotencyKey ?? context.newKey(),\n title: options?.title,\n },\n },\n response: createSessionResponseSchema,\n signal: options?.signal,\n context: { sessionId },\n });\n return {\n session: created.session,\n handle: createSessionHandle(context, created.session.id),\n response: null,\n };\n },\n attachment: (attachmentId, options) =>\n http.request({\n method: HttpMethod.Get,\n path: sessionPath(sessionId, `/attachments/${encodePath(attachmentId)}`),\n response: attachmentDownloadSchema,\n signal: options?.signal,\n }),\n get: (options) =>\n http.request({\n method: HttpMethod.Get,\n path: sessionPath(sessionId),\n response: sessionSchema,\n signal: options?.signal,\n }),\n manifest: (options) =>\n http.request({\n method: HttpMethod.Get,\n path: sessionPath(sessionId, '/manifest'),\n response: sessionManifestSchema,\n signal: options?.signal,\n }),\n send: async (content, options) => {\n const accepted = await http.request({\n method: HttpMethod.Post,\n path: sessionPath(sessionId, '/prompt'),\n body: {\n schema: promptSessionRequestSchema,\n value: {\n content,\n turnPolicy: options?.turnPolicy,\n idempotencyKey: options?.idempotencyKey ?? context.newKey(),\n meta: options?.meta,\n clientSubmittedAtMs: options?.clientSubmittedAtMs ?? context.now(),\n },\n },\n response: promptAcceptedSchema,\n signal: options?.signal,\n context: { sessionId },\n });\n return turnHandle({ context, sessionId, accepted });\n },\n observe: (content, options) =>\n post({\n suffix: '/observe',\n body: {\n schema: observeSessionRequestSchema,\n value: {\n content,\n idempotencyKey: options?.idempotencyKey ?? context.newKey(),\n meta: options?.meta,\n },\n },\n signal: options?.signal,\n }),\n stream: (options) =>\n streamSessionFrames({\n sessionId,\n fromSeq: options?.fromSeq ?? FIRST_ACP_FRAME_SEQ,\n follow: options?.follow ?? true,\n ...frameSources({ context, sessionId }),\n transport: context.realtime(),\n timing: context.timing,\n signal: options?.signal,\n closeSignal: context.closeSignal,\n }),\n liveEvents: (options) =>\n streamSessionLiveEvents({ context, sessionId, signal: options?.signal }),\n previews: (options) => streamPreviews({ context, sessionId, signal: options?.signal }),\n frames: (options) => replay({ context, sessionId, ...options }),\n decisions: (options) => openDecisions({ context, sessionId, signal: options?.signal }),\n turn: (turnId, options) => getTurn({ context, sessionId, turnId, signal: options?.signal }),\n response: async (turnId, options) => {\n const receipt = await getTurn({ context, sessionId, turnId, signal: options?.signal });\n return turnHandle({\n context,\n sessionId,\n accepted: {\n turnId: receipt.id,\n messageId: receipt.promptMessageId,\n fromSeq: receipt.fromSeq,\n },\n });\n },\n respond: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: sessionPath(sessionId, '/respond'),\n body: {\n schema: respondDecisionSchema,\n value: { decisionId: args.decisionId, outcome: outcomeOf(args) },\n },\n response: respondDecisionResponseSchema,\n signal: options?.signal,\n context: { sessionId, decisionId: args.decisionId },\n }),\n cancel: (options) =>\n post({\n suffix: '/cancel',\n body: { schema: cancelRequestSchema, value: { reason: options?.reason } },\n signal: options?.signal,\n }),\n setConfigOption: (args, options) =>\n post({\n suffix: '/config-option',\n body: { schema: setConfigOptionRequestSchema, value: args },\n signal: options?.signal,\n }),\n close: (options) => post({ suffix: '/close', signal: options?.signal }),\n };\n};\n\nexport const createSessionsApi = (context: ClientContextIface): SessionsApiIface => ({\n create: async (args) => {\n const created = await context.http.request({\n method: HttpMethod.Post,\n path: '/v1/sessions',\n body: {\n schema: createSessionRequestSchema,\n value: {\n agent: args.agent,\n revisionId: args.revisionId,\n message: args.message,\n turnPolicy: args.turnPolicy,\n idempotencyKey:\n args.idempotencyKey ?? (args.message == null ? undefined : context.newKey()),\n title: args.title,\n meta: args.meta,\n clientSubmittedAtMs:\n args.message == null ? undefined : (args.clientSubmittedAtMs ?? context.now()),\n },\n },\n response: createSessionResponseSchema,\n signal: args.signal,\n });\n const handle = createSessionHandle(context, created.session.id);\n return {\n session: created.session,\n handle,\n response:\n created.turn == null\n ? null\n : turnHandle({ context, sessionId: created.session.id, accepted: created.turn }),\n };\n },\n fork: (sessionId, options) => createSessionHandle(context, sessionId).fork(options),\n get: (sessionId, options) => createSessionHandle(context, sessionId).get(options),\n attach: (sessionId) => createSessionHandle(context, sessionId),\n});\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -2,7 +2,7 @@
2
2
 
3
3
  `client.ts` exports separate operations so you choose which account mutations to run. Install `@finalai/agents` in a Node 26 project and import `connect`, `directSession`, `directConversation`, `groupConversation`, or `publish`. Create and publish Release Scout first; groups also require Deploy Bot. User participant IDs come from `client.people.all()`.
4
4
 
5
- Every function accepts an abort signal. Pending requests are reported for the caller to inspect: answer a permission with `conversation.respond({ pendingId, optionId })`, choosing an actual option from the pending request, or answer an elicitation with its ACP outcome. No example approves a request automatically. Use `conversation.cancel()` to stop every agent in a room; `client.close()` stops local subscriptions and releases owned realtime connections.
5
+ Every function accepts an abort signal. Decisions are reported for the caller to inspect: answer a permission with `conversation.respond({ decisionId, optionId })`, choosing an actual option from the decision, or answer an elicitation with its ACP outcome. No example approves a request automatically. Use `conversation.cancel()` to stop every agent in a room; `client.close()` stops local subscriptions and releases owned realtime connections.
6
6
 
7
7
  Definition publication compiles the repository ref and activates its definition schedules and channels. It is an explicit operation. Use `definitions.compile()` or `definitions.testRevision()` for an unpublished snapshot. `schedules.runNow({ agent: 'release-scout', key: 'daily-digest' })` triggers an existing schedule. `client.acp.connect({ agent: 'release-scout' })` opens a native ACP client connection.
8
8
 
@@ -17,7 +17,7 @@ export const directSession = async (client: AgentClientIface, signal?: AbortSign
17
17
  for await (const event of response.stream({ signal })) {
18
18
  const update = sessionUpdateOf(event);
19
19
  if (update?.sessionUpdate === 'agent_message_chunk') process.stdout.write(textOf(update));
20
- if (event.pendingId != null) console.log('Awaiting a decision:', event.pendingId);
20
+ if (event.decisionId != null) console.log('Awaiting a decision:', event.decisionId);
21
21
  }
22
22
  console.log((await response.result({ signal })).stopReason);
23
23
  await handle.observe('The release was moved to Friday.', { signal });
@@ -54,7 +54,7 @@ export const directConversation = async (client: AgentClientIface, signal?: Abor
54
54
  for await (const event of response.stream({ signal })) {
55
55
  const update = sessionUpdateOf(event);
56
56
  if (update?.sessionUpdate === 'agent_message_chunk') process.stdout.write(textOf(update));
57
- if (event.pendingId != null) console.log('Decision required:', event.pendingId);
57
+ if (event.decisionId != null) console.log('Decision required:', event.decisionId);
58
58
  }
59
59
  console.log((await response.result({ signal })).stopReason);
60
60
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@finalai/agents",
3
- "version": "0.4.3",
3
+ "version": "0.5.0",
4
4
  "private": false,
5
5
  "description": "Agent authoring, client APIs, and CLI.",
6
6
  "license": "Apache-2.0",
@@ -105,10 +105,10 @@
105
105
  },
106
106
  "dependencies": {
107
107
  "@agentclientprotocol/sdk": "1.8.0",
108
- "@finalai/agent-definition": "0.4.2",
109
- "@finalai/agent-protocol": "0.4.1",
110
- "@finalai/agent-provider": "0.4.2",
111
- "@finalai/final-agent-provider": "0.4.3",
108
+ "@finalai/agent-definition": "0.5.0",
109
+ "@finalai/agent-protocol": "0.5.0",
110
+ "@finalai/agent-provider": "0.5.0",
111
+ "@finalai/final-agent-provider": "0.5.0",
112
112
  "@finalai/websockets": "0.1.6",
113
113
  "ws": "^8.21.3",
114
114
  "zod": "4.6.5"