@finalai/agents 0.8.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.

Potentially problematic release.


This version of @finalai/agents might be problematic. Click here for more details.

Files changed (153) hide show
  1. package/README.md +30 -0
  2. package/dist/modules/agent-client/acp-frames.d.mts +19 -0
  3. package/dist/modules/agent-client/acp-frames.mjs +49 -0
  4. package/dist/modules/agent-client/acp-frames.mjs.map +7 -0
  5. package/dist/modules/agent-client/acp.d.mts +43 -0
  6. package/dist/modules/agent-client/acp.mjs +76 -0
  7. package/dist/modules/agent-client/acp.mjs.map +7 -0
  8. package/dist/modules/agent-client/async-queue.d.mts +10 -0
  9. package/dist/modules/agent-client/async-queue.mjs +66 -0
  10. package/dist/modules/agent-client/async-queue.mjs.map +7 -0
  11. package/dist/modules/agent-client/build.d.mts +107 -0
  12. package/dist/modules/agent-client/build.mjs +222 -0
  13. package/dist/modules/agent-client/build.mjs.map +7 -0
  14. package/dist/modules/agent-client/client.d.mts +111 -0
  15. package/dist/modules/agent-client/client.mjs +198 -0
  16. package/dist/modules/agent-client/client.mjs.map +7 -0
  17. package/dist/modules/agent-client/collection-events.d.mts +35 -0
  18. package/dist/modules/agent-client/collection-events.mjs +142 -0
  19. package/dist/modules/agent-client/collection-events.mjs.map +7 -0
  20. package/dist/modules/agent-client/config-options.d.mts +24 -0
  21. package/dist/modules/agent-client/config-options.mjs +49 -0
  22. package/dist/modules/agent-client/config-options.mjs.map +7 -0
  23. package/dist/modules/agent-client/context.d.mts +31 -0
  24. package/dist/modules/agent-client/context.mjs +11 -0
  25. package/dist/modules/agent-client/context.mjs.map +7 -0
  26. package/dist/modules/agent-client/conversations.d.mts +385 -0
  27. package/dist/modules/agent-client/conversations.mjs +1156 -0
  28. package/dist/modules/agent-client/conversations.mjs.map +7 -0
  29. package/dist/modules/agent-client/errors.d.mts +85 -0
  30. package/dist/modules/agent-client/errors.mjs +94 -0
  31. package/dist/modules/agent-client/errors.mjs.map +7 -0
  32. package/dist/modules/agent-client/event-stream.d.mts +14 -0
  33. package/dist/modules/agent-client/event-stream.mjs +89 -0
  34. package/dist/modules/agent-client/event-stream.mjs.map +7 -0
  35. package/dist/modules/agent-client/frame-stream.d.mts +51 -0
  36. package/dist/modules/agent-client/frame-stream.mjs +333 -0
  37. package/dist/modules/agent-client/frame-stream.mjs.map +7 -0
  38. package/dist/modules/agent-client/http.d.mts +68 -0
  39. package/dist/modules/agent-client/http.mjs +168 -0
  40. package/dist/modules/agent-client/http.mjs.map +7 -0
  41. package/dist/modules/agent-client/index.d.mts +17 -0
  42. package/dist/modules/agent-client/index.mjs +86 -0
  43. package/dist/modules/agent-client/index.mjs.map +7 -0
  44. package/dist/modules/agent-client/live-stream.d.mts +18 -0
  45. package/dist/modules/agent-client/live-stream.mjs +94 -0
  46. package/dist/modules/agent-client/live-stream.mjs.map +7 -0
  47. package/dist/modules/agent-client/realtime.d.mts +72 -0
  48. package/dist/modules/agent-client/realtime.mjs +186 -0
  49. package/dist/modules/agent-client/realtime.mjs.map +7 -0
  50. package/dist/modules/agent-client/sandbox-uri.d.mts +19 -0
  51. package/dist/modules/agent-client/sandbox-uri.mjs +43 -0
  52. package/dist/modules/agent-client/sandbox-uri.mjs.map +7 -0
  53. package/dist/modules/agent-client/sessions.d.mts +124 -0
  54. package/dist/modules/agent-client/sessions.mjs +350 -0
  55. package/dist/modules/agent-client/sessions.mjs.map +7 -0
  56. package/dist/modules/agent-client/test-fakes.d.mts +40 -0
  57. package/dist/modules/agent-client/test-fakes.mjs +94 -0
  58. package/dist/modules/agent-client/test-fakes.mjs.map +7 -0
  59. package/dist/modules/authoring/approval.d.mts +1 -0
  60. package/dist/modules/authoring/approval.mjs +2 -0
  61. package/dist/modules/authoring/approval.mjs.map +7 -0
  62. package/dist/modules/authoring/channels.d.mts +1 -0
  63. package/dist/modules/authoring/channels.mjs +2 -0
  64. package/dist/modules/authoring/channels.mjs.map +7 -0
  65. package/dist/modules/authoring/final-channel.d.mts +1 -0
  66. package/dist/modules/authoring/final-channel.mjs +2 -0
  67. package/dist/modules/authoring/final-channel.mjs.map +7 -0
  68. package/dist/modules/authoring/hooks.d.mts +1 -0
  69. package/dist/modules/authoring/hooks.mjs +2 -0
  70. package/dist/modules/authoring/hooks.mjs.map +7 -0
  71. package/dist/modules/authoring/index.d.mts +1 -0
  72. package/dist/modules/authoring/index.mjs +2 -0
  73. package/dist/modules/authoring/index.mjs.map +7 -0
  74. package/dist/modules/authoring/instructions.d.mts +1 -0
  75. package/dist/modules/authoring/instructions.mjs +2 -0
  76. package/dist/modules/authoring/instructions.mjs.map +7 -0
  77. package/dist/modules/authoring/providers.d.mts +2 -0
  78. package/dist/modules/authoring/providers.mjs +1 -0
  79. package/dist/modules/authoring/providers.mjs.map +7 -0
  80. package/dist/modules/authoring/tools.d.mts +1 -0
  81. package/dist/modules/authoring/tools.mjs +2 -0
  82. package/dist/modules/authoring/tools.mjs.map +7 -0
  83. package/dist/modules/cli/build.d.mts +22 -0
  84. package/dist/modules/cli/build.mjs +77 -0
  85. package/dist/modules/cli/build.mjs.map +7 -0
  86. package/dist/modules/cli/channel-socket.d.mts +9 -0
  87. package/dist/modules/cli/channel-socket.mjs +114 -0
  88. package/dist/modules/cli/channel-socket.mjs.map +7 -0
  89. package/dist/modules/cli/cli.d.mts +16 -0
  90. package/dist/modules/cli/cli.mjs +151 -0
  91. package/dist/modules/cli/cli.mjs.map +7 -0
  92. package/dist/modules/cli/conformance.d.mts +36 -0
  93. package/dist/modules/cli/conformance.mjs +220 -0
  94. package/dist/modules/cli/conformance.mjs.map +7 -0
  95. package/dist/modules/cli/dev.d.mts +24 -0
  96. package/dist/modules/cli/dev.mjs +263 -0
  97. package/dist/modules/cli/dev.mjs.map +7 -0
  98. package/dist/modules/cli/files.d.mts +18 -0
  99. package/dist/modules/cli/files.mjs +66 -0
  100. package/dist/modules/cli/files.mjs.map +7 -0
  101. package/dist/modules/cli/harness-descriptions.d.mts +20 -0
  102. package/dist/modules/cli/harness-descriptions.mjs +70 -0
  103. package/dist/modules/cli/harness-descriptions.mjs.map +7 -0
  104. package/dist/modules/cli/main.d.mts +2 -0
  105. package/dist/modules/cli/main.mjs +20 -0
  106. package/dist/modules/cli/main.mjs.map +7 -0
  107. package/dist/modules/cli/output.d.mts +14 -0
  108. package/dist/modules/cli/output.mjs +94 -0
  109. package/dist/modules/cli/output.mjs.map +7 -0
  110. package/dist/modules/cli/publish.d.mts +14 -0
  111. package/dist/modules/cli/publish.mjs +89 -0
  112. package/dist/modules/cli/publish.mjs.map +7 -0
  113. package/dist/modules/compile.d.mts +3 -0
  114. package/dist/modules/compile.mjs +62 -0
  115. package/dist/modules/compile.mjs.map +7 -0
  116. package/dist/modules/harnesses.d.mts +1 -0
  117. package/dist/modules/harnesses.mjs +2 -0
  118. package/dist/modules/harnesses.mjs.map +7 -0
  119. package/dist/modules/index.browser.d.mts +4 -0
  120. package/dist/modules/index.browser.mjs +8 -0
  121. package/dist/modules/index.browser.mjs.map +7 -0
  122. package/dist/modules/index.d.mts +3 -0
  123. package/dist/modules/index.mjs +6 -0
  124. package/dist/modules/index.mjs.map +7 -0
  125. package/dist/modules/models.d.mts +1 -0
  126. package/dist/modules/models.mjs +2 -0
  127. package/dist/modules/models.mjs.map +7 -0
  128. package/dist/modules/public.d.mts +6 -0
  129. package/dist/modules/public.mjs +68 -0
  130. package/dist/modules/public.mjs.map +7 -0
  131. package/dist/modules/sandboxes.d.mts +1 -0
  132. package/dist/modules/sandboxes.mjs +2 -0
  133. package/dist/modules/sandboxes.mjs.map +7 -0
  134. package/examples/custom-harness/README.md +16 -0
  135. package/examples/custom-harness/agent.ts +154 -0
  136. package/examples/custom-sandbox/README.md +12 -0
  137. package/examples/custom-sandbox/agent.ts +14 -0
  138. package/examples/custom-sandbox/sandbox.ts +22 -0
  139. package/examples/release-scout/README.md +11 -0
  140. package/examples/release-scout/agent/agent.ts +22 -0
  141. package/examples/release-scout/agent/channels/github-signature.ts +27 -0
  142. package/examples/release-scout/agent/channels/github.ts +38 -0
  143. package/examples/release-scout/agent/connections/linear.ts +9 -0
  144. package/examples/release-scout/agent/hooks/audit.ts +24 -0
  145. package/examples/release-scout/agent/instructions/org-context.ts +26 -0
  146. package/examples/release-scout/agent/instructions.md +2 -0
  147. package/examples/release-scout/agent/sandbox.ts +20 -0
  148. package/examples/release-scout/agent/schedules/daily-digest.md +7 -0
  149. package/examples/release-scout/agent/skills/triage/SKILL.md +8 -0
  150. package/examples/release-scout/agent/skills/triage/checklist.md +3 -0
  151. package/examples/release-scout/agent/tools/lookup_release_notes.ts +24 -0
  152. package/examples/release-scout/client.ts +123 -0
  153. package/package.json +126 -0
@@ -0,0 +1,124 @@
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';
3
+ import { type ClientContextIface, type EnumInput, type SignalOptionsIface } from "./context.mjs";
4
+ import { type SessionLiveEvent } from "./live-stream.mjs";
5
+ /** Answer a pending request by option id (permission) or with a full ACP outcome. */
6
+ export type RespondArgs = {
7
+ pendingId: string;
8
+ optionId: string;
9
+ } | {
10
+ pendingId: string;
11
+ outcome: PendingOutcomeInput;
12
+ };
13
+ export interface StreamOptionsIface extends SignalOptionsIface {
14
+ /** Inclusive; defaults to `FIRST_ACP_FRAME_SEQ` (the whole log). Earlier values are clamped. */
15
+ fromSeq?: number;
16
+ /** Keep streaming live frames after replay catches up; defaults to true. */
17
+ follow?: boolean;
18
+ }
19
+ export interface TurnResultIface<MessageId extends string | null = string> {
20
+ messageId: MessageId;
21
+ turnId: string;
22
+ stopReason: string | null;
23
+ /** Visible agent text of the turn. */
24
+ text: string;
25
+ /** Seq of the frame that ended the turn. */
26
+ toSeq: number;
27
+ }
28
+ /** An accepted prompt. `stream()` yields this turn's frames; `result()` waits for its end. */
29
+ export interface TurnHandleIface<MessageId extends string | null = string> extends Omit<PromptAcceptedIface, 'messageId'> {
30
+ messageId: MessageId;
31
+ sessionId: string;
32
+ get: (options?: SignalOptionsIface) => Promise<AgentTurnIface>;
33
+ stream: (options?: SignalOptionsIface) => AsyncIterableIterator<AcpFrameEventIface>;
34
+ result: (options?: SignalOptionsIface) => Promise<TurnResultIface<MessageId>>;
35
+ }
36
+ export interface SendOptionsIface extends SignalOptionsIface {
37
+ turnPolicy?: EnumInput<AgentTurnPolicy>;
38
+ idempotencyKey?: string;
39
+ meta?: JsonObjectIface;
40
+ /** When the person submitted, for the prompt-to-inference trace; defaults to now. */
41
+ clientSubmittedAtMs?: number;
42
+ }
43
+ export interface ForkSessionOptionsIface extends SignalOptionsIface {
44
+ /** Retain this key when retrying an interrupted fork. Defaults to a new key. */
45
+ idempotencyKey?: string;
46
+ title?: string;
47
+ }
48
+ /** An I/O-free handle on one session; every method is one HTTP call or one stream. */
49
+ export interface SessionHandleIface {
50
+ id: string;
51
+ /** Native fork of an idle source on its pinned revision; the standalone child has fresh scopes. */
52
+ fork: (options?: ForkSessionOptionsIface) => Promise<CreatedSessionIface>;
53
+ get: (options?: SignalOptionsIface) => Promise<AgentSessionIface>;
54
+ /** Resolves a `final-attachment:` resource link from this session's frames. */
55
+ attachment: (attachmentId: string, options?: SignalOptionsIface) => Promise<AttachmentDownloadIface>;
56
+ send: (content: ContentInput, options?: SendOptionsIface) => Promise<TurnHandleIface>;
57
+ /** Adds content to history without a model call (`_final/session/observe`). */
58
+ observe: (content: ContentInput, options?: SignalOptionsIface & {
59
+ idempotencyKey?: string;
60
+ meta?: JsonObjectIface;
61
+ }) => Promise<void>;
62
+ stream: (options?: StreamOptionsIface) => AsyncIterableIterator<AcpFrameEventIface>;
63
+ /** Full provisional frames and reset notices; never a durable replay cursor or receipt. */
64
+ liveEvents: (options?: SignalOptionsIface) => AsyncIterableIterator<SessionLiveEvent>;
65
+ /**
66
+ * `acp.preview` events: the text of message and thought chunks as the session
67
+ * publishes them, live only (never replayed), for surfaces that render text
68
+ * ahead of the durable frames and the conversation's projected messages.
69
+ */
70
+ previews: (options?: SignalOptionsIface) => AsyncIterableIterator<AcpPreviewEventIface>;
71
+ /** One replay page (`GET /sessions/:id/frames`). */
72
+ frames: (options: SignalOptionsIface & {
73
+ fromSeq: number;
74
+ limit?: number;
75
+ }) => Promise<SessionFramesPageIface>;
76
+ pending: (options?: SignalOptionsIface) => Promise<PendingRequestIface[]>;
77
+ turn: (turnId: string, options?: SignalOptionsIface) => Promise<AgentTurnIface>;
78
+ /** Reconstruct an accepted response from its durable turn id, without resending its prompt. */
79
+ response: (turnId: string, options?: SignalOptionsIface) => Promise<TurnHandleIface<string | null>>;
80
+ respond: (args: RespondArgs, options?: SignalOptionsIface) => Promise<RespondPendingResponseIface>;
81
+ cancel: (options?: SignalOptionsIface & {
82
+ reason?: string;
83
+ }) => Promise<void>;
84
+ /**
85
+ * ACP `session/set_config_option` (model, reasoning, mode, ...): `configId` and a value
86
+ * from the options the harness advertises (`get().configOptions`, `configSelectsOf`).
87
+ * Changing them takes the session's owner, or a conversation owner or admin.
88
+ */
89
+ setConfigOption: (args: {
90
+ configId: string;
91
+ value: JsonValue;
92
+ }, options?: SignalOptionsIface) => Promise<void>;
93
+ close: (options?: SignalOptionsIface) => Promise<void>;
94
+ /** Resolved manifest and resolver report; secret-bearing output requires agents:read and admin secret-binding access. */
95
+ manifest: (options?: SignalOptionsIface) => Promise<SessionManifestIface>;
96
+ }
97
+ export interface CreateSessionArgsIface extends SignalOptionsIface {
98
+ /** Agent slug or id. */
99
+ agent: string;
100
+ /** Pin an author test session to a revision returned by definitions.testRevision. */
101
+ revisionId?: string;
102
+ message?: ContentInput;
103
+ turnPolicy?: EnumInput<AgentTurnPolicy>;
104
+ idempotencyKey?: string;
105
+ title?: string;
106
+ meta?: JsonObjectIface;
107
+ /** When the person submitted `message`; defaults to now. */
108
+ clientSubmittedAtMs?: number;
109
+ }
110
+ export interface CreatedSessionIface {
111
+ session: AgentSessionIface;
112
+ handle: SessionHandleIface;
113
+ /** The first turn when `message` was given. */
114
+ response: TurnHandleIface | null;
115
+ }
116
+ export interface SessionsApiIface {
117
+ create: (args: CreateSessionArgsIface) => Promise<CreatedSessionIface>;
118
+ fork: (sessionId: string, options?: ForkSessionOptionsIface) => Promise<CreatedSessionIface>;
119
+ get: (sessionId: string, options?: SignalOptionsIface) => Promise<AgentSessionIface>;
120
+ attach: (sessionId: string) => SessionHandleIface;
121
+ }
122
+ export declare const outcomeOf: (args: RespondArgs) => PendingOutcomeInput;
123
+ export declare const createSessionHandle: (context: ClientContextIface, sessionId: string) => SessionHandleIface;
124
+ export declare const createSessionsApi: (context: ClientContextIface) => SessionsApiIface;
@@ -0,0 +1,350 @@
1
+ import {
2
+ acpFrameEventSchema,
3
+ acpPreviewEventSchema,
4
+ agentRealtimeFrameSchema,
5
+ AgentRealtimeFrameType,
6
+ AgentRealtimeKind,
7
+ agentRealtimeTopics,
8
+ attachmentDownloadSchema,
9
+ cancelRequestSchema,
10
+ createSessionRequestSchema,
11
+ createSessionResponseSchema,
12
+ FIRST_ACP_FRAME_SEQ,
13
+ forkSessionRequestSchema,
14
+ observeSessionRequestSchema,
15
+ okResponseSchema,
16
+ pendingRequestListSchema,
17
+ promptAcceptedSchema,
18
+ promptSessionRequestSchema,
19
+ respondPendingRequestSchema,
20
+ respondPendingResponseSchema,
21
+ sessionFramesPageSchema,
22
+ sessionManifestSchema,
23
+ sessionSchema,
24
+ setConfigOptionRequestSchema,
25
+ turnSchema
26
+ } from "@finalai/agent-protocol/agent-platform";
27
+ import { createTextCollector, isUserMessageFor, turnEndOf } from "./acp-frames.mjs";
28
+ import { createAsyncQueue, failOnAbort } from "./async-queue.mjs";
29
+ import {
30
+ encodePath
31
+ } from "./context.mjs";
32
+ import { isTerminalRealtimeError, realtimeSubscriptionError } from "./errors.mjs";
33
+ import { streamServerSentEvents } from "./event-stream.mjs";
34
+ import { streamSessionFrames } from "./frame-stream.mjs";
35
+ import { HttpMethod } from "./http.mjs";
36
+ import { streamSessionLiveEvents } from "./live-stream.mjs";
37
+ const outcomeOf = (args) => "optionId" in args ? { outcome: "selected", optionId: args.optionId } : args.outcome;
38
+ const sessionPath = (sessionId, suffix = "") => `/v1/sessions/${encodePath(sessionId)}${suffix}`;
39
+ const turnHandle = (args) => {
40
+ const { context, sessionId, accepted } = args;
41
+ const get = (options) => getTurn({ context, sessionId, turnId: accepted.turnId, signal: options?.signal });
42
+ const stream = (options) => {
43
+ let queuedStart = accepted.messageId == null && accepted.fromSeq != null;
44
+ let started = queuedStart;
45
+ const frames = streamSessionFrames({
46
+ sessionId,
47
+ fromSeq: accepted.fromSeq ?? FIRST_ACP_FRAME_SEQ,
48
+ follow: true,
49
+ ...frameSources({ context, sessionId }),
50
+ transport: context.realtime(),
51
+ timing: context.timing,
52
+ signal: options?.signal,
53
+ closeSignal: context.closeSignal,
54
+ terminal: async (signal) => {
55
+ const receipt = await get({ signal });
56
+ return receipt.endedAt == null ? null : { throughSeq: receipt.toSeq ?? 0 };
57
+ },
58
+ until: (event) => {
59
+ if (!queuedStart && accepted.messageId != null && isUserMessageFor(event, accepted.messageId))
60
+ queuedStart = true;
61
+ return queuedStart && turnEndOf(event) != null;
62
+ }
63
+ });
64
+ const iterator = {
65
+ next: async () => {
66
+ for (; ; ) {
67
+ const next = await frames.next();
68
+ if (next.done === true || started) return next;
69
+ if (accepted.messageId != null && isUserMessageFor(next.value, accepted.messageId)) {
70
+ started = true;
71
+ return next;
72
+ }
73
+ }
74
+ },
75
+ return: () => frames.return?.() ?? Promise.resolve({ done: true, value: void 0 }),
76
+ [Symbol.asyncIterator]: () => iterator
77
+ };
78
+ return iterator;
79
+ };
80
+ const result = async (options) => {
81
+ const text = createTextCollector();
82
+ let last = null;
83
+ for await (const event of stream(options)) {
84
+ text.add(event);
85
+ last = event;
86
+ }
87
+ const end = last == null ? null : turnEndOf(last);
88
+ const receipt = await get(options);
89
+ return {
90
+ messageId: accepted.messageId,
91
+ turnId: accepted.turnId,
92
+ stopReason: receipt.stopReason ?? end?.stopReason ?? null,
93
+ text: text.text(),
94
+ toSeq: receipt.toSeq ?? last?.seq ?? accepted.fromSeq ?? 0
95
+ };
96
+ };
97
+ return { ...accepted, sessionId, get, stream, result };
98
+ };
99
+ const getTurn = (args) => args.context.http.request({
100
+ method: HttpMethod.Get,
101
+ path: sessionPath(args.sessionId, `/turns/${encodePath(args.turnId)}`),
102
+ response: turnSchema,
103
+ signal: args.signal
104
+ });
105
+ const replay = (args) => args.context.http.request({
106
+ method: HttpMethod.Get,
107
+ path: sessionPath(args.sessionId, "/frames"),
108
+ query: { fromSeq: args.fromSeq, limit: args.limit },
109
+ response: sessionFramesPageSchema,
110
+ signal: args.signal
111
+ });
112
+ const openPending = async (args) => (await args.context.http.request({
113
+ method: HttpMethod.Get,
114
+ path: sessionPath(args.sessionId, "/pending"),
115
+ response: pendingRequestListSchema,
116
+ signal: args.signal
117
+ })).pending;
118
+ async function* streamFramesOverHttp(args) {
119
+ for await (const message of streamServerSentEvents({
120
+ http: args.context.http,
121
+ path: sessionPath(args.sessionId, "/frames/stream"),
122
+ query: { fromSeq: args.fromSeq },
123
+ signal: AbortSignal.any([args.signal, args.context.closeSignal])
124
+ })) {
125
+ if (message.event !== AgentRealtimeKind.AcpFrame) continue;
126
+ try {
127
+ const event = acpFrameEventSchema.safeParse(JSON.parse(message.data));
128
+ if (event.success) yield event.data;
129
+ } catch {
130
+ }
131
+ }
132
+ }
133
+ const streamPreviews = (args) => {
134
+ const topic = agentRealtimeTopics.session(args.sessionId);
135
+ let unsubscribe = null;
136
+ let detachAbort = () => {
137
+ };
138
+ let detachClose = () => {
139
+ };
140
+ const queue = createAsyncQueue(() => {
141
+ unsubscribe?.();
142
+ detachAbort();
143
+ detachClose();
144
+ });
145
+ const onFrame = (raw) => {
146
+ const frame = agentRealtimeFrameSchema.safeParse(raw);
147
+ if (!frame.success) return;
148
+ if (frame.data.type === AgentRealtimeFrameType.Error && isTerminalRealtimeError(frame.data)) {
149
+ queue.fail(
150
+ realtimeSubscriptionError({
151
+ topic: frame.data.topic ?? topic,
152
+ code: frame.data.code ?? "unknown",
153
+ message: frame.data.message ?? "Realtime subscription was refused"
154
+ })
155
+ );
156
+ return;
157
+ }
158
+ if (frame.data.type !== AgentRealtimeFrameType.Event) return;
159
+ if (frame.data.kind !== AgentRealtimeKind.AcpPreview) return;
160
+ const preview = acpPreviewEventSchema.safeParse(frame.data.payload);
161
+ if (preview.success) queue.push(preview.data);
162
+ };
163
+ detachAbort = failOnAbort(queue, args.signal);
164
+ detachClose = failOnAbort(queue, args.context.closeSignal);
165
+ if (!queue.closed()) {
166
+ const stop = args.context.realtime().subscribe(topic, onFrame);
167
+ if (queue.closed()) stop();
168
+ else unsubscribe = stop;
169
+ }
170
+ return queue.iterator;
171
+ };
172
+ const frameSources = (args) => ({
173
+ replay: (page) => replay({ context: args.context, sessionId: args.sessionId, ...page }),
174
+ pending: (signal) => openPending({ ...args, signal }),
175
+ httpStream: (stream) => streamFramesOverHttp({ ...args, ...stream })
176
+ });
177
+ const createSessionHandle = (context, sessionId) => {
178
+ const { http } = context;
179
+ const post = async (args) => {
180
+ await http.request({
181
+ method: HttpMethod.Post,
182
+ path: sessionPath(sessionId, args.suffix),
183
+ body: args.body,
184
+ response: okResponseSchema,
185
+ signal: args.signal,
186
+ context: { sessionId }
187
+ });
188
+ };
189
+ return {
190
+ id: sessionId,
191
+ fork: async (options) => {
192
+ const created = await http.request({
193
+ method: HttpMethod.Post,
194
+ path: sessionPath(sessionId, "/fork"),
195
+ body: {
196
+ schema: forkSessionRequestSchema,
197
+ value: {
198
+ idempotencyKey: options?.idempotencyKey ?? context.newKey(),
199
+ title: options?.title
200
+ }
201
+ },
202
+ response: createSessionResponseSchema,
203
+ signal: options?.signal,
204
+ context: { sessionId }
205
+ });
206
+ return {
207
+ session: created.session,
208
+ handle: createSessionHandle(context, created.session.id),
209
+ response: null
210
+ };
211
+ },
212
+ attachment: (attachmentId, options) => http.request({
213
+ method: HttpMethod.Get,
214
+ path: sessionPath(sessionId, `/attachments/${encodePath(attachmentId)}`),
215
+ response: attachmentDownloadSchema,
216
+ signal: options?.signal
217
+ }),
218
+ get: (options) => http.request({
219
+ method: HttpMethod.Get,
220
+ path: sessionPath(sessionId),
221
+ response: sessionSchema,
222
+ signal: options?.signal
223
+ }),
224
+ manifest: (options) => http.request({
225
+ method: HttpMethod.Get,
226
+ path: sessionPath(sessionId, "/manifest"),
227
+ response: sessionManifestSchema,
228
+ signal: options?.signal
229
+ }),
230
+ send: async (content, options) => {
231
+ const accepted = await http.request({
232
+ method: HttpMethod.Post,
233
+ path: sessionPath(sessionId, "/prompt"),
234
+ body: {
235
+ schema: promptSessionRequestSchema,
236
+ value: {
237
+ content,
238
+ turnPolicy: options?.turnPolicy,
239
+ idempotencyKey: options?.idempotencyKey ?? context.newKey(),
240
+ meta: options?.meta,
241
+ clientSubmittedAtMs: options?.clientSubmittedAtMs ?? context.now()
242
+ }
243
+ },
244
+ response: promptAcceptedSchema,
245
+ signal: options?.signal,
246
+ context: { sessionId }
247
+ });
248
+ return turnHandle({ context, sessionId, accepted });
249
+ },
250
+ observe: (content, options) => post({
251
+ suffix: "/observe",
252
+ body: {
253
+ schema: observeSessionRequestSchema,
254
+ value: {
255
+ content,
256
+ idempotencyKey: options?.idempotencyKey ?? context.newKey(),
257
+ meta: options?.meta
258
+ }
259
+ },
260
+ signal: options?.signal
261
+ }),
262
+ stream: (options) => streamSessionFrames({
263
+ sessionId,
264
+ fromSeq: options?.fromSeq ?? FIRST_ACP_FRAME_SEQ,
265
+ follow: options?.follow ?? true,
266
+ ...frameSources({ context, sessionId }),
267
+ transport: context.realtime(),
268
+ timing: context.timing,
269
+ signal: options?.signal,
270
+ closeSignal: context.closeSignal
271
+ }),
272
+ liveEvents: (options) => streamSessionLiveEvents({ context, sessionId, signal: options?.signal }),
273
+ previews: (options) => streamPreviews({ context, sessionId, signal: options?.signal }),
274
+ frames: (options) => replay({ context, sessionId, ...options }),
275
+ pending: (options) => openPending({ context, sessionId, signal: options?.signal }),
276
+ turn: (turnId, options) => getTurn({ context, sessionId, turnId, signal: options?.signal }),
277
+ response: async (turnId, options) => {
278
+ const receipt = await getTurn({ context, sessionId, turnId, signal: options?.signal });
279
+ return turnHandle({
280
+ context,
281
+ sessionId,
282
+ accepted: {
283
+ turnId: receipt.id,
284
+ messageId: receipt.promptMessageId,
285
+ fromSeq: receipt.fromSeq
286
+ }
287
+ });
288
+ },
289
+ respond: (args, options) => http.request({
290
+ method: HttpMethod.Post,
291
+ path: sessionPath(sessionId, "/respond"),
292
+ body: {
293
+ schema: respondPendingRequestSchema,
294
+ value: { pendingId: args.pendingId, outcome: outcomeOf(args) }
295
+ },
296
+ response: respondPendingResponseSchema,
297
+ signal: options?.signal,
298
+ context: { sessionId, pendingId: args.pendingId }
299
+ }),
300
+ cancel: (options) => post({
301
+ suffix: "/cancel",
302
+ body: { schema: cancelRequestSchema, value: { reason: options?.reason } },
303
+ signal: options?.signal
304
+ }),
305
+ setConfigOption: (args, options) => post({
306
+ suffix: "/config-option",
307
+ body: { schema: setConfigOptionRequestSchema, value: args },
308
+ signal: options?.signal
309
+ }),
310
+ close: (options) => post({ suffix: "/close", signal: options?.signal })
311
+ };
312
+ };
313
+ const createSessionsApi = (context) => ({
314
+ create: async (args) => {
315
+ const created = await context.http.request({
316
+ method: HttpMethod.Post,
317
+ path: "/v1/sessions",
318
+ body: {
319
+ schema: createSessionRequestSchema,
320
+ value: {
321
+ agent: args.agent,
322
+ revisionId: args.revisionId,
323
+ message: args.message,
324
+ turnPolicy: args.turnPolicy,
325
+ idempotencyKey: args.idempotencyKey ?? (args.message == null ? void 0 : context.newKey()),
326
+ title: args.title,
327
+ meta: args.meta,
328
+ clientSubmittedAtMs: args.message == null ? void 0 : args.clientSubmittedAtMs ?? context.now()
329
+ }
330
+ },
331
+ response: createSessionResponseSchema,
332
+ signal: args.signal
333
+ });
334
+ const handle = createSessionHandle(context, created.session.id);
335
+ return {
336
+ session: created.session,
337
+ handle,
338
+ response: created.turn == null ? null : turnHandle({ context, sessionId: created.session.id, accepted: created.turn })
339
+ };
340
+ },
341
+ fork: (sessionId, options) => createSessionHandle(context, sessionId).fork(options),
342
+ get: (sessionId, options) => createSessionHandle(context, sessionId).get(options),
343
+ attach: (sessionId) => createSessionHandle(context, sessionId)
344
+ });
345
+ export {
346
+ createSessionHandle,
347
+ createSessionsApi,
348
+ outcomeOf
349
+ };
350
+ //# sourceMappingURL=sessions.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 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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",
6
+ "names": []
7
+ }
@@ -0,0 +1,40 @@
1
+ import type { JsonValue } from '@finalai/agent-protocol';
2
+ import type { FetchIface } from "./http.mjs";
3
+ import type { RealtimeTransportFrameIface, RealtimeTransportIface } from "./realtime.mjs";
4
+ export interface RecordedRequestIface {
5
+ method: string;
6
+ path: string;
7
+ query: URLSearchParams;
8
+ headers: Record<string, string>;
9
+ credentials: RequestCredentials | undefined;
10
+ body: JsonValue | null;
11
+ }
12
+ export interface FakeResponseIface {
13
+ status?: number;
14
+ json?: JsonValue;
15
+ text?: string;
16
+ }
17
+ export type FakeRoute = (request: RecordedRequestIface) => FakeResponseIface;
18
+ export declare const createFakeFetch: (routes: Record<string, FakeRoute>) => {
19
+ fetch: FetchIface;
20
+ requests: RecordedRequestIface[];
21
+ };
22
+ export declare const createFakeTransport: () => {
23
+ transport: RealtimeTransportIface;
24
+ emit: (topic: string, frame: RealtimeTransportFrameIface) => void;
25
+ subscriptions: string[];
26
+ listenerCount: (topic: string) => number;
27
+ };
28
+ export declare const eventFrame: (args: {
29
+ topic: string;
30
+ kind: string;
31
+ payload: JsonValue;
32
+ }) => RealtimeTransportFrameIface;
33
+ export declare const sessionUpdateFrame: (args: {
34
+ seq: number;
35
+ update: JsonValue;
36
+ direction?: string;
37
+ }) => JsonValue;
38
+ export declare const promptFrame: (seq: number) => JsonValue;
39
+ /** Lets pending promise callbacks (replay fetches) run. */
40
+ export declare const flush: () => Promise<void>;