@opengeni/contracts 1.3.0 → 1.4.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/dist/connect.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  IntegrationInstanceKey,
3
3
  IntegrationSource
4
- } from "./chunk-LLFQJL3S.js";
4
+ } from "./chunk-YFEAAOBX.js";
5
5
  import "./chunk-4JGHSSB7.js";
6
6
  import "./chunk-5IXYF6XN.js";
7
7
  import "./chunk-NRMCVHAU.js";
@@ -16,7 +16,7 @@ import "./chunk-YRKRZ6OF.js";
16
16
  import "./chunk-2VORLN2R.js";
17
17
  import "./chunk-GRG7PHWQ.js";
18
18
  import "./chunk-YRXAWWCU.js";
19
- import "./chunk-RYEHNSO7.js";
19
+ import "./chunk-TCXCRBPF.js";
20
20
  import "./chunk-2ACYHZFB.js";
21
21
  import "./chunk-KHHZTBP7.js";
22
22
  import "./chunk-YBW5JSA3.js";
@@ -6,8 +6,8 @@ import {
6
6
  ConnectionUseAuthorizationResult,
7
7
  ConnectionUseDenialReason,
8
8
  ConnectionUseSelectionSource
9
- } from "./chunk-AIEC5DTX.js";
10
- import "./chunk-LLFQJL3S.js";
9
+ } from "./chunk-UDKWSRES.js";
10
+ import "./chunk-YFEAAOBX.js";
11
11
  import "./chunk-4JGHSSB7.js";
12
12
  import "./chunk-5IXYF6XN.js";
13
13
  import "./chunk-NRMCVHAU.js";
@@ -22,7 +22,7 @@ import "./chunk-YRKRZ6OF.js";
22
22
  import "./chunk-2VORLN2R.js";
23
23
  import "./chunk-GRG7PHWQ.js";
24
24
  import "./chunk-YRXAWWCU.js";
25
- import "./chunk-RYEHNSO7.js";
25
+ import "./chunk-TCXCRBPF.js";
26
26
  import "./chunk-2ACYHZFB.js";
27
27
  import "./chunk-KHHZTBP7.js";
28
28
  import "./chunk-YBW5JSA3.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ConnectionMetadata
3
- } from "./chunk-LLFQJL3S.js";
3
+ } from "./chunk-YFEAAOBX.js";
4
4
  import "./chunk-4JGHSSB7.js";
5
5
  import "./chunk-5IXYF6XN.js";
6
6
  import "./chunk-NRMCVHAU.js";
@@ -18,7 +18,7 @@ import "./chunk-YRKRZ6OF.js";
18
18
  import "./chunk-2VORLN2R.js";
19
19
  import "./chunk-GRG7PHWQ.js";
20
20
  import "./chunk-YRXAWWCU.js";
21
- import "./chunk-RYEHNSO7.js";
21
+ import "./chunk-TCXCRBPF.js";
22
22
  import "./chunk-2ACYHZFB.js";
23
23
  import "./chunk-KHHZTBP7.js";
24
24
  import "./chunk-YBW5JSA3.js";
@@ -3,14 +3,14 @@ import {
3
3
  } from "./chunk-KR2V42UZ.js";
4
4
  import {
5
5
  ConnectionUseAuthoritySnapshot
6
- } from "./chunk-AIEC5DTX.js";
6
+ } from "./chunk-UDKWSRES.js";
7
7
  import {
8
8
  HostMcpCreateSelections,
9
9
  ManagedUserResourceGrantMode,
10
10
  McpServerConnectionRef,
11
11
  SessionTenancyVisibility,
12
12
  stableJson
13
- } from "./chunk-LLFQJL3S.js";
13
+ } from "./chunk-YFEAAOBX.js";
14
14
  import "./chunk-4JGHSSB7.js";
15
15
  import "./chunk-5IXYF6XN.js";
16
16
  import "./chunk-NRMCVHAU.js";
@@ -25,7 +25,7 @@ import "./chunk-YRKRZ6OF.js";
25
25
  import "./chunk-2VORLN2R.js";
26
26
  import "./chunk-GRG7PHWQ.js";
27
27
  import "./chunk-YRXAWWCU.js";
28
- import "./chunk-RYEHNSO7.js";
28
+ import "./chunk-TCXCRBPF.js";
29
29
  import "./chunk-2ACYHZFB.js";
30
30
  import "./chunk-KHHZTBP7.js";
31
31
  import "./chunk-YBW5JSA3.js";
package/dist/index.d.ts CHANGED
@@ -42,6 +42,7 @@ export * from "./editable-artifact-serialized-commit.js";
42
42
  export * from "./signup-attribution.js";
43
43
  export * from "./product-lifecycle-facts.js";
44
44
  export * from "./tool-catalog.js";
45
+ export * from "./mcp-structured-content.js";
45
46
  export * from "./mcp-oauth.js";
46
47
  export * from "./tool-result-spill.js";
47
48
  export * from "./interaction.js";
@@ -1295,8 +1296,11 @@ export declare const WorkspaceTranscriptionTarget: z.ZodObject<{
1295
1296
  }, z.core.$strict>;
1296
1297
  export type WorkspaceTranscriptionTarget = z.infer<typeof WorkspaceTranscriptionTarget>;
1297
1298
  export declare const TranscriptionErrorCode: z.ZodEnum<{
1299
+ allowance_exhausted: "allowance_exhausted";
1298
1300
  cancelled: "cancelled";
1301
+ insufficient_credits: "insufficient_credits";
1299
1302
  invalid_audio: "invalid_audio";
1303
+ monthly_model_cost_limit: "monthly_model_cost_limit";
1300
1304
  network: "network";
1301
1305
  not_supported: "not_supported";
1302
1306
  permission_denied: "permission_denied";
@@ -1310,8 +1314,11 @@ export declare const TranscriptionErrorCode: z.ZodEnum<{
1310
1314
  export type TranscriptionErrorCode = z.infer<typeof TranscriptionErrorCode>;
1311
1315
  /** Stable user-safe error codes for the native voice-input transcription path. */
1312
1316
  export declare const VoiceInputErrorCode: z.ZodEnum<{
1317
+ allowance_exhausted: "allowance_exhausted";
1313
1318
  cancelled: "cancelled";
1319
+ insufficient_credits: "insufficient_credits";
1314
1320
  invalid_audio: "invalid_audio";
1321
+ monthly_model_cost_limit: "monthly_model_cost_limit";
1315
1322
  network: "network";
1316
1323
  not_supported: "not_supported";
1317
1324
  permission_denied: "permission_denied";
@@ -1466,8 +1473,11 @@ export declare const TranscriptionEvent: z.ZodDiscriminatedUnion<[z.ZodObject<{
1466
1473
  occurredAt: z.ZodString;
1467
1474
  type: z.ZodLiteral<"session.error">;
1468
1475
  code: z.ZodEnum<{
1476
+ allowance_exhausted: "allowance_exhausted";
1469
1477
  cancelled: "cancelled";
1478
+ insufficient_credits: "insufficient_credits";
1470
1479
  invalid_audio: "invalid_audio";
1480
+ monthly_model_cost_limit: "monthly_model_cost_limit";
1471
1481
  network: "network";
1472
1482
  not_supported: "not_supported";
1473
1483
  permission_denied: "permission_denied";
@@ -1559,6 +1569,7 @@ export type WorkspaceTranscriptionPolicy = z.infer<typeof WorkspaceTranscription
1559
1569
  * preferred billing route; credentials and model configuration remain private.
1560
1570
  */
1561
1571
  export declare const VoiceInputProviderId: z.ZodEnum<{
1572
+ "azure-mai": "azure-mai";
1562
1573
  "azure-openai": "azure-openai";
1563
1574
  "codex-subscription": "codex-subscription";
1564
1575
  openai: "openai";
@@ -1568,6 +1579,7 @@ export type VoiceInputProviderId = z.infer<typeof VoiceInputProviderId>;
1568
1579
  export declare const WorkspaceVoiceInputSettings: z.ZodObject<{
1569
1580
  enabled: z.ZodBoolean;
1570
1581
  preferredProvider: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
1582
+ "azure-mai": "azure-mai";
1571
1583
  "azure-openai": "azure-openai";
1572
1584
  "codex-subscription": "codex-subscription";
1573
1585
  openai: "openai";
@@ -1969,6 +1981,7 @@ export declare const WorkspaceSessionToolDefaultsPatch: z.ZodObject<{
1969
1981
  export declare const ClientVoiceInputConfig: z.ZodObject<{
1970
1982
  available: z.ZodBoolean;
1971
1983
  providers: z.ZodOptional<z.ZodArray<z.ZodEnum<{
1984
+ "azure-mai": "azure-mai";
1972
1985
  "azure-openai": "azure-openai";
1973
1986
  "codex-subscription": "codex-subscription";
1974
1987
  openai: "openai";
@@ -2346,6 +2359,7 @@ export declare const WorkspaceSettingsSchema: z.ZodObject<{
2346
2359
  voiceInput: z.ZodOptional<z.ZodObject<{
2347
2360
  enabled: z.ZodBoolean;
2348
2361
  preferredProvider: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
2362
+ "azure-mai": "azure-mai";
2349
2363
  "azure-openai": "azure-openai";
2350
2364
  "codex-subscription": "codex-subscription";
2351
2365
  openai: "openai";
@@ -2687,6 +2701,7 @@ export declare const UpdateWorkspaceSettingsRequest: z.ZodObject<{
2687
2701
  voiceInput: z.ZodOptional<z.ZodObject<{
2688
2702
  enabled: z.ZodBoolean;
2689
2703
  preferredProvider: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
2704
+ "azure-mai": "azure-mai";
2690
2705
  "azure-openai": "azure-openai";
2691
2706
  "codex-subscription": "codex-subscription";
2692
2707
  openai: "openai";
@@ -9048,7 +9063,10 @@ export type CodexRealtimeWebrtcRequest = z.infer<typeof CodexRealtimeWebrtcReque
9048
9063
  export declare const CodexRealtimeWebrtcResponse: z.ZodObject<{
9049
9064
  sdp: z.ZodString;
9050
9065
  version: z.ZodLiteral<"v3">;
9051
- model: z.ZodLiteral<"gpt-live-1-boulder-alpha">;
9066
+ model: z.ZodEnum<{
9067
+ "gpt-live-1-boulder-alpha": "gpt-live-1-boulder-alpha";
9068
+ "opengeni-azure/gpt-live-1": "opengeni-azure/gpt-live-1";
9069
+ }>;
9052
9070
  connectionId: z.ZodString;
9053
9071
  connectionEpoch: z.ZodNumber;
9054
9072
  startupFenceSequence: z.ZodNumber;
@@ -9291,6 +9309,7 @@ export declare const SyncSessionRealtimeLedgerResponse: z.ZodObject<{
9291
9309
  export type SyncSessionRealtimeLedgerResponse = z.infer<typeof SyncSessionRealtimeLedgerResponse>;
9292
9310
  export declare const SessionRealtimeModel: z.ZodEnum<{
9293
9311
  "gpt-live-1-boulder-alpha": "gpt-live-1-boulder-alpha";
9312
+ "opengeni-azure/gpt-live-1": "opengeni-azure/gpt-live-1";
9294
9313
  "opengeni-gateway/openai/gpt-realtime-2.1": "opengeni-gateway/openai/gpt-realtime-2.1";
9295
9314
  "opengeni-gateway/openai/gpt-realtime-mini": "opengeni-gateway/openai/gpt-realtime-mini";
9296
9315
  "opengeni-gateway/xai/grok-voice-think-fast-2.0": "opengeni-gateway/xai/grok-voice-think-fast-2.0";
@@ -9303,6 +9322,7 @@ export type SessionRealtimeModel = z.infer<typeof SessionRealtimeModel>;
9303
9322
  export declare const WorkspaceRealtimeModelCatalogItem: z.ZodObject<{
9304
9323
  id: z.ZodEnum<{
9305
9324
  "gpt-live-1-boulder-alpha": "gpt-live-1-boulder-alpha";
9325
+ "opengeni-azure/gpt-live-1": "opengeni-azure/gpt-live-1";
9306
9326
  "opengeni-gateway/openai/gpt-realtime-2.1": "opengeni-gateway/openai/gpt-realtime-2.1";
9307
9327
  "opengeni-gateway/openai/gpt-realtime-mini": "opengeni-gateway/openai/gpt-realtime-mini";
9308
9328
  "opengeni-gateway/xai/grok-voice-think-fast-2.0": "opengeni-gateway/xai/grok-voice-think-fast-2.0";
@@ -9321,6 +9341,7 @@ export declare const WorkspaceRealtimeModelCatalogItem: z.ZodObject<{
9321
9341
  description: z.ZodString;
9322
9342
  available: z.ZodBoolean;
9323
9343
  unavailableReason: z.ZodNullable<z.ZodString>;
9344
+ unavailableCode: z.ZodOptional<z.ZodNullable<z.ZodString>>;
9324
9345
  recommended: z.ZodBoolean;
9325
9346
  }, z.core.$strip>;
9326
9347
  export type WorkspaceRealtimeModelCatalogItem = z.infer<typeof WorkspaceRealtimeModelCatalogItem>;
@@ -9328,6 +9349,7 @@ export declare const WorkspaceRealtimeModelCatalogResponse: z.ZodObject<{
9328
9349
  models: z.ZodArray<z.ZodObject<{
9329
9350
  id: z.ZodEnum<{
9330
9351
  "gpt-live-1-boulder-alpha": "gpt-live-1-boulder-alpha";
9352
+ "opengeni-azure/gpt-live-1": "opengeni-azure/gpt-live-1";
9331
9353
  "opengeni-gateway/openai/gpt-realtime-2.1": "opengeni-gateway/openai/gpt-realtime-2.1";
9332
9354
  "opengeni-gateway/openai/gpt-realtime-mini": "opengeni-gateway/openai/gpt-realtime-mini";
9333
9355
  "opengeni-gateway/xai/grok-voice-think-fast-2.0": "opengeni-gateway/xai/grok-voice-think-fast-2.0";
@@ -9346,6 +9368,7 @@ export declare const WorkspaceRealtimeModelCatalogResponse: z.ZodObject<{
9346
9368
  description: z.ZodString;
9347
9369
  available: z.ZodBoolean;
9348
9370
  unavailableReason: z.ZodNullable<z.ZodString>;
9371
+ unavailableCode: z.ZodOptional<z.ZodNullable<z.ZodString>>;
9349
9372
  recommended: z.ZodBoolean;
9350
9373
  }, z.core.$strip>>;
9351
9374
  }, z.core.$strip>;
@@ -9369,6 +9392,7 @@ export declare const SessionRealtimeMode: z.ZodObject<{
9369
9392
  browserInstanceId: z.ZodString;
9370
9393
  model: z.ZodEnum<{
9371
9394
  "gpt-live-1-boulder-alpha": "gpt-live-1-boulder-alpha";
9395
+ "opengeni-azure/gpt-live-1": "opengeni-azure/gpt-live-1";
9372
9396
  "opengeni-gateway/openai/gpt-realtime-2.1": "opengeni-gateway/openai/gpt-realtime-2.1";
9373
9397
  "opengeni-gateway/openai/gpt-realtime-mini": "opengeni-gateway/openai/gpt-realtime-mini";
9374
9398
  "opengeni-gateway/xai/grok-voice-think-fast-2.0": "opengeni-gateway/xai/grok-voice-think-fast-2.0";
@@ -9401,6 +9425,7 @@ export declare const BeginSessionRealtimeRequest: z.ZodObject<{
9401
9425
  operationId: z.ZodString;
9402
9426
  model: z.ZodEnum<{
9403
9427
  "gpt-live-1-boulder-alpha": "gpt-live-1-boulder-alpha";
9428
+ "opengeni-azure/gpt-live-1": "opengeni-azure/gpt-live-1";
9404
9429
  "opengeni-gateway/openai/gpt-realtime-2.1": "opengeni-gateway/openai/gpt-realtime-2.1";
9405
9430
  "opengeni-gateway/openai/gpt-realtime-mini": "opengeni-gateway/openai/gpt-realtime-mini";
9406
9431
  "opengeni-gateway/xai/grok-voice-think-fast-2.0": "opengeni-gateway/xai/grok-voice-think-fast-2.0";
@@ -9427,6 +9452,16 @@ export declare const EndSessionRealtimeRequest: z.ZodObject<{
9427
9452
  }>;
9428
9453
  }, z.core.$strip>;
9429
9454
  export type EndSessionRealtimeRequest = z.infer<typeof EndSessionRealtimeRequest>;
9455
+ /**
9456
+ * Server instruction to end a live call now. Deployment-funded voice returns
9457
+ * it from a heartbeat when credits run out; the lease is then no longer
9458
+ * extended, so the client should drain and end the call gracefully.
9459
+ */
9460
+ export declare const SessionRealtimeStopInstruction: z.ZodObject<{
9461
+ code: z.ZodString;
9462
+ message: z.ZodString;
9463
+ }, z.core.$strip>;
9464
+ export type SessionRealtimeStopInstruction = z.infer<typeof SessionRealtimeStopInstruction>;
9430
9465
  export declare const SessionRealtimeMutationResponse: z.ZodObject<{
9431
9466
  mode: z.ZodObject<{
9432
9467
  id: z.ZodString;
@@ -9435,6 +9470,7 @@ export declare const SessionRealtimeMutationResponse: z.ZodObject<{
9435
9470
  browserInstanceId: z.ZodString;
9436
9471
  model: z.ZodEnum<{
9437
9472
  "gpt-live-1-boulder-alpha": "gpt-live-1-boulder-alpha";
9473
+ "opengeni-azure/gpt-live-1": "opengeni-azure/gpt-live-1";
9438
9474
  "opengeni-gateway/openai/gpt-realtime-2.1": "opengeni-gateway/openai/gpt-realtime-2.1";
9439
9475
  "opengeni-gateway/openai/gpt-realtime-mini": "opengeni-gateway/openai/gpt-realtime-mini";
9440
9476
  "opengeni-gateway/xai/grok-voice-think-fast-2.0": "opengeni-gateway/xai/grok-voice-think-fast-2.0";
@@ -9461,6 +9497,10 @@ export declare const SessionRealtimeMutationResponse: z.ZodObject<{
9461
9497
  }>>;
9462
9498
  }, z.core.$strip>;
9463
9499
  replay: z.ZodBoolean;
9500
+ stop: z.ZodOptional<z.ZodObject<{
9501
+ code: z.ZodString;
9502
+ message: z.ZodString;
9503
+ }, z.core.$strip>>;
9464
9504
  }, z.core.$strip>;
9465
9505
  export type SessionRealtimeMutationResponse = z.infer<typeof SessionRealtimeMutationResponse>;
9466
9506
  export declare const SessionAuthorizationOperation: z.ZodEnum<{
@@ -42443,6 +42483,7 @@ export declare const ClientConfig: z.ZodObject<{
42443
42483
  voiceInput: z.ZodDefault<z.ZodObject<{
42444
42484
  available: z.ZodBoolean;
42445
42485
  providers: z.ZodOptional<z.ZodArray<z.ZodEnum<{
42486
+ "azure-mai": "azure-mai";
42446
42487
  "azure-openai": "azure-openai";
42447
42488
  "codex-subscription": "codex-subscription";
42448
42489
  openai: "openai";
package/dist/index.js CHANGED
@@ -1484,6 +1484,7 @@ import {
1484
1484
  SessionRealtimeModel,
1485
1485
  SessionRealtimeMutationResponse,
1486
1486
  SessionRealtimeState,
1487
+ SessionRealtimeStopInstruction,
1487
1488
  SessionRetryRequest,
1488
1489
  SessionRetryResponse,
1489
1490
  SessionScopeSubjectId,
@@ -2091,6 +2092,7 @@ import {
2091
2092
  normalizeWorkspaceLearningSourceKind,
2092
2093
  numberTimelineAnnotations,
2093
2094
  omitInlineWorkspaceArchiveWhenObjectRefPresent,
2095
+ omitStructuredContentTextDuplicates,
2094
2096
  parseSkillFrontmatter,
2095
2097
  parseWorkspaceArchiveDescriptor,
2096
2098
  parseWorkspaceArchiveObjectKey,
@@ -2185,7 +2187,7 @@ import {
2185
2187
  workspaceLearningPolicyRouterContext,
2186
2188
  workspaceLearningSourceKey,
2187
2189
  workspaceSlackReactionChannelAllowed
2188
- } from "./chunk-LLFQJL3S.js";
2190
+ } from "./chunk-YFEAAOBX.js";
2189
2191
  import {
2190
2192
  EPHEMERAL_CHROMIUM_DRIVER_ID,
2191
2193
  browserSessionStorageMode
@@ -2381,7 +2383,7 @@ import {
2381
2383
  toolReviewDetails,
2382
2384
  toolReviewFieldLabel,
2383
2385
  toolReviewFields
2384
- } from "./chunk-RYEHNSO7.js";
2386
+ } from "./chunk-TCXCRBPF.js";
2385
2387
  import {
2386
2388
  AUTOMATIC_SESSION_TITLE_FALLBACK,
2387
2389
  AUTOMATIC_SESSION_TITLE_MAX_GRAPHEMES,
@@ -4316,6 +4318,7 @@ export {
4316
4318
  SessionRealtimeModel,
4317
4319
  SessionRealtimeMutationResponse,
4318
4320
  SessionRealtimeState,
4321
+ SessionRealtimeStopInstruction,
4319
4322
  SessionRetryRequest,
4320
4323
  SessionRetryResponse,
4321
4324
  SessionScopeSubjectId,
@@ -5029,6 +5032,7 @@ export {
5029
5032
  normalizeWorkspaceLearningSourceKind,
5030
5033
  numberTimelineAnnotations,
5031
5034
  omitInlineWorkspaceArchiveWhenObjectRefPresent,
5035
+ omitStructuredContentTextDuplicates,
5032
5036
  openGeniSlackBotRequestedScopes,
5033
5037
  organizationAccessPresetPermissions,
5034
5038
  parseConnectorAttachmentTransferEnvelope,
@@ -0,0 +1,25 @@
1
+ import type { AttemptToolResult } from "./tool-catalog.js";
2
+ /**
3
+ * Remove the backwards-compatibility text copy of an MCP result's
4
+ * `structuredContent`.
5
+ *
6
+ * The MCP specification asks a server that returns `structuredContent` to also
7
+ * return the same value serialized in a text content block. Printing or sending
8
+ * both pays for the payload twice, and the text copy pays again for JSON string
9
+ * escaping inside the result envelope.
10
+ *
11
+ * The envelope (`content`, `structuredContent`, `_meta`, `isError`, extension
12
+ * fields) and its key order are kept. Only a plain `{type: "text", text}` block
13
+ * whose text parses as JSON to a value equal to `structuredContent` is removed.
14
+ * Prose, differing JSON, annotated text, images, resources, and every other
15
+ * block stay. A text block whose JSON carries an integer outside the IEEE-754
16
+ * safe range also stays, because its digits may be more precise than the
17
+ * parsed `structuredContent`. Numbers compare by IEEE-754 value.
18
+ *
19
+ * Results without a removable block are returned as the same object.
20
+ *
21
+ * Callers: the runtime's model-facing MCP projection, and the default
22
+ * `ogtool call` print. The native Connected Machine client implements the
23
+ * same rule in `agent/crates/opengeni-agent/src/codemode.rs`; keep them equal.
24
+ */
25
+ export declare function omitStructuredContentTextDuplicates<T extends AttemptToolResult>(result: T): T;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ConnectionMetadata
3
- } from "./chunk-LLFQJL3S.js";
3
+ } from "./chunk-YFEAAOBX.js";
4
4
  import "./chunk-4JGHSSB7.js";
5
5
  import "./chunk-5IXYF6XN.js";
6
6
  import "./chunk-NRMCVHAU.js";
@@ -15,7 +15,7 @@ import "./chunk-YRKRZ6OF.js";
15
15
  import "./chunk-2VORLN2R.js";
16
16
  import "./chunk-GRG7PHWQ.js";
17
17
  import "./chunk-YRXAWWCU.js";
18
- import "./chunk-RYEHNSO7.js";
18
+ import "./chunk-TCXCRBPF.js";
19
19
  import "./chunk-2ACYHZFB.js";
20
20
  import "./chunk-KHHZTBP7.js";
21
21
  import "./chunk-YBW5JSA3.js";
@@ -35,6 +35,7 @@ export type ToolReviewContext = z.infer<typeof ToolReviewContext>;
35
35
  export declare function toolReviewContextFromSchema(inputSchema: unknown, hints: Omit<ToolReviewContext, "fieldLabels" | "protectedFields">): ToolReviewContext;
36
36
  export declare const ToolReviewStatus: z.ZodEnum<{
37
37
  approved: "approved";
38
+ blocked: "blocked";
38
39
  cancelled: "cancelled";
39
40
  completed: "completed";
40
41
  executing: "executing";
@@ -64,6 +65,7 @@ export declare const ToolActionReview: z.ZodObject<{
64
65
  revision: z.ZodString;
65
66
  status: z.ZodEnum<{
66
67
  approved: "approved";
68
+ blocked: "blocked";
67
69
  cancelled: "cancelled";
68
70
  completed: "completed";
69
71
  executing: "executing";
@@ -5,7 +5,7 @@ import {
5
5
  toolReviewDetails,
6
6
  toolReviewFieldLabel,
7
7
  toolReviewFields
8
- } from "./chunk-RYEHNSO7.js";
8
+ } from "./chunk-TCXCRBPF.js";
9
9
  export {
10
10
  decodeReviewArguments,
11
11
  safeReviewValue,
@@ -1,7 +1,10 @@
1
1
  import { z } from "zod";
2
2
  export declare const TranscriptionRecordingErrorCode: z.ZodEnum<{
3
+ allowance_exhausted: "allowance_exhausted";
3
4
  cancelled: "cancelled";
5
+ insufficient_credits: "insufficient_credits";
4
6
  invalid_audio: "invalid_audio";
7
+ monthly_model_cost_limit: "monthly_model_cost_limit";
5
8
  network: "network";
6
9
  not_supported: "not_supported";
7
10
  permission_denied: "permission_denied";
@@ -71,8 +74,11 @@ export declare const TranscriptionRecordingSegment: z.ZodObject<{
71
74
  durationMilliseconds: z.ZodNumber;
72
75
  byteLength: z.ZodNumber;
73
76
  errorCode: z.ZodNullable<z.ZodEnum<{
77
+ allowance_exhausted: "allowance_exhausted";
74
78
  cancelled: "cancelled";
79
+ insufficient_credits: "insufficient_credits";
75
80
  invalid_audio: "invalid_audio";
81
+ monthly_model_cost_limit: "monthly_model_cost_limit";
76
82
  network: "network";
77
83
  not_supported: "not_supported";
78
84
  permission_denied: "permission_denied";
@@ -108,8 +114,11 @@ export declare const TranscriptionRecording: z.ZodObject<{
108
114
  transcriptText: z.ZodNullable<z.ZodString>;
109
115
  languages: z.ZodArray<z.ZodString>;
110
116
  errorCode: z.ZodNullable<z.ZodEnum<{
117
+ allowance_exhausted: "allowance_exhausted";
111
118
  cancelled: "cancelled";
119
+ insufficient_credits: "insufficient_credits";
112
120
  invalid_audio: "invalid_audio";
121
+ monthly_model_cost_limit: "monthly_model_cost_limit";
113
122
  network: "network";
114
123
  not_supported: "not_supported";
115
124
  permission_denied: "permission_denied";
@@ -150,8 +159,11 @@ export declare const TranscriptionRecordingResponse: z.ZodObject<{
150
159
  transcriptText: z.ZodNullable<z.ZodString>;
151
160
  languages: z.ZodArray<z.ZodString>;
152
161
  errorCode: z.ZodNullable<z.ZodEnum<{
162
+ allowance_exhausted: "allowance_exhausted";
153
163
  cancelled: "cancelled";
164
+ insufficient_credits: "insufficient_credits";
154
165
  invalid_audio: "invalid_audio";
166
+ monthly_model_cost_limit: "monthly_model_cost_limit";
155
167
  network: "network";
156
168
  not_supported: "not_supported";
157
169
  permission_denied: "permission_denied";
@@ -181,8 +193,11 @@ export declare const TranscriptionRecordingResponse: z.ZodObject<{
181
193
  durationMilliseconds: z.ZodNumber;
182
194
  byteLength: z.ZodNumber;
183
195
  errorCode: z.ZodNullable<z.ZodEnum<{
196
+ allowance_exhausted: "allowance_exhausted";
184
197
  cancelled: "cancelled";
198
+ insufficient_credits: "insufficient_credits";
185
199
  invalid_audio: "invalid_audio";
200
+ monthly_model_cost_limit: "monthly_model_cost_limit";
186
201
  network: "network";
187
202
  not_supported: "not_supported";
188
203
  permission_denied: "permission_denied";
@@ -221,8 +236,11 @@ export declare const TranscriptionRecordingListResponse: z.ZodObject<{
221
236
  transcriptText: z.ZodNullable<z.ZodString>;
222
237
  languages: z.ZodArray<z.ZodString>;
223
238
  errorCode: z.ZodNullable<z.ZodEnum<{
239
+ allowance_exhausted: "allowance_exhausted";
224
240
  cancelled: "cancelled";
241
+ insufficient_credits: "insufficient_credits";
225
242
  invalid_audio: "invalid_audio";
243
+ monthly_model_cost_limit: "monthly_model_cost_limit";
226
244
  network: "network";
227
245
  not_supported: "not_supported";
228
246
  permission_denied: "permission_denied";
@@ -264,8 +282,11 @@ export declare const UploadTranscriptionRecordingChunkResponse: z.ZodObject<{
264
282
  transcriptText: z.ZodNullable<z.ZodString>;
265
283
  languages: z.ZodArray<z.ZodString>;
266
284
  errorCode: z.ZodNullable<z.ZodEnum<{
285
+ allowance_exhausted: "allowance_exhausted";
267
286
  cancelled: "cancelled";
287
+ insufficient_credits: "insufficient_credits";
268
288
  invalid_audio: "invalid_audio";
289
+ monthly_model_cost_limit: "monthly_model_cost_limit";
269
290
  network: "network";
270
291
  not_supported: "not_supported";
271
292
  permission_denied: "permission_denied";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengeni/contracts",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "Shared zod schemas and wire-contract types for the OpenGeni API.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -423,8 +423,11 @@ export type AgentFunctionToolClass = AgentCapabilityId | "runtime" | "sandbox";
423
423
 
424
424
  /** Tools served outside the first-party MCP catalog, by the name the model sees. */
425
425
  export const AGENT_FUNCTION_TOOL_CAPABILITIES = {
426
- // Hosted provider tools.
426
+ // Web search: the provider-hosted `web_search`/`x_search` tools, or
427
+ // Opengeni's provider-agnostic `web_search` and `web_fetch` function tools
428
+ // (one transport per turn; the capability is the same).
427
429
  web_search: "webSearch",
430
+ web_fetch: "webSearch",
428
431
  x_search: "webSearch",
429
432
  image_generation: "media",
430
433
  // Runtime function tools.
package/src/index.ts CHANGED
@@ -115,6 +115,7 @@ export * from "./editable-artifact-serialized-commit";
115
115
  export * from "./signup-attribution";
116
116
  export * from "./product-lifecycle-facts";
117
117
  export * from "./tool-catalog";
118
+ export * from "./mcp-structured-content";
118
119
  export * from "./mcp-oauth";
119
120
  export * from "./tool-result-spill";
120
121
  export * from "./interaction";
@@ -1864,6 +1865,9 @@ export const TranscriptionErrorCode = z.enum([
1864
1865
  "too_large",
1865
1866
  "invalid_audio",
1866
1867
  "unknown",
1868
+ "insufficient_credits",
1869
+ "allowance_exhausted",
1870
+ "monthly_model_cost_limit",
1867
1871
  ]);
1868
1872
  export type TranscriptionErrorCode = z.infer<typeof TranscriptionErrorCode>;
1869
1873
 
@@ -2120,6 +2124,7 @@ export const VoiceInputProviderId = z.enum([
2120
2124
  "codex-subscription",
2121
2125
  "openai",
2122
2126
  "azure-openai",
2127
+ "azure-mai",
2123
2128
  ]);
2124
2129
  export type VoiceInputProviderId = z.infer<typeof VoiceInputProviderId>;
2125
2130
 
@@ -7072,7 +7077,7 @@ export const CodexRealtimeWebrtcResponse = z
7072
7077
  .min(1)
7073
7078
  .max(1024 * 1024),
7074
7079
  version: CodexRealtimeWebrtcVersion,
7075
- model: z.literal("gpt-live-1-boulder-alpha"),
7080
+ model: z.enum(["gpt-live-1-boulder-alpha", "opengeni-azure/gpt-live-1"]),
7076
7081
  connectionId: z.string().uuid(),
7077
7082
  connectionEpoch: z.number().int().positive(),
7078
7083
  startupFenceSequence: z.number().int().nonnegative(),
@@ -7229,6 +7234,7 @@ export const SyncSessionRealtimeLedgerResponse = z
7229
7234
  export type SyncSessionRealtimeLedgerResponse = z.infer<typeof SyncSessionRealtimeLedgerResponse>;
7230
7235
 
7231
7236
  export const SessionRealtimeModel = z.enum([
7237
+ "opengeni-azure/gpt-live-1",
7232
7238
  "gpt-live-1-boulder-alpha",
7233
7239
  "supergrok/grok-voice-think-fast-2.0",
7234
7240
  "opengeni-gateway/openai/gpt-realtime-2.1",
@@ -7247,6 +7253,12 @@ export const WorkspaceRealtimeModelCatalogItem = z.object({
7247
7253
  description: z.string().min(1),
7248
7254
  available: z.boolean(),
7249
7255
  unavailableReason: z.string().nullable(),
7256
+ /**
7257
+ * Machine-readable reason when unavailable. Credit refusals use the same
7258
+ * codes as voice input (`insufficient_credits`, `allowance_exhausted`,
7259
+ * `monthly_model_cost_limit`).
7260
+ */
7261
+ unavailableCode: z.string().min(1).max(64).nullable().optional(),
7250
7262
  recommended: z.boolean(),
7251
7263
  });
7252
7264
  export type WorkspaceRealtimeModelCatalogItem = z.infer<typeof WorkspaceRealtimeModelCatalogItem>;
@@ -7302,9 +7314,21 @@ export const EndSessionRealtimeRequest = RenewSessionRealtimeRequest.extend({
7302
7314
  });
7303
7315
  export type EndSessionRealtimeRequest = z.infer<typeof EndSessionRealtimeRequest>;
7304
7316
 
7317
+ /**
7318
+ * Server instruction to end a live call now. Deployment-funded voice returns
7319
+ * it from a heartbeat when credits run out; the lease is then no longer
7320
+ * extended, so the client should drain and end the call gracefully.
7321
+ */
7322
+ export const SessionRealtimeStopInstruction = z.object({
7323
+ code: z.string().min(1).max(64),
7324
+ message: z.string().min(1).max(512),
7325
+ });
7326
+ export type SessionRealtimeStopInstruction = z.infer<typeof SessionRealtimeStopInstruction>;
7327
+
7305
7328
  export const SessionRealtimeMutationResponse = z.object({
7306
7329
  mode: SessionRealtimeMode,
7307
7330
  replay: z.boolean(),
7331
+ stop: SessionRealtimeStopInstruction.optional(),
7308
7332
  });
7309
7333
  export type SessionRealtimeMutationResponse = z.infer<typeof SessionRealtimeMutationResponse>;
7310
7334
 
@@ -0,0 +1,81 @@
1
+ import type { AttemptToolResult } from "./tool-catalog";
2
+
3
+ /**
4
+ * Remove the backwards-compatibility text copy of an MCP result's
5
+ * `structuredContent`.
6
+ *
7
+ * The MCP specification asks a server that returns `structuredContent` to also
8
+ * return the same value serialized in a text content block. Printing or sending
9
+ * both pays for the payload twice, and the text copy pays again for JSON string
10
+ * escaping inside the result envelope.
11
+ *
12
+ * The envelope (`content`, `structuredContent`, `_meta`, `isError`, extension
13
+ * fields) and its key order are kept. Only a plain `{type: "text", text}` block
14
+ * whose text parses as JSON to a value equal to `structuredContent` is removed.
15
+ * Prose, differing JSON, annotated text, images, resources, and every other
16
+ * block stay. A text block whose JSON carries an integer outside the IEEE-754
17
+ * safe range also stays, because its digits may be more precise than the
18
+ * parsed `structuredContent`. Numbers compare by IEEE-754 value.
19
+ *
20
+ * Results without a removable block are returned as the same object.
21
+ *
22
+ * Callers: the runtime's model-facing MCP projection, and the default
23
+ * `ogtool call` print. The native Connected Machine client implements the
24
+ * same rule in `agent/crates/opengeni-agent/src/codemode.rs`; keep them equal.
25
+ */
26
+ export function omitStructuredContentTextDuplicates<T extends AttemptToolResult>(result: T): T {
27
+ const structured: unknown = result.structuredContent;
28
+ if (structured === undefined || structured === null) return result;
29
+ const content = result.content.filter(
30
+ (entry) => !isPlainTextBlock(entry) || !textDuplicatesStructuredContent(entry.text, structured),
31
+ );
32
+ if (content.length === result.content.length) return result;
33
+ return { ...result, content };
34
+ }
35
+
36
+ function isPlainTextBlock(entry: unknown): entry is { type: "text"; text: string } {
37
+ if (!entry || typeof entry !== "object" || Array.isArray(entry)) return false;
38
+ const record = entry as Record<string, unknown>;
39
+ if (record.type !== "text" || typeof record.text !== "string") return false;
40
+ // Annotations or _meta are block-level facts the structured value lacks.
41
+ return Object.keys(record).every((key) => key === "type" || key === "text");
42
+ }
43
+
44
+ function textDuplicatesStructuredContent(text: string, structured: unknown): boolean {
45
+ const trimmed = text.replace(/^[ \t\n\r]+/u, "");
46
+ if (!trimmed.startsWith("{") && !trimmed.startsWith("[")) return false;
47
+ let parsed: unknown;
48
+ try {
49
+ parsed = JSON.parse(text);
50
+ } catch {
51
+ return false;
52
+ }
53
+ return !containsUnsafeInteger(parsed) && jsonValuesEqual(parsed, structured);
54
+ }
55
+
56
+ function containsUnsafeInteger(value: unknown): boolean {
57
+ if (typeof value === "number") return Number.isInteger(value) && !Number.isSafeInteger(value);
58
+ if (Array.isArray(value)) return value.some(containsUnsafeInteger);
59
+ if (value && typeof value === "object") return Object.values(value).some(containsUnsafeInteger);
60
+ return false;
61
+ }
62
+
63
+ function jsonValuesEqual(left: unknown, right: unknown): boolean {
64
+ if (left === right) return true;
65
+ if (typeof left !== "object" || typeof right !== "object" || left === null || right === null) {
66
+ return false;
67
+ }
68
+ if (Array.isArray(left) || Array.isArray(right)) {
69
+ if (!Array.isArray(left) || !Array.isArray(right) || left.length !== right.length) {
70
+ return false;
71
+ }
72
+ return left.every((entry, index) => jsonValuesEqual(entry, right[index]));
73
+ }
74
+ const leftRecord = left as Record<string, unknown>;
75
+ const rightRecord = right as Record<string, unknown>;
76
+ const leftKeys = Object.keys(leftRecord);
77
+ if (leftKeys.length !== Object.keys(rightRecord).length) return false;
78
+ return leftKeys.every(
79
+ (key) => Object.hasOwn(rightRecord, key) && jsonValuesEqual(leftRecord[key], rightRecord[key]),
80
+ );
81
+ }