waterplane 0.1.22 → 0.1.25

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 (144) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/SECURITY.md +1 -1
  3. package/node_modules/@waterplane/shared/dist/healthindex/commits.d.ts +1 -1
  4. package/node_modules/@waterplane/shared/dist/healthindex/commits.js +2 -2
  5. package/node_modules/@waterplane/shared/dist/healthindex/commits.js.map +1 -1
  6. package/node_modules/@waterplane/shared/dist/healthindex/coverage.d.ts +128 -0
  7. package/node_modules/@waterplane/shared/dist/healthindex/coverage.js +343 -0
  8. package/node_modules/@waterplane/shared/dist/healthindex/coverage.js.map +1 -0
  9. package/node_modules/@waterplane/shared/dist/healthindex/readings.d.ts +9 -1
  10. package/node_modules/@waterplane/shared/dist/healthindex/readings.js +122 -4
  11. package/node_modules/@waterplane/shared/dist/healthindex/readings.js.map +1 -1
  12. package/node_modules/@waterplane/shared/dist/healthindex/repoindex.d.ts +5 -0
  13. package/node_modules/@waterplane/shared/dist/healthindex/repoindex.js +2 -0
  14. package/node_modules/@waterplane/shared/dist/healthindex/repoindex.js.map +1 -1
  15. package/node_modules/@waterplane/shared/dist/healthindex/score.d.ts +3 -0
  16. package/node_modules/@waterplane/shared/dist/healthindex/score.js +52 -16
  17. package/node_modules/@waterplane/shared/dist/healthindex/score.js.map +1 -1
  18. package/node_modules/@waterplane/shared/dist/healthindex/types.d.ts +82 -6
  19. package/node_modules/@waterplane/shared/dist/healthindex/types.js +35 -2
  20. package/node_modules/@waterplane/shared/dist/healthindex/types.js.map +1 -1
  21. package/node_modules/@waterplane/shared/dist/healthindex/words.js +65 -6
  22. package/node_modules/@waterplane/shared/dist/healthindex/words.js.map +1 -1
  23. package/node_modules/@waterplane/shared/dist/healthindex.d.ts +21 -7
  24. package/node_modules/@waterplane/shared/dist/healthindex.js +20 -7
  25. package/node_modules/@waterplane/shared/dist/healthindex.js.map +1 -1
  26. package/node_modules/@waterplane/shared/dist/healthindexresponse.js +3 -2
  27. package/node_modules/@waterplane/shared/dist/healthindexresponse.js.map +1 -1
  28. package/node_modules/@waterplane/shared/dist/healthspend.js +1 -1
  29. package/node_modules/@waterplane/shared/dist/hints.js +9 -0
  30. package/node_modules/@waterplane/shared/dist/hints.js.map +1 -1
  31. package/node_modules/@waterplane/shared/dist/index.d.ts +2 -0
  32. package/node_modules/@waterplane/shared/dist/index.js +2 -0
  33. package/node_modules/@waterplane/shared/dist/index.js.map +1 -1
  34. package/node_modules/@waterplane/shared/dist/intent/kind.d.ts +45 -1
  35. package/node_modules/@waterplane/shared/dist/intent/kind.js +60 -2
  36. package/node_modules/@waterplane/shared/dist/intent/kind.js.map +1 -1
  37. package/node_modules/@waterplane/shared/dist/intent.d.ts +1 -1
  38. package/node_modules/@waterplane/shared/dist/intent.js +1 -1
  39. package/node_modules/@waterplane/shared/dist/intent.js.map +1 -1
  40. package/node_modules/@waterplane/shared/dist/repohealth.d.ts +178 -0
  41. package/node_modules/@waterplane/shared/dist/repohealth.js.map +1 -1
  42. package/node_modules/@waterplane/shared/dist/repohealthhabits.d.ts +15 -0
  43. package/node_modules/@waterplane/shared/dist/repohealthhabits.js +117 -0
  44. package/node_modules/@waterplane/shared/dist/repohealthhabits.js.map +1 -0
  45. package/node_modules/@waterplane/shared/dist/repohealthnative.d.ts +10 -0
  46. package/node_modules/@waterplane/shared/dist/repohealthnative.js +94 -0
  47. package/node_modules/@waterplane/shared/dist/repohealthnative.js.map +1 -0
  48. package/node_modules/@waterplane/shared/dist/repohealthread.js +23 -1
  49. package/node_modules/@waterplane/shared/dist/repohealthread.js.map +1 -1
  50. package/node_modules/@waterplane/shared/dist/wire/agentreadings.d.ts +104 -0
  51. package/node_modules/@waterplane/shared/dist/wire/agentreadings.js +7 -0
  52. package/node_modules/@waterplane/shared/dist/wire/agentreadings.js.map +1 -0
  53. package/node_modules/@waterplane/shared/dist/wire/notify.d.ts +6 -1
  54. package/node_modules/@waterplane/shared/dist/wire/notify.js +6 -1
  55. package/node_modules/@waterplane/shared/dist/wire/notify.js.map +1 -1
  56. package/node_modules/@waterplane/shared/dist/wire/repo.d.ts +1 -1
  57. package/npm-shrinkwrap.json +2 -2
  58. package/package.json +1 -1
  59. package/packages/extensions/android-apps/waterplane-plugin.json +4 -1
  60. package/packages/extensions/copilot-usage/waterplane-plugin.json +7 -2
  61. package/packages/extensions/desktop/waterplane-plugin.json +5 -0
  62. package/packages/extensions/ocr/waterplane-plugin.json +5 -1
  63. package/packages/extensions/requirements/waterplane-plugin.json +3 -3
  64. package/packages/extensions/scorecard/waterplane-plugin.json +2 -1
  65. package/packages/extensions/token-stats/waterplane-plugin.json +4 -3
  66. package/packages/host/dist/agentclass.d.ts +105 -0
  67. package/packages/host/dist/agentclass.js +189 -0
  68. package/packages/host/dist/agentclass.js.map +1 -0
  69. package/packages/host/dist/agentintents.d.ts +18 -0
  70. package/packages/host/dist/agentintents.js +40 -7
  71. package/packages/host/dist/agentintents.js.map +1 -1
  72. package/packages/host/dist/agentreadings.d.ts +40 -0
  73. package/packages/host/dist/agentreadings.js +254 -0
  74. package/packages/host/dist/agentreadings.js.map +1 -0
  75. package/packages/host/dist/agentscan.d.ts +8 -0
  76. package/packages/host/dist/agentscan.js +329 -0
  77. package/packages/host/dist/agentscan.js.map +1 -0
  78. package/packages/host/dist/backends/index.js +12 -1
  79. package/packages/host/dist/backends/index.js.map +1 -1
  80. package/packages/host/dist/binguard.d.ts +13 -1
  81. package/packages/host/dist/binguard.js +28 -2
  82. package/packages/host/dist/binguard.js.map +1 -1
  83. package/packages/host/dist/exposure.d.ts +10 -0
  84. package/packages/host/dist/exposure.js +25 -0
  85. package/packages/host/dist/exposure.js.map +1 -1
  86. package/packages/host/dist/plugins/pluginassets.d.ts +17 -0
  87. package/packages/host/dist/plugins/pluginassets.js +27 -1
  88. package/packages/host/dist/plugins/pluginassets.js.map +1 -1
  89. package/packages/host/dist/plugins/pluginregistry.d.ts +3 -1
  90. package/packages/host/dist/plugins/pluginregistry.js +8 -1
  91. package/packages/host/dist/plugins/pluginregistry.js.map +1 -1
  92. package/packages/host/dist/reposkilltext.d.ts +2 -0
  93. package/packages/host/dist/reposkilltext.js +8 -2
  94. package/packages/host/dist/reposkilltext.js.map +1 -1
  95. package/packages/host/dist/routes/apirepowork.js +13 -0
  96. package/packages/host/dist/routes/apirepowork.js.map +1 -1
  97. package/packages/host/dist/routes/apisystem.js +17 -1
  98. package/packages/host/dist/routes/apisystem.js.map +1 -1
  99. package/packages/host/dist/routes/apitable.d.ts +4 -0
  100. package/packages/host/dist/routes/apitable.js.map +1 -1
  101. package/packages/host/dist/server/http.js +2 -1
  102. package/packages/host/dist/server/http.js.map +1 -1
  103. package/packages/host/dist/server/intentDeps.js +14 -1
  104. package/packages/host/dist/server/intentDeps.js.map +1 -1
  105. package/packages/host/dist/sessions/tmux.js +6 -1
  106. package/packages/host/dist/sessions/tmux.js.map +1 -1
  107. package/packages/host/dist/weekburn.js +7 -5
  108. package/packages/host/dist/weekburn.js.map +1 -1
  109. package/packages/web/dist/assets/demo-mKJo0QVO.js +26 -0
  110. package/packages/web/dist/assets/index-B6f7Lcp1.js +170 -0
  111. package/packages/web/dist/assets/index-DQIK94fc.css +1 -0
  112. package/packages/web/dist/assets/shared-Cd69oxHd.js +51 -0
  113. package/packages/web/dist/assets/sheets-BImsk1_Y.js +256 -0
  114. package/packages/web/dist/build-id.txt +1 -1
  115. package/packages/web/dist/buildstamp.json +1 -1
  116. package/packages/web/dist/index.html +5 -5
  117. package/packages/web/dist/sw.js +2 -2
  118. package/release.json +3 -3
  119. package/tools/repohealth/constants.mjs +34 -1
  120. package/tools/repohealth/fixture.json +5374 -38
  121. package/tools/repohealth/git.mjs +77 -0
  122. package/tools/repohealth/lang/dart-analyze.mjs +181 -0
  123. package/tools/repohealth/lang/dart-lex.mjs +494 -0
  124. package/tools/repohealth/lang/dart-resolve.mjs +95 -0
  125. package/tools/repohealth/lang/python-ast.mjs +602 -0
  126. package/tools/repohealth/lang/python-resolve.mjs +228 -0
  127. package/tools/repohealth/metrics/habits.mjs +286 -0
  128. package/tools/repohealth/metrics/native.mjs +542 -0
  129. package/tools/repohealth/metrics/untested.mjs +20 -8
  130. package/tools/repohealth/metrics/workspace.mjs +256 -0
  131. package/tools/repohealth/own.mjs +67 -5
  132. package/tools/repohealth/packs/dart.mjs +153 -85
  133. package/tools/repohealth/packs/python.mjs +51 -14
  134. package/tools/repohealth/plot.mjs +143 -1
  135. package/tools/repohealth/reach.mjs +98 -0
  136. package/tools/repohealth/scope.mjs +14 -1
  137. package/tools/repohealth/series.mjs +5 -0
  138. package/tools/repohealth/types.mjs +4 -0
  139. package/tools/repohealth.mjs +39 -5
  140. package/packages/web/dist/assets/demo-ad3g3HDa.js +0 -26
  141. package/packages/web/dist/assets/index-BllRvpkw.js +0 -170
  142. package/packages/web/dist/assets/index-DUiYLEts.css +0 -1
  143. package/packages/web/dist/assets/shared-DBaaGttP.js +0 -51
  144. package/packages/web/dist/assets/sheets-CrfRr6Um.js +0 -256
@@ -0,0 +1,254 @@
1
+ /**
2
+ * Agent readings: per-repo weekly figures only this desktop can take, because
3
+ * it keeps every claude conversation that ran in the repo
4
+ * (`GET /api/repos/:id/agentreadings`; DTO `shared/wire/agentreadings.ts`).
5
+ * The rules are `agentclass.ts`'s, the disk reading `agentscan.ts`'s.
6
+ *
7
+ * ── Bounded cost ────────────────────────────────────────────────────────────
8
+ *
9
+ * `tokenstats.ts`'s store pattern, cut to ONE repo at a time: the store is
10
+ * per-LOG summaries keyed by project directory and relative path, persisted
11
+ * through `jsonstore.ts` (`writeJsonAtomic`, debounced, flushed on demand;
12
+ * `readJsonGuarded`, a corrupt file moved aside and rebuilt from the logs),
13
+ * and the weekly readings are DERIVED on every answer — no running aggregate
14
+ * to drift. A request walks only the project directories whose slug is the
15
+ * repo's (or one of its worktrees'), `stat`s each log and re-reads only the
16
+ * ones whose size or mtime moved; within `MAX_AGE_MS` of the last sweep it
17
+ * walks nothing at all. So the first open of a repo reads its logs once, and
18
+ * every later open costs a stat sweep of that repo's logs only — never a
19
+ * re-scan of every transcript on the machine.
20
+ *
21
+ * Every reading degrades to ABSENT with its sentence: an unreadable project
22
+ * directory is an error answer, never a week of zeros.
23
+ */
24
+ import { existsSync, mkdirSync, realpathSync } from "node:fs";
25
+ import { readdir, stat } from "node:fs/promises";
26
+ import { join } from "node:path";
27
+ import { AGENT_READING_WEEKS, transcriptDirName, } from "@waterplane/shared";
28
+ import { RULES, countByWeek, foldAgentWeeks, lastWeeks } from "./agentclass.js";
29
+ import { summarizeAgentLog, summarizeConv } from "./agentscan.js";
30
+ import { hostStateDir } from "./branddirs.js";
31
+ import { claudeConfigDir } from "./claudeconfig.js";
32
+ import { repoOfWorktree } from "./costwindow.js";
33
+ import { exposureCrashMarks } from "./exposure.js";
34
+ import { readJsonGuarded, writeJsonAtomic } from "./jsonstore.js";
35
+ import { walkLogs } from "./tokenscan.js";
36
+ /** Bump when a summary's shape or a classification rule changes: the store then rebuilds from the logs. */
37
+ const VERSION = 2;
38
+ const MAX_FILE = 256 * 1024 * 1024;
39
+ const FLUSH_MS = 5_000;
40
+ const YIELD_EVERY = 32;
41
+ /** A repo swept this recently is answered from the store without touching the disk. */
42
+ export const MAX_AGE_MS = 10 * 60_000;
43
+ /** How long an answer waits for a sweep before saying it is still reading. */
44
+ export const SWEEP_WAIT_MS = 8_000;
45
+ const isAgent = (e) => e.sub === 1;
46
+ /** Whether a project directory slug can hold this repo's logs: the repo's own, or a worktree's under it. */
47
+ export function slugBelongs(slug, repoSlug) {
48
+ return slug === repoSlug || slug.startsWith(`${repoSlug}-`);
49
+ }
50
+ export class AgentReadingsStore {
51
+ birthOf;
52
+ path;
53
+ store = {};
54
+ timer = null;
55
+ dirty = false;
56
+ swept = new Map();
57
+ inFlight = new Map();
58
+ /** `birthOf` is the file's creation time for the fork test; a test with dated fixtures passes `() => undefined`. */
59
+ constructor(stateDir, birthOf = (st) => (st.birthtimeMs > 0 ? Math.round(st.birthtimeMs) : undefined)) {
60
+ this.birthOf = birthOf;
61
+ mkdirSync(stateDir, { recursive: true });
62
+ this.path = join(stateDir, "agentreadings.json");
63
+ try {
64
+ if (existsSync(this.path)) {
65
+ const raw = readJsonGuarded(this.path, null);
66
+ if (raw?.v === VERSION && raw.store && typeof raw.store === "object")
67
+ this.store = raw.store;
68
+ }
69
+ }
70
+ catch { /* rebuilt from the logs, which are the source anyway */ }
71
+ }
72
+ /** Bring this repo's summaries up to date (unless swept within `maxAgeMs`). Throws only on an unreadable projects directory. */
73
+ async sweep(repos, maxAgeMs = MAX_AGE_MS) {
74
+ const key = repos.join("\0");
75
+ const last = this.swept.get(key);
76
+ if (last && Date.now() - last.at < maxAgeMs)
77
+ return last;
78
+ let p = this.inFlight.get(key);
79
+ if (!p) {
80
+ p = this.refresh(key, repos).finally(() => this.inFlight.delete(key));
81
+ this.inFlight.set(key, p);
82
+ }
83
+ await p;
84
+ return this.swept.get(key);
85
+ }
86
+ async refresh(key, repos) {
87
+ const root = join(claudeConfigDir(), "projects");
88
+ let slugs;
89
+ try {
90
+ slugs = (await readdir(root, { withFileTypes: true })).filter((e) => e.isDirectory()).map((e) => e.name);
91
+ }
92
+ catch (e) {
93
+ if (e?.code === "ENOENT")
94
+ slugs = [];
95
+ else
96
+ throw new Error(`The claude projects directory could not be read: ${e.message}`);
97
+ }
98
+ const repoSlugs = repos.map(transcriptDirName);
99
+ const mine = slugs.filter((s) => repoSlugs.some((r) => slugBelongs(s, r)));
100
+ let logs = 0;
101
+ let reread = 0;
102
+ for (const slug of mine) {
103
+ const prev = this.store[slug] ?? {};
104
+ const next = {};
105
+ const rels = await walkLogs(join(root, slug));
106
+ const stats = await Promise.all(rels.map((rel) => stat(join(root, slug, rel)).catch(() => null)));
107
+ for (let i = 0; i < rels.length; i++) {
108
+ const rel = rels[i];
109
+ const st = stats[i];
110
+ if (!st || st.size === 0 || st.size > MAX_FILE)
111
+ continue;
112
+ const parts = rel.split("/");
113
+ const top = parts.length === 1;
114
+ // Only conversations and their agents: `<id>.jsonl` and `<id>/subagents/…/agent-*.jsonl`.
115
+ if (!top && !(parts[1] === "subagents" && parts[parts.length - 1].startsWith("agent-")))
116
+ continue;
117
+ logs++;
118
+ const k = rel.replace(/\.jsonl$/, "");
119
+ const was = prev[k];
120
+ const mtime = Math.round(st.mtimeMs);
121
+ if (was && was.s === st.size && was.m === mtime) {
122
+ next[k] = was;
123
+ continue;
124
+ }
125
+ const path = join(root, slug, rel);
126
+ const sum = top
127
+ ? await summarizeConv(path, k, st.size, mtime, undefined, this.birthOf(st))
128
+ : await summarizeAgentLog(path, rel, st.size, mtime).then((s) => (s ? { ...s, sub: 1 } : null));
129
+ reread++;
130
+ if (reread % YIELD_EVERY === 0)
131
+ await new Promise((r) => setImmediate(r));
132
+ if (sum)
133
+ next[k] = sum;
134
+ }
135
+ this.store[slug] = next;
136
+ }
137
+ // A slug of this repo that is gone from disk is gone from the fold.
138
+ for (const slug of Object.keys(this.store)) {
139
+ if (repoSlugs.some((r) => slugBelongs(slug, r)) && !mine.includes(slug))
140
+ delete this.store[slug];
141
+ }
142
+ this.swept.set(key, { at: Date.now(), logs, reread });
143
+ this.dirty = true;
144
+ this.schedule();
145
+ }
146
+ /** This repo's conversations with their agents. `repos` are the repo's path spellings (as given, realpath). */
147
+ conversations(repos) {
148
+ const want = new Set(repos);
149
+ const repoSlugs = repos.map(transcriptDirName);
150
+ const out = [];
151
+ for (const [slug, files] of Object.entries(this.store)) {
152
+ if (!repoSlugs.some((r) => slugBelongs(slug, r)))
153
+ continue;
154
+ const agents = new Map();
155
+ for (const [k, e] of Object.entries(files)) {
156
+ if (!isAgent(e))
157
+ continue;
158
+ const conv = k.split("/")[0];
159
+ (agents.get(conv) ?? agents.set(conv, []).get(conv)).push(e);
160
+ }
161
+ for (const [k, e] of Object.entries(files)) {
162
+ if (isAgent(e))
163
+ continue;
164
+ // The record's own cwd decides, so `app-other` never lands in `app`
165
+ // through the slug prefix; a log with no cwd counts only in the repo's own slug.
166
+ const belongs = e.w ? want.has(repoOfWorktree(e.w)) : repoSlugs.includes(slug);
167
+ if (belongs)
168
+ out.push({ conv: e, agents: agents.get(k) ?? [] });
169
+ }
170
+ }
171
+ return out;
172
+ }
173
+ schedule() {
174
+ if (this.timer || !this.dirty)
175
+ return;
176
+ this.timer = setTimeout(() => { this.timer = null; this.flush(); }, FLUSH_MS);
177
+ this.timer.unref?.();
178
+ }
179
+ flush() {
180
+ if (this.timer) {
181
+ clearTimeout(this.timer);
182
+ this.timer = null;
183
+ }
184
+ if (!this.dirty)
185
+ return;
186
+ try {
187
+ writeJsonAtomic(this.path, { v: VERSION, store: this.store });
188
+ this.dirty = false;
189
+ }
190
+ catch { /* a readings cache is not worth taking the daemon down for */ }
191
+ }
192
+ }
193
+ /** The backlog's bug items for this repo, by the week they were added — or why there is no count. */
194
+ export function bugsByWeek(items, repos) {
195
+ if (!items)
196
+ return { absent: "The backlog could not be read." };
197
+ const want = new Set(repos);
198
+ const mine = items.filter((i) => want.has(repoOfWorktree(i.repoDir)));
199
+ if (!mine.length)
200
+ return { absent: "This repo has nothing on the backlog." };
201
+ if (!mine.some((i) => i.category))
202
+ return { absent: "No backlog item in this repo has a category yet, so bugs cannot be told apart." };
203
+ return countByWeek(mine.filter((i) => i.category === "bug").map((i) => i.createdAt));
204
+ }
205
+ /** The repo's path spellings: as given, and its realpath (the CLI records the realpath). */
206
+ export function repoSpellings(worktree) {
207
+ const repo = repoOfWorktree(worktree);
208
+ let real = repo;
209
+ try {
210
+ real = realpathSync(repo);
211
+ }
212
+ catch { /* as given */ }
213
+ return [...new Set([repo, real])];
214
+ }
215
+ let shared = null;
216
+ /** The one store for this host (created on first use, in the host's state dir). */
217
+ export function agentReadingsStore(root) {
218
+ return (shared ??= new AgentReadingsStore(hostStateDir(root)));
219
+ }
220
+ /** The route's whole answer. */
221
+ export async function agentReadingsFor(store, worktree, backlog, now = Date.now(), waitMs = SWEEP_WAIT_MS) {
222
+ const repos = repoSpellings(worktree);
223
+ let swept;
224
+ try {
225
+ // A repo's FIRST sweep reads every one of its logs (measured: 33 s for
226
+ // 16,000 logs on the owner's desktop). The answer does not wait past
227
+ // `waitMs`; the sweep carries on and the next ask is answered from the store.
228
+ const sweep = store.sweep(repos);
229
+ sweep.catch(() => { });
230
+ let timer;
231
+ const late = new Promise((r) => { timer = setTimeout(() => r(null), waitMs); });
232
+ swept = await Promise.race([sweep, late]).finally(() => clearTimeout(timer));
233
+ }
234
+ catch (e) {
235
+ return { ok: false, error: e instanceof Error ? e.message : String(e) };
236
+ }
237
+ if (!swept) {
238
+ return { ok: false, pending: true, error: "This desktop is reading this repo's conversation logs for the first time. It carries on in the background; read again in a minute." };
239
+ }
240
+ const crash = exposureCrashMarks(worktree);
241
+ const escaped = {
242
+ crash: "why" in crash ? { absent: crash.why } : countByWeek(crash.at),
243
+ bugs: bugsByWeek(backlog, repos),
244
+ };
245
+ const doc = {
246
+ ok: true,
247
+ repo: repos[0],
248
+ weeks: foldAgentWeeks(store.conversations(repos), lastWeeks(now, AGENT_READING_WEEKS), escaped),
249
+ rules: RULES,
250
+ scannedAt: swept.at, logs: swept.logs, reread: swept.reread,
251
+ };
252
+ return doc;
253
+ }
254
+ //# sourceMappingURL=agentreadings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentreadings.js","sourceRoot":"","sources":["../src/agentreadings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type AgentLogSummary, type ConvSummary } from "./agentclass.js";
2
+ /**
3
+ * Summarise one top-level conversation log. `id` is the file's own session id
4
+ * (its basename). Null when it holds nothing countable.
5
+ */
6
+ export declare function summarizeConv(path: string, id: string, size: number, mtime: number, chunkBytes?: number, birth?: number): Promise<ConvSummary | null>;
7
+ /** Summarise one subagent log: its tokens by week and its workflow run directory. */
8
+ export declare function summarizeAgentLog(path: string, rel: string, size: number, mtime: number, chunkBytes?: number): Promise<AgentLogSummary | null>;
@@ -0,0 +1,329 @@
1
+ /**
2
+ * Agent readings, the DISK half: one conversation log (or one subagent log)
3
+ * read into the small summary `agentclass.ts` folds. Same reading discipline as
4
+ * `tokenscan.ts`, for the same measured reason (a 200 MB log read in one go
5
+ * stalled the daemon for seconds): ASYNC, read in `SCAN_CHUNK` slices cut at
6
+ * the newline byte, a yield to the event loop every `SLICE_MS` of parsing,
7
+ * and a SUBSTRING pre-filter so only the few lines that matter are parsed.
8
+ *
9
+ * The usage rules are `ctxlog/usagerecord.ts`'s (`usageRecordOf`: assistant
10
+ * rows only, `<synthetic>` skipped, a streamed reply counted once by
11
+ * `message.id`) — the same record every ledger reads, never a second reading.
12
+ * A tool call is looked for on EVERY assistant row, deduped or not, because a
13
+ * streamed reply writes its blocks on separate rows under one id.
14
+ */
15
+ import { open } from "node:fs/promises";
16
+ import { performance } from "node:perf_hooks";
17
+ import { CONTINUED_RE, EDIT_TOOLS, classifyRework, weekOfMs } from "./agentclass.js";
18
+ import { SCAN_CHUNK } from "./tokenscan.js";
19
+ import { firstSightIn, usageRecordOf } from "./ctxlog/usagerecord.js";
20
+ const SLICE_MS = 8;
21
+ const breathe = () => new Promise((r) => setImmediate(r));
22
+ /** A Bash command that commits: `git commit`, `git -C dir commit`, `git -c k=v commit`. */
23
+ const COMMIT_RE = /\bgit(?:\s+-[Cc]\s+\S+)*\s+commit\b/;
24
+ /** The workflow script whose agents are rework. */
25
+ const REPAIR_SCRIPT_RE = /review[-_]?repair/i;
26
+ /** How many records at the head of a log decide whether it is fresh. */
27
+ const HEAD_RECORDS = 40;
28
+ /**
29
+ * A copied record is older than the file that holds it. A log whose first record predates the file's
30
+ * birth by more than this was born by copying (a fork), whatever its parent's records name.
31
+ */
32
+ const FORK_BIRTH_SLACK_MS = 2 * 60_000;
33
+ /** Feed every line of the first `size` bytes to `handle`, in order, yielding as `tokenscan.ts` does. False on a read failure. */
34
+ async function eachLine(path, size, handle, chunkBytes = SCAN_CHUNK) {
35
+ let fh;
36
+ try {
37
+ fh = await open(path, "r");
38
+ }
39
+ catch {
40
+ return false;
41
+ }
42
+ try {
43
+ let carry = Buffer.alloc(0);
44
+ let pos = 0;
45
+ let since = performance.now();
46
+ while (pos < size) {
47
+ const want = Math.min(chunkBytes, size - pos);
48
+ const buf = Buffer.allocUnsafe(want);
49
+ const { bytesRead } = await fh.read(buf, 0, want, pos);
50
+ if (bytesRead <= 0)
51
+ break;
52
+ pos += bytesRead;
53
+ const got = buf.subarray(0, bytesRead);
54
+ const chunk = carry.length ? Buffer.concat([carry, got]) : got;
55
+ const nl = chunk.lastIndexOf(10);
56
+ if (nl < 0) {
57
+ carry = chunk;
58
+ continue;
59
+ }
60
+ carry = chunk.subarray(nl + 1);
61
+ for (const line of chunk.toString("utf8", 0, nl).split("\n")) {
62
+ handle(line);
63
+ if (performance.now() - since > SLICE_MS) {
64
+ await breathe();
65
+ since = performance.now();
66
+ }
67
+ }
68
+ }
69
+ handle(carry.toString("utf8"));
70
+ return true;
71
+ }
72
+ catch {
73
+ return false;
74
+ }
75
+ finally {
76
+ await fh.close().catch(() => { });
77
+ }
78
+ }
79
+ const parse = (line) => {
80
+ try {
81
+ const r = JSON.parse(line);
82
+ return r && typeof r === "object" ? r : null;
83
+ }
84
+ catch {
85
+ return null;
86
+ }
87
+ };
88
+ const tsOf = (row) => (typeof row.timestamp === "string" ? Date.parse(row.timestamp) : NaN);
89
+ const blocksOf = (row) => {
90
+ const c = row.message?.content;
91
+ return Array.isArray(c) ? c : [];
92
+ };
93
+ /** The text of a user row a PERSON typed, or null (tool results, meta rows, command wrappers). */
94
+ function humanPrompt(row) {
95
+ if (row.type !== "user" || row.isMeta === true || row.isSidechain === true)
96
+ return null;
97
+ const c = row.message?.content;
98
+ let text = "";
99
+ if (typeof c === "string")
100
+ text = c;
101
+ else if (Array.isArray(c)) {
102
+ if (c.some((b) => b?.type === "tool_result"))
103
+ return null;
104
+ text = c.map((b) => (b?.type === "text" && typeof b.text === "string" ? b.text : "")).join("\n");
105
+ }
106
+ const t = text.trim();
107
+ if (!t || /^<(command-|local-command-)/.test(t) || t.startsWith("Caveat:"))
108
+ return null;
109
+ return t;
110
+ }
111
+ /** Tokens of one usage record into its week's tally. */
112
+ function bumpWeek(wk, ts, u) {
113
+ const w = weekOfMs(ts);
114
+ if (!w)
115
+ return; // undated: in no week rather than in a wrong one
116
+ const t = (wk[w] ??= [0, 0, 0, 0, 0, 0]);
117
+ t[0] += u.input;
118
+ t[1] += u.output;
119
+ t[2] += u.cacheRead;
120
+ t[3] += u.cacheWrite;
121
+ t[4] += u.cacheWrite1h;
122
+ t[5]++;
123
+ }
124
+ /**
125
+ * Summarise one top-level conversation log. `id` is the file's own session id
126
+ * (its basename). Null when it holds nothing countable.
127
+ */
128
+ export async function summarizeConv(path, id, size, mtime, chunkBytes, birth) {
129
+ const firstSight = firstSightIn(new Set());
130
+ const wk = {};
131
+ let cwd;
132
+ let nf;
133
+ let head = 0;
134
+ let prompt;
135
+ let title;
136
+ let t0;
137
+ let t1;
138
+ let ex = [0, 0, 0, 0];
139
+ let edited = false;
140
+ let cp = 0;
141
+ let cm = false;
142
+ /**
143
+ * A fork's copied prefix: the CLI's `--fork-session` and `convfork.ts` copy the parent's
144
+ * records with uuid, message.id and timestamp unchanged and rewrite only `sessionId`; the
145
+ * `session_id` spelling keeps naming the PARENT. So a log whose head names another session
146
+ * is in its prefix until the first record that names THIS one (a raw substring test, so a
147
+ * compaction row, which carries neither spelling, is placed by the rows around it). Prefix
148
+ * rows are the parent's spend, compactions and commits, counted already in the parent's own
149
+ * log: they enter no week, no compaction count and no commit.
150
+ */
151
+ let prefix = false;
152
+ let forked = false;
153
+ const ownMark = `"session_id":"${id}"`;
154
+ /**
155
+ * The second fork test, independent of any field a parent may lack: records are written when
156
+ * the file exists, so a copied prefix carries timestamps from before the file's birth. A birth
157
+ * after the last write (a copy or restore, not a fork) says nothing and is not used. The prefix
158
+ * then ends at the first record stamped within the slack of the birth. One early row alone
159
+ * (a startup attachment, then hours idle before the first prompt) is not a copy: the log is a
160
+ * fork only once a user or assistant row sits before the cut too.
161
+ */
162
+ const cut = birth !== undefined && birth > 0 && birth <= mtime + 1000 ? birth - FORK_BIRTH_SLACK_MS : undefined;
163
+ let stamped = false;
164
+ let pendingFork = false;
165
+ /** Commit calls waiting for their result. */
166
+ const commits = new Set();
167
+ /** Workflow calls that ran a review-repair script, waiting for their run id. */
168
+ const repairCalls = new Set();
169
+ const rr = [];
170
+ let any = false;
171
+ const handle = (line) => {
172
+ if (!line || line.charCodeAt(0) !== 123 /* { */)
173
+ return;
174
+ if (prefix && line.includes(ownMark)) {
175
+ prefix = false;
176
+ pendingFork = false;
177
+ }
178
+ let pre = null;
179
+ if (cut !== undefined && (!stamped || prefix)) {
180
+ pre = parse(line);
181
+ const pts = pre ? tsOf(pre) : NaN;
182
+ if (Number.isFinite(pts)) {
183
+ if (!stamped) {
184
+ stamped = true;
185
+ if (pts < cut) {
186
+ prefix = true;
187
+ pendingFork = true;
188
+ }
189
+ }
190
+ else if (pts >= cut) {
191
+ prefix = false;
192
+ pendingFork = false;
193
+ }
194
+ }
195
+ if (prefix && pendingFork && (pre?.type === "user" || pre?.type === "assistant")) {
196
+ nf ??= "fork";
197
+ forked = true;
198
+ pendingFork = false;
199
+ }
200
+ }
201
+ const isHead = head < HEAD_RECORDS;
202
+ const wantUsage = line.includes('"usage"');
203
+ const wantTitle = line.includes('"aiTitle"');
204
+ const wantPrompt = prompt === undefined && line.includes('"type":"user"');
205
+ const wantResult = (commits.size > 0 || repairCalls.size > 0) && line.includes('"tool_result"');
206
+ if (!prefix && line.includes('"compact_boundary"'))
207
+ cp++;
208
+ if (!(isHead || wantUsage || wantTitle || wantPrompt || wantResult))
209
+ return;
210
+ const row = pre ?? parse(line);
211
+ if (!row)
212
+ return;
213
+ head++;
214
+ const ts = tsOf(row);
215
+ if (Number.isFinite(ts)) {
216
+ if (t0 === undefined)
217
+ t0 = ts;
218
+ t1 = ts;
219
+ }
220
+ if (!cwd && typeof row.cwd === "string")
221
+ cwd = row.cwd;
222
+ if (isHead) {
223
+ if (typeof row.entrypoint === "string" && row.entrypoint.startsWith("sdk"))
224
+ nf ??= "headless";
225
+ for (const k of ["sessionId", "session_id"]) {
226
+ const v = row[k];
227
+ if (typeof v === "string" && v && v !== id) {
228
+ nf ??= "fork";
229
+ forked = true;
230
+ prefix = true;
231
+ }
232
+ }
233
+ }
234
+ if (row.type === "ai-title" && typeof row.aiTitle === "string")
235
+ title = row.aiTitle;
236
+ if (prompt === undefined) {
237
+ const p = humanPrompt(row);
238
+ if (p !== null) {
239
+ prompt = p;
240
+ if (CONTINUED_RE.test(p))
241
+ nf ??= "continued";
242
+ }
243
+ }
244
+ if (row.type === "user" && wantResult) {
245
+ for (const b of blocksOf(row)) {
246
+ const r = b;
247
+ if (r?.type !== "tool_result" || typeof r.tool_use_id !== "string")
248
+ continue;
249
+ if (commits.delete(r.tool_use_id) && r.is_error !== true && !prefix)
250
+ cm = true;
251
+ }
252
+ const runId = row.toolUseResult?.runId;
253
+ if (typeof runId === "string" && runId.startsWith("wf_")) {
254
+ for (const b of blocksOf(row)) {
255
+ const r = b;
256
+ if (r?.type === "tool_result" && typeof r.tool_use_id === "string" && repairCalls.delete(r.tool_use_id))
257
+ rr.push(runId);
258
+ }
259
+ }
260
+ }
261
+ if (row.type !== "assistant")
262
+ return;
263
+ const u = usageRecordOf(row, firstSight);
264
+ if (u && (u.input || u.output || u.cacheRead || u.cacheWrite)) {
265
+ any = true;
266
+ if (!prefix && Number.isFinite(ts))
267
+ bumpWeek(wk, ts, u);
268
+ if (!edited) {
269
+ ex[0] += u.input;
270
+ ex[1] += u.cacheRead;
271
+ ex[2] += u.cacheWrite;
272
+ ex[3]++;
273
+ }
274
+ }
275
+ for (const b of blocksOf(row)) {
276
+ const tu = b;
277
+ if (tu?.type !== "tool_use" || typeof tu.name !== "string")
278
+ continue;
279
+ if (EDIT_TOOLS.has(tu.name))
280
+ edited = true;
281
+ const input = (tu.input ?? {});
282
+ if (prefix)
283
+ continue;
284
+ if (tu.name === "Bash" && typeof tu.id === "string" && typeof input.command === "string" && COMMIT_RE.test(input.command))
285
+ commits.add(tu.id);
286
+ if (tu.name === "Workflow" && typeof tu.id === "string"
287
+ && [input.scriptPath, input.name].some((v) => typeof v === "string" && REPAIR_SCRIPT_RE.test(v)))
288
+ repairCalls.add(tu.id);
289
+ }
290
+ };
291
+ if (!await eachLine(path, size, handle, chunkBytes))
292
+ return null;
293
+ if (!any && t0 === undefined)
294
+ return null;
295
+ // A fork's first prompt is the parent's: its own work is a different task, so it is not classed by it.
296
+ const cls = forked ? { c: "unknown" } : classifyRework(prompt, title);
297
+ return {
298
+ m: mtime, s: size,
299
+ ...(cwd ? { w: cwd } : {}),
300
+ ...(nf ? { nf } : {}),
301
+ c: cls.c, ...(cls.word ? { cw: cls.word } : {}),
302
+ ...(t0 !== undefined ? { t0 } : {}), ...(t1 !== undefined ? { t1 } : {}),
303
+ ...(edited ? { ex } : {}),
304
+ wk, cp,
305
+ ...(cm ? { cm: 1 } : {}),
306
+ ...(rr.length ? { rr } : {}),
307
+ };
308
+ }
309
+ /** Summarise one subagent log: its tokens by week and its workflow run directory. */
310
+ export async function summarizeAgentLog(path, rel, size, mtime, chunkBytes) {
311
+ const firstSight = firstSightIn(new Set());
312
+ const wk = {};
313
+ const handle = (line) => {
314
+ if (!line || line.charCodeAt(0) !== 123 || !line.includes('"usage"'))
315
+ return;
316
+ const row = parse(line);
317
+ if (!row)
318
+ return;
319
+ const u = usageRecordOf(row, firstSight);
320
+ if (!u || !(u.input || u.output || u.cacheRead || u.cacheWrite))
321
+ return;
322
+ bumpWeek(wk, tsOf(row), u);
323
+ };
324
+ if (!await eachLine(path, size, handle, chunkBytes))
325
+ return null;
326
+ const wf = /\/workflows\/(wf_[^/]+)\//.exec(`/${rel}`)?.[1];
327
+ return { m: mtime, s: size, ...(wf ? { wf } : {}), wk };
328
+ }
329
+ //# sourceMappingURL=agentscan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentscan.js","sourceRoot":"","sources":["../src/agentscan.ts"],"names":[],"mappings":"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"}