@shield-agent/kya 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/.mcp.json +1 -1
  2. package/README.md +10 -6
  3. package/amp/settings.example.json +1 -1
  4. package/assets/report-activity.png +0 -0
  5. package/assets/report-certify.png +0 -0
  6. package/assets/report-overview.png +0 -0
  7. package/claude/claude_desktop_config.example.json +1 -1
  8. package/cline/cline_mcp_settings.example.json +1 -1
  9. package/copilot/mcp-config.example.json +1 -1
  10. package/dist/cli.d.ts.map +1 -1
  11. package/dist/cli.js +3 -0
  12. package/dist/cli.js.map +1 -1
  13. package/dist/commands/hook.d.ts.map +1 -1
  14. package/dist/commands/hook.js +3 -1
  15. package/dist/commands/hook.js.map +1 -1
  16. package/dist/commands/wrap.d.ts.map +1 -1
  17. package/dist/commands/wrap.js +3 -1
  18. package/dist/commands/wrap.js.map +1 -1
  19. package/dist/mcp/protocol.d.ts.map +1 -1
  20. package/dist/mcp/protocol.js +5 -0
  21. package/dist/mcp/protocol.js.map +1 -1
  22. package/dist/receipt/changes.d.ts +47 -0
  23. package/dist/receipt/changes.d.ts.map +1 -0
  24. package/dist/receipt/changes.js +66 -0
  25. package/dist/receipt/changes.js.map +1 -0
  26. package/dist/receipt/dashboard.d.ts +1 -0
  27. package/dist/receipt/dashboard.d.ts.map +1 -1
  28. package/dist/receipt/dashboard.js +1 -1
  29. package/dist/receipt/dashboard.js.map +1 -1
  30. package/dist/receipt/receipt-css.d.ts +1 -1
  31. package/dist/receipt/receipt-css.d.ts.map +1 -1
  32. package/dist/receipt/receipt-css.js +57 -3
  33. package/dist/receipt/receipt-css.js.map +1 -1
  34. package/dist/receipt/render-receipt.d.ts.map +1 -1
  35. package/dist/receipt/render-receipt.js +151 -26
  36. package/dist/receipt/render-receipt.js.map +1 -1
  37. package/dist/trail-summary.d.ts +7 -0
  38. package/dist/trail-summary.d.ts.map +1 -1
  39. package/dist/trail-summary.js +14 -0
  40. package/dist/trail-summary.js.map +1 -1
  41. package/dist/trail.d.ts +2 -0
  42. package/dist/trail.d.ts.map +1 -1
  43. package/dist/trail.js +1 -0
  44. package/dist/trail.js.map +1 -1
  45. package/droid/README.md +1 -1
  46. package/droid/mcp.example.json +1 -1
  47. package/gemini/settings.example.json +1 -1
  48. package/grok/README.md +1 -1
  49. package/kilo/kilo.example.json +1 -1
  50. package/kimi/mcp.example.json +1 -1
  51. package/kiro/mcp.example.json +1 -1
  52. package/manifest.json +1 -1
  53. package/mastracode/mcp.example.json +1 -1
  54. package/mcp.json +1 -1
  55. package/openai/codex.config.example.toml +1 -1
  56. package/opencode/opencode.example.json +1 -1
  57. package/package.json +2 -2
  58. package/qwen/settings.example.json +1 -1
  59. package/server.json +2 -2
@@ -96,7 +96,7 @@ function computeActivity(events) {
96
96
  });
97
97
  return { granularity, buckets };
98
98
  }
99
- function worstOf(current, e) {
99
+ export function worstOf(current, e) {
100
100
  const rank = { never: 3, deny: 2, review: 1, allow: 0 };
101
101
  let next = "allow";
102
102
  if (isNever(e))
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/receipt/dashboard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/receipt/dashboard.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@
7
7
  * default and light rides on prefers-color-scheme, with translucency done via
8
8
  * color-mix so both schemes share one rule set.
9
9
  *
10
- * Tab switching is pure CSS: nav links point at #overview/#certify/
10
+ * Tab switching is pure CSS: nav links point at #overview/#changes/#certify/
11
11
  * #activity/#system and :target shows the matching zone. The hide rules are
12
12
  * gated behind
13
13
  * `@supports selector(body:has(*))`, so a browser without :has() simply shows
@@ -1 +1 @@
1
- {"version":3,"file":"receipt-css.d.ts","sourceRoot":"","sources":["../../src/receipt/receipt-css.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,UAAU,IAAI,MAAM,CA6gBnC"}
1
+ {"version":3,"file":"receipt-css.d.ts","sourceRoot":"","sources":["../../src/receipt/receipt-css.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAmkBnC"}
@@ -7,7 +7,7 @@
7
7
  * default and light rides on prefers-color-scheme, with translucency done via
8
8
  * color-mix so both schemes share one rule set.
9
9
  *
10
- * Tab switching is pure CSS: nav links point at #overview/#certify/
10
+ * Tab switching is pure CSS: nav links point at #overview/#changes/#certify/
11
11
  * #activity/#system and :target shows the matching zone. The hide rules are
12
12
  * gated behind
13
13
  * `@supports selector(body:has(*))`, so a browser without :has() simply shows
@@ -212,13 +212,15 @@ export function receiptCss() {
212
212
  .zone { scroll-margin-top: 6.4rem; }
213
213
  .zone-empty { margin: 0.25rem 0 0.5rem; }
214
214
  @supports selector(body:has(*)) {
215
- #activity, #certify, #system { display: none; }
216
- #overview:target, #activity:target, #certify:target, #system:target { display: block; }
215
+ #changes, #activity, #certify, #system { display: none; }
216
+ #overview:target, #changes:target, #activity:target, #certify:target, #system:target { display: block; }
217
+ body:has(#changes:target) #overview,
217
218
  body:has(#activity:target) #overview,
218
219
  body:has(#certify:target) #overview,
219
220
  body:has(#system:target) #overview { display: none; }
220
221
  body:not(:has(.zone:target)) .tab[href="#overview"],
221
222
  body:has(#overview:target) .tab[href="#overview"],
223
+ body:has(#changes:target) .tab[href="#changes"],
222
224
  body:has(#certify:target) .tab[href="#certify"],
223
225
  body:has(#activity:target) .tab[href="#activity"],
224
226
  body:has(#system:target) .tab[href="#system"] {
@@ -297,6 +299,26 @@ export function receiptCss() {
297
299
  .db-fill.warn { background: var(--warn); }
298
300
  .db-fill.bad { background: var(--bad); }
299
301
  .db-num { text-align: right; color: var(--fg); }
302
+ /* Session rollup row as a filter toggle: db-item's hover/active contract
303
+ on the flex layout the Sessions panel already uses. */
304
+ .sess-item {
305
+ display: flex; flex-wrap: wrap; align-items: baseline; gap: 0.45rem;
306
+ width: 100%; min-width: 0;
307
+ font-family: inherit; font-size: inherit; text-align: left;
308
+ color: inherit; background: transparent;
309
+ border: 1px solid transparent; border-radius: 8px;
310
+ padding: 0.14rem 0.3rem; cursor: pointer;
311
+ appearance: none; -webkit-appearance: none;
312
+ }
313
+ .sess-item:hover {
314
+ border-color: var(--line);
315
+ background: color-mix(in srgb, var(--bg) 55%, var(--card));
316
+ }
317
+ .sess-item[aria-pressed="true"] {
318
+ color: var(--fg);
319
+ border-color: color-mix(in srgb, var(--ok) 55%, var(--line));
320
+ background: color-mix(in srgb, var(--ok) 12%, var(--card));
321
+ }
300
322
  /* Vertical mini-bar timeline (not clickable — no time filter exists). */
301
323
  .db-tl { display: flex; align-items: stretch; gap: 2px; height: 4.6rem; }
302
324
  .db-tl .col {
@@ -519,6 +541,38 @@ export function receiptCss() {
519
541
  word-break: break-word;
520
542
  color: var(--fg);
521
543
  }
544
+ /* Changes tab: session → file groups in the same .feed card as the
545
+ activity feed; entries reuse the feed's .top/.verdict/.tool/.when/diff. */
546
+ .chg-sess-head {
547
+ display: flex; flex-wrap: wrap; align-items: baseline; gap: 0.45rem;
548
+ padding: 0.55rem 0.9rem 0.35rem;
549
+ background: color-mix(in srgb, var(--bg) 55%, var(--card));
550
+ border-bottom: 1px solid var(--line);
551
+ }
552
+ .chg-sess-head .sid {
553
+ font-family: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
554
+ font-size: 0.78rem; font-weight: 650; word-break: break-all;
555
+ }
556
+ .chg-sess-head .cnt { color: var(--mute); font-size: 0.76rem; }
557
+ .chg-sess-head .rel {
558
+ margin-left: auto; color: var(--mute); font-size: 0.74rem; white-space: nowrap;
559
+ }
560
+ .chg-file { border-bottom: 1px solid var(--line); padding: 0.45rem 0.9rem 0.6rem; }
561
+ .chg-session:last-child .chg-file:last-child { border-bottom: none; }
562
+ .chg-file-head {
563
+ display: flex; flex-wrap: wrap; align-items: baseline; gap: 0.45rem;
564
+ }
565
+ .chg-file-head .path {
566
+ font-family: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
567
+ font-size: 0.8rem; font-weight: 650; word-break: break-all;
568
+ }
569
+ .chg-file-head .cnt { color: var(--mute); font-size: 0.74rem; white-space: nowrap; }
570
+ .chg-file-head .pill { margin-left: auto; }
571
+ .chg-entry { padding: 0.4rem 0 0.2rem; min-width: 0; }
572
+ .chg-entry.never { background: color-mix(in srgb, var(--bad) 7%, transparent); }
573
+ .chg-entry.ok .verdict { color: var(--ok); }
574
+ .chg-entry.bad .verdict { color: var(--bad); }
575
+ .chg-entry.warn .verdict { color: var(--warn); }
522
576
  .meta {
523
577
  margin-top: 0.18rem; color: var(--mute); font-size: 0.76rem;
524
578
  display: flex; flex-wrap: wrap; gap: 0.25rem; align-items: baseline;
@@ -1 +1 @@
1
- {"version":3,"file":"receipt-css.js","sourceRoot":"","sources":["../../src/receipt/receipt-css.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA2gBL,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"receipt-css.js","sourceRoot":"","sources":["../../src/receipt/receipt-css.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAikBL,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"render-receipt.d.ts","sourceRoot":"","sources":["../../src/receipt/render-receipt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"render-receipt.d.ts","sourceRoot":"","sources":["../../src/receipt/render-receipt.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,7 @@ import { productLabel, readTrail, readTrailSince } from "../trail.js";
8
8
  import { loadCertifyCard, loadIdentity, loadOrrCard, loadSandboxes, loadShowbackCard, loadWiredHosts, } from "./enrich.js";
9
9
  import { SHOWBACK_DISCLAIMER, } from "../showback/cost-per-task.js";
10
10
  import { computeDashboard } from "./dashboard.js";
11
+ import { buildChangesModel } from "./changes.js";
11
12
  import { receiptCss } from "./receipt-css.js";
12
13
  function esc(s) {
13
14
  return stripEscapes(s)
@@ -298,6 +299,7 @@ function renderFeed(events, nowMs, live) {
298
299
  ` data-plane="${esc(e.host?.trim() || "unknown")}"` +
299
300
  ` data-product="${esc(e.product ?? "other")}"` +
300
301
  ` data-tool="${esc(clip(e.toolId, 60))}"` +
302
+ ` data-session="${esc(e.sessionId || "unknown")}"` +
301
303
  (project ? ` data-project="${esc(project)}"` : "");
302
304
  parts.push(`<article class="ev ${t}${never ? " never" : ""}" ${dataAttrs}>
303
305
  <div class="rail" aria-hidden="true"><span class="tick"></span></div>
@@ -319,6 +321,69 @@ function renderFeed(events, nowMs, live) {
319
321
  }
320
322
  return parts.join("\n");
321
323
  }
324
+ /** Worst-change pill tone, reusing the pill palette: allow ok, review amber, deny/never red. */
325
+ function changeWorstPill(worst) {
326
+ const cls = worst === "allow" ? "ok" : worst === "review" ? "orr-amber" : "orr-red";
327
+ return `<span class="pill ${cls}">${worst}</span>`;
328
+ }
329
+ /**
330
+ * Changes tab body: session → file → chronological entries, each entry
331
+ * carrying the same clipped preview the feed renders. Entries are stamped
332
+ * with the full filter facet set (like feed articles) so the chip engine
333
+ * filters them; file/session groups are collapsed client-side when every
334
+ * entry inside is filtered out.
335
+ */
336
+ function changesPanel(changes, nowMs) {
337
+ if (changes.sessions.length === 0) {
338
+ return `<p class="empty">No recorded changes yet — write/edit tool calls will show up here.</p>`;
339
+ }
340
+ return changes.sessions
341
+ .map((s) => {
342
+ const files = s.files
343
+ .map((f) => {
344
+ const entries = f.entries
345
+ .map((e) => {
346
+ const t = tone(e.verdict);
347
+ const project = e.project?.trim();
348
+ const dataAttrs = `data-verdict="${esc(e.verdict.toUpperCase())}"` +
349
+ (e.never ? ` data-never="1"` : "") +
350
+ ` data-mode="${esc(e.mode)}"` +
351
+ ` data-plane="${esc(e.host?.trim() || "unknown")}"` +
352
+ ` data-product="${esc(e.product ?? "other")}"` +
353
+ ` data-tool="${esc(clip(e.toolId, 60))}"` +
354
+ ` data-session="${esc(s.sessionId)}"` +
355
+ (project ? ` data-project="${esc(project)}"` : "");
356
+ return ` <div class="chg-entry ${t}${e.never ? " never" : ""}" ${dataAttrs}>
357
+ <div class="top">
358
+ <span class="verdict">${esc(verdictWord(e.verdict))}</span>${modeBadge(e.mode)}
359
+ <code class="tool">${esc(e.toolId)}</code>
360
+ <time class="when" datetime="${esc(e.ts)}" title="${esc(e.ts)}">${esc(clock(e.ts))} <span class="rel">${esc(relativeTime(e.ts, nowMs))}</span></time>
361
+ </div>
362
+ <details class="diff"><summary>Change preview</summary><pre>${esc(e.preview)}</pre></details>
363
+ </div>`;
364
+ })
365
+ .join("\n");
366
+ return ` <div class="chg-file">
367
+ <div class="chg-file-head">
368
+ <code class="path" title="${esc(f.path)}">${esc(clip(f.path, 80))}</code>
369
+ <span class="cnt">${f.writes} write${f.writes === 1 ? "" : "s"}</span>
370
+ ${changeWorstPill(f.worst)}
371
+ </div>
372
+ ${entries}
373
+ </div>`;
374
+ })
375
+ .join("\n");
376
+ return ` <div class="chg-session">
377
+ <div class="chg-sess-head">
378
+ <code class="sid" title="${esc(s.sessionId)}">${esc(clip(s.sessionId, 24))}</code>
379
+ <span class="cnt">${s.fileCount} file${s.fileCount === 1 ? "" : "s"} · ${s.changeCount} change${s.changeCount === 1 ? "" : "s"}</span>
380
+ <span class="rel">${esc(relativeTime(s.lastTs, nowMs))}</span>
381
+ </div>
382
+ ${files}
383
+ </div>`;
384
+ })
385
+ .join("\n");
386
+ }
322
387
  function identityLine(identity) {
323
388
  if (!identity)
324
389
  return "";
@@ -351,16 +416,28 @@ function statChips(agg) {
351
416
  projects: countRowChips(agg.projects, "Projects", "project"),
352
417
  };
353
418
  }
354
- function sessionsPanel(agg, nowMs) {
419
+ function sessionsPanel(agg, nowMs, changes) {
355
420
  if (agg.sessions.length === 0)
356
421
  return "";
422
+ const filesBySession = new Map(changes.sessions.map((s) => [s.sessionId, s.fileCount]));
423
+ // Rows are filter toggles on the same data-fgroup/data-fvalue contract as
424
+ // the header chips and dashboard rows (see statChips).
357
425
  const rows = agg.sessions
358
- .map((s) => `<li>
359
- <span class="wdot ${s.worst}" title="worst verdict: ${s.worst}"></span>
360
- <code class="sid" title="${esc(s.sessionId)}">${esc(clip(s.sessionId, 24))}</code>
361
- <span class="cnt">${s.events} event${s.events === 1 ? "" : "s"}</span>
362
- <span class="rel">${esc(relativeTime(s.lastTs, nowMs))}</span>
363
- </li>`)
426
+ .map((s) => {
427
+ const files = filesBySession.get(s.sessionId) ?? 0;
428
+ const filesMeta = files > 0
429
+ ? `<span class="cnt">${files} file${files === 1 ? "" : "s"} changed</span>`
430
+ : "";
431
+ return `<li>
432
+ <button type="button" class="sess-item" data-fgroup="session" data-fvalue="${esc(s.sessionId)}" aria-pressed="false" title="Filter: session ${esc(clip(s.sessionId, 24))}">
433
+ <span class="wdot ${s.worst}" title="worst verdict: ${s.worst}"></span>
434
+ <code class="sid" title="${esc(s.sessionId)}">${esc(clip(s.sessionId, 24))}</code>
435
+ <span class="cnt">${s.events} event${s.events === 1 ? "" : "s"}</span>
436
+ ${filesMeta}
437
+ <span class="rel">${esc(relativeTime(s.lastTs, nowMs))}</span>
438
+ </button>
439
+ </li>`;
440
+ })
364
441
  .join("\n");
365
442
  return `<section class="panel" aria-label="Sessions">
366
443
  <h2>Sessions</h2>
@@ -751,20 +828,29 @@ ${topRuns
751
828
  <p class="mute small">${esc(SHOWBACK_DISCLAIMER)}</p>
752
829
  </section>`;
753
830
  }
754
- export function renderReceiptHtml(model) {
755
- const nowMs = Date.now();
756
- const events = [...model.events].map((e) => ({
831
+ /**
832
+ * Defensive normalization for untrusted trail fields before rendering.
833
+ * clip() flattens newlines (single-line contexts: code spans, headers);
834
+ * diffPreview keeps them via clipMultiline so <pre>/fenced diffs survive.
835
+ */
836
+ function normalizeTrailEvents(events) {
837
+ return events.map((e) => ({
757
838
  ...e,
758
839
  toolId: clip(e.toolId, 160),
759
840
  reasonCode: clip(e.reasonCode, 80),
760
841
  summary: e.summary ? clip(e.summary, 120) : undefined,
761
- // Preserve newlines — dash clip() flattens them and breaks <pre> diffs.
762
842
  diffPreview: e.diffPreview ? clipMultiline(e.diffPreview, DIFF_MAX_TOTAL_CHARS) : undefined,
843
+ targetPath: e.targetPath ? clip(e.targetPath, 80) : undefined,
763
844
  }));
845
+ }
846
+ export function renderReceiptHtml(model) {
847
+ const nowMs = Date.now();
848
+ const events = normalizeTrailEvents(model.events);
764
849
  const c = countVerdicts(events);
765
850
  const agg = aggregateEvents(events);
766
851
  const chips = statChips(agg);
767
852
  const dashboard = computeDashboard(events);
853
+ const changes = buildChangesModel(events);
768
854
  const blocked = events.filter((e) => e.neverEvent || e.reasonCode === "NEVER_EVENT");
769
855
  const tools = model.mcpSeen && model.mcpSeen.length > 0
770
856
  ? model.mcpSeen.map((m) => m.toolId)
@@ -803,16 +889,17 @@ export function renderReceiptHtml(model) {
803
889
  // this script. KNOWN is space-delimited so `indexOf(' '+g+' ')` doubles as a
804
890
  // prototype-safe whitelist ('constructor' etc. never match).
805
891
  // Filter state persists in the ?f= QUERY param, not the hash: the hash is
806
- // owned by the pure-CSS :target tabs (#overview/#certify/#activity/#system), so a
807
- // hash-based filter would hide the Activity zone on every chip toggle and
808
- // every tab click would wipe the filter. Legacy #f= hashes are still parsed
809
- // on load (read-only); the next save writes the ?f= form and drops the
810
- // legacy fragment.
892
+ // owned by the pure-CSS :target tabs (#overview/#changes/#certify/#activity/
893
+ // #system), so a hash-based filter would hide the Activity zone on every
894
+ // chip toggle and every tab click would wipe the filter. Legacy #f= hashes
895
+ // are still parsed on load (read-only); the next save writes the ?f= form
896
+ // and drops the legacy fragment.
811
897
  const filterScript = `<script id="kya-filters">
812
898
  (function(){
813
899
  var feed = document.getElementById('feed');
814
900
  if (!feed) return;
815
- var KNOWN = ' verdict never mode plane product project tool ';
901
+ var chg = document.getElementById('changes-list');
902
+ var KNOWN = ' verdict never mode plane product project tool session ';
816
903
  var state = Object.create(null);
817
904
  var clearBtn = document.getElementById('clear-filters');
818
905
  var chips = document.querySelectorAll('[data-fgroup]');
@@ -867,17 +954,19 @@ export function renderReceiptHtml(model) {
867
954
  function active(){
868
955
  return Object.keys(state).some(function(g){ return Object.keys(state[g]).length > 0; });
869
956
  }
957
+ // AND across groups, OR within a group; an unstamped facet never matches.
958
+ function rowVisible(row, on){
959
+ if (!on) return true;
960
+ for (var g in state) {
961
+ var val = row.getAttribute('data-' + g);
962
+ if (val === null || !state[g][val]) return false;
963
+ }
964
+ return true;
965
+ }
870
966
  function apply(){
871
967
  var on = active();
872
968
  feed.querySelectorAll('.ev').forEach(function(row){
873
- var show = true;
874
- if (on) {
875
- for (var g in state) {
876
- var val = row.getAttribute('data-' + g);
877
- if (val === null || !state[g][val]) { show = false; break; }
878
- }
879
- }
880
- row.classList.toggle('filtered-out', !show);
969
+ row.classList.toggle('filtered-out', !rowVisible(row, on));
881
970
  });
882
971
  var day = null, dayHasRows = false;
883
972
  function flush(){ if (day) day.classList.toggle('filtered-out', on && !dayHasRows); }
@@ -887,6 +976,17 @@ export function renderReceiptHtml(model) {
887
976
  else if (el.classList.contains('ev') && !el.classList.contains('filtered-out')) dayHasRows = true;
888
977
  }
889
978
  flush();
979
+ // Changes tab: entries filter individually; file/session groups collapse
980
+ // when no entry inside survives.
981
+ if (chg) {
982
+ chg.querySelectorAll('.chg-entry').forEach(function(row){
983
+ row.classList.toggle('filtered-out', !rowVisible(row, on));
984
+ });
985
+ chg.querySelectorAll('.chg-file, .chg-session').forEach(function(group){
986
+ var vis = group.querySelectorAll('.chg-entry:not(.filtered-out)').length > 0;
987
+ group.classList.toggle('filtered-out', on && !vis);
988
+ });
989
+ }
890
990
  chips.forEach(function(chip){
891
991
  var pressed = !!(state[chip.dataset.fgroup] && state[chip.dataset.fgroup][chip.dataset.fvalue]);
892
992
  chip.setAttribute('aria-pressed', pressed ? 'true' : 'false');
@@ -914,7 +1014,7 @@ export function renderReceiptHtml(model) {
914
1014
  const zoneBody = (parts, empty) => parts.some((p) => p.length > 0)
915
1015
  ? parts.filter(Boolean).join("\n ")
916
1016
  : `<p class="mute small zone-empty">${empty}</p>`;
917
- const overviewBody = zoneBody([dashboardPanel(dashboard), sessionsPanel(agg, nowMs), reasonsPanel(agg)], "No activity in this window yet — analytics appear once events land.");
1017
+ const overviewBody = zoneBody([dashboardPanel(dashboard), sessionsPanel(agg, nowMs, changes), reasonsPanel(agg)], "No activity in this window yet — analytics appear once events land.");
918
1018
  const certifyBody = zoneBody([model.certify ? certifyDetailPanel(model.certify.requirements) : ""], "No live evaluation yet — wrap tool calls and run kya certify to build the baseline.");
919
1019
  const systemBody = zoneBody([
920
1020
  wiredHostsPanel(model.wiredHosts),
@@ -942,6 +1042,7 @@ export function renderReceiptHtml(model) {
942
1042
  </header>
943
1043
  <nav class="tabs" aria-label="Report sections">
944
1044
  <a class="tab" id="tab-overview" href="#overview">Overview</a>
1045
+ <a class="tab" id="tab-changes" href="#changes">Changes</a>
945
1046
  <a class="tab" id="tab-certify" href="#certify">Certify</a>
946
1047
  <a class="tab" id="tab-activity" href="#activity">Activity</a>
947
1048
  <a class="tab" id="tab-system" href="#system">System</a>
@@ -957,6 +1058,11 @@ export function renderReceiptHtml(model) {
957
1058
  <section class="zone" id="overview" aria-labelledby="tab-overview">
958
1059
  ${overviewBody}
959
1060
  </section>
1061
+ <section class="zone" id="changes" aria-labelledby="tab-changes">
1062
+ <section class="feed chg" id="changes-list" aria-label="Changes by session and file">
1063
+ ${changesPanel(changes, nowMs)}
1064
+ </section>
1065
+ </section>
960
1066
  <section class="zone" id="certify" aria-labelledby="tab-certify">
961
1067
  ${certifyBody}
962
1068
  </section>
@@ -1087,6 +1193,25 @@ export function renderReceiptMarkdown(model) {
1087
1193
  const fence = mdFence(diff);
1088
1194
  return [head, "", fence, diff, fence, ""];
1089
1195
  }), "");
1196
+ // Same normalization as the HTML path: targetPath flows into single-line
1197
+ // `#### ` code-span headers, so embedded newlines must be flattened first.
1198
+ const changes = buildChangesModel(normalizeTrailEvents(model.events));
1199
+ if (changes.sessions.length > 0) {
1200
+ lines.push("## Changes", "");
1201
+ for (const s of changes.sessions) {
1202
+ lines.push(`### \`${mdInline(s.sessionId)}\` — ${s.fileCount} file${s.fileCount === 1 ? "" : "s"}, ${s.changeCount} change${s.changeCount === 1 ? "" : "s"}, last ${relativeTime(s.lastTs, nowMs)}`, "");
1203
+ for (const f of s.files) {
1204
+ lines.push(`#### \`${mdInline(f.path)}\` — ${f.writes} write${f.writes === 1 ? "" : "s"}, worst: ${f.worst}`, "");
1205
+ for (const e of f.entries) {
1206
+ // Same fencing contract as the md feed: verbatim content, tilde
1207
+ // fence one longer than the longest run inside.
1208
+ const diff = stripEscapes(e.preview);
1209
+ const fence = mdFence(diff);
1210
+ lines.push(`- **${mdText(verdictWord(e.verdict))}** \`${mdInline(e.toolId)}\` — ${mdText(e.ts)}`, "", fence, diff, fence, "");
1211
+ }
1212
+ }
1213
+ }
1214
+ }
1090
1215
  if (agg.sessions.length > 0) {
1091
1216
  lines.push("## Sessions", ...agg.sessions.map((s) => `- \`${mdInline(s.sessionId)}\` — ${s.events} event${s.events === 1 ? "" : "s"}, worst: ${s.worst}, last ${relativeTime(s.lastTs, nowMs)}`), "");
1092
1217
  }