@polishd/next 0.2.1 → 0.2.2-dev.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- package/README.md +27 -0
- package/dist/ai/actions.d.ts +10 -1
- package/dist/ai/actions.d.ts.map +1 -1
- package/dist/ai/actions.js +21 -0
- package/dist/ai/actions.js.map +1 -1
- package/dist/ai/ignored.d.ts +26 -0
- package/dist/ai/ignored.d.ts.map +1 -0
- package/dist/ai/ignored.js +134 -0
- package/dist/ai/ignored.js.map +1 -0
- package/dist/ai/summary.d.ts +8 -1
- package/dist/ai/summary.d.ts.map +1 -1
- package/dist/ai/summary.js +59 -22
- package/dist/ai/summary.js.map +1 -1
- package/dist/ai/types.d.ts +31 -0
- package/dist/ai/types.d.ts.map +1 -1
- package/dist/dashboard/summary.d.ts.map +1 -1
- package/dist/dashboard/summary.js +64 -4
- package/dist/dashboard/summary.js.map +1 -1
- package/dist/dashboard.css +32 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,33 @@
|
|
|
2
2
|
|
|
3
3
|
## 0.2.1
|
|
4
4
|
|
|
5
|
+
### Losses can be ignored, and the model remembers why
|
|
6
|
+
|
|
7
|
+
A loss had one answer next to it — **File bug** — and no way to say the other
|
|
8
|
+
thing: that it isn't a problem. Nothing recorded that judgement, so the next
|
|
9
|
+
regenerate found the deliberate two-step checkout again, and again.
|
|
10
|
+
|
|
11
|
+
**Ignore** now sits beside File bug on every loss. One click, no explanation
|
|
12
|
+
required: the loss leaves the card, leaves the cached summary immediately, and
|
|
13
|
+
is dropped from every later summary *before* the four-loss cap applies — so
|
|
14
|
+
dismissing one promotes the next real problem into its place rather than
|
|
15
|
+
leaving a gap.
|
|
16
|
+
|
|
17
|
+
A **reason** is optional and offered after the dismissal, so the fast path
|
|
18
|
+
stays one click. Give one and it's replayed to the model verbatim on every
|
|
19
|
+
later call, alongside the problem it dismissed — context the analytics digest
|
|
20
|
+
can't carry ("the second CTA is deliberate", "that page is staff-only"). The
|
|
21
|
+
model is told not to re-report a dismissed problem under any wording, and to
|
|
22
|
+
read the rest of the data taking the stated reason as true. Reasons can be
|
|
23
|
+
edited afterwards, and **Undo** puts a loss back where the model can find it
|
|
24
|
+
again.
|
|
25
|
+
|
|
26
|
+
Dismissals key off the same evidence citation the GitHub issue log uses, so a
|
|
27
|
+
problem refound under different wording is still recognised as the one you
|
|
28
|
+
already reviewed. They fold into the summary fingerprint too: ignoring
|
|
29
|
+
something marks the summary stale exactly like new analytics does, so the next
|
|
30
|
+
refresh really does re-ask the model.
|
|
31
|
+
|
|
5
32
|
### Setup moved out of the way, into a Settings tab
|
|
6
33
|
|
|
7
34
|
The first screen of the dashboard was also its setup form. Provider, key, site
|
package/README.md
CHANGED
|
@@ -363,6 +363,33 @@ authoritative context, so:
|
|
|
363
363
|
> provide. Your source is read only during an explicit scan (or a targeted
|
|
364
364
|
> gap-fill), and always under strict size budgets.
|
|
365
365
|
|
|
366
|
+
### Two verdicts on a loss: file it, or ignore it
|
|
367
|
+
|
|
368
|
+
Every loss carries both answers, side by side.
|
|
369
|
+
|
|
370
|
+
**File bug** (with GitHub connected) verifies the report against your repo's
|
|
371
|
+
source before anything is filed: confirmed reports become an issue with the
|
|
372
|
+
technical analysis and suggested fixes, and a report the code disproves comes
|
|
373
|
+
back as *"checked the source — not an actual bug"* with the reasoning, filing
|
|
374
|
+
nothing.
|
|
375
|
+
|
|
376
|
+
**Ignore** is the other answer: this isn't a problem, stop showing it to me. It
|
|
377
|
+
takes one click and no explanation. The loss drops out of the card and out of
|
|
378
|
+
every later summary — including the cached one, immediately — and the model is
|
|
379
|
+
told about the dismissal on every subsequent call, so it doesn't spend a loss
|
|
380
|
+
slot rediscovering it. Dismissing one loss doesn't shrink the list; the next
|
|
381
|
+
real problem takes its place.
|
|
382
|
+
|
|
383
|
+
A **reason** is optional and offered after the fact — *"the second CTA is
|
|
384
|
+
deliberate"*, *"that page is staff-only"*. It's worth adding: reasons are
|
|
385
|
+
replayed to the model verbatim as context it can't get from the numbers, which
|
|
386
|
+
is what stops the same finding coming back in different words. You can edit a
|
|
387
|
+
reason later, and **Undo** puts the loss back where the model can report it
|
|
388
|
+
again.
|
|
389
|
+
|
|
390
|
+
Ignoring a loss marks the summary stale, exactly like new analytics does, so
|
|
391
|
+
the next refresh actually re-asks the model with the dismissal in hand.
|
|
392
|
+
|
|
366
393
|
## Design review
|
|
367
394
|
|
|
368
395
|
The dashboard's **Design** tab (in the sidebar) is your site's brand guideline
|
package/dist/ai/actions.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type ListModelsInput, type SaveAISettingsInput } from "./settings";
|
|
2
|
-
import type { PolishdAISettingsPublic, PolishdLossItem, CreateIssueResult, GenerateDesignReviewResult, GenerateProfileResult, GenerateSummaryResult, ListModelsResult, VerifyGithubResult } from "./types";
|
|
2
|
+
import type { PolishdAISettingsPublic, PolishdLossItem, CreateIssueResult, GenerateDesignReviewResult, GenerateProfileResult, GenerateSummaryResult, IgnoreLossResult, ListModelsResult, UnignoreLossResult, VerifyGithubResult } from "./types";
|
|
3
3
|
/** Generate or refresh the narrative. `force` re-asks the model even if data is unchanged. */
|
|
4
4
|
export declare function generateSummaryAction(force?: boolean): Promise<GenerateSummaryResult>;
|
|
5
5
|
/**
|
|
@@ -31,4 +31,13 @@ export declare function verifyGithubAction(): Promise<VerifyGithubResult>;
|
|
|
31
31
|
* disproved report returns `not-a-bug` with the reasoning instead of filing.
|
|
32
32
|
*/
|
|
33
33
|
export declare function createIssueFromLossAction(loss: Pick<PolishdLossItem, "issue" | "evidence" | "location">): Promise<CreateIssueResult>;
|
|
34
|
+
/**
|
|
35
|
+
* The other verdict on a loss: dismiss it, with an optional reason. The loss
|
|
36
|
+
* leaves every summary from here on, and the dismissal — reason included — is
|
|
37
|
+
* replayed into later model calls so the problem isn't reported again. Calling
|
|
38
|
+
* it on an already-dismissed loss just updates the reason.
|
|
39
|
+
*/
|
|
40
|
+
export declare function ignoreLossAction(loss: Pick<PolishdLossItem, "issue" | "evidence">, reason?: string): Promise<IgnoreLossResult>;
|
|
41
|
+
/** Undo a dismissal: the loss can be found and reported again. */
|
|
42
|
+
export declare function unignoreLossAction(evidence: string): Promise<UnignoreLossResult>;
|
|
34
43
|
//# sourceMappingURL=actions.d.ts.map
|
package/dist/ai/actions.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/ai/actions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/ai/actions.ts"],"names":[],"mappings":"AAsBA,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACzB,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EACV,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,SAAS,CAAC;AAEjB,8FAA8F;AAC9F,wBAAsB,qBAAqB,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAGzF;AAED;;;;GAIG;AACH,wBAAsB,0BAA0B,CAC9C,KAAK,UAAQ,GACZ,OAAO,CAAC,0BAA0B,CAAC,CAGrC;AAED,mFAAmF;AACnF,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,uBAAuB,CAAC,CAGlC;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAI5E;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAGxF;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAGtE;AAED;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,GAAG,UAAU,GAAG,UAAU,CAAC,GAC7D,OAAO,CAAC,iBAAiB,CAAC,CAG5B;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,GAAG,UAAU,CAAC,EACjD,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,gBAAgB,CAAC,CAM3B;AAED,kEAAkE;AAClE,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAKtF"}
|
package/dist/ai/actions.js
CHANGED
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
import { requirePolishdAuth } from "./guard";
|
|
16
16
|
import { generateDesignReview } from "./design";
|
|
17
17
|
import { verifyGithubConnection } from "./github";
|
|
18
|
+
import { ignoreLoss, unignoreLoss } from "./ignored";
|
|
18
19
|
import { createIssueFromLoss } from "./issues";
|
|
19
20
|
import { generateProjectProfile } from "./profile";
|
|
20
21
|
import { loadPolishdDashboardData } from "../server/queries";
|
|
@@ -73,4 +74,24 @@ export async function createIssueFromLossAction(loss) {
|
|
|
73
74
|
await requirePolishdAuth();
|
|
74
75
|
return createIssueFromLoss(loss);
|
|
75
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* The other verdict on a loss: dismiss it, with an optional reason. The loss
|
|
79
|
+
* leaves every summary from here on, and the dismissal — reason included — is
|
|
80
|
+
* replayed into later model calls so the problem isn't reported again. Calling
|
|
81
|
+
* it on an already-dismissed loss just updates the reason.
|
|
82
|
+
*/
|
|
83
|
+
export async function ignoreLossAction(loss, reason) {
|
|
84
|
+
await requirePolishdAuth();
|
|
85
|
+
const ignored = await ignoreLoss(loss, reason);
|
|
86
|
+
return ignored
|
|
87
|
+
? { ok: true, ignored }
|
|
88
|
+
: { ok: false, message: "Couldn't save that — the analytics store didn't accept the write." };
|
|
89
|
+
}
|
|
90
|
+
/** Undo a dismissal: the loss can be found and reported again. */
|
|
91
|
+
export async function unignoreLossAction(evidence) {
|
|
92
|
+
await requirePolishdAuth();
|
|
93
|
+
return (await unignoreLoss(evidence))
|
|
94
|
+
? { ok: true }
|
|
95
|
+
: { ok: false, message: "Couldn't undo that — the analytics store didn't accept the write." };
|
|
96
|
+
}
|
|
76
97
|
//# sourceMappingURL=actions.js.map
|
package/dist/ai/actions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/ai/actions.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EACL,qBAAqB,EACrB,cAAc,GAGf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/ai/actions.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EACL,qBAAqB,EACrB,cAAc,GAGf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAc5C,8FAA8F;AAC9F,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,KAAK,GAAG,KAAK;IACvD,MAAM,kBAAkB,EAAE,CAAC;IAC3B,OAAO,eAAe,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACpC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,KAAK,GAAG,KAAK;IAEb,MAAM,kBAAkB,EAAE,CAAC;IAC3B,OAAO,oBAAoB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,mFAAmF;AACnF,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,KAA0B;IAE1B,MAAM,kBAAkB,EAAE,CAAC;IAC3B,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,MAAM,kBAAkB,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,MAAM,wBAAwB,EAAE,CAAC;IAC9C,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAsB;IAC3D,MAAM,kBAAkB,EAAE,CAAC;IAC3B,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,kBAAkB,EAAE,CAAC;IAC3B,OAAO,sBAAsB,EAAE,CAAC;AAClC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,IAA8D;IAE9D,MAAM,kBAAkB,EAAE,CAAC;IAC3B,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAiD,EACjD,MAAe;IAEf,MAAM,kBAAkB,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/C,OAAO,OAAO;QACZ,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;QACvB,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,mEAAmE,EAAE,CAAC;AAClG,CAAC;AAED,kEAAkE;AAClE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,QAAgB;IACvD,MAAM,kBAAkB,EAAE,CAAC;IAC3B,OAAO,CAAC,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE;QACd,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,mEAAmE,EAAE,CAAC;AAClG,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { PolishdIgnoredLoss, PolishdLossItem, PolishdSummary } from "./types";
|
|
2
|
+
/** Same normalization as the issue log: one citation, one verdict. */
|
|
3
|
+
export declare function ignoreKey(evidence: string): string;
|
|
4
|
+
/** Every dismissal, newest first. */
|
|
5
|
+
export declare function loadIgnoredLosses(): Promise<PolishdIgnoredLoss[]>;
|
|
6
|
+
/** The evidence keys to filter losses by. */
|
|
7
|
+
export declare function ignoredKeys(list: PolishdIgnoredLoss[]): Set<string>;
|
|
8
|
+
/**
|
|
9
|
+
* Dismiss one loss, with an optional reason. Re-ignoring an already-ignored
|
|
10
|
+
* loss updates its reason (that's the "add a reason afterwards" path), keeping
|
|
11
|
+
* the original timestamp so the log stays in the order things were reviewed.
|
|
12
|
+
*/
|
|
13
|
+
export declare function ignoreLoss(loss: Pick<PolishdLossItem, "issue" | "evidence">, reason?: string): Promise<PolishdIgnoredLoss | null>;
|
|
14
|
+
/** Undo a dismissal. Returns false only when the store refused the write. */
|
|
15
|
+
export declare function unignoreLoss(evidence: string): Promise<boolean>;
|
|
16
|
+
/**
|
|
17
|
+
* The dismissals as prompt context: what the owner already reviewed and
|
|
18
|
+
* rejected, so the model doesn't spend a loss slot re-reporting it. Reasons are
|
|
19
|
+
* included verbatim — they're the part the analytics can't tell the model.
|
|
20
|
+
*/
|
|
21
|
+
export declare function ignoredSection(list: PolishdIgnoredLoss[]): string | null;
|
|
22
|
+
/** Hash of the dismissals, so a new one invalidates the cached summary. */
|
|
23
|
+
export declare function ignoredFingerprint(list: PolishdIgnoredLoss[]): string;
|
|
24
|
+
/** Drop dismissed losses from a summary about to be rendered. */
|
|
25
|
+
export declare function withoutIgnored(summary: PolishdSummary, keys: Set<string>): PolishdSummary;
|
|
26
|
+
//# sourceMappingURL=ignored.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ignored.d.ts","sourceRoot":"","sources":["../../src/ai/ignored.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAUnF,sEAAsE;AACtE,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAElD;AAeD,qCAAqC;AACrC,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAEvE;AAED,6CAA6C;AAC7C,wBAAgB,WAAW,CAAC,IAAI,EAAE,kBAAkB,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAEnE;AAOD;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,GAAG,UAAU,CAAC,EACjD,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CA0BpC;AAED,6EAA6E;AAC7E,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAMrE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,kBAAkB,EAAE,GAAG,MAAM,GAAG,IAAI,CAcxE;AAED,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,EAAE,GAAG,MAAM,CASrE;AAED,iEAAiE;AACjE,wBAAgB,cAAc,CAC5B,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,GAChB,cAAc,CAIhB"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Polishd — ignored losses (server only).
|
|
3
|
+
*
|
|
4
|
+
* The counterpart to filing a bug. A loss is a claim the model made from the
|
|
5
|
+
* analytics; "File bug" says *yes, and here's the tracker issue*, and this says
|
|
6
|
+
* *no — stop telling me about it*, with or without a reason.
|
|
7
|
+
*
|
|
8
|
+
* A dismissal is not just a UI toggle, or the next regenerate would hand the
|
|
9
|
+
* same problem straight back:
|
|
10
|
+
*
|
|
11
|
+
* 1. Ignored losses are dropped from every summary that renders — the fresh
|
|
12
|
+
* one and the cached one alike — before the four-loss cap applies, so
|
|
13
|
+
* dismissing one promotes a real problem into its place rather than
|
|
14
|
+
* leaving a gap.
|
|
15
|
+
* 2. The dismissals (and their reasons) are replayed into the prompt of every
|
|
16
|
+
* later model call, so the model knows what has already been reviewed and
|
|
17
|
+
* rejected, and why. "Checkout CTA is fine, it's a two-step flow on
|
|
18
|
+
* purpose" is context no digest can carry.
|
|
19
|
+
* 3. They fold into the summary fingerprint, so ignoring something marks the
|
|
20
|
+
* cached summary stale and a regenerate actually re-asks the model.
|
|
21
|
+
*
|
|
22
|
+
* Keyed by the evidence citation — the same key the GitHub issue log uses (see
|
|
23
|
+
* issues.ts) — so a problem refound under slightly different wording is still
|
|
24
|
+
* recognised as the one that was dismissed.
|
|
25
|
+
*/
|
|
26
|
+
import { getMeta, setMeta } from "../server/store";
|
|
27
|
+
import { fingerprintDigest } from "./digest";
|
|
28
|
+
const IGNORED_KEY = "ignored_losses";
|
|
29
|
+
/** Keep the log (and the prompt section built from it) bounded. */
|
|
30
|
+
const MAX_STORED = 50;
|
|
31
|
+
const MAX_IN_PROMPT = 20;
|
|
32
|
+
const MAX_ISSUE_CHARS = 160;
|
|
33
|
+
const MAX_REASON_CHARS = 240;
|
|
34
|
+
/** Same normalization as the issue log: one citation, one verdict. */
|
|
35
|
+
export function ignoreKey(evidence) {
|
|
36
|
+
return evidence.trim().toLowerCase();
|
|
37
|
+
}
|
|
38
|
+
async function loadLog() {
|
|
39
|
+
const raw = await getMeta(IGNORED_KEY);
|
|
40
|
+
if (!raw)
|
|
41
|
+
return {};
|
|
42
|
+
try {
|
|
43
|
+
const parsed = JSON.parse(raw);
|
|
44
|
+
return parsed && typeof parsed === "object" ? parsed : {};
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return {};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** Every dismissal, newest first. */
|
|
51
|
+
export async function loadIgnoredLosses() {
|
|
52
|
+
return Object.values(await loadLog()).sort((a, b) => b.ignoredAt - a.ignoredAt);
|
|
53
|
+
}
|
|
54
|
+
/** The evidence keys to filter losses by. */
|
|
55
|
+
export function ignoredKeys(list) {
|
|
56
|
+
return new Set(list.map((i) => ignoreKey(i.evidence)));
|
|
57
|
+
}
|
|
58
|
+
const clip = (s, max) => {
|
|
59
|
+
const t = s.replace(/\s+/g, " ").trim();
|
|
60
|
+
return t.length > max ? `${t.slice(0, max - 1)}…` : t;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Dismiss one loss, with an optional reason. Re-ignoring an already-ignored
|
|
64
|
+
* loss updates its reason (that's the "add a reason afterwards" path), keeping
|
|
65
|
+
* the original timestamp so the log stays in the order things were reviewed.
|
|
66
|
+
*/
|
|
67
|
+
export async function ignoreLoss(loss, reason) {
|
|
68
|
+
const evidence = loss.evidence.trim();
|
|
69
|
+
if (!evidence)
|
|
70
|
+
return null;
|
|
71
|
+
const key = ignoreKey(evidence);
|
|
72
|
+
const log = await loadLog();
|
|
73
|
+
const trimmed = reason?.trim();
|
|
74
|
+
const entry = {
|
|
75
|
+
issue: clip(loss.issue, MAX_ISSUE_CHARS),
|
|
76
|
+
evidence,
|
|
77
|
+
reason: trimmed ? clip(trimmed, MAX_REASON_CHARS) : undefined,
|
|
78
|
+
ignoredAt: log[key]?.ignoredAt ?? Date.now(),
|
|
79
|
+
};
|
|
80
|
+
log[key] = entry;
|
|
81
|
+
// Bound the log: oldest dismissals fall off first.
|
|
82
|
+
const keys = Object.keys(log);
|
|
83
|
+
if (keys.length > MAX_STORED) {
|
|
84
|
+
for (const k of keys
|
|
85
|
+
.sort((a, b) => log[a].ignoredAt - log[b].ignoredAt)
|
|
86
|
+
.slice(0, keys.length - MAX_STORED)) {
|
|
87
|
+
delete log[k];
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return (await setMeta(IGNORED_KEY, JSON.stringify(log))) ? entry : null;
|
|
91
|
+
}
|
|
92
|
+
/** Undo a dismissal. Returns false only when the store refused the write. */
|
|
93
|
+
export async function unignoreLoss(evidence) {
|
|
94
|
+
const log = await loadLog();
|
|
95
|
+
const key = ignoreKey(evidence);
|
|
96
|
+
if (!(key in log))
|
|
97
|
+
return true; // already gone — nothing to undo
|
|
98
|
+
delete log[key];
|
|
99
|
+
return setMeta(IGNORED_KEY, JSON.stringify(log));
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* The dismissals as prompt context: what the owner already reviewed and
|
|
103
|
+
* rejected, so the model doesn't spend a loss slot re-reporting it. Reasons are
|
|
104
|
+
* included verbatim — they're the part the analytics can't tell the model.
|
|
105
|
+
*/
|
|
106
|
+
export function ignoredSection(list) {
|
|
107
|
+
if (list.length === 0)
|
|
108
|
+
return null;
|
|
109
|
+
const lines = list
|
|
110
|
+
.slice(0, MAX_IN_PROMPT)
|
|
111
|
+
.map((i) => `- "${i.issue}" (cited: ${i.evidence}) — ` +
|
|
112
|
+
(i.reason ? `dismissed because: ${i.reason}` : "dismissed without a reason"));
|
|
113
|
+
return ("ALREADY REVIEWED AND DISMISSED BY THE SITE OWNER (do not report these " +
|
|
114
|
+
"again, in these or any other words — treat a stated reason as true):\n" +
|
|
115
|
+
lines.join("\n"));
|
|
116
|
+
}
|
|
117
|
+
/** Hash of the dismissals, so a new one invalidates the cached summary. */
|
|
118
|
+
export function ignoredFingerprint(list) {
|
|
119
|
+
if (list.length === 0)
|
|
120
|
+
return "";
|
|
121
|
+
return fingerprintDigest(list
|
|
122
|
+
.slice(0, MAX_IN_PROMPT)
|
|
123
|
+
.map((i) => `${ignoreKey(i.evidence)}:${i.reason ?? ""}`)
|
|
124
|
+
.sort()
|
|
125
|
+
.join("|"));
|
|
126
|
+
}
|
|
127
|
+
/** Drop dismissed losses from a summary about to be rendered. */
|
|
128
|
+
export function withoutIgnored(summary, keys) {
|
|
129
|
+
if (!summary.losses?.length || keys.size === 0)
|
|
130
|
+
return summary;
|
|
131
|
+
const losses = summary.losses.filter((l) => !keys.has(ignoreKey(l.evidence)));
|
|
132
|
+
return losses.length === summary.losses.length ? summary : { ...summary, losses };
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=ignored.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ignored.js","sourceRoot":"","sources":["../../src/ai/ignored.ts"],"names":[],"mappings":"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"}
|
package/dist/ai/summary.d.ts
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import { type PolishdDashboardData } from "../server/queries";
|
|
2
2
|
import type { PolishdSummary, GenerateSummaryResult } from "./types";
|
|
3
3
|
export { getAISettingsPublic, saveAISettings, type SaveAISettingsInput, } from "./settings";
|
|
4
|
-
/**
|
|
4
|
+
/**
|
|
5
|
+
* The last generated summary, or null. Read-only — never calls a model.
|
|
6
|
+
*
|
|
7
|
+
* Losses the owner has dismissed since it was generated are filtered out here,
|
|
8
|
+
* so an ignore takes effect on the cached summary immediately rather than at
|
|
9
|
+
* the next regenerate. The stored copy keeps them, which is what makes an undo
|
|
10
|
+
* bring the loss back.
|
|
11
|
+
*/
|
|
5
12
|
export declare function loadSummary(): Promise<PolishdSummary | null>;
|
|
6
13
|
/**
|
|
7
14
|
* Generate (or reuse) the narrative summary.
|
package/dist/ai/summary.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/ai/summary.ts"],"names":[],"mappings":"AAmBA,OAAO,EAA4B,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/ai/summary.ts"],"names":[],"mappings":"AAmBA,OAAO,EAA4B,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAexF,OAAO,KAAK,EAIV,cAAc,EACd,qBAAqB,EACtB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,KAAK,mBAAmB,GACzB,MAAM,YAAY,CAAC;AAIpB;;;;;;;GAOG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAUlE;AA2KD;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAC7B,OAAO,CAAC,qBAAqB,CAAC,CAiFhC;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,CAAC,EAAE,oBAAoB,GAC/B,OAAO,CAAC;IACT,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC,CAAC,CA0BD"}
|
package/dist/ai/summary.js
CHANGED
|
@@ -11,14 +11,15 @@
|
|
|
11
11
|
* profile.ts), generated once — the summary call never re-reads source.
|
|
12
12
|
* Only when analytics mention a component the profile doesn't cover do we
|
|
13
13
|
* do a tiny targeted read of the files naming it.
|
|
14
|
-
* 3. We fingerprint the inputs (digest + profile) and cache the
|
|
15
|
-
* regenerate with no new data returns the cached text for free
|
|
14
|
+
* 3. We fingerprint the inputs (digest + profile + dismissals) and cache the
|
|
15
|
+
* summary. A regenerate with no new data returns the cached text for free
|
|
16
16
|
* (`regenerated: false`).
|
|
17
17
|
* 4. The system prompt is tight and the output is capped to a paragraph.
|
|
18
18
|
*/
|
|
19
19
|
import { getMeta, setMeta } from "../server/store";
|
|
20
20
|
import { loadPolishdDashboardData } from "../server/queries";
|
|
21
21
|
import { buildDigest, fingerprintDigest } from "./digest";
|
|
22
|
+
import { ignoreKey, ignoredFingerprint, ignoredKeys, ignoredSection, loadIgnoredLosses, withoutIgnored, } from "./ignored";
|
|
22
23
|
import { attachGithubIssues } from "./issues";
|
|
23
24
|
import { callModel } from "./providers";
|
|
24
25
|
import { coverageGaps, loadProjectProfile } from "./profile";
|
|
@@ -27,17 +28,26 @@ import { resolveSettings } from "./settings";
|
|
|
27
28
|
// Settings live in ./settings; re-exported here so existing imports keep working.
|
|
28
29
|
export { getAISettingsPublic, saveAISettings, } from "./settings";
|
|
29
30
|
const SUMMARY_KEY = "ai_summary";
|
|
30
|
-
/**
|
|
31
|
+
/**
|
|
32
|
+
* The last generated summary, or null. Read-only — never calls a model.
|
|
33
|
+
*
|
|
34
|
+
* Losses the owner has dismissed since it was generated are filtered out here,
|
|
35
|
+
* so an ignore takes effect on the cached summary immediately rather than at
|
|
36
|
+
* the next regenerate. The stored copy keeps them, which is what makes an undo
|
|
37
|
+
* bring the loss back.
|
|
38
|
+
*/
|
|
31
39
|
export async function loadSummary() {
|
|
32
40
|
const raw = await getMeta(SUMMARY_KEY);
|
|
33
41
|
if (!raw)
|
|
34
42
|
return null;
|
|
43
|
+
let summary;
|
|
35
44
|
try {
|
|
36
|
-
|
|
45
|
+
summary = JSON.parse(raw);
|
|
37
46
|
}
|
|
38
47
|
catch {
|
|
39
48
|
return null;
|
|
40
49
|
}
|
|
50
|
+
return withoutIgnored(summary, ignoredKeys(await loadIgnoredLosses()));
|
|
41
51
|
}
|
|
42
52
|
const SYSTEM_PROMPT = "You are a product analyst embedded in a website's analytics dashboard. " +
|
|
43
53
|
"You receive a compact digest of real user-behavior signals (clicks, rage " +
|
|
@@ -58,7 +68,10 @@ const SYSTEM_PROMPT = "You are a product analyst embedded in a website's analyti
|
|
|
58
68
|
"must be concrete (what is wrong, where, and what the numbers show), and " +
|
|
59
69
|
"evidence must be the exact page path, CSS selector, or component name " +
|
|
60
70
|
"copied verbatim from the digest that demonstrates it. Never invent a loss: " +
|
|
61
|
-
"if the data shows no real problems, return an empty array."
|
|
71
|
+
"if the data shows no real problems, return an empty array. If the prompt " +
|
|
72
|
+
"lists problems the site owner has already reviewed and dismissed, do not " +
|
|
73
|
+
"report them again — not under a different citation or a different wording — " +
|
|
74
|
+
"and take any reason they gave as true when reading the rest of the data.";
|
|
62
75
|
/**
|
|
63
76
|
* Parse the model's JSON reply, tolerating stray fences or prose around it.
|
|
64
77
|
* Falls back to treating the whole text as the story so a model that ignores
|
|
@@ -99,9 +112,11 @@ function citationTokens(s) {
|
|
|
99
112
|
/**
|
|
100
113
|
* Hold losses to their evidence bar. A loss survives only if its citation
|
|
101
114
|
* actually appears in the prompt we sent (so it can't be invented), and is
|
|
102
|
-
* then matched to a source file when the codebase is on disk.
|
|
115
|
+
* then matched to a source file when the codebase is on disk. Anything the
|
|
116
|
+
* owner has dismissed is dropped here, before the cap — so a dismissal frees
|
|
117
|
+
* its slot for the next real problem instead of leaving a gap.
|
|
103
118
|
*/
|
|
104
|
-
function verifyLosses(raw, promptText, sourceDirs) {
|
|
119
|
+
function verifyLosses(raw, promptText, sourceDirs, ignored) {
|
|
105
120
|
const hay = promptText.toLowerCase();
|
|
106
121
|
const out = [];
|
|
107
122
|
for (const l of raw) {
|
|
@@ -110,6 +125,8 @@ function verifyLosses(raw, promptText, sourceDirs) {
|
|
|
110
125
|
const evidence = typeof l.evidence === "string" ? l.evidence.trim() : "";
|
|
111
126
|
if (!evidence)
|
|
112
127
|
continue; // no citation, no loss
|
|
128
|
+
if (ignored.has(ignoreKey(evidence)))
|
|
129
|
+
continue; // reviewed and dismissed
|
|
113
130
|
const tokens = citationTokens(evidence);
|
|
114
131
|
if (!tokens.length || !tokens.some((t) => hay.includes(t)))
|
|
115
132
|
continue; // not in the data we sent
|
|
@@ -126,11 +143,29 @@ function verifyLosses(raw, promptText, sourceDirs) {
|
|
|
126
143
|
return out;
|
|
127
144
|
}
|
|
128
145
|
/**
|
|
129
|
-
* The
|
|
130
|
-
*
|
|
131
|
-
*
|
|
146
|
+
* The one place the cache fingerprint is defined. It covers the digest, the
|
|
147
|
+
* profile AND the dismissals, so a re-scan or a newly ignored loss marks the
|
|
148
|
+
* cached summary stale exactly like new analytics does.
|
|
149
|
+
*/
|
|
150
|
+
function fingerprintInputs(digest, profile, ignored) {
|
|
151
|
+
const ignoredHash = ignoredFingerprint(ignored);
|
|
152
|
+
return fingerprintDigest([
|
|
153
|
+
digest,
|
|
154
|
+
profile ? `PROFILE:${profile.fingerprint}` : "",
|
|
155
|
+
ignoredHash ? `IGNORED:${ignoredHash}` : "",
|
|
156
|
+
]
|
|
157
|
+
.filter(Boolean)
|
|
158
|
+
.join("\n"));
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* The exact user message for a summary call, plus its cache fingerprint and
|
|
162
|
+
* the slice of it a citation is allowed to be grounded in.
|
|
163
|
+
*
|
|
164
|
+
* `grounding` is the message minus the dismissals: past problems are quoted
|
|
165
|
+
* back to the model as context, and quoting them must not turn their citations
|
|
166
|
+
* into fresh evidence a new loss can lean on (see verifyLosses).
|
|
132
167
|
*/
|
|
133
|
-
function composePrompt(data, profile, context, sourceDirs) {
|
|
168
|
+
function composePrompt(data, profile, context, sourceDirs, ignored) {
|
|
134
169
|
const digest = buildDigest(data, context);
|
|
135
170
|
const sections = [];
|
|
136
171
|
if (profile) {
|
|
@@ -149,11 +184,12 @@ function composePrompt(data, profile, context, sourceDirs) {
|
|
|
149
184
|
}
|
|
150
185
|
}
|
|
151
186
|
}
|
|
152
|
-
|
|
153
|
-
const
|
|
187
|
+
const dismissed = ignoredSection(ignored);
|
|
188
|
+
const grounding = [...sections, digest].join("\n\n");
|
|
154
189
|
return {
|
|
155
|
-
user,
|
|
156
|
-
|
|
190
|
+
user: dismissed ? [...sections, dismissed, digest].join("\n\n") : grounding,
|
|
191
|
+
grounding,
|
|
192
|
+
fingerprint: fingerprintInputs(digest, profile, ignored),
|
|
157
193
|
};
|
|
158
194
|
}
|
|
159
195
|
/**
|
|
@@ -176,8 +212,8 @@ export async function generateSummary(opts = {}) {
|
|
|
176
212
|
message: "No analytics captured yet — browse the site, then generate.",
|
|
177
213
|
};
|
|
178
214
|
}
|
|
179
|
-
const profile = await loadProjectProfile();
|
|
180
|
-
const { user, fingerprint } = composePrompt(data, profile, settings.context, settings.sourceDirs);
|
|
215
|
+
const [profile, ignored] = await Promise.all([loadProjectProfile(), loadIgnoredLosses()]);
|
|
216
|
+
const { user, grounding, fingerprint } = composePrompt(data, profile, settings.context, settings.sourceDirs, ignored);
|
|
181
217
|
if (!opts.force) {
|
|
182
218
|
const cached = await loadSummary();
|
|
183
219
|
if (cached && cached.fingerprint === fingerprint) {
|
|
@@ -216,7 +252,7 @@ export async function generateSummary(opts = {}) {
|
|
|
216
252
|
const parsed = parseStructured(reply.text);
|
|
217
253
|
// Link losses to their GitHub issues — filing new ones when the owner
|
|
218
254
|
// enabled auto-filing, attaching already-filed ones either way.
|
|
219
|
-
const losses = await attachGithubIssues(verifyLosses(parsed.losses,
|
|
255
|
+
const losses = await attachGithubIssues(verifyLosses(parsed.losses, grounding, settings.sourceDirs, ignoredKeys(ignored)));
|
|
220
256
|
const summary = {
|
|
221
257
|
text: parsed.story,
|
|
222
258
|
wins: parsed.wins,
|
|
@@ -243,14 +279,15 @@ export async function loadSummaryState(preloaded) {
|
|
|
243
279
|
if (!data.overview.ready || data.overview.totalEvents === 0) {
|
|
244
280
|
return { summary, stale: false, currentFingerprint: null };
|
|
245
281
|
}
|
|
246
|
-
const [{ settings }, profile] = await Promise.all([
|
|
282
|
+
const [{ settings }, profile, ignored] = await Promise.all([
|
|
247
283
|
resolveSettings(),
|
|
248
284
|
loadProjectProfile(),
|
|
285
|
+
loadIgnoredLosses(),
|
|
249
286
|
]);
|
|
250
287
|
// Staleness only needs the fingerprint — skip the targeted source read by
|
|
251
|
-
// computing it the same
|
|
252
|
-
|
|
253
|
-
const currentFingerprint =
|
|
288
|
+
// computing it from the same inputs composePrompt does, without collecting
|
|
289
|
+
// excerpts.
|
|
290
|
+
const currentFingerprint = fingerprintInputs(buildDigest(data, settings.context), profile, ignored);
|
|
254
291
|
return {
|
|
255
292
|
summary,
|
|
256
293
|
stale: summary !== null && summary.fingerprint !== currentFingerprint,
|
package/dist/ai/summary.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/ai/summary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAA6B,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/ai/summary.ts"],"names":[],"mappings":"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"}
|
package/dist/ai/types.d.ts
CHANGED
|
@@ -119,6 +119,37 @@ export interface PolishdLossItem {
|
|
|
119
119
|
issueUrl?: string;
|
|
120
120
|
issueNumber?: number;
|
|
121
121
|
}
|
|
122
|
+
/**
|
|
123
|
+
* A loss the owner dismissed — the opposite verdict to filing a bug. Kept out
|
|
124
|
+
* of every summary that renders afterwards, and replayed (with its reason, when
|
|
125
|
+
* one was given) into the prompt of every later model call so the same problem
|
|
126
|
+
* isn't reported again.
|
|
127
|
+
*/
|
|
128
|
+
export interface PolishdIgnoredLoss {
|
|
129
|
+
/** The problem as the model stated it, when it was dismissed. */
|
|
130
|
+
issue: string;
|
|
131
|
+
/** The citation this dismissal is keyed by. */
|
|
132
|
+
evidence: string;
|
|
133
|
+
/** Why it isn't a problem, in the owner's words. Optional. */
|
|
134
|
+
reason?: string;
|
|
135
|
+
/** When it was first dismissed, ms since epoch. */
|
|
136
|
+
ignoredAt: number;
|
|
137
|
+
}
|
|
138
|
+
/** Result of dismissing a loss. */
|
|
139
|
+
export type IgnoreLossResult = {
|
|
140
|
+
ok: true;
|
|
141
|
+
ignored: PolishdIgnoredLoss;
|
|
142
|
+
} | {
|
|
143
|
+
ok: false;
|
|
144
|
+
message: string;
|
|
145
|
+
};
|
|
146
|
+
/** Result of undoing a dismissal. */
|
|
147
|
+
export type UnignoreLossResult = {
|
|
148
|
+
ok: true;
|
|
149
|
+
} | {
|
|
150
|
+
ok: false;
|
|
151
|
+
message: string;
|
|
152
|
+
};
|
|
122
153
|
/** A generated narrative summary, cached in the store. */
|
|
123
154
|
export interface PolishdSummary {
|
|
124
155
|
/** The paragraph(s) of narrative. */
|
package/dist/ai/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/dashboard/summary.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/dashboard/summary.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EACV,uBAAuB,EAGvB,qBAAqB,EACrB,cAAc,EACf,MAAM,aAAa,CAAC;AAGrB,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,cAAc,GAAG,IAAI,CAAC;IACtC,eAAe,EAAE,uBAAuB,CAAC;IACzC,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAC7C,6EAA6E;IAC7E,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,qEAAqE;IACrE,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAClC,cAAc,EACd,eAAe,EACf,YAAY,EACZ,cAAc,EACd,WAAW,EACX,eAAe,GAChB,EAAE,gBAAgB,+BAmHlB"}
|
|
@@ -14,7 +14,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
14
14
|
* the server-side cadence refresh.
|
|
15
15
|
*/
|
|
16
16
|
import { useState, useTransition } from "react";
|
|
17
|
-
import { createIssueFromLossAction, generateSummaryAction } from "../ai/actions";
|
|
17
|
+
import { createIssueFromLossAction, generateSummaryAction, ignoreLossAction, unignoreLossAction, } from "../ai/actions";
|
|
18
18
|
import { TabLink } from "./chrome";
|
|
19
19
|
import { GearIcon, RefreshIcon, border, card, iconBtn, labelCls, primaryBtn, relTime } from "./ui";
|
|
20
20
|
export default function SummaryCard({ initialSummary, initialSettings, initialStale, initialProfile, initialGaps, sourceAvailable, }) {
|
|
@@ -38,7 +38,7 @@ export default function SummaryCard({ initialSummary, initialSettings, initialSt
|
|
|
38
38
|
};
|
|
39
39
|
const hasSummary = summary !== null;
|
|
40
40
|
const cadence = settings.refreshCadence ?? "manual";
|
|
41
|
-
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] }))] }), _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(TabLink, { tab: "settings", title: "Model, site context and GitHub settings", "aria-label": "Open settings", className: iconBtn, children: _jsx(GearIcon, {}) })] })] }), _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: "
|
|
41
|
+
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] }))] }), _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(TabLink, { tab: "settings", title: "Model, site context and GitHub settings", "aria-label": "Open settings", className: iconBtn, children: _jsx(GearIcon, {}) })] })] }), _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: "Something's changed 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
|
|
42
42
|
? "No summary yet — generate the story of how visitors are using this site from the signals below."
|
|
43
43
|
: "No model connected yet. Add a key in Settings and Polishd will read these numbers back to you in plain English." }), settings.hasApiKey ? (_jsx("button", { type: "button", onClick: () => generate(false), disabled: pending, className: primaryBtn, children: pending ? "Thinking…" : "Generate summary" })) : (_jsx(TabLink, { tab: "settings", className: primaryBtn, children: "Connect a model" }))] }))] }), _jsx(ProfileNudge, { profile: initialProfile, gaps: initialGaps, sourceAvailable: sourceAvailable })] }));
|
|
44
44
|
}
|
|
@@ -61,6 +61,9 @@ function ProfileNudge({ profile, gaps, sourceAvailable, }) {
|
|
|
61
61
|
return (_jsxs("div", { className: `flex flex-wrap items-center justify-between gap-2 border-t ${border} bg-[#080808] px-4 py-2.5 sm:px-5`, children: [_jsx("span", { className: "text-[11px] text-[#666]", children: message }), _jsxs(TabLink, { tab: "settings", className: "text-[11px] text-[#888] underline decoration-[#444] underline-offset-2 hover:text-white", children: [profile ? "Re-scan in Settings" : "Scan in Settings", " \u2192"] })] }));
|
|
62
62
|
}
|
|
63
63
|
// ── Wins & losses ────────────────────────────────────────────────────────────
|
|
64
|
+
/** The two verdicts on a loss sit side by side, and share their button style. */
|
|
65
|
+
const microBtn = "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";
|
|
66
|
+
const microLink = "text-[10px] text-[#666] underline decoration-[#333] underline-offset-2 transition-colors hover:text-[#ccc] disabled:cursor-not-allowed disabled:opacity-40";
|
|
64
67
|
/**
|
|
65
68
|
* One-click "loss → GitHub issue". The server action verifies the report
|
|
66
69
|
* against the repository's source first: confirmed reports become issues with
|
|
@@ -91,13 +94,70 @@ function FileBugButton({ loss }) {
|
|
|
91
94
|
else
|
|
92
95
|
setFailed({ notABug: res.error === "not-a-bug", message: res.message });
|
|
93
96
|
});
|
|
94
|
-
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:
|
|
97
|
+
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: microBtn, children: pending ? "Verifying…" : "File bug" }), failed && _jsx("span", { className: "text-[10px] text-red-400", children: failed.message })] }));
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* One loss, and the two things you can do with it: file it as a bug, or ignore
|
|
101
|
+
* it. Ignoring takes one click and no explanation — a reason is offered
|
|
102
|
+
* afterwards, because the fast path is "this isn't a problem, stop showing me
|
|
103
|
+
* it" and typing shouldn't be the toll for that. A reason is worth giving
|
|
104
|
+
* though: it's replayed to the model on every later summary, so "the second CTA
|
|
105
|
+
* is deliberate" stops the same finding coming back in different words.
|
|
106
|
+
*
|
|
107
|
+
* The dismissal is stored server-side immediately; the row stays put, struck
|
|
108
|
+
* through with an undo, and only disappears on the next render. Ignored losses
|
|
109
|
+
* never reappear — not from the cached summary, and not from a regenerate.
|
|
110
|
+
*/
|
|
111
|
+
function LossRow({ loss, githubConnected }) {
|
|
112
|
+
const [ignored, setIgnored] = useState(null);
|
|
113
|
+
const [editing, setEditing] = useState(false);
|
|
114
|
+
const [draft, setDraft] = useState("");
|
|
115
|
+
const [error, setError] = useState(null);
|
|
116
|
+
const [pending, startIgnore] = useTransition();
|
|
117
|
+
const ignore = (reason) => startIgnore(async () => {
|
|
118
|
+
setError(null);
|
|
119
|
+
const res = await ignoreLossAction({ issue: loss.issue, evidence: loss.evidence }, reason);
|
|
120
|
+
if (res.ok) {
|
|
121
|
+
setIgnored(res.ignored);
|
|
122
|
+
setEditing(false);
|
|
123
|
+
}
|
|
124
|
+
else
|
|
125
|
+
setError(res.message);
|
|
126
|
+
});
|
|
127
|
+
const undo = () => startIgnore(async () => {
|
|
128
|
+
setError(null);
|
|
129
|
+
const res = await unignoreLossAction(loss.evidence);
|
|
130
|
+
if (res.ok) {
|
|
131
|
+
setIgnored(null);
|
|
132
|
+
setEditing(false);
|
|
133
|
+
setDraft("");
|
|
134
|
+
}
|
|
135
|
+
else
|
|
136
|
+
setError(res.message);
|
|
137
|
+
});
|
|
138
|
+
if (ignored) {
|
|
139
|
+
return (_jsxs("li", { className: "flex gap-2 text-[13px] leading-snug text-[#666]", children: [_jsx("span", { className: "mt-px shrink-0 text-[#444]", children: "\u2715" }), _jsxs("span", { children: [_jsx("span", { className: "line-through decoration-[#3a3a3a]", children: loss.issue }), _jsxs("span", { className: "mt-0.5 flex flex-wrap items-center gap-1.5", children: [_jsxs("span", { className: "rounded bg-[#1a1a1a] px-1.5 py-0.5 text-[10px] text-[#777]", children: ["Ignored", ignored.reason ? ` — ${ignored.reason}` : ""] }), editing ? (_jsx(ReasonForm, { draft: draft, setDraft: setDraft, pending: pending, onSubmit: () => ignore(draft.trim() || undefined), onCancel: () => setEditing(false) })) : (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: () => {
|
|
140
|
+
setDraft(ignored.reason ?? "");
|
|
141
|
+
setEditing(true);
|
|
142
|
+
}, disabled: pending, title: "Tell the model why this isn't a problem \u2014 it reads this on every later summary", className: microLink, children: ignored.reason ? "Edit reason" : "Add a reason" }), _jsx("button", { type: "button", onClick: undo, disabled: pending, title: "Put this back \u2014 the model can report it again", className: microLink, children: pending ? "Undoing…" : "Undo" })] })), error && _jsx("span", { className: "text-[10px] text-red-400", children: error })] })] })] }));
|
|
143
|
+
}
|
|
144
|
+
return (_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: [loss.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: loss.evidence }), loss.location ? (_jsx("code", { className: "rounded bg-[#101c14] px-1.5 py-0.5 font-mono text-[10px] text-emerald-500", children: loss.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 || !!loss.issueUrl) && _jsx(FileBugButton, { loss: loss }), _jsx("button", { type: "button", onClick: () => ignore(), disabled: pending, title: "Not a problem \u2014 drop it from this summary and stop the model reporting it again", className: microBtn, children: pending ? "Ignoring…" : "Ignore" }), error && _jsx("span", { className: "text-[10px] text-red-400", children: error })] })] })] }));
|
|
145
|
+
}
|
|
146
|
+
/** The optional half of ignoring: why it isn't a problem, in the owner's words. */
|
|
147
|
+
function ReasonForm({ draft, setDraft, pending, onSubmit, onCancel, }) {
|
|
148
|
+
return (_jsxs("form", { onSubmit: (e) => {
|
|
149
|
+
e.preventDefault();
|
|
150
|
+
onSubmit();
|
|
151
|
+
}, className: "flex flex-wrap items-center gap-1.5", children: [_jsx("input", { autoFocus: true, value: draft, onChange: (e) => setDraft(e.target.value), onKeyDown: (e) => {
|
|
152
|
+
if (e.key === "Escape")
|
|
153
|
+
onCancel();
|
|
154
|
+
}, maxLength: 240, placeholder: "Why isn't this a problem?", "aria-label": "Reason for ignoring this loss", className: "w-56 rounded border border-[#2e2e2e] bg-[#0d0d0d] px-1.5 py-0.5 text-[10px] text-[#ddd] placeholder:text-[#555] focus:border-[#555] focus:outline-none" }), _jsx("button", { type: "submit", disabled: pending, className: microBtn, children: pending ? "Saving…" : "Save" }), _jsx("button", { type: "button", onClick: onCancel, disabled: pending, className: microLink, children: "Cancel" })] }));
|
|
95
155
|
}
|
|
96
156
|
function WinsLosses({ wins, losses, githubConnected, }) {
|
|
97
157
|
const hasWins = !!wins?.length;
|
|
98
158
|
const hasLosses = !!losses?.length;
|
|
99
159
|
if (!hasWins && !hasLosses)
|
|
100
160
|
return null;
|
|
101
|
-
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) => (
|
|
161
|
+
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) => (_jsx(LossRow, { loss: l, githubConnected: githubConnected }, l.evidence || i))) })] }))] }));
|
|
102
162
|
}
|
|
103
163
|
//# sourceMappingURL=summary.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/dashboard/summary.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEhD,OAAO,
|
|
1
|
+
{"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/dashboard/summary.tsx"],"names":[],"mappings":"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"}
|
package/dist/dashboard.css
CHANGED
|
@@ -712,6 +712,10 @@
|
|
|
712
712
|
width: calc(var(--spacing) * 40);
|
|
713
713
|
}
|
|
714
714
|
|
|
715
|
+
.polishd-root.polishd-root .w-56 {
|
|
716
|
+
width: calc(var(--spacing) * 56);
|
|
717
|
+
}
|
|
718
|
+
|
|
715
719
|
.polishd-root.polishd-root .w-64 {
|
|
716
720
|
width: calc(var(--spacing) * 64);
|
|
717
721
|
}
|
|
@@ -860,6 +864,10 @@
|
|
|
860
864
|
flex: none;
|
|
861
865
|
}
|
|
862
866
|
|
|
867
|
+
.polishd-root.polishd-root .shrink {
|
|
868
|
+
flex-shrink: 1;
|
|
869
|
+
}
|
|
870
|
+
|
|
863
871
|
.polishd-root.polishd-root .shrink-0 {
|
|
864
872
|
flex-shrink: 0;
|
|
865
873
|
}
|
|
@@ -1255,6 +1263,10 @@
|
|
|
1255
1263
|
background-color: oklab(21.479% -.0106614 -.037564 / .6);
|
|
1256
1264
|
}
|
|
1257
1265
|
|
|
1266
|
+
.polishd-root.polishd-root .bg-\[\#0d0d0d\] {
|
|
1267
|
+
background-color: #0d0d0d;
|
|
1268
|
+
}
|
|
1269
|
+
|
|
1258
1270
|
.polishd-root.polishd-root .bg-\[\#1a1a1a\] {
|
|
1259
1271
|
background-color: #1a1a1a;
|
|
1260
1272
|
}
|
|
@@ -2019,6 +2031,10 @@
|
|
|
2019
2031
|
color: #ccc;
|
|
2020
2032
|
}
|
|
2021
2033
|
|
|
2034
|
+
.polishd-root.polishd-root .text-\[\#ddd\] {
|
|
2035
|
+
color: #ddd;
|
|
2036
|
+
}
|
|
2037
|
+
|
|
2022
2038
|
.polishd-root.polishd-root .text-\[\#e4e4e4\] {
|
|
2023
2039
|
color: #e4e4e4;
|
|
2024
2040
|
}
|
|
@@ -2120,10 +2136,22 @@
|
|
|
2120
2136
|
font-variant-numeric: var(--tw-ordinal, ) var(--tw-slashed-zero, ) var(--tw-numeric-figure, ) var(--tw-numeric-spacing, ) var(--tw-numeric-fraction, );
|
|
2121
2137
|
}
|
|
2122
2138
|
|
|
2139
|
+
.polishd-root.polishd-root .line-through {
|
|
2140
|
+
text-decoration-line: line-through;
|
|
2141
|
+
}
|
|
2142
|
+
|
|
2123
2143
|
.polishd-root.polishd-root .underline {
|
|
2124
2144
|
text-decoration-line: underline;
|
|
2125
2145
|
}
|
|
2126
2146
|
|
|
2147
|
+
.polishd-root.polishd-root .decoration-\[\#3a3a3a\] {
|
|
2148
|
+
text-decoration-color: #3a3a3a;
|
|
2149
|
+
}
|
|
2150
|
+
|
|
2151
|
+
.polishd-root.polishd-root .decoration-\[\#333\] {
|
|
2152
|
+
text-decoration-color: #333;
|
|
2153
|
+
}
|
|
2154
|
+
|
|
2127
2155
|
.polishd-root.polishd-root .decoration-\[\#444\] {
|
|
2128
2156
|
text-decoration-color: #444;
|
|
2129
2157
|
}
|
|
@@ -2275,6 +2303,10 @@
|
|
|
2275
2303
|
color: #888;
|
|
2276
2304
|
}
|
|
2277
2305
|
|
|
2306
|
+
.polishd-root.polishd-root .hover\:text-\[\#ccc\]:hover {
|
|
2307
|
+
color: #ccc;
|
|
2308
|
+
}
|
|
2309
|
+
|
|
2278
2310
|
.polishd-root.polishd-root .hover\:text-emerald-400:hover {
|
|
2279
2311
|
color: var(--color-emerald-400);
|
|
2280
2312
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@polishd/next",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2-dev.0",
|
|
4
4
|
"description": "Drop-in product analytics for Next.js — capture real user behavioral signals (rage/dead clicks, scroll depth, errors, web vitals) and explore them on a built-in dashboard. What gets measured gets improved.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|