@opengeni/sdk 0.48.0 → 0.57.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 (122) hide show
  1. package/README.md +147 -1
  2. package/dist/artifact-client.d.ts +20 -2
  3. package/dist/artifacts.d.ts +4 -0
  4. package/dist/artifacts.js +11 -0
  5. package/dist/artifacts.js.map +1 -0
  6. package/dist/{chunk-V5F253OG.js → chunk-GU6JF75T.js} +6 -3
  7. package/dist/chunk-GU6JF75T.js.map +1 -0
  8. package/dist/chunk-HJ3HHUT5.js +222 -0
  9. package/dist/chunk-HJ3HHUT5.js.map +1 -0
  10. package/dist/{chunk-KIHGPM7H.js → chunk-JDLDDRNE.js} +20 -14
  11. package/dist/chunk-JDLDDRNE.js.map +1 -0
  12. package/dist/chunk-JRPFWI6T.js +128 -0
  13. package/dist/chunk-JRPFWI6T.js.map +1 -0
  14. package/dist/{chunk-MBGBLVUV.js → chunk-PKQ377ED.js} +1725 -555
  15. package/dist/chunk-PKQ377ED.js.map +1 -0
  16. package/dist/chunk-ST5DDKJP.js +987 -0
  17. package/dist/chunk-ST5DDKJP.js.map +1 -0
  18. package/dist/chunk-VWE2QIVO.js +1162 -0
  19. package/dist/chunk-VWE2QIVO.js.map +1 -0
  20. package/dist/chunk-VYCTL62C.js +230 -0
  21. package/dist/chunk-VYCTL62C.js.map +1 -0
  22. package/dist/{chunk-DXDL7EEW.js → chunk-YKZME56C.js} +197 -113
  23. package/dist/chunk-YKZME56C.js.map +1 -0
  24. package/dist/client.d.ts +240 -16
  25. package/dist/codex-realtime-controller.d.ts +9 -6
  26. package/dist/codex-realtime-controller.js +2 -2
  27. package/dist/codex-realtime-lifecycle.d.ts +1 -1
  28. package/dist/codex-realtime-v3.d.ts +3 -3
  29. package/dist/codex-realtime.d.ts +1 -1
  30. package/dist/company-profile.d.ts +100 -0
  31. package/dist/core.d.ts +5 -5
  32. package/dist/core.js +10 -5
  33. package/dist/desktop.d.ts +9 -1
  34. package/dist/editable-artifact-resources.d.ts +96 -0
  35. package/dist/editable-artifacts/browser-session.d.ts +35 -0
  36. package/dist/editable-artifacts/controller.d.ts +60 -0
  37. package/dist/editable-artifacts/errors.d.ts +23 -0
  38. package/dist/editable-artifacts/http-live-transport.d.ts +46 -0
  39. package/dist/editable-artifacts/index.d.ts +19 -0
  40. package/dist/editable-artifacts/pool.d.ts +15 -0
  41. package/dist/editable-artifacts/session.d.ts +96 -0
  42. package/dist/editable-artifacts/storage.d.ts +72 -0
  43. package/dist/editable-artifacts/types.d.ts +416 -0
  44. package/dist/editable-artifacts/worker/browser-client.d.ts +80 -0
  45. package/dist/editable-artifacts/worker/browser-entry.d.ts +6 -0
  46. package/dist/editable-artifacts/worker/kernel-adapter.d.ts +45 -0
  47. package/dist/editable-artifacts/worker/rpc-protocol.d.ts +92 -0
  48. package/dist/editable-artifacts/worker/runtime.d.ts +66 -0
  49. package/dist/editable-artifacts/worker/wire-codec.d.ts +52 -0
  50. package/dist/editable-artifacts-worker.d.ts +8 -0
  51. package/dist/editable-artifacts-worker.js +1708 -0
  52. package/dist/editable-artifacts-worker.js.map +1 -0
  53. package/dist/editable-artifacts.d.ts +6 -0
  54. package/dist/editable-artifacts.js +5954 -0
  55. package/dist/editable-artifacts.js.map +1 -0
  56. package/dist/gateway-realtime-transport.d.ts +2 -1
  57. package/dist/gateway-realtime-transport.js +5 -3
  58. package/dist/index.d.ts +45 -35
  59. package/dist/index.js +134 -64
  60. package/dist/index.js.map +1 -1
  61. package/dist/interaction-revision-stream.d.ts +11 -0
  62. package/dist/interaction.d.ts +1484 -0
  63. package/dist/interaction.js +81 -0
  64. package/dist/interaction.js.map +1 -0
  65. package/dist/memory-slack-client.d.ts +13 -0
  66. package/dist/memory-slack-delivery.d.ts +99 -0
  67. package/dist/memory-slack.d.ts +4 -0
  68. package/dist/memory-slack.js +44 -0
  69. package/dist/memory-slack.js.map +1 -0
  70. package/dist/proxy.d.ts +3 -3
  71. package/dist/realtime.d.ts +14 -14
  72. package/dist/realtime.js +11 -7
  73. package/dist/realtime.js.map +1 -1
  74. package/dist/retained-artifacts.d.ts +12 -0
  75. package/dist/stream.d.ts +1 -1
  76. package/dist/terminal.d.ts +1 -1
  77. package/dist/types.d.ts +1347 -34
  78. package/dist/workspace-control-stream.d.ts +2 -2
  79. package/dist/workspace-live-stream.d.ts +14 -0
  80. package/dist/workspace-state.d.ts +1 -1
  81. package/package.json +29 -3
  82. package/src/artifact-client.ts +129 -0
  83. package/src/artifacts.ts +17 -0
  84. package/src/client.ts +3022 -910
  85. package/src/codex-realtime-controller.ts +25 -7
  86. package/src/codex-realtime-lifecycle.ts +1 -0
  87. package/src/company-profile.ts +92 -0
  88. package/src/desktop.ts +11 -1
  89. package/src/editable-artifact-resources.ts +119 -0
  90. package/src/editable-artifacts/browser-session.ts +176 -0
  91. package/src/editable-artifacts/controller.ts +2632 -0
  92. package/src/editable-artifacts/errors.ts +52 -0
  93. package/src/editable-artifacts/http-live-transport.ts +1449 -0
  94. package/src/editable-artifacts/index.ts +175 -0
  95. package/src/editable-artifacts/pool.ts +81 -0
  96. package/src/editable-artifacts/session.ts +778 -0
  97. package/src/editable-artifacts/storage.ts +1718 -0
  98. package/src/editable-artifacts/types.ts +499 -0
  99. package/src/editable-artifacts/worker/browser-client.ts +1167 -0
  100. package/src/editable-artifacts/worker/browser-entry.ts +57 -0
  101. package/src/editable-artifacts/worker/kernel-adapter.ts +1039 -0
  102. package/src/editable-artifacts/worker/rpc-protocol.ts +622 -0
  103. package/src/editable-artifacts/worker/runtime.ts +1204 -0
  104. package/src/editable-artifacts/worker/wire-codec.ts +852 -0
  105. package/src/editable-artifacts-worker.ts +8 -0
  106. package/src/editable-artifacts.ts +6 -0
  107. package/src/errors.ts +16 -2
  108. package/src/gateway-realtime-transport.ts +252 -109
  109. package/src/index.ts +215 -1
  110. package/src/interaction-revision-stream.ts +117 -0
  111. package/src/interaction.ts +2874 -0
  112. package/src/memory-slack-client.ts +71 -0
  113. package/src/memory-slack-delivery.ts +128 -0
  114. package/src/memory-slack.ts +19 -0
  115. package/src/realtime.ts +14 -4
  116. package/src/retained-artifacts.ts +326 -0
  117. package/src/types.ts +1636 -52
  118. package/src/workspace-live-stream.ts +137 -0
  119. package/dist/chunk-DXDL7EEW.js.map +0 -1
  120. package/dist/chunk-KIHGPM7H.js.map +0 -1
  121. package/dist/chunk-MBGBLVUV.js.map +0 -1
  122. package/dist/chunk-V5F253OG.js.map +0 -1
package/README.md CHANGED
@@ -87,6 +87,112 @@ through a tenant-scoped, same-origin proxy. The SDK does not move persistence,
87
87
  prompt construction, context processing, delegation, or provider credentials
88
88
  out of `apps/api`, `apps/worker`, or `packages/db`.
89
89
 
90
+ ## Editable artifact sync (`@opengeni/sdk/editable-artifacts`)
91
+
92
+ Editable-artifact storage, sync, and Worker clients live behind an isolated
93
+ subpath; importing the ordinary SDK never loads them. Browser hosts should
94
+ bundle the dedicated module-Worker entry and pass its URL plus the exact,
95
+ version-matched kernel assets to the client:
96
+
97
+ ```ts
98
+ import { OpenGeniClient } from "@opengeni/sdk/artifacts";
99
+ import workerUrl from "@opengeni/sdk/editable-artifacts/worker?worker&url";
100
+ import {
101
+ createBrowserEditableArtifactSession,
102
+ } from "@opengeni/sdk/editable-artifacts";
103
+
104
+ const client = new OpenGeniClient({ baseUrl: "https://api.example.com" });
105
+ const artifact = await client.getEditableArtifact(workspaceId, artifactId, {
106
+ replicaId,
107
+ });
108
+ const kernels = {
109
+ spreadsheet: () => import("@opengeni/artifact-kernel-wasm-spreadsheet"),
110
+ document: () => import("@opengeni/artifact-kernel-wasm-document"),
111
+ presentation: () => import("@opengeni/artifact-kernel-wasm-presentation"),
112
+ } as const;
113
+ const { editableArtifactKernelRuntime } = await kernels[artifact.modality]();
114
+ const session = createBrowserEditableArtifactSession({
115
+ baseUrl: "https://api.example.com",
116
+ workspaceId,
117
+ artifact,
118
+ storageAuthority,
119
+ runtime: {
120
+ workerUrl,
121
+ ...editableArtifactKernelRuntime,
122
+ applicationOrigin: window.location.origin,
123
+ },
124
+ });
125
+ ```
126
+
127
+ Each kernel package contains only one editor modality, carries a static typed
128
+ build/protocol/model/command identity, and is reproduced from smoke-tested Rust
129
+ outputs under separate raw and gzip budgets. The Worker verifies that identity
130
+ against executable WASM capabilities before accepting state. A self-hosted host
131
+ may instead serve the exact version-matched glue and WASM binary together.
132
+ Canonical OGASC commands, OGATX intents, OGACO commits, and OGAKQ/OGAKV
133
+ queries/projections pass directly through the kernel; there is no JavaScript
134
+ operation mapper.
135
+
136
+ The live transport mints a short-lived, one-use ticket over authenticated HTTP,
137
+ then sends that ticket inside the first binary OGALV WebSocket frame. API keys
138
+ and long-lived credentials are never placed in the WebSocket URL. Hosts may
139
+ inject both `fetch` and the WebSocket factory for authenticated proxies and
140
+ tests; negotiated frame and mutation limits are enforced before work is queued.
141
+
142
+ ## Browser and computer interaction (`@opengeni/sdk/interaction`)
143
+
144
+ An interaction **resource** is a workspace-scoped, durable object with a stable
145
+ id and lifecycle, such as a `BrowserSession`, `ComputerSession`, browser
146
+ identity, network route, auth run, or pending human intervention. This use of
147
+ "resource" is unrelated to the file/repository `resources` attached to a chat
148
+ message. A **facade** is only the typed, resource-oriented SDK organization
149
+ shown below; it owns no state or authority of its own.
150
+
151
+ `OpenGeniClient.interaction` is the framework-free resource facade over the same
152
+ public BrowserSession, ComputerSession, identity, auth, network-route, and human
153
+ intervention APIs used by OpenGeni itself. It adds no second state or execution
154
+ path: facade methods call the ordinary typed transport, and every mutation still
155
+ uses the canonical generation fences, operation receipt, permission check, and
156
+ placement controller.
157
+
158
+ ```ts
159
+ const browser = await client.interaction.browsers.currentOrOpen({
160
+ workspaceId,
161
+ associationSessionId: session.id,
162
+ initialUrl: "http://127.0.0.1:3000",
163
+ });
164
+
165
+ const { targets } = await browser.tabs.list();
166
+ const target = targets.find((candidate) => candidate.selected) ?? targets[0]!;
167
+ const page = await browser.observe(target.id);
168
+
169
+ const receipt = await browser.act({
170
+ operationId: crypto.randomUUID(),
171
+ targetId: target.id,
172
+ expectedTargetGeneration: target.targetGeneration,
173
+ expectedDocumentGeneration: target.documentGeneration,
174
+ expectedFrameId: page.frameId,
175
+ action: { type: "click", locator: { kind: "role", role: "button", name: "Continue" } },
176
+ });
177
+
178
+ if (receipt.state === "outcome_unknown") {
179
+ // Do not replay a mutation blindly. Re-observe, then inspect this exact receipt.
180
+ console.log(await browser.receipt(receipt.operationId));
181
+ }
182
+ ```
183
+
184
+ Browser identities are immutable version graphs: live browser state stays
185
+ private until `browser.publishRevision(...)` explicitly creates a new revision.
186
+ Protected auth fills resolve connection secrets only inside the broker/controller
187
+ path; normal SDK reads, observations, diagnostics, receipts, and logs never
188
+ return credential values. `client.openWorkspaceInteractionRevisionStream(...)`
189
+ is the low-volume latest-wins invalidation stream for keeping resource catalogs
190
+ fresh without attaching them to an inference/session event stream.
191
+
192
+ Use the flat `OpenGeniClient` interaction methods when implementing a proxy or
193
+ custom transport. Use `client.interaction` for application logic. Both are the
194
+ same API and authority boundary.
195
+
90
196
  ## Workspace artifacts
91
197
 
92
198
  Workspace artifacts are generic, immutable HTML publications. The SDK does not
@@ -362,6 +468,18 @@ const file = await client.uploadFile(workspaceId, {
362
468
  const { url } = await client.createFileDownloadUrl(workspaceId, file.id);
363
469
  ```
364
470
 
471
+ Generated-image tool results use the same workspace file authority but expose a
472
+ closed `generated_image` receipt. Prefer a short-lived zero-copy browser URL;
473
+ use the bounded range method when the caller needs verified bytes:
474
+
475
+ ```ts
476
+ const { url } = await client.createRetainedArtifactDownloadUrl(workspaceId, receipt.artifact);
477
+ const { bytes } = await client.downloadRetainedArtifact(workspaceId, receipt.artifact);
478
+ ```
479
+
480
+ Both methods validate the receipt first. The byte path additionally verifies
481
+ the assembled SHA-256. See `docs/image-generation.md` in the repository.
482
+
365
483
  ## Connected Machines (bring-your-own-compute)
366
484
 
367
485
  A session can run on an enrolled **Connected Machine** — a user's own computer —
@@ -396,6 +514,12 @@ the enrollment methods (`mintEnrollToken`, `lookupDeviceEnrollment`,
396
514
  `approveDeviceEnrollment`, `denyDeviceEnrollment`) are covered in the
397
515
  [Connected Machines guide](../../docs/connected-machines.md).
398
516
 
517
+ For large agent hierarchies, use `listAgentTopology` instead of collecting full
518
+ session pages. It returns compact root, direct-child, or server-side search
519
+ pages with opaque cursors and server-authored descendant counts. Load a child
520
+ page only when its parent is expanded; `children.truncated` makes a lower-bound
521
+ aggregate explicit.
522
+
399
523
  ## Full API coverage
400
524
 
401
525
  Every public endpoint group has typed methods:
@@ -403,7 +527,7 @@ Every public endpoint group has typed methods:
403
527
  | Group | Methods |
404
528
  | --- | --- |
405
529
  | Access + workspaces | `getAccessContext`, `listWorkspaces`, `createWorkspace`, `getWorkspace`, `updateWorkspace` |
406
- | Sessions + events | `createSession`, `listSessions`, `getSession`, `updateSession`, `listEvents`, `sendEvent`, `sendMessage`, `steerMessage`, `pauseSession`, `resumeSession`, `cancelSession`, `sendApprovalDecision`, `streamEvents`, `openEventStream` |
530
+ | Sessions + events | `createSession`, `listSessions`, `listSessionPage`, `listAgentTopology`, `getSession`, `getSessionLineage`, `updateSession`, `listEvents`, `sendEvent`, `sendMessage`, `steerMessage`, `pauseSession`, `resumeSession`, `cancelSession`, `sendApprovalDecision`, `streamEvents`, `openEventStream` |
407
531
  | Machines (bring-your-own-compute) | `listMachines`, `machineMetricsSeries`, `swapActiveSandbox`, `mintEnrollToken`, `lookupDeviceEnrollment`, `approveDeviceEnrollment`, `denyDeviceEnrollment` |
408
532
  | Turn queue | `getQueue`, `moveQueueItem`, `editQueueItem`, `steerQueueItem`, `deleteQueueItem` |
409
533
  | Goal | `getGoal`, `updateGoal`, `pauseGoal`, `resumeGoal` |
@@ -413,10 +537,32 @@ Every public endpoint group has typed methods:
413
537
  | Documents | `createDocumentBase`, `listDocumentBases`, `getDocumentBase`, `addDocument`, `listDocuments`, `reindexDocument`, `searchDocuments`, `searchKnowledge` (effective organization + workspace + immutable initiating-user personal scope) |
414
538
  | Packs | `listPacks`, `registerPack`, `getPack`, `enablePack`, `deletePack`, `listPackInstallations` |
415
539
  | Capabilities | `listCapabilities`, `createCapability`, `enableCapability`, `disableCapability`, `discoverMcpCapabilities` |
540
+ | Plugin packages | `previewPlugin`, `installPlugin`, `previewPluginUninstall`, `uninstallPlugin` |
541
+ | API Integrations | `listIntegrationDefinitions`, `listApiIntegrations`, `previewApiIntegration`, `startApiIntegrationOAuth`, `installApiIntegration`, `previewApiIntegrationUninstall`, `uninstallApiIntegration`, `listIntegrationFacets`, `configureIntegrationFacet`, `pauseIntegrationFacet`, `resumeIntegrationFacet`, `removeIntegrationFacet`, `browseGoogleDriveFacetSource`, `saveGoogleDriveFacetSource` |
542
+ | Remote Skills | `previewSkillImport`, `installSkill`, `previewSkillUninstall`, `uninstallSkill` |
416
543
  | GitHub | `getGitHubApp`, `githubConnectUrl`, `listGitHubRepositories`, `syncGitHubRepositories`, `createGitHubAppManifest` |
417
544
  | API keys | `listApiKeys`, `createApiKey`, `deleteApiKey` |
418
545
  | Billing | `getBilling`, `getBillingUsage`, `getBillingEntitlements`, `createBillingCheckout` |
419
546
 
547
+ `listIntegrationDefinitions` returns safe Integration Definition metadata without any
548
+ deployment OAuth client credentials. API Integrations are multi-instance:
549
+ `installApiIntegration` may supply a
550
+ stable `instanceKey`, display name, and exact Connection. The returned
551
+ `serverId` is instance-specific, so two Gmail or Linear accounts can be
552
+ selected in one session without tool-name collision. Uninstall preview and
553
+ uninstall both require the exact `instanceKey` and instance version; neither
554
+ operation disconnects the underlying Connection.
555
+
556
+ Adapter-owned Integration facets are listed and mutated under the exact
557
+ `capabilityId` + `instanceKey` + `facetKey`. Generic primitive schemas use
558
+ `configureIntegrationFacet`; lifecycle changes and removal require the
559
+ binding's exact optimistic version plus a caller UUID idempotency key. Google
560
+ Drive's nested folder/Shared Drive source schema has dedicated
561
+ `browseGoogleDriveFacetSource` and `saveGoogleDriveFacetSource`
562
+ methods. They verify provider metadata through that instance's exact Connection
563
+ and persist only a versioned facet binding—never provider credentials, page
564
+ tokens, or selected-source configuration on the Connection.
565
+
420
566
  ### Protocol routes (deliberately not in the SDK)
421
567
 
422
568
  Some endpoints are wire protocols for specific counterparts, not client
@@ -1,7 +1,25 @@
1
- import { OpenGeniClient as OpenGeniCoreClient } from "./client";
2
- import type { CreateWorkspaceArtifactRequest, PublishWorkspaceArtifactVersionRequest, RollbackWorkspaceArtifactRequest, WorkspaceArtifactContentResponse, WorkspaceArtifactDetailResponse, WorkspaceArtifactListOptions, WorkspaceArtifactListResponse, WorkspaceArtifactMutationResponse } from "./workspace-artifacts";
1
+ import { OpenGeniClient as OpenGeniCoreClient } from "./client.js";
2
+ import type { CreateEditableArtifactMaterializationRequest, CreateEditableArtifactResourceRequest, EditableArtifactListResource, EditableArtifactMaterializationJobResource, EditableArtifactPinnedVersionResource, EditableArtifactResource, ImportEditableArtifactResourceRequest, ListSessionEditableArtifactResourcesOptions, PinEditableArtifactVersionRequest, ReadEditableArtifactMaterializationOptions, ReadEditableArtifactResourceOptions } from "./editable-artifact-resources.js";
3
+ import type { CreateWorkspaceArtifactRequest, PublishWorkspaceArtifactVersionRequest, RollbackWorkspaceArtifactRequest, WorkspaceArtifactContentResponse, WorkspaceArtifactDetailResponse, WorkspaceArtifactListOptions, WorkspaceArtifactListResponse, WorkspaceArtifactMutationResponse } from "./workspace-artifacts.js";
3
4
  /** Public SDK client. Artifact operations stay out of the console's eager core graph. */
4
5
  export declare class OpenGeniClient extends OpenGeniCoreClient {
6
+ createEditableArtifact(workspaceId: string, request: CreateEditableArtifactResourceRequest, options?: Readonly<{
7
+ signal?: AbortSignal | undefined;
8
+ }>): Promise<EditableArtifactResource>;
9
+ importEditableArtifact(workspaceId: string, request: ImportEditableArtifactResourceRequest, options?: Readonly<{
10
+ signal?: AbortSignal | undefined;
11
+ }>): Promise<EditableArtifactResource>;
12
+ getEditableArtifact(workspaceId: string, artifactId: string, options: ReadEditableArtifactResourceOptions): Promise<EditableArtifactResource>;
13
+ listSessionEditableArtifacts(workspaceId: string, sourceSessionId: string, options: ListSessionEditableArtifactResourcesOptions): Promise<EditableArtifactListResource>;
14
+ pinEditableArtifactVersion(workspaceId: string, artifactId: string, request: PinEditableArtifactVersionRequest, options?: Readonly<{
15
+ signal?: AbortSignal | undefined;
16
+ }>): Promise<EditableArtifactPinnedVersionResource>;
17
+ createEditableArtifactMaterialization(workspaceId: string, artifactId: string, request: CreateEditableArtifactMaterializationRequest, options?: Readonly<{
18
+ signal?: AbortSignal | undefined;
19
+ }>): Promise<EditableArtifactMaterializationJobResource>;
20
+ getEditableArtifactMaterialization(workspaceId: string, artifactId: string, jobId: string, options: ReadEditableArtifactMaterializationOptions): Promise<EditableArtifactMaterializationJobResource>;
21
+ /** The caller owns the returned bounded response stream. */
22
+ downloadEditableArtifactMaterialization(workspaceId: string, artifactId: string, jobId: string, options: ReadEditableArtifactMaterializationOptions): Promise<Response>;
5
23
  listWorkspaceArtifacts(workspaceId: string, options?: WorkspaceArtifactListOptions): Promise<WorkspaceArtifactListResponse>;
6
24
  getWorkspaceArtifact(workspaceId: string, artifactId: string): Promise<WorkspaceArtifactDetailResponse>;
7
25
  getWorkspaceArtifactContent(workspaceId: string, artifactId: string, versionId?: string): Promise<WorkspaceArtifactContentResponse>;
@@ -0,0 +1,4 @@
1
+ /** Artifact-only API client entry; keeps unrelated SDK surfaces out of editor bundles. */
2
+ export { OpenGeniClient } from "./artifact-client.js";
3
+ export type { CreateEditableArtifactMaterializationRequest, CreateEditableArtifactResourceRequest, EditableArtifactListResource, EditableArtifactMaterializationFormat, EditableArtifactMaterializationJobResource, EditableArtifactMaterializationResultResource, EditableArtifactPinnedVersionResource, EditableArtifactResource, ListSessionEditableArtifactResourcesOptions, PinEditableArtifactVersionRequest, ReadEditableArtifactMaterializationOptions, ReadEditableArtifactResourceOptions, } from "./editable-artifact-resources.js";
4
+ export type { FetchLike, OpenGeniClientOptions, OpenGeniRequestOptions } from "./client.js";
@@ -0,0 +1,11 @@
1
+ import {
2
+ OpenGeniClient
3
+ } from "./chunk-JRPFWI6T.js";
4
+ import "./chunk-PKQ377ED.js";
5
+ import "./chunk-HJ3HHUT5.js";
6
+ import "./chunk-GU6JF75T.js";
7
+ import "./chunk-ST5DDKJP.js";
8
+ export {
9
+ OpenGeniClient
10
+ };
11
+ //# sourceMappingURL=artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -21,7 +21,7 @@ var OpenGeniApiError = class extends Error {
21
21
  this.code = options.code ?? decoded?.code ?? (gatewayFailure && fromResponse ? "upstream_unavailable" : void 0);
22
22
  this.retryable = options.retryable ?? decoded?.retryable ?? retryableApiStatus(status);
23
23
  this.correlationId = correlationId;
24
- this.outcomeUnknown = options.outcomeUnknown ?? (gatewayFailure && !!options.mutation && !decoded);
24
+ this.outcomeUnknown = options.outcomeUnknown ?? decoded?.outcomeUnknown ?? (gatewayFailure && !!options.mutation && !decoded);
25
25
  this.body = !fromResponse || decoded ? body : "";
26
26
  this.details = decoded?.details;
27
27
  }
@@ -37,13 +37,16 @@ function decodeApiErrorBody(body) {
37
37
  const message = boundedApiField(nested.message);
38
38
  const requestId = boundedCorrelationId(nested.requestId);
39
39
  const retryable = typeof nested.retryable === "boolean" ? nested.retryable : void 0;
40
+ const outcomeUnknown = typeof nested.outcomeUnknown === "boolean" ? nested.outcomeUnknown : void 0;
40
41
  const details = boundedApiDetails(nested.details);
41
- if (!code && !message && !requestId && retryable === void 0 && !details) return null;
42
+ if (!code && !message && !requestId && retryable === void 0 && outcomeUnknown === void 0 && !details)
43
+ return null;
42
44
  return {
43
45
  code,
44
46
  message,
45
47
  requestId,
46
48
  retryable,
49
+ outcomeUnknown,
47
50
  details
48
51
  };
49
52
  } catch {
@@ -113,4 +116,4 @@ export {
113
116
  isAbortError,
114
117
  isRetryableStreamError
115
118
  };
116
- //# sourceMappingURL=chunk-V5F253OG.js.map
119
+ //# sourceMappingURL=chunk-GU6JF75T.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts"],"sourcesContent":["/** Error for a non-2xx OpenGeni API response. */\nexport class OpenGeniApiError extends Error {\n readonly status: number;\n readonly code: string | undefined;\n readonly retryable: boolean;\n readonly correlationId: string | undefined;\n /** True only when an uncontrolled transport failed after a mutation may have been accepted. */\n readonly outcomeUnknown: boolean;\n readonly body: string;\n readonly details: Record<string, unknown> | undefined;\n\n constructor(\n status: number,\n body: string,\n options: {\n code?: string | undefined;\n retryable?: boolean | undefined;\n correlationId?: string | undefined;\n outcomeUnknown?: boolean | undefined;\n displayMessage?: string | undefined;\n mutation?: boolean | undefined;\n } = {},\n ) {\n const decoded = decodeApiErrorBody(body);\n const correlationId = decoded?.requestId ?? boundedCorrelationId(options.correlationId);\n const gatewayFailure = status >= 502 && status <= 504;\n const fromResponse = options.mutation !== undefined;\n const message = decoded?.message ?? (fromResponse ? \"Request failed.\" : body || \"(empty body)\");\n const displayMessage =\n options.displayMessage ??\n (gatewayFailure && fromResponse\n ? (decoded?.message ?? \"OpenGeni is temporarily unavailable — retry.\")\n : `OpenGeni API ${status}: ${message}`);\n super(correlationId ? `${displayMessage} Reference: ${correlationId}.` : displayMessage);\n this.name = \"OpenGeniApiError\";\n this.status = status;\n this.code =\n options.code ??\n decoded?.code ??\n (gatewayFailure && fromResponse ? \"upstream_unavailable\" : undefined);\n this.retryable = options.retryable ?? decoded?.retryable ?? retryableApiStatus(status);\n this.correlationId = correlationId;\n this.outcomeUnknown =\n options.outcomeUnknown ??\n decoded?.outcomeUnknown ??\n (gatewayFailure && !!options.mutation && !decoded);\n this.body = !fromResponse || decoded ? body : \"\";\n this.details = decoded?.details;\n }\n}\n\nfunction decodeApiErrorBody(body: string): {\n code: string | undefined;\n message: string | undefined;\n requestId: string | undefined;\n retryable: boolean | undefined;\n outcomeUnknown: boolean | undefined;\n details: Record<string, unknown> | undefined;\n} | null {\n if (!body) return null;\n try {\n const decoded: unknown = JSON.parse(body);\n if (!decoded || typeof decoded !== \"object\" || Array.isArray(decoded)) return null;\n const record = decoded as Record<string, unknown>;\n const nested =\n record.error && typeof record.error === \"object\" && !Array.isArray(record.error)\n ? (record.error as Record<string, unknown>)\n : record;\n const code = boundedApiField(nested.code);\n const message = boundedApiField(nested.message);\n const requestId = boundedCorrelationId(nested.requestId);\n const retryable = typeof nested.retryable === \"boolean\" ? nested.retryable : undefined;\n const outcomeUnknown =\n typeof nested.outcomeUnknown === \"boolean\" ? nested.outcomeUnknown : undefined;\n const details = boundedApiDetails(nested.details);\n if (\n !code &&\n !message &&\n !requestId &&\n retryable === undefined &&\n outcomeUnknown === undefined &&\n !details\n )\n return null;\n return {\n code,\n message,\n requestId,\n retryable,\n outcomeUnknown,\n details,\n };\n } catch {\n return null;\n }\n}\n\nfunction boundedApiDetails(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return;\n const entries = Object.entries(value as Record<string, unknown>).slice(0, 16);\n const details: Record<string, unknown> = {};\n for (const [key, entry] of entries) {\n if (!/^[a-zA-Z][\\w.-]{0,63}$/.test(key)) continue;\n if (typeof entry === \"string\") {\n const bounded = boundedApiField(entry);\n if (bounded !== undefined) details[key] = bounded;\n } else if (typeof entry === \"number\" || typeof entry === \"boolean\" || entry === null) {\n details[key] = entry;\n }\n }\n return Object.keys(details).length > 0 ? details : undefined;\n}\n\nfunction boundedApiField(value: unknown): string | undefined {\n if (typeof value !== \"string\") return;\n const bytes = new TextEncoder().encode(value);\n return bytes.byteLength <= 512 ? value : new TextDecoder().decode(bytes.slice(0, 512));\n}\n\nfunction retryableApiStatus(status: number): boolean {\n return status === 408 || status === 409 || status === 425 || status === 429 || status >= 500;\n}\n\nfunction boundedCorrelationId(value: unknown): string | undefined {\n if (typeof value !== \"string\" || value.length > 128 || !/^[\\w.:-]+$/.test(value)) {\n return;\n }\n return value;\n}\n\n/** A short-lived session-list snapshot cursor can no longer be continued. */\nexport class OpenGeniSessionListCursorError extends OpenGeniApiError {}\n\n/** The browser bundle and API disagree about their state-changing wire contract. */\nexport class OpenGeniApiContractMismatchError extends Error {\n readonly expected: string;\n readonly actual: string;\n\n constructor(expected: string, actual: string) {\n super(`OpenGeni API contract mismatch: client expects ${expected}, API serves ${actual}`);\n this.name = \"OpenGeniApiContractMismatchError\";\n this.expected = expected;\n this.actual = actual;\n }\n}\n\n/** Error for an unrecoverable event-stream condition (not a transient drop). */\nexport class OpenGeniStreamError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"OpenGeniStreamError\";\n }\n}\n\nexport function isAbortError(error: unknown): boolean {\n return (\n (error instanceof DOMException && error.name === \"AbortError\") ||\n (error instanceof Error && error.name === \"AbortError\")\n );\n}\n\n/**\n * Transient conditions worth a reconnect: network-level failures (`fetch`\n * rejects with `TypeError`) and HTTP statuses that signal a temporary server\n * or contention condition. Auth/validation failures (401/403/404/...) are\n * permanent and surface to the caller instead.\n */\nexport function isRetryableStreamError(error: unknown): boolean {\n if (error instanceof OpenGeniApiError) return error.retryable;\n return error instanceof TypeError;\n}\n"],"mappings":";AACO,IAAM,mBAAN,cAA+B,MAAM;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YACE,QACA,MACA,UAOI,CAAC,GACL;AACA,UAAM,UAAU,mBAAmB,IAAI;AACvC,UAAM,gBAAgB,SAAS,aAAa,qBAAqB,QAAQ,aAAa;AACtF,UAAM,iBAAiB,UAAU,OAAO,UAAU;AAClD,UAAM,eAAe,QAAQ,aAAa;AAC1C,UAAM,UAAU,SAAS,YAAY,eAAe,oBAAoB,QAAQ;AAChF,UAAM,iBACJ,QAAQ,mBACP,kBAAkB,eACd,SAAS,WAAW,sDACrB,gBAAgB,MAAM,KAAK,OAAO;AACxC,UAAM,gBAAgB,GAAG,cAAc,eAAe,aAAa,MAAM,cAAc;AACvF,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,OACH,QAAQ,QACR,SAAS,SACR,kBAAkB,eAAe,yBAAyB;AAC7D,SAAK,YAAY,QAAQ,aAAa,SAAS,aAAa,mBAAmB,MAAM;AACrF,SAAK,gBAAgB;AACrB,SAAK,iBACH,QAAQ,kBACR,SAAS,mBACR,kBAAkB,CAAC,CAAC,QAAQ,YAAY,CAAC;AAC5C,SAAK,OAAO,CAAC,gBAAgB,UAAU,OAAO;AAC9C,SAAK,UAAU,SAAS;AAAA,EAC1B;AACF;AAEA,SAAS,mBAAmB,MAOnB;AACP,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI;AACF,UAAM,UAAmB,KAAK,MAAM,IAAI;AACxC,QAAI,CAAC,WAAW,OAAO,YAAY,YAAY,MAAM,QAAQ,OAAO,EAAG,QAAO;AAC9E,UAAM,SAAS;AACf,UAAM,SACJ,OAAO,SAAS,OAAO,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,OAAO,KAAK,IAC1E,OAAO,QACR;AACN,UAAM,OAAO,gBAAgB,OAAO,IAAI;AACxC,UAAM,UAAU,gBAAgB,OAAO,OAAO;AAC9C,UAAM,YAAY,qBAAqB,OAAO,SAAS;AACvD,UAAM,YAAY,OAAO,OAAO,cAAc,YAAY,OAAO,YAAY;AAC7E,UAAM,iBACJ,OAAO,OAAO,mBAAmB,YAAY,OAAO,iBAAiB;AACvE,UAAM,UAAU,kBAAkB,OAAO,OAAO;AAChD,QACE,CAAC,QACD,CAAC,WACD,CAAC,aACD,cAAc,UACd,mBAAmB,UACnB,CAAC;AAED,aAAO;AACT,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,kBAAkB,OAAqD;AAC9E,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,EAAG;AACjE,QAAM,UAAU,OAAO,QAAQ,KAAgC,EAAE,MAAM,GAAG,EAAE;AAC5E,QAAM,UAAmC,CAAC;AAC1C,aAAW,CAAC,KAAK,KAAK,KAAK,SAAS;AAClC,QAAI,CAAC,yBAAyB,KAAK,GAAG,EAAG;AACzC,QAAI,OAAO,UAAU,UAAU;AAC7B,YAAM,UAAU,gBAAgB,KAAK;AACrC,UAAI,YAAY,OAAW,SAAQ,GAAG,IAAI;AAAA,IAC5C,WAAW,OAAO,UAAU,YAAY,OAAO,UAAU,aAAa,UAAU,MAAM;AACpF,cAAQ,GAAG,IAAI;AAAA,IACjB;AAAA,EACF;AACA,SAAO,OAAO,KAAK,OAAO,EAAE,SAAS,IAAI,UAAU;AACrD;AAEA,SAAS,gBAAgB,OAAoC;AAC3D,MAAI,OAAO,UAAU,SAAU;AAC/B,QAAM,QAAQ,IAAI,YAAY,EAAE,OAAO,KAAK;AAC5C,SAAO,MAAM,cAAc,MAAM,QAAQ,IAAI,YAAY,EAAE,OAAO,MAAM,MAAM,GAAG,GAAG,CAAC;AACvF;AAEA,SAAS,mBAAmB,QAAyB;AACnD,SAAO,WAAW,OAAO,WAAW,OAAO,WAAW,OAAO,WAAW,OAAO,UAAU;AAC3F;AAEA,SAAS,qBAAqB,OAAoC;AAChE,MAAI,OAAO,UAAU,YAAY,MAAM,SAAS,OAAO,CAAC,aAAa,KAAK,KAAK,GAAG;AAChF;AAAA,EACF;AACA,SAAO;AACT;AAGO,IAAM,iCAAN,cAA6C,iBAAiB;AAAC;AAG/D,IAAM,mCAAN,cAA+C,MAAM;AAAA,EACjD;AAAA,EACA;AAAA,EAET,YAAY,UAAkB,QAAgB;AAC5C,UAAM,kDAAkD,QAAQ,gBAAgB,MAAM,EAAE;AACxF,SAAK,OAAO;AACZ,SAAK,WAAW;AAChB,SAAK,SAAS;AAAA,EAChB;AACF;AAGO,IAAM,sBAAN,cAAkC,MAAM;AAAA,EAC7C,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,SAAS,aAAa,OAAyB;AACpD,SACG,iBAAiB,gBAAgB,MAAM,SAAS,gBAChD,iBAAiB,SAAS,MAAM,SAAS;AAE9C;AAQO,SAAS,uBAAuB,OAAyB;AAC9D,MAAI,iBAAiB,iBAAkB,QAAO,MAAM;AACpD,SAAO,iBAAiB;AAC1B;","names":[]}
@@ -0,0 +1,222 @@
1
+ // src/types.ts
2
+ var DEFAULT_FILE_RESOURCE_MOUNT_ROOT = ".opengeni/files";
3
+ var SESSION_EVENT_TYPES = [
4
+ "session.created",
5
+ // Defensive bounded projection for malformed/legacy oversized envelopes.
6
+ "session.event.envelope_omitted",
7
+ "session.status.changed",
8
+ "session.realtime.started",
9
+ "session.realtime.ended",
10
+ "session.requiresAction",
11
+ "session.humanInput.requested",
12
+ "session.context.compaction.requested",
13
+ "session.context.compaction.started",
14
+ "session.context.compacted",
15
+ "session.context.compaction.skipped",
16
+ "session.context.cleared",
17
+ "user.message",
18
+ "user.pause",
19
+ "user.approvalDecision",
20
+ "user.humanInputResponse",
21
+ "turn.queued",
22
+ "turn.started",
23
+ "turn.completed",
24
+ "turn.failed",
25
+ "turn.cancelled",
26
+ "turn.superseded",
27
+ "turn.recovery.requested",
28
+ "turn.capacity_waiting",
29
+ "agent.message.delta",
30
+ "agent.message.completed",
31
+ "agent.reasoning.delta",
32
+ "agent.toolCall.created",
33
+ "agent.toolCall.output",
34
+ "agent.model.request",
35
+ "agent.model.usage",
36
+ "tool.auth_needed",
37
+ "credential.auth_needed",
38
+ "agent.updated",
39
+ "rig.setup.started",
40
+ "rig.setup.completed",
41
+ "rig.setup.skipped",
42
+ "rig.setup.failed",
43
+ "sandbox.operation.started",
44
+ "sandbox.operation.completed",
45
+ "sandbox.operation.failed",
46
+ "sandbox.command.output.delta",
47
+ "artifact.created",
48
+ "goal.set",
49
+ "goal.updated",
50
+ "goal.progress",
51
+ "goal.rewrite.proposed",
52
+ "goal.rewrite.rejected",
53
+ "goal.completed",
54
+ "goal.paused",
55
+ "goal.resumed",
56
+ "goal.cleared",
57
+ "goal.continuation",
58
+ "system.update.pending",
59
+ "system.update.delivered",
60
+ "system.update.superseded",
61
+ "system.update.cancelled",
62
+ "system.update.settled",
63
+ "session.control.paused",
64
+ "session.control.resumed",
65
+ "session.control.steer_requested",
66
+ "workspace.inference.paused",
67
+ "workspace.inference.resumed",
68
+ "session.queue.changed",
69
+ "session.queue.prompt.cancelled",
70
+ "session.queue.history",
71
+ "turn.event.rejected_late",
72
+ "memory.saved",
73
+ "memory.corrected",
74
+ // Channel-B desktop pixel-plane signals (mirror of contracts SessionEventType;
75
+ // the contract-parity test asserts sorted equality).
76
+ "stream.url.rotated",
77
+ "stream.opened",
78
+ "stream.closed",
79
+ "stream.revoked",
80
+ // Channel-B recording signals (P4.3 — "agent films itself proving the fix").
81
+ "recording.started",
82
+ "recording.available",
83
+ "recording.failed",
84
+ // Channel-A structured-service notifications (P4.4; mirror of contracts
85
+ // SessionEventType — the contract-parity test asserts sorted equality).
86
+ "fs.changed",
87
+ "git.changed",
88
+ "terminal.pty.started",
89
+ "terminal.pty.output.delta",
90
+ "terminal.pty.exited",
91
+ "session.title_set",
92
+ "session.visibility.changed",
93
+ "session.mcp.approval_policy.updated",
94
+ "session.tool_policy.updated",
95
+ // Multi-account Codex (P1): the session's inference account changed.
96
+ "codex.account.switched",
97
+ // credential allocator metadata-only per-turn credential selection audit.
98
+ "codex.credential.selected",
99
+ // Bounded, identity-free deterministic shadow/replay decision.
100
+ "codex.fleet.decision",
101
+ // credential allocator durable zero-capacity wait lifecycle. These are system/runtime
102
+ // events, never synthetic user messages.
103
+ "codex.capacity.waiting",
104
+ "codex.capacity.resumed",
105
+ "codex.capacity.superseded",
106
+ // Sandbox durability observability (mirror of contracts SessionEventType):
107
+ // box lifecycle + manifest-env drift, attributable from the DB alone.
108
+ "sandbox.box.created",
109
+ "sandbox.box.lost",
110
+ "sandbox.box.terminated",
111
+ "sandbox.box.snapshot",
112
+ "sandbox.env.drift",
113
+ // Active-sandbox pointer reconcile (issue #341; announce-only; mirror of contracts
114
+ // SessionEventType — the contract-parity test asserts sorted equality).
115
+ "session.route.reconciled",
116
+ // Workbench v2 turn-end workspace capture (announce-only; mirror of contracts
117
+ // SessionEventType — the contract-parity test asserts sorted equality).
118
+ "workspace.revision.captured",
119
+ "workspace.revision.degraded",
120
+ // Connected Machine op-outcome observability (announce-only, quiet; mirror of
121
+ // contracts SessionEventType — the contract-parity test asserts sorted equality).
122
+ "machine.op.failed",
123
+ "machine.op.recovered",
124
+ // Connected Machine link-plane observability (announce-only, quiet; mirror of
125
+ // contracts SessionEventType — the contract-parity test asserts sorted equality).
126
+ "machine.link.lost",
127
+ "machine.link.restored",
128
+ "machine.runner.restarted"
129
+ ];
130
+ var KNOWN_PERMISSIONS = [
131
+ "account:read",
132
+ "account:admin",
133
+ "members:manage",
134
+ "workspace:create",
135
+ "billing:read",
136
+ "billing:manage",
137
+ "workspace:read",
138
+ "workspace:admin",
139
+ "sessions:create",
140
+ "sessions:read",
141
+ "sessions:control",
142
+ // sandbox workspace (mirror of @opengeni/contracts Permission). stream:view is
143
+ // strictly broader than sessions:read (un-redacted pixels); stream:control is
144
+ // the never-granted-v1 raw-input plane; stream:acknowledge is the secret-leak
145
+ // consent gate.
146
+ "stream:view",
147
+ "stream:control",
148
+ "stream:acknowledge",
149
+ "files:upload",
150
+ "files:read",
151
+ "files:write",
152
+ "terminal:attach",
153
+ "documents:manage",
154
+ "documents:search",
155
+ "scheduled_tasks:manage",
156
+ "scheduled_tasks:run",
157
+ "github:manage",
158
+ "github:use",
159
+ "api_keys:manage",
160
+ "connections:read",
161
+ "connections:write",
162
+ "environments:manage",
163
+ "environments:use",
164
+ "variable-sets:list",
165
+ "variable-sets:read",
166
+ "variable-sets:write",
167
+ "variable-sets:manage",
168
+ "variable-sets:use",
169
+ "secrets:list",
170
+ "secrets:read",
171
+ "secrets:write",
172
+ "mcp_servers:attach",
173
+ "codemode:call",
174
+ "goals:manage",
175
+ "enrollments:read",
176
+ "enrollments:manage",
177
+ "rigs:use",
178
+ "rigs:manage",
179
+ "artifacts:read",
180
+ "artifacts:publish"
181
+ ];
182
+ var OPENGENI_API_CONTRACT_REVISION = "2026-08-social-provider-tools-v1";
183
+ var OPENGENI_API_CONTRACT_HEADER = "x-opengeni-api-contract";
184
+ var OPENGENI_CORRELATION_HEADER = "x-opengeni-correlation-id";
185
+ var RETAINED_OUTPUT_DEFAULT_PAGE_BYTES = 256 * 1024;
186
+ var RETAINED_OUTPUT_MAX_PAGE_BYTES = 1024 * 1024;
187
+ var COMPUTER_SCREENSHOT_MAX_BYTES = 32 * 1024 * 1024;
188
+ var GENERATED_IMAGE_MAX_BYTES = 64 * 1024 * 1024;
189
+ var GENERATED_VIDEO_MAX_BYTES = 512 * 1024 * 1024;
190
+ var KNOWN_USAGE_EVENT_TYPES = [
191
+ "agent_run.created",
192
+ "agent_run.completed",
193
+ "model.tokens",
194
+ "model.cost",
195
+ "file.uploaded",
196
+ "file.deleted",
197
+ "document.indexed",
198
+ "scheduled_task.fired",
199
+ "knowledge_source_sync.fired",
200
+ "knowledge_source_sync.completed",
201
+ "knowledge_source_sync.items",
202
+ "knowledge_source_sync.bytes",
203
+ "api_key.request",
204
+ // sandbox warm-time metering (P2.1) — mirrors contracts UsageEventType.
205
+ "sandbox.warm_seconds",
206
+ "sandbox.warm_cost"
207
+ ];
208
+
209
+ export {
210
+ DEFAULT_FILE_RESOURCE_MOUNT_ROOT,
211
+ SESSION_EVENT_TYPES,
212
+ KNOWN_PERMISSIONS,
213
+ OPENGENI_API_CONTRACT_REVISION,
214
+ OPENGENI_API_CONTRACT_HEADER,
215
+ OPENGENI_CORRELATION_HEADER,
216
+ RETAINED_OUTPUT_DEFAULT_PAGE_BYTES,
217
+ RETAINED_OUTPUT_MAX_PAGE_BYTES,
218
+ COMPUTER_SCREENSHOT_MAX_BYTES,
219
+ GENERATED_VIDEO_MAX_BYTES,
220
+ KNOWN_USAGE_EVENT_TYPES
221
+ };
222
+ //# sourceMappingURL=chunk-HJ3HHUT5.js.map