@hexclave/shared 1.0.14 → 1.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/dist/apps/apps-config.d.ts +6 -0
  2. package/dist/apps/apps-config.js +6 -0
  3. package/dist/apps/apps-config.js.map +1 -1
  4. package/dist/config/schema.d.ts +68 -68
  5. package/dist/config-authoring.d.ts.map +1 -1
  6. package/dist/config-authoring.js.map +1 -1
  7. package/dist/config-authoring.test.js +1 -1
  8. package/dist/config-authoring.test.js.map +1 -1
  9. package/dist/config-rendering.d.ts +2 -2
  10. package/dist/config-rendering.js +16 -0
  11. package/dist/config-rendering.js.map +1 -1
  12. package/dist/esm/apps/apps-config.d.ts +6 -0
  13. package/dist/esm/apps/apps-config.js +6 -0
  14. package/dist/esm/apps/apps-config.js.map +1 -1
  15. package/dist/esm/config/schema.d.ts +68 -68
  16. package/dist/esm/config-authoring.d.ts.map +1 -1
  17. package/dist/esm/config-authoring.js.map +1 -1
  18. package/dist/esm/config-authoring.test.js +1 -1
  19. package/dist/esm/config-authoring.test.js.map +1 -1
  20. package/dist/esm/config-rendering.d.ts +2 -2
  21. package/dist/esm/config-rendering.js +16 -2
  22. package/dist/esm/config-rendering.js.map +1 -1
  23. package/dist/esm/hexclave-config-file.d.ts +24 -1
  24. package/dist/esm/hexclave-config-file.d.ts.map +1 -1
  25. package/dist/esm/hexclave-config-file.js +69 -2
  26. package/dist/esm/hexclave-config-file.js.map +1 -1
  27. package/dist/esm/interface/admin-interface.d.ts +19 -1
  28. package/dist/esm/interface/admin-interface.d.ts.map +1 -1
  29. package/dist/esm/interface/admin-interface.js +14 -0
  30. package/dist/esm/interface/admin-interface.js.map +1 -1
  31. package/dist/esm/interface/admin-metrics.d.ts +101 -7
  32. package/dist/esm/interface/admin-metrics.d.ts.map +1 -1
  33. package/dist/esm/interface/admin-metrics.js +61 -1
  34. package/dist/esm/interface/admin-metrics.js.map +1 -1
  35. package/dist/esm/interface/conversations.d.ts +38 -38
  36. package/dist/esm/interface/crud/current-user.d.ts +2 -2
  37. package/dist/esm/interface/crud/email-outbox.d.ts +150 -150
  38. package/dist/esm/interface/crud/invoices.d.ts +2 -2
  39. package/dist/esm/interface/crud/products.d.ts +4 -4
  40. package/dist/esm/interface/crud/project-api-keys.d.ts +2 -2
  41. package/dist/esm/interface/crud/projects.d.ts +51 -51
  42. package/dist/esm/interface/crud/team-member-profiles.d.ts +10 -10
  43. package/dist/esm/interface/crud/transactions.d.ts +2 -2
  44. package/dist/esm/interface/crud/users.d.ts +10 -10
  45. package/dist/esm/interface/webhooks.d.ts +2 -2
  46. package/dist/esm/schema-fields.d.ts +3 -3
  47. package/dist/esm/sessions.d.ts +2 -2
  48. package/dist/esm/utils/analytics-clickmap-overlay.d.ts +18 -0
  49. package/dist/esm/utils/analytics-clickmap-overlay.d.ts.map +1 -0
  50. package/dist/esm/utils/analytics-clickmap-overlay.js +19 -0
  51. package/dist/esm/utils/analytics-clickmap-overlay.js.map +1 -0
  52. package/dist/esm/utils/dev-tool.d.ts +31 -0
  53. package/dist/esm/utils/dev-tool.d.ts.map +1 -0
  54. package/dist/esm/utils/dev-tool.js +32 -0
  55. package/dist/esm/utils/dev-tool.js.map +1 -0
  56. package/dist/esm/utils/dom.d.ts +7 -1
  57. package/dist/esm/utils/dom.d.ts.map +1 -1
  58. package/dist/esm/utils/dom.js +20 -1
  59. package/dist/esm/utils/dom.js.map +1 -1
  60. package/dist/esm/utils/elements-chain.d.ts +38 -0
  61. package/dist/esm/utils/elements-chain.d.ts.map +1 -0
  62. package/dist/esm/utils/elements-chain.js +297 -0
  63. package/dist/esm/utils/elements-chain.js.map +1 -0
  64. package/dist/hexclave-config-file.d.ts +24 -1
  65. package/dist/hexclave-config-file.d.ts.map +1 -1
  66. package/dist/hexclave-config-file.js +71 -1
  67. package/dist/hexclave-config-file.js.map +1 -1
  68. package/dist/interface/admin-interface.d.ts +19 -1
  69. package/dist/interface/admin-interface.d.ts.map +1 -1
  70. package/dist/interface/admin-interface.js +14 -0
  71. package/dist/interface/admin-interface.js.map +1 -1
  72. package/dist/interface/admin-metrics.d.ts +101 -7
  73. package/dist/interface/admin-metrics.d.ts.map +1 -1
  74. package/dist/interface/admin-metrics.js +65 -0
  75. package/dist/interface/admin-metrics.js.map +1 -1
  76. package/dist/interface/conversations.d.ts +38 -38
  77. package/dist/interface/crud/current-user.d.ts +2 -2
  78. package/dist/interface/crud/email-outbox.d.ts +150 -150
  79. package/dist/interface/crud/invoices.d.ts +2 -2
  80. package/dist/interface/crud/products.d.ts +4 -4
  81. package/dist/interface/crud/project-api-keys.d.ts +2 -2
  82. package/dist/interface/crud/projects.d.ts +51 -51
  83. package/dist/interface/crud/team-member-profiles.d.ts +10 -10
  84. package/dist/interface/crud/transactions.d.ts +2 -2
  85. package/dist/interface/crud/users.d.ts +10 -10
  86. package/dist/interface/webhooks.d.ts +2 -2
  87. package/dist/schema-fields.d.ts +3 -3
  88. package/dist/sessions.d.ts +2 -2
  89. package/dist/utils/analytics-clickmap-overlay.d.ts +18 -0
  90. package/dist/utils/analytics-clickmap-overlay.d.ts.map +1 -0
  91. package/dist/utils/analytics-clickmap-overlay.js +23 -0
  92. package/dist/utils/analytics-clickmap-overlay.js.map +1 -0
  93. package/dist/utils/dev-tool.d.ts +31 -0
  94. package/dist/utils/dev-tool.d.ts.map +1 -0
  95. package/dist/utils/dev-tool.js +37 -0
  96. package/dist/utils/dev-tool.js.map +1 -0
  97. package/dist/utils/dom.d.ts +7 -1
  98. package/dist/utils/dom.d.ts.map +1 -1
  99. package/dist/utils/dom.js +20 -0
  100. package/dist/utils/dom.js.map +1 -1
  101. package/dist/utils/elements-chain.d.ts +38 -0
  102. package/dist/utils/elements-chain.d.ts.map +1 -0
  103. package/dist/utils/elements-chain.js +304 -0
  104. package/dist/utils/elements-chain.js.map +1 -0
  105. package/package.json +1 -1
  106. package/src/apps/apps-config.ts +6 -0
  107. package/src/config-authoring.test.ts +1 -1
  108. package/src/config-authoring.ts +6 -6
  109. package/src/config-rendering.ts +24 -2
  110. package/src/hexclave-config-file.ts +90 -1
  111. package/src/interface/admin-interface.ts +43 -1
  112. package/src/interface/admin-metrics.ts +92 -4
  113. package/src/utils/analytics-clickmap-overlay.tsx +15 -0
  114. package/src/utils/dev-tool.tsx +30 -0
  115. package/src/utils/dom.tsx +42 -0
  116. package/src/utils/elements-chain.tsx +349 -0
@@ -59,11 +59,78 @@ function evaluateStaticConfigExpression(expression) {
59
59
  }
60
60
  throw new Error(`Unsupported config expression: ${unwrapped.type}`);
61
61
  }
62
+ /**
63
+ * Like {@link parseHexclaveConfigFileContent}, but returns `null` instead of
64
+ * throwing when the file is not a plain static config (e.g. it wraps the config
65
+ * in a helper call, references imported values, or has a syntax error). Useful
66
+ * for deciding whether a config file can be safely regenerated deterministically
67
+ * or whether it has custom structure that must be preserved.
68
+ */
69
+ function tryParseHexclaveConfigFileContent(content, filePath) {
70
+ try {
71
+ return parseHexclaveConfigFileContent(content, filePath);
72
+ } catch {
73
+ return null;
74
+ }
75
+ }
76
+ /**
77
+ * Returns whether `content` parses as a module that exports a `config` binding.
78
+ * Used as a lightweight structural sanity check after editing config files whose
79
+ * values can't be evaluated by our loader (e.g. they import external text
80
+ * files), where a full semantic comparison isn't possible.
81
+ */
82
+ function hexclaveConfigFileExportsConfig(content, filePath) {
83
+ let ast;
84
+ try {
85
+ ast = _babel_parser.parse(content, {
86
+ sourceType: "module",
87
+ sourceFilename: filePath,
88
+ plugins: ["typescript", "importAttributes"]
89
+ });
90
+ } catch {
91
+ return false;
92
+ }
93
+ for (const statement of ast.program.body) {
94
+ if (!_babel_types.isExportNamedDeclaration(statement)) continue;
95
+ if (statement.exportKind === "type") continue;
96
+ if (_babel_types.isVariableDeclaration(statement.declaration)) {
97
+ for (const declaration of statement.declaration.declarations) if (_babel_types.isIdentifier(declaration.id) && declaration.id.name === "config" && declaration.init != null) return true;
98
+ }
99
+ for (const specifier of statement.specifiers) if (_babel_types.isExportSpecifier(specifier) && specifier.exportKind !== "type") {
100
+ if ((_babel_types.isIdentifier(specifier.exported) ? specifier.exported.name : specifier.exported.value) === "config") return true;
101
+ }
102
+ }
103
+ return false;
104
+ }
105
+ /**
106
+ * Returns the relative import sources (those starting with `./` or `../`)
107
+ * declared in `content`. Used to discover the external files a config update may
108
+ * touch — e.g. `import x from "./welcome-email.tsx" with { type: "text" }` — so
109
+ * they can be snapshotted and rolled back if an in-place update fails. Returns
110
+ * an empty array if the file can't be parsed.
111
+ */
112
+ function getRelativeImportSpecifiers(content) {
113
+ let ast;
114
+ try {
115
+ ast = _babel_parser.parse(content, {
116
+ sourceType: "module",
117
+ plugins: ["typescript", "importAttributes"]
118
+ });
119
+ } catch {
120
+ return [];
121
+ }
122
+ const sources = [];
123
+ for (const statement of ast.program.body) if (_babel_types.isImportDeclaration(statement)) {
124
+ const source = statement.source.value;
125
+ if (source.startsWith("./") || source.startsWith("../")) sources.push(source);
126
+ }
127
+ return sources;
128
+ }
62
129
  function parseHexclaveConfigFileContent(content, filePath) {
63
130
  if (content.trim() === "") return {};
64
131
  const ast = _babel_parser.parse(content, {
65
132
  sourceType: "module",
66
- plugins: ["typescript"]
133
+ plugins: ["typescript", "importAttributes"]
67
134
  });
68
135
  for (const statement of ast.program.body) {
69
136
  if (!_babel_types.isExportNamedDeclaration(statement) || !_babel_types.isVariableDeclaration(statement.declaration)) continue;
@@ -77,7 +144,10 @@ function parseHexclaveConfigFileContent(content, filePath) {
77
144
  }
78
145
 
79
146
  //#endregion
147
+ exports.getRelativeImportSpecifiers = getRelativeImportSpecifiers;
148
+ exports.hexclaveConfigFileExportsConfig = hexclaveConfigFileExportsConfig;
80
149
  exports.parseHexclaveConfigFileContent = parseHexclaveConfigFileContent;
81
150
  exports.renderConfigFileContent = renderConfigFileContent;
82
151
  exports.showOnboardingHexclaveConfigValue = showOnboardingHexclaveConfigValue;
152
+ exports.tryParseHexclaveConfigFileContent = tryParseHexclaveConfigFileContent;
83
153
  //# sourceMappingURL=hexclave-config-file.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hexclave-config-file.js","names":["t","parser"],"sources":["../src/hexclave-config-file.ts"],"sourcesContent":["import * as parser from \"@babel/parser\";\nimport * as t from \"@babel/types\";\nimport { isValidConfig, normalize } from \"./config/format\";\n\nexport const showOnboardingHexclaveConfigValue = \"show-onboarding\";\n\nconst DEFAULT_CONFIG_IMPORT_PACKAGE = \"@hexclave/js\";\n\n/**\n * Renders a config object into the source text of a `stack.config.ts` file.\n *\n * Browser-safe: kept here (next to `parseHexclaveConfigFileContent`) instead of in\n * `config-rendering.ts` so dashboard client code can render config files\n * without pulling in `fs` / `path`.\n */\nexport function renderConfigFileContent(config: unknown, importPackage?: string): string {\n if (!isValidConfig(config)) {\n throw new Error(\"Invalid config: expected a plain object.\");\n }\n\n const droppedKeys: string[] = [];\n const normalizedConfig = normalize(config, {\n onDotIntoNonObject: \"ignore\",\n onDotIntoNull: \"empty-object\",\n droppedKeys,\n });\n if (droppedKeys.length > 0) {\n throw new Error(`Config has conflicting keys that would be dropped during normalization: ${droppedKeys.map(k => JSON.stringify(k)).join(\", \")}`);\n }\n const pkg = importPackage ?? DEFAULT_CONFIG_IMPORT_PACKAGE;\n // Import the `HexclaveConfig` type from the package's lightweight `/config`\n // entrypoint, which is free of framework runtime code and therefore safe for\n // tooling (e.g. the local dashboard) to load in a plain Node context. Only the\n // Hexclave-branded packages expose this subpath; legacy `@stackframe/*`\n // releases predate it, so fall back to their package root.\n const importSpecifier = pkg.startsWith(\"@hexclave/\") ? `${pkg}/config` : pkg;\n const importLine = `import type { HexclaveConfig } from \"${importSpecifier}\";`;\n return `${importLine}\\n\\nexport const config: HexclaveConfig = ${JSON.stringify(normalizedConfig, null, 2)};\\n`;\n}\n\ntype ParsedStackConfig = Record<string, unknown> | typeof showOnboardingHexclaveConfigValue;\n\nfunction unwrapStaticConfigExpression(expression: t.Expression): t.Expression {\n if (\n t.isTSAsExpression(expression)\n || t.isTSSatisfiesExpression(expression)\n || t.isTSTypeAssertion(expression)\n || t.isTSNonNullExpression(expression)\n ) {\n return unwrapStaticConfigExpression(expression.expression);\n }\n return expression;\n}\n\nfunction evaluateStaticConfigExpression(expression: t.Expression): unknown {\n const unwrapped = unwrapStaticConfigExpression(expression);\n if (t.isStringLiteral(unwrapped)) return unwrapped.value;\n if (t.isBooleanLiteral(unwrapped)) return unwrapped.value;\n if (t.isNumericLiteral(unwrapped)) return unwrapped.value;\n if (t.isNullLiteral(unwrapped)) return null;\n if (t.isIdentifier(unwrapped) && unwrapped.name === \"undefined\") return undefined;\n if (t.isUnaryExpression(unwrapped) && unwrapped.operator === \"-\" && t.isNumericLiteral(unwrapped.argument)) {\n return -unwrapped.argument.value;\n }\n if (t.isArrayExpression(unwrapped)) {\n return unwrapped.elements.map((element) => {\n if (element == null || t.isSpreadElement(element)) {\n throw new Error(\"Config arrays cannot contain holes or spreads.\");\n }\n return evaluateStaticConfigExpression(element);\n });\n }\n if (t.isObjectExpression(unwrapped)) {\n const result: Record<string, unknown> = {};\n for (const property of unwrapped.properties) {\n if (t.isSpreadElement(property)) {\n throw new Error(\"Config objects cannot contain spreads.\");\n }\n if (property.computed) {\n throw new Error(\"Config object keys cannot be computed.\");\n }\n const key = t.isIdentifier(property.key)\n ? property.key.name\n : t.isStringLiteral(property.key) || t.isNumericLiteral(property.key)\n ? String(property.key.value)\n : null;\n if (key == null) {\n throw new Error(\"Unsupported config object key.\");\n }\n if (t.isObjectMethod(property)) {\n throw new Error(\"Config objects cannot contain methods.\");\n }\n if (!t.isExpression(property.value)) {\n throw new Error(\"Unsupported config object value.\");\n }\n result[key] = evaluateStaticConfigExpression(property.value);\n }\n return result;\n }\n throw new Error(`Unsupported config expression: ${unwrapped.type}`);\n}\n\nexport function parseHexclaveConfigFileContent(content: string, filePath: string): ParsedStackConfig {\n if (content.trim() === \"\") return {};\n const ast = parser.parse(content, {\n sourceType: \"module\",\n plugins: [\"typescript\"],\n });\n\n for (const statement of ast.program.body) {\n if (!t.isExportNamedDeclaration(statement) || !t.isVariableDeclaration(statement.declaration)) {\n continue;\n }\n for (const declaration of statement.declaration.declarations) {\n if (!t.isIdentifier(declaration.id) || declaration.id.name !== \"config\") {\n continue;\n }\n if (declaration.init == null || !t.isExpression(declaration.init)) {\n throw new Error(`Config export in ${filePath} must have an initializer.`);\n }\n return evaluateStaticConfigExpression(declaration.init) as ParsedStackConfig;\n }\n }\n\n throw new Error(`Invalid config in ${filePath}. The file must export a plain \\`config\\` object or \"show-onboarding\".`);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"hexclave-config-file.js","names":["t","parser"],"sources":["../src/hexclave-config-file.ts"],"sourcesContent":["import * as parser from \"@babel/parser\";\nimport * as t from \"@babel/types\";\nimport { isValidConfig, normalize } from \"./config/format\";\n\nexport const showOnboardingHexclaveConfigValue = \"show-onboarding\";\n\nconst DEFAULT_CONFIG_IMPORT_PACKAGE = \"@hexclave/js\";\n\n/**\n * Renders a config object into the source text of a `stack.config.ts` file.\n *\n * Browser-safe: kept here (next to `parseHexclaveConfigFileContent`) instead of in\n * `config-rendering.ts` so dashboard client code can render config files\n * without pulling in `fs` / `path`.\n */\nexport function renderConfigFileContent(config: unknown, importPackage?: string): string {\n if (!isValidConfig(config)) {\n throw new Error(\"Invalid config: expected a plain object.\");\n }\n\n const droppedKeys: string[] = [];\n const normalizedConfig = normalize(config, {\n onDotIntoNonObject: \"ignore\",\n onDotIntoNull: \"empty-object\",\n droppedKeys,\n });\n if (droppedKeys.length > 0) {\n throw new Error(`Config has conflicting keys that would be dropped during normalization: ${droppedKeys.map(k => JSON.stringify(k)).join(\", \")}`);\n }\n const pkg = importPackage ?? DEFAULT_CONFIG_IMPORT_PACKAGE;\n // Import the `HexclaveConfig` type from the package's lightweight `/config`\n // entrypoint, which is free of framework runtime code and therefore safe for\n // tooling (e.g. the local dashboard) to load in a plain Node context. Only the\n // Hexclave-branded packages expose this subpath; legacy `@stackframe/*`\n // releases predate it, so fall back to their package root.\n const importSpecifier = pkg.startsWith(\"@hexclave/\") ? `${pkg}/config` : pkg;\n const importLine = `import type { HexclaveConfig } from \"${importSpecifier}\";`;\n return `${importLine}\\n\\nexport const config: HexclaveConfig = ${JSON.stringify(normalizedConfig, null, 2)};\\n`;\n}\n\ntype ParsedStackConfig = Record<string, unknown> | typeof showOnboardingHexclaveConfigValue;\n\nfunction unwrapStaticConfigExpression(expression: t.Expression): t.Expression {\n if (\n t.isTSAsExpression(expression)\n || t.isTSSatisfiesExpression(expression)\n || t.isTSTypeAssertion(expression)\n || t.isTSNonNullExpression(expression)\n ) {\n return unwrapStaticConfigExpression(expression.expression);\n }\n return expression;\n}\n\nfunction evaluateStaticConfigExpression(expression: t.Expression): unknown {\n const unwrapped = unwrapStaticConfigExpression(expression);\n if (t.isStringLiteral(unwrapped)) return unwrapped.value;\n if (t.isBooleanLiteral(unwrapped)) return unwrapped.value;\n if (t.isNumericLiteral(unwrapped)) return unwrapped.value;\n if (t.isNullLiteral(unwrapped)) return null;\n if (t.isIdentifier(unwrapped) && unwrapped.name === \"undefined\") return undefined;\n if (t.isUnaryExpression(unwrapped) && unwrapped.operator === \"-\" && t.isNumericLiteral(unwrapped.argument)) {\n return -unwrapped.argument.value;\n }\n if (t.isArrayExpression(unwrapped)) {\n return unwrapped.elements.map((element) => {\n if (element == null || t.isSpreadElement(element)) {\n throw new Error(\"Config arrays cannot contain holes or spreads.\");\n }\n return evaluateStaticConfigExpression(element);\n });\n }\n if (t.isObjectExpression(unwrapped)) {\n const result: Record<string, unknown> = {};\n for (const property of unwrapped.properties) {\n if (t.isSpreadElement(property)) {\n throw new Error(\"Config objects cannot contain spreads.\");\n }\n if (property.computed) {\n throw new Error(\"Config object keys cannot be computed.\");\n }\n const key = t.isIdentifier(property.key)\n ? property.key.name\n : t.isStringLiteral(property.key) || t.isNumericLiteral(property.key)\n ? String(property.key.value)\n : null;\n if (key == null) {\n throw new Error(\"Unsupported config object key.\");\n }\n if (t.isObjectMethod(property)) {\n throw new Error(\"Config objects cannot contain methods.\");\n }\n if (!t.isExpression(property.value)) {\n throw new Error(\"Unsupported config object value.\");\n }\n result[key] = evaluateStaticConfigExpression(property.value);\n }\n return result;\n }\n throw new Error(`Unsupported config expression: ${unwrapped.type}`);\n}\n\n/**\n * Like {@link parseHexclaveConfigFileContent}, but returns `null` instead of\n * throwing when the file is not a plain static config (e.g. it wraps the config\n * in a helper call, references imported values, or has a syntax error). Useful\n * for deciding whether a config file can be safely regenerated deterministically\n * or whether it has custom structure that must be preserved.\n */\nexport function tryParseHexclaveConfigFileContent(content: string, filePath: string): ParsedStackConfig | null {\n try {\n return parseHexclaveConfigFileContent(content, filePath);\n } catch {\n return null;\n }\n}\n\n/**\n * Returns whether `content` parses as a module that exports a `config` binding.\n * Used as a lightweight structural sanity check after editing config files whose\n * values can't be evaluated by our loader (e.g. they import external text\n * files), where a full semantic comparison isn't possible.\n */\nexport function hexclaveConfigFileExportsConfig(content: string, filePath: string): boolean {\n let ast: parser.ParseResult<t.File>;\n try {\n ast = parser.parse(content, {\n sourceType: \"module\",\n sourceFilename: filePath,\n plugins: [\"typescript\", \"importAttributes\"],\n });\n } catch {\n return false;\n }\n for (const statement of ast.program.body) {\n if (!t.isExportNamedDeclaration(statement)) {\n continue;\n }\n // Ignore type-only exports (`export type { config }`): they don't produce a\n // runtime `config` value, so they must not satisfy the structural check.\n if (statement.exportKind === \"type\") {\n continue;\n }\n if (t.isVariableDeclaration(statement.declaration)) {\n for (const declaration of statement.declaration.declarations) {\n if (t.isIdentifier(declaration.id) && declaration.id.name === \"config\" && declaration.init != null) {\n return true;\n }\n }\n }\n for (const specifier of statement.specifiers) {\n if (t.isExportSpecifier(specifier) && specifier.exportKind !== \"type\") {\n const exportedName = t.isIdentifier(specifier.exported) ? specifier.exported.name : specifier.exported.value;\n if (exportedName === \"config\") {\n return true;\n }\n }\n }\n }\n return false;\n}\n\n/**\n * Returns the relative import sources (those starting with `./` or `../`)\n * declared in `content`. Used to discover the external files a config update may\n * touch — e.g. `import x from \"./welcome-email.tsx\" with { type: \"text\" }` — so\n * they can be snapshotted and rolled back if an in-place update fails. Returns\n * an empty array if the file can't be parsed.\n */\nexport function getRelativeImportSpecifiers(content: string): string[] {\n let ast: parser.ParseResult<t.File>;\n try {\n ast = parser.parse(content, {\n sourceType: \"module\",\n plugins: [\"typescript\", \"importAttributes\"],\n });\n } catch {\n return [];\n }\n const sources: string[] = [];\n for (const statement of ast.program.body) {\n if (t.isImportDeclaration(statement)) {\n const source = statement.source.value;\n if (source.startsWith(\"./\") || source.startsWith(\"../\")) {\n sources.push(source);\n }\n }\n }\n return sources;\n}\n\nexport function parseHexclaveConfigFileContent(content: string, filePath: string): ParsedStackConfig {\n if (content.trim() === \"\") return {};\n const ast = parser.parse(content, {\n sourceType: \"module\",\n plugins: [\"typescript\", \"importAttributes\"],\n });\n\n for (const statement of ast.program.body) {\n if (!t.isExportNamedDeclaration(statement) || !t.isVariableDeclaration(statement.declaration)) {\n continue;\n }\n for (const declaration of statement.declaration.declarations) {\n if (!t.isIdentifier(declaration.id) || declaration.id.name !== \"config\") {\n continue;\n }\n if (declaration.init == null || !t.isExpression(declaration.init)) {\n throw new Error(`Config export in ${filePath} must have an initializer.`);\n }\n return evaluateStaticConfigExpression(declaration.init) as ParsedStackConfig;\n }\n }\n\n throw new Error(`Invalid config in ${filePath}. The file must export a plain \\`config\\` object or \"show-onboarding\".`);\n}\n"],"mappings":"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"}
@@ -3,7 +3,7 @@ import { KnownErrors } from "../known-errors.js";
3
3
  import { MoneyAmount } from "../utils/currency-constants.js";
4
4
  import { RestrictedReason, branchConfigSourceSchema } from "../schema-fields.js";
5
5
  import { AccessToken, InternalSession, RefreshToken } from "../sessions.js";
6
- import { MetricsResponse, MetricsUserCounts, UserActivityResponse } from "./admin-metrics.js";
6
+ import { AnalyticsClickmapDevice, AnalyticsClickmapKind, AnalyticsClickmapResponse, AnalyticsClickmapTokenResponse, MetricsResponse, MetricsUserCounts, UserActivityResponse } from "./admin-metrics.js";
7
7
  import { AnalyticsQueryOptions, AnalyticsQueryResponse } from "./crud/analytics.js";
8
8
  import { EmailOutboxCrud } from "./crud/email-outbox.js";
9
9
  import { InternalEmailsCrud } from "./crud/emails.js";
@@ -127,6 +127,24 @@ declare class HexclaveAdminInterface extends HexclaveServerInterface {
127
127
  until?: string;
128
128
  }): Promise<MetricsResponse>;
129
129
  getUserActivity(userId: string): Promise<UserActivityResponse>;
130
+ getAnalyticsClickmap(options: {
131
+ kind: AnalyticsClickmapKind;
132
+ member_user_ids?: string[];
133
+ route_path?: string;
134
+ route_regex?: string;
135
+ url_pattern?: string;
136
+ user_id?: string;
137
+ replay_id?: string;
138
+ device?: AnalyticsClickmapDevice;
139
+ viewport_width_min?: number;
140
+ viewport_width_max?: number;
141
+ sampling?: number;
142
+ since: string;
143
+ until: string;
144
+ }): Promise<AnalyticsClickmapResponse>;
145
+ createAnalyticsClickmapToken(options: {
146
+ origin: string;
147
+ }): Promise<AnalyticsClickmapTokenResponse>;
130
148
  getMetricsUserCounts(): Promise<MetricsUserCounts>;
131
149
  sendTestEmail(data: {
132
150
  recipient_email: string;
@@ -1 +1 @@
1
- {"version":3,"file":"admin-interface.d.ts","names":[],"sources":["../../src/interface/admin-interface.ts"],"mappings":"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"}
1
+ {"version":3,"file":"admin-interface.d.ts","names":[],"sources":["../../src/interface/admin-interface.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;KA6BK,qBAAA,GAAwB,KAAA,CAAI,SAAA,QAAiB,wBAAA;AAAA,KAEtC,WAAA,GAAc,KAAA;EACpB,IAAA;EAAc,IAAA;AAAA;EACd,IAAA;EAAmB,QAAA;EAAkB,UAAA;EAAoB,IAAA;EAAW,QAAA;EAAkB,MAAA;AAAA;AAAA,KAGhF,2BAAA,GAA8B,4BAAA;EAEtC,mBAAA;AAAA;EAGA,mBAAA,EAAqB,eAAA,UAAyB,OAAA;AAAA;AAAA,KAItC,+BAAA;EACV,0BAAA;EACA,qBAAA;EACA,0BAAA;EACA,iBAAA;EACA,WAAA;AAAA;AAAA,KAGU,gCAAA,GAAmC,mBAAA;EAC7C,sBAAA;EACA,iBAAA;EACA,sBAAA;AAAA;AAAA,cAIW,sBAAA,SAA+B,uBAAA;EAAA,SACd,OAAA,EAAS,2BAAA;cAAT,OAAA,EAAS,2BAAA;EAIxB,gBAAA,CAAiB,IAAA,UAAc,OAAA,EAAS,WAAA,EAAa,OAAA,EAAS,eAAA,SAAwB,WAAA,aAA8B,OAAA,CAAA,QAAA;;;;;;YAgBjH,kCAAA,kBAAoD,WAAA,OAAkB,WAAA,EAAA,CACpF,IAAA,UACA,cAAA,EAAgB,WAAA,EAChB,gBAAA,EAAkB,eAAA,SAClB,aAAA,WAAwB,CAAA,KACvB,OAAA,CAAQ,MAAA,CACT,QAAA;IACE,UAAA;MACE,WAAA,EAAa,WAAA;MACb,YAAA,EAAc,YAAA;IAAA;EAAA,GAGlB,YAAA,CAAa,CAAA;EAcT,UAAA,CAAA,GAAc,OAAA,CAAQ,YAAA;EAWtB,aAAA,CAAc,MAAA,EAAQ,YAAA,sBAAkC,OAAA,CAAQ,YAAA;EAehE,oBAAA,CACJ,OAAA,EAAS,+BAAA,GACR,OAAA,CAAQ,gCAAA;EAeL,mBAAA,CAAA,GAAuB,OAAA,CAAQ,mBAAA;EAM/B,wBAAA,CAAyB,EAAA,WAAU,OAAA;EAenC,iBAAA,CAAkB,EAAA,UAAY,OAAA,EAAS,eAAA,GAAkB,OAAA,CAAQ,mBAAA;EAKjE,0BAAA,CAAA,GAA8B,OAAA;IAAU,EAAA;IAAY,YAAA;IAAsB,QAAA;IAAmB,UAAA;EAAA;EAM7F,uBAAA,CAAA,GAA2B,OAAA;IAAU,EAAA;IAAY,YAAA;IAAsB,QAAA;IAAuC,UAAA;IAAoB,cAAA;EAAA;EAMlI,gBAAA,CAAiB,OAAA;IAAW,YAAA;IAAuB,QAAA;IAA2B,UAAA;EAAA,IAAwB,OAAA;IAAU,EAAA;EAAA;EAehH,gBAAA,CAAiB,EAAA,UAAY,IAAA;IAAQ,YAAA;IAAuB,QAAA;IAAkC,UAAA;IAAqB,cAAA;EAAA,IAAmC,OAAA;EActJ,gBAAA,CAAiB,EAAA,WAAa,OAAA;EAU9B,eAAA,CAAA,GAAmB,OAAA;IAAU,EAAA;IAAY,YAAA;EAAA;EAQzC,6BAAA,CAAA,GAAiC,OAAA,CAAQ,6BAAA;EAMzC,sCAAA,CACJ,OAAA;IAAW,KAAA;IAAe,MAAA;IAAiB,KAAA;EAAA,IAC1C,OAAA;IAAU,KAAA,EAAO,6BAAA;IAAkD,UAAA;EAAA;EAahE,8BAAA,CAA+B,IAAA,EAAM,6BAAA,sBAAmD,OAAA,CAAQ,6BAAA;EAehG,8BAAA,CAA+B,YAAA,UAAsB,IAAA,EAAM,6BAAA,sBAAmD,OAAA,CAAQ,6BAAA;EAetH,8BAAA,CAA+B,YAAA,WAAuB,OAAA;EAQtD,gCAAA,CAAA,GAAoC,OAAA,CAAQ,gCAAA;EAM5C,iCAAA,CAAkC,IAAA,EAAM,gCAAA,sBAAsD,OAAA,CAAQ,gCAAA;EAetG,iCAAA,CAAkC,YAAA,UAAsB,IAAA,EAAM,gCAAA,sBAAsD,OAAA,CAAQ,gCAAA;EAe5H,iCAAA,CAAkC,YAAA,WAAuB,OAAA;EAQzD,YAAA,CAAA,GAAgB,OAAA,CAAQ,aAAA;EAexB,aAAA,CAAA,GAAiB,OAAA;EAUjB,UAAA,CACJ,gBAAA,YACA,OAAA;IACE,YAAA;IACA,QAAA;IACA,OAAA;IACA,EAAA;IACA,MAAA;IACA,KAAA;IACA,KAAA;EAAA,IAED,OAAA,CAAQ,eAAA;EAoDL,eAAA,CAAgB,MAAA,WAAiB,OAAA,CAAQ,oBAAA;EAWzC,oBAAA,CAAqB,OAAA;IACzB,IAAA,EAAM,qBAAA;IACN,eAAA;IACA,UAAA;IACA,WAAA;IACA,WAAA;IACA,OAAA;IACA,SAAA;IACA,MAAA,GAAS,uBAAA;IACT,kBAAA;IACA,kBAAA;IACA,QAAA;IACA,KAAA;IACA,KAAA;EAAA,IACE,OAAA,CAAQ,yBAAA;EAaN,4BAAA,CAA6B,OAAA;IACjC,MAAA;EAAA,IACE,OAAA,CAAQ,8BAAA;EAaN,oBAAA,CAAA,GAAwB,OAAA,CAAQ,iBAAA;EAWhC,aAAA,CAAc,IAAA;IAClB,eAAA;IACA,YAAA;MACE,IAAA;MACA,IAAA;MACA,QAAA;MACA,QAAA;MACA,YAAA;MACA,WAAA;IAAA;EAAA,IAEA,OAAA;IAAU,OAAA;IAAkB,aAAA;EAAA;EAW1B,eAAA,CAAgB,IAAA;IACpB,WAAA;EAAA,IACE,OAAA;IAAU,OAAA;IAAkB,aAAA;EAAA;EAW1B,cAAA,CAAA,GAAkB,OAAA,CAAQ,kBAAA;EAO1B,yBAAA,CAA0B,IAAA;IAC9B,SAAA;IACA,iBAAA;EAAA,IACE,OAAA;IACA,SAAA;IACA,SAAA;IACA,iBAAA;IACA,mBAAA;IACA,MAAA;EAAA;EAYE,uBAAA,CAAwB,IAAA;IAC5B,SAAA;IACA,SAAA;IACA,iBAAA;EAAA,IACE,OAAA;IAAU,MAAA;EAAA;EAWR,uBAAA,CAAA,GAA2B,OAAA;IAC7B,KAAA,EAAO,KAAA;MACL,SAAA;MACA,SAAA;MACA,iBAAA;MACA,MAAA;MACA,mBAAA;IAAA;EAAA;EASA,wBAAA,CAAyB,IAAA;IAC7B,gBAAA;EAAA,IACE,OAAA;IAAU,MAAA;EAAA;EAWR,yBAAA,CAA0B,IAAA;IAC9B,SAAA;EAAA,IACE,OAAA;IAAU,MAAA;EAAA;EAWR,yBAAA,CACJ,KAAA,UACA,WAAA,WACC,OAAA;EAiBG,eAAA,CAAgB,QAAA,UAAkB,OAAA,QAAe,OAAA;EAcjD,gBAAA,CAAiB,QAAA,WAAmB,OAAA;IAAU,QAAA,EAAU,KAAA;EAAA;EASxD,kBAAA,CAAmB,OAAA;IACvB,OAAA;IACA,cAAA;IACA,UAAA;IACA,iBAAA;IACA,eAAA;IACA,cAAA;EAAA,IACE,OAAA;IAAU,IAAA;IAAc,gBAAA,GAAmB,MAAA;EAAA;EAkBzC,2BAAA,CAA4B,iBAAA,WAA4B,OAAA;IAAU,UAAA;EAAA;EAalE,gBAAA,CAAiB,WAAA,WAAsB,OAAA;IAAU,EAAA;EAAA;EAiBjD,aAAA,CAAc,EAAA,WAAa,OAAA;IAAU,YAAA;IAAsB,UAAA;EAAA;EAS3D,gBAAA,CAAiB,EAAA,UAAY,SAAA,WAAoB,OAAA;EAgBjD,gBAAA,CAAiB,EAAA,WAAa,OAAA;EAU9B,mBAAA,CAAoB,EAAA,UAAY,SAAA,UAAmB,OAAA,0BAAiC,OAAA;IAAU,aAAA;EAAA;EAe9F,SAAA,CAAA,GAAa,OAAA;IAAU,aAAA;EAAA;EASvB,iBAAA,CAAkB,KAAA,yCAA8C,OAAA;IAAU,aAAA;EAAA;EAS1E,iBAAA,CAAkB,KAAA,wCAA6C,cAAA,OAAqB,MAAA,GAAS,qBAAA,GAAwB,OAAA;EAiBrH,oBAAA,CAAqB,KAAA,wCAA6C,sBAAA,QAA8B,OAAA;EAchG,qBAAA,CAAA,GAAyB,OAAA,CAAQ,qBAAA;EAUjC,wBAAA,CAAA,GAA4B,OAAA;EAQ5B,uBAAA,CAAwB,KAAA,4BAAiC,IAAA,aAAiB,OAAA;EAa1E,mBAAA,CAAoB,WAAA,WAAsB,OAAA;IAAU,EAAA;EAAA;EAiBpD,mBAAA,CAAoB,EAAA,WAAa,OAAA;EAUjC,aAAA,CAAA,GAAiB,OAAA;IAAU,GAAA;EAAA;EAe3B,oBAAA,CAAA,GAAwB,OAAA;IAAiB,UAAA;IAAoB,eAAA;IAA0B,iBAAA;IAA4B,eAAA;EAAA;EAanH,uBAAA,CAAA,GAA2B,OAAA;IAAU,QAAA;IAAkB,OAAA,EAAS,KAAA;MAAQ,EAAA;MAAY,IAAA;MAAc,OAAA;MAAkB,SAAA;MAAoB,WAAA;IAAA;EAAA;EAiBxI,0BAAA,CAA2B,QAAA,UAAkB,OAAA,EAAS,MAAA,yBAA+B,OAAA;EAYrF,gCAAA,CAAA,GAAoC,OAAA;IAAU,aAAA;EAAA;EAe9C,gBAAA,CAAiB,MAAA;IAAW,MAAA;IAAiB,KAAA;IAAgB,IAAA,GAAO,eAAA;IAAiB,YAAA;IAA2C,UAAA;EAAA,IAAwB,OAAA;IAAU,YAAA,EAAc,WAAA;IAAe,UAAA;EAAA;EAgB/L,kBAAA,CAAmB,MAAA,GAAS,8BAAA,GAAiC,OAAA,CAAQ,+BAAA;EAmBrE,gBAAA,CAAiB,eAAA,WAA0B,OAAA,CAAQ,6BAAA;EASnD,uBAAA,CAAwB,eAAA,UAAyB,MAAA,GAAS,mCAAA,GAAsC,OAAA,CAAQ,oCAAA;EAYxG,2BAAA,CAA4B,eAAA,UAAyB,OAAA,WAAkB,OAAA,CAAQ,wCAAA;EAS/E,sBAAA,CAAuB,eAAA,UAAyB,OAAA;IAAY,MAAA;IAAiB,KAAA;EAAA,IAAmB,OAAA,CAAQ,sCAAA;EAYxG,iBAAA,CAAkB,OAAA;IACtB,IAAA;IACA,EAAA;IACA,SAAA;IACA,SAAA,EAAW,WAAA;IA50BkD;;;;;;;;IAq1B7D,SAAA;EAAA,IACE,OAAA;IAAU,OAAA;IAAkB,mBAAA;EAAA;EAuB1B,sCAAA,CACJ,UAAA;IAAc,0BAAA;EAAA,GACd,KAAA,YACC,OAAA;IACD,cAAA,EAAgB,KAAA;MACd,EAAA;MACA,YAAA;MACA,aAAA;MACA,iBAAA,EAAmB,gBAAA;IAAA;IAErB,oBAAA;EAAA;EAgBI,cAAA,CAAe,OAAA,EAAS,qBAAA,GAAwB,OAAA,CAAQ,sBAAA;EAmBxD,gBAAA,CAAiB,OAAA;IAAY,MAAA;IAAiB,aAAA;IAAwB,KAAA;IAAgB,MAAA;EAAA,IAAoB,OAAA,CAAQ,eAAA;EAclH,cAAA,CAAe,EAAA,WAAa,OAAA,CAAQ,eAAA;EASpC,iBAAA,CAAkB,EAAA,UAAY,IAAA,EAAM,eAAA,uBAAsC,OAAA,CAAQ,eAAA;AAAA"}
@@ -184,6 +184,20 @@ var HexclaveAdminInterface = class extends __server_interface_js.HexclaveServerI
184
184
  async getUserActivity(userId) {
185
185
  return await (await this.sendAdminRequest(___utils_urls_js.urlString`/internal/user-activity?user_id=${userId}`, { method: "GET" }, null)).json();
186
186
  }
187
+ async getAnalyticsClickmap(options) {
188
+ return await (await this.sendAdminRequest("/internal/analytics/clickmap", {
189
+ method: "POST",
190
+ headers: { "content-type": "application/json" },
191
+ body: JSON.stringify(options)
192
+ }, null)).json();
193
+ }
194
+ async createAnalyticsClickmapToken(options) {
195
+ return await (await this.sendAdminRequest("/internal/analytics/clickmap-token", {
196
+ method: "POST",
197
+ headers: { "content-type": "application/json" },
198
+ body: JSON.stringify(options)
199
+ }, null)).json();
200
+ }
187
201
  async getMetricsUserCounts() {
188
202
  return await (await this.sendAdminRequest("/internal/metrics/user-counts", { method: "GET" }, null)).json();
189
203
  }
@@ -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 { KnownErrors } from \"../known-errors\";\nimport { branchConfigSourceSchema, type RestrictedReason } from \"../schema-fields\";\nimport { AccessToken, InternalSession, RefreshToken } from \"../sessions\";\nimport type { MoneyAmount } from \"../utils/currency-constants\";\nimport type { Json } from \"../utils/json\";\nimport { Result } from \"../utils/results\";\nimport { urlString } from \"../utils/urls\";\nimport type { MetricsResponse, MetricsUserCounts, UserActivityResponse } from \"./admin-metrics\";\nimport type { AnalyticsQueryOptions, AnalyticsQueryResponse } from \"./crud/analytics\";\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 AdminGetSessionReplayResponse,\n AdminGetSessionReplayAllEventsResponse,\n AdminGetSessionReplayChunkEventsResponse,\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 { ServerAuthApplicationOptions, HexclaveServerInterface } from \"./server-interface\";\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 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 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 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 queryAnalytics(options: AnalyticsQueryOptions): Promise<AnalyticsQueryResponse> {\n const response = await this.sendAdminRequest(\n \"/internal/analytics/query\",\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n query: options.query,\n params: options.params ?? {},\n timeout_ms: options.timeout_ms ?? 1000,\n include_all_branches: options.include_all_branches ?? false,\n }),\n },\n null,\n );\n\n return await response.json();\n }\n\n async listOutboxEmails(options?: { status?: string, simple_status?: 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?.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 { KnownErrors } from \"../known-errors\";\nimport { branchConfigSourceSchema, type RestrictedReason } from \"../schema-fields\";\nimport { AccessToken, InternalSession, RefreshToken } from \"../sessions\";\nimport type { MoneyAmount } from \"../utils/currency-constants\";\nimport type { Json } from \"../utils/json\";\nimport { Result } from \"../utils/results\";\nimport { urlString } from \"../utils/urls\";\nimport type { AnalyticsClickmapDevice, AnalyticsClickmapKind, AnalyticsClickmapResponse, AnalyticsClickmapTokenResponse, MetricsResponse, MetricsUserCounts, UserActivityResponse } from \"./admin-metrics\";\nimport type { AnalyticsQueryOptions, AnalyticsQueryResponse } from \"./crud/analytics\";\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 AdminGetSessionReplayResponse,\n AdminGetSessionReplayAllEventsResponse,\n AdminGetSessionReplayChunkEventsResponse,\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 { ServerAuthApplicationOptions, HexclaveServerInterface } from \"./server-interface\";\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 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 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 queryAnalytics(options: AnalyticsQueryOptions): Promise<AnalyticsQueryResponse> {\n const response = await this.sendAdminRequest(\n \"/internal/analytics/query\",\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n query: options.query,\n params: options.params ?? {},\n timeout_ms: options.timeout_ms ?? 1000,\n include_all_branches: options.include_all_branches ?? false,\n }),\n },\n null,\n );\n\n return await response.json();\n }\n\n async listOutboxEmails(options?: { status?: string, simple_status?: 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?.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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"}