@hexclave/shared 1.0.0 → 1.0.2

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 (161) hide show
  1. package/dist/ai/llms/llms.d.ts +17 -0
  2. package/dist/ai/llms/llms.d.ts.map +1 -0
  3. package/dist/ai/llms/llms.js +36 -0
  4. package/dist/ai/llms/llms.js.map +1 -0
  5. package/dist/ai/unified-prompts/reminders.js +2 -2
  6. package/dist/ai/unified-prompts/reminders.js.map +1 -1
  7. package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts.map +1 -1
  8. package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js +3 -1
  9. package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js.map +1 -1
  10. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-index.d.ts +7 -1
  11. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-index.d.ts.map +1 -1
  12. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-index.js +6 -5
  13. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-index.js.map +1 -1
  14. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.d.ts +172 -0
  15. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.d.ts.map +1 -0
  16. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js +280 -0
  17. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js.map +1 -0
  18. package/dist/ai/unified-prompts/skill-site-prompt.d.ts +2 -1
  19. package/dist/ai/unified-prompts/skill-site-prompt.d.ts.map +1 -1
  20. package/dist/ai/unified-prompts/skill-site-prompt.js +36 -32
  21. package/dist/ai/unified-prompts/skill-site-prompt.js.map +1 -1
  22. package/dist/config/schema-fuzzer.test.js +1 -0
  23. package/dist/config/schema-fuzzer.test.js.map +1 -1
  24. package/dist/config/schema.d.ts +201 -197
  25. package/dist/config/schema.d.ts.map +1 -1
  26. package/dist/config/schema.js +6 -0
  27. package/dist/config/schema.js.map +1 -1
  28. package/dist/config-authoring.d.ts +5 -1
  29. package/dist/config-authoring.d.ts.map +1 -1
  30. package/dist/config-authoring.js +5 -0
  31. package/dist/config-authoring.js.map +1 -1
  32. package/dist/config-rendering.d.ts +6 -6
  33. package/dist/config-rendering.d.ts.map +1 -1
  34. package/dist/config-rendering.js +25 -17
  35. package/dist/config-rendering.js.map +1 -1
  36. package/dist/esm/ai/llms/llms.d.ts +17 -0
  37. package/dist/esm/ai/llms/llms.d.ts.map +1 -0
  38. package/dist/esm/ai/llms/llms.js +30 -0
  39. package/dist/esm/ai/llms/llms.js.map +1 -0
  40. package/dist/esm/ai/unified-prompts/reminders.js +2 -2
  41. package/dist/esm/ai/unified-prompts/reminders.js.map +1 -1
  42. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts.map +1 -1
  43. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js +3 -1
  44. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js.map +1 -1
  45. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-index.d.ts +7 -1
  46. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-index.d.ts.map +1 -1
  47. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-index.js +4 -4
  48. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-index.js.map +1 -1
  49. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.d.ts +173 -0
  50. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.d.ts.map +1 -0
  51. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js +279 -0
  52. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js.map +1 -0
  53. package/dist/esm/ai/unified-prompts/skill-site-prompt.d.ts +2 -1
  54. package/dist/esm/ai/unified-prompts/skill-site-prompt.d.ts.map +1 -1
  55. package/dist/esm/ai/unified-prompts/skill-site-prompt.js +36 -33
  56. package/dist/esm/ai/unified-prompts/skill-site-prompt.js.map +1 -1
  57. package/dist/esm/config/schema-fuzzer.test.js +1 -0
  58. package/dist/esm/config/schema-fuzzer.test.js.map +1 -1
  59. package/dist/esm/config/schema.d.ts +201 -197
  60. package/dist/esm/config/schema.d.ts.map +1 -1
  61. package/dist/esm/config/schema.js +6 -0
  62. package/dist/esm/config/schema.js.map +1 -1
  63. package/dist/esm/config-authoring.d.ts +5 -1
  64. package/dist/esm/config-authoring.d.ts.map +1 -1
  65. package/dist/esm/config-authoring.js +5 -1
  66. package/dist/esm/config-authoring.js.map +1 -1
  67. package/dist/esm/config-rendering.d.ts +6 -6
  68. package/dist/esm/config-rendering.d.ts.map +1 -1
  69. package/dist/esm/config-rendering.js +25 -17
  70. package/dist/esm/config-rendering.js.map +1 -1
  71. package/dist/esm/hooks/use-hover.d.ts +1 -1
  72. package/dist/esm/hooks/use-hover.d.ts.map +1 -1
  73. package/dist/esm/hooks/use-hover.js.map +1 -1
  74. package/dist/esm/interface/admin-interface.js +1 -1
  75. package/dist/esm/interface/admin-metrics.d.ts +8 -8
  76. package/dist/esm/interface/client-interface.js +1 -1
  77. package/dist/esm/interface/conversations.d.ts +32 -32
  78. package/dist/esm/interface/crud/current-user.d.ts +8 -8
  79. package/dist/esm/interface/crud/email-outbox.d.ts +218 -218
  80. package/dist/esm/interface/crud/products.d.ts +20 -20
  81. package/dist/esm/interface/crud/products.d.ts.map +1 -1
  82. package/dist/esm/interface/crud/project-api-keys.d.ts +3 -3
  83. package/dist/esm/interface/crud/projects.d.ts +36 -36
  84. package/dist/esm/interface/crud/team-member-profiles.d.ts +16 -16
  85. package/dist/esm/interface/crud/transactions.d.ts +23 -23
  86. package/dist/esm/interface/crud/transactions.d.ts.map +1 -1
  87. package/dist/esm/interface/crud/users.d.ts +14 -14
  88. package/dist/esm/interface/server-interface.js +1 -1
  89. package/dist/esm/interface/webhooks.d.ts +4 -4
  90. package/dist/esm/known-errors.d.ts +7 -7
  91. package/dist/esm/schema-fields.d.ts +7 -6
  92. package/dist/esm/schema-fields.d.ts.map +1 -1
  93. package/dist/esm/schema-fields.js +5 -1
  94. package/dist/esm/schema-fields.js.map +1 -1
  95. package/dist/esm/stack-config-file.js.map +1 -1
  96. package/dist/esm/utils/cloud-hosts.d.ts +42 -0
  97. package/dist/esm/utils/cloud-hosts.d.ts.map +1 -0
  98. package/dist/esm/utils/cloud-hosts.js +92 -0
  99. package/dist/esm/utils/cloud-hosts.js.map +1 -0
  100. package/dist/esm/utils/errors.d.ts +9 -2
  101. package/dist/esm/utils/errors.d.ts.map +1 -1
  102. package/dist/esm/utils/errors.js +16 -5
  103. package/dist/esm/utils/errors.js.map +1 -1
  104. package/dist/esm/utils/promises.js +1 -1
  105. package/dist/esm/utils/react.d.ts.map +1 -1
  106. package/dist/esm/utils/react.js +4 -4
  107. package/dist/esm/utils/react.js.map +1 -1
  108. package/dist/esm/utils/redirect-urls.d.ts.map +1 -1
  109. package/dist/esm/utils/redirect-urls.js +3 -3
  110. package/dist/esm/utils/redirect-urls.js.map +1 -1
  111. package/dist/esm/utils/urls.d.ts.map +1 -1
  112. package/dist/esm/utils/urls.js +2 -2
  113. package/dist/esm/utils/urls.js.map +1 -1
  114. package/dist/hooks/use-hover.d.ts +1 -1
  115. package/dist/hooks/use-hover.d.ts.map +1 -1
  116. package/dist/hooks/use-hover.js.map +1 -1
  117. package/dist/{index-D9ysacya.d.ts → index-fQbeILq7.d.ts} +1 -1
  118. package/dist/{index-D9ysacya.d.ts.map → index-fQbeILq7.d.ts.map} +1 -1
  119. package/dist/interface/admin-interface.js +1 -1
  120. package/dist/interface/admin-metrics.d.ts +8 -8
  121. package/dist/interface/client-interface.d.ts +1 -1
  122. package/dist/interface/client-interface.js +1 -1
  123. package/dist/interface/conversations.d.ts +32 -32
  124. package/dist/interface/crud/current-user.d.ts +8 -8
  125. package/dist/interface/crud/email-outbox.d.ts +218 -218
  126. package/dist/interface/crud/products.d.ts +20 -20
  127. package/dist/interface/crud/products.d.ts.map +1 -1
  128. package/dist/interface/crud/project-api-keys.d.ts +3 -3
  129. package/dist/interface/crud/projects.d.ts +36 -36
  130. package/dist/interface/crud/team-member-profiles.d.ts +16 -16
  131. package/dist/interface/crud/transactions.d.ts +23 -23
  132. package/dist/interface/crud/transactions.d.ts.map +1 -1
  133. package/dist/interface/crud/users.d.ts +14 -14
  134. package/dist/interface/server-interface.js +1 -1
  135. package/dist/interface/webhooks.d.ts +4 -4
  136. package/dist/known-errors.d.ts +7 -7
  137. package/dist/schema-fields.d.ts +7 -6
  138. package/dist/schema-fields.d.ts.map +1 -1
  139. package/dist/schema-fields.js +5 -0
  140. package/dist/schema-fields.js.map +1 -1
  141. package/dist/stack-config-file.js.map +1 -1
  142. package/dist/utils/cloud-hosts.d.ts +42 -0
  143. package/dist/utils/cloud-hosts.d.ts.map +1 -0
  144. package/dist/utils/cloud-hosts.js +97 -0
  145. package/dist/utils/cloud-hosts.js.map +1 -0
  146. package/dist/utils/errors.d.ts +9 -2
  147. package/dist/utils/errors.d.ts.map +1 -1
  148. package/dist/utils/errors.js +16 -4
  149. package/dist/utils/errors.js.map +1 -1
  150. package/dist/utils/passkey.d.ts +1 -1
  151. package/dist/utils/promises.js +1 -1
  152. package/dist/utils/react.d.ts.map +1 -1
  153. package/dist/utils/react.js +4 -4
  154. package/dist/utils/react.js.map +1 -1
  155. package/dist/utils/redirect-urls.d.ts.map +1 -1
  156. package/dist/utils/redirect-urls.js +3 -3
  157. package/dist/utils/redirect-urls.js.map +1 -1
  158. package/dist/utils/urls.d.ts.map +1 -1
  159. package/dist/utils/urls.js +2 -2
  160. package/dist/utils/urls.js.map +1 -1
  161. package/package.json +1 -1
@@ -2,16 +2,16 @@ import { parseStackConfigFileContent, renderConfigFileContent } from "./stack-co
2
2
 
3
3
  //#region src/config-rendering.d.ts
4
4
  /**
5
- * Given a list of dependency names (from package.json), returns the
6
- * `@stackframe/*` package that should be used for the `StackConfig` import,
7
- * or `undefined` if none of the known packages are installed.
5
+ * Given a list of dependency names (from package.json), returns the SDK
6
+ * package that should be used for the `StackConfig` import, or `undefined`
7
+ * if none of the known packages are installed.
8
8
  */
9
- declare function detectStackframeImportPackage(dependencies: string[]): string | undefined;
9
+ declare function detectConfigImportPackage(dependencies: string[]): string | undefined;
10
10
  /**
11
11
  * Walks up from `dir` to find the nearest `package.json` and returns the
12
- * best `@stackframe/*` package to use for the `StackConfig` type import.
12
+ * best SDK package to use for the `StackConfig` type import.
13
13
  */
14
14
  declare function detectImportPackageFromDir(dir: string): string | undefined;
15
15
  //#endregion
16
- export { detectImportPackageFromDir, detectStackframeImportPackage, parseStackConfigFileContent, renderConfigFileContent };
16
+ export { detectConfigImportPackage, detectImportPackageFromDir, parseStackConfigFileContent, renderConfigFileContent };
17
17
  //# sourceMappingURL=config-rendering.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-rendering.d.ts","names":[],"sources":["../../src/config-rendering.ts"],"mappings":";;;;AAqBA;;;;iBAAgB,6BAAA,CAA8B,YAAA;AAa9C;;;;AAAA,iBAAgB,0BAAA,CAA2B,GAAA"}
1
+ {"version":3,"file":"config-rendering.d.ts","names":[],"sources":["../../src/config-rendering.ts"],"mappings":";;;;AA2BA;;;;iBAAgB,yBAAA,CAA0B,YAAA;AAa1C;;;;AAAA,iBAAgB,0BAAA,CAA2B,GAAA"}
@@ -5,25 +5,31 @@ import { parseStackConfigFileContent, renderConfigFileContent } from "./stack-co
5
5
  //#region src/config-rendering.ts
6
6
  /**
7
7
  * Packages that export the `StackConfig` type, in priority order.
8
- * The first match found in a project's dependencies wins.
8
+ * The first match found in a project's dependencies wins. Hexclave-branded
9
+ * packages come first (canonical); the legacy `@stackframe/*` names remain
10
+ * so projects pinned to the last legacy release still render a config file
11
+ * that compiles against their installed SDK.
9
12
  */
10
- const STACKFRAME_CONFIG_PACKAGES = [
13
+ const CONFIG_IMPORT_PACKAGES = [
11
14
  "@hexclave/next",
12
15
  "@hexclave/react",
13
16
  "@hexclave/js",
17
+ "@stackframe/stack",
18
+ "@stackframe/react",
19
+ "@stackframe/js",
14
20
  "@stackframe/template"
15
21
  ];
16
22
  /**
17
- * Given a list of dependency names (from package.json), returns the
18
- * `@stackframe/*` package that should be used for the `StackConfig` import,
19
- * or `undefined` if none of the known packages are installed.
23
+ * Given a list of dependency names (from package.json), returns the SDK
24
+ * package that should be used for the `StackConfig` import, or `undefined`
25
+ * if none of the known packages are installed.
20
26
  */
21
- function detectStackframeImportPackage(dependencies) {
22
- for (const pkg of STACKFRAME_CONFIG_PACKAGES) if (dependencies.includes(pkg)) return pkg;
27
+ function detectConfigImportPackage(dependencies) {
28
+ for (const pkg of CONFIG_IMPORT_PACKAGES) if (dependencies.includes(pkg)) return pkg;
23
29
  }
24
30
  /**
25
31
  * Walks up from `dir` to find the nearest `package.json` and returns the
26
- * best `@stackframe/*` package to use for the `StackConfig` type import.
32
+ * best SDK package to use for the `StackConfig` type import.
27
33
  */
28
34
  function detectImportPackageFromDir(dir) {
29
35
  let current = dir;
@@ -31,7 +37,7 @@ function detectImportPackageFromDir(dir) {
31
37
  const pkgPath = path.join(current, "package.json");
32
38
  if (existsSync(pkgPath)) try {
33
39
  const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
34
- return detectStackframeImportPackage([...Object.keys(pkg.dependencies ?? {}), ...Object.keys(pkg.devDependencies ?? {})]);
40
+ return detectConfigImportPackage([...Object.keys(pkg.dependencies ?? {}), ...Object.keys(pkg.devDependencies ?? {})]);
35
41
  } catch {
36
42
  return;
37
43
  }
@@ -94,15 +100,17 @@ function detectImportPackageFromDir(dir) {
94
100
  (void 0)?.test("renderConfigFileContent defaults to @hexclave/js", ({ expect }) => {
95
101
  expect(renderConfigFileContent({})).toContain("import type { StackConfig } from \"@hexclave/js\";");
96
102
  });
97
- (void 0)?.test("detectStackframeImportPackage picks first matching package by priority", ({ expect }) => {
98
- expect(detectStackframeImportPackage(["@hexclave/next", "@hexclave/js"])).toBe("@hexclave/next");
99
- expect(detectStackframeImportPackage(["@hexclave/react", "@hexclave/js"])).toBe("@hexclave/react");
100
- expect(detectStackframeImportPackage(["@hexclave/js"])).toBe("@hexclave/js");
101
- expect(detectStackframeImportPackage(["@stackframe/template"])).toBe("@stackframe/template");
102
- expect(detectStackframeImportPackage(["lodash", "express"])).toBeUndefined();
103
- expect(detectStackframeImportPackage([])).toBeUndefined();
103
+ (void 0)?.test("detectConfigImportPackage picks first matching package by priority", ({ expect }) => {
104
+ expect(detectConfigImportPackage(["@hexclave/next", "@hexclave/js"])).toBe("@hexclave/next");
105
+ expect(detectConfigImportPackage(["@hexclave/react", "@hexclave/js"])).toBe("@hexclave/react");
106
+ expect(detectConfigImportPackage(["@hexclave/js"])).toBe("@hexclave/js");
107
+ expect(detectConfigImportPackage(["@stackframe/stack", "@hexclave/next"])).toBe("@hexclave/next");
108
+ expect(detectConfigImportPackage(["@stackframe/stack"])).toBe("@stackframe/stack");
109
+ expect(detectConfigImportPackage(["@stackframe/template"])).toBe("@stackframe/template");
110
+ expect(detectConfigImportPackage(["lodash", "express"])).toBeUndefined();
111
+ expect(detectConfigImportPackage([])).toBeUndefined();
104
112
  });
105
113
 
106
114
  //#endregion
107
- export { detectImportPackageFromDir, detectStackframeImportPackage, parseStackConfigFileContent, renderConfigFileContent };
115
+ export { detectConfigImportPackage, detectImportPackageFromDir, parseStackConfigFileContent, renderConfigFileContent };
108
116
  //# sourceMappingURL=config-rendering.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-rendering.js","names":[],"sources":["../../src/config-rendering.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"fs\";\nimport path from \"path\";\nimport { parseStackConfigFileContent, renderConfigFileContent } from \"./stack-config-file\";\nexport { parseStackConfigFileContent, renderConfigFileContent };\n\n/**\n * Packages that export the `StackConfig` type, in priority order.\n * The first match found in a project's dependencies wins.\n */\nconst STACKFRAME_CONFIG_PACKAGES = [\n \"@stackframe/stack\",\n \"@stackframe/react\",\n \"@stackframe/js\",\n \"@stackframe/template\",\n] as const;\n\n/**\n * Given a list of dependency names (from package.json), returns the\n * `@stackframe/*` package that should be used for the `StackConfig` import,\n * or `undefined` if none of the known packages are installed.\n */\nexport function detectStackframeImportPackage(dependencies: string[]): string | undefined {\n for (const pkg of STACKFRAME_CONFIG_PACKAGES) {\n if (dependencies.includes(pkg)) {\n return pkg;\n }\n }\n return undefined;\n}\n\n/**\n * Walks up from `dir` to find the nearest `package.json` and returns the\n * best `@stackframe/*` package to use for the `StackConfig` type import.\n */\nexport function detectImportPackageFromDir(dir: string): string | undefined {\n let current = dir;\n while (true) {\n const pkgPath = path.join(current, \"package.json\");\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n const deps = [\n ...Object.keys(pkg.dependencies ?? {}),\n ...Object.keys(pkg.devDependencies ?? {}),\n ];\n return detectStackframeImportPackage(deps);\n } catch {\n return undefined;\n }\n }\n const parent = path.dirname(current);\n if (parent === current) break;\n current = parent;\n }\n return undefined;\n}\n\nimport.meta.vitest?.test(\"renderConfigFileContent normalizes config exports\", ({ expect }) => {\n expect(renderConfigFileContent({\n \"payments.items.todos.displayName\": \"Todo Slots\",\n \"payments.items.todos.customerType\": \"user\",\n })).toContain(`export const config: StackConfig = {\n \"payments\": {\n \"items\": {\n \"todos\": {\n \"displayName\": \"Todo Slots\",\n \"customerType\": \"user\"\n }\n }\n }\n};`);\n});\n\nimport.meta.vitest?.test(\"parseStackConfigFileContent parses static config exports\", ({ expect }) => {\n expect(parseStackConfigFileContent(`\n import type { StackConfig } from \"@stackframe/js\";\n export const config: StackConfig = {\n auth: { allowSignUp: true },\n payments: { testMode: false },\n };\n `, \"stack.config.ts\")).toMatchInlineSnapshot(`\n {\n \"auth\": {\n \"allowSignUp\": true,\n },\n \"payments\": {\n \"testMode\": false,\n },\n }\n `);\n});\n\nimport.meta.vitest?.test(\"parseStackConfigFileContent parses show-onboarding\", ({ expect }) => {\n expect(parseStackConfigFileContent('export const config = \"show-onboarding\";', \"stack.config.ts\")).toBe(\"show-onboarding\");\n});\n\nimport.meta.vitest?.test(\"parseStackConfigFileContent rejects dynamic config exports\", ({ expect }) => {\n expect(() => parseStackConfigFileContent(\"export const config = makeConfig();\", \"stack.config.ts\")).toThrow(/Unsupported config expression/);\n});\n\nimport.meta.vitest?.test(\"renderConfigFileContent rejects conflicting dotted keys\", ({ expect }) => {\n expect(() => renderConfigFileContent({\n \"a.b\": 1,\n \"a.b.c\": 2,\n })).toThrowError(/conflicting keys.*\"a\\.b\\.c\"/);\n});\n\nimport.meta.vitest?.test(\"renderConfigFileContent rejects invalid config exports\", ({ expect }) => {\n expect(() => renderConfigFileContent(null)).toThrowErrorMatchingInlineSnapshot(\n `[Error: Invalid config: expected a plain object.]`,\n );\n});\n\nimport.meta.vitest?.test(\"renderConfigFileContent uses custom import package\", ({ expect }) => {\n const content = renderConfigFileContent({}, \"@stackframe/stack\");\n expect(content).toContain('import type { StackConfig } from \"@stackframe/stack\";');\n});\n\nimport.meta.vitest?.test(\"renderConfigFileContent defaults to @stackframe/js\", ({ expect }) => {\n const content = renderConfigFileContent({});\n expect(content).toContain('import type { StackConfig } from \"@stackframe/js\";');\n});\n\nimport.meta.vitest?.test(\"detectStackframeImportPackage picks first matching package by priority\", ({ expect }) => {\n expect(detectStackframeImportPackage([\"@stackframe/stack\", \"@stackframe/js\"])).toBe(\"@stackframe/stack\");\n expect(detectStackframeImportPackage([\"@stackframe/react\", \"@stackframe/js\"])).toBe(\"@stackframe/react\");\n expect(detectStackframeImportPackage([\"@stackframe/js\"])).toBe(\"@stackframe/js\");\n expect(detectStackframeImportPackage([\"@stackframe/template\"])).toBe(\"@stackframe/template\");\n expect(detectStackframeImportPackage([\"lodash\", \"express\"])).toBeUndefined();\n expect(detectStackframeImportPackage([])).toBeUndefined();\n});\n"],"mappings":";;;;;;;;;AASA,MAAM,6BAA6B;CACjC;CACA;CACA;CACA;CACD;;;;;;AAOD,SAAgB,8BAA8B,cAA4C;AACxF,MAAK,MAAM,OAAO,2BAChB,KAAI,aAAa,SAAS,IAAI,CAC5B,QAAO;;;;;;AAUb,SAAgB,2BAA2B,KAAiC;CAC1E,IAAI,UAAU;AACd,QAAO,MAAM;EACX,MAAM,UAAU,KAAK,KAAK,SAAS,eAAe;AAClD,MAAI,WAAW,QAAQ,CACrB,KAAI;GACF,MAAM,MAAM,KAAK,MAAM,aAAa,SAAS,QAAQ,CAAC;AAKtD,UAAO,8BAJM,CACX,GAAG,OAAO,KAAK,IAAI,gBAAgB,EAAE,CAAC,EACtC,GAAG,OAAO,KAAK,IAAI,mBAAmB,EAAE,CAAC,CAC1C,CACyC;UACpC;AACN;;EAGJ,MAAM,SAAS,KAAK,QAAQ,QAAQ;AACpC,MAAI,WAAW,QAAS;AACxB,YAAU;;;CAKd,SAAW,KAAC,sDAAwD,EAAA,aAAa;AAC/E,QAAO,wBAAwB;EAC7B,oCAAoC;EACpC,qCAAqC;EACtC,CAAC,CAAC,CAAC,UAAU;;;;;;;;;IASZ;EACF;CAEF,SAAW,KAAC,6DAA+D,EAAA,aAAa;AACtF,QAAO,4BAA4B;;;;;;KAMhC,kBAAkB,CAAC,CAAC,sBAAsB;;;;;;;;;IAS3C;EACF;CAEF,SAAW,KAAC,uDAAsD,EAAA,aAAgB;AAChF,QAAO,4BAA4B,8CAA4C,kBAAkB,CAAC,CAAC,KAAK,kBAAkB;EAC1H;CAEF,SAAW,KAAC,+DAAiE,EAAA,aAAa;AACxF,cAAa,4BAA4B,uCAAuC,kBAAkB,CAAC,CAAC,QAAQ,gCAAgC;EAC5I;CAEF,SAAW,KAAC,4DAAgE,EAAC,aAAU;AACrF,cAAa,wBAAwB;EACnC,OAAO;EACP,SAAS;EACV,CAAC,CAAC,CAAC,aAAa,8BAA8B;EAC/C;CAEF,SAAW,KAAC,2DAA6D,EAAA,aAAa;AACpF,cAAa,wBAAwB,KAAK,CAAC,CAAC,mCAC1C,oDACD;EACD;CAEF,SAAW,KAAC,uDAAyD,EAAA,aAAa;AAEhF,QADgB,wBAAwB,EAAE,EAAE,oBAAoB,CACjD,CAAC,UAAU,0DAAwD;EAClF;CAEF,SAAW,KAAC,uDAAmD,EAAU,aAAS;AAEhF,QADgB,wBAAwB,EAAE,CAAC,CAC5B,CAAC,UAAU,uDAAqD;EAC/E;CAEF,SAAW,KAAC,2EAA4E,EAAA,aAAc;AACpG,QAAO,8BAA8B,CAAC,qBAAqB,iBAAiB,CAAC,CAAC,CAAC,KAAK,oBAAoB;AACxG,QAAO,8BAA8B,CAAC,qBAAqB,iBAAiB,CAAC,CAAC,CAAC,KAAK,oBAAoB;AACxG,QAAO,8BAA8B,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK,iBAAiB;AAChF,QAAO,8BAA8B,CAAC,uBAAuB,CAAC,CAAC,CAAC,KAAK,uBAAuB;AAC5F,QAAO,8BAA8B,CAAC,UAAU,UAAU,CAAC,CAAC,CAAC,eAAe;AAC5E,QAAO,8BAA8B,EAAE,CAAC,CAAC,CAAC,eAAe;EACzD"}
1
+ {"version":3,"file":"config-rendering.js","names":[],"sources":["../../src/config-rendering.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"fs\";\nimport path from \"path\";\nimport { parseStackConfigFileContent, renderConfigFileContent } from \"./stack-config-file\";\nexport { parseStackConfigFileContent, renderConfigFileContent };\n\n/**\n * Packages that export the `StackConfig` type, in priority order.\n * The first match found in a project's dependencies wins. Hexclave-branded\n * packages come first (canonical); the legacy `@stackframe/*` names remain\n * so projects pinned to the last legacy release still render a config file\n * that compiles against their installed SDK.\n */\nconst CONFIG_IMPORT_PACKAGES = [\n \"@hexclave/next\",\n \"@hexclave/react\",\n \"@hexclave/js\",\n \"@stackframe/stack\",\n \"@stackframe/react\",\n \"@stackframe/js\",\n \"@stackframe/template\",\n] as const;\n\n/**\n * Given a list of dependency names (from package.json), returns the SDK\n * package that should be used for the `StackConfig` import, or `undefined`\n * if none of the known packages are installed.\n */\nexport function detectConfigImportPackage(dependencies: string[]): string | undefined {\n for (const pkg of CONFIG_IMPORT_PACKAGES) {\n if (dependencies.includes(pkg)) {\n return pkg;\n }\n }\n return undefined;\n}\n\n/**\n * Walks up from `dir` to find the nearest `package.json` and returns the\n * best SDK package to use for the `StackConfig` type import.\n */\nexport function detectImportPackageFromDir(dir: string): string | undefined {\n let current = dir;\n while (true) {\n const pkgPath = path.join(current, \"package.json\");\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n const deps = [\n ...Object.keys(pkg.dependencies ?? {}),\n ...Object.keys(pkg.devDependencies ?? {}),\n ];\n return detectConfigImportPackage(deps);\n } catch {\n return undefined;\n }\n }\n const parent = path.dirname(current);\n if (parent === current) break;\n current = parent;\n }\n return undefined;\n}\n\nimport.meta.vitest?.test(\"renderConfigFileContent normalizes config exports\", ({ expect }) => {\n expect(renderConfigFileContent({\n \"payments.items.todos.displayName\": \"Todo Slots\",\n \"payments.items.todos.customerType\": \"user\",\n })).toContain(`export const config: StackConfig = {\n \"payments\": {\n \"items\": {\n \"todos\": {\n \"displayName\": \"Todo Slots\",\n \"customerType\": \"user\"\n }\n }\n }\n};`);\n});\n\nimport.meta.vitest?.test(\"parseStackConfigFileContent parses static config exports\", ({ expect }) => {\n expect(parseStackConfigFileContent(`\n import type { StackConfig } from \"@hexclave/js\";\n export const config: StackConfig = {\n auth: { allowSignUp: true },\n payments: { testMode: false },\n };\n `, \"stack.config.ts\")).toMatchInlineSnapshot(`\n {\n \"auth\": {\n \"allowSignUp\": true,\n },\n \"payments\": {\n \"testMode\": false,\n },\n }\n `);\n});\n\nimport.meta.vitest?.test(\"parseStackConfigFileContent parses show-onboarding\", ({ expect }) => {\n expect(parseStackConfigFileContent('export const config = \"show-onboarding\";', \"stack.config.ts\")).toBe(\"show-onboarding\");\n});\n\nimport.meta.vitest?.test(\"parseStackConfigFileContent rejects dynamic config exports\", ({ expect }) => {\n expect(() => parseStackConfigFileContent(\"export const config = makeConfig();\", \"stack.config.ts\")).toThrow(/Unsupported config expression/);\n});\n\nimport.meta.vitest?.test(\"renderConfigFileContent rejects conflicting dotted keys\", ({ expect }) => {\n expect(() => renderConfigFileContent({\n \"a.b\": 1,\n \"a.b.c\": 2,\n })).toThrowError(/conflicting keys.*\"a\\.b\\.c\"/);\n});\n\nimport.meta.vitest?.test(\"renderConfigFileContent rejects invalid config exports\", ({ expect }) => {\n expect(() => renderConfigFileContent(null)).toThrowErrorMatchingInlineSnapshot(\n `[Error: Invalid config: expected a plain object.]`,\n );\n});\n\nimport.meta.vitest?.test(\"renderConfigFileContent uses custom import package\", ({ expect }) => {\n const content = renderConfigFileContent({}, \"@hexclave/next\");\n expect(content).toContain('import type { StackConfig } from \"@hexclave/next\";');\n});\n\nimport.meta.vitest?.test(\"renderConfigFileContent defaults to @hexclave/js\", ({ expect }) => {\n const content = renderConfigFileContent({});\n expect(content).toContain('import type { StackConfig } from \"@hexclave/js\";');\n});\n\nimport.meta.vitest?.test(\"detectConfigImportPackage picks first matching package by priority\", ({ expect }) => {\n expect(detectConfigImportPackage([\"@hexclave/next\", \"@hexclave/js\"])).toBe(\"@hexclave/next\");\n expect(detectConfigImportPackage([\"@hexclave/react\", \"@hexclave/js\"])).toBe(\"@hexclave/react\");\n expect(detectConfigImportPackage([\"@hexclave/js\"])).toBe(\"@hexclave/js\");\n // Hexclave names take priority over legacy stackframe names when both appear.\n expect(detectConfigImportPackage([\"@stackframe/stack\", \"@hexclave/next\"])).toBe(\"@hexclave/next\");\n // Legacy fallback still works for projects pinned to the last @stackframe/* release.\n expect(detectConfigImportPackage([\"@stackframe/stack\"])).toBe(\"@stackframe/stack\");\n expect(detectConfigImportPackage([\"@stackframe/template\"])).toBe(\"@stackframe/template\");\n expect(detectConfigImportPackage([\"lodash\", \"express\"])).toBeUndefined();\n expect(detectConfigImportPackage([])).toBeUndefined();\n});\n"],"mappings":";;;;;;;;;;;;AAYA,MAAM,yBAAyB;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;;;AAOD,SAAgB,0BAA0B,cAA4C;AACpF,MAAK,MAAM,OAAO,uBAChB,KAAI,aAAa,SAAS,IAAI,CAC5B,QAAO;;;;;;AAUb,SAAgB,2BAA2B,KAAiC;CAC1E,IAAI,UAAU;AACd,QAAO,MAAM;EACX,MAAM,UAAU,KAAK,KAAK,SAAS,eAAe;AAClD,MAAI,WAAW,QAAQ,CACrB,KAAI;GACF,MAAM,MAAM,KAAK,MAAM,aAAa,SAAS,QAAQ,CAAC;AAKtD,UAAO,0BAJM,CACX,GAAG,OAAO,KAAK,IAAI,gBAAgB,EAAE,CAAC,EACtC,GAAG,OAAO,KAAK,IAAI,mBAAmB,EAAE,CAAC,CAC1C,CACqC;UAChC;AACN;;EAGJ,MAAM,SAAS,KAAK,QAAQ,QAAQ;AACpC,MAAI,WAAW,QAAS;AACxB,YAAU;;;CAKd,SAAW,KAAC,sDAAwD,EAAA,aAAa;AAC/E,QAAO,wBAAwB;EAC7B,oCAAoC;EACpC,qCAAqC;EACtC,CAAC,CAAC,CAAC,UAAU;;;;;;;;;IASZ;EACF;CAEF,SAAW,KAAC,6DAA+D,EAAA,aAAa;AACtF,QAAO,4BAA4B;;;;;;KAMhC,kBAAkB,CAAC,CAAC,sBAAsB;;;;;;;;;IAS3C;EACF;CAEF,SAAW,KAAC,uDAAsD,EAAA,aAAgB;AAChF,QAAO,4BAA4B,8CAA4C,kBAAkB,CAAC,CAAC,KAAK,kBAAkB;EAC1H;CAEF,SAAW,KAAC,+DAAiE,EAAA,aAAa;AACxF,cAAa,4BAA4B,uCAAuC,kBAAkB,CAAC,CAAC,QAAQ,gCAAgC;EAC5I;CAEF,SAAW,KAAC,4DAAgE,EAAC,aAAU;AACrF,cAAa,wBAAwB;EACnC,OAAO;EACP,SAAS;EACV,CAAC,CAAC,CAAC,aAAa,8BAA8B;EAC/C;CAEF,SAAW,KAAC,2DAA6D,EAAA,aAAa;AACpF,cAAa,wBAAwB,KAAK,CAAC,CAAC,mCAC1C,oDACD;EACD;CAEF,SAAW,KAAC,uDAAyD,EAAA,aAAa;AAEhF,QADgB,wBAAwB,EAAE,EAAE,iBAAiB,CAC9C,CAAC,UAAU,uDAAqD;EAC/E;CAEF,SAAW,KAAC,qDAAmD,EAAQ,aAAS;AAE9E,QADgB,wBAAwB,EAAE,CAAC,CAC5B,CAAC,UAAU,qDAAmD;EAC7E;CAEF,SAAW,KAAC,uEAAwE,EAAA,aAAc;AAChG,QAAO,0BAA0B,CAAC,kBAAkB,eAAe,CAAC,CAAC,CAAC,KAAK,iBAAiB;AAC5F,QAAO,0BAA0B,CAAC,mBAAmB,eAAe,CAAC,CAAC,CAAC,KAAK,kBAAkB;AAC9F,QAAO,0BAA0B,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,eAAe;AAExE,QAAO,0BAA0B,CAAC,qBAAqB,iBAAiB,CAAC,CAAC,CAAC,KAAK,iBAAiB;AAEjG,QAAO,0BAA0B,CAAC,oBAAoB,CAAC,CAAC,CAAC,KAAK,oBAAoB;AAClF,QAAO,0BAA0B,CAAC,uBAAuB,CAAC,CAAC,CAAC,KAAK,uBAAuB;AACxF,QAAO,0BAA0B,CAAC,UAAU,UAAU,CAAC,CAAC,CAAC,eAAe;AACxE,QAAO,0BAA0B,EAAE,CAAC,CAAC,CAAC,eAAe;EACrD"}
@@ -1,5 +1,5 @@
1
1
  //#region src/hooks/use-hover.d.ts
2
- declare function useHover<T extends HTMLElement>(ref: React.RefObject<T>, options?: {
2
+ declare function useHover<T extends HTMLElement | null>(ref: React.RefObject<T>, options?: {
3
3
  onMouseEnter?: () => void;
4
4
  onMouseLeave?: () => void;
5
5
  }): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"use-hover.d.ts","names":[],"sources":["../../../src/hooks/use-hover.tsx"],"mappings":";iBAGgB,QAAA,WAAmB,WAAA,CAAA,CACjC,GAAA,EAAK,KAAA,CAAM,SAAA,CAAU,CAAA,GACrB,OAAA;EACE,YAAA;EACA,YAAA;AAAA"}
1
+ {"version":3,"file":"use-hover.d.ts","names":[],"sources":["../../../src/hooks/use-hover.tsx"],"mappings":";iBAGgB,QAAA,WAAmB,WAAA,QAAA,CACjC,GAAA,EAAK,KAAA,CAAM,SAAA,CAAU,CAAA,GACrB,OAAA;EACE,YAAA;EACA,YAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-hover.js","names":[],"sources":["../../../src/hooks/use-hover.tsx"],"sourcesContent":["import { useLayoutEffect } from \"react\";\nimport { useRefState } from \"../utils/react\";\n\nexport function useHover<T extends HTMLElement>(\n ref: React.RefObject<T>,\n options: {\n onMouseEnter?: () => void,\n onMouseLeave?: () => void,\n } = {},\n): boolean {\n // Internal counter: mouseenter++ / mouseleave-- (isHovering = counter > 0)\n const counter = useRefState(0);\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n let incr = 0;\n let prevInside = false;\n\n const contains = (r: DOMRect, x: number, y: number) =>\n x >= r.left && x <= r.right && y >= r.top && y <= r.bottom;\n\n const enter = () => {\n incr++;\n counter.set(c => c + 1);\n if (counter.current === 1) {\n options.onMouseEnter?.();\n }\n };\n\n const leave = () => {\n incr--;\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n counter.set(c => c - 1);\n if (counter.current === 0) {\n options.onMouseLeave?.();\n }\n });\n });\n };\n\n const topMatchesTarget = (x: number, y: number) => {\n const top = document.elementFromPoint(x, y);\n return !!(top && (top === el || el.contains(top)));\n };\n\n const processPoint = (x: number, y: number) => {\n const rect = el.getBoundingClientRect();\n\n // True “hoverability”: inside rect AND not occluded by others\n const inside = contains(rect, x, y) && topMatchesTarget(x, y);\n if (inside && !prevInside) {\n enter();\n } else if (!inside && prevInside) {\n leave();\n }\n prevInside = inside;\n };\n\n const onMove = (e: PointerEvent) => {\n if (e.pointerType !== \"mouse\") return; // keep it hover-only\n // Use coalesced points when available\n const batch = e.getCoalescedEvents();\n if (batch.length) {\n for (let eventIndex = 0; eventIndex < batch.length - 1; eventIndex++) {\n const e1 = batch[eventIndex];\n const e2 = batch[eventIndex + 1];\n const steps = 10;\n for (let i = 0; i <= steps; i++) {\n processPoint(e1.clientX + (e2.clientX - e1.clientX) * i / steps, e1.clientY + (e2.clientY - e1.clientY) * i / steps);\n }\n }\n } else {\n processPoint(e.clientX, e.clientY);\n }\n };\n\n window.addEventListener(\"pointermove\", onMove, { passive: true });\n\n return () => {\n window.removeEventListener(\"pointermove\", onMove);\n counter.set(c => c - incr);\n };\n }, []);\n\n return counter.current > 0;\n}\n"],"mappings":";;;;AAGA,SAAgB,SACd,KACA,UAGI,EAAE,EACG;CAET,MAAM,UAAU,YAAY,EAAE;AAE9B,uBAAsB;EACpB,MAAM,KAAK,IAAI;AACf,MAAI,CAAC,GAAI;EACT,IAAI,OAAO;EACX,IAAI,aAAa;EAEjB,MAAM,YAAY,GAAY,GAAW,MACvC,KAAK,EAAE,QAAQ,KAAK,EAAE,SAAS,KAAK,EAAE,OAAO,KAAK,EAAE;EAEtD,MAAM,cAAc;AAClB;AACA,WAAQ,KAAI,MAAK,IAAI,EAAE;AACvB,OAAI,QAAQ,YAAY,EACtB,SAAQ,gBAAgB;;EAI5B,MAAM,cAAc;AAClB;AACA,+BAA4B;AAC1B,gCAA4B;AAC1B,aAAQ,KAAI,MAAK,IAAI,EAAE;AACvB,SAAI,QAAQ,YAAY,EACtB,SAAQ,gBAAgB;MAE1B;KACF;;EAGJ,MAAM,oBAAoB,GAAW,MAAc;GACjD,MAAM,MAAM,SAAS,iBAAiB,GAAG,EAAE;AAC3C,UAAO,CAAC,EAAE,QAAQ,QAAQ,MAAM,GAAG,SAAS,IAAI;;EAGlD,MAAM,gBAAgB,GAAW,MAAc;GAI7C,MAAM,SAAS,SAHF,GAAG,uBAAuB,EAGT,GAAG,EAAE,IAAI,iBAAiB,GAAG,EAAE;AAC7D,OAAI,UAAU,CAAC,WACb,QAAO;YACE,CAAC,UAAU,WACpB,QAAO;AAET,gBAAa;;EAGf,MAAM,UAAU,MAAoB;AAClC,OAAI,EAAE,gBAAgB,QAAS;GAE/B,MAAM,QAAQ,EAAE,oBAAoB;AACpC,OAAI,MAAM,OACR,MAAK,IAAI,aAAa,GAAG,aAAa,MAAM,SAAS,GAAG,cAAc;IACpE,MAAM,KAAK,MAAM;IACjB,MAAM,KAAK,MAAM,aAAa;IAC9B,MAAM,QAAQ;AACd,SAAK,IAAI,IAAI,GAAG,KAAK,OAAO,IAC1B,cAAa,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,IAAI,OAAO,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,IAAI,MAAM;;OAIxH,cAAa,EAAE,SAAS,EAAE,QAAQ;;AAItC,SAAO,iBAAiB,eAAe,QAAQ,EAAE,SAAS,MAAM,CAAC;AAEjE,eAAa;AACX,UAAO,oBAAoB,eAAe,OAAO;AACjD,WAAQ,KAAI,MAAK,IAAI,KAAK;;IAE3B,EAAE,CAAC;AAEN,QAAO,QAAQ,UAAU"}
1
+ {"version":3,"file":"use-hover.js","names":[],"sources":["../../../src/hooks/use-hover.tsx"],"sourcesContent":["import { useLayoutEffect } from \"react\";\nimport { useRefState } from \"../utils/react\";\n\nexport function useHover<T extends HTMLElement | null>(\n ref: React.RefObject<T>,\n options: {\n onMouseEnter?: () => void,\n onMouseLeave?: () => void,\n } = {},\n): boolean {\n // Internal counter: mouseenter++ / mouseleave-- (isHovering = counter > 0)\n const counter = useRefState(0);\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n let incr = 0;\n let prevInside = false;\n\n const contains = (r: DOMRect, x: number, y: number) =>\n x >= r.left && x <= r.right && y >= r.top && y <= r.bottom;\n\n const enter = () => {\n incr++;\n counter.set(c => c + 1);\n if (counter.current === 1) {\n options.onMouseEnter?.();\n }\n };\n\n const leave = () => {\n incr--;\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n counter.set(c => c - 1);\n if (counter.current === 0) {\n options.onMouseLeave?.();\n }\n });\n });\n };\n\n const topMatchesTarget = (x: number, y: number) => {\n const top = document.elementFromPoint(x, y);\n return !!(top && (top === el || el.contains(top)));\n };\n\n const processPoint = (x: number, y: number) => {\n const rect = el.getBoundingClientRect();\n\n // True “hoverability”: inside rect AND not occluded by others\n const inside = contains(rect, x, y) && topMatchesTarget(x, y);\n if (inside && !prevInside) {\n enter();\n } else if (!inside && prevInside) {\n leave();\n }\n prevInside = inside;\n };\n\n const onMove = (e: PointerEvent) => {\n if (e.pointerType !== \"mouse\") return; // keep it hover-only\n // Use coalesced points when available\n const batch = e.getCoalescedEvents();\n if (batch.length) {\n for (let eventIndex = 0; eventIndex < batch.length - 1; eventIndex++) {\n const e1 = batch[eventIndex];\n const e2 = batch[eventIndex + 1];\n const steps = 10;\n for (let i = 0; i <= steps; i++) {\n processPoint(e1.clientX + (e2.clientX - e1.clientX) * i / steps, e1.clientY + (e2.clientY - e1.clientY) * i / steps);\n }\n }\n } else {\n processPoint(e.clientX, e.clientY);\n }\n };\n\n window.addEventListener(\"pointermove\", onMove, { passive: true });\n\n return () => {\n window.removeEventListener(\"pointermove\", onMove);\n counter.set(c => c - incr);\n };\n }, []);\n\n return counter.current > 0;\n}\n"],"mappings":";;;;AAGA,SAAgB,SACd,KACA,UAGI,EAAE,EACG;CAET,MAAM,UAAU,YAAY,EAAE;AAE9B,uBAAsB;EACpB,MAAM,KAAK,IAAI;AACf,MAAI,CAAC,GAAI;EACT,IAAI,OAAO;EACX,IAAI,aAAa;EAEjB,MAAM,YAAY,GAAY,GAAW,MACvC,KAAK,EAAE,QAAQ,KAAK,EAAE,SAAS,KAAK,EAAE,OAAO,KAAK,EAAE;EAEtD,MAAM,cAAc;AAClB;AACA,WAAQ,KAAI,MAAK,IAAI,EAAE;AACvB,OAAI,QAAQ,YAAY,EACtB,SAAQ,gBAAgB;;EAI5B,MAAM,cAAc;AAClB;AACA,+BAA4B;AAC1B,gCAA4B;AAC1B,aAAQ,KAAI,MAAK,IAAI,EAAE;AACvB,SAAI,QAAQ,YAAY,EACtB,SAAQ,gBAAgB;MAE1B;KACF;;EAGJ,MAAM,oBAAoB,GAAW,MAAc;GACjD,MAAM,MAAM,SAAS,iBAAiB,GAAG,EAAE;AAC3C,UAAO,CAAC,EAAE,QAAQ,QAAQ,MAAM,GAAG,SAAS,IAAI;;EAGlD,MAAM,gBAAgB,GAAW,MAAc;GAI7C,MAAM,SAAS,SAHF,GAAG,uBAAuB,EAGT,GAAG,EAAE,IAAI,iBAAiB,GAAG,EAAE;AAC7D,OAAI,UAAU,CAAC,WACb,QAAO;YACE,CAAC,UAAU,WACpB,QAAO;AAET,gBAAa;;EAGf,MAAM,UAAU,MAAoB;AAClC,OAAI,EAAE,gBAAgB,QAAS;GAE/B,MAAM,QAAQ,EAAE,oBAAoB;AACpC,OAAI,MAAM,OACR,MAAK,IAAI,aAAa,GAAG,aAAa,MAAM,SAAS,GAAG,cAAc;IACpE,MAAM,KAAK,MAAM;IACjB,MAAM,KAAK,MAAM,aAAa;IAC9B,MAAM,QAAQ;AACd,SAAK,IAAI,IAAI,GAAG,KAAK,OAAO,IAC1B,cAAa,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,IAAI,OAAO,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,IAAI,MAAM;;OAIxH,cAAa,EAAE,SAAS,EAAE,QAAQ;;AAItC,SAAO,iBAAiB,eAAe,QAAQ,EAAE,SAAS,MAAM,CAAC;AAEjE,eAAa;AACX,UAAO,oBAAoB,eAAe,OAAO;AACjD,WAAQ,KAAI,MAAK,IAAI,KAAK;;IAE3B,EAAE,CAAC;AAEN,QAAO,QAAQ,UAAU"}
@@ -1,6 +1,6 @@
1
1
  import { Result } from "../utils/results.js";
2
- import { KnownErrors } from "../known-errors.js";
3
2
  import { urlString } from "../utils/urls.js";
3
+ import { KnownErrors } from "../known-errors.js";
4
4
  import { HexclaveServerInterface } from "./server-interface.js";
5
5
 
6
6
  //#region src/interface/admin-interface.ts
@@ -150,16 +150,16 @@ declare const MetricsEmailOverviewSchema: yup.ObjectSchema<{
150
150
  activity: number;
151
151
  }[];
152
152
  daily_emails_by_status: {
153
- date: string;
154
153
  ok: number;
155
154
  error: number;
155
+ date: string;
156
156
  in_progress: number;
157
157
  }[];
158
158
  emails_sent: number;
159
159
  recent_emails: {
160
160
  id: string;
161
- subject: string;
162
161
  status: string;
162
+ subject: string;
163
163
  created_at_millis: number;
164
164
  }[];
165
165
  deliverability_status: {
@@ -310,8 +310,8 @@ declare const UserActivityResponseBodySchema: yup.ObjectSchema<{
310
310
  data_points: undefined;
311
311
  }, "">;
312
312
  declare const MetricsActiveUsersByCountrySchema: yup.MixedSchema<Record<string, {
313
- display_name: string | null;
314
313
  id: string;
314
+ display_name: string | null;
315
315
  primary_email: string | null;
316
316
  profile_image_url: string | null;
317
317
  signed_up_at_millis: number;
@@ -330,24 +330,24 @@ declare const MetricsResponseBodySchema: yup.ObjectSchema<{
330
330
  }[];
331
331
  users_by_country: Record<string, number>;
332
332
  active_users_by_country: Record<string, {
333
- display_name: string | null;
334
333
  id: string;
334
+ display_name: string | null;
335
335
  primary_email: string | null;
336
336
  profile_image_url: string | null;
337
337
  signed_up_at_millis: number;
338
338
  last_active_at_millis: number | null;
339
339
  }[]>;
340
340
  recently_registered: {
341
- display_name: string | null;
342
341
  id: string;
342
+ display_name: string | null;
343
343
  primary_email: string | null;
344
344
  profile_image_url: string | null;
345
345
  signed_up_at_millis: number;
346
346
  last_active_at_millis: number | null;
347
347
  }[];
348
348
  recently_active: {
349
- display_name: string | null;
350
349
  id: string;
350
+ display_name: string | null;
351
351
  primary_email: string | null;
352
352
  profile_image_url: string | null;
353
353
  signed_up_at_millis: number;
@@ -422,16 +422,16 @@ declare const MetricsResponseBodySchema: yup.ObjectSchema<{
422
422
  emails_by_status: Record<string, number>;
423
423
  total_emails: number;
424
424
  daily_emails_by_status: {
425
- date: string;
426
425
  ok: number;
427
426
  error: number;
427
+ date: string;
428
428
  in_progress: number;
429
429
  }[];
430
430
  emails_sent: number;
431
431
  recent_emails: {
432
432
  id: string;
433
- subject: string;
434
433
  status: string;
434
+ subject: string;
435
435
  created_at_millis: number;
436
436
  }[];
437
437
  deliverability_status: {
@@ -3,8 +3,8 @@ import { filterUndefined, filterUndefinedOrNull } from "../utils/objects.js";
3
3
  import { deindent } from "../utils/strings.js";
4
4
  import { publishableClientKeyNotNecessarySentinel } from "../utils/oauth.js";
5
5
  import { Result } from "../utils/results.js";
6
- import { KnownError, KnownErrors } from "../known-errors.js";
7
6
  import { urlString } from "../utils/urls.js";
7
+ import { KnownError, KnownErrors } from "../known-errors.js";
8
8
  import { AccessToken, InternalSession } from "../sessions.js";
9
9
  import { generateSecureRandomString } from "../utils/crypto.js";
10
10
  import { globalVar } from "../utils/globals.js";
@@ -139,8 +139,8 @@ declare const conversationMessageSchema: yup$1.ObjectSchema<{
139
139
  createdAt: string;
140
140
  sender: {
141
141
  type: "user" | "agent" | "system";
142
- displayName: string | null;
143
142
  id: string | null;
143
+ displayName: string | null;
144
144
  primaryEmail: string | null;
145
145
  };
146
146
  }, yup$1.AnyObject, {
@@ -173,19 +173,7 @@ declare const conversationListResponseSchema: yup$1.ObjectSchema<{
173
173
  lastOutboundAt?: string | null | undefined;
174
174
  closedAt?: string | null | undefined;
175
175
  recordMetadata?: {} | null | undefined;
176
- conversationId: string;
177
- userId: string | null;
178
- teamId: string | null;
179
- userDisplayName: string | null;
180
- userPrimaryEmail: string | null;
181
- userProfileImageUrl: string | null;
182
- subject: string;
183
- status: "pending" | "open" | "closed";
184
- priority: "low" | "normal" | "high" | "urgent";
185
176
  source: "email" | "manual" | "chat" | "api";
186
- lastMessageType: "message" | "internal-note" | "status-change";
187
- preview: string | null;
188
- lastActivityAt: string;
189
177
  metadata: {
190
178
  assignedToUserId: string | null;
191
179
  assignedToDisplayName: string | null;
@@ -196,6 +184,18 @@ declare const conversationListResponseSchema: yup$1.ObjectSchema<{
196
184
  lastCustomerReplyAt: string | null;
197
185
  lastAgentReplyAt: string | null;
198
186
  };
187
+ status: "pending" | "open" | "closed";
188
+ subject: string;
189
+ conversationId: string;
190
+ userId: string | null;
191
+ teamId: string | null;
192
+ userDisplayName: string | null;
193
+ userPrimaryEmail: string | null;
194
+ userProfileImageUrl: string | null;
195
+ priority: "low" | "normal" | "high" | "urgent";
196
+ lastMessageType: "message" | "internal-note" | "status-change";
197
+ preview: string | null;
198
+ lastActivityAt: string;
199
199
  }[];
200
200
  hasMore: boolean;
201
201
  }, yup$1.AnyObject, {
@@ -211,19 +211,7 @@ declare const conversationDetailResponseSchema: yup$1.ObjectSchema<{
211
211
  lastOutboundAt?: string | null | undefined;
212
212
  closedAt?: string | null | undefined;
213
213
  recordMetadata?: {} | null | undefined;
214
- conversationId: string;
215
- userId: string | null;
216
- teamId: string | null;
217
- userDisplayName: string | null;
218
- userPrimaryEmail: string | null;
219
- userProfileImageUrl: string | null;
220
- subject: string;
221
- status: "pending" | "open" | "closed";
222
- priority: "low" | "normal" | "high" | "urgent";
223
214
  source: "email" | "manual" | "chat" | "api";
224
- lastMessageType: "message" | "internal-note" | "status-change";
225
- preview: string | null;
226
- lastActivityAt: string;
227
215
  metadata: {
228
216
  assignedToUserId: string | null;
229
217
  assignedToDisplayName: string | null;
@@ -234,31 +222,43 @@ declare const conversationDetailResponseSchema: yup$1.ObjectSchema<{
234
222
  lastCustomerReplyAt: string | null;
235
223
  lastAgentReplyAt: string | null;
236
224
  };
225
+ status: "pending" | "open" | "closed";
226
+ subject: string;
227
+ conversationId: string;
228
+ userId: string | null;
229
+ teamId: string | null;
230
+ userDisplayName: string | null;
231
+ userPrimaryEmail: string | null;
232
+ userProfileImageUrl: string | null;
233
+ priority: "low" | "normal" | "high" | "urgent";
234
+ lastMessageType: "message" | "internal-note" | "status-change";
235
+ preview: string | null;
236
+ lastActivityAt: string;
237
237
  };
238
238
  messages: {
239
+ body: string | null;
240
+ source: "email" | "manual" | "chat" | "api";
241
+ metadata: {} | null;
239
242
  id: string;
243
+ status: "pending" | "open" | "closed";
244
+ subject: string;
240
245
  conversationId: string;
241
246
  userId: string | null;
242
247
  teamId: string | null;
243
- subject: string;
244
- status: "pending" | "open" | "closed";
245
248
  priority: "low" | "normal" | "high" | "urgent";
246
- source: "email" | "manual" | "chat" | "api";
247
- metadata: {} | null;
248
249
  createdAt: string;
249
250
  messageType: "message" | "internal-note" | "status-change";
250
- body: string | null;
251
251
  attachments: {}[];
252
252
  sender: {
253
253
  type: "user" | "agent" | "system";
254
- displayName: string | null;
255
254
  id: string | null;
255
+ displayName: string | null;
256
256
  primaryEmail: string | null;
257
257
  };
258
258
  }[];
259
259
  entryPoints: {
260
- id: string;
261
260
  metadata: {} | null;
261
+ id: string;
262
262
  createdAt: string;
263
263
  updatedAt: string;
264
264
  channelType: string;
@@ -12,14 +12,14 @@ declare const currentUserCrud: ______crud0.CrudSchemaFromOptions<{
12
12
  type: "anonymous" | "email_not_verified" | "restricted_by_administrator";
13
13
  } | null;
14
14
  requires_totp_mfa: boolean;
15
- display_name: string | null;
16
- client_metadata: {} | null;
17
- client_read_only_metadata: {} | null;
18
15
  id: string;
16
+ display_name: string | null;
19
17
  primary_email: string | null;
20
- primary_email_verified: boolean;
21
18
  profile_image_url: string | null;
22
19
  signed_up_at_millis: number;
20
+ client_metadata: {} | null;
21
+ client_read_only_metadata: {} | null;
22
+ primary_email_verified: boolean;
23
23
  has_password: boolean;
24
24
  otp_auth_enabled: boolean;
25
25
  passkey_auth_enabled: boolean;
@@ -35,8 +35,8 @@ declare const currentUserCrud: ______crud0.CrudSchemaFromOptions<{
35
35
  selected_team: {
36
36
  client_metadata?: {} | null | undefined;
37
37
  client_read_only_metadata?: {} | null | undefined;
38
- display_name: string;
39
38
  id: string;
39
+ display_name: string;
40
40
  profile_image_url: string | null;
41
41
  } | null;
42
42
  }, yup$1.AnyObject, {
@@ -91,10 +91,10 @@ declare const currentUserCrud: ______crud0.CrudSchemaFromOptions<{
91
91
  client_metadata?: {} | null | undefined;
92
92
  client_read_only_metadata?: {} | null | undefined;
93
93
  server_metadata?: {} | null | undefined;
94
- display_name: string;
95
94
  id: string;
96
- profile_image_url: string | null;
97
95
  created_at_millis: number;
96
+ display_name: string;
97
+ profile_image_url: string | null;
98
98
  } | null;
99
99
  selected_team_id: string | null;
100
100
  profile_image_url: string | null;
@@ -175,9 +175,9 @@ declare const currentUserCrud: ______crud0.CrudSchemaFromOptions<{
175
175
  clientUpdateSchema: yup$1.ObjectSchema<{
176
176
  selected_team_id: string | null | undefined;
177
177
  display_name: string | null | undefined;
178
- client_metadata: {} | null | undefined;
179
178
  primary_email: string | null | undefined;
180
179
  profile_image_url: string | null | undefined;
180
+ client_metadata: {} | null | undefined;
181
181
  otp_auth_enabled: boolean | undefined;
182
182
  passkey_auth_enabled: boolean | undefined;
183
183
  totp_secret_base64: string | null | undefined;