openwolf-enhanced 1.16.5 → 1.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/CHANGELOG.md +105 -0
  2. package/dist/dashboard/assets/{AISuggestions-DF-LNNBU.js → AISuggestions-BfgCmCvU.js} +1 -1
  3. package/dist/dashboard/assets/{ActivityLog-DuQB_TaU.js → ActivityLog-DXNaS0hX.js} +1 -1
  4. package/dist/dashboard/assets/{ActivityTimeline-jWDsjU7p.js → ActivityTimeline-CbCEyVtf.js} +1 -1
  5. package/dist/dashboard/assets/{AnatomyBrowser-BOfaZMLt.js → AnatomyBrowser-Cgoo81Nn.js} +1 -1
  6. package/dist/dashboard/assets/{BugLog-Bb8Jdare.js → BugLog-4jV0KE_C.js} +1 -1
  7. package/dist/dashboard/assets/{CerebrumViewer-Clix3JOG.js → CerebrumViewer-DTeD__lQ.js} +1 -1
  8. package/dist/dashboard/assets/{CronStatus-ne4IxXs8.js → CronStatus-fXVkPzMI.js} +1 -1
  9. package/dist/dashboard/assets/{DesignQC-COcZ38nI.js → DesignQC-CxorYE4I.js} +1 -1
  10. package/dist/dashboard/assets/{MemoryViewer-BYUkDs9k.js → MemoryViewer-BbBPGn8t.js} +1 -1
  11. package/dist/dashboard/assets/{NativeMemory-20gjdcAD.js → NativeMemory-CBf2B9WK.js} +1 -1
  12. package/dist/dashboard/assets/{ProjectOverview-BoadyvwS.js → ProjectOverview-CeaY2OtB.js} +1 -1
  13. package/dist/dashboard/assets/{ProjectsAggregate-z6XtnlbZ.js → ProjectsAggregate-BsBMRflP.js} +1 -1
  14. package/dist/dashboard/assets/{StatusBadge-CBsSwOOc.js → StatusBadge-CZX-0CQE.js} +1 -1
  15. package/dist/dashboard/assets/{TokenUsage-n2PFPxqk.js → TokenUsage-C9yjDd1O.js} +1 -1
  16. package/dist/dashboard/assets/{index-DLkIxGHf.js → index-D2sNMefT.js} +3 -3
  17. package/dist/dashboard/index.html +1 -1
  18. package/dist/hooks/pre-read.js +10 -0
  19. package/dist/hooks/precompact.js +30 -0
  20. package/dist/hooks/session-start.js +51 -24
  21. package/dist/hooks/shared.js +47 -0
  22. package/dist/hooks/stop.js +22 -1
  23. package/dist/src/cli/consolidate-cmd.js +14 -7
  24. package/dist/src/cli/consolidate-cmd.js.map +1 -1
  25. package/dist/src/cli/index.js +18 -0
  26. package/dist/src/cli/index.js.map +1 -1
  27. package/dist/src/cli/llm-cmd.js +82 -0
  28. package/dist/src/cli/llm-cmd.js.map +1 -0
  29. package/dist/src/cli/report-cmd.js +47 -0
  30. package/dist/src/cli/report-cmd.js.map +1 -0
  31. package/dist/src/daemon/cron-engine.js +191 -57
  32. package/dist/src/daemon/cron-engine.js.map +1 -1
  33. package/dist/src/daemon/llm-provider.js +64 -8
  34. package/dist/src/daemon/llm-provider.js.map +1 -1
  35. package/dist/src/daemon/wolf-daemon.js +4 -2
  36. package/dist/src/daemon/wolf-daemon.js.map +1 -1
  37. package/dist/src/hooks/pre-read.js +10 -0
  38. package/dist/src/hooks/pre-read.js.map +1 -1
  39. package/dist/src/hooks/precompact.js +31 -0
  40. package/dist/src/hooks/precompact.js.map +1 -0
  41. package/dist/src/hooks/session-start.js +51 -24
  42. package/dist/src/hooks/session-start.js.map +1 -1
  43. package/dist/src/hooks/shared.js +47 -0
  44. package/dist/src/hooks/shared.js.map +1 -1
  45. package/dist/src/hooks/stop.js +22 -1
  46. package/dist/src/hooks/stop.js.map +1 -1
  47. package/dist/src/scanner/anatomy-scanner.js +19 -5
  48. package/dist/src/scanner/anatomy-scanner.js.map +1 -1
  49. package/dist/src/scanner/symbol-extractor.js +82 -0
  50. package/dist/src/scanner/symbol-extractor.js.map +1 -0
  51. package/dist/src/utils/agent-hooks.js +2 -1
  52. package/dist/src/utils/agent-hooks.js.map +1 -1
  53. package/dist/src/utils/hooks-deploy.js +1 -0
  54. package/dist/src/utils/hooks-deploy.js.map +1 -1
  55. package/dist/src/utils/recall.js +4 -0
  56. package/dist/src/utils/recall.js.map +1 -1
  57. 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-DLkIxGHf.js"></script>
10
+ <script type="module" crossorigin src="./assets/index-D2sNMefT.js"></script>
11
11
  <link rel="stylesheet" crossorigin href="./assets/index-Cr3yWM5G.css">
12
12
  </head>
13
13
  <body>
@@ -74,6 +74,8 @@ async function main() {
74
74
  // Check anatomy.md for this file
75
75
  const anatomyContent = readMarkdown(path.join(wolfDir, "anatomy.md"));
76
76
  const sections = parseAnatomy(anatomyContent);
77
+ // Symbol-level hints (sidecar written by the scanner) — keyed by the same section+file relpath.
78
+ const symbolIndex = readJSON(path.join(wolfDir, "anatomy-symbols.json"), {}).files ?? {};
77
79
  let found = false;
78
80
  for (const [sectionKey, entries] of sections) {
79
81
  for (const entry of entries) {
@@ -81,6 +83,14 @@ async function main() {
81
83
  const entryRelPath = normalizePath(path.join(sectionKey, entry.file));
82
84
  if (normalizedFile.endsWith(entryRelPath) || normalizedFile.endsWith("/" + entryRelPath)) {
83
85
  process.stderr.write(`📋 OpenWolf anatomy: ${entry.file} — ${entry.description} (~${entry.tokens} tok)\n`);
86
+ // If we indexed this big file's symbols, offer line ranges so the agent can read one
87
+ // function with offset/limit instead of the whole file.
88
+ const syms = symbolIndex[entryRelPath];
89
+ if (syms && syms.length > 0) {
90
+ const shown = syms.slice(0, 10).map((s) => `${s.name} (${s.startLine}-${s.endLine})`).join(", ");
91
+ const more = syms.length > 10 ? `, +${syms.length - 10} more` : "";
92
+ process.stderr.write(` ↳ symbols: ${shown}${more} — read a slice with offset/limit instead of the whole file.\n`);
93
+ }
84
94
  found = true;
85
95
  break;
86
96
  }
@@ -0,0 +1,30 @@
1
+ import * as path from "node:path";
2
+ import { getWolfDir, ensureWolfDir, readJSON, writeJSON, readStdin, timestamp } from "./shared.js";
3
+ // PreCompact hook — compaction survival.
4
+ //
5
+ // Fires just before Claude Code / Codex compacts the context window. The in-flight session state
6
+ // (_session.json) survives on disk, but nothing in the compacted context tells the model what
7
+ // already happened. This hook snapshots that state; after compaction SessionStart fires with
8
+ // source "compact" and the session-start hook re-injects a digest (incl. the files already
9
+ // modified) via additionalContext. That pair is the survival mechanism.
10
+ async function main() {
11
+ ensureWolfDir();
12
+ const wolfDir = getWolfDir();
13
+ const hooksDir = path.join(wolfDir, "hooks");
14
+ let input = {};
15
+ try {
16
+ input = JSON.parse(await readStdin());
17
+ }
18
+ catch { }
19
+ try {
20
+ const session = readJSON(path.join(hooksDir, "_session.json"), {});
21
+ writeJSON(path.join(hooksDir, "_precompact-snapshot.json"), {
22
+ at: timestamp(),
23
+ trigger: input.trigger ?? "unknown",
24
+ session,
25
+ });
26
+ }
27
+ catch { }
28
+ process.exit(0);
29
+ }
30
+ main().catch(() => process.exit(0));
@@ -1,6 +1,6 @@
1
1
  import * as fs from "node:fs";
2
2
  import * as path from "node:path";
3
- import { getWolfDir, ensureWolfDir, writeJSON, appendMarkdown, readJSON, timestamp, timeShort, buildResumeDigest, SESSION_SUMMARY_SCAFFOLD } from "./shared.js";
3
+ import { getWolfDir, ensureWolfDir, writeJSON, appendMarkdown, readJSON, timestamp, timeShort, buildResumeDigest, readStdin, SESSION_SUMMARY_SCAFFOLD } from "./shared.js";
4
4
  async function main() {
5
5
  ensureWolfDir();
6
6
  const wolfDir = getWolfDir();
@@ -21,23 +21,37 @@ async function main() {
21
21
  const sessionFile = path.join(hooksDir, "_session.json");
22
22
  const now = new Date();
23
23
  const sessionId = `session-${now.toISOString().slice(0, 10)}-${String(now.getHours()).padStart(2, "0")}${String(now.getMinutes()).padStart(2, "0")}`;
24
- // Create fresh session state
25
- writeJSON(sessionFile, {
26
- session_id: sessionId,
27
- started: timestamp(),
28
- files_read: {},
29
- files_written: [],
30
- edit_counts: {},
31
- anatomy_hits: 0,
32
- anatomy_misses: 0,
33
- repeated_reads_warned: 0,
34
- cerebrum_warnings: 0,
35
- stop_count: 0,
36
- });
37
- // Append session header to memory.md
38
- const memoryPath = path.join(wolfDir, "memory.md");
39
- const header = `\n## Session: ${now.toISOString().slice(0, 10)} ${timeShort()}\n\n${SESSION_SUMMARY_SCAFFOLD}\n\n| Time | Action | File(s) | Outcome | ~Tokens |\n|------|--------|---------|---------|--------|\n`;
40
- appendMarkdown(memoryPath, header);
24
+ // SessionStart fires for startup/resume/clear/compact. Only startup and clear begin a genuinely
25
+ // new session — on resume/compact the session is still live, and resetting _session.json here
26
+ // would wipe this session's read/write tracking mid-flight and append a spurious memory header
27
+ // on every compaction (compaction survival).
28
+ let source = "startup";
29
+ try {
30
+ const hookInput = JSON.parse(await readStdin());
31
+ if (typeof hookInput.source === "string")
32
+ source = hookInput.source;
33
+ }
34
+ catch { }
35
+ const continuing = (source === "compact" || source === "resume") && fs.existsSync(sessionFile);
36
+ if (!continuing) {
37
+ // Create fresh session state
38
+ writeJSON(sessionFile, {
39
+ session_id: sessionId,
40
+ started: timestamp(),
41
+ files_read: {},
42
+ files_written: [],
43
+ edit_counts: {},
44
+ anatomy_hits: 0,
45
+ anatomy_misses: 0,
46
+ repeated_reads_warned: 0,
47
+ cerebrum_warnings: 0,
48
+ stop_count: 0,
49
+ });
50
+ // Append session header to memory.md
51
+ const memoryPath = path.join(wolfDir, "memory.md");
52
+ const header = `\n## Session: ${now.toISOString().slice(0, 10)} ${timeShort()}\n\n${SESSION_SUMMARY_SCAFFOLD}\n\n| Time | Action | File(s) | Outcome | ~Tokens |\n|------|--------|---------|---------|--------|\n`;
53
+ appendMarkdown(memoryPath, header);
54
+ }
41
55
  // Check cerebrum freshness — remind Claude to learn
42
56
  try {
43
57
  const cerebrumPath = path.join(wolfDir, "cerebrum.md");
@@ -66,11 +80,14 @@ async function main() {
66
80
  }
67
81
  }
68
82
  catch { }
69
- // Increment total_sessions in token-ledger
70
- const ledgerPath = path.join(wolfDir, "token-ledger.json");
71
- const ledger = readJSON(ledgerPath, { version: 1, lifetime: { total_sessions: 0 } });
72
- ledger.lifetime.total_sessions++;
73
- writeJSON(ledgerPath, ledger);
83
+ // Increment total_sessions in token-ledger — only for a genuinely new session, not a
84
+ // resume/compact continuation (which would double-count the same session).
85
+ if (!continuing) {
86
+ const ledgerPath = path.join(wolfDir, "token-ledger.json");
87
+ const ledger = readJSON(ledgerPath, { version: 1, lifetime: { total_sessions: 0 } });
88
+ ledger.lifetime.total_sessions++;
89
+ writeJSON(ledgerPath, ledger);
90
+ }
74
91
  // Inject a compact resume digest as additionalContext so the model continues without
75
92
  // re-reading STATUS.md/cerebrum/memory. Bounded and config-gated. stdout is reserved
76
93
  // for this JSON — reminders above go to stderr, so they don't collide.
@@ -78,7 +95,17 @@ async function main() {
78
95
  const config = readJSON(path.join(wolfDir, "config.json"), {});
79
96
  const sc = config.openwolf?.session_context ?? {};
80
97
  if (sc.enabled !== false) {
81
- const digest = buildResumeDigest(wolfDir, sc.max_chars ?? 6000);
98
+ let digest = buildResumeDigest(wolfDir, sc.max_chars ?? 6000);
99
+ // Post-compaction restore: compaction wipes the live context, so resurface the in-flight
100
+ // session state (which files were already touched) that the digest above doesn't cover.
101
+ if (continuing && source === "compact") {
102
+ const session = readJSON(sessionFile, {});
103
+ const files = [...new Set((session.files_written ?? []).map((w) => w.file))];
104
+ if (files.length > 0) {
105
+ const note = `## Session in progress (context was just compacted)\nFiles already modified this session: ${files.slice(-15).join(", ")}. Don't re-read them wholesale — check .wolf/memory.md for what was done.`;
106
+ digest = digest ? `${note}\n\n${digest}` : note;
107
+ }
108
+ }
82
109
  if (digest) {
83
110
  process.stdout.write(JSON.stringify({ hookSpecificOutput: { hookEventName: "SessionStart", additionalContext: digest } }));
84
111
  }
@@ -839,6 +839,53 @@ export function estimateTokens(text, type = "mixed") {
839
839
  const ratio = type === "code" ? 3.5 : type === "prose" ? 4.0 : 3.75;
840
840
  return Math.ceil(text.length / ratio);
841
841
  }
842
+ // Which coding agent is driving this hook — labels ledger sessions so per-agent usage can be split.
843
+ export function detectAgent() {
844
+ if (process.env.CLAUDE_PROJECT_DIR)
845
+ return "claude";
846
+ if (process.env.CODEX_PROJECT_ROOT)
847
+ return "codex";
848
+ if (process.env.GEMINI_CLI || process.env.GEMINI_PROJECT_DIR)
849
+ return "gemini";
850
+ return process.env.OPENWOLF_AGENT || "default";
851
+ }
852
+ // Parse a Claude Code / Codex transcript (JSONL) and sum the real token usage. Each API call emits
853
+ // one `message.usage` block; streaming can repeat a message id across lines, so we keep the last
854
+ // usage seen per id and count distinct ids as api_calls. Returns null if the file is unreadable or
855
+ // carries no usage data (older harness, no transcript).
856
+ export function readTranscriptUsage(transcriptPath) {
857
+ let raw;
858
+ try {
859
+ raw = fs.readFileSync(transcriptPath, "utf-8");
860
+ }
861
+ catch {
862
+ return null;
863
+ }
864
+ const byId = new Map();
865
+ let anon = 0;
866
+ for (const line of raw.split("\n")) {
867
+ if (!line.trim())
868
+ continue;
869
+ try {
870
+ const entry = JSON.parse(line);
871
+ const usage = entry?.message?.usage;
872
+ if (usage && typeof usage === "object" && typeof usage.output_tokens === "number") {
873
+ byId.set(entry.message.id ?? `anon-${anon++}`, usage);
874
+ }
875
+ }
876
+ catch { }
877
+ }
878
+ if (byId.size === 0)
879
+ return null;
880
+ const total = { input_tokens: 0, output_tokens: 0, cache_read_input_tokens: 0, cache_creation_input_tokens: 0, api_calls: byId.size };
881
+ for (const u of byId.values()) {
882
+ total.input_tokens += u.input_tokens ?? 0;
883
+ total.output_tokens += u.output_tokens ?? 0;
884
+ total.cache_read_input_tokens += u.cache_read_input_tokens ?? 0;
885
+ total.cache_creation_input_tokens += u.cache_creation_input_tokens ?? 0;
886
+ }
887
+ return total;
888
+ }
842
889
  export function timestamp() {
843
890
  return new Date().toISOString();
844
891
  }
@@ -1,11 +1,17 @@
1
1
  import * as fs from "node:fs";
2
2
  import * as path from "node:path";
3
- import { getWolfDir, ensureWolfDir, readJSON, writeJSON, appendMarkdown, timeShort, getRetention, compactMemoryIfLarge, countSemanticEntries, withLock } from "./shared.js";
3
+ import { getWolfDir, ensureWolfDir, readJSON, writeJSON, appendMarkdown, timeShort, getRetention, compactMemoryIfLarge, countSemanticEntries, withLock, readStdin, readTranscriptUsage, detectAgent } from "./shared.js";
4
4
  async function main() {
5
5
  ensureWolfDir();
6
6
  const wolfDir = getWolfDir();
7
7
  const hooksDir = path.join(wolfDir, "hooks");
8
8
  const sessionFile = path.join(hooksDir, "_session.json");
9
+ // Stop payload carries the harness transcript path — the source of real, measured token usage.
10
+ let hookInput = {};
11
+ try {
12
+ hookInput = JSON.parse(await readStdin());
13
+ }
14
+ catch { }
9
15
  const session = readJSON(sessionFile, {
10
16
  session_id: "",
11
17
  started: "",
@@ -63,10 +69,15 @@ async function main() {
63
69
  }));
64
70
  const inputTokens = reads.reduce((sum, r) => sum + r.tokens_estimated, 0);
65
71
  const outputTokens = writes.reduce((sum, w) => sum + w.tokens_estimated, 0);
72
+ // Measure real API usage from the transcript when the harness provides a path (F1). Done outside
73
+ // the ledger lock — it's a plain file read; only the accumulation below runs under the lock.
74
+ const realUsage = hookInput.transcript_path ? readTranscriptUsage(hookInput.transcript_path) : null;
66
75
  const sessionEntry = {
67
76
  id: session.session_id,
77
+ agent: detectAgent(),
68
78
  started: session.started,
69
79
  ended: new Date().toISOString(),
80
+ ...(realUsage ? { real_usage: realUsage } : {}),
70
81
  reads,
71
82
  writes,
72
83
  totals: {
@@ -121,6 +132,16 @@ async function main() {
121
132
  ledger.lifetime.anatomy_hits += session.anatomy_hits;
122
133
  ledger.lifetime.anatomy_misses += session.anatomy_misses;
123
134
  ledger.lifetime.repeated_reads_blocked += session.repeated_reads_warned;
135
+ // Accumulate measured usage alongside the estimates, so the ledger carries both a heuristic and
136
+ // a verifiable ground truth (F1).
137
+ if (realUsage) {
138
+ const lt = ledger.lifetime;
139
+ lt.real_input_tokens = (lt.real_input_tokens ?? 0) + realUsage.input_tokens;
140
+ lt.real_output_tokens = (lt.real_output_tokens ?? 0) + realUsage.output_tokens;
141
+ lt.real_cache_read_tokens = (lt.real_cache_read_tokens ?? 0) + realUsage.cache_read_input_tokens;
142
+ lt.real_cache_creation_tokens = (lt.real_cache_creation_tokens ?? 0) + realUsage.cache_creation_input_tokens;
143
+ lt.real_api_calls = (lt.real_api_calls ?? 0) + realUsage.api_calls;
144
+ }
124
145
  // Estimate savings: anatomy hits save ~200 tokens each, repeated reads blocked save their token count
125
146
  const savedFromAnatomy = session.anatomy_hits * 200;
126
147
  const savedFromRepeats = Object.values(session.files_read)
@@ -3,7 +3,7 @@ import * as path from "node:path";
3
3
  import { findProjectRoot } from "../scanner/project-root.js";
4
4
  import { findDuplicateEntries } from "../utils/maintenance.js";
5
5
  import { blocksFor } from "../utils/recall.js";
6
- import { resolveLlmConfig, callLlm } from "../daemon/llm-provider.js";
6
+ import { resolveLlmConfig, callLlm, requiresApiKey } from "../daemon/llm-provider.js";
7
7
  // Rewrite `content`: for each merge, replace block A's lines with the merged entry and delete block
8
8
  // B's lines. Pure + bottom-up so line indices don't shift. (1-based start/end from blocksFor.)
9
9
  export function applyConsolidations(content, merges) {
@@ -43,9 +43,9 @@ export async function consolidateCommand(opts) {
43
43
  console.log(`OpenWolf Consolidate — ${pairs.length} near-duplicate pair(s) in cerebrum.md (threshold ${threshold})\n`);
44
44
  // Resolve the LLM once (consolidation needs it). Clear guidance if unconfigured.
45
45
  const llm = resolveLlmConfig(wolfDir);
46
- const apiKey = process.env[llm.apiKeyEnv];
47
- if (!apiKey) {
48
- console.error(`${llm.apiKeyEnv} is not set — consolidation needs an LLM. Set it, or point openwolf.cron.llm_* at a provider (e.g. a free OpenAI-compatible one). Provider: ${llm.provider}/${llm.model}.`);
46
+ const apiKey = process.env[llm.apiKeyEnv] ?? "";
47
+ if (!apiKey && requiresApiKey(llm)) {
48
+ console.error(`${llm.apiKeyEnv} is not set — consolidation needs an LLM. Set it, or point openwolf.cron.llm_* at a provider (a free OpenAI-compatible one, or a local model server — LM Studio on http://localhost:1234/v1, Ollama on http://localhost:11434/v1 — which needs no key). Provider: ${llm.provider}/${llm.model}.`);
49
49
  process.exitCode = 1;
50
50
  return;
51
51
  }
@@ -60,7 +60,9 @@ export async function consolidateCommand(opts) {
60
60
  process.stdout.write(` ${Math.round(p.similarity * 100)}% lines ${p.aLine} ↔ ${p.bLine} … `);
61
61
  let merged = "";
62
62
  try {
63
- merged = (await callLlm(llm, apiKey, MERGE_PROMPT(a.text, b.text), { maxTokens: 900, timeoutMs: 60000 })).trim();
63
+ // 3000, not 900: the merge itself is short, but a reasoning model bills its thinking to the same
64
+ // budget and would otherwise return nothing — every merge then looked "implausible" and was skipped.
65
+ merged = (await callLlm(llm, apiKey, MERGE_PROMPT(a.text, b.text), { maxTokens: 3000, timeoutMs: 120000 })).trim();
64
66
  merged = merged.replace(/^```[\w]*\n?|\n?```$/g, "").trim(); // strip stray fences
65
67
  }
66
68
  catch (e) {
@@ -87,11 +89,16 @@ export async function consolidateCommand(opts) {
87
89
  console.log(`\n(dry run) ${merges.length} pair(s) would be merged. Run without --dry-run to apply.`);
88
90
  return;
89
91
  }
90
- // Back up, then rewrite.
92
+ // Back up, then rewrite. A failed backup is a HARD STOP, not best-effort: same failure class as
93
+ // bug-157 — if the safety net silently fails, the dangerous step must not proceed. No backup, no rewrite.
91
94
  try {
92
95
  fs.copyFileSync(cerebrumPath, cerebrumPath + ".bak-pre-consolidate");
93
96
  }
94
- catch { /* best-effort */ }
97
+ catch (e) {
98
+ console.error(`\nAborting: could not write backup cerebrum.md.bak-pre-consolidate (${e.message}). cerebrum.md left untouched.`);
99
+ process.exitCode = 1;
100
+ return;
101
+ }
95
102
  fs.writeFileSync(cerebrumPath, applyConsolidations(content, merges), "utf-8");
96
103
  console.log(`\nDone. Merged ${merges.length} pair(s) → cerebrum.md (backup: cerebrum.md.bak-pre-consolidate). Review the diff.`);
97
104
  }
@@ -1 +1 @@
1
- {"version":3,"file":"consolidate-cmd.js","sourceRoot":"","sources":["../../../src/cli/consolidate-cmd.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"consolidate-cmd.js","sourceRoot":"","sources":["../../../src/cli/consolidate-cmd.ts"],"names":[],"mappings":"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"}
@@ -153,6 +153,16 @@ export function createProgram() {
153
153
  const { consolidateCommand } = await import("./consolidate-cmd.js");
154
154
  await consolidateCommand(opts);
155
155
  });
156
+ // --- LLM command ---
157
+ program
158
+ .command("llm")
159
+ .description("Show (and test) the LLM the project's AI features call — incl. local models via Ollama/llama.cpp")
160
+ .option("--test", "Send a real prompt and time the round-trip")
161
+ .option("--prompt <text>", "Prompt to send with --test")
162
+ .action(async (opts) => {
163
+ const { llmCommand } = await import("./llm-cmd.js");
164
+ await llmCommand(opts);
165
+ });
156
166
  // --- Export command ---
157
167
  program
158
168
  .command("export <what>")
@@ -163,6 +173,14 @@ export function createProgram() {
163
173
  const { exportCommand } = await import("./export-cmd.js");
164
174
  exportCommand(what, opts);
165
175
  });
176
+ // --- Report command (estimated vs measured token usage) ---
177
+ program
178
+ .command("report")
179
+ .description("Show token usage: estimated (heuristic) vs measured (from harness transcripts)")
180
+ .action(async () => {
181
+ const { reportCommand } = await import("./report-cmd.js");
182
+ reportCommand();
183
+ });
166
184
  // --- MCP server ---
167
185
  program
168
186
  .command("mcp")
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ import * as path from "node:path";
2
+ import { findProjectRoot } from "../scanner/project-root.js";
3
+ import { resolveLlmConfig, callLlm, requiresApiKey, isLocalEndpoint } from "../daemon/llm-provider.js";
4
+ // The port is read back out of the configured base_url — hard-coding Ollama's 11434 sent LM Studio
5
+ // users (port 1234) to forward a port nothing was listening on.
6
+ function endpointPort(baseUrl) {
7
+ try {
8
+ const u = new URL(baseUrl);
9
+ return u.port || (u.protocol === "https:" ? "443" : "80");
10
+ }
11
+ catch {
12
+ return "1234";
13
+ }
14
+ }
15
+ // Turn a fetch/HTTP failure into the one line that actually tells the user what to do next.
16
+ export function explainLlmError(cfg, err) {
17
+ const msg = err.message || String(err);
18
+ const cause = err.cause?.code;
19
+ const port = endpointPort(cfg.baseUrl);
20
+ if (cause === "ECONNREFUSED" || /ECONNREFUSED|fetch failed|Empty reply|socket hang up/i.test(msg)) {
21
+ return isLocalEndpoint(cfg.baseUrl)
22
+ ? `Nothing is listening on ${cfg.baseUrl}. If the model runs on another machine, forward the port to this one:\n` +
23
+ ` ssh -N -R ${port}:localhost:${port} <user>@<this-host> (run on the machine with the model)\n` +
24
+ ` If the tunnel is already up, the model server itself is not running — LM Studio serves only while\n` +
25
+ ` the Developer tab's server toggle is "Running" (\`lms server start\`); Ollama serves via \`ollama serve\`.`
26
+ : `Cannot reach ${cfg.baseUrl} — ${msg}`;
27
+ }
28
+ if (/\b404\b/.test(msg) && isLocalEndpoint(cfg.baseUrl)) {
29
+ return `Endpoint answered 404 — the server is up but does not know the model "${cfg.model}".\n` +
30
+ ` Check the exact id it serves: curl ${cfg.baseUrl}/models\n` +
31
+ ` Then load it (LM Studio: load the model or enable JIT loading; Ollama: ollama pull ${cfg.model}).`;
32
+ }
33
+ if (/max_tokens/.test(msg)) {
34
+ return msg; // already the actionable reasoning-model explanation from parseLlmResponse
35
+ }
36
+ if (/\b401\b|\b403\b/.test(msg)) {
37
+ return `Rejected (auth). ${requiresApiKey(cfg) ? `Check that $${cfg.apiKeyEnv} holds a valid key.` : "The local server demands a key — set one in $" + cfg.apiKeyEnv + "."}`;
38
+ }
39
+ return msg;
40
+ }
41
+ export async function llmCommand(opts) {
42
+ const wolfDir = path.join(findProjectRoot(), ".wolf");
43
+ const cfg = resolveLlmConfig(wolfDir);
44
+ const keyed = !!process.env[cfg.apiKeyEnv];
45
+ const local = isLocalEndpoint(cfg.baseUrl);
46
+ console.log("OpenWolf LLM — used by cron AI tasks and `openwolf consolidate`\n");
47
+ console.log(` provider ${cfg.provider}${local ? " (local model server — no API key needed)" : ""}`);
48
+ console.log(` endpoint ${cfg.baseUrl}`);
49
+ console.log(` model ${cfg.model}`);
50
+ console.log(` api key ${keyed ? `$${cfg.apiKeyEnv} is set` : requiresApiKey(cfg) ? `$${cfg.apiKeyEnv} is NOT set — remote providers need one` : "not required"}`);
51
+ if (!opts.test) {
52
+ console.log("\nRun `openwolf llm --test` to send a real prompt and time the round-trip.");
53
+ return;
54
+ }
55
+ const prompt = opts.prompt || "Reply with exactly one word: OK";
56
+ console.log(`\n → ${JSON.stringify(prompt)}`);
57
+ const started = Date.now();
58
+ try {
59
+ // 2048, not 256: a reasoning model spends the budget on thinking before it answers, and 256 was
60
+ // gone before Qwen3 emitted a single character — the test then "passed" with an empty reply.
61
+ const reply = await callLlm(cfg, process.env[cfg.apiKeyEnv] ?? "", prompt, { maxTokens: 2048, timeoutMs: 120_000 });
62
+ const secs = (Date.now() - started) / 1000;
63
+ if (!reply) {
64
+ // An empty answer is a failure. Reporting ✓ on 0 chars is how this stayed hidden.
65
+ console.error(`\n ✗ the endpoint answered in ${secs.toFixed(1)}s but returned no text.\n` +
66
+ ` The server is reachable, so this is a model/response problem, not a connection one.`);
67
+ process.exitCode = 1;
68
+ return;
69
+ }
70
+ console.log(` ← ${reply.replace(/\n/g, "\n ")}`);
71
+ console.log(`\n ✓ ${secs.toFixed(1)}s round-trip (${reply.length} chars)`);
72
+ // A local 20B+ model on CPU answers at single-digit tokens/s — usable for a cron job that runs
73
+ // nightly, not for anything a human waits on. Say so instead of letting them find out in prod.
74
+ if (local && secs > 30)
75
+ console.log(` ⚠ that is slow — fine for nightly cron tasks, painful for interactive use.`);
76
+ }
77
+ catch (err) {
78
+ console.error(`\n ✗ ${explainLlmError(cfg, err)}`);
79
+ process.exitCode = 1;
80
+ }
81
+ }
82
+ //# sourceMappingURL=llm-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-cmd.js","sourceRoot":"","sources":["../../../src/cli/llm-cmd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import * as path from "node:path";
2
+ import { findProjectRoot } from "../scanner/project-root.js";
3
+ import { readJSON } from "../utils/fs-safe.js";
4
+ const fmt = (n) => (n ?? 0).toLocaleString("en-US");
5
+ export function reportCommand() {
6
+ const projectRoot = findProjectRoot();
7
+ const ledger = readJSON(path.join(projectRoot, ".wolf", "token-ledger.json"), {
8
+ lifetime: {}, sessions: [],
9
+ });
10
+ const lt = ledger.lifetime;
11
+ console.log("");
12
+ console.log(" OpenWolf token report");
13
+ console.log(" ─────────────────────");
14
+ console.log(` Sessions: ${fmt(lt.total_sessions)}`);
15
+ console.log(` Reads / writes: ${fmt(lt.total_reads)} / ${fmt(lt.total_writes)}`);
16
+ console.log(` Anatomy hits / misses: ${fmt(lt.anatomy_hits)} / ${fmt(lt.anatomy_misses)}`);
17
+ console.log(` Repeated reads blocked: ${fmt(lt.repeated_reads_blocked)}`);
18
+ console.log("");
19
+ console.log(" Estimated (char-ratio heuristic)");
20
+ console.log(` Total tokens: ${fmt(lt.total_tokens_estimated)}`);
21
+ console.log(` Est. savings vs bare: ${fmt(lt.estimated_savings_vs_bare_cli)}`);
22
+ console.log("");
23
+ if (lt.real_api_calls) {
24
+ console.log(" Measured (from harness transcripts)");
25
+ console.log(` API calls: ${fmt(lt.real_api_calls)}`);
26
+ console.log(` Input tokens: ${fmt(lt.real_input_tokens)}`);
27
+ console.log(` Output tokens: ${fmt(lt.real_output_tokens)}`);
28
+ console.log(` Cache reads: ${fmt(lt.real_cache_read_tokens)}`);
29
+ console.log(` Cache writes: ${fmt(lt.real_cache_creation_tokens)}`);
30
+ }
31
+ else {
32
+ console.log(" Measured usage: none recorded yet — it accumulates as sessions");
33
+ console.log(" end (the Stop hook reads real usage from the transcript).");
34
+ }
35
+ const withReal = ledger.sessions.filter((s) => s.real_usage);
36
+ if (withReal.length > 0) {
37
+ console.log("");
38
+ console.log(" Last sessions (measured)");
39
+ for (const s of withReal.slice(-5)) {
40
+ const r = s.real_usage;
41
+ const who = s.agent ? ` [${s.agent}]` : "";
42
+ console.log(` ${s.ended?.slice(0, 16) ?? "?"}${who} in ${fmt(r.input_tokens)} | out ${fmt(r.output_tokens)} | cache-read ${fmt(r.cache_read_input_tokens)} (${r.api_calls} calls)`);
43
+ }
44
+ }
45
+ console.log("");
46
+ }
47
+ //# sourceMappingURL=report-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-cmd.js","sourceRoot":"","sources":["../../../src/cli/report-cmd.ts"],"names":[],"mappings":"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"}