@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.
Files changed (68) hide show
  1. package/AGENTS.md +161 -46
  2. package/CHANGELOG.md +128 -0
  3. package/README.md +238 -48
  4. package/bin/doctor.mjs +374 -0
  5. package/bin/init.mjs +215 -188
  6. package/bin/polishd.mjs +85 -0
  7. package/bin/shared.mjs +114 -0
  8. package/dist/ai/actions.d.ts +7 -2
  9. package/dist/ai/actions.d.ts.map +1 -1
  10. package/dist/ai/actions.js +9 -1
  11. package/dist/ai/actions.js.map +1 -1
  12. package/dist/ai/guard.d.ts +44 -3
  13. package/dist/ai/guard.d.ts.map +1 -1
  14. package/dist/ai/guard.js +13 -2
  15. package/dist/ai/guard.js.map +1 -1
  16. package/dist/ai/providers.d.ts +2 -0
  17. package/dist/ai/providers.d.ts.map +1 -1
  18. package/dist/ai/providers.js +70 -0
  19. package/dist/ai/providers.js.map +1 -1
  20. package/dist/ai/settings.d.ts +15 -1
  21. package/dist/ai/settings.d.ts.map +1 -1
  22. package/dist/ai/settings.js +38 -1
  23. package/dist/ai/settings.js.map +1 -1
  24. package/dist/ai/types.d.ts +10 -0
  25. package/dist/ai/types.d.ts.map +1 -1
  26. package/dist/client/init.d.ts.map +1 -1
  27. package/dist/client/init.js +51 -2
  28. package/dist/client/init.js.map +1 -1
  29. package/dist/config.d.ts +57 -3
  30. package/dist/config.d.ts.map +1 -1
  31. package/dist/config.js +62 -3
  32. package/dist/config.js.map +1 -1
  33. package/dist/dashboard/index.d.ts +34 -5
  34. package/dist/dashboard/index.d.ts.map +1 -1
  35. package/dist/dashboard/index.js +145 -17
  36. package/dist/dashboard/index.js.map +1 -1
  37. package/dist/dashboard/summary.d.ts.map +1 -1
  38. package/dist/dashboard/summary.js +59 -5
  39. package/dist/dashboard/summary.js.map +1 -1
  40. package/dist/dashboard/token-auth.d.ts +56 -0
  41. package/dist/dashboard/token-auth.d.ts.map +1 -0
  42. package/dist/dashboard/token-auth.js +158 -0
  43. package/dist/dashboard/token-auth.js.map +1 -0
  44. package/dist/dashboard/unlock.d.ts +2 -0
  45. package/dist/dashboard/unlock.d.ts.map +1 -0
  46. package/dist/dashboard/unlock.js +54 -0
  47. package/dist/dashboard/unlock.js.map +1 -0
  48. package/dist/dashboard.css +2601 -0
  49. package/dist/proxy.d.ts +53 -5
  50. package/dist/proxy.d.ts.map +1 -1
  51. package/dist/proxy.js +73 -3
  52. package/dist/proxy.js.map +1 -1
  53. package/dist/route.d.ts.map +1 -1
  54. package/dist/route.js +11 -3
  55. package/dist/route.js.map +1 -1
  56. package/dist/server/ingest.d.ts +33 -2
  57. package/dist/server/ingest.d.ts.map +1 -1
  58. package/dist/server/ingest.js +61 -7
  59. package/dist/server/ingest.js.map +1 -1
  60. package/dist/server/queries.d.ts +16 -0
  61. package/dist/server/queries.d.ts.map +1 -1
  62. package/dist/server/queries.js +80 -16
  63. package/dist/server/queries.js.map +1 -1
  64. package/dist/session.d.ts.map +1 -1
  65. package/dist/session.js +4 -2
  66. package/dist/session.js.map +1 -1
  67. package/docs/SETUP.md +308 -51
  68. 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
- * The host app can override any of these by editing the root `polishd.config.ts`
10
- * re-export, which keeps the public surface in one obvious place.
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
- /** Type-checked helper for the host app's root `polishd.config.ts`. */
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
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;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;CACvB;AAED,eAAO,MAAM,oBAAoB,EAAE,aASlC,CAAC;AAEF,uEAAuE;AACvE,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAEpF"}
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
- * The host app can override any of these by editing the root `polishd.config.ts`
10
- * re-export, which keeps the public surface in one obvious place.
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
- /** Type-checked helper for the host app's root `polishd.config.ts`. */
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
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAqBH,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;CACjC,CAAC;AAEF,uEAAuE;AACvE,MAAM,UAAU,mBAAmB,CAAC,SAAiC;IACnE,OAAO,EAAE,GAAG,oBAAoB,EAAE,GAAG,SAAS,EAAE,CAAC;AACnD,CAAC"}
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. If omitted the
43
- * dashboard renders unguarded (a dev-only console warning is logged).
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;AAI3B,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;AAExF,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+QA;AAgBD,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,iFAAiF;IACjF,YAAY,CAAC,EAAE,SAAS,CAAC;CAC1B;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,wBAA6B,8CAsEpE"}
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"}
@@ -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
- let warnedUnguarded = false;
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
- registerPolishdAuth(opts.authenticate
87
- ? { mode: "guarded", authenticate: opts.authenticate }
88
- : { mode: "open" });
89
- return async function PolishdPage() {
90
- if (opts.authenticate) {
91
- const ok = await opts.authenticate();
92
- if (!ok)
93
- return _jsx(_Fragment, { children: opts.unauthorized ?? _jsx(Unauthorized, {}) });
94
- }
95
- else if (!warnedUnguarded && process.env.NODE_ENV !== "production") {
96
- warnedUnguarded = true;
97
- console.warn("[polishd] dashboard is unguarded — pass `authenticate` to createPolishdPage() to protect it.");
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":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/dashboard/summary.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAEV,uBAAuB,EAGvB,qBAAqB,EAErB,cAAc,EACf,MAAM,aAAa,CAAC;AA2GrB,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"}
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"}