@opengeni/sdk 3.3.2 → 3.7.0-canary.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 (76) hide show
  1. package/README.md +80 -6
  2. package/dist/artifact-client.d.ts +4 -2
  3. package/dist/artifacts.d.ts +1 -1
  4. package/dist/artifacts.js +6 -6
  5. package/dist/browser.d.ts +5 -2
  6. package/dist/browser.js +14 -4
  7. package/dist/{chunk-YXQX7RQT.js → chunk-2E2BFEEN.js} +2 -2
  8. package/dist/{chunk-JUS2UYRP.js → chunk-3QDQTYOE.js} +3 -1
  9. package/dist/chunk-3QDQTYOE.js.map +1 -0
  10. package/dist/{chunk-C2H7HBNP.js → chunk-7S2MZ65L.js} +6 -6
  11. package/dist/chunk-FMLDFJ2Q.js +246 -0
  12. package/dist/chunk-FMLDFJ2Q.js.map +1 -0
  13. package/dist/{chunk-TRNI7KEO.js → chunk-IQTEPOI3.js} +228 -26
  14. package/dist/chunk-IQTEPOI3.js.map +1 -0
  15. package/dist/chunk-IRAEPLXG.js +350 -0
  16. package/dist/chunk-IRAEPLXG.js.map +1 -0
  17. package/dist/{chunk-QT3KFVDP.js → chunk-MPGVC7EO.js} +10 -2
  18. package/dist/chunk-MPGVC7EO.js.map +1 -0
  19. package/dist/{chunk-C4DJPZRU.js → chunk-OO5LPTO7.js} +14 -1
  20. package/dist/chunk-OO5LPTO7.js.map +1 -0
  21. package/dist/{chunk-KKRO2VCP.js → chunk-QTBAMHEF.js} +2 -2
  22. package/dist/client.d.ts +51 -11
  23. package/dist/codex-realtime-controller.js +2 -2
  24. package/dist/core.d.ts +5 -2
  25. package/dist/core.js +17 -7
  26. package/dist/document-authority.js +5 -5
  27. package/dist/editable-artifacts.js +4 -4
  28. package/dist/errors.d.ts +12 -0
  29. package/dist/github-repositories.d.ts +10 -0
  30. package/dist/github-repositories.js +36 -0
  31. package/dist/github-repositories.js.map +1 -0
  32. package/dist/index.d.ts +13 -6
  33. package/dist/index.js +99 -52
  34. package/dist/index.js.map +1 -1
  35. package/dist/interaction.js +2 -2
  36. package/dist/model-context.d.ts +49 -0
  37. package/dist/model-picker-order.d.ts +1 -0
  38. package/dist/model-picker-order.js +10 -0
  39. package/dist/model-picker-order.js.map +1 -0
  40. package/dist/proxy.d.ts +7 -5
  41. package/dist/realtime.js +2 -2
  42. package/dist/session-titles.d.ts +2 -28
  43. package/dist/site.d.ts +93 -0
  44. package/dist/site.js +35 -0
  45. package/dist/site.js.map +1 -0
  46. package/dist/stream.d.ts +2 -0
  47. package/dist/tools-FSTY4FAY.js +12 -0
  48. package/dist/tools-FSTY4FAY.js.map +1 -0
  49. package/dist/tools.d.ts +61 -0
  50. package/dist/types.d.ts +231 -9
  51. package/dist/workspace-artifacts.d.ts +26 -1
  52. package/package.json +14 -2
  53. package/src/artifact-client.ts +16 -1
  54. package/src/artifacts.ts +1 -0
  55. package/src/browser.ts +16 -0
  56. package/src/client.ts +332 -22
  57. package/src/core.ts +16 -0
  58. package/src/errors.ts +23 -0
  59. package/src/github-repositories.ts +60 -0
  60. package/src/index.ts +94 -1
  61. package/src/model-context.ts +69 -0
  62. package/src/model-picker-order.ts +6 -0
  63. package/src/proxy.ts +17 -6
  64. package/src/session-titles.ts +8 -82
  65. package/src/site.ts +544 -0
  66. package/src/stream.ts +29 -8
  67. package/src/tools.ts +396 -0
  68. package/src/types.ts +287 -10
  69. package/src/workspace-artifacts.ts +33 -2
  70. package/dist/chunk-C4DJPZRU.js.map +0 -1
  71. package/dist/chunk-JUS2UYRP.js.map +0 -1
  72. package/dist/chunk-QT3KFVDP.js.map +0 -1
  73. package/dist/chunk-TRNI7KEO.js.map +0 -1
  74. /package/dist/{chunk-YXQX7RQT.js.map → chunk-2E2BFEEN.js.map} +0 -0
  75. /package/dist/{chunk-C2H7HBNP.js.map → chunk-7S2MZ65L.js.map} +0 -0
  76. /package/dist/{chunk-KKRO2VCP.js.map → chunk-QTBAMHEF.js.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  OpenGeniApiError
3
- } from "./chunk-C4DJPZRU.js";
3
+ } from "./chunk-OO5LPTO7.js";
4
4
 
5
5
  // src/codex-realtime-v3-wire.ts
6
6
  var CODEX_REALTIME_INITIAL_ITEMS_MAX_COUNT = 128;
@@ -2253,10 +2253,6 @@ function safeError2(error) {
2253
2253
  }
2254
2254
 
2255
2255
  export {
2256
- CodexRealtimeMicrophoneError,
2257
- startCodexRealtimeWebrtc,
2258
- acquireCodexRealtimeMicrophone,
2259
- codexRealtimeMicrophoneHealthy,
2260
2256
  CODEX_REALTIME_INITIAL_ITEMS_MAX_COUNT,
2261
2257
  CODEX_REALTIME_INITIAL_ITEMS_MAX_TOKENS,
2262
2258
  CODEX_REALTIME_CONTEXT_APPEND_MAX_BYTES,
@@ -2271,6 +2267,10 @@ export {
2271
2267
  CODEX_REALTIME_V3_PENDING_MAX_ENTRIES,
2272
2268
  CODEX_REALTIME_V3_PENDING_MAX_BYTES,
2273
2269
  createCodexRealtimeV3Bridge,
2270
+ CodexRealtimeMicrophoneError,
2271
+ startCodexRealtimeWebrtc,
2272
+ acquireCodexRealtimeMicrophone,
2273
+ codexRealtimeMicrophoneHealthy,
2274
2274
  projectSessionRealtimeLifecycle,
2275
2275
  CODEX_REALTIME_NEGOTIATION_TIMEOUT_MS,
2276
2276
  sessionRealtimeOwnerStorageNamespace,
@@ -2278,4 +2278,4 @@ export {
2278
2278
  hasStoredSessionRealtimeOwnerProof,
2279
2279
  createCodexRealtimeController
2280
2280
  };
2281
- //# sourceMappingURL=chunk-C2H7HBNP.js.map
2281
+ //# sourceMappingURL=chunk-7S2MZ65L.js.map
@@ -0,0 +1,246 @@
1
+ import {
2
+ OpenGeniApiError
3
+ } from "./chunk-OO5LPTO7.js";
4
+
5
+ // src/tools.ts
6
+ var OpenGeniToolCallError = class extends Error {
7
+ constructor(result) {
8
+ const structured = result.structuredContent;
9
+ super(
10
+ typeof structured?.error?.message === "string" ? structured.error.message : "OpenGeni tool call failed"
11
+ );
12
+ this.result = result;
13
+ this.name = "OpenGeniToolCallError";
14
+ this.code = typeof structured?.error?.code === "string" ? structured.error.code : "tool_error";
15
+ this.retryable = structured?.error?.retryable === true;
16
+ this.outcomeUnknown = structured?.error?.outcomeUnknown === true;
17
+ }
18
+ code;
19
+ retryable;
20
+ outcomeUnknown;
21
+ };
22
+ var OpenGeniToolReapprovalRequiredError = class extends Error {
23
+ constructor(operationId, previousCatalogDigest, catalogDigest, identity) {
24
+ super(
25
+ "The workspace tool catalog changed after approval. Request a new approval for the refreshed tool identity and retry with the same operation ID."
26
+ );
27
+ this.operationId = operationId;
28
+ this.previousCatalogDigest = previousCatalogDigest;
29
+ this.catalogDigest = catalogDigest;
30
+ this.identity = identity;
31
+ this.name = "OpenGeniToolReapprovalRequiredError";
32
+ }
33
+ code = "tool_reapproval_required";
34
+ retryable = false;
35
+ };
36
+ var OpenGeniToolsClient = class {
37
+ constructor(transport) {
38
+ this.transport = transport;
39
+ }
40
+ forWorkspace(workspaceId) {
41
+ const normalizedWorkspaceId = requiredId(workspaceId, "workspaceId");
42
+ let catalogSnapshot = null;
43
+ const approvalBindings = /* @__PURE__ */ new Map();
44
+ const catalog = async (options = {}) => {
45
+ if (catalogSnapshot && !options.refresh) return catalogSnapshot;
46
+ const next = await this.transport.requestJson(
47
+ "GET",
48
+ `/v1/workspaces/${encodeURIComponent(normalizedWorkspaceId)}/tools/catalog`,
49
+ void 0,
50
+ {},
51
+ options.signal ? { signal: options.signal } : {}
52
+ );
53
+ catalogSnapshot = next;
54
+ return next;
55
+ };
56
+ const callResolvedIdentity = async (resolveIdentity, argumentsValue, options) => {
57
+ if (options.approvalToken && !options.operationId) {
58
+ throw new TypeError("operationId is required when using an approval token");
59
+ }
60
+ const operationId = options.operationId ?? crypto.randomUUID();
61
+ const initial = await catalog({
62
+ ...options.refreshCatalog === void 0 ? {} : { refresh: options.refreshCatalog },
63
+ ...options.signal ? { signal: options.signal } : {}
64
+ });
65
+ const invoke = async (current) => {
66
+ const identity = resolveIdentity(current);
67
+ const approvalBinding = options.approvalToken ? approvalBindings.get(options.approvalToken) : void 0;
68
+ if (approvalBinding && (approvalBinding.operationId !== operationId || approvalBinding.catalogDigest !== current.digest || !sameToolIdentity(approvalBinding.identity, identity))) {
69
+ throw new OpenGeniToolReapprovalRequiredError(
70
+ operationId,
71
+ approvalBinding.catalogDigest,
72
+ current.digest,
73
+ identity
74
+ );
75
+ }
76
+ const request = {
77
+ operationId,
78
+ catalogDigest: current.digest,
79
+ identity,
80
+ arguments: argumentsValue,
81
+ ...options.approvalToken ? { approvalToken: options.approvalToken } : {}
82
+ };
83
+ let response;
84
+ try {
85
+ response = await this.transport.requestJson(
86
+ "POST",
87
+ `/v1/workspaces/${encodeURIComponent(normalizedWorkspaceId)}/tools/calls`,
88
+ request,
89
+ {},
90
+ options.signal ? { signal: options.signal } : {}
91
+ );
92
+ } catch (error) {
93
+ if (isCatalogStaleApiError(error)) catalogSnapshot = null;
94
+ else if (options.approvalToken) approvalBindings.delete(options.approvalToken);
95
+ throw error;
96
+ }
97
+ if (options.approvalToken) approvalBindings.delete(options.approvalToken);
98
+ if (response.catalogDigest !== current.digest) {
99
+ catalogSnapshot = null;
100
+ }
101
+ if (response.result.isError) throw new OpenGeniToolCallError(response.result);
102
+ const entry = findCatalogEntry(current, identity);
103
+ return entry?.outputSchema && response.result.structuredContent !== void 0 ? response.result.structuredContent : response.result;
104
+ };
105
+ try {
106
+ return await invoke(initial);
107
+ } catch (error) {
108
+ if (!isCatalogStaleApiError(error)) throw error;
109
+ }
110
+ const refreshed = await catalog({
111
+ refresh: true,
112
+ ...options.signal ? { signal: options.signal } : {}
113
+ });
114
+ const refreshedIdentity = resolveIdentity(refreshed);
115
+ if (options.approvalToken && refreshed.digest !== initial.digest) {
116
+ throw new OpenGeniToolReapprovalRequiredError(
117
+ operationId,
118
+ initial.digest,
119
+ refreshed.digest,
120
+ refreshedIdentity
121
+ );
122
+ }
123
+ return await invoke(refreshed);
124
+ };
125
+ const callIdentity = async (identity, argumentsValue = {}, options = {}) => await callResolvedIdentity(
126
+ (current) => requireCatalogIdentity(current, identity),
127
+ argumentsValue,
128
+ options
129
+ );
130
+ const approveIdentity = async (identity, argumentsValue = {}, options = {}) => {
131
+ const operationId = options.operationId ?? crypto.randomUUID();
132
+ const approve = async (current) => {
133
+ const request = {
134
+ operationId,
135
+ catalogDigest: current.digest,
136
+ identity: requireCatalogIdentity(current, identity),
137
+ arguments: argumentsValue
138
+ };
139
+ try {
140
+ const response = await this.transport.requestJson(
141
+ "POST",
142
+ `/v1/workspaces/${encodeURIComponent(normalizedWorkspaceId)}/tools/approvals`,
143
+ request,
144
+ {},
145
+ options.signal ? { signal: options.signal } : {}
146
+ );
147
+ approvalBindings.set(response.approvalToken, {
148
+ operationId: response.operationId,
149
+ catalogDigest: response.catalogDigest,
150
+ identity: response.identity
151
+ });
152
+ return response;
153
+ } catch (error) {
154
+ if (isCatalogStaleApiError(error)) catalogSnapshot = null;
155
+ throw error;
156
+ }
157
+ };
158
+ const initial = await catalog(options.signal ? { signal: options.signal } : {});
159
+ try {
160
+ return await approve(initial);
161
+ } catch (error) {
162
+ if (!isCatalogStaleApiError(error)) throw error;
163
+ }
164
+ const refreshed = await catalog({
165
+ refresh: true,
166
+ ...options.signal ? { signal: options.signal } : {}
167
+ });
168
+ return await approve(refreshed);
169
+ };
170
+ const invokePath = async (path, argumentsValue = {}, options = {}) => {
171
+ return await callResolvedIdentity(
172
+ (current) => requireCatalogPath(current, path).identity,
173
+ argumentsValue,
174
+ options
175
+ );
176
+ };
177
+ const node = (path) => new Proxy(
178
+ async (argumentsValue = {}, options = {}) => await invokePath(path, argumentsValue, options),
179
+ {
180
+ get: (_target, property) => {
181
+ if (property === "then") return void 0;
182
+ if (typeof property !== "string") return void 0;
183
+ return node([...path, property]);
184
+ }
185
+ }
186
+ );
187
+ return new Proxy(/* @__PURE__ */ Object.create(null), {
188
+ get: (_target, property) => {
189
+ if (property === "then") return void 0;
190
+ if (property === "$catalog") return catalog;
191
+ if (property === "$call") return callIdentity;
192
+ if (property === "$approve") return approveIdentity;
193
+ if (property === "$declarations") {
194
+ return async (options = {}) => await this.transport.requestJson(
195
+ "GET",
196
+ `/v1/workspaces/${encodeURIComponent(normalizedWorkspaceId)}/tools/declarations`,
197
+ void 0,
198
+ {},
199
+ options.signal ? { signal: options.signal } : {}
200
+ );
201
+ }
202
+ if (typeof property !== "string") return void 0;
203
+ return node([property]);
204
+ }
205
+ });
206
+ }
207
+ };
208
+ function findCatalogEntry(catalog, identity) {
209
+ return catalog.entries.find(
210
+ (entry) => entry.identity.serverId === identity.serverId && entry.identity.toolName === identity.toolName
211
+ );
212
+ }
213
+ function sameToolIdentity(left, right) {
214
+ return left.serverId === right.serverId && left.toolName === right.toolName;
215
+ }
216
+ function requireCatalogIdentity(catalog, identity) {
217
+ const entry = findCatalogEntry(catalog, identity);
218
+ if (!entry) {
219
+ throw new Error(
220
+ `Tool is not present in the workspace catalog: ${identity.serverId}/${identity.toolName}`
221
+ );
222
+ }
223
+ return entry.identity;
224
+ }
225
+ function requireCatalogPath(catalog, path) {
226
+ const entry = catalog.entries.find(
227
+ (candidate) => candidate.codemodePath.length === path.length && candidate.codemodePath.every((segment, index) => segment === path[index])
228
+ );
229
+ if (!entry) throw new Error(`Tool is not present in the workspace catalog: ${path.join(".")}`);
230
+ return entry;
231
+ }
232
+ function isCatalogStaleApiError(error) {
233
+ return error instanceof OpenGeniApiError && error.status === 409 && error.details?.code === "catalog_stale" || typeof error === "object" && error !== null && "code" in error && error.code === "catalog_stale";
234
+ }
235
+ function requiredId(value, label) {
236
+ const normalized = value.trim();
237
+ if (!normalized) throw new TypeError(`${label} is required`);
238
+ return normalized;
239
+ }
240
+
241
+ export {
242
+ OpenGeniToolCallError,
243
+ OpenGeniToolReapprovalRequiredError,
244
+ OpenGeniToolsClient
245
+ };
246
+ //# sourceMappingURL=chunk-FMLDFJ2Q.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools.ts"],"sourcesContent":["import type {\n ToolGatewayCallRequest,\n ToolGatewayCallResponse,\n ToolGatewayApprovalRequest,\n ToolGatewayApprovalResponse,\n ToolGatewayCatalog,\n ToolGatewayCatalogEntry,\n ToolGatewayDeclarationsResponse,\n ToolGatewayIdentity,\n ToolGatewayResult,\n} from \"./types\";\nimport { OpenGeniApiError } from \"./errors\";\n\nexport type OpenGeniToolCallOptions = {\n operationId?: string;\n signal?: AbortSignal;\n refreshCatalog?: boolean;\n /** Server-issued, single-use capability returned by `$approve`. */\n approvalToken?: string;\n};\n\nexport type OpenGeniToolFunction<\n TArguments extends Record<string, unknown> = Record<string, unknown>,\n TResult = unknown,\n> = (argumentsValue?: TArguments, options?: OpenGeniToolCallOptions) => Promise<TResult>;\n\nexport interface OpenGeniDynamicToolNamespace {\n readonly [key: string]: OpenGeniDynamicToolNode;\n}\n\nexport type OpenGeniDynamicToolNode = OpenGeniDynamicToolNamespace & OpenGeniToolFunction;\n\n/** Declaration-generation target for one exact workspace catalog. */\nexport interface OpenGeniGeneratedTools {}\n\nexport type OpenGeniWorkspaceTools<\n TCatalog extends Pick<\n ToolGatewayCatalog,\n \"version\" | \"generation\" | \"digest\" | \"createdAt\" | \"entries\"\n > = ToolGatewayCatalog,\n> = OpenGeniGeneratedTools &\n OpenGeniDynamicToolNamespace & {\n readonly $catalog: (options?: { refresh?: boolean; signal?: AbortSignal }) => Promise<TCatalog>;\n readonly $call: (\n identity: ToolGatewayIdentity,\n argumentsValue?: Record<string, unknown>,\n options?: OpenGeniToolCallOptions,\n ) => Promise<unknown>;\n readonly $approve: (\n identity: ToolGatewayIdentity,\n argumentsValue?: Record<string, unknown>,\n options?: {\n operationId?: string;\n signal?: AbortSignal;\n },\n ) => Promise<ToolGatewayApprovalResponse>;\n readonly $declarations: (options?: {\n signal?: AbortSignal;\n }) => Promise<ToolGatewayDeclarationsResponse>;\n };\n\nexport interface OpenGeniToolTransport {\n requestJson<T>(\n method: string,\n path: string,\n body?: unknown,\n query?: Record<string, string>,\n options?: { signal?: AbortSignal; timeoutMs?: number },\n ): Promise<T>;\n}\n\nexport interface OpenGeniToolsFacade {\n forWorkspace(workspaceId: string): OpenGeniWorkspaceTools;\n}\n\nexport class OpenGeniToolCallError extends Error {\n readonly code: string;\n readonly retryable: boolean;\n readonly outcomeUnknown: boolean;\n\n constructor(readonly result: ToolGatewayResult) {\n const structured = result.structuredContent as\n | {\n error?: {\n code?: unknown;\n message?: unknown;\n retryable?: unknown;\n outcomeUnknown?: unknown;\n };\n }\n | undefined;\n super(\n typeof structured?.error?.message === \"string\"\n ? structured.error.message\n : \"OpenGeni tool call failed\",\n );\n this.name = \"OpenGeniToolCallError\";\n this.code = typeof structured?.error?.code === \"string\" ? structured.error.code : \"tool_error\";\n this.retryable = structured?.error?.retryable === true;\n this.outcomeUnknown = structured?.error?.outcomeUnknown === true;\n }\n}\n\n/** A catalog refresh invalidated the single-use approval capability for this call. */\nexport class OpenGeniToolReapprovalRequiredError extends Error {\n readonly code = \"tool_reapproval_required\" as const;\n readonly retryable = false;\n\n constructor(\n readonly operationId: string,\n readonly previousCatalogDigest: string,\n readonly catalogDigest: string,\n readonly identity: ToolGatewayIdentity,\n ) {\n super(\n \"The workspace tool catalog changed after approval. Request a new approval for the refreshed tool identity and retry with the same operation ID.\",\n );\n this.name = \"OpenGeniToolReapprovalRequiredError\";\n }\n}\n\nexport class OpenGeniToolsClient implements OpenGeniToolsFacade {\n constructor(private readonly transport: OpenGeniToolTransport) {}\n\n forWorkspace(workspaceId: string): OpenGeniWorkspaceTools {\n const normalizedWorkspaceId = requiredId(workspaceId, \"workspaceId\");\n let catalogSnapshot: ToolGatewayCatalog | null = null;\n const approvalBindings = new Map<\n string,\n {\n operationId: string;\n catalogDigest: string;\n identity: ToolGatewayIdentity;\n }\n >();\n const catalog = async (\n options: { refresh?: boolean; signal?: AbortSignal } = {},\n ): Promise<ToolGatewayCatalog> => {\n if (catalogSnapshot && !options.refresh) return catalogSnapshot;\n const next = await this.transport.requestJson<ToolGatewayCatalog>(\n \"GET\",\n `/v1/workspaces/${encodeURIComponent(normalizedWorkspaceId)}/tools/catalog`,\n undefined,\n {},\n options.signal ? { signal: options.signal } : {},\n );\n catalogSnapshot = next;\n return next;\n };\n const callResolvedIdentity = async (\n resolveIdentity: (current: ToolGatewayCatalog) => ToolGatewayIdentity,\n argumentsValue: Record<string, unknown>,\n options: OpenGeniToolCallOptions,\n ): Promise<unknown> => {\n if (options.approvalToken && !options.operationId) {\n throw new TypeError(\"operationId is required when using an approval token\");\n }\n const operationId = options.operationId ?? crypto.randomUUID();\n const initial = await catalog({\n ...(options.refreshCatalog === undefined ? {} : { refresh: options.refreshCatalog }),\n ...(options.signal ? { signal: options.signal } : {}),\n });\n const invoke = async (current: ToolGatewayCatalog): Promise<unknown> => {\n const identity = resolveIdentity(current);\n const approvalBinding = options.approvalToken\n ? approvalBindings.get(options.approvalToken)\n : undefined;\n if (\n approvalBinding &&\n (approvalBinding.operationId !== operationId ||\n approvalBinding.catalogDigest !== current.digest ||\n !sameToolIdentity(approvalBinding.identity, identity))\n ) {\n throw new OpenGeniToolReapprovalRequiredError(\n operationId,\n approvalBinding.catalogDigest,\n current.digest,\n identity,\n );\n }\n const request: ToolGatewayCallRequest = {\n operationId,\n catalogDigest: current.digest,\n identity,\n arguments: argumentsValue,\n ...(options.approvalToken ? { approvalToken: options.approvalToken } : {}),\n };\n let response: ToolGatewayCallResponse;\n try {\n response = await this.transport.requestJson<ToolGatewayCallResponse>(\n \"POST\",\n `/v1/workspaces/${encodeURIComponent(normalizedWorkspaceId)}/tools/calls`,\n request,\n {},\n options.signal ? { signal: options.signal } : {},\n );\n } catch (error) {\n if (isCatalogStaleApiError(error)) catalogSnapshot = null;\n else if (options.approvalToken) approvalBindings.delete(options.approvalToken);\n throw error;\n }\n if (options.approvalToken) approvalBindings.delete(options.approvalToken);\n if (response.catalogDigest !== current.digest) {\n catalogSnapshot = null;\n }\n if (response.result.isError) throw new OpenGeniToolCallError(response.result);\n const entry = findCatalogEntry(current, identity);\n return entry?.outputSchema && response.result.structuredContent !== undefined\n ? response.result.structuredContent\n : response.result;\n };\n try {\n return await invoke(initial);\n } catch (error) {\n if (!isCatalogStaleApiError(error)) throw error;\n }\n const refreshed = await catalog({\n refresh: true,\n ...(options.signal ? { signal: options.signal } : {}),\n });\n const refreshedIdentity = resolveIdentity(refreshed);\n if (options.approvalToken && refreshed.digest !== initial.digest) {\n throw new OpenGeniToolReapprovalRequiredError(\n operationId,\n initial.digest,\n refreshed.digest,\n refreshedIdentity,\n );\n }\n return await invoke(refreshed);\n };\n const callIdentity = async (\n identity: ToolGatewayIdentity,\n argumentsValue: Record<string, unknown> = {},\n options: OpenGeniToolCallOptions = {},\n ): Promise<unknown> =>\n await callResolvedIdentity(\n (current) => requireCatalogIdentity(current, identity),\n argumentsValue,\n options,\n );\n const approveIdentity = async (\n identity: ToolGatewayIdentity,\n argumentsValue: Record<string, unknown> = {},\n options: {\n operationId?: string;\n signal?: AbortSignal;\n } = {},\n ): Promise<ToolGatewayApprovalResponse> => {\n const operationId = options.operationId ?? crypto.randomUUID();\n const approve = async (current: ToolGatewayCatalog): Promise<ToolGatewayApprovalResponse> => {\n const request: ToolGatewayApprovalRequest = {\n operationId,\n catalogDigest: current.digest,\n identity: requireCatalogIdentity(current, identity),\n arguments: argumentsValue,\n };\n try {\n const response = await this.transport.requestJson<ToolGatewayApprovalResponse>(\n \"POST\",\n `/v1/workspaces/${encodeURIComponent(normalizedWorkspaceId)}/tools/approvals`,\n request,\n {},\n options.signal ? { signal: options.signal } : {},\n );\n approvalBindings.set(response.approvalToken, {\n operationId: response.operationId,\n catalogDigest: response.catalogDigest,\n identity: response.identity,\n });\n return response;\n } catch (error) {\n if (isCatalogStaleApiError(error)) catalogSnapshot = null;\n throw error;\n }\n };\n const initial = await catalog(options.signal ? { signal: options.signal } : {});\n try {\n return await approve(initial);\n } catch (error) {\n if (!isCatalogStaleApiError(error)) throw error;\n }\n const refreshed = await catalog({\n refresh: true,\n ...(options.signal ? { signal: options.signal } : {}),\n });\n return await approve(refreshed);\n };\n const invokePath = async (\n path: readonly string[],\n argumentsValue: Record<string, unknown> = {},\n options: OpenGeniToolCallOptions = {},\n ): Promise<unknown> => {\n return await callResolvedIdentity(\n (current) => requireCatalogPath(current, path).identity,\n argumentsValue,\n options,\n );\n };\n const node = (path: readonly string[]): OpenGeniDynamicToolNode =>\n new Proxy(\n (async (argumentsValue = {}, options = {}) =>\n await invokePath(path, argumentsValue, options)) as OpenGeniDynamicToolNode,\n {\n get: (_target, property) => {\n // Dynamic namespaces must never become accidental Promise-like\n // values when passed through await/Promise.resolve.\n if (property === \"then\") return undefined;\n if (typeof property !== \"string\") return undefined;\n return node([...path, property]);\n },\n },\n );\n return new Proxy(Object.create(null) as OpenGeniWorkspaceTools, {\n get: (_target, property) => {\n if (property === \"then\") return undefined;\n if (property === \"$catalog\") return catalog;\n if (property === \"$call\") return callIdentity;\n if (property === \"$approve\") return approveIdentity;\n if (property === \"$declarations\") {\n return async (options: { signal?: AbortSignal } = {}) =>\n await this.transport.requestJson<ToolGatewayDeclarationsResponse>(\n \"GET\",\n `/v1/workspaces/${encodeURIComponent(normalizedWorkspaceId)}/tools/declarations`,\n undefined,\n {},\n options.signal ? { signal: options.signal } : {},\n );\n }\n if (typeof property !== \"string\") return undefined;\n return node([property]);\n },\n });\n }\n}\n\nfunction findCatalogEntry(\n catalog: ToolGatewayCatalog,\n identity: ToolGatewayIdentity,\n): ToolGatewayCatalogEntry | undefined {\n return catalog.entries.find(\n (entry) =>\n entry.identity.serverId === identity.serverId &&\n entry.identity.toolName === identity.toolName,\n );\n}\n\nfunction sameToolIdentity(left: ToolGatewayIdentity, right: ToolGatewayIdentity): boolean {\n return left.serverId === right.serverId && left.toolName === right.toolName;\n}\n\nfunction requireCatalogIdentity(\n catalog: ToolGatewayCatalog,\n identity: ToolGatewayIdentity,\n): ToolGatewayIdentity {\n const entry = findCatalogEntry(catalog, identity);\n if (!entry) {\n throw new Error(\n `Tool is not present in the workspace catalog: ${identity.serverId}/${identity.toolName}`,\n );\n }\n return entry.identity;\n}\n\nfunction requireCatalogPath(\n catalog: ToolGatewayCatalog,\n path: readonly string[],\n): ToolGatewayCatalogEntry {\n const entry = catalog.entries.find(\n (candidate) =>\n candidate.codemodePath.length === path.length &&\n candidate.codemodePath.every((segment, index) => segment === path[index]),\n );\n if (!entry) throw new Error(`Tool is not present in the workspace catalog: ${path.join(\".\")}`);\n return entry;\n}\n\nfunction isCatalogStaleApiError(\n error: unknown,\n): error is OpenGeniApiError | { code: \"catalog_stale\" } {\n return (\n (error instanceof OpenGeniApiError &&\n error.status === 409 &&\n error.details?.code === \"catalog_stale\") ||\n (typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"catalog_stale\")\n );\n}\n\nfunction requiredId(value: string, label: string): string {\n const normalized = value.trim();\n if (!normalized) throw new TypeError(`${label} is required`);\n return normalized;\n}\n"],"mappings":"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","names":[]}