@opengeni/contracts 0.50.0 → 2.2.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 (113) hide show
  1. package/dist/agent-authored-durable-text.d.ts +64 -0
  2. package/dist/atlassian.d.ts +1 -0
  3. package/dist/atlassian.js +14 -13
  4. package/dist/{chunk-Y3MLSLB4.js → chunk-3SIZGL3O.js} +42 -30
  5. package/dist/chunk-3SIZGL3O.js.map +1 -0
  6. package/dist/{chunk-JBCIY7QD.js → chunk-7RMTKFJW.js} +45 -22
  7. package/dist/chunk-7RMTKFJW.js.map +1 -0
  8. package/dist/{chunk-Q6A7XT2N.js → chunk-7ZZ3R27P.js} +9598 -6021
  9. package/dist/chunk-7ZZ3R27P.js.map +1 -0
  10. package/dist/{chunk-5UDNP7AO.js → chunk-MRWYRAS5.js} +56 -8
  11. package/dist/chunk-MRWYRAS5.js.map +1 -0
  12. package/dist/{chunk-LW7OH6CS.js → chunk-N6GRVXAJ.js} +6 -5
  13. package/dist/chunk-N6GRVXAJ.js.map +1 -0
  14. package/dist/{chunk-TZ6YEYN4.js → chunk-NVJMJWLL.js} +3 -1
  15. package/dist/chunk-NVJMJWLL.js.map +1 -0
  16. package/dist/chunk-PX3VCKAU.js +29 -0
  17. package/dist/chunk-PX3VCKAU.js.map +1 -0
  18. package/dist/{chunk-LSB7GRLG.js → chunk-TXTQIYCV.js} +15 -11
  19. package/dist/chunk-TXTQIYCV.js.map +1 -0
  20. package/dist/{chunk-CADSX6UN.js → chunk-Y3KNXVTD.js} +2 -2
  21. package/dist/chunk-YBW5JSA3.js +251 -0
  22. package/dist/chunk-YBW5JSA3.js.map +1 -0
  23. package/dist/company-brain-governed-writes.d.ts +475 -0
  24. package/dist/company-brain.d.ts +398 -0
  25. package/dist/company-profile.d.ts +268 -0
  26. package/dist/connection-authority.d.ts +501 -0
  27. package/dist/connection-authority.js +364 -0
  28. package/dist/connection-authority.js.map +1 -0
  29. package/dist/connector-attachments.d.ts +95 -0
  30. package/dist/connector-attachments.js +51 -0
  31. package/dist/connector-attachments.js.map +1 -0
  32. package/dist/editable-artifact-codec-registry.d.ts +16 -7
  33. package/dist/editable-artifact-codec-registry.js +18 -8
  34. package/dist/editable-artifact-committed-transaction.d.ts +2 -2
  35. package/dist/editable-artifact-committed-transaction.js +2 -2
  36. package/dist/editable-artifact-live.d.ts +11 -12
  37. package/dist/editable-artifact-live.js +111 -46
  38. package/dist/editable-artifact-live.js.map +1 -1
  39. package/dist/editable-artifact-serialized-commit.d.ts +2 -1
  40. package/dist/editable-artifact-serialized-commit.js +9 -8
  41. package/dist/editable-artifact-versions.d.ts +20 -5
  42. package/dist/editable-artifact-versions.js +23 -5
  43. package/dist/editable-artifacts.d.ts +2 -0
  44. package/dist/editable-artifacts.js +51 -39
  45. package/dist/google-drive.d.ts +89 -1
  46. package/dist/google-drive.js +78 -17
  47. package/dist/google-drive.js.map +1 -1
  48. package/dist/governed-learning-activation.d.ts +154 -0
  49. package/dist/governed-learning-evaluator.d.ts +152 -0
  50. package/dist/index.d.ts +12395 -1426
  51. package/dist/index.js +837 -115
  52. package/dist/interaction.d.ts +68 -0
  53. package/dist/knowledge.d.ts +192 -0
  54. package/dist/organization-membership-lifecycle.d.ts +516 -0
  55. package/dist/permissions.d.ts +52 -0
  56. package/dist/personal-github.d.ts +319 -0
  57. package/dist/personal-github.js +209 -0
  58. package/dist/personal-github.js.map +1 -0
  59. package/dist/preference-registry.d.ts +17 -0
  60. package/dist/remember.d.ts +331 -0
  61. package/dist/sandbox-file-artifacts.d.ts +56 -0
  62. package/dist/sandbox-snapshots.d.ts +21 -0
  63. package/dist/slack-bot-scopes.d.ts +34 -14
  64. package/dist/slack-bot-scopes.js +5 -1
  65. package/dist/spreadsheet-artifact-commands.d.ts +2 -3
  66. package/dist/spreadsheet-artifact-commands.js +4 -2
  67. package/dist/spreadsheet-artifact-query.js +3 -2
  68. package/dist/task-notes.d.ts +42 -1
  69. package/dist/tool-result-spill.d.ts +16 -0
  70. package/dist/workspace-instruction-policies.d.ts +81 -0
  71. package/dist/workspace-learning-administration.d.ts +289 -0
  72. package/package.json +13 -1
  73. package/src/agent-authored-durable-text.ts +105 -0
  74. package/src/company-brain-governed-writes.ts +356 -0
  75. package/src/company-brain.ts +201 -0
  76. package/src/company-profile.ts +122 -1
  77. package/src/connection-authority.ts +413 -0
  78. package/src/connector-attachments.ts +327 -0
  79. package/src/editable-artifact-codec-registry.ts +55 -17
  80. package/src/editable-artifact-committed-transaction.ts +44 -31
  81. package/src/editable-artifact-live.ts +123 -57
  82. package/src/editable-artifact-serialized-commit.ts +2 -1
  83. package/src/editable-artifact-versions.ts +26 -5
  84. package/src/editable-artifacts.ts +2 -0
  85. package/src/google-drive.ts +76 -4
  86. package/src/governed-learning-activation.ts +191 -0
  87. package/src/governed-learning-evaluator.ts +176 -0
  88. package/src/index.ts +3182 -483
  89. package/src/interaction.ts +55 -1
  90. package/src/knowledge.ts +133 -6
  91. package/src/organization-membership-lifecycle.ts +330 -0
  92. package/src/permissions.ts +55 -0
  93. package/src/personal-github.ts +267 -0
  94. package/src/preference-registry.ts +17 -0
  95. package/src/remember.ts +242 -0
  96. package/src/sandbox-file-artifacts.ts +65 -0
  97. package/src/sandbox-snapshots.ts +78 -0
  98. package/src/slack-bot-scopes.ts +81 -9
  99. package/src/spreadsheet-artifact-commands.ts +12 -13
  100. package/src/task-notes.ts +14 -1
  101. package/src/tool-result-spill.ts +35 -0
  102. package/src/workspace-instruction-policies.ts +30 -0
  103. package/src/workspace-learning-administration.ts +88 -0
  104. package/dist/chunk-5UDNP7AO.js.map +0 -1
  105. package/dist/chunk-BVGIYW7D.js +0 -11
  106. package/dist/chunk-BVGIYW7D.js.map +0 -1
  107. package/dist/chunk-JBCIY7QD.js.map +0 -1
  108. package/dist/chunk-LSB7GRLG.js.map +0 -1
  109. package/dist/chunk-LW7OH6CS.js.map +0 -1
  110. package/dist/chunk-Q6A7XT2N.js.map +0 -1
  111. package/dist/chunk-TZ6YEYN4.js.map +0 -1
  112. package/dist/chunk-Y3MLSLB4.js.map +0 -1
  113. /package/dist/{chunk-CADSX6UN.js.map → chunk-Y3KNXVTD.js.map} +0 -0
@@ -0,0 +1,251 @@
1
+ // src/connector-attachments.ts
2
+ import { z } from "zod";
3
+ var CONNECTOR_ATTACHMENT_TRANSFER_VERSION = 1;
4
+ var CONNECTOR_ATTACHMENT_RECEIPT_VERSION = 1;
5
+ var CONNECTOR_ATTACHMENT_TRANSFER_META_KEY = "opengeni/connector-attachment-transfers";
6
+ var CONNECTOR_ATTACHMENT_RECEIPT_META_KEY = "opengeni/connector-attachment-receipts";
7
+ var CONNECTOR_ATTACHMENT_MAX_COUNT = 16;
8
+ var CONNECTOR_ATTACHMENT_MAX_BYTES = 5e9;
9
+ var CONNECTOR_ATTACHMENT_FILENAME_MAX_UTF8_BYTES = 255;
10
+ var CONNECTOR_ATTACHMENT_MEDIA_TYPE_MAX_UTF8_BYTES = 256;
11
+ var CONNECTOR_ATTACHMENT_PROVIDER_MAX_UTF8_BYTES = 128;
12
+ var CONNECTOR_ATTACHMENT_PROVIDER_ID_MAX_UTF8_BYTES = 512;
13
+ var CONNECTOR_ATTACHMENT_SOURCE_URL_MAX_UTF8_BYTES = 8 * 1024;
14
+ var CONNECTOR_ATTACHMENT_SANDBOX_PATH_MAX_UTF8_BYTES = 2 * 1024;
15
+ var PROVIDER_PATTERN = /^[a-z0-9]+(?:[._-][a-z0-9]+)*$/u;
16
+ var SHA256_PATTERN = /^[0-9a-f]{64}$/u;
17
+ var MEDIA_TYPE_PATTERN = /^[a-z0-9!#$&^_.+-]+\/[a-z0-9!#$&^_.+-]+(?:\s*;\s*[a-z0-9!#$&^_.+-]+=(?:[a-z0-9!#$&^_.+-]+|"[^"\r\n]*"))*$/iu;
18
+ var CONTROL_CHARACTER_PATTERN = /[\u0000-\u001f\u007f]/u;
19
+ var HTTP_URL_REFERENCE_PATTERN = /(?:https?:)?\/\/[^\s]/iu;
20
+ var PORTABLE_FILENAME_FORBIDDEN_PATTERN = /[<>:"|?*]/u;
21
+ var PORTABLE_FILENAME_RESERVED_PATTERN = /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/iu;
22
+ var textEncoder = new TextEncoder();
23
+ function utf8Bytes(value) {
24
+ return textEncoder.encode(value).byteLength;
25
+ }
26
+ function boundedString(maxUtf8Bytes) {
27
+ return z.string().refine((value) => utf8Bytes(value) <= maxUtf8Bytes, {
28
+ message: `must be at most ${maxUtf8Bytes} UTF-8 bytes`
29
+ });
30
+ }
31
+ function isHttpUrl(value) {
32
+ try {
33
+ const parsed = new URL(value);
34
+ return parsed.protocol === "http:" || parsed.protocol === "https:";
35
+ } catch {
36
+ return false;
37
+ }
38
+ }
39
+ function containsHttpUrlReference(value) {
40
+ return HTTP_URL_REFERENCE_PATTERN.test(value);
41
+ }
42
+ function isPrivateUrlCredentialQueryName(value) {
43
+ const normalized = value.toLowerCase().replace(/[^a-z0-9]/gu, "");
44
+ return normalized === "sig" || normalized === "auth" || normalized.endsWith("signature") || normalized.endsWith("token") || normalized.endsWith("credential") || normalized.endsWith("secret") || normalized.endsWith("password") || normalized.endsWith("passcode") || normalized.endsWith("authorization") || normalized.endsWith("apikey") || normalized.endsWith("accesskey") || normalized.endsWith("securitytoken") || normalized.endsWith("sas") || normalized === "googleaccessid";
45
+ }
46
+ function privateUrlCredentialValues(value) {
47
+ let parsed;
48
+ try {
49
+ parsed = new URL(value);
50
+ } catch {
51
+ return [];
52
+ }
53
+ const credentials = /* @__PURE__ */ new Set();
54
+ for (const [name, credential] of parsed.searchParams) {
55
+ if (credential && isPrivateUrlCredentialQueryName(name)) credentials.add(credential);
56
+ }
57
+ for (const pair of parsed.search.slice(1).split("&")) {
58
+ if (!pair) continue;
59
+ const separator = pair.indexOf("=");
60
+ const rawName = separator === -1 ? pair : pair.slice(0, separator);
61
+ const rawCredential = separator === -1 ? "" : pair.slice(separator + 1);
62
+ let decodedName;
63
+ try {
64
+ decodedName = decodeURIComponent(rawName.replace(/\+/gu, " "));
65
+ } catch {
66
+ continue;
67
+ }
68
+ if (rawCredential && isPrivateUrlCredentialQueryName(decodedName)) {
69
+ credentials.add(rawCredential);
70
+ }
71
+ }
72
+ return [...credentials];
73
+ }
74
+ function publicMetadataContainsCredential(publicValue, credential) {
75
+ return publicValue.includes(credential);
76
+ }
77
+ var ConnectorAttachmentProviderIdentity = z.object({
78
+ provider: boundedString(CONNECTOR_ATTACHMENT_PROVIDER_MAX_UTF8_BYTES).regex(PROVIDER_PATTERN),
79
+ kind: z.literal("attachment"),
80
+ value: boundedString(CONNECTOR_ATTACHMENT_PROVIDER_ID_MAX_UTF8_BYTES).min(1).refine((value) => !CONTROL_CHARACTER_PATTERN.test(value), {
81
+ message: "must not contain control characters"
82
+ }).refine((value) => !isHttpUrl(value) && !containsHttpUrlReference(value), {
83
+ message: "must be an opaque provider attachment identity, not a URL"
84
+ })
85
+ }).strict();
86
+ var ConnectorAttachmentFileName = boundedString(
87
+ CONNECTOR_ATTACHMENT_FILENAME_MAX_UTF8_BYTES
88
+ ).min(1).refine(
89
+ (value) => value !== "." && value !== ".." && value === value.trim() && !value.includes("/") && !value.includes("\\") && !CONTROL_CHARACTER_PATTERN.test(value) && !PORTABLE_FILENAME_FORBIDDEN_PATTERN.test(value) && !/[ .]$/u.test(value) && !PORTABLE_FILENAME_RESERVED_PATTERN.test(value),
90
+ { message: "must be a safe leaf filename" }
91
+ );
92
+ var ConnectorAttachmentMediaType = boundedString(
93
+ CONNECTOR_ATTACHMENT_MEDIA_TYPE_MAX_UTF8_BYTES
94
+ ).regex(MEDIA_TYPE_PATTERN).refine((value) => !containsHttpUrlReference(value), {
95
+ message: "must not contain an HTTP URL reference"
96
+ });
97
+ var ConnectorAttachmentSha256 = z.string().regex(SHA256_PATTERN);
98
+ var ConnectorAttachmentPrivateSource = z.object({
99
+ url: boundedString(CONNECTOR_ATTACHMENT_SOURCE_URL_MAX_UTF8_BYTES).superRefine(
100
+ (value, context) => {
101
+ let parsed;
102
+ try {
103
+ parsed = new URL(value);
104
+ } catch {
105
+ context.addIssue({
106
+ code: "custom",
107
+ message: "must be an absolute URL"
108
+ });
109
+ return;
110
+ }
111
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
112
+ context.addIssue({ code: "custom", message: "must use http or https" });
113
+ }
114
+ if (parsed.username || parsed.password) {
115
+ context.addIssue({
116
+ code: "custom",
117
+ message: "must not contain URL userinfo"
118
+ });
119
+ }
120
+ if (parsed.hash) {
121
+ context.addIssue({
122
+ code: "custom",
123
+ message: "must not contain a URL fragment"
124
+ });
125
+ }
126
+ }
127
+ ),
128
+ expiresAt: z.iso.datetime({ offset: true })
129
+ }).strict();
130
+ var ConnectorAttachmentTransfer = z.object({
131
+ providerAttachmentId: ConnectorAttachmentProviderIdentity,
132
+ fileName: ConnectorAttachmentFileName,
133
+ mediaType: ConnectorAttachmentMediaType,
134
+ byteSize: z.number().int().min(0).max(CONNECTOR_ATTACHMENT_MAX_BYTES),
135
+ contentSha256: ConnectorAttachmentSha256,
136
+ source: ConnectorAttachmentPrivateSource
137
+ }).strict().superRefine((attachment, context) => {
138
+ const publicValues = [
139
+ attachment.providerAttachmentId.value,
140
+ attachment.fileName,
141
+ attachment.mediaType
142
+ ];
143
+ for (const credential of privateUrlCredentialValues(attachment.source.url)) {
144
+ if (publicValues.some((value) => publicMetadataContainsCredential(value, credential))) {
145
+ context.addIssue({
146
+ code: "custom",
147
+ message: "private source credentials must not appear in public attachment metadata"
148
+ });
149
+ return;
150
+ }
151
+ }
152
+ });
153
+ var ConnectorAttachmentTransferEnvelope = z.object({
154
+ version: z.literal(CONNECTOR_ATTACHMENT_TRANSFER_VERSION),
155
+ attachments: z.array(ConnectorAttachmentTransfer).min(1).max(CONNECTOR_ATTACHMENT_MAX_COUNT)
156
+ }).strict().superRefine((envelope, context) => {
157
+ const identities = /* @__PURE__ */ new Set();
158
+ for (const [index, attachment] of envelope.attachments.entries()) {
159
+ const identity = `${attachment.providerAttachmentId.provider}\0${attachment.providerAttachmentId.value}`;
160
+ if (identities.has(identity)) {
161
+ context.addIssue({
162
+ code: "custom",
163
+ message: "provider attachment identities must be unique",
164
+ path: ["attachments", index, "providerAttachmentId"]
165
+ });
166
+ }
167
+ identities.add(identity);
168
+ }
169
+ });
170
+ var ConnectorAttachmentSandboxPath = boundedString(
171
+ CONNECTOR_ATTACHMENT_SANDBOX_PATH_MAX_UTF8_BYTES
172
+ ).min(1).refine(
173
+ (value) => {
174
+ if (value !== value.trim() || value.startsWith("/") || /^[A-Za-z]:[\\/]/u.test(value) || value.includes("\\") || CONTROL_CHARACTER_PATTERN.test(value)) {
175
+ return false;
176
+ }
177
+ const segments = value.split("/");
178
+ if (segments.length !== 5 || segments[0] !== ".opengeni" || segments[1] !== "connector-attachments" || !PROVIDER_PATTERN.test(segments[2] ?? "") || !/^[0-9a-f]{32}$/u.test(segments[3] ?? "") || !ConnectorAttachmentFileName.safeParse(segments[4]).success) {
179
+ return false;
180
+ }
181
+ return segments.every(
182
+ (segment) => segment.length > 0 && segment !== "." && segment !== ".." && !PORTABLE_FILENAME_FORBIDDEN_PATTERN.test(segment) && !/[ .]$/u.test(segment) && !PORTABLE_FILENAME_RESERVED_PATTERN.test(segment)
183
+ );
184
+ },
185
+ { message: "must be a confined connector attachment sandbox path" }
186
+ );
187
+ var ConnectorAttachmentReceipt = z.object({
188
+ providerAttachmentId: ConnectorAttachmentProviderIdentity,
189
+ fileName: ConnectorAttachmentFileName,
190
+ mediaType: ConnectorAttachmentMediaType,
191
+ byteSize: z.number().int().min(0).max(CONNECTOR_ATTACHMENT_MAX_BYTES),
192
+ contentSha256: ConnectorAttachmentSha256,
193
+ sandboxPath: ConnectorAttachmentSandboxPath
194
+ }).strict().superRefine((receipt, context) => {
195
+ const segments = receipt.sandboxPath.split("/");
196
+ if (segments[2] !== receipt.providerAttachmentId.provider) {
197
+ context.addIssue({
198
+ code: "custom",
199
+ message: "sandbox path provider must match the provider attachment identity",
200
+ path: ["sandboxPath"]
201
+ });
202
+ }
203
+ if (segments[4] !== receipt.fileName) {
204
+ context.addIssue({
205
+ code: "custom",
206
+ message: "sandbox path filename must match the attachment filename",
207
+ path: ["sandboxPath"]
208
+ });
209
+ }
210
+ });
211
+ var ConnectorAttachmentReceiptEnvelope = z.object({
212
+ version: z.literal(CONNECTOR_ATTACHMENT_RECEIPT_VERSION),
213
+ attachments: z.array(ConnectorAttachmentReceipt).min(1).max(CONNECTOR_ATTACHMENT_MAX_COUNT)
214
+ }).strict();
215
+ function parseConnectorAttachmentTransferEnvelope(value, options = {}) {
216
+ const envelope = ConnectorAttachmentTransferEnvelope.parse(value);
217
+ const nowMs = options.nowMs ?? Date.now();
218
+ for (const attachment of envelope.attachments) {
219
+ if (Date.parse(attachment.source.expiresAt) <= nowMs) {
220
+ throw new Error("connector attachment source is expired");
221
+ }
222
+ }
223
+ return envelope;
224
+ }
225
+
226
+ export {
227
+ CONNECTOR_ATTACHMENT_TRANSFER_VERSION,
228
+ CONNECTOR_ATTACHMENT_RECEIPT_VERSION,
229
+ CONNECTOR_ATTACHMENT_TRANSFER_META_KEY,
230
+ CONNECTOR_ATTACHMENT_RECEIPT_META_KEY,
231
+ CONNECTOR_ATTACHMENT_MAX_COUNT,
232
+ CONNECTOR_ATTACHMENT_MAX_BYTES,
233
+ CONNECTOR_ATTACHMENT_FILENAME_MAX_UTF8_BYTES,
234
+ CONNECTOR_ATTACHMENT_MEDIA_TYPE_MAX_UTF8_BYTES,
235
+ CONNECTOR_ATTACHMENT_PROVIDER_MAX_UTF8_BYTES,
236
+ CONNECTOR_ATTACHMENT_PROVIDER_ID_MAX_UTF8_BYTES,
237
+ CONNECTOR_ATTACHMENT_SOURCE_URL_MAX_UTF8_BYTES,
238
+ CONNECTOR_ATTACHMENT_SANDBOX_PATH_MAX_UTF8_BYTES,
239
+ ConnectorAttachmentProviderIdentity,
240
+ ConnectorAttachmentFileName,
241
+ ConnectorAttachmentMediaType,
242
+ ConnectorAttachmentSha256,
243
+ ConnectorAttachmentPrivateSource,
244
+ ConnectorAttachmentTransfer,
245
+ ConnectorAttachmentTransferEnvelope,
246
+ ConnectorAttachmentSandboxPath,
247
+ ConnectorAttachmentReceipt,
248
+ ConnectorAttachmentReceiptEnvelope,
249
+ parseConnectorAttachmentTransferEnvelope
250
+ };
251
+ //# sourceMappingURL=chunk-YBW5JSA3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/connector-attachments.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport const CONNECTOR_ATTACHMENT_TRANSFER_VERSION = 1 as const;\nexport const CONNECTOR_ATTACHMENT_RECEIPT_VERSION = 1 as const;\nexport const CONNECTOR_ATTACHMENT_TRANSFER_META_KEY =\n \"opengeni/connector-attachment-transfers\" as const;\nexport const CONNECTOR_ATTACHMENT_RECEIPT_META_KEY =\n \"opengeni/connector-attachment-receipts\" as const;\nexport const CONNECTOR_ATTACHMENT_MAX_COUNT = 16;\n// Must remain byte-for-byte aligned with Channel A's exact workspace importer.\nexport const CONNECTOR_ATTACHMENT_MAX_BYTES = 5_000_000_000;\nexport const CONNECTOR_ATTACHMENT_FILENAME_MAX_UTF8_BYTES = 255;\nexport const CONNECTOR_ATTACHMENT_MEDIA_TYPE_MAX_UTF8_BYTES = 256;\nexport const CONNECTOR_ATTACHMENT_PROVIDER_MAX_UTF8_BYTES = 128;\nexport const CONNECTOR_ATTACHMENT_PROVIDER_ID_MAX_UTF8_BYTES = 512;\nexport const CONNECTOR_ATTACHMENT_SOURCE_URL_MAX_UTF8_BYTES = 8 * 1024;\nexport const CONNECTOR_ATTACHMENT_SANDBOX_PATH_MAX_UTF8_BYTES = 2 * 1024;\n\nconst PROVIDER_PATTERN = /^[a-z0-9]+(?:[._-][a-z0-9]+)*$/u;\nconst SHA256_PATTERN = /^[0-9a-f]{64}$/u;\nconst MEDIA_TYPE_PATTERN =\n /^[a-z0-9!#$&^_.+-]+\\/[a-z0-9!#$&^_.+-]+(?:\\s*;\\s*[a-z0-9!#$&^_.+-]+=(?:[a-z0-9!#$&^_.+-]+|\"[^\"\\r\\n]*\"))*$/iu;\nconst CONTROL_CHARACTER_PATTERN = /[\\u0000-\\u001f\\u007f]/u;\nconst HTTP_URL_REFERENCE_PATTERN = /(?:https?:)?\\/\\/[^\\s]/iu;\nconst PORTABLE_FILENAME_FORBIDDEN_PATTERN = /[<>:\"|?*]/u;\nconst PORTABLE_FILENAME_RESERVED_PATTERN = /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\\.|$)/iu;\nconst textEncoder = new TextEncoder();\n\nfunction utf8Bytes(value: string): number {\n return textEncoder.encode(value).byteLength;\n}\n\nfunction boundedString(maxUtf8Bytes: number) {\n return z.string().refine((value) => utf8Bytes(value) <= maxUtf8Bytes, {\n message: `must be at most ${maxUtf8Bytes} UTF-8 bytes`,\n });\n}\n\nfunction isHttpUrl(value: string): boolean {\n try {\n const parsed = new URL(value);\n return parsed.protocol === \"http:\" || parsed.protocol === \"https:\";\n } catch {\n return false;\n }\n}\n\nfunction containsHttpUrlReference(value: string): boolean {\n return HTTP_URL_REFERENCE_PATTERN.test(value);\n}\n\nfunction isPrivateUrlCredentialQueryName(value: string): boolean {\n const normalized = value.toLowerCase().replace(/[^a-z0-9]/gu, \"\");\n return (\n normalized === \"sig\" ||\n normalized === \"auth\" ||\n normalized.endsWith(\"signature\") ||\n normalized.endsWith(\"token\") ||\n normalized.endsWith(\"credential\") ||\n normalized.endsWith(\"secret\") ||\n normalized.endsWith(\"password\") ||\n normalized.endsWith(\"passcode\") ||\n normalized.endsWith(\"authorization\") ||\n normalized.endsWith(\"apikey\") ||\n normalized.endsWith(\"accesskey\") ||\n normalized.endsWith(\"securitytoken\") ||\n normalized.endsWith(\"sas\") ||\n normalized === \"googleaccessid\"\n );\n}\n\nfunction privateUrlCredentialValues(value: string): string[] {\n let parsed: URL;\n try {\n parsed = new URL(value);\n } catch {\n return [];\n }\n const credentials = new Set<string>();\n for (const [name, credential] of parsed.searchParams) {\n if (credential && isPrivateUrlCredentialQueryName(name)) credentials.add(credential);\n }\n for (const pair of parsed.search.slice(1).split(\"&\")) {\n if (!pair) continue;\n const separator = pair.indexOf(\"=\");\n const rawName = separator === -1 ? pair : pair.slice(0, separator);\n const rawCredential = separator === -1 ? \"\" : pair.slice(separator + 1);\n let decodedName: string;\n try {\n decodedName = decodeURIComponent(rawName.replace(/\\+/gu, \" \"));\n } catch {\n continue;\n }\n if (rawCredential && isPrivateUrlCredentialQueryName(decodedName)) {\n credentials.add(rawCredential);\n }\n }\n return [...credentials];\n}\n\nfunction publicMetadataContainsCredential(publicValue: string, credential: string): boolean {\n return publicValue.includes(credential);\n}\n\nexport const ConnectorAttachmentProviderIdentity = z\n .object({\n provider: boundedString(CONNECTOR_ATTACHMENT_PROVIDER_MAX_UTF8_BYTES).regex(PROVIDER_PATTERN),\n kind: z.literal(\"attachment\"),\n value: boundedString(CONNECTOR_ATTACHMENT_PROVIDER_ID_MAX_UTF8_BYTES)\n .min(1)\n .refine((value) => !CONTROL_CHARACTER_PATTERN.test(value), {\n message: \"must not contain control characters\",\n })\n .refine((value) => !isHttpUrl(value) && !containsHttpUrlReference(value), {\n message: \"must be an opaque provider attachment identity, not a URL\",\n }),\n })\n .strict();\nexport type ConnectorAttachmentProviderIdentity = z.infer<\n typeof ConnectorAttachmentProviderIdentity\n>;\n\nexport const ConnectorAttachmentFileName = boundedString(\n CONNECTOR_ATTACHMENT_FILENAME_MAX_UTF8_BYTES,\n)\n .min(1)\n .refine(\n (value) =>\n value !== \".\" &&\n value !== \"..\" &&\n value === value.trim() &&\n !value.includes(\"/\") &&\n !value.includes(\"\\\\\") &&\n !CONTROL_CHARACTER_PATTERN.test(value) &&\n !PORTABLE_FILENAME_FORBIDDEN_PATTERN.test(value) &&\n !/[ .]$/u.test(value) &&\n !PORTABLE_FILENAME_RESERVED_PATTERN.test(value),\n { message: \"must be a safe leaf filename\" },\n );\n\nexport const ConnectorAttachmentMediaType = boundedString(\n CONNECTOR_ATTACHMENT_MEDIA_TYPE_MAX_UTF8_BYTES,\n)\n .regex(MEDIA_TYPE_PATTERN)\n .refine((value) => !containsHttpUrlReference(value), {\n message: \"must not contain an HTTP URL reference\",\n });\n\nexport const ConnectorAttachmentSha256 = z.string().regex(SHA256_PATTERN);\n\nexport const ConnectorAttachmentPrivateSource = z\n .object({\n url: boundedString(CONNECTOR_ATTACHMENT_SOURCE_URL_MAX_UTF8_BYTES).superRefine(\n (value, context) => {\n let parsed: URL;\n try {\n parsed = new URL(value);\n } catch {\n context.addIssue({\n code: \"custom\",\n message: \"must be an absolute URL\",\n });\n return;\n }\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n context.addIssue({ code: \"custom\", message: \"must use http or https\" });\n }\n if (parsed.username || parsed.password) {\n context.addIssue({\n code: \"custom\",\n message: \"must not contain URL userinfo\",\n });\n }\n if (parsed.hash) {\n context.addIssue({\n code: \"custom\",\n message: \"must not contain a URL fragment\",\n });\n }\n },\n ),\n expiresAt: z.iso.datetime({ offset: true }),\n })\n .strict();\nexport type ConnectorAttachmentPrivateSource = z.infer<typeof ConnectorAttachmentPrivateSource>;\n\nexport const ConnectorAttachmentTransfer = z\n .object({\n providerAttachmentId: ConnectorAttachmentProviderIdentity,\n fileName: ConnectorAttachmentFileName,\n mediaType: ConnectorAttachmentMediaType,\n byteSize: z.number().int().min(0).max(CONNECTOR_ATTACHMENT_MAX_BYTES),\n contentSha256: ConnectorAttachmentSha256,\n source: ConnectorAttachmentPrivateSource,\n })\n .strict()\n .superRefine((attachment, context) => {\n const publicValues = [\n attachment.providerAttachmentId.value,\n attachment.fileName,\n attachment.mediaType,\n ];\n for (const credential of privateUrlCredentialValues(attachment.source.url)) {\n if (publicValues.some((value) => publicMetadataContainsCredential(value, credential))) {\n context.addIssue({\n code: \"custom\",\n message: \"private source credentials must not appear in public attachment metadata\",\n });\n return;\n }\n }\n });\nexport type ConnectorAttachmentTransfer = z.infer<typeof ConnectorAttachmentTransfer>;\n\nexport const ConnectorAttachmentTransferEnvelope = z\n .object({\n version: z.literal(CONNECTOR_ATTACHMENT_TRANSFER_VERSION),\n attachments: z.array(ConnectorAttachmentTransfer).min(1).max(CONNECTOR_ATTACHMENT_MAX_COUNT),\n })\n .strict()\n .superRefine((envelope, context) => {\n const identities = new Set<string>();\n for (const [index, attachment] of envelope.attachments.entries()) {\n const identity = `${attachment.providerAttachmentId.provider}\\0${attachment.providerAttachmentId.value}`;\n if (identities.has(identity)) {\n context.addIssue({\n code: \"custom\",\n message: \"provider attachment identities must be unique\",\n path: [\"attachments\", index, \"providerAttachmentId\"],\n });\n }\n identities.add(identity);\n }\n });\nexport type ConnectorAttachmentTransferEnvelope = z.infer<\n typeof ConnectorAttachmentTransferEnvelope\n>;\n\nexport const ConnectorAttachmentSandboxPath = boundedString(\n CONNECTOR_ATTACHMENT_SANDBOX_PATH_MAX_UTF8_BYTES,\n)\n .min(1)\n .refine(\n (value) => {\n if (\n value !== value.trim() ||\n value.startsWith(\"/\") ||\n /^[A-Za-z]:[\\\\/]/u.test(value) ||\n value.includes(\"\\\\\") ||\n CONTROL_CHARACTER_PATTERN.test(value)\n ) {\n return false;\n }\n const segments = value.split(\"/\");\n if (\n segments.length !== 5 ||\n segments[0] !== \".opengeni\" ||\n segments[1] !== \"connector-attachments\" ||\n !PROVIDER_PATTERN.test(segments[2] ?? \"\") ||\n !/^[0-9a-f]{32}$/u.test(segments[3] ?? \"\") ||\n !ConnectorAttachmentFileName.safeParse(segments[4]).success\n ) {\n return false;\n }\n return segments.every(\n (segment) =>\n segment.length > 0 &&\n segment !== \".\" &&\n segment !== \"..\" &&\n !PORTABLE_FILENAME_FORBIDDEN_PATTERN.test(segment) &&\n !/[ .]$/u.test(segment) &&\n !PORTABLE_FILENAME_RESERVED_PATTERN.test(segment),\n );\n },\n { message: \"must be a confined connector attachment sandbox path\" },\n );\n\nexport const ConnectorAttachmentReceipt = z\n .object({\n providerAttachmentId: ConnectorAttachmentProviderIdentity,\n fileName: ConnectorAttachmentFileName,\n mediaType: ConnectorAttachmentMediaType,\n byteSize: z.number().int().min(0).max(CONNECTOR_ATTACHMENT_MAX_BYTES),\n contentSha256: ConnectorAttachmentSha256,\n sandboxPath: ConnectorAttachmentSandboxPath,\n })\n .strict()\n .superRefine((receipt, context) => {\n const segments = receipt.sandboxPath.split(\"/\");\n if (segments[2] !== receipt.providerAttachmentId.provider) {\n context.addIssue({\n code: \"custom\",\n message: \"sandbox path provider must match the provider attachment identity\",\n path: [\"sandboxPath\"],\n });\n }\n if (segments[4] !== receipt.fileName) {\n context.addIssue({\n code: \"custom\",\n message: \"sandbox path filename must match the attachment filename\",\n path: [\"sandboxPath\"],\n });\n }\n });\nexport type ConnectorAttachmentReceipt = z.infer<typeof ConnectorAttachmentReceipt>;\n\nexport const ConnectorAttachmentReceiptEnvelope = z\n .object({\n version: z.literal(CONNECTOR_ATTACHMENT_RECEIPT_VERSION),\n attachments: z.array(ConnectorAttachmentReceipt).min(1).max(CONNECTOR_ATTACHMENT_MAX_COUNT),\n })\n .strict();\nexport type ConnectorAttachmentReceiptEnvelope = z.infer<typeof ConnectorAttachmentReceiptEnvelope>;\n\nexport function parseConnectorAttachmentTransferEnvelope(\n value: unknown,\n options: { nowMs?: number } = {},\n): ConnectorAttachmentTransferEnvelope {\n const envelope = ConnectorAttachmentTransferEnvelope.parse(value);\n const nowMs = options.nowMs ?? Date.now();\n for (const attachment of envelope.attachments) {\n if (Date.parse(attachment.source.expiresAt) <= nowMs) {\n throw new Error(\"connector attachment source is expired\");\n }\n }\n return envelope;\n}\n"],"mappings":"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","names":[]}