@opengeni/sdk 0.29.0 → 0.32.1

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/dist/index.js CHANGED
@@ -350,6 +350,7 @@ var SESSION_EVENT_TYPES = [
350
350
  "session.requiresAction",
351
351
  "session.humanInput.requested",
352
352
  "session.context.compaction.requested",
353
+ "session.context.compaction.started",
353
354
  "session.context.compacted",
354
355
  "session.context.compaction.skipped",
355
356
  "session.context.cleared",
@@ -544,6 +545,51 @@ var OpenGeniClient = class {
544
545
  this.fetchImpl = options.fetch ?? ((input, init) => fetch(input, init));
545
546
  }
546
547
  // --- Session lifecycle ---------------------------------------------------
548
+ /** Upload one ephemeral browser recording. This method never retries. */
549
+ async transcribeAudio(workspaceId, input) {
550
+ const correlationId = crypto.randomUUID();
551
+ const form = new FormData();
552
+ const filename = filenameForAudioMimeType(input.mimeType);
553
+ const audio = input.audio instanceof File ? input.audio : input.audio instanceof Uint8Array ? new File([Uint8Array.from(input.audio)], filename, { type: input.mimeType }) : new File([input.audio], filename, { type: input.mimeType || input.audio.type });
554
+ form.append("audio", audio, filename);
555
+ form.append("mimeType", input.mimeType);
556
+ if (input.durationSeconds !== void 0) {
557
+ form.append("durationSeconds", String(input.durationSeconds));
558
+ }
559
+ let response;
560
+ try {
561
+ response = await this.fetchImpl(this.url(`/v1/workspaces/${workspaceId}/transcriptions`), {
562
+ method: "POST",
563
+ headers: { ...this.headers(correlationId), Accept: "application/json" },
564
+ body: form,
565
+ ...input.signal ? { signal: input.signal } : {}
566
+ });
567
+ } catch (error) {
568
+ if (input.signal?.aborted) throw error;
569
+ throw mutationTransportError(correlationId);
570
+ }
571
+ assertApiContractResponse(response);
572
+ if (!response.ok) throw await apiErrorFromResponse(response, { method: "POST", correlationId });
573
+ await assertJsonResponse(response, { method: "POST", correlationId });
574
+ let body;
575
+ try {
576
+ body = await response.json();
577
+ } catch {
578
+ throw new OpenGeniApiError(response.status, "Invalid transcription response.", {
579
+ code: "invalid_response",
580
+ mutation: true,
581
+ correlationId
582
+ });
583
+ }
584
+ if (!isTranscribeAudioResponse(body)) {
585
+ throw new OpenGeniApiError(response.status, "Invalid transcription response.", {
586
+ code: "invalid_response",
587
+ mutation: true,
588
+ correlationId
589
+ });
590
+ }
591
+ return body;
592
+ }
547
593
  async createSession(workspaceId, request) {
548
594
  return await this.requestJson(
549
595
  "POST",
@@ -672,10 +718,16 @@ var OpenGeniClient = class {
672
718
  `/v1/workspaces/${workspaceId}/sessions/${sessionId}/turns`,
673
719
  void 0,
674
720
  {
675
- ...options.limit !== void 0 ? { limit: String(options.limit) } : {}
721
+ ...options.limit !== void 0 ? { limit: String(options.limit) } : {},
722
+ ...options.latestStarted ? { latestStarted: "1" } : {}
676
723
  }
677
724
  );
678
725
  }
726
+ /** Newest turn that durably emitted `turn.started`, or null before any admission. */
727
+ async getLatestStartedTurn(workspaceId, sessionId) {
728
+ const turns = await this.listTurns(workspaceId, sessionId, { latestStarted: true });
729
+ return turns[0] ?? null;
730
+ }
679
731
  // --- Bring-your-own-compute: Machines dashboard + metrics (M10) ------------
680
732
  /**
681
733
  * List the workspace's machines (the Machines dashboard). Each enrolled
@@ -1437,6 +1489,13 @@ var OpenGeniClient = class {
1437
1489
  async getWorkspace(workspaceId) {
1438
1490
  return await this.requestJson("GET", `/v1/workspaces/${workspaceId}`);
1439
1491
  }
1492
+ /** Read-time, secret-safe inventory of policy heads and visible workspace knowledge. */
1493
+ async getWorkspaceState(workspaceId) {
1494
+ return await this.requestJson(
1495
+ "GET",
1496
+ `/v1/workspaces/${workspaceId}/workspace-state`
1497
+ );
1498
+ }
1440
1499
  async updateWorkspace(workspaceId, request) {
1441
1500
  return await this.requestJson("PATCH", `/v1/workspaces/${workspaceId}`, request);
1442
1501
  }
@@ -1501,6 +1560,85 @@ var OpenGeniClient = class {
1501
1560
  request
1502
1561
  );
1503
1562
  }
1563
+ async listPreferenceRegistry(workspaceId, options = {}) {
1564
+ const params = new URLSearchParams();
1565
+ if (options.scope) params.set("scope", options.scope);
1566
+ if (options.status) params.set("status", options.status);
1567
+ if (options.limit !== void 0) params.set("limit", String(options.limit));
1568
+ const query = params.toString();
1569
+ return await this.requestJson(
1570
+ "GET",
1571
+ `/v1/workspaces/${workspaceId}/preferences${query ? `?${query}` : ""}`
1572
+ );
1573
+ }
1574
+ async getPreferenceRegistry(workspaceId, preferenceId) {
1575
+ return await this.requestJson(
1576
+ "GET",
1577
+ `/v1/workspaces/${workspaceId}/preferences/${encodeURIComponent(preferenceId)}`
1578
+ );
1579
+ }
1580
+ async createPreferenceRegistryProposal(workspaceId, request) {
1581
+ return await this.requestJson(
1582
+ "POST",
1583
+ `/v1/workspaces/${workspaceId}/preferences/proposals`,
1584
+ request
1585
+ );
1586
+ }
1587
+ async activatePreferenceRegistryRevision(workspaceId, preferenceId, request) {
1588
+ return await this.requestJson(
1589
+ "POST",
1590
+ `/v1/workspaces/${workspaceId}/preferences/${encodeURIComponent(preferenceId)}/activate`,
1591
+ request
1592
+ );
1593
+ }
1594
+ async correctPreferenceRegistry(workspaceId, preferenceId, request) {
1595
+ return await this.requestJson(
1596
+ "POST",
1597
+ `/v1/workspaces/${workspaceId}/preferences/${encodeURIComponent(preferenceId)}/correct`,
1598
+ request
1599
+ );
1600
+ }
1601
+ async changePreferenceRegistryScope(workspaceId, preferenceId, request) {
1602
+ return await this.requestJson(
1603
+ "POST",
1604
+ `/v1/workspaces/${workspaceId}/preferences/${encodeURIComponent(preferenceId)}/scope`,
1605
+ request
1606
+ );
1607
+ }
1608
+ async deactivatePreferenceRegistry(workspaceId, preferenceId, request) {
1609
+ return await this.requestJson(
1610
+ "POST",
1611
+ `/v1/workspaces/${workspaceId}/preferences/${encodeURIComponent(preferenceId)}/deactivate`,
1612
+ request
1613
+ );
1614
+ }
1615
+ async supersedePreferenceRegistry(workspaceId, preferenceId, request) {
1616
+ return await this.requestJson(
1617
+ "POST",
1618
+ `/v1/workspaces/${workspaceId}/preferences/${encodeURIComponent(preferenceId)}/supersede`,
1619
+ request
1620
+ );
1621
+ }
1622
+ async rejectPreferenceRegistryProposal(workspaceId, preferenceId, request) {
1623
+ return await this.requestJson(
1624
+ "POST",
1625
+ `/v1/workspaces/${workspaceId}/preferences/${encodeURIComponent(preferenceId)}/reject`,
1626
+ request
1627
+ );
1628
+ }
1629
+ async getPreferenceRegistrySummary(workspaceId) {
1630
+ return await this.requestJson(
1631
+ "GET",
1632
+ `/v1/workspaces/${workspaceId}/preferences/summary`
1633
+ );
1634
+ }
1635
+ async getPreferenceRegistryFullContent(workspaceId, retrievalHandle) {
1636
+ return await this.requestJson(
1637
+ "POST",
1638
+ `/v1/workspaces/${workspaceId}/preferences/full-content`,
1639
+ { retrievalHandle }
1640
+ );
1641
+ }
1504
1642
  /**
1505
1643
  * Delete a workspace and everything in it. Refused (409) for the account's
1506
1644
  * only workspace and while it still has a running session. Irreversible.
@@ -2153,11 +2291,13 @@ var OpenGeniClient = class {
2153
2291
  return response.connection;
2154
2292
  }
2155
2293
  /** Start an OAuth connection flow; redirect the user to the returned `authorizationUrl`. */
2156
- async startConnectionOAuth(workspaceId, request) {
2294
+ async startConnectionOAuth(workspaceId, request, options = {}) {
2157
2295
  return await this.requestJson(
2158
2296
  "POST",
2159
2297
  `/v1/workspaces/${workspaceId}/connections/oauth/start`,
2160
- request
2298
+ request,
2299
+ {},
2300
+ options
2161
2301
  );
2162
2302
  }
2163
2303
  /** Public, immutably-cached URL for a catalog item's logo, or null when the item has none. */
@@ -2236,6 +2376,18 @@ var OpenGeniClient = class {
2236
2376
  ...options.workspaceId !== void 0 ? { workspaceId: options.workspaceId } : {}
2237
2377
  });
2238
2378
  }
2379
+ async getWorkspaceInsights(workspaceId, options = {}) {
2380
+ return await this.requestJson(
2381
+ "GET",
2382
+ `/v1/workspaces/${workspaceId}/insights`,
2383
+ void 0,
2384
+ {
2385
+ range: options.range ?? "week",
2386
+ ...options.provider !== void 0 ? { provider: options.provider } : {},
2387
+ ...options.model !== void 0 ? { model: options.model } : {}
2388
+ }
2389
+ );
2390
+ }
2239
2391
  async getBillingEntitlements(options = {}) {
2240
2392
  return await this.requestJson(
2241
2393
  "GET",
@@ -2438,6 +2590,30 @@ function assertApiContractResponse(response) {
2438
2590
  throw new OpenGeniApiContractMismatchError(OPENGENI_API_CONTRACT_REVISION, actual);
2439
2591
  }
2440
2592
  }
2593
+ function isTranscribeAudioResponse(value) {
2594
+ if (!value || typeof value !== "object" || Array.isArray(value)) return false;
2595
+ const record = value;
2596
+ return typeof record.text === "string" && Array.isArray(record.languages) && record.languages.every((language) => typeof language === "string");
2597
+ }
2598
+ function filenameForAudioMimeType(mimeType) {
2599
+ const bare = mimeType.trim().toLowerCase().split(";")[0] ?? "audio/webm";
2600
+ switch (bare) {
2601
+ case "audio/mp4":
2602
+ case "audio/m4a":
2603
+ return "audio.mp4";
2604
+ case "audio/ogg":
2605
+ return "audio.ogg";
2606
+ case "audio/mpeg":
2607
+ case "audio/mp3":
2608
+ return "audio.mp3";
2609
+ case "audio/wav":
2610
+ case "audio/x-wav":
2611
+ return "audio.wav";
2612
+ case "audio/webm":
2613
+ default:
2614
+ return "audio.webm";
2615
+ }
2616
+ }
2441
2617
  var API_ERROR_MAX_BYTES = 16 * 1024;
2442
2618
  async function apiErrorFromResponse(response, context) {
2443
2619
  return new OpenGeniApiError(response.status, await readBoundedJsonErrorBody(response), {
@@ -2853,6 +3029,11 @@ function normalizeWorkspaceInstructionPolicyRoleKey(value) {
2853
3029
  return value.normalize("NFKC").trim().toLowerCase().replace(/\s+/gu, "-").replace(/-+/g, "-");
2854
3030
  }
2855
3031
 
3032
+ // src/preference-registry.ts
3033
+ function normalizePreferenceRegistryStableKey(value) {
3034
+ return value.normalize("NFKC").trim().toLowerCase().replace(/\s+/gu, "-").replace(/-+/g, "-");
3035
+ }
3036
+
2856
3037
  // src/transcription.ts
2857
3038
  var DEFAULT_WORKSPACE_TRANSCRIPTION_POLICY = {
2858
3039
  enabled: false,
@@ -2866,6 +3047,15 @@ var DEFAULT_WORKSPACE_TRANSCRIPTION_POLICY = {
2866
3047
  fallback: { mode: "disabled", targets: [] },
2867
3048
  cost: { currency: "USD", maxPerHour: null, maxPerMonth: null }
2868
3049
  };
3050
+ function resolveWorkspaceVoiceInputEnabled(settings) {
3051
+ if (!isRecord(settings)) return null;
3052
+ const voiceInput = settings.voiceInput;
3053
+ if (isRecord(voiceInput) && typeof voiceInput.enabled === "boolean") {
3054
+ return voiceInput.enabled;
3055
+ }
3056
+ const legacy = settings.transcription;
3057
+ return isRecord(legacy) && typeof legacy.enabled === "boolean" ? legacy.enabled : null;
3058
+ }
2869
3059
  function resolveWorkspaceTranscriptionPolicy(settings) {
2870
3060
  if (!isRecord(settings)) return cloneDefaultPolicy();
2871
3061
  const candidate = settings.transcription;
@@ -3091,10 +3281,12 @@ export {
3091
3281
  isRetryableStreamError,
3092
3282
  nextDesktopState,
3093
3283
  normalizeMcpOutput,
3284
+ normalizePreferenceRegistryStableKey,
3094
3285
  normalizeWorkspaceInstructionPolicyRoleKey,
3095
3286
  parseSseStream,
3096
3287
  proxySessionEventStream,
3097
3288
  resolveWorkspaceTranscriptionPolicy,
3289
+ resolveWorkspaceVoiceInputEnabled,
3098
3290
  resumeSequenceFromRequest,
3099
3291
  sessionEventsToSseResponse,
3100
3292
  sessionEventsToSseStream,