tempest-react-sdk 0.70.0 → 0.71.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/telemetry/app-error-adapter.cjs +2 -0
- package/dist/telemetry/app-error-adapter.cjs.map +1 -0
- package/dist/telemetry/app-error-adapter.js +18 -0
- package/dist/telemetry/app-error-adapter.js.map +1 -0
- package/dist/telemetry/app-error-queue.cjs +2 -0
- package/dist/telemetry/app-error-queue.cjs.map +1 -0
- package/dist/telemetry/app-error-queue.js +42 -0
- package/dist/telemetry/app-error-queue.js.map +1 -0
- package/dist/telemetry/app-error-reporter.cjs +2 -0
- package/dist/telemetry/app-error-reporter.cjs.map +1 -0
- package/dist/telemetry/app-error-reporter.js +64 -0
- package/dist/telemetry/app-error-reporter.js.map +1 -0
- package/dist/telemetry/app-error-schema.cjs +2 -0
- package/dist/telemetry/app-error-schema.cjs.map +1 -0
- package/dist/telemetry/app-error-schema.js +28 -0
- package/dist/telemetry/app-error-schema.js.map +1 -0
- package/dist/telemetry/app-error-transport.cjs +2 -0
- package/dist/telemetry/app-error-transport.cjs.map +1 -0
- package/dist/telemetry/app-error-transport.js +44 -0
- package/dist/telemetry/app-error-transport.js.map +1 -0
- package/dist/telemetry/describe-app-error.cjs +3 -0
- package/dist/telemetry/describe-app-error.cjs.map +1 -0
- package/dist/telemetry/describe-app-error.js +54 -0
- package/dist/telemetry/describe-app-error.js.map +1 -0
- package/dist/tempest-react-sdk.cjs +1 -1
- package/dist/tempest-react-sdk.d.ts +214 -0
- package/dist/tempest-react-sdk.js +13 -10
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -292,7 +292,7 @@ Every module is re-exported from the package root — `import { Button, useDebou
|
|
|
292
292
|
| `theme` | `ThemeProvider`, `useTheme`, `getInitialTheme`, `themeInitScript`, types: `ThemeMode`, `ResolvedTheme` |
|
|
293
293
|
| `i18n` | `createI18n`, `I18nProvider`, `useI18n`, `useTranslate`, types: `Catalog`, `Messages`, `I18n`, `InterpolationValues` |
|
|
294
294
|
| `logger` | `createLogger`, `consoleSink`, types: `Logger`, `LogEntry`, `LogLevel`, `LoggerSink` |
|
|
295
|
-
| `telemetry` | `TelemetryProvider`, `useTelemetry`, `consoleTelemetryAdapter`, `createSentryTelemetryAdapter`, `createPostHogTelemetryAdapter`, types: `TelemetryAdapter`, `TelemetryEvent`, `TelemetryUser`, `CreateSentryTelemetryAdapterOptions`, `SentryLike`, `CreatePostHogTelemetryAdapterOptions`, `PostHogLike`
|
|
295
|
+
| `telemetry` | `TelemetryProvider`, `useTelemetry`, `consoleTelemetryAdapter`, `createSentryTelemetryAdapter`, `createPostHogTelemetryAdapter`, `createAppErrorReporter`, `createAppErrorTelemetryAdapter`, `describeAppError`, types: `TelemetryAdapter`, `TelemetryEvent`, `TelemetryUser`, `CreateSentryTelemetryAdapterOptions`, `SentryLike`, `CreatePostHogTelemetryAdapterOptions`, `PostHogLike`, `AppErrorReporter`, `AppErrorReportSchema`, `AppErrorDeviceSchema` |
|
|
296
296
|
| `perf` | `createInferenceProfiler`, `readDeviceProfile`, `cachedResponseBytes`, `formatDurationMs`, types: `InferenceProfiler`, `InferenceReport`, `InferenceReportOptions`, `DeviceProfile`, `ProfiledModel`, `ProfiledModelSize` — custo de inferência on-device: cronômetro por etapa, perfil do dispositivo (cores/RAM/heap) e tamanho dos modelos em Cache Storage |
|
|
297
297
|
| `feature-flags` | `FeatureFlagsProvider`, `useFeatureFlag`, `useFlagValue`, `createInMemoryFlags`, `createGrowthBookFeatureFlagsAdapter`, `createLaunchDarklyFeatureFlagsAdapter`, types: `FeatureFlagsAdapter`, `FlagValue`, `GrowthBookLike`, `LDClientLike` |
|
|
298
298
|
| `share` | `share`, `isShareSupported`, `shareOrDownloadBlob` (Web Share file → download fallback), types: `SharePayload`, `ShareResult`, `ShareOrDownloadOptions` |
|
|
@@ -330,7 +330,7 @@ Every module is re-exported from the package root — `import { Button, useDebou
|
|
|
330
330
|
| `theme` | `ThemeProvider`, `useTheme`, `getInitialTheme`, `themeInitScript`, types: `ThemeMode`, `ResolvedTheme` |
|
|
331
331
|
| `i18n` | `createI18n`, `I18nProvider`, `useI18n`, `useTranslate`, types: `Catalog`, `Messages`, `I18n`, `InterpolationValues` |
|
|
332
332
|
| `logger` | `createLogger`, `consoleSink`, types: `Logger`, `LogEntry`, `LogLevel`, `LoggerSink` |
|
|
333
|
-
| `telemetry` | `TelemetryProvider`, `useTelemetry`, `consoleTelemetryAdapter`, `createSentryTelemetryAdapter`, `createPostHogTelemetryAdapter`, types: `TelemetryAdapter`, `TelemetryEvent`, `TelemetryUser`, `CreateSentryTelemetryAdapterOptions`, `SentryLike`, `CreatePostHogTelemetryAdapterOptions`, `PostHogLike`
|
|
333
|
+
| `telemetry` | `TelemetryProvider`, `useTelemetry`, `consoleTelemetryAdapter`, `createSentryTelemetryAdapter`, `createPostHogTelemetryAdapter`, `createAppErrorReporter`, `createAppErrorTelemetryAdapter`, `describeAppError`, types: `TelemetryAdapter`, `TelemetryEvent`, `TelemetryUser`, `CreateSentryTelemetryAdapterOptions`, `SentryLike`, `CreatePostHogTelemetryAdapterOptions`, `PostHogLike`, `AppErrorReporter`, `AppErrorReportSchema`, `AppErrorDeviceSchema` |
|
|
334
334
|
| `perf` | `createInferenceProfiler`, `readDeviceProfile`, `cachedResponseBytes`, `formatDurationMs`, types: `InferenceProfiler`, `InferenceReport`, `InferenceReportOptions`, `DeviceProfile`, `ProfiledModel`, `ProfiledModelSize` — custo de inferência on-device: cronômetro por etapa, perfil do dispositivo (cores/RAM/heap) e tamanho dos modelos em Cache Storage |
|
|
335
335
|
| `feature-flags` | `FeatureFlagsProvider`, `useFeatureFlag`, `useFlagValue`, `createInMemoryFlags`, `createGrowthBookFeatureFlagsAdapter`, `createLaunchDarklyFeatureFlagsAdapter`, types: `FeatureFlagsAdapter`, `FlagValue`, `GrowthBookLike`, `LDClientLike` |
|
|
336
336
|
| `share` | `share`, `isShareSupported`, `shareOrDownloadBlob` (Web Share file → download fallback), types: `SharePayload`, `ShareResult`, `ShareOrDownloadOptions` |
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-error-adapter.cjs","names":[],"sources":["../../src/telemetry/app-error-adapter.ts"],"sourcesContent":["import type { AppErrorReporter } from \"./app-error-reporter\";\nimport type { TelemetryAdapter } from \"./types\";\n\n/** Options for {@link createAppErrorTelemetryAdapter}. */\nexport interface CreateAppErrorTelemetryAdapterOptions {\n /** The reporter built by `createAppErrorReporter`. */\n reporter: AppErrorReporter;\n}\n\n/**\n * Build a {@link TelemetryAdapter} that sends exceptions to a Tempest backend's\n * `/api/app-errors`, so `useTelemetry().captureException` and an\n * `ErrorBoundary` wired to it reach the same table.\n *\n * Only exceptions travel. `identify` is a no-op because the backend takes the\n * user from the bearer token, never from the client; `track` is a no-op because\n * the route stores errors, not product events — pair this adapter with an\n * analytics one if you need both.\n *\n * Mapping:\n * - `captureException(err, ctx)` → `reporter.report(err, ctx)`\n * - `flush()` → `reporter.flush()`\n *\n * @example\n * import {\n * createAppErrorReporter,\n * createAppErrorTelemetryAdapter,\n * TelemetryProvider,\n * } from \"tempest-react-sdk\";\n *\n * const reporter = createAppErrorReporter({ endpoint: \"/api/app-errors\" });\n * const adapter = createAppErrorTelemetryAdapter({ reporter });\n *\n * <TelemetryProvider adapter={adapter}><App /></TelemetryProvider>;\n *\n * @param options - The reporter to forward to.\n * @returns The adapter.\n */\nexport function createAppErrorTelemetryAdapter(\n options: CreateAppErrorTelemetryAdapterOptions,\n): TelemetryAdapter {\n const { reporter } = options;\n return {\n identify() {},\n track() {},\n captureException(error, context) {\n reporter.report(error, context);\n },\n async flush() {\n await reporter.flush();\n },\n };\n}\n"],"mappings":"AAsCA,SAAgB,EACZ,EACgB,CAChB,GAAM,CAAE,YAAa,EACrB,MAAO,CACH,UAAW,CAAC,EACZ,OAAQ,CAAC,EACT,iBAAiB,EAAO,EAAS,CAC7B,EAAS,OAAO,EAAO,CAAO,CAClC,EACA,MAAM,OAAQ,CACV,MAAM,EAAS,MAAM,CACzB,CACJ,CACJ"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
//#region src/telemetry/app-error-adapter.ts
|
|
2
|
+
function e(e) {
|
|
3
|
+
let { reporter: t } = e;
|
|
4
|
+
return {
|
|
5
|
+
identify() {},
|
|
6
|
+
track() {},
|
|
7
|
+
captureException(e, n) {
|
|
8
|
+
t.report(e, n);
|
|
9
|
+
},
|
|
10
|
+
async flush() {
|
|
11
|
+
await t.flush();
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
//#endregion
|
|
16
|
+
export { e as createAppErrorTelemetryAdapter };
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=app-error-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-error-adapter.js","names":[],"sources":["../../src/telemetry/app-error-adapter.ts"],"sourcesContent":["import type { AppErrorReporter } from \"./app-error-reporter\";\nimport type { TelemetryAdapter } from \"./types\";\n\n/** Options for {@link createAppErrorTelemetryAdapter}. */\nexport interface CreateAppErrorTelemetryAdapterOptions {\n /** The reporter built by `createAppErrorReporter`. */\n reporter: AppErrorReporter;\n}\n\n/**\n * Build a {@link TelemetryAdapter} that sends exceptions to a Tempest backend's\n * `/api/app-errors`, so `useTelemetry().captureException` and an\n * `ErrorBoundary` wired to it reach the same table.\n *\n * Only exceptions travel. `identify` is a no-op because the backend takes the\n * user from the bearer token, never from the client; `track` is a no-op because\n * the route stores errors, not product events — pair this adapter with an\n * analytics one if you need both.\n *\n * Mapping:\n * - `captureException(err, ctx)` → `reporter.report(err, ctx)`\n * - `flush()` → `reporter.flush()`\n *\n * @example\n * import {\n * createAppErrorReporter,\n * createAppErrorTelemetryAdapter,\n * TelemetryProvider,\n * } from \"tempest-react-sdk\";\n *\n * const reporter = createAppErrorReporter({ endpoint: \"/api/app-errors\" });\n * const adapter = createAppErrorTelemetryAdapter({ reporter });\n *\n * <TelemetryProvider adapter={adapter}><App /></TelemetryProvider>;\n *\n * @param options - The reporter to forward to.\n * @returns The adapter.\n */\nexport function createAppErrorTelemetryAdapter(\n options: CreateAppErrorTelemetryAdapterOptions,\n): TelemetryAdapter {\n const { reporter } = options;\n return {\n identify() {},\n track() {},\n captureException(error, context) {\n reporter.report(error, context);\n },\n async flush() {\n await reporter.flush();\n },\n };\n}\n"],"mappings":";AAsCA,SAAgB,EACZ,GACgB;CAChB,IAAM,EAAE,gBAAa;CACrB,OAAO;EACH,WAAW,CAAC;EACZ,QAAQ,CAAC;EACT,iBAAiB,GAAO,GAAS;GAC7B,EAAS,OAAO,GAAO,CAAO;EAClC;EACA,MAAM,QAAQ;GACV,MAAM,EAAS,MAAM;EACzB;CACJ;AACJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e,t){return e.code===t.code&&e.message===t.message&&e.app_version===t.app_version}function t(e,t){if(!e)return[];try{let n=e.getItem(t),r=n?JSON.parse(n):[];return Array.isArray(r)?r:[]}catch{return[]}}function n(n,r,i){let a=t(n,r),o=()=>{if(n)try{a.length===0?n.removeItem(r):n.setItem(r,JSON.stringify(a))}catch{return}};return{entries:()=>[...a],push(t){let n=a.find(n=>e(n.report,t)),r=0;return n?n.count+=1:(a.push({report:t,count:1}),a.length>i&&(a=a.slice(a.length-i),r=1)),o(),r},remove(t){a=a.filter(n=>!e(n.report,t)),o()},clear(){a=[],o()}}}exports.createAppErrorQueue=n;
|
|
2
|
+
//# sourceMappingURL=app-error-queue.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-error-queue.cjs","names":[],"sources":["../../src/telemetry/app-error-queue.ts"],"sourcesContent":["import type { AppErrorReportSchema } from \"./app-error-schema\";\n\n/**\n * The `localStorage` subset the queue needs, so a test or a non-browser host\n * can hand in its own.\n */\nexport interface AppErrorQueueStorage {\n getItem: (key: string) => string | null;\n setItem: (key: string, value: string) => void;\n removeItem: (key: string) => void;\n}\n\n/** One queued report and how many identical ones were folded into it. */\nexport interface AppErrorQueueEntry {\n report: AppErrorReportSchema;\n /** How many times this exact report was raised while it waited. */\n count: number;\n}\n\n/** The persisted queue the reporter drains. */\nexport interface AppErrorQueue {\n /** Every waiting entry, oldest first. */\n entries: () => AppErrorQueueEntry[];\n /**\n * Add a report, folding it into an identical waiting one.\n *\n * @returns How many entries the size ceiling evicted (0 or 1).\n */\n push: (report: AppErrorReportSchema) => number;\n /**\n * Drop the entry holding `report` — the one just sent, or refused for good.\n *\n * Matched by content, not by position: a report raised while the send was\n * in flight may have evicted the head, and dropping \"the first entry\" would\n * then throw away a report nobody sent.\n */\n remove: (report: AppErrorReportSchema) => void;\n /** Drop everything. */\n clear: () => void;\n}\n\n/**\n * Whether two reports describe the same failure on the same build.\n *\n * @param a - A waiting report.\n * @param b - The incoming report.\n * @returns `true` when `code`, `message` and `app_version` all match.\n */\nfunction sameReport(a: AppErrorReportSchema, b: AppErrorReportSchema): boolean {\n return a.code === b.code && a.message === b.message && a.app_version === b.app_version;\n}\n\n/**\n * Read the queue back, treating anything unreadable as empty.\n *\n * @param storage - Where the queue lives.\n * @param key - Its storage key.\n * @returns The waiting entries.\n */\nfunction load(storage: AppErrorQueueStorage | null, key: string): AppErrorQueueEntry[] {\n if (!storage) return [];\n try {\n const raw = storage.getItem(key);\n const parsed: unknown = raw ? JSON.parse(raw) : [];\n return Array.isArray(parsed) ? (parsed as AppErrorQueueEntry[]) : [];\n } catch {\n return [];\n }\n}\n\n/**\n * Build the persisted queue of error reports waiting to be sent.\n *\n * Two rules bound it, because it fills exactly when the device is offline and\n * something is failing repeatedly:\n *\n * - **Identical reports fold.** A failure in a loop raises the same report a\n * hundred times; it is stored once with a `count`, instead of pushing every\n * other failure out of the queue.\n * - **A ceiling evicts the oldest.** The newest report is the one closest to\n * what the user is looking at.\n *\n * Every write is best-effort: with storage unavailable or full, the queue keeps\n * working in memory for the session.\n *\n * @param storage - Backing store, or `null` to keep the queue in memory only.\n * @param key - Storage key.\n * @param maxEntries - Ceiling on distinct waiting reports.\n * @returns The queue.\n *\n * @tempest-limits empty-catch — `setItem` throws on quota exhaustion and in\n * Safari private mode; the in-memory copy is the fallback, and a reporter has no\n * one to tell.\n */\nexport function createAppErrorQueue(\n storage: AppErrorQueueStorage | null,\n key: string,\n maxEntries: number,\n): AppErrorQueue {\n let memory: AppErrorQueueEntry[] = load(storage, key);\n const save = (): void => {\n if (!storage) return;\n try {\n if (memory.length === 0) storage.removeItem(key);\n else storage.setItem(key, JSON.stringify(memory));\n } catch {\n return;\n }\n };\n return {\n entries: () => [...memory],\n push(report) {\n const existing = memory.find((entry) => sameReport(entry.report, report));\n let evicted = 0;\n if (existing) {\n existing.count += 1;\n } else {\n memory.push({ report, count: 1 });\n if (memory.length > maxEntries) {\n memory = memory.slice(memory.length - maxEntries);\n evicted = 1;\n }\n }\n save();\n return evicted;\n },\n remove(report) {\n memory = memory.filter((entry) => !sameReport(entry.report, report));\n save();\n },\n clear() {\n memory = [];\n save();\n },\n };\n}\n"],"mappings":"AAgDA,SAAS,EAAW,EAAyB,EAAkC,CAC3E,OAAO,EAAE,OAAS,EAAE,MAAQ,EAAE,UAAY,EAAE,SAAW,EAAE,cAAgB,EAAE,WAC/E,CASA,SAAS,EAAK,EAAsC,EAAmC,CACnF,GAAI,CAAC,EAAS,MAAO,CAAC,EACtB,GAAI,CACA,IAAM,EAAM,EAAQ,QAAQ,CAAG,EACzB,EAAkB,EAAM,KAAK,MAAM,CAAG,EAAI,CAAC,EACjD,OAAO,MAAM,QAAQ,CAAM,EAAK,EAAkC,CAAC,CACvE,MAAQ,CACJ,MAAO,CAAC,CACZ,CACJ,CA0BA,SAAgB,EACZ,EACA,EACA,EACa,CACb,IAAI,EAA+B,EAAK,EAAS,CAAG,EAC9C,MAAmB,CAChB,KACL,GAAI,CACI,EAAO,SAAW,EAAG,EAAQ,WAAW,CAAG,EAC1C,EAAQ,QAAQ,EAAK,KAAK,UAAU,CAAM,CAAC,CACpD,MAAQ,CACJ,MACJ,CACJ,EACA,MAAO,CACH,YAAe,CAAC,GAAG,CAAM,EACzB,KAAK,EAAQ,CACT,IAAM,EAAW,EAAO,KAAM,GAAU,EAAW,EAAM,OAAQ,CAAM,CAAC,EACpE,EAAU,EAWd,OAVI,EACA,EAAS,OAAS,GAElB,EAAO,KAAK,CAAE,SAAQ,MAAO,CAAE,CAAC,EAC5B,EAAO,OAAS,IAChB,EAAS,EAAO,MAAM,EAAO,OAAS,CAAU,EAChD,EAAU,IAGlB,EAAK,EACE,CACX,EACA,OAAO,EAAQ,CACX,EAAS,EAAO,OAAQ,GAAU,CAAC,EAAW,EAAM,OAAQ,CAAM,CAAC,EACnE,EAAK,CACT,EACA,OAAQ,CACJ,EAAS,CAAC,EACV,EAAK,CACT,CACJ,CACJ"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
//#region src/telemetry/app-error-queue.ts
|
|
2
|
+
function e(e, t) {
|
|
3
|
+
return e.code === t.code && e.message === t.message && e.app_version === t.app_version;
|
|
4
|
+
}
|
|
5
|
+
function t(e, t) {
|
|
6
|
+
if (!e) return [];
|
|
7
|
+
try {
|
|
8
|
+
let n = e.getItem(t), r = n ? JSON.parse(n) : [];
|
|
9
|
+
return Array.isArray(r) ? r : [];
|
|
10
|
+
} catch {
|
|
11
|
+
return [];
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function n(n, r, i) {
|
|
15
|
+
let a = t(n, r), o = () => {
|
|
16
|
+
if (n) try {
|
|
17
|
+
a.length === 0 ? n.removeItem(r) : n.setItem(r, JSON.stringify(a));
|
|
18
|
+
} catch {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
return {
|
|
23
|
+
entries: () => [...a],
|
|
24
|
+
push(t) {
|
|
25
|
+
let n = a.find((n) => e(n.report, t)), r = 0;
|
|
26
|
+
return n ? n.count += 1 : (a.push({
|
|
27
|
+
report: t,
|
|
28
|
+
count: 1
|
|
29
|
+
}), a.length > i && (a = a.slice(a.length - i), r = 1)), o(), r;
|
|
30
|
+
},
|
|
31
|
+
remove(t) {
|
|
32
|
+
a = a.filter((n) => !e(n.report, t)), o();
|
|
33
|
+
},
|
|
34
|
+
clear() {
|
|
35
|
+
a = [], o();
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//#endregion
|
|
40
|
+
export { n as createAppErrorQueue };
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=app-error-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-error-queue.js","names":[],"sources":["../../src/telemetry/app-error-queue.ts"],"sourcesContent":["import type { AppErrorReportSchema } from \"./app-error-schema\";\n\n/**\n * The `localStorage` subset the queue needs, so a test or a non-browser host\n * can hand in its own.\n */\nexport interface AppErrorQueueStorage {\n getItem: (key: string) => string | null;\n setItem: (key: string, value: string) => void;\n removeItem: (key: string) => void;\n}\n\n/** One queued report and how many identical ones were folded into it. */\nexport interface AppErrorQueueEntry {\n report: AppErrorReportSchema;\n /** How many times this exact report was raised while it waited. */\n count: number;\n}\n\n/** The persisted queue the reporter drains. */\nexport interface AppErrorQueue {\n /** Every waiting entry, oldest first. */\n entries: () => AppErrorQueueEntry[];\n /**\n * Add a report, folding it into an identical waiting one.\n *\n * @returns How many entries the size ceiling evicted (0 or 1).\n */\n push: (report: AppErrorReportSchema) => number;\n /**\n * Drop the entry holding `report` — the one just sent, or refused for good.\n *\n * Matched by content, not by position: a report raised while the send was\n * in flight may have evicted the head, and dropping \"the first entry\" would\n * then throw away a report nobody sent.\n */\n remove: (report: AppErrorReportSchema) => void;\n /** Drop everything. */\n clear: () => void;\n}\n\n/**\n * Whether two reports describe the same failure on the same build.\n *\n * @param a - A waiting report.\n * @param b - The incoming report.\n * @returns `true` when `code`, `message` and `app_version` all match.\n */\nfunction sameReport(a: AppErrorReportSchema, b: AppErrorReportSchema): boolean {\n return a.code === b.code && a.message === b.message && a.app_version === b.app_version;\n}\n\n/**\n * Read the queue back, treating anything unreadable as empty.\n *\n * @param storage - Where the queue lives.\n * @param key - Its storage key.\n * @returns The waiting entries.\n */\nfunction load(storage: AppErrorQueueStorage | null, key: string): AppErrorQueueEntry[] {\n if (!storage) return [];\n try {\n const raw = storage.getItem(key);\n const parsed: unknown = raw ? JSON.parse(raw) : [];\n return Array.isArray(parsed) ? (parsed as AppErrorQueueEntry[]) : [];\n } catch {\n return [];\n }\n}\n\n/**\n * Build the persisted queue of error reports waiting to be sent.\n *\n * Two rules bound it, because it fills exactly when the device is offline and\n * something is failing repeatedly:\n *\n * - **Identical reports fold.** A failure in a loop raises the same report a\n * hundred times; it is stored once with a `count`, instead of pushing every\n * other failure out of the queue.\n * - **A ceiling evicts the oldest.** The newest report is the one closest to\n * what the user is looking at.\n *\n * Every write is best-effort: with storage unavailable or full, the queue keeps\n * working in memory for the session.\n *\n * @param storage - Backing store, or `null` to keep the queue in memory only.\n * @param key - Storage key.\n * @param maxEntries - Ceiling on distinct waiting reports.\n * @returns The queue.\n *\n * @tempest-limits empty-catch — `setItem` throws on quota exhaustion and in\n * Safari private mode; the in-memory copy is the fallback, and a reporter has no\n * one to tell.\n */\nexport function createAppErrorQueue(\n storage: AppErrorQueueStorage | null,\n key: string,\n maxEntries: number,\n): AppErrorQueue {\n let memory: AppErrorQueueEntry[] = load(storage, key);\n const save = (): void => {\n if (!storage) return;\n try {\n if (memory.length === 0) storage.removeItem(key);\n else storage.setItem(key, JSON.stringify(memory));\n } catch {\n return;\n }\n };\n return {\n entries: () => [...memory],\n push(report) {\n const existing = memory.find((entry) => sameReport(entry.report, report));\n let evicted = 0;\n if (existing) {\n existing.count += 1;\n } else {\n memory.push({ report, count: 1 });\n if (memory.length > maxEntries) {\n memory = memory.slice(memory.length - maxEntries);\n evicted = 1;\n }\n }\n save();\n return evicted;\n },\n remove(report) {\n memory = memory.filter((entry) => !sameReport(entry.report, report));\n save();\n },\n clear() {\n memory = [];\n save();\n },\n };\n}\n"],"mappings":";AAgDA,SAAS,EAAW,GAAyB,GAAkC;CAC3E,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE;AAC/E;AASA,SAAS,EAAK,GAAsC,GAAmC;CACnF,IAAI,CAAC,GAAS,OAAO,CAAC;CACtB,IAAI;EACA,IAAM,IAAM,EAAQ,QAAQ,CAAG,GACzB,IAAkB,IAAM,KAAK,MAAM,CAAG,IAAI,CAAC;EACjD,OAAO,MAAM,QAAQ,CAAM,IAAK,IAAkC,CAAC;CACvE,QAAQ;EACJ,OAAO,CAAC;CACZ;AACJ;AA0BA,SAAgB,EACZ,GACA,GACA,GACa;CACb,IAAI,IAA+B,EAAK,GAAS,CAAG,GAC9C,UAAmB;EAChB,OACL,IAAI;GACA,AAAI,EAAO,WAAW,IAAG,EAAQ,WAAW,CAAG,IAC1C,EAAQ,QAAQ,GAAK,KAAK,UAAU,CAAM,CAAC;EACpD,QAAQ;GACJ;EACJ;CACJ;CACA,OAAO;EACH,eAAe,CAAC,GAAG,CAAM;EACzB,KAAK,GAAQ;GACT,IAAM,IAAW,EAAO,MAAM,MAAU,EAAW,EAAM,QAAQ,CAAM,CAAC,GACpE,IAAU;GAWd,OAVI,IACA,EAAS,SAAS,KAElB,EAAO,KAAK;IAAE;IAAQ,OAAO;GAAE,CAAC,GAC5B,EAAO,SAAS,MAChB,IAAS,EAAO,MAAM,EAAO,SAAS,CAAU,GAChD,IAAU,KAGlB,EAAK,GACE;EACX;EACA,OAAO,GAAQ;GAEX,AADA,IAAS,EAAO,QAAQ,MAAU,CAAC,EAAW,EAAM,QAAQ,CAAM,CAAC,GACnE,EAAK;EACT;EACA,QAAQ;GAEJ,AADA,IAAS,CAAC,GACV,EAAK;EACT;CACJ;AACJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("./app-error-queue.cjs"),t=require("./app-error-schema.cjs"),n=require("./app-error-transport.cjs"),r=require("./describe-app-error.cjs");function i(){try{return typeof localStorage>`u`?null:localStorage}catch{return null}}function a(e){try{return e?.()??{}}catch{return{}}}function o(o){let{endpoint:s,getToken:c,device:l,autoFlush:u=!0}=o,d=e.createAppErrorQueue(o.storage===void 0?i():o.storage,o.storageKey??`tempest:app-errors`,o.maxEntries??50),f=null,p=0,m=null,h=async()=>{let e=o.fetch??globalThis.fetch.bind(globalThis),t=await n.resolveToken(c),r={sent:0,dropped:0,pending:0,retryAfterMs:null};for(let i of d.entries()){let a=await n.sendOne(e,s,t,i);if(a.kind===`stop`)break;if(a.kind===`wait`){r.retryAfterMs=a.ms,p=Date.now()+a.ms,m??=setTimeout(()=>{m=null,g()},a.ms);break}d.remove(i.report),r[a.kind===`sent`?`sent`:`dropped`]+=1}return r.pending=d.entries().length,r},g=()=>(f??=h().finally(()=>{f=null}),f),_=()=>u&&Date.now()>=p&&(typeof navigator>`u`||navigator.onLine!==!1),v=()=>{_()&&g()};return u&&typeof window<`u`&&window.addEventListener(`online`,v),{report(e,n){let i=r.describeAppError(e,n);d.push(t.fitAppErrorReport({...a(l),...i})),_()&&g()},flush:g,pending:()=>d.entries(),clear:()=>d.clear(),dispose(){typeof window<`u`&&window.removeEventListener(`online`,v),m&&clearTimeout(m),m=null}}}exports.createAppErrorReporter=o;
|
|
2
|
+
//# sourceMappingURL=app-error-reporter.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-error-reporter.cjs","names":[],"sources":["../../src/telemetry/app-error-reporter.ts"],"sourcesContent":["import { createAppErrorQueue } from \"./app-error-queue\";\nimport type { AppErrorQueueEntry, AppErrorQueueStorage } from \"./app-error-queue\";\nimport { fitAppErrorReport } from \"./app-error-schema\";\nimport type { AppErrorDeviceSchema } from \"./app-error-schema\";\nimport { resolveToken, sendOne } from \"./app-error-transport\";\nimport { describeAppError } from \"./describe-app-error\";\n\n/** Options for {@link createAppErrorReporter}. */\nexport interface CreateAppErrorReporterOptions {\n /** Full URL of the backend route, e.g. `${API_URL}/api/app-errors`. */\n endpoint: string;\n /**\n * Current access token, if any. Optional on purpose: the route is public,\n * and an error raised before login — or with a stale session — still has\n * to get through. A token that throws or resolves empty sends anonymously.\n */\n getToken?: () => string | null | undefined | Promise<string | null | undefined>;\n /**\n * Device facts, read **when the error is reported**, not when it is sent —\n * a report queued offline on `1.4.0` must not go out labelled `1.5.0`.\n */\n device?: () => AppErrorDeviceSchema;\n /** Where the queue persists. Defaults to `localStorage`; `null` keeps it in memory. */\n storage?: AppErrorQueueStorage | null;\n /** Storage key. Default `\"tempest:app-errors\"`. */\n storageKey?: string;\n /** Ceiling on distinct waiting reports; the oldest is evicted. Default `50`. */\n maxEntries?: number;\n /** `fetch` to send with. Defaults to the global one. */\n fetch?: typeof fetch;\n /** Send on every report and when the browser goes `online`. Default `true`. */\n autoFlush?: boolean;\n}\n\n/** What one {@link AppErrorReporter.flush} did. */\nexport interface AppErrorFlushResult {\n /** Reports the backend accepted. */\n sent: number;\n /** Reports the backend refused for good (a 4xx other than 408/429) and were dropped. */\n dropped: number;\n /** Reports still waiting. */\n pending: number;\n /** Milliseconds the backend asked to wait (429 `Retry-After`), or `null`. */\n retryAfterMs: number | null;\n}\n\n/** The reporter {@link createAppErrorReporter} returns. */\nexport interface AppErrorReporter {\n /** Queue an error with optional context, and try to send it. Never throws. */\n report: (error: unknown, context?: Record<string, unknown>) => void;\n /** Drain the queue now. Concurrent calls share one run. */\n flush: () => Promise<AppErrorFlushResult>;\n /** The waiting entries, oldest first. */\n pending: () => AppErrorQueueEntry[];\n /** Drop every waiting report. */\n clear: () => void;\n /** Remove the `online` listener and the retry timer. */\n dispose: () => void;\n}\n\n/**\n * Pick the default store, guarding hosts where touching `localStorage` throws.\n *\n * @returns `localStorage`, or `null` when there is none.\n */\nfunction defaultStorage(): AppErrorQueueStorage | null {\n try {\n return typeof localStorage === \"undefined\" ? null : localStorage;\n } catch {\n return null;\n }\n}\n\n/**\n * Read the device facts, reporting without them when the getter throws.\n *\n * @param device - The caller's getter.\n * @returns The facts, or an empty object.\n */\nfunction readDevice(device: CreateAppErrorReporterOptions[\"device\"]): AppErrorDeviceSchema {\n try {\n return device?.() ?? {};\n } catch {\n return {};\n }\n}\n\n/**\n * Report client errors to a Tempest backend's `POST /api/app-errors`, surviving\n * the offline stretches where field errors actually happen.\n *\n * The client half of `tempest-fastapi-sdk`'s `app_errors` module. An error is\n * described ({@link describeAppError}), stamped with the device facts of that\n * moment, fitted to the backend's column limits and queued in `localStorage`\n * before anything goes over the network — so a report raised with no signal is\n * sent when the browser comes back `online`, not lost.\n *\n * What each answer does to the queue:\n *\n * - **2xx** — removed.\n * - **429** — kept; sending pauses for `Retry-After`, then resumes on its own.\n * - **5xx, 408, network failure** — kept; the next report, `online` event or\n * `flush()` retries.\n * - **any other 4xx** — dropped: the backend will refuse that body forever, and\n * keeping it would block every report queued behind it.\n *\n * @example\n * import { createAppErrorReporter } from \"tempest-react-sdk\";\n *\n * const reporter = createAppErrorReporter({\n * endpoint: `${import.meta.env.VITE_API_URL}/api/app-errors`,\n * getToken: () => sessionStorage.getItem(\"access_token\"),\n * device: () => ({ platform: \"web\", app_version: \"1.4.0\" }),\n * });\n *\n * reporter.report(new Error(\"crop failed\"), { step: \"crop\", size: 0 });\n *\n * @param options - Endpoint, token and device getters, storage and limits.\n * @returns The reporter.\n */\nexport function createAppErrorReporter(options: CreateAppErrorReporterOptions): AppErrorReporter {\n const { endpoint, getToken, device, autoFlush = true } = options;\n const queue = createAppErrorQueue(\n options.storage === undefined ? defaultStorage() : options.storage,\n options.storageKey ?? \"tempest:app-errors\",\n options.maxEntries ?? 50,\n );\n let running: Promise<AppErrorFlushResult> | null = null;\n let pausedUntil = 0;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n const drain = async (): Promise<AppErrorFlushResult> => {\n const send = options.fetch ?? globalThis.fetch.bind(globalThis);\n const token = await resolveToken(getToken);\n const result: AppErrorFlushResult = { sent: 0, dropped: 0, pending: 0, retryAfterMs: null };\n for (const entry of queue.entries()) {\n const outcome = await sendOne(send, endpoint, token, entry);\n if (outcome.kind === \"stop\") break;\n if (outcome.kind === \"wait\") {\n result.retryAfterMs = outcome.ms;\n pausedUntil = Date.now() + outcome.ms;\n timer ??= setTimeout(() => {\n timer = null;\n void flush();\n }, outcome.ms);\n break;\n }\n queue.remove(entry.report);\n result[outcome.kind === \"sent\" ? \"sent\" : \"dropped\"] += 1;\n }\n result.pending = queue.entries().length;\n return result;\n };\n\n const flush = (): Promise<AppErrorFlushResult> => {\n running ??= drain().finally(() => {\n running = null;\n });\n return running;\n };\n\n const shouldSend = (): boolean =>\n autoFlush &&\n Date.now() >= pausedUntil &&\n (typeof navigator === \"undefined\" || navigator.onLine !== false);\n\n const onOnline = (): void => {\n if (shouldSend()) void flush();\n };\n if (autoFlush && typeof window !== \"undefined\") window.addEventListener(\"online\", onOnline);\n\n return {\n report(error, context) {\n const description = describeAppError(error, context);\n queue.push(fitAppErrorReport({ ...readDevice(device), ...description }));\n if (shouldSend()) void flush();\n },\n flush,\n pending: () => queue.entries(),\n clear: () => queue.clear(),\n dispose() {\n if (typeof window !== \"undefined\") window.removeEventListener(\"online\", onOnline);\n if (timer) clearTimeout(timer);\n timer = null;\n },\n };\n}\n"],"mappings":"0JAiEA,SAAS,GAA8C,CACnD,GAAI,CACA,OAAO,OAAO,aAAiB,IAAc,KAAO,YACxD,MAAQ,CACJ,OAAO,IACX,CACJ,CAQA,SAAS,EAAW,EAAuE,CACvF,GAAI,CACA,OAAO,IAAS,GAAK,CAAC,CAC1B,MAAQ,CACJ,MAAO,CAAC,CACZ,CACJ,CAmCA,SAAgB,EAAuB,EAA0D,CAC7F,GAAM,CAAE,WAAU,WAAU,SAAQ,YAAY,IAAS,EACnD,EAAQ,EAAA,oBACV,EAAQ,UAAY,IAAA,GAAY,EAAe,EAAI,EAAQ,QAC3D,EAAQ,YAAc,qBACtB,EAAQ,YAAc,EAC1B,EACI,EAA+C,KAC/C,EAAc,EACd,EAA8C,KAE5C,EAAQ,SAA0C,CACpD,IAAM,EAAO,EAAQ,OAAS,WAAW,MAAM,KAAK,UAAU,EACxD,EAAQ,MAAM,EAAA,aAAa,CAAQ,EACnC,EAA8B,CAAE,KAAM,EAAG,QAAS,EAAG,QAAS,EAAG,aAAc,IAAK,EAC1F,IAAK,IAAM,KAAS,EAAM,QAAQ,EAAG,CACjC,IAAM,EAAU,MAAM,EAAA,QAAQ,EAAM,EAAU,EAAO,CAAK,EAC1D,GAAI,EAAQ,OAAS,OAAQ,MAC7B,GAAI,EAAQ,OAAS,OAAQ,CACzB,EAAO,aAAe,EAAQ,GAC9B,EAAc,KAAK,IAAI,EAAI,EAAQ,GACnC,IAAU,eAAiB,CACvB,EAAQ,KACR,EAAW,CACf,EAAG,EAAQ,EAAE,EACb,KACJ,CACA,EAAM,OAAO,EAAM,MAAM,EACzB,EAAO,EAAQ,OAAS,OAAS,OAAS,YAAc,CAC5D,CAEA,MADA,GAAO,QAAU,EAAM,QAAQ,CAAC,CAAC,OAC1B,CACX,EAEM,OACF,IAAY,EAAM,CAAC,CAAC,YAAc,CAC9B,EAAU,IACd,CAAC,EACM,GAGL,MACF,GACA,KAAK,IAAI,GAAK,IACb,OAAO,UAAc,KAAe,UAAU,SAAW,IAExD,MAAuB,CACrB,EAAW,GAAG,EAAW,CACjC,EAGA,OAFI,GAAa,OAAO,OAAW,KAAa,OAAO,iBAAiB,SAAU,CAAQ,EAEnF,CACH,OAAO,EAAO,EAAS,CACnB,IAAM,EAAc,EAAA,iBAAiB,EAAO,CAAO,EACnD,EAAM,KAAK,EAAA,kBAAkB,CAAE,GAAG,EAAW,CAAM,EAAG,GAAG,CAAY,CAAC,CAAC,EACnE,EAAW,GAAG,EAAW,CACjC,EACA,QACA,YAAe,EAAM,QAAQ,EAC7B,UAAa,EAAM,MAAM,EACzB,SAAU,CACF,OAAO,OAAW,KAAa,OAAO,oBAAoB,SAAU,CAAQ,EAC5E,GAAO,aAAa,CAAK,EAC7B,EAAQ,IACZ,CACJ,CACJ"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { createAppErrorQueue as e } from "./app-error-queue.js";
|
|
2
|
+
import { fitAppErrorReport as t } from "./app-error-schema.js";
|
|
3
|
+
import { resolveToken as n, sendOne as r } from "./app-error-transport.js";
|
|
4
|
+
import { describeAppError as i } from "./describe-app-error.js";
|
|
5
|
+
//#region src/telemetry/app-error-reporter.ts
|
|
6
|
+
function a() {
|
|
7
|
+
try {
|
|
8
|
+
return typeof localStorage > "u" ? null : localStorage;
|
|
9
|
+
} catch {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function o(e) {
|
|
14
|
+
try {
|
|
15
|
+
return e?.() ?? {};
|
|
16
|
+
} catch {
|
|
17
|
+
return {};
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function s(s) {
|
|
21
|
+
let { endpoint: c, getToken: l, device: u, autoFlush: d = !0 } = s, f = e(s.storage === void 0 ? a() : s.storage, s.storageKey ?? "tempest:app-errors", s.maxEntries ?? 50), p = null, m = 0, h = null, g = async () => {
|
|
22
|
+
let e = s.fetch ?? globalThis.fetch.bind(globalThis), t = await n(l), i = {
|
|
23
|
+
sent: 0,
|
|
24
|
+
dropped: 0,
|
|
25
|
+
pending: 0,
|
|
26
|
+
retryAfterMs: null
|
|
27
|
+
};
|
|
28
|
+
for (let n of f.entries()) {
|
|
29
|
+
let a = await r(e, c, t, n);
|
|
30
|
+
if (a.kind === "stop") break;
|
|
31
|
+
if (a.kind === "wait") {
|
|
32
|
+
i.retryAfterMs = a.ms, m = Date.now() + a.ms, h ??= setTimeout(() => {
|
|
33
|
+
h = null, _();
|
|
34
|
+
}, a.ms);
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
f.remove(n.report), i[a.kind === "sent" ? "sent" : "dropped"] += 1;
|
|
38
|
+
}
|
|
39
|
+
return i.pending = f.entries().length, i;
|
|
40
|
+
}, _ = () => (p ??= g().finally(() => {
|
|
41
|
+
p = null;
|
|
42
|
+
}), p), v = () => d && Date.now() >= m && (typeof navigator > "u" || navigator.onLine !== !1), y = () => {
|
|
43
|
+
v() && _();
|
|
44
|
+
};
|
|
45
|
+
return d && typeof window < "u" && window.addEventListener("online", y), {
|
|
46
|
+
report(e, n) {
|
|
47
|
+
let r = i(e, n);
|
|
48
|
+
f.push(t({
|
|
49
|
+
...o(u),
|
|
50
|
+
...r
|
|
51
|
+
})), v() && _();
|
|
52
|
+
},
|
|
53
|
+
flush: _,
|
|
54
|
+
pending: () => f.entries(),
|
|
55
|
+
clear: () => f.clear(),
|
|
56
|
+
dispose() {
|
|
57
|
+
typeof window < "u" && window.removeEventListener("online", y), h && clearTimeout(h), h = null;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
//#endregion
|
|
62
|
+
export { s as createAppErrorReporter };
|
|
63
|
+
|
|
64
|
+
//# sourceMappingURL=app-error-reporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-error-reporter.js","names":[],"sources":["../../src/telemetry/app-error-reporter.ts"],"sourcesContent":["import { createAppErrorQueue } from \"./app-error-queue\";\nimport type { AppErrorQueueEntry, AppErrorQueueStorage } from \"./app-error-queue\";\nimport { fitAppErrorReport } from \"./app-error-schema\";\nimport type { AppErrorDeviceSchema } from \"./app-error-schema\";\nimport { resolveToken, sendOne } from \"./app-error-transport\";\nimport { describeAppError } from \"./describe-app-error\";\n\n/** Options for {@link createAppErrorReporter}. */\nexport interface CreateAppErrorReporterOptions {\n /** Full URL of the backend route, e.g. `${API_URL}/api/app-errors`. */\n endpoint: string;\n /**\n * Current access token, if any. Optional on purpose: the route is public,\n * and an error raised before login — or with a stale session — still has\n * to get through. A token that throws or resolves empty sends anonymously.\n */\n getToken?: () => string | null | undefined | Promise<string | null | undefined>;\n /**\n * Device facts, read **when the error is reported**, not when it is sent —\n * a report queued offline on `1.4.0` must not go out labelled `1.5.0`.\n */\n device?: () => AppErrorDeviceSchema;\n /** Where the queue persists. Defaults to `localStorage`; `null` keeps it in memory. */\n storage?: AppErrorQueueStorage | null;\n /** Storage key. Default `\"tempest:app-errors\"`. */\n storageKey?: string;\n /** Ceiling on distinct waiting reports; the oldest is evicted. Default `50`. */\n maxEntries?: number;\n /** `fetch` to send with. Defaults to the global one. */\n fetch?: typeof fetch;\n /** Send on every report and when the browser goes `online`. Default `true`. */\n autoFlush?: boolean;\n}\n\n/** What one {@link AppErrorReporter.flush} did. */\nexport interface AppErrorFlushResult {\n /** Reports the backend accepted. */\n sent: number;\n /** Reports the backend refused for good (a 4xx other than 408/429) and were dropped. */\n dropped: number;\n /** Reports still waiting. */\n pending: number;\n /** Milliseconds the backend asked to wait (429 `Retry-After`), or `null`. */\n retryAfterMs: number | null;\n}\n\n/** The reporter {@link createAppErrorReporter} returns. */\nexport interface AppErrorReporter {\n /** Queue an error with optional context, and try to send it. Never throws. */\n report: (error: unknown, context?: Record<string, unknown>) => void;\n /** Drain the queue now. Concurrent calls share one run. */\n flush: () => Promise<AppErrorFlushResult>;\n /** The waiting entries, oldest first. */\n pending: () => AppErrorQueueEntry[];\n /** Drop every waiting report. */\n clear: () => void;\n /** Remove the `online` listener and the retry timer. */\n dispose: () => void;\n}\n\n/**\n * Pick the default store, guarding hosts where touching `localStorage` throws.\n *\n * @returns `localStorage`, or `null` when there is none.\n */\nfunction defaultStorage(): AppErrorQueueStorage | null {\n try {\n return typeof localStorage === \"undefined\" ? null : localStorage;\n } catch {\n return null;\n }\n}\n\n/**\n * Read the device facts, reporting without them when the getter throws.\n *\n * @param device - The caller's getter.\n * @returns The facts, or an empty object.\n */\nfunction readDevice(device: CreateAppErrorReporterOptions[\"device\"]): AppErrorDeviceSchema {\n try {\n return device?.() ?? {};\n } catch {\n return {};\n }\n}\n\n/**\n * Report client errors to a Tempest backend's `POST /api/app-errors`, surviving\n * the offline stretches where field errors actually happen.\n *\n * The client half of `tempest-fastapi-sdk`'s `app_errors` module. An error is\n * described ({@link describeAppError}), stamped with the device facts of that\n * moment, fitted to the backend's column limits and queued in `localStorage`\n * before anything goes over the network — so a report raised with no signal is\n * sent when the browser comes back `online`, not lost.\n *\n * What each answer does to the queue:\n *\n * - **2xx** — removed.\n * - **429** — kept; sending pauses for `Retry-After`, then resumes on its own.\n * - **5xx, 408, network failure** — kept; the next report, `online` event or\n * `flush()` retries.\n * - **any other 4xx** — dropped: the backend will refuse that body forever, and\n * keeping it would block every report queued behind it.\n *\n * @example\n * import { createAppErrorReporter } from \"tempest-react-sdk\";\n *\n * const reporter = createAppErrorReporter({\n * endpoint: `${import.meta.env.VITE_API_URL}/api/app-errors`,\n * getToken: () => sessionStorage.getItem(\"access_token\"),\n * device: () => ({ platform: \"web\", app_version: \"1.4.0\" }),\n * });\n *\n * reporter.report(new Error(\"crop failed\"), { step: \"crop\", size: 0 });\n *\n * @param options - Endpoint, token and device getters, storage and limits.\n * @returns The reporter.\n */\nexport function createAppErrorReporter(options: CreateAppErrorReporterOptions): AppErrorReporter {\n const { endpoint, getToken, device, autoFlush = true } = options;\n const queue = createAppErrorQueue(\n options.storage === undefined ? defaultStorage() : options.storage,\n options.storageKey ?? \"tempest:app-errors\",\n options.maxEntries ?? 50,\n );\n let running: Promise<AppErrorFlushResult> | null = null;\n let pausedUntil = 0;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n const drain = async (): Promise<AppErrorFlushResult> => {\n const send = options.fetch ?? globalThis.fetch.bind(globalThis);\n const token = await resolveToken(getToken);\n const result: AppErrorFlushResult = { sent: 0, dropped: 0, pending: 0, retryAfterMs: null };\n for (const entry of queue.entries()) {\n const outcome = await sendOne(send, endpoint, token, entry);\n if (outcome.kind === \"stop\") break;\n if (outcome.kind === \"wait\") {\n result.retryAfterMs = outcome.ms;\n pausedUntil = Date.now() + outcome.ms;\n timer ??= setTimeout(() => {\n timer = null;\n void flush();\n }, outcome.ms);\n break;\n }\n queue.remove(entry.report);\n result[outcome.kind === \"sent\" ? \"sent\" : \"dropped\"] += 1;\n }\n result.pending = queue.entries().length;\n return result;\n };\n\n const flush = (): Promise<AppErrorFlushResult> => {\n running ??= drain().finally(() => {\n running = null;\n });\n return running;\n };\n\n const shouldSend = (): boolean =>\n autoFlush &&\n Date.now() >= pausedUntil &&\n (typeof navigator === \"undefined\" || navigator.onLine !== false);\n\n const onOnline = (): void => {\n if (shouldSend()) void flush();\n };\n if (autoFlush && typeof window !== \"undefined\") window.addEventListener(\"online\", onOnline);\n\n return {\n report(error, context) {\n const description = describeAppError(error, context);\n queue.push(fitAppErrorReport({ ...readDevice(device), ...description }));\n if (shouldSend()) void flush();\n },\n flush,\n pending: () => queue.entries(),\n clear: () => queue.clear(),\n dispose() {\n if (typeof window !== \"undefined\") window.removeEventListener(\"online\", onOnline);\n if (timer) clearTimeout(timer);\n timer = null;\n },\n };\n}\n"],"mappings":";;;;;AAiEA,SAAS,IAA8C;CACnD,IAAI;EACA,OAAO,OAAO,eAAiB,MAAc,OAAO;CACxD,QAAQ;EACJ,OAAO;CACX;AACJ;AAQA,SAAS,EAAW,GAAuE;CACvF,IAAI;EACA,OAAO,IAAS,KAAK,CAAC;CAC1B,QAAQ;EACJ,OAAO,CAAC;CACZ;AACJ;AAmCA,SAAgB,EAAuB,GAA0D;CAC7F,IAAM,EAAE,aAAU,aAAU,WAAQ,eAAY,OAAS,GACnD,IAAQ,EACV,EAAQ,YAAY,KAAA,IAAY,EAAe,IAAI,EAAQ,SAC3D,EAAQ,cAAc,sBACtB,EAAQ,cAAc,EAC1B,GACI,IAA+C,MAC/C,IAAc,GACd,IAA8C,MAE5C,IAAQ,YAA0C;EACpD,IAAM,IAAO,EAAQ,SAAS,WAAW,MAAM,KAAK,UAAU,GACxD,IAAQ,MAAM,EAAa,CAAQ,GACnC,IAA8B;GAAE,MAAM;GAAG,SAAS;GAAG,SAAS;GAAG,cAAc;EAAK;EAC1F,KAAK,IAAM,KAAS,EAAM,QAAQ,GAAG;GACjC,IAAM,IAAU,MAAM,EAAQ,GAAM,GAAU,GAAO,CAAK;GAC1D,IAAI,EAAQ,SAAS,QAAQ;GAC7B,IAAI,EAAQ,SAAS,QAAQ;IAGzB,AAFA,EAAO,eAAe,EAAQ,IAC9B,IAAc,KAAK,IAAI,IAAI,EAAQ,IACnC,MAAU,iBAAiB;KAEvB,AADA,IAAQ,MACR,EAAW;IACf,GAAG,EAAQ,EAAE;IACb;GACJ;GAEA,AADA,EAAM,OAAO,EAAM,MAAM,GACzB,EAAO,EAAQ,SAAS,SAAS,SAAS,cAAc;EAC5D;EAEA,OADA,EAAO,UAAU,EAAM,QAAQ,CAAC,CAAC,QAC1B;CACX,GAEM,WACF,MAAY,EAAM,CAAC,CAAC,cAAc;EAC9B,IAAU;CACd,CAAC,GACM,IAGL,UACF,KACA,KAAK,IAAI,KAAK,MACb,OAAO,YAAc,OAAe,UAAU,WAAW,KAExD,UAAuB;EACzB,AAAI,EAAW,KAAG,EAAW;CACjC;CAGA,OAFI,KAAa,OAAO,SAAW,OAAa,OAAO,iBAAiB,UAAU,CAAQ,GAEnF;EACH,OAAO,GAAO,GAAS;GACnB,IAAM,IAAc,EAAiB,GAAO,CAAO;GAEnD,AADA,EAAM,KAAK,EAAkB;IAAE,GAAG,EAAW,CAAM;IAAG,GAAG;GAAY,CAAC,CAAC,GACnE,EAAW,KAAG,EAAW;EACjC;EACA;EACA,eAAe,EAAM,QAAQ;EAC7B,aAAa,EAAM,MAAM;EACzB,UAAU;GAGN,AAFI,OAAO,SAAW,OAAa,OAAO,oBAAoB,UAAU,CAAQ,GAC5E,KAAO,aAAa,CAAK,GAC7B,IAAQ;EACZ;CACJ;AACJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e=4e3,t=`…[truncado]`;function n(e,n){if(e.length<=n)return e;let r=Math.max(n-11,0);return`${e.slice(0,r)}${t}`.slice(0,n)}var r=[`os_version`,`app_version`,`device_model`,`device_id`];function i(t){let i={...t,code:n(t.code,120),message:n(t.message,e)};for(let e of r){let t=i[e];t!==void 0&&(i[e]=n(t,200))}return i}exports.APP_ERROR_MESSAGE_MAX_LENGTH=e,exports.APP_ERROR_TRUNCATION_SUFFIX=t,exports.fitAppErrorReport=i,exports.truncateAppErrorText=n;
|
|
2
|
+
//# sourceMappingURL=app-error-schema.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-error-schema.cjs","names":[],"sources":["../../src/telemetry/app-error-schema.ts"],"sourcesContent":["/**\n * The client platform an error was reported from.\n *\n * The closed set the backend filters on, mirrored from `tempest-fastapi-sdk`'s\n * `AppPlatform`: an error that only shows up on iOS is not the same bug as one\n * that only shows up on Android, and a PWA reports `\"web\"`.\n */\nexport type AppErrorPlatform = \"ios\" | \"android\" | \"web\" | \"unknown\";\n\n/**\n * Device data travelling with a report — the wire shape of\n * `tempest-fastapi-sdk`'s `AppErrorDeviceSchema`, snake_case included.\n *\n * Every field is optional on purpose: the app sends whatever it managed to\n * collect at the moment of the failure, and requiring any of them would turn an\n * incomplete collection into a lost report.\n */\nexport interface AppErrorDeviceSchema {\n /** Reporting client's platform. The backend stores `\"unknown\"` when absent. */\n platform?: AppErrorPlatform;\n /** Operating system version, e.g. `\"Android 14\"`. */\n os_version?: string;\n /** Application version or build — with `code`, the cut that isolates one defect. */\n app_version?: string;\n /** Device model, e.g. `\"SM-A105M\"`. */\n device_model?: string;\n /** Anonymous device identifier, used to group reports from one device. */\n device_id?: string;\n}\n\n/**\n * The body of `POST /api/app-errors` — `tempest-fastapi-sdk`'s\n * `AppErrorReportSchema`. There is deliberately no `user_id`: the backend takes\n * it from the bearer token, never from the body, so a client cannot attribute a\n * report to somebody else.\n */\nexport interface AppErrorReportSchema extends AppErrorDeviceSchema {\n /** Stable error identifier — the first thing anyone groups by. */\n code: string;\n /** Message, cause chain, context and stack, as one text. */\n message: string;\n}\n\n/**\n * Longest `code` the backend column holds.\n *\n * Ported from tempest-fastapi-sdk's `APP_ERROR_CODE_MAX_LENGTH`.\n */\nexport const APP_ERROR_CODE_MAX_LENGTH = 120;\n\n/**\n * Longest `message` the backend keeps.\n *\n * Ported from tempest-fastapi-sdk's `APP_ERROR_MESSAGE_MAX_LENGTH`. The server\n * truncates on its own; cutting here too is what keeps a queue of fifty stack\n * traces from filling `localStorage` while the device is offline.\n */\nexport const APP_ERROR_MESSAGE_MAX_LENGTH = 4000;\n\n/**\n * Longest device text field (`os_version`, `app_version`, …) the backend holds.\n *\n * Ported from tempest-fastapi-sdk's `APP_ERROR_TEXT_FIELD_MAX_LENGTH`.\n */\nexport const APP_ERROR_TEXT_FIELD_MAX_LENGTH = 200;\n\n/**\n * Marker appended where a value was cut.\n *\n * Ported from tempest-fastapi-sdk's `APP_ERROR_TRUNCATION_SUFFIX`, so a report\n * cut on the device reads exactly like one cut by the server.\n */\nexport const APP_ERROR_TRUNCATION_SUFFIX = \"…[truncado]\";\n\n/**\n * Shorten `value` to `limit` characters, marking the cut.\n *\n * Same rule as the backend's `AppErrorService.truncate`: shortened, never\n * refused, because the sender has just failed and has no way to handle a\n * rejection.\n *\n * @param value - The text to fit.\n * @param limit - Maximum length, suffix included.\n * @returns `value` unchanged when it fits, the cut version with the suffix otherwise.\n */\nexport function truncateAppErrorText(value: string, limit: number): string {\n if (value.length <= limit) return value;\n const keep = Math.max(limit - APP_ERROR_TRUNCATION_SUFFIX.length, 0);\n return `${value.slice(0, keep)}${APP_ERROR_TRUNCATION_SUFFIX}`.slice(0, limit);\n}\n\nconst DEVICE_TEXT_FIELDS = [\"os_version\", \"app_version\", \"device_model\", \"device_id\"] as const;\n\n/**\n * Fit every field of a report to the backend's column limits.\n *\n * @param report - The report as built.\n * @returns A copy with `code`, `message` and the device text fields truncated.\n */\nexport function fitAppErrorReport(report: AppErrorReportSchema): AppErrorReportSchema {\n const fitted: AppErrorReportSchema = {\n ...report,\n code: truncateAppErrorText(report.code, APP_ERROR_CODE_MAX_LENGTH),\n message: truncateAppErrorText(report.message, APP_ERROR_MESSAGE_MAX_LENGTH),\n };\n for (const field of DEVICE_TEXT_FIELDS) {\n const value = fitted[field];\n if (value !== undefined) {\n fitted[field] = truncateAppErrorText(value, APP_ERROR_TEXT_FIELD_MAX_LENGTH);\n }\n }\n return fitted;\n}\n"],"mappings":"AAyDA,IAAa,EAA+B,IAe/B,EAA8B,cAa3C,SAAgB,EAAqB,EAAe,EAAuB,CACvE,GAAI,EAAM,QAAU,EAAO,OAAO,EAClC,IAAM,EAAO,KAAK,IAAI,EAAQ,GAAoC,CAAC,EACnE,MAAO,GAAG,EAAM,MAAM,EAAG,CAAI,IAAI,IAA8B,MAAM,EAAG,CAAK,CACjF,CAEA,IAAM,EAAqB,CAAC,aAAc,cAAe,eAAgB,WAAW,EAQpF,SAAgB,EAAkB,EAAoD,CAClF,IAAM,EAA+B,CACjC,GAAG,EACH,KAAM,EAAqB,EAAO,KAAA,GAA+B,EACjE,QAAS,EAAqB,EAAO,QAAS,CAA4B,CAC9E,EACA,IAAK,IAAM,KAAS,EAAoB,CACpC,IAAM,EAAQ,EAAO,GACjB,IAAU,IAAA,KACV,EAAO,GAAS,EAAqB,EAAA,GAAsC,EAEnF,CACA,OAAO,CACX"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
var e = 4e3, t = "…[truncado]";
|
|
2
|
+
function n(e, n) {
|
|
3
|
+
if (e.length <= n) return e;
|
|
4
|
+
let r = Math.max(n - 11, 0);
|
|
5
|
+
return `${e.slice(0, r)}${t}`.slice(0, n);
|
|
6
|
+
}
|
|
7
|
+
var r = [
|
|
8
|
+
"os_version",
|
|
9
|
+
"app_version",
|
|
10
|
+
"device_model",
|
|
11
|
+
"device_id"
|
|
12
|
+
];
|
|
13
|
+
function i(t) {
|
|
14
|
+
let i = {
|
|
15
|
+
...t,
|
|
16
|
+
code: n(t.code, 120),
|
|
17
|
+
message: n(t.message, e)
|
|
18
|
+
};
|
|
19
|
+
for (let e of r) {
|
|
20
|
+
let t = i[e];
|
|
21
|
+
t !== void 0 && (i[e] = n(t, 200));
|
|
22
|
+
}
|
|
23
|
+
return i;
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
26
|
+
export { e as APP_ERROR_MESSAGE_MAX_LENGTH, t as APP_ERROR_TRUNCATION_SUFFIX, i as fitAppErrorReport, n as truncateAppErrorText };
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=app-error-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-error-schema.js","names":[],"sources":["../../src/telemetry/app-error-schema.ts"],"sourcesContent":["/**\n * The client platform an error was reported from.\n *\n * The closed set the backend filters on, mirrored from `tempest-fastapi-sdk`'s\n * `AppPlatform`: an error that only shows up on iOS is not the same bug as one\n * that only shows up on Android, and a PWA reports `\"web\"`.\n */\nexport type AppErrorPlatform = \"ios\" | \"android\" | \"web\" | \"unknown\";\n\n/**\n * Device data travelling with a report — the wire shape of\n * `tempest-fastapi-sdk`'s `AppErrorDeviceSchema`, snake_case included.\n *\n * Every field is optional on purpose: the app sends whatever it managed to\n * collect at the moment of the failure, and requiring any of them would turn an\n * incomplete collection into a lost report.\n */\nexport interface AppErrorDeviceSchema {\n /** Reporting client's platform. The backend stores `\"unknown\"` when absent. */\n platform?: AppErrorPlatform;\n /** Operating system version, e.g. `\"Android 14\"`. */\n os_version?: string;\n /** Application version or build — with `code`, the cut that isolates one defect. */\n app_version?: string;\n /** Device model, e.g. `\"SM-A105M\"`. */\n device_model?: string;\n /** Anonymous device identifier, used to group reports from one device. */\n device_id?: string;\n}\n\n/**\n * The body of `POST /api/app-errors` — `tempest-fastapi-sdk`'s\n * `AppErrorReportSchema`. There is deliberately no `user_id`: the backend takes\n * it from the bearer token, never from the body, so a client cannot attribute a\n * report to somebody else.\n */\nexport interface AppErrorReportSchema extends AppErrorDeviceSchema {\n /** Stable error identifier — the first thing anyone groups by. */\n code: string;\n /** Message, cause chain, context and stack, as one text. */\n message: string;\n}\n\n/**\n * Longest `code` the backend column holds.\n *\n * Ported from tempest-fastapi-sdk's `APP_ERROR_CODE_MAX_LENGTH`.\n */\nexport const APP_ERROR_CODE_MAX_LENGTH = 120;\n\n/**\n * Longest `message` the backend keeps.\n *\n * Ported from tempest-fastapi-sdk's `APP_ERROR_MESSAGE_MAX_LENGTH`. The server\n * truncates on its own; cutting here too is what keeps a queue of fifty stack\n * traces from filling `localStorage` while the device is offline.\n */\nexport const APP_ERROR_MESSAGE_MAX_LENGTH = 4000;\n\n/**\n * Longest device text field (`os_version`, `app_version`, …) the backend holds.\n *\n * Ported from tempest-fastapi-sdk's `APP_ERROR_TEXT_FIELD_MAX_LENGTH`.\n */\nexport const APP_ERROR_TEXT_FIELD_MAX_LENGTH = 200;\n\n/**\n * Marker appended where a value was cut.\n *\n * Ported from tempest-fastapi-sdk's `APP_ERROR_TRUNCATION_SUFFIX`, so a report\n * cut on the device reads exactly like one cut by the server.\n */\nexport const APP_ERROR_TRUNCATION_SUFFIX = \"…[truncado]\";\n\n/**\n * Shorten `value` to `limit` characters, marking the cut.\n *\n * Same rule as the backend's `AppErrorService.truncate`: shortened, never\n * refused, because the sender has just failed and has no way to handle a\n * rejection.\n *\n * @param value - The text to fit.\n * @param limit - Maximum length, suffix included.\n * @returns `value` unchanged when it fits, the cut version with the suffix otherwise.\n */\nexport function truncateAppErrorText(value: string, limit: number): string {\n if (value.length <= limit) return value;\n const keep = Math.max(limit - APP_ERROR_TRUNCATION_SUFFIX.length, 0);\n return `${value.slice(0, keep)}${APP_ERROR_TRUNCATION_SUFFIX}`.slice(0, limit);\n}\n\nconst DEVICE_TEXT_FIELDS = [\"os_version\", \"app_version\", \"device_model\", \"device_id\"] as const;\n\n/**\n * Fit every field of a report to the backend's column limits.\n *\n * @param report - The report as built.\n * @returns A copy with `code`, `message` and the device text fields truncated.\n */\nexport function fitAppErrorReport(report: AppErrorReportSchema): AppErrorReportSchema {\n const fitted: AppErrorReportSchema = {\n ...report,\n code: truncateAppErrorText(report.code, APP_ERROR_CODE_MAX_LENGTH),\n message: truncateAppErrorText(report.message, APP_ERROR_MESSAGE_MAX_LENGTH),\n };\n for (const field of DEVICE_TEXT_FIELDS) {\n const value = fitted[field];\n if (value !== undefined) {\n fitted[field] = truncateAppErrorText(value, APP_ERROR_TEXT_FIELD_MAX_LENGTH);\n }\n }\n return fitted;\n}\n"],"mappings":"AAyDA,IAAa,IAA+B,KAe/B,IAA8B;AAa3C,SAAgB,EAAqB,GAAe,GAAuB;CACvE,IAAI,EAAM,UAAU,GAAO,OAAO;CAClC,IAAM,IAAO,KAAK,IAAI,IAAQ,IAAoC,CAAC;CACnE,OAAO,GAAG,EAAM,MAAM,GAAG,CAAI,IAAI,IAA8B,MAAM,GAAG,CAAK;AACjF;AAEA,IAAM,IAAqB;CAAC;CAAc;CAAe;CAAgB;AAAW;AAQpF,SAAgB,EAAkB,GAAoD;CAClF,IAAM,IAA+B;EACjC,GAAG;EACH,MAAM,EAAqB,EAAO,MAAA,GAA+B;EACjE,SAAS,EAAqB,EAAO,SAAS,CAA4B;CAC9E;CACA,KAAK,IAAM,KAAS,GAAoB;EACpC,IAAM,IAAQ,EAAO;EACrB,AAAI,MAAU,KAAA,MACV,EAAO,KAAS,EAAqB,GAAA,GAAsC;CAEnF;CACA,OAAO;AACX"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("./app-error-schema.cjs");function t(e){let t=Number(e);if(e!==null&&Number.isFinite(t))return Math.max(t,1)*1e3;let n=e?Date.parse(e):NaN;return Number.isNaN(n)?6e4:Math.max(n-Date.now(),1e3)}function n(t){if(t.count<=1)return t.report;let n=`[repeated ${t.count}×]\n${t.report.message}`;return e.fitAppErrorReport({...t.report,message:n})}async function r(e,r,i,a){let o={"Content-Type":`application/json`};i&&(o.Authorization=`Bearer ${i}`);try{let i=await e(r,{method:`POST`,headers:o,body:JSON.stringify(n(a))});return i.ok?{kind:`sent`}:i.status===429?{kind:`wait`,ms:t(i.headers.get(`Retry-After`))}:i.status===408||i.status>=500?{kind:`stop`}:{kind:`drop`}}catch{return{kind:`stop`}}}async function i(e){try{return await e?.()||null}catch{return null}}exports.bodyFor=n,exports.resolveToken=i,exports.retryAfterMs=t,exports.sendOne=r;
|
|
2
|
+
//# sourceMappingURL=app-error-transport.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-error-transport.cjs","names":[],"sources":["../../src/telemetry/app-error-transport.ts"],"sourcesContent":["import type { AppErrorQueueEntry } from \"./app-error-queue\";\nimport { fitAppErrorReport } from \"./app-error-schema\";\nimport type { AppErrorReportSchema } from \"./app-error-schema\";\n\n/** What the backend's answer to one send means for the queue. */\nexport type SendOutcome = { kind: \"sent\" | \"drop\" | \"stop\" } | { kind: \"wait\"; ms: number };\n\n/**\n * Read a `Retry-After` header as milliseconds.\n *\n * @param header - The header value: delay-seconds or an HTTP date.\n * @returns The delay, at least one second.\n */\nexport function retryAfterMs(header: string | null): number {\n const seconds = Number(header);\n if (header !== null && Number.isFinite(seconds)) return Math.max(seconds, 1) * 1000;\n const date = header ? Date.parse(header) : Number.NaN;\n return Number.isNaN(date) ? 60_000 : Math.max(date - Date.now(), 1000);\n}\n\n/**\n * Build the body for one queued entry, marking how often it repeated.\n *\n * @param entry - The queued entry.\n * @returns The report to send.\n */\nexport function bodyFor(entry: AppErrorQueueEntry): AppErrorReportSchema {\n if (entry.count <= 1) return entry.report;\n const message = `[repeated ${entry.count}×]\\n${entry.report.message}`;\n return fitAppErrorReport({ ...entry.report, message });\n}\n\n/**\n * Send one entry and classify what the backend answered.\n *\n * @param send - The `fetch` to use.\n * @param endpoint - Route URL.\n * @param token - Bearer token, or `null`.\n * @param entry - What to send.\n * @returns `sent` (2xx), `wait` (429), `drop` (other 4xx) or `stop` (5xx, 408, network).\n * Anything unexpected — a rejected `fetch`, a wrapper that resolves without a\n * `Response` — is `stop`: the report stays queued, and the flush that\n * `report()` fires in the background never becomes an unhandled rejection.\n */\nexport async function sendOne(\n send: typeof fetch,\n endpoint: string,\n token: string | null,\n entry: AppErrorQueueEntry,\n): Promise<SendOutcome> {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (token) headers.Authorization = `Bearer ${token}`;\n try {\n const response = await send(endpoint, {\n method: \"POST\",\n headers,\n body: JSON.stringify(bodyFor(entry)),\n });\n if (response.ok) return { kind: \"sent\" };\n if (response.status === 429) {\n return { kind: \"wait\", ms: retryAfterMs(response.headers.get(\"Retry-After\")) };\n }\n if (response.status === 408 || response.status >= 500) return { kind: \"stop\" };\n return { kind: \"drop\" };\n } catch {\n return { kind: \"stop\" };\n }\n}\n\n/**\n * Resolve the token, sending anonymously when it cannot be had.\n *\n * @param getToken - The caller's token getter.\n * @returns The token, or `null`.\n */\nexport async function resolveToken(\n getToken: (() => string | null | undefined | Promise<string | null | undefined>) | undefined,\n): Promise<string | null> {\n try {\n return (await getToken?.()) || null;\n } catch {\n return null;\n }\n}\n"],"mappings":"0CAaA,SAAgB,EAAa,EAA+B,CACxD,IAAM,EAAU,OAAO,CAAM,EAC7B,GAAI,IAAW,MAAQ,OAAO,SAAS,CAAO,EAAG,OAAO,KAAK,IAAI,EAAS,CAAC,EAAI,IAC/E,IAAM,EAAO,EAAS,KAAK,MAAM,CAAM,EAAI,IAC3C,OAAO,OAAO,MAAM,CAAI,EAAI,IAAS,KAAK,IAAI,EAAO,KAAK,IAAI,EAAG,GAAI,CACzE,CAQA,SAAgB,EAAQ,EAAiD,CACrE,GAAI,EAAM,OAAS,EAAG,OAAO,EAAM,OACnC,IAAM,EAAU,aAAa,EAAM,MAAM,MAAM,EAAM,OAAO,UAC5D,OAAO,EAAA,kBAAkB,CAAE,GAAG,EAAM,OAAQ,SAAQ,CAAC,CACzD,CAcA,eAAsB,EAClB,EACA,EACA,EACA,EACoB,CACpB,IAAM,EAAkC,CAAE,eAAgB,kBAAmB,EACzE,IAAO,EAAQ,cAAgB,UAAU,KAC7C,GAAI,CACA,IAAM,EAAW,MAAM,EAAK,EAAU,CAClC,OAAQ,OACR,UACA,KAAM,KAAK,UAAU,EAAQ,CAAK,CAAC,CACvC,CAAC,EAMD,OALI,EAAS,GAAW,CAAE,KAAM,MAAO,EACnC,EAAS,SAAW,IACb,CAAE,KAAM,OAAQ,GAAI,EAAa,EAAS,QAAQ,IAAI,aAAa,CAAC,CAAE,EAE7E,EAAS,SAAW,KAAO,EAAS,QAAU,IAAY,CAAE,KAAM,MAAO,EACtE,CAAE,KAAM,MAAO,CAC1B,MAAQ,CACJ,MAAO,CAAE,KAAM,MAAO,CAC1B,CACJ,CAQA,eAAsB,EAClB,EACsB,CACtB,GAAI,CACA,OAAQ,MAAM,IAAW,GAAM,IACnC,MAAQ,CACJ,OAAO,IACX,CACJ"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { fitAppErrorReport as e } from "./app-error-schema.js";
|
|
2
|
+
//#region src/telemetry/app-error-transport.ts
|
|
3
|
+
function t(e) {
|
|
4
|
+
let t = Number(e);
|
|
5
|
+
if (e !== null && Number.isFinite(t)) return Math.max(t, 1) * 1e3;
|
|
6
|
+
let n = e ? Date.parse(e) : NaN;
|
|
7
|
+
return Number.isNaN(n) ? 6e4 : Math.max(n - Date.now(), 1e3);
|
|
8
|
+
}
|
|
9
|
+
function n(t) {
|
|
10
|
+
if (t.count <= 1) return t.report;
|
|
11
|
+
let n = `[repeated ${t.count}×]\n${t.report.message}`;
|
|
12
|
+
return e({
|
|
13
|
+
...t.report,
|
|
14
|
+
message: n
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
async function r(e, r, i, a) {
|
|
18
|
+
let o = { "Content-Type": "application/json" };
|
|
19
|
+
i && (o.Authorization = `Bearer ${i}`);
|
|
20
|
+
try {
|
|
21
|
+
let i = await e(r, {
|
|
22
|
+
method: "POST",
|
|
23
|
+
headers: o,
|
|
24
|
+
body: JSON.stringify(n(a))
|
|
25
|
+
});
|
|
26
|
+
return i.ok ? { kind: "sent" } : i.status === 429 ? {
|
|
27
|
+
kind: "wait",
|
|
28
|
+
ms: t(i.headers.get("Retry-After"))
|
|
29
|
+
} : i.status === 408 || i.status >= 500 ? { kind: "stop" } : { kind: "drop" };
|
|
30
|
+
} catch {
|
|
31
|
+
return { kind: "stop" };
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async function i(e) {
|
|
35
|
+
try {
|
|
36
|
+
return await e?.() || null;
|
|
37
|
+
} catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//#endregion
|
|
42
|
+
export { n as bodyFor, i as resolveToken, t as retryAfterMs, r as sendOne };
|
|
43
|
+
|
|
44
|
+
//# sourceMappingURL=app-error-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-error-transport.js","names":[],"sources":["../../src/telemetry/app-error-transport.ts"],"sourcesContent":["import type { AppErrorQueueEntry } from \"./app-error-queue\";\nimport { fitAppErrorReport } from \"./app-error-schema\";\nimport type { AppErrorReportSchema } from \"./app-error-schema\";\n\n/** What the backend's answer to one send means for the queue. */\nexport type SendOutcome = { kind: \"sent\" | \"drop\" | \"stop\" } | { kind: \"wait\"; ms: number };\n\n/**\n * Read a `Retry-After` header as milliseconds.\n *\n * @param header - The header value: delay-seconds or an HTTP date.\n * @returns The delay, at least one second.\n */\nexport function retryAfterMs(header: string | null): number {\n const seconds = Number(header);\n if (header !== null && Number.isFinite(seconds)) return Math.max(seconds, 1) * 1000;\n const date = header ? Date.parse(header) : Number.NaN;\n return Number.isNaN(date) ? 60_000 : Math.max(date - Date.now(), 1000);\n}\n\n/**\n * Build the body for one queued entry, marking how often it repeated.\n *\n * @param entry - The queued entry.\n * @returns The report to send.\n */\nexport function bodyFor(entry: AppErrorQueueEntry): AppErrorReportSchema {\n if (entry.count <= 1) return entry.report;\n const message = `[repeated ${entry.count}×]\\n${entry.report.message}`;\n return fitAppErrorReport({ ...entry.report, message });\n}\n\n/**\n * Send one entry and classify what the backend answered.\n *\n * @param send - The `fetch` to use.\n * @param endpoint - Route URL.\n * @param token - Bearer token, or `null`.\n * @param entry - What to send.\n * @returns `sent` (2xx), `wait` (429), `drop` (other 4xx) or `stop` (5xx, 408, network).\n * Anything unexpected — a rejected `fetch`, a wrapper that resolves without a\n * `Response` — is `stop`: the report stays queued, and the flush that\n * `report()` fires in the background never becomes an unhandled rejection.\n */\nexport async function sendOne(\n send: typeof fetch,\n endpoint: string,\n token: string | null,\n entry: AppErrorQueueEntry,\n): Promise<SendOutcome> {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (token) headers.Authorization = `Bearer ${token}`;\n try {\n const response = await send(endpoint, {\n method: \"POST\",\n headers,\n body: JSON.stringify(bodyFor(entry)),\n });\n if (response.ok) return { kind: \"sent\" };\n if (response.status === 429) {\n return { kind: \"wait\", ms: retryAfterMs(response.headers.get(\"Retry-After\")) };\n }\n if (response.status === 408 || response.status >= 500) return { kind: \"stop\" };\n return { kind: \"drop\" };\n } catch {\n return { kind: \"stop\" };\n }\n}\n\n/**\n * Resolve the token, sending anonymously when it cannot be had.\n *\n * @param getToken - The caller's token getter.\n * @returns The token, or `null`.\n */\nexport async function resolveToken(\n getToken: (() => string | null | undefined | Promise<string | null | undefined>) | undefined,\n): Promise<string | null> {\n try {\n return (await getToken?.()) || null;\n } catch {\n return null;\n }\n}\n"],"mappings":";;AAaA,SAAgB,EAAa,GAA+B;CACxD,IAAM,IAAU,OAAO,CAAM;CAC7B,IAAI,MAAW,QAAQ,OAAO,SAAS,CAAO,GAAG,OAAO,KAAK,IAAI,GAAS,CAAC,IAAI;CAC/E,IAAM,IAAO,IAAS,KAAK,MAAM,CAAM,IAAI;CAC3C,OAAO,OAAO,MAAM,CAAI,IAAI,MAAS,KAAK,IAAI,IAAO,KAAK,IAAI,GAAG,GAAI;AACzE;AAQA,SAAgB,EAAQ,GAAiD;CACrE,IAAI,EAAM,SAAS,GAAG,OAAO,EAAM;CACnC,IAAM,IAAU,aAAa,EAAM,MAAM,MAAM,EAAM,OAAO;CAC5D,OAAO,EAAkB;EAAE,GAAG,EAAM;EAAQ;CAAQ,CAAC;AACzD;AAcA,eAAsB,EAClB,GACA,GACA,GACA,GACoB;CACpB,IAAM,IAAkC,EAAE,gBAAgB,mBAAmB;CAC7E,AAAI,MAAO,EAAQ,gBAAgB,UAAU;CAC7C,IAAI;EACA,IAAM,IAAW,MAAM,EAAK,GAAU;GAClC,QAAQ;GACR;GACA,MAAM,KAAK,UAAU,EAAQ,CAAK,CAAC;EACvC,CAAC;EAMD,OALI,EAAS,KAAW,EAAE,MAAM,OAAO,IACnC,EAAS,WAAW,MACb;GAAE,MAAM;GAAQ,IAAI,EAAa,EAAS,QAAQ,IAAI,aAAa,CAAC;EAAE,IAE7E,EAAS,WAAW,OAAO,EAAS,UAAU,MAAY,EAAE,MAAM,OAAO,IACtE,EAAE,MAAM,OAAO;CAC1B,QAAQ;EACJ,OAAO,EAAE,MAAM,OAAO;CAC1B;AACJ;AAQA,eAAsB,EAClB,GACsB;CACtB,IAAI;EACA,OAAQ,MAAM,IAAW,KAAM;CACnC,QAAQ;EACJ,OAAO;CACX;AACJ"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
function e(e){return e instanceof Error||typeof e==`object`&&!!e&&typeof e.message==`string`}function t(e){if(e instanceof Error&&e.name)return e.name;if(typeof e==`object`&&e&&`name`in e){let t=e.name;if(typeof t==`string`&&t)return t}return`Error`}function n(n){if(e(n))return`${t(n)}: ${n.message}`;if(typeof n==`string`)return n;try{return JSON.stringify(n)??String(n)}catch{return String(n)}}function r(t){let r=[],i=new Set([t]),a=e(t)?t.cause:void 0;for(;a!=null;){if(i.has(a)){r.push(`caused by: [circular]`);break}if(r.length===5){r.push(`caused by: […]`);break}i.add(a),r.push(`caused by: ${n(a)}`),a=e(a)?a.cause:void 0}return r}function i(e){if(!e||Object.keys(e).length===0)return null;try{return`context: ${JSON.stringify(e)}`}catch{return`context: [unserializable]`}}function a(a,o){let s=[n(a),...r(a)],c=i(o);return c&&s.push(c),e(a)&&typeof a.stack==`string`&&s.push(a.stack),{code:t(a),message:s.join(`
|
|
2
|
+
`)}}exports.describeAppError=a;
|
|
3
|
+
//# sourceMappingURL=describe-app-error.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe-app-error.cjs","names":[],"sources":["../../src/telemetry/describe-app-error.ts"],"sourcesContent":["/** How deep the `cause` chain is followed before the rest is elided. */\nconst MAX_CAUSE_DEPTH = 5;\n\n/**\n * The `code` and `message` a thrown value becomes on the wire.\n */\nexport interface AppErrorDescription {\n /** The error's `name` — `\"UnreadableFileError\"`, `\"TypeError\"` — or `\"Error\"`. */\n code: string;\n /** Header, cause chain, context and stack, in that order. */\n message: string;\n}\n\n/** The shape every thrown error shares, whichever realm built it. */\ninterface ErrorLike {\n name?: unknown;\n message: string;\n stack?: unknown;\n cause?: unknown;\n}\n\n/**\n * Whether a value carries an error's `message`, `instanceof` or not.\n *\n * `instanceof Error` is not enough: a `DOMException` — the `NotReadableError`\n * a picker raises for a file that only lives in the cloud — fails it in jsdom\n * and across realms, and was being rendered as `{}`, losing exactly the cause\n * a field report exists to carry.\n *\n * @param value - The thrown value.\n * @returns `true` for anything with a string `message`.\n */\nfunction isErrorLike(value: unknown): value is ErrorLike {\n return (\n value instanceof Error ||\n (typeof value === \"object\" &&\n value !== null &&\n typeof (value as { message?: unknown }).message === \"string\")\n );\n}\n\n/**\n * The identifier a thrown value reports as, including a `DOMException`, which\n * is not always an `Error` instance across realms.\n *\n * @param value - The thrown value.\n * @returns Its `name`, or `\"Error\"`.\n */\nfunction nameOf(value: unknown): string {\n if (value instanceof Error && value.name) return value.name;\n if (typeof value === \"object\" && value !== null && \"name\" in value) {\n const name = (value as { name: unknown }).name;\n if (typeof name === \"string\" && name) return name;\n }\n return \"Error\";\n}\n\n/**\n * One line naming the value: `Name: message` for an error.\n *\n * @param value - The thrown value or a cause.\n * @returns The line.\n */\nfunction headline(value: unknown): string {\n if (isErrorLike(value)) return `${nameOf(value)}: ${value.message}`;\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\n/**\n * Follow `error.cause` into one line per link, bounded and cycle-safe.\n *\n * @param error - The top-level error.\n * @returns `caused by: …` lines, outermost first.\n */\nfunction causeLines(error: unknown): string[] {\n const lines: string[] = [];\n const seen = new Set<unknown>([error]);\n let current: unknown = isErrorLike(error) ? error.cause : undefined;\n while (current !== undefined && current !== null) {\n if (seen.has(current)) {\n lines.push(\"caused by: [circular]\");\n break;\n }\n if (lines.length === MAX_CAUSE_DEPTH) {\n lines.push(\"caused by: […]\");\n break;\n }\n seen.add(current);\n lines.push(`caused by: ${headline(current)}`);\n current = isErrorLike(current) ? current.cause : undefined;\n }\n return lines;\n}\n\n/**\n * Render the caller's context as one JSON line.\n *\n * @param context - Extra facts, or nothing.\n * @returns The line, or `null` when there is no context.\n */\nfunction contextLine(context: Record<string, unknown> | undefined): string | null {\n if (!context || Object.keys(context).length === 0) return null;\n try {\n return `context: ${JSON.stringify(context)}`;\n } catch {\n return \"context: [unserializable]\";\n }\n}\n\n/**\n * Turn any thrown value into the `code` + `message` pair the backend stores.\n *\n * The message is ordered by how much each part is worth when the backend cuts\n * it at 4000 characters: the headline, then the **`cause` chain** — where the\n * real failure usually is (`UnreadableFileError` caused by `NotReadableError`)\n * — then the caller's context, and the stack last, since it is the longest and\n * the first thing worth losing.\n *\n * @example\n * describeAppError(new Error(\"boom\", { cause: new TypeError(\"x\") }), { step: \"crop\" });\n * // { code: \"Error\", message: \"Error: boom\\ncaused by: TypeError: x\\ncontext: {\\\"step\\\":\\\"crop\\\"}\\n…\" }\n *\n * @param error - Whatever was thrown — an `Error`, a `DOMException`, a string.\n * @param context - Extra facts to keep with it (file size, MIME, step).\n * @returns The wire `code` and `message`.\n */\nexport function describeAppError(\n error: unknown,\n context?: Record<string, unknown>,\n): AppErrorDescription {\n const parts: string[] = [headline(error), ...causeLines(error)];\n const ctx = contextLine(context);\n if (ctx) parts.push(ctx);\n if (isErrorLike(error) && typeof error.stack === \"string\") parts.push(error.stack);\n return { code: nameOf(error), message: parts.join(\"\\n\") };\n}\n"],"mappings":"AAgCA,SAAS,EAAY,EAAoC,CACrD,OACI,aAAiB,OAChB,OAAO,GAAU,YACd,GACA,OAAQ,EAAgC,SAAY,QAEhE,CASA,SAAS,EAAO,EAAwB,CACpC,GAAI,aAAiB,OAAS,EAAM,KAAM,OAAO,EAAM,KACvD,GAAI,OAAO,GAAU,UAAY,GAAkB,SAAU,EAAO,CAChE,IAAM,EAAQ,EAA4B,KAC1C,GAAI,OAAO,GAAS,UAAY,EAAM,OAAO,CACjD,CACA,MAAO,OACX,CAQA,SAAS,EAAS,EAAwB,CACtC,GAAI,EAAY,CAAK,EAAG,MAAO,GAAG,EAAO,CAAK,EAAE,IAAI,EAAM,UAC1D,GAAI,OAAO,GAAU,SAAU,OAAO,EACtC,GAAI,CACA,OAAO,KAAK,UAAU,CAAK,GAAK,OAAO,CAAK,CAChD,MAAQ,CACJ,OAAO,OAAO,CAAK,CACvB,CACJ,CAQA,SAAS,EAAW,EAA0B,CAC1C,IAAM,EAAkB,CAAC,EACnB,EAAO,IAAI,IAAa,CAAC,CAAK,CAAC,EACjC,EAAmB,EAAY,CAAK,EAAI,EAAM,MAAQ,IAAA,GAC1D,KAAO,GAAqC,MAAM,CAC9C,GAAI,EAAK,IAAI,CAAO,EAAG,CACnB,EAAM,KAAK,uBAAuB,EAClC,KACJ,CACA,GAAI,EAAM,SAAW,EAAiB,CAClC,EAAM,KAAK,gBAAgB,EAC3B,KACJ,CACA,EAAK,IAAI,CAAO,EAChB,EAAM,KAAK,cAAc,EAAS,CAAO,GAAG,EAC5C,EAAU,EAAY,CAAO,EAAI,EAAQ,MAAQ,IAAA,EACrD,CACA,OAAO,CACX,CAQA,SAAS,EAAY,EAA6D,CAC9E,GAAI,CAAC,GAAW,OAAO,KAAK,CAAO,CAAC,CAAC,SAAW,EAAG,OAAO,KAC1D,GAAI,CACA,MAAO,YAAY,KAAK,UAAU,CAAO,GAC7C,MAAQ,CACJ,MAAO,2BACX,CACJ,CAmBA,SAAgB,EACZ,EACA,EACmB,CACnB,IAAM,EAAkB,CAAC,EAAS,CAAK,EAAG,GAAG,EAAW,CAAK,CAAC,EACxD,EAAM,EAAY,CAAO,EAG/B,OAFI,GAAK,EAAM,KAAK,CAAG,EACnB,EAAY,CAAK,GAAK,OAAO,EAAM,OAAU,UAAU,EAAM,KAAK,EAAM,KAAK,EAC1E,CAAE,KAAM,EAAO,CAAK,EAAG,QAAS,EAAM,KAAK;CAAI,CAAE,CAC5D"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
function e(e) {
|
|
2
|
+
return e instanceof Error || typeof e == "object" && !!e && typeof e.message == "string";
|
|
3
|
+
}
|
|
4
|
+
function t(e) {
|
|
5
|
+
if (e instanceof Error && e.name) return e.name;
|
|
6
|
+
if (typeof e == "object" && e && "name" in e) {
|
|
7
|
+
let t = e.name;
|
|
8
|
+
if (typeof t == "string" && t) return t;
|
|
9
|
+
}
|
|
10
|
+
return "Error";
|
|
11
|
+
}
|
|
12
|
+
function n(n) {
|
|
13
|
+
if (e(n)) return `${t(n)}: ${n.message}`;
|
|
14
|
+
if (typeof n == "string") return n;
|
|
15
|
+
try {
|
|
16
|
+
return JSON.stringify(n) ?? String(n);
|
|
17
|
+
} catch {
|
|
18
|
+
return String(n);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function r(t) {
|
|
22
|
+
let r = [], i = /* @__PURE__ */ new Set([t]), a = e(t) ? t.cause : void 0;
|
|
23
|
+
for (; a != null;) {
|
|
24
|
+
if (i.has(a)) {
|
|
25
|
+
r.push("caused by: [circular]");
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
if (r.length === 5) {
|
|
29
|
+
r.push("caused by: […]");
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
i.add(a), r.push(`caused by: ${n(a)}`), a = e(a) ? a.cause : void 0;
|
|
33
|
+
}
|
|
34
|
+
return r;
|
|
35
|
+
}
|
|
36
|
+
function i(e) {
|
|
37
|
+
if (!e || Object.keys(e).length === 0) return null;
|
|
38
|
+
try {
|
|
39
|
+
return `context: ${JSON.stringify(e)}`;
|
|
40
|
+
} catch {
|
|
41
|
+
return "context: [unserializable]";
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function a(a, o) {
|
|
45
|
+
let s = [n(a), ...r(a)], c = i(o);
|
|
46
|
+
return c && s.push(c), e(a) && typeof a.stack == "string" && s.push(a.stack), {
|
|
47
|
+
code: t(a),
|
|
48
|
+
message: s.join("\n")
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//#endregion
|
|
52
|
+
export { a as describeAppError };
|
|
53
|
+
|
|
54
|
+
//# sourceMappingURL=describe-app-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe-app-error.js","names":[],"sources":["../../src/telemetry/describe-app-error.ts"],"sourcesContent":["/** How deep the `cause` chain is followed before the rest is elided. */\nconst MAX_CAUSE_DEPTH = 5;\n\n/**\n * The `code` and `message` a thrown value becomes on the wire.\n */\nexport interface AppErrorDescription {\n /** The error's `name` — `\"UnreadableFileError\"`, `\"TypeError\"` — or `\"Error\"`. */\n code: string;\n /** Header, cause chain, context and stack, in that order. */\n message: string;\n}\n\n/** The shape every thrown error shares, whichever realm built it. */\ninterface ErrorLike {\n name?: unknown;\n message: string;\n stack?: unknown;\n cause?: unknown;\n}\n\n/**\n * Whether a value carries an error's `message`, `instanceof` or not.\n *\n * `instanceof Error` is not enough: a `DOMException` — the `NotReadableError`\n * a picker raises for a file that only lives in the cloud — fails it in jsdom\n * and across realms, and was being rendered as `{}`, losing exactly the cause\n * a field report exists to carry.\n *\n * @param value - The thrown value.\n * @returns `true` for anything with a string `message`.\n */\nfunction isErrorLike(value: unknown): value is ErrorLike {\n return (\n value instanceof Error ||\n (typeof value === \"object\" &&\n value !== null &&\n typeof (value as { message?: unknown }).message === \"string\")\n );\n}\n\n/**\n * The identifier a thrown value reports as, including a `DOMException`, which\n * is not always an `Error` instance across realms.\n *\n * @param value - The thrown value.\n * @returns Its `name`, or `\"Error\"`.\n */\nfunction nameOf(value: unknown): string {\n if (value instanceof Error && value.name) return value.name;\n if (typeof value === \"object\" && value !== null && \"name\" in value) {\n const name = (value as { name: unknown }).name;\n if (typeof name === \"string\" && name) return name;\n }\n return \"Error\";\n}\n\n/**\n * One line naming the value: `Name: message` for an error.\n *\n * @param value - The thrown value or a cause.\n * @returns The line.\n */\nfunction headline(value: unknown): string {\n if (isErrorLike(value)) return `${nameOf(value)}: ${value.message}`;\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\n/**\n * Follow `error.cause` into one line per link, bounded and cycle-safe.\n *\n * @param error - The top-level error.\n * @returns `caused by: …` lines, outermost first.\n */\nfunction causeLines(error: unknown): string[] {\n const lines: string[] = [];\n const seen = new Set<unknown>([error]);\n let current: unknown = isErrorLike(error) ? error.cause : undefined;\n while (current !== undefined && current !== null) {\n if (seen.has(current)) {\n lines.push(\"caused by: [circular]\");\n break;\n }\n if (lines.length === MAX_CAUSE_DEPTH) {\n lines.push(\"caused by: […]\");\n break;\n }\n seen.add(current);\n lines.push(`caused by: ${headline(current)}`);\n current = isErrorLike(current) ? current.cause : undefined;\n }\n return lines;\n}\n\n/**\n * Render the caller's context as one JSON line.\n *\n * @param context - Extra facts, or nothing.\n * @returns The line, or `null` when there is no context.\n */\nfunction contextLine(context: Record<string, unknown> | undefined): string | null {\n if (!context || Object.keys(context).length === 0) return null;\n try {\n return `context: ${JSON.stringify(context)}`;\n } catch {\n return \"context: [unserializable]\";\n }\n}\n\n/**\n * Turn any thrown value into the `code` + `message` pair the backend stores.\n *\n * The message is ordered by how much each part is worth when the backend cuts\n * it at 4000 characters: the headline, then the **`cause` chain** — where the\n * real failure usually is (`UnreadableFileError` caused by `NotReadableError`)\n * — then the caller's context, and the stack last, since it is the longest and\n * the first thing worth losing.\n *\n * @example\n * describeAppError(new Error(\"boom\", { cause: new TypeError(\"x\") }), { step: \"crop\" });\n * // { code: \"Error\", message: \"Error: boom\\ncaused by: TypeError: x\\ncontext: {\\\"step\\\":\\\"crop\\\"}\\n…\" }\n *\n * @param error - Whatever was thrown — an `Error`, a `DOMException`, a string.\n * @param context - Extra facts to keep with it (file size, MIME, step).\n * @returns The wire `code` and `message`.\n */\nexport function describeAppError(\n error: unknown,\n context?: Record<string, unknown>,\n): AppErrorDescription {\n const parts: string[] = [headline(error), ...causeLines(error)];\n const ctx = contextLine(context);\n if (ctx) parts.push(ctx);\n if (isErrorLike(error) && typeof error.stack === \"string\") parts.push(error.stack);\n return { code: nameOf(error), message: parts.join(\"\\n\") };\n}\n"],"mappings":"AAgCA,SAAS,EAAY,GAAoC;CACrD,OACI,aAAiB,SAChB,OAAO,KAAU,cACd,KACA,OAAQ,EAAgC,WAAY;AAEhE;AASA,SAAS,EAAO,GAAwB;CACpC,IAAI,aAAiB,SAAS,EAAM,MAAM,OAAO,EAAM;CACvD,IAAI,OAAO,KAAU,YAAY,KAAkB,UAAU,GAAO;EAChE,IAAM,IAAQ,EAA4B;EAC1C,IAAI,OAAO,KAAS,YAAY,GAAM,OAAO;CACjD;CACA,OAAO;AACX;AAQA,SAAS,EAAS,GAAwB;CACtC,IAAI,EAAY,CAAK,GAAG,OAAO,GAAG,EAAO,CAAK,EAAE,IAAI,EAAM;CAC1D,IAAI,OAAO,KAAU,UAAU,OAAO;CACtC,IAAI;EACA,OAAO,KAAK,UAAU,CAAK,KAAK,OAAO,CAAK;CAChD,QAAQ;EACJ,OAAO,OAAO,CAAK;CACvB;AACJ;AAQA,SAAS,EAAW,GAA0B;CAC1C,IAAM,IAAkB,CAAC,GACnB,oBAAO,IAAI,IAAa,CAAC,CAAK,CAAC,GACjC,IAAmB,EAAY,CAAK,IAAI,EAAM,QAAQ,KAAA;CAC1D,OAAO,KAAqC,OAAM;EAC9C,IAAI,EAAK,IAAI,CAAO,GAAG;GACnB,EAAM,KAAK,uBAAuB;GAClC;EACJ;EACA,IAAI,EAAM,WAAW,GAAiB;GAClC,EAAM,KAAK,gBAAgB;GAC3B;EACJ;EAGA,AAFA,EAAK,IAAI,CAAO,GAChB,EAAM,KAAK,cAAc,EAAS,CAAO,GAAG,GAC5C,IAAU,EAAY,CAAO,IAAI,EAAQ,QAAQ,KAAA;CACrD;CACA,OAAO;AACX;AAQA,SAAS,EAAY,GAA6D;CAC9E,IAAI,CAAC,KAAW,OAAO,KAAK,CAAO,CAAC,CAAC,WAAW,GAAG,OAAO;CAC1D,IAAI;EACA,OAAO,YAAY,KAAK,UAAU,CAAO;CAC7C,QAAQ;EACJ,OAAO;CACX;AACJ;AAmBA,SAAgB,EACZ,GACA,GACmB;CACnB,IAAM,IAAkB,CAAC,EAAS,CAAK,GAAG,GAAG,EAAW,CAAK,CAAC,GACxD,IAAM,EAAY,CAAO;CAG/B,OAFI,KAAK,EAAM,KAAK,CAAG,GACnB,EAAY,CAAK,KAAK,OAAO,EAAM,SAAU,YAAU,EAAM,KAAK,EAAM,KAAK,GAC1E;EAAE,MAAM,EAAO,CAAK;EAAG,SAAS,EAAM,KAAK,IAAI;CAAE;AAC5D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});/* empty css */const ee=require("./utils/cn.cjs"),te=require("./components/Accordion/Accordion.cjs"),ne=require("./components/Alert/Alert.cjs"),re=require("./utils/dev-mode.cjs"),ie=require("./components/AppBar/AppBar.cjs"),ae=require("./hooks/use-breakpoint.cjs"),oe=require("./components/AppShell/AppShell.cjs"),se=require("./components/AspectRatio/AspectRatio.cjs"),ce=require("./components/Avatar/Avatar.cjs"),le=require("./components/AvatarGroup/AvatarGroup.cjs"),ue=require("./components/Badge/Badge.cjs"),de=require("./components/Banner/Banner.cjs"),fe=require("./components/BottomNavigation/BottomNavigation.cjs"),pe=require("./hooks/use-focus-trap.cjs"),me=require("./components/BottomSheet/BottomSheet.cjs"),he=require("./components/Breadcrumbs/Breadcrumbs.cjs"),ge=require("./components/Button/Button.cjs"),_e=require("./components/Card/Card.cjs"),ve=require("./components/Center/Center.cjs"),ye=require("./components/Checkbox/Checkbox.cjs"),be=require("./components/ChipInput/ChipInput.cjs"),xe=require("./components/Portal/Portal.cjs"),Se=require("./components/Combobox/Combobox.cjs"),Ce=require("./components/Modal/Modal.cjs"),we=require("./components/ConfirmDialog/ConfirmDialog.cjs"),Te=require("./components/Input/Input.cjs"),Ee=require("./components/DatePicker/DatePicker.cjs"),De=require("./components/Divider/Divider.cjs"),Oe=require("./components/Drawer/Drawer.cjs"),ke=require("./components/DropdownMenu/DropdownMenu.cjs"),Ae=require("./components/Dropzone/Dropzone.cjs"),je=require("./components/EmptyState/EmptyState.cjs"),Me=require("./components/ErrorState/ErrorState.cjs"),Ne=require("./components/FileUpload/FileUpload.cjs"),e=require("./components/Form/Form.cjs"),t=require("./components/Layout/Layout.cjs"),n=require("./hooks/pwa-env.cjs"),Pe=require("./hooks/use-install-prompt.cjs"),Fe=require("./components/InstallButton/install-hints.cjs"),Ie=require("./components/InstallBanner/InstallBanner.cjs"),Le=require("./components/InstallButton/InstallButton.cjs"),Re=require("./hooks/use-debounce.cjs"),ze=require("./hooks/use-pagination.cjs"),Be=require("./hooks/use-client-filter.cjs"),Ve=require("./hooks/use-deep-memo.cjs"),He=require("./hooks/use-latest-ref.cjs"),Ue=require("./hooks/use-draft-filters.cjs"),We=require("./hooks/use-media-query.cjs"),Ge=require("./hooks/use-event-listener.cjs"),Ke=require("./hooks/use-local-storage.cjs"),qe=require("./hooks/use-toggle.cjs"),Je=require("./hooks/use-async.cjs"),Ye=require("./hooks/use-online.cjs"),Xe=require("./hooks/use-document-visibility.cjs"),Ze=require("./hooks/use-intersection-observer.cjs"),Qe=require("./hooks/use-resize-observer.cjs"),$e=require("./hooks/use-clipboard.cjs"),et=require("./hooks/use-keyboard-shortcut.cjs"),tt=require("./hooks/use-before-install-prompt.cjs"),nt=require("./hooks/use-idle.cjs"),rt=require("./hooks/use-fullscreen.cjs"),r=require("./hooks/use-push-to-talk.cjs"),it=require("./hooks/use-geolocation.cjs"),at=require("./hooks/use-scroll-lock.cjs"),i=require("./hooks/use-announce.cjs"),ot=require("./hooks/use-stable-callback.cjs"),st=require("./hooks/use-previous.cjs"),ct=require("./hooks/use-interval.cjs"),lt=require("./hooks/use-timeout.cjs"),ut=require("./hooks/use-throttle.cjs"),dt=require("./hooks/use-window-size.cjs"),ft=require("./hooks/use-hover.cjs"),pt=require("./hooks/use-long-press.cjs"),mt=require("./hooks/use-disclosure.cjs"),ht=require("./hooks/use-list-state.cjs"),gt=require("./hooks/use-counter.cjs"),_t=require("./hooks/use-countdown.cjs"),vt=require("./hooks/use-typewriter.cjs"),yt=require("./hooks/use-document-title.cjs"),bt=require("./hooks/use-favicon.cjs"),xt=require("./hooks/use-map.cjs"),St=require("./hooks/use-set.cjs"),Ct=require("./hooks/use-queue.cjs"),wt=require("./hooks/use-click-outside.cjs"),Tt=require("./hooks/use-is-first-render.cjs"),Et=require("./hooks/use-object-url.cjs"),Dt=require("./hooks/use-long-press-handlers.cjs"),a=require("./sw/register-service-worker.cjs"),Ot=require("./hooks/use-service-worker-update.cjs"),o=require("./hooks/use-storage-estimate.cjs"),kt=require("./hooks/use-sortable.cjs"),At=require("./hooks/use-scroll-overflow.cjs"),jt=require("./hooks/use-media-permission.cjs"),Mt=require("./hooks/use-media-devices.cjs"),Nt=require("./components/OfflineIndicator/OfflineIndicator.cjs"),Pt=require("./offline/use-offline-sync.cjs"),Ft=require("./components/VisuallyHidden/VisuallyHidden.cjs"),It=require("./components/SyncStatusBadge/SyncStatusBadge.cjs"),Lt=require("./components/UpdatePrompt/UpdatePrompt.cjs"),Rt=require("./components/Kanban/Kanban.cjs"),zt=require("./components/Kbd/Kbd.cjs"),Bt=require("./components/ModalsManager/ModalsManager.cjs"),Vt=require("./components/Navbar/Navbar.cjs"),Ht=require("./components/NProgress/NProgress.cjs"),Ut=require("./components/Page/Page.cjs"),Wt=require("./components/Pagination/Pagination.cjs"),Gt=require("./components/PasswordInput/PasswordInput.cjs"),Kt=require("./components/PinInput/PinInput.cjs"),qt=require("./components/Popover/Popover.cjs"),Jt=require("./components/Progress/Progress.cjs"),Yt=require("./components/Radio/Radio.cjs"),Xt=require("./components/RangeSlider/RangeSlider.cjs"),Zt=require("./components/RatingStars/RatingStars.cjs"),Qt=require("./components/Responsive/Responsive.cjs"),$t=require("./components/SafeArea/SafeArea.cjs"),en=require("./components/SearchBar/SearchBar.cjs"),tn=require("./components/SegmentedControl/SegmentedControl.cjs"),nn=require("./components/Select/Select.cjs"),s=require("./components/Select/options.cjs"),rn=require("./components/Sidebar/active-nav-key.cjs"),an=require("./components/Sidebar/Sidebar.cjs"),on=require("./components/Skeleton/Skeleton.cjs"),sn=require("./components/Spacer/Spacer.cjs"),cn=require("./components/Spinner/Spinner.cjs"),ln=require("./components/Stat/Stat.cjs"),un=require("./components/Stepper/Stepper.cjs"),dn=require("./utils/absent.cjs"),c=require("./utils/numbers.cjs"),fn=require("./components/StepperInput/StepperInput.cjs"),pn=require("./components/Switch/Switch.cjs"),mn=require("./components/Tag/Tag.cjs"),hn=require("./components/Table/Table.cjs"),gn=require("./components/Tabs/Tabs.cjs"),_n=require("./components/Textarea/Textarea.cjs"),vn=require("./components/Timeline/Timeline.cjs"),yn=require("./components/Tooltip/Tooltip.cjs"),bn=require("./components/Toast/ToastProvider.cjs"),xn=require("./components/ImageCropper/ImageCropper.cjs"),Sn=require("./components/Sparkline/Sparkline.cjs"),Cn=require("./components/Scheduler/Scheduler.cjs"),wn=require("./utils/relative-time.cjs"),Tn=require("./components/NotificationCenter/NotificationCenter.cjs"),En=require("./components/NotificationCenter/use-notification-inbox.cjs"),Dn=require("./components/VideoPlayer/playback-rates.cjs"),On=require("./components/VideoPlayer/VideoPlayer.cjs"),kn=require("./components/VirtualList/VirtualList.cjs"),An=require("./utils/compare-values.cjs"),jn=require("./components/VirtualTable/VirtualTable.cjs"),l=require("./components/QRCode/qr-encode.cjs"),Mn=require("./components/QRCode/QRCode.cjs"),Nn=require("./components/CopyButton/CopyButton.cjs"),Pn=require("./components/CodeBlock/CodeBlock.cjs"),Fn=require("./components/RelativeTime/RelativeTime.cjs"),In=require("./components/Money/Money.cjs"),Ln=require("./components/TreeView/TreeView.cjs"),Rn=require("./components/TruncateText/TruncateText.cjs"),zn=require("./components/ClickOutside/ClickOutside.cjs"),Bn=require("./components/ConditionalWrapper/ConditionalWrapper.cjs"),Vn=require("./components/For/For.cjs"),Hn=require("./components/ErrorText/ErrorText.cjs"),Un=require("./components/Image/Image.cjs"),Wn=require("./components/DataList/DataList.cjs"),Gn=require("./components/DescriptionList/DescriptionList.cjs"),Kn=require("./components/Toggle/Toggle.cjs"),qn=require("./components/ToggleGroup/ToggleGroup.cjs"),Jn=require("./components/Label/Label.cjs"),Yn=require("./components/Collapsible/Collapsible.cjs"),Xn=require("./components/ContextMenu/ContextMenu.cjs"),Zn=require("./components/HoverCard/HoverCard.cjs"),Qn=require("./components/Command/Command.cjs"),$n=require("./components/ScrollArea/ScrollArea.cjs"),er=require("./components/Resizable/Resizable.cjs"),tr=require("./components/Calendar/Calendar.cjs"),nr=require("./components/Slider/Slider.cjs"),rr=require("./components/MultiSelect/MultiSelect.cjs"),ir=require("./components/DateRangePicker/DateRangePicker.cjs"),ar=require("./components/NavigationMenu/NavigationMenu.cjs"),or=require("./components/Menubar/Menubar.cjs"),sr=require("./components/Carousel/Carousel.cjs"),cr=require("./components/DataTable/DataTable.cjs"),lr=require("./components/ListTile/ListTile.cjs"),ur=require("./components/FloatingActionButton/FloatingActionButton.cjs"),dr=require("./components/NavigationRail/NavigationRail.cjs"),fr=require("./components/TimePicker/TimePicker.cjs"),pr=require("./components/RefreshIndicator/RefreshIndicator.cjs"),mr=require("./components/Wizard/Wizard.cjs"),hr=require("./components/Lightbox/Lightbox.cjs"),gr=require("./components/SignaturePad/SignaturePad.cjs"),u=require("./components/Chat/chat-receipt.cjs"),_r=require("./components/Chat/ChatBubble.cjs"),vr=require("./components/Chat/ChatComposer.cjs"),yr=require("./components/Chat/Chat.cjs"),br=require("./audio/audio-output.cjs"),xr=require("./components/AudioPlayer/AudioPlayer.cjs"),Sr=require("./capture/media-recorder.cjs"),d=require("./audio/audio-recorder.cjs"),Cr=require("./audio/level-meter.cjs"),wr=require("./audio/use-audio-recorder.cjs"),Tr=require("./audio/media-access.cjs"),Er=require("./audio/use-microphone.cjs"),Dr=require("./audio/wav.cjs"),Or=require("./components/AudioRecorder/AudioRecorder.cjs"),f=require("./capture/barcode.cjs"),kr=require("./capture/use-torch.cjs"),Ar=require("./capture/use-barcode-scanner.cjs"),jr=require("./components/BarcodeScanner/BarcodeScanner.cjs"),p=require("./components/AIChat/ai-chat-turns.cjs"),Mr=require("./components/AIChat/AIChatComposer.cjs"),Nr=require("./components/Markdown/Markdown.cjs"),Pr=require("./components/AIChat/AIChatTurn.cjs"),Fr=require("./components/AIChat/AIChat.cjs"),Ir=require("./components/Transfer/Transfer.cjs"),Lr=require("./components/Masonry/Masonry.cjs"),Rr=require("./components/Tour/Tour.cjs"),zr=require("./components/BarList/bar-list-model.cjs"),Br=require("./components/BarList/BarList.cjs"),m=require("./components/FilterBar/filter-model.cjs"),Vr=require("./components/FilterBar/FilterBar.cjs"),h=require("./utils/format.cjs"),Hr=require("./components/FilterBar/filter-apply.cjs"),Ur=require("./components/FilterBar/filter-query.cjs"),Wr=require("./components/FilterPanel/FilterPanel.cjs"),Gr=require("./utils/storage.cjs"),g=require("./utils/compressed-storage.cjs"),_=require("./utils/strings.cjs"),v=require("./utils/arrays.cjs"),y=require("./utils/objects.cjs"),b=require("./utils/guards.cjs"),x=require("./utils/functions.cjs"),Kr=require("./utils/promises.cjs"),qr=require("./utils/ids.cjs"),Jr=require("./utils/xlsx.cjs"),Yr=require("./share/share.cjs"),Xr=require("./share/share-or-download.cjs"),Zr=require("./utils/csv.cjs"),Qr=require("./http/build-url.cjs"),$r=require("./http/credential-scope.cjs"),S=require("./http/csrf.cjs"),C=require("./http/errors.cjs"),ei=require("./http/retry.cjs"),ti=require("./http/api-client.cjs"),w=require("./http/describe-api-error.cjs"),ni=require("./i18n/create-i18n.cjs"),T=require("./i18n/I18nProvider.cjs"),ri=require("./http/use-describe-api-error.cjs"),ii=require("./http/parse-response.cjs"),ai=require("./http/upload-with-progress.cjs"),oi=require("./http/idempotency.cjs"),E=require("./http/resumable-upload.cjs"),si=require("./http/use-poll.cjs"),ci=require("./auth/create-auth-store.cjs"),li=require("./auth/AuthGuard.cjs"),ui=require("./auth/jwt.cjs"),di=require("./auth/lazy-with-retry.cjs"),fi=require("./auth/refresh-queue.cjs"),D=require("./auth/passkey.cjs"),O=require("./auth/use-passkey.cjs"),pi=require("./auth/create-tempest-auth.cjs"),mi=require("./access/access-control-context.cjs"),hi=require("./access/use-can.cjs"),gi=require("./access/Can.cjs"),_i=require("./access/create-role-access-control.cjs"),vi=require("./access/permissions-from-token.cjs"),yi=require("./oauth/GoogleSignIn.cjs"),bi=require("./oauth/use-oauth-callback.cjs"),k=require("./query/constants.cjs"),xi=require("./query/create-query-keys.cjs"),Si=require("./query/retry-policy.cjs"),Ci=require("./query/QueryProvider.cjs"),A=require("./query/pagination.cjs"),wi=require("./query/use-paginated-query.cjs"),Ti=require("./query/use-cursor-query.cjs"),Ei=require("./query/use-offline-mutation.cjs"),j=require("./query/optimistic.cjs"),Di=require("./offline/create-offline-store.cjs"),Oi=require("./query/offline-persistence.cjs"),ki=require("./data/create-data-provider.cjs"),M=require("./data/data-provider-context.cjs"),N=require("./data/use-resource.cjs"),Ai=require("./router/RouteGuard.cjs"),ji=require("./router/AppRouter.cjs"),Mi=require("./store/create-store.cjs"),Ni=require("./store/create-selectors.cjs"),Pi=require("./theme/ThemeProvider.cjs"),Fi=require("./error-boundary/ErrorBoundary.cjs"),Ii=require("./app/AppProviders.cjs"),Li=require("./sse/create-event-stream.cjs"),Ri=require("./sse/use-event-stream.cjs"),zi=require("./push/utils.cjs"),P=require("./push/web-push-client.cjs"),Bi=require("./push/use-push-subscription.cjs"),F=require("./sw/create-push-handler.cjs"),I=require("./sw/cache.cjs"),Vi=require("./sw/background-sync.cjs"),Hi=require("./sw/periodic-sync.cjs"),L=require("./sw/cache-inspect.cjs"),R=require("./audio/audio-player.cjs"),Ui=require("./audio/use-audio.cjs"),Wi=require("./audio/sfx-pool.cjs"),Gi=require("./audio/use-sfx-pool.cjs"),Ki=require("./audio/audio-bus.cjs"),qi=require("./audio/use-audio-bus.cjs"),z=require("./audio/voice-chain.cjs"),Ji=require("./audio/noise-floor.cjs"),Yi=require("./audio/voice-activity.cjs"),B=require("./capture/video-recorder.cjs"),Xi=require("./capture/use-video-recorder.cjs"),Zi=require("./capture/use-screen-capture.cjs"),Qi=require("./capture/use-speech-recognition.cjs"),$i=require("./offline/create-offline-database.cjs"),ea=require("./offline/create-offline-sync.cjs"),ta=require("./offline/conflict.cjs"),na=require("./error-boundary/use-error-handler.cjs"),ra=require("./forms/FormField.cjs"),ia=require("./forms/validate-form.cjs"),aa=require("./forms/zod-resolver.cjs"),oa=require("./forms/use-zod-form.cjs"),V=require("./forms/br-validators.cjs"),H=require("./forms/masked-inputs.cjs"),sa=require("./forms/use-viacep.cjs"),ca=require("./ws/resilience.cjs"),la=require("./ws/create-web-socket.cjs"),ua=require("./ws/use-web-socket.cjs"),da=require("./webrtc/opus-sdp.cjs"),fa=require("./webrtc/sender-bitrate.cjs"),U=require("./webrtc/link-stats.cjs"),pa=require("./webrtc/use-link-stats.cjs"),ma=require("./webrtc/mesh-quality.cjs"),ha=require("./webrtc/peer-mesh.cjs"),W=require("./geo/types.cjs"),G=require("./geo/distance.cjs"),K=require("./geo/estimate.cjs"),q=require("./geo/bounds.cjs"),J=require("./geo/projection.cjs"),ga=require("./geo/routing.cjs"),_a=require("./geo/create-position-tracker.cjs"),va=require("./geo/use-position-tracker.cjs"),ya=require("./geo/TrajectoryMap.cjs"),ba=require("./theme/apply-theme.cjs"),Y=require("./theme/color.cjs"),xa=require("./theme/create-theme.cjs"),Sa=require("./theme/theme-presets.cjs"),Ca=require("./theme/initial-theme.cjs"),wa=require("./logger/logger.cjs"),Ta=require("./telemetry/TelemetryProvider.cjs"),Ea=require("./telemetry/console-adapter.cjs"),Da=require("./telemetry/sentry-adapter.cjs"),Oa=require("./telemetry/posthog-adapter.cjs"),X=require("./feature-flags/FeatureFlagsProvider.cjs"),ka=require("./feature-flags/in-memory-adapter.cjs"),Aa=require("./feature-flags/growthbook-adapter.cjs"),ja=require("./feature-flags/launchdarkly-adapter.cjs"),Z=require("./charts/scales.cjs"),Ma=require("./perf/cache-size.cjs"),Na=require("./perf/device.cjs"),Pa=require("./perf/format.cjs"),Fa=require("./perf/profiler.cjs");let Q=require("react-router"),$=require("react-hook-form");exports.ABSENT_TEXT=dn.ABSENT_TEXT,exports.AIChat=Fr.AIChat,exports.AIChatComposer=Mr.AIChatComposer,exports.AIChatTurn=Pr.AIChatTurn,exports.ALL_BARCODE_FORMATS=f.ALL_BARCODE_FORMATS,exports.ALL_OPTION_VALUE=s.ALL_OPTION_VALUE,exports.API_ERROR_OFFLINE_KEY=w.API_ERROR_OFFLINE_KEY,exports.API_ERROR_VALIDATION_KEY=w.API_ERROR_VALIDATION_KEY,exports.AUDIO_MIME_CANDIDATES=d.AUDIO_MIME_CANDIDATES,exports.AccessControlProvider=mi.AccessControlProvider,exports.Accordion=te.Accordion,exports.Alert=ne.Alert,exports.AppBar=ie.AppBar,exports.AppProviders=Ii.AppProviders,exports.AppRouter=ji.AppRouter,exports.AppShell=oe.AppShell,exports.AspectRatio=se.AspectRatio,exports.AudioPlayer=xr.AudioPlayer,exports.AudioRecorder=Or.AudioRecorder,exports.AuthGuard=li.AuthGuard,exports.Avatar=ce.Avatar,exports.AvatarGroup=le.AvatarGroup,exports.BREAKPOINTS=ae.BREAKPOINTS,exports.Badge=ue.Badge,exports.Banner=de.Banner,exports.BarList=Br.BarList,exports.BarcodeScanner=jr.BarcodeScanner,exports.BottomNavigation=fe.BottomNavigation,exports.BottomSheet=me.BottomSheet,exports.Breadcrumbs=he.Breadcrumbs,Object.defineProperty(exports,"BrowserRouter",{enumerable:!0,get:function(){return Q.BrowserRouter}}),exports.Button=ge.Button,exports.CACHE_TIME=k.CACHE_TIME,exports.CEPInput=H.CEPInput,exports.CNPJInput=H.CNPJInput,exports.CPFInput=H.CPFInput,exports.Calendar=tr.Calendar,exports.Can=gi.Can,exports.Card=_e.Card,exports.Carousel=sr.Carousel,exports.Center=ve.Center,exports.Chat=yr.Chat,exports.ChatBubble=_r.ChatBubble,exports.ChatComposer=vr.ChatComposer,exports.Checkbox=ye.Checkbox,exports.ChipInput=be.ChipInput,exports.ClickOutside=zn.ClickOutside,exports.CodeBlock=Pn.CodeBlock,exports.Collapsible=Yn.Collapsible,exports.Combobox=Se.Combobox,exports.Command=Qn.Command,exports.ConditionalWrapper=Bn.ConditionalWrapper,exports.ConfirmDialog=we.ConfirmDialog,exports.Container=t.Container,exports.ContextMenu=Xn.ContextMenu,Object.defineProperty(exports,"Controller",{enumerable:!0,get:function(){return $.Controller}}),exports.CopyButton=Nn.CopyButton,exports.DEFAULT_API_ERROR_STRINGS=w.DEFAULT_API_ERROR_STRINGS,exports.DEFAULT_BARCODE_FORMATS=f.DEFAULT_BARCODE_FORMATS,exports.DEFAULT_CAR_SPEED_KMH=K.DEFAULT_CAR_SPEED_KMH,exports.DEFAULT_CHUNK_SIZE=E.DEFAULT_CHUNK_SIZE,exports.DEFAULT_CIRCUITY_FACTOR=K.DEFAULT_CIRCUITY_FACTOR,exports.DEFAULT_CSRF_COOKIE_NAME=S.DEFAULT_CSRF_COOKIE_NAME,exports.DEFAULT_CSRF_HEADER_NAME=S.DEFAULT_CSRF_HEADER_NAME,exports.DEFAULT_MAX_GAIN=Ki.DEFAULT_MAX_GAIN,exports.DEFAULT_MODE_DURATION_FACTORS=K.DEFAULT_MODE_DURATION_FACTORS,exports.DEFAULT_PLAYBACK_RATES=Dn.DEFAULT_PLAYBACK_RATES,exports.DEFAULT_PUB_KEY_CRED_PARAMS=D.DEFAULT_PUB_KEY_CRED_PARAMS,exports.DEFAULT_PUSH_TO_TALK_KEY=r.DEFAULT_PUSH_TO_TALK_KEY,exports.DEFAULT_VOICE_CHAIN=z.DEFAULT_VOICE_CHAIN,exports.DIVERGING_STEP_COUNT=Z.DIVERGING_STEP_COUNT,exports.DataList=Wn.DataList,exports.DataTable=cr.DataTable,exports.DatePicker=Ee.DatePicker,exports.DateRangePicker=ir.DateRangePicker,exports.DescriptionList=Gn.DescriptionList,exports.Divider=De.Divider,exports.Drawer=Oe.Drawer,exports.DropdownMenu=ke.DropdownMenu,exports.Dropzone=Ae.Dropzone,exports.EARTH_RADIUS_KM=G.EARTH_RADIUS_KM,exports.EmptyState=je.EmptyState,exports.ErrorBoundary=Fi.ErrorBoundary,exports.ErrorState=Me.ErrorState,exports.ErrorText=Hn.ErrorText,exports.FeatureFlagsProvider=X.FeatureFlagsProvider,exports.FileUpload=Ne.FileUpload,exports.FilterBar=Vr.FilterBar,exports.FilterPanel=Wr.FilterPanel,exports.FloatingActionButton=ur.FloatingActionButton,exports.For=Vn.For,exports.Form=e.Form,exports.FormActions=e.FormActions,exports.FormField=ra.FormField,Object.defineProperty(exports,"FormProvider",{enumerable:!0,get:function(){return $.FormProvider}}),exports.FormRow=e.FormRow,exports.FormSection=e.FormSection,exports.GoogleSignIn=yi.GoogleSignIn,exports.Grid=t.Grid,exports.HEARTBEAT_CLOSE_CODE=ca.HEARTBEAT_CLOSE_CODE,Object.defineProperty(exports,"HashRouter",{enumerable:!0,get:function(){return Q.HashRouter}}),exports.Hide=Qt.Hide,exports.HoverCard=Zn.HoverCard,exports.I18nProvider=T.I18nProvider,exports.Image=Un.Image,exports.ImageCropper=xn.ImageCropper,exports.Input=Te.Input,exports.InstallBanner=Ie.InstallBanner,exports.InstallButton=Le.InstallButton,exports.Kanban=Rt.Kanban,exports.Kbd=zt.Kbd,exports.Label=Jn.Label,exports.Lightbox=hr.Lightbox,Object.defineProperty(exports,"Link",{enumerable:!0,get:function(){return Q.Link}}),exports.ListTile=lr.ListTile,exports.Markdown=Nr.Markdown,exports.Masonry=Lr.Masonry,Object.defineProperty(exports,"MemoryRouter",{enumerable:!0,get:function(){return Q.MemoryRouter}}),exports.Menubar=or.Menubar,exports.Modal=Ce.Modal,exports.ModalsProvider=Bt.ModalsProvider,exports.Money=In.Money,exports.MoneyInput=H.MoneyInput,exports.MultiSelect=rr.MultiSelect,exports.NProgressBar=Ht.NProgressBar,Object.defineProperty(exports,"NavLink",{enumerable:!0,get:function(){return Q.NavLink}}),exports.Navbar=Vt.Navbar,Object.defineProperty(exports,"Navigate",{enumerable:!0,get:function(){return Q.Navigate}}),exports.NavigationMenu=ar.NavigationMenu,exports.NavigationRail=dr.NavigationRail,exports.NotificationCenter=Tn.NotificationCenter,exports.ORDINAL_START_STEP=Z.ORDINAL_START_STEP,exports.OfflineIndicator=Nt.OfflineIndicator,Object.defineProperty(exports,"Outlet",{enumerable:!0,get:function(){return Q.Outlet}}),exports.PUSH_TO_TALK_KEYS=r.PUSH_TO_TALK_KEYS,exports.Page=Ut.Page,exports.Pagination=Wt.Pagination,exports.PasskeyError=D.PasskeyError,exports.PasswordInput=Gt.PasswordInput,exports.PhoneInput=H.PhoneInput,exports.PinInput=Kt.PinInput,exports.Popover=qt.Popover,exports.Portal=xe.Portal,exports.Progress=Jt.Progress,exports.QRCapacityError=l.QRCapacityError,exports.QRCode=Mn.QRCode,exports.QueryProvider=Ci.QueryProvider,exports.REFETCH_TIME=k.REFETCH_TIME,exports.Radio=Yt.Radio,exports.RadioGroup=Yt.RadioGroup,exports.RangeSlider=Xt.RangeSlider,exports.RatingStars=Zt.RatingStars,exports.RefreshIndicator=pr.RefreshIndicator,exports.RelativeTime=Fn.RelativeTime,exports.Resizable=er.Resizable,Object.defineProperty(exports,"Route",{enumerable:!0,get:function(){return Q.Route}}),exports.RouteGuard=Ai.RouteGuard,Object.defineProperty(exports,"Routes",{enumerable:!0,get:function(){return Q.Routes}}),exports.SEQUENTIAL_STEP_COUNT=Z.SEQUENTIAL_STEP_COUNT,exports.STALE_TIME=k.STALE_TIME,exports.SafeArea=$t.SafeArea,exports.Scheduler=Cn.Scheduler,exports.ScrollArea=$n.ScrollArea,exports.SearchBar=en.SearchBar,exports.SegmentedControl=tn.SegmentedControl,exports.Select=nn.Select,exports.Show=Qt.Show,exports.Sidebar=an.Sidebar,exports.SignaturePad=gr.SignaturePad,exports.Skeleton=on.Skeleton,exports.Slider=nr.Slider,exports.Spacer=sn.Spacer,exports.Sparkline=Sn.Sparkline,exports.Spinner=cn.Spinner,exports.Stack=t.Stack,exports.Stat=ln.Stat,exports.Stepper=un.Stepper,exports.StepperInput=fn.StepperInput,exports.Switch=pn.Switch,exports.SyncStatusBadge=It.SyncStatusBadge,exports.Table=hn.Table,exports.Tabs=gn.Tabs,exports.Tag=mn.Tag,exports.TelemetryProvider=Ta.TelemetryProvider,exports.TempestApiError=C.TempestApiError,exports.TempestDataProvider=M.TempestDataProvider,exports.Textarea=_n.Textarea,exports.ThemeProvider=Pi.ThemeProvider,exports.TimePicker=fr.TimePicker,exports.Timeline=vn.Timeline,exports.ToastProvider=bn.ToastProvider,exports.Toggle=Kn.Toggle,exports.ToggleGroup=qn.ToggleGroup,exports.ToggleGroupItem=qn.ToggleGroupItem,exports.Tooltip=yn.Tooltip,exports.Tour=Rr.Tour,exports.TrajectoryMap=ya.TrajectoryMap,exports.Transfer=Ir.Transfer,exports.TreeView=Ln.TreeView,exports.TruncateText=Rn.TruncateText,exports.UpdatePrompt=Lt.UpdatePrompt,exports.VideoPlayer=On.VideoPlayer,exports.VirtualList=kn.VirtualList,exports.VirtualTable=jn.VirtualTable,exports.VisuallyHidden=Ft.VisuallyHidden,exports.WebPushClient=P.WebPushClient,exports.WebPushPermissionDeniedError=P.WebPushPermissionDeniedError,exports.WebPushUnsupportedError=P.WebPushUnsupportedError,exports.Wizard=mr.Wizard,exports.activeNavKey=rn.activeNavKey,exports.aiChatStrings=p.aiChatStrings,exports.announce=i.announce,exports.applyFilters=Hr.applyFilters,exports.applyKanbanMove=Rt.applyKanbanMove,exports.applyTheme=ba.applyTheme,exports.assertNever=b.assertNever,exports.base64UrlToBytes=D.base64UrlToBytes,exports.bearingDeg=G.bearingDeg,exports.blobToWav=Dr.blobToWav,exports.boundingBox=q.boundingBox,exports.boundsCenter=q.boundsCenter,exports.buildApiUrl=Qr.buildApiUrl,exports.buildBarListRows=zr.buildBarListRows,exports.buildOpenInChromeIntent=n.buildOpenInChromeIntent,exports.bytesToBase64Url=D.bytesToBase64Url,exports.cachedResponseBytes=Ma.cachedResponseBytes,exports.camelCase=_.camelCase,exports.capitalize=_.capitalize,exports.chunk=v.chunk,exports.clamp=c.clamp,exports.clampLatitude=W.clampLatitude,exports.classifyPasskeyError=D.classifyPasskeyError,exports.clearAnnouncer=i.clearAnnouncer,exports.clearCaches=L.clearCaches,exports.cn=ee.cn,exports.compareValues=An.compareValues,exports.compressToString=g.compressToString,exports.compressedStorage=g.compressedStorage,exports.compressedStorageCodec=g.compressedStorageCodec,exports.consoleSink=wa.consoleSink,exports.consoleTelemetryAdapter=Ea.consoleTelemetryAdapter,exports.contrastRatio=Y.contrastRatio,exports.createApiClient=ti.createApiClient,exports.createAudioBus=Ki.createAudioBus,exports.createAudioPlayer=R.createAudioPlayer,exports.createAudioRecorder=d.createAudioRecorder,exports.createAuthStore=ci.createAuthStore,exports.createBarcodeDetector=f.createBarcodeDetector,exports.createColorScale=Y.createColorScale,exports.createDataProvider=ki.createDataProvider,exports.createEventStream=Li.createEventStream,exports.createGrowthBookFeatureFlagsAdapter=Aa.createGrowthBookFeatureFlagsAdapter,exports.createI18n=ni.createI18n,exports.createInMemoryFlags=ka.createInMemoryFlags,exports.createInferenceProfiler=Fa.createInferenceProfiler,exports.createJsonStorage=Gr.createJsonStorage,exports.createLaunchDarklyFeatureFlagsAdapter=ja.createLaunchDarklyFeatureFlagsAdapter,exports.createLevelMeter=Cr.createLevelMeter,exports.createLinkStatsSampler=U.createLinkStatsSampler,exports.createLocalUploadStorage=E.createLocalUploadStorage,exports.createLogger=wa.createLogger,exports.createMediaRecorder=Sr.createMediaRecorder,exports.createOSRMBackend=ga.createOSRMBackend,exports.createOfflineDatabase=$i.createOfflineDatabase,exports.createOfflineStore=Di.createOfflineStore,exports.createOfflineSync=ea.createOfflineSync,exports.createPartialResponse=I.createPartialResponse,exports.createPasskeyClient=D.createPasskeyClient,exports.createPeerMesh=ha.createPeerMesh,exports.createPositionTracker=_a.createPositionTracker,exports.createPostHogTelemetryAdapter=Oa.createPostHogTelemetryAdapter,exports.createQueryKeys=xi.createQueryKeys,exports.createRefreshQueue=fi.createRefreshQueue,exports.createResumableUpload=E.createResumableUpload,exports.createRoleAccessControl=_i.createRoleAccessControl,exports.createSelectors=Ni.createSelectors,exports.createSentryTelemetryAdapter=Da.createSentryTelemetryAdapter,exports.createSfxPool=Wi.createSfxPool,exports.createStore=Mi.createStore,exports.createTempestAuth=pi.createTempestAuth,exports.createTheme=xa.createTheme,exports.createVideoRecorder=B.createVideoRecorder,exports.createVoiceChain=z.createVoiceChain,exports.createWebSocket=la.createWebSocket,exports.csrfHeaders=S.csrfHeaders,exports.debounce=x.debounce,exports.decodeJWT=ui.decodeJWT,exports.decompressFromString=g.decompressFromString,exports.deepMerge=y.deepMerge,exports.defaultInstallHint=Fe.defaultInstallHint,exports.defineRoutes=ji.defineRoutes,exports.describeApiError=w.describeApiError,exports.describeFilter=m.describeFilter,exports.divergingScale=Z.divergingScale,exports.downloadCsv=Zr.downloadCsv,exports.emptyOffsetPage=A.emptyOffsetPage,exports.encodeQR=l.encodeQR,exports.encodeWav=Dr.encodeWav,exports.estimatePasswordStrength=Gt.estimatePasswordStrength,exports.estimateStorage=o.estimateStorage,exports.estimateTravel=K.estimateTravel,exports.expandBounds=q.expandBounds,exports.filtersFromSearchParams=m.filtersFromSearchParams,exports.filtersToQueryParams=Ur.filtersToQueryParams,exports.filtersToSearchParams=m.filtersToSearchParams,exports.fitProjection=J.fitProjection,exports.formatBytes=c.formatBytes,exports.formatCEP=V.formatCEP,exports.formatCNPJ=V.formatCNPJ,exports.formatCPF=h.formatCPF,exports.formatCompactNumber=c.formatCompactNumber,exports.formatCurrency=h.formatCurrency,exports.formatDate=h.formatDate,exports.formatDateForInput=h.formatDateForInput,exports.formatDateTime=h.formatDateTime,exports.formatDateTimeForInput=h.formatDateTimeForInput,exports.formatDurationMs=Pa.formatDurationMs,exports.formatPercent=h.formatPercent,exports.formatPhone=h.formatPhone,exports.generateIdempotencyKey=oi.generateIdempotencyKey,exports.getInitialTheme=Ca.getInitialTheme,exports.getSupportedBarcodeFormats=f.getSupportedBarcodeFormats,exports.getThemePreset=Sa.getThemePreset,exports.groupBy=v.groupBy,exports.haversineKm=G.haversineKm,exports.hexToOklch=Y.hexToOklch,exports.hexToRgb=Y.hexToRgb,exports.hexToRgbaString=Y.hexToRgbaString,exports.higherVersionWins=ta.higherVersionWins,exports.inspectCaches=L.inspectCaches,exports.installBackgroundSync=Vi.installBackgroundSync,exports.installNotificationClickHandler=F.installNotificationClickHandler,exports.installPrecache=I.installPrecache,exports.installPushHandler=F.installPushHandler,exports.installRuntimeCache=I.installRuntimeCache,exports.installSkipWaitingListener=F.installSkipWaitingListener,exports.isAndroid=n.isAndroid,exports.isAndroidWithoutPromptApi=n.isAndroidWithoutPromptApi,exports.isApiError=C.isApiError,exports.isAudioOutputSelectionSupported=br.isAudioOutputSelectionSupported,exports.isAudioRecordingSupported=d.isAudioRecordingSupported,exports.isBarcodeDetectionSupported=f.isBarcodeDetectionSupported,exports.isConditionalMediationAvailable=D.isConditionalMediationAvailable,exports.isCoordinate=W.isCoordinate,exports.isCursorPage=A.isCursorPage,exports.isDefined=b.isDefined,exports.isEmpty=y.isEmpty,exports.isFullscreenSupported=rt.isFullscreenSupported,exports.isGenerating=p.isGenerating,exports.isIOS=n.isIOS,exports.isJWTExpired=ui.isJWTExpired,exports.isMediaCaptureSupported=Tr.isMediaCaptureSupported,exports.isNumber=b.isNumber,exports.isOffsetPage=A.isOffsetPage,exports.isPasskeySupported=D.isPasskeySupported,exports.isPlainObject=b.isPlainObject,exports.isPlatformAuthenticatorAvailable=D.isPlatformAuthenticatorAvailable,exports.isPushSupported=zi.isPushSupported,exports.isRejectionCloseCode=ca.isRejectionCloseCode,exports.isRetriableStatus=C.isRetriableStatus,exports.isScreenCaptureSupported=Zi.isScreenCaptureSupported,exports.isShareSupported=Yr.isShareSupported,exports.isSpeechRecognitionSupported=Qi.isSpeechRecognitionSupported,exports.isStandalone=n.isStandalone,exports.isString=b.isString,exports.isTrustedCredentialTarget=$r.isTrustedCredentialTarget,exports.isValidLatitude=W.isValidLatitude,exports.isValidLongitude=W.isValidLongitude,exports.isVideoRecordingSupported=B.isVideoRecordingSupported,exports.isVoiceChainIdle=z.isVoiceChainIdle,exports.kebabCase=_.kebabCase,exports.lastAssistantId=p.lastAssistantId,exports.lastWriteWins=ta.lastWriteWins,exports.lazyWithRetry=di.lazyWithRetry,exports.listQueryKey=N.listQueryKey,exports.matrixToPath=l.matrixToPath,exports.measureNoiseFloor=Ji.measureNoiseFloor,exports.memoizeOne=x.memoizeOne,exports.monitorVoiceActivity=Yi.monitorVoiceActivity,exports.monitorVoiceChain=z.monitorVoiceChain,exports.moveItem=kt.moveItem,exports.normalizeBarcode=f.normalizeBarcode,exports.normalizeLongitude=W.normalizeLongitude,exports.nprogress=Ht.nprogress,exports.oklchToHex=Y.oklchToHex,exports.omit=y.omit,exports.once=x.once,exports.oneQueryKey=N.oneQueryKey,exports.operatorsFor=m.operatorsFor,exports.parseResponse=ii.parseResponse,exports.pathLengthKm=G.pathLengthKm,exports.percentOf=c.percentOf,exports.permissionsFromToken=vi.permissionsFromToken,exports.persistQueryClientOffline=Oi.persistQueryClientOffline,exports.pick=y.pick,exports.pickAudioMimeType=d.pickAudioMimeType,exports.pickVideoMimeType=B.pickVideoMimeType,exports.playAudio=R.playAudio,exports.pluralize=_.pluralize,exports.projectMercator=J.projectMercator,exports.pushToTalkKeyLabel=r.pushToTalkKeyLabel,exports.randomId=qr.randomId,exports.range=v.range,exports.readAvailableOutgoingKbps=U.readAvailableOutgoingKbps,exports.readDeviceProfile=Na.readDeviceProfile,exports.readQualityLimitation=U.readQualityLimitation,exports.readRelayed=U.readRelayed,exports.readRoundTripMs=U.readRoundTripMs,exports.readThemeToken=ba.readThemeToken,exports.readableForeground=Y.readableForeground,exports.receiptLabel=u.receiptLabel,Object.defineProperty(exports,"redirect",{enumerable:!0,get:function(){return Q.redirect}}),exports.registerPeriodicSync=Hi.registerPeriodicSync,exports.registerServiceWorker=a.registerServiceWorker,exports.relativeLuminance=Y.relativeLuminance,exports.relativeTime=wn.relativeTime,exports.removeById=j.removeById,exports.requestPersistentStorage=o.requestPersistentStorage,exports.resolveDegradation=ma.resolveDegradation,exports.resolveReceiptState=u.resolveReceiptState,exports.retry=ei.retry,exports.rgbToHex=Y.rgbToHex,exports.roleLabel=p.roleLabel,exports.scaleForRoom=ma.scaleForRoom,exports.scaleSteps=Z.scaleSteps,exports.sequentialScale=Z.sequentialScale,exports.setAudioOutput=br.setAudioOutput,exports.setDevBuild=re.setDevBuild,exports.setSenderBitrate=fa.setSenderBitrate,exports.setTunedLocalDescription=da.setTunedLocalDescription,exports.share=Yr.share,exports.shareOrDownloadBlob=Xr.shareOrDownloadBlob,exports.shouldRetryQuery=Si.shouldRetryQuery,exports.skipWaiting=a.skipWaiting,exports.sleep=Kr.sleep,exports.slugify=_.slugify,exports.stopAudio=R.stopAudio,exports.storage=Gr.storage,exports.suggestGateThreshold=Ji.suggestGateThreshold,exports.tailSignature=p.tailSignature,exports.themeContrast=xa.themeContrast,exports.themeInitScript=Ca.themeInitScript,exports.themePresets=Sa.themePresets,exports.throttle=x.throttle,exports.toCsv=Zr.toCsv,exports.toOptions=s.toOptions,exports.toRadians=G.toRadians,exports.truncate=_.truncate,exports.tuneOpus=da.tuneOpus,exports.turnTime=p.turnTime,exports.uniqueBy=v.uniqueBy,exports.unmask=V.unmask,exports.unprojectMercator=J.unprojectMercator,exports.unregisterAllServiceWorkers=a.unregisterAllServiceWorkers,exports.uploadFingerprint=E.uploadFingerprint,exports.uploadWithProgress=ai.uploadWithProgress,exports.upsertById=j.upsertById,exports.urlBase64ToUint8Array=zi.urlBase64ToUint8Array,exports.useAccessControl=mi.useAccessControl,exports.useAnnounce=i.useAnnounce,exports.useAsync=Je.useAsync,exports.useAudio=Ui.useAudio,exports.useAudioBus=qi.useAudioBus,exports.useAudioRecorder=wr.useAudioRecorder,exports.useBarcodeScanner=Ar.useBarcodeScanner,exports.useBeforeInstallPrompt=tt.useBeforeInstallPrompt,exports.useBreakpoint=ae.useBreakpoint,exports.useCan=hi.useCan,exports.useClickOutside=wt.useClickOutside,exports.useClientFilter=Be.useClientFilter,exports.useClipboard=$e.useClipboard,exports.useCountdown=_t.useCountdown,exports.useCounter=gt.useCounter,exports.useCreate=N.useCreate,exports.useCursorQuery=Ti.useCursorQuery,exports.useDataProvider=M.useDataProvider,exports.useDebounce=Re.useDebounce,exports.useDeepMemo=Ve.useDeepMemo,exports.useDelete=N.useDelete,exports.useDescribeApiError=ri.useDescribeApiError,exports.useDisclosure=mt.useDisclosure,exports.useDocumentTitle=yt.useDocumentTitle,exports.useDocumentVisibility=Xe.useDocumentVisibility,exports.useDraftFilters=Ue.useDraftFilters,exports.useErrorHandler=na.useErrorHandler,exports.useEventListener=Ge.useEventListener,exports.useEventStream=Ri.useEventStream,exports.useFavicon=bt.useFavicon,exports.useFeatureFlag=X.useFeatureFlag,Object.defineProperty(exports,"useFieldArray",{enumerable:!0,get:function(){return $.useFieldArray}}),exports.useFlagValue=X.useFlagValue,exports.useFocusTrap=pe.useFocusTrap,Object.defineProperty(exports,"useForm",{enumerable:!0,get:function(){return $.useForm}}),Object.defineProperty(exports,"useFormContext",{enumerable:!0,get:function(){return $.useFormContext}}),Object.defineProperty(exports,"useFormState",{enumerable:!0,get:function(){return $.useFormState}}),exports.useFullscreen=rt.useFullscreen,exports.useGeolocation=it.useGeolocation,exports.useHover=ft.useHover,exports.useI18n=T.useI18n,exports.useIdle=nt.useIdle,exports.useInstallPrompt=Pe.useInstallPrompt,exports.useIntersectionObserver=Ze.useIntersectionObserver,exports.useInterval=ct.useInterval,exports.useIsFirstRender=Tt.useIsFirstRender,exports.useKeyboardShortcut=et.useKeyboardShortcut,exports.useLatestRef=He.useLatestRef,exports.useLinkStats=pa.useLinkStats,exports.useList=N.useList,exports.useListState=ht.useListState,exports.useLocalStorage=Ke.useLocalStorage,Object.defineProperty(exports,"useLocation",{enumerable:!0,get:function(){return Q.useLocation}}),exports.useLongPress=pt.useLongPress,exports.useLongPressHandlers=Dt.useLongPressHandlers,exports.useMap=xt.useMap,Object.defineProperty(exports,"useMatch",{enumerable:!0,get:function(){return Q.useMatch}}),exports.useMediaDevices=Mt.useMediaDevices,exports.useMediaPermission=jt.useMediaPermission,exports.useMediaQuery=We.useMediaQuery,exports.useMicrophone=Er.useMicrophone,exports.useModals=Bt.useModals,Object.defineProperty(exports,"useNavigate",{enumerable:!0,get:function(){return Q.useNavigate}}),exports.useNotificationInbox=En.useNotificationInbox,exports.useOAuthCallback=bi.useOAuthCallback,exports.useObjectUrl=Et.useObjectUrl,exports.useOfflineMutation=Ei.useOfflineMutation,exports.useOfflineSync=Pt.useOfflineSync,exports.useOne=N.useOne,exports.useOnline=Ye.useOnline,exports.useOptionalI18n=T.useOptionalI18n,exports.usePaginatedQuery=wi.usePaginatedQuery,exports.usePagination=ze.usePagination,Object.defineProperty(exports,"useParams",{enumerable:!0,get:function(){return Q.useParams}}),exports.usePasskeyCapabilities=O.usePasskeyCapabilities,exports.usePasskeyRegistration=O.usePasskeyRegistration,exports.usePasskeySignIn=O.usePasskeySignIn,exports.usePoll=si.usePoll,exports.usePositionTracker=va.usePositionTracker,exports.usePrevious=st.usePrevious,exports.usePushSubscription=Bi.usePushSubscription,exports.usePushToTalk=r.usePushToTalk,exports.useQueue=Ct.useQueue,exports.useResizeObserver=Qe.useResizeObserver,Object.defineProperty(exports,"useRouteError",{enumerable:!0,get:function(){return Q.useRouteError}}),exports.useScreenCapture=Zi.useScreenCapture,exports.useScrollLock=at.useScrollLock,exports.useScrollOverflow=At.useScrollOverflow,Object.defineProperty(exports,"useSearchParams",{enumerable:!0,get:function(){return Q.useSearchParams}}),exports.useServiceWorkerUpdate=Ot.useServiceWorkerUpdate,exports.useSet=St.useSet,exports.useSfxPool=Gi.useSfxPool,exports.useSortable=kt.useSortable,exports.useSpeechRecognition=Qi.useSpeechRecognition,exports.useStableCallback=ot.useStableCallback,exports.useStorageEstimate=o.useStorageEstimate,exports.useSyncStatus=Pt.useSyncStatus,exports.useTelemetry=Ta.useTelemetry,exports.useTheme=Pi.useTheme,exports.useThrottle=ut.useThrottle,exports.useTimeout=lt.useTimeout,exports.useToast=bn.useToast,exports.useToggle=qe.useToggle,exports.useTorch=kr.useTorch,exports.useTranslate=T.useTranslate,exports.useTypewriter=vt.useTypewriter,exports.useUpdate=N.useUpdate,exports.useViaCEP=sa.useViaCEP,exports.useVideoRecorder=Xi.useVideoRecorder,Object.defineProperty(exports,"useWatch",{enumerable:!0,get:function(){return $.useWatch}}),exports.useWebSocket=ua.useWebSocket,exports.useWindowSize=dt.useWindowSize,exports.useZodForm=oa.useZodForm,exports.validateCNPJ=V.validateCNPJ,exports.validateCPF=V.validateCPF,exports.validateForm=ia.validateForm,exports.visibleTurns=p.visibleTurns,exports.withAllOption=s.withAllOption,exports.withEmptyOption=s.withEmptyOption,exports.withTimeout=Kr.withTimeout,exports.writeXlsx=Jr.writeXlsx,exports.zodResolver=aa.zodResolver;
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});/* empty css */const ee=require("./utils/cn.cjs"),te=require("./components/Accordion/Accordion.cjs"),ne=require("./components/Alert/Alert.cjs"),re=require("./utils/dev-mode.cjs"),ie=require("./components/AppBar/AppBar.cjs"),ae=require("./hooks/use-breakpoint.cjs"),oe=require("./components/AppShell/AppShell.cjs"),se=require("./components/AspectRatio/AspectRatio.cjs"),ce=require("./components/Avatar/Avatar.cjs"),le=require("./components/AvatarGroup/AvatarGroup.cjs"),ue=require("./components/Badge/Badge.cjs"),de=require("./components/Banner/Banner.cjs"),fe=require("./components/BottomNavigation/BottomNavigation.cjs"),pe=require("./hooks/use-focus-trap.cjs"),me=require("./components/BottomSheet/BottomSheet.cjs"),he=require("./components/Breadcrumbs/Breadcrumbs.cjs"),ge=require("./components/Button/Button.cjs"),_e=require("./components/Card/Card.cjs"),ve=require("./components/Center/Center.cjs"),ye=require("./components/Checkbox/Checkbox.cjs"),be=require("./components/ChipInput/ChipInput.cjs"),xe=require("./components/Portal/Portal.cjs"),Se=require("./components/Combobox/Combobox.cjs"),Ce=require("./components/Modal/Modal.cjs"),we=require("./components/ConfirmDialog/ConfirmDialog.cjs"),Te=require("./components/Input/Input.cjs"),Ee=require("./components/DatePicker/DatePicker.cjs"),De=require("./components/Divider/Divider.cjs"),Oe=require("./components/Drawer/Drawer.cjs"),ke=require("./components/DropdownMenu/DropdownMenu.cjs"),Ae=require("./components/Dropzone/Dropzone.cjs"),je=require("./components/EmptyState/EmptyState.cjs"),Me=require("./components/ErrorState/ErrorState.cjs"),Ne=require("./components/FileUpload/FileUpload.cjs"),e=require("./components/Form/Form.cjs"),t=require("./components/Layout/Layout.cjs"),n=require("./hooks/pwa-env.cjs"),Pe=require("./hooks/use-install-prompt.cjs"),Fe=require("./components/InstallButton/install-hints.cjs"),Ie=require("./components/InstallBanner/InstallBanner.cjs"),Le=require("./components/InstallButton/InstallButton.cjs"),Re=require("./hooks/use-debounce.cjs"),ze=require("./hooks/use-pagination.cjs"),Be=require("./hooks/use-client-filter.cjs"),Ve=require("./hooks/use-deep-memo.cjs"),He=require("./hooks/use-latest-ref.cjs"),Ue=require("./hooks/use-draft-filters.cjs"),We=require("./hooks/use-media-query.cjs"),Ge=require("./hooks/use-event-listener.cjs"),Ke=require("./hooks/use-local-storage.cjs"),qe=require("./hooks/use-toggle.cjs"),Je=require("./hooks/use-async.cjs"),Ye=require("./hooks/use-online.cjs"),Xe=require("./hooks/use-document-visibility.cjs"),Ze=require("./hooks/use-intersection-observer.cjs"),Qe=require("./hooks/use-resize-observer.cjs"),$e=require("./hooks/use-clipboard.cjs"),et=require("./hooks/use-keyboard-shortcut.cjs"),tt=require("./hooks/use-before-install-prompt.cjs"),nt=require("./hooks/use-idle.cjs"),rt=require("./hooks/use-fullscreen.cjs"),r=require("./hooks/use-push-to-talk.cjs"),it=require("./hooks/use-geolocation.cjs"),at=require("./hooks/use-scroll-lock.cjs"),i=require("./hooks/use-announce.cjs"),ot=require("./hooks/use-stable-callback.cjs"),st=require("./hooks/use-previous.cjs"),ct=require("./hooks/use-interval.cjs"),lt=require("./hooks/use-timeout.cjs"),ut=require("./hooks/use-throttle.cjs"),dt=require("./hooks/use-window-size.cjs"),ft=require("./hooks/use-hover.cjs"),pt=require("./hooks/use-long-press.cjs"),mt=require("./hooks/use-disclosure.cjs"),ht=require("./hooks/use-list-state.cjs"),gt=require("./hooks/use-counter.cjs"),_t=require("./hooks/use-countdown.cjs"),vt=require("./hooks/use-typewriter.cjs"),yt=require("./hooks/use-document-title.cjs"),bt=require("./hooks/use-favicon.cjs"),xt=require("./hooks/use-map.cjs"),St=require("./hooks/use-set.cjs"),Ct=require("./hooks/use-queue.cjs"),wt=require("./hooks/use-click-outside.cjs"),Tt=require("./hooks/use-is-first-render.cjs"),Et=require("./hooks/use-object-url.cjs"),Dt=require("./hooks/use-long-press-handlers.cjs"),a=require("./sw/register-service-worker.cjs"),Ot=require("./hooks/use-service-worker-update.cjs"),o=require("./hooks/use-storage-estimate.cjs"),kt=require("./hooks/use-sortable.cjs"),At=require("./hooks/use-scroll-overflow.cjs"),jt=require("./hooks/use-media-permission.cjs"),Mt=require("./hooks/use-media-devices.cjs"),Nt=require("./components/OfflineIndicator/OfflineIndicator.cjs"),Pt=require("./offline/use-offline-sync.cjs"),Ft=require("./components/VisuallyHidden/VisuallyHidden.cjs"),It=require("./components/SyncStatusBadge/SyncStatusBadge.cjs"),Lt=require("./components/UpdatePrompt/UpdatePrompt.cjs"),Rt=require("./components/Kanban/Kanban.cjs"),zt=require("./components/Kbd/Kbd.cjs"),Bt=require("./components/ModalsManager/ModalsManager.cjs"),Vt=require("./components/Navbar/Navbar.cjs"),Ht=require("./components/NProgress/NProgress.cjs"),Ut=require("./components/Page/Page.cjs"),Wt=require("./components/Pagination/Pagination.cjs"),Gt=require("./components/PasswordInput/PasswordInput.cjs"),Kt=require("./components/PinInput/PinInput.cjs"),qt=require("./components/Popover/Popover.cjs"),Jt=require("./components/Progress/Progress.cjs"),Yt=require("./components/Radio/Radio.cjs"),Xt=require("./components/RangeSlider/RangeSlider.cjs"),Zt=require("./components/RatingStars/RatingStars.cjs"),Qt=require("./components/Responsive/Responsive.cjs"),$t=require("./components/SafeArea/SafeArea.cjs"),en=require("./components/SearchBar/SearchBar.cjs"),tn=require("./components/SegmentedControl/SegmentedControl.cjs"),nn=require("./components/Select/Select.cjs"),s=require("./components/Select/options.cjs"),rn=require("./components/Sidebar/active-nav-key.cjs"),an=require("./components/Sidebar/Sidebar.cjs"),on=require("./components/Skeleton/Skeleton.cjs"),sn=require("./components/Spacer/Spacer.cjs"),cn=require("./components/Spinner/Spinner.cjs"),ln=require("./components/Stat/Stat.cjs"),un=require("./components/Stepper/Stepper.cjs"),dn=require("./utils/absent.cjs"),c=require("./utils/numbers.cjs"),fn=require("./components/StepperInput/StepperInput.cjs"),pn=require("./components/Switch/Switch.cjs"),mn=require("./components/Tag/Tag.cjs"),hn=require("./components/Table/Table.cjs"),gn=require("./components/Tabs/Tabs.cjs"),_n=require("./components/Textarea/Textarea.cjs"),vn=require("./components/Timeline/Timeline.cjs"),yn=require("./components/Tooltip/Tooltip.cjs"),bn=require("./components/Toast/ToastProvider.cjs"),xn=require("./components/ImageCropper/ImageCropper.cjs"),Sn=require("./components/Sparkline/Sparkline.cjs"),Cn=require("./components/Scheduler/Scheduler.cjs"),wn=require("./utils/relative-time.cjs"),Tn=require("./components/NotificationCenter/NotificationCenter.cjs"),En=require("./components/NotificationCenter/use-notification-inbox.cjs"),Dn=require("./components/VideoPlayer/playback-rates.cjs"),On=require("./components/VideoPlayer/VideoPlayer.cjs"),kn=require("./components/VirtualList/VirtualList.cjs"),An=require("./utils/compare-values.cjs"),jn=require("./components/VirtualTable/VirtualTable.cjs"),l=require("./components/QRCode/qr-encode.cjs"),Mn=require("./components/QRCode/QRCode.cjs"),Nn=require("./components/CopyButton/CopyButton.cjs"),Pn=require("./components/CodeBlock/CodeBlock.cjs"),Fn=require("./components/RelativeTime/RelativeTime.cjs"),In=require("./components/Money/Money.cjs"),Ln=require("./components/TreeView/TreeView.cjs"),Rn=require("./components/TruncateText/TruncateText.cjs"),zn=require("./components/ClickOutside/ClickOutside.cjs"),Bn=require("./components/ConditionalWrapper/ConditionalWrapper.cjs"),Vn=require("./components/For/For.cjs"),Hn=require("./components/ErrorText/ErrorText.cjs"),Un=require("./components/Image/Image.cjs"),Wn=require("./components/DataList/DataList.cjs"),Gn=require("./components/DescriptionList/DescriptionList.cjs"),Kn=require("./components/Toggle/Toggle.cjs"),qn=require("./components/ToggleGroup/ToggleGroup.cjs"),Jn=require("./components/Label/Label.cjs"),Yn=require("./components/Collapsible/Collapsible.cjs"),Xn=require("./components/ContextMenu/ContextMenu.cjs"),Zn=require("./components/HoverCard/HoverCard.cjs"),Qn=require("./components/Command/Command.cjs"),$n=require("./components/ScrollArea/ScrollArea.cjs"),er=require("./components/Resizable/Resizable.cjs"),tr=require("./components/Calendar/Calendar.cjs"),nr=require("./components/Slider/Slider.cjs"),rr=require("./components/MultiSelect/MultiSelect.cjs"),ir=require("./components/DateRangePicker/DateRangePicker.cjs"),ar=require("./components/NavigationMenu/NavigationMenu.cjs"),or=require("./components/Menubar/Menubar.cjs"),sr=require("./components/Carousel/Carousel.cjs"),cr=require("./components/DataTable/DataTable.cjs"),lr=require("./components/ListTile/ListTile.cjs"),ur=require("./components/FloatingActionButton/FloatingActionButton.cjs"),dr=require("./components/NavigationRail/NavigationRail.cjs"),fr=require("./components/TimePicker/TimePicker.cjs"),pr=require("./components/RefreshIndicator/RefreshIndicator.cjs"),mr=require("./components/Wizard/Wizard.cjs"),hr=require("./components/Lightbox/Lightbox.cjs"),gr=require("./components/SignaturePad/SignaturePad.cjs"),u=require("./components/Chat/chat-receipt.cjs"),_r=require("./components/Chat/ChatBubble.cjs"),vr=require("./components/Chat/ChatComposer.cjs"),yr=require("./components/Chat/Chat.cjs"),br=require("./audio/audio-output.cjs"),xr=require("./components/AudioPlayer/AudioPlayer.cjs"),Sr=require("./capture/media-recorder.cjs"),d=require("./audio/audio-recorder.cjs"),Cr=require("./audio/level-meter.cjs"),wr=require("./audio/use-audio-recorder.cjs"),Tr=require("./audio/media-access.cjs"),Er=require("./audio/use-microphone.cjs"),Dr=require("./audio/wav.cjs"),Or=require("./components/AudioRecorder/AudioRecorder.cjs"),f=require("./capture/barcode.cjs"),kr=require("./capture/use-torch.cjs"),Ar=require("./capture/use-barcode-scanner.cjs"),jr=require("./components/BarcodeScanner/BarcodeScanner.cjs"),p=require("./components/AIChat/ai-chat-turns.cjs"),Mr=require("./components/AIChat/AIChatComposer.cjs"),Nr=require("./components/Markdown/Markdown.cjs"),Pr=require("./components/AIChat/AIChatTurn.cjs"),Fr=require("./components/AIChat/AIChat.cjs"),Ir=require("./components/Transfer/Transfer.cjs"),Lr=require("./components/Masonry/Masonry.cjs"),Rr=require("./components/Tour/Tour.cjs"),zr=require("./components/BarList/bar-list-model.cjs"),Br=require("./components/BarList/BarList.cjs"),m=require("./components/FilterBar/filter-model.cjs"),Vr=require("./components/FilterBar/FilterBar.cjs"),h=require("./utils/format.cjs"),Hr=require("./components/FilterBar/filter-apply.cjs"),Ur=require("./components/FilterBar/filter-query.cjs"),Wr=require("./components/FilterPanel/FilterPanel.cjs"),Gr=require("./utils/storage.cjs"),g=require("./utils/compressed-storage.cjs"),_=require("./utils/strings.cjs"),v=require("./utils/arrays.cjs"),y=require("./utils/objects.cjs"),b=require("./utils/guards.cjs"),x=require("./utils/functions.cjs"),Kr=require("./utils/promises.cjs"),qr=require("./utils/ids.cjs"),Jr=require("./utils/xlsx.cjs"),Yr=require("./share/share.cjs"),Xr=require("./share/share-or-download.cjs"),Zr=require("./utils/csv.cjs"),Qr=require("./http/build-url.cjs"),$r=require("./http/credential-scope.cjs"),S=require("./http/csrf.cjs"),C=require("./http/errors.cjs"),ei=require("./http/retry.cjs"),ti=require("./http/api-client.cjs"),w=require("./http/describe-api-error.cjs"),ni=require("./i18n/create-i18n.cjs"),T=require("./i18n/I18nProvider.cjs"),ri=require("./http/use-describe-api-error.cjs"),ii=require("./http/parse-response.cjs"),ai=require("./http/upload-with-progress.cjs"),oi=require("./http/idempotency.cjs"),E=require("./http/resumable-upload.cjs"),si=require("./http/use-poll.cjs"),ci=require("./auth/create-auth-store.cjs"),li=require("./auth/AuthGuard.cjs"),ui=require("./auth/jwt.cjs"),di=require("./auth/lazy-with-retry.cjs"),fi=require("./auth/refresh-queue.cjs"),D=require("./auth/passkey.cjs"),O=require("./auth/use-passkey.cjs"),pi=require("./auth/create-tempest-auth.cjs"),mi=require("./access/access-control-context.cjs"),hi=require("./access/use-can.cjs"),gi=require("./access/Can.cjs"),_i=require("./access/create-role-access-control.cjs"),vi=require("./access/permissions-from-token.cjs"),yi=require("./oauth/GoogleSignIn.cjs"),bi=require("./oauth/use-oauth-callback.cjs"),k=require("./query/constants.cjs"),xi=require("./query/create-query-keys.cjs"),Si=require("./query/retry-policy.cjs"),Ci=require("./query/QueryProvider.cjs"),A=require("./query/pagination.cjs"),wi=require("./query/use-paginated-query.cjs"),Ti=require("./query/use-cursor-query.cjs"),Ei=require("./query/use-offline-mutation.cjs"),j=require("./query/optimistic.cjs"),Di=require("./offline/create-offline-store.cjs"),Oi=require("./query/offline-persistence.cjs"),ki=require("./data/create-data-provider.cjs"),M=require("./data/data-provider-context.cjs"),N=require("./data/use-resource.cjs"),Ai=require("./router/RouteGuard.cjs"),ji=require("./router/AppRouter.cjs"),Mi=require("./store/create-store.cjs"),Ni=require("./store/create-selectors.cjs"),Pi=require("./theme/ThemeProvider.cjs"),Fi=require("./error-boundary/ErrorBoundary.cjs"),Ii=require("./app/AppProviders.cjs"),Li=require("./sse/create-event-stream.cjs"),Ri=require("./sse/use-event-stream.cjs"),zi=require("./push/utils.cjs"),P=require("./push/web-push-client.cjs"),Bi=require("./push/use-push-subscription.cjs"),F=require("./sw/create-push-handler.cjs"),I=require("./sw/cache.cjs"),Vi=require("./sw/background-sync.cjs"),Hi=require("./sw/periodic-sync.cjs"),L=require("./sw/cache-inspect.cjs"),R=require("./audio/audio-player.cjs"),Ui=require("./audio/use-audio.cjs"),Wi=require("./audio/sfx-pool.cjs"),Gi=require("./audio/use-sfx-pool.cjs"),Ki=require("./audio/audio-bus.cjs"),qi=require("./audio/use-audio-bus.cjs"),z=require("./audio/voice-chain.cjs"),Ji=require("./audio/noise-floor.cjs"),Yi=require("./audio/voice-activity.cjs"),B=require("./capture/video-recorder.cjs"),Xi=require("./capture/use-video-recorder.cjs"),Zi=require("./capture/use-screen-capture.cjs"),Qi=require("./capture/use-speech-recognition.cjs"),$i=require("./offline/create-offline-database.cjs"),ea=require("./offline/create-offline-sync.cjs"),ta=require("./offline/conflict.cjs"),na=require("./error-boundary/use-error-handler.cjs"),ra=require("./forms/FormField.cjs"),ia=require("./forms/validate-form.cjs"),aa=require("./forms/zod-resolver.cjs"),oa=require("./forms/use-zod-form.cjs"),V=require("./forms/br-validators.cjs"),H=require("./forms/masked-inputs.cjs"),sa=require("./forms/use-viacep.cjs"),ca=require("./ws/resilience.cjs"),la=require("./ws/create-web-socket.cjs"),ua=require("./ws/use-web-socket.cjs"),da=require("./webrtc/opus-sdp.cjs"),fa=require("./webrtc/sender-bitrate.cjs"),U=require("./webrtc/link-stats.cjs"),pa=require("./webrtc/use-link-stats.cjs"),ma=require("./webrtc/mesh-quality.cjs"),ha=require("./webrtc/peer-mesh.cjs"),W=require("./geo/types.cjs"),G=require("./geo/distance.cjs"),K=require("./geo/estimate.cjs"),q=require("./geo/bounds.cjs"),J=require("./geo/projection.cjs"),ga=require("./geo/routing.cjs"),_a=require("./geo/create-position-tracker.cjs"),va=require("./geo/use-position-tracker.cjs"),ya=require("./geo/TrajectoryMap.cjs"),ba=require("./theme/apply-theme.cjs"),Y=require("./theme/color.cjs"),xa=require("./theme/create-theme.cjs"),Sa=require("./theme/theme-presets.cjs"),Ca=require("./theme/initial-theme.cjs"),wa=require("./logger/logger.cjs"),Ta=require("./telemetry/TelemetryProvider.cjs"),Ea=require("./telemetry/console-adapter.cjs"),Da=require("./telemetry/sentry-adapter.cjs"),Oa=require("./telemetry/posthog-adapter.cjs"),ka=require("./telemetry/describe-app-error.cjs"),Aa=require("./telemetry/app-error-reporter.cjs"),ja=require("./telemetry/app-error-adapter.cjs"),X=require("./feature-flags/FeatureFlagsProvider.cjs"),Ma=require("./feature-flags/in-memory-adapter.cjs"),Na=require("./feature-flags/growthbook-adapter.cjs"),Pa=require("./feature-flags/launchdarkly-adapter.cjs"),Z=require("./charts/scales.cjs"),Fa=require("./perf/cache-size.cjs"),Ia=require("./perf/device.cjs"),La=require("./perf/format.cjs"),Ra=require("./perf/profiler.cjs");let Q=require("react-router"),$=require("react-hook-form");exports.ABSENT_TEXT=dn.ABSENT_TEXT,exports.AIChat=Fr.AIChat,exports.AIChatComposer=Mr.AIChatComposer,exports.AIChatTurn=Pr.AIChatTurn,exports.ALL_BARCODE_FORMATS=f.ALL_BARCODE_FORMATS,exports.ALL_OPTION_VALUE=s.ALL_OPTION_VALUE,exports.API_ERROR_OFFLINE_KEY=w.API_ERROR_OFFLINE_KEY,exports.API_ERROR_VALIDATION_KEY=w.API_ERROR_VALIDATION_KEY,exports.AUDIO_MIME_CANDIDATES=d.AUDIO_MIME_CANDIDATES,exports.AccessControlProvider=mi.AccessControlProvider,exports.Accordion=te.Accordion,exports.Alert=ne.Alert,exports.AppBar=ie.AppBar,exports.AppProviders=Ii.AppProviders,exports.AppRouter=ji.AppRouter,exports.AppShell=oe.AppShell,exports.AspectRatio=se.AspectRatio,exports.AudioPlayer=xr.AudioPlayer,exports.AudioRecorder=Or.AudioRecorder,exports.AuthGuard=li.AuthGuard,exports.Avatar=ce.Avatar,exports.AvatarGroup=le.AvatarGroup,exports.BREAKPOINTS=ae.BREAKPOINTS,exports.Badge=ue.Badge,exports.Banner=de.Banner,exports.BarList=Br.BarList,exports.BarcodeScanner=jr.BarcodeScanner,exports.BottomNavigation=fe.BottomNavigation,exports.BottomSheet=me.BottomSheet,exports.Breadcrumbs=he.Breadcrumbs,Object.defineProperty(exports,"BrowserRouter",{enumerable:!0,get:function(){return Q.BrowserRouter}}),exports.Button=ge.Button,exports.CACHE_TIME=k.CACHE_TIME,exports.CEPInput=H.CEPInput,exports.CNPJInput=H.CNPJInput,exports.CPFInput=H.CPFInput,exports.Calendar=tr.Calendar,exports.Can=gi.Can,exports.Card=_e.Card,exports.Carousel=sr.Carousel,exports.Center=ve.Center,exports.Chat=yr.Chat,exports.ChatBubble=_r.ChatBubble,exports.ChatComposer=vr.ChatComposer,exports.Checkbox=ye.Checkbox,exports.ChipInput=be.ChipInput,exports.ClickOutside=zn.ClickOutside,exports.CodeBlock=Pn.CodeBlock,exports.Collapsible=Yn.Collapsible,exports.Combobox=Se.Combobox,exports.Command=Qn.Command,exports.ConditionalWrapper=Bn.ConditionalWrapper,exports.ConfirmDialog=we.ConfirmDialog,exports.Container=t.Container,exports.ContextMenu=Xn.ContextMenu,Object.defineProperty(exports,"Controller",{enumerable:!0,get:function(){return $.Controller}}),exports.CopyButton=Nn.CopyButton,exports.DEFAULT_API_ERROR_STRINGS=w.DEFAULT_API_ERROR_STRINGS,exports.DEFAULT_BARCODE_FORMATS=f.DEFAULT_BARCODE_FORMATS,exports.DEFAULT_CAR_SPEED_KMH=K.DEFAULT_CAR_SPEED_KMH,exports.DEFAULT_CHUNK_SIZE=E.DEFAULT_CHUNK_SIZE,exports.DEFAULT_CIRCUITY_FACTOR=K.DEFAULT_CIRCUITY_FACTOR,exports.DEFAULT_CSRF_COOKIE_NAME=S.DEFAULT_CSRF_COOKIE_NAME,exports.DEFAULT_CSRF_HEADER_NAME=S.DEFAULT_CSRF_HEADER_NAME,exports.DEFAULT_MAX_GAIN=Ki.DEFAULT_MAX_GAIN,exports.DEFAULT_MODE_DURATION_FACTORS=K.DEFAULT_MODE_DURATION_FACTORS,exports.DEFAULT_PLAYBACK_RATES=Dn.DEFAULT_PLAYBACK_RATES,exports.DEFAULT_PUB_KEY_CRED_PARAMS=D.DEFAULT_PUB_KEY_CRED_PARAMS,exports.DEFAULT_PUSH_TO_TALK_KEY=r.DEFAULT_PUSH_TO_TALK_KEY,exports.DEFAULT_VOICE_CHAIN=z.DEFAULT_VOICE_CHAIN,exports.DIVERGING_STEP_COUNT=Z.DIVERGING_STEP_COUNT,exports.DataList=Wn.DataList,exports.DataTable=cr.DataTable,exports.DatePicker=Ee.DatePicker,exports.DateRangePicker=ir.DateRangePicker,exports.DescriptionList=Gn.DescriptionList,exports.Divider=De.Divider,exports.Drawer=Oe.Drawer,exports.DropdownMenu=ke.DropdownMenu,exports.Dropzone=Ae.Dropzone,exports.EARTH_RADIUS_KM=G.EARTH_RADIUS_KM,exports.EmptyState=je.EmptyState,exports.ErrorBoundary=Fi.ErrorBoundary,exports.ErrorState=Me.ErrorState,exports.ErrorText=Hn.ErrorText,exports.FeatureFlagsProvider=X.FeatureFlagsProvider,exports.FileUpload=Ne.FileUpload,exports.FilterBar=Vr.FilterBar,exports.FilterPanel=Wr.FilterPanel,exports.FloatingActionButton=ur.FloatingActionButton,exports.For=Vn.For,exports.Form=e.Form,exports.FormActions=e.FormActions,exports.FormField=ra.FormField,Object.defineProperty(exports,"FormProvider",{enumerable:!0,get:function(){return $.FormProvider}}),exports.FormRow=e.FormRow,exports.FormSection=e.FormSection,exports.GoogleSignIn=yi.GoogleSignIn,exports.Grid=t.Grid,exports.HEARTBEAT_CLOSE_CODE=ca.HEARTBEAT_CLOSE_CODE,Object.defineProperty(exports,"HashRouter",{enumerable:!0,get:function(){return Q.HashRouter}}),exports.Hide=Qt.Hide,exports.HoverCard=Zn.HoverCard,exports.I18nProvider=T.I18nProvider,exports.Image=Un.Image,exports.ImageCropper=xn.ImageCropper,exports.Input=Te.Input,exports.InstallBanner=Ie.InstallBanner,exports.InstallButton=Le.InstallButton,exports.Kanban=Rt.Kanban,exports.Kbd=zt.Kbd,exports.Label=Jn.Label,exports.Lightbox=hr.Lightbox,Object.defineProperty(exports,"Link",{enumerable:!0,get:function(){return Q.Link}}),exports.ListTile=lr.ListTile,exports.Markdown=Nr.Markdown,exports.Masonry=Lr.Masonry,Object.defineProperty(exports,"MemoryRouter",{enumerable:!0,get:function(){return Q.MemoryRouter}}),exports.Menubar=or.Menubar,exports.Modal=Ce.Modal,exports.ModalsProvider=Bt.ModalsProvider,exports.Money=In.Money,exports.MoneyInput=H.MoneyInput,exports.MultiSelect=rr.MultiSelect,exports.NProgressBar=Ht.NProgressBar,Object.defineProperty(exports,"NavLink",{enumerable:!0,get:function(){return Q.NavLink}}),exports.Navbar=Vt.Navbar,Object.defineProperty(exports,"Navigate",{enumerable:!0,get:function(){return Q.Navigate}}),exports.NavigationMenu=ar.NavigationMenu,exports.NavigationRail=dr.NavigationRail,exports.NotificationCenter=Tn.NotificationCenter,exports.ORDINAL_START_STEP=Z.ORDINAL_START_STEP,exports.OfflineIndicator=Nt.OfflineIndicator,Object.defineProperty(exports,"Outlet",{enumerable:!0,get:function(){return Q.Outlet}}),exports.PUSH_TO_TALK_KEYS=r.PUSH_TO_TALK_KEYS,exports.Page=Ut.Page,exports.Pagination=Wt.Pagination,exports.PasskeyError=D.PasskeyError,exports.PasswordInput=Gt.PasswordInput,exports.PhoneInput=H.PhoneInput,exports.PinInput=Kt.PinInput,exports.Popover=qt.Popover,exports.Portal=xe.Portal,exports.Progress=Jt.Progress,exports.QRCapacityError=l.QRCapacityError,exports.QRCode=Mn.QRCode,exports.QueryProvider=Ci.QueryProvider,exports.REFETCH_TIME=k.REFETCH_TIME,exports.Radio=Yt.Radio,exports.RadioGroup=Yt.RadioGroup,exports.RangeSlider=Xt.RangeSlider,exports.RatingStars=Zt.RatingStars,exports.RefreshIndicator=pr.RefreshIndicator,exports.RelativeTime=Fn.RelativeTime,exports.Resizable=er.Resizable,Object.defineProperty(exports,"Route",{enumerable:!0,get:function(){return Q.Route}}),exports.RouteGuard=Ai.RouteGuard,Object.defineProperty(exports,"Routes",{enumerable:!0,get:function(){return Q.Routes}}),exports.SEQUENTIAL_STEP_COUNT=Z.SEQUENTIAL_STEP_COUNT,exports.STALE_TIME=k.STALE_TIME,exports.SafeArea=$t.SafeArea,exports.Scheduler=Cn.Scheduler,exports.ScrollArea=$n.ScrollArea,exports.SearchBar=en.SearchBar,exports.SegmentedControl=tn.SegmentedControl,exports.Select=nn.Select,exports.Show=Qt.Show,exports.Sidebar=an.Sidebar,exports.SignaturePad=gr.SignaturePad,exports.Skeleton=on.Skeleton,exports.Slider=nr.Slider,exports.Spacer=sn.Spacer,exports.Sparkline=Sn.Sparkline,exports.Spinner=cn.Spinner,exports.Stack=t.Stack,exports.Stat=ln.Stat,exports.Stepper=un.Stepper,exports.StepperInput=fn.StepperInput,exports.Switch=pn.Switch,exports.SyncStatusBadge=It.SyncStatusBadge,exports.Table=hn.Table,exports.Tabs=gn.Tabs,exports.Tag=mn.Tag,exports.TelemetryProvider=Ta.TelemetryProvider,exports.TempestApiError=C.TempestApiError,exports.TempestDataProvider=M.TempestDataProvider,exports.Textarea=_n.Textarea,exports.ThemeProvider=Pi.ThemeProvider,exports.TimePicker=fr.TimePicker,exports.Timeline=vn.Timeline,exports.ToastProvider=bn.ToastProvider,exports.Toggle=Kn.Toggle,exports.ToggleGroup=qn.ToggleGroup,exports.ToggleGroupItem=qn.ToggleGroupItem,exports.Tooltip=yn.Tooltip,exports.Tour=Rr.Tour,exports.TrajectoryMap=ya.TrajectoryMap,exports.Transfer=Ir.Transfer,exports.TreeView=Ln.TreeView,exports.TruncateText=Rn.TruncateText,exports.UpdatePrompt=Lt.UpdatePrompt,exports.VideoPlayer=On.VideoPlayer,exports.VirtualList=kn.VirtualList,exports.VirtualTable=jn.VirtualTable,exports.VisuallyHidden=Ft.VisuallyHidden,exports.WebPushClient=P.WebPushClient,exports.WebPushPermissionDeniedError=P.WebPushPermissionDeniedError,exports.WebPushUnsupportedError=P.WebPushUnsupportedError,exports.Wizard=mr.Wizard,exports.activeNavKey=rn.activeNavKey,exports.aiChatStrings=p.aiChatStrings,exports.announce=i.announce,exports.applyFilters=Hr.applyFilters,exports.applyKanbanMove=Rt.applyKanbanMove,exports.applyTheme=ba.applyTheme,exports.assertNever=b.assertNever,exports.base64UrlToBytes=D.base64UrlToBytes,exports.bearingDeg=G.bearingDeg,exports.blobToWav=Dr.blobToWav,exports.boundingBox=q.boundingBox,exports.boundsCenter=q.boundsCenter,exports.buildApiUrl=Qr.buildApiUrl,exports.buildBarListRows=zr.buildBarListRows,exports.buildOpenInChromeIntent=n.buildOpenInChromeIntent,exports.bytesToBase64Url=D.bytesToBase64Url,exports.cachedResponseBytes=Fa.cachedResponseBytes,exports.camelCase=_.camelCase,exports.capitalize=_.capitalize,exports.chunk=v.chunk,exports.clamp=c.clamp,exports.clampLatitude=W.clampLatitude,exports.classifyPasskeyError=D.classifyPasskeyError,exports.clearAnnouncer=i.clearAnnouncer,exports.clearCaches=L.clearCaches,exports.cn=ee.cn,exports.compareValues=An.compareValues,exports.compressToString=g.compressToString,exports.compressedStorage=g.compressedStorage,exports.compressedStorageCodec=g.compressedStorageCodec,exports.consoleSink=wa.consoleSink,exports.consoleTelemetryAdapter=Ea.consoleTelemetryAdapter,exports.contrastRatio=Y.contrastRatio,exports.createApiClient=ti.createApiClient,exports.createAppErrorReporter=Aa.createAppErrorReporter,exports.createAppErrorTelemetryAdapter=ja.createAppErrorTelemetryAdapter,exports.createAudioBus=Ki.createAudioBus,exports.createAudioPlayer=R.createAudioPlayer,exports.createAudioRecorder=d.createAudioRecorder,exports.createAuthStore=ci.createAuthStore,exports.createBarcodeDetector=f.createBarcodeDetector,exports.createColorScale=Y.createColorScale,exports.createDataProvider=ki.createDataProvider,exports.createEventStream=Li.createEventStream,exports.createGrowthBookFeatureFlagsAdapter=Na.createGrowthBookFeatureFlagsAdapter,exports.createI18n=ni.createI18n,exports.createInMemoryFlags=Ma.createInMemoryFlags,exports.createInferenceProfiler=Ra.createInferenceProfiler,exports.createJsonStorage=Gr.createJsonStorage,exports.createLaunchDarklyFeatureFlagsAdapter=Pa.createLaunchDarklyFeatureFlagsAdapter,exports.createLevelMeter=Cr.createLevelMeter,exports.createLinkStatsSampler=U.createLinkStatsSampler,exports.createLocalUploadStorage=E.createLocalUploadStorage,exports.createLogger=wa.createLogger,exports.createMediaRecorder=Sr.createMediaRecorder,exports.createOSRMBackend=ga.createOSRMBackend,exports.createOfflineDatabase=$i.createOfflineDatabase,exports.createOfflineStore=Di.createOfflineStore,exports.createOfflineSync=ea.createOfflineSync,exports.createPartialResponse=I.createPartialResponse,exports.createPasskeyClient=D.createPasskeyClient,exports.createPeerMesh=ha.createPeerMesh,exports.createPositionTracker=_a.createPositionTracker,exports.createPostHogTelemetryAdapter=Oa.createPostHogTelemetryAdapter,exports.createQueryKeys=xi.createQueryKeys,exports.createRefreshQueue=fi.createRefreshQueue,exports.createResumableUpload=E.createResumableUpload,exports.createRoleAccessControl=_i.createRoleAccessControl,exports.createSelectors=Ni.createSelectors,exports.createSentryTelemetryAdapter=Da.createSentryTelemetryAdapter,exports.createSfxPool=Wi.createSfxPool,exports.createStore=Mi.createStore,exports.createTempestAuth=pi.createTempestAuth,exports.createTheme=xa.createTheme,exports.createVideoRecorder=B.createVideoRecorder,exports.createVoiceChain=z.createVoiceChain,exports.createWebSocket=la.createWebSocket,exports.csrfHeaders=S.csrfHeaders,exports.debounce=x.debounce,exports.decodeJWT=ui.decodeJWT,exports.decompressFromString=g.decompressFromString,exports.deepMerge=y.deepMerge,exports.defaultInstallHint=Fe.defaultInstallHint,exports.defineRoutes=ji.defineRoutes,exports.describeApiError=w.describeApiError,exports.describeAppError=ka.describeAppError,exports.describeFilter=m.describeFilter,exports.divergingScale=Z.divergingScale,exports.downloadCsv=Zr.downloadCsv,exports.emptyOffsetPage=A.emptyOffsetPage,exports.encodeQR=l.encodeQR,exports.encodeWav=Dr.encodeWav,exports.estimatePasswordStrength=Gt.estimatePasswordStrength,exports.estimateStorage=o.estimateStorage,exports.estimateTravel=K.estimateTravel,exports.expandBounds=q.expandBounds,exports.filtersFromSearchParams=m.filtersFromSearchParams,exports.filtersToQueryParams=Ur.filtersToQueryParams,exports.filtersToSearchParams=m.filtersToSearchParams,exports.fitProjection=J.fitProjection,exports.formatBytes=c.formatBytes,exports.formatCEP=V.formatCEP,exports.formatCNPJ=V.formatCNPJ,exports.formatCPF=h.formatCPF,exports.formatCompactNumber=c.formatCompactNumber,exports.formatCurrency=h.formatCurrency,exports.formatDate=h.formatDate,exports.formatDateForInput=h.formatDateForInput,exports.formatDateTime=h.formatDateTime,exports.formatDateTimeForInput=h.formatDateTimeForInput,exports.formatDurationMs=La.formatDurationMs,exports.formatPercent=h.formatPercent,exports.formatPhone=h.formatPhone,exports.generateIdempotencyKey=oi.generateIdempotencyKey,exports.getInitialTheme=Ca.getInitialTheme,exports.getSupportedBarcodeFormats=f.getSupportedBarcodeFormats,exports.getThemePreset=Sa.getThemePreset,exports.groupBy=v.groupBy,exports.haversineKm=G.haversineKm,exports.hexToOklch=Y.hexToOklch,exports.hexToRgb=Y.hexToRgb,exports.hexToRgbaString=Y.hexToRgbaString,exports.higherVersionWins=ta.higherVersionWins,exports.inspectCaches=L.inspectCaches,exports.installBackgroundSync=Vi.installBackgroundSync,exports.installNotificationClickHandler=F.installNotificationClickHandler,exports.installPrecache=I.installPrecache,exports.installPushHandler=F.installPushHandler,exports.installRuntimeCache=I.installRuntimeCache,exports.installSkipWaitingListener=F.installSkipWaitingListener,exports.isAndroid=n.isAndroid,exports.isAndroidWithoutPromptApi=n.isAndroidWithoutPromptApi,exports.isApiError=C.isApiError,exports.isAudioOutputSelectionSupported=br.isAudioOutputSelectionSupported,exports.isAudioRecordingSupported=d.isAudioRecordingSupported,exports.isBarcodeDetectionSupported=f.isBarcodeDetectionSupported,exports.isConditionalMediationAvailable=D.isConditionalMediationAvailable,exports.isCoordinate=W.isCoordinate,exports.isCursorPage=A.isCursorPage,exports.isDefined=b.isDefined,exports.isEmpty=y.isEmpty,exports.isFullscreenSupported=rt.isFullscreenSupported,exports.isGenerating=p.isGenerating,exports.isIOS=n.isIOS,exports.isJWTExpired=ui.isJWTExpired,exports.isMediaCaptureSupported=Tr.isMediaCaptureSupported,exports.isNumber=b.isNumber,exports.isOffsetPage=A.isOffsetPage,exports.isPasskeySupported=D.isPasskeySupported,exports.isPlainObject=b.isPlainObject,exports.isPlatformAuthenticatorAvailable=D.isPlatformAuthenticatorAvailable,exports.isPushSupported=zi.isPushSupported,exports.isRejectionCloseCode=ca.isRejectionCloseCode,exports.isRetriableStatus=C.isRetriableStatus,exports.isScreenCaptureSupported=Zi.isScreenCaptureSupported,exports.isShareSupported=Yr.isShareSupported,exports.isSpeechRecognitionSupported=Qi.isSpeechRecognitionSupported,exports.isStandalone=n.isStandalone,exports.isString=b.isString,exports.isTrustedCredentialTarget=$r.isTrustedCredentialTarget,exports.isValidLatitude=W.isValidLatitude,exports.isValidLongitude=W.isValidLongitude,exports.isVideoRecordingSupported=B.isVideoRecordingSupported,exports.isVoiceChainIdle=z.isVoiceChainIdle,exports.kebabCase=_.kebabCase,exports.lastAssistantId=p.lastAssistantId,exports.lastWriteWins=ta.lastWriteWins,exports.lazyWithRetry=di.lazyWithRetry,exports.listQueryKey=N.listQueryKey,exports.matrixToPath=l.matrixToPath,exports.measureNoiseFloor=Ji.measureNoiseFloor,exports.memoizeOne=x.memoizeOne,exports.monitorVoiceActivity=Yi.monitorVoiceActivity,exports.monitorVoiceChain=z.monitorVoiceChain,exports.moveItem=kt.moveItem,exports.normalizeBarcode=f.normalizeBarcode,exports.normalizeLongitude=W.normalizeLongitude,exports.nprogress=Ht.nprogress,exports.oklchToHex=Y.oklchToHex,exports.omit=y.omit,exports.once=x.once,exports.oneQueryKey=N.oneQueryKey,exports.operatorsFor=m.operatorsFor,exports.parseResponse=ii.parseResponse,exports.pathLengthKm=G.pathLengthKm,exports.percentOf=c.percentOf,exports.permissionsFromToken=vi.permissionsFromToken,exports.persistQueryClientOffline=Oi.persistQueryClientOffline,exports.pick=y.pick,exports.pickAudioMimeType=d.pickAudioMimeType,exports.pickVideoMimeType=B.pickVideoMimeType,exports.playAudio=R.playAudio,exports.pluralize=_.pluralize,exports.projectMercator=J.projectMercator,exports.pushToTalkKeyLabel=r.pushToTalkKeyLabel,exports.randomId=qr.randomId,exports.range=v.range,exports.readAvailableOutgoingKbps=U.readAvailableOutgoingKbps,exports.readDeviceProfile=Ia.readDeviceProfile,exports.readQualityLimitation=U.readQualityLimitation,exports.readRelayed=U.readRelayed,exports.readRoundTripMs=U.readRoundTripMs,exports.readThemeToken=ba.readThemeToken,exports.readableForeground=Y.readableForeground,exports.receiptLabel=u.receiptLabel,Object.defineProperty(exports,"redirect",{enumerable:!0,get:function(){return Q.redirect}}),exports.registerPeriodicSync=Hi.registerPeriodicSync,exports.registerServiceWorker=a.registerServiceWorker,exports.relativeLuminance=Y.relativeLuminance,exports.relativeTime=wn.relativeTime,exports.removeById=j.removeById,exports.requestPersistentStorage=o.requestPersistentStorage,exports.resolveDegradation=ma.resolveDegradation,exports.resolveReceiptState=u.resolveReceiptState,exports.retry=ei.retry,exports.rgbToHex=Y.rgbToHex,exports.roleLabel=p.roleLabel,exports.scaleForRoom=ma.scaleForRoom,exports.scaleSteps=Z.scaleSteps,exports.sequentialScale=Z.sequentialScale,exports.setAudioOutput=br.setAudioOutput,exports.setDevBuild=re.setDevBuild,exports.setSenderBitrate=fa.setSenderBitrate,exports.setTunedLocalDescription=da.setTunedLocalDescription,exports.share=Yr.share,exports.shareOrDownloadBlob=Xr.shareOrDownloadBlob,exports.shouldRetryQuery=Si.shouldRetryQuery,exports.skipWaiting=a.skipWaiting,exports.sleep=Kr.sleep,exports.slugify=_.slugify,exports.stopAudio=R.stopAudio,exports.storage=Gr.storage,exports.suggestGateThreshold=Ji.suggestGateThreshold,exports.tailSignature=p.tailSignature,exports.themeContrast=xa.themeContrast,exports.themeInitScript=Ca.themeInitScript,exports.themePresets=Sa.themePresets,exports.throttle=x.throttle,exports.toCsv=Zr.toCsv,exports.toOptions=s.toOptions,exports.toRadians=G.toRadians,exports.truncate=_.truncate,exports.tuneOpus=da.tuneOpus,exports.turnTime=p.turnTime,exports.uniqueBy=v.uniqueBy,exports.unmask=V.unmask,exports.unprojectMercator=J.unprojectMercator,exports.unregisterAllServiceWorkers=a.unregisterAllServiceWorkers,exports.uploadFingerprint=E.uploadFingerprint,exports.uploadWithProgress=ai.uploadWithProgress,exports.upsertById=j.upsertById,exports.urlBase64ToUint8Array=zi.urlBase64ToUint8Array,exports.useAccessControl=mi.useAccessControl,exports.useAnnounce=i.useAnnounce,exports.useAsync=Je.useAsync,exports.useAudio=Ui.useAudio,exports.useAudioBus=qi.useAudioBus,exports.useAudioRecorder=wr.useAudioRecorder,exports.useBarcodeScanner=Ar.useBarcodeScanner,exports.useBeforeInstallPrompt=tt.useBeforeInstallPrompt,exports.useBreakpoint=ae.useBreakpoint,exports.useCan=hi.useCan,exports.useClickOutside=wt.useClickOutside,exports.useClientFilter=Be.useClientFilter,exports.useClipboard=$e.useClipboard,exports.useCountdown=_t.useCountdown,exports.useCounter=gt.useCounter,exports.useCreate=N.useCreate,exports.useCursorQuery=Ti.useCursorQuery,exports.useDataProvider=M.useDataProvider,exports.useDebounce=Re.useDebounce,exports.useDeepMemo=Ve.useDeepMemo,exports.useDelete=N.useDelete,exports.useDescribeApiError=ri.useDescribeApiError,exports.useDisclosure=mt.useDisclosure,exports.useDocumentTitle=yt.useDocumentTitle,exports.useDocumentVisibility=Xe.useDocumentVisibility,exports.useDraftFilters=Ue.useDraftFilters,exports.useErrorHandler=na.useErrorHandler,exports.useEventListener=Ge.useEventListener,exports.useEventStream=Ri.useEventStream,exports.useFavicon=bt.useFavicon,exports.useFeatureFlag=X.useFeatureFlag,Object.defineProperty(exports,"useFieldArray",{enumerable:!0,get:function(){return $.useFieldArray}}),exports.useFlagValue=X.useFlagValue,exports.useFocusTrap=pe.useFocusTrap,Object.defineProperty(exports,"useForm",{enumerable:!0,get:function(){return $.useForm}}),Object.defineProperty(exports,"useFormContext",{enumerable:!0,get:function(){return $.useFormContext}}),Object.defineProperty(exports,"useFormState",{enumerable:!0,get:function(){return $.useFormState}}),exports.useFullscreen=rt.useFullscreen,exports.useGeolocation=it.useGeolocation,exports.useHover=ft.useHover,exports.useI18n=T.useI18n,exports.useIdle=nt.useIdle,exports.useInstallPrompt=Pe.useInstallPrompt,exports.useIntersectionObserver=Ze.useIntersectionObserver,exports.useInterval=ct.useInterval,exports.useIsFirstRender=Tt.useIsFirstRender,exports.useKeyboardShortcut=et.useKeyboardShortcut,exports.useLatestRef=He.useLatestRef,exports.useLinkStats=pa.useLinkStats,exports.useList=N.useList,exports.useListState=ht.useListState,exports.useLocalStorage=Ke.useLocalStorage,Object.defineProperty(exports,"useLocation",{enumerable:!0,get:function(){return Q.useLocation}}),exports.useLongPress=pt.useLongPress,exports.useLongPressHandlers=Dt.useLongPressHandlers,exports.useMap=xt.useMap,Object.defineProperty(exports,"useMatch",{enumerable:!0,get:function(){return Q.useMatch}}),exports.useMediaDevices=Mt.useMediaDevices,exports.useMediaPermission=jt.useMediaPermission,exports.useMediaQuery=We.useMediaQuery,exports.useMicrophone=Er.useMicrophone,exports.useModals=Bt.useModals,Object.defineProperty(exports,"useNavigate",{enumerable:!0,get:function(){return Q.useNavigate}}),exports.useNotificationInbox=En.useNotificationInbox,exports.useOAuthCallback=bi.useOAuthCallback,exports.useObjectUrl=Et.useObjectUrl,exports.useOfflineMutation=Ei.useOfflineMutation,exports.useOfflineSync=Pt.useOfflineSync,exports.useOne=N.useOne,exports.useOnline=Ye.useOnline,exports.useOptionalI18n=T.useOptionalI18n,exports.usePaginatedQuery=wi.usePaginatedQuery,exports.usePagination=ze.usePagination,Object.defineProperty(exports,"useParams",{enumerable:!0,get:function(){return Q.useParams}}),exports.usePasskeyCapabilities=O.usePasskeyCapabilities,exports.usePasskeyRegistration=O.usePasskeyRegistration,exports.usePasskeySignIn=O.usePasskeySignIn,exports.usePoll=si.usePoll,exports.usePositionTracker=va.usePositionTracker,exports.usePrevious=st.usePrevious,exports.usePushSubscription=Bi.usePushSubscription,exports.usePushToTalk=r.usePushToTalk,exports.useQueue=Ct.useQueue,exports.useResizeObserver=Qe.useResizeObserver,Object.defineProperty(exports,"useRouteError",{enumerable:!0,get:function(){return Q.useRouteError}}),exports.useScreenCapture=Zi.useScreenCapture,exports.useScrollLock=at.useScrollLock,exports.useScrollOverflow=At.useScrollOverflow,Object.defineProperty(exports,"useSearchParams",{enumerable:!0,get:function(){return Q.useSearchParams}}),exports.useServiceWorkerUpdate=Ot.useServiceWorkerUpdate,exports.useSet=St.useSet,exports.useSfxPool=Gi.useSfxPool,exports.useSortable=kt.useSortable,exports.useSpeechRecognition=Qi.useSpeechRecognition,exports.useStableCallback=ot.useStableCallback,exports.useStorageEstimate=o.useStorageEstimate,exports.useSyncStatus=Pt.useSyncStatus,exports.useTelemetry=Ta.useTelemetry,exports.useTheme=Pi.useTheme,exports.useThrottle=ut.useThrottle,exports.useTimeout=lt.useTimeout,exports.useToast=bn.useToast,exports.useToggle=qe.useToggle,exports.useTorch=kr.useTorch,exports.useTranslate=T.useTranslate,exports.useTypewriter=vt.useTypewriter,exports.useUpdate=N.useUpdate,exports.useViaCEP=sa.useViaCEP,exports.useVideoRecorder=Xi.useVideoRecorder,Object.defineProperty(exports,"useWatch",{enumerable:!0,get:function(){return $.useWatch}}),exports.useWebSocket=ua.useWebSocket,exports.useWindowSize=dt.useWindowSize,exports.useZodForm=oa.useZodForm,exports.validateCNPJ=V.validateCNPJ,exports.validateCPF=V.validateCPF,exports.validateForm=ia.validateForm,exports.visibleTurns=p.visibleTurns,exports.withAllOption=s.withAllOption,exports.withEmptyOption=s.withEmptyOption,exports.withTimeout=Kr.withTimeout,exports.writeXlsx=Jr.writeXlsx,exports.zodResolver=aa.zodResolver;
|
|
@@ -985,6 +985,102 @@ export declare interface AppBarProps extends Omit<HTMLAttributes<HTMLElement>, "
|
|
|
985
985
|
|
|
986
986
|
export declare type AppBarTone = "surface" | "primary" | "transparent";
|
|
987
987
|
|
|
988
|
+
/**
|
|
989
|
+
* The `code` and `message` a thrown value becomes on the wire.
|
|
990
|
+
*/
|
|
991
|
+
export declare interface AppErrorDescription {
|
|
992
|
+
/** The error's `name` — `"UnreadableFileError"`, `"TypeError"` — or `"Error"`. */
|
|
993
|
+
code: string;
|
|
994
|
+
/** Header, cause chain, context and stack, in that order. */
|
|
995
|
+
message: string;
|
|
996
|
+
}
|
|
997
|
+
|
|
998
|
+
/**
|
|
999
|
+
* Device data travelling with a report — the wire shape of
|
|
1000
|
+
* `tempest-fastapi-sdk`'s `AppErrorDeviceSchema`, snake_case included.
|
|
1001
|
+
*
|
|
1002
|
+
* Every field is optional on purpose: the app sends whatever it managed to
|
|
1003
|
+
* collect at the moment of the failure, and requiring any of them would turn an
|
|
1004
|
+
* incomplete collection into a lost report.
|
|
1005
|
+
*/
|
|
1006
|
+
export declare interface AppErrorDeviceSchema {
|
|
1007
|
+
/** Reporting client's platform. The backend stores `"unknown"` when absent. */
|
|
1008
|
+
platform?: AppErrorPlatform;
|
|
1009
|
+
/** Operating system version, e.g. `"Android 14"`. */
|
|
1010
|
+
os_version?: string;
|
|
1011
|
+
/** Application version or build — with `code`, the cut that isolates one defect. */
|
|
1012
|
+
app_version?: string;
|
|
1013
|
+
/** Device model, e.g. `"SM-A105M"`. */
|
|
1014
|
+
device_model?: string;
|
|
1015
|
+
/** Anonymous device identifier, used to group reports from one device. */
|
|
1016
|
+
device_id?: string;
|
|
1017
|
+
}
|
|
1018
|
+
|
|
1019
|
+
/** What one {@link AppErrorReporter.flush} did. */
|
|
1020
|
+
export declare interface AppErrorFlushResult {
|
|
1021
|
+
/** Reports the backend accepted. */
|
|
1022
|
+
sent: number;
|
|
1023
|
+
/** Reports the backend refused for good (a 4xx other than 408/429) and were dropped. */
|
|
1024
|
+
dropped: number;
|
|
1025
|
+
/** Reports still waiting. */
|
|
1026
|
+
pending: number;
|
|
1027
|
+
/** Milliseconds the backend asked to wait (429 `Retry-After`), or `null`. */
|
|
1028
|
+
retryAfterMs: number | null;
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1031
|
+
/**
|
|
1032
|
+
* The client platform an error was reported from.
|
|
1033
|
+
*
|
|
1034
|
+
* The closed set the backend filters on, mirrored from `tempest-fastapi-sdk`'s
|
|
1035
|
+
* `AppPlatform`: an error that only shows up on iOS is not the same bug as one
|
|
1036
|
+
* that only shows up on Android, and a PWA reports `"web"`.
|
|
1037
|
+
*/
|
|
1038
|
+
export declare type AppErrorPlatform = "ios" | "android" | "web" | "unknown";
|
|
1039
|
+
|
|
1040
|
+
/** One queued report and how many identical ones were folded into it. */
|
|
1041
|
+
export declare interface AppErrorQueueEntry {
|
|
1042
|
+
report: AppErrorReportSchema;
|
|
1043
|
+
/** How many times this exact report was raised while it waited. */
|
|
1044
|
+
count: number;
|
|
1045
|
+
}
|
|
1046
|
+
|
|
1047
|
+
/**
|
|
1048
|
+
* The `localStorage` subset the queue needs, so a test or a non-browser host
|
|
1049
|
+
* can hand in its own.
|
|
1050
|
+
*/
|
|
1051
|
+
export declare interface AppErrorQueueStorage {
|
|
1052
|
+
getItem: (key: string) => string | null;
|
|
1053
|
+
setItem: (key: string, value: string) => void;
|
|
1054
|
+
removeItem: (key: string) => void;
|
|
1055
|
+
}
|
|
1056
|
+
|
|
1057
|
+
/** The reporter {@link createAppErrorReporter} returns. */
|
|
1058
|
+
export declare interface AppErrorReporter {
|
|
1059
|
+
/** Queue an error with optional context, and try to send it. Never throws. */
|
|
1060
|
+
report: (error: unknown, context?: Record<string, unknown>) => void;
|
|
1061
|
+
/** Drain the queue now. Concurrent calls share one run. */
|
|
1062
|
+
flush: () => Promise<AppErrorFlushResult>;
|
|
1063
|
+
/** The waiting entries, oldest first. */
|
|
1064
|
+
pending: () => AppErrorQueueEntry[];
|
|
1065
|
+
/** Drop every waiting report. */
|
|
1066
|
+
clear: () => void;
|
|
1067
|
+
/** Remove the `online` listener and the retry timer. */
|
|
1068
|
+
dispose: () => void;
|
|
1069
|
+
}
|
|
1070
|
+
|
|
1071
|
+
/**
|
|
1072
|
+
* The body of `POST /api/app-errors` — `tempest-fastapi-sdk`'s
|
|
1073
|
+
* `AppErrorReportSchema`. There is deliberately no `user_id`: the backend takes
|
|
1074
|
+
* it from the bearer token, never from the body, so a client cannot attribute a
|
|
1075
|
+
* report to somebody else.
|
|
1076
|
+
*/
|
|
1077
|
+
export declare interface AppErrorReportSchema extends AppErrorDeviceSchema {
|
|
1078
|
+
/** Stable error identifier — the first thing anyone groups by. */
|
|
1079
|
+
code: string;
|
|
1080
|
+
/** Message, cause chain, context and stack, as one text. */
|
|
1081
|
+
message: string;
|
|
1082
|
+
}
|
|
1083
|
+
|
|
988
1084
|
/**
|
|
989
1085
|
* Run a filter set over an in-memory list.
|
|
990
1086
|
*
|
|
@@ -3422,6 +3518,105 @@ export declare const CPFInput: ForwardRefExoticComponent<Omit<InputProps, "value
|
|
|
3422
3518
|
*/
|
|
3423
3519
|
export declare function createApiClient(config: ApiClientConfig): ApiClient;
|
|
3424
3520
|
|
|
3521
|
+
/**
|
|
3522
|
+
* Report client errors to a Tempest backend's `POST /api/app-errors`, surviving
|
|
3523
|
+
* the offline stretches where field errors actually happen.
|
|
3524
|
+
*
|
|
3525
|
+
* The client half of `tempest-fastapi-sdk`'s `app_errors` module. An error is
|
|
3526
|
+
* described ({@link describeAppError}), stamped with the device facts of that
|
|
3527
|
+
* moment, fitted to the backend's column limits and queued in `localStorage`
|
|
3528
|
+
* before anything goes over the network — so a report raised with no signal is
|
|
3529
|
+
* sent when the browser comes back `online`, not lost.
|
|
3530
|
+
*
|
|
3531
|
+
* What each answer does to the queue:
|
|
3532
|
+
*
|
|
3533
|
+
* - **2xx** — removed.
|
|
3534
|
+
* - **429** — kept; sending pauses for `Retry-After`, then resumes on its own.
|
|
3535
|
+
* - **5xx, 408, network failure** — kept; the next report, `online` event or
|
|
3536
|
+
* `flush()` retries.
|
|
3537
|
+
* - **any other 4xx** — dropped: the backend will refuse that body forever, and
|
|
3538
|
+
* keeping it would block every report queued behind it.
|
|
3539
|
+
*
|
|
3540
|
+
* @example
|
|
3541
|
+
* import { createAppErrorReporter } from "tempest-react-sdk";
|
|
3542
|
+
*
|
|
3543
|
+
* const reporter = createAppErrorReporter({
|
|
3544
|
+
* endpoint: `${import.meta.env.VITE_API_URL}/api/app-errors`,
|
|
3545
|
+
* getToken: () => sessionStorage.getItem("access_token"),
|
|
3546
|
+
* device: () => ({ platform: "web", app_version: "1.4.0" }),
|
|
3547
|
+
* });
|
|
3548
|
+
*
|
|
3549
|
+
* reporter.report(new Error("crop failed"), { step: "crop", size: 0 });
|
|
3550
|
+
*
|
|
3551
|
+
* @param options - Endpoint, token and device getters, storage and limits.
|
|
3552
|
+
* @returns The reporter.
|
|
3553
|
+
*/
|
|
3554
|
+
export declare function createAppErrorReporter(options: CreateAppErrorReporterOptions): AppErrorReporter;
|
|
3555
|
+
|
|
3556
|
+
/** Options for {@link createAppErrorReporter}. */
|
|
3557
|
+
export declare interface CreateAppErrorReporterOptions {
|
|
3558
|
+
/** Full URL of the backend route, e.g. `${API_URL}/api/app-errors`. */
|
|
3559
|
+
endpoint: string;
|
|
3560
|
+
/**
|
|
3561
|
+
* Current access token, if any. Optional on purpose: the route is public,
|
|
3562
|
+
* and an error raised before login — or with a stale session — still has
|
|
3563
|
+
* to get through. A token that throws or resolves empty sends anonymously.
|
|
3564
|
+
*/
|
|
3565
|
+
getToken?: () => string | null | undefined | Promise<string | null | undefined>;
|
|
3566
|
+
/**
|
|
3567
|
+
* Device facts, read **when the error is reported**, not when it is sent —
|
|
3568
|
+
* a report queued offline on `1.4.0` must not go out labelled `1.5.0`.
|
|
3569
|
+
*/
|
|
3570
|
+
device?: () => AppErrorDeviceSchema;
|
|
3571
|
+
/** Where the queue persists. Defaults to `localStorage`; `null` keeps it in memory. */
|
|
3572
|
+
storage?: AppErrorQueueStorage | null;
|
|
3573
|
+
/** Storage key. Default `"tempest:app-errors"`. */
|
|
3574
|
+
storageKey?: string;
|
|
3575
|
+
/** Ceiling on distinct waiting reports; the oldest is evicted. Default `50`. */
|
|
3576
|
+
maxEntries?: number;
|
|
3577
|
+
/** `fetch` to send with. Defaults to the global one. */
|
|
3578
|
+
fetch?: typeof fetch;
|
|
3579
|
+
/** Send on every report and when the browser goes `online`. Default `true`. */
|
|
3580
|
+
autoFlush?: boolean;
|
|
3581
|
+
}
|
|
3582
|
+
|
|
3583
|
+
/**
|
|
3584
|
+
* Build a {@link TelemetryAdapter} that sends exceptions to a Tempest backend's
|
|
3585
|
+
* `/api/app-errors`, so `useTelemetry().captureException` and an
|
|
3586
|
+
* `ErrorBoundary` wired to it reach the same table.
|
|
3587
|
+
*
|
|
3588
|
+
* Only exceptions travel. `identify` is a no-op because the backend takes the
|
|
3589
|
+
* user from the bearer token, never from the client; `track` is a no-op because
|
|
3590
|
+
* the route stores errors, not product events — pair this adapter with an
|
|
3591
|
+
* analytics one if you need both.
|
|
3592
|
+
*
|
|
3593
|
+
* Mapping:
|
|
3594
|
+
* - `captureException(err, ctx)` → `reporter.report(err, ctx)`
|
|
3595
|
+
* - `flush()` → `reporter.flush()`
|
|
3596
|
+
*
|
|
3597
|
+
* @example
|
|
3598
|
+
* import {
|
|
3599
|
+
* createAppErrorReporter,
|
|
3600
|
+
* createAppErrorTelemetryAdapter,
|
|
3601
|
+
* TelemetryProvider,
|
|
3602
|
+
* } from "tempest-react-sdk";
|
|
3603
|
+
*
|
|
3604
|
+
* const reporter = createAppErrorReporter({ endpoint: "/api/app-errors" });
|
|
3605
|
+
* const adapter = createAppErrorTelemetryAdapter({ reporter });
|
|
3606
|
+
*
|
|
3607
|
+
* <TelemetryProvider adapter={adapter}><App /></TelemetryProvider>;
|
|
3608
|
+
*
|
|
3609
|
+
* @param options - The reporter to forward to.
|
|
3610
|
+
* @returns The adapter.
|
|
3611
|
+
*/
|
|
3612
|
+
export declare function createAppErrorTelemetryAdapter(options: CreateAppErrorTelemetryAdapterOptions): TelemetryAdapter;
|
|
3613
|
+
|
|
3614
|
+
/** Options for {@link createAppErrorTelemetryAdapter}. */
|
|
3615
|
+
export declare interface CreateAppErrorTelemetryAdapterOptions {
|
|
3616
|
+
/** The reporter built by `createAppErrorReporter`. */
|
|
3617
|
+
reporter: AppErrorReporter;
|
|
3618
|
+
}
|
|
3619
|
+
|
|
3425
3620
|
/**
|
|
3426
3621
|
* Mix several streams into one output, with gain above 100% and a master limiter.
|
|
3427
3622
|
*
|
|
@@ -5876,6 +6071,25 @@ export declare interface DescribeApiErrorOptions extends Partial<ApiErrorStrings
|
|
|
5876
6071
|
useDetail?: boolean;
|
|
5877
6072
|
}
|
|
5878
6073
|
|
|
6074
|
+
/**
|
|
6075
|
+
* Turn any thrown value into the `code` + `message` pair the backend stores.
|
|
6076
|
+
*
|
|
6077
|
+
* The message is ordered by how much each part is worth when the backend cuts
|
|
6078
|
+
* it at 4000 characters: the headline, then the **`cause` chain** — where the
|
|
6079
|
+
* real failure usually is (`UnreadableFileError` caused by `NotReadableError`)
|
|
6080
|
+
* — then the caller's context, and the stack last, since it is the longest and
|
|
6081
|
+
* the first thing worth losing.
|
|
6082
|
+
*
|
|
6083
|
+
* @example
|
|
6084
|
+
* describeAppError(new Error("boom", { cause: new TypeError("x") }), { step: "crop" });
|
|
6085
|
+
* // { code: "Error", message: "Error: boom\ncaused by: TypeError: x\ncontext: {\"step\":\"crop\"}\n…" }
|
|
6086
|
+
*
|
|
6087
|
+
* @param error - Whatever was thrown — an `Error`, a `DOMException`, a string.
|
|
6088
|
+
* @param context - Extra facts to keep with it (file size, MIME, step).
|
|
6089
|
+
* @returns The wire `code` and `message`.
|
|
6090
|
+
*/
|
|
6091
|
+
export declare function describeAppError(error: unknown, context?: Record<string, unknown>): AppErrorDescription;
|
|
6092
|
+
|
|
5879
6093
|
/**
|
|
5880
6094
|
* One filter, in words: `"Status é Pago"`.
|
|
5881
6095
|
*
|
|
@@ -349,13 +349,16 @@ import { TelemetryProvider as xl, useTelemetry as Sl } from "./telemetry/Telemet
|
|
|
349
349
|
import { consoleTelemetryAdapter as Cl } from "./telemetry/console-adapter.js";
|
|
350
350
|
import { createSentryTelemetryAdapter as wl } from "./telemetry/sentry-adapter.js";
|
|
351
351
|
import { createPostHogTelemetryAdapter as Tl } from "./telemetry/posthog-adapter.js";
|
|
352
|
-
import {
|
|
353
|
-
import {
|
|
354
|
-
import {
|
|
355
|
-
import {
|
|
356
|
-
import {
|
|
357
|
-
import {
|
|
358
|
-
import {
|
|
359
|
-
import {
|
|
360
|
-
import {
|
|
361
|
-
export { Yt as ABSENT_TEXT, Xr as AIChat, qr as AIChatComposer, Yr as AIChatTurn, jr as ALL_BARCODE_FORMATS, Rt as ALL_OPTION_VALUE, fa as API_ERROR_OFFLINE_KEY, pa as API_ERROR_VALIDATION_KEY, br as AUDIO_MIME_CANDIDATES, Ya as AccessControlProvider, t as Accordion, n as Alert, i as AppBar, es as AppProviders, jo as AppRouter, s as AppShell, c as AspectRatio, vr as AudioPlayer, Ar as AudioRecorder, ja as AuthGuard, l as Avatar, u as AvatarGroup, a as BREAKPOINTS, d as Badge, f as Banner, ti as BarList, zr as BarcodeScanner, p as BottomNavigation, h as BottomSheet, g as Breadcrumbs, No as BrowserRouter, _ as Button, ro as CACHE_TIME, rc as CEPInput, ic as CNPJInput, ac as CPFInput, Yn as Calendar, Qa as Can, v as Card, tr as Carousel, y as Center, hr as Chat, pr as ChatBubble, mr as ChatComposer, b as Checkbox, x as ChipInput, Mn as ClickOutside, Dn as CodeBlock, Un as Collapsible, C as Combobox, Kn as Command, Nn as ConditionalWrapper, T as ConfirmDialog, z as Container, Wn as ContextMenu, lc as Controller, En as CopyButton, ma as DEFAULT_API_ERROR_STRINGS, Mr as DEFAULT_BARCODE_FORMATS, Hc as DEFAULT_CAR_SPEED_KMH, Ta as DEFAULT_CHUNK_SIZE, Uc as DEFAULT_CIRCUITY_FACTOR, ia as DEFAULT_CSRF_COOKIE_NAME, aa as DEFAULT_CSRF_HEADER_NAME, Ts as DEFAULT_MAX_GAIN, Wc as DEFAULT_MODE_DURATION_FACTORS, _n as DEFAULT_PLAYBACK_RATES, Ia as DEFAULT_PUB_KEY_CRED_PARAMS, ve as DEFAULT_PUSH_TO_TALK_KEY, Os as DEFAULT_VOICE_CHAIN, Ml as DIVERGING_STEP_COUNT, Ln as DataList, nr as DataTable, D as DatePicker, Qn as DateRangePicker, Rn as DescriptionList, O as Divider, k as Drawer, A as DropdownMenu, j as Dropzone, Lc as EARTH_RADIUS_KM, M as EmptyState, $o as ErrorBoundary, N as ErrorState, Fn as ErrorText, El as FeatureFlagsProvider, P as FileUpload, oi as FilterBar, _i as FilterPanel, ir as FloatingActionButton, Pn as For, F as Form, I as FormActions, Js as FormField, uc as FormProvider, L as FormRow, R as FormSection, to as GoogleSignIn, B as Grid, gc as HEARTBEAT_CLOSE_CODE, Po as HashRouter, Mt as Hide, Gn as HoverCard, _a as I18nProvider, In as Image, dn as ImageCropper, E as Input, Y as InstallBanner, X as InstallButton, pt as Kanban, ht as Kbd, Hn as Label, lr as Lightbox, Fo as Link, rr as ListTile, Jr as Markdown, Qr as Masonry, Io as MemoryRouter, er as Menubar, w as Modal, gt as ModalsProvider, kn as Money, oc as MoneyInput, Zn as MultiSelect, yt as NProgressBar, Lo as NavLink, vt as Navbar, Ro as Navigate, $n as NavigationMenu, ar as NavigationRail, hn as NotificationCenter, Nl as ORDINAL_START_STEP, st as OfflineIndicator, zo as Outlet, ye as PUSH_TO_TALK_KEYS, xt as Page, St as Pagination, La as PasskeyError, Ct as PasswordInput, sc as PhoneInput, Tt as PinInput, Et as Popover, S as Portal, Dt as Progress, Sn as QRCapacityError, Tn as QRCode, co as QueryProvider, io as REFETCH_TIME, Ot as Radio, kt as RadioGroup, At as RangeSlider, jt as RatingStars, sr as RefreshIndicator, On as RelativeTime, Jn as Resizable, Bo as Route, Ao as RouteGuard, Vo as Routes, Pl as SEQUENTIAL_STEP_COUNT, ao as STALE_TIME, Pt as SafeArea, pn as Scheduler, qn as ScrollArea, Ft as SearchBar, It as SegmentedControl, Lt as Select, Nt as Show, Ut as Sidebar, ur as SignaturePad, Wt as Skeleton, Xn as Slider, Gt as Spacer, fn as Sparkline, Kt as Spinner, V as Stack, qt as Stat, Jt as Stepper, en as StepperInput, tn as Switch, dt as SyncStatusBadge, rn as Table, an as Tabs, nn as Tag, xl as TelemetryProvider, sa as TempestApiError, xo as TempestDataProvider, on as Textarea, Zo as ThemeProvider, or as TimePicker, sn as Timeline, ln as ToastProvider, zn as Toggle, Bn as ToggleGroup, Vn as ToggleGroupItem, cn as Tooltip, $r as Tour, tl as TrajectoryMap, Zr as Transfer, An as TreeView, jn as TruncateText, ft as UpdatePrompt, vn as VideoPlayer, yn as VirtualList, xn as VirtualTable, ut as VisuallyHidden, as as WebPushClient, os as WebPushPermissionDeniedError, ss as WebPushUnsupportedError, cr as Wizard, Ht as activeNavKey, Br as aiChatStrings, we as announce, hi as applyFilters, mt as applyKanbanMove, nl as applyTheme, Ri as assertNever, Ra as base64UrlToBytes, Rc as bearingDeg, Or as blobToWav, Kc as boundingBox, qc as boundsCenter, na as buildApiUrl, ei as buildBarListRows, H as buildOpenInChromeIntent, za as bytesToBase64Url, Rl as cachedResponseBytes, wi as camelCase, Ti as capitalize, Ai as chunk, Xt as clamp, Mc as clampLatitude, Ba as classifyPasskeyError, Te as clearAnnouncer, _s as clearCaches, e as cn, bn as compareValues, bi as compressToString, xi as compressedStorage, Si as compressedStorageCodec, yl as consoleSink, Cl as consoleTelemetryAdapter, il as contrastRatio, da as createApiClient, Es as createAudioBus, ys as createAudioPlayer, xr as createAudioRecorder, Aa as createAuthStore, Nr as createBarcodeDetector, al as createColorScale, bo as createDataProvider, ts as createEventStream, Al as createGrowthBookFeatureFlagsAdapter, ga as createI18n, kl as createInMemoryFlags, Vl as createInferenceProfiler, vi as createJsonStorage, jl as createLaunchDarklyFeatureFlagsAdapter, wr as createLevelMeter, Cc as createLinkStatsSampler, Ea as createLocalUploadStorage, bl as createLogger, yr as createMediaRecorder, Qc as createOSRMBackend, Us as createOfflineDatabase, vo as createOfflineStore, Ws as createOfflineSync, fs as createPartialResponse, Va as createPasskeyClient, jc as createPeerMesh, $c as createPositionTracker, Tl as createPostHogTelemetryAdapter, oo as createQueryKeys, Fa as createRefreshQueue, Da as createResumableUpload, $a as createRoleAccessControl, Xo as createSelectors, wl as createSentryTelemetryAdapter, Cs as createSfxPool, Yo as createStore, Ja as createTempestAuth, pl as createTheme, Fs as createVideoRecorder, ks as createVoiceChain, vc as createWebSocket, oa as csrfHeaders, Ui as debounce, Ma as decodeJWT, Ci as decompressFromString, Pi as deepMerge, J as defaultInstallHint, Mo as defineRoutes, ha as describeApiError, ni as describeFilter, Fl as divergingScale, ea as downloadCsv, lo as emptyOffsetPage, Cn as encodeQR, kr as encodeWav, wt as estimatePasswordStrength, $e as estimateStorage, Gc as estimateTravel, Jc as expandBounds, ri as filtersFromSearchParams, gi as filtersToQueryParams, ii as filtersToSearchParams, Yc as fitProjection, Zt as formatBytes, Qs as formatCEP, $s as formatCNPJ, si as formatCPF, Qt as formatCompactNumber, ci as formatCurrency, li as formatDate, ui as formatDateForInput, di as formatDateTime, fi as formatDateTimeForInput, Bl as formatDurationMs, pi as formatPercent, mi as formatPhone, wa as generateIdempotencyKey, _l as getInitialTheme, Pr as getSupportedBarcodeFormats, hl as getThemePreset, ji as groupBy, zc as haversineKm, ol as hexToOklch, sl as hexToRgb, cl as hexToRgbaString, Gs as higherVersionWins, vs as inspectCaches, hs as installBackgroundSync, ls as installNotificationClickHandler, ps as installPrecache, us as installPushHandler, ms as installRuntimeCache, ds as installSkipWaitingListener, U as isAndroid, W as isAndroidWithoutPromptApi, ca as isApiError, gr as isAudioOutputSelectionSupported, Sr as isAudioRecordingSupported, Fr as isBarcodeDetectionSupported, Ha as isConditionalMediationAvailable, Nc as isCoordinate, uo as isCursorPage, zi as isDefined, Fi as isEmpty, ge as isFullscreenSupported, Vr as isGenerating, G as isIOS, Na as isJWTExpired, Er as isMediaCaptureSupported, Bi as isNumber, fo as isOffsetPage, Ua as isPasskeySupported, Vi as isPlainObject, Wa as isPlatformAuthenticatorAvailable, rs as isPushSupported, _c as isRejectionCloseCode, la as isRetriableStatus, zs as isScreenCaptureSupported, Zi as isShareSupported, Vs as isSpeechRecognitionSupported, K as isStandalone, Hi as isString, ra as isTrustedCredentialTarget, Pc as isValidLatitude, Fc as isValidLongitude, Is as isVideoRecordingSupported, As as isVoiceChainIdle, Ei as kebabCase, Hr as lastAssistantId, Ks as lastWriteWins, Pa as lazyWithRetry, Co as listQueryKey, wn as matrixToPath, Ms as measureNoiseFloor, Wi as memoizeOne, Ps as monitorVoiceActivity, js as monitorVoiceChain, nt as moveItem, Ir as normalizeBarcode, Ic as normalizeLongitude, bt as nprogress, ll as oklchToHex, Ii as omit, Gi as once, wo as oneQueryKey, ai as operatorsFor, Sa as parseResponse, Bc as pathLengthKm, $t as percentOf, eo as permissionsFromToken, yo as persistQueryClientOffline, Li as pick, Cr as pickAudioMimeType, Ls as pickVideoMimeType, bs as playAudio, Di as pluralize, Xc as projectMercator, be as pushToTalkKeyLabel, Yi as randomId, Mi as range, wc as readAvailableOutgoingKbps, zl as readDeviceProfile, Tc as readQualityLimitation, Ec as readRelayed, Dc as readRoundTripMs, rl as readThemeToken, ul as readableForeground, dr as receiptLabel, Ho as redirect, gs as registerPeriodicSync, Ye as registerServiceWorker, dl as relativeLuminance, mn as relativeTime, go as removeById, et as requestPersistentStorage, kc as resolveDegradation, fr as resolveReceiptState, ua as retry, fl as rgbToHex, Ur as roleLabel, Ac as scaleForRoom, Il as scaleSteps, Ll as sequentialScale, _r as setAudioOutput, r as setDevBuild, Sc as setSenderBitrate, bc as setTunedLocalDescription, Qi as share, $i as shareOrDownloadBlob, so as shouldRetryQuery, Xe as skipWaiting, qi as sleep, Oi as slugify, xs as stopAudio, yi as storage, Ns as suggestGateThreshold, Wr as tailSignature, ml as themeContrast, vl as themeInitScript, gl as themePresets, Ki as throttle, ta as toCsv, zt as toOptions, Vc as toRadians, ki as truncate, xc as tuneOpus, Gr as turnTime, Ni as uniqueBy, ec as unmask, Zc as unprojectMercator, Ze as unregisterAllServiceWorkers, Oa as uploadFingerprint, Ca as uploadWithProgress, _o as upsertById, is as urlBase64ToUint8Array, Xa as useAccessControl, Ee as useAnnounce, se as useAsync, Ss as useAudio, Ds as useAudioBus, Tr as useAudioRecorder, Rr as useBarcodeScanner, me as useBeforeInstallPrompt, o as useBreakpoint, Za as useCan, Ge as useClickOutside, $ as useClientFilter, fe as useClipboard, Re as useCountdown, Le as useCounter, To as useCreate, mo as useCursorQuery, So as useDataProvider, Z as useDebounce, ee as useDeepMemo, Eo as useDelete, xa as useDescribeApiError, Fe as useDisclosure, Be as useDocumentTitle, le as useDocumentVisibility, ne as useDraftFilters, qs as useErrorHandler, ie as useEventListener, ns as useEventStream, Ve as useFavicon, Dl as useFeatureFlag, dc as useFieldArray, Ol as useFlagValue, m as useFocusTrap, fc as useForm, pc as useFormContext, mc as useFormState, _e as useFullscreen, Se as useGeolocation, Ne as useHover, va as useI18n, he as useIdle, q as useInstallPrompt, ue as useIntersectionObserver, ke as useInterval, Ke as useIsFirstRender, pe as useKeyboardShortcut, te as useLatestRef, Oc as useLinkStats, Do as useList, Ie as useListState, ae as useLocalStorage, Uo as useLocation, Pe as useLongPress, Je as useLongPressHandlers, He as useMap, Wo as useMatch, ot as useMediaDevices, at as useMediaPermission, re as useMediaQuery, Dr as useMicrophone, _t as useModals, Go as useNavigate, gn as useNotificationInbox, no as useOAuthCallback, qe as useObjectUrl, ho as useOfflineMutation, ct as useOfflineSync, Oo as useOne, ce as useOnline, ya as useOptionalI18n, po as usePaginatedQuery, Q as usePagination, Ko as useParams, Ga as usePasskeyCapabilities, Ka as usePasskeyRegistration, qa as usePasskeySignIn, ka as usePoll, el as usePositionTracker, Oe as usePrevious, cs as usePushSubscription, xe as usePushToTalk, We as useQueue, de as useResizeObserver, qo as useRouteError, Bs as useScreenCapture, Ce as useScrollLock, it as useScrollOverflow, Jo as useSearchParams, Qe as useServiceWorkerUpdate, Ue as useSet, ws as useSfxPool, rt as useSortable, Hs as useSpeechRecognition, De as useStableCallback, tt as useStorageEstimate, lt as useSyncStatus, Sl as useTelemetry, Qo as useTheme, je as useThrottle, Ae as useTimeout, un as useToast, oe as useToggle, Lr as useTorch, ba as useTranslate, ze as useTypewriter, ko as useUpdate, cc as useViaCEP, Rs as useVideoRecorder, hc as useWatch, yc as useWebSocket, Me as useWindowSize, Zs as useZodForm, tc as validateCNPJ, nc as validateCPF, Ys as validateForm, Kr as visibleTurns, Bt as withAllOption, Vt as withEmptyOption, Ji as withTimeout, Xi as writeXlsx, Xs as zodResolver };
|
|
352
|
+
import { describeAppError as El } from "./telemetry/describe-app-error.js";
|
|
353
|
+
import { createAppErrorReporter as Dl } from "./telemetry/app-error-reporter.js";
|
|
354
|
+
import { createAppErrorTelemetryAdapter as Ol } from "./telemetry/app-error-adapter.js";
|
|
355
|
+
import { FeatureFlagsProvider as kl, useFeatureFlag as Al, useFlagValue as jl } from "./feature-flags/FeatureFlagsProvider.js";
|
|
356
|
+
import { createInMemoryFlags as Ml } from "./feature-flags/in-memory-adapter.js";
|
|
357
|
+
import { createGrowthBookFeatureFlagsAdapter as Nl } from "./feature-flags/growthbook-adapter.js";
|
|
358
|
+
import { createLaunchDarklyFeatureFlagsAdapter as Pl } from "./feature-flags/launchdarkly-adapter.js";
|
|
359
|
+
import { DIVERGING_STEP_COUNT as Fl, ORDINAL_START_STEP as Il, SEQUENTIAL_STEP_COUNT as Ll, divergingScale as Rl, scaleSteps as zl, sequentialScale as Bl } from "./charts/scales.js";
|
|
360
|
+
import { cachedResponseBytes as Vl } from "./perf/cache-size.js";
|
|
361
|
+
import { readDeviceProfile as Hl } from "./perf/device.js";
|
|
362
|
+
import { formatDurationMs as Ul } from "./perf/format.js";
|
|
363
|
+
import { createInferenceProfiler as Wl } from "./perf/profiler.js";
|
|
364
|
+
export { Yt as ABSENT_TEXT, Xr as AIChat, qr as AIChatComposer, Yr as AIChatTurn, jr as ALL_BARCODE_FORMATS, Rt as ALL_OPTION_VALUE, fa as API_ERROR_OFFLINE_KEY, pa as API_ERROR_VALIDATION_KEY, br as AUDIO_MIME_CANDIDATES, Ya as AccessControlProvider, t as Accordion, n as Alert, i as AppBar, es as AppProviders, jo as AppRouter, s as AppShell, c as AspectRatio, vr as AudioPlayer, Ar as AudioRecorder, ja as AuthGuard, l as Avatar, u as AvatarGroup, a as BREAKPOINTS, d as Badge, f as Banner, ti as BarList, zr as BarcodeScanner, p as BottomNavigation, h as BottomSheet, g as Breadcrumbs, No as BrowserRouter, _ as Button, ro as CACHE_TIME, rc as CEPInput, ic as CNPJInput, ac as CPFInput, Yn as Calendar, Qa as Can, v as Card, tr as Carousel, y as Center, hr as Chat, pr as ChatBubble, mr as ChatComposer, b as Checkbox, x as ChipInput, Mn as ClickOutside, Dn as CodeBlock, Un as Collapsible, C as Combobox, Kn as Command, Nn as ConditionalWrapper, T as ConfirmDialog, z as Container, Wn as ContextMenu, lc as Controller, En as CopyButton, ma as DEFAULT_API_ERROR_STRINGS, Mr as DEFAULT_BARCODE_FORMATS, Hc as DEFAULT_CAR_SPEED_KMH, Ta as DEFAULT_CHUNK_SIZE, Uc as DEFAULT_CIRCUITY_FACTOR, ia as DEFAULT_CSRF_COOKIE_NAME, aa as DEFAULT_CSRF_HEADER_NAME, Ts as DEFAULT_MAX_GAIN, Wc as DEFAULT_MODE_DURATION_FACTORS, _n as DEFAULT_PLAYBACK_RATES, Ia as DEFAULT_PUB_KEY_CRED_PARAMS, ve as DEFAULT_PUSH_TO_TALK_KEY, Os as DEFAULT_VOICE_CHAIN, Fl as DIVERGING_STEP_COUNT, Ln as DataList, nr as DataTable, D as DatePicker, Qn as DateRangePicker, Rn as DescriptionList, O as Divider, k as Drawer, A as DropdownMenu, j as Dropzone, Lc as EARTH_RADIUS_KM, M as EmptyState, $o as ErrorBoundary, N as ErrorState, Fn as ErrorText, kl as FeatureFlagsProvider, P as FileUpload, oi as FilterBar, _i as FilterPanel, ir as FloatingActionButton, Pn as For, F as Form, I as FormActions, Js as FormField, uc as FormProvider, L as FormRow, R as FormSection, to as GoogleSignIn, B as Grid, gc as HEARTBEAT_CLOSE_CODE, Po as HashRouter, Mt as Hide, Gn as HoverCard, _a as I18nProvider, In as Image, dn as ImageCropper, E as Input, Y as InstallBanner, X as InstallButton, pt as Kanban, ht as Kbd, Hn as Label, lr as Lightbox, Fo as Link, rr as ListTile, Jr as Markdown, Qr as Masonry, Io as MemoryRouter, er as Menubar, w as Modal, gt as ModalsProvider, kn as Money, oc as MoneyInput, Zn as MultiSelect, yt as NProgressBar, Lo as NavLink, vt as Navbar, Ro as Navigate, $n as NavigationMenu, ar as NavigationRail, hn as NotificationCenter, Il as ORDINAL_START_STEP, st as OfflineIndicator, zo as Outlet, ye as PUSH_TO_TALK_KEYS, xt as Page, St as Pagination, La as PasskeyError, Ct as PasswordInput, sc as PhoneInput, Tt as PinInput, Et as Popover, S as Portal, Dt as Progress, Sn as QRCapacityError, Tn as QRCode, co as QueryProvider, io as REFETCH_TIME, Ot as Radio, kt as RadioGroup, At as RangeSlider, jt as RatingStars, sr as RefreshIndicator, On as RelativeTime, Jn as Resizable, Bo as Route, Ao as RouteGuard, Vo as Routes, Ll as SEQUENTIAL_STEP_COUNT, ao as STALE_TIME, Pt as SafeArea, pn as Scheduler, qn as ScrollArea, Ft as SearchBar, It as SegmentedControl, Lt as Select, Nt as Show, Ut as Sidebar, ur as SignaturePad, Wt as Skeleton, Xn as Slider, Gt as Spacer, fn as Sparkline, Kt as Spinner, V as Stack, qt as Stat, Jt as Stepper, en as StepperInput, tn as Switch, dt as SyncStatusBadge, rn as Table, an as Tabs, nn as Tag, xl as TelemetryProvider, sa as TempestApiError, xo as TempestDataProvider, on as Textarea, Zo as ThemeProvider, or as TimePicker, sn as Timeline, ln as ToastProvider, zn as Toggle, Bn as ToggleGroup, Vn as ToggleGroupItem, cn as Tooltip, $r as Tour, tl as TrajectoryMap, Zr as Transfer, An as TreeView, jn as TruncateText, ft as UpdatePrompt, vn as VideoPlayer, yn as VirtualList, xn as VirtualTable, ut as VisuallyHidden, as as WebPushClient, os as WebPushPermissionDeniedError, ss as WebPushUnsupportedError, cr as Wizard, Ht as activeNavKey, Br as aiChatStrings, we as announce, hi as applyFilters, mt as applyKanbanMove, nl as applyTheme, Ri as assertNever, Ra as base64UrlToBytes, Rc as bearingDeg, Or as blobToWav, Kc as boundingBox, qc as boundsCenter, na as buildApiUrl, ei as buildBarListRows, H as buildOpenInChromeIntent, za as bytesToBase64Url, Vl as cachedResponseBytes, wi as camelCase, Ti as capitalize, Ai as chunk, Xt as clamp, Mc as clampLatitude, Ba as classifyPasskeyError, Te as clearAnnouncer, _s as clearCaches, e as cn, bn as compareValues, bi as compressToString, xi as compressedStorage, Si as compressedStorageCodec, yl as consoleSink, Cl as consoleTelemetryAdapter, il as contrastRatio, da as createApiClient, Dl as createAppErrorReporter, Ol as createAppErrorTelemetryAdapter, Es as createAudioBus, ys as createAudioPlayer, xr as createAudioRecorder, Aa as createAuthStore, Nr as createBarcodeDetector, al as createColorScale, bo as createDataProvider, ts as createEventStream, Nl as createGrowthBookFeatureFlagsAdapter, ga as createI18n, Ml as createInMemoryFlags, Wl as createInferenceProfiler, vi as createJsonStorage, Pl as createLaunchDarklyFeatureFlagsAdapter, wr as createLevelMeter, Cc as createLinkStatsSampler, Ea as createLocalUploadStorage, bl as createLogger, yr as createMediaRecorder, Qc as createOSRMBackend, Us as createOfflineDatabase, vo as createOfflineStore, Ws as createOfflineSync, fs as createPartialResponse, Va as createPasskeyClient, jc as createPeerMesh, $c as createPositionTracker, Tl as createPostHogTelemetryAdapter, oo as createQueryKeys, Fa as createRefreshQueue, Da as createResumableUpload, $a as createRoleAccessControl, Xo as createSelectors, wl as createSentryTelemetryAdapter, Cs as createSfxPool, Yo as createStore, Ja as createTempestAuth, pl as createTheme, Fs as createVideoRecorder, ks as createVoiceChain, vc as createWebSocket, oa as csrfHeaders, Ui as debounce, Ma as decodeJWT, Ci as decompressFromString, Pi as deepMerge, J as defaultInstallHint, Mo as defineRoutes, ha as describeApiError, El as describeAppError, ni as describeFilter, Rl as divergingScale, ea as downloadCsv, lo as emptyOffsetPage, Cn as encodeQR, kr as encodeWav, wt as estimatePasswordStrength, $e as estimateStorage, Gc as estimateTravel, Jc as expandBounds, ri as filtersFromSearchParams, gi as filtersToQueryParams, ii as filtersToSearchParams, Yc as fitProjection, Zt as formatBytes, Qs as formatCEP, $s as formatCNPJ, si as formatCPF, Qt as formatCompactNumber, ci as formatCurrency, li as formatDate, ui as formatDateForInput, di as formatDateTime, fi as formatDateTimeForInput, Ul as formatDurationMs, pi as formatPercent, mi as formatPhone, wa as generateIdempotencyKey, _l as getInitialTheme, Pr as getSupportedBarcodeFormats, hl as getThemePreset, ji as groupBy, zc as haversineKm, ol as hexToOklch, sl as hexToRgb, cl as hexToRgbaString, Gs as higherVersionWins, vs as inspectCaches, hs as installBackgroundSync, ls as installNotificationClickHandler, ps as installPrecache, us as installPushHandler, ms as installRuntimeCache, ds as installSkipWaitingListener, U as isAndroid, W as isAndroidWithoutPromptApi, ca as isApiError, gr as isAudioOutputSelectionSupported, Sr as isAudioRecordingSupported, Fr as isBarcodeDetectionSupported, Ha as isConditionalMediationAvailable, Nc as isCoordinate, uo as isCursorPage, zi as isDefined, Fi as isEmpty, ge as isFullscreenSupported, Vr as isGenerating, G as isIOS, Na as isJWTExpired, Er as isMediaCaptureSupported, Bi as isNumber, fo as isOffsetPage, Ua as isPasskeySupported, Vi as isPlainObject, Wa as isPlatformAuthenticatorAvailable, rs as isPushSupported, _c as isRejectionCloseCode, la as isRetriableStatus, zs as isScreenCaptureSupported, Zi as isShareSupported, Vs as isSpeechRecognitionSupported, K as isStandalone, Hi as isString, ra as isTrustedCredentialTarget, Pc as isValidLatitude, Fc as isValidLongitude, Is as isVideoRecordingSupported, As as isVoiceChainIdle, Ei as kebabCase, Hr as lastAssistantId, Ks as lastWriteWins, Pa as lazyWithRetry, Co as listQueryKey, wn as matrixToPath, Ms as measureNoiseFloor, Wi as memoizeOne, Ps as monitorVoiceActivity, js as monitorVoiceChain, nt as moveItem, Ir as normalizeBarcode, Ic as normalizeLongitude, bt as nprogress, ll as oklchToHex, Ii as omit, Gi as once, wo as oneQueryKey, ai as operatorsFor, Sa as parseResponse, Bc as pathLengthKm, $t as percentOf, eo as permissionsFromToken, yo as persistQueryClientOffline, Li as pick, Cr as pickAudioMimeType, Ls as pickVideoMimeType, bs as playAudio, Di as pluralize, Xc as projectMercator, be as pushToTalkKeyLabel, Yi as randomId, Mi as range, wc as readAvailableOutgoingKbps, Hl as readDeviceProfile, Tc as readQualityLimitation, Ec as readRelayed, Dc as readRoundTripMs, rl as readThemeToken, ul as readableForeground, dr as receiptLabel, Ho as redirect, gs as registerPeriodicSync, Ye as registerServiceWorker, dl as relativeLuminance, mn as relativeTime, go as removeById, et as requestPersistentStorage, kc as resolveDegradation, fr as resolveReceiptState, ua as retry, fl as rgbToHex, Ur as roleLabel, Ac as scaleForRoom, zl as scaleSteps, Bl as sequentialScale, _r as setAudioOutput, r as setDevBuild, Sc as setSenderBitrate, bc as setTunedLocalDescription, Qi as share, $i as shareOrDownloadBlob, so as shouldRetryQuery, Xe as skipWaiting, qi as sleep, Oi as slugify, xs as stopAudio, yi as storage, Ns as suggestGateThreshold, Wr as tailSignature, ml as themeContrast, vl as themeInitScript, gl as themePresets, Ki as throttle, ta as toCsv, zt as toOptions, Vc as toRadians, ki as truncate, xc as tuneOpus, Gr as turnTime, Ni as uniqueBy, ec as unmask, Zc as unprojectMercator, Ze as unregisterAllServiceWorkers, Oa as uploadFingerprint, Ca as uploadWithProgress, _o as upsertById, is as urlBase64ToUint8Array, Xa as useAccessControl, Ee as useAnnounce, se as useAsync, Ss as useAudio, Ds as useAudioBus, Tr as useAudioRecorder, Rr as useBarcodeScanner, me as useBeforeInstallPrompt, o as useBreakpoint, Za as useCan, Ge as useClickOutside, $ as useClientFilter, fe as useClipboard, Re as useCountdown, Le as useCounter, To as useCreate, mo as useCursorQuery, So as useDataProvider, Z as useDebounce, ee as useDeepMemo, Eo as useDelete, xa as useDescribeApiError, Fe as useDisclosure, Be as useDocumentTitle, le as useDocumentVisibility, ne as useDraftFilters, qs as useErrorHandler, ie as useEventListener, ns as useEventStream, Ve as useFavicon, Al as useFeatureFlag, dc as useFieldArray, jl as useFlagValue, m as useFocusTrap, fc as useForm, pc as useFormContext, mc as useFormState, _e as useFullscreen, Se as useGeolocation, Ne as useHover, va as useI18n, he as useIdle, q as useInstallPrompt, ue as useIntersectionObserver, ke as useInterval, Ke as useIsFirstRender, pe as useKeyboardShortcut, te as useLatestRef, Oc as useLinkStats, Do as useList, Ie as useListState, ae as useLocalStorage, Uo as useLocation, Pe as useLongPress, Je as useLongPressHandlers, He as useMap, Wo as useMatch, ot as useMediaDevices, at as useMediaPermission, re as useMediaQuery, Dr as useMicrophone, _t as useModals, Go as useNavigate, gn as useNotificationInbox, no as useOAuthCallback, qe as useObjectUrl, ho as useOfflineMutation, ct as useOfflineSync, Oo as useOne, ce as useOnline, ya as useOptionalI18n, po as usePaginatedQuery, Q as usePagination, Ko as useParams, Ga as usePasskeyCapabilities, Ka as usePasskeyRegistration, qa as usePasskeySignIn, ka as usePoll, el as usePositionTracker, Oe as usePrevious, cs as usePushSubscription, xe as usePushToTalk, We as useQueue, de as useResizeObserver, qo as useRouteError, Bs as useScreenCapture, Ce as useScrollLock, it as useScrollOverflow, Jo as useSearchParams, Qe as useServiceWorkerUpdate, Ue as useSet, ws as useSfxPool, rt as useSortable, Hs as useSpeechRecognition, De as useStableCallback, tt as useStorageEstimate, lt as useSyncStatus, Sl as useTelemetry, Qo as useTheme, je as useThrottle, Ae as useTimeout, un as useToast, oe as useToggle, Lr as useTorch, ba as useTranslate, ze as useTypewriter, ko as useUpdate, cc as useViaCEP, Rs as useVideoRecorder, hc as useWatch, yc as useWebSocket, Me as useWindowSize, Zs as useZodForm, tc as validateCNPJ, nc as validateCPF, Ys as validateForm, Kr as visibleTurns, Bt as withAllOption, Vt as withEmptyOption, Ji as withTimeout, Xi as writeXlsx, Xs as zodResolver };
|