@polishd/next 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +262 -0
- package/DATABASE.md +147 -0
- package/LICENSE +21 -0
- package/README.md +310 -0
- package/bin/init.mjs +224 -0
- package/dist/ai/actions.d.ts +23 -0
- package/dist/ai/actions.d.ts.map +1 -0
- package/dist/ai/actions.js +58 -0
- package/dist/ai/actions.js.map +1 -0
- package/dist/ai/digest.d.ts +9 -0
- package/dist/ai/digest.d.ts.map +1 -0
- package/dist/ai/digest.js +108 -0
- package/dist/ai/digest.js.map +1 -0
- package/dist/ai/github.d.ts +51 -0
- package/dist/ai/github.d.ts.map +1 -0
- package/dist/ai/github.js +175 -0
- package/dist/ai/github.js.map +1 -0
- package/dist/ai/guard.d.ts +43 -0
- package/dist/ai/guard.d.ts.map +1 -0
- package/dist/ai/guard.js +57 -0
- package/dist/ai/guard.js.map +1 -0
- package/dist/ai/issues.d.ts +21 -0
- package/dist/ai/issues.d.ts.map +1 -0
- package/dist/ai/issues.js +291 -0
- package/dist/ai/issues.js.map +1 -0
- package/dist/ai/profile.d.ts +26 -0
- package/dist/ai/profile.d.ts.map +1 -0
- package/dist/ai/profile.js +160 -0
- package/dist/ai/profile.js.map +1 -0
- package/dist/ai/providers.d.ts +40 -0
- package/dist/ai/providers.d.ts.map +1 -0
- package/dist/ai/providers.js +142 -0
- package/dist/ai/providers.js.map +1 -0
- package/dist/ai/scan.d.ts +38 -0
- package/dist/ai/scan.d.ts.map +1 -0
- package/dist/ai/scan.js +274 -0
- package/dist/ai/scan.js.map +1 -0
- package/dist/ai/settings.d.ts +31 -0
- package/dist/ai/settings.d.ts.map +1 -0
- package/dist/ai/settings.js +182 -0
- package/dist/ai/settings.js.map +1 -0
- package/dist/ai/summary.d.ts +26 -0
- package/dist/ai/summary.d.ts.map +1 -0
- package/dist/ai/summary.js +260 -0
- package/dist/ai/summary.js.map +1 -0
- package/dist/ai/types.d.ts +188 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai/types.js +13 -0
- package/dist/ai/types.js.map +1 -0
- package/dist/client/init.d.ts +14 -0
- package/dist/client/init.d.ts.map +1 -0
- package/dist/client/init.js +274 -0
- package/dist/client/init.js.map +1 -0
- package/dist/client/monitor.d.ts +23 -0
- package/dist/client/monitor.d.ts.map +1 -0
- package/dist/client/monitor.js +176 -0
- package/dist/client/monitor.js.map +1 -0
- package/dist/client.d.ts +11 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +10 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +36 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +26 -0
- package/dist/config.js.map +1 -0
- package/dist/dashboard/elements.d.ts +6 -0
- package/dist/dashboard/elements.d.ts.map +1 -0
- package/dist/dashboard/elements.js +35 -0
- package/dist/dashboard/elements.js.map +1 -0
- package/dist/dashboard/features.d.ts +6 -0
- package/dist/dashboard/features.d.ts.map +1 -0
- package/dist/dashboard/features.js +28 -0
- package/dist/dashboard/features.js.map +1 -0
- package/dist/dashboard/index.d.ts +54 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +140 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/dashboard/journeys.d.ts +5 -0
- package/dist/dashboard/journeys.d.ts.map +1 -0
- package/dist/dashboard/journeys.js +158 -0
- package/dist/dashboard/journeys.js.map +1 -0
- package/dist/dashboard/pages.d.ts +5 -0
- package/dist/dashboard/pages.d.ts.map +1 -0
- package/dist/dashboard/pages.js +104 -0
- package/dist/dashboard/pages.js.map +1 -0
- package/dist/dashboard/summary.d.ts +13 -0
- package/dist/dashboard/summary.d.ts.map +1 -0
- package/dist/dashboard/summary.js +333 -0
- package/dist/dashboard/summary.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/proxy.d.ts +40 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +29 -0
- package/dist/proxy.js.map +1 -0
- package/dist/route.d.ts +24 -0
- package/dist/route.d.ts.map +1 -0
- package/dist/route.js +37 -0
- package/dist/route.js.map +1 -0
- package/dist/server/ingest.d.ts +14 -0
- package/dist/server/ingest.d.ts.map +1 -0
- package/dist/server/ingest.js +73 -0
- package/dist/server/ingest.js.map +1 -0
- package/dist/server/queries.d.ts +245 -0
- package/dist/server/queries.d.ts.map +1 -0
- package/dist/server/queries.js +547 -0
- package/dist/server/queries.js.map +1 -0
- package/dist/server/store.d.ts +29 -0
- package/dist/server/store.d.ts.map +1 -0
- package/dist/server/store.js +359 -0
- package/dist/server/store.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +15 -0
- package/dist/server.js.map +1 -0
- package/dist/session.d.ts +16 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +29 -0
- package/dist/session.js.map +1 -0
- package/dist/shared/types.d.ts +56 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +27 -0
- package/dist/shared/types.js.map +1 -0
- package/docs/SETUP.md +315 -0
- package/package.json +92 -0
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* Polishd — AI summary card (client).
|
|
5
|
+
*
|
|
6
|
+
* Sits at the top of the dashboard. First visit walks the owner through a
|
|
7
|
+
* five-step setup (connect a model → describe the site → scan the codebase →
|
|
8
|
+
* connect GitHub → pick a refresh cadence); after that the card is just the
|
|
9
|
+
* story: summary text,
|
|
10
|
+
* when it was generated, a refresh icon to force a regenerate, and a gear that
|
|
11
|
+
* reveals the full settings (including the project profile) on demand.
|
|
12
|
+
*
|
|
13
|
+
* The card renders the cached summary handed down from the server on first
|
|
14
|
+
* paint — no model call on load. A model is only hit on explicit actions or
|
|
15
|
+
* the server-side cadence refresh. The API key is write-only: we never receive
|
|
16
|
+
* it back, only a "configured" flag.
|
|
17
|
+
*/
|
|
18
|
+
import { useState, useTransition } from "react";
|
|
19
|
+
import { createIssueFromLossAction, generateProfileAction, generateSummaryAction, saveAISettingsAction, verifyGithubAction, } from "../ai/actions";
|
|
20
|
+
const border = "border-[#2e2e2e]";
|
|
21
|
+
const card = `border ${border} rounded-lg bg-[#0a0a0a]`;
|
|
22
|
+
const labelCls = "text-[11px] font-medium uppercase tracking-[0.08em] text-[#666]";
|
|
23
|
+
const inputCls = "w-full rounded-md border border-[#2e2e2e] bg-[#111] px-3 py-2 text-[13px] text-white placeholder:text-[#555] focus:border-[#555] focus:outline-none";
|
|
24
|
+
const primaryBtn = "rounded-md bg-white px-3 py-1.5 text-[12px] font-medium text-black transition-opacity hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-40";
|
|
25
|
+
const ghostBtn = "rounded-md border border-[#2e2e2e] px-2.5 py-1.5 text-[12px] text-[#aaa] transition-colors hover:border-[#555] hover:text-white disabled:cursor-not-allowed disabled:opacity-40";
|
|
26
|
+
const iconBtn = "flex h-7 w-7 items-center justify-center rounded-md border border-[#2e2e2e] text-[#aaa] transition-colors hover:border-[#555] hover:text-white disabled:cursor-not-allowed disabled:opacity-40";
|
|
27
|
+
const PROVIDERS = [
|
|
28
|
+
{
|
|
29
|
+
value: "anthropic",
|
|
30
|
+
label: "Anthropic (Claude)",
|
|
31
|
+
modelHint: "claude-opus-4-8",
|
|
32
|
+
keyUrl: "https://console.anthropic.com/settings/keys",
|
|
33
|
+
keyHost: "console.anthropic.com",
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
value: "openai",
|
|
37
|
+
label: "OpenAI",
|
|
38
|
+
modelHint: "gpt-4o-mini",
|
|
39
|
+
keyUrl: "https://platform.openai.com/api-keys",
|
|
40
|
+
keyHost: "platform.openai.com",
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
value: "openai-compatible",
|
|
44
|
+
label: "OpenAI-compatible",
|
|
45
|
+
modelHint: "model id",
|
|
46
|
+
keyUrl: "https://openrouter.ai/keys",
|
|
47
|
+
keyHost: "your provider (e.g. openrouter.ai)",
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
value: "google",
|
|
51
|
+
label: "Google (Gemini)",
|
|
52
|
+
modelHint: "gemini-1.5-flash",
|
|
53
|
+
keyUrl: "https://aistudio.google.com/app/apikey",
|
|
54
|
+
keyHost: "aistudio.google.com",
|
|
55
|
+
},
|
|
56
|
+
];
|
|
57
|
+
const CADENCES = [
|
|
58
|
+
{ value: "manual", label: "Manual", hint: "Only when you press refresh" },
|
|
59
|
+
{ value: "daily", label: "Daily", hint: "Refreshes on your first dashboard visit each day, if data changed" },
|
|
60
|
+
{ value: "weekly", label: "Weekly", hint: "Refreshes at most once a week, if data changed" },
|
|
61
|
+
];
|
|
62
|
+
function relTime(ms) {
|
|
63
|
+
const s = Math.max(0, Math.round((Date.now() - ms) / 1000));
|
|
64
|
+
if (s < 60)
|
|
65
|
+
return "just now";
|
|
66
|
+
const m = Math.round(s / 60);
|
|
67
|
+
if (m < 60)
|
|
68
|
+
return `${m}m ago`;
|
|
69
|
+
const h = Math.round(m / 60);
|
|
70
|
+
if (h < 24)
|
|
71
|
+
return `${h}h ago`;
|
|
72
|
+
return `${Math.round(h / 24)}d ago`;
|
|
73
|
+
}
|
|
74
|
+
// ── Icons (Feather, inlined) ─────────────────────────────────────────────────
|
|
75
|
+
function RefreshIcon({ spinning }) {
|
|
76
|
+
return (_jsxs("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: spinning ? "animate-spin" : undefined, "aria-hidden": true, children: [_jsx("polyline", { points: "23 4 23 10 17 10" }), _jsx("path", { d: "M20.49 15a9 9 0 1 1-2.12-9.36L23 10" })] }));
|
|
77
|
+
}
|
|
78
|
+
function GearIcon() {
|
|
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
|
+
}
|
|
81
|
+
export default function SummaryCard({ initialSummary, initialSettings, initialStale, initialProfile, initialGaps, sourceAvailable, }) {
|
|
82
|
+
const [summary, setSummary] = useState(initialSummary);
|
|
83
|
+
const [settings, setSettings] = useState(initialSettings);
|
|
84
|
+
const [stale, setStale] = useState(initialStale);
|
|
85
|
+
const [profile, setProfile] = useState(initialProfile);
|
|
86
|
+
const [gaps, setGaps] = useState(initialGaps);
|
|
87
|
+
const [error, setError] = useState(null);
|
|
88
|
+
const [showSettings, setShowSettings] = useState(false);
|
|
89
|
+
// The wizard shows exactly once: a fresh install (no key, nothing cached).
|
|
90
|
+
// After step 1 saves a key, reloads land on the normal card for good.
|
|
91
|
+
const [onboarding, setOnboarding] = useState(!initialSettings.hasApiKey && !initialSummary && !initialSettings.fromEnv);
|
|
92
|
+
const [pending, startGenerate] = useTransition();
|
|
93
|
+
const generate = (force) => {
|
|
94
|
+
setError(null);
|
|
95
|
+
startGenerate(async () => {
|
|
96
|
+
const res = await generateSummaryAction(force);
|
|
97
|
+
if (res.ok) {
|
|
98
|
+
setSummary(res.summary);
|
|
99
|
+
setStale(false);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
if (res.error === "no-key")
|
|
103
|
+
setShowSettings(true);
|
|
104
|
+
setError(res.message);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
};
|
|
108
|
+
const hasSummary = summary !== null;
|
|
109
|
+
const cadence = settings.refreshCadence ?? "manual";
|
|
110
|
+
return (_jsxs("section", { className: `mb-8 ${card} overflow-hidden`, children: [_jsxs("div", { className: `flex items-center justify-between gap-3 border-b ${border} px-4 py-3 sm:px-5`, children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: labelCls, children: "All you need to know" }), settings.hasApiKey && (_jsxs("span", { className: "hidden rounded-full bg-[#1a1a1a] px-2 py-0.5 text-[10px] font-medium text-[#888] sm:inline", children: [settings.provider, " \u00B7 ", settings.model] }))] }), !onboarding && (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("button", { type: "button", onClick: () => generate(hasSummary), disabled: pending || !settings.hasApiKey, title: settings.hasApiKey ? "Regenerate the summary now" : "Connect a model first", "aria-label": "Refresh summary", className: iconBtn, children: _jsx(RefreshIcon, { spinning: pending }) }), _jsx("button", { type: "button", onClick: () => setShowSettings((s) => !s), title: "Setup & settings", "aria-label": "Setup and settings", className: `${iconBtn} ${showSettings ? "border-[#555] text-white" : ""}`, children: _jsx(GearIcon, {}) })] }))] }), onboarding ? (_jsx(OnboardingWizard, { settings: settings, sourceAvailable: sourceAvailable, onSettings: setSettings, onProfile: (p) => {
|
|
111
|
+
setProfile(p);
|
|
112
|
+
setGaps([]);
|
|
113
|
+
}, onSummary: (s) => {
|
|
114
|
+
setSummary(s);
|
|
115
|
+
setStale(false);
|
|
116
|
+
}, onError: setError, onDone: () => setOnboarding(false) })) : (_jsxs(_Fragment, { children: [_jsxs("div", { className: "px-4 py-4 sm:px-5 sm:py-5", children: [error && (_jsx("div", { className: "mb-3 rounded-md border border-red-900/50 bg-red-950/30 px-3 py-2 text-[12px] text-red-400", children: error })), hasSummary ? (_jsxs(_Fragment, { children: [_jsx("p", { className: "text-[14px] leading-relaxed text-[#e4e4e4]", children: summary.text }), _jsx(WinsLosses, { wins: summary.wins, losses: summary.losses, githubConnected: settings.hasGithubToken && !!settings.githubRepo }), _jsxs("div", { className: "mt-3 flex flex-wrap items-center gap-x-3 gap-y-1 text-[11px] text-[#555]", children: [_jsxs("span", { children: ["Generated ", relTime(summary.generatedAt), " \u00B7 ", summary.provider, "/", summary.model, cadence !== "manual" && ` · refreshes ${cadence}`] }), stale && (_jsx("span", { className: "rounded-full bg-amber-950/50 px-2 py-0.5 text-amber-400", children: "New data since this summary \u2014 refresh to update" }))] })] })) : (_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3", children: [_jsx("p", { className: "text-[13px] leading-relaxed text-[#888]", children: settings.hasApiKey
|
|
117
|
+
? "No summary yet — generate the story of how visitors are using this site from the signals below."
|
|
118
|
+
: "No model connected. Open settings to add an API key." }), _jsx("button", { type: "button", onClick: () => (settings.hasApiKey ? generate(false) : setShowSettings(true)), disabled: pending, className: primaryBtn, children: pending ? "Thinking…" : settings.hasApiKey ? "Generate summary" : "Open settings" })] }))] }), showSettings && (_jsxs(_Fragment, { children: [_jsx(ProfileStrip, { profile: profile, gaps: gaps, hasApiKey: settings.hasApiKey, sourceAvailable: sourceAvailable, onScanned: (p) => {
|
|
119
|
+
setProfile(p);
|
|
120
|
+
setGaps([]);
|
|
121
|
+
setError(null);
|
|
122
|
+
// A new profile changes the summary's inputs — flag the cached one.
|
|
123
|
+
if (summary)
|
|
124
|
+
setStale(true);
|
|
125
|
+
}, onError: setError }), _jsx(SettingsPanel, { settings: settings, onSaved: (next) => {
|
|
126
|
+
setSettings(next);
|
|
127
|
+
setError(null);
|
|
128
|
+
} })] }))] }))] }));
|
|
129
|
+
}
|
|
130
|
+
// ── Wins & losses ────────────────────────────────────────────────────────────
|
|
131
|
+
/**
|
|
132
|
+
* One-click "loss → GitHub issue". The server action verifies the report
|
|
133
|
+
* against the repository's source first: confirmed reports become issues with
|
|
134
|
+
* the technical analysis and fix suggestions, disproved ones come back as
|
|
135
|
+
* `not-a-bug` with the reasoning — shown here instead of a link. Losses whose
|
|
136
|
+
* issue already exists (auto-filed, or filed on an earlier summary) render as
|
|
137
|
+
* the link straight away.
|
|
138
|
+
*/
|
|
139
|
+
function FileBugButton({ loss }) {
|
|
140
|
+
const [created, setCreated] = useState(loss.issueUrl ? { url: loss.issueUrl, number: loss.issueNumber ?? 0 } : null);
|
|
141
|
+
const [failed, setFailed] = useState(null);
|
|
142
|
+
const [pending, startFile] = useTransition();
|
|
143
|
+
if (created) {
|
|
144
|
+
return (_jsxs("a", { href: created.url, target: "_blank", rel: "noreferrer noopener", className: "rounded bg-[#101c14] px-1.5 py-0.5 text-[10px] font-medium text-emerald-500 hover:text-emerald-400", children: ["Issue #", created.number, " \u2197"] }));
|
|
145
|
+
}
|
|
146
|
+
if (failed?.notABug) {
|
|
147
|
+
return (_jsxs("span", { className: "rounded bg-amber-950/50 px-1.5 py-0.5 text-[10px] text-amber-400", title: failed.message, children: ["Checked the source \u2014 not an actual bug: ", failed.message] }));
|
|
148
|
+
}
|
|
149
|
+
const file = () => startFile(async () => {
|
|
150
|
+
setFailed(null);
|
|
151
|
+
const res = await createIssueFromLossAction({
|
|
152
|
+
issue: loss.issue,
|
|
153
|
+
evidence: loss.evidence,
|
|
154
|
+
location: loss.location,
|
|
155
|
+
});
|
|
156
|
+
if (res.ok)
|
|
157
|
+
setCreated({ url: res.url, number: res.number });
|
|
158
|
+
else
|
|
159
|
+
setFailed({ notABug: res.error === "not-a-bug", message: res.message });
|
|
160
|
+
});
|
|
161
|
+
return (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: file, disabled: pending, title: "Verify this problem against the source code, then create a GitHub issue with the technical details", className: "rounded border border-[#2e2e2e] px-1.5 py-0.5 text-[10px] text-[#888] transition-colors hover:border-[#555] hover:text-white disabled:cursor-not-allowed disabled:opacity-40", children: pending ? "Verifying…" : "File bug" }), failed && _jsx("span", { className: "text-[10px] text-red-400", children: failed.message })] }));
|
|
162
|
+
}
|
|
163
|
+
function WinsLosses({ wins, losses, githubConnected, }) {
|
|
164
|
+
const hasWins = !!wins?.length;
|
|
165
|
+
const hasLosses = !!losses?.length;
|
|
166
|
+
if (!hasWins && !hasLosses)
|
|
167
|
+
return null;
|
|
168
|
+
return (_jsxs("div", { className: "mt-4 grid gap-4 sm:grid-cols-2", children: [hasWins && (_jsxs("div", { children: [_jsx("div", { className: `${labelCls} mb-2 text-emerald-500`, children: "Wins" }), _jsx("ul", { className: "space-y-1.5", children: wins.map((w, i) => (_jsxs("li", { className: "flex gap-2 text-[13px] leading-snug text-[#bbb]", children: [_jsx("span", { className: "mt-px shrink-0 text-emerald-500", children: "\u2713" }), _jsx("span", { children: w })] }, i))) })] })), hasLosses && (_jsxs("div", { children: [_jsx("div", { className: `${labelCls} mb-2 text-red-400`, children: "Losses" }), _jsx("ul", { className: "space-y-2.5", children: losses.map((l, i) => (_jsxs("li", { className: "flex gap-2 text-[13px] leading-snug text-[#bbb]", children: [_jsx("span", { className: "mt-px shrink-0 text-red-400", children: "\u2715" }), _jsxs("span", { children: [l.issue, _jsxs("span", { className: "mt-0.5 flex flex-wrap items-center gap-1.5", children: [_jsx("code", { className: "rounded bg-[#1a1a1a] px-1.5 py-0.5 font-mono text-[10px] text-[#888]", children: l.evidence }), l.location ? (_jsx("code", { className: "rounded bg-[#101c14] px-1.5 py-0.5 font-mono text-[10px] text-emerald-500", children: l.location })) : (_jsx("span", { className: "rounded bg-[#1a1a1a] px-1.5 py-0.5 text-[10px] text-[#666]", title: "The citation is real analytics data, but no matching file was found on disk (dynamic content, or source not available here).", children: "not matched to source" })), (githubConnected || !!l.issueUrl) && _jsx(FileBugButton, { loss: l })] })] })] }, i))) })] }))] }));
|
|
169
|
+
}
|
|
170
|
+
// ── Onboarding wizard ────────────────────────────────────────────────────────
|
|
171
|
+
const STEPS = ["Model", "Your site", "Codebase", "GitHub", "Cadence"];
|
|
172
|
+
function StepShell({ step, title, intro, children, }) {
|
|
173
|
+
return (_jsxs("div", { className: "px-4 py-5 sm:px-5", children: [_jsx("div", { className: "mb-4 flex items-center gap-1.5", children: STEPS.map((name, i) => (_jsxs("span", { className: "flex items-center gap-1.5", children: [_jsxs("span", { className: `flex h-5 items-center rounded-full px-2 text-[10px] font-medium ${i === step
|
|
174
|
+
? "bg-white text-black"
|
|
175
|
+
: i < step
|
|
176
|
+
? "bg-[#1a1a1a] text-emerald-400"
|
|
177
|
+
: "bg-[#1a1a1a] text-[#555]"}`, children: [i < step ? "✓ " : `${i + 1} · `, name] }), i < STEPS.length - 1 && _jsx("span", { className: "h-px w-3 bg-[#2e2e2e]" })] }, name))) }), _jsx("h3", { className: "text-[15px] font-semibold text-white", children: title }), _jsx("p", { className: "mt-1 max-w-xl text-[12px] leading-relaxed text-[#888]", children: intro }), _jsx("div", { className: "mt-4", children: children })] }));
|
|
178
|
+
}
|
|
179
|
+
function OnboardingWizard({ settings, sourceAvailable, onSettings, onProfile, onSummary, onError, onDone, }) {
|
|
180
|
+
const [step, setStep] = useState(0);
|
|
181
|
+
const [error, setError] = useState(null);
|
|
182
|
+
// Step 1 — model
|
|
183
|
+
const [provider, setProvider] = useState(settings.provider);
|
|
184
|
+
const [model, setModel] = useState(settings.model);
|
|
185
|
+
const [apiKey, setApiKey] = useState("");
|
|
186
|
+
const [baseUrl, setBaseUrl] = useState(settings.baseUrl ?? "");
|
|
187
|
+
// Step 2 — site
|
|
188
|
+
const [context, setContext] = useState(settings.context ?? "");
|
|
189
|
+
const [audience, setAudience] = useState(settings.audience ?? "");
|
|
190
|
+
const [ideology, setIdeology] = useState(settings.ideology ?? "");
|
|
191
|
+
// Step 3 — codebase
|
|
192
|
+
const [sourceDirs, setSourceDirs] = useState(settings.sourceDirs ?? "");
|
|
193
|
+
const [scanned, setScanned] = useState(null);
|
|
194
|
+
// Step 4 — GitHub
|
|
195
|
+
const [githubRepo, setGithubRepo] = useState(settings.githubRepo ?? "");
|
|
196
|
+
const [githubToken, setGithubToken] = useState("");
|
|
197
|
+
const [githubStatus, setGithubStatus] = useState(null);
|
|
198
|
+
const [autoIssues, setAutoIssues] = useState(settings.githubAutoIssues ?? false);
|
|
199
|
+
// Step 5 — cadence
|
|
200
|
+
const [cadence, setCadence] = useState("manual");
|
|
201
|
+
const [pending, startStep] = useTransition();
|
|
202
|
+
const prov = PROVIDERS.find((p) => p.value === provider);
|
|
203
|
+
const next = () => {
|
|
204
|
+
setError(null);
|
|
205
|
+
setStep((s) => s + 1);
|
|
206
|
+
};
|
|
207
|
+
const saveModel = () => startStep(async () => {
|
|
208
|
+
const saved = await saveAISettingsAction({ provider, model, apiKey, baseUrl });
|
|
209
|
+
onSettings(saved);
|
|
210
|
+
setApiKey("");
|
|
211
|
+
if (!saved.hasApiKey) {
|
|
212
|
+
setError("Paste an API key to continue — the model can't be called without one.");
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
next();
|
|
216
|
+
});
|
|
217
|
+
const saveSite = () => startStep(async () => {
|
|
218
|
+
onSettings(await saveAISettingsAction({ context, audience, ideology }));
|
|
219
|
+
next();
|
|
220
|
+
});
|
|
221
|
+
const scan = () => startStep(async () => {
|
|
222
|
+
setError(null);
|
|
223
|
+
onSettings(await saveAISettingsAction({ sourceDirs }));
|
|
224
|
+
const res = await generateProfileAction();
|
|
225
|
+
if (res.ok) {
|
|
226
|
+
setScanned(res.profile);
|
|
227
|
+
onProfile(res.profile);
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
setError(res.message);
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
const connectGithub = () => startStep(async () => {
|
|
234
|
+
setError(null);
|
|
235
|
+
const saved = await saveAISettingsAction({
|
|
236
|
+
githubRepo,
|
|
237
|
+
githubToken,
|
|
238
|
+
githubAutoIssues: autoIssues,
|
|
239
|
+
});
|
|
240
|
+
onSettings(saved);
|
|
241
|
+
setGithubToken("");
|
|
242
|
+
const res = await verifyGithubAction();
|
|
243
|
+
if (res.ok)
|
|
244
|
+
setGithubStatus(res.status);
|
|
245
|
+
else
|
|
246
|
+
setError(res.message);
|
|
247
|
+
});
|
|
248
|
+
// The toggle stays visible after connecting — persist its latest state.
|
|
249
|
+
const finishGithub = () => startStep(async () => {
|
|
250
|
+
onSettings(await saveAISettingsAction({ githubAutoIssues: autoIssues }));
|
|
251
|
+
next();
|
|
252
|
+
});
|
|
253
|
+
const finish = () => startStep(async () => {
|
|
254
|
+
onSettings(await saveAISettingsAction({ refreshCadence: cadence }));
|
|
255
|
+
const res = await generateSummaryAction(false);
|
|
256
|
+
if (res.ok)
|
|
257
|
+
onSummary(res.summary);
|
|
258
|
+
else
|
|
259
|
+
onError(res.message); // wizard is closing — surface it on the card
|
|
260
|
+
onDone();
|
|
261
|
+
});
|
|
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
|
|
263
|
+
? "border-white bg-[#141414]"
|
|
264
|
+
: "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
|
+
}
|
|
266
|
+
// ── Project profile strip (inside settings) ──────────────────────────────────
|
|
267
|
+
function ProfileStrip({ profile, gaps, hasApiKey, sourceAvailable, onScanned, onError, }) {
|
|
268
|
+
const [expanded, setExpanded] = useState(false);
|
|
269
|
+
const [pending, startScan] = useTransition();
|
|
270
|
+
const scan = () => {
|
|
271
|
+
startScan(async () => {
|
|
272
|
+
const res = await generateProfileAction();
|
|
273
|
+
if (res.ok)
|
|
274
|
+
onScanned(res.profile);
|
|
275
|
+
else
|
|
276
|
+
onError(res.message);
|
|
277
|
+
});
|
|
278
|
+
};
|
|
279
|
+
const canScan = hasApiKey && sourceAvailable && !pending;
|
|
280
|
+
return (_jsxs("div", { className: `border-t ${border} bg-[#080808] px-4 py-3 sm:px-5`, children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-2", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2 text-[11px] text-[#555]", children: [_jsx("span", { className: labelCls, children: "Project profile" }), profile ? (_jsxs(_Fragment, { children: [_jsxs("span", { children: ["scanned ", relTime(profile.generatedAt), " \u00B7 ", profile.sourceFiles, " files \u00B7", " ", profile.coveredIdentifiers.length, " components", profile.truncated ? " · clipped to budget" : ""] }), gaps.length > 0 && (_jsxs("span", { className: "rounded-full bg-amber-950/50 px-2 py-0.5 text-amber-400", children: [gaps.length, " new ", gaps.length === 1 ? "component" : "components", " not covered \u2014 re-scan"] })), _jsx("button", { type: "button", onClick: () => setExpanded((e) => !e), className: "text-[#888] underline decoration-[#444] underline-offset-2 hover:text-white", children: expanded ? "Hide" : "View" })] })) : (_jsx("span", { children: sourceAvailable
|
|
281
|
+
? "Not scanned yet — one scan teaches the model your pages and components, so every summary understands the site without re-reading code."
|
|
282
|
+
: "Source not on disk here — run the scan in local dev; the saved profile then serves everywhere." }))] }), _jsx("button", { type: "button", onClick: scan, disabled: !canScan, title: !hasApiKey
|
|
283
|
+
? "Add an API key first"
|
|
284
|
+
: !sourceAvailable
|
|
285
|
+
? "No source tree found on disk"
|
|
286
|
+
: undefined, className: "rounded-md border border-[#2e2e2e] px-2.5 py-1 text-[11px] text-[#aaa] transition-colors hover:border-[#555] hover:text-white disabled:cursor-not-allowed disabled:opacity-40", children: pending ? "Scanning…" : profile ? "Re-scan codebase" : "Scan codebase" })] }), expanded && profile && (_jsx("p", { className: "mt-3 whitespace-pre-wrap text-[12px] leading-relaxed text-[#999]", children: profile.text }))] }));
|
|
287
|
+
}
|
|
288
|
+
// ── Full settings form (inside settings) ─────────────────────────────────────
|
|
289
|
+
function SettingsPanel({ settings, onSaved, }) {
|
|
290
|
+
const [provider, setProvider] = useState(settings.provider);
|
|
291
|
+
const [model, setModel] = useState(settings.model);
|
|
292
|
+
const [apiKey, setApiKey] = useState("");
|
|
293
|
+
const [baseUrl, setBaseUrl] = useState(settings.baseUrl ?? "");
|
|
294
|
+
const [instructions, setInstructions] = useState(settings.instructions ?? "");
|
|
295
|
+
const [context, setContext] = useState(settings.context ?? "");
|
|
296
|
+
const [audience, setAudience] = useState(settings.audience ?? "");
|
|
297
|
+
const [ideology, setIdeology] = useState(settings.ideology ?? "");
|
|
298
|
+
const [sourceDirs, setSourceDirs] = useState(settings.sourceDirs ?? "");
|
|
299
|
+
const [cadence, setCadence] = useState(settings.refreshCadence ?? "manual");
|
|
300
|
+
const [githubRepo, setGithubRepo] = useState(settings.githubRepo ?? "");
|
|
301
|
+
const [githubToken, setGithubToken] = useState("");
|
|
302
|
+
const [autoIssues, setAutoIssues] = useState(settings.githubAutoIssues ?? false);
|
|
303
|
+
const [saved, setSaved] = useState(false);
|
|
304
|
+
const [pending, startSave] = useTransition();
|
|
305
|
+
const prov = PROVIDERS.find((p) => p.value === provider);
|
|
306
|
+
const modelHint = prov?.modelHint ?? "";
|
|
307
|
+
const save = () => {
|
|
308
|
+
setSaved(false);
|
|
309
|
+
startSave(async () => {
|
|
310
|
+
const next = await saveAISettingsAction({
|
|
311
|
+
provider,
|
|
312
|
+
model,
|
|
313
|
+
apiKey, // blank keeps the stored key
|
|
314
|
+
baseUrl,
|
|
315
|
+
instructions,
|
|
316
|
+
context,
|
|
317
|
+
audience,
|
|
318
|
+
ideology,
|
|
319
|
+
sourceDirs,
|
|
320
|
+
refreshCadence: cadence,
|
|
321
|
+
githubRepo,
|
|
322
|
+
githubToken, // blank keeps the stored token
|
|
323
|
+
githubAutoIssues: autoIssues,
|
|
324
|
+
});
|
|
325
|
+
onSaved(next);
|
|
326
|
+
setApiKey("");
|
|
327
|
+
setGithubToken("");
|
|
328
|
+
setSaved(true);
|
|
329
|
+
});
|
|
330
|
+
};
|
|
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." }))] })] }));
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=summary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/dashboard/summary.tsx"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @polishd/next — isomorphic entry point.
|
|
3
|
+
*
|
|
4
|
+
* Safe to import anywhere (client or server). Exposes only config + the event
|
|
5
|
+
* schema; nothing here touches Node, the DOM, or the database. For capture use
|
|
6
|
+
* `@polishd/next/client`, for storage/queries `@polishd/next/server`.
|
|
7
|
+
*/
|
|
8
|
+
export * from "./config";
|
|
9
|
+
export * from "./shared/types";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @polishd/next — isomorphic entry point.
|
|
3
|
+
*
|
|
4
|
+
* Safe to import anywhere (client or server). Exposes only config + the event
|
|
5
|
+
* schema; nothing here touches Node, the DOM, or the database. For capture use
|
|
6
|
+
* `@polishd/next/client`, for storage/queries `@polishd/next/server`.
|
|
7
|
+
*/
|
|
8
|
+
export * from "./config";
|
|
9
|
+
export * from "./shared/types";
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC"}
|
package/dist/proxy.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @polishd/next/proxy — anonymous session assignment.
|
|
3
|
+
*
|
|
4
|
+
* Consumers wire this up with a one-line re-export:
|
|
5
|
+
*
|
|
6
|
+
* // src/proxy.ts (Next 16; `middleware.ts` on Next 15)
|
|
7
|
+
* export { proxy, config } from "@polishd/next/proxy";
|
|
8
|
+
*
|
|
9
|
+
* To compose with your own proxy logic, import `withPolishdSession` and
|
|
10
|
+
* `polishdMatcher` instead and thread the same NextResponse through.
|
|
11
|
+
*/
|
|
12
|
+
import type { NextRequest } from "next/server";
|
|
13
|
+
import type { PolishdConfig } from "./config";
|
|
14
|
+
import { withPolishdSession } from "./session";
|
|
15
|
+
export { withPolishdSession };
|
|
16
|
+
/**
|
|
17
|
+
* The matcher Polishd requires. Excluding ALL of `/api` is load-bearing: under
|
|
18
|
+
* Next 16 + Turbopack, letting the proxy match any `/api/*` route breaks route
|
|
19
|
+
* resolution for the entire `/api` segment (every route 404s). The proxy's only
|
|
20
|
+
* job is setting the session cookie, which page navigations trigger — API
|
|
21
|
+
* routes don't need it. This is Next's officially recommended matcher shape.
|
|
22
|
+
*/
|
|
23
|
+
export declare const polishdMatcher: string[];
|
|
24
|
+
export declare function proxy(request: NextRequest): import("next/server").NextResponse<unknown>;
|
|
25
|
+
export declare const config: {
|
|
26
|
+
matcher: string[];
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Build a configured proxy — use when you need a non-default cookie name (e.g.
|
|
30
|
+
* preserving a legacy `session` cookie across a migration):
|
|
31
|
+
*
|
|
32
|
+
* const { proxy, matcher } = createPolishdProxy({ sessionCookie: "polish_session" });
|
|
33
|
+
* export { proxy };
|
|
34
|
+
* export const config = { matcher };
|
|
35
|
+
*/
|
|
36
|
+
export declare function createPolishdProxy(config?: Partial<PolishdConfig>): {
|
|
37
|
+
proxy: (request: NextRequest) => import("next/server").NextResponse<unknown>;
|
|
38
|
+
matcher: string[];
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=proxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAE/C,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,UAA2D,CAAC;AAEvF,wBAAgB,KAAK,CAAC,OAAO,EAAE,WAAW,+CAEzC;AAED,eAAO,MAAM,MAAM;;CAA8B,CAAC;AAElD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,GAAE,OAAO,CAAC,aAAa,CAAM;qBAEjD,WAAW;;EAG/B"}
|
package/dist/proxy.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { withPolishdSession } from "./session";
|
|
2
|
+
export { withPolishdSession };
|
|
3
|
+
/**
|
|
4
|
+
* The matcher Polishd requires. Excluding ALL of `/api` is load-bearing: under
|
|
5
|
+
* Next 16 + Turbopack, letting the proxy match any `/api/*` route breaks route
|
|
6
|
+
* resolution for the entire `/api` segment (every route 404s). The proxy's only
|
|
7
|
+
* job is setting the session cookie, which page navigations trigger — API
|
|
8
|
+
* routes don't need it. This is Next's officially recommended matcher shape.
|
|
9
|
+
*/
|
|
10
|
+
export const polishdMatcher = ["/((?!api|_next/static|_next/image|favicon|assets).*)"];
|
|
11
|
+
export function proxy(request) {
|
|
12
|
+
return withPolishdSession(request);
|
|
13
|
+
}
|
|
14
|
+
export const config = { matcher: polishdMatcher };
|
|
15
|
+
/**
|
|
16
|
+
* Build a configured proxy — use when you need a non-default cookie name (e.g.
|
|
17
|
+
* preserving a legacy `session` cookie across a migration):
|
|
18
|
+
*
|
|
19
|
+
* const { proxy, matcher } = createPolishdProxy({ sessionCookie: "polish_session" });
|
|
20
|
+
* export { proxy };
|
|
21
|
+
* export const config = { matcher };
|
|
22
|
+
*/
|
|
23
|
+
export function createPolishdProxy(config = {}) {
|
|
24
|
+
return {
|
|
25
|
+
proxy: (request) => withPolishdSession(request, undefined, config),
|
|
26
|
+
matcher: polishdMatcher,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAE/C,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,sDAAsD,CAAC,CAAC;AAEvF,MAAM,UAAU,KAAK,CAAC,OAAoB;IACxC,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;AAElD;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiC,EAAE;IACpE,OAAO;QACL,KAAK,EAAE,CAAC,OAAoB,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC;QAC/E,OAAO,EAAE,cAAc;KACxB,CAAC;AACJ,CAAC"}
|
package/dist/route.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @polishd/next/route — the ingest endpoint.
|
|
3
|
+
*
|
|
4
|
+
* Consumers wire this up with a one-line re-export:
|
|
5
|
+
*
|
|
6
|
+
* // src/app/api/polishd/route.ts
|
|
7
|
+
* export { POST, runtime, dynamic } from "@polishd/next/route";
|
|
8
|
+
*
|
|
9
|
+
* Or build a configured handler with `createPolishdRoute({ sessionCookie })`.
|
|
10
|
+
*/
|
|
11
|
+
import { NextResponse, type NextRequest } from "next/server";
|
|
12
|
+
import { type PolishdConfig } from "./config";
|
|
13
|
+
export declare const runtime = "nodejs";
|
|
14
|
+
export declare const dynamic = "force-dynamic";
|
|
15
|
+
export declare function createPolishdRoute(config?: Partial<PolishdConfig>): (req: NextRequest) => Promise<NextResponse<{
|
|
16
|
+
ok: boolean;
|
|
17
|
+
reason: string;
|
|
18
|
+
}> | NextResponse<import("./server").IngestResult>>;
|
|
19
|
+
/** Default handler — used by the one-line re-export. */
|
|
20
|
+
export declare const POST: (req: NextRequest) => Promise<NextResponse<{
|
|
21
|
+
ok: boolean;
|
|
22
|
+
reason: string;
|
|
23
|
+
}> | NextResponse<import("./server").IngestResult>>;
|
|
24
|
+
//# sourceMappingURL=route.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../src/route.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAE7D,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AAIpE,eAAO,MAAM,OAAO,WAAW,CAAC;AAEhC,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,wBAAgB,kBAAkB,CAAC,MAAM,GAAE,OAAO,CAAC,aAAa,CAAM,IAGzC,KAAK,WAAW;;;oDAe5C;AAED,wDAAwD;AACxD,eAAO,MAAM,IAAI,QAlBiB,WAAW;;;mDAkBL,CAAC"}
|
package/dist/route.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @polishd/next/route — the ingest endpoint.
|
|
3
|
+
*
|
|
4
|
+
* Consumers wire this up with a one-line re-export:
|
|
5
|
+
*
|
|
6
|
+
* // src/app/api/polishd/route.ts
|
|
7
|
+
* export { POST, runtime, dynamic } from "@polishd/next/route";
|
|
8
|
+
*
|
|
9
|
+
* Or build a configured handler with `createPolishdRoute({ sessionCookie })`.
|
|
10
|
+
*/
|
|
11
|
+
import { NextResponse } from "next/server";
|
|
12
|
+
import { defaultPolishdConfig } from "./config";
|
|
13
|
+
import { ingest } from "./server/ingest";
|
|
14
|
+
// node:sqlite / pg need the Node runtime — never the Edge runtime.
|
|
15
|
+
export const runtime = "nodejs";
|
|
16
|
+
// This route mutates per-request; it must never be statically cached.
|
|
17
|
+
export const dynamic = "force-dynamic";
|
|
18
|
+
export function createPolishdRoute(config = {}) {
|
|
19
|
+
const cfg = { ...defaultPolishdConfig, ...config };
|
|
20
|
+
return async function POST(req) {
|
|
21
|
+
let body;
|
|
22
|
+
try {
|
|
23
|
+
body = await req.json();
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return NextResponse.json({ ok: false, reason: "bad_json" }, { status: 400 });
|
|
27
|
+
}
|
|
28
|
+
const cookieValue = req.cookies.get(cfg.sessionCookie)?.value;
|
|
29
|
+
const result = await ingest(body, cookieValue);
|
|
30
|
+
// Always succeed for valid requests so the beacon never retries on the
|
|
31
|
+
// client; real failures (bad payloads) return 4xx above.
|
|
32
|
+
return NextResponse.json(result, { status: result.ok ? 200 : 400 });
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/** Default handler — used by the one-line re-export. */
|
|
36
|
+
export const POST = createPolishdRoute();
|
|
37
|
+
//# sourceMappingURL=route.js.map
|