openwolf-enhanced 1.18.2 → 1.19.1

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 (55) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/dist/dashboard/assets/{AISuggestions-BcieFIOM.js → AISuggestions-DAHbhENG.js} +1 -1
  3. package/dist/dashboard/assets/{ActivityLog-DpfNcDYZ.js → ActivityLog-Cpncxvab.js} +1 -1
  4. package/dist/dashboard/assets/{ActivityTimeline-BCY2XaS_.js → ActivityTimeline-CgwIFZtz.js} +1 -1
  5. package/dist/dashboard/assets/{AnatomyBrowser-Bg6epTwg.js → AnatomyBrowser-CqF4VrB8.js} +1 -1
  6. package/dist/dashboard/assets/{BugLog-Ck19ld74.js → BugLog-kAc_tXQ0.js} +1 -1
  7. package/dist/dashboard/assets/{CerebrumViewer-BgtE71_g.js → CerebrumViewer-DMWZTiTj.js} +1 -1
  8. package/dist/dashboard/assets/{CronStatus-At1H2k89.js → CronStatus-B-H9qqgM.js} +1 -1
  9. package/dist/dashboard/assets/{DesignQC-Dh1w3bdR.js → DesignQC-DiwQ9W4F.js} +1 -1
  10. package/dist/dashboard/assets/{MemoryViewer-CvKirgbg.js → MemoryViewer-D1JNMmiW.js} +1 -1
  11. package/dist/dashboard/assets/{NativeMemory-BSgYOQFp.js → NativeMemory-DHBwEH9v.js} +1 -1
  12. package/dist/dashboard/assets/{ProjectOverview-DtiKpV0_.js → ProjectOverview-DMAvk-bv.js} +1 -1
  13. package/dist/dashboard/assets/{ProjectsAggregate-CHdQdR2q.js → ProjectsAggregate-BbaIAkpr.js} +1 -1
  14. package/dist/dashboard/assets/{StatusBadge-DlemQvmI.js → StatusBadge-DOJHQmbh.js} +1 -1
  15. package/dist/dashboard/assets/{TokenUsage-BZDASf1Y.js → TokenUsage-CwM__iGZ.js} +1 -1
  16. package/dist/dashboard/assets/{index-BbqffKH2.js → index-DW9EFr5G.js} +3 -3
  17. package/dist/dashboard/index.html +1 -1
  18. package/dist/hooks/post-read.js +9 -7
  19. package/dist/hooks/post-write.js +17 -14
  20. package/dist/hooks/pre-read.js +3 -0
  21. package/dist/hooks/shared.js +5 -4
  22. package/dist/hooks/stop.js +4 -1
  23. package/dist/hooks/token-estimator.js +58 -0
  24. package/dist/src/buglog/bug-tracker.js +8 -1
  25. package/dist/src/buglog/bug-tracker.js.map +1 -1
  26. package/dist/src/daemon/cron-engine.js +29 -5
  27. package/dist/src/daemon/cron-engine.js.map +1 -1
  28. package/dist/src/hooks/post-read.js +9 -7
  29. package/dist/src/hooks/post-read.js.map +1 -1
  30. package/dist/src/hooks/post-write.js +17 -14
  31. package/dist/src/hooks/post-write.js.map +1 -1
  32. package/dist/src/hooks/pre-read.js +3 -0
  33. package/dist/src/hooks/pre-read.js.map +1 -1
  34. package/dist/src/hooks/shared.js +5 -4
  35. package/dist/src/hooks/shared.js.map +1 -1
  36. package/dist/src/hooks/stop.js +4 -1
  37. package/dist/src/hooks/stop.js.map +1 -1
  38. package/dist/src/hooks/token-estimator.js +59 -0
  39. package/dist/src/hooks/token-estimator.js.map +1 -0
  40. package/dist/src/scanner/anatomy-scanner.js +8 -19
  41. package/dist/src/scanner/anatomy-scanner.js.map +1 -1
  42. package/dist/src/tracker/token-estimator.js +4 -19
  43. package/dist/src/tracker/token-estimator.js.map +1 -1
  44. package/dist/src/tracker/token-ledger.js.map +1 -1
  45. package/dist/src/tracker/waste-detector.js +9 -9
  46. package/dist/src/tracker/waste-detector.js.map +1 -1
  47. package/dist/src/utils/embeddings.js +58 -0
  48. package/dist/src/utils/embeddings.js.map +1 -0
  49. package/dist/src/utils/maintenance.js +113 -105
  50. package/dist/src/utils/maintenance.js.map +1 -1
  51. package/dist/src/utils/recall.js +11 -7
  52. package/dist/src/utils/recall.js.map +1 -1
  53. package/dist/src/utils/remote.js +9 -5
  54. package/dist/src/utils/remote.js.map +1 -1
  55. package/package.json +1 -1
@@ -7,7 +7,7 @@
7
7
  <link rel="preconnect" href="https://fonts.googleapis.com" />
8
8
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
9
9
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet" />
10
- <script type="module" crossorigin src="./assets/index-BbqffKH2.js"></script>
10
+ <script type="module" crossorigin src="./assets/index-DW9EFr5G.js"></script>
11
11
  <link rel="stylesheet" crossorigin href="./assets/index-Cr3yWM5G.css">
12
12
  </head>
13
13
  <body>
@@ -1,5 +1,5 @@
1
1
  import * as path from "node:path";
2
- import { getWolfDir, ensureWolfDir, readJSON, writeJSON, readMarkdown, parseAnatomy, estimateTokens, readStdin, normalizePath, loadIgnore, isSecretFile } from "./shared.js";
2
+ import { getWolfDir, ensureWolfDir, readJSON, writeJSON, readMarkdown, parseAnatomy, estimateFileTokens, getTokenRatios, readStdin, normalizePath, loadIgnore, isSecretFile } from "./shared.js";
3
3
  async function main() {
4
4
  ensureWolfDir();
5
5
  const wolfDir = getWolfDir();
@@ -47,11 +47,7 @@ async function main() {
47
47
  process.exit(0);
48
48
  return;
49
49
  }
50
- const ext = path.extname(filePath).toLowerCase();
51
- const codeExts = new Set([".ts", ".js", ".tsx", ".jsx", ".py", ".rs", ".go", ".java", ".c", ".cpp", ".css", ".json", ".yaml", ".yml", ".dart"]);
52
- const proseExts = new Set([".md", ".txt", ".rst"]);
53
- const type = codeExts.has(ext) ? "code" : proseExts.has(ext) ? "prose" : "mixed";
54
- let tokens = content ? estimateTokens(content, type) : 0;
50
+ let tokens = content ? estimateFileTokens(content, filePath, getTokenRatios(wolfDir)) : 0;
55
51
  // Fallback: if tool_output had no content, use anatomy token estimate
56
52
  if (tokens === 0) {
57
53
  const anatomyContent = readMarkdown(path.join(wolfDir, "anatomy.md"));
@@ -70,7 +66,13 @@ async function main() {
70
66
  }
71
67
  const session = readJSON(sessionFile, { files_read: {} });
72
68
  if (session.files_read[normalizedFile]) {
73
- session.files_read[normalizedFile].tokens = tokens;
69
+ // Never let a re-read shrink the estimate to zero. A repeat read often arrives with an
70
+ // empty tool_output.content, and if the file has no anatomy entry the fallback above
71
+ // cannot recover a number — overwriting unconditionally would wipe the good first-read
72
+ // estimate. That deflates inputTokens in stop.ts and, because savedFromRepeats multiplies
73
+ // by (count - 1), silently zeroes the repeat-savings metric too.
74
+ const prev = session.files_read[normalizedFile].tokens ?? 0;
75
+ session.files_read[normalizedFile].tokens = Math.max(prev, tokens);
74
76
  }
75
77
  else {
76
78
  session.files_read[normalizedFile] = {
@@ -1,7 +1,7 @@
1
1
  import * as fs from "node:fs";
2
2
  import * as path from "node:path";
3
3
  import * as crypto from "node:crypto";
4
- import { getWolfDir, ensureWolfDir, readJSON, writeJSON, parseAnatomy, serializeAnatomy, extractDescription, estimateTokens, appendMarkdown, timeShort, readStdin, normalizePath, getRetention, loadIgnore, readBugLog, isSecretFile } from "./shared.js";
4
+ import { getWolfDir, ensureWolfDir, readJSON, writeJSON, parseAnatomy, serializeAnatomy, extractDescription, estimateFileTokens, getTokenRatios, appendMarkdown, timeShort, readStdin, normalizePath, getRetention, loadIgnore, readBugLog, isSecretFile } from "./shared.js";
5
5
  async function main() {
6
6
  ensureWolfDir();
7
7
  const wolfDir = getWolfDir();
@@ -58,6 +58,13 @@ async function main() {
58
58
  }
59
59
  const oldStr = input.tool_input?.old_string ?? "";
60
60
  const newStr = input.tool_input?.new_string ?? "";
61
+ // MultiEdit carries its changes in edits[], not old_string/new_string — so newStr was ""
62
+ // there and the whole call got booked as 0 output tokens. Sum the replacement text of
63
+ // every edit so a multi-edit costs what it actually cost.
64
+ const multiEdits = Array.isArray(input.tool_input?.edits) ? input.tool_input.edits : [];
65
+ const writtenText = multiEdits.length > 0
66
+ ? multiEdits.map((e) => e?.new_string ?? "").join("\n")
67
+ : newStr;
61
68
  // 1. Update anatomy.md
62
69
  try {
63
70
  const anatomyPath = path.join(wolfDir, "anatomy.md");
@@ -81,11 +88,7 @@ async function main() {
81
88
  fileContent = input.tool_input?.content ?? "";
82
89
  }
83
90
  const desc = extractDescription(absolutePath, fileContent).slice(0, 100);
84
- const ext = path.extname(absolutePath).toLowerCase();
85
- const codeExts = new Set([".ts", ".js", ".tsx", ".jsx", ".py", ".json", ".yaml", ".yml", ".css", ".dart"]);
86
- const proseExts = new Set([".md", ".txt", ".rst"]);
87
- const type = codeExts.has(ext) ? "code" : proseExts.has(ext) ? "prose" : "mixed";
88
- const tokens = estimateTokens(fileContent, type);
91
+ const tokens = estimateFileTokens(fileContent, absolutePath, getTokenRatios(wolfDir));
89
92
  if (!sections.has(sectionKey))
90
93
  sections.set(sectionKey, []);
91
94
  const entries = sections.get(sectionKey);
@@ -133,10 +136,7 @@ async function main() {
133
136
  const action = toolName === "Write" ? "Created" : toolName === "MultiEdit" ? "Multi-edited" : "Edited";
134
137
  const relFile = normalizePath(path.relative(projectRoot, absolutePath));
135
138
  const fileContent = input.tool_input?.content ?? "";
136
- const ext = path.extname(absolutePath).toLowerCase();
137
- const codeExts = new Set([".ts", ".js", ".tsx", ".jsx", ".py", ".json", ".yaml", ".yml", ".css", ".dart"]);
138
- const type = codeExts.has(ext) ? "code" : "mixed";
139
- const writeTokens = estimateTokens(fileContent || newStr, type);
139
+ const writeTokens = estimateFileTokens(fileContent || writtenText, absolutePath, getTokenRatios(wolfDir));
140
140
  let changeDesc = "";
141
141
  if (oldStr && newStr) {
142
142
  changeDesc = summarizeEdit(oldStr, newStr, baseName);
@@ -154,7 +154,7 @@ async function main() {
154
154
  const normalizedFile = normalizePath(filePath);
155
155
  const action = toolName === "Write" ? "create" : "edit";
156
156
  const fileContent = input.tool_input?.content ?? "";
157
- const tokens = estimateTokens(fileContent || newStr, "code");
157
+ const tokens = estimateFileTokens(fileContent || writtenText, absolutePath, getTokenRatios(wolfDir));
158
158
  session.files_written.push({
159
159
  file: normalizedFile,
160
160
  action,
@@ -274,7 +274,7 @@ function autoDetectBugFix(wolfDir, absolutePath, projectRoot, oldStr, newStr) {
274
274
  const basename = path.basename(absolutePath);
275
275
  const ext = path.extname(basename).toLowerCase();
276
276
  // Detect what kind of fix this is
277
- const detection = detectFixPattern(oldStr, newStr, ext);
277
+ const detection = detectFixPattern(oldStr, newStr, ext, path.basename(relFile));
278
278
  if (!detection)
279
279
  return;
280
280
  // Check for recent duplicate (same file + same category within 30 min).
@@ -325,7 +325,7 @@ function autoDetectBugFix(wolfDir, absolutePath, projectRoot, oldStr, newStr) {
325
325
  }
326
326
  writeJSON(bugLogPath, bugLog);
327
327
  }
328
- function detectFixPattern(oldStr, newStr, ext) {
328
+ function detectFixPattern(oldStr, newStr, ext, fileLabel) {
329
329
  const oldLines = oldStr.split("\n");
330
330
  const newLines = newStr.split("\n");
331
331
  // --- Error handling added ---
@@ -345,7 +345,10 @@ function detectFixPattern(oldStr, newStr, ext) {
345
345
  (/!==?\s*(null|undefined)/.test(newStr) && !/!==?\s*(null|undefined)/.test(oldStr))) {
346
346
  return {
347
347
  category: "null-safety",
348
- summary: `Null/undefined access in ${path.basename(path.basename(""))}`,
348
+ // Was path.basename(path.basename("")) — a hardcoded empty literal, so every
349
+ // null-safety detection produced the same blank summary. That is also the string
350
+ // findSimilarBugs matches on, so all of them collapsed into one dedupe bucket.
351
+ summary: `Null/undefined access in ${fileLabel}`,
349
352
  rootCause: "Property access on potentially null/undefined value",
350
353
  fix: `Added null safety (optional chaining or null check)`,
351
354
  context: extractChangedLines(oldStr, newStr),
@@ -109,6 +109,9 @@ async function main() {
109
109
  count: 1,
110
110
  tokens: 0,
111
111
  first_read: new Date().toISOString(),
112
+ // Whether anatomy.md already described this file. The ledger used to hardcode this as
113
+ // false, which made the waste detector's "anatomy would have sufficed" pattern unreachable.
114
+ anatomy_had_description: found,
112
115
  mtime: fileMtime,
113
116
  };
114
117
  writeJSON(sessionFile, session);
@@ -835,10 +835,11 @@ export function extractDescription(filePath, preloadedContent) {
835
835
  }
836
836
  return "";
837
837
  }
838
- export function estimateTokens(text, type = "mixed") {
839
- const ratio = type === "code" ? 3.5 : type === "prose" ? 4.0 : 3.75;
840
- return Math.ceil(text.length / ratio);
841
- }
838
+ // Estimation lives in tracker/token-estimator.ts — the single source of truth for both
839
+ // the extension table and the char/token ratios. Re-exported here so hook call sites keep
840
+ // importing from ./shared.js as before.
841
+ import { estimateTokens } from "./token-estimator.js";
842
+ export { estimateTokens, estimateFileTokens, detectContentType, getTokenRatios, DEFAULT_RATIOS, } from "./token-estimator.js";
842
843
  // Which coding agent is driving this hook — labels ledger sessions so per-agent usage can be split.
843
844
  export function detectAgent() {
844
845
  if (process.env.CLAUDE_PROJECT_DIR)
@@ -56,11 +56,14 @@ async function main() {
56
56
  session.reminders_shown = [...alreadyShown];
57
57
  const reminders = fresh.map((c) => c.msg);
58
58
  // Build session entry for ledger
59
+ // One entry per unique file — read_count carries the repetition, since the waste detector
60
+ // cannot recover it by counting array entries (it used to try, and never found any).
59
61
  const reads = Object.entries(session.files_read).map(([file, data]) => ({
60
62
  file,
61
63
  tokens_estimated: data.tokens,
64
+ read_count: data.count,
62
65
  was_repeated: data.count > 1,
63
- anatomy_had_description: false, // simplified
66
+ anatomy_had_description: data.anatomy_had_description ?? false,
64
67
  }));
65
68
  const writes = session.files_written.map((w) => ({
66
69
  file: w.file,
@@ -0,0 +1,58 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ // Lives under src/hooks/ because the hooks are compiled with their own tsconfig
4
+ // (rootDir: src/hooks) and must not import from outside it — which is precisely why three
5
+ // divergent copies of this table existed in the first place. src/tracker/token-estimator.ts
6
+ // re-exports from here so non-hook code shares the same numbers.
7
+ // Single source of truth for extension → content type. Three separate copies of this
8
+ // table used to live in post-read.ts, post-write.ts and anatomy-scanner.ts, and they
9
+ // disagreed: .rs/.go/.java/.c/.cpp counted as "code" on read but "mixed" on write, and
10
+ // a .md write was charged the code ratio outright. Same file, different token estimate
11
+ // depending on which hook happened to run. Everything now routes through here.
12
+ const CODE_EXTS = new Set([
13
+ ".ts", ".js", ".tsx", ".jsx", ".py", ".rs", ".go", ".java",
14
+ ".c", ".cpp", ".h", ".css", ".scss", ".sql", ".sh", ".yaml",
15
+ ".yml", ".json", ".toml", ".xml", ".dart",
16
+ ]);
17
+ const PROSE_EXTS = new Set([".md", ".txt", ".rst", ".adoc"]);
18
+ export const DEFAULT_RATIOS = { code: 3.5, prose: 4.0, mixed: 3.75 };
19
+ export function detectContentType(filePath) {
20
+ const ext = path.extname(filePath).toLowerCase();
21
+ if (CODE_EXTS.has(ext))
22
+ return "code";
23
+ if (PROSE_EXTS.has(ext))
24
+ return "prose";
25
+ return "mixed";
26
+ }
27
+ const ratioCache = new Map();
28
+ /**
29
+ * Ratios from config.json (openwolf.token_audit). These keys were shipped in the init
30
+ * template and documented as tunable, but nothing ever read them — every estimator
31
+ * hardcoded 3.5/4.0/3.75. There is no separate "mixed" key by design: it is the midpoint
32
+ * of the two configured ends, which is exactly what the old hardcoded 3.75 was.
33
+ */
34
+ export function getTokenRatios(wolfDir) {
35
+ const cached = ratioCache.get(wolfDir);
36
+ if (cached)
37
+ return cached;
38
+ let cfg = {};
39
+ try {
40
+ cfg = JSON.parse(fs.readFileSync(path.join(wolfDir, "config.json"), "utf-8"));
41
+ }
42
+ catch { /* missing or malformed config — defaults below */ }
43
+ const audit = cfg.openwolf?.token_audit ?? {};
44
+ const sane = (v, fallback) => typeof v === "number" && Number.isFinite(v) && v > 0 ? v : fallback;
45
+ const code = sane(audit.chars_per_token_code, DEFAULT_RATIOS.code);
46
+ const prose = sane(audit.chars_per_token_prose, DEFAULT_RATIOS.prose);
47
+ const ratios = { code, prose, mixed: (code + prose) / 2 };
48
+ ratioCache.set(wolfDir, ratios);
49
+ return ratios;
50
+ }
51
+ export function estimateTokens(text, type = "mixed", ratios = DEFAULT_RATIOS) {
52
+ const ratio = type === "code" ? ratios.code : type === "prose" ? ratios.prose : ratios.mixed;
53
+ return Math.ceil(text.length / ratio);
54
+ }
55
+ /** Estimate from a path, so callers cannot pick the wrong content type by hand. */
56
+ export function estimateFileTokens(text, filePath, ratios = DEFAULT_RATIOS) {
57
+ return estimateTokens(text, detectContentType(filePath), ratios);
58
+ }
@@ -20,7 +20,14 @@ export function logBug(wolfDir, bug) {
20
20
  return;
21
21
  }
22
22
  }
23
- const id = `bug-${String(bugLog.bugs.length + 1).padStart(3, "0")}`;
23
+ // Derive the id from the highest existing numeric id, not from bugs.length — entries get
24
+ // removed by dedupe and by the retention trim in post-write.ts, after which length + 1
25
+ // hands out an id that is already taken.
26
+ const maxId = bugLog.bugs.reduce((m, b) => {
27
+ const n = parseInt(String(b.id).replace(/\D/g, ""), 10);
28
+ return Number.isFinite(n) && n > m ? n : m;
29
+ }, 0);
30
+ const id = `bug-${String(maxId + 1).padStart(3, "0")}`;
24
31
  bugLog.bugs.push({
25
32
  id,
26
33
  timestamp: now,
@@ -1 +1 @@
1
- {"version":3,"file":"bug-tracker.js","sourceRoot":"","sources":["../../../src/buglog/bug-tracker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bug-tracker.js","sourceRoot":"","sources":["../../../src/buglog/bug-tracker.ts"],"names":[],"mappings":"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"}
@@ -35,9 +35,23 @@ export function splitForContext(text, maxBytes) {
35
35
  return chunks.flatMap((c) => {
36
36
  if (Buffer.byteLength(c, "utf-8") <= maxBytes)
37
37
  return [c];
38
+ // maxBytes is a BYTE budget, but a naive c.slice(i, i+maxBytes) slices by UTF-16 code units and
39
+ // would cut a multi-byte char (or surrogate pair) in half → invalid UTF-8. Iterate by code point
40
+ // (for…of yields whole code points) and flush whenever the next char would push the piece over
41
+ // the byte budget, so a char is never split across chunks.
38
42
  const out = [];
39
- for (let i = 0; i < c.length; i += maxBytes)
40
- out.push(c.slice(i, i + maxBytes));
43
+ let piece = "";
44
+ for (const ch of c) {
45
+ if (piece && Buffer.byteLength(piece + ch, "utf-8") > maxBytes) {
46
+ out.push(piece);
47
+ piece = ch;
48
+ }
49
+ else {
50
+ piece += ch;
51
+ }
52
+ }
53
+ if (piece)
54
+ out.push(piece);
41
55
  return out;
42
56
  });
43
57
  }
@@ -408,14 +422,24 @@ export class CronEngine {
408
422
  `Either shrink cerebrum.md (\`openwolf consolidate\`) or change this task to emit JSON suggestions ` +
409
423
  `instead of a full-file rewrite.`);
410
424
  }
425
+ // Read the current file (if any). A missing file is fine — the first write has nothing to lose.
426
+ let existing = null;
411
427
  try {
412
- const before = fs.readFileSync(cerebrumPath, "utf-8");
428
+ existing = fs.readFileSync(cerebrumPath, "utf-8");
429
+ }
430
+ catch {
431
+ existing = null;
432
+ }
433
+ // If a file exists it MUST be backed up before we overwrite it. Crucially, a *failed* backup
434
+ // (disk full, permissions) must abort the overwrite — otherwise we'd destroy the original with
435
+ // no copy, the exact data-loss class bug-157 guarded against. So the backup is NOT in a try/catch:
436
+ // if it throws, the throw propagates and writeText below never runs.
437
+ if (existing !== null) {
413
438
  const stamp = new Date().toISOString().slice(0, 19).replace(/[:T]/g, "-");
414
439
  const backupDir = path.join(this.wolfDir, "backups");
415
440
  fs.mkdirSync(backupDir, { recursive: true });
416
- fs.writeFileSync(path.join(backupDir, `cerebrum-${stamp}.md`), before, "utf-8");
441
+ fs.writeFileSync(path.join(backupDir, `cerebrum-${stamp}.md`), existing, "utf-8");
417
442
  }
418
- catch { /* no existing file to back up — first write is harmless */ }
419
443
  writeText(cerebrumPath, result);
420
444
  }
421
445
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cron-engine.js","sourceRoot":"","sources":["../../../src/daemon/cron-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,IAA4B,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACzF,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AActF;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,QAAgB;IAC5D,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,QAAQ;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3D,IAAI,OAAO,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,QAAQ,EAAE,CAAC;YAChE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,SAAS,CAAC;QACtB,CAAC;IACH,CAAC;IACD,IAAI,OAAO;QAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClC,+FAA+F;IAC/F,iFAAiF;IACjF,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QAC1B,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,QAAQ;YAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,QAAQ;YAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;QAChF,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC;AAwCD,MAAM,OAAO,UAAU;IACb,OAAO,CAAS;IAChB,WAAW,CAAS;IACpB,MAAM,CAAS;IACf,SAAS,CAAyB;IAClC,cAAc,GAAoB,EAAE,CAAC;IACrC,WAAW,GAAG,IAAI,GAAG,EAAiC,CAAC;IACvD,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IAElD,YACE,OAAe,EACf,WAAmB,EACnB,MAAc,EACd,SAAiC;QAEjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,KAAK;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,SAAS;YAC5B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC3E,SAAS;YACX,CAAC;YACD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;gBAClD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;oBACnC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,EAAE,YAAY,GAAG,EAAE,CAAC,CAAC;gBACtD,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,IAAI;QACF,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACvC,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;QACD,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,iGAAiG;QACjG,qGAAqG;QACrG,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,WAAW;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QAC1D,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc;QAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;QACzD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;YAC9C,OAAO;QACT,CAAC;QACD,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAEO,YAAY;QAClB,OAAO,QAAQ,CACb,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,oBAAoB,CAAC,EAC7C,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAC1B,CAAC;IACJ,CAAC;IAEO,SAAS;QACf,+FAA+F;QAC/F,kGAAkG;QAClG,MAAM,QAAQ,GAAc,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACvI,MAAM,MAAM,GAAG,QAAQ,CAAqB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5F,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC;IACpC,CAAC;IAEO,UAAU,CAAC,KAAgB;QACjC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,EAAE,KAAK,CAAC,CAAC;IAC/D,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,IAAc;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAEjD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAExC,8FAA8F;YAC9F,6FAA6F;YAC7F,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,EAAE,GAAG,EAAE;gBACxD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC/B,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC;oBACvB,OAAO,EAAE,IAAI,CAAC,EAAE;oBAChB,MAAM,EAAE,SAAS;oBACjB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,WAAW,EAAE,QAAQ;iBACtB,CAAC,CAAC;gBACH,wBAAwB;gBACxB,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;oBACrC,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;gBACxD,CAAC;gBACD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,SAAS,CAAC;gBACb,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,IAAI,CAAC,EAAE;gBAChB,MAAM,EAAE,SAAS;gBACjB,WAAW,EAAE,QAAQ;aACtB,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,iBAAiB,QAAQ,IAAI,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACxC,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAC5D,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YAE1C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,IAAI,oBAAoB,QAAQ,MAAM,QAAQ,EAAE,CAAC,CAAC;YAEjF,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;gBACvC,qBAAqB;gBACrB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;gBAC/F,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC;gBACxD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC5B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBAC/B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBACzC,CAAC,EAAE,KAAK,CAAC,CAAC;gBACV,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,uFAAuF;gBACvF,oFAAoF;gBACpF,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,EAAE,GAAG,EAAE;oBACxD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;oBAC/B,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC;wBACvB,OAAO,EAAE,IAAI,CAAC,EAAE;wBAChB,MAAM,EAAE,QAAQ;wBAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;wBACnC,WAAW,EAAE,QAAQ;wBACrB,KAAK,EAAE,QAAQ;qBAChB,CAAC,CAAC;oBAEH,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;wBAC9B,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC;4BAC3B,OAAO,EAAE,IAAI,CAAC,EAAE;4BAChB,KAAK,EAAE,QAAQ;4BACf,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;4BACnC,QAAQ,EAAE,QAAQ;yBACnB,CAAC,CAAC;wBACH,kFAAkF;wBAClF,IAAI,KAAK,CAAC,iBAAiB,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;4BACzC,KAAK,CAAC,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;wBAChE,CAAC;oBACH,CAAC;oBAED,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACzB,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACnC,+EAA+E;gBAC/E,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC5E,CAAC;YAED,IAAI,CAAC,SAAS,CAAC;gBACb,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,IAAI,CAAC,EAAE;gBAChB,MAAM,EAAE,QAAQ;gBAChB,WAAW,EAAE,QAAQ;aACtB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,OAAe,EAAE,OAAe,EAAE,OAAe;QACtE,MAAM,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;QAC9B,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,aAAa;gBAChB,OAAO,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;YAC3C,KAAK,QAAQ;gBACX,OAAO,MAAM,GAAG,OAAO,CAAC;YAC1B;gBACE,OAAO,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,MAAkB,EAAE,MAAM,GAAG,SAAS;QAC5D,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,cAAc;gBACjB,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC5C,MAAM;YAER,KAAK,oBAAoB;gBACvB,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,eAAyB,IAAI,CAAC,CAAC,CAAC;gBACtE,MAAM;YAER,KAAK,uBAAuB;gBAC1B,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC3B,MAAM;YAER,KAAK,SAAS;gBACZ,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAiC,EAAE,MAAM,CAAC,CAAC;gBACvE,MAAM;YAER;gBACE,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,aAAqB;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QAC1B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,aAAa,CAAC,CAAC;QAEjD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,IAAI,eAAe,GAAa,EAAE,CAAC;QACnC,IAAI,kBAAkB,GAAgB,IAAI,CAAC;QAE3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;YACpE,IAAI,YAAY,EAAE,CAAC;gBACjB,6BAA6B;gBAC7B,IAAI,YAAY,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC/C,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;oBAC/H,MAAM,CAAC,IAAI,CAAC,2BAA2B,WAAW,WAAW,CAAC,CAAC;oBAC/D,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAClB,CAAC;gBAED,kBAAkB,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/C,IAAI,kBAAkB,GAAG,MAAM,EAAE,CAAC;oBAChC,YAAY,GAAG,IAAI,CAAC;oBACpB,eAAe,GAAG,EAAE,CAAC;oBACrB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB;gBACvC,CAAC;qBAAM,CAAC;oBACN,YAAY,GAAG,KAAK,CAAC;oBACrB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpB,CAAC;gBACD,SAAS;YACX,CAAC;YAED,IAAI,YAAY,EAAE,CAAC;gBACjB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QAED,yBAAyB;QACzB,IAAI,YAAY,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;YAC/H,MAAM,CAAC,IAAI,CAAC,2BAA2B,WAAW,WAAW,CAAC,CAAC;YAC/D,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3C,CAAC;IAEO,mBAAmB;QACzB,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;QAChE,+FAA+F;QAC/F,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;YACxB,MAAM,MAAM,GAAG,QAAQ,CAA0B,UAAU,EAAE,EAAE,CAAC,CAAC;YACjE,qFAAqF;YACpF,MAAqC,CAAC,WAAW;gBAChD,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAChD,MAAmF,CAAC,mBAAmB,GAAG;gBACzG,cAAc,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACxC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;aACtC,CAAC;YACF,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACK,KAAK,CAAC,SAAS,CAAC,MAAoB,EAAE,MAAc;QAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,UAAU,CAAC;QACvC,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,IAAI,EAAE,GAAG,IAAI,CAAC;QACnD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;QAE7D,MAAM,KAAK,GAA8C,EAAE,CAAC;QAC5D,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YACtD,iFAAiF;YACjF,sFAAsF;YACtF,IAAI,QAAQ,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBACpF,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,kCAAkC,CAAC,EAAE,CAAC,CAAC;gBACzE,SAAS;YACX,CAAC;YACD,IAAI,CAAC;gBACH,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;YACtG,CAAC;YAAC,MAAM,CAAC;gBACP,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QAED,yFAAyF;QACzF,4FAA4F;QAC5F,sGAAsG;QACtG,gGAAgG;QAChG,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAChD,IAAI,CAAC,MAAM,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CACb,GAAG,GAAG,CAAC,SAAS,sFAAsF;gBACtG,wCAAwC,GAAG,CAAC,SAAS,gDAAgD;gBACrG,sHAAsH,CACvH,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACnE,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,KAAK,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC5C,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9E,MAAM,UAAU,GAAG,GAAG,MAAM,CAAC,MAAM,sBAAsB,CAAC,CAAC,IAAI,GAAG,IAAI,MAAM,KAAK,EAAE,CAAC;gBACpF,4FAA4F;gBAC5F,6FAA6F;gBAC7F,wEAAwE;gBACxE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;gBACrH,IAAI,SAAS;oBAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC,IAAI,GAAG,IAAI,+EAA+E,CAAC,CAAC;gBACvK,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;gBACtD,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAEpF,+FAA+F;QAC/F,wBAAwB;QACxB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAClC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;YAC9G,OAAO;QACT,CAAC;QAAC,MAAM,CAAC,CAAC,qCAAqC,CAAC,CAAC;QAEjD,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YACzB,IAAI,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBACnH,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;YACtG,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IACtE,CAAC;IAED,iGAAiG;IACzF,aAAa,CACnB,MAAc,EAAE,KAAa,EAC7B,KAAgD,EAAE,WAAmB,EAAE,QAAkB;QAEzF,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACjD,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC1E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,IAAI,KAAK,KAAK,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG;YACb,gBAAgB,MAAM,EAAE;YACxB,EAAE;YACF,kBAAkB,KAAK,SAAS,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,4BAA4B;YACpF,8EAA8E;YAC9E,cAAc,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,uBAAuB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACrI,WAAW,GAAG,KAAK,CAAC,MAAM;gBACxB,CAAC,CAAC,0IAA0I;gBAC5I,CAAC,CAAC,EAAE;YACN,EAAE;YACF,KAAK;YACL,EAAE;SACH,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;QAC9E,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qCAAqC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACrH,CAAC;IAED;;;;;;;;;;;;;OAaG;IACK,mBAAmB,CAAC,MAAc,EAAE,cAA2B;QACrE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAC5D,IAAI,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CACb,4DAA4D,EAAE,wCAAwC;gBACtG,4FAA4F;gBAC5F,oGAAoG;gBACpG,iCAAiC,CAClC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACtD,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACrD,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,KAAK,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAClF,CAAC;QAAC,MAAM,CAAC,CAAC,2DAA2D,CAAC,CAAC;QACvE,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAClC,CAAC;CAEF"}
1
+ {"version":3,"file":"cron-engine.js","sourceRoot":"","sources":["../../../src/daemon/cron-engine.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import * as path from "node:path";
2
- import { getWolfDir, ensureWolfDir, readJSON, writeJSON, readMarkdown, parseAnatomy, estimateTokens, readStdin, normalizePath, loadIgnore, isSecretFile } from "./shared.js";
2
+ import { getWolfDir, ensureWolfDir, readJSON, writeJSON, readMarkdown, parseAnatomy, estimateFileTokens, getTokenRatios, readStdin, normalizePath, loadIgnore, isSecretFile } from "./shared.js";
3
3
  async function main() {
4
4
  ensureWolfDir();
5
5
  const wolfDir = getWolfDir();
@@ -47,11 +47,7 @@ async function main() {
47
47
  process.exit(0);
48
48
  return;
49
49
  }
50
- const ext = path.extname(filePath).toLowerCase();
51
- const codeExts = new Set([".ts", ".js", ".tsx", ".jsx", ".py", ".rs", ".go", ".java", ".c", ".cpp", ".css", ".json", ".yaml", ".yml", ".dart"]);
52
- const proseExts = new Set([".md", ".txt", ".rst"]);
53
- const type = codeExts.has(ext) ? "code" : proseExts.has(ext) ? "prose" : "mixed";
54
- let tokens = content ? estimateTokens(content, type) : 0;
50
+ let tokens = content ? estimateFileTokens(content, filePath, getTokenRatios(wolfDir)) : 0;
55
51
  // Fallback: if tool_output had no content, use anatomy token estimate
56
52
  if (tokens === 0) {
57
53
  const anatomyContent = readMarkdown(path.join(wolfDir, "anatomy.md"));
@@ -70,7 +66,13 @@ async function main() {
70
66
  }
71
67
  const session = readJSON(sessionFile, { files_read: {} });
72
68
  if (session.files_read[normalizedFile]) {
73
- session.files_read[normalizedFile].tokens = tokens;
69
+ // Never let a re-read shrink the estimate to zero. A repeat read often arrives with an
70
+ // empty tool_output.content, and if the file has no anatomy entry the fallback above
71
+ // cannot recover a number — overwriting unconditionally would wipe the good first-read
72
+ // estimate. That deflates inputTokens in stop.ts and, because savedFromRepeats multiplies
73
+ // by (count - 1), silently zeroes the repeat-savings metric too.
74
+ const prev = session.files_read[normalizedFile].tokens ?? 0;
75
+ session.files_read[normalizedFile].tokens = Math.max(prev, tokens);
74
76
  }
75
77
  else {
76
78
  session.files_read[normalizedFile] = {
@@ -1 +1 @@
1
- {"version":3,"file":"post-read.js","sourceRoot":"","sources":["../../../src/hooks/post-read.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAO7K,KAAK,UAAU,IAAI;IACjB,aAAa,EAAE,CAAC;IAChB,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IAEzD,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;IAC9B,IAAI,KAAiG,CAAC;IACtG,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,EAAE,SAAS,IAAI,KAAK,CAAC,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC;IAC7E,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,EAAE,OAAO,IAAI,EAAE,CAAC;IACjD,IAAI,CAAC,QAAQ,EAAE,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IAE3C,MAAM,cAAc,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAE/C,qEAAqE;IACrE,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAClF,MAAM,YAAY,GAAG,cAAc,CAAC,UAAU,CAAC,UAAU,CAAC;QACxD,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QAC5D,CAAC,CAAC,EAAE,CAAC;IACP,yFAAyF;IACzF,wFAAwF;IACxF,+BAA+B;IAC/B,IAAI,CAAC,YAAY,EAAE,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IAE/C,IAAI,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,iFAAiF;IACjF,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IAEtE,wDAAwD;IACxD,IAAI,YAAY,CAAC,cAAc,CAAC,EAAE,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IAE9D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAChJ,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAEjF,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,IAAkC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvF,sEAAsE;IACtE,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QACjB,MAAM,cAAc,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;QACtE,MAAM,QAAQ,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;QAC9C,KAAK,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,QAAQ,EAAE,CAAC;YAC7C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBACtE,IAAI,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,GAAG,GAAG,YAAY,CAAC,EAAE,CAAC;oBACzF,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;oBACtB,MAAM;gBACR,CAAC;YACH,CAAC;YACD,IAAI,MAAM,GAAG,CAAC;gBAAE,MAAM;QACxB,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAc,WAAW,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IACvE,IAAI,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC;IACrD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,GAAG;YACnC,KAAK,EAAE,CAAC;YACR,MAAM;YACN,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACrC,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"post-read.js","sourceRoot":"","sources":["../../../src/hooks/post-read.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import * as fs from "node:fs";
2
2
  import * as path from "node:path";
3
3
  import * as crypto from "node:crypto";
4
- import { getWolfDir, ensureWolfDir, readJSON, writeJSON, parseAnatomy, serializeAnatomy, extractDescription, estimateTokens, appendMarkdown, timeShort, readStdin, normalizePath, getRetention, loadIgnore, readBugLog, isSecretFile } from "./shared.js";
4
+ import { getWolfDir, ensureWolfDir, readJSON, writeJSON, parseAnatomy, serializeAnatomy, extractDescription, estimateFileTokens, getTokenRatios, appendMarkdown, timeShort, readStdin, normalizePath, getRetention, loadIgnore, readBugLog, isSecretFile } from "./shared.js";
5
5
  async function main() {
6
6
  ensureWolfDir();
7
7
  const wolfDir = getWolfDir();
@@ -58,6 +58,13 @@ async function main() {
58
58
  }
59
59
  const oldStr = input.tool_input?.old_string ?? "";
60
60
  const newStr = input.tool_input?.new_string ?? "";
61
+ // MultiEdit carries its changes in edits[], not old_string/new_string — so newStr was ""
62
+ // there and the whole call got booked as 0 output tokens. Sum the replacement text of
63
+ // every edit so a multi-edit costs what it actually cost.
64
+ const multiEdits = Array.isArray(input.tool_input?.edits) ? input.tool_input.edits : [];
65
+ const writtenText = multiEdits.length > 0
66
+ ? multiEdits.map((e) => e?.new_string ?? "").join("\n")
67
+ : newStr;
61
68
  // 1. Update anatomy.md
62
69
  try {
63
70
  const anatomyPath = path.join(wolfDir, "anatomy.md");
@@ -81,11 +88,7 @@ async function main() {
81
88
  fileContent = input.tool_input?.content ?? "";
82
89
  }
83
90
  const desc = extractDescription(absolutePath, fileContent).slice(0, 100);
84
- const ext = path.extname(absolutePath).toLowerCase();
85
- const codeExts = new Set([".ts", ".js", ".tsx", ".jsx", ".py", ".json", ".yaml", ".yml", ".css", ".dart"]);
86
- const proseExts = new Set([".md", ".txt", ".rst"]);
87
- const type = codeExts.has(ext) ? "code" : proseExts.has(ext) ? "prose" : "mixed";
88
- const tokens = estimateTokens(fileContent, type);
91
+ const tokens = estimateFileTokens(fileContent, absolutePath, getTokenRatios(wolfDir));
89
92
  if (!sections.has(sectionKey))
90
93
  sections.set(sectionKey, []);
91
94
  const entries = sections.get(sectionKey);
@@ -133,10 +136,7 @@ async function main() {
133
136
  const action = toolName === "Write" ? "Created" : toolName === "MultiEdit" ? "Multi-edited" : "Edited";
134
137
  const relFile = normalizePath(path.relative(projectRoot, absolutePath));
135
138
  const fileContent = input.tool_input?.content ?? "";
136
- const ext = path.extname(absolutePath).toLowerCase();
137
- const codeExts = new Set([".ts", ".js", ".tsx", ".jsx", ".py", ".json", ".yaml", ".yml", ".css", ".dart"]);
138
- const type = codeExts.has(ext) ? "code" : "mixed";
139
- const writeTokens = estimateTokens(fileContent || newStr, type);
139
+ const writeTokens = estimateFileTokens(fileContent || writtenText, absolutePath, getTokenRatios(wolfDir));
140
140
  let changeDesc = "";
141
141
  if (oldStr && newStr) {
142
142
  changeDesc = summarizeEdit(oldStr, newStr, baseName);
@@ -154,7 +154,7 @@ async function main() {
154
154
  const normalizedFile = normalizePath(filePath);
155
155
  const action = toolName === "Write" ? "create" : "edit";
156
156
  const fileContent = input.tool_input?.content ?? "";
157
- const tokens = estimateTokens(fileContent || newStr, "code");
157
+ const tokens = estimateFileTokens(fileContent || writtenText, absolutePath, getTokenRatios(wolfDir));
158
158
  session.files_written.push({
159
159
  file: normalizedFile,
160
160
  action,
@@ -274,7 +274,7 @@ function autoDetectBugFix(wolfDir, absolutePath, projectRoot, oldStr, newStr) {
274
274
  const basename = path.basename(absolutePath);
275
275
  const ext = path.extname(basename).toLowerCase();
276
276
  // Detect what kind of fix this is
277
- const detection = detectFixPattern(oldStr, newStr, ext);
277
+ const detection = detectFixPattern(oldStr, newStr, ext, path.basename(relFile));
278
278
  if (!detection)
279
279
  return;
280
280
  // Check for recent duplicate (same file + same category within 30 min).
@@ -325,7 +325,7 @@ function autoDetectBugFix(wolfDir, absolutePath, projectRoot, oldStr, newStr) {
325
325
  }
326
326
  writeJSON(bugLogPath, bugLog);
327
327
  }
328
- function detectFixPattern(oldStr, newStr, ext) {
328
+ function detectFixPattern(oldStr, newStr, ext, fileLabel) {
329
329
  const oldLines = oldStr.split("\n");
330
330
  const newLines = newStr.split("\n");
331
331
  // --- Error handling added ---
@@ -345,7 +345,10 @@ function detectFixPattern(oldStr, newStr, ext) {
345
345
  (/!==?\s*(null|undefined)/.test(newStr) && !/!==?\s*(null|undefined)/.test(oldStr))) {
346
346
  return {
347
347
  category: "null-safety",
348
- summary: `Null/undefined access in ${path.basename(path.basename(""))}`,
348
+ // Was path.basename(path.basename("")) — a hardcoded empty literal, so every
349
+ // null-safety detection produced the same blank summary. That is also the string
350
+ // findSimilarBugs matches on, so all of them collapsed into one dedupe bucket.
351
+ summary: `Null/undefined access in ${fileLabel}`,
349
352
  rootCause: "Property access on potentially null/undefined value",
350
353
  fix: `Added null safety (optional chaining or null check)`,
351
354
  context: extractChangedLines(oldStr, newStr),