@polishd/next 0.2.3-dev.3 → 0.2.3-dev.4

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 (50) hide show
  1. package/CHANGELOG.md +39 -23
  2. package/README.md +5 -7
  3. package/bin/init.mjs +1 -4
  4. package/dist/ai/actions.d.ts +7 -1
  5. package/dist/ai/actions.d.ts.map +1 -1
  6. package/dist/ai/actions.js +10 -0
  7. package/dist/ai/actions.js.map +1 -1
  8. package/dist/ai/fix.d.ts +14 -0
  9. package/dist/ai/fix.d.ts.map +1 -0
  10. package/dist/ai/fix.js +254 -0
  11. package/dist/ai/fix.js.map +1 -0
  12. package/dist/ai/issues.d.ts +12 -0
  13. package/dist/ai/issues.d.ts.map +1 -1
  14. package/dist/ai/issues.js +16 -2
  15. package/dist/ai/issues.js.map +1 -1
  16. package/dist/ai/types.d.ts +49 -0
  17. package/dist/ai/types.d.ts.map +1 -1
  18. package/dist/dashboard/index.d.ts.map +1 -1
  19. package/dist/dashboard/index.js +4 -2
  20. package/dist/dashboard/index.js.map +1 -1
  21. package/dist/dashboard/issue-list.d.ts +11 -0
  22. package/dist/dashboard/issue-list.d.ts.map +1 -0
  23. package/dist/dashboard/issue-list.js +159 -0
  24. package/dist/dashboard/issue-list.js.map +1 -0
  25. package/dist/dashboard/issues.d.ts +31 -2
  26. package/dist/dashboard/issues.d.ts.map +1 -1
  27. package/dist/dashboard/issues.js +4 -71
  28. package/dist/dashboard/issues.js.map +1 -1
  29. package/dist/dashboard/markdown-parse.d.ts +87 -0
  30. package/dist/dashboard/markdown-parse.d.ts.map +1 -0
  31. package/dist/dashboard/markdown-parse.js +244 -0
  32. package/dist/dashboard/markdown-parse.js.map +1 -0
  33. package/dist/dashboard/markdown.d.ts +5 -0
  34. package/dist/dashboard/markdown.d.ts.map +1 -0
  35. package/dist/dashboard/markdown.js +65 -0
  36. package/dist/dashboard/markdown.js.map +1 -0
  37. package/dist/dashboard/snapshot-actions.d.ts +5 -15
  38. package/dist/dashboard/snapshot-actions.d.ts.map +1 -1
  39. package/dist/dashboard/snapshot-actions.js +24 -64
  40. package/dist/dashboard/snapshot-actions.js.map +1 -1
  41. package/dist/dashboard/snapshots.d.ts.map +1 -1
  42. package/dist/dashboard/snapshots.js +8 -58
  43. package/dist/dashboard/snapshots.js.map +1 -1
  44. package/dist/dashboard.css +70 -18
  45. package/dist/server/snapshots.d.ts +6 -37
  46. package/dist/server/snapshots.d.ts.map +1 -1
  47. package/dist/server/snapshots.js +144 -271
  48. package/dist/server/snapshots.js.map +1 -1
  49. package/docs/SETUP.md +0 -10
  50. package/package.json +1 -1
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Polishd — a small GitHub-flavored-markdown parser (pure, no dependencies).
3
+ *
4
+ * The Issues tab shows issue bodies that are real markdown: polishd writes
5
+ * them (`issueBody` in `src/ai/issues.ts` emits headings, bold, code, link
6
+ * lists, blockquotes) and humans edit them on GitHub afterwards. Rendering
7
+ * that as a raw `<pre>` wastes the structure — but the package's rule is zero
8
+ * runtime dependencies, so `react-markdown` and friends are off the table.
9
+ *
10
+ * This module is the answer: a bounded, hand-written parser for the subset of
11
+ * GFM that actually appears in issues — headings, paragraphs, fenced code,
12
+ * blockquotes, ordered/unordered/task lists (nested), tables, rules, and the
13
+ * inline set (bold, italic, strikethrough, code, links, images, autolinks).
14
+ * One GitHub-ism matters: inside a paragraph a single newline is a hard
15
+ * break, the way issue comments render. Anything the parser doesn't
16
+ * recognize degrades to plain paragraph text — never a crash, never dropped
17
+ * content.
18
+ *
19
+ * Parsing is kept apart from rendering (`markdown.tsx`) so the grammar can be
20
+ * pinned down by plain node:test files with no React in sight.
21
+ */
22
+ export type MdInline = {
23
+ kind: "text";
24
+ text: string;
25
+ } | {
26
+ kind: "break";
27
+ } | {
28
+ kind: "code";
29
+ text: string;
30
+ } | {
31
+ kind: "strong";
32
+ children: MdInline[];
33
+ } | {
34
+ kind: "em";
35
+ children: MdInline[];
36
+ } | {
37
+ kind: "del";
38
+ children: MdInline[];
39
+ } | {
40
+ kind: "link";
41
+ href: string;
42
+ children: MdInline[];
43
+ } | {
44
+ kind: "image";
45
+ alt: string;
46
+ src: string;
47
+ };
48
+ export interface MdListItem {
49
+ /** Set only on task-list items: `- [x]` / `- [ ]`. */
50
+ checked?: boolean;
51
+ children: MdInline[];
52
+ /** A nested list, when the item has deeper-indented list lines under it. */
53
+ sub?: MdList;
54
+ }
55
+ export interface MdList {
56
+ ordered: boolean;
57
+ items: MdListItem[];
58
+ }
59
+ export type MdBlock = {
60
+ kind: "heading";
61
+ level: number;
62
+ children: MdInline[];
63
+ } | {
64
+ kind: "paragraph";
65
+ children: MdInline[];
66
+ } | {
67
+ kind: "codeBlock";
68
+ lang: string;
69
+ text: string;
70
+ } | {
71
+ kind: "quote";
72
+ children: MdBlock[];
73
+ } | {
74
+ kind: "list";
75
+ list: MdList;
76
+ } | {
77
+ kind: "rule";
78
+ } | {
79
+ kind: "table";
80
+ header: MdInline[][];
81
+ rows: MdInline[][][];
82
+ };
83
+ /** Parse one run of inline markdown into a token list. */
84
+ export declare function parseInline(text: string): MdInline[];
85
+ /** Parse a whole markdown document into blocks. */
86
+ export declare function parseMarkdown(md: string): MdBlock[];
87
+ //# sourceMappingURL=markdown-parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-parse.d.ts","sourceRoot":"","sources":["../../src/dashboard/markdown-parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,MAAM,MAAM,QAAQ,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,QAAQ,EAAE,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,QAAQ,EAAE,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,QAAQ,EAAE,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,QAAQ,EAAE,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhD,MAAM,WAAW,UAAU;IACzB,sDAAsD;IACtD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,4EAA4E;IAC5E,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED,MAAM,MAAM,OAAO,GACf;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,QAAQ,EAAE,CAAA;CAAE,GACxD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,QAAQ,EAAE,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,EAAE,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC;IAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;CAAE,CAAC;AAmDlE,0DAA0D;AAC1D,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,CAoBpD;AAgED,mDAAmD;AACnD,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,EAAE,CAyGnD"}
@@ -0,0 +1,244 @@
1
+ /**
2
+ * Polishd — a small GitHub-flavored-markdown parser (pure, no dependencies).
3
+ *
4
+ * The Issues tab shows issue bodies that are real markdown: polishd writes
5
+ * them (`issueBody` in `src/ai/issues.ts` emits headings, bold, code, link
6
+ * lists, blockquotes) and humans edit them on GitHub afterwards. Rendering
7
+ * that as a raw `<pre>` wastes the structure — but the package's rule is zero
8
+ * runtime dependencies, so `react-markdown` and friends are off the table.
9
+ *
10
+ * This module is the answer: a bounded, hand-written parser for the subset of
11
+ * GFM that actually appears in issues — headings, paragraphs, fenced code,
12
+ * blockquotes, ordered/unordered/task lists (nested), tables, rules, and the
13
+ * inline set (bold, italic, strikethrough, code, links, images, autolinks).
14
+ * One GitHub-ism matters: inside a paragraph a single newline is a hard
15
+ * break, the way issue comments render. Anything the parser doesn't
16
+ * recognize degrades to plain paragraph text — never a crash, never dropped
17
+ * content.
18
+ *
19
+ * Parsing is kept apart from rendering (`markdown.tsx`) so the grammar can be
20
+ * pinned down by plain node:test files with no React in sight.
21
+ */
22
+ /**
23
+ * Ordered by precedence for ties at the same index: code spans protect their
24
+ * contents from everything else, images must beat links (shared `[` syntax),
25
+ * and `**strong**` must beat `*em*`.
26
+ */
27
+ const INLINE_RULES = [
28
+ { re: /`([^`\n]+)`/, make: (m) => ({ kind: "code", text: m[1] }) },
29
+ {
30
+ re: /!\[([^\]]*)\]\(([^)\s]+)(?:\s+"[^"]*")?\)/,
31
+ make: (m) => ({ kind: "image", alt: m[1], src: m[2] }),
32
+ },
33
+ {
34
+ re: /\[([^\]]+)\]\(([^)\s]+)(?:\s+"[^"]*")?\)/,
35
+ make: (m) => ({ kind: "link", href: m[2], children: parseInline(m[1]) }),
36
+ },
37
+ {
38
+ re: /\*\*((?:[^*\n]|\*(?!\*))+)\*\*/,
39
+ make: (m) => ({ kind: "strong", children: parseInline(m[1]) }),
40
+ },
41
+ {
42
+ re: /__((?:[^_\n]|_(?!_))+)__/,
43
+ make: (m) => ({ kind: "strong", children: parseInline(m[1]) }),
44
+ },
45
+ { re: /\*([^*\n]+)\*/, make: (m) => ({ kind: "em", children: parseInline(m[1]) }) },
46
+ {
47
+ re: /(?<![A-Za-z0-9_])_([^_\n]+)_(?![A-Za-z0-9_])/,
48
+ make: (m) => ({ kind: "em", children: parseInline(m[1]) }),
49
+ },
50
+ { re: /~~([^~\n]+)~~/, make: (m) => ({ kind: "del", children: parseInline(m[1]) }) },
51
+ {
52
+ re: /https?:\/\/[^\s<>]*[^\s<>.,;:!?)'"`]/,
53
+ make: (m) => ({ kind: "link", href: m[0], children: [{ kind: "text", text: m[0] }] }),
54
+ },
55
+ ];
56
+ /** Plain text, with each newline becoming a hard break (GitHub issue style). */
57
+ function pushText(out, text) {
58
+ if (!text)
59
+ return;
60
+ const parts = text.split("\n");
61
+ parts.forEach((part, i) => {
62
+ if (i > 0)
63
+ out.push({ kind: "break" });
64
+ if (part)
65
+ out.push({ kind: "text", text: part });
66
+ });
67
+ }
68
+ /** Parse one run of inline markdown into a token list. */
69
+ export function parseInline(text) {
70
+ const out = [];
71
+ let rest = text;
72
+ while (rest.length > 0) {
73
+ let best = null;
74
+ for (const rule of INLINE_RULES) {
75
+ const m = rule.re.exec(rest);
76
+ if (m && (best === null || m.index < best.index)) {
77
+ best = { index: m.index, length: m[0].length, node: rule.make(m) };
78
+ }
79
+ }
80
+ if (!best) {
81
+ pushText(out, rest);
82
+ break;
83
+ }
84
+ pushText(out, rest.slice(0, best.index));
85
+ out.push(best.node);
86
+ rest = rest.slice(best.index + best.length);
87
+ }
88
+ return out;
89
+ }
90
+ // ── Block parsing ────────────────────────────────────────────────────────────
91
+ const HEADING_RE = /^(#{1,6})\s+(.*?)\s*#*\s*$/;
92
+ const RULE_RE = /^ {0,3}(?:-{3,}|\*{3,}|_{3,})\s*$/;
93
+ const FENCE_RE = /^ {0,3}(```|~~~)\s*(\S*)\s*$/;
94
+ const QUOTE_RE = /^ {0,3}>\s?(.*)$/;
95
+ const LIST_RE = /^(\s*)(?:([-*+])|(\d{1,9})[.)])\s+(.*)$/;
96
+ /** The `| --- | :--: |` row that promotes the line above it to a table header. */
97
+ const TABLE_SEP_RE = /^\s*\|?[\s:|-]*-[\s:|-]*\|?\s*$/;
98
+ function isBlank(line) {
99
+ return line.trim().length === 0;
100
+ }
101
+ /** Does this line begin a block of its own, ending any open paragraph? */
102
+ function startsBlock(line) {
103
+ return (HEADING_RE.test(line) ||
104
+ RULE_RE.test(line) ||
105
+ FENCE_RE.test(line) ||
106
+ QUOTE_RE.test(line) ||
107
+ LIST_RE.test(line));
108
+ }
109
+ /** `| a | b |` → ["a", "b"]. Outer pipes optional, cells trimmed. */
110
+ function splitCells(line) {
111
+ let t = line.trim();
112
+ if (t.startsWith("|"))
113
+ t = t.slice(1);
114
+ if (t.endsWith("|"))
115
+ t = t.slice(0, -1);
116
+ return t.split("|").map((c) => c.trim());
117
+ }
118
+ /** Fold rows into (possibly nested) items — deeper indent means a sublist. */
119
+ function buildList(rows, pos, level) {
120
+ const ordered = rows[pos.i].ordered;
121
+ const items = [];
122
+ while (pos.i < rows.length) {
123
+ const row = rows[pos.i];
124
+ if (row.indent < level)
125
+ break;
126
+ if (row.indent > level) {
127
+ const sub = buildList(rows, pos, row.indent);
128
+ if (items.length > 0)
129
+ items[items.length - 1].sub = sub;
130
+ else
131
+ items.push({ children: [], sub });
132
+ continue;
133
+ }
134
+ pos.i += 1;
135
+ let text = row.text;
136
+ let checked;
137
+ const task = text.match(/^\[([ xX])\]\s+(.*)$/);
138
+ if (task) {
139
+ checked = task[1] !== " ";
140
+ text = task[2];
141
+ }
142
+ items.push({ checked, children: parseInline(text) });
143
+ }
144
+ return { ordered, items };
145
+ }
146
+ /** Parse a whole markdown document into blocks. */
147
+ export function parseMarkdown(md) {
148
+ const lines = md.replace(/\r\n?/g, "\n").split("\n");
149
+ const blocks = [];
150
+ let i = 0;
151
+ while (i < lines.length) {
152
+ const line = lines[i];
153
+ if (isBlank(line)) {
154
+ i += 1;
155
+ continue;
156
+ }
157
+ // Fenced code — verbatim until the closing fence (or the end of input).
158
+ const fence = line.match(FENCE_RE);
159
+ if (fence) {
160
+ const marker = fence[1];
161
+ const body = [];
162
+ i += 1;
163
+ while (i < lines.length && !lines[i].trim().startsWith(marker)) {
164
+ body.push(lines[i]);
165
+ i += 1;
166
+ }
167
+ i += 1; // past the closing fence, harmless at end of input
168
+ blocks.push({ kind: "codeBlock", lang: fence[2], text: body.join("\n") });
169
+ continue;
170
+ }
171
+ const heading = line.match(HEADING_RE);
172
+ if (heading) {
173
+ blocks.push({
174
+ kind: "heading",
175
+ level: heading[1].length,
176
+ children: parseInline(heading[2]),
177
+ });
178
+ i += 1;
179
+ continue;
180
+ }
181
+ if (RULE_RE.test(line)) {
182
+ blocks.push({ kind: "rule" });
183
+ i += 1;
184
+ continue;
185
+ }
186
+ // Blockquote — strip the markers and parse the inside as its own document.
187
+ if (QUOTE_RE.test(line)) {
188
+ const inner = [];
189
+ while (i < lines.length && QUOTE_RE.test(lines[i])) {
190
+ inner.push(lines[i].match(QUOTE_RE)[1]);
191
+ i += 1;
192
+ }
193
+ blocks.push({ kind: "quote", children: parseMarkdown(inner.join("\n")) });
194
+ continue;
195
+ }
196
+ // Table — a pipe row whose next line is the `---|---` separator.
197
+ if (line.includes("|") && i + 1 < lines.length && TABLE_SEP_RE.test(lines[i + 1]) && lines[i + 1].includes("|")) {
198
+ const header = splitCells(line).map(parseInline);
199
+ i += 2;
200
+ const rows = [];
201
+ while (i < lines.length && lines[i].includes("|") && !isBlank(lines[i])) {
202
+ rows.push(splitCells(lines[i]).map(parseInline));
203
+ i += 1;
204
+ }
205
+ blocks.push({ kind: "table", header, rows });
206
+ continue;
207
+ }
208
+ // List — collect the run of list lines (plus indented continuations),
209
+ // then fold it into a tree by indent.
210
+ if (LIST_RE.test(line)) {
211
+ const rows = [];
212
+ while (i < lines.length) {
213
+ const m = lines[i].match(LIST_RE);
214
+ if (m) {
215
+ rows.push({ indent: m[1].length, ordered: m[3] !== undefined, text: m[4] });
216
+ i += 1;
217
+ continue;
218
+ }
219
+ // A deeper-indented plain line continues the previous item's text.
220
+ if (rows.length > 0 && /^\s{2,}\S/.test(lines[i])) {
221
+ rows[rows.length - 1].text += `\n${lines[i].trim()}`;
222
+ i += 1;
223
+ continue;
224
+ }
225
+ break;
226
+ }
227
+ blocks.push({ kind: "list", list: buildList(rows, { i: 0 }, rows[0].indent) });
228
+ continue;
229
+ }
230
+ // Paragraph — everything up to a blank line or the start of another block.
231
+ const para = [line];
232
+ i += 1;
233
+ while (i < lines.length && !isBlank(lines[i]) && !startsBlock(lines[i])) {
234
+ // A `---|---` line would turn the next line into a table header, not us.
235
+ if (lines[i].includes("|") && i + 1 < lines.length && TABLE_SEP_RE.test(lines[i + 1]))
236
+ break;
237
+ para.push(lines[i]);
238
+ i += 1;
239
+ }
240
+ blocks.push({ kind: "paragraph", children: parseInline(para.join("\n")) });
241
+ }
242
+ return blocks;
243
+ }
244
+ //# sourceMappingURL=markdown-parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-parse.js","sourceRoot":"","sources":["../../src/dashboard/markdown-parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** GitHub-flavored markdown → dashboard-styled elements. */
2
+ export declare function Markdown({ text }: {
3
+ text: string;
4
+ }): import("react").JSX.Element;
5
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/dashboard/markdown.tsx"],"names":[],"mappings":"AA4LA,4DAA4D;AAC5D,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,+BAMlD"}
@@ -0,0 +1,65 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { parseMarkdown, } from "./markdown-parse";
3
+ const codeSpan = "rounded bg-[#1a1a1a] px-1 py-0.5 font-mono text-[0.92em] text-[#ddd]";
4
+ function renderInline(nodes) {
5
+ return nodes.map((node, i) => {
6
+ switch (node.kind) {
7
+ case "text":
8
+ return node.text;
9
+ case "break":
10
+ return _jsx("br", {}, i);
11
+ case "code":
12
+ return (_jsx("code", { className: codeSpan, children: node.text }, i));
13
+ case "strong":
14
+ return (_jsx("strong", { className: "font-semibold text-[#ddd]", children: renderInline(node.children) }, i));
15
+ case "em":
16
+ return _jsx("em", { children: renderInline(node.children) }, i);
17
+ case "del":
18
+ return (_jsx("del", { className: "text-[#777]", children: renderInline(node.children) }, i));
19
+ case "link":
20
+ return (_jsx("a", { href: node.href, target: "_blank", rel: "noreferrer noopener", className: "break-words text-[#8ab4f8] hover:underline", children: renderInline(node.children) }, i));
21
+ case "image":
22
+ return (
23
+ // Plain <img>, not next/image — screenshots live on arbitrary hosts
24
+ // the consumer's image config knows nothing about.
25
+ _jsx("img", { src: node.src, alt: node.alt, loading: "lazy", className: "my-1 max-w-full rounded-md border border-[#2e2e2e]" }, i));
26
+ }
27
+ });
28
+ }
29
+ function List({ list }) {
30
+ const Tag = list.ordered ? "ol" : "ul";
31
+ return (_jsx(Tag, { className: `space-y-1 pl-5 ${list.ordered ? "list-decimal" : "list-disc"} marker:text-[#555]`, children: list.items.map((item, i) => (_jsxs("li", { children: [item.checked !== undefined && (_jsx("span", { "aria-hidden": true, className: `mr-1.5 font-mono ${item.checked ? "text-emerald-500" : "text-[#555]"}`, children: item.checked ? "☑" : "☐" })), renderInline(item.children), item.sub && (_jsx("div", { className: "mt-1", children: _jsx(List, { list: item.sub }) }))] }, i))) }));
32
+ }
33
+ const HEADING_CLS = {
34
+ 1: "text-[15px] font-semibold text-white",
35
+ 2: "text-[14px] font-semibold text-white",
36
+ 3: "text-[13px] font-semibold text-[#ddd]",
37
+ 4: "text-[12px] font-semibold text-[#ddd]",
38
+ 5: "text-[12px] font-medium text-[#ccc]",
39
+ 6: "text-[11px] font-medium uppercase tracking-[0.08em] text-[#888]",
40
+ };
41
+ function renderBlock(block, key) {
42
+ switch (block.kind) {
43
+ case "heading": {
44
+ const Tag = `h${Math.min(block.level + 2, 6)}`;
45
+ return (_jsx(Tag, { className: `pt-1 ${HEADING_CLS[block.level]}`, children: renderInline(block.children) }, key));
46
+ }
47
+ case "paragraph":
48
+ return _jsx("p", { children: renderInline(block.children) }, key);
49
+ case "codeBlock":
50
+ return (_jsx("pre", { className: "overflow-x-auto rounded-md border border-[#2e2e2e] bg-[#111] px-3 py-2.5 font-mono text-[11px] leading-relaxed text-[#aaa]", children: _jsx("code", { children: block.text }) }, key));
51
+ case "quote":
52
+ return (_jsx("blockquote", { className: "space-y-2 border-l-2 border-[#2e2e2e] pl-3 text-[#888]", children: block.children.map(renderBlock) }, key));
53
+ case "list":
54
+ return _jsx(List, { list: block.list }, key);
55
+ case "rule":
56
+ return _jsx("hr", { className: "border-t border-[#2e2e2e]" }, key);
57
+ case "table":
58
+ return (_jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "w-full text-left text-[12px]", children: [_jsx("thead", { children: _jsx("tr", { children: block.header.map((cell, i) => (_jsx("th", { className: "border-b border-[#2e2e2e] py-1.5 pr-4 font-medium text-[#ddd]", children: renderInline(cell) }, i))) }) }), _jsx("tbody", { children: block.rows.map((row, r) => (_jsx("tr", { children: row.map((cell, c) => (_jsx("td", { className: "border-b border-[#1f1f1f] py-1.5 pr-4", children: renderInline(cell) }, c))) }, r))) })] }) }, key));
59
+ }
60
+ }
61
+ /** GitHub-flavored markdown → dashboard-styled elements. */
62
+ export function Markdown({ text }) {
63
+ return (_jsx("div", { className: "space-y-2.5 break-words text-[13px] leading-relaxed text-[#aaa]", children: parseMarkdown(text).map(renderBlock) }));
64
+ }
65
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/dashboard/markdown.tsx"],"names":[],"mappings":"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"}
@@ -1,20 +1,10 @@
1
- import { type BeginSnapshotResult, type CaptureRouteResult, type CaptureSnapshotResult } from "../server/snapshots";
1
+ import { type CaptureSnapshotResult } from "../server/snapshots";
2
2
  /**
3
- * Capture is chunked into one action call per route — begin, then one
4
- * `captureSnapshotRouteAction` per returned route, then finish — so no single
5
- * request has to outlive a serverless host's function time limit. The client
6
- * drives the loop; every per-route call is validated against the plan the
7
- * begin call parked server-side, so the client contributes nothing but ids.
8
- *
9
- * Everything after auth reduces to a message rather than a thrown error: a
10
- * rejected action crashes the dashboard tab into Next's error boundary with
11
- * an opaque digest, while a returned message renders in the card.
3
+ * Shoot the site as it stands: every scanned route (the pages real visitors
4
+ * actually rendered), phone and desktop, light and dark. Long-running — a
5
+ * dozen routes takes on the order of a minute.
12
6
  */
13
- export declare function beginSnapshotCaptureAction(): Promise<BeginSnapshotResult>;
14
- /** Shoot one route of the capture in progress — both devices, both themes. */
15
- export declare function captureSnapshotRouteAction(id: string, route: string): Promise<CaptureRouteResult>;
16
- /** Record the accumulated shots as a snapshot and prune old ones. */
17
- export declare function finishSnapshotCaptureAction(id: string): Promise<CaptureSnapshotResult>;
7
+ export declare function captureSnapshotAction(): Promise<CaptureSnapshotResult>;
18
8
  export type SnapshotImageResult = {
19
9
  ok: true;
20
10
  dataUrl: string;
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot-actions.d.ts","sourceRoot":"","sources":["../../src/dashboard/snapshot-actions.ts"],"names":[],"mappings":"AAuBA,OAAO,EAML,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC3B,MAAM,qBAAqB,CAAC;AAoB7B;;;;;;;;;;GAUG;AACH,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,mBAAmB,CAAC,CA0C/E;AAED,8EAA8E;AAC9E,wBAAsB,0BAA0B,CAC9C,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,kBAAkB,CAAC,CAY7B;AAED,qEAAqE;AACrE,wBAAsB,2BAA2B,CAC/C,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,qBAAqB,CAAC,CAYhC;AAED,MAAM,MAAM,mBAAmB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAA;CAAE,CAAC;AAEhF,8EAA8E;AAC9E,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,mBAAmB,CAAC,CAI9B"}
1
+ {"version":3,"file":"snapshot-actions.d.ts","sourceRoot":"","sources":["../../src/dashboard/snapshot-actions.ts"],"names":[],"mappings":"AAuBA,OAAO,EAIL,KAAK,qBAAqB,EAC3B,MAAM,qBAAqB,CAAC;AAoB7B;;;;GAIG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,qBAAqB,CAAC,CA+B5E;AAED,MAAM,MAAM,mBAAmB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAA;CAAE,CAAC;AAEhF,8EAA8E;AAC9E,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,mBAAmB,CAAC,CAI9B"}
@@ -19,7 +19,7 @@ import { requirePolishdAuth } from "../ai/guard";
19
19
  import { resolveSettings } from "../ai/settings";
20
20
  import { isDashboardPath, resolveDashboardRoute } from "../config";
21
21
  import { getDesignData } from "../server/design";
22
- import { MAX_SNAPSHOT_ROUTES, beginSnapshot, captureSnapshotRoute, finishSnapshot, readSnapshotImage, } from "../server/snapshots";
22
+ import { MAX_SNAPSHOT_ROUTES, captureSnapshot, readSnapshotImage, } from "../server/snapshots";
23
23
  /**
24
24
  * The origin to shoot. `POLISHD_SITE_ORIGIN` wins when set (proxies, tunnels,
25
25
  * a prod URL shot from a dev machine); otherwise the origin the dashboard was
@@ -39,76 +39,36 @@ async function resolveSiteOrigin() {
39
39
  return `${proto}://${host}`;
40
40
  }
41
41
  /**
42
- * Capture is chunked into one action call per route — begin, then one
43
- * `captureSnapshotRouteAction` per returned route, then finish — so no single
44
- * request has to outlive a serverless host's function time limit. The client
45
- * drives the loop; every per-route call is validated against the plan the
46
- * begin call parked server-side, so the client contributes nothing but ids.
47
- *
48
- * Everything after auth reduces to a message rather than a thrown error: a
49
- * rejected action crashes the dashboard tab into Next's error boundary with
50
- * an opaque digest, while a returned message renders in the card.
42
+ * Shoot the site as it stands: every scanned route (the pages real visitors
43
+ * actually rendered), phone and desktop, light and dark. Long-running — a
44
+ * dozen routes takes on the order of a minute.
51
45
  */
52
- export async function beginSnapshotCaptureAction() {
46
+ export async function captureSnapshotAction() {
53
47
  await requirePolishdAuth();
54
- try {
55
- const origin = await resolveSiteOrigin();
56
- if (!origin) {
57
- return {
58
- ok: false,
59
- message: "Couldn't work out the site's URL from the request — set POLISHD_SITE_ORIGIN " +
60
- "to the origin the site is reachable at.",
61
- };
62
- }
63
- const data = await getDesignData();
64
- const dashboardRoute = resolveDashboardRoute();
65
- // Shoot what visitors have actually rendered, never the dashboard itself
66
- // (nor the telemetry pseudo-paths the collector namespaces under /~polishd).
67
- const scanned = data.pages
68
- .map((p) => p.path)
69
- .filter((p) => p.startsWith("/") && !p.startsWith("/~") && !isDashboardPath(p, dashboardRoute));
70
- const routes = (scanned.length > 0 ? scanned : ["/"]).slice(0, MAX_SNAPSHOT_ROUTES);
71
- // Stamp the snapshot with the same metrics fingerprint the AI review caches
72
- // under, so "taken before/after this round of changes" is a hash comparison.
73
- let fingerprint = null;
74
- if (data.ready && data.pages.length > 0) {
75
- const { settings } = await resolveSettings();
76
- fingerprint = fingerprintDigest(buildDesignDigest(data, settings.context));
77
- }
78
- return await beginSnapshot({ origin, routes, fingerprint });
79
- }
80
- catch (err) {
48
+ const origin = await resolveSiteOrigin();
49
+ if (!origin) {
81
50
  return {
82
51
  ok: false,
83
- message: `Snapshot capture failed unexpectedly: ${err instanceof Error ? err.message : "unknown error"}`,
52
+ message: "Couldn't work out the site's URL from the request — set POLISHD_SITE_ORIGIN " +
53
+ "to the origin the site is reachable at.",
84
54
  };
85
55
  }
86
- }
87
- /** Shoot one route of the capture in progress — both devices, both themes. */
88
- export async function captureSnapshotRouteAction(id, route) {
89
- await requirePolishdAuth();
90
- try {
91
- return await captureSnapshotRoute(id, route);
92
- }
93
- catch (err) {
94
- return {
95
- ok: false,
96
- message: `Screenshot capture failed unexpectedly: ${err instanceof Error ? err.message : "unknown error"}`,
97
- };
98
- }
99
- }
100
- /** Record the accumulated shots as a snapshot and prune old ones. */
101
- export async function finishSnapshotCaptureAction(id) {
102
- await requirePolishdAuth();
103
- try {
104
- return await finishSnapshot(id);
105
- }
106
- catch (err) {
107
- return {
108
- ok: false,
109
- message: `The snapshot couldn't be recorded: ${err instanceof Error ? err.message : "unknown error"}`,
110
- };
56
+ const data = await getDesignData();
57
+ const dashboardRoute = resolveDashboardRoute();
58
+ // Shoot what visitors have actually rendered, never the dashboard itself
59
+ // (nor the telemetry pseudo-paths the collector namespaces under /~polishd).
60
+ const scanned = data.pages
61
+ .map((p) => p.path)
62
+ .filter((p) => p.startsWith("/") && !p.startsWith("/~") && !isDashboardPath(p, dashboardRoute));
63
+ const routes = (scanned.length > 0 ? scanned : ["/"]).slice(0, MAX_SNAPSHOT_ROUTES);
64
+ // Stamp the snapshot with the same metrics fingerprint the AI review caches
65
+ // under, so "taken before/after this round of changes" is a hash comparison.
66
+ let fingerprint = null;
67
+ if (data.ready && data.pages.length > 0) {
68
+ const { settings } = await resolveSettings();
69
+ fingerprint = fingerprintDigest(buildDesignDigest(data, settings.context));
111
70
  }
71
+ return captureSnapshot({ origin, routes, fingerprint });
112
72
  }
113
73
  /** One shot's PNG as a data URL — fetched lazily as tiles scroll into use. */
114
74
  export async function getSnapshotImageAction(snapshotId, file) {
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot-actions.js","sourceRoot":"","sources":["../../src/dashboard/snapshot-actions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"snapshot-actions.js","sourceRoot":"","sources":["../../src/dashboard/snapshot-actions.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"snapshots.d.ts","sourceRoot":"","sources":["../../src/dashboard/snapshots.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,eAAe,EAAuB,MAAM,qBAAqB,CAAC;AAwGhF,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B;;;;;OAKG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,kBAAkB,+BA2PlF"}
1
+ {"version":3,"file":"snapshots.d.ts","sourceRoot":"","sources":["../../src/dashboard/snapshots.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,eAAe,EAAuB,MAAM,qBAAqB,CAAC;AAmGhF,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B;;;;;OAKG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,kBAAkB,+BAsMlF"}