@polishd/next 0.1.0 → 0.2.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/AGENTS.md +161 -46
- package/CHANGELOG.md +128 -0
- package/README.md +238 -48
- package/bin/doctor.mjs +374 -0
- package/bin/init.mjs +215 -188
- package/bin/polishd.mjs +85 -0
- package/bin/shared.mjs +114 -0
- package/dist/ai/actions.d.ts +7 -2
- package/dist/ai/actions.d.ts.map +1 -1
- package/dist/ai/actions.js +9 -1
- package/dist/ai/actions.js.map +1 -1
- package/dist/ai/guard.d.ts +44 -3
- package/dist/ai/guard.d.ts.map +1 -1
- package/dist/ai/guard.js +13 -2
- package/dist/ai/guard.js.map +1 -1
- package/dist/ai/providers.d.ts +2 -0
- package/dist/ai/providers.d.ts.map +1 -1
- package/dist/ai/providers.js +70 -0
- package/dist/ai/providers.js.map +1 -1
- package/dist/ai/settings.d.ts +15 -1
- package/dist/ai/settings.d.ts.map +1 -1
- package/dist/ai/settings.js +38 -1
- package/dist/ai/settings.js.map +1 -1
- package/dist/ai/types.d.ts +10 -0
- package/dist/ai/types.d.ts.map +1 -1
- package/dist/client/init.d.ts.map +1 -1
- package/dist/client/init.js +51 -2
- package/dist/client/init.js.map +1 -1
- package/dist/config.d.ts +57 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +62 -3
- package/dist/config.js.map +1 -1
- package/dist/dashboard/index.d.ts +34 -5
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +145 -17
- package/dist/dashboard/index.js.map +1 -1
- package/dist/dashboard/summary.d.ts.map +1 -1
- package/dist/dashboard/summary.js +59 -5
- package/dist/dashboard/summary.js.map +1 -1
- package/dist/dashboard/token-auth.d.ts +56 -0
- package/dist/dashboard/token-auth.d.ts.map +1 -0
- package/dist/dashboard/token-auth.js +158 -0
- package/dist/dashboard/token-auth.js.map +1 -0
- package/dist/dashboard/unlock.d.ts +2 -0
- package/dist/dashboard/unlock.d.ts.map +1 -0
- package/dist/dashboard/unlock.js +54 -0
- package/dist/dashboard/unlock.js.map +1 -0
- package/dist/dashboard.css +2601 -0
- package/dist/proxy.d.ts +53 -5
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +73 -3
- package/dist/proxy.js.map +1 -1
- package/dist/route.d.ts.map +1 -1
- package/dist/route.js +11 -3
- package/dist/route.js.map +1 -1
- package/dist/server/ingest.d.ts +33 -2
- package/dist/server/ingest.d.ts.map +1 -1
- package/dist/server/ingest.js +61 -7
- package/dist/server/ingest.js.map +1 -1
- package/dist/server/queries.d.ts +16 -0
- package/dist/server/queries.d.ts.map +1 -1
- package/dist/server/queries.js +80 -16
- package/dist/server/queries.js.map +1 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +4 -2
- package/dist/session.js.map +1 -1
- package/docs/SETUP.md +308 -51
- package/package.json +14 -7
package/dist/config.d.ts
CHANGED
|
@@ -6,8 +6,10 @@
|
|
|
6
6
|
* Anthropic keys) never live here — they are read from `process.env` on the
|
|
7
7
|
* server only. See `server/store.ts`.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
9
|
+
* A root `polishd.config.ts` is a convenience for keeping your overrides in one
|
|
10
|
+
* file — but nothing imports it for you. Whatever it exports has to be passed
|
|
11
|
+
* to `initPolishd()`, `createPolishdRoute()` and your proxy explicitly. See
|
|
12
|
+
* `definePolishdConfig` below.
|
|
11
13
|
*/
|
|
12
14
|
export interface PolishdConfig {
|
|
13
15
|
/** Whether capture is active at all. Disable to fully no-op the client. */
|
|
@@ -29,8 +31,60 @@ export interface PolishdConfig {
|
|
|
29
31
|
databasePath: string;
|
|
30
32
|
/** Name of the anonymous session cookie set by the middleware. */
|
|
31
33
|
sessionCookie: string;
|
|
34
|
+
/**
|
|
35
|
+
* Route the dashboard itself is mounted at. Nothing that happens on this
|
|
36
|
+
* route (or below it) is ever captured — the dashboard is a tool for reading
|
|
37
|
+
* the story, not part of the story, and its own clicks would otherwise show
|
|
38
|
+
* up as the site's most-used feature. Change this only if you mounted
|
|
39
|
+
* `createPolishdPage()` somewhere other than `/polishd`.
|
|
40
|
+
*/
|
|
41
|
+
dashboardRoute: string;
|
|
32
42
|
}
|
|
33
43
|
export declare const defaultPolishdConfig: PolishdConfig;
|
|
34
|
-
/**
|
|
44
|
+
/**
|
|
45
|
+
* Type-checked helper for the host app's root `polishd.config.ts`.
|
|
46
|
+
*
|
|
47
|
+
* Important: this file is **not** loaded automatically. It cannot be — the
|
|
48
|
+
* three places that need config run in three different runtimes (the browser,
|
|
49
|
+
* the Edge proxy, and the Node route handler), and the Edge one has no
|
|
50
|
+
* filesystem to read it from. So the object it returns has to be threaded to
|
|
51
|
+
* each of them by hand:
|
|
52
|
+
*
|
|
53
|
+
* import polishd from "@/polishd.config";
|
|
54
|
+
* initPolishd(polishd); // instrumentation-client.ts
|
|
55
|
+
* export const POST = createPolishdRoute(polishd); // api/polishd/route.ts
|
|
56
|
+
* const { proxy } = createPolishdProxy(polishd); // proxy.ts
|
|
57
|
+
*
|
|
58
|
+
* Miss one and the layers disagree silently: a client posting to one route
|
|
59
|
+
* while the handler reads another, or a proxy minting `a` while ingest looks
|
|
60
|
+
* for `b`, which presents as the empty dashboard described in
|
|
61
|
+
* {@link resolveSessionCookie}.
|
|
62
|
+
*
|
|
63
|
+
* For `sessionCookie` specifically, prefer `POLISHD_SESSION_COOKIE` — it is
|
|
64
|
+
* the one channel all three runtimes can read, so it cannot go half-applied.
|
|
65
|
+
*/
|
|
35
66
|
export declare function definePolishdConfig(overrides: Partial<PolishdConfig>): PolishdConfig;
|
|
67
|
+
/**
|
|
68
|
+
* Resolve the session cookie name from the one source every runtime shares.
|
|
69
|
+
*
|
|
70
|
+
* The cookie name is the single setting that *must* agree across process
|
|
71
|
+
* boundaries: the proxy mints it at the Edge and the ingest route reads it in
|
|
72
|
+
* Node. If those two disagree, every beacon arrives without a recognised
|
|
73
|
+
* session and is dropped — the same silent, 200-returning, empty-dashboard
|
|
74
|
+
* failure as a proxy that never ran at all.
|
|
75
|
+
*
|
|
76
|
+
* An explicit argument still wins, for anyone threading a config object
|
|
77
|
+
* deliberately. Absent that, `POLISHD_SESSION_COOKIE` is read directly, which
|
|
78
|
+
* both runtimes can do, so a single env var keeps them in step with nothing to
|
|
79
|
+
* remember.
|
|
80
|
+
*/
|
|
81
|
+
export declare function resolveSessionCookie(override?: string): string;
|
|
82
|
+
/**
|
|
83
|
+
* True when `path` is the dashboard route or a page beneath it. The single
|
|
84
|
+
* definition of "this is the dashboard's own traffic", shared by the browser
|
|
85
|
+
* capture layer and the ingest endpoint so the two can't drift.
|
|
86
|
+
*
|
|
87
|
+
* A blank route disables the exclusion rather than matching everything.
|
|
88
|
+
*/
|
|
89
|
+
export declare function isDashboardPath(path: string, route: string): boolean;
|
|
36
90
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,aAAa;IAC5B,2EAA2E;IAC3E,OAAO,EAAE,OAAO,CAAC;IACjB,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,eAAe,EAAE,MAAM,CAAC;IACxB,6EAA6E;IAC7E,YAAY,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,+EAA+E;IAC/E,YAAY,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,aAAa,EAAE,MAAM,CAAC;IACtB;;;;;;OAMG;IACH,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,oBAAoB,EAAE,aAUlC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAEpF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAK9D;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAIpE"}
|
package/dist/config.js
CHANGED
|
@@ -6,8 +6,10 @@
|
|
|
6
6
|
* Anthropic keys) never live here — they are read from `process.env` on the
|
|
7
7
|
* server only. See `server/store.ts`.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
9
|
+
* A root `polishd.config.ts` is a convenience for keeping your overrides in one
|
|
10
|
+
* file — but nothing imports it for you. Whatever it exports has to be passed
|
|
11
|
+
* to `initPolishd()`, `createPolishdRoute()` and your proxy explicitly. See
|
|
12
|
+
* `definePolishdConfig` below.
|
|
11
13
|
*/
|
|
12
14
|
export const defaultPolishdConfig = {
|
|
13
15
|
enabled: true,
|
|
@@ -18,9 +20,66 @@ export const defaultPolishdConfig = {
|
|
|
18
20
|
rageClick: { count: 3, windowMs: 500 },
|
|
19
21
|
databasePath: ".polishd/analytics.db",
|
|
20
22
|
sessionCookie: "polishd_session",
|
|
23
|
+
dashboardRoute: "/polishd",
|
|
21
24
|
};
|
|
22
|
-
/**
|
|
25
|
+
/**
|
|
26
|
+
* Type-checked helper for the host app's root `polishd.config.ts`.
|
|
27
|
+
*
|
|
28
|
+
* Important: this file is **not** loaded automatically. It cannot be — the
|
|
29
|
+
* three places that need config run in three different runtimes (the browser,
|
|
30
|
+
* the Edge proxy, and the Node route handler), and the Edge one has no
|
|
31
|
+
* filesystem to read it from. So the object it returns has to be threaded to
|
|
32
|
+
* each of them by hand:
|
|
33
|
+
*
|
|
34
|
+
* import polishd from "@/polishd.config";
|
|
35
|
+
* initPolishd(polishd); // instrumentation-client.ts
|
|
36
|
+
* export const POST = createPolishdRoute(polishd); // api/polishd/route.ts
|
|
37
|
+
* const { proxy } = createPolishdProxy(polishd); // proxy.ts
|
|
38
|
+
*
|
|
39
|
+
* Miss one and the layers disagree silently: a client posting to one route
|
|
40
|
+
* while the handler reads another, or a proxy minting `a` while ingest looks
|
|
41
|
+
* for `b`, which presents as the empty dashboard described in
|
|
42
|
+
* {@link resolveSessionCookie}.
|
|
43
|
+
*
|
|
44
|
+
* For `sessionCookie` specifically, prefer `POLISHD_SESSION_COOKIE` — it is
|
|
45
|
+
* the one channel all three runtimes can read, so it cannot go half-applied.
|
|
46
|
+
*/
|
|
23
47
|
export function definePolishdConfig(overrides) {
|
|
24
48
|
return { ...defaultPolishdConfig, ...overrides };
|
|
25
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Resolve the session cookie name from the one source every runtime shares.
|
|
52
|
+
*
|
|
53
|
+
* The cookie name is the single setting that *must* agree across process
|
|
54
|
+
* boundaries: the proxy mints it at the Edge and the ingest route reads it in
|
|
55
|
+
* Node. If those two disagree, every beacon arrives without a recognised
|
|
56
|
+
* session and is dropped — the same silent, 200-returning, empty-dashboard
|
|
57
|
+
* failure as a proxy that never ran at all.
|
|
58
|
+
*
|
|
59
|
+
* An explicit argument still wins, for anyone threading a config object
|
|
60
|
+
* deliberately. Absent that, `POLISHD_SESSION_COOKIE` is read directly, which
|
|
61
|
+
* both runtimes can do, so a single env var keeps them in step with nothing to
|
|
62
|
+
* remember.
|
|
63
|
+
*/
|
|
64
|
+
export function resolveSessionCookie(override) {
|
|
65
|
+
if (override)
|
|
66
|
+
return override;
|
|
67
|
+
const fromEnv = process.env.POLISHD_SESSION_COOKIE;
|
|
68
|
+
if (fromEnv && fromEnv.length > 0)
|
|
69
|
+
return fromEnv;
|
|
70
|
+
return defaultPolishdConfig.sessionCookie;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* True when `path` is the dashboard route or a page beneath it. The single
|
|
74
|
+
* definition of "this is the dashboard's own traffic", shared by the browser
|
|
75
|
+
* capture layer and the ingest endpoint so the two can't drift.
|
|
76
|
+
*
|
|
77
|
+
* A blank route disables the exclusion rather than matching everything.
|
|
78
|
+
*/
|
|
79
|
+
export function isDashboardPath(path, route) {
|
|
80
|
+
const r = route.replace(/\/+$/, "");
|
|
81
|
+
if (!r)
|
|
82
|
+
return false;
|
|
83
|
+
return path === r || path.startsWith(`${r}/`);
|
|
84
|
+
}
|
|
26
85
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AA6BH,MAAM,CAAC,MAAM,oBAAoB,GAAkB;IACjD,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,cAAc;IACxB,eAAe,EAAE,MAAM;IACvB,YAAY,EAAE,EAAE;IAChB,UAAU,EAAE,CAAC;IACb,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE;IACtC,YAAY,EAAE,uBAAuB;IACrC,aAAa,EAAE,iBAAiB;IAChC,cAAc,EAAE,UAAU;CAC3B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAiC;IACnE,OAAO,EAAE,GAAG,oBAAoB,EAAE,GAAG,SAAS,EAAE,CAAC;AACnD,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAiB;IACpD,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IACnD,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IAClD,OAAO,oBAAoB,CAAC,aAAa,CAAC;AAC5C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,KAAa;IACzD,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACpC,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrB,OAAO,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -17,11 +17,14 @@
|
|
|
17
17
|
import type { Metadata } from "next";
|
|
18
18
|
import type { ReactNode } from "react";
|
|
19
19
|
import { type PolishdDashboardData } from "../server/queries";
|
|
20
|
+
import { type PolishdAuthenticate } from "../ai/guard";
|
|
21
|
+
import { type PolishdTokenAuthOptions } from "./token-auth";
|
|
20
22
|
import type { PolishdAISettingsPublic, PolishdProjectProfile, PolishdSummary } from "../ai/types";
|
|
21
23
|
export declare const runtime = "nodejs";
|
|
22
24
|
export declare const dynamic = "force-dynamic";
|
|
23
25
|
export declare const metadata: Metadata;
|
|
24
26
|
export { loadPolishdDashboardData, type PolishdDashboardData } from "../server/queries";
|
|
27
|
+
export { polishdTokenAuth, POLISHD_DASHBOARD_COOKIE, type PolishdTokenAuthOptions, } from "./token-auth";
|
|
25
28
|
/** The AI summary card's server-loaded inputs. */
|
|
26
29
|
export interface PolishdAIBundle {
|
|
27
30
|
summary: PolishdSummary | null;
|
|
@@ -37,18 +40,44 @@ export declare function PolishdDashboard({ data, ai, }: {
|
|
|
37
40
|
data: PolishdDashboardData;
|
|
38
41
|
ai: PolishdAIBundle;
|
|
39
42
|
}): import("react").JSX.Element;
|
|
43
|
+
/**
|
|
44
|
+
* Props Next passes to a page. Only `searchParams` is used — the unlock form
|
|
45
|
+
* reports failures through the URL so the whole flow stays server-rendered,
|
|
46
|
+
* with no client component and no token in the query string.
|
|
47
|
+
*/
|
|
48
|
+
export interface PolishdPageProps {
|
|
49
|
+
searchParams?: Promise<Record<string, string | string[] | undefined>>;
|
|
50
|
+
}
|
|
40
51
|
export interface CreatePolishdPageOptions {
|
|
41
52
|
/**
|
|
42
|
-
* Gate access to the dashboard. Return `true` to allow.
|
|
43
|
-
*
|
|
53
|
+
* Gate access to the dashboard. Return `true` to allow.
|
|
54
|
+
*
|
|
55
|
+
* Receives the request's cookies and headers, so the callback is an ordinary
|
|
56
|
+
* function of its inputs rather than something that only works inside a
|
|
57
|
+
* request. A zero-argument callback is still valid and unchanged.
|
|
58
|
+
*
|
|
59
|
+
* If omitted, POLISHD_DASHBOARD_TOKEN guards the dashboard when set;
|
|
60
|
+
* otherwise it renders unguarded in development and refuses in production.
|
|
61
|
+
*/
|
|
62
|
+
authenticate?: PolishdAuthenticate;
|
|
63
|
+
/**
|
|
64
|
+
* Rendered when `authenticate` resolves false. Defaults to a minimal screen,
|
|
65
|
+
* or to the token unlock form when `POLISHD_DASHBOARD_TOKEN` is in use.
|
|
44
66
|
*/
|
|
45
|
-
authenticate?: () => boolean | Promise<boolean>;
|
|
46
|
-
/** Rendered when `authenticate` resolves false. Defaults to a minimal screen. */
|
|
47
67
|
unauthorized?: ReactNode;
|
|
68
|
+
/** Tune the built-in token auth (mount path, grant lifetime). */
|
|
69
|
+
tokenAuth?: PolishdTokenAuthOptions;
|
|
70
|
+
/**
|
|
71
|
+
* Render the dashboard in a self-contained shell that supplies its own
|
|
72
|
+
* background and scroll container, so host `body` styles can't strand
|
|
73
|
+
* content below the fold. Set false to inherit the host page instead.
|
|
74
|
+
* @default true
|
|
75
|
+
*/
|
|
76
|
+
shell?: boolean;
|
|
48
77
|
}
|
|
49
78
|
/**
|
|
50
79
|
* Build the dashboard page component. Use as the default export of your
|
|
51
80
|
* `app/polishd/page.tsx`.
|
|
52
81
|
*/
|
|
53
|
-
export declare function createPolishdPage(opts?: CreatePolishdPageOptions): () => Promise<import("react").JSX.Element>;
|
|
82
|
+
export declare function createPolishdPage(opts?: CreatePolishdPageOptions): (props?: PolishdPageProps) => Promise<import("react").JSX.Element>;
|
|
54
83
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dashboard/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAErC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAEL,KAAK,oBAAoB,EAG1B,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dashboard/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAErC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAEL,KAAK,oBAAoB,EAG1B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAGL,KAAK,mBAAmB,EAEzB,MAAM,aAAa,CAAC;AACrB,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,cAAc,CAAC;AAItB,OAAO,KAAK,EACV,uBAAuB,EACvB,qBAAqB,EACrB,cAAc,EACf,MAAM,aAAa,CAAC;AAOrB,eAAO,MAAM,OAAO,WAAW,CAAC;AAChC,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,eAAO,MAAM,QAAQ,EAAE,QAGtB,CAAC;AAyLF,OAAO,EAAE,wBAAwB,EAAE,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAIxF,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,KAAK,uBAAuB,GAC7B,MAAM,cAAc,CAAC;AAEtB,kDAAkD;AAClD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/B,QAAQ,EAAE,uBAAuB,CAAC;IAClC,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACtC,iEAAiE;IACjE,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,wEAAwE;IACxE,eAAe,EAAE,OAAO,CAAC;CAC1B;AAGD,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,EAAE,GACH,EAAE;IACD,IAAI,EAAE,oBAAoB,CAAC;IAC3B,EAAE,EAAE,eAAe,CAAC;CACrB,+BA+SA;AAgED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC;CACvE;AAED,MAAM,WAAW,wBAAwB;IACvC;;;;;;;;;OASG;IACH,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC;;;OAGG;IACH,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,iEAAiE;IACjE,SAAS,CAAC,EAAE,uBAAuB,CAAC;IACpC;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AA0ID;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,wBAA6B,IAoBjC,QAAO,gBAAqB,0CAmE/D"}
|
package/dist/dashboard/index.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { after } from "next/server";
|
|
3
3
|
import { loadPolishdDashboardData, } from "../server/queries";
|
|
4
|
-
import { registerPolishdAuth } from "../ai/guard";
|
|
4
|
+
import { polishdAuthContext, registerPolishdAuth, } from "../ai/guard";
|
|
5
|
+
import { polishdDashboardToken, polishdTokenAuth, } from "./token-auth";
|
|
6
|
+
import { unlockPolishdDashboard } from "./unlock";
|
|
5
7
|
import { loadProfileState } from "../ai/profile";
|
|
6
8
|
import { generateSummary, getAISettingsPublic, loadSummaryState } from "../ai/summary";
|
|
7
9
|
import ElementsTable from "./elements";
|
|
@@ -63,18 +65,131 @@ function MonitoredRow({ m }) {
|
|
|
63
65
|
// the AI summary layer can share them without importing React; re-export for
|
|
64
66
|
// any existing callers of this module.
|
|
65
67
|
export { loadPolishdDashboardData } from "../server/queries";
|
|
68
|
+
// Named explicitly by hosts that want token auth alongside their own options;
|
|
69
|
+
// `createPolishdPage()` already applies it when POLISHD_DASHBOARD_TOKEN is set.
|
|
70
|
+
export { polishdTokenAuth, POLISHD_DASHBOARD_COOKIE, } from "./token-auth";
|
|
66
71
|
// ── Dashboard (presentational) ───────────────────────────────────────────────
|
|
67
72
|
export function PolishdDashboard({ data, ai, }) {
|
|
68
|
-
const { overview, pages, elements, devices, topUsed, journeys, errors, monitored } = data;
|
|
73
|
+
const { overview, health, pages, elements, devices, topUsed, journeys, errors, monitored } = data;
|
|
74
|
+
// Events are arriving but landing without a session cookie, which means the
|
|
75
|
+
// proxy isn't running on those requests. Shown while it's still happening
|
|
76
|
+
// (or while nothing at all has been stored), so a fixed proxy clears the
|
|
77
|
+
// banner on its own rather than leaving a permanent scold.
|
|
78
|
+
const proxyBroken = health.lastNoSessionAt !== null &&
|
|
79
|
+
(overview.totalEvents === 0 || Date.now() - health.lastNoSessionAt < 3_600_000);
|
|
69
80
|
return (_jsxs("main", { className: "mx-auto max-w-5xl px-4 py-8 sm:px-6 sm:py-10 text-white", children: [_jsxs("div", { className: `mb-8 flex items-start justify-between gap-3 border-b ${border} pb-6`, children: [_jsxs("div", { children: [_jsx("p", { className: label, children: "Polishd" }), _jsx("h1", { className: "mt-1 text-[22px] font-semibold tracking-tight text-white", children: "What gets measured gets improved" }), _jsxs("p", { className: "mt-1 text-[13px] text-[#666]", children: ["Stage 1 \u2014 Capture. Hover", " ", _jsx("span", { className: "inline-flex h-3 w-3 items-center justify-center rounded-full border border-[#444] text-[8px] font-bold text-[#666]", children: "i" }), " ", "for calculation details."] })] }), _jsx("div", { className: `shrink-0 whitespace-nowrap rounded-full px-3 py-1 text-[11px] font-medium ${overview.ready
|
|
70
81
|
? "bg-emerald-950 text-emerald-400"
|
|
71
|
-
: "bg-[#1a1a1a] text-[#666]"}`, children: overview.ready ? "● collecting" : "○ no store" })] }), !overview.ready && (_jsxs("div", { className: `mb-8 rounded-lg border border-amber-900/50 bg-amber-950/30 px-4 py-3 text-[13px] text-amber-400`, children: ["The analytics store isn't writable in this environment. Run locally or configure a database \u2014 see the ", _jsx("span", { className: "font-mono text-amber-300", children: "@polishd/next" }), " DATABASE.md guide."] })), _jsx(SummaryCard, { initialSummary: ai.summary, initialSettings: ai.settings, initialStale: ai.stale, initialProfile: ai.profile, initialGaps: ai.gaps, sourceAvailable: ai.sourceAvailable }), _jsx(Section, { title: "Overview", children: _jsxs("div", { className: "grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-6", children: [_jsx(Stat, { label: "Sessions", value: overview.sessions, tip: "Distinct anonymous visitors, counted by the polishd_session cookie. One cookie = one session; no fingerprinting." }), _jsx(Stat, { label: "Page views", value: overview.pageViews, tip: "page_view events \u2014 initial page loads plus client-side (soft) navigations between routes." }), _jsx(Stat, { label: "Rage clicks", value: overview.rageClicks, tone: "text-red-500", tip: "3+ clicks on the same element within 500ms. A strong signal of frustration \u2014 something looks clickable or is broken." }), _jsx(Stat, { label: "Dead clicks", value: overview.deadClicks, tone: "text-[#f5a623]", tip: "Clicks on non-interactive elements (no link, button, or role within 4 ancestors). Users expected something to happen but nothing did." }), _jsx(Stat, { label: "JS errors", value: overview.jsErrors, tone: "text-red-500", tip: "Uncaught exceptions and unhandled promise rejections, with page and component context." }), _jsx(Stat, { label: "Events", value: overview.totalEvents, tip: "Total raw signals captured across all event types." })] }) }), _jsx(Section, { title: _jsxs(_Fragment, { children: ["Device sizes", _jsx(InfoTip, { anchor: "left", text: "One viewport sample per session, taken at session start, bucketed by CSS width: mobile (<640px), tablet (640\u20131023px), desktop (\u22651024px). Shows what screen size visitors actually use." })] }), children: _jsx("div", { className: card, children: devices.length === 0 ? (_jsx("p", { className: "px-5 py-8 text-center text-[13px] text-[#555]", children: "No viewport data yet \u2014 browse the site then refresh." })) : (devices.map((d) => _jsx(DeviceRow, { bucket: d }, d.category))) }) }), _jsx(Section, { title: _jsxs(_Fragment, { children: ["Top pages", _jsx(InfoTip, { anchor: "left", text: "The most-visited routes, ranked by distinct sessions. Click a page to open a chart of its sessions over time." })] }), children: _jsx(TopPagesTable, { pages: pages }) }), _jsx(Section, { title: _jsxs(_Fragment, { children: ["Monitored components", _jsx(InfoTip, { anchor: "left", text: "Components explicitly wrapped in <PolishdMonitor>. Shows viewport engagement (views, avg time visible, scroll depth, dimensions) alongside click activity. A high view count with low clicks often signals interest without commitment." })] }), children: _jsx("div", { className: card, children: monitored.length === 0 ? (_jsxs("p", { className: "px-5 py-8 text-center text-[13px] text-[#555]", children: ["No monitored components yet \u2014 wrap elements with", " ", _jsx("code", { className: "font-mono text-[#777]", children: "<PolishdMonitor name=\"…\">" }), " to track them here."] })) : (_jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "w-full min-w-[700px]", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx(Th, { align: "left", tip: "The name prop passed to <PolishdMonitor>. Sessions and pages shown beneath.", children: "Component" }), _jsx(Th, { tip: "Times this region rendered (mount events). Only content-tracked monitors emit these.", children: "Mounts" }), _jsx(Th, { tip: "Times this component entered the viewport for \u2265500ms.", children: "Views" }), _jsx(Th, { tip: "Average time visible per viewport visit \u2014 a proxy for reading/engagement time.", children: "Avg time" }), _jsx(Th, { tip: "Average % of the component's height scrolled through per visit. 100% = user reached the bottom.", children: "Scroll depth" }), _jsx(Th, { tip: "Largest rendered height in px seen for this component \u2014 for an article, its full content height.", children: "Height" }), _jsx(Th, { tip: "Normal (non-rage, non-dead) clicks.", children: "Clicks" }), _jsx(Th, { tip: "Deliberate pointer hovers (\u2265200ms dwell).", children: "Hovers" }), _jsx(Th, { tip: "Rage clicks (3+ rapid clicks) \u2014 frustration signal.", children: "Rage" })] }) }), _jsx("tbody", { children: monitored.map((m) => (_jsx(MonitoredRow, { m: m }, m.name))) })] }) })) }) }), _jsx(Section, { title: _jsxs(_Fragment, { children: ["Sampled user journeys", _jsx(InfoTip, { anchor: "left", text: "Full sessions sampled and ranked by a composite score (rage\u00D73 + dead\u00D72 + errors\u00D72.5), preferring complete recordings and recent ones. Click a session to open its start-to-finish flow chart." })] }), children: _jsx(JourneyList, { journeys: journeys }) }), _jsx(Section, { title: _jsxs(_Fragment, { children: ["Most-used features", _jsx(InfoTip, { anchor: "left", text: "Interactive elements ranked by raw click volume (successful clicks only \u2014 rage and dead clicks excluded). The buttons and features visitors actually use most." })] }), children: _jsx("div", { className: card, children: topUsed.length === 0 ? (_jsx("p", { className: "px-5 py-8 text-center text-[13px] text-[#555]", children: "No clicks captured yet \u2014 browse the site then refresh." })) : (_jsx(TopFeaturesTable, { features: topUsed, header: _jsxs("tr", { children: [_jsx(Th, { align: "left", tip: "Component name (from data-component) or DOM selector. Sample text and selector shown beneath.", children: "Element" }), _jsx(Th, { tip: "Total successful (interactive) clicks across all pages.", children: "Clicks" }), _jsx(Th, { tip: "Distinct sessions that clicked this element.", children: "Sessions" }), _jsx(Th, { tip: "How many distinct pages this element was clicked on.", children: "Pages" })] }) })) }) }), _jsx(Section, { title: _jsxs(_Fragment, { children: ["Interactions by element", _jsx(InfoTip, { anchor: "left", text: "Click-type events grouped by DOM selector. This is which UI element the issues are on \u2014 the primary input to Stage 2 synthesis. Components wrapped in <PolishdMonitor> are listed separately under Monitored components." })] }), children: _jsx("div", { className: card, children: elements.length === 0 ? (_jsx("p", { className: "px-5 py-8 text-center text-[13px] text-[#555]", children: "No interactions captured yet \u2014 browse the site then refresh." })) : (_jsx(ElementsTable, { elements: elements, header: _jsxs("tr", { children: [_jsx(Th, { align: "left", tip: "DOM selector path for the interacted element. Sample text shown beneath.", children: "Element" }), _jsx(Th, { tip: "rage\u00D73 + dead\u00D72 for this element across all pages.", children: "Score" }), _jsx(Th, { tip: "Normal (non-rage, non-dead) clicks.", children: "Clicks" }), _jsx(Th, { tip: "Rage clicks on this element.", children: "Rage" }), _jsx(Th, { tip: "Dead clicks on this element.", children: "Dead" }), _jsx(Th, { tip: "How many distinct pages this element appeared on.", children: "Pages" })] }) })) }) }), errors.length > 0 && (_jsx(Section, { title: "Recent errors", children: _jsx("div", { className: card, children: errors.map((e, i) => (_jsx("div", { className: i > 0 ? divider : "", children: _jsxs("div", { className: "px-5 py-3", children: [_jsx("div", { className: "font-mono text-[13px] text-red-400", children: e.message }), _jsxs("div", { className: "mt-0.5 text-[11px] text-[#555]", children: [e.path, e.component ? ` · ${e.component}` : ""] })] }) }, i))) }) }))] }));
|
|
82
|
+
: "bg-[#1a1a1a] text-[#666]"}`, children: overview.ready ? "● collecting" : "○ no store" })] }), !overview.ready && (_jsxs("div", { className: `mb-8 rounded-lg border border-amber-900/50 bg-amber-950/30 px-4 py-3 text-[13px] text-amber-400`, children: ["The analytics store isn't writable in this environment. Run locally or configure a database \u2014 see the ", _jsx("span", { className: "font-mono text-amber-300", children: "@polishd/next" }), " DATABASE.md guide."] })), proxyBroken && (_jsxs("div", { className: "mb-8 rounded-lg border border-red-900/50 bg-red-950/30 px-4 py-3 text-[13px] text-red-400", children: [_jsx("p", { className: "font-medium text-red-300", children: "Receiving events, but no session cookie \u2014 your proxy isn't running." }), _jsxs("p", { className: "mt-1.5", children: [health.noSessionCount.toLocaleString(), " ", health.noSessionCount === 1 ? "batch has" : "batches have", " been dropped. Polishd attributes every event to the anonymous cookie the proxy mints, so nothing is being stored. Check that you have a", " ", _jsx("span", { className: "font-mono text-red-300", children: "proxy.ts" }), " (Next 16+) or", " ", _jsx("span", { className: "font-mono text-red-300", children: "middleware.ts" }), " (Next 15) at your project root \u2014 matching your installed Next major \u2014 exporting a function of the same name, with", " ", _jsx("span", { className: "font-mono text-red-300", children: "config.matcher" }), " written as an inline literal that covers the pages you're capturing."] }), _jsxs("p", { className: "mt-1.5 text-red-500/80", children: ["Run ", _jsx("span", { className: "font-mono text-red-300", children: "npx @polishd/next doctor" }), " to check this automatically."] })] })), _jsx(SummaryCard, { initialSummary: ai.summary, initialSettings: ai.settings, initialStale: ai.stale, initialProfile: ai.profile, initialGaps: ai.gaps, sourceAvailable: ai.sourceAvailable }), _jsx(Section, { title: "Overview", children: _jsxs("div", { className: "grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-6", children: [_jsx(Stat, { label: "Sessions", value: overview.sessions, tip: "Distinct anonymous visitors, counted by the polishd_session cookie. One cookie = one session; no fingerprinting." }), _jsx(Stat, { label: "Page views", value: overview.pageViews, tip: "page_view events \u2014 initial page loads plus client-side (soft) navigations between routes." }), _jsx(Stat, { label: "Rage clicks", value: overview.rageClicks, tone: "text-red-500", tip: "3+ clicks on the same element within 500ms. A strong signal of frustration \u2014 something looks clickable or is broken." }), _jsx(Stat, { label: "Dead clicks", value: overview.deadClicks, tone: "text-[#f5a623]", tip: "Clicks on non-interactive elements (no link, button, or role within 4 ancestors). Users expected something to happen but nothing did." }), _jsx(Stat, { label: "JS errors", value: overview.jsErrors, tone: "text-red-500", tip: "Uncaught exceptions and unhandled promise rejections, with page and component context." }), _jsx(Stat, { label: "Events", value: overview.totalEvents, tip: "Total raw signals captured across all event types." })] }) }), _jsx(Section, { title: _jsxs(_Fragment, { children: ["Device sizes", _jsx(InfoTip, { anchor: "left", text: "One viewport sample per session, taken at session start, bucketed by CSS width: mobile (<640px), tablet (640\u20131023px), desktop (\u22651024px). Shows what screen size visitors actually use." })] }), children: _jsx("div", { className: card, children: devices.length === 0 ? (_jsx("p", { className: "px-5 py-8 text-center text-[13px] text-[#555]", children: "No viewport data yet \u2014 browse the site then refresh." })) : (devices.map((d) => _jsx(DeviceRow, { bucket: d }, d.category))) }) }), _jsx(Section, { title: _jsxs(_Fragment, { children: ["Top pages", _jsx(InfoTip, { anchor: "left", text: "The most-visited routes, ranked by distinct sessions. Click a page to open a chart of its sessions over time." })] }), children: _jsx(TopPagesTable, { pages: pages }) }), _jsx(Section, { title: _jsxs(_Fragment, { children: ["Monitored components", _jsx(InfoTip, { anchor: "left", text: "Components explicitly wrapped in <PolishdMonitor>. Shows viewport engagement (views, avg time visible, scroll depth, dimensions) alongside click activity. A high view count with low clicks often signals interest without commitment." })] }), children: _jsx("div", { className: card, children: monitored.length === 0 ? (_jsxs("p", { className: "px-5 py-8 text-center text-[13px] text-[#555]", children: ["No monitored components yet \u2014 wrap elements with", " ", _jsx("code", { className: "font-mono text-[#777]", children: "<PolishdMonitor name=\"…\">" }), " to track them here."] })) : (_jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "w-full min-w-[700px]", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx(Th, { align: "left", tip: "The name prop passed to <PolishdMonitor>. Sessions and pages shown beneath.", children: "Component" }), _jsx(Th, { tip: "Times this region rendered (mount events). Only content-tracked monitors emit these.", children: "Mounts" }), _jsx(Th, { tip: "Times this component entered the viewport for \u2265500ms.", children: "Views" }), _jsx(Th, { tip: "Average time visible per viewport visit \u2014 a proxy for reading/engagement time.", children: "Avg time" }), _jsx(Th, { tip: "Average % of the component's height scrolled through per visit. 100% = user reached the bottom.", children: "Scroll depth" }), _jsx(Th, { tip: "Largest rendered height in px seen for this component \u2014 for an article, its full content height.", children: "Height" }), _jsx(Th, { tip: "Normal (non-rage, non-dead) clicks.", children: "Clicks" }), _jsx(Th, { tip: "Deliberate pointer hovers (\u2265200ms dwell).", children: "Hovers" }), _jsx(Th, { tip: "Rage clicks (3+ rapid clicks) \u2014 frustration signal.", children: "Rage" })] }) }), _jsx("tbody", { children: monitored.map((m) => (_jsx(MonitoredRow, { m: m }, m.name))) })] }) })) }) }), _jsx(Section, { title: _jsxs(_Fragment, { children: ["Sampled user journeys", _jsx(InfoTip, { anchor: "left", text: "Full sessions sampled and ranked by a composite score (rage\u00D73 + dead\u00D72 + errors\u00D72.5), preferring complete recordings and recent ones. Click a session to open its start-to-finish flow chart." })] }), children: _jsx(JourneyList, { journeys: journeys }) }), _jsx(Section, { title: _jsxs(_Fragment, { children: ["Most-used features", _jsx(InfoTip, { anchor: "left", text: "Interactive elements ranked by raw click volume (successful clicks only \u2014 rage and dead clicks excluded). The buttons and features visitors actually use most." })] }), children: _jsx("div", { className: card, children: topUsed.length === 0 ? (_jsx("p", { className: "px-5 py-8 text-center text-[13px] text-[#555]", children: "No clicks captured yet \u2014 browse the site then refresh." })) : (_jsx(TopFeaturesTable, { features: topUsed, header: _jsxs("tr", { children: [_jsx(Th, { align: "left", tip: "Component name (from data-component) or DOM selector. Sample text and selector shown beneath.", children: "Element" }), _jsx(Th, { tip: "Total successful (interactive) clicks across all pages.", children: "Clicks" }), _jsx(Th, { tip: "Distinct sessions that clicked this element.", children: "Sessions" }), _jsx(Th, { tip: "How many distinct pages this element was clicked on.", children: "Pages" })] }) })) }) }), _jsx(Section, { title: _jsxs(_Fragment, { children: ["Interactions by element", _jsx(InfoTip, { anchor: "left", text: "Click-type events grouped by DOM selector. This is which UI element the issues are on \u2014 the primary input to Stage 2 synthesis. Components wrapped in <PolishdMonitor> are listed separately under Monitored components." })] }), children: _jsx("div", { className: card, children: elements.length === 0 ? (_jsx("p", { className: "px-5 py-8 text-center text-[13px] text-[#555]", children: "No interactions captured yet \u2014 browse the site then refresh." })) : (_jsx(ElementsTable, { elements: elements, header: _jsxs("tr", { children: [_jsx(Th, { align: "left", tip: "DOM selector path for the interacted element. Sample text shown beneath.", children: "Element" }), _jsx(Th, { tip: "rage\u00D73 + dead\u00D72 for this element across all pages.", children: "Score" }), _jsx(Th, { tip: "Normal (non-rage, non-dead) clicks.", children: "Clicks" }), _jsx(Th, { tip: "Rage clicks on this element.", children: "Rage" }), _jsx(Th, { tip: "Dead clicks on this element.", children: "Dead" }), _jsx(Th, { tip: "How many distinct pages this element appeared on.", children: "Pages" })] }) })) }) }), errors.length > 0 && (_jsx(Section, { title: "Recent errors", children: _jsx("div", { className: card, children: errors.map((e, i) => (_jsx("div", { className: i > 0 ? divider : "", children: _jsxs("div", { className: "px-5 py-3", children: [_jsx("div", { className: "font-mono text-[13px] text-red-400", children: e.message }), _jsxs("div", { className: "mt-0.5 text-[11px] text-[#555]", children: [e.path, e.component ? ` · ${e.component}` : ""] })] }) }, i))) }) }))] }));
|
|
72
83
|
}
|
|
73
84
|
// ── Built-in fallback for a failed auth check ────────────────────────────────
|
|
74
85
|
function Unauthorized() {
|
|
75
86
|
return (_jsxs("main", { className: "mx-auto flex min-h-[60vh] max-w-md flex-col items-center justify-center px-6 text-center text-white", children: [_jsx("p", { className: label, children: "Polishd" }), _jsx("h1", { className: "mt-2 text-[20px] font-semibold tracking-tight", children: "Unauthorized" }), _jsxs("p", { className: "mt-2 text-[13px] text-[#666]", children: ["This dashboard is protected. Pass an ", _jsx("code", { className: "font-mono", children: "unauthorized" }), " element to", _jsx("code", { className: "font-mono", children: " createPolishdPage()" }), " to render your own sign-in UI here."] })] }));
|
|
76
87
|
}
|
|
77
|
-
|
|
88
|
+
/**
|
|
89
|
+
* A self-contained surface for the dashboard to render into.
|
|
90
|
+
*
|
|
91
|
+
* The dashboard is a route in someone else's app, so it inherits that app's
|
|
92
|
+
* `<body>`. That is fine until the host's body doesn't scroll — which is the
|
|
93
|
+
* default shape of every dashboard shell, chat UI, editor, and map app, all of
|
|
94
|
+
* which set `overflow: hidden` on body and scroll their own inner regions. In
|
|
95
|
+
* such a host the dashboard renders, looks correct above the fold, and silently
|
|
96
|
+
* strands everything below it: no error, no warning, HTTP 200.
|
|
97
|
+
*
|
|
98
|
+
* `fixed` is what fixes it. It escapes the host's `overflow: hidden` and any
|
|
99
|
+
* ancestor height constraint, and unlike a `min-h-dvh` wrapper it does not
|
|
100
|
+
* depend on the host having given `<body>` a usable height. It also supplies
|
|
101
|
+
* the background the dashboard's own cards assume, so the host's wallpaper
|
|
102
|
+
* stops showing through behind them.
|
|
103
|
+
*
|
|
104
|
+
* Caveat: `position: fixed` is defeated by an ancestor that establishes a
|
|
105
|
+
* containing block (`transform`, `filter`, `contain`, `will-change`). That is
|
|
106
|
+
* rare this close to the root, and `shell: false` is the escape hatch when it
|
|
107
|
+
* happens — see docs/SETUP.md for the fully isolated route-group layout.
|
|
108
|
+
*/
|
|
109
|
+
function PolishdShell({ children }) {
|
|
110
|
+
return (
|
|
111
|
+
// `text-white` is set here as a utility as well as on `.polishd-root` in
|
|
112
|
+
// the stylesheet, so the shell looks right in a 0.1.x app that upgraded
|
|
113
|
+
// without adding the stylesheet import and is still styled by its own
|
|
114
|
+
// Tailwind scanning our dist.
|
|
115
|
+
_jsx("div", { className: "fixed inset-0 z-[2147483000] overflow-y-auto overscroll-contain bg-[#050505] text-white", children: children }));
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* The scope root for the shipped stylesheet.
|
|
119
|
+
*
|
|
120
|
+
* `dist/dashboard.css` scopes every rule to `.polishd-root`, so nothing in it
|
|
121
|
+
* can reach the host app's markup. This element deliberately carries no utility
|
|
122
|
+
* classes of its own: keeping it a bare wrapper is what makes plain descendant
|
|
123
|
+
* scoping complete, and halves the size of the generated selectors.
|
|
124
|
+
*
|
|
125
|
+
* Rendered whether or not the shell is used, since the stylesheet is scoped
|
|
126
|
+
* either way.
|
|
127
|
+
*/
|
|
128
|
+
function PolishdRoot({ children }) {
|
|
129
|
+
return _jsx("div", { className: "polishd-root", children: children });
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* The unlock prompt shown when `POLISHD_DASHBOARD_TOKEN` guards the dashboard.
|
|
133
|
+
*
|
|
134
|
+
* A form rather than a link with the token in the query string: a URL-borne
|
|
135
|
+
* secret leaks through browser history, server logs, and the `Referer` header
|
|
136
|
+
* of every outbound request the page makes. This posts to a server action,
|
|
137
|
+
* which is the only place in a React Server Components app that can set a
|
|
138
|
+
* cookie, and the address bar never holds the token at all.
|
|
139
|
+
*/
|
|
140
|
+
function TokenUnlock({ error }) {
|
|
141
|
+
return (_jsxs("main", { className: "mx-auto flex min-h-[70vh] max-w-sm flex-col justify-center px-6 text-white", children: [_jsx("p", { className: label, children: "Polishd" }), _jsx("h1", { className: "mt-2 text-[20px] font-semibold tracking-tight", children: "Dashboard locked" }), _jsx("p", { className: "mt-2 text-[13px] text-[#888]", children: "Enter the dashboard token to continue." }), _jsxs("form", { action: unlockPolishdDashboard, className: "mt-5", children: [_jsx("input", { type: "password", name: "token", autoComplete: "off", autoFocus: true, placeholder: "Dashboard token", "aria-label": "Dashboard token", className: `w-full rounded-lg border ${border} bg-[#0a0a0a] px-3 py-2 text-[13px] text-white placeholder:text-[#555] focus:border-[#555] focus:outline-none` }), error && (_jsx("p", { role: "alert", className: "mt-2 text-[12px] text-red-400", children: error === "rate"
|
|
142
|
+
? "Too many attempts. Wait a minute and try again."
|
|
143
|
+
: "That token isn't right." })), _jsx("button", { type: "submit", className: "mt-3 w-full rounded-lg bg-white px-3 py-2 text-[13px] font-medium text-black transition-opacity hover:opacity-90", children: "Unlock" })] }), _jsxs("p", { className: "mt-5 text-[12px] leading-relaxed text-[#555]", children: ["The token is the value of", " ", _jsx("code", { className: "font-mono", children: "POLISHD_DASHBOARD_TOKEN" }), " in your deployment environment."] })] }));
|
|
144
|
+
}
|
|
145
|
+
/** Shown in production when the host never made an access decision. */
|
|
146
|
+
function SetupRequired() {
|
|
147
|
+
return (_jsxs("main", { className: "mx-auto flex min-h-[60vh] max-w-lg flex-col justify-center px-6 text-white", children: [_jsx("p", { className: label, children: "Polishd" }), _jsx("h1", { className: "mt-2 text-[20px] font-semibold tracking-tight", children: "Dashboard locked" }), _jsx("p", { className: "mt-2 text-[13px] leading-relaxed text-[#888]", children: "This dashboard is unprotected and running in production, so Polishd is refusing to serve it. It exposes your analytics, and its settings can change the model and API base URL \u2014 which means anyone who finds this URL can point your requests at their own endpoint and spend your API key." }), _jsx("p", { className: "mt-4 text-[13px] text-[#888]", children: "Choose one:" }), _jsxs("ul", { className: "mt-2 space-y-2 text-[13px] text-[#888]", children: [_jsxs("li", { children: ["Set a token \u2014 no code needed:", " ", _jsx("code", { className: "font-mono text-[#aaa]", children: "POLISHD_DASHBOARD_TOKEN" }), _jsxs("span", { className: "mt-0.5 block text-[12px] text-[#555]", children: ["Generate one with ", _jsx("code", { className: "font-mono", children: "openssl rand -hex 32" }), "."] })] }), _jsxs("li", { children: ["Or pass your app's own check:", " ", _jsx("code", { className: "font-mono text-[#aaa]", children: "createPolishdPage({ authenticate })" })] }), _jsxs("li", { children: ["Or make it public on purpose:", " ", _jsx("code", { className: "font-mono text-[#aaa]", children: "POLISHD_DASHBOARD_PUBLIC=true" })] })] }), _jsxs("p", { className: "mt-4 text-[12px] text-[#555]", children: ["Local development is unaffected \u2014 this only applies when", " ", _jsx("code", { className: "font-mono", children: "NODE_ENV=production" }), "."] })] }));
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Decide the access policy from the host's configuration and environment.
|
|
151
|
+
*
|
|
152
|
+
* The default used to be `open` everywhere, which meant the dashboard shipped
|
|
153
|
+
* unguarded to production unless the host thought to stop it. Nothing is
|
|
154
|
+
* silently locked in development, where an open dashboard is harmless; the
|
|
155
|
+
* change is that production now requires the host to have said something,
|
|
156
|
+
* either by wiring a check or by opting out in so many words.
|
|
157
|
+
*/
|
|
158
|
+
function resolvePolicy(opts) {
|
|
159
|
+
if (opts.authenticate)
|
|
160
|
+
return { mode: "guarded", authenticate: opts.authenticate };
|
|
161
|
+
// A configured token is a decision, so honour it without being asked to.
|
|
162
|
+
// Setting the env var is the entire integration for a host with no auth of
|
|
163
|
+
// its own — there is nothing to import and no page to edit.
|
|
164
|
+
if (polishdDashboardToken()) {
|
|
165
|
+
return { mode: "guarded", authenticate: polishdTokenAuth(opts.tokenAuth) };
|
|
166
|
+
}
|
|
167
|
+
if (process.env.NODE_ENV === "production" && process.env.POLISHD_DASHBOARD_PUBLIC !== "true") {
|
|
168
|
+
return { mode: "setup-required" };
|
|
169
|
+
}
|
|
170
|
+
return { mode: "open" };
|
|
171
|
+
}
|
|
172
|
+
let announcedPolicy = false;
|
|
173
|
+
/** Say what was decided, once, at module evaluation. */
|
|
174
|
+
function announcePolicy(policy) {
|
|
175
|
+
if (announcedPolicy)
|
|
176
|
+
return;
|
|
177
|
+
announcedPolicy = true;
|
|
178
|
+
const production = process.env.NODE_ENV === "production";
|
|
179
|
+
if (policy.mode === "setup-required") {
|
|
180
|
+
console.warn("[polishd] dashboard is locked: running in production with no `authenticate` " +
|
|
181
|
+
"callback. Pass one to createPolishdPage(), or set POLISHD_DASHBOARD_PUBLIC=true " +
|
|
182
|
+
"to serve it publicly on purpose.");
|
|
183
|
+
}
|
|
184
|
+
else if (policy.mode === "open") {
|
|
185
|
+
// Deliberately not suppressed in production. Production is the *only*
|
|
186
|
+
// environment where an unguarded dashboard is actionable news; warning
|
|
187
|
+
// solely on the developer's laptop, where it is harmless, was backwards.
|
|
188
|
+
console.warn(`[polishd] dashboard is unguarded${production ? " IN PRODUCTION" : ""} — anyone who ` +
|
|
189
|
+
"finds the URL can read your analytics, change the configured model and API base " +
|
|
190
|
+
"URL, and spend your model tokens. Pass `authenticate` to createPolishdPage().");
|
|
191
|
+
}
|
|
192
|
+
}
|
|
78
193
|
/**
|
|
79
194
|
* Build the dashboard page component. Use as the default export of your
|
|
80
195
|
* `app/polishd/page.tsx`.
|
|
@@ -83,18 +198,31 @@ export function createPolishdPage(opts = {}) {
|
|
|
83
198
|
// Register the policy at module evaluation, not per render: the AI server
|
|
84
199
|
// actions are reachable without this page ever rendering, and they re-run
|
|
85
200
|
// `authenticate` themselves before doing any work. See ai/guard.ts.
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
201
|
+
const policy = resolvePolicy(opts);
|
|
202
|
+
registerPolishdAuth(policy);
|
|
203
|
+
announcePolicy(policy);
|
|
204
|
+
// Applied to the unauthorized screen as well: a sign-in prompt stranded
|
|
205
|
+
// below a non-scrolling fold is the same bug with higher stakes.
|
|
206
|
+
const wrap = (node) => (_jsx(PolishdRoot, { children: opts.shell === false ? node : _jsx(PolishdShell, { children: node }) }));
|
|
207
|
+
// Whether the *package* is supplying the gate, which is what decides between
|
|
208
|
+
// the unlock form and the "wire up your own UI" placeholder.
|
|
209
|
+
const usingTokenAuth = !opts.authenticate && polishdDashboardToken() !== null;
|
|
210
|
+
return async function PolishdPage(props = {}) {
|
|
211
|
+
if (policy.mode === "setup-required")
|
|
212
|
+
return wrap(_jsx(SetupRequired, {}));
|
|
213
|
+
if (policy.mode === "guarded") {
|
|
214
|
+
const ok = await policy.authenticate(await polishdAuthContext());
|
|
215
|
+
if (!ok) {
|
|
216
|
+
if (opts.unauthorized)
|
|
217
|
+
return wrap(opts.unauthorized);
|
|
218
|
+
if (usingTokenAuth) {
|
|
219
|
+
const sp = props.searchParams ? await props.searchParams : {};
|
|
220
|
+
const raw = sp.polishd_unlock;
|
|
221
|
+
const code = Array.isArray(raw) ? raw[0] : raw;
|
|
222
|
+
return wrap(_jsx(TokenUnlock, { error: code === "rate" || code === "invalid" ? code : undefined }));
|
|
223
|
+
}
|
|
224
|
+
return wrap(_jsx(Unauthorized, {}));
|
|
225
|
+
}
|
|
98
226
|
}
|
|
99
227
|
const data = await loadPolishdDashboardData();
|
|
100
228
|
const [summaryState, settings, profileState] = await Promise.all([
|
|
@@ -127,7 +255,7 @@ export function createPolishdPage(opts = {}) {
|
|
|
127
255
|
});
|
|
128
256
|
}
|
|
129
257
|
}
|
|
130
|
-
return (_jsx(PolishdDashboard, { data: data, ai: {
|
|
258
|
+
return wrap(_jsx(PolishdDashboard, { data: data, ai: {
|
|
131
259
|
summary: summaryState.summary,
|
|
132
260
|
settings,
|
|
133
261
|
stale: summaryState.stale,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dashboard/index.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dashboard/index.tsx"],"names":[],"mappings":";AAiBA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGpC,OAAO,EACL,wBAAwB,GAIzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,kBAAkB,EAClB,mBAAmB,GAGpB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,qBAAqB,EACrB,gBAAgB,GAEjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAMvF,OAAO,aAAa,MAAM,YAAY,CAAC;AACvC,OAAO,gBAAgB,MAAM,YAAY,CAAC;AAC1C,OAAO,WAAW,MAAM,YAAY,CAAC;AACrC,OAAO,aAAa,MAAM,SAAS,CAAC;AACpC,OAAO,WAAW,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC;AAChC,MAAM,CAAC,MAAM,OAAO,GAAG,eAAe,CAAC;AAEvC,MAAM,CAAC,MAAM,QAAQ,GAAa;IAChC,KAAK,EAAE,4CAA4C;IACnD,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;CACxC,CAAC;AAEF,+EAA+E;AAC/E,MAAM,MAAM,GAAG,kBAAkB,CAAC;AAClC,MAAM,IAAI,GAAG,UAAU,MAAM,0BAA0B,CAAC;AACxD,MAAM,KAAK,GAAG,iEAAiE,CAAC;AAChF,MAAM,OAAO,GAAG,YAAY,MAAM,EAAE,CAAC;AAErC,gFAAgF;AAChF,SAAS,OAAO,CAAC,EACf,IAAI,EACJ,MAAM,GAAG,QAAQ,EACjB,KAAK,GAAG,KAAK,GAKd;IACC,MAAM,WAAW,GACf,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,2BAA2B,CAAC;IAC9F,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,kBAAkB,CAAC;IAC5D,OAAO,CACL,gBAAM,SAAS,EAAC,6EAA6E,aAC3F,eAAM,SAAS,EAAC,8HAA8H,kBAEvI,EACP,eACE,IAAI,EAAC,SAAS,EACd,SAAS,EAAE,gCAAgC,MAAM,IAAI,WAAW,oQAAoQ,YAEnU,IAAI,GACA,IACF,CACR,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,SAAS,IAAI,CAAC,EACZ,KAAK,EAAE,SAAS,EAChB,KAAK,EACL,GAAG,EACH,IAAI,GAAG,YAAY,GAMpB;IACC,OAAO,CACL,eAAK,SAAS,EAAE,GAAG,IAAI,YAAY,aACjC,cAAK,SAAS,EAAE,uDAAuD,IAAI,EAAE,YAC1E,KAAK,CAAC,cAAc,EAAE,GACnB,EACN,eAAK,SAAS,EAAE,0BAA0B,KAAK,EAAE,aAC9C,SAAS,EACV,KAAC,OAAO,IAAC,IAAI,EAAE,GAAG,GAAI,IAClB,IACF,CACP,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,SAAS,EAAE,CAAC,EACV,QAAQ,EACR,GAAG,EACH,KAAK,GAAG,OAAO,GAKhB;IACC,OAAO,CACL,aACE,SAAS,EAAE,4BACT,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,iBAC7C,IAAI,KAAK,EAAE,YAEX,gBAAM,SAAS,EAAC,kCAAkC,aAC/C,QAAQ,EACT,KAAC,OAAO,IAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,SAAG,IACpE,GACJ,CACN,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,MAAM,WAAW,GAAoD;IACnE,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE;IACtC,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE;IACtC,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE;CAC1C,CAAC;AAEF,SAAS,SAAS,CAAC,EAAE,MAAM,EAA4B;IACrD,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IACnF,OAAO,CACL,eAAK,SAAS,EAAE,6CAA6C,OAAO,mBAAmB,aACrF,eAAM,SAAS,EAAC,qEAAqE,YAClF,IAAI,CAAC,KAAK,GACN,EACP,cAAK,SAAS,EAAC,sDAAsD,YACnE,cACE,SAAS,EAAC,iCAAiC,EAC3C,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GACjD,GACE,EACN,gBAAM,SAAS,EAAC,oFAAoF,aACjG,MAAM,CAAC,GAAG,SACN,EACP,gBAAM,SAAS,EAAC,+EAA+E,aAC5F,MAAM,CAAC,QAAQ,OAAG,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,IAC5D,EACP,eAAM,SAAS,EAAC,+EAA+E,YAC5F,MAAM,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,IAAI,GACpD,IACH,CACP,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,SAAS,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAA6C;IAC7E,OAAO,CACL,mBAAS,SAAS,EAAC,MAAM,aACvB,cAAK,SAAS,EAAE,gCAAgC,KAAK,EAAE,YAAG,KAAK,GAAO,EACrE,QAAQ,IACD,CACX,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,SAAS,KAAK,CAAC,EAAU;IACvB,IAAI,EAAE,GAAG,IAAI;QAAE,OAAO,GAAG,EAAE,IAAI,CAAC;IAChC,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AACtC,CAAC;AAED,SAAS,YAAY,CAAC,EAAE,CAAC,EAA6B;IACpD,MAAM,SAAS,GAAG,CAAC,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC;IACvD,OAAO,CACL,cAAI,SAAS,EAAE,GAAG,OAAO,6BAA6B,aACpD,cAAI,SAAS,EAAC,gCAAgC,aAC5C,eAAK,SAAS,EAAC,qCAAqC,aAClD,eAAM,SAAS,EAAC,oCAAoC,YAAE,CAAC,CAAC,IAAI,GAAQ,EACpE,eAAM,SAAS,EAAC,uGAAuG,0BAEhH,EACN,SAAS,IAAI,CACZ,eAAM,SAAS,EAAC,iGAAiG,uBAE1G,CACR,IACG,EACN,eAAK,SAAS,EAAC,gCAAgC,aAC5C,CAAC,CAAC,QAAQ,OAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,cAAK,CAAC,CAAC,KAAK,EAAE,GAAG,EACvE,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,IAC7B,IACH,EACL,aAAI,SAAS,EAAC,6DAA6D,YACxE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,aAAa,uBAAS,GAC9D,EACL,aAAI,SAAS,EAAC,0EAA0E,YACrF,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,yBAAyB,uBAAS,GAC1F,EACL,aAAI,SAAS,EAAC,6DAA6D,YACxE,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,aAAa,uBAAS,GAChF,EACL,aAAI,SAAS,EAAC,6DAA6D,YACxE,CAAC,CAAC,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,aAAa,uBAAS,GACzF,EACL,aAAI,SAAS,EAAC,6DAA6D,YACxE,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,aAAa,uBAAS,GAC9E,EACL,aAAI,SAAS,EAAC,6DAA6D,YAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,aAAa,uBAAS,GAAM,EACnJ,aAAI,SAAS,EAAC,iDAAiD,YAC5D,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,aAAa,YAAE,CAAC,CAAC,MAAM,GAAQ,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,aAAa,uBAAS,GACrG,EACL,aAAI,SAAS,EAAC,sDAAsD,YACjE,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,cAAc,YAAE,CAAC,CAAC,UAAU,GAAQ,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,aAAa,uBAAS,GAC9G,IACF,CACN,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,oFAAoF;AACpF,6EAA6E;AAC7E,uCAAuC;AACvC,OAAO,EAAE,wBAAwB,EAA6B,MAAM,mBAAmB,CAAC;AAExF,8EAA8E;AAC9E,gFAAgF;AAChF,OAAO,EACL,gBAAgB,EAChB,wBAAwB,GAEzB,MAAM,cAAc,CAAC;AActB,gFAAgF;AAChF,MAAM,UAAU,gBAAgB,CAAC,EAC/B,IAAI,EACJ,EAAE,GAIH;IACC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,GACxF,IAAI,CAAC;IAEP,4EAA4E;IAC5E,0EAA0E;IAC1E,yEAAyE;IACzE,2DAA2D;IAC3D,MAAM,WAAW,GACf,MAAM,CAAC,eAAe,KAAK,IAAI;QAC/B,CAAC,QAAQ,CAAC,WAAW,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,eAAe,GAAG,SAAS,CAAC,CAAC;IAElF,OAAO,CACL,gBAAM,SAAS,EAAC,yDAAyD,aAEvE,eAAK,SAAS,EAAE,wDAAwD,MAAM,OAAO,aACnF,0BACE,YAAG,SAAS,EAAE,KAAK,wBAAa,EAChC,aAAI,SAAS,EAAC,0DAA0D,iDAEnE,EACL,aAAG,SAAS,EAAC,8BAA8B,8CAChB,GAAG,EAC5B,eAAM,SAAS,EAAC,oHAAoH,kBAE7H,EAAC,GAAG,gCAET,IACA,EACN,cAAK,SAAS,EAAE,6EACd,QAAQ,CAAC,KAAK;4BACZ,CAAC,CAAC,iCAAiC;4BACnC,CAAC,CAAC,0BACN,EAAE,YACC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,GAC3C,IACF,EAEL,CAAC,QAAQ,CAAC,KAAK,IAAI,CAClB,eAAK,SAAS,EAAE,iGAAiG,4HAE5F,eAAM,SAAS,EAAC,0BAA0B,8BAAqB,2BAC9E,CACP,EAEA,WAAW,IAAI,CACd,eAAK,SAAS,EAAC,2FAA2F,aACxG,YAAG,SAAS,EAAC,0BAA0B,yFAEnC,EACJ,aAAG,SAAS,EAAC,QAAQ,aAClB,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE,EAAE,GAAG,EAC3C,MAAM,CAAC,cAAc,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,8IAE7B,GAAG,EACjC,eAAM,SAAS,EAAC,wBAAwB,yBAAgB,oBAAe,GAAG,EAC1E,eAAM,SAAS,EAAC,wBAAwB,8BAAqB,kIAC2B,GAAG,EAC3F,eAAM,SAAS,EAAC,wBAAwB,+BAAsB,6EAE5D,EACJ,aAAG,SAAS,EAAC,wBAAwB,qBAC/B,eAAM,SAAS,EAAC,wBAAwB,yCAAgC,qCAE1E,IACA,CACP,EAGD,KAAC,WAAW,IACV,cAAc,EAAE,EAAE,CAAC,OAAO,EAC1B,eAAe,EAAE,EAAE,CAAC,QAAQ,EAC5B,YAAY,EAAE,EAAE,CAAC,KAAK,EACtB,cAAc,EAAE,EAAE,CAAC,OAAO,EAC1B,WAAW,EAAE,EAAE,CAAC,IAAI,EACpB,eAAe,EAAE,EAAE,CAAC,eAAe,GACnC,EAGF,KAAC,OAAO,IAAC,KAAK,EAAC,UAAU,YACvB,eAAK,SAAS,EAAC,sDAAsD,aACnE,KAAC,IAAI,IACH,KAAK,EAAC,UAAU,EAChB,KAAK,EAAE,QAAQ,CAAC,QAAQ,EACxB,GAAG,EAAC,kHAAkH,GACtH,EACF,KAAC,IAAI,IACH,KAAK,EAAC,YAAY,EAClB,KAAK,EAAE,QAAQ,CAAC,SAAS,EACzB,GAAG,EAAC,gGAA2F,GAC/F,EACF,KAAC,IAAI,IACH,KAAK,EAAC,aAAa,EACnB,KAAK,EAAE,QAAQ,CAAC,UAAU,EAC1B,IAAI,EAAC,cAAc,EACnB,GAAG,EAAC,2HAAsH,GAC1H,EACF,KAAC,IAAI,IACH,KAAK,EAAC,aAAa,EACnB,KAAK,EAAE,QAAQ,CAAC,UAAU,EAC1B,IAAI,EAAC,gBAAgB,EACrB,GAAG,EAAC,uIAAuI,GAC3I,EACF,KAAC,IAAI,IACH,KAAK,EAAC,WAAW,EACjB,KAAK,EAAE,QAAQ,CAAC,QAAQ,EACxB,IAAI,EAAC,cAAc,EACnB,GAAG,EAAC,wFAAwF,GAC5F,EACF,KAAC,IAAI,IACH,KAAK,EAAC,QAAQ,EACd,KAAK,EAAE,QAAQ,CAAC,WAAW,EAC3B,GAAG,EAAC,oDAAoD,GACxD,IACE,GACE,EAGV,KAAC,OAAO,IACN,KAAK,EACH,8CAEE,KAAC,OAAO,IACN,MAAM,EAAC,MAAM,EACb,IAAI,EAAC,kMAAwL,GAC7L,IACD,YAGL,cAAK,SAAS,EAAE,IAAI,YACjB,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACtB,YAAG,SAAS,EAAC,+CAA+C,0EAExD,CACL,CAAC,CAAC,CAAC,CACF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAC,SAAS,IAAkB,MAAM,EAAE,CAAC,IAArB,CAAC,CAAC,QAAQ,CAAe,CAAC,CAC9D,GACG,GACE,EAGV,KAAC,OAAO,IACN,KAAK,EACH,2CAEE,KAAC,OAAO,IACN,MAAM,EAAC,MAAM,EACb,IAAI,EAAC,+GAA+G,GACpH,IACD,YAGL,KAAC,aAAa,IAAC,KAAK,EAAE,KAAK,GAAI,GACvB,EAGV,KAAC,OAAO,IACN,KAAK,EACH,sDAEE,KAAC,OAAO,IACN,MAAM,EAAC,MAAM,EACb,IAAI,EAAC,yOAAyO,GAC9O,IACD,YAGL,cAAK,SAAS,EAAE,IAAI,YACjB,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACxB,aAAG,SAAS,EAAC,+CAA+C,sEACT,GAAG,EACpD,eAAM,SAAS,EAAC,uBAAuB,YAAE,6BAA6B,GAAQ,4BAC5E,CACL,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,iBAAiB,YAC9B,iBAAO,SAAS,EAAC,sBAAsB,aACrC,0BACE,yBACE,KAAC,EAAE,IAAC,KAAK,EAAC,MAAM,EAAC,GAAG,EAAC,6EAA6E,0BAAe,EACjH,KAAC,EAAE,IAAC,GAAG,EAAC,sFAAsF,uBAAY,EAC1G,KAAC,EAAE,IAAC,GAAG,EAAC,4DAAuD,sBAAW,EAC1E,KAAC,EAAE,IAAC,GAAG,EAAC,qFAAgF,yBAAc,EACtG,KAAC,EAAE,IAAC,GAAG,EAAC,iGAAiG,6BAAkB,EAC3H,KAAC,EAAE,IAAC,GAAG,EAAC,uGAAkG,uBAAY,EACtH,KAAC,EAAE,IAAC,GAAG,EAAC,qCAAqC,uBAAY,EACzD,KAAC,EAAE,IAAC,GAAG,EAAC,gDAA2C,uBAAY,EAC/D,KAAC,EAAE,IAAC,GAAG,EAAC,0DAAqD,qBAAU,IACpE,GACC,EACR,0BACG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACpB,KAAC,YAAY,IAAc,CAAC,EAAE,CAAC,IAAZ,CAAC,CAAC,IAAI,CAAU,CACpC,CAAC,GACI,IACF,GACJ,CACP,GACG,GACE,EAGV,KAAC,OAAO,IACN,KAAK,EACH,uDAEE,KAAC,OAAO,IACN,MAAM,EAAC,MAAM,EACb,IAAI,EAAC,8MAA+L,GACpM,IACD,YAGL,KAAC,WAAW,IAAC,QAAQ,EAAE,QAAQ,GAAI,GAC3B,EAGV,KAAC,OAAO,IACN,KAAK,EACH,oDAEE,KAAC,OAAO,IACN,MAAM,EAAC,MAAM,EACb,IAAI,EAAC,qKAAgK,GACrK,IACD,YAGL,cAAK,SAAS,EAAE,IAAI,YACjB,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACtB,YAAG,SAAS,EAAC,+CAA+C,4EAExD,CACL,CAAC,CAAC,CAAC,CACF,KAAC,gBAAgB,IACf,QAAQ,EAAE,OAAO,EACjB,MAAM,EACJ,yBACE,KAAC,EAAE,IAAC,KAAK,EAAC,MAAM,EAAC,GAAG,EAAC,+FAA+F,wBAAa,EACjI,KAAC,EAAE,IAAC,GAAG,EAAC,yDAAyD,uBAAY,EAC7E,KAAC,EAAE,IAAC,GAAG,EAAC,8CAA8C,yBAAc,EACpE,KAAC,EAAE,IAAC,GAAG,EAAC,sDAAsD,sBAAW,IACtE,GAEP,CACH,GACG,GACE,EAGV,KAAC,OAAO,IACN,KAAK,EACH,yDAEE,KAAC,OAAO,IACN,MAAM,EAAC,MAAM,EACb,IAAI,EAAC,+NAA0N,GAC/N,IACD,YAGL,cAAK,SAAS,EAAE,IAAI,YACjB,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACvB,YAAG,SAAS,EAAC,+CAA+C,kFAExD,CACL,CAAC,CAAC,CAAC,CACF,KAAC,aAAa,IACZ,QAAQ,EAAE,QAAQ,EAClB,MAAM,EACJ,yBACE,KAAC,EAAE,IAAC,KAAK,EAAC,MAAM,EAAC,GAAG,EAAC,0EAA0E,wBAAa,EAC5G,KAAC,EAAE,IAAC,GAAG,EAAC,8DAAoD,sBAAW,EACvE,KAAC,EAAE,IAAC,GAAG,EAAC,qCAAqC,uBAAY,EACzD,KAAC,EAAE,IAAC,GAAG,EAAC,8BAA8B,qBAAU,EAChD,KAAC,EAAE,IAAC,GAAG,EAAC,8BAA8B,qBAAU,EAChD,KAAC,EAAE,IAAC,GAAG,EAAC,mDAAmD,sBAAW,IACnE,GAEP,CACH,GACG,GACE,EAGT,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CACpB,KAAC,OAAO,IAAC,KAAK,EAAC,eAAe,YAC5B,cAAK,SAAS,EAAE,IAAI,YACjB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACpB,cAAa,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,YAC1C,eAAK,SAAS,EAAC,WAAW,aACxB,cAAK,SAAS,EAAC,oCAAoC,YAAE,CAAC,CAAC,OAAO,GAAO,EACrE,eAAK,SAAS,EAAC,gCAAgC,aAC5C,CAAC,CAAC,IAAI,EACN,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,IACnC,IACF,IAPE,CAAC,CAQL,CACP,CAAC,GACE,GACE,CACX,IACI,CACR,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,SAAS,YAAY;IACnB,OAAO,CACL,gBAAM,SAAS,EAAC,qGAAqG,aACnH,YAAG,SAAS,EAAE,KAAK,wBAAa,EAChC,aAAI,SAAS,EAAC,+CAA+C,6BAAkB,EAC/E,aAAG,SAAS,EAAC,8BAA8B,sDACJ,eAAM,SAAS,EAAC,WAAW,6BAAoB,iBACpF,eAAM,SAAS,EAAC,WAAW,qCAA4B,4CACrD,IACC,CACR,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,SAAS,YAAY,CAAC,EAAE,QAAQ,EAA2B;IACzD,OAAO;IACL,yEAAyE;IACzE,wEAAwE;IACxE,sEAAsE;IACtE,8BAA8B;IAC9B,cAAK,SAAS,EAAC,yFAAyF,YACrG,QAAQ,GACL,CACP,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,WAAW,CAAC,EAAE,QAAQ,EAA2B;IACxD,OAAO,cAAK,SAAS,EAAC,cAAc,YAAE,QAAQ,GAAO,CAAC;AACxD,CAAC;AAuCD;;;;;;;;GAQG;AACH,SAAS,WAAW,CAAC,EAAE,KAAK,EAAkC;IAC5D,OAAO,CACL,gBAAM,SAAS,EAAC,4EAA4E,aAC1F,YAAG,SAAS,EAAE,KAAK,wBAAa,EAChC,aAAI,SAAS,EAAC,+CAA+C,iCAAsB,EACnF,YAAG,SAAS,EAAC,8BAA8B,uDAEvC,EACJ,gBAAM,MAAM,EAAE,sBAAsB,EAAE,SAAS,EAAC,MAAM,aACpD,gBACE,IAAI,EAAC,UAAU,EACf,IAAI,EAAC,OAAO,EACZ,YAAY,EAAC,KAAK,EAClB,SAAS,QACT,WAAW,EAAC,iBAAiB,gBAClB,iBAAiB,EAC5B,SAAS,EAAE,4BAA4B,MAAM,+GAA+G,GAC5J,EACD,KAAK,IAAI,CACR,YAAG,IAAI,EAAC,OAAO,EAAC,SAAS,EAAC,+BAA+B,YACtD,KAAK,KAAK,MAAM;4BACf,CAAC,CAAC,iDAAiD;4BACnD,CAAC,CAAC,yBAAyB,GAC3B,CACL,EACD,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,kHAAkH,uBAGrH,IACJ,EACP,aAAG,SAAS,EAAC,8CAA8C,0CAC/B,GAAG,EAC7B,eAAM,SAAS,EAAC,WAAW,wCAA+B,wCAExD,IACC,CACR,CAAC;AACJ,CAAC;AAED,uEAAuE;AACvE,SAAS,aAAa;IACpB,OAAO,CACL,gBAAM,SAAS,EAAC,4EAA4E,aAC1F,YAAG,SAAS,EAAE,KAAK,wBAAa,EAChC,aAAI,SAAS,EAAC,+CAA+C,iCAAsB,EACnF,YAAG,SAAS,EAAC,8CAA8C,kTAKvD,EACJ,YAAG,SAAS,EAAC,8BAA8B,4BAAgB,EAC3D,cAAI,SAAS,EAAC,wCAAwC,aACpD,+DACgC,GAAG,EACjC,eAAM,SAAS,EAAC,uBAAuB,wCAA+B,EACtE,gBAAM,SAAS,EAAC,sCAAsC,mCAClC,eAAM,SAAS,EAAC,WAAW,qCAA4B,SACpE,IACJ,EACL,0DACgC,GAAG,EACjC,eAAM,SAAS,EAAC,uBAAuB,oDAAqD,IACzF,EACL,0DACgC,GAAG,EACjC,eAAM,SAAS,EAAC,uBAAuB,8CAAqC,IACzE,IACF,EACL,aAAG,SAAS,EAAC,8BAA8B,8EACgB,GAAG,EAC5D,eAAM,SAAS,EAAC,WAAW,oCAA2B,SACpD,IACC,CACR,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,aAAa,CAAC,IAA8B;IACnD,IAAI,IAAI,CAAC,YAAY;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;IACnF,yEAAyE;IACzE,2EAA2E;IAC3E,4DAA4D;IAC5D,IAAI,qBAAqB,EAAE,EAAE,CAAC;QAC5B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;IAC7E,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,MAAM,EAAE,CAAC;QAC7F,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC;IACpC,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AAED,IAAI,eAAe,GAAG,KAAK,CAAC;AAE5B,wDAAwD;AACxD,SAAS,cAAc,CAAC,MAAyB;IAC/C,IAAI,eAAe;QAAE,OAAO;IAC5B,eAAe,GAAG,IAAI,CAAC;IACvB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;IACzD,IAAI,MAAM,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACrC,OAAO,CAAC,IAAI,CACV,8EAA8E;YAC5E,kFAAkF;YAClF,kCAAkC,CACrC,CAAC;IACJ,CAAC;SAAM,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAClC,sEAAsE;QACtE,uEAAuE;QACvE,yEAAyE;QACzE,OAAO,CAAC,IAAI,CACV,mCAAmC,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB;YACnF,kFAAkF;YAClF,+EAA+E,CAClF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAiC,EAAE;IACnE,0EAA0E;IAC1E,0EAA0E;IAC1E,oEAAoE;IACpE,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACnC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5B,cAAc,CAAC,MAAM,CAAC,CAAC;IAEvB,wEAAwE;IACxE,iEAAiE;IACjE,MAAM,IAAI,GAAG,CAAC,IAAe,EAAE,EAAE,CAAC,CAChC,KAAC,WAAW,cACT,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAC,YAAY,cAAE,IAAI,GAAgB,GACtD,CACf,CAAC;IAEF,6EAA6E;IAC7E,6DAA6D;IAC7D,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,qBAAqB,EAAE,KAAK,IAAI,CAAC;IAE9E,OAAO,KAAK,UAAU,WAAW,CAAC,QAA0B,EAAE;QAC5D,IAAI,MAAM,CAAC,IAAI,KAAK,gBAAgB;YAAE,OAAO,IAAI,CAAC,KAAC,aAAa,KAAG,CAAC,CAAC;QACrE,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,kBAAkB,EAAE,CAAC,CAAC;YACjE,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,IAAI,IAAI,CAAC,YAAY;oBAAE,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACtD,IAAI,cAAc,EAAE,CAAC;oBACnB,MAAM,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC9D,MAAM,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC;oBAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;oBAC/C,OAAO,IAAI,CACT,KAAC,WAAW,IAAC,KAAK,EAAE,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,GAAI,CACjF,CAAC;gBACJ,CAAC;gBACD,OAAO,IAAI,CAAC,KAAC,YAAY,KAAG,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,wBAAwB,EAAE,CAAC;QAC9C,MAAM,CAAC,YAAY,EAAE,QAAQ,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC/D,gBAAgB,CAAC,IAAI,CAAC;YACtB,mBAAmB,EAAE;YACrB,gBAAgB,CAAC,IAAI,CAAC;SACvB,CAAC,CAAC;QAEH,yEAAyE;QACzE,sEAAsE;QACtE,2EAA2E;QAC3E,sEAAsE;QACtE,6CAA6C;QAC7C,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,IAAI,QAAQ,CAAC;QACpD,IACE,OAAO,KAAK,QAAQ;YACpB,QAAQ,CAAC,SAAS;YAClB,IAAI,CAAC,QAAQ,CAAC,KAAK;YACnB,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC,EAC7B,CAAC;YACD,MAAM,SAAS,GAAG,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;YACjE,MAAM,GAAG,GACP,YAAY,CAAC,OAAO,KAAK,IAAI;gBAC7B,CAAC,YAAY,CAAC,KAAK;oBACjB,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;YAC/D,IAAI,GAAG,EAAE,CAAC;gBACR,KAAK,CAAC,KAAK,IAAI,EAAE;oBACf,IAAI,CAAC;wBACH,MAAM,eAAe,EAAE,CAAC;oBAC1B,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,OAAO,CAAC,IAAI,CAAC,6CAA6C,EAAE,GAAG,CAAC,CAAC;oBACnE,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CACT,KAAC,gBAAgB,IACf,IAAI,EAAE,IAAI,EACV,EAAE,EAAE;gBACF,OAAO,EAAE,YAAY,CAAC,OAAO;gBAC7B,QAAQ;gBACR,KAAK,EAAE,YAAY,CAAC,KAAK;gBACzB,OAAO,EAAE,YAAY,CAAC,OAAO;gBAC7B,IAAI,EAAE,YAAY,CAAC,IAAI;gBACvB,eAAe,EAAE,YAAY,CAAC,eAAe;aAC9C,GACD,CACH,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/dashboard/summary.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/dashboard/summary.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAEV,uBAAuB,EAGvB,qBAAqB,EAErB,cAAc,EACf,MAAM,aAAa,CAAC;AAoOrB,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,cAAc,GAAG,IAAI,CAAC;IACtC,eAAe,EAAE,uBAAuB,CAAC;IACzC,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAC7C,6EAA6E;IAC7E,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,qEAAqE;IACrE,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAClC,cAAc,EACd,eAAe,EACf,YAAY,EACZ,cAAc,EACd,WAAW,EACX,eAAe,GAChB,EAAE,gBAAgB,+BAoKlB"}
|