@hexclave/shared 1.0.60 → 1.0.62
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/{admin-interface-BxUHaniY.d.ts → admin-interface-D63SFHX_.d.ts} +94 -12
- package/dist/admin-interface-D63SFHX_.d.ts.map +1 -0
- package/dist/{admin-metrics-DQ7vvSym.d.ts → admin-metrics-bsOkw4YQ.d.ts} +16 -16
- package/dist/{admin-metrics-DQ7vvSym.d.ts.map → admin-metrics-bsOkw4YQ.d.ts.map} +1 -1
- package/dist/ai/unified-prompts/reminders.js +1 -1
- package/dist/ai/unified-prompts/reminders.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js +12 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/deployments-skill.d.ts +5 -0
- package/dist/ai/unified-prompts/skill-site-prompt-parts/deployments-skill.d.ts.map +1 -0
- package/dist/ai/unified-prompts/skill-site-prompt-parts/deployments-skill.js +128 -0
- package/dist/ai/unified-prompts/skill-site-prompt-parts/deployments-skill.js.map +1 -0
- package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.d.ts +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js +1 -0
- package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt.d.ts +3 -1
- package/dist/ai/unified-prompts/skill-site-prompt.d.ts.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt.js +11 -0
- package/dist/ai/unified-prompts/skill-site-prompt.js.map +1 -1
- package/dist/apps/apps-config.d.ts +6 -0
- package/dist/apps/apps-config.d.ts.map +1 -1
- package/dist/apps/apps-config.js +6 -0
- package/dist/apps/apps-config.js.map +1 -1
- package/dist/{client-interface-D-cO5E3C.d.ts → client-interface-DvkciaL0.d.ts} +10 -10
- package/dist/{client-interface-D-cO5E3C.d.ts.map → client-interface-DvkciaL0.d.ts.map} +1 -1
- package/dist/config/schema-fuzzer.test.js +38 -1
- package/dist/config/schema-fuzzer.test.js.map +1 -1
- package/dist/config/schema.d.ts +2 -2
- package/dist/config/schema.js +45 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/config-authoring.d.ts +1 -1
- package/dist/{current-user-Cg6by3KK.d.ts → current-user-BBoN3hsn.d.ts} +13 -13
- package/dist/{current-user-Cg6by3KK.d.ts.map → current-user-BBoN3hsn.d.ts.map} +1 -1
- package/dist/{email-outbox-B3lyx4Eg.d.ts → email-outbox-CqzwInBL.d.ts} +207 -207
- package/dist/{email-outbox-B3lyx4Eg.d.ts.map → email-outbox-CqzwInBL.d.ts.map} +1 -1
- package/dist/esm/ai/unified-prompts/reminders.js +1 -1
- package/dist/esm/ai/unified-prompts/reminders.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js +12 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/deployments-skill.d.ts +5 -0
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/deployments-skill.d.ts.map +1 -0
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/deployments-skill.js +128 -0
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/deployments-skill.js.map +1 -0
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.d.ts +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js +1 -0
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt.d.ts +3 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt.d.ts.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt.js +10 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt.js.map +1 -1
- package/dist/esm/apps/apps-config.d.ts +6 -0
- package/dist/esm/apps/apps-config.d.ts.map +1 -1
- package/dist/esm/apps/apps-config.js +6 -0
- package/dist/esm/apps/apps-config.js.map +1 -1
- package/dist/esm/config/schema-fuzzer.test.js +38 -1
- package/dist/esm/config/schema-fuzzer.test.js.map +1 -1
- package/dist/esm/config/schema.d.ts +220 -90
- package/dist/esm/config/schema.d.ts.map +1 -1
- package/dist/esm/config/schema.js +42 -1
- package/dist/esm/config/schema.js.map +1 -1
- package/dist/esm/interface/admin-interface.d.ts +83 -1
- package/dist/esm/interface/admin-interface.d.ts.map +1 -1
- package/dist/esm/interface/admin-interface.js +48 -0
- package/dist/esm/interface/admin-interface.js.map +1 -1
- package/dist/esm/interface/admin-metrics.d.ts +15 -15
- package/dist/esm/interface/conversations.d.ts +36 -36
- package/dist/esm/interface/crud/current-user.d.ts +12 -12
- package/dist/esm/interface/crud/email-outbox.d.ts +206 -206
- package/dist/esm/interface/crud/invoices.d.ts +2 -2
- package/dist/esm/interface/crud/products.d.ts +23 -23
- package/dist/esm/interface/crud/project-api-keys.d.ts +4 -4
- package/dist/esm/interface/crud/projects.d.ts +59 -59
- package/dist/esm/interface/crud/team-member-profiles.d.ts +26 -26
- package/dist/esm/interface/crud/transactions.d.ts +20 -20
- package/dist/esm/interface/crud/transactions.d.ts.map +1 -1
- package/dist/esm/interface/crud/users.d.ts +16 -16
- package/dist/esm/interface/plan-usage.d.ts +2 -2
- package/dist/esm/interface/webhooks.d.ts +2 -2
- package/dist/esm/known-errors.d.ts +1 -1
- package/dist/esm/schema-fields.d.ts +4 -4
- package/dist/esm/sessions.d.ts +11 -11
- package/dist/esm/utils/tar.d.ts +26 -0
- package/dist/esm/utils/tar.d.ts.map +1 -0
- package/dist/esm/utils/tar.js +136 -0
- package/dist/esm/utils/tar.js.map +1 -0
- package/dist/helpers/password.d.ts +1 -1
- package/dist/helpers/production-mode.d.ts +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/interface/admin-interface.d.ts +3 -3
- package/dist/interface/admin-interface.js +48 -0
- package/dist/interface/admin-interface.js.map +1 -1
- package/dist/interface/admin-metrics.d.ts +1 -1
- package/dist/interface/client-interface.d.ts +1 -1
- package/dist/interface/conversations.d.ts +36 -36
- package/dist/interface/crud/current-user.d.ts +1 -1
- package/dist/interface/crud/email-outbox.d.ts +1 -1
- package/dist/interface/crud/invoices.d.ts +1 -1
- package/dist/interface/crud/products.d.ts +1 -1
- package/dist/interface/crud/project-api-keys.d.ts +1 -1
- package/dist/interface/crud/projects.d.ts +1 -1
- package/dist/interface/crud/team-member-profiles.d.ts +1 -1
- package/dist/interface/crud/transactions.d.ts +1 -1
- package/dist/interface/crud/users.d.ts +1 -1
- package/dist/interface/plan-usage.d.ts +1 -1
- package/dist/interface/server-interface.d.ts +1 -1
- package/dist/interface/webhooks.d.ts +1 -1
- package/dist/{invoices-BGLLnTlR.d.ts → invoices-CHo9YKbI.d.ts} +3 -3
- package/dist/{invoices-BGLLnTlR.d.ts.map → invoices-CHo9YKbI.d.ts.map} +1 -1
- package/dist/{known-errors-BFf8SVm8.d.ts → known-errors-Bm4a61wL.d.ts} +2 -2
- package/dist/{known-errors-BFf8SVm8.d.ts.map → known-errors-Bm4a61wL.d.ts.map} +1 -1
- package/dist/known-errors.d.ts +1 -1
- package/dist/{plan-usage-Dw09F0sh.d.ts → plan-usage-BaDxcLZ1.d.ts} +3 -3
- package/dist/{plan-usage-Dw09F0sh.d.ts.map → plan-usage-BaDxcLZ1.d.ts.map} +1 -1
- package/dist/{products-Cwn7_4uD.d.ts → products-D4o8A2W0.d.ts} +24 -24
- package/dist/{products-Cwn7_4uD.d.ts.map → products-D4o8A2W0.d.ts.map} +1 -1
- package/dist/{project-api-keys-CXTBQ2IZ.d.ts → project-api-keys--7V5X_UW.d.ts} +5 -5
- package/dist/{project-api-keys-CXTBQ2IZ.d.ts.map → project-api-keys--7V5X_UW.d.ts.map} +1 -1
- package/dist/{projects-Cw80wrT7.d.ts → projects-BX5Y50kJ.d.ts} +60 -60
- package/dist/{projects-Cw80wrT7.d.ts.map → projects-BX5Y50kJ.d.ts.map} +1 -1
- package/dist/{schema-DGZfskAR.d.ts → schema-dJ_7rUCO.d.ts} +221 -91
- package/dist/schema-dJ_7rUCO.d.ts.map +1 -0
- package/dist/{schema-fields-DPaAnhmc.d.ts → schema-fields-DZtDQEEO.d.ts} +5 -5
- package/dist/{schema-fields-DPaAnhmc.d.ts.map → schema-fields-DZtDQEEO.d.ts.map} +1 -1
- package/dist/schema-fields.d.ts +1 -1
- package/dist/{server-interface-BXeSO8Wj.d.ts → server-interface-Ra_vIHP4.d.ts} +8 -8
- package/dist/{server-interface-BXeSO8Wj.d.ts.map → server-interface-Ra_vIHP4.d.ts.map} +1 -1
- package/dist/{sessions-B7755rIu.d.ts → sessions-CI-0TBQb.d.ts} +13 -13
- package/dist/{sessions-B7755rIu.d.ts.map → sessions-CI-0TBQb.d.ts.map} +1 -1
- package/dist/sessions.d.ts +1 -1
- package/dist/{team-member-profiles-B9sAsj4g.d.ts → team-member-profiles-BoDEqx-0.d.ts} +27 -27
- package/dist/{team-member-profiles-B9sAsj4g.d.ts.map → team-member-profiles-BoDEqx-0.d.ts.map} +1 -1
- package/dist/{transactions-Brdmr3jE.d.ts → transactions-CHNUJ42J.d.ts} +21 -21
- package/dist/transactions-CHNUJ42J.d.ts.map +1 -0
- package/dist/{users-ydVQVHD_.d.ts → users-DHNRwoSz.d.ts} +18 -18
- package/dist/{users-ydVQVHD_.d.ts.map → users-DHNRwoSz.d.ts.map} +1 -1
- package/dist/utils/tar.d.ts +26 -0
- package/dist/utils/tar.d.ts.map +1 -0
- package/dist/utils/tar.js +138 -0
- package/dist/utils/tar.js.map +1 -0
- package/dist/{webhooks-ByXrdSOx.d.ts → webhooks-8Ts1Clcb.d.ts} +3 -3
- package/dist/{webhooks-ByXrdSOx.d.ts.map → webhooks-8Ts1Clcb.d.ts.map} +1 -1
- package/package.json +1 -1
- package/src/ai/unified-prompts/reminders.ts +1 -1
- package/src/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.ts +7 -7
- package/src/ai/unified-prompts/skill-site-prompt-parts/deployments-skill.ts +128 -0
- package/src/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.ts +1 -0
- package/src/ai/unified-prompts/skill-site-prompt.ts +15 -0
- package/src/apps/apps-config.ts +9 -0
- package/src/config/schema-fuzzer.test.ts +37 -0
- package/src/config/schema.ts +193 -0
- package/src/interface/admin-interface.ts +173 -0
- package/src/utils/tar.tsx +261 -0
- package/dist/admin-interface-BxUHaniY.d.ts.map +0 -1
- package/dist/schema-DGZfskAR.d.ts.map +0 -1
- package/dist/transactions-Brdmr3jE.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tar.js","names":[],"sources":["../../../src/utils/tar.tsx"],"sourcesContent":["// A minimal, dependency-free ustar (POSIX.1-1988) tarball writer/reader.\n//\n// Why hand-rolled: the `hexclave deploy` CLI packages a source directory into a\n// tarball and the backend unpacks it to forward the files to Vercel. Both ends\n// are our own code, so we only need the ustar subset we produce ourselves\n// (regular files + directories), and hand-rolling avoids adding an npm\n// dependency to the CLI and backend. The reader is intentionally strict — it\n// rejects anything our writer wouldn't produce (symlinks, PAX extensions,\n// absolute or `..` paths) because on the backend it processes untrusted user\n// uploads.\n\nimport { HexclaveAssertionError, StatusError } from \"./errors\";\n\nconst BLOCK_SIZE = 512;\n\nexport type TarEntry = {\n // Relative POSIX path, e.g. \"src/index.ts\". Directories end with \"/\".\n path: string,\n data: Uint8Array,\n};\n\nexport type TarLimits = {\n maxEntries: number,\n maxTotalBytes: number,\n};\n\nfunction writeOctal(header: Uint8Array, offset: number, length: number, value: number): void {\n if (value < 0 || !Number.isSafeInteger(value)) {\n throw new HexclaveAssertionError(`Invalid tar octal value: ${value}`);\n }\n const str = value.toString(8).padStart(length - 1, \"0\");\n if (str.length > length - 1) {\n throw new HexclaveAssertionError(`Tar octal value too large for field: ${value} (field length ${length})`);\n }\n for (let i = 0; i < str.length; i++) {\n header[offset + i] = str.charCodeAt(i);\n }\n // NUL terminator (field is left NUL-filled past the digits).\n}\n\nfunction writeString(header: Uint8Array, offset: number, length: number, value: string): void {\n const bytes = new TextEncoder().encode(value);\n if (bytes.length > length) {\n throw new HexclaveAssertionError(`Tar string too long for field: ${value}`);\n }\n header.set(bytes, offset);\n}\n\n// Splits a path into (prefix, name) fitting ustar's 155+100 byte fields.\n// Returns undefined if the path can't be represented.\nfunction splitUstarPath(path: string): { prefix: string, name: string } | undefined {\n const bytes = new TextEncoder().encode(path);\n if (bytes.length <= 100) {\n return { prefix: \"\", name: path };\n }\n // Find a \"/\" such that everything before it fits in prefix (<=155) and\n // everything after fits in name (<=100). Prefer the longest possible prefix.\n const parts = path.split(\"/\");\n for (let i = parts.length - 1; i > 0; i--) {\n const prefix = parts.slice(0, i).join(\"/\");\n const name = parts.slice(i).join(\"/\");\n const prefixLen = new TextEncoder().encode(prefix).length;\n const nameLen = new TextEncoder().encode(name).length;\n if (prefixLen <= 155 && nameLen > 0 && nameLen <= 100) {\n return { prefix, name };\n }\n }\n return undefined;\n}\n\n/**\n * Serializes entries into an (uncompressed) ustar tarball. Entries whose path\n * ends with \"/\" are written as directories and must have empty data.\n */\nexport function createTar(entries: TarEntry[]): Uint8Array<ArrayBuffer> {\n const chunks: Uint8Array[] = [];\n for (const entry of entries) {\n if (entry.path.startsWith(\"/\") || entry.path.split(\"/\").includes(\"..\") || entry.path === \"\") {\n throw new HexclaveAssertionError(`Invalid tar entry path: ${JSON.stringify(entry.path)}`);\n }\n const isDirectory = entry.path.endsWith(\"/\");\n if (isDirectory && entry.data.length > 0) {\n throw new HexclaveAssertionError(`Tar directory entry must have empty data: ${entry.path}`);\n }\n const split = splitUstarPath(entry.path) ?? throwPathTooLong(entry.path);\n const header = new Uint8Array(BLOCK_SIZE);\n writeString(header, 0, 100, split.name);\n writeOctal(header, 100, 8, isDirectory ? 0o755 : 0o644); // mode\n writeOctal(header, 108, 8, 0); // uid\n writeOctal(header, 116, 8, 0); // gid\n writeOctal(header, 124, 12, entry.data.length); // size\n writeOctal(header, 136, 12, 0); // mtime — fixed at 0 so tarballs are deterministic for identical input\n header[156] = isDirectory ? 0x35 /* '5' */ : 0x30 /* '0' */; // typeflag\n writeString(header, 257, 6, \"ustar\");\n header[263] = 0x30; // version \"00\"\n header[264] = 0x30;\n writeString(header, 345, 155, split.prefix);\n // Checksum: sum of all header bytes with the checksum field as spaces.\n header.fill(0x20, 148, 156);\n let checksum = 0;\n for (const byte of header) checksum += byte;\n header.fill(0, 148, 156);\n writeOctal(header, 148, 7, checksum);\n header[155] = 0x20;\n chunks.push(header);\n if (entry.data.length > 0) {\n chunks.push(entry.data);\n const padding = (BLOCK_SIZE - (entry.data.length % BLOCK_SIZE)) % BLOCK_SIZE;\n if (padding > 0) chunks.push(new Uint8Array(padding));\n }\n }\n chunks.push(new Uint8Array(2 * BLOCK_SIZE)); // end-of-archive marker\n const total = chunks.reduce((sum, c) => sum + c.length, 0);\n const result = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n}\n\nfunction throwPathTooLong(path: string): never {\n throw new StatusError(400, `File path too long to be packaged: ${JSON.stringify(path)}`);\n}\n\nfunction readString(block: Uint8Array, offset: number, length: number): string {\n let end = offset;\n while (end < offset + length && block[end] !== 0) end++;\n return new TextDecoder().decode(block.subarray(offset, end));\n}\n\nfunction readOctal(block: Uint8Array, offset: number, length: number): number {\n const str = readString(block, offset, length).trim();\n if (str === \"\") return 0;\n if (!/^[0-7]+$/.test(str)) {\n throw new StatusError(400, \"Invalid tarball: malformed octal header field\");\n }\n return parseInt(str, 8);\n}\n\n/**\n * Parses an (uncompressed) ustar tarball produced by `createTar` (or any tool\n * emitting the plain ustar subset). Strict by design — see module comment.\n * Directory entries are returned with a trailing \"/\" and empty data.\n *\n * Throws `StatusError(400, ...)` on malformed or unsafe input so backend routes\n * can surface it directly to the uploader.\n */\nexport function parseTar(bytes: Uint8Array, limits: TarLimits): TarEntry[] {\n const entries: TarEntry[] = [];\n let offset = 0;\n let totalBytes = 0;\n while (offset + BLOCK_SIZE <= bytes.length) {\n const header = bytes.subarray(offset, offset + BLOCK_SIZE);\n if (header.every((b) => b === 0)) {\n // End-of-archive marker (we accept a single zero block too).\n return entries;\n }\n const magic = readString(header, 257, 6);\n if (magic !== \"ustar\") {\n throw new StatusError(400, \"Invalid tarball: not a ustar archive\");\n }\n let expectedChecksum = 0;\n for (let i = 0; i < BLOCK_SIZE; i++) {\n expectedChecksum += (i >= 148 && i < 156) ? 0x20 : header[i];\n }\n if (readOctal(header, 148, 8) !== expectedChecksum) {\n throw new StatusError(400, \"Invalid tarball: header checksum mismatch\");\n }\n const typeflag = header[156];\n if (typeflag !== 0x30 && typeflag !== 0 && typeflag !== 0x35) {\n throw new StatusError(400, \"Invalid tarball: only regular files and directories are supported\");\n }\n const prefix = readString(header, 345, 155);\n const name = readString(header, 0, 100);\n const path = prefix === \"\" ? name : `${prefix}/${name}`;\n if (path === \"\" || path.startsWith(\"/\") || path.split(\"/\").includes(\"..\") || path.includes(\"\\\\\")) {\n throw new StatusError(400, `Invalid tarball: unsafe entry path ${JSON.stringify(path)}`);\n }\n const size = readOctal(header, 124, 12);\n const isDirectory = typeflag === 0x35;\n if (isDirectory && size !== 0) {\n throw new StatusError(400, \"Invalid tarball: directory entry with non-zero size\");\n }\n offset += BLOCK_SIZE;\n if (offset + size > bytes.length) {\n throw new StatusError(400, \"Invalid tarball: truncated file data\");\n }\n totalBytes += size;\n if (entries.length + 1 > limits.maxEntries) {\n throw new StatusError(400, `Tarball contains too many files (max ${limits.maxEntries})`);\n }\n if (totalBytes > limits.maxTotalBytes) {\n throw new StatusError(400, `Tarball contents too large (max ${limits.maxTotalBytes} bytes)`);\n }\n entries.push({\n path: isDirectory && !path.endsWith(\"/\") ? `${path}/` : path,\n data: bytes.slice(offset, offset + size),\n });\n offset += size + ((BLOCK_SIZE - (size % BLOCK_SIZE)) % BLOCK_SIZE);\n }\n throw new StatusError(400, \"Invalid tarball: missing end-of-archive marker\");\n}\n\nconst TEST_LIMITS: TarLimits = { maxEntries: 1000, maxTotalBytes: 10 * 1024 * 1024 };\n\nimport.meta.vitest?.test(\"createTar/parseTar roundtrip\", ({ expect }) => {\n const entries: TarEntry[] = [\n { path: \"package.json\", data: new TextEncoder().encode(`{\"name\":\"x\"}`) },\n { path: \"src/\", data: new Uint8Array(0) },\n { path: \"src/index.ts\", data: new TextEncoder().encode(\"export const a = 1;\\n\") },\n { path: \"empty.txt\", data: new Uint8Array(0) },\n { path: \"binary.bin\", data: new Uint8Array([0, 1, 2, 255, 254, 253]) },\n ];\n const tar = createTar(entries);\n expect(tar.length % 512).toBe(0);\n const parsed = parseTar(tar, TEST_LIMITS);\n expect(parsed.map((e) => e.path)).toEqual(entries.map((e) => e.path));\n for (let i = 0; i < entries.length; i++) {\n expect([...parsed[i].data]).toEqual([...entries[i].data]);\n }\n});\n\nimport.meta.vitest?.test(\"createTar/parseTar long paths use the ustar prefix field\", ({ expect }) => {\n const longDir = Array.from({ length: 12 }, (_, i) => `directory-number-${i}`).join(\"/\");\n const path = `${longDir}/file.txt`;\n expect(path.length).toBeGreaterThan(100);\n const tar = createTar([{ path, data: new TextEncoder().encode(\"hello\") }]);\n const parsed = parseTar(tar, TEST_LIMITS);\n expect(parsed).toHaveLength(1);\n expect(parsed[0].path).toBe(path);\n expect(new TextDecoder().decode(parsed[0].data)).toBe(\"hello\");\n});\n\nimport.meta.vitest?.test(\"createTar rejects unsafe paths\", ({ expect }) => {\n expect(() => createTar([{ path: \"/etc/passwd\", data: new Uint8Array(0) }])).toThrow();\n expect(() => createTar([{ path: \"../escape\", data: new Uint8Array(0) }])).toThrow();\n expect(() => createTar([{ path: \"a/../b\", data: new Uint8Array(0) }])).toThrow();\n expect(() => createTar([{ path: \"\", data: new Uint8Array(0) }])).toThrow();\n});\n\nimport.meta.vitest?.test(\"parseTar rejects malformed and unsafe archives\", ({ expect }) => {\n expect(() => parseTar(new Uint8Array(1024), TEST_LIMITS)).not.toThrow(); // all-zero = empty archive\n expect(() => parseTar(new TextEncoder().encode(\"too short to contain a single header block\"), TEST_LIMITS)).toThrow(\"missing end-of-archive marker\");\n const garbageBlock = new Uint8Array(512).fill(0x41 /* 'A' */);\n expect(() => parseTar(garbageBlock, TEST_LIMITS)).toThrow(\"not a ustar archive\");\n\n // Corrupt a valid archive's checksum.\n const tar = createTar([{ path: \"a.txt\", data: new TextEncoder().encode(\"hi\") }]);\n const corrupted = tar.slice();\n corrupted[0] ^= 0xff;\n expect(() => parseTar(corrupted, TEST_LIMITS)).toThrow(\"checksum mismatch\");\n\n // Truncated data section.\n expect(() => parseTar(tar.subarray(0, 512), TEST_LIMITS)).toThrow(\"truncated\");\n\n // Limits.\n expect(() => parseTar(tar, { maxEntries: 0, maxTotalBytes: 1000 })).toThrow(\"too many files\");\n expect(() => parseTar(tar, { maxEntries: 10, maxTotalBytes: 1 })).toThrow(\"too large\");\n});\n"],"mappings":";;AAaA,MAAM,aAAa;AAanB,SAAS,WAAW,QAAoB,QAAgB,QAAgB,OAAqB;CAC3F,IAAI,QAAQ,KAAK,CAAC,OAAO,cAAc,KAAK,GAC1C,MAAM,IAAI,uBAAuB,4BAA4B,OAAO;CAEtE,MAAM,MAAM,MAAM,SAAS,CAAC,CAAC,CAAC,SAAS,SAAS,GAAG,GAAG;CACtD,IAAI,IAAI,SAAS,SAAS,GACxB,MAAM,IAAI,uBAAuB,wCAAwC,MAAM,iBAAiB,OAAO,EAAE;CAE3G,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAC9B,OAAO,SAAS,KAAK,IAAI,WAAW,CAAC;AAGzC;AAEA,SAAS,YAAY,QAAoB,QAAgB,QAAgB,OAAqB;CAC5F,MAAM,QAAQ,IAAI,YAAY,CAAC,CAAC,OAAO,KAAK;CAC5C,IAAI,MAAM,SAAS,QACjB,MAAM,IAAI,uBAAuB,kCAAkC,OAAO;CAE5E,OAAO,IAAI,OAAO,MAAM;AAC1B;AAIA,SAAS,eAAe,MAA4D;CAElF,IADc,IAAI,YAAY,CAAC,CAAC,OAAO,IAC/B,CAAC,CAAC,UAAU,KAClB,OAAO;EAAE,QAAQ;EAAI,MAAM;CAAK;CAIlC,MAAM,QAAQ,KAAK,MAAM,GAAG;CAC5B,KAAK,IAAI,IAAI,MAAM,SAAS,GAAG,IAAI,GAAG,KAAK;EACzC,MAAM,SAAS,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG;EACzC,MAAM,OAAO,MAAM,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG;EACpC,MAAM,YAAY,IAAI,YAAY,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC;EACnD,MAAM,UAAU,IAAI,YAAY,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;EAC/C,IAAI,aAAa,OAAO,UAAU,KAAK,WAAW,KAChD,OAAO;GAAE;GAAQ;EAAK;CAE1B;AAEF;;;;;AAMA,SAAgB,UAAU,SAA8C;CACtE,MAAM,SAAuB,CAAC;CAC9B,KAAK,MAAM,SAAS,SAAS;EAC3B,IAAI,MAAM,KAAK,WAAW,GAAG,KAAK,MAAM,KAAK,MAAM,GAAG,CAAC,CAAC,SAAS,IAAI,KAAK,MAAM,SAAS,IACvF,MAAM,IAAI,uBAAuB,2BAA2B,KAAK,UAAU,MAAM,IAAI,GAAG;EAE1F,MAAM,cAAc,MAAM,KAAK,SAAS,GAAG;EAC3C,IAAI,eAAe,MAAM,KAAK,SAAS,GACrC,MAAM,IAAI,uBAAuB,6CAA6C,MAAM,MAAM;EAE5F,MAAM,QAAQ,eAAe,MAAM,IAAI,KAAK,iBAAiB,MAAM,IAAI;EACvE,MAAM,SAAS,IAAI,WAAW,UAAU;EACxC,YAAY,QAAQ,GAAG,KAAK,MAAM,IAAI;EACtC,WAAW,QAAQ,KAAK,GAAG,cAAc,MAAQ,GAAK;EACtD,WAAW,QAAQ,KAAK,GAAG,CAAC;EAC5B,WAAW,QAAQ,KAAK,GAAG,CAAC;EAC5B,WAAW,QAAQ,KAAK,IAAI,MAAM,KAAK,MAAM;EAC7C,WAAW,QAAQ,KAAK,IAAI,CAAC;EAC7B,OAAO,OAAO,cAAc,KAAiB;EAC7C,YAAY,QAAQ,KAAK,GAAG,OAAO;EACnC,OAAO,OAAO;EACd,OAAO,OAAO;EACd,YAAY,QAAQ,KAAK,KAAK,MAAM,MAAM;EAE1C,OAAO,KAAK,IAAM,KAAK,GAAG;EAC1B,IAAI,WAAW;EACf,KAAK,MAAM,QAAQ,QAAQ,YAAY;EACvC,OAAO,KAAK,GAAG,KAAK,GAAG;EACvB,WAAW,QAAQ,KAAK,GAAG,QAAQ;EACnC,OAAO,OAAO;EACd,OAAO,KAAK,MAAM;EAClB,IAAI,MAAM,KAAK,SAAS,GAAG;GACzB,OAAO,KAAK,MAAM,IAAI;GACtB,MAAM,WAAW,aAAc,MAAM,KAAK,SAAS,cAAe;GAClE,IAAI,UAAU,GAAG,OAAO,KAAK,IAAI,WAAW,OAAO,CAAC;EACtD;CACF;CACA,OAAO,KAAK,IAAI,WAAW,IAAI,UAAU,CAAC;CAC1C,MAAM,QAAQ,OAAO,QAAQ,KAAK,MAAM,MAAM,EAAE,QAAQ,CAAC;CACzD,MAAM,SAAS,IAAI,WAAW,KAAK;CACnC,IAAI,SAAS;CACb,KAAK,MAAM,SAAS,QAAQ;EAC1B,OAAO,IAAI,OAAO,MAAM;EACxB,UAAU,MAAM;CAClB;CACA,OAAO;AACT;AAEA,SAAS,iBAAiB,MAAqB;CAC7C,MAAM,IAAI,YAAY,KAAK,sCAAsC,KAAK,UAAU,IAAI,GAAG;AACzF;AAEA,SAAS,WAAW,OAAmB,QAAgB,QAAwB;CAC7E,IAAI,MAAM;CACV,OAAO,MAAM,SAAS,UAAU,MAAM,SAAS,GAAG;CAClD,OAAO,IAAI,YAAY,CAAC,CAAC,OAAO,MAAM,SAAS,QAAQ,GAAG,CAAC;AAC7D;AAEA,SAAS,UAAU,OAAmB,QAAgB,QAAwB;CAC5E,MAAM,MAAM,WAAW,OAAO,QAAQ,MAAM,CAAC,CAAC,KAAK;CACnD,IAAI,QAAQ,IAAI,OAAO;CACvB,IAAI,CAAC,WAAW,KAAK,GAAG,GACtB,MAAM,IAAI,YAAY,KAAK,+CAA+C;CAE5E,OAAO,SAAS,KAAK,CAAC;AACxB;;;;;;;;;AAUA,SAAgB,SAAS,OAAmB,QAA+B;CACzE,MAAM,UAAsB,CAAC;CAC7B,IAAI,SAAS;CACb,IAAI,aAAa;CACjB,OAAO,SAAS,cAAc,MAAM,QAAQ;EAC1C,MAAM,SAAS,MAAM,SAAS,QAAQ,SAAS,UAAU;EACzD,IAAI,OAAO,OAAO,MAAM,MAAM,CAAC,GAE7B,OAAO;EAGT,IADc,WAAW,QAAQ,KAAK,CAC9B,MAAM,SACZ,MAAM,IAAI,YAAY,KAAK,sCAAsC;EAEnE,IAAI,mBAAmB;EACvB,KAAK,IAAI,IAAI,GAAG,IAAI,YAAY,KAC9B,oBAAqB,KAAK,OAAO,IAAI,MAAO,KAAO,OAAO;EAE5D,IAAI,UAAU,QAAQ,KAAK,CAAC,MAAM,kBAChC,MAAM,IAAI,YAAY,KAAK,2CAA2C;EAExE,MAAM,WAAW,OAAO;EACxB,IAAI,aAAa,MAAQ,aAAa,KAAK,aAAa,IACtD,MAAM,IAAI,YAAY,KAAK,mEAAmE;EAEhG,MAAM,SAAS,WAAW,QAAQ,KAAK,GAAG;EAC1C,MAAM,OAAO,WAAW,QAAQ,GAAG,GAAG;EACtC,MAAM,OAAO,WAAW,KAAK,OAAO,GAAG,OAAO,GAAG;EACjD,IAAI,SAAS,MAAM,KAAK,WAAW,GAAG,KAAK,KAAK,MAAM,GAAG,CAAC,CAAC,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,GAC7F,MAAM,IAAI,YAAY,KAAK,sCAAsC,KAAK,UAAU,IAAI,GAAG;EAEzF,MAAM,OAAO,UAAU,QAAQ,KAAK,EAAE;EACtC,MAAM,cAAc,aAAa;EACjC,IAAI,eAAe,SAAS,GAC1B,MAAM,IAAI,YAAY,KAAK,qDAAqD;EAElF,UAAU;EACV,IAAI,SAAS,OAAO,MAAM,QACxB,MAAM,IAAI,YAAY,KAAK,sCAAsC;EAEnE,cAAc;EACd,IAAI,QAAQ,SAAS,IAAI,OAAO,YAC9B,MAAM,IAAI,YAAY,KAAK,wCAAwC,OAAO,WAAW,EAAE;EAEzF,IAAI,aAAa,OAAO,eACtB,MAAM,IAAI,YAAY,KAAK,mCAAmC,OAAO,cAAc,QAAQ;EAE7F,QAAQ,KAAK;GACX,MAAM,eAAe,CAAC,KAAK,SAAS,GAAG,IAAI,GAAG,KAAK,KAAK;GACxD,MAAM,MAAM,MAAM,QAAQ,SAAS,IAAI;EACzC,CAAC;EACD,UAAU,QAAS,aAAc,OAAO,cAAe;CACzD;CACA,MAAM,IAAI,YAAY,KAAK,gDAAgD;AAC7E"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as KnownErrors } from "../known-errors-
|
|
1
|
+
import { a as KnownErrors } from "../known-errors-Bm4a61wL.js";
|
|
2
2
|
//#region src/helpers/password.d.ts
|
|
3
3
|
declare function getPasswordError(password: string): KnownErrors["PasswordRequirementsNotMet"] | undefined;
|
|
4
4
|
//#endregion
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as KnownErrors, n as KnownError } from "./known-errors-
|
|
2
|
-
import { n as HexclaveClientInterface } from "./client-interface-
|
|
3
|
-
import { t as HexclaveServerInterface } from "./server-interface-
|
|
4
|
-
import {
|
|
1
|
+
import { a as KnownErrors, n as KnownError } from "./known-errors-Bm4a61wL.js";
|
|
2
|
+
import { n as HexclaveClientInterface } from "./client-interface-DvkciaL0.js";
|
|
3
|
+
import { t as HexclaveServerInterface } from "./server-interface-Ra_vIHP4.js";
|
|
4
|
+
import { l as HexclaveAdminInterface } from "./admin-interface-D63SFHX_.js";
|
|
5
5
|
export { HexclaveAdminInterface, HexclaveClientInterface, HexclaveServerInterface, KnownError, KnownErrors };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { n as PlanUsageResponse } from "../plan-usage-
|
|
2
|
-
import { a as InternalApiKeyCreateCrudResponse, i as
|
|
3
|
-
export { AdminAuthApplicationOptions, ChatContent, HexclaveAdminInterface, InternalApiKeyCreateCrudRequest, InternalApiKeyCreateCrudResponse, type PlanUsageResponse };
|
|
1
|
+
import { n as PlanUsageResponse } from "../plan-usage-BaDxcLZ1.js";
|
|
2
|
+
import { a as AdminDeploymentRunJson, c as ChatContent, d as InternalApiKeyCreateCrudResponse, i as AdminDeploymentEnvVarOptions, l as HexclaveAdminInterface, n as AdminDeploymentDomainJson, o as AdminDeploymentServiceBuildOptions, r as AdminDeploymentEnvVarJson, s as AdminDeploymentServiceJson, t as AdminAuthApplicationOptions, u as InternalApiKeyCreateCrudRequest } from "../admin-interface-D63SFHX_.js";
|
|
3
|
+
export { AdminAuthApplicationOptions, AdminDeploymentDomainJson, AdminDeploymentEnvVarJson, AdminDeploymentEnvVarOptions, AdminDeploymentRunJson, AdminDeploymentServiceBuildOptions, AdminDeploymentServiceJson, ChatContent, HexclaveAdminInterface, InternalApiKeyCreateCrudRequest, InternalApiKeyCreateCrudResponse, type PlanUsageResponse };
|
|
@@ -547,6 +547,54 @@ var HexclaveAdminInterface = class extends __server_interface_js.HexclaveServerI
|
|
|
547
547
|
body: JSON.stringify(data)
|
|
548
548
|
}, null)).json();
|
|
549
549
|
}
|
|
550
|
+
async listDeploymentServices() {
|
|
551
|
+
return (await (await this.sendAdminRequest("/deployments/services", { method: "GET" }, null)).json()).items;
|
|
552
|
+
}
|
|
553
|
+
async createDeploymentService(id, build) {
|
|
554
|
+
return await (await this.sendAdminRequest("/deployments/services", {
|
|
555
|
+
method: "POST",
|
|
556
|
+
headers: { "content-type": "application/json" },
|
|
557
|
+
body: JSON.stringify({
|
|
558
|
+
id,
|
|
559
|
+
...build
|
|
560
|
+
})
|
|
561
|
+
}, null)).json();
|
|
562
|
+
}
|
|
563
|
+
async updateDeploymentService(serviceId, update) {
|
|
564
|
+
return await (await this.sendAdminRequest(___utils_urls_js.urlString`/deployments/services/${serviceId}`, {
|
|
565
|
+
method: "PATCH",
|
|
566
|
+
headers: { "content-type": "application/json" },
|
|
567
|
+
body: JSON.stringify(update)
|
|
568
|
+
}, null)).json();
|
|
569
|
+
}
|
|
570
|
+
async deleteDeploymentService(serviceId) {
|
|
571
|
+
await this.sendAdminRequest(___utils_urls_js.urlString`/deployments/services/${serviceId}`, { method: "DELETE" }, null);
|
|
572
|
+
}
|
|
573
|
+
async listDeploymentRuns(serviceId, options) {
|
|
574
|
+
return (await (await this.sendAdminRequest(___utils_urls_js.urlString`/deployments/services/${serviceId}/runs` + (options?.limit !== void 0 ? `?limit=${options.limit}` : ""), { method: "GET" }, null)).json()).items;
|
|
575
|
+
}
|
|
576
|
+
async getDeploymentRunLogs(runId, options) {
|
|
577
|
+
return await (await this.sendAdminRequest(___utils_urls_js.urlString`/deployments/runs/${runId}/logs`, {
|
|
578
|
+
method: "GET",
|
|
579
|
+
signal: options?.signal
|
|
580
|
+
}, null)).text();
|
|
581
|
+
}
|
|
582
|
+
async addDeploymentServiceDomain(serviceId, hostname, options) {
|
|
583
|
+
await this.sendAdminRequest(___utils_urls_js.urlString`/deployments/services/${serviceId}/domains`, {
|
|
584
|
+
method: "POST",
|
|
585
|
+
headers: { "content-type": "application/json" },
|
|
586
|
+
body: JSON.stringify({
|
|
587
|
+
hostname,
|
|
588
|
+
...options?.isPrimary ? { is_primary: true } : {}
|
|
589
|
+
})
|
|
590
|
+
}, null);
|
|
591
|
+
}
|
|
592
|
+
async getDeploymentServiceDomain(serviceId, hostname) {
|
|
593
|
+
return await (await this.sendAdminRequest(___utils_urls_js.urlString`/deployments/services/${serviceId}/domains/${hostname}`, { method: "GET" }, null)).json();
|
|
594
|
+
}
|
|
595
|
+
async deleteDeploymentServiceDomain(serviceId, hostname) {
|
|
596
|
+
await this.sendAdminRequest(___utils_urls_js.urlString`/deployments/services/${serviceId}/domains/${hostname}`, { method: "DELETE" }, null);
|
|
597
|
+
}
|
|
550
598
|
};
|
|
551
599
|
//#endregion
|
|
552
600
|
exports.HexclaveAdminInterface = HexclaveAdminInterface;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-interface.js","names":["HexclaveServerInterface","Result","KnownErrors"],"sources":["../../src/interface/admin-interface.ts"],"sourcesContent":["import * as yup from \"yup\";\nimport type { EnvironmentConfigOverrideOverride } from \"../config/schema\";\nimport { KnownErrors } from \"../known-errors\";\nimport { branchConfigSourceSchema, type ConfigAgentRunApi, type RestrictedReason } from \"../schema-fields\";\nimport { AccessToken, InternalSession, RefreshToken } from \"../sessions\";\nimport type { MoneyAmount } from \"../utils/currency-constants\";\nimport { Result } from \"../utils/results\";\nimport { urlString } from \"../utils/urls\";\nimport type { AnalyticsClickmapDevice, AnalyticsClickmapKind, AnalyticsClickmapResponse, AnalyticsClickmapTokenResponse, MetricsResponse, MetricsUserCounts, UserActivityResponse } from \"./admin-metrics\";\nimport { EmailOutboxCrud } from \"./crud/email-outbox\";\nimport { InternalEmailsCrud } from \"./crud/emails\";\nimport { InternalApiKeysCrud } from \"./crud/internal-api-keys\";\nimport { ProjectPermissionDefinitionsCrud } from \"./crud/project-permissions\";\nimport { ProjectsCrud } from \"./crud/projects\";\nimport type {\n AdminGetSessionReplayAllEventsResponse,\n AdminGetSessionReplayChunkEventsResponse,\n AdminGetSessionReplayResponse,\n AdminListSessionReplayChunksOptions,\n AdminListSessionReplayChunksResponse,\n AdminListSessionReplaysOptions,\n AdminListSessionReplaysResponse\n} from \"./crud/session-replays\";\nimport { SvixTokenCrud } from \"./crud/svix-token\";\nimport { TeamPermissionDefinitionsCrud } from \"./crud/team-permissions\";\nimport type { Transaction, TransactionType } from \"./crud/transactions\";\nimport type { PlanUsageResponse } from \"./plan-usage\";\nimport { HexclaveServerInterface, ServerAuthApplicationOptions } from \"./server-interface\";\n\nexport type { PlanUsageResponse } from \"./plan-usage\";\n\ntype BranchConfigSourceApi = yup.InferType<typeof branchConfigSourceSchema>;\n\nexport type ChatContent = Array<\n | { type: \"text\", text: string }\n | { type: \"tool-call\", toolName: string, toolCallId: string, args: any, argsText: string, result: any }\n>;\n\nexport type AdminAuthApplicationOptions = ServerAuthApplicationOptions &(\n | {\n superSecretAdminKey: string,\n }\n | {\n projectOwnerSession: InternalSession | (() => Promise<string | null>),\n }\n);\n\nexport type InternalApiKeyCreateCrudRequest = {\n has_publishable_client_key: boolean,\n has_secret_server_key: boolean,\n has_super_secret_admin_key: boolean,\n expires_at_millis: number,\n description: string,\n};\n\nexport type InternalApiKeyCreateCrudResponse = InternalApiKeysCrud[\"Admin\"][\"Read\"] & {\n publishable_client_key?: string,\n secret_server_key?: string,\n super_secret_admin_key?: string,\n};\n\n\nexport class HexclaveAdminInterface extends HexclaveServerInterface {\n constructor(public readonly options: AdminAuthApplicationOptions) {\n super(options);\n }\n\n public async sendAdminRequest(path: string, options: RequestInit, session: InternalSession | null, requestType: \"admin\" = \"admin\") {\n return await this.sendServerRequest(\n path,\n {\n ...options,\n headers: {\n // Hexclave rebrand: emit x-hexclave-* request header; the backend proxy dual-accepts both names.\n \"x-hexclave-super-secret-admin-key\": \"superSecretAdminKey\" in this.options ? this.options.superSecretAdminKey : \"\",\n ...options.headers,\n },\n },\n session,\n requestType,\n );\n }\n\n protected async sendAdminRequestAndCatchKnownError<E extends typeof KnownErrors[keyof KnownErrors]>(\n path: string,\n requestOptions: RequestInit,\n tokenStoreOrNull: InternalSession | null,\n errorsToCatch: readonly E[],\n ): Promise<Result<\n Response & {\n usedTokens: {\n accessToken: AccessToken,\n refreshToken: RefreshToken | null,\n } | null,\n },\n InstanceType<E>\n >> {\n try {\n return Result.ok(await this.sendAdminRequest(path, requestOptions, tokenStoreOrNull));\n } catch (e) {\n for (const errorType of errorsToCatch) {\n if (errorType.isInstance(e)) {\n return Result.error(e as InstanceType<E>);\n }\n }\n throw e;\n }\n }\n\n async getProject(): Promise<ProjectsCrud[\"Admin\"][\"Read\"]> {\n const response = await this.sendAdminRequest(\n \"/internal/projects/current\",\n {\n method: \"GET\",\n },\n null,\n );\n return await response.json();\n }\n\n async updateProject(update: ProjectsCrud[\"Admin\"][\"Update\"]): Promise<ProjectsCrud[\"Admin\"][\"Read\"]> {\n const response = await this.sendAdminRequest(\n \"/internal/projects/current\",\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(update),\n },\n null,\n );\n return await response.json();\n }\n\n async createInternalApiKey(\n options: InternalApiKeyCreateCrudRequest,\n ): Promise<InternalApiKeyCreateCrudResponse> {\n const response = await this.sendAdminRequest(\n \"/internal/api-keys\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(options),\n },\n null,\n );\n return await response.json();\n }\n\n async listInternalApiKeys(): Promise<InternalApiKeysCrud[\"Admin\"][\"Read\"][]> {\n const response = await this.sendAdminRequest(\"/internal/api-keys\", {}, null);\n const result = await response.json() as InternalApiKeysCrud[\"Admin\"][\"List\"];\n return result.items;\n }\n\n async revokeInternalApiKeyById(id: string) {\n await this.sendAdminRequest(\n `/internal/api-keys/${id}`, {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n revoked: true,\n }),\n },\n null,\n );\n }\n\n async getInternalApiKey(id: string, session: InternalSession): Promise<InternalApiKeysCrud[\"Admin\"][\"Read\"]> {\n const response = await this.sendAdminRequest(`/internal/api-keys/${id}`, {}, session);\n return await response.json();\n }\n\n async listInternalEmailTemplates(): Promise<{ id: string, display_name: string, theme_id?: string, tsx_source: string }[]> {\n const response = await this.sendAdminRequest(`/internal/email-templates`, {}, null);\n const result = await response.json() as { templates: { id: string, display_name: string, theme_id?: string, tsx_source: string }[] };\n return result.templates;\n }\n\n async listInternalEmailDrafts(): Promise<{ id: string, display_name: string, theme_id?: string | undefined | false, tsx_source: string, sent_at_millis?: number | null }[]> {\n const response = await this.sendAdminRequest(`/internal/email-drafts`, {}, null);\n const result = await response.json() as { drafts: { id: string, display_name: string, theme_id?: string | undefined | false, tsx_source: string, sent_at_millis?: number | null }[] };\n return result.drafts;\n }\n\n async createEmailDraft(options: { display_name?: string, theme_id?: string | false, tsx_source?: string }): Promise<{ id: string }> {\n const response = await this.sendAdminRequest(\n `/internal/email-drafts`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(options),\n },\n null,\n );\n return await response.json();\n }\n\n async updateEmailDraft(id: string, data: { display_name?: string, theme_id?: string | null | false, tsx_source?: string, sent_at_millis?: number | null }): Promise<void> {\n await this.sendAdminRequest(\n `/internal/email-drafts/${id}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n }\n\n async deleteEmailDraft(id: string): Promise<void> {\n await this.sendAdminRequest(\n `/internal/email-drafts/${id}`,\n {\n method: \"DELETE\",\n },\n null,\n );\n }\n\n async listEmailThemes(): Promise<{ id: string, display_name: string }[]> {\n const response = await this.sendAdminRequest(`/internal/email-themes`, {}, null);\n const result = await response.json() as { themes: { id: string, display_name: string }[] };\n return result.themes;\n }\n\n\n // Team permission definitions methods\n async listTeamPermissionDefinitions(): Promise<TeamPermissionDefinitionsCrud['Admin']['Read'][]> {\n const response = await this.sendAdminRequest(`/team-permission-definitions`, {}, null);\n const result = await response.json() as TeamPermissionDefinitionsCrud['Admin']['List'];\n return result.items;\n }\n\n async listTeamPermissionDefinitionsPaginated(\n options: { limit: number, cursor?: string, query?: string },\n ): Promise<{ items: TeamPermissionDefinitionsCrud['Admin']['Read'][], nextCursor: string | null }> {\n const params = new URLSearchParams();\n params.set(\"limit\", String(options.limit));\n if (options.cursor) params.set(\"cursor\", options.cursor);\n if (options.query) params.set(\"query\", options.query);\n const response = await this.sendAdminRequest(`/team-permission-definitions?${params.toString()}`, {}, null);\n const result = await response.json() as TeamPermissionDefinitionsCrud['Admin']['List'];\n return {\n items: result.items,\n nextCursor: result.pagination?.next_cursor ?? null,\n };\n }\n\n async createTeamPermissionDefinition(data: TeamPermissionDefinitionsCrud['Admin']['Create']): Promise<TeamPermissionDefinitionsCrud['Admin']['Read']> {\n const response = await this.sendAdminRequest(\n \"/team-permission-definitions\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n async updateTeamPermissionDefinition(permissionId: string, data: TeamPermissionDefinitionsCrud['Admin']['Update']): Promise<TeamPermissionDefinitionsCrud['Admin']['Read']> {\n const response = await this.sendAdminRequest(\n `/team-permission-definitions/${permissionId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n async deleteTeamPermissionDefinition(permissionId: string): Promise<void> {\n await this.sendAdminRequest(\n `/team-permission-definitions/${permissionId}`,\n { method: \"DELETE\" },\n null,\n );\n }\n\n async listProjectPermissionDefinitions(): Promise<ProjectPermissionDefinitionsCrud['Admin']['Read'][]> {\n const response = await this.sendAdminRequest(`/project-permission-definitions`, {}, null);\n const result = await response.json() as ProjectPermissionDefinitionsCrud['Admin']['List'];\n return result.items;\n }\n\n async createProjectPermissionDefinition(data: ProjectPermissionDefinitionsCrud['Admin']['Create']): Promise<ProjectPermissionDefinitionsCrud['Admin']['Read']> {\n const response = await this.sendAdminRequest(\n \"/project-permission-definitions\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n async updateProjectPermissionDefinition(permissionId: string, data: ProjectPermissionDefinitionsCrud['Admin']['Update']): Promise<ProjectPermissionDefinitionsCrud['Admin']['Read']> {\n const response = await this.sendAdminRequest(\n `/project-permission-definitions/${permissionId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n async deleteProjectPermissionDefinition(permissionId: string): Promise<void> {\n await this.sendAdminRequest(\n `/project-permission-definitions/${permissionId}`,\n { method: \"DELETE\" },\n null,\n );\n }\n\n async getSvixToken(): Promise<SvixTokenCrud[\"Admin\"][\"Read\"]> {\n const response = await this.sendAdminRequest(\n \"/webhooks/svix-token\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n null,\n );\n return await response.json();\n }\n\n async deleteProject(): Promise<void> {\n await this.sendAdminRequest(\n \"/internal/projects/current\",\n {\n method: \"DELETE\",\n },\n null,\n );\n }\n\n async getMetrics(\n includeAnonymous: boolean = false,\n filters?: {\n country_code?: string,\n referrer?: string,\n browser?: string,\n os?: string,\n device?: string,\n since?: string,\n until?: string,\n },\n ): Promise<MetricsResponse> {\n const params = new URLSearchParams();\n if (includeAnonymous) {\n params.append('include_anonymous', 'true');\n }\n if (filters?.country_code) params.append('filter_country_code', filters.country_code);\n if (filters?.referrer) params.append('filter_referrer', filters.referrer);\n if (filters?.browser) params.append('filter_browser', filters.browser);\n if (filters?.os) params.append('filter_os', filters.os);\n if (filters?.device) params.append('filter_device', filters.device);\n if (filters?.since) params.append('filter_since', filters.since);\n if (filters?.until) params.append('filter_until', filters.until);\n const queryString = params.toString();\n const response = await this.sendAdminRequest(\n `/internal/metrics${queryString ? `?${queryString}` : ''}`,\n {\n method: \"GET\",\n },\n null,\n );\n const body = (await response.json()) as MetricsResponse;\n // The yup schema's .optional().default(...) fallbacks only run during\n // backend response validation, not on this client-side cast — apply them\n // here too so the one-release-cycle tolerance for older servers that the\n // schema comments promise actually holds for dashboard consumers. The\n // Partial views widen the static type (which claims these are always\n // defined) to match what an older server can actually send.\n const rawBody: Partial<MetricsResponse> = body;\n const rawAnalytics: Partial<MetricsResponse[\"analytics_overview\"]> = body.analytics_overview;\n return {\n ...body,\n live_users: rawBody.live_users ?? 0,\n hourly_users: rawBody.hourly_users ?? [],\n hourly_active_users: rawBody.hourly_active_users ?? [],\n analytics_overview: {\n ...body.analytics_overview,\n hourly_page_views: rawAnalytics.hourly_page_views ?? [],\n hourly_active_users: rawAnalytics.hourly_active_users ?? [],\n hourly_visitors: rawAnalytics.hourly_visitors ?? [],\n daily_anonymous_visitors_fallback: rawAnalytics.daily_anonymous_visitors_fallback ?? [],\n anonymous_visitors_fallback: rawAnalytics.anonymous_visitors_fallback ?? 0,\n top_regions: rawAnalytics.top_regions ?? [],\n bounce_rate: rawAnalytics.bounce_rate ?? 0,\n daily_bounce_rate: rawAnalytics.daily_bounce_rate ?? [],\n daily_avg_session_seconds: rawAnalytics.daily_avg_session_seconds ?? [],\n top_browsers: rawAnalytics.top_browsers ?? [],\n top_operating_systems: rawAnalytics.top_operating_systems ?? [],\n top_devices: rawAnalytics.top_devices ?? [],\n },\n };\n }\n\n async getPlanUsage(): Promise<PlanUsageResponse> {\n const response = await this.sendAdminRequest(\n \"/internal/plan-usage\",\n {\n method: \"GET\",\n },\n null,\n );\n return await response.json();\n }\n\n async getUserActivity(userId: string): Promise<UserActivityResponse> {\n const response = await this.sendAdminRequest(\n urlString`/internal/user-activity?user_id=${userId}`,\n {\n method: \"GET\",\n },\n null,\n );\n return (await response.json()) as UserActivityResponse;\n }\n\n async getAnalyticsClickmap(options: {\n kind: AnalyticsClickmapKind,\n member_user_ids?: string[],\n route_path?: string,\n route_regex?: string,\n url_pattern?: string,\n user_id?: string,\n replay_id?: string,\n device?: AnalyticsClickmapDevice,\n viewport_width_min?: number,\n viewport_width_max?: number,\n sampling?: number,\n since: string,\n until: string,\n }): Promise<AnalyticsClickmapResponse> {\n const response = await this.sendAdminRequest(\n \"/internal/analytics/clickmap\",\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(options),\n },\n null,\n );\n return (await response.json()) as AnalyticsClickmapResponse;\n }\n\n async createAnalyticsClickmapToken(options: {\n origin: string,\n }): Promise<AnalyticsClickmapTokenResponse> {\n const response = await this.sendAdminRequest(\n \"/internal/analytics/clickmap-token\",\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(options),\n },\n null,\n );\n return (await response.json()) as AnalyticsClickmapTokenResponse;\n }\n\n async getMetricsUserCounts(): Promise<MetricsUserCounts> {\n const response = await this.sendAdminRequest(\n \"/internal/metrics/user-counts\",\n {\n method: \"GET\",\n },\n null,\n );\n return (await response.json()) as MetricsUserCounts;\n }\n\n async sendTestEmail(data: {\n recipient_email: string,\n email_config: {\n host: string,\n port: number,\n username: string,\n password: string,\n sender_email: string,\n sender_name: string,\n },\n }): Promise<{ success: boolean, error_message?: string }> {\n const response = await this.sendAdminRequest(`/internal/send-test-email`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }, null);\n return await response.json();\n }\n\n async sendTestWebhook(data: {\n endpoint_id: string,\n }): Promise<{ success: boolean, error_message?: string }> {\n const response = await this.sendAdminRequest(`/internal/send-test-webhook`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }, null);\n return await response.json();\n }\n\n async listSentEmails(): Promise<InternalEmailsCrud[\"Admin\"][\"List\"]> {\n const response = await this.sendAdminRequest(\"/internal/emails\", {\n method: \"GET\",\n }, null);\n return await response.json();\n }\n\n async setupManagedEmailProvider(data: {\n subdomain: string,\n sender_local_part: string,\n }): Promise<{\n domain_id: string,\n subdomain: string,\n sender_local_part: string,\n name_server_records: string[],\n status: \"pending_dns\" | \"pending_verification\" | \"verified\" | \"applied\" | \"failed\",\n }> {\n const response = await this.sendAdminRequest(\"/internal/emails/managed-onboarding/setup\", {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }, null);\n return await response.json();\n }\n\n async checkManagedEmailStatus(data: {\n domain_id: string,\n subdomain: string,\n sender_local_part: string,\n }): Promise<{ status: \"pending_dns\" | \"pending_verification\" | \"verified\" | \"applied\" | \"failed\" }> {\n const response = await this.sendAdminRequest(\"/internal/emails/managed-onboarding/check\", {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }, null);\n return await response.json();\n }\n\n async listManagedEmailDomains(): Promise<{\n items: Array<{\n domain_id: string,\n subdomain: string,\n sender_local_part: string,\n status: \"pending_dns\" | \"pending_verification\" | \"verified\" | \"applied\" | \"failed\",\n name_server_records: string[],\n }>,\n }> {\n const response = await this.sendAdminRequest(\"/internal/emails/managed-onboarding/list\", {\n method: \"GET\",\n }, null);\n return await response.json();\n }\n\n async deleteManagedEmailDomain(data: {\n resend_domain_id: string,\n }): Promise<{ status: \"deleted\" }> {\n const response = await this.sendAdminRequest(\"/internal/emails/managed-onboarding/delete\", {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }, null);\n return await response.json();\n }\n\n async applyManagedEmailProvider(data: {\n domain_id: string,\n }): Promise<{ status: \"applied\" }> {\n const response = await this.sendAdminRequest(\"/internal/emails/managed-onboarding/apply\", {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }, null);\n return await response.json();\n }\n\n async sendSignInInvitationEmail(\n email: string,\n callbackUrl: string,\n ): Promise<void> {\n await this.sendAdminRequest(\n \"/internal/send-sign-in-invitation\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n email,\n callback_url: callbackUrl,\n }),\n },\n null,\n );\n }\n\n async saveChatMessage(threadId: string, message: any): Promise<void> {\n await this.sendAdminRequest(\n `/internal/ai-chat/${threadId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ message }),\n },\n null,\n );\n }\n\n async listChatMessages(threadId: string): Promise<{ messages: Array<any> }> {\n const response = await this.sendAdminRequest(\n `/internal/ai-chat/${threadId}`,\n { method: \"GET\" },\n null,\n );\n return await response.json();\n }\n\n async renderEmailPreview(options: {\n themeId?: string | null | false,\n themeTsxSource?: string,\n templateId?: string,\n templateTsxSource?: string,\n editableMarkers?: boolean,\n editableSource?: 'template' | 'theme' | 'both',\n }): Promise<{ html: string, editable_regions?: Record<string, unknown> }> {\n const response = await this.sendAdminRequest(`/emails/render-email`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n theme_id: options.themeId,\n theme_tsx_source: options.themeTsxSource,\n template_id: options.templateId,\n template_tsx_source: options.templateTsxSource,\n editable_markers: options.editableMarkers,\n editable_source: options.editableSource,\n }),\n }, null);\n return await response.json();\n }\n\n async rewriteTemplateSourceWithAI(templateTsxSource: string): Promise<{ tsx_source: string }> {\n const response = await this.sendAdminRequest(`/internal/rewrite-template-source`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n template_tsx_source: templateTsxSource,\n }),\n }, null);\n return await response.json();\n }\n\n async createEmailTheme(displayName: string): Promise<{ id: string }> {\n const response = await this.sendAdminRequest(\n `/internal/email-themes`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n display_name: displayName,\n }),\n },\n null,\n );\n return await response.json();\n }\n\n async getEmailTheme(id: string): Promise<{ display_name: string, tsx_source: string }> {\n const response = await this.sendAdminRequest(\n `/internal/email-themes/${id}`,\n { method: \"GET\" },\n null,\n );\n return await response.json();\n }\n\n async updateEmailTheme(id: string, tsxSource: string): Promise<void> {\n await this.sendAdminRequest(\n `/internal/email-themes/${id}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n tsx_source: tsxSource,\n }),\n },\n null,\n );\n }\n\n async deleteEmailTheme(id: string): Promise<void> {\n await this.sendAdminRequest(\n `/internal/email-themes/${id}`,\n {\n method: \"DELETE\",\n },\n null,\n );\n }\n\n async updateEmailTemplate(id: string, tsxSource: string, themeId: string | null | false): Promise<{ rendered_html: string }> {\n const response = await this.sendAdminRequest(\n `/internal/email-templates/${id}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ tsx_source: tsxSource, theme_id: themeId }),\n },\n null,\n );\n return await response.json();\n }\n\n async getConfig(): Promise<{ config_string: string }> {\n const response = await this.sendAdminRequest(\n `/internal/config`,\n { method: \"GET\" },\n null,\n );\n return await response.json();\n }\n\n async getConfigOverride(level: \"project\" | \"branch\" | \"environment\"): Promise<{ config_string: string }> {\n const response = await this.sendAdminRequest(\n `/internal/config/override/${level}`,\n { method: \"GET\" },\n null,\n );\n return await response.json();\n }\n\n async setConfigOverride(level: \"project\" | \"branch\" | \"environment\", configOverride: any, source?: BranchConfigSourceApi): Promise<void> {\n await this.sendAdminRequest(\n `/internal/config/override/${level}`,\n {\n method: \"PUT\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n config_string: JSON.stringify(configOverride),\n ...(source && { source }),\n }),\n },\n null,\n );\n }\n\n async updateConfigOverride(level: \"project\" | \"branch\" | \"environment\", configOverrideOverride: any): Promise<void> {\n await this.sendAdminRequest(\n `/internal/config/override/${level}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ config_override_string: JSON.stringify(configOverrideOverride) }),\n },\n null,\n );\n }\n\n async getPushedConfigSource(): Promise<BranchConfigSourceApi> {\n const response = await this.sendAdminRequest(\n `/internal/config/source`,\n { method: \"GET\" },\n null,\n );\n const data = await response.json();\n return data.source;\n }\n\n async unlinkPushedConfigSource(): Promise<void> {\n await this.sendAdminRequest(\n `/internal/config/source`,\n { method: \"DELETE\" },\n null,\n );\n }\n\n /**\n * Reads a specific config-agent run's state (or `null`) for the linked GitHub\n * repo. Polled by the dashboard — using the id returned by `applyConfigViaAgent`\n * — for live progress and the review diff. Runs are independent, so each is\n * addressed by its own id rather than \"the\" run on the branch.\n */\n async getConfigAgentRun(runId: string): Promise<ConfigAgentRunApi | null> {\n const response = await this.sendAdminRequest(\n `/internal/config/github/run?run_id=${encodeURIComponent(runId)}`,\n { method: \"GET\" },\n null,\n );\n const data = await response.json();\n return data.agent_run ?? null;\n }\n\n /**\n * Applies a dashboard config change to the linked GitHub repo by running the\n * config agent in a sandbox (server-side). Returns immediately with the new run's\n * `id`; poll `getConfigAgentRun(id)` for progress. The GitHub access token is the\n * caller's own OAuth token and is used transiently server-side.\n */\n async applyConfigViaAgent(options: { configUpdate: EnvironmentConfigOverrideOverride, githubAccessToken: string }): Promise<{ status: \"started\", id: string }> {\n const response = await this.sendAdminRequest(\n `/internal/config/github/apply`,\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n github_access_token: options.githubAccessToken,\n config_update_string: JSON.stringify(options.configUpdate),\n }),\n },\n null,\n );\n return await response.json();\n }\n\n /**\n * Cancels a specific in-flight agent-driven config write: hard-stops the sandbox\n * so the agent stops mid-work. Also cancels runs in `awaiting_review`. No revert\n * — if the agent already pushed, the commit stays. Returns `not-running` if the\n * run is gone or already terminal.\n */\n async cancelConfigAgentRun(runId: string): Promise<{ status: \"cancelling\" | \"not-running\" }> {\n const response = await this.sendAdminRequest(\n `/internal/config/github/cancel`,\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ run_id: runId }),\n },\n null,\n );\n return await response.json();\n }\n\n /**\n * Commits a specific run's reviewed change to GitHub. Only valid when that run is in\n * `awaiting_review` status; the change (diff + base commit) was captured at apply time\n * and is rebuilt + pushed via the GitHub API here, so no live sandbox is involved.\n * Returns `not-awaiting-review` if the run isn't in a committable state.\n */\n async commitConfigAgentRun(runId: string, options: { githubAccessToken: string, commitMessage?: string }): Promise<{ status: \"committing\" | \"not-awaiting-review\" }> {\n const response = await this.sendAdminRequest(\n `/internal/config/github/commit`,\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n run_id: runId,\n github_access_token: options.githubAccessToken,\n ...(options.commitMessage ? { commit_message: options.commitMessage } : {}),\n }),\n },\n null,\n );\n return await response.json();\n }\n\n async resetConfigOverrideKeys(level: \"branch\" | \"environment\", keys: string[]): Promise<void> {\n await this.sendAdminRequest(\n `/internal/config/override/${level}/reset-keys`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ keys }),\n },\n null,\n );\n }\n async createEmailTemplate(displayName: string): Promise<{ id: string }> {\n const response = await this.sendAdminRequest(\n `/internal/email-templates`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n display_name: displayName,\n }),\n },\n null,\n );\n return await response.json();\n }\n\n async deleteEmailTemplate(id: string): Promise<void> {\n await this.sendAdminRequest(\n `/internal/email-templates/${id}`,\n {\n method: \"DELETE\",\n },\n null,\n );\n }\n\n async setupPayments(): Promise<{ url: string }> {\n const response = await this.sendAdminRequest(\n \"/internal/payments/setup\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n null,\n );\n return await response.json();\n }\n\n async getStripeAccountInfo(): Promise<null | { account_id: string, charges_enabled: boolean, details_submitted: boolean, payouts_enabled: boolean }> {\n const response = await this.sendAdminRequestAndCatchKnownError(\n \"/internal/payments/stripe/account-info\",\n {},\n null,\n [KnownErrors.StripeAccountInfoNotFound],\n );\n if (response.status === \"error\") {\n return null;\n }\n return await response.data.json();\n }\n\n async getPaymentMethodConfigs(): Promise<{ configId: string, methods: Array<{ id: string, name: string, enabled: boolean, available: boolean, overridable: boolean }> } | null> {\n const response = await this.sendAdminRequestAndCatchKnownError(\n \"/internal/payments/method-configs\",\n { method: \"GET\" },\n null,\n [KnownErrors.StripeAccountInfoNotFound],\n );\n if (response.status === \"error\") {\n return null;\n }\n const data = await response.data.json();\n return {\n configId: data.config_id,\n methods: data.methods,\n };\n }\n\n async updatePaymentMethodConfigs(configId: string, updates: Record<string, 'on' | 'off'>): Promise<void> {\n await this.sendAdminRequest(\n \"/internal/payments/method-configs\",\n {\n method: \"PATCH\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ config_id: configId, updates }),\n },\n null,\n );\n }\n\n async createStripeWidgetAccountSession(): Promise<{ client_secret: string }> {\n const response = await this.sendAdminRequest(\n \"/internal/payments/stripe-widgets/account-session\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n null,\n );\n return await response.json();\n }\n\n async listTransactions(params?: { cursor?: string, limit?: number, type?: TransactionType, customerType?: 'user' | 'team' | 'custom', customerId?: string }): Promise<{ transactions: Transaction[], nextCursor: string | null }> {\n const qs = new URLSearchParams();\n if (params?.cursor) qs.set('cursor', params.cursor);\n if (typeof params?.limit === 'number') qs.set('limit', String(params.limit));\n if (params?.type) qs.set('type', params.type);\n if (params?.customerType) qs.set('customer_type', params.customerType);\n if (params?.customerId) qs.set('customer_id', params.customerId);\n const response = await this.sendAdminRequest(\n `/internal/payments/transactions${qs.size ? `?${qs.toString()}` : ''}`,\n { method: 'GET' },\n null,\n );\n const json = await response.json() as { transactions: Transaction[], next_cursor: string | null };\n return { transactions: json.transactions, nextCursor: json.next_cursor };\n }\n\n async listSessionReplays(params?: AdminListSessionReplaysOptions): Promise<AdminListSessionReplaysResponse> {\n const qs = new URLSearchParams();\n if (params?.cursor) qs.set(\"cursor\", params.cursor);\n if (typeof params?.limit === \"number\") qs.set(\"limit\", String(params.limit));\n if (params?.user_ids && params.user_ids.length > 0) qs.set(\"user_ids\", params.user_ids.join(\",\"));\n if (params?.team_ids && params.team_ids.length > 0) qs.set(\"team_ids\", params.team_ids.join(\",\"));\n if (typeof params?.duration_ms_min === \"number\") qs.set(\"duration_ms_min\", String(params.duration_ms_min));\n if (typeof params?.duration_ms_max === \"number\") qs.set(\"duration_ms_max\", String(params.duration_ms_max));\n if (typeof params?.last_event_at_from_millis === \"number\") qs.set(\"last_event_at_from_millis\", String(params.last_event_at_from_millis));\n if (typeof params?.last_event_at_to_millis === \"number\") qs.set(\"last_event_at_to_millis\", String(params.last_event_at_to_millis));\n if (typeof params?.click_count_min === \"number\") qs.set(\"click_count_min\", String(params.click_count_min));\n const response = await this.sendAdminRequest(\n `/internal/session-replays${qs.size ? `?${qs.toString()}` : \"\"}`,\n { method: \"GET\" },\n null,\n );\n return await response.json();\n }\n\n async getSessionReplay(sessionReplayId: string): Promise<AdminGetSessionReplayResponse> {\n const response = await this.sendAdminRequest(\n `/internal/session-replays/${encodeURIComponent(sessionReplayId)}`,\n { method: \"GET\" },\n null,\n );\n return await response.json();\n }\n\n async listSessionReplayChunks(sessionReplayId: string, params?: AdminListSessionReplayChunksOptions): Promise<AdminListSessionReplayChunksResponse> {\n const qs = new URLSearchParams();\n if (params?.cursor) qs.set(\"cursor\", params.cursor);\n if (typeof params?.limit === \"number\") qs.set(\"limit\", String(params.limit));\n const response = await this.sendAdminRequest(\n `/internal/session-replays/${encodeURIComponent(sessionReplayId)}/chunks${qs.size ? `?${qs.toString()}` : \"\"}`,\n { method: \"GET\" },\n null,\n );\n return await response.json();\n }\n\n async getSessionReplayChunkEvents(sessionReplayId: string, chunkId: string): Promise<AdminGetSessionReplayChunkEventsResponse> {\n const response = await this.sendAdminRequest(\n `/internal/session-replays/${encodeURIComponent(sessionReplayId)}/chunks/${encodeURIComponent(chunkId)}/events`,\n { method: \"GET\" },\n null,\n );\n return await response.json();\n }\n\n async getSessionReplayEvents(sessionReplayId: string, options?: { offset?: number, limit?: number }): Promise<AdminGetSessionReplayAllEventsResponse> {\n const qs = new URLSearchParams();\n if (typeof options?.offset === \"number\") qs.set(\"offset\", String(options.offset));\n if (typeof options?.limit === \"number\") qs.set(\"limit\", String(options.limit));\n const response = await this.sendAdminRequest(\n `/internal/session-replays/${encodeURIComponent(sessionReplayId)}/events${qs.size ? `?${qs.toString()}` : \"\"}`,\n { method: \"GET\" },\n null,\n );\n return await response.json();\n }\n\n async refundTransaction(options: {\n type: \"subscription\" | \"one-time-purchase\",\n id: string,\n invoiceId?: string,\n amountUsd: MoneyAmount,\n /**\n * Lifecycle action for the source purchase:\n * \"now\" — end product access immediately (revokes product,\n * expires item grants, cancels Stripe sub if any).\n * \"at-period-end\" — schedule sub cancel-at-period-end; subscriptions\n * only — rejected for one-time purchases.\n * undefined — no lifecycle change; refund money only.\n */\n endAction?: \"now\" | \"at-period-end\",\n }): Promise<{ success: boolean, refundTransactionId: string }> {\n const response = await this.sendAdminRequest(\n \"/internal/payments/transactions/refund\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n type: options.type,\n id: options.id,\n ...(options.invoiceId !== undefined ? { invoice_id: options.invoiceId } : {}),\n amount_usd: options.amountUsd,\n ...(options.endAction !== undefined ? { end_action: options.endAction } : {}),\n }),\n },\n null,\n );\n const json = await response.json();\n return { success: json.success, refundTransactionId: json.refund_transaction_id };\n }\n\n\n async previewAffectedUsersByOnboardingChange(\n onboarding: { require_email_verification?: boolean },\n limit?: number,\n ): Promise<{\n affected_users: Array<{\n id: string,\n display_name: string | null,\n primary_email: string | null,\n restricted_reason: RestrictedReason,\n }>,\n total_affected_count: number,\n }> {\n const response = await this.sendAdminRequest(\n `/internal/onboarding/preview-affected-users${limit ? `?limit=${limit}` : ''}`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ onboarding }),\n },\n null,\n );\n return await response.json();\n }\n\n async listOutboxEmails(options?: { status?: string, simple_status?: string, user_id?: string, limit?: number, cursor?: string }): Promise<EmailOutboxCrud[\"Server\"][\"List\"]> {\n const qs = new URLSearchParams();\n if (options?.status) qs.set('status', options.status);\n if (options?.simple_status) qs.set('simple_status', options.simple_status);\n if (options?.user_id) qs.set('user_id', options.user_id);\n if (options?.limit !== undefined) qs.set('limit', options.limit.toString());\n if (options?.cursor) qs.set('cursor', options.cursor);\n const response = await this.sendServerRequest(\n `/emails/outbox${qs.size ? `?${qs.toString()}` : ''}`,\n { method: 'GET' },\n null,\n );\n return await response.json();\n }\n\n async getOutboxEmail(id: string): Promise<EmailOutboxCrud[\"Server\"][\"Read\"]> {\n const response = await this.sendServerRequest(\n `/emails/outbox/${id}`,\n { method: 'GET' },\n null,\n );\n return await response.json();\n }\n\n async updateOutboxEmail(id: string, data: EmailOutboxCrud[\"Server\"][\"Update\"]): Promise<EmailOutboxCrud[\"Server\"][\"Read\"]> {\n const response = await this.sendServerRequest(\n `/emails/outbox/${id}`,\n {\n method: 'PATCH',\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"admin-interface.js","names":["HexclaveServerInterface","Result","KnownErrors"],"sources":["../../src/interface/admin-interface.ts"],"sourcesContent":["import * as yup from \"yup\";\nimport type { EnvironmentConfigOverrideOverride } from \"../config/schema\";\nimport { KnownErrors } from \"../known-errors\";\nimport { branchConfigSourceSchema, type ConfigAgentRunApi, type RestrictedReason } from \"../schema-fields\";\nimport { AccessToken, InternalSession, RefreshToken } from \"../sessions\";\nimport type { MoneyAmount } from \"../utils/currency-constants\";\nimport { Result } from \"../utils/results\";\nimport { urlString } from \"../utils/urls\";\nimport type { AnalyticsClickmapDevice, AnalyticsClickmapKind, AnalyticsClickmapResponse, AnalyticsClickmapTokenResponse, MetricsResponse, MetricsUserCounts, UserActivityResponse } from \"./admin-metrics\";\nimport { EmailOutboxCrud } from \"./crud/email-outbox\";\nimport { InternalEmailsCrud } from \"./crud/emails\";\nimport { InternalApiKeysCrud } from \"./crud/internal-api-keys\";\nimport { ProjectPermissionDefinitionsCrud } from \"./crud/project-permissions\";\nimport { ProjectsCrud } from \"./crud/projects\";\nimport type {\n AdminGetSessionReplayAllEventsResponse,\n AdminGetSessionReplayChunkEventsResponse,\n AdminGetSessionReplayResponse,\n AdminListSessionReplayChunksOptions,\n AdminListSessionReplayChunksResponse,\n AdminListSessionReplaysOptions,\n AdminListSessionReplaysResponse\n} from \"./crud/session-replays\";\nimport { SvixTokenCrud } from \"./crud/svix-token\";\nimport { TeamPermissionDefinitionsCrud } from \"./crud/team-permissions\";\nimport type { Transaction, TransactionType } from \"./crud/transactions\";\nimport type { PlanUsageResponse } from \"./plan-usage\";\nimport { HexclaveServerInterface, ServerAuthApplicationOptions } from \"./server-interface\";\n\nexport type { PlanUsageResponse } from \"./plan-usage\";\n\ntype BranchConfigSourceApi = yup.InferType<typeof branchConfigSourceSchema>;\n\nexport type ChatContent = Array<\n | { type: \"text\", text: string }\n | { type: \"tool-call\", toolName: string, toolCallId: string, args: any, argsText: string, result: any }\n>;\n\nexport type AdminDeploymentRunJson = {\n id: string,\n service_id: string,\n status: \"queued\" | \"building\" | \"ready\" | \"error\" | \"canceled\",\n target: string,\n triggered_by: string,\n url: string | null,\n error: string | null,\n created_at_millis: number,\n finished_at_millis: number | null,\n};\n\n// One env var of a deployment service, normalized from the config-side\n// definition: \"plain\" vars carry their literal `value`, \"connection\" vars\n// carry the \"serviceId.outputKey\" reference they resolve to at deploy time,\n// and \"secret\" vars carry only the `secret_key` whose value is supplied via\n// `hexclave deploy --secret <key>=<value>` (never stored).\nexport type AdminDeploymentEnvVarJson = {\n key: string,\n type: \"plain\" | \"secret\" | \"connection\",\n value: string | null,\n secret_key: string | null,\n};\n\n// The config-side shape of one env var, mirroring\n// `deployments-alpha.services.<id>.env.<KEY>` in hexclave.config.ts: no type means a\n// plain value, \"secret\" requires `key`, \"connection\" requires a\n// \"serviceId.outputKey\" `value`.\nexport type AdminDeploymentEnvVarOptions =\n | { type?: undefined, value: string }\n | { type: \"secret\", key: string }\n | { type: \"connection\", value: string };\n\nexport type AdminDeploymentServiceJson = {\n id: string,\n type: \"vercel\",\n framework: string | null,\n install_command: string | null,\n build_command: string | null,\n output_directory: string | null,\n root_directory: string | null,\n provisioned: boolean,\n status: \"not_deployed\" | \"queued\" | \"building\" | \"deployed\" | \"failed\" | \"canceled\",\n has_successful_deploy: boolean,\n url: string | null,\n env: AdminDeploymentEnvVarJson[],\n domains: { hostname: string, is_primary: boolean, verified: boolean }[],\n latest_run: AdminDeploymentRunJson | null,\n};\n\n// null means \"unset this field\" (falls back to platform auto-detection);\n// undefined means \"leave unchanged\".\nexport type AdminDeploymentServiceBuildOptions = {\n framework?: string | null,\n install_command?: string | null,\n build_command?: string | null,\n output_directory?: string | null,\n root_directory?: string | null,\n};\n\nexport type AdminDeploymentDomainJson = {\n hostname: string,\n is_primary: boolean,\n verified: boolean,\n pending_first_deploy: boolean,\n dns_records: { type: string, name: string, value: string }[],\n};\n\nexport type AdminAuthApplicationOptions = ServerAuthApplicationOptions &(\n | {\n superSecretAdminKey: string,\n }\n | {\n projectOwnerSession: InternalSession | (() => Promise<string | null>),\n }\n);\n\nexport type InternalApiKeyCreateCrudRequest = {\n has_publishable_client_key: boolean,\n has_secret_server_key: boolean,\n has_super_secret_admin_key: boolean,\n expires_at_millis: number,\n description: string,\n};\n\nexport type InternalApiKeyCreateCrudResponse = InternalApiKeysCrud[\"Admin\"][\"Read\"] & {\n publishable_client_key?: string,\n secret_server_key?: string,\n super_secret_admin_key?: string,\n};\n\n\nexport class HexclaveAdminInterface extends HexclaveServerInterface {\n constructor(public readonly options: AdminAuthApplicationOptions) {\n super(options);\n }\n\n public async sendAdminRequest(path: string, options: RequestInit, session: InternalSession | null, requestType: \"admin\" = \"admin\") {\n return await this.sendServerRequest(\n path,\n {\n ...options,\n headers: {\n // Hexclave rebrand: emit x-hexclave-* request header; the backend proxy dual-accepts both names.\n \"x-hexclave-super-secret-admin-key\": \"superSecretAdminKey\" in this.options ? this.options.superSecretAdminKey : \"\",\n ...options.headers,\n },\n },\n session,\n requestType,\n );\n }\n\n protected async sendAdminRequestAndCatchKnownError<E extends typeof KnownErrors[keyof KnownErrors]>(\n path: string,\n requestOptions: RequestInit,\n tokenStoreOrNull: InternalSession | null,\n errorsToCatch: readonly E[],\n ): Promise<Result<\n Response & {\n usedTokens: {\n accessToken: AccessToken,\n refreshToken: RefreshToken | null,\n } | null,\n },\n InstanceType<E>\n >> {\n try {\n return Result.ok(await this.sendAdminRequest(path, requestOptions, tokenStoreOrNull));\n } catch (e) {\n for (const errorType of errorsToCatch) {\n if (errorType.isInstance(e)) {\n return Result.error(e as InstanceType<E>);\n }\n }\n throw e;\n }\n }\n\n async getProject(): Promise<ProjectsCrud[\"Admin\"][\"Read\"]> {\n const response = await this.sendAdminRequest(\n \"/internal/projects/current\",\n {\n method: \"GET\",\n },\n null,\n );\n return await response.json();\n }\n\n async updateProject(update: ProjectsCrud[\"Admin\"][\"Update\"]): Promise<ProjectsCrud[\"Admin\"][\"Read\"]> {\n const response = await this.sendAdminRequest(\n \"/internal/projects/current\",\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(update),\n },\n null,\n );\n return await response.json();\n }\n\n async createInternalApiKey(\n options: InternalApiKeyCreateCrudRequest,\n ): Promise<InternalApiKeyCreateCrudResponse> {\n const response = await this.sendAdminRequest(\n \"/internal/api-keys\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(options),\n },\n null,\n );\n return await response.json();\n }\n\n async listInternalApiKeys(): Promise<InternalApiKeysCrud[\"Admin\"][\"Read\"][]> {\n const response = await this.sendAdminRequest(\"/internal/api-keys\", {}, null);\n const result = await response.json() as InternalApiKeysCrud[\"Admin\"][\"List\"];\n return result.items;\n }\n\n async revokeInternalApiKeyById(id: string) {\n await this.sendAdminRequest(\n `/internal/api-keys/${id}`, {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n revoked: true,\n }),\n },\n null,\n );\n }\n\n async getInternalApiKey(id: string, session: InternalSession): Promise<InternalApiKeysCrud[\"Admin\"][\"Read\"]> {\n const response = await this.sendAdminRequest(`/internal/api-keys/${id}`, {}, session);\n return await response.json();\n }\n\n async listInternalEmailTemplates(): Promise<{ id: string, display_name: string, theme_id?: string, tsx_source: string }[]> {\n const response = await this.sendAdminRequest(`/internal/email-templates`, {}, null);\n const result = await response.json() as { templates: { id: string, display_name: string, theme_id?: string, tsx_source: string }[] };\n return result.templates;\n }\n\n async listInternalEmailDrafts(): Promise<{ id: string, display_name: string, theme_id?: string | undefined | false, tsx_source: string, sent_at_millis?: number | null }[]> {\n const response = await this.sendAdminRequest(`/internal/email-drafts`, {}, null);\n const result = await response.json() as { drafts: { id: string, display_name: string, theme_id?: string | undefined | false, tsx_source: string, sent_at_millis?: number | null }[] };\n return result.drafts;\n }\n\n async createEmailDraft(options: { display_name?: string, theme_id?: string | false, tsx_source?: string }): Promise<{ id: string }> {\n const response = await this.sendAdminRequest(\n `/internal/email-drafts`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(options),\n },\n null,\n );\n return await response.json();\n }\n\n async updateEmailDraft(id: string, data: { display_name?: string, theme_id?: string | null | false, tsx_source?: string, sent_at_millis?: number | null }): Promise<void> {\n await this.sendAdminRequest(\n `/internal/email-drafts/${id}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n }\n\n async deleteEmailDraft(id: string): Promise<void> {\n await this.sendAdminRequest(\n `/internal/email-drafts/${id}`,\n {\n method: \"DELETE\",\n },\n null,\n );\n }\n\n async listEmailThemes(): Promise<{ id: string, display_name: string }[]> {\n const response = await this.sendAdminRequest(`/internal/email-themes`, {}, null);\n const result = await response.json() as { themes: { id: string, display_name: string }[] };\n return result.themes;\n }\n\n\n // Team permission definitions methods\n async listTeamPermissionDefinitions(): Promise<TeamPermissionDefinitionsCrud['Admin']['Read'][]> {\n const response = await this.sendAdminRequest(`/team-permission-definitions`, {}, null);\n const result = await response.json() as TeamPermissionDefinitionsCrud['Admin']['List'];\n return result.items;\n }\n\n async listTeamPermissionDefinitionsPaginated(\n options: { limit: number, cursor?: string, query?: string },\n ): Promise<{ items: TeamPermissionDefinitionsCrud['Admin']['Read'][], nextCursor: string | null }> {\n const params = new URLSearchParams();\n params.set(\"limit\", String(options.limit));\n if (options.cursor) params.set(\"cursor\", options.cursor);\n if (options.query) params.set(\"query\", options.query);\n const response = await this.sendAdminRequest(`/team-permission-definitions?${params.toString()}`, {}, null);\n const result = await response.json() as TeamPermissionDefinitionsCrud['Admin']['List'];\n return {\n items: result.items,\n nextCursor: result.pagination?.next_cursor ?? null,\n };\n }\n\n async createTeamPermissionDefinition(data: TeamPermissionDefinitionsCrud['Admin']['Create']): Promise<TeamPermissionDefinitionsCrud['Admin']['Read']> {\n const response = await this.sendAdminRequest(\n \"/team-permission-definitions\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n async updateTeamPermissionDefinition(permissionId: string, data: TeamPermissionDefinitionsCrud['Admin']['Update']): Promise<TeamPermissionDefinitionsCrud['Admin']['Read']> {\n const response = await this.sendAdminRequest(\n `/team-permission-definitions/${permissionId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n async deleteTeamPermissionDefinition(permissionId: string): Promise<void> {\n await this.sendAdminRequest(\n `/team-permission-definitions/${permissionId}`,\n { method: \"DELETE\" },\n null,\n );\n }\n\n async listProjectPermissionDefinitions(): Promise<ProjectPermissionDefinitionsCrud['Admin']['Read'][]> {\n const response = await this.sendAdminRequest(`/project-permission-definitions`, {}, null);\n const result = await response.json() as ProjectPermissionDefinitionsCrud['Admin']['List'];\n return result.items;\n }\n\n async createProjectPermissionDefinition(data: ProjectPermissionDefinitionsCrud['Admin']['Create']): Promise<ProjectPermissionDefinitionsCrud['Admin']['Read']> {\n const response = await this.sendAdminRequest(\n \"/project-permission-definitions\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n async updateProjectPermissionDefinition(permissionId: string, data: ProjectPermissionDefinitionsCrud['Admin']['Update']): Promise<ProjectPermissionDefinitionsCrud['Admin']['Read']> {\n const response = await this.sendAdminRequest(\n `/project-permission-definitions/${permissionId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n async deleteProjectPermissionDefinition(permissionId: string): Promise<void> {\n await this.sendAdminRequest(\n `/project-permission-definitions/${permissionId}`,\n { method: \"DELETE\" },\n null,\n );\n }\n\n async getSvixToken(): Promise<SvixTokenCrud[\"Admin\"][\"Read\"]> {\n const response = await this.sendAdminRequest(\n \"/webhooks/svix-token\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n null,\n );\n return await response.json();\n }\n\n async deleteProject(): Promise<void> {\n await this.sendAdminRequest(\n \"/internal/projects/current\",\n {\n method: \"DELETE\",\n },\n null,\n );\n }\n\n async getMetrics(\n includeAnonymous: boolean = false,\n filters?: {\n country_code?: string,\n referrer?: string,\n browser?: string,\n os?: string,\n device?: string,\n since?: string,\n until?: string,\n },\n ): Promise<MetricsResponse> {\n const params = new URLSearchParams();\n if (includeAnonymous) {\n params.append('include_anonymous', 'true');\n }\n if (filters?.country_code) params.append('filter_country_code', filters.country_code);\n if (filters?.referrer) params.append('filter_referrer', filters.referrer);\n if (filters?.browser) params.append('filter_browser', filters.browser);\n if (filters?.os) params.append('filter_os', filters.os);\n if (filters?.device) params.append('filter_device', filters.device);\n if (filters?.since) params.append('filter_since', filters.since);\n if (filters?.until) params.append('filter_until', filters.until);\n const queryString = params.toString();\n const response = await this.sendAdminRequest(\n `/internal/metrics${queryString ? `?${queryString}` : ''}`,\n {\n method: \"GET\",\n },\n null,\n );\n const body = (await response.json()) as MetricsResponse;\n // The yup schema's .optional().default(...) fallbacks only run during\n // backend response validation, not on this client-side cast — apply them\n // here too so the one-release-cycle tolerance for older servers that the\n // schema comments promise actually holds for dashboard consumers. The\n // Partial views widen the static type (which claims these are always\n // defined) to match what an older server can actually send.\n const rawBody: Partial<MetricsResponse> = body;\n const rawAnalytics: Partial<MetricsResponse[\"analytics_overview\"]> = body.analytics_overview;\n return {\n ...body,\n live_users: rawBody.live_users ?? 0,\n hourly_users: rawBody.hourly_users ?? [],\n hourly_active_users: rawBody.hourly_active_users ?? [],\n analytics_overview: {\n ...body.analytics_overview,\n hourly_page_views: rawAnalytics.hourly_page_views ?? [],\n hourly_active_users: rawAnalytics.hourly_active_users ?? [],\n hourly_visitors: rawAnalytics.hourly_visitors ?? [],\n daily_anonymous_visitors_fallback: rawAnalytics.daily_anonymous_visitors_fallback ?? [],\n anonymous_visitors_fallback: rawAnalytics.anonymous_visitors_fallback ?? 0,\n top_regions: rawAnalytics.top_regions ?? [],\n bounce_rate: rawAnalytics.bounce_rate ?? 0,\n daily_bounce_rate: rawAnalytics.daily_bounce_rate ?? [],\n daily_avg_session_seconds: rawAnalytics.daily_avg_session_seconds ?? [],\n top_browsers: rawAnalytics.top_browsers ?? [],\n top_operating_systems: rawAnalytics.top_operating_systems ?? [],\n top_devices: rawAnalytics.top_devices ?? [],\n },\n };\n }\n\n async getPlanUsage(): Promise<PlanUsageResponse> {\n const response = await this.sendAdminRequest(\n \"/internal/plan-usage\",\n {\n method: \"GET\",\n },\n null,\n );\n return await response.json();\n }\n\n async getUserActivity(userId: string): Promise<UserActivityResponse> {\n const response = await this.sendAdminRequest(\n urlString`/internal/user-activity?user_id=${userId}`,\n {\n method: \"GET\",\n },\n null,\n );\n return (await response.json()) as UserActivityResponse;\n }\n\n async getAnalyticsClickmap(options: {\n kind: AnalyticsClickmapKind,\n member_user_ids?: string[],\n route_path?: string,\n route_regex?: string,\n url_pattern?: string,\n user_id?: string,\n replay_id?: string,\n device?: AnalyticsClickmapDevice,\n viewport_width_min?: number,\n viewport_width_max?: number,\n sampling?: number,\n since: string,\n until: string,\n }): Promise<AnalyticsClickmapResponse> {\n const response = await this.sendAdminRequest(\n \"/internal/analytics/clickmap\",\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(options),\n },\n null,\n );\n return (await response.json()) as AnalyticsClickmapResponse;\n }\n\n async createAnalyticsClickmapToken(options: {\n origin: string,\n }): Promise<AnalyticsClickmapTokenResponse> {\n const response = await this.sendAdminRequest(\n \"/internal/analytics/clickmap-token\",\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(options),\n },\n null,\n );\n return (await response.json()) as AnalyticsClickmapTokenResponse;\n }\n\n async getMetricsUserCounts(): Promise<MetricsUserCounts> {\n const response = await this.sendAdminRequest(\n \"/internal/metrics/user-counts\",\n {\n method: \"GET\",\n },\n null,\n );\n return (await response.json()) as MetricsUserCounts;\n }\n\n async sendTestEmail(data: {\n recipient_email: string,\n email_config: {\n host: string,\n port: number,\n username: string,\n password: string,\n sender_email: string,\n sender_name: string,\n },\n }): Promise<{ success: boolean, error_message?: string }> {\n const response = await this.sendAdminRequest(`/internal/send-test-email`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }, null);\n return await response.json();\n }\n\n async sendTestWebhook(data: {\n endpoint_id: string,\n }): Promise<{ success: boolean, error_message?: string }> {\n const response = await this.sendAdminRequest(`/internal/send-test-webhook`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }, null);\n return await response.json();\n }\n\n async listSentEmails(): Promise<InternalEmailsCrud[\"Admin\"][\"List\"]> {\n const response = await this.sendAdminRequest(\"/internal/emails\", {\n method: \"GET\",\n }, null);\n return await response.json();\n }\n\n async setupManagedEmailProvider(data: {\n subdomain: string,\n sender_local_part: string,\n }): Promise<{\n domain_id: string,\n subdomain: string,\n sender_local_part: string,\n name_server_records: string[],\n status: \"pending_dns\" | \"pending_verification\" | \"verified\" | \"applied\" | \"failed\",\n }> {\n const response = await this.sendAdminRequest(\"/internal/emails/managed-onboarding/setup\", {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }, null);\n return await response.json();\n }\n\n async checkManagedEmailStatus(data: {\n domain_id: string,\n subdomain: string,\n sender_local_part: string,\n }): Promise<{ status: \"pending_dns\" | \"pending_verification\" | \"verified\" | \"applied\" | \"failed\" }> {\n const response = await this.sendAdminRequest(\"/internal/emails/managed-onboarding/check\", {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }, null);\n return await response.json();\n }\n\n async listManagedEmailDomains(): Promise<{\n items: Array<{\n domain_id: string,\n subdomain: string,\n sender_local_part: string,\n status: \"pending_dns\" | \"pending_verification\" | \"verified\" | \"applied\" | \"failed\",\n name_server_records: string[],\n }>,\n }> {\n const response = await this.sendAdminRequest(\"/internal/emails/managed-onboarding/list\", {\n method: \"GET\",\n }, null);\n return await response.json();\n }\n\n async deleteManagedEmailDomain(data: {\n resend_domain_id: string,\n }): Promise<{ status: \"deleted\" }> {\n const response = await this.sendAdminRequest(\"/internal/emails/managed-onboarding/delete\", {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }, null);\n return await response.json();\n }\n\n async applyManagedEmailProvider(data: {\n domain_id: string,\n }): Promise<{ status: \"applied\" }> {\n const response = await this.sendAdminRequest(\"/internal/emails/managed-onboarding/apply\", {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }, null);\n return await response.json();\n }\n\n async sendSignInInvitationEmail(\n email: string,\n callbackUrl: string,\n ): Promise<void> {\n await this.sendAdminRequest(\n \"/internal/send-sign-in-invitation\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n email,\n callback_url: callbackUrl,\n }),\n },\n null,\n );\n }\n\n async saveChatMessage(threadId: string, message: any): Promise<void> {\n await this.sendAdminRequest(\n `/internal/ai-chat/${threadId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ message }),\n },\n null,\n );\n }\n\n async listChatMessages(threadId: string): Promise<{ messages: Array<any> }> {\n const response = await this.sendAdminRequest(\n `/internal/ai-chat/${threadId}`,\n { method: \"GET\" },\n null,\n );\n return await response.json();\n }\n\n async renderEmailPreview(options: {\n themeId?: string | null | false,\n themeTsxSource?: string,\n templateId?: string,\n templateTsxSource?: string,\n editableMarkers?: boolean,\n editableSource?: 'template' | 'theme' | 'both',\n }): Promise<{ html: string, editable_regions?: Record<string, unknown> }> {\n const response = await this.sendAdminRequest(`/emails/render-email`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n theme_id: options.themeId,\n theme_tsx_source: options.themeTsxSource,\n template_id: options.templateId,\n template_tsx_source: options.templateTsxSource,\n editable_markers: options.editableMarkers,\n editable_source: options.editableSource,\n }),\n }, null);\n return await response.json();\n }\n\n async rewriteTemplateSourceWithAI(templateTsxSource: string): Promise<{ tsx_source: string }> {\n const response = await this.sendAdminRequest(`/internal/rewrite-template-source`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n template_tsx_source: templateTsxSource,\n }),\n }, null);\n return await response.json();\n }\n\n async createEmailTheme(displayName: string): Promise<{ id: string }> {\n const response = await this.sendAdminRequest(\n `/internal/email-themes`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n display_name: displayName,\n }),\n },\n null,\n );\n return await response.json();\n }\n\n async getEmailTheme(id: string): Promise<{ display_name: string, tsx_source: string }> {\n const response = await this.sendAdminRequest(\n `/internal/email-themes/${id}`,\n { method: \"GET\" },\n null,\n );\n return await response.json();\n }\n\n async updateEmailTheme(id: string, tsxSource: string): Promise<void> {\n await this.sendAdminRequest(\n `/internal/email-themes/${id}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n tsx_source: tsxSource,\n }),\n },\n null,\n );\n }\n\n async deleteEmailTheme(id: string): Promise<void> {\n await this.sendAdminRequest(\n `/internal/email-themes/${id}`,\n {\n method: \"DELETE\",\n },\n null,\n );\n }\n\n async updateEmailTemplate(id: string, tsxSource: string, themeId: string | null | false): Promise<{ rendered_html: string }> {\n const response = await this.sendAdminRequest(\n `/internal/email-templates/${id}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ tsx_source: tsxSource, theme_id: themeId }),\n },\n null,\n );\n return await response.json();\n }\n\n async getConfig(): Promise<{ config_string: string }> {\n const response = await this.sendAdminRequest(\n `/internal/config`,\n { method: \"GET\" },\n null,\n );\n return await response.json();\n }\n\n async getConfigOverride(level: \"project\" | \"branch\" | \"environment\"): Promise<{ config_string: string }> {\n const response = await this.sendAdminRequest(\n `/internal/config/override/${level}`,\n { method: \"GET\" },\n null,\n );\n return await response.json();\n }\n\n async setConfigOverride(level: \"project\" | \"branch\" | \"environment\", configOverride: any, source?: BranchConfigSourceApi): Promise<void> {\n await this.sendAdminRequest(\n `/internal/config/override/${level}`,\n {\n method: \"PUT\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n config_string: JSON.stringify(configOverride),\n ...(source && { source }),\n }),\n },\n null,\n );\n }\n\n async updateConfigOverride(level: \"project\" | \"branch\" | \"environment\", configOverrideOverride: any): Promise<void> {\n await this.sendAdminRequest(\n `/internal/config/override/${level}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ config_override_string: JSON.stringify(configOverrideOverride) }),\n },\n null,\n );\n }\n\n async getPushedConfigSource(): Promise<BranchConfigSourceApi> {\n const response = await this.sendAdminRequest(\n `/internal/config/source`,\n { method: \"GET\" },\n null,\n );\n const data = await response.json();\n return data.source;\n }\n\n async unlinkPushedConfigSource(): Promise<void> {\n await this.sendAdminRequest(\n `/internal/config/source`,\n { method: \"DELETE\" },\n null,\n );\n }\n\n /**\n * Reads a specific config-agent run's state (or `null`) for the linked GitHub\n * repo. Polled by the dashboard — using the id returned by `applyConfigViaAgent`\n * — for live progress and the review diff. Runs are independent, so each is\n * addressed by its own id rather than \"the\" run on the branch.\n */\n async getConfigAgentRun(runId: string): Promise<ConfigAgentRunApi | null> {\n const response = await this.sendAdminRequest(\n `/internal/config/github/run?run_id=${encodeURIComponent(runId)}`,\n { method: \"GET\" },\n null,\n );\n const data = await response.json();\n return data.agent_run ?? null;\n }\n\n /**\n * Applies a dashboard config change to the linked GitHub repo by running the\n * config agent in a sandbox (server-side). Returns immediately with the new run's\n * `id`; poll `getConfigAgentRun(id)` for progress. The GitHub access token is the\n * caller's own OAuth token and is used transiently server-side.\n */\n async applyConfigViaAgent(options: { configUpdate: EnvironmentConfigOverrideOverride, githubAccessToken: string }): Promise<{ status: \"started\", id: string }> {\n const response = await this.sendAdminRequest(\n `/internal/config/github/apply`,\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n github_access_token: options.githubAccessToken,\n config_update_string: JSON.stringify(options.configUpdate),\n }),\n },\n null,\n );\n return await response.json();\n }\n\n /**\n * Cancels a specific in-flight agent-driven config write: hard-stops the sandbox\n * so the agent stops mid-work. Also cancels runs in `awaiting_review`. No revert\n * — if the agent already pushed, the commit stays. Returns `not-running` if the\n * run is gone or already terminal.\n */\n async cancelConfigAgentRun(runId: string): Promise<{ status: \"cancelling\" | \"not-running\" }> {\n const response = await this.sendAdminRequest(\n `/internal/config/github/cancel`,\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ run_id: runId }),\n },\n null,\n );\n return await response.json();\n }\n\n /**\n * Commits a specific run's reviewed change to GitHub. Only valid when that run is in\n * `awaiting_review` status; the change (diff + base commit) was captured at apply time\n * and is rebuilt + pushed via the GitHub API here, so no live sandbox is involved.\n * Returns `not-awaiting-review` if the run isn't in a committable state.\n */\n async commitConfigAgentRun(runId: string, options: { githubAccessToken: string, commitMessage?: string }): Promise<{ status: \"committing\" | \"not-awaiting-review\" }> {\n const response = await this.sendAdminRequest(\n `/internal/config/github/commit`,\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n run_id: runId,\n github_access_token: options.githubAccessToken,\n ...(options.commitMessage ? { commit_message: options.commitMessage } : {}),\n }),\n },\n null,\n );\n return await response.json();\n }\n\n async resetConfigOverrideKeys(level: \"branch\" | \"environment\", keys: string[]): Promise<void> {\n await this.sendAdminRequest(\n `/internal/config/override/${level}/reset-keys`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ keys }),\n },\n null,\n );\n }\n async createEmailTemplate(displayName: string): Promise<{ id: string }> {\n const response = await this.sendAdminRequest(\n `/internal/email-templates`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n display_name: displayName,\n }),\n },\n null,\n );\n return await response.json();\n }\n\n async deleteEmailTemplate(id: string): Promise<void> {\n await this.sendAdminRequest(\n `/internal/email-templates/${id}`,\n {\n method: \"DELETE\",\n },\n null,\n );\n }\n\n async setupPayments(): Promise<{ url: string }> {\n const response = await this.sendAdminRequest(\n \"/internal/payments/setup\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n null,\n );\n return await response.json();\n }\n\n async getStripeAccountInfo(): Promise<null | { account_id: string, charges_enabled: boolean, details_submitted: boolean, payouts_enabled: boolean }> {\n const response = await this.sendAdminRequestAndCatchKnownError(\n \"/internal/payments/stripe/account-info\",\n {},\n null,\n [KnownErrors.StripeAccountInfoNotFound],\n );\n if (response.status === \"error\") {\n return null;\n }\n return await response.data.json();\n }\n\n async getPaymentMethodConfigs(): Promise<{ configId: string, methods: Array<{ id: string, name: string, enabled: boolean, available: boolean, overridable: boolean }> } | null> {\n const response = await this.sendAdminRequestAndCatchKnownError(\n \"/internal/payments/method-configs\",\n { method: \"GET\" },\n null,\n [KnownErrors.StripeAccountInfoNotFound],\n );\n if (response.status === \"error\") {\n return null;\n }\n const data = await response.data.json();\n return {\n configId: data.config_id,\n methods: data.methods,\n };\n }\n\n async updatePaymentMethodConfigs(configId: string, updates: Record<string, 'on' | 'off'>): Promise<void> {\n await this.sendAdminRequest(\n \"/internal/payments/method-configs\",\n {\n method: \"PATCH\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ config_id: configId, updates }),\n },\n null,\n );\n }\n\n async createStripeWidgetAccountSession(): Promise<{ client_secret: string }> {\n const response = await this.sendAdminRequest(\n \"/internal/payments/stripe-widgets/account-session\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n null,\n );\n return await response.json();\n }\n\n async listTransactions(params?: { cursor?: string, limit?: number, type?: TransactionType, customerType?: 'user' | 'team' | 'custom', customerId?: string }): Promise<{ transactions: Transaction[], nextCursor: string | null }> {\n const qs = new URLSearchParams();\n if (params?.cursor) qs.set('cursor', params.cursor);\n if (typeof params?.limit === 'number') qs.set('limit', String(params.limit));\n if (params?.type) qs.set('type', params.type);\n if (params?.customerType) qs.set('customer_type', params.customerType);\n if (params?.customerId) qs.set('customer_id', params.customerId);\n const response = await this.sendAdminRequest(\n `/internal/payments/transactions${qs.size ? `?${qs.toString()}` : ''}`,\n { method: 'GET' },\n null,\n );\n const json = await response.json() as { transactions: Transaction[], next_cursor: string | null };\n return { transactions: json.transactions, nextCursor: json.next_cursor };\n }\n\n async listSessionReplays(params?: AdminListSessionReplaysOptions): Promise<AdminListSessionReplaysResponse> {\n const qs = new URLSearchParams();\n if (params?.cursor) qs.set(\"cursor\", params.cursor);\n if (typeof params?.limit === \"number\") qs.set(\"limit\", String(params.limit));\n if (params?.user_ids && params.user_ids.length > 0) qs.set(\"user_ids\", params.user_ids.join(\",\"));\n if (params?.team_ids && params.team_ids.length > 0) qs.set(\"team_ids\", params.team_ids.join(\",\"));\n if (typeof params?.duration_ms_min === \"number\") qs.set(\"duration_ms_min\", String(params.duration_ms_min));\n if (typeof params?.duration_ms_max === \"number\") qs.set(\"duration_ms_max\", String(params.duration_ms_max));\n if (typeof params?.last_event_at_from_millis === \"number\") qs.set(\"last_event_at_from_millis\", String(params.last_event_at_from_millis));\n if (typeof params?.last_event_at_to_millis === \"number\") qs.set(\"last_event_at_to_millis\", String(params.last_event_at_to_millis));\n if (typeof params?.click_count_min === \"number\") qs.set(\"click_count_min\", String(params.click_count_min));\n const response = await this.sendAdminRequest(\n `/internal/session-replays${qs.size ? `?${qs.toString()}` : \"\"}`,\n { method: \"GET\" },\n null,\n );\n return await response.json();\n }\n\n async getSessionReplay(sessionReplayId: string): Promise<AdminGetSessionReplayResponse> {\n const response = await this.sendAdminRequest(\n `/internal/session-replays/${encodeURIComponent(sessionReplayId)}`,\n { method: \"GET\" },\n null,\n );\n return await response.json();\n }\n\n async listSessionReplayChunks(sessionReplayId: string, params?: AdminListSessionReplayChunksOptions): Promise<AdminListSessionReplayChunksResponse> {\n const qs = new URLSearchParams();\n if (params?.cursor) qs.set(\"cursor\", params.cursor);\n if (typeof params?.limit === \"number\") qs.set(\"limit\", String(params.limit));\n const response = await this.sendAdminRequest(\n `/internal/session-replays/${encodeURIComponent(sessionReplayId)}/chunks${qs.size ? `?${qs.toString()}` : \"\"}`,\n { method: \"GET\" },\n null,\n );\n return await response.json();\n }\n\n async getSessionReplayChunkEvents(sessionReplayId: string, chunkId: string): Promise<AdminGetSessionReplayChunkEventsResponse> {\n const response = await this.sendAdminRequest(\n `/internal/session-replays/${encodeURIComponent(sessionReplayId)}/chunks/${encodeURIComponent(chunkId)}/events`,\n { method: \"GET\" },\n null,\n );\n return await response.json();\n }\n\n async getSessionReplayEvents(sessionReplayId: string, options?: { offset?: number, limit?: number }): Promise<AdminGetSessionReplayAllEventsResponse> {\n const qs = new URLSearchParams();\n if (typeof options?.offset === \"number\") qs.set(\"offset\", String(options.offset));\n if (typeof options?.limit === \"number\") qs.set(\"limit\", String(options.limit));\n const response = await this.sendAdminRequest(\n `/internal/session-replays/${encodeURIComponent(sessionReplayId)}/events${qs.size ? `?${qs.toString()}` : \"\"}`,\n { method: \"GET\" },\n null,\n );\n return await response.json();\n }\n\n async refundTransaction(options: {\n type: \"subscription\" | \"one-time-purchase\",\n id: string,\n invoiceId?: string,\n amountUsd: MoneyAmount,\n /**\n * Lifecycle action for the source purchase:\n * \"now\" — end product access immediately (revokes product,\n * expires item grants, cancels Stripe sub if any).\n * \"at-period-end\" — schedule sub cancel-at-period-end; subscriptions\n * only — rejected for one-time purchases.\n * undefined — no lifecycle change; refund money only.\n */\n endAction?: \"now\" | \"at-period-end\",\n }): Promise<{ success: boolean, refundTransactionId: string }> {\n const response = await this.sendAdminRequest(\n \"/internal/payments/transactions/refund\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n type: options.type,\n id: options.id,\n ...(options.invoiceId !== undefined ? { invoice_id: options.invoiceId } : {}),\n amount_usd: options.amountUsd,\n ...(options.endAction !== undefined ? { end_action: options.endAction } : {}),\n }),\n },\n null,\n );\n const json = await response.json();\n return { success: json.success, refundTransactionId: json.refund_transaction_id };\n }\n\n\n async previewAffectedUsersByOnboardingChange(\n onboarding: { require_email_verification?: boolean },\n limit?: number,\n ): Promise<{\n affected_users: Array<{\n id: string,\n display_name: string | null,\n primary_email: string | null,\n restricted_reason: RestrictedReason,\n }>,\n total_affected_count: number,\n }> {\n const response = await this.sendAdminRequest(\n `/internal/onboarding/preview-affected-users${limit ? `?limit=${limit}` : ''}`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ onboarding }),\n },\n null,\n );\n return await response.json();\n }\n\n async listOutboxEmails(options?: { status?: string, simple_status?: string, user_id?: string, limit?: number, cursor?: string }): Promise<EmailOutboxCrud[\"Server\"][\"List\"]> {\n const qs = new URLSearchParams();\n if (options?.status) qs.set('status', options.status);\n if (options?.simple_status) qs.set('simple_status', options.simple_status);\n if (options?.user_id) qs.set('user_id', options.user_id);\n if (options?.limit !== undefined) qs.set('limit', options.limit.toString());\n if (options?.cursor) qs.set('cursor', options.cursor);\n const response = await this.sendServerRequest(\n `/emails/outbox${qs.size ? `?${qs.toString()}` : ''}`,\n { method: 'GET' },\n null,\n );\n return await response.json();\n }\n\n async getOutboxEmail(id: string): Promise<EmailOutboxCrud[\"Server\"][\"Read\"]> {\n const response = await this.sendServerRequest(\n `/emails/outbox/${id}`,\n { method: 'GET' },\n null,\n );\n return await response.json();\n }\n\n async updateOutboxEmail(id: string, data: EmailOutboxCrud[\"Server\"][\"Update\"]): Promise<EmailOutboxCrud[\"Server\"][\"Read\"]> {\n const response = await this.sendServerRequest(\n `/emails/outbox/${id}`,\n {\n method: 'PATCH',\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n // ---- Deployments app ------------------------------------------------------\n\n async listDeploymentServices(): Promise<AdminDeploymentServiceJson[]> {\n const response = await this.sendAdminRequest(\n \"/deployments/services\",\n { method: \"GET\" },\n null,\n );\n return (await response.json()).items;\n }\n\n async createDeploymentService(id: string, build: AdminDeploymentServiceBuildOptions): Promise<AdminDeploymentServiceJson> {\n const response = await this.sendAdminRequest(\n \"/deployments/services\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ id, ...build }),\n },\n null,\n );\n return await response.json();\n }\n\n async updateDeploymentService(serviceId: string, update: AdminDeploymentServiceBuildOptions & {\n // Replaces the service's whole env var set (config-side definition shape).\n env?: Record<string, AdminDeploymentEnvVarOptions>,\n }): Promise<AdminDeploymentServiceJson> {\n const response = await this.sendAdminRequest(\n urlString`/deployments/services/${serviceId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(update),\n },\n null,\n );\n return await response.json();\n }\n\n async deleteDeploymentService(serviceId: string): Promise<void> {\n await this.sendAdminRequest(\n urlString`/deployments/services/${serviceId}`,\n { method: \"DELETE\" },\n null,\n );\n }\n\n async listDeploymentRuns(serviceId: string, options?: { limit?: number }): Promise<AdminDeploymentRunJson[]> {\n const response = await this.sendAdminRequest(\n urlString`/deployments/services/${serviceId}/runs` + (options?.limit !== undefined ? `?limit=${options.limit}` : \"\"),\n { method: \"GET\" },\n null,\n );\n return (await response.json()).items;\n }\n\n async getDeploymentRunLogs(runId: string, options?: { signal?: AbortSignal }): Promise<string> {\n // The endpoint streams chunked plain text until the run is terminal (or a\n // server-side cap); reading the full body gives \"the logs so far\". Pass a\n // signal so an abandoned view can abort — otherwise the server keeps\n // following the build for minutes.\n const response = await this.sendAdminRequest(\n urlString`/deployments/runs/${runId}/logs`,\n { method: \"GET\", signal: options?.signal },\n null,\n );\n return await response.text();\n }\n\n async addDeploymentServiceDomain(serviceId: string, hostname: string, options?: { isPrimary?: boolean }): Promise<void> {\n await this.sendAdminRequest(\n urlString`/deployments/services/${serviceId}/domains`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ hostname, ...(options?.isPrimary ? { is_primary: true } : {}) }),\n },\n null,\n );\n }\n\n async getDeploymentServiceDomain(serviceId: string, hostname: string): Promise<AdminDeploymentDomainJson> {\n const response = await this.sendAdminRequest(\n urlString`/deployments/services/${serviceId}/domains/${hostname}`,\n { method: \"GET\" },\n null,\n );\n return await response.json();\n }\n\n async deleteDeploymentServiceDomain(serviceId: string, hostname: string): Promise<void> {\n await this.sendAdminRequest(\n urlString`/deployments/services/${serviceId}/domains/${hostname}`,\n { method: \"DELETE\" },\n null,\n );\n }\n\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { A as MetricsNamedCount, B as MetricsTopCountry, C as MetricsDataPoint, D as MetricsEmailOverviewSchema, E as MetricsEmailOverview, F as MetricsRecentEmailSchema, G as MetricsTopRegionSchema, H as MetricsTopReferrer, I as MetricsRecentUser, J as UserActivityResponse, K as MetricsUserCounts, L as MetricsRecentUserSchema, M as MetricsPaymentsOverview, N as MetricsPaymentsOverviewSchema, O as MetricsLoginMethodEntry, P as MetricsRecentEmail, R as MetricsResponse, S as MetricsDailyRevenuePointSchema, T as MetricsDataPointsSchema, U as MetricsTopReferrerSchema, V as MetricsTopCountrySchema, W as MetricsTopRegion, Y as UserActivityResponseBodySchema, _ as MetricsAuthOverview, a as AnalyticsClickmapKind, b as MetricsDailyEmailStatusBreakdownSchema, c as AnalyticsClickmapResponse, d as AnalyticsClickmapTokenResponseBodySchema, f as MetricsActiveUsersByCountrySchema, g as MetricsAnalyticsOverviewSchema, h as MetricsAnalyticsOverview, i as AnalyticsClickmapDeviceSchema, j as MetricsNamedCountSchema, k as MetricsLoginMethodEntrySchema, l as AnalyticsClickmapResponseBodySchema, m as MetricsActivitySplitSchema, n as AnalyticsClickmapCellSchema, o as AnalyticsClickmapKindSchema, p as MetricsActivitySplit, q as MetricsUserCountsSchema, r as AnalyticsClickmapDevice, s as AnalyticsClickmapOptions, t as AnalyticsClickmapCell, u as AnalyticsClickmapTokenResponse, v as MetricsAuthOverviewSchema, w as MetricsDataPointSchema, x as MetricsDailyRevenuePoint, y as MetricsDailyEmailStatusBreakdown, z as MetricsResponseBodySchema } from "../admin-metrics-
|
|
1
|
+
import { A as MetricsNamedCount, B as MetricsTopCountry, C as MetricsDataPoint, D as MetricsEmailOverviewSchema, E as MetricsEmailOverview, F as MetricsRecentEmailSchema, G as MetricsTopRegionSchema, H as MetricsTopReferrer, I as MetricsRecentUser, J as UserActivityResponse, K as MetricsUserCounts, L as MetricsRecentUserSchema, M as MetricsPaymentsOverview, N as MetricsPaymentsOverviewSchema, O as MetricsLoginMethodEntry, P as MetricsRecentEmail, R as MetricsResponse, S as MetricsDailyRevenuePointSchema, T as MetricsDataPointsSchema, U as MetricsTopReferrerSchema, V as MetricsTopCountrySchema, W as MetricsTopRegion, Y as UserActivityResponseBodySchema, _ as MetricsAuthOverview, a as AnalyticsClickmapKind, b as MetricsDailyEmailStatusBreakdownSchema, c as AnalyticsClickmapResponse, d as AnalyticsClickmapTokenResponseBodySchema, f as MetricsActiveUsersByCountrySchema, g as MetricsAnalyticsOverviewSchema, h as MetricsAnalyticsOverview, i as AnalyticsClickmapDeviceSchema, j as MetricsNamedCountSchema, k as MetricsLoginMethodEntrySchema, l as AnalyticsClickmapResponseBodySchema, m as MetricsActivitySplitSchema, n as AnalyticsClickmapCellSchema, o as AnalyticsClickmapKindSchema, p as MetricsActivitySplit, q as MetricsUserCountsSchema, r as AnalyticsClickmapDevice, s as AnalyticsClickmapOptions, t as AnalyticsClickmapCell, u as AnalyticsClickmapTokenResponse, v as MetricsAuthOverviewSchema, w as MetricsDataPointSchema, x as MetricsDailyRevenuePoint, y as MetricsDailyEmailStatusBreakdown, z as MetricsResponseBodySchema } from "../admin-metrics-bsOkw4YQ.js";
|
|
2
2
|
export { AnalyticsClickmapCell, AnalyticsClickmapCellSchema, AnalyticsClickmapDevice, AnalyticsClickmapDeviceSchema, AnalyticsClickmapKind, AnalyticsClickmapKindSchema, AnalyticsClickmapOptions, AnalyticsClickmapResponse, AnalyticsClickmapResponseBodySchema, AnalyticsClickmapTokenResponse, AnalyticsClickmapTokenResponseBodySchema, MetricsActiveUsersByCountrySchema, MetricsActivitySplit, MetricsActivitySplitSchema, MetricsAnalyticsOverview, MetricsAnalyticsOverviewSchema, MetricsAuthOverview, MetricsAuthOverviewSchema, MetricsDailyEmailStatusBreakdown, MetricsDailyEmailStatusBreakdownSchema, MetricsDailyRevenuePoint, MetricsDailyRevenuePointSchema, MetricsDataPoint, MetricsDataPointSchema, MetricsDataPointsSchema, MetricsEmailOverview, MetricsEmailOverviewSchema, MetricsLoginMethodEntry, MetricsLoginMethodEntrySchema, MetricsNamedCount, MetricsNamedCountSchema, MetricsPaymentsOverview, MetricsPaymentsOverviewSchema, MetricsRecentEmail, MetricsRecentEmailSchema, MetricsRecentUser, MetricsRecentUserSchema, MetricsResponse, MetricsResponseBodySchema, MetricsTopCountry, MetricsTopCountrySchema, MetricsTopReferrer, MetricsTopReferrerSchema, MetricsTopRegion, MetricsTopRegionSchema, MetricsUserCounts, MetricsUserCountsSchema, UserActivityResponse, UserActivityResponseBodySchema };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { i as RequestLogEntry, n as HexclaveClientInterface, r as RequestListener, t as ClientInterfaceOptions } from "../client-interface-
|
|
1
|
+
import { i as RequestLogEntry, n as HexclaveClientInterface, r as RequestListener, t as ClientInterfaceOptions } from "../client-interface-DvkciaL0.js";
|
|
2
2
|
export { ClientInterfaceOptions, HexclaveClientInterface, RequestListener, RequestLogEntry };
|
|
@@ -49,16 +49,16 @@ declare const conversationSummarySchema: yup$1.ObjectSchema<{
|
|
|
49
49
|
userPrimaryEmail: string | null;
|
|
50
50
|
userProfileImageUrl: string | null;
|
|
51
51
|
subject: string;
|
|
52
|
-
status: "
|
|
52
|
+
status: "open" | "pending" | "closed";
|
|
53
53
|
priority: "low" | "normal" | "high" | "urgent";
|
|
54
54
|
source: "email" | "manual" | "chat" | "api";
|
|
55
55
|
lastMessageType: "message" | "internal-note" | "status-change";
|
|
56
56
|
preview: string | null;
|
|
57
57
|
lastActivityAt: string;
|
|
58
58
|
metadata: {
|
|
59
|
-
tags: string[];
|
|
60
59
|
assignedToUserId: string | null;
|
|
61
60
|
assignedToDisplayName: string | null;
|
|
61
|
+
tags: string[];
|
|
62
62
|
firstResponseDueAt: string | null;
|
|
63
63
|
firstResponseAt: string | null;
|
|
64
64
|
nextResponseDueAt: string | null;
|
|
@@ -129,7 +129,7 @@ declare const conversationMessageSchema: yup$1.ObjectSchema<{
|
|
|
129
129
|
userId: string | null;
|
|
130
130
|
teamId: string | null;
|
|
131
131
|
subject: string;
|
|
132
|
-
status: "
|
|
132
|
+
status: "open" | "pending" | "closed";
|
|
133
133
|
priority: "low" | "normal" | "high" | "urgent";
|
|
134
134
|
source: "email" | "manual" | "chat" | "api";
|
|
135
135
|
messageType: "message" | "internal-note" | "status-change";
|
|
@@ -139,8 +139,8 @@ declare const conversationMessageSchema: yup$1.ObjectSchema<{
|
|
|
139
139
|
createdAt: string;
|
|
140
140
|
sender: {
|
|
141
141
|
type: "user" | "agent" | "system";
|
|
142
|
-
id: string | null;
|
|
143
142
|
displayName: string | null;
|
|
143
|
+
id: string | null;
|
|
144
144
|
primaryEmail: string | null;
|
|
145
145
|
};
|
|
146
146
|
}, yup$1.AnyObject, {
|
|
@@ -173,29 +173,29 @@ declare const conversationListResponseSchema: yup$1.ObjectSchema<{
|
|
|
173
173
|
lastOutboundAt?: string | null | undefined;
|
|
174
174
|
closedAt?: string | null | undefined;
|
|
175
175
|
recordMetadata?: {} | null | undefined;
|
|
176
|
-
|
|
177
|
-
metadata: {
|
|
178
|
-
tags: string[];
|
|
179
|
-
assignedToUserId: string | null;
|
|
180
|
-
assignedToDisplayName: string | null;
|
|
181
|
-
firstResponseDueAt: string | null;
|
|
182
|
-
firstResponseAt: string | null;
|
|
183
|
-
nextResponseDueAt: string | null;
|
|
184
|
-
lastCustomerReplyAt: string | null;
|
|
185
|
-
lastAgentReplyAt: string | null;
|
|
186
|
-
};
|
|
187
|
-
subject: string;
|
|
188
|
-
status: "pending" | "open" | "closed";
|
|
176
|
+
status: "open" | "pending" | "closed";
|
|
189
177
|
priority: "low" | "normal" | "high" | "urgent";
|
|
178
|
+
subject: string;
|
|
190
179
|
conversationId: string;
|
|
191
180
|
userId: string | null;
|
|
192
181
|
teamId: string | null;
|
|
193
182
|
userDisplayName: string | null;
|
|
194
183
|
userPrimaryEmail: string | null;
|
|
195
184
|
userProfileImageUrl: string | null;
|
|
185
|
+
source: "email" | "manual" | "chat" | "api";
|
|
196
186
|
lastMessageType: "message" | "internal-note" | "status-change";
|
|
197
187
|
preview: string | null;
|
|
198
188
|
lastActivityAt: string;
|
|
189
|
+
metadata: {
|
|
190
|
+
assignedToUserId: string | null;
|
|
191
|
+
assignedToDisplayName: string | null;
|
|
192
|
+
tags: string[];
|
|
193
|
+
firstResponseDueAt: string | null;
|
|
194
|
+
firstResponseAt: string | null;
|
|
195
|
+
nextResponseDueAt: string | null;
|
|
196
|
+
lastCustomerReplyAt: string | null;
|
|
197
|
+
lastAgentReplyAt: string | null;
|
|
198
|
+
};
|
|
199
199
|
}[];
|
|
200
200
|
hasMore: boolean;
|
|
201
201
|
}, yup$1.AnyObject, {
|
|
@@ -211,48 +211,48 @@ declare const conversationDetailResponseSchema: yup$1.ObjectSchema<{
|
|
|
211
211
|
lastOutboundAt?: string | null | undefined;
|
|
212
212
|
closedAt?: string | null | undefined;
|
|
213
213
|
recordMetadata?: {} | null | undefined;
|
|
214
|
-
|
|
215
|
-
metadata: {
|
|
216
|
-
tags: string[];
|
|
217
|
-
assignedToUserId: string | null;
|
|
218
|
-
assignedToDisplayName: string | null;
|
|
219
|
-
firstResponseDueAt: string | null;
|
|
220
|
-
firstResponseAt: string | null;
|
|
221
|
-
nextResponseDueAt: string | null;
|
|
222
|
-
lastCustomerReplyAt: string | null;
|
|
223
|
-
lastAgentReplyAt: string | null;
|
|
224
|
-
};
|
|
225
|
-
subject: string;
|
|
226
|
-
status: "pending" | "open" | "closed";
|
|
214
|
+
status: "open" | "pending" | "closed";
|
|
227
215
|
priority: "low" | "normal" | "high" | "urgent";
|
|
216
|
+
subject: string;
|
|
228
217
|
conversationId: string;
|
|
229
218
|
userId: string | null;
|
|
230
219
|
teamId: string | null;
|
|
231
220
|
userDisplayName: string | null;
|
|
232
221
|
userPrimaryEmail: string | null;
|
|
233
222
|
userProfileImageUrl: string | null;
|
|
223
|
+
source: "email" | "manual" | "chat" | "api";
|
|
234
224
|
lastMessageType: "message" | "internal-note" | "status-change";
|
|
235
225
|
preview: string | null;
|
|
236
226
|
lastActivityAt: string;
|
|
227
|
+
metadata: {
|
|
228
|
+
assignedToUserId: string | null;
|
|
229
|
+
assignedToDisplayName: string | null;
|
|
230
|
+
tags: string[];
|
|
231
|
+
firstResponseDueAt: string | null;
|
|
232
|
+
firstResponseAt: string | null;
|
|
233
|
+
nextResponseDueAt: string | null;
|
|
234
|
+
lastCustomerReplyAt: string | null;
|
|
235
|
+
lastAgentReplyAt: string | null;
|
|
236
|
+
};
|
|
237
237
|
};
|
|
238
238
|
messages: {
|
|
239
|
+
status: "open" | "pending" | "closed";
|
|
239
240
|
id: string;
|
|
240
|
-
body: string | null;
|
|
241
|
-
source: "email" | "manual" | "chat" | "api";
|
|
242
|
-
metadata: {} | null;
|
|
243
|
-
subject: string;
|
|
244
|
-
status: "pending" | "open" | "closed";
|
|
245
241
|
priority: "low" | "normal" | "high" | "urgent";
|
|
242
|
+
subject: string;
|
|
246
243
|
conversationId: string;
|
|
247
244
|
userId: string | null;
|
|
248
245
|
teamId: string | null;
|
|
246
|
+
source: "email" | "manual" | "chat" | "api";
|
|
247
|
+
metadata: {} | null;
|
|
249
248
|
createdAt: string;
|
|
250
249
|
messageType: "message" | "internal-note" | "status-change";
|
|
250
|
+
body: string | null;
|
|
251
251
|
attachments: {}[];
|
|
252
252
|
sender: {
|
|
253
253
|
type: "user" | "agent" | "system";
|
|
254
|
-
id: string | null;
|
|
255
254
|
displayName: string | null;
|
|
255
|
+
id: string | null;
|
|
256
256
|
primaryEmail: string | null;
|
|
257
257
|
};
|
|
258
258
|
}[];
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as currentUserCrud, t as CurrentUserCrud } from "../../current-user-
|
|
1
|
+
import { n as currentUserCrud, t as CurrentUserCrud } from "../../current-user-BBoN3hsn.js";
|
|
2
2
|
export { CurrentUserCrud, currentUserCrud };
|