@polishd/next 0.2.3-dev.5 → 0.2.3-dev.6

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 (84) hide show
  1. package/CHANGELOG.md +79 -14
  2. package/README.md +5 -0
  3. package/dist/ai/actions.d.ts +13 -1
  4. package/dist/ai/actions.d.ts.map +1 -1
  5. package/dist/ai/actions.js +20 -1
  6. package/dist/ai/actions.js.map +1 -1
  7. package/dist/ai/design.d.ts +5 -1
  8. package/dist/ai/design.d.ts.map +1 -1
  9. package/dist/ai/design.js +21 -4
  10. package/dist/ai/design.js.map +1 -1
  11. package/dist/ai/fix.d.ts +14 -0
  12. package/dist/ai/fix.d.ts.map +1 -0
  13. package/dist/ai/fix.js +254 -0
  14. package/dist/ai/fix.js.map +1 -0
  15. package/dist/ai/guard.d.ts.map +1 -1
  16. package/dist/ai/guard.js +8 -32
  17. package/dist/ai/guard.js.map +1 -1
  18. package/dist/ai/issues.d.ts +29 -6
  19. package/dist/ai/issues.d.ts.map +1 -1
  20. package/dist/ai/issues.js +113 -40
  21. package/dist/ai/issues.js.map +1 -1
  22. package/dist/ai/types.d.ts +52 -0
  23. package/dist/ai/types.d.ts.map +1 -1
  24. package/dist/dashboard/design-review-card.d.ts +3 -1
  25. package/dist/dashboard/design-review-card.d.ts.map +1 -1
  26. package/dist/dashboard/design-review-card.js +14 -6
  27. package/dist/dashboard/design-review-card.js.map +1 -1
  28. package/dist/dashboard/design.d.ts.map +1 -1
  29. package/dist/dashboard/design.js +75 -17
  30. package/dist/dashboard/design.js.map +1 -1
  31. package/dist/dashboard/file-bug-button.d.ts +14 -0
  32. package/dist/dashboard/file-bug-button.d.ts.map +1 -0
  33. package/dist/dashboard/file-bug-button.js +37 -0
  34. package/dist/dashboard/file-bug-button.js.map +1 -0
  35. package/dist/dashboard/index.d.ts.map +1 -1
  36. package/dist/dashboard/index.js +4 -2
  37. package/dist/dashboard/index.js.map +1 -1
  38. package/dist/dashboard/issue-list.d.ts +11 -0
  39. package/dist/dashboard/issue-list.d.ts.map +1 -0
  40. package/dist/dashboard/issue-list.js +159 -0
  41. package/dist/dashboard/issue-list.js.map +1 -0
  42. package/dist/dashboard/issues.d.ts +31 -2
  43. package/dist/dashboard/issues.d.ts.map +1 -1
  44. package/dist/dashboard/issues.js +4 -71
  45. package/dist/dashboard/issues.js.map +1 -1
  46. package/dist/dashboard/markdown-parse.d.ts +87 -0
  47. package/dist/dashboard/markdown-parse.d.ts.map +1 -0
  48. package/dist/dashboard/markdown-parse.js +244 -0
  49. package/dist/dashboard/markdown-parse.js.map +1 -0
  50. package/dist/dashboard/markdown.d.ts +5 -0
  51. package/dist/dashboard/markdown.d.ts.map +1 -0
  52. package/dist/dashboard/markdown.js +65 -0
  53. package/dist/dashboard/markdown.js.map +1 -0
  54. package/dist/dashboard/snapshot-actions.d.ts.map +1 -1
  55. package/dist/dashboard/snapshot-actions.js +22 -54
  56. package/dist/dashboard/snapshot-actions.js.map +1 -1
  57. package/dist/dashboard/snapshots.d.ts.map +1 -1
  58. package/dist/dashboard/snapshots.js +7 -20
  59. package/dist/dashboard/snapshots.js.map +1 -1
  60. package/dist/dashboard/summary.d.ts.map +1 -1
  61. package/dist/dashboard/summary.js +8 -36
  62. package/dist/dashboard/summary.js.map +1 -1
  63. package/dist/dashboard/ui.d.ts +1 -0
  64. package/dist/dashboard/ui.d.ts.map +1 -1
  65. package/dist/dashboard/ui.js +1 -0
  66. package/dist/dashboard/ui.js.map +1 -1
  67. package/dist/dashboard/value-preview.d.ts +47 -0
  68. package/dist/dashboard/value-preview.d.ts.map +1 -0
  69. package/dist/dashboard/value-preview.js +138 -0
  70. package/dist/dashboard/value-preview.js.map +1 -0
  71. package/dist/dashboard.css +234 -62
  72. package/dist/server/snapshots.d.ts +32 -4
  73. package/dist/server/snapshots.d.ts.map +1 -1
  74. package/dist/server/snapshots.js +146 -24
  75. package/dist/server/snapshots.js.map +1 -1
  76. package/dist/server/value-previews.d.ts +47 -0
  77. package/dist/server/value-previews.d.ts.map +1 -0
  78. package/dist/server/value-previews.js +313 -0
  79. package/dist/server/value-previews.js.map +1 -0
  80. package/dist/shared/design-values.d.ts +71 -0
  81. package/dist/shared/design-values.d.ts.map +1 -0
  82. package/dist/shared/design-values.js +98 -0
  83. package/dist/shared/design-values.js.map +1 -0
  84. package/package.json +1 -1
@@ -0,0 +1,159 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ /**
4
+ * Polishd — the filed-issue list and its right-side drawer (client).
5
+ *
6
+ * The Issues tab's rows live here so a click can do something: each row opens
7
+ * a drawer with the full issue — the body rendered as the markdown it is
8
+ * (see `markdown.tsx`), not the raw text — plus the metadata GitHub reports
9
+ * and the analytics context polishd kept. Same drawer pattern as the sampled
10
+ * user journeys: the dashboard stays in view while you drill into one issue.
11
+ *
12
+ * The drawer also carries the "Suggest a fix" panel. With the GitHub codebase
13
+ * connected, one click asks the configured model to classify the bug — an
14
+ * interaction issue or a design issue — and propose a fix grounded in the
15
+ * repository's source and in published practice (NN/g heuristics, the ARIA
16
+ * Authoring Practices, WCAG 2.2), with the file-by-file implementation path.
17
+ * Suggestions arrive pre-loaded from the server cache; generating a new one
18
+ * goes through `suggestIssueFixAction`.
19
+ */
20
+ import { useEffect, useState, useTransition } from "react";
21
+ import { suggestIssueFixAction } from "../ai/actions";
22
+ import { Markdown } from "./markdown";
23
+ import { border, divider, labelCls as label, SpinnerIcon } from "./ui";
24
+ // ── Formatting helpers ────────────────────────────────────────────────────────
25
+ /** "3 Aug", or "3 Aug 2024" once it's from another year. */
26
+ function shortDate(ms) {
27
+ const d = new Date(ms);
28
+ const sameYear = d.getFullYear() === new Date().getFullYear();
29
+ return d.toLocaleDateString("en-GB", {
30
+ day: "numeric",
31
+ month: "short",
32
+ ...(sameYear ? {} : { year: "numeric" }),
33
+ });
34
+ }
35
+ /** Coarse relative age — "2d ago" — for the meta line. */
36
+ function timeAgo(ms) {
37
+ const delta = Date.now() - ms;
38
+ if (delta < 60_000)
39
+ return "just now";
40
+ const mins = Math.floor(delta / 60_000);
41
+ if (mins < 60)
42
+ return `${mins}m ago`;
43
+ const hours = Math.floor(mins / 60);
44
+ if (hours < 24)
45
+ return `${hours}h ago`;
46
+ const days = Math.floor(hours / 24);
47
+ if (days < 30)
48
+ return `${days}d ago`;
49
+ return shortDate(ms);
50
+ }
51
+ /** Open / closed / unreadable — the one thing you look for per row. */
52
+ function StatePill({ detail }) {
53
+ if (!detail) {
54
+ return (_jsx("span", { className: "shrink-0 rounded-full bg-[#1a1a1a] px-2 py-0.5 text-[10px] font-medium text-[#666]", children: "\u25CB unreadable" }));
55
+ }
56
+ if (detail.state === "open") {
57
+ return (_jsx("span", { className: "shrink-0 rounded-full bg-emerald-950 px-2 py-0.5 text-[10px] font-medium text-emerald-400", children: "\u25CF open" }));
58
+ }
59
+ const notPlanned = detail.stateReason === "not_planned";
60
+ return (_jsx("span", { className: `shrink-0 rounded-full px-2 py-0.5 text-[10px] font-medium ${notPlanned ? "bg-[#1a1a1a] text-[#888]" : "bg-[#1e132b] text-[#b083f0]"}`, children: notPlanned ? "✕ not planned" : "✓ closed" }));
61
+ }
62
+ function Chip({ children, tone = "text-[#888]" }) {
63
+ return (_jsx("span", { className: `max-w-full break-all rounded border border-[#2e2e2e] px-1.5 py-0.5 text-[10px] font-medium ${tone}`, children: children }));
64
+ }
65
+ /** Which class of bug the fix suggestion decided this is. */
66
+ function BugTypeChip({ type }) {
67
+ return type === "interaction" ? (_jsx("span", { className: "shrink-0 rounded-full bg-blue-950 px-2 py-0.5 text-[10px] font-medium text-blue-400", children: "interaction issue" })) : (_jsx("span", { className: "shrink-0 rounded-full bg-purple-950 px-2 py-0.5 text-[10px] font-medium text-purple-300", children: "design issue" }));
68
+ }
69
+ /** The dot-separated facts under a row's title, in the order they matter. */
70
+ function metaLine(issue) {
71
+ const { detail } = issue;
72
+ const opened = detail?.createdAt ?? issue.filedAt;
73
+ const bits = [];
74
+ if (opened)
75
+ bits.push(`opened ${timeAgo(opened)}`);
76
+ if (detail?.author)
77
+ bits.push(`by ${detail.author}`);
78
+ if (detail?.closedAt)
79
+ bits.push(`closed ${timeAgo(detail.closedAt)}`);
80
+ // An "updated" that is really just the moment it was filed says nothing.
81
+ else if (detail && detail.updatedAt > (opened ?? 0) + 60_000) {
82
+ bits.push(`updated ${timeAgo(detail.updatedAt)}`);
83
+ }
84
+ if (detail && detail.comments > 0) {
85
+ bits.push(`${detail.comments} ${detail.comments === 1 ? "comment" : "comments"}`);
86
+ }
87
+ if (detail && detail.assignees.length > 0) {
88
+ bits.push(`assigned to ${detail.assignees.join(", ")}`);
89
+ }
90
+ return bits.join(" · ");
91
+ }
92
+ // ── One clickable row ─────────────────────────────────────────────────────────
93
+ function IssueRow({ issue, repo, onOpen, }) {
94
+ const { detail } = issue;
95
+ const title = detail?.title ?? issue.claim ?? `Issue #${issue.number}`;
96
+ return (_jsxs("div", { role: "button", tabIndex: 0, "data-component": "issue-open", onClick: onOpen, onKeyDown: (e) => {
97
+ if (e.key === "Enter" || e.key === " ") {
98
+ e.preventDefault();
99
+ onOpen();
100
+ }
101
+ }, className: `group cursor-pointer px-4 py-4 transition-colors hover:bg-[#111] sm:px-5 ${divider} first:border-t-0`, children: [_jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("a", { href: issue.url, target: "_blank", rel: "noreferrer noopener", onClick: (e) => e.stopPropagation(), className: "text-[14px] font-medium leading-snug text-white hover:text-[#8ab4f8]", children: [_jsxs("span", { className: "mr-1.5 font-mono text-[12px] tabular-nums text-[#666]", children: ["#", issue.number] }), title] }), _jsx("p", { className: "mt-1.5 text-[11px] leading-snug text-[#666]", children: metaLine(issue) })] }), _jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [_jsx(StatePill, { detail: detail }), _jsx("span", { className: "text-[#555] transition-colors group-hover:text-[#999]", children: "\u203A" })] })] }), _jsxs("div", { className: "mt-2.5 flex flex-wrap items-center gap-1.5", children: [_jsxs(Chip, { tone: "text-[#aaa]", children: [_jsx("span", { className: "text-[#666]", children: "evidence" }), " ", _jsx("span", { className: "font-mono", children: issue.evidence })] }), issue.verdict === "confirmed" && (_jsx(Chip, { tone: "text-emerald-500", children: "verified against source" })), issue.verdict === "inconclusive" && (_jsx(Chip, { tone: "text-[#f5a623]", children: "filed unverified" })), (detail?.labels ?? []).map((l) => (_jsx(Chip, { children: l }, l)))] }), !detail && (_jsxs("p", { className: "mt-2.5 text-[12px] leading-relaxed text-[#777]", children: ["Polishd filed this issue", issue.filedAt ? ` on ${shortDate(issue.filedAt)}` : "", ", but GitHub won't return it now \u2014 it was deleted or transferred, or the access token no longer covers", repo ? ` ${repo}` : " the repository", "."] }))] }));
102
+ }
103
+ // ── The suggest-a-fix panel (inside the drawer) ───────────────────────────────
104
+ function FixPanel({ issueNumber, repo, suggestion, canSuggest, onSuggested, }) {
105
+ const [pending, startTransition] = useTransition();
106
+ const [error, setError] = useState(null);
107
+ const run = (force) => {
108
+ setError(null);
109
+ startTransition(async () => {
110
+ const res = await suggestIssueFixAction(issueNumber, force);
111
+ if (res.ok)
112
+ onSuggested(res.suggestion);
113
+ else
114
+ setError(res.message);
115
+ });
116
+ };
117
+ const fileUrl = (path) => repo ? `https://github.com/${repo}/blob/HEAD/${path}` : undefined;
118
+ return (_jsxs("div", { className: `border-t ${border} px-4 py-4 sm:px-5`, children: [_jsxs("div", { className: "mb-3 flex items-center gap-2", children: [_jsx("div", { className: "text-[10px] uppercase tracking-[0.08em] text-[#666]", children: "Suggested fix" }), suggestion && _jsx(BugTypeChip, { type: suggestion.bugType })] }), suggestion ? (_jsxs(_Fragment, { children: [suggestion.classification && (_jsx("p", { className: "mb-3 text-[12px] leading-relaxed text-[#888]", children: suggestion.classification })), _jsx(Markdown, { text: suggestion.approach }), suggestion.steps.length > 0 && (_jsxs("div", { className: "mt-4", children: [_jsx("div", { className: "mb-2 text-[10px] uppercase tracking-[0.08em] text-[#666]", children: "Implementation path" }), _jsx("ol", { children: suggestion.steps.map((step, i) => (_jsxs("li", { className: "relative flex gap-3", children: [_jsxs("div", { className: "relative flex w-2.5 shrink-0 justify-center", children: [_jsx("span", { className: "z-10 mt-[5px] h-2.5 w-2.5 shrink-0 rounded-full bg-[#555]" }), i < suggestion.steps.length - 1 && (_jsx("span", { className: "absolute top-[5px] h-full w-px bg-[#2e2e2e]" }))] }), _jsxs("div", { className: "min-w-0 flex-1 pb-3", children: [fileUrl(step.path) ? (_jsx("a", { href: fileUrl(step.path), target: "_blank", rel: "noreferrer noopener", className: "break-all font-mono text-[12px] text-[#8ab4f8] hover:underline", children: step.path })) : (_jsx("span", { className: "break-all font-mono text-[12px] text-[#ccc]", children: step.path })), _jsx("p", { className: "mt-0.5 text-[12px] leading-relaxed text-[#aaa]", children: step.change })] })] }, i))) })] })), suggestion.practices.length > 0 && (_jsxs("div", { className: "mt-1 flex flex-wrap items-center gap-1.5", children: [_jsx("span", { className: "text-[10px] text-[#666]", children: "grounded in" }), suggestion.practices.map((p) => (_jsx(Chip, { tone: "text-[#aaa]", children: p }, p)))] })), _jsxs("div", { className: "mt-3 flex items-center gap-2.5", children: [_jsx("button", { type: "button", "data-component": "issue-suggest-fix", onClick: () => run(true), disabled: pending, className: "rounded-md border border-[#2e2e2e] px-2.5 py-1 text-[11px] text-[#888] transition-colors hover:border-[#555] hover:text-white disabled:opacity-50", children: pending ? "Rethinking…" : "Regenerate" }), _jsxs("span", { className: "text-[10px] text-[#555]", children: [suggestion.model, " \u00B7 ", timeAgo(suggestion.generatedAt)] })] })] })) : canSuggest ? (_jsxs(_Fragment, { children: [_jsx("p", { className: "mb-3 text-[12px] leading-relaxed text-[#777]", children: "Ask the configured model to classify this bug \u2014 interaction or design \u2014 and propose a fix grounded in the repository's source, with the files to change." }), _jsxs("button", { type: "button", "data-component": "issue-suggest-fix", onClick: () => run(false), disabled: pending, className: "inline-flex items-center gap-2 rounded-md border border-[#2e2e2e] px-3 py-1.5 text-[12px] text-[#aaa] transition-colors hover:border-[#555] hover:text-white disabled:opacity-50", children: [pending && _jsx(SpinnerIcon, {}), pending ? "Reading the source…" : "Suggest a fix"] })] })) : (_jsx("p", { className: "text-[12px] leading-relaxed text-[#777]", children: "Configure a model API key in the settings and polishd can propose a fix for this issue from your source code." })), error && _jsx("p", { className: "mt-2.5 text-[12px] leading-relaxed text-red-400", children: error })] }));
119
+ }
120
+ // ── Right-side detail drawer ──────────────────────────────────────────────────
121
+ function MetaCell({ label: labelText, value, mono }) {
122
+ return (_jsxs("div", { className: `px-4 py-3 ${border} border-t`, children: [_jsx("div", { className: "text-[10px] uppercase tracking-[0.08em] text-[#666]", children: labelText }), _jsx("div", { className: `mt-1 break-words text-[13px] text-white ${mono ? "font-mono text-[12px]" : ""}`, children: value })] }));
123
+ }
124
+ function IssueDrawer({ issue, repo, suggestion, canSuggest, onClose, onSuggested, }) {
125
+ // Esc to close + lock background scroll while the drawer is open.
126
+ useEffect(() => {
127
+ if (!issue)
128
+ return;
129
+ const onKey = (e) => {
130
+ if (e.key === "Escape")
131
+ onClose();
132
+ };
133
+ document.addEventListener("keydown", onKey);
134
+ const prev = document.body.style.overflow;
135
+ document.body.style.overflow = "hidden";
136
+ return () => {
137
+ document.removeEventListener("keydown", onKey);
138
+ document.body.style.overflow = prev;
139
+ };
140
+ }, [issue, onClose]);
141
+ const open = issue !== null;
142
+ const detail = issue?.detail ?? null;
143
+ return (_jsxs("div", { className: `fixed inset-0 z-50 ${open ? "" : "pointer-events-none"}`, "aria-hidden": !open, children: [_jsx("div", { onClick: onClose, className: `absolute inset-0 bg-black/60 transition-opacity duration-200 ${open ? "opacity-100" : "opacity-0"}` }), _jsx("aside", { role: "dialog", "aria-modal": "true", "aria-label": "Filed issue detail", className: `absolute right-0 top-0 flex h-full w-full max-w-md flex-col border-l ${border} bg-[#0a0a0a] shadow-2xl transition-transform duration-200 ease-out sm:max-w-xl ${open ? "translate-x-0" : "translate-x-full"}`, children: issue && (_jsxs(_Fragment, { children: [_jsxs("div", { className: `flex items-center gap-3 border-b ${border} px-4 py-4 sm:px-5`, children: [_jsxs("span", { className: "font-mono text-[14px] font-semibold text-white", children: ["#", issue.number] }), _jsx(StatePill, { detail: detail }), _jsx("a", { href: issue.url, target: "_blank", rel: "noreferrer noopener", className: "ml-auto whitespace-nowrap text-[11px] text-[#888] transition-colors hover:text-white", children: "GitHub \u2197" }), _jsx("button", { type: "button", "data-component": "issue-close", onClick: onClose, "aria-label": "Close", className: "flex h-7 w-7 items-center justify-center rounded-md border border-[#2e2e2e] text-[#888] transition-colors hover:bg-[#111] hover:text-white", children: "\u2715" })] }), _jsxs("div", { className: "min-h-0 flex-1 overflow-y-auto overscroll-contain", children: [_jsxs("div", { className: "px-4 pt-4 sm:px-5", children: [_jsx("h2", { className: "text-[15px] font-semibold leading-snug text-white", children: detail?.title ?? issue.claim ?? `Issue #${issue.number}` }), issue.claim && issue.claim !== (detail?.title ?? issue.claim) && (_jsxs("p", { className: "mt-2 text-[12px] leading-relaxed text-[#888]", children: [_jsx("span", { className: label, children: "Reported as" }), " ", _jsx("span", { className: "text-[#aaa]", children: issue.claim })] })), (detail?.labels.length ?? 0) > 0 && (_jsx("div", { className: "mt-2.5 flex flex-wrap gap-1.5 pb-1", children: detail?.labels.map((l) => _jsx(Chip, { children: l }, l)) })), _jsx("div", { className: "pb-4" })] }), _jsxs("div", { className: "grid grid-cols-2", children: [_jsx(MetaCell, { label: "Opened", value: detail?.createdAt
144
+ ? shortDate(detail.createdAt)
145
+ : issue.filedAt
146
+ ? shortDate(issue.filedAt)
147
+ : "—" }), _jsx(MetaCell, { label: "Author", value: detail?.author ?? "—" }), _jsx(MetaCell, { label: "Evidence", value: issue.evidence, mono: true }), _jsx(MetaCell, { label: "Verification", value: issue.verdict === "confirmed"
148
+ ? "verified against source"
149
+ : issue.verdict === "inconclusive"
150
+ ? "filed unverified"
151
+ : "—" })] }), _jsxs("div", { className: `border-t ${border} px-4 py-4 sm:px-5`, children: [_jsx("div", { className: "mb-3 text-[10px] uppercase tracking-[0.08em] text-[#666]", children: "Issue body" }), detail ? (detail.body.trim().length > 0 ? (_jsx(Markdown, { text: detail.body })) : (_jsx("p", { className: "text-[12px] italic text-[#555]", children: "This issue has no body." }))) : (_jsxs("p", { className: "text-[12px] leading-relaxed text-[#777]", children: ["GitHub won't return this issue any more \u2014 it was deleted or transferred, or the access token no longer covers", repo ? ` ${repo}` : " the repository", "."] }))] }), _jsx(FixPanel, { issueNumber: issue.number, repo: repo, suggestion: suggestion, canSuggest: canSuggest, onSuggested: onSuggested })] })] })) })] }));
152
+ }
153
+ // ── Exported list + drawer ────────────────────────────────────────────────────
154
+ export default function IssueList({ issues, repo, suggestions: initialSuggestions, canSuggest, }) {
155
+ const [selected, setSelected] = useState(null);
156
+ const [suggestions, setSuggestions] = useState(initialSuggestions);
157
+ return (_jsxs(_Fragment, { children: [issues.map((issue) => (_jsx(IssueRow, { issue: issue, repo: repo, onOpen: () => setSelected(issue) }, issue.evidence))), _jsx(IssueDrawer, { issue: selected, repo: repo, suggestion: selected ? suggestions[selected.number] : undefined, canSuggest: canSuggest, onClose: () => setSelected(null), onSuggested: (s) => setSuggestions((prev) => ({ ...prev, [s.issueNumber]: s })) })] }));
158
+ }
159
+ //# sourceMappingURL=issue-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-list.js","sourceRoot":"","sources":["../../src/dashboard/issue-list.tsx"],"names":[],"mappings":"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"}
@@ -1,9 +1,38 @@
1
- import type { PolishdFiledIssue } from "../ai/types";
2
- export default function IssuesView({ issues, repo, connected, }: {
1
+ /**
2
+ * Polishd — the Issues tab (server-rendered shell).
3
+ *
4
+ * Every bug polishd has filed in the connected repo, in one list. The
5
+ * dashboard files these one at a time — from a loss in the summary, or
6
+ * automatically when the owner turned that on — and then never mentions them
7
+ * again; this tab is where they add up to something: what was reported, what
8
+ * the source verification made of it, and what has happened to it in the
9
+ * tracker since.
10
+ *
11
+ * Each row is the join of two sources. The evidence citation, the analytics
12
+ * claim and the verdict are polishd's own record, kept when the issue was
13
+ * filed. The title, state, labels and comment count are read live from GitHub
14
+ * on every render, so a bug someone closed an hour ago shows as closed here.
15
+ * An issue that can no longer be read — deleted, transferred, token access
16
+ * revoked — keeps its row and says so rather than quietly vanishing.
17
+ *
18
+ * This file is the server half: the header, the stat cards, and the
19
+ * not-connected prompt. The rows themselves live in `issue-list.tsx` (client)
20
+ * so a click can open the right-side drawer — the rendered issue body and the
21
+ * suggest-a-fix panel — without a page of its own.
22
+ *
23
+ * The tab only appears once GitHub is connected (see `chrome.tsx`); reaching
24
+ * it by URL without a connection renders the prompt to go and connect one.
25
+ */
26
+ import type { PolishdFiledIssue, PolishdFixSuggestion } from "../ai/types";
27
+ export default function IssuesView({ issues, repo, connected, suggestions, canSuggest, }: {
3
28
  issues: PolishdFiledIssue[];
4
29
  /** The connected repository, "owner/repo". */
5
30
  repo?: string;
6
31
  /** False when the tab was reached by URL without a GitHub connection. */
7
32
  connected: boolean;
33
+ /** Cached fix suggestions, keyed by issue number. */
34
+ suggestions: Record<number, PolishdFixSuggestion>;
35
+ /** True when a model API key is configured (fix suggestions need one). */
36
+ canSuggest: boolean;
8
37
  }): import("react").JSX.Element;
9
38
  //# sourceMappingURL=issues.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"issues.d.ts","sourceRoot":"","sources":["../../src/dashboard/issues.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,iBAAiB,EAAsB,MAAM,aAAa,CAAC;AAoLzE,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EACjC,MAAM,EACN,IAAI,EACJ,SAAS,GACV,EAAE;IACD,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,SAAS,EAAE,OAAO,CAAC;CACpB,+BAwEA"}
1
+ {"version":3,"file":"issues.d.ts","sourceRoot":"","sources":["../../src/dashboard/issues.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAwB3E,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EACjC,MAAM,EACN,IAAI,EACJ,SAAS,EACT,WAAW,EACX,UAAU,GACX,EAAE;IACD,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,SAAS,EAAE,OAAO,CAAC;IACnB,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAClD,0EAA0E;IAC1E,UAAU,EAAE,OAAO,CAAC;CACrB,+BA2EA"}
@@ -1,81 +1,14 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { TabLink } from "./chrome";
3
- import { border, card, divider, labelCls as label } from "./ui";
4
- /** "3 Aug", or "3 Aug 2024" once it's from another year. */
5
- function shortDate(ms) {
6
- const d = new Date(ms);
7
- const sameYear = d.getFullYear() === new Date().getFullYear();
8
- return d.toLocaleDateString("en-GB", {
9
- day: "numeric",
10
- month: "short",
11
- ...(sameYear ? {} : { year: "numeric" }),
12
- });
13
- }
14
- /** Coarse relative age — "2d ago" — for the meta line. */
15
- function timeAgo(ms) {
16
- const delta = Date.now() - ms;
17
- if (delta < 60_000)
18
- return "just now";
19
- const mins = Math.floor(delta / 60_000);
20
- if (mins < 60)
21
- return `${mins}m ago`;
22
- const hours = Math.floor(mins / 60);
23
- if (hours < 24)
24
- return `${hours}h ago`;
25
- const days = Math.floor(hours / 24);
26
- if (days < 30)
27
- return `${days}d ago`;
28
- return shortDate(ms);
29
- }
3
+ import IssueList from "./issue-list";
4
+ import { border, card, labelCls as label } from "./ui";
30
5
  function Stat({ label: labelText, value, tone = "text-white", }) {
31
6
  return (_jsxs("div", { className: `${card} px-4 py-4`, children: [_jsx("div", { className: `text-[28px] font-semibold tabular-nums leading-none ${tone}`, children: value.toLocaleString() }), _jsx("div", { className: `mt-2 ${label}`, children: labelText })] }));
32
7
  }
33
- /** Open / closed / unreadable — the one thing you look for per row. */
34
- function StatePill({ detail }) {
35
- if (!detail) {
36
- return (_jsx("span", { className: "shrink-0 rounded-full bg-[#1a1a1a] px-2 py-0.5 text-[10px] font-medium text-[#666]", children: "\u25CB unreadable" }));
37
- }
38
- if (detail.state === "open") {
39
- return (_jsx("span", { className: "shrink-0 rounded-full bg-emerald-950 px-2 py-0.5 text-[10px] font-medium text-emerald-400", children: "\u25CF open" }));
40
- }
41
- const notPlanned = detail.stateReason === "not_planned";
42
- return (_jsx("span", { className: `shrink-0 rounded-full px-2 py-0.5 text-[10px] font-medium ${notPlanned ? "bg-[#1a1a1a] text-[#888]" : "bg-[#1e132b] text-[#b083f0]"}`, children: notPlanned ? "✕ not planned" : "✓ closed" }));
43
- }
44
- function Chip({ children, tone = "text-[#888]" }) {
45
- return (_jsx("span", { className: `max-w-full break-all rounded border border-[#2e2e2e] px-1.5 py-0.5 text-[10px] font-medium ${tone}`, children: children }));
46
- }
47
- /** The dot-separated facts under a row's title, in the order they matter. */
48
- function metaLine(issue) {
49
- const { detail } = issue;
50
- const opened = detail?.createdAt ?? issue.filedAt;
51
- const bits = [];
52
- if (opened)
53
- bits.push(`opened ${timeAgo(opened)}`);
54
- if (detail?.author)
55
- bits.push(`by ${detail.author}`);
56
- if (detail?.closedAt)
57
- bits.push(`closed ${timeAgo(detail.closedAt)}`);
58
- // An "updated" that is really just the moment it was filed says nothing.
59
- else if (detail && detail.updatedAt > (opened ?? 0) + 60_000) {
60
- bits.push(`updated ${timeAgo(detail.updatedAt)}`);
61
- }
62
- if (detail && detail.comments > 0) {
63
- bits.push(`${detail.comments} ${detail.comments === 1 ? "comment" : "comments"}`);
64
- }
65
- if (detail && detail.assignees.length > 0) {
66
- bits.push(`assigned to ${detail.assignees.join(", ")}`);
67
- }
68
- return bits.join(" · ");
69
- }
70
- function IssueRow({ issue, repo }) {
71
- const { detail } = issue;
72
- const title = detail?.title ?? issue.claim ?? `Issue #${issue.number}`;
73
- return (_jsxs("div", { className: `px-4 py-4 sm:px-5 ${divider} first:border-t-0`, children: [_jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("a", { href: issue.url, target: "_blank", rel: "noreferrer noopener", className: "text-[14px] font-medium leading-snug text-white hover:text-[#8ab4f8]", children: [_jsxs("span", { className: "mr-1.5 font-mono text-[12px] tabular-nums text-[#666]", children: ["#", issue.number] }), title] }), _jsx("p", { className: "mt-1.5 text-[11px] leading-snug text-[#666]", children: metaLine(issue) })] }), _jsx(StatePill, { detail: detail })] }), _jsxs("div", { className: "mt-2.5 flex flex-wrap items-center gap-1.5", children: [_jsxs(Chip, { tone: "text-[#aaa]", children: [_jsx("span", { className: "text-[#666]", children: "evidence" }), " ", _jsx("span", { className: "font-mono", children: issue.evidence })] }), issue.verdict === "confirmed" && (_jsx(Chip, { tone: "text-emerald-500", children: "verified against source" })), issue.verdict === "inconclusive" && (_jsx(Chip, { tone: "text-[#f5a623]", children: "filed unverified" })), (detail?.labels ?? []).map((l) => (_jsx(Chip, { children: l }, l)))] }), issue.claim && issue.claim !== title && (_jsxs("p", { className: "mt-2.5 text-[12px] leading-relaxed text-[#888]", children: [_jsx("span", { className: label, children: "Reported as" }), " ", _jsx("span", { className: "text-[#aaa]", children: issue.claim })] })), detail ? (detail.body.trim().length > 0 && (_jsxs("details", { className: "group mt-2.5", children: [_jsxs("summary", { className: "cursor-pointer list-none text-[11px] font-medium text-[#888] transition-colors hover:text-white [&::-webkit-details-marker]:hidden", children: [_jsx("span", { className: "group-open:hidden", children: "Show issue body \u2193" }), _jsx("span", { className: "hidden group-open:inline", children: "Hide issue body \u2191" })] }), _jsx("div", { className: "mt-2 max-h-96 overflow-y-auto rounded-md border border-[#2e2e2e] bg-[#111] px-3 py-2.5", children: _jsx("pre", { className: "whitespace-pre-wrap break-words font-mono text-[11px] leading-relaxed text-[#aaa]", children: detail.body }) })] }))) : (_jsxs("p", { className: "mt-2.5 text-[12px] leading-relaxed text-[#777]", children: ["Polishd filed this issue", issue.filedAt ? ` on ${shortDate(issue.filedAt)}` : "", ", but GitHub won't return it now \u2014 it was deleted or transferred, or the access token no longer covers", repo ? ` ${repo}` : " the repository", "."] }))] }));
74
- }
75
- export default function IssuesView({ issues, repo, connected, }) {
8
+ export default function IssuesView({ issues, repo, connected, suggestions, canSuggest, }) {
76
9
  const open = issues.filter((i) => i.detail?.state === "open").length;
77
10
  const closed = issues.filter((i) => i.detail?.state === "closed").length;
78
11
  const verified = issues.filter((i) => i.verdict === "confirmed").length;
79
- return (_jsxs("main", { className: "text-white", children: [_jsxs("div", { className: `mb-8 flex items-start justify-between gap-3 border-b ${border} pb-6`, children: [_jsxs("div", { children: [_jsx("h1", { className: "text-[22px] font-semibold tracking-tight text-white", children: "Issues" }), _jsx("p", { className: "mt-1 text-[13px] text-[#666]", children: "Bugs polishd filed from your analytics \u2014 each one traced back to the behavior that found it, and shown as your tracker has it now." })] }), repo && (_jsxs("a", { href: `https://github.com/${repo}/issues`, target: "_blank", rel: "noreferrer noopener", className: "shrink-0 whitespace-nowrap rounded-full bg-[#141414] px-3 py-1 font-mono text-[11px] text-[#888] transition-colors hover:text-white", children: [repo, " \u2197"] }))] }), !connected ? (_jsxs("div", { className: `${card} px-5 py-8 text-center`, children: [_jsx("p", { className: "text-[13px] text-[#888]", children: "No GitHub repository is connected." }), _jsx("p", { className: "mx-auto mt-1.5 max-w-md text-[12px] leading-relaxed text-[#666]", children: "Connect one in the settings and polishd can verify the problems it finds against your source and file them as issues \u2014 which is what this tab lists." }), _jsx(TabLink, { tab: "settings", className: "mt-4 inline-block rounded-md border border-[#2e2e2e] px-3 py-1.5 text-[12px] text-[#aaa] transition-colors hover:border-[#555] hover:text-white", children: "Open settings" })] })) : (_jsxs(_Fragment, { children: [_jsx("section", { className: "mb-8", children: _jsxs("div", { className: "grid grid-cols-2 gap-3 sm:grid-cols-4", children: [_jsx(Stat, { label: "Filed by polishd", value: issues.length }), _jsx(Stat, { label: "Open", value: open, tone: "text-emerald-400" }), _jsx(Stat, { label: "Closed", value: closed }), _jsx(Stat, { label: "Verified against source", value: verified })] }) }), _jsxs("section", { className: "mb-8", children: [_jsx("div", { className: `mb-3 ${label}`, children: "Filed issues" }), _jsx("div", { className: card, children: issues.length === 0 ? (_jsx("p", { className: "px-5 py-8 text-center text-[13px] text-[#555]", children: "Nothing filed yet. Problems the summary finds on the Analytics tab carry a \u201CFile bug\u201D button \u2014 anything filed from there, or automatically, lands here." })) : (issues.map((issue) => (_jsx(IssueRow, { issue: issue, repo: repo }, issue.evidence)))) })] })] }))] }));
12
+ return (_jsxs("main", { className: "text-white", children: [_jsxs("div", { className: `mb-8 flex items-start justify-between gap-3 border-b ${border} pb-6`, children: [_jsxs("div", { children: [_jsx("h1", { className: "text-[22px] font-semibold tracking-tight text-white", children: "Issues" }), _jsx("p", { className: "mt-1 text-[13px] text-[#666]", children: "Bugs polishd filed from your analytics \u2014 each one traced back to the behavior that found it, and shown as your tracker has it now." })] }), repo && (_jsxs("a", { href: `https://github.com/${repo}/issues`, target: "_blank", rel: "noreferrer noopener", className: "shrink-0 whitespace-nowrap rounded-full bg-[#141414] px-3 py-1 font-mono text-[11px] text-[#888] transition-colors hover:text-white", children: [repo, " \u2197"] }))] }), !connected ? (_jsxs("div", { className: `${card} px-5 py-8 text-center`, children: [_jsx("p", { className: "text-[13px] text-[#888]", children: "No GitHub repository is connected." }), _jsx("p", { className: "mx-auto mt-1.5 max-w-md text-[12px] leading-relaxed text-[#666]", children: "Connect one in the settings and polishd can verify the problems it finds against your source and file them as issues \u2014 which is what this tab lists." }), _jsx(TabLink, { tab: "settings", className: "mt-4 inline-block rounded-md border border-[#2e2e2e] px-3 py-1.5 text-[12px] text-[#aaa] transition-colors hover:border-[#555] hover:text-white", children: "Open settings" })] })) : (_jsxs(_Fragment, { children: [_jsx("section", { className: "mb-8", children: _jsxs("div", { className: "grid grid-cols-2 gap-3 sm:grid-cols-4", children: [_jsx(Stat, { label: "Filed by polishd", value: issues.length }), _jsx(Stat, { label: "Open", value: open, tone: "text-emerald-400" }), _jsx(Stat, { label: "Closed", value: closed }), _jsx(Stat, { label: "Verified against source", value: verified })] }) }), _jsxs("section", { className: "mb-8", children: [_jsx("div", { className: `mb-3 ${label}`, children: "Filed issues" }), _jsx("div", { className: card, children: issues.length === 0 ? (_jsx("p", { className: "px-5 py-8 text-center text-[13px] text-[#555]", children: "Nothing filed yet. Problems the summary finds on the Analytics tab carry a \u201CFile bug\u201D button \u2014 anything filed from there, or automatically, lands here." })) : (_jsx(IssueList, { issues: issues, repo: repo, suggestions: suggestions, canSuggest: canSuggest })) })] })] }))] }));
80
13
  }
81
14
  //# sourceMappingURL=issues.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"issues.js","sourceRoot":"","sources":["../../src/dashboard/issues.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"issues.js","sourceRoot":"","sources":["../../src/dashboard/issues.tsx"],"names":[],"mappings":"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"}
@@ -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"}