@opengeni/sdk 0.11.0 → 0.15.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.
- package/README.md +34 -12
- package/dist/index.d.ts +658 -83
- package/dist/index.js +1043 -304
- package/dist/index.js.map +1 -1
- package/package.json +9 -9
- package/src/client.ts +1367 -352
- package/src/errors.ts +20 -1
- package/src/index.ts +80 -6
- package/src/proxy.ts +1 -1
- package/src/sse.ts +11 -8
- package/src/stream.ts +9 -2
- package/src/types.ts +892 -102
- package/src/workspace-control-stream.ts +101 -0
package/src/errors.ts
CHANGED
|
@@ -11,6 +11,19 @@ export class OpenGeniApiError extends Error {
|
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
+
/** The browser bundle and API disagree about their state-changing wire contract. */
|
|
15
|
+
export class OpenGeniApiContractMismatchError extends Error {
|
|
16
|
+
readonly expected: string;
|
|
17
|
+
readonly actual: string;
|
|
18
|
+
|
|
19
|
+
constructor(expected: string, actual: string) {
|
|
20
|
+
super(`OpenGeni API contract mismatch: client expects ${expected}, API serves ${actual}`);
|
|
21
|
+
this.name = "OpenGeniApiContractMismatchError";
|
|
22
|
+
this.expected = expected;
|
|
23
|
+
this.actual = actual;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
14
27
|
/** Error for an unrecoverable event-stream condition (not a transient drop). */
|
|
15
28
|
export class OpenGeniStreamError extends Error {
|
|
16
29
|
constructor(message: string) {
|
|
@@ -34,7 +47,13 @@ export function isAbortError(error: unknown): boolean {
|
|
|
34
47
|
*/
|
|
35
48
|
export function isRetryableStreamError(error: unknown): boolean {
|
|
36
49
|
if (error instanceof OpenGeniApiError) {
|
|
37
|
-
return
|
|
50
|
+
return (
|
|
51
|
+
error.status === 408 ||
|
|
52
|
+
error.status === 409 ||
|
|
53
|
+
error.status === 425 ||
|
|
54
|
+
error.status === 429 ||
|
|
55
|
+
error.status >= 500
|
|
56
|
+
);
|
|
38
57
|
}
|
|
39
58
|
return error instanceof TypeError;
|
|
40
59
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
export { OpenGeniClient } from "./client";
|
|
2
|
-
export type {
|
|
3
|
-
|
|
2
|
+
export type {
|
|
3
|
+
FetchLike,
|
|
4
|
+
OpenGeniClientOptions,
|
|
5
|
+
SendMessageInput,
|
|
6
|
+
SteerMessageResult,
|
|
7
|
+
} from "./client";
|
|
8
|
+
export {
|
|
9
|
+
OpenGeniApiContractMismatchError,
|
|
10
|
+
OpenGeniApiError,
|
|
11
|
+
OpenGeniStreamError,
|
|
12
|
+
isRetryableStreamError,
|
|
13
|
+
} from "./errors";
|
|
4
14
|
export {
|
|
5
15
|
formatSseEvent,
|
|
6
16
|
proxySessionEventStream,
|
|
@@ -38,7 +48,15 @@ export type {
|
|
|
38
48
|
StreamConnectionState,
|
|
39
49
|
StreamSessionEventsOptions,
|
|
40
50
|
} from "./stream";
|
|
41
|
-
export {
|
|
51
|
+
export { streamWorkspaceControlEvents } from "./workspace-control-stream";
|
|
52
|
+
export type { WorkspaceControlStreamTransport } from "./workspace-control-stream";
|
|
53
|
+
export {
|
|
54
|
+
KNOWN_PERMISSIONS,
|
|
55
|
+
KNOWN_USAGE_EVENT_TYPES,
|
|
56
|
+
OPENGENI_API_CONTRACT_HEADER,
|
|
57
|
+
OPENGENI_API_CONTRACT_REVISION,
|
|
58
|
+
SESSION_EVENT_TYPES,
|
|
59
|
+
} from "./types";
|
|
42
60
|
export type {
|
|
43
61
|
AccessContext,
|
|
44
62
|
AccessGrant,
|
|
@@ -63,7 +81,7 @@ export type {
|
|
|
63
81
|
CapabilityPack,
|
|
64
82
|
CapabilityPackConnector,
|
|
65
83
|
CapabilityPackConnectorAuthModel,
|
|
66
|
-
|
|
84
|
+
CapabilityPackVariableSetSpec,
|
|
67
85
|
CapabilityPackKnowledge,
|
|
68
86
|
CapabilityPackScheduledTaskTemplate,
|
|
69
87
|
CapabilityPackSkill,
|
|
@@ -106,6 +124,7 @@ export type {
|
|
|
106
124
|
CreateKnowledgeMemoryRequest,
|
|
107
125
|
CreateScheduledTaskRequest,
|
|
108
126
|
CreateSessionRequest,
|
|
127
|
+
CreateVariableSetRequest,
|
|
109
128
|
CreateWorkspaceEnvironmentRequest,
|
|
110
129
|
CreateWorkspaceRequest,
|
|
111
130
|
DiscoverMcpCapabilitiesResponse,
|
|
@@ -141,6 +160,7 @@ export type {
|
|
|
141
160
|
KnowledgeMemoryStatus,
|
|
142
161
|
KnowledgeSourceKind,
|
|
143
162
|
KnowledgeSourceRef,
|
|
163
|
+
GitCredentialProvider,
|
|
144
164
|
ListApiKeysResponse,
|
|
145
165
|
ListConnectionsResponse,
|
|
146
166
|
ListPacksResponse,
|
|
@@ -179,6 +199,27 @@ export type {
|
|
|
179
199
|
ScheduledTaskTriggerType,
|
|
180
200
|
Session,
|
|
181
201
|
SessionCapabilities,
|
|
202
|
+
SessionListResponse,
|
|
203
|
+
SessionLineageResponse,
|
|
204
|
+
SessionQueueMutationResponse,
|
|
205
|
+
SessionQueueSnapshot,
|
|
206
|
+
SessionControlResponse,
|
|
207
|
+
ComposerDraft,
|
|
208
|
+
DeleteSessionQueueItemRequest,
|
|
209
|
+
EditSessionQueueItemRequest,
|
|
210
|
+
EffectiveControlBlocker,
|
|
211
|
+
EffectiveControlResumeOption,
|
|
212
|
+
EffectiveSessionControl,
|
|
213
|
+
MoveSessionQueueItemRequest,
|
|
214
|
+
SaveComposerDraftRequest,
|
|
215
|
+
SessionCommandReceipt,
|
|
216
|
+
SteerSessionQueueItemRequest,
|
|
217
|
+
WorkspaceInferenceControlResponse,
|
|
218
|
+
SessionSystemUpdate,
|
|
219
|
+
SessionSystemUpdateKind,
|
|
220
|
+
SessionSystemUpdateState,
|
|
221
|
+
SessionSummary,
|
|
222
|
+
LineageNode,
|
|
182
223
|
SessionMcpCredentialUpdateInput,
|
|
183
224
|
SessionMcpServerInput,
|
|
184
225
|
SessionMcpServerMetadata,
|
|
@@ -253,6 +294,17 @@ export type {
|
|
|
253
294
|
GitLogResponse,
|
|
254
295
|
GitShowRequest,
|
|
255
296
|
GitShowResponse,
|
|
297
|
+
SetWorkspaceEnvironmentVariableRequest,
|
|
298
|
+
WorkspaceCaptureFile,
|
|
299
|
+
WorkspaceCaptureRepo,
|
|
300
|
+
WorkspaceCaptureDegradedReason,
|
|
301
|
+
WorkspaceCaptureStats,
|
|
302
|
+
WorkspaceCaptureManifest,
|
|
303
|
+
WorkspaceRevisionCapturedPayload,
|
|
304
|
+
WorkspaceRevisionDegradedPayload,
|
|
305
|
+
WorkspaceCaptureSignedUrl,
|
|
306
|
+
GetWorkspaceCaptureResponse,
|
|
307
|
+
GetWorkspaceCaptureFileResponse,
|
|
256
308
|
TerminalExecRequest,
|
|
257
309
|
TerminalExecResponse,
|
|
258
310
|
PtyOpenRequest,
|
|
@@ -264,21 +316,43 @@ export type {
|
|
|
264
316
|
UpdateKnowledgeMemoryRequest,
|
|
265
317
|
UpdateScheduledTaskRequest,
|
|
266
318
|
UpdateSessionGoalRequest,
|
|
319
|
+
UpdateSessionPinRequest,
|
|
267
320
|
UpdateSessionRequest,
|
|
268
|
-
|
|
321
|
+
UpdateVariableSetRequest,
|
|
269
322
|
UpdateWorkspaceEnvironmentRequest,
|
|
270
323
|
UpdateWorkspaceMemberRequest,
|
|
271
324
|
UpdateWorkspaceRequest,
|
|
325
|
+
UpdateWorkspaceSettingsRequest,
|
|
272
326
|
UploadFileInput,
|
|
273
327
|
UsageEvent,
|
|
274
328
|
UsageEventType,
|
|
275
329
|
UserApprovalDecisionEventInput,
|
|
276
|
-
UserInterruptEventInput,
|
|
277
330
|
UserMessageEventInput,
|
|
278
331
|
Workspace,
|
|
332
|
+
WorkspaceControlEvent,
|
|
333
|
+
VariableSet,
|
|
334
|
+
VariableSetVariableMetadata,
|
|
335
|
+
Rig,
|
|
336
|
+
RigVersion,
|
|
337
|
+
RigCheck,
|
|
338
|
+
RigChange,
|
|
339
|
+
RigChangeKind,
|
|
340
|
+
RigChangeStatus,
|
|
341
|
+
RigCheckResult,
|
|
342
|
+
RigChangeVerification,
|
|
343
|
+
CreateRigRequest,
|
|
344
|
+
UpdateRigRequest,
|
|
345
|
+
RigSetupAppendPayload,
|
|
346
|
+
RigDefinitionEditPayload,
|
|
347
|
+
ProposeRigChangeRequest,
|
|
279
348
|
WorkspaceEnvironment,
|
|
280
349
|
WorkspaceEnvironmentVariableMetadata,
|
|
281
350
|
WorkspaceMember,
|
|
351
|
+
WorkspaceMemorySearchMode,
|
|
352
|
+
WorkspaceMemorySearchRequest,
|
|
353
|
+
WorkspaceMemorySearchResult,
|
|
354
|
+
WorkspaceMemorySearchResponse,
|
|
355
|
+
WorkspaceSettings,
|
|
282
356
|
WorkspaceRegisteredPack,
|
|
283
357
|
// Bring-your-own-compute: Machines dashboard + per-machine metrics (M10).
|
|
284
358
|
MetricSample,
|
package/src/proxy.ts
CHANGED
|
@@ -158,7 +158,7 @@ export function proxySessionEventStream(
|
|
|
158
158
|
} else {
|
|
159
159
|
signal?.addEventListener("abort", () => upstream.abort(), { once: true });
|
|
160
160
|
}
|
|
161
|
-
const resolvedAfter = after instanceof Request ? resumeSequenceFromRequest(after) : after ?? 0;
|
|
161
|
+
const resolvedAfter = after instanceof Request ? resumeSequenceFromRequest(after) : (after ?? 0);
|
|
162
162
|
const events = client.streamEvents(workspaceId, sessionId, {
|
|
163
163
|
...streamOptions,
|
|
164
164
|
after: resolvedAfter,
|
package/src/sse.ts
CHANGED
|
@@ -12,7 +12,9 @@ export type SseMessage = {
|
|
|
12
12
|
data: string;
|
|
13
13
|
};
|
|
14
14
|
|
|
15
|
-
export async function* parseSseStream(
|
|
15
|
+
export async function* parseSseStream(
|
|
16
|
+
stream: ReadableStream<Uint8Array>,
|
|
17
|
+
): AsyncGenerator<SseMessage, void, void> {
|
|
16
18
|
const reader = stream.getReader();
|
|
17
19
|
const decoder = new TextDecoder();
|
|
18
20
|
let buffer = "";
|
|
@@ -21,13 +23,14 @@ export async function* parseSseStream(stream: ReadableStream<Uint8Array>): Async
|
|
|
21
23
|
let dataLines: string[] | null = null;
|
|
22
24
|
|
|
23
25
|
const dispatch = (): SseMessage | null => {
|
|
24
|
-
const message =
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
26
|
+
const message =
|
|
27
|
+
dataLines === null
|
|
28
|
+
? null
|
|
29
|
+
: {
|
|
30
|
+
...(id !== undefined ? { id } : {}),
|
|
31
|
+
...(event !== undefined ? { event } : {}),
|
|
32
|
+
data: dataLines.join("\n"),
|
|
33
|
+
};
|
|
31
34
|
id = undefined;
|
|
32
35
|
event = undefined;
|
|
33
36
|
dataLines = null;
|
package/src/stream.ts
CHANGED
|
@@ -8,7 +8,10 @@ import type { SessionEvent } from "./types";
|
|
|
8
8
|
*/
|
|
9
9
|
export type SessionEventStreamTransport = {
|
|
10
10
|
/** Open the SSE stream, replaying durable events after `after` first. */
|
|
11
|
-
openStream: (
|
|
11
|
+
openStream: (
|
|
12
|
+
after: number,
|
|
13
|
+
signal: AbortSignal | undefined,
|
|
14
|
+
) => Promise<ReadableStream<Uint8Array>>;
|
|
12
15
|
/** Replay durable events by sequence (`GET .../events?after=&limit=`). */
|
|
13
16
|
listEvents: (after: number, limit: number) => Promise<SessionEvent[]>;
|
|
14
17
|
};
|
|
@@ -31,6 +34,8 @@ export type StreamSessionEventsOptions = {
|
|
|
31
34
|
* reconnects = N+1 total open-stream calls). Defaults to unlimited.
|
|
32
35
|
*/
|
|
33
36
|
maxReconnectAttempts?: number;
|
|
37
|
+
/** Await authoritative client reconciliation before exposing `live`. */
|
|
38
|
+
beforeLive?: (() => void | Promise<void>) | undefined;
|
|
34
39
|
onStateChange?: (state: StreamConnectionState) => void;
|
|
35
40
|
};
|
|
36
41
|
|
|
@@ -63,7 +68,8 @@ export async function* streamSessionEvents(
|
|
|
63
68
|
let delayMs = baseDelayMs;
|
|
64
69
|
let everConnected = false;
|
|
65
70
|
|
|
66
|
-
while (
|
|
71
|
+
while (true) {
|
|
72
|
+
if (signal?.aborted) break;
|
|
67
73
|
options.onStateChange?.(everConnected || failedAttempts > 0 ? "reconnecting" : "connecting");
|
|
68
74
|
const cursorAtOpen = cursor;
|
|
69
75
|
try {
|
|
@@ -71,6 +77,7 @@ export async function* streamSessionEvents(
|
|
|
71
77
|
everConnected = true;
|
|
72
78
|
failedAttempts = 0;
|
|
73
79
|
delayMs = baseDelayMs;
|
|
80
|
+
await options.beforeLive?.();
|
|
74
81
|
options.onStateChange?.("live");
|
|
75
82
|
for await (const message of parseSseStream(body)) {
|
|
76
83
|
// Re-check after every yield resumption: an abort from the consumer
|