@polishd/next 0.1.0 → 0.2.1-dev.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 (95) hide show
  1. package/AGENTS.md +161 -46
  2. package/CHANGELOG.md +163 -0
  3. package/README.md +275 -49
  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 +13 -2
  9. package/dist/ai/actions.d.ts.map +1 -1
  10. package/dist/ai/actions.js +19 -1
  11. package/dist/ai/actions.js.map +1 -1
  12. package/dist/ai/design.d.ts +28 -0
  13. package/dist/ai/design.d.ts.map +1 -0
  14. package/dist/ai/design.js +245 -0
  15. package/dist/ai/design.js.map +1 -0
  16. package/dist/ai/guard.d.ts +44 -3
  17. package/dist/ai/guard.d.ts.map +1 -1
  18. package/dist/ai/guard.js +13 -2
  19. package/dist/ai/guard.js.map +1 -1
  20. package/dist/ai/providers.d.ts +2 -0
  21. package/dist/ai/providers.d.ts.map +1 -1
  22. package/dist/ai/providers.js +70 -0
  23. package/dist/ai/providers.js.map +1 -1
  24. package/dist/ai/settings.d.ts +15 -1
  25. package/dist/ai/settings.d.ts.map +1 -1
  26. package/dist/ai/settings.js +38 -1
  27. package/dist/ai/settings.js.map +1 -1
  28. package/dist/ai/types.d.ts +57 -0
  29. package/dist/ai/types.d.ts.map +1 -1
  30. package/dist/client/design-scan.d.ts +37 -0
  31. package/dist/client/design-scan.d.ts.map +1 -0
  32. package/dist/client/design-scan.js +319 -0
  33. package/dist/client/design-scan.js.map +1 -0
  34. package/dist/client/init.d.ts.map +1 -1
  35. package/dist/client/init.js +67 -2
  36. package/dist/client/init.js.map +1 -1
  37. package/dist/config.d.ts +57 -3
  38. package/dist/config.d.ts.map +1 -1
  39. package/dist/config.js +62 -3
  40. package/dist/config.js.map +1 -1
  41. package/dist/dashboard/design-review-card.d.ts +15 -0
  42. package/dist/dashboard/design-review-card.d.ts.map +1 -0
  43. package/dist/dashboard/design-review-card.js +82 -0
  44. package/dist/dashboard/design-review-card.js.map +1 -0
  45. package/dist/dashboard/design.d.ts +10 -0
  46. package/dist/dashboard/design.d.ts.map +1 -0
  47. package/dist/dashboard/design.js +83 -0
  48. package/dist/dashboard/design.js.map +1 -0
  49. package/dist/dashboard/index.d.ts +35 -5
  50. package/dist/dashboard/index.d.ts.map +1 -1
  51. package/dist/dashboard/index.js +176 -18
  52. package/dist/dashboard/index.js.map +1 -1
  53. package/dist/dashboard/journeys.d.ts.map +1 -1
  54. package/dist/dashboard/journeys.js +1 -0
  55. package/dist/dashboard/journeys.js.map +1 -1
  56. package/dist/dashboard/summary.d.ts.map +1 -1
  57. package/dist/dashboard/summary.js +59 -5
  58. package/dist/dashboard/summary.js.map +1 -1
  59. package/dist/dashboard/token-auth.d.ts +56 -0
  60. package/dist/dashboard/token-auth.d.ts.map +1 -0
  61. package/dist/dashboard/token-auth.js +158 -0
  62. package/dist/dashboard/token-auth.js.map +1 -0
  63. package/dist/dashboard/unlock.d.ts +2 -0
  64. package/dist/dashboard/unlock.d.ts.map +1 -0
  65. package/dist/dashboard/unlock.js +54 -0
  66. package/dist/dashboard/unlock.js.map +1 -0
  67. package/dist/dashboard.css +2740 -0
  68. package/dist/proxy.d.ts +53 -5
  69. package/dist/proxy.d.ts.map +1 -1
  70. package/dist/proxy.js +73 -3
  71. package/dist/proxy.js.map +1 -1
  72. package/dist/route.d.ts.map +1 -1
  73. package/dist/route.js +11 -3
  74. package/dist/route.js.map +1 -1
  75. package/dist/server/design.d.ts +93 -0
  76. package/dist/server/design.d.ts.map +1 -0
  77. package/dist/server/design.js +430 -0
  78. package/dist/server/design.js.map +1 -0
  79. package/dist/server/ingest.d.ts +33 -2
  80. package/dist/server/ingest.d.ts.map +1 -1
  81. package/dist/server/ingest.js +70 -8
  82. package/dist/server/ingest.js.map +1 -1
  83. package/dist/server/queries.d.ts +16 -0
  84. package/dist/server/queries.d.ts.map +1 -1
  85. package/dist/server/queries.js +80 -16
  86. package/dist/server/queries.js.map +1 -1
  87. package/dist/session.d.ts.map +1 -1
  88. package/dist/session.js +4 -2
  89. package/dist/session.js.map +1 -1
  90. package/dist/shared/types.d.ts +31 -1
  91. package/dist/shared/types.d.ts.map +1 -1
  92. package/dist/shared/types.js +1 -0
  93. package/dist/shared/types.js.map +1 -1
  94. package/docs/SETUP.md +308 -51
  95. package/package.json +14 -7
@@ -15,8 +15,8 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
15
15
  * the server-side cadence refresh. The API key is write-only: we never receive
16
16
  * it back, only a "configured" flag.
17
17
  */
18
- import { useState, useTransition } from "react";
19
- import { createIssueFromLossAction, generateProfileAction, generateSummaryAction, saveAISettingsAction, verifyGithubAction, } from "../ai/actions";
18
+ import { useEffect, useState, useTransition } from "react";
19
+ import { createIssueFromLossAction, generateProfileAction, generateSummaryAction, listModelsAction, saveAISettingsAction, verifyGithubAction, } from "../ai/actions";
20
20
  const border = "border-[#2e2e2e]";
21
21
  const card = `border ${border} rounded-lg bg-[#0a0a0a]`;
22
22
  const labelCls = "text-[11px] font-medium uppercase tracking-[0.08em] text-[#666]";
@@ -78,6 +78,61 @@ function RefreshIcon({ spinning }) {
78
78
  function GearIcon() {
79
79
  return (_jsxs("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: [_jsx("circle", { cx: "12", cy: "12", r: "3" }), _jsx("path", { d: "M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z" })] }));
80
80
  }
81
+ // ── Model field ──────────────────────────────────────────────────────────────
82
+ /**
83
+ * The "Model" input, shared by the onboarding wizard and the settings panel.
84
+ * Starts as free text (any provider works this way). If the provider exposes
85
+ * a list-models endpoint and a usable key is available (typed in this form,
86
+ * or already stored for this same provider), a "Load available models" link
87
+ * fetches the live list and swaps the input for a dropdown — so the owner
88
+ * picks from what their key can actually call instead of guessing an id.
89
+ */
90
+ function ModelField({ provider, model, onModel, apiKey, baseUrl, hasStoredKey, }) {
91
+ const [models, setModels] = useState(null);
92
+ const [error, setError] = useState(null);
93
+ const [pending, startLoad] = useTransition();
94
+ const prov = PROVIDERS.find((p) => p.value === provider);
95
+ // A fetched list is provider-specific — drop it the moment the provider
96
+ // changes so a stale Gemini list can't linger under "OpenAI".
97
+ useEffect(() => {
98
+ setModels(null);
99
+ setError(null);
100
+ }, [provider]);
101
+ const needsBaseUrl = provider === "openai-compatible" && !baseUrl.trim();
102
+ const canFetch = (apiKey.trim().length > 0 || hasStoredKey) && !needsBaseUrl;
103
+ const load = () => {
104
+ if (!canFetch || pending)
105
+ return;
106
+ setError(null);
107
+ startLoad(async () => {
108
+ const res = await listModelsAction({
109
+ provider,
110
+ apiKey: apiKey.trim() || undefined,
111
+ baseUrl: baseUrl.trim() || undefined,
112
+ });
113
+ if (res.ok) {
114
+ setModels(res.models);
115
+ if (res.models.length > 0 && !res.models.includes(model))
116
+ onModel(res.models[0]);
117
+ }
118
+ else {
119
+ setError(res.message);
120
+ }
121
+ });
122
+ };
123
+ // Auto-load once when a stored key already covers this provider — most
124
+ // visits land here with nothing to type, so the dropdown should just work.
125
+ useEffect(() => {
126
+ if (hasStoredKey && models === null && !pending)
127
+ load();
128
+ // eslint-disable-next-line react-hooks/exhaustive-deps
129
+ }, [hasStoredKey]);
130
+ return (_jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Model" }), models && models.length > 0 ? (_jsxs(_Fragment, { children: [_jsxs("select", { value: model, onChange: (e) => onModel(e.target.value), className: `${inputCls} mt-1.5 font-mono`, children: [!models.includes(model) && model && _jsx("option", { value: model, children: model }), models.map((m) => (_jsx("option", { value: m, children: m }, m)))] }), _jsx("button", { type: "button", onClick: () => setModels(null), className: "mt-1 text-[11px] text-[#555] hover:text-[#888]", children: "Type a different model id" })] })) : (_jsxs(_Fragment, { children: [_jsx("input", { value: model, onChange: (e) => onModel(e.target.value), placeholder: prov?.modelHint, className: `${inputCls} mt-1.5 font-mono` }), _jsx("button", { type: "button", onClick: load, disabled: !canFetch || pending, title: needsBaseUrl
131
+ ? "Add a base URL first"
132
+ : canFetch
133
+ ? "Fetch the list of models available to this key"
134
+ : "Add an API key first", className: "mt-1 text-[11px] text-[#888] underline decoration-[#444] underline-offset-2 hover:text-white disabled:cursor-not-allowed disabled:no-underline disabled:opacity-40", children: pending ? "Loading models…" : "Load available models" }), error && _jsx("span", { className: "mt-1 block text-[11px] text-red-400", children: error })] }))] }));
135
+ }
81
136
  export default function SummaryCard({ initialSummary, initialSettings, initialStale, initialProfile, initialGaps, sourceAvailable, }) {
82
137
  const [summary, setSummary] = useState(initialSummary);
83
138
  const [settings, setSettings] = useState(initialSettings);
@@ -259,7 +314,7 @@ function OnboardingWizard({ settings, sourceAvailable, onSettings, onProfile, on
259
314
  onError(res.message); // wizard is closing — surface it on the card
260
315
  onDone();
261
316
  });
262
- return (_jsxs("div", { className: "bg-[#080808]", children: [error && (_jsx("div", { className: "mx-4 mt-4 rounded-md border border-red-900/50 bg-red-950/30 px-3 py-2 text-[12px] text-red-400 sm:mx-5", children: error })), step === 0 && (_jsxs(StepShell, { step: 0, title: "Connect a model", intro: "Bring your own key \u2014 pick the provider you already pay for. The key is stored server-side in your database and never sent back to the browser.", children: [_jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [_jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Provider" }), _jsx("select", { value: provider, onChange: (e) => setProvider(e.target.value), className: `${inputCls} mt-1.5`, children: PROVIDERS.map((p) => (_jsx("option", { value: p.value, children: p.label }, p.value))) })] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Model" }), _jsx("input", { value: model, onChange: (e) => setModel(e.target.value), placeholder: prov?.modelHint, className: `${inputCls} mt-1.5 font-mono` })] }), _jsxs("label", { className: "block sm:col-span-2", children: [_jsx("span", { className: labelCls, children: "API key" }), _jsx("input", { type: "password", value: apiKey, onChange: (e) => setApiKey(e.target.value), placeholder: settings.hasApiKey ? "•••••••• (stored — leave blank to keep)" : "Paste your key", autoComplete: "off", className: `${inputCls} mt-1.5` }), prov && (_jsxs("span", { className: "mt-1 block text-[11px] text-[#555]", children: ["Get a key from", " ", _jsx("a", { href: prov.keyUrl, target: "_blank", rel: "noreferrer noopener", className: "text-[#888] underline decoration-[#444] underline-offset-2 hover:text-white", children: prov.keyHost }), "."] }))] }), provider === "openai-compatible" && (_jsxs("label", { className: "block sm:col-span-2", children: [_jsx("span", { className: labelCls, children: "Base URL" }), _jsx("input", { value: baseUrl, onChange: (e) => setBaseUrl(e.target.value), placeholder: "https://openrouter.ai/api/v1", className: `${inputCls} mt-1.5 font-mono` })] }))] }), _jsxs("div", { className: "mt-4 flex items-center gap-3", children: [_jsx("button", { type: "button", onClick: saveModel, disabled: pending || (!apiKey && !settings.hasApiKey), className: primaryBtn, children: pending ? "Saving…" : "Continue" }), _jsx("button", { type: "button", onClick: onDone, className: "text-[11px] text-[#555] hover:text-[#888]", children: "Skip setup" })] })] })), step === 1 && (_jsxs(StepShell, { step: 1, title: "Tell it about your site", intro: "Optional, but the story gets sharper when the model knows what the site is for and who it serves. All three feed the codebase profile in the next step.", children: [_jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "What is this site?" }), _jsx("textarea", { value: context, onChange: (e) => setContext(e.target.value), rows: 2, placeholder: "e.g. A personal notes site. Visitors read articles and browse by tag. The /admin editor is owner-only.", className: `${inputCls} mt-1.5 resize-y` })] }), _jsxs("div", { className: "mt-4 grid gap-4 sm:grid-cols-2", children: [_jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Target audience" }), _jsx("input", { value: audience, onChange: (e) => setAudience(e.target.value), placeholder: "e.g. Recruiters and fellow designers", className: `${inputCls} mt-1.5` })] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Ideology / values" }), _jsx("input", { value: ideology, onChange: (e) => setIdeology(e.target.value), placeholder: "e.g. Depth over clicks \u2014 long reads matter most", className: `${inputCls} mt-1.5` })] })] }), _jsxs("div", { className: "mt-4 flex items-center gap-3", children: [_jsx("button", { type: "button", onClick: saveSite, disabled: pending, className: primaryBtn, children: pending ? "Saving…" : "Continue" }), _jsx("button", { type: "button", onClick: next, className: ghostBtn, children: "Skip" })] })] })), step === 2 && (_jsxs(StepShell, { step: 2, title: "Scan your codebase", intro: "A one-time scan teaches the model your pages and components, so every future summary understands the site without re-reading code. It's cached in your database \u2014 the codebase is only touched again if new components appear or you re-scan.", children: [scanned ? (_jsxs("div", { className: "rounded-md border border-emerald-900/50 bg-emerald-950/20 px-3 py-2.5 text-[12px] text-emerald-400", children: ["Profiled ", scanned.sourceFiles, " files \u00B7 ", scanned.coveredIdentifiers.length, " components", scanned.truncated ? " (large app — clipped to budget)" : "", ". The model now knows your site's structure."] })) : (_jsxs(_Fragment, { children: [!sourceAvailable && (_jsx("div", { className: "mb-3 rounded-md border border-amber-900/50 bg-amber-950/20 px-3 py-2 text-[12px] text-amber-400", children: "No source tree found on disk here \u2014 this step needs to run where the code lives (local dev or CI). You can skip it now and scan later." })), _jsxs("label", { className: "block max-w-md", children: [_jsx("span", { className: labelCls, children: "Source folders" }), _jsx("span", { className: "ml-1 text-[11px] text-[#555]", children: "\u2014 optional; defaults to src / app / components / pages / lib." }), _jsx("input", { value: sourceDirs, onChange: (e) => setSourceDirs(e.target.value), placeholder: "e.g. src, content", className: `${inputCls} mt-1.5 font-mono` })] })] })), _jsx("div", { className: "mt-4 flex items-center gap-3", children: scanned ? (_jsx("button", { type: "button", onClick: next, className: primaryBtn, children: "Continue" })) : (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: scan, disabled: pending || !sourceAvailable, className: primaryBtn, children: pending ? "Scanning…" : "Scan codebase" }), _jsx("button", { type: "button", onClick: next, className: ghostBtn, children: "Skip for now" })] })) })] })), step === 3 && (_jsxs(StepShell, { step: 3, title: "Connect your GitHub repository", intro: "Optional. With the repo connected, problems the model finds are verified against your actual source code \u2014 real ones become GitHub issues with the technical analysis and fix suggestions, false alarms are dropped. A fine-grained token scoped to just this repo is all it needs.", children: [githubStatus ? (_jsxs("div", { className: "rounded-md border border-emerald-900/50 bg-emerald-950/20 px-3 py-2.5 text-[12px] text-emerald-400", children: ["Connected to ", githubStatus.repo, " \u00B7 default branch", " ", _jsx("code", { className: "font-mono", children: githubStatus.defaultBranch }), !githubStatus.issuesEnabled && " · issues are disabled on this repo", !githubStatus.canPush && " · token can't push (branches/PRs unavailable)"] })) : (_jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [_jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Repository" }), _jsx("input", { value: githubRepo, onChange: (e) => setGithubRepo(e.target.value), placeholder: "owner/repo", className: `${inputCls} mt-1.5 font-mono` })] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Access token" }), _jsx("input", { type: "password", value: githubToken, onChange: (e) => setGithubToken(e.target.value), placeholder: settings.hasGithubToken ? "•••••••• (stored — leave blank to keep)" : "github_pat_…", autoComplete: "off", className: `${inputCls} mt-1.5` }), _jsxs("span", { className: "mt-1 block text-[11px] text-[#555]", children: ["Create a", " ", _jsx("a", { href: "https://github.com/settings/personal-access-tokens/new", target: "_blank", rel: "noreferrer noopener", className: "text-[#888] underline decoration-[#444] underline-offset-2 hover:text-white", children: "fine-grained token" }), " ", "for this repo with Contents (read) and Issues & Pull requests (write). Stored server-side; never sent to the browser."] })] })] })), _jsxs("label", { className: "mt-4 flex max-w-xl cursor-pointer items-start gap-2.5", children: [_jsx("input", { type: "checkbox", checked: autoIssues, onChange: (e) => setAutoIssues(e.target.checked), className: "mt-0.5 h-3.5 w-3.5 shrink-0 cursor-pointer accent-white" }), _jsxs("span", { children: [_jsx("span", { className: "block text-[13px] font-medium text-white", children: "Allow creating issues automatically" }), _jsx("span", { className: "mt-0.5 block text-[11px] leading-snug text-[#666]", children: "Every new problem a summary finds is verified against the source and \u2014 when it holds up \u2014 filed as a GitHub issue on its own, with technical details and fix suggestions. The same problem is never filed twice." })] })] }), _jsx("div", { className: "mt-4 flex items-center gap-3", children: githubStatus ? (_jsx("button", { type: "button", onClick: finishGithub, disabled: pending, className: primaryBtn, children: pending ? "Saving…" : "Continue" })) : (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: connectGithub, disabled: pending || !githubRepo.trim() || (!githubToken && !settings.hasGithubToken), className: primaryBtn, children: pending ? "Connecting…" : "Connect GitHub" }), _jsx("button", { type: "button", onClick: next, className: ghostBtn, children: "Skip for now" })] })) })] })), step === 4 && (_jsxs(StepShell, { step: 4, title: "How often should the story refresh?", intro: "With the profile cached, a refresh only spends tokens when there's new behavior to narrate \u2014 unchanged data is always free. Auto-refresh runs in the background when you open the dashboard past the cadence.", children: [_jsx("div", { className: "grid gap-2 sm:grid-cols-3", children: CADENCES.map((c) => (_jsxs("button", { type: "button", onClick: () => setCadence(c.value), className: `rounded-md border px-3 py-2.5 text-left transition-colors ${cadence === c.value
317
+ return (_jsxs("div", { className: "bg-[#080808]", children: [error && (_jsx("div", { className: "mx-4 mt-4 rounded-md border border-red-900/50 bg-red-950/30 px-3 py-2 text-[12px] text-red-400 sm:mx-5", children: error })), step === 0 && (_jsxs(StepShell, { step: 0, title: "Connect a model", intro: "Bring your own key \u2014 pick the provider you already pay for. The key is stored server-side in your database and never sent back to the browser.", children: [_jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [_jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Provider" }), _jsx("select", { value: provider, onChange: (e) => setProvider(e.target.value), className: `${inputCls} mt-1.5`, children: PROVIDERS.map((p) => (_jsx("option", { value: p.value, children: p.label }, p.value))) })] }), _jsx(ModelField, { provider: provider, model: model, onModel: setModel, apiKey: apiKey, baseUrl: baseUrl, hasStoredKey: settings.hasApiKey && settings.provider === provider }), _jsxs("label", { className: "block sm:col-span-2", children: [_jsx("span", { className: labelCls, children: "API key" }), _jsx("input", { type: "password", value: apiKey, onChange: (e) => setApiKey(e.target.value), placeholder: settings.hasApiKey ? "•••••••• (stored — leave blank to keep)" : "Paste your key", autoComplete: "off", className: `${inputCls} mt-1.5` }), prov && (_jsxs("span", { className: "mt-1 block text-[11px] text-[#555]", children: ["Get a key from", " ", _jsx("a", { href: prov.keyUrl, target: "_blank", rel: "noreferrer noopener", className: "text-[#888] underline decoration-[#444] underline-offset-2 hover:text-white", children: prov.keyHost }), "."] }))] }), provider === "openai-compatible" && (_jsxs("label", { className: "block sm:col-span-2", children: [_jsx("span", { className: labelCls, children: "Base URL" }), _jsx("input", { value: baseUrl, onChange: (e) => setBaseUrl(e.target.value), placeholder: "https://openrouter.ai/api/v1", className: `${inputCls} mt-1.5 font-mono` })] }))] }), _jsxs("div", { className: "mt-4 flex items-center gap-3", children: [_jsx("button", { type: "button", onClick: saveModel, disabled: pending || (!apiKey && !settings.hasApiKey), className: primaryBtn, children: pending ? "Saving…" : "Continue" }), _jsx("button", { type: "button", onClick: onDone, className: "text-[11px] text-[#555] hover:text-[#888]", children: "Skip setup" })] })] })), step === 1 && (_jsxs(StepShell, { step: 1, title: "Tell it about your site", intro: "Optional, but the story gets sharper when the model knows what the site is for and who it serves. All three feed the codebase profile in the next step.", children: [_jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "What is this site?" }), _jsx("textarea", { value: context, onChange: (e) => setContext(e.target.value), rows: 2, placeholder: "e.g. A personal notes site. Visitors read articles and browse by tag. The /admin editor is owner-only.", className: `${inputCls} mt-1.5 resize-y` })] }), _jsxs("div", { className: "mt-4 grid gap-4 sm:grid-cols-2", children: [_jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Target audience" }), _jsx("input", { value: audience, onChange: (e) => setAudience(e.target.value), placeholder: "e.g. Recruiters and fellow designers", className: `${inputCls} mt-1.5` })] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Ideology / values" }), _jsx("input", { value: ideology, onChange: (e) => setIdeology(e.target.value), placeholder: "e.g. Depth over clicks \u2014 long reads matter most", className: `${inputCls} mt-1.5` })] })] }), _jsxs("div", { className: "mt-4 flex items-center gap-3", children: [_jsx("button", { type: "button", onClick: saveSite, disabled: pending, className: primaryBtn, children: pending ? "Saving…" : "Continue" }), _jsx("button", { type: "button", onClick: next, className: ghostBtn, children: "Skip" })] })] })), step === 2 && (_jsxs(StepShell, { step: 2, title: "Scan your codebase", intro: "A one-time scan teaches the model your pages and components, so every future summary understands the site without re-reading code. It's cached in your database \u2014 the codebase is only touched again if new components appear or you re-scan.", children: [scanned ? (_jsxs("div", { className: "rounded-md border border-emerald-900/50 bg-emerald-950/20 px-3 py-2.5 text-[12px] text-emerald-400", children: ["Profiled ", scanned.sourceFiles, " files \u00B7 ", scanned.coveredIdentifiers.length, " components", scanned.truncated ? " (large app — clipped to budget)" : "", ". The model now knows your site's structure."] })) : (_jsxs(_Fragment, { children: [!sourceAvailable && (_jsx("div", { className: "mb-3 rounded-md border border-amber-900/50 bg-amber-950/20 px-3 py-2 text-[12px] text-amber-400", children: "No source tree found on disk here \u2014 this step needs to run where the code lives (local dev or CI). You can skip it now and scan later." })), _jsxs("label", { className: "block max-w-md", children: [_jsx("span", { className: labelCls, children: "Source folders" }), _jsx("span", { className: "ml-1 text-[11px] text-[#555]", children: "\u2014 optional; defaults to src / app / components / pages / lib." }), _jsx("input", { value: sourceDirs, onChange: (e) => setSourceDirs(e.target.value), placeholder: "e.g. src, content", className: `${inputCls} mt-1.5 font-mono` })] })] })), _jsx("div", { className: "mt-4 flex items-center gap-3", children: scanned ? (_jsx("button", { type: "button", onClick: next, className: primaryBtn, children: "Continue" })) : (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: scan, disabled: pending || !sourceAvailable, className: primaryBtn, children: pending ? "Scanning…" : "Scan codebase" }), _jsx("button", { type: "button", onClick: next, className: ghostBtn, children: "Skip for now" })] })) })] })), step === 3 && (_jsxs(StepShell, { step: 3, title: "Connect your GitHub repository", intro: "Optional. With the repo connected, problems the model finds are verified against your actual source code \u2014 real ones become GitHub issues with the technical analysis and fix suggestions, false alarms are dropped. A fine-grained token scoped to just this repo is all it needs.", children: [githubStatus ? (_jsxs("div", { className: "rounded-md border border-emerald-900/50 bg-emerald-950/20 px-3 py-2.5 text-[12px] text-emerald-400", children: ["Connected to ", githubStatus.repo, " \u00B7 default branch", " ", _jsx("code", { className: "font-mono", children: githubStatus.defaultBranch }), !githubStatus.issuesEnabled && " · issues are disabled on this repo", !githubStatus.canPush && " · token can't push (branches/PRs unavailable)"] })) : (_jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [_jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Repository" }), _jsx("input", { value: githubRepo, onChange: (e) => setGithubRepo(e.target.value), placeholder: "owner/repo", className: `${inputCls} mt-1.5 font-mono` })] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Access token" }), _jsx("input", { type: "password", value: githubToken, onChange: (e) => setGithubToken(e.target.value), placeholder: settings.hasGithubToken ? "•••••••• (stored — leave blank to keep)" : "github_pat_…", autoComplete: "off", className: `${inputCls} mt-1.5` }), _jsxs("span", { className: "mt-1 block text-[11px] text-[#555]", children: ["Create a", " ", _jsx("a", { href: "https://github.com/settings/personal-access-tokens/new", target: "_blank", rel: "noreferrer noopener", className: "text-[#888] underline decoration-[#444] underline-offset-2 hover:text-white", children: "fine-grained token" }), " ", "for this repo with Contents (read) and Issues & Pull requests (write). Stored server-side; never sent to the browser."] })] })] })), _jsxs("label", { className: "mt-4 flex max-w-xl cursor-pointer items-start gap-2.5", children: [_jsx("input", { type: "checkbox", checked: autoIssues, onChange: (e) => setAutoIssues(e.target.checked), className: "mt-0.5 h-3.5 w-3.5 shrink-0 cursor-pointer accent-white" }), _jsxs("span", { children: [_jsx("span", { className: "block text-[13px] font-medium text-white", children: "Allow creating issues automatically" }), _jsx("span", { className: "mt-0.5 block text-[11px] leading-snug text-[#666]", children: "Every new problem a summary finds is verified against the source and \u2014 when it holds up \u2014 filed as a GitHub issue on its own, with technical details and fix suggestions. The same problem is never filed twice." })] })] }), _jsx("div", { className: "mt-4 flex items-center gap-3", children: githubStatus ? (_jsx("button", { type: "button", onClick: finishGithub, disabled: pending, className: primaryBtn, children: pending ? "Saving…" : "Continue" })) : (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: connectGithub, disabled: pending || !githubRepo.trim() || (!githubToken && !settings.hasGithubToken), className: primaryBtn, children: pending ? "Connecting…" : "Connect GitHub" }), _jsx("button", { type: "button", onClick: next, className: ghostBtn, children: "Skip for now" })] })) })] })), step === 4 && (_jsxs(StepShell, { step: 4, title: "How often should the story refresh?", intro: "With the profile cached, a refresh only spends tokens when there's new behavior to narrate \u2014 unchanged data is always free. Auto-refresh runs in the background when you open the dashboard past the cadence.", children: [_jsx("div", { className: "grid gap-2 sm:grid-cols-3", children: CADENCES.map((c) => (_jsxs("button", { type: "button", onClick: () => setCadence(c.value), className: `rounded-md border px-3 py-2.5 text-left transition-colors ${cadence === c.value
263
318
  ? "border-white bg-[#141414]"
264
319
  : "border-[#2e2e2e] hover:border-[#555]"}`, children: [_jsx("span", { className: "block text-[13px] font-medium text-white", children: c.label }), _jsx("span", { className: "mt-0.5 block text-[11px] leading-snug text-[#666]", children: c.hint })] }, c.value))) }), _jsx("div", { className: "mt-4", children: _jsx("button", { type: "button", onClick: finish, disabled: pending, className: primaryBtn, children: pending ? "Generating your first summary…" : "Finish & generate first summary" }) })] }))] }));
265
320
  }
@@ -303,7 +358,6 @@ function SettingsPanel({ settings, onSaved, }) {
303
358
  const [saved, setSaved] = useState(false);
304
359
  const [pending, startSave] = useTransition();
305
360
  const prov = PROVIDERS.find((p) => p.value === provider);
306
- const modelHint = prov?.modelHint ?? "";
307
361
  const save = () => {
308
362
  setSaved(false);
309
363
  startSave(async () => {
@@ -328,6 +382,6 @@ function SettingsPanel({ settings, onSaved, }) {
328
382
  setSaved(true);
329
383
  });
330
384
  };
331
- return (_jsxs("div", { className: `border-t ${border} bg-[#080808] px-4 py-4 sm:px-5 sm:py-5`, children: [_jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [_jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Provider" }), _jsx("select", { value: provider, onChange: (e) => setProvider(e.target.value), className: `${inputCls} mt-1.5`, children: PROVIDERS.map((p) => (_jsx("option", { value: p.value, children: p.label }, p.value))) })] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Model" }), _jsx("input", { value: model, onChange: (e) => setModel(e.target.value), placeholder: modelHint, className: `${inputCls} mt-1.5 font-mono` })] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "API key" }), _jsx("input", { type: "password", value: apiKey, onChange: (e) => setApiKey(e.target.value), placeholder: settings.hasApiKey ? "•••••••• (stored — leave blank to keep)" : "Paste your key", autoComplete: "off", className: `${inputCls} mt-1.5` }), prov && (_jsxs("span", { className: "mt-1 block text-[11px] text-[#555]", children: ["Get a key from", " ", _jsx("a", { href: prov.keyUrl, target: "_blank", rel: "noreferrer noopener", className: "text-[#888] underline decoration-[#444] underline-offset-2 hover:text-white", children: prov.keyHost }), ". Stored server-side; never sent to the browser."] }))] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Auto-refresh" }), _jsx("select", { value: cadence, onChange: (e) => setCadence(e.target.value), className: `${inputCls} mt-1.5`, children: CADENCES.map((c) => (_jsxs("option", { value: c.value, children: [c.label, " \u2014 ", c.hint.toLowerCase()] }, c.value))) })] }), provider === "openai-compatible" && (_jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Base URL" }), _jsx("input", { value: baseUrl, onChange: (e) => setBaseUrl(e.target.value), placeholder: "https://openrouter.ai/api/v1", className: `${inputCls} mt-1.5 font-mono` })] }))] }), _jsxs("label", { className: "mt-4 block", children: [_jsx("span", { className: labelCls, children: "Site description" }), _jsx("span", { className: "ml-1 text-[11px] text-[#555]", children: "\u2014 what the site is, who it's for, key flows. Helps the model interpret the numbers." }), _jsx("textarea", { value: context, onChange: (e) => setContext(e.target.value), rows: 2, placeholder: "e.g. A personal notes site. Visitors read articles and browse by tag. The /admin editor is owner-only.", className: `${inputCls} mt-1.5 resize-y` })] }), _jsxs("div", { className: "mt-4 grid gap-4 sm:grid-cols-2", children: [_jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Target audience" }), _jsx("span", { className: "ml-1 text-[11px] text-[#555]", children: "\u2014 optional; guides the profile scan." }), _jsx("input", { value: audience, onChange: (e) => setAudience(e.target.value), placeholder: "e.g. Recruiters and fellow designers", className: `${inputCls} mt-1.5` })] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Ideology / values" }), _jsx("span", { className: "ml-1 text-[11px] text-[#555]", children: "\u2014 optional: what success looks like." }), _jsx("input", { value: ideology, onChange: (e) => setIdeology(e.target.value), placeholder: "e.g. Depth over clicks \u2014 long reads matter most", className: `${inputCls} mt-1.5` })] })] }), _jsxs("label", { className: "mt-4 block", children: [_jsx("span", { className: labelCls, children: "Instructions" }), _jsx("span", { className: "ml-1 text-[11px] text-[#555]", children: "\u2014 optional: tone, focus, what to call out." }), _jsx("textarea", { value: instructions, onChange: (e) => setInstructions(e.target.value), rows: 2, placeholder: "e.g. Focus on conversion blockers. Keep it blunt.", className: `${inputCls} mt-1.5 resize-y` })] }), _jsxs("div", { className: "mt-4 grid gap-4 sm:grid-cols-2", children: [_jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "GitHub repository" }), _jsx("span", { className: "ml-1 text-[11px] text-[#555]", children: "\u2014 optional; enables filing bugs from losses." }), _jsx("input", { value: githubRepo, onChange: (e) => setGithubRepo(e.target.value), placeholder: "owner/repo", className: `${inputCls} mt-1.5 font-mono` })] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "GitHub token" }), _jsx("span", { className: "ml-1 text-[11px] text-[#555]", children: "\u2014 Contents (read), Issues & Pull requests (write)." }), _jsx("input", { type: "password", value: githubToken, onChange: (e) => setGithubToken(e.target.value), placeholder: settings.hasGithubToken ? "•••••••• (stored — leave blank to keep)" : "github_pat_…", autoComplete: "off", className: `${inputCls} mt-1.5` })] })] }), _jsxs("label", { className: "mt-4 flex cursor-pointer items-center gap-2.5", children: [_jsx("input", { type: "checkbox", checked: autoIssues, onChange: (e) => setAutoIssues(e.target.checked), className: "h-3.5 w-3.5 shrink-0 cursor-pointer accent-white" }), _jsx("span", { className: "text-[13px] text-white", children: "Allow creating issues automatically" }), _jsx("span", { className: "text-[11px] text-[#555]", children: "\u2014 new problems are verified against the source, then filed on their own; never twice." })] }), _jsxs("label", { className: "mt-4 block", children: [_jsx("span", { className: labelCls, children: "Source folders" }), _jsx("span", { className: "ml-1 text-[11px] text-[#555]", children: "\u2014 optional, comma-separated, relative to the project root. Defaults to src / app / components / pages / lib." }), _jsx("input", { value: sourceDirs, onChange: (e) => setSourceDirs(e.target.value), placeholder: "e.g. src, content", className: `${inputCls} mt-1.5 font-mono` })] }), _jsxs("div", { className: "mt-4 flex items-center gap-3", children: [_jsx("button", { type: "button", onClick: save, disabled: pending, className: primaryBtn, children: pending ? "Saving…" : "Save settings" }), saved && _jsx("span", { className: "text-[12px] text-emerald-400", children: "Saved" }), settings.fromEnv && (_jsx("span", { className: "text-[11px] text-[#555]", children: "Defaults loaded from environment variables." }))] })] }));
385
+ return (_jsxs("div", { className: `border-t ${border} bg-[#080808] px-4 py-4 sm:px-5 sm:py-5`, children: [_jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [_jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Provider" }), _jsx("select", { value: provider, onChange: (e) => setProvider(e.target.value), className: `${inputCls} mt-1.5`, children: PROVIDERS.map((p) => (_jsx("option", { value: p.value, children: p.label }, p.value))) })] }), _jsx(ModelField, { provider: provider, model: model, onModel: setModel, apiKey: apiKey, baseUrl: baseUrl, hasStoredKey: settings.hasApiKey && settings.provider === provider }), _jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "API key" }), _jsx("input", { type: "password", value: apiKey, onChange: (e) => setApiKey(e.target.value), placeholder: settings.hasApiKey ? "•••••••• (stored — leave blank to keep)" : "Paste your key", autoComplete: "off", className: `${inputCls} mt-1.5` }), prov && (_jsxs("span", { className: "mt-1 block text-[11px] text-[#555]", children: ["Get a key from", " ", _jsx("a", { href: prov.keyUrl, target: "_blank", rel: "noreferrer noopener", className: "text-[#888] underline decoration-[#444] underline-offset-2 hover:text-white", children: prov.keyHost }), ". Stored server-side; never sent to the browser."] }))] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Auto-refresh" }), _jsx("select", { value: cadence, onChange: (e) => setCadence(e.target.value), className: `${inputCls} mt-1.5`, children: CADENCES.map((c) => (_jsxs("option", { value: c.value, children: [c.label, " \u2014 ", c.hint.toLowerCase()] }, c.value))) })] }), provider === "openai-compatible" && (_jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Base URL" }), _jsx("input", { value: baseUrl, onChange: (e) => setBaseUrl(e.target.value), placeholder: "https://openrouter.ai/api/v1", className: `${inputCls} mt-1.5 font-mono` })] }))] }), _jsxs("label", { className: "mt-4 block", children: [_jsx("span", { className: labelCls, children: "Site description" }), _jsx("span", { className: "ml-1 text-[11px] text-[#555]", children: "\u2014 what the site is, who it's for, key flows. Helps the model interpret the numbers." }), _jsx("textarea", { value: context, onChange: (e) => setContext(e.target.value), rows: 2, placeholder: "e.g. A personal notes site. Visitors read articles and browse by tag. The /admin editor is owner-only.", className: `${inputCls} mt-1.5 resize-y` })] }), _jsxs("div", { className: "mt-4 grid gap-4 sm:grid-cols-2", children: [_jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Target audience" }), _jsx("span", { className: "ml-1 text-[11px] text-[#555]", children: "\u2014 optional; guides the profile scan." }), _jsx("input", { value: audience, onChange: (e) => setAudience(e.target.value), placeholder: "e.g. Recruiters and fellow designers", className: `${inputCls} mt-1.5` })] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "Ideology / values" }), _jsx("span", { className: "ml-1 text-[11px] text-[#555]", children: "\u2014 optional: what success looks like." }), _jsx("input", { value: ideology, onChange: (e) => setIdeology(e.target.value), placeholder: "e.g. Depth over clicks \u2014 long reads matter most", className: `${inputCls} mt-1.5` })] })] }), _jsxs("label", { className: "mt-4 block", children: [_jsx("span", { className: labelCls, children: "Instructions" }), _jsx("span", { className: "ml-1 text-[11px] text-[#555]", children: "\u2014 optional: tone, focus, what to call out." }), _jsx("textarea", { value: instructions, onChange: (e) => setInstructions(e.target.value), rows: 2, placeholder: "e.g. Focus on conversion blockers. Keep it blunt.", className: `${inputCls} mt-1.5 resize-y` })] }), _jsxs("div", { className: "mt-4 grid gap-4 sm:grid-cols-2", children: [_jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "GitHub repository" }), _jsx("span", { className: "ml-1 text-[11px] text-[#555]", children: "\u2014 optional; enables filing bugs from losses." }), _jsx("input", { value: githubRepo, onChange: (e) => setGithubRepo(e.target.value), placeholder: "owner/repo", className: `${inputCls} mt-1.5 font-mono` })] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: labelCls, children: "GitHub token" }), _jsx("span", { className: "ml-1 text-[11px] text-[#555]", children: "\u2014 Contents (read), Issues & Pull requests (write)." }), _jsx("input", { type: "password", value: githubToken, onChange: (e) => setGithubToken(e.target.value), placeholder: settings.hasGithubToken ? "•••••••• (stored — leave blank to keep)" : "github_pat_…", autoComplete: "off", className: `${inputCls} mt-1.5` })] })] }), _jsxs("label", { className: "mt-4 flex cursor-pointer items-center gap-2.5", children: [_jsx("input", { type: "checkbox", checked: autoIssues, onChange: (e) => setAutoIssues(e.target.checked), className: "h-3.5 w-3.5 shrink-0 cursor-pointer accent-white" }), _jsx("span", { className: "text-[13px] text-white", children: "Allow creating issues automatically" }), _jsx("span", { className: "text-[11px] text-[#555]", children: "\u2014 new problems are verified against the source, then filed on their own; never twice." })] }), _jsxs("label", { className: "mt-4 block", children: [_jsx("span", { className: labelCls, children: "Source folders" }), _jsx("span", { className: "ml-1 text-[11px] text-[#555]", children: "\u2014 optional, comma-separated, relative to the project root. Defaults to src / app / components / pages / lib." }), _jsx("input", { value: sourceDirs, onChange: (e) => setSourceDirs(e.target.value), placeholder: "e.g. src, content", className: `${inputCls} mt-1.5 font-mono` })] }), _jsxs("div", { className: "mt-4 flex items-center gap-3", children: [_jsx("button", { type: "button", onClick: save, disabled: pending, className: primaryBtn, children: pending ? "Saving…" : "Save settings" }), saved && _jsx("span", { className: "text-[12px] text-emerald-400", children: "Saved" }), settings.fromEnv && (_jsx("span", { className: "text-[11px] text-[#555]", children: "Defaults loaded from environment variables." }))] })] }));
332
386
  }
333
387
  //# sourceMappingURL=summary.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/dashboard/summary.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/dashboard/summary.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import type { PolishdAuthenticate } from "../ai/guard";
2
+ /** Name of the grant cookie. Distinct from the anonymous analytics session. */
3
+ export declare const POLISHD_DASHBOARD_COOKIE = "polishd_dashboard";
4
+ export interface PolishdTokenAuthOptions {
5
+ /**
6
+ * Path the dashboard is mounted at. Scopes the grant cookie so it never
7
+ * rides along on ordinary requests to the host app, and is where a
8
+ * successful unlock redirects to.
9
+ *
10
+ * Defaults to what `polishd init` scaffolds. Set it if you moved the page.
11
+ * @default "/polishd"
12
+ */
13
+ basePath?: string;
14
+ /** How long a grant stays valid, in seconds. @default 604800 (one week) */
15
+ maxAgeSeconds?: number;
16
+ }
17
+ interface ResolvedOptions {
18
+ basePath: string;
19
+ maxAgeSeconds: number;
20
+ }
21
+ export declare function registerPolishdTokenOptions(opts?: PolishdTokenAuthOptions): void;
22
+ export declare function polishdTokenOptions(): ResolvedOptions;
23
+ /** The configured token, or null when the host hasn't set one. */
24
+ export declare function polishdDashboardToken(): string | null;
25
+ /**
26
+ * Compare without leaking, through the first differing byte or through length.
27
+ *
28
+ * `timingSafeEqual` throws on unequal lengths, which would itself be a length
29
+ * oracle, so both sides are hashed to a fixed width first.
30
+ */
31
+ export declare function tokensMatch(a: string, b: string): boolean;
32
+ /** Mint a fresh grant for the current token. */
33
+ export declare function mintGrant(token: string): string;
34
+ /**
35
+ * Verify a grant cookie against the configured token.
36
+ *
37
+ * Expiry is enforced here rather than left to the cookie's `maxAge`: a client
38
+ * decides how long to keep a cookie, so the server has to decide how long to
39
+ * accept one.
40
+ */
41
+ export declare function verifyGrant(value: string | undefined, token: string, maxAgeSeconds: number): boolean;
42
+ /**
43
+ * An `authenticate` callback backed by `POLISHD_DASHBOARD_TOKEN`.
44
+ *
45
+ * export default createPolishdPage({ authenticate: polishdTokenAuth() });
46
+ *
47
+ * Used automatically when the env var is set and no other `authenticate` is
48
+ * passed, so most hosts never name it explicitly.
49
+ */
50
+ export declare function polishdTokenAuth(opts?: PolishdTokenAuthOptions): PolishdAuthenticate;
51
+ /** Returns false when the caller has spent its attempts for this window. */
52
+ export declare function takeAttempt(h: Headers): boolean;
53
+ /** Read the request headers for rate limiting. Separate for testability. */
54
+ export declare function requestHeaders(): Promise<Headers>;
55
+ export {};
56
+ //# sourceMappingURL=token-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-auth.d.ts","sourceRoot":"","sources":["../../src/dashboard/token-auth.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAsB,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE3E,+EAA+E;AAC/E,eAAO,MAAM,wBAAwB,sBAAsB,CAAC;AAO5D,MAAM,WAAW,uBAAuB;IACtC;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB;AAWD,wBAAgB,2BAA2B,CAAC,IAAI,GAAE,uBAA4B,GAAG,IAAI,CAKpF;AAED,wBAAgB,mBAAmB,IAAI,eAAe,CAErD;AAED,kEAAkE;AAClE,wBAAgB,qBAAqB,IAAI,MAAM,GAAG,IAAI,CAGrD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAIzD;AAUD,gDAAgD;AAChD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,GACpB,OAAO,CAST;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,uBAA4B,GAAG,mBAAmB,CAexF;AAkBD,4EAA4E;AAC5E,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAe/C;AAED,4EAA4E;AAC5E,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAEvD"}
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Polishd — built-in token auth (server only).
3
+ *
4
+ * For the most common deployment shape there is: an app with no authentication
5
+ * of its own that still needs the dashboard protected, because the dashboard
6
+ * can change the configured model and API base URL and therefore spend the
7
+ * owner's key.
8
+ *
9
+ * Doing this correctly by hand requires knowing several things a typical user
10
+ * has no reason to know: that server components can't set cookies but server
11
+ * actions can, that the comparison must be constant-time, that a token in a
12
+ * query string leaks through `Referer` and browser history, and that the
13
+ * dashboard's server actions need guarding separately from the page. None of
14
+ * that is app-specific, so it belongs here.
15
+ *
16
+ * The design deliberately avoids putting the secret in a URL at any point: the
17
+ * token is presented through a form, exchanged for an httpOnly cookie by a
18
+ * server action, and never appears in history, logs, or a `Referer` header.
19
+ *
20
+ * What the cookie holds is an HMAC of the token, not the token itself, so a
21
+ * leaked cookie jar does not hand over the reusable secret. The grant is still
22
+ * a bearer credential — that is inherent to cookie auth — but it is scoped to
23
+ * the dashboard's path, carries its own issue time, and expires server-side
24
+ * rather than trusting the browser to forget it.
25
+ */
26
+ import { createHash, createHmac, timingSafeEqual } from "node:crypto";
27
+ import { headers } from "next/headers";
28
+ /** Name of the grant cookie. Distinct from the anonymous analytics session. */
29
+ export const POLISHD_DASHBOARD_COOKIE = "polishd_dashboard";
30
+ /** Domain-separates this HMAC from any other use of the same secret. */
31
+ const GRANT_CONTEXT = "polishd-dashboard-grant-v1";
32
+ const DEFAULT_MAX_AGE_S = 60 * 60 * 24 * 7; // one week
33
+ // The unlock action is a standalone module-level export — Next needs a stable
34
+ // action identity — so it can't be handed options as arguments. The page
35
+ // factory records them here at module evaluation, the same way the auth policy
36
+ // itself is registered. See ai/guard.ts.
37
+ let options = {
38
+ basePath: "/polishd",
39
+ maxAgeSeconds: DEFAULT_MAX_AGE_S,
40
+ };
41
+ export function registerPolishdTokenOptions(opts = {}) {
42
+ options = {
43
+ basePath: opts.basePath ?? options.basePath,
44
+ maxAgeSeconds: opts.maxAgeSeconds ?? options.maxAgeSeconds,
45
+ };
46
+ }
47
+ export function polishdTokenOptions() {
48
+ return options;
49
+ }
50
+ /** The configured token, or null when the host hasn't set one. */
51
+ export function polishdDashboardToken() {
52
+ const token = process.env.POLISHD_DASHBOARD_TOKEN;
53
+ return token && token.length > 0 ? token : null;
54
+ }
55
+ /**
56
+ * Compare without leaking, through the first differing byte or through length.
57
+ *
58
+ * `timingSafeEqual` throws on unequal lengths, which would itself be a length
59
+ * oracle, so both sides are hashed to a fixed width first.
60
+ */
61
+ export function tokensMatch(a, b) {
62
+ const ha = createHash("sha256").update(a, "utf8").digest();
63
+ const hb = createHash("sha256").update(b, "utf8").digest();
64
+ return timingSafeEqual(ha, hb);
65
+ }
66
+ /** Build the cookie value proving possession of `token` at `issuedAt`. */
67
+ function grantFor(token, issuedAt) {
68
+ const mac = createHmac("sha256", token)
69
+ .update(`${GRANT_CONTEXT}.${issuedAt}`)
70
+ .digest("base64url");
71
+ return `${issuedAt}.${mac}`;
72
+ }
73
+ /** Mint a fresh grant for the current token. */
74
+ export function mintGrant(token) {
75
+ return grantFor(token, Date.now());
76
+ }
77
+ /**
78
+ * Verify a grant cookie against the configured token.
79
+ *
80
+ * Expiry is enforced here rather than left to the cookie's `maxAge`: a client
81
+ * decides how long to keep a cookie, so the server has to decide how long to
82
+ * accept one.
83
+ */
84
+ export function verifyGrant(value, token, maxAgeSeconds) {
85
+ if (!value)
86
+ return false;
87
+ const dot = value.indexOf(".");
88
+ if (dot <= 0)
89
+ return false;
90
+ const issuedAt = Number(value.slice(0, dot));
91
+ if (!Number.isFinite(issuedAt))
92
+ return false;
93
+ const age = Date.now() - issuedAt;
94
+ if (age < 0 || age > maxAgeSeconds * 1000)
95
+ return false;
96
+ return tokensMatch(value, grantFor(token, issuedAt));
97
+ }
98
+ /**
99
+ * An `authenticate` callback backed by `POLISHD_DASHBOARD_TOKEN`.
100
+ *
101
+ * export default createPolishdPage({ authenticate: polishdTokenAuth() });
102
+ *
103
+ * Used automatically when the env var is set and no other `authenticate` is
104
+ * passed, so most hosts never name it explicitly.
105
+ */
106
+ export function polishdTokenAuth(opts = {}) {
107
+ registerPolishdTokenOptions(opts);
108
+ // Reads the cookie off the context rather than calling `cookies()` itself,
109
+ // which is what makes it exercisable outside a live request.
110
+ return async function authenticate(ctx) {
111
+ const token = polishdDashboardToken();
112
+ // No token configured means no grant can ever be valid. Denying is the
113
+ // only safe reading — an unset secret must not mean "let everyone in".
114
+ if (!token)
115
+ return false;
116
+ return verifyGrant(ctx.cookies.get(POLISHD_DASHBOARD_COOKIE)?.value, token, options.maxAgeSeconds);
117
+ };
118
+ }
119
+ // ── Brute-force damping ──────────────────────────────────────────────────────
120
+ // Per-instance and in-memory: it survives neither a restart nor a second
121
+ // serverless instance, so it is a speed bump rather than a security boundary.
122
+ // The security boundary is the token's own entropy — the docs say to generate
123
+ // it with `openssl rand -hex 32`, not to pick one. What this does buy is that
124
+ // a single instance can't be walked through a large keyspace quickly.
125
+ const WINDOW_MS = 60_000;
126
+ const MAX_ATTEMPTS_PER_WINDOW = 10;
127
+ const attempts = new Map();
128
+ function clientKey(h) {
129
+ const fwd = h.get("x-forwarded-for");
130
+ if (fwd)
131
+ return fwd.split(",")[0].trim();
132
+ return h.get("x-real-ip") ?? "unknown";
133
+ }
134
+ /** Returns false when the caller has spent its attempts for this window. */
135
+ export function takeAttempt(h) {
136
+ const key = clientKey(h);
137
+ const now = Date.now();
138
+ const rec = attempts.get(key);
139
+ if (!rec || now > rec.resetAt) {
140
+ attempts.set(key, { count: 1, resetAt: now + WINDOW_MS });
141
+ // Opportunistic sweep — this map must not grow without bound.
142
+ if (attempts.size > 1024) {
143
+ for (const [k, v] of attempts)
144
+ if (now > v.resetAt)
145
+ attempts.delete(k);
146
+ }
147
+ return true;
148
+ }
149
+ if (rec.count >= MAX_ATTEMPTS_PER_WINDOW)
150
+ return false;
151
+ rec.count++;
152
+ return true;
153
+ }
154
+ /** Read the request headers for rate limiting. Separate for testability. */
155
+ export async function requestHeaders() {
156
+ return (await headers());
157
+ }
158
+ //# sourceMappingURL=token-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-auth.js","sourceRoot":"","sources":["../../src/dashboard/token-auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAIvC,+EAA+E;AAC/E,MAAM,CAAC,MAAM,wBAAwB,GAAG,mBAAmB,CAAC;AAE5D,wEAAwE;AACxE,MAAM,aAAa,GAAG,4BAA4B,CAAC;AAEnD,MAAM,iBAAiB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,WAAW;AAqBvD,8EAA8E;AAC9E,yEAAyE;AACzE,+EAA+E;AAC/E,yCAAyC;AACzC,IAAI,OAAO,GAAoB;IAC7B,QAAQ,EAAE,UAAU;IACpB,aAAa,EAAE,iBAAiB;CACjC,CAAC;AAEF,MAAM,UAAU,2BAA2B,CAAC,OAAgC,EAAE;IAC5E,OAAO,GAAG;QACR,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ;QAC3C,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,OAAO,CAAC,aAAa;KAC3D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,qBAAqB;IACnC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;IAClD,OAAO,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,CAAS,EAAE,CAAS;IAC9C,MAAM,EAAE,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;IAC3D,MAAM,EAAE,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;IAC3D,OAAO,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,0EAA0E;AAC1E,SAAS,QAAQ,CAAC,KAAa,EAAE,QAAgB;IAC/C,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC;SACpC,MAAM,CAAC,GAAG,aAAa,IAAI,QAAQ,EAAE,CAAC;SACtC,MAAM,CAAC,WAAW,CAAC,CAAC;IACvB,OAAO,GAAG,QAAQ,IAAI,GAAG,EAAE,CAAC;AAC9B,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CACzB,KAAyB,EACzB,KAAa,EACb,aAAqB;IAErB,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC;IAClC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,aAAa,GAAG,IAAI;QAAE,OAAO,KAAK,CAAC;IACxD,OAAO,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;AACvD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAgC,EAAE;IACjE,2BAA2B,CAAC,IAAI,CAAC,CAAC;IAClC,2EAA2E;IAC3E,6DAA6D;IAC7D,OAAO,KAAK,UAAU,YAAY,CAAC,GAAuB;QACxD,MAAM,KAAK,GAAG,qBAAqB,EAAE,CAAC;QACtC,uEAAuE;QACvE,uEAAuE;QACvE,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACzB,OAAO,WAAW,CAChB,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,EAAE,KAAK,EAChD,KAAK,EACL,OAAO,CAAC,aAAa,CACtB,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,yEAAyE;AACzE,8EAA8E;AAC9E,8EAA8E;AAC9E,8EAA8E;AAC9E,sEAAsE;AACtE,MAAM,SAAS,GAAG,MAAM,CAAC;AACzB,MAAM,uBAAuB,GAAG,EAAE,CAAC;AACnC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA8C,CAAC;AAEvE,SAAS,SAAS,CAAC,CAAU;IAC3B,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACrC,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;IAC1C,OAAO,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,SAAS,CAAC;AACzC,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,WAAW,CAAC,CAAU;IACpC,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;QAC9B,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,GAAG,SAAS,EAAE,CAAC,CAAC;QAC1D,8DAA8D;QAC9D,IAAI,QAAQ,CAAC,IAAI,GAAG,IAAI,EAAE,CAAC;YACzB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,QAAQ;gBAAE,IAAI,GAAG,GAAG,CAAC,CAAC,OAAO;oBAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,GAAG,CAAC,KAAK,IAAI,uBAAuB;QAAE,OAAO,KAAK,CAAC;IACvD,GAAG,CAAC,KAAK,EAAE,CAAC;IACZ,OAAO,IAAI,CAAC;AACd,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,OAAO,CAAC,MAAM,OAAO,EAAE,CAAuB,CAAC;AACjD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function unlockPolishdDashboard(formData: FormData): Promise<void>;
2
+ //# sourceMappingURL=unlock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unlock.d.ts","sourceRoot":"","sources":["../../src/dashboard/unlock.ts"],"names":[],"mappings":"AAiCA,wBAAsB,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAmC9E"}
@@ -0,0 +1,54 @@
1
+ "use server";
2
+ /**
3
+ * Polishd — the dashboard unlock action.
4
+ *
5
+ * This is the one action in the package that must be reachable *without*
6
+ * authorization: it is what grants authorization in the first place, so
7
+ * putting it behind `requirePolishdAuth()` would be a chicken-and-egg lock.
8
+ * Everything it can do is therefore bounded by the token check below, and it
9
+ * carries its own rate limit instead of the shared guard.
10
+ *
11
+ * It exists as a server action rather than a route because server actions can
12
+ * set cookies. That is the whole reason the token never has to travel in a URL:
13
+ * the form posts here, the cookie comes back, and the address bar never holds
14
+ * the secret.
15
+ */
16
+ import { cookies } from "next/headers";
17
+ import { redirect } from "next/navigation";
18
+ import { POLISHD_DASHBOARD_COOKIE, mintGrant, polishdDashboardToken, polishdTokenOptions, requestHeaders, takeAttempt, tokensMatch, } from "./token-auth";
19
+ /** Blunt the timing signal, and make scripted guessing tedious. */
20
+ function pause() {
21
+ return new Promise((r) => setTimeout(r, 250 + Math.random() * 250));
22
+ }
23
+ export async function unlockPolishdDashboard(formData) {
24
+ const { basePath, maxAgeSeconds } = polishdTokenOptions();
25
+ const fail = (code) => redirect(`${basePath}?polishd_unlock=${code}`);
26
+ if (!takeAttempt(await requestHeaders())) {
27
+ await pause();
28
+ fail("rate");
29
+ return;
30
+ }
31
+ await pause();
32
+ const token = polishdDashboardToken();
33
+ const presented = String(formData.get("token") ?? "");
34
+ // `===` short-circuits on the first differing byte, which is a timing oracle
35
+ // over the secret. tokensMatch hashes both sides to a fixed width and uses
36
+ // timingSafeEqual, so neither content nor length is observable.
37
+ if (!token || presented.length === 0 || !tokensMatch(presented, token)) {
38
+ fail("invalid");
39
+ return;
40
+ }
41
+ const jar = await cookies();
42
+ jar.set(POLISHD_DASHBOARD_COOKIE, mintGrant(token), {
43
+ httpOnly: true, // never readable from JS
44
+ sameSite: "lax",
45
+ // Not hardcoded true: that would silently fail to set over plain HTTP,
46
+ // making local development look like a wrong password.
47
+ secure: process.env.NODE_ENV === "production",
48
+ // Scoped so the grant never rides along on host app requests.
49
+ path: basePath,
50
+ maxAge: maxAgeSeconds,
51
+ });
52
+ redirect(basePath);
53
+ }
54
+ //# sourceMappingURL=unlock.js.map