@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.
@@ -500,6 +500,7 @@ export type AgentFunctionToolClass = AgentCapabilityId | "runtime" | "sandbox";
500
500
  /** Tools served outside the first-party MCP catalog, by the name the model sees. */
501
501
  export declare const AGENT_FUNCTION_TOOL_CAPABILITIES: {
502
502
  readonly web_search: "webSearch";
503
+ readonly web_fetch: "webSearch";
503
504
  readonly x_search: "webSearch";
504
505
  readonly image_generation: "media";
505
506
  readonly request_human_input: "humanInput";
package/dist/atlassian.js CHANGED
@@ -17,7 +17,7 @@ import {
17
17
  AtlassianSyncCadence,
18
18
  SaveAtlassianSourcesRequest,
19
19
  atlassianScopesAllowRead
20
- } from "./chunk-LLFQJL3S.js";
20
+ } from "./chunk-YFEAAOBX.js";
21
21
  import "./chunk-4JGHSSB7.js";
22
22
  import "./chunk-5IXYF6XN.js";
23
23
  import "./chunk-NRMCVHAU.js";
@@ -32,7 +32,7 @@ import "./chunk-YRKRZ6OF.js";
32
32
  import "./chunk-2VORLN2R.js";
33
33
  import "./chunk-GRG7PHWQ.js";
34
34
  import "./chunk-YRXAWWCU.js";
35
- import "./chunk-RYEHNSO7.js";
35
+ import "./chunk-TCXCRBPF.js";
36
36
  import "./chunk-2ACYHZFB.js";
37
37
  import "./chunk-KHHZTBP7.js";
38
38
  import "./chunk-YBW5JSA3.js";
@@ -3,7 +3,13 @@ var protectedName = /password|passwd|secret|credential|authorization|cookie|(^|[
3
3
  var protectedReviewField = (key, fields = []) => protectedName.test(key) || fields.includes(key) || fields.includes("*");
4
4
  var bound = (value, limit) => value.length > limit ? `${value.slice(0, limit)}\u2026` : value;
5
5
  function toolReviewFieldLabel(key) {
6
- const label = key.replace(/([a-z0-9])([A-Z])/g, "$1 $2").replace(/[_-]+/g, " ").replace(/\bids?\b/gi, (word) => word.length === 3 ? "IDs" : "ID");
6
+ const label = key.replace(/([a-z0-9])([A-Z])/g, "$1 $2").replace(/[_-]+/g, " ").replace(/\bids?\b/gi, (word) => word.length === 3 ? "IDs" : "ID").replace(
7
+ /\b(api|url|uri|http|https|ip|sql|json|html)(s?)\b/gi,
8
+ (_word, name, plural) => `${name.toUpperCase()}${plural}`
9
+ ).replace(
10
+ /(?<=\S\s+)([A-Z])([a-z]+)\b/g,
11
+ (_word, first, rest) => `${first.toLowerCase()}${rest}`
12
+ ).trim();
7
13
  return label.charAt(0).toUpperCase() + label.slice(1);
8
14
  }
9
15
  function decodeReviewArguments(value) {
@@ -46,8 +52,29 @@ function toolReviewFields(argumentsValue, context) {
46
52
  const fields = [
47
53
  ...email.fields.filter(
48
54
  (field) => field.path !== "/contentSha256" && field.path !== "/htmlBody" && field.preview !== ""
49
- ).map((field) => ({ ...field, path: `/$email${field.path}` })),
50
- ...original.fields
55
+ ).map((field) => ({
56
+ ...field,
57
+ label: field.path === "/textBody" ? "Message" : field.label,
58
+ path: `/$email${field.path}`,
59
+ ...field.path === "/attachments" ? {
60
+ preview: context.email.attachments.map((attachment) => attachment.name).join(", ").slice(0, 240)
61
+ } : {}
62
+ })),
63
+ ...original.fields.filter(
64
+ (field) => ![
65
+ "/raw",
66
+ "/expectedContentSha256",
67
+ "/from",
68
+ "/to",
69
+ "/cc",
70
+ "/bcc",
71
+ "/subject",
72
+ "/body",
73
+ "/textBody",
74
+ "/htmlBody",
75
+ "/attachments"
76
+ ].includes(field.path)
77
+ )
51
78
  ];
52
79
  return {
53
80
  fields: fields.slice(0, 16),
@@ -59,8 +86,11 @@ function toolReviewFields(argumentsValue, context) {
59
86
  fields: entries.slice(0, 16).map(([key, value], index) => {
60
87
  const hidden = protectedReviewField(key, context?.protectedFields);
61
88
  const safe = hidden ? "[Protected value]" : value;
62
- const count = Array.isArray(value) ? value.length : void 0;
63
- const text = count !== void 0 ? `${count.toLocaleString("en-US")} item${count === 1 ? "" : "s"}` : safe && typeof safe === "object" ? `${Object.keys(safe).length} field${Object.keys(safe).length === 1 ? "" : "s"}` : valueText(safe);
89
+ const count = !hidden && Array.isArray(value) ? value.length : void 0;
90
+ const compactList = !hidden && Array.isArray(value) && value.length > 0 && value.length <= 4 && value.every(
91
+ (entry) => typeof entry === "string" || typeof entry === "number" || typeof entry === "boolean"
92
+ ) ? value.map(valueText).join(", ") : void 0;
93
+ const text = compactList !== void 0 ? compactList : count !== void 0 ? `${count.toLocaleString("en-US")} item${count === 1 ? "" : "s"}` : safe && typeof safe === "object" ? `${Object.keys(safe).length} field${Object.keys(safe).length === 1 ? "" : "s"}` : valueText(safe);
64
94
  return {
65
95
  path: fieldPointer(key, index),
66
96
  label: bound(
@@ -69,7 +99,7 @@ function toolReviewFields(argumentsValue, context) {
69
99
  ),
70
100
  preview: bound(text, 240),
71
101
  ...count !== void 0 ? { count } : {},
72
- truncated: !hidden && (text.length > 240 || typeof value === "object" && value !== null),
102
+ truncated: !hidden && (text.length > 240 || compactList === void 0 && typeof value === "object" && value !== null),
73
103
  ...hidden ? { protected: true } : {}
74
104
  };
75
105
  })
@@ -77,7 +107,12 @@ function toolReviewFields(argumentsValue, context) {
77
107
  }
78
108
  function toolReviewAction(toolName, argumentsValue, context) {
79
109
  const fallback = {
80
- title: context?.title ?? bound(toolReviewFieldLabel(toolName.replace(/^mcp_[^_]+__/, "")), 256),
110
+ title: context?.title ?? bound(
111
+ toolReviewFieldLabel(
112
+ toolName.replace(/^mcp_[^_]+__/, "").replace(/^batch[_-](?=[a-z])/i, "")
113
+ ),
114
+ 256
115
+ ),
81
116
  approveLabel: "Approve action",
82
117
  effects: []
83
118
  };
@@ -88,7 +123,7 @@ function toolReviewAction(toolName, argumentsValue, context) {
88
123
  const selectionKind = thread ? "threads" : "messages";
89
124
  const ids = thread && typeof args.threadId === "string" ? [args.threadId] : Array.isArray(args.messageIds) ? args.messageIds : typeof args.messageId === "string" ? [args.messageId] : null;
90
125
  const selectionCount = ids?.every((id) => typeof id === "string") ? new Set(ids).size : void 0;
91
- const noun = selectionCount === void 0 ? selectionKind : `${selectionCount.toLocaleString("en-US")} ${thread ? "thread" : "message"}${selectionCount === 1 ? "" : "s"}`;
126
+ const noun = selectionCount === void 0 ? thread ? "conversations" : "messages" : `${selectionCount.toLocaleString("en-US")} ${thread ? "conversation" : "message"}${selectionCount === 1 ? "" : "s"}`;
92
127
  const addValues = toolName.startsWith("label_") ? args.labelIds : args.addLabelIds;
93
128
  const adds = Array.isArray(addValues) ? addValues.filter((v) => typeof v === "string") : [];
94
129
  const removeValues = toolName.startsWith("unlabel_") ? args.labelIds : args.removeLabelIds;
@@ -123,7 +158,7 @@ function toolReviewAction(toolName, argumentsValue, context) {
123
158
  approveLabel: trash ? "Move to Trash" : "Apply changes",
124
159
  effects,
125
160
  ...selectionCount === void 0 ? {} : { selectionCount, selectionKind },
126
- ...trash ? { consequence: "Messages stay recoverable in Trash until Gmail deletes them." } : thread ? { consequence: "Applies to every message in the selected thread." } : {}
161
+ ...trash ? { consequence: "Messages stay recoverable in Trash until Gmail deletes them." } : thread ? { consequence: "Applies to every message in the conversation." } : {}
127
162
  };
128
163
  }
129
164
  if (["trash_message", "restore_message", "trash_thread", "restore_thread"].includes(toolName))
@@ -229,4 +264,4 @@ export {
229
264
  toolReviewAction,
230
265
  toolReviewDetails
231
266
  };
232
- //# sourceMappingURL=chunk-RYEHNSO7.js.map
267
+ //# sourceMappingURL=chunk-TCXCRBPF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tool-review-presentation.ts"],"sourcesContent":["import type {\n ToolActionReview,\n ToolReviewContext,\n ToolReviewDetailsPage,\n} from \"./tool-action-review\";\n\nconst protectedName =\n /password|passwd|secret|credential|authorization|cookie|(^|[_-])token($|[_-])|api[_-]?key|accessToken|refreshToken|privateKey/i;\nconst protectedReviewField = (key: string, fields: readonly string[] = []) =>\n protectedName.test(key) || fields.includes(key) || fields.includes(\"*\");\nconst bound = (value: string, limit: number) =>\n value.length > limit ? `${value.slice(0, limit)}…` : value;\nexport function toolReviewFieldLabel(key: string): string {\n const label = key\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[_-]+/g, \" \")\n .replace(/\\bids?\\b/gi, (word) => (word.length === 3 ? \"IDs\" : \"ID\"))\n .replace(\n /\\b(api|url|uri|http|https|ip|sql|json|html)(s?)\\b/gi,\n (_word, name: string, plural: string) => `${name.toUpperCase()}${plural}`,\n )\n // Sentence case, keeping acronyms: \"Working Directory\" → \"Working directory\".\n .replace(\n /(?<=\\S\\s+)([A-Z])([a-z]+)\\b/g,\n (_word, first: string, rest: string) => `${first.toLowerCase()}${rest}`,\n )\n .trim();\n return label.charAt(0).toUpperCase() + label.slice(1);\n}\nexport function decodeReviewArguments(value: unknown): Record<string, unknown> | null {\n // Historical SDK entries sometimes wrapped arguments in JSON. Decode only once.\n let decoded = value;\n if (typeof decoded === \"string\") {\n try {\n decoded = JSON.parse(decoded);\n } catch {\n return null;\n }\n }\n return decoded && typeof decoded === \"object\" && !Array.isArray(decoded)\n ? (decoded as Record<string, unknown>)\n : null;\n}\nexport function safeReviewValue(\n value: unknown,\n key = \"\",\n protectedFields: readonly string[] = [],\n depth = 0,\n): unknown {\n if (protectedReviewField(key, protectedFields)) return \"[Protected value]\";\n if (depth > 20) return \"[Nested value; open this field for details]\";\n if (Array.isArray(value))\n return value.map((entry) => safeReviewValue(entry, \"\", protectedFields, depth + 1));\n if (value && typeof value === \"object\")\n return Object.fromEntries(\n Object.entries(value).map(([name, entry]) => [\n name,\n safeReviewValue(entry, name, protectedFields, depth + 1),\n ]),\n );\n return value;\n}\nfunction valueText(value: unknown): string {\n return typeof value === \"string\"\n ? value\n : value === null\n ? \"None\"\n : typeof value === \"boolean\"\n ? value\n ? \"Yes\"\n : \"No\"\n : (JSON.stringify(value) ?? \"Unavailable\");\n}\nconst pointer = (name: string) => `/${name.replaceAll(\"~\", \"~0\").replaceAll(\"/\", \"~1\")}`;\n// Long arbitrary property names remain readable without placing them in every\n// preview or URL. An indexed segment opens their saved name and value together.\nconst fieldPointer = (key: string, index: number, parent = \"\") =>\n pointer(key).length > 256 || parent.length + pointer(key).length > 1024\n ? `/~2${index}`\n : pointer(key);\n\nexport function toolReviewFields(\n argumentsValue: unknown,\n context?: ToolReviewContext,\n): { fields: ToolActionReview[\"fields\"]; moreFields: number } {\n const args = decodeReviewArguments(argumentsValue);\n if (!args) return { fields: [], moreFields: 0 };\n const entries = Object.entries(args);\n if (context?.email) {\n const email = toolReviewFields(context.email);\n const original = toolReviewFields(args, { ...context, email: undefined });\n const fields = [\n ...email.fields\n .filter(\n (field) =>\n field.path !== \"/contentSha256\" && field.path !== \"/htmlBody\" && field.preview !== \"\",\n )\n .map((field) => ({\n ...field,\n label: field.path === \"/textBody\" ? \"Message\" : field.label,\n path: `/$email${field.path}`,\n ...(field.path === \"/attachments\"\n ? {\n preview: context\n .email!.attachments.map((attachment) => attachment.name)\n .join(\", \")\n .slice(0, 240),\n }\n : {}),\n })),\n ...original.fields.filter(\n (field) =>\n ![\n \"/raw\",\n \"/expectedContentSha256\",\n \"/from\",\n \"/to\",\n \"/cc\",\n \"/bcc\",\n \"/subject\",\n \"/body\",\n \"/textBody\",\n \"/htmlBody\",\n \"/attachments\",\n ].includes(field.path),\n ),\n ];\n return {\n fields: fields.slice(0, 16),\n moreFields: original.moreFields + Math.max(0, fields.length - 16),\n };\n }\n return {\n moreFields: Math.max(0, entries.length - 16),\n fields: entries.slice(0, 16).map(([key, value], index) => {\n const hidden = protectedReviewField(key, context?.protectedFields);\n const safe = hidden ? \"[Protected value]\" : value;\n const count = !hidden && Array.isArray(value) ? value.length : undefined;\n const compactList =\n !hidden &&\n Array.isArray(value) &&\n value.length > 0 &&\n value.length <= 4 &&\n value.every(\n (entry) =>\n typeof entry === \"string\" || typeof entry === \"number\" || typeof entry === \"boolean\",\n )\n ? value.map(valueText).join(\", \")\n : undefined;\n const text =\n compactList !== undefined\n ? compactList\n : count !== undefined\n ? `${count.toLocaleString(\"en-US\")} item${count === 1 ? \"\" : \"s\"}`\n : safe && typeof safe === \"object\"\n ? `${Object.keys(safe).length} field${Object.keys(safe).length === 1 ? \"\" : \"s\"}`\n : valueText(safe);\n return {\n path: fieldPointer(key, index),\n label: bound(\n (context?.fieldLabels && Object.hasOwn(context.fieldLabels, key)\n ? context.fieldLabels[key]\n : undefined) ?? toolReviewFieldLabel(key),\n 256,\n ),\n preview: bound(text, 240),\n ...(count !== undefined ? { count } : {}),\n truncated:\n !hidden &&\n (text.length > 240 ||\n (compactList === undefined && typeof value === \"object\" && value !== null)),\n ...(hidden ? { protected: true } : {}),\n };\n }),\n };\n}\n\n/** Deterministic consequences from the reviewed bytes. Unknown fields remain visible. */\nexport function toolReviewAction(\n toolName: string,\n argumentsValue: unknown,\n context?: ToolReviewContext,\n): Pick<\n ToolActionReview,\n \"title\" | \"approveLabel\" | \"effects\" | \"consequence\" | \"selectionCount\" | \"selectionKind\"\n> {\n const fallback = {\n title:\n context?.title ??\n bound(\n toolReviewFieldLabel(\n toolName.replace(/^mcp_[^_]+__/, \"\").replace(/^batch[_-](?=[a-z])/i, \"\"),\n ),\n 256,\n ),\n approveLabel: \"Approve action\",\n effects: [] as string[],\n };\n if (context?.kind !== \"gmail\") return fallback;\n const args = decodeReviewArguments(argumentsValue);\n if (!args) return fallback;\n const thread = toolName.endsWith(\"_thread\");\n const selectionKind = thread ? (\"threads\" as const) : (\"messages\" as const);\n const ids =\n thread && typeof args.threadId === \"string\"\n ? [args.threadId]\n : Array.isArray(args.messageIds)\n ? args.messageIds\n : typeof args.messageId === \"string\"\n ? [args.messageId]\n : null;\n const selectionCount = ids?.every((id) => typeof id === \"string\") ? new Set(ids).size : undefined;\n const noun =\n selectionCount === undefined\n ? thread\n ? \"conversations\"\n : \"messages\"\n : `${selectionCount.toLocaleString(\"en-US\")} ${thread ? \"conversation\" : \"message\"}${selectionCount === 1 ? \"\" : \"s\"}`;\n const addValues = toolName.startsWith(\"label_\") ? args.labelIds : args.addLabelIds;\n const adds = Array.isArray(addValues)\n ? addValues.filter((v): v is string => typeof v === \"string\")\n : [];\n const removeValues = toolName.startsWith(\"unlabel_\") ? args.labelIds : args.removeLabelIds;\n const removes = Array.isArray(removeValues)\n ? removeValues.filter((v): v is string => typeof v === \"string\")\n : [];\n const labelEffect = (label: string, adding: boolean): string => {\n const known: Record<string, [string, string]> = {\n TRASH: [\"Move to Trash\", \"Remove from Trash\"],\n INBOX: [\"Move to Inbox\", \"Remove from Inbox\"],\n UNREAD: [\"Mark as unread\", \"Mark as read\"],\n STARRED: [\"Add star\", \"Remove star\"],\n SPAM: [\"Mark as spam\", \"Remove from Spam\"],\n IMPORTANT: [\"Mark as important\", \"Remove importance\"],\n };\n return (\n (Object.hasOwn(known, label) ? known[label]?.[adding ? 0 : 1] : undefined) ??\n `${adding ? \"Add\" : \"Remove\"} label ${bound(label, 120)}`\n );\n };\n const effects = [\n ...adds.map((id) => labelEffect(id, true)),\n ...removes.map((id) => labelEffect(id, false)),\n ];\n if (\n [\n \"batch_modify_messages\",\n \"modify_message\",\n \"modify_thread\",\n \"label_message\",\n \"label_thread\",\n \"unlabel_message\",\n \"unlabel_thread\",\n ].includes(toolName)\n ) {\n const trash = adds.includes(\"TRASH\");\n return {\n title: trash ? `Move ${noun} to Trash` : `Update ${noun}`,\n approveLabel: trash ? \"Move to Trash\" : \"Apply changes\",\n effects,\n ...(selectionCount === undefined ? {} : { selectionCount, selectionKind }),\n ...(trash\n ? { consequence: \"Messages stay recoverable in Trash until Gmail deletes them.\" }\n : thread\n ? { consequence: \"Applies to every message in the conversation.\" }\n : {}),\n };\n }\n if ([\"trash_message\", \"restore_message\", \"trash_thread\", \"restore_thread\"].includes(toolName))\n return {\n title: toolName.startsWith(\"trash_\") ? `Move ${noun} to Trash` : `Remove ${noun} from Trash`,\n approveLabel: toolName.startsWith(\"trash_\") ? \"Move to Trash\" : \"Remove from Trash\",\n effects,\n ...(selectionCount === undefined ? {} : { selectionCount, selectionKind }),\n };\n const named: Record<string, [string, string]> = {\n send_message: [\"Send email\", \"Send email\"],\n send_draft: [\"Send draft\", \"Send draft\"],\n create_draft: [\"Create email draft\", \"Create draft\"],\n update_draft: [\"Update email draft\", \"Update draft\"],\n delete_draft: [\"Delete email draft\", \"Delete draft\"],\n create_label: [\"Create label\", \"Create label\"],\n update_label: [\"Update label\", \"Update label\"],\n delete_label: [\"Delete label\", \"Delete label\"],\n };\n const action = Object.hasOwn(named, toolName) ? named[toolName] : undefined;\n return action ? { title: action[0], approveLabel: action[1], effects } : fallback;\n}\n\n/** A bounded slice of the immutable saved arguments; never evaluates a fresh provider query. */\nexport function toolReviewDetails(\n argumentsValue: unknown,\n context: ToolReviewContext | undefined,\n path: string,\n offset: number,\n limit = 25,\n): Omit<ToolReviewDetailsPage, \"id\" | \"actionDigest\" | \"version\"> {\n if (\n !Number.isSafeInteger(offset) ||\n offset < 0 ||\n !Number.isSafeInteger(limit) ||\n limit < 1 ||\n limit > 50\n )\n throw new Error(\"Invalid review page\");\n const args = decodeReviewArguments(argumentsValue);\n let value: unknown = context?.email ? { ...args, $email: context.email } : args;\n if (path !== \"\") {\n if (!path.startsWith(\"/\")) throw new Error(\"Invalid review field\");\n for (const escaped of path.slice(1).split(\"/\")) {\n if (/^~2\\d+$/.test(escaped)) {\n if (!value || typeof value !== \"object\" || Array.isArray(value))\n throw new Error(\"Review field not found\");\n const selected = Object.entries(value)[Number(escaped.slice(2))];\n if (!selected) throw new Error(\"Review field not found\");\n value = {\n fieldName: selected[0],\n value: protectedReviewField(selected[0], context?.protectedFields)\n ? \"[Protected value]\"\n : selected[1],\n };\n continue;\n }\n const key = escaped.replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\");\n if (protectedReviewField(key, context?.protectedFields)) {\n value = \"[Protected value]\";\n break;\n }\n if (!value || typeof value !== \"object\" || !Object.hasOwn(value, key))\n throw new Error(\"Review field not found\");\n value = (value as Record<string, unknown>)[key];\n }\n }\n type DetailItem = ToolReviewDetailsPage[\"items\"][number];\n const preview = (\n entry: unknown,\n key: string,\n childPath: string,\n ): Pick<DetailItem, \"value\" | \"truncated\" | \"path\"> => {\n const hidden = protectedReviewField(key, context?.protectedFields);\n if (!hidden && entry !== null && typeof entry === \"object\") {\n const count = Array.isArray(entry) ? entry.length : Object.keys(entry).length;\n return {\n value: `${count.toLocaleString(\"en-US\")} ${Array.isArray(entry) ? (count === 1 ? \"item\" : \"items\") : count === 1 ? \"field\" : \"fields\"}`,\n path: childPath,\n truncated: true,\n };\n }\n const text = valueText(safeReviewValue(entry, key, context?.protectedFields));\n return {\n value: bound(text, 4000),\n ...(hidden ? {} : { path: childPath }),\n truncated: !hidden && text.length > 4000,\n };\n };\n let total: number;\n let items: DetailItem[];\n if (Array.isArray(value)) {\n total = value.length;\n items = value.slice(offset, offset + limit).map((entry, index) => ({\n label: `${offset + index + 1}`,\n ...preview(entry, \"\", `${path}/${offset + index}`),\n }));\n } else if (value && typeof value === \"object\") {\n const entries = Object.entries(value);\n total = entries.length;\n items = entries.slice(offset, offset + limit).map(([key, entry], index) => ({\n label: bound(\n (context?.fieldLabels && Object.hasOwn(context.fieldLabels, key)\n ? context.fieldLabels[key]\n : undefined) ?? toolReviewFieldLabel(key),\n 256,\n ),\n ...preview(entry, key, `${path}${fieldPointer(key, offset + index, path)}`),\n }));\n } else {\n const text = valueText(value);\n total = Math.max(1, Math.ceil(text.length / 4000));\n items = Array.from({ length: Math.max(0, Math.min(limit, total - offset)) }, (_, index) => ({\n label: `Part ${offset + index + 1}`,\n value: text.slice((offset + index) * 4000, (offset + index + 1) * 4000),\n }));\n }\n return { path, items, total, nextOffset: offset + limit < total ? offset + limit : null };\n}\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  ConnectionKind,
3
3
  SessionTenancyVisibility
4
- } from "./chunk-LLFQJL3S.js";
4
+ } from "./chunk-YFEAAOBX.js";
5
5
 
6
6
  // src/connection-authority.ts
7
7
  import { z } from "zod";
@@ -183,4 +183,4 @@ export {
183
183
  ConnectionUseAuditFact,
184
184
  ConnectionUseAuthorizationResult
185
185
  };
186
- //# sourceMappingURL=chunk-AIEC5DTX.js.map
186
+ //# sourceMappingURL=chunk-UDKWSRES.js.map
@@ -1337,8 +1337,11 @@ var FIRST_PARTY_MCP_TOOL_CAPABILITIES = {
1337
1337
  editable_artifact_export_status: "artifacts"
1338
1338
  };
1339
1339
  var AGENT_FUNCTION_TOOL_CAPABILITIES = {
1340
- // Hosted provider tools.
1340
+ // Web search: the provider-hosted `web_search`/`x_search` tools, or
1341
+ // Opengeni's provider-agnostic `web_search` and `web_fetch` function tools
1342
+ // (one transport per turn; the capability is the same).
1341
1343
  web_search: "webSearch",
1344
+ web_fetch: "webSearch",
1342
1345
  x_search: "webSearch",
1343
1346
  image_generation: "media",
1344
1347
  // Runtime function tools.
@@ -3940,7 +3943,10 @@ var TranscriptionRecordingErrorCode = z24.enum([
3940
3943
  "unavailable",
3941
3944
  "too_large",
3942
3945
  "invalid_audio",
3943
- "unknown"
3946
+ "unknown",
3947
+ "insufficient_credits",
3948
+ "allowance_exhausted",
3949
+ "monthly_model_cost_limit"
3944
3950
  ]);
3945
3951
  var TranscriptionRecordingState = z24.enum([
3946
3952
  "uploading",
@@ -5018,6 +5024,59 @@ var CodemodeDispatchAck = z31.object({
5018
5024
  status: z31.enum(["accepted", "already_running", "terminal", "unavailable", "rejected"])
5019
5025
  }).strict();
5020
5026
 
5027
+ // src/mcp-structured-content.ts
5028
+ function omitStructuredContentTextDuplicates(result) {
5029
+ const structured = result.structuredContent;
5030
+ if (structured === void 0 || structured === null) return result;
5031
+ const content = result.content.filter(
5032
+ (entry) => !isPlainTextBlock(entry) || !textDuplicatesStructuredContent(entry.text, structured)
5033
+ );
5034
+ if (content.length === result.content.length) return result;
5035
+ return { ...result, content };
5036
+ }
5037
+ function isPlainTextBlock(entry) {
5038
+ if (!entry || typeof entry !== "object" || Array.isArray(entry)) return false;
5039
+ const record = entry;
5040
+ if (record.type !== "text" || typeof record.text !== "string") return false;
5041
+ return Object.keys(record).every((key) => key === "type" || key === "text");
5042
+ }
5043
+ function textDuplicatesStructuredContent(text, structured) {
5044
+ const trimmed = text.replace(/^[ \t\n\r]+/u, "");
5045
+ if (!trimmed.startsWith("{") && !trimmed.startsWith("[")) return false;
5046
+ let parsed;
5047
+ try {
5048
+ parsed = JSON.parse(text);
5049
+ } catch {
5050
+ return false;
5051
+ }
5052
+ return !containsUnsafeInteger(parsed) && jsonValuesEqual(parsed, structured);
5053
+ }
5054
+ function containsUnsafeInteger(value) {
5055
+ if (typeof value === "number") return Number.isInteger(value) && !Number.isSafeInteger(value);
5056
+ if (Array.isArray(value)) return value.some(containsUnsafeInteger);
5057
+ if (value && typeof value === "object") return Object.values(value).some(containsUnsafeInteger);
5058
+ return false;
5059
+ }
5060
+ function jsonValuesEqual(left, right) {
5061
+ if (left === right) return true;
5062
+ if (typeof left !== "object" || typeof right !== "object" || left === null || right === null) {
5063
+ return false;
5064
+ }
5065
+ if (Array.isArray(left) || Array.isArray(right)) {
5066
+ if (!Array.isArray(left) || !Array.isArray(right) || left.length !== right.length) {
5067
+ return false;
5068
+ }
5069
+ return left.every((entry, index) => jsonValuesEqual(entry, right[index]));
5070
+ }
5071
+ const leftRecord = left;
5072
+ const rightRecord = right;
5073
+ const leftKeys = Object.keys(leftRecord);
5074
+ if (leftKeys.length !== Object.keys(rightRecord).length) return false;
5075
+ return leftKeys.every(
5076
+ (key) => Object.hasOwn(rightRecord, key) && jsonValuesEqual(leftRecord[key], rightRecord[key])
5077
+ );
5078
+ }
5079
+
5021
5080
  // src/mcp-oauth.ts
5022
5081
  import { z as z32 } from "zod";
5023
5082
  var MCP_OAUTH_SCOPE = "mcp:access";
@@ -12139,6 +12198,7 @@ var ToolReviewStatus = z57.enum([
12139
12198
  "cancelled",
12140
12199
  "expired",
12141
12200
  "revoked",
12201
+ "blocked",
12142
12202
  "stale",
12143
12203
  "failed",
12144
12204
  "unavailable"
@@ -13428,7 +13488,10 @@ var TranscriptionErrorCode = z58.enum([
13428
13488
  "unavailable",
13429
13489
  "too_large",
13430
13490
  "invalid_audio",
13431
- "unknown"
13491
+ "unknown",
13492
+ "insufficient_credits",
13493
+ "allowance_exhausted",
13494
+ "monthly_model_cost_limit"
13432
13495
  ]);
13433
13496
  var VoiceInputErrorCode = TranscriptionErrorCode;
13434
13497
  var TranscriptionTimeSpan = z58.object({
@@ -13621,7 +13684,8 @@ var VoiceInputProviderId = z58.enum([
13621
13684
  "supergrok-subscription",
13622
13685
  "codex-subscription",
13623
13686
  "openai",
13624
- "azure-openai"
13687
+ "azure-openai",
13688
+ "azure-mai"
13625
13689
  ]);
13626
13690
  var WorkspaceVoiceInputSettings = z58.object({
13627
13691
  enabled: z58.boolean(),
@@ -16561,7 +16625,7 @@ var CodexRealtimeWebrtcRequest = SessionRealtimeOwnerProof.extend({
16561
16625
  var CodexRealtimeWebrtcResponse = z58.object({
16562
16626
  sdp: z58.string().min(1).max(1024 * 1024),
16563
16627
  version: CodexRealtimeWebrtcVersion,
16564
- model: z58.literal("gpt-live-1-boulder-alpha"),
16628
+ model: z58.enum(["gpt-live-1-boulder-alpha", "opengeni-azure/gpt-live-1"]),
16565
16629
  connectionId: z58.string().uuid(),
16566
16630
  connectionEpoch: z58.number().int().positive(),
16567
16631
  startupFenceSequence: z58.number().int().nonnegative(),
@@ -16676,6 +16740,7 @@ var SyncSessionRealtimeLedgerResponse = z58.object({
16676
16740
  outbound: z58.array(SessionRealtimeLedgerEntry)
16677
16741
  }).strict();
16678
16742
  var SessionRealtimeModel = z58.enum([
16743
+ "opengeni-azure/gpt-live-1",
16679
16744
  "gpt-live-1-boulder-alpha",
16680
16745
  "supergrok/grok-voice-think-fast-2.0",
16681
16746
  "opengeni-gateway/openai/gpt-realtime-2.1",
@@ -16692,6 +16757,12 @@ var WorkspaceRealtimeModelCatalogItem = z58.object({
16692
16757
  description: z58.string().min(1),
16693
16758
  available: z58.boolean(),
16694
16759
  unavailableReason: z58.string().nullable(),
16760
+ /**
16761
+ * Machine-readable reason when unavailable. Credit refusals use the same
16762
+ * codes as voice input (`insufficient_credits`, `allowance_exhausted`,
16763
+ * `monthly_model_cost_limit`).
16764
+ */
16765
+ unavailableCode: z58.string().min(1).max(64).nullable().optional(),
16695
16766
  recommended: z58.boolean()
16696
16767
  });
16697
16768
  var WorkspaceRealtimeModelCatalogResponse = z58.object({
@@ -16729,9 +16800,14 @@ var RenewSessionRealtimeRequest = SessionRealtimeOwnerProof.extend({
16729
16800
  var EndSessionRealtimeRequest = RenewSessionRealtimeRequest.extend({
16730
16801
  reason: z58.enum(["user_stop", "browser_unload"])
16731
16802
  });
16803
+ var SessionRealtimeStopInstruction = z58.object({
16804
+ code: z58.string().min(1).max(64),
16805
+ message: z58.string().min(1).max(512)
16806
+ });
16732
16807
  var SessionRealtimeMutationResponse = z58.object({
16733
16808
  mode: SessionRealtimeMode,
16734
- replay: z58.boolean()
16809
+ replay: z58.boolean(),
16810
+ stop: SessionRealtimeStopInstruction.optional()
16735
16811
  });
16736
16812
  var SessionAuthorizationOperation = z58.enum([
16737
16813
  "session.read",
@@ -25174,6 +25250,7 @@ export {
25174
25250
  CodemodeCallSubmission,
25175
25251
  CodemodeDispatchRequest,
25176
25252
  CodemodeDispatchAck,
25253
+ omitStructuredContentTextDuplicates,
25177
25254
  MCP_OAUTH_SCOPE,
25178
25255
  MCP_OAUTH_ACCESS_TOKEN_TTL_SECONDS,
25179
25256
  MCP_OAUTH_REFRESH_TOKEN_TTL_SECONDS,
@@ -26242,6 +26319,7 @@ export {
26242
26319
  BeginSessionRealtimeRequest,
26243
26320
  RenewSessionRealtimeRequest,
26244
26321
  EndSessionRealtimeRequest,
26322
+ SessionRealtimeStopInstruction,
26245
26323
  SessionRealtimeMutationResponse,
26246
26324
  SessionAuthorizationOperation,
26247
26325
  SessionAuthorizationActor,
@@ -26889,4 +26967,4 @@ export {
26889
26967
  AtlassianDisconnectRequest,
26890
26968
  atlassianScopesAllowRead
26891
26969
  };
26892
- //# sourceMappingURL=chunk-LLFQJL3S.js.map
26970
+ //# sourceMappingURL=chunk-YFEAAOBX.js.map