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.
- package/CHANGELOG.md +105 -0
- package/dist/dashboard/assets/{AISuggestions-DF-LNNBU.js → AISuggestions-BfgCmCvU.js} +1 -1
- package/dist/dashboard/assets/{ActivityLog-DuQB_TaU.js → ActivityLog-DXNaS0hX.js} +1 -1
- package/dist/dashboard/assets/{ActivityTimeline-jWDsjU7p.js → ActivityTimeline-CbCEyVtf.js} +1 -1
- package/dist/dashboard/assets/{AnatomyBrowser-BOfaZMLt.js → AnatomyBrowser-Cgoo81Nn.js} +1 -1
- package/dist/dashboard/assets/{BugLog-Bb8Jdare.js → BugLog-4jV0KE_C.js} +1 -1
- package/dist/dashboard/assets/{CerebrumViewer-Clix3JOG.js → CerebrumViewer-DTeD__lQ.js} +1 -1
- package/dist/dashboard/assets/{CronStatus-ne4IxXs8.js → CronStatus-fXVkPzMI.js} +1 -1
- package/dist/dashboard/assets/{DesignQC-COcZ38nI.js → DesignQC-CxorYE4I.js} +1 -1
- package/dist/dashboard/assets/{MemoryViewer-BYUkDs9k.js → MemoryViewer-BbBPGn8t.js} +1 -1
- package/dist/dashboard/assets/{NativeMemory-20gjdcAD.js → NativeMemory-CBf2B9WK.js} +1 -1
- package/dist/dashboard/assets/{ProjectOverview-BoadyvwS.js → ProjectOverview-CeaY2OtB.js} +1 -1
- package/dist/dashboard/assets/{ProjectsAggregate-z6XtnlbZ.js → ProjectsAggregate-BsBMRflP.js} +1 -1
- package/dist/dashboard/assets/{StatusBadge-CBsSwOOc.js → StatusBadge-CZX-0CQE.js} +1 -1
- package/dist/dashboard/assets/{TokenUsage-n2PFPxqk.js → TokenUsage-C9yjDd1O.js} +1 -1
- package/dist/dashboard/assets/{index-DLkIxGHf.js → index-D2sNMefT.js} +3 -3
- package/dist/dashboard/index.html +1 -1
- package/dist/hooks/pre-read.js +10 -0
- package/dist/hooks/precompact.js +30 -0
- package/dist/hooks/session-start.js +51 -24
- package/dist/hooks/shared.js +47 -0
- package/dist/hooks/stop.js +22 -1
- package/dist/src/cli/consolidate-cmd.js +14 -7
- package/dist/src/cli/consolidate-cmd.js.map +1 -1
- package/dist/src/cli/index.js +18 -0
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/llm-cmd.js +82 -0
- package/dist/src/cli/llm-cmd.js.map +1 -0
- package/dist/src/cli/report-cmd.js +47 -0
- package/dist/src/cli/report-cmd.js.map +1 -0
- package/dist/src/daemon/cron-engine.js +191 -57
- package/dist/src/daemon/cron-engine.js.map +1 -1
- package/dist/src/daemon/llm-provider.js +64 -8
- package/dist/src/daemon/llm-provider.js.map +1 -1
- package/dist/src/daemon/wolf-daemon.js +4 -2
- package/dist/src/daemon/wolf-daemon.js.map +1 -1
- package/dist/src/hooks/pre-read.js +10 -0
- package/dist/src/hooks/pre-read.js.map +1 -1
- package/dist/src/hooks/precompact.js +31 -0
- package/dist/src/hooks/precompact.js.map +1 -0
- package/dist/src/hooks/session-start.js +51 -24
- package/dist/src/hooks/session-start.js.map +1 -1
- package/dist/src/hooks/shared.js +47 -0
- package/dist/src/hooks/shared.js.map +1 -1
- package/dist/src/hooks/stop.js +22 -1
- package/dist/src/hooks/stop.js.map +1 -1
- package/dist/src/scanner/anatomy-scanner.js +19 -5
- package/dist/src/scanner/anatomy-scanner.js.map +1 -1
- package/dist/src/scanner/symbol-extractor.js +82 -0
- package/dist/src/scanner/symbol-extractor.js.map +1 -0
- package/dist/src/utils/agent-hooks.js +2 -1
- package/dist/src/utils/agent-hooks.js.map +1 -1
- package/dist/src/utils/hooks-deploy.js +1 -0
- package/dist/src/utils/hooks-deploy.js.map +1 -1
- package/dist/src/utils/recall.js +4 -0
- package/dist/src/utils/recall.js.map +1 -1
- 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-
|
|
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>
|
package/dist/hooks/pre-read.js
CHANGED
|
@@ -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
|
-
//
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
-
|
|
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
|
}
|
package/dist/hooks/shared.js
CHANGED
|
@@ -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
|
}
|
package/dist/hooks/stop.js
CHANGED
|
@@ -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 (
|
|
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
|
-
|
|
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 {
|
|
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":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"consolidate-cmd.js","sourceRoot":"","sources":["../../../src/cli/consolidate-cmd.ts"],"names":[],"mappings":"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"}
|
package/dist/src/cli/index.js
CHANGED
|
@@ -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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"}
|