shadok-ai 0.14.11 → 0.14.13

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/README.md CHANGED
@@ -174,6 +174,12 @@ Enter to skip; you can add it later from the web UI).
174
174
  otherwise just print a local path you cannot open. **Artifacts are denied**
175
175
  cockpit-wide for the same reason — a page on claude.ai is not the file you
176
176
  asked for (`SHADOK_ALLOW_ARTIFACTS=1` lifts it).
177
+ - **Compaction summaries, folded away** — when Claude Code runs out of context
178
+ it compacts the conversation and writes a long "This session is being
179
+ continued…" summary as the first message of what follows. Shown in full it
180
+ buried the chat, so the cockpit folds it into a collapsible **Context summary**
181
+ box: collapsed by default, one click to read it, capped and scrolling even when
182
+ open. It is still real history — just out of the way.
177
183
  - **Diff panel** — what an agent actually changed, against its base.
178
184
  - **What an agent left running, on its tab** — a turning ⏳ for background
179
185
  shells, a still 👁 for monitors, each with its count past one. Claude Code
package/dist/extract.d.ts CHANGED
@@ -90,6 +90,14 @@ export interface HistoryTurn {
90
90
  */
91
91
  from?: string;
92
92
  origin?: string;
93
+ /**
94
+ * A compaction summary: the long "This session is being continued…" block
95
+ * Claude Code writes as a USER message when it compacts the conversation
96
+ * (`isCompactSummary` on the .jsonl line). It is real transcript content, so
97
+ * it must survive a reload — but it is huge and drowns the chat, so the client
98
+ * folds it into a collapsible box instead of a full-width bubble.
99
+ */
100
+ compaction?: true;
93
101
  }
94
102
  /**
95
103
  * The .jsonl a session was written to (`~/.claude/projects/<encoded cwd>/<id>`),
package/dist/extract.js CHANGED
@@ -263,6 +263,14 @@ export function loadHistory(cwd, sessionId) {
263
263
  const text = userPromptText(e);
264
264
  if (text === null)
265
265
  continue; // tool result, system reminder, interruption
266
+ // A compaction summary is a (large) USER message Claude Code writes itself
267
+ // on /compact or an auto-compaction. Keep it — it is real history — but
268
+ // flag it so the client can fold it away instead of flooding the chat.
269
+ if (e.isCompactSummary) {
270
+ turns.push({ role: "user", text, compaction: true, ...when });
271
+ pendingHiddenPrompt = false;
272
+ continue;
273
+ }
266
274
  // A pushed ledger delta may ride ahead of ANY prompt — human, cron, or an
267
275
  // agent notification — so strip it BEFORE classifying: otherwise a cron /
268
276
  // agent prompt no longer starts with its hiding mark and would leak into
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,MAAc;IAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;IACf,0EAA0E;IAC1E,oEAAoE;IACpE,2BAA2B;IAC3B,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1D,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,MAAM;QACR,CAAC;IACH,CAAC;IACD,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvC,qEAAqE;IACrE,oDAAoD;IACpD,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3B,KAAK,GAAG,CAAC,CAAC;YACV,MAAM;QACR,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/E,iEAAiE;IACjE,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;IACvB,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACpC,GAAG,GAAG,CAAC,CAAC;YACR,MAAM;QACR,CAAC;IACH,CAAC;IACD,OAAO,KAAK;SACT,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC;SACjB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SACxB,IAAI,CAAC,IAAI,CAAC;SACV,IAAI,EAAE,CAAC;AACZ,CAAC;AAqBD;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS,CAAC,CAAY;IACpC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACrF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,CAAY;IAChD,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AACnG,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,GAAG,uBAAuB,CAAC;AAE3C;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,6EAA6E;IAC7E,2EAA2E;IAC3E,qEAAqE;IACrE,MAAM,KAAK,GAAG,MAAM;SACjB,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;IAChF,MAAM,QAAQ,GAAG,iDAAiD,CAAC;IAanE,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,IAAI,KAAK,GAAiB,IAAI,CAAC;IAC/B,IAAI,OAAO,GAA2B,IAAI,CAAC;IAE3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,uEAAuE;QACvE,uEAAuE;QACvE,6EAA6E;QAC7E,wEAAwE;QACxE,0EAA0E;QAC1E,yEAAyE;QACzE,sDAAsD;QACtD,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC3B,OAAO,GAAG,IAAI,CAAC;YACf,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,EAAE,CAAC;YACN,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,KAAK,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;gBACxE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;YACD,OAAO,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;YAC5D,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAE,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;YACnC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;gBACvB,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;gBACnB,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;YACjC,CAAC;YACD,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;aAAM,IACL,OAAO;YACP,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1B,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5B,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAChC,CAAC;YACD,2DAA2D;YAC3D,OAAO,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5E,CAAC;aAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,yEAAyE;YACzE,iDAAiD;YACjD,OAAO,GAAG,IAAI,CAAC;YACf,KAAK,GAAG,IAAI,CAAC;QACf,CAAC;IACH,CAAC;IAED,+EAA+E;IAC/E,8EAA8E;IAC9E,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAChE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACtD,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC;IAE9D,sEAAsE;IACtE,0DAA0D;IAC1D,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,eAAe,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAChE,IAAI,aAAa,CAAC,MAAM;gBAAE,MAAM;YAChC,SAAS;QACX,CAAC;QACD,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC/D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,CAAM;IACnC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IACnE,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IAC5B,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,IAAI,GAAG,CAAC,CAAC;SAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACvB,IAAI,GAAG,CAAC;aACL,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;aACrC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aACvB,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACnB,uEAAuE;IACvE,0EAA0E;IAC1E,0EAA0E;IAC1E,6EAA6E;IAC7E,6EAA6E;IAC7E,8EAA8E;IAC9E,6EAA6E;IAC7E,kEAAkE;IAClE,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1F,OAAO,IAAI,CAAC;AACd,CAAC;AAsCD;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,SAAiB;IAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;IAChE,OAAO,oBAAoB,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAC;AAC1H,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,SAAiB;IACxD,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAChD,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,wEAAwE;IACxE,8EAA8E;IAC9E,4EAA4E;IAC5E,sEAAsE;IACtE,IAAI,mBAAmB,GAAG,KAAK,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,SAAS;QAC3B,IAAI,CAAM,CAAC;QACX,IAAI,CAAC;YACH,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO;YAAE,SAAS;QACrC,MAAM,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;QACvC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACtB,yEAAyE;YACzE,wEAAwE;YACxE,kDAAkD;YAClD,MAAM,IAAI,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;YAClE,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACrC,IAAI,QAAQ,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBAC3E,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;oBAC1B,IAAI,IAAI,CAAC,OAAO;wBAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;gBACxC,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;gBAC3D,CAAC;gBACD,mBAAmB,GAAG,KAAK,CAAC;gBAC5B,SAAS;YACX,CAAC;YACD,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,IAAI,KAAK,IAAI;gBAAE,SAAS,CAAC,6CAA6C;YAC1E,0EAA0E;YAC1E,0EAA0E;YAC1E,yEAAyE;YACzE,eAAe;YACf,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACpC,uEAAuE;YACvE,0EAA0E;YAC1E,yEAAyE;YACzE,qEAAqE;YACrE,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9C,mBAAmB,GAAG,IAAI,CAAC;gBAC3B,SAAS;YACX,CAAC;YACD,0EAA0E;YAC1E,0EAA0E;YAC1E,wEAAwE;YACxE,yCAAyC;YACzC,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,eAAe,CAAC,IAAI,CAAC;gBAC3B,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpD,GAAG,IAAI;aACR,CAAC,CAAC;YACH,mBAAmB,GAAG,KAAK,CAAC;QAC9B,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACtE,0EAA0E;YAC1E,uEAAuE;YACvE,4EAA4E;YAC5E,0CAA0C;YAC1C,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBAClC,IAAI,CAAC,EAAE,IAAI,KAAK,UAAU;oBAAE,SAAS;gBACrC,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACvD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;oBAAC,mBAAmB,GAAG,KAAK,CAAC;gBAAC,CAAC;YAC5G,CAAC;YACD,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO;iBAC3B,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;iBACrC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBACxB,iEAAiE;gBACjE,2DAA2D;iBAC1D,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;iBAChE,IAAI,CAAC,IAAI,CAAC;iBACV,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACrC,yEAAyE;YACzE,yEAAyE;YACzE,0EAA0E;YAC1E,8DAA8D;YAC9D,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,mBAAmB;gBAAE,IAAI,CAAC,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC;;gBACrF,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;YAC/G,mBAAmB,GAAG,KAAK,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAUD;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;IAChE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IACpE,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC/B,IAAI,KAAa,CAAC;QAClB,IAAI,CAAC;YACH,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC;YACZ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;YAC7B,KAAK;YACL,OAAO,EAAE,eAAe,CAAC,IAAI,CAAC;SAC/B,CAAC,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AACpD,CAAC;AAED,kFAAkF;AAClF,SAAS,eAAe,CAAC,IAAY;IACnC,uEAAuE;IACvE,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;YACrC,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACjD,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACpC,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,SAAS;QAC3B,IAAI,CAAM,CAAC;QACX,IAAI,CAAC;YACH,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,IAAI,KAAK,IAAI;YAAE,SAAS;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,SAAiB;IACzD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;IAChE,MAAM,IAAI,GACR,oBAAoB,CAAC,SAAS,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAC;IAChF,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,yEAAyE;IACzE,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YAAE,SAAS;QAC/B,IAAI,CAAM,CAAC;QACX,IAAI,CAAC;YACH,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI;YAAE,SAAS;QACzC,OAAO,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC;AAEnD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAa,EACb,QAAuB,EACvB,QAAQ,GAAG,mBAAmB;IAE9B,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACpC,IAAI,QAAQ,GAAG,KAAK;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,KAAK,GAAG,QAAQ,GAAG,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;IAChE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IACpE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,EAAE;aACd,WAAW,CAAC,GAAG,CAAC;aAChB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;aACnC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;aAClE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shadok-ai",
3
- "version": "0.14.11",
3
+ "version": "0.14.13",
4
4
  "main": "dist/session.js",
5
5
  "scripts": {
6
6
  "test": "node --import tsx --test test/*.ts context/*/test/*.test.mjs",
package/public/index.html CHANGED
@@ -1070,6 +1070,34 @@
1070
1070
  font-style: italic;
1071
1071
  padding: 2px 0;
1072
1072
  }
1073
+ /* ── Compaction summary ──────────────────────────────────
1074
+ Claude Code's "This session is being continued…" block, folded away so it
1075
+ doesn't bury the chat. Collapsed by default; even expanded it is capped and
1076
+ scrolls, so a 14 KB summary can never take over the thread. */
1077
+ .turn.compaction { max-width: 92%; }
1078
+ .compaction-box {
1079
+ border: 1px dashed var(--line); border-radius: 8px;
1080
+ background: var(--bg-inset); overflow: hidden;
1081
+ }
1082
+ .compaction-sum {
1083
+ cursor: pointer; list-style: none; user-select: none;
1084
+ display: flex; align-items: center; gap: 8px;
1085
+ padding: 7px 10px; font-size: 12.5px; color: var(--text-dim);
1086
+ }
1087
+ .compaction-sum::-webkit-details-marker { display: none; }
1088
+ .compaction-sum::before {
1089
+ content: "▸"; color: var(--amber); font-size: 11px; transition: transform 0.12s;
1090
+ }
1091
+ .compaction-box[open] > .compaction-sum::before { transform: rotate(90deg); }
1092
+ .compaction-sum:hover { color: var(--amber); }
1093
+ .compaction-sum .time { margin-left: auto; font-style: normal; }
1094
+ .compaction-body {
1095
+ border-top: 1px solid var(--line);
1096
+ max-height: 340px; overflow-y: auto;
1097
+ margin: 0; border-radius: 0;
1098
+ font-size: 13px;
1099
+ }
1100
+ .compaction-body.md { padding: 8px 10px; }
1073
1101
  /* ── Activity block ──────────────────────────────────────
1074
1102
  A run of tool calls between two pieces of assistant text. Folds at three
1075
1103
  levels — output, same-tool run, whole block — each driven by data-folded.
@@ -1693,7 +1721,37 @@
1693
1721
  #ledgerList .ldg-kind { font-size: 10px; text-transform: uppercase; letter-spacing: .04em; opacity: .55;
1694
1722
  border: 1px solid currentColor; border-radius: 3px; padding: 0 4px; }
1695
1723
  #ledgerList .ldg-meta { color: var(--text-dim); font-size: 10px; margin-top: 2px; }
1696
- #ledgerList .ldg-note { font-size: 12px; opacity: .85; margin-top: 3px; }
1724
+ #ledgerList .ldg-note { font-size: 12px; opacity: .85; margin-top: 3px; cursor: pointer;
1725
+ display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; overflow: hidden; }
1726
+ #ledgerList .ldg-note.open { -webkit-line-clamp: unset; overflow: visible; }
1727
+ #ledgerList .ldg-id { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 10px; opacity: .55;
1728
+ border: 1px solid var(--line, #3a3d42); border-radius: 3px; padding: 0 4px; cursor: pointer; }
1729
+ #ledgerList .ldg-id:hover { opacity: .95; }
1730
+ #ledgerList .ldg-stale { color: #e9a23b; }
1731
+ #ledgerTools { margin-bottom: 10px; }
1732
+ #ledgerTools .ldg-row { display: flex; gap: 6px; flex-wrap: wrap; }
1733
+ #ledgerTools input, #ledgerTools select { background: rgba(255,255,255,.04); border: 1px solid var(--line, #3a3d42);
1734
+ border-radius: 6px; color: inherit; font-family: inherit; padding: 5px 8px; }
1735
+ /* The compact size is gated on a FINE pointer, and that is the whole of why.
1736
+ `#ledgerTools input` (0,1,0,1) ties with the same selector in the
1737
+ (pointer: coarse) block and comes LATER, so naming it there does nothing —
1738
+ measured in a real phone viewport, the field stayed 13px. Under 16px Safari
1739
+ zooms on focus, which widens the layout viewport and sets the entire
1740
+ cockpit sliding sideways (invariant 28). So the small size never exists on
1741
+ touch rather than being overridden on it — and the shorthand is
1742
+ `font-family`, not `font`, because `font: inherit` sets the SIZE too (to
1743
+ the body's 15px) and would lose the same tie in the same silent way. */
1744
+ @media (pointer: fine) {
1745
+ #ledgerTools input, #ledgerTools select { font-size: 13px; }
1746
+ }
1747
+ #ledgerTools #ledgerSearch { flex: 1 1 150px; min-width: 120px; }
1748
+ #ledgerTools select { flex: 0 1 auto; max-width: 46%; }
1749
+ #ledgerTools .ldg-chips { display: flex; gap: 5px; flex-wrap: wrap; margin-top: 7px; }
1750
+ #ledgerTools .ldg-chip { background: none; border: 1px solid var(--line, #3a3d42); border-radius: 999px;
1751
+ color: inherit; cursor: pointer; font-size: 11px; opacity: .65; padding: 2px 9px; }
1752
+ #ledgerTools .ldg-chip[aria-pressed="true"] { opacity: 1; border-color: currentColor; background: rgba(255,255,255,.08); }
1753
+ #ledgerTools .ldg-chip .n { opacity: .55; margin-left: 4px; }
1754
+ #ledgerTools .ldg-count { color: var(--text-dim); font-size: 11px; margin-top: 7px; }
1697
1755
  #secretsPanel .sec-repo { font-size: 12px; opacity: .8; margin-bottom: 4px; word-break: break-all; }
1698
1756
  #secretsPanel .sec-note { font-size: 12px; opacity: .65; margin: 6px 0 12px; }
1699
1757
  #secretsList { list-style: none; padding: 0; margin: 0 0 12px; }
@@ -1909,6 +1967,15 @@
1909
1967
  <button id="ledgerClose" title="Close">✕</button>
1910
1968
  </div>
1911
1969
  <p class="sec-note">What sibling agents have resolved or decided, so no one re-raises it. One row per entity; a new record supersedes it. Read-only here — agents write it via the <code>shadok-ledger</code> skill.</p>
1970
+ <div id="ledgerTools">
1971
+ <div class="ldg-row">
1972
+ <input id="ledgerSearch" type="search" placeholder="search label, note, source, id…" autocomplete="off" />
1973
+ <select id="ledgerAge" title="How long since the row's claim was last confirmed"></select>
1974
+ <select id="ledgerSort" title="Order"></select>
1975
+ </div>
1976
+ <div id="ledgerChips" class="ldg-chips"></div>
1977
+ <div id="ledgerCount" class="ldg-count"></div>
1978
+ </div>
1912
1979
  </div>
1913
1980
  <div class="pin-body">
1914
1981
  <ul id="ledgerList"></ul>
@@ -2387,6 +2454,12 @@
2387
2454
  window.claudeUpdateState = claudeUpdateState;
2388
2455
  import { uploadFailure } from "/upload.js?v=__ASSET_V__";
2389
2456
  window.uploadFailure = uploadFailure;
2457
+ import { filterLedger, ledgerFacets, ledgerAge, LEDGER_AGES, LEDGER_SORTS } from "/ledger-view.js?v=__ASSET_V__";
2458
+ window.filterLedger = filterLedger;
2459
+ window.ledgerFacets = ledgerFacets;
2460
+ window.ledgerAge = ledgerAge;
2461
+ window.LEDGER_AGES = LEDGER_AGES;
2462
+ window.LEDGER_SORTS = LEDGER_SORTS;
2390
2463
  window.MODEL_CHOICES = MODEL_CHOICES;
2391
2464
  window.composeModel = composeModel;
2392
2465
  window.pickChannelSource = pickChannelSource;
@@ -2464,6 +2537,13 @@
2464
2537
  bubblePlacement: () => null,
2465
2538
  unionRect: () => null,
2466
2539
  visibleSteps: (steps) => steps ?? [],
2540
+ // The viewer is opened by a click, so the module is long since loaded —
2541
+ // but a stub is still the rule (invariant 10), and the honest one here
2542
+ // shows the table UNFILTERED rather than an empty panel that reads as
2543
+ // "the ledger is empty".
2544
+ filterLedger: (entries) => entries ?? [],
2545
+ ledgerFacets: () => ({ status: [], kind: [] }),
2546
+ ledgerAge: () => null,
2467
2547
  // A missing module must leave the picker EMPTY and silent rather than
2468
2548
  // half-built: an empty list renders no chips, so the form still starts an
2469
2549
  // agent on its profile's model, which is what it did before this existed.
@@ -4719,6 +4799,41 @@
4719
4799
  return bubble;
4720
4800
  }
4721
4801
 
4802
+ /**
4803
+ * A compaction summary, folded into a collapsible box. Claude Code writes a
4804
+ * long "This session is being continued…" block as a user message when it
4805
+ * compacts; shown as a full bubble it buries everything, so it is collapsed by
4806
+ * default and expands on click. The body is sanitised like any transcript
4807
+ * markdown (invariant 13), even though this text is the model's own summary.
4808
+ */
4809
+ function addCompactionCard(tab, text, at) {
4810
+ if (Number.isFinite(at)) { tab.lastMsgAt = at; renderLastAt(tab); }
4811
+ const turn = document.createElement("div");
4812
+ turn.className = "turn compaction";
4813
+ const det = document.createElement("details");
4814
+ det.className = "compaction-box";
4815
+ const sum = document.createElement("summary");
4816
+ sum.className = "compaction-sum";
4817
+ sum.textContent = "🗜 Context summary — earlier conversation compacted";
4818
+ const time = fmtTime(at);
4819
+ if (time) sum.appendChild(time);
4820
+ det.appendChild(sum);
4821
+ const body = document.createElement("div");
4822
+ body.className = "compaction-body bubble";
4823
+ if (text && window.marked && window.DOMPurify) {
4824
+ body.classList.add("md");
4825
+ body.innerHTML = DOMPurify.sanitize(marked.parse(text));
4826
+ } else {
4827
+ body.textContent = text || "";
4828
+ }
4829
+ det.appendChild(body);
4830
+ turn.appendChild(det);
4831
+ if (text) addCopyButton(turn, text);
4832
+ tab.transcriptEl.appendChild(turn);
4833
+ pinBottom(tab);
4834
+ return body;
4835
+ }
4836
+
4722
4837
  /** The URL that serves a dropped / pasted / Telegram media file, by basename
4723
4838
  * (the server scopes it to MEDIA_DIR). */
4724
4839
  function mediaUrl(p) {
@@ -5926,6 +6041,10 @@
5926
6041
  // A file the agent delivered (SendUserFile) — its card survives the
5927
6042
  // reload so the download / image stays reachable.
5928
6043
  addFileCard(t, h.files || [], h.at);
6044
+ } else if (h.role === "user" && h.compaction) {
6045
+ // A compaction summary: a huge "This session is being continued…"
6046
+ // block. Fold it into a collapsible box so it doesn't bury the chat.
6047
+ addCompactionCard(t, h.text, h.at);
5929
6048
  } else if (h.role === "user") {
5930
6049
  // Who sent it, recovered from the stripped ⟦…⟧ header, through the
5931
6050
  // SAME echoAuthor the live echo uses: "Ada · telegram"
@@ -7181,11 +7300,18 @@
7181
7300
  const age = days <= 0 ? "today" : days === 1 ? "yesterday" : days + "d ago";
7182
7301
  return abs + " · " + age;
7183
7302
  }
7303
+ // Everything `GET /ledger` returned, narrowed client-side: the table is small
7304
+ // enough to send whole and large enough (144 rows here, 498 on a sibling one
7305
+ // day later) that a flat list stops being readable.
7306
+ let ledgerAll = [];
7307
+ const ledgerQuery = { text: "", status: [], kind: [], age: "any", sort: "recent" };
7184
7308
  function renderLedger(entries) {
7185
7309
  const ul = $("ledgerList");
7186
7310
  ul.innerHTML = "";
7187
7311
  if (!entries || !entries.length) {
7188
- ul.innerHTML = '<li><span style="opacity:.6">the ledger is empty</span></li>';
7312
+ ul.innerHTML = '<li><span style="opacity:.6">'
7313
+ + (ledgerAll.length ? "no row matches these filters" : "the ledger is empty")
7314
+ + "</span></li>";
7189
7315
  return;
7190
7316
  }
7191
7317
  for (const e of entries) {
@@ -7207,16 +7333,96 @@
7207
7333
  const verified = e.verifiedAt && e.verifiedAt !== e.updatedAt ? " · verified " + ldgWhen(e.verifiedAt) : "";
7208
7334
  meta.textContent = ldgWhen(e.updatedAt) + verified + (e.source ? " · " + e.source : "");
7209
7335
  if (e.updatedAt) meta.title = new Date(e.updatedAt).toLocaleString();
7336
+ // A month without a confirmation is the state the skill's hedge is about,
7337
+ // so it is marked rather than left to be computed off a date.
7338
+ const age = window.ledgerAge(e);
7339
+ if (age != null && age > 30) meta.classList.add("ldg-stale");
7340
+ // The id is the durable handle: `record --id a1b2` is what you tell an
7341
+ // agent, and until now the viewer was the one place that did not show it.
7342
+ if (e.id) {
7343
+ const idb = document.createElement("button");
7344
+ idb.className = "ldg-id"; idb.type = "button"; idb.textContent = e.id;
7345
+ idb.title = "copy this id — agents update a row with `record --id " + e.id + "`";
7346
+ idb.addEventListener("click", async () => {
7347
+ try { await navigator.clipboard.writeText(e.id); idb.textContent = "copied"; }
7348
+ catch { idb.textContent = e.id; }
7349
+ setTimeout(() => { idb.textContent = e.id; }, 900);
7350
+ });
7351
+ head.appendChild(idb);
7352
+ }
7210
7353
  li.append(head, meta);
7211
- if (e.note) { const n = document.createElement("div"); n.className = "ldg-note"; n.textContent = e.note; li.appendChild(n); }
7354
+ if (e.note) {
7355
+ // Notes run to a couple of thousand characters on a busy table, so a
7356
+ // filtered list of them is a wall. Three lines, and a click opens the
7357
+ // one you came for — the first sentence is the headline anyway, which
7358
+ // is exactly what the pushed block carries.
7359
+ const n = document.createElement("div");
7360
+ n.className = "ldg-note"; n.textContent = e.note; n.title = "click to expand";
7361
+ n.addEventListener("click", () => n.classList.toggle("open"));
7362
+ li.appendChild(n);
7363
+ }
7212
7364
  ul.appendChild(li);
7213
7365
  }
7214
7366
  }
7367
+ /** Re-narrow and repaint from the rows already in hand — no round trip. */
7368
+ function applyLedgerFilters() {
7369
+ const shown = window.filterLedger(ledgerAll, ledgerQuery);
7370
+ renderLedger(shown);
7371
+ const n = ledgerAll.length;
7372
+ $("ledgerCount").textContent = shown.length === n
7373
+ ? n + (n === 1 ? " row" : " rows")
7374
+ : shown.length + " of " + n + " rows";
7375
+ }
7376
+ /** The chips are built from the data, never from a fixed list: `status` is
7377
+ * free text, so a hardcoded set would hide whatever word nobody predicted. */
7378
+ function paintLedgerChips() {
7379
+ const box = $("ledgerChips");
7380
+ box.innerHTML = "";
7381
+ const facets = window.ledgerFacets(ledgerAll);
7382
+ for (const [dim, items] of [["status", facets.status], ["kind", facets.kind]]) {
7383
+ for (const it of items) {
7384
+ const b = document.createElement("button");
7385
+ b.type = "button"; b.className = "ldg-chip";
7386
+ b.setAttribute("aria-pressed", String(ledgerQuery[dim].includes(it.value)));
7387
+ b.innerHTML = "";
7388
+ b.appendChild(document.createTextNode(it.value));
7389
+ const n = document.createElement("span"); n.className = "n"; n.textContent = it.count;
7390
+ b.appendChild(n);
7391
+ b.addEventListener("click", () => {
7392
+ const sel = ledgerQuery[dim];
7393
+ const i = sel.indexOf(it.value);
7394
+ if (i < 0) sel.push(it.value); else sel.splice(i, 1);
7395
+ b.setAttribute("aria-pressed", String(i < 0));
7396
+ applyLedgerFilters();
7397
+ });
7398
+ box.appendChild(b);
7399
+ }
7400
+ }
7401
+ }
7402
+ for (const [id, key] of [["ledgerAge", "age"], ["ledgerSort", "sort"]]) {
7403
+ const sel = $(id);
7404
+ sel.addEventListener("change", () => { ledgerQuery[key] = sel.value; applyLedgerFilters(); });
7405
+ }
7406
+ $("ledgerSearch").addEventListener("input", () => {
7407
+ ledgerQuery.text = $("ledgerSearch").value;
7408
+ applyLedgerFilters();
7409
+ });
7215
7410
  $("ledgerBtn").addEventListener("click", async () => {
7216
- let entries = [];
7217
- try { entries = (await (await fetch("/ledger")).json()).entries || []; } catch { entries = []; }
7218
- renderLedger(entries);
7411
+ try { ledgerAll = (await (await fetch("/ledger")).json()).entries || []; } catch { ledgerAll = []; }
7412
+ // The option lists come from the module, so the control and the filter it
7413
+ // drives cannot drift apart.
7414
+ for (const [id, list] of [["ledgerAge", window.LEDGER_AGES], ["ledgerSort", window.LEDGER_SORTS]]) {
7415
+ const sel = $(id);
7416
+ if (!sel.options.length) {
7417
+ for (const o of list ?? []) sel.add(new Option(o.label, o.value));
7418
+ }
7419
+ }
7420
+ $("ledgerAge").value = ledgerQuery.age;
7421
+ $("ledgerSort").value = ledgerQuery.sort;
7422
+ paintLedgerChips();
7423
+ applyLedgerFilters();
7219
7424
  $("ledgerOverlay").hidden = false;
7425
+ $("ledgerSearch").focus();
7220
7426
  });
7221
7427
  $("ledgerClose").addEventListener("click", () => { $("ledgerOverlay").hidden = true; });
7222
7428
  $("ledgerOverlay").addEventListener("click", (e) => { if (e.target === $("ledgerOverlay")) $("ledgerOverlay").hidden = true; });
@@ -0,0 +1,122 @@
1
+ // Filtering and sorting for the read-only ledger viewer.
2
+ //
3
+ // The table is small enough to send whole (`GET /ledger`) and large enough that
4
+ // a flat list stops being readable: 144 rows on the instance that develops
5
+ // shadok, 498 on a sibling one day later, and it only grows with the number of
6
+ // live topics. So the narrowing happens client-side, over rows already in hand
7
+ // — no endpoint, no pagination, no round trip per keystroke.
8
+ //
9
+ // Pure, and in its own module for the usual reason (invariant 10's family): the
10
+ // browser loads it AND `test/ledger-view.test.ts` imports it, so the rules below
11
+ // are exercised without a DOM.
12
+
13
+ /** Case- and ACCENT-insensitive, because a sibling instance's rows are written
14
+ * in French: searching `hopital` must find `hôpital`, or the box is a trap for
15
+ * exactly the people whose rows need it most. */
16
+ export function ldgNorm(s) {
17
+ return String(s ?? "")
18
+ .normalize("NFD")
19
+ .replace(/\p{Diacritic}/gu, "")
20
+ .toLowerCase();
21
+ }
22
+
23
+ /** Everything a row can be found by. The id is in there on purpose: it is the
24
+ * handle the pushed block and the CLI both print, so pasting `a1b2` back in
25
+ * has to land on the row it names. */
26
+ export function ledgerHaystack(e) {
27
+ return ldgNorm([e?.id, e?.entity, e?.status, e?.kind, e?.note, e?.source].filter(Boolean).join(" "));
28
+ }
29
+
30
+ /**
31
+ * How many days since the row's claim was last CONFIRMED — `verifiedAt` when it
32
+ * exists, else `updatedAt`. Same two-clock rule the CLI and the block use: an
33
+ * edit is not an observation, and the staleness judgement rests on the latter.
34
+ * Counted in CALENDAR days, so it agrees with the date the row shows rather
35
+ * than with a rolling 24 hours.
36
+ */
37
+ export function ledgerAge(e, now = Date.now()) {
38
+ const t = e?.verifiedAt ?? e?.updatedAt;
39
+ if (!t) return null;
40
+ const d = new Date(t);
41
+ const n = new Date(now);
42
+ const d0 = new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();
43
+ const n0 = new Date(n.getFullYear(), n.getMonth(), n.getDate()).getTime();
44
+ return Math.max(0, Math.round((n0 - d0) / 86400000));
45
+ }
46
+
47
+ /** The age windows offered, as data so the <select> is built from them and the
48
+ * filter reads the same list. `stale` is the inverse of the others and the one
49
+ * with operational value: a row nobody has re-confirmed in a month is exactly
50
+ * what the hedge in the skill is about. */
51
+ export const LEDGER_AGES = [
52
+ { value: "any", label: "any age" },
53
+ { value: "today", label: "today", max: 0 },
54
+ { value: "7", label: "last 7 days", max: 7 },
55
+ { value: "30", label: "last 30 days", max: 30 },
56
+ { value: "stale", label: "not confirmed in 30d", min: 31 },
57
+ ];
58
+
59
+ export const LEDGER_SORTS = [
60
+ { value: "recent", label: "most recent" },
61
+ { value: "stale", label: "least recently confirmed" },
62
+ { value: "entity", label: "name (A→Z)" },
63
+ ];
64
+
65
+ /** The distinct values really present, with their counts — never a hardcoded
66
+ * list: `status` is free text (an agent may write anything), so a fixed set of
67
+ * chips would silently hide whatever word it did not predict. */
68
+ export function ledgerFacets(entries) {
69
+ const tally = (pick) => {
70
+ const m = new Map();
71
+ for (const e of entries ?? []) {
72
+ const v = pick(e);
73
+ if (v) m.set(v, (m.get(v) ?? 0) + 1);
74
+ }
75
+ return [...m].map(([value, count]) => ({ value, count })).sort((a, b) => b.count - a.count || a.value.localeCompare(b.value));
76
+ };
77
+ return {
78
+ status: tally((e) => e.status),
79
+ // `task` is the default and nearly the whole table, so it is a chip like the
80
+ // others here (unlike the block, where tagging it would be noise on a line
81
+ // the reader did not ask for) — in a filter bar the reader DID ask.
82
+ kind: tally((e) => e.kind || "task"),
83
+ };
84
+ }
85
+
86
+ /**
87
+ * Narrow and order. An empty selection means "no constraint on that dimension",
88
+ * never "nothing" — a filter bar that can be driven into an empty list by doing
89
+ * nothing is a bug report waiting to happen.
90
+ *
91
+ * Every search term must match (AND), which is how a search box is expected to
92
+ * behave: typing more words narrows.
93
+ */
94
+ export function filterLedger(entries, query = {}, now = Date.now()) {
95
+ const { text = "", status = [], kind = [], age = "any", sort = "recent" } = query;
96
+ const terms = ldgNorm(text).split(/\s+/).filter(Boolean);
97
+ const window = LEDGER_AGES.find((a) => a.value === age) ?? LEDGER_AGES[0];
98
+ const out = (entries ?? []).filter((e) => {
99
+ if (status.length && !status.includes(e.status)) return false;
100
+ if (kind.length && !kind.includes(e.kind || "task")) return false;
101
+ if (window.max != null || window.min != null) {
102
+ const d = ledgerAge(e, now);
103
+ // A row with no date at all is NOT quietly dropped by an age window: it
104
+ // is a row we know nothing about, and hiding it is how it stops existing.
105
+ if (d != null) {
106
+ if (window.max != null && d > window.max) return false;
107
+ if (window.min != null && d < window.min) return false;
108
+ }
109
+ }
110
+ if (terms.length) {
111
+ const hay = ledgerHaystack(e);
112
+ if (!terms.every((t) => hay.includes(t))) return false;
113
+ }
114
+ return true;
115
+ });
116
+ const by = {
117
+ recent: (a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0),
118
+ stale: (a, b) => (ledgerAge(b, now) ?? -1) - (ledgerAge(a, now) ?? -1) || (a.updatedAt ?? 0) - (b.updatedAt ?? 0),
119
+ entity: (a, b) => String(a.entity ?? "").localeCompare(String(b.entity ?? "")),
120
+ };
121
+ return out.sort(by[sort] ?? by.recent);
122
+ }