clawprobe 0.1.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 (82) hide show
  1. package/README.md +301 -0
  2. package/dist/cli/commands/compacts.d.ts +11 -0
  3. package/dist/cli/commands/compacts.d.ts.map +1 -0
  4. package/dist/cli/commands/compacts.js +68 -0
  5. package/dist/cli/commands/compacts.js.map +1 -0
  6. package/dist/cli/commands/context.d.ts +8 -0
  7. package/dist/cli/commands/context.d.ts.map +1 -0
  8. package/dist/cli/commands/context.js +78 -0
  9. package/dist/cli/commands/context.js.map +1 -0
  10. package/dist/cli/commands/cost.d.ts +12 -0
  11. package/dist/cli/commands/cost.d.ts.map +1 -0
  12. package/dist/cli/commands/cost.js +52 -0
  13. package/dist/cli/commands/cost.js.map +1 -0
  14. package/dist/cli/commands/memory.d.ts +36 -0
  15. package/dist/cli/commands/memory.d.ts.map +1 -0
  16. package/dist/cli/commands/memory.js +139 -0
  17. package/dist/cli/commands/memory.js.map +1 -0
  18. package/dist/cli/commands/session.d.ts +10 -0
  19. package/dist/cli/commands/session.d.ts.map +1 -0
  20. package/dist/cli/commands/session.js +95 -0
  21. package/dist/cli/commands/session.js.map +1 -0
  22. package/dist/cli/commands/status.d.ts +9 -0
  23. package/dist/cli/commands/status.d.ts.map +1 -0
  24. package/dist/cli/commands/status.js +68 -0
  25. package/dist/cli/commands/status.js.map +1 -0
  26. package/dist/cli/commands/suggest.d.ts +11 -0
  27. package/dist/cli/commands/suggest.d.ts.map +1 -0
  28. package/dist/cli/commands/suggest.js +68 -0
  29. package/dist/cli/commands/suggest.js.map +1 -0
  30. package/dist/cli/format.d.ts +29 -0
  31. package/dist/cli/format.d.ts.map +1 -0
  32. package/dist/cli/format.js +125 -0
  33. package/dist/cli/format.js.map +1 -0
  34. package/dist/core/config.d.ts +63 -0
  35. package/dist/core/config.d.ts.map +1 -0
  36. package/dist/core/config.js +92 -0
  37. package/dist/core/config.js.map +1 -0
  38. package/dist/core/db.d.ts +87 -0
  39. package/dist/core/db.d.ts.map +1 -0
  40. package/dist/core/db.js +263 -0
  41. package/dist/core/db.js.map +1 -0
  42. package/dist/core/jsonl-parser.d.ts +55 -0
  43. package/dist/core/jsonl-parser.d.ts.map +1 -0
  44. package/dist/core/jsonl-parser.js +79 -0
  45. package/dist/core/jsonl-parser.js.map +1 -0
  46. package/dist/core/memory-editor.d.ts +18 -0
  47. package/dist/core/memory-editor.d.ts.map +1 -0
  48. package/dist/core/memory-editor.js +125 -0
  49. package/dist/core/memory-editor.js.map +1 -0
  50. package/dist/core/session-store.d.ts +35 -0
  51. package/dist/core/session-store.d.ts.map +1 -0
  52. package/dist/core/session-store.js +66 -0
  53. package/dist/core/session-store.js.map +1 -0
  54. package/dist/core/watcher.d.ts +19 -0
  55. package/dist/core/watcher.d.ts.map +1 -0
  56. package/dist/core/watcher.js +83 -0
  57. package/dist/core/watcher.js.map +1 -0
  58. package/dist/daemon.d.ts +3 -0
  59. package/dist/daemon.d.ts.map +1 -0
  60. package/dist/daemon.js +147 -0
  61. package/dist/daemon.js.map +1 -0
  62. package/dist/engines/compact-diff.d.ts +19 -0
  63. package/dist/engines/compact-diff.d.ts.map +1 -0
  64. package/dist/engines/compact-diff.js +124 -0
  65. package/dist/engines/compact-diff.js.map +1 -0
  66. package/dist/engines/cost.d.ts +73 -0
  67. package/dist/engines/cost.d.ts.map +1 -0
  68. package/dist/engines/cost.js +149 -0
  69. package/dist/engines/cost.js.map +1 -0
  70. package/dist/engines/file-analyzer.d.ts +28 -0
  71. package/dist/engines/file-analyzer.d.ts.map +1 -0
  72. package/dist/engines/file-analyzer.js +139 -0
  73. package/dist/engines/file-analyzer.js.map +1 -0
  74. package/dist/engines/rule-engine.d.ts +25 -0
  75. package/dist/engines/rule-engine.d.ts.map +1 -0
  76. package/dist/engines/rule-engine.js +209 -0
  77. package/dist/engines/rule-engine.js.map +1 -0
  78. package/dist/index.d.ts +3 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +207 -0
  81. package/dist/index.js.map +1 -0
  82. package/package.json +35 -0
@@ -0,0 +1,139 @@
1
+ import path from "path";
2
+ import { openDb, getCompactEventById } from "../../core/db.js";
3
+ import { listEntries, addEntry, updateEntry, deleteEntry, saveCompactedMessages, searchAllMemoryFiles, } from "../../core/memory-editor.js";
4
+ import { header, outputJson, severity, printSuccess, printError, fmtDate, } from "../format.js";
5
+ function resolveMemoryFile(cfg, fileOpt) {
6
+ if (fileOpt)
7
+ return path.isAbsolute(fileOpt) ? fileOpt : path.join(cfg.workspaceDir, fileOpt);
8
+ return path.join(cfg.workspaceDir, cfg.probe.memory.defaultFile);
9
+ }
10
+ export async function runMemoryList(cfg, opts) {
11
+ const memFile = resolveMemoryFile(cfg, opts.file);
12
+ const entries = listEntries(memFile);
13
+ const relFile = path.relative(cfg.workspaceDir, memFile);
14
+ if (opts.json) {
15
+ outputJson({ file: relFile, entries });
16
+ return;
17
+ }
18
+ header("🧠", "Long-term Memory", relFile);
19
+ if (entries.length === 0) {
20
+ console.log(severity.muted(" No entries found."));
21
+ console.log();
22
+ return;
23
+ }
24
+ for (const entry of entries) {
25
+ console.log(` ${severity.muted(String(entry.index).padStart(3))} ${entry.content}`);
26
+ }
27
+ console.log();
28
+ console.log(severity.muted(` ${entries.length} entries`));
29
+ console.log();
30
+ }
31
+ export async function runMemorySearch(cfg, query, opts) {
32
+ const limit = opts.limit ?? 10;
33
+ const allResults = searchAllMemoryFiles(cfg.workspaceDir, query);
34
+ const results = allResults.slice(0, limit);
35
+ if (opts.json) {
36
+ outputJson(results.map((r) => ({
37
+ file: path.relative(cfg.workspaceDir, r.file),
38
+ entryIndex: r.entry.index,
39
+ content: r.entry.content,
40
+ })));
41
+ return;
42
+ }
43
+ header("🔍", `Search: "${query}"`);
44
+ if (results.length === 0) {
45
+ console.log(severity.muted(` No results found for "${query}"`));
46
+ console.log();
47
+ return;
48
+ }
49
+ for (const [i, result] of results.entries()) {
50
+ const relFile = path.relative(cfg.workspaceDir, result.file);
51
+ console.log(` ${i + 1}. ${severity.muted(relFile + ":" + result.entry.index)}`);
52
+ console.log(` ${result.entry.content}`);
53
+ console.log();
54
+ }
55
+ }
56
+ export async function runMemoryAdd(cfg, content, opts) {
57
+ const memFile = resolveMemoryFile(cfg, opts.file);
58
+ const relFile = path.relative(cfg.workspaceDir, memFile);
59
+ addEntry(memFile, content);
60
+ const entries = listEntries(memFile);
61
+ printSuccess(`Added to ${relFile} (entry #${entries.length})`);
62
+ }
63
+ export async function runMemoryEdit(cfg, entryIndex, newContent, opts) {
64
+ const memFile = resolveMemoryFile(cfg, opts.file);
65
+ const relFile = path.relative(cfg.workspaceDir, memFile);
66
+ const entries = listEntries(memFile);
67
+ const entry = entries.find((e) => e.index === entryIndex);
68
+ if (!entry) {
69
+ printError(`Entry #${entryIndex} not found in ${relFile}`);
70
+ process.exit(1);
71
+ }
72
+ let content = newContent;
73
+ if (!content) {
74
+ // Open $EDITOR
75
+ const editor = process.env["EDITOR"] ?? "vi";
76
+ const { execSync } = await import("child_process");
77
+ const tmpFile = `/tmp/clawprobe_edit_${Date.now()}.txt`;
78
+ const { writeFileSync, readFileSync, unlinkSync } = await import("fs");
79
+ writeFileSync(tmpFile, entry.content, "utf-8");
80
+ try {
81
+ execSync(`${editor} ${tmpFile}`, { stdio: "inherit" });
82
+ content = readFileSync(tmpFile, "utf-8").trim();
83
+ }
84
+ finally {
85
+ unlinkSync(tmpFile);
86
+ }
87
+ }
88
+ updateEntry(memFile, entryIndex, content);
89
+ printSuccess(`Updated entry #${entryIndex} in ${relFile}`);
90
+ }
91
+ export async function runMemoryDelete(cfg, entryIndex, opts) {
92
+ const memFile = resolveMemoryFile(cfg, opts.file);
93
+ const relFile = path.relative(cfg.workspaceDir, memFile);
94
+ const entries = listEntries(memFile);
95
+ const entry = entries.find((e) => e.index === entryIndex);
96
+ if (!entry) {
97
+ printError(`Entry #${entryIndex} not found in ${relFile}`);
98
+ process.exit(1);
99
+ }
100
+ if (!opts.yes) {
101
+ console.log(`\n ${severity.warning("About to delete entry")} #${entryIndex}:`);
102
+ console.log(` "${entry.content}"`);
103
+ const { createInterface } = await import("readline");
104
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
105
+ const confirmed = await new Promise((resolve) => {
106
+ rl.question("\n Confirm? [y/N]: ", (ans) => {
107
+ rl.close();
108
+ resolve(ans.toLowerCase() === "y");
109
+ });
110
+ });
111
+ if (!confirmed) {
112
+ console.log(severity.muted(" Cancelled."));
113
+ return;
114
+ }
115
+ }
116
+ deleteEntry(memFile, entryIndex);
117
+ printSuccess(`Deleted entry #${entryIndex} from ${relFile}`);
118
+ }
119
+ export async function runMemorySaveCompact(cfg, compactId, opts) {
120
+ const db = openDb(cfg.probeDir);
121
+ const event = getCompactEventById(db, compactId);
122
+ if (!event) {
123
+ printError(`Compact event #${compactId} not found.`);
124
+ process.exit(1);
125
+ }
126
+ const messages = event.compacted_messages
127
+ ? JSON.parse(event.compacted_messages)
128
+ : [];
129
+ if (messages.length === 0) {
130
+ console.log(severity.muted(" No messages to save for this compact event."));
131
+ return;
132
+ }
133
+ const memFile = resolveMemoryFile(cfg, opts.file);
134
+ const relFile = path.relative(cfg.workspaceDir, memFile);
135
+ const label = event.compacted_at ? fmtDate(event.compacted_at) : `compact-${compactId}`;
136
+ saveCompactedMessages(memFile, messages, label);
137
+ printSuccess(`Saved ${messages.length} messages from compact #${compactId} to ${relFile}`);
138
+ }
139
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/cli/commands/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { ResolvedConfig } from "../../core/config.js";
2
+ interface SessionOptions {
3
+ agent?: string;
4
+ list?: boolean;
5
+ turns?: boolean;
6
+ json?: boolean;
7
+ }
8
+ export declare function runSession(cfg: ResolvedConfig, sessionKeyArg: string | undefined, opts: SessionOptions): Promise<void>;
9
+ export {};
10
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAStD,UAAU,cAAc;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,UAAU,CAC9B,GAAG,EAAE,cAAc,EACnB,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,IAAI,CAAC,CA2Gf"}
@@ -0,0 +1,95 @@
1
+ import { openDb } from "../../core/db.js";
2
+ import { getActiveSession } from "../../core/session-store.js";
3
+ import { getSessionCost, getAllSessionCosts, estimateCost } from "../../engines/cost.js";
4
+ import { header, fmtUsd, fmtTokens, fmtDate, fmtDuration, makeTable, outputJson, severity, } from "../format.js";
5
+ export async function runSession(cfg, sessionKeyArg, opts) {
6
+ const agent = opts.agent ?? cfg.probe.openclaw.agent;
7
+ const db = openDb(cfg.probeDir);
8
+ const customPrices = cfg.probe.cost.customPrices;
9
+ if (opts.list) {
10
+ const costs = getAllSessionCosts(db, agent, customPrices);
11
+ const active = getActiveSession(cfg.sessionsDir);
12
+ if (opts.json) {
13
+ outputJson(costs);
14
+ return;
15
+ }
16
+ header("📋", "Sessions", `agent: ${agent}`);
17
+ if (costs.length === 0) {
18
+ console.log(severity.muted(" No sessions recorded yet."));
19
+ console.log();
20
+ return;
21
+ }
22
+ const table = makeTable(["Session Key", "Model", "Tokens (in/out)", "Cost", "Compacts", "Last Active"]);
23
+ for (const c of costs) {
24
+ const isActive = active?.sessionKey === c.sessionKey;
25
+ table.push([
26
+ `${c.sessionKey.slice(0, 12)}…${isActive ? " ●" : ""}`,
27
+ c.model ?? "—",
28
+ `${fmtTokens(c.inputTokens)} / ${fmtTokens(c.outputTokens)}`,
29
+ c.estimatedUsd > 0 ? fmtUsd(c.estimatedUsd) : "—",
30
+ String(c.compactionCount),
31
+ c.lastActiveAt > 0 ? fmtDate(c.lastActiveAt) : "—",
32
+ ]);
33
+ }
34
+ console.log(table.toString());
35
+ console.log();
36
+ return;
37
+ }
38
+ // Single session view
39
+ let targetKey = sessionKeyArg;
40
+ if (!targetKey) {
41
+ const active = getActiveSession(cfg.sessionsDir);
42
+ if (!active) {
43
+ console.error(severity.critical("No active session found. Pass a session key or ensure OpenClaw is running."));
44
+ process.exit(1);
45
+ }
46
+ targetKey = active.sessionKey;
47
+ }
48
+ const cost = getSessionCost(db, agent, targetKey, customPrices);
49
+ if (!cost) {
50
+ console.error(severity.critical(`No data found for session: ${targetKey}`));
51
+ console.log(severity.muted(" clawprobe must be running (daemon) to collect session data."));
52
+ process.exit(1);
53
+ }
54
+ if (opts.json) {
55
+ outputJson(cost);
56
+ return;
57
+ }
58
+ header("📊", `Session: ${targetKey}`);
59
+ console.log(` Agent: ${agent}`);
60
+ if (cost.model)
61
+ console.log(` Model: ${cost.model}`);
62
+ if (cost.startedAt > 0) {
63
+ console.log(` Started: ${fmtDate(cost.startedAt)}`);
64
+ console.log(` Last active: ${fmtDate(cost.lastActiveAt)} (${fmtDuration(cost.durationMin)})`);
65
+ }
66
+ console.log(` Compactions: ${cost.compactionCount}`);
67
+ if (!cost.costAccurate) {
68
+ console.log(severity.muted(" ⚠ Cost may be understated (clawprobe was not running at session start)"));
69
+ }
70
+ console.log();
71
+ console.log(severity.bold(" Token usage:"));
72
+ console.log(` Input: ${fmtTokens(cost.inputTokens)} tokens ${fmtUsd(estimateCost({ input: cost.inputTokens, output: 0 }, cost.model, customPrices))}`);
73
+ console.log(` Output: ${fmtTokens(cost.outputTokens)} tokens ${fmtUsd(estimateCost({ input: 0, output: cost.outputTokens }, cost.model, customPrices))}`);
74
+ console.log(` Total: ${fmtTokens(cost.totalTokens)} tokens ${fmtUsd(cost.estimatedUsd)}`);
75
+ const showTurns = opts.turns !== false && cost.turns.length > 0;
76
+ if (showTurns) {
77
+ console.log();
78
+ console.log(severity.bold(" Turn-by-turn timeline:"));
79
+ console.log();
80
+ const maxUsd = Math.max(...cost.turns.map((t) => t.estimatedUsd), 0.001);
81
+ for (const turn of cost.turns) {
82
+ const compact = turn.compactOccurred ? severity.warning("← compact") : "";
83
+ const usdStr = turn.estimatedUsd > 0 ? fmtUsd(turn.estimatedUsd) : severity.muted("$0.00");
84
+ console.log(` Turn ${String(turn.turnIndex).padStart(2)} ${fmtDate(turn.timestamp)}` +
85
+ ` +${fmtTokens(turn.inputTokensDelta)} in / +${fmtTokens(turn.outputTokensDelta)} out` +
86
+ ` ${usdStr} ${compact}`);
87
+ }
88
+ const avgUsd = cost.turns.reduce((s, t) => s + t.estimatedUsd, 0) / cost.turns.length;
89
+ const maxTurn = cost.turns.reduce((max, t) => t.estimatedUsd > max.estimatedUsd ? t : max, cost.turns[0]);
90
+ console.log();
91
+ console.log(severity.muted(` Avg per turn: ${fmtUsd(avgUsd)} | Costliest: Turn ${maxTurn.turnIndex} (${fmtUsd(maxTurn.estimatedUsd)})`));
92
+ }
93
+ console.log();
94
+ }
95
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/cli/commands/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { ResolvedConfig } from "../../core/config.js";
2
+ interface StatusOptions {
3
+ agent?: string;
4
+ session?: string;
5
+ json?: boolean;
6
+ }
7
+ export declare function runStatus(cfg: ResolvedConfig, opts: StatusOptions): Promise<void>;
8
+ export {};
9
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAQtD,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAiBD,wBAAsB,SAAS,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA6DvF"}
@@ -0,0 +1,68 @@
1
+ import { openDb } from "../../core/db.js";
2
+ import { getActiveSession, readSessionsStore } from "../../core/session-store.js";
3
+ import { getLatestSnapshot } from "../../core/db.js";
4
+ import { header, fmtTokens, fmtDate, tokenBar, outputJson, printError, severity, } from "../format.js";
5
+ const MODEL_WINDOWS = {
6
+ "claude-opus-4": 200000,
7
+ "claude-sonnet-4.5": 200000,
8
+ "gpt-5.4": 128000,
9
+ "gpt-5.4-mini": 128000,
10
+ "gemini-3.1-flash": 1000000,
11
+ "deepseek-v3": 128000,
12
+ };
13
+ function getWindowSize(model) {
14
+ if (!model)
15
+ return 128000;
16
+ const key = Object.keys(MODEL_WINDOWS).find((k) => model.includes(k));
17
+ return key ? MODEL_WINDOWS[key] : 128000;
18
+ }
19
+ export async function runStatus(cfg, opts) {
20
+ const agent = opts.agent ?? cfg.probe.openclaw.agent;
21
+ const db = openDb(cfg.probeDir);
22
+ let sessionEntry = opts.session
23
+ ? readSessionsStore(cfg.sessionsDir).find((s) => s.sessionKey === opts.session)
24
+ : getActiveSession(cfg.sessionsDir);
25
+ if (!sessionEntry) {
26
+ printError("No active session found. Make sure OpenClaw is running.");
27
+ process.exit(1);
28
+ }
29
+ const snapshot = getLatestSnapshot(db, agent, sessionEntry.sessionKey);
30
+ const contextTokens = snapshot?.context_tokens ?? sessionEntry.contextTokens;
31
+ const model = snapshot?.model ?? sessionEntry.modelOverride ?? null;
32
+ const windowSize = getWindowSize(model);
33
+ const utilization = contextTokens / windowSize;
34
+ const isActive = !opts.session;
35
+ if (opts.json) {
36
+ outputJson({
37
+ agent,
38
+ sessionKey: sessionEntry.sessionKey,
39
+ sessionId: sessionEntry.sessionId,
40
+ model,
41
+ provider: snapshot?.provider ?? sessionEntry.providerOverride ?? null,
42
+ contextTokens,
43
+ windowSize,
44
+ utilizationPct: Math.round(utilization * 100),
45
+ inputTokens: sessionEntry.inputTokens,
46
+ outputTokens: sessionEntry.outputTokens,
47
+ compactionCount: sessionEntry.compactionCount,
48
+ lastActiveAt: sessionEntry.updatedAt,
49
+ isActive,
50
+ });
51
+ return;
52
+ }
53
+ header("📊", "Agent Status", isActive ? "(active session)" : `session: ${sessionEntry.sessionKey}`);
54
+ console.log(` Agent: ${severity.bold(agent)}`);
55
+ console.log(` Session: ${severity.muted(sessionEntry.sessionKey)}${isActive ? " ●" : ""}`);
56
+ if (model)
57
+ console.log(` Model: ${model}`);
58
+ console.log();
59
+ console.log(` Context: ${fmtTokens(contextTokens)} / ${fmtTokens(windowSize)} tokens ` +
60
+ `${tokenBar(contextTokens, windowSize)} ${Math.round(utilization * 100)}%`);
61
+ console.log(` This session: ${fmtTokens(sessionEntry.inputTokens)} in / ${fmtTokens(sessionEntry.outputTokens)} out`);
62
+ console.log(` Compacts: ${sessionEntry.compactionCount}`);
63
+ if (sessionEntry.updatedAt) {
64
+ console.log(` Last active: ${fmtDate(sessionEntry.updatedAt)}`);
65
+ }
66
+ console.log();
67
+ }
68
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { ResolvedConfig } from "../../core/config.js";
2
+ interface SuggestOptions {
3
+ agent?: string;
4
+ severityFilter?: string;
5
+ dismiss?: string;
6
+ resetDismissed?: boolean;
7
+ json?: boolean;
8
+ }
9
+ export declare function runSuggest(cfg: ResolvedConfig, opts: SuggestOptions): Promise<void>;
10
+ export {};
11
+ //# sourceMappingURL=suggest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggest.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/suggest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAOtD,UAAU,cAAc;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA2EzF"}
@@ -0,0 +1,68 @@
1
+ import { openDb, dismissSuggestion, resetDismissed, getSuggestions } from "../../core/db.js";
2
+ import { runRules, persistSuggestions } from "../../engines/rule-engine.js";
3
+ import { header, outputJson, severity, SEVERITY_ICON, printSuccess, } from "../format.js";
4
+ export async function runSuggest(cfg, opts) {
5
+ const agent = opts.agent ?? cfg.probe.openclaw.agent;
6
+ const db = openDb(cfg.probeDir);
7
+ if (opts.dismiss) {
8
+ dismissSuggestion(db, agent, opts.dismiss);
9
+ printSuccess(`Dismissed suggestion: ${opts.dismiss}`);
10
+ return;
11
+ }
12
+ if (opts.resetDismissed) {
13
+ resetDismissed(db, agent);
14
+ printSuccess("Reset all dismissed suggestions.");
15
+ return;
16
+ }
17
+ // Run rules and persist
18
+ const state = {
19
+ db,
20
+ agent,
21
+ workspaceDir: cfg.workspaceDir,
22
+ sessionsDir: cfg.sessionsDir,
23
+ bootstrapMaxChars: cfg.bootstrapMaxChars,
24
+ config: cfg.probe,
25
+ };
26
+ const suggestions = runRules(state);
27
+ persistSuggestions(db, agent, suggestions);
28
+ // Read back from db (respects dismissed)
29
+ const rows = getSuggestions(db, agent, opts.severityFilter);
30
+ if (opts.json) {
31
+ outputJson(rows.map((r) => ({
32
+ id: r.id,
33
+ ruleId: r.rule_id,
34
+ severity: r.severity,
35
+ title: r.title,
36
+ detail: r.detail,
37
+ action: r.action,
38
+ })));
39
+ return;
40
+ }
41
+ header("💡", "Optimization Suggestions", `agent: ${agent}`);
42
+ if (rows.length === 0) {
43
+ console.log(severity.ok(" ✓ No issues detected. Your agent looks healthy."));
44
+ console.log();
45
+ return;
46
+ }
47
+ for (const row of rows) {
48
+ const icon = SEVERITY_ICON[row.severity] ?? "•";
49
+ const sevLabel = row.severity.toUpperCase().padEnd(8);
50
+ const sevColor = row.severity === "critical" ? severity.critical :
51
+ row.severity === "warning" ? severity.warning :
52
+ severity.info;
53
+ console.log();
54
+ console.log(` ${icon} ${sevColor(sevLabel)} ${severity.bold(row.title)}`);
55
+ console.log();
56
+ console.log(` ${row.detail}`);
57
+ if (row.action) {
58
+ console.log();
59
+ console.log(` ${severity.muted("→")} ${row.action}`);
60
+ }
61
+ console.log();
62
+ console.log(severity.muted(` [dismiss: clawprobe suggest --dismiss ${row.rule_id}]`));
63
+ console.log();
64
+ console.log(severity.muted(" " + "─".repeat(46)));
65
+ }
66
+ console.log();
67
+ }
68
+ //# sourceMappingURL=suggest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggest.js","sourceRoot":"","sources":["../../../src/cli/commands/suggest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import Table from "cli-table3";
2
+ export declare const severity: {
3
+ critical: (s: string) => string;
4
+ warning: (s: string) => string;
5
+ info: (s: string) => string;
6
+ ok: (s: string) => string;
7
+ muted: (s: string) => string;
8
+ bold: (s: string) => string;
9
+ dim: (s: string) => string;
10
+ };
11
+ export declare const SEVERITY_ICON: Record<string, string>;
12
+ export declare function tokenBar(used: number, total: number, width?: number): string;
13
+ export declare function costBar(usd: number, maxUsd: number, width?: number): string;
14
+ export declare function fmtUsd(usd: number): string;
15
+ export declare function fmtTokens(n: number): string;
16
+ export declare function fmtDate(ts: number): string;
17
+ export declare function fmtDuration(minutes: number): string;
18
+ export declare function makeTable(head: string[], colWidths?: number[]): Table.Table;
19
+ export declare function header(icon: string, title: string, subtitle?: string): void;
20
+ export declare function subheader(title: string): void;
21
+ export declare function truncBadge(wasTruncated: boolean): string;
22
+ export declare function qualityBadge(quality: "good" | "partial" | "poor"): string;
23
+ export declare function roleIcon(role: string): string;
24
+ export declare function divider(): void;
25
+ export declare function outputJson(data: unknown): void;
26
+ export declare function printError(msg: string): void;
27
+ export declare function printWarning(msg: string): void;
28
+ export declare function printSuccess(msg: string): void;
29
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/cli/format.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,YAAY,CAAC;AAI/B,eAAO,MAAM,QAAQ;kBACL,MAAM;iBACP,MAAM;cACT,MAAM;YACR,MAAM;eACH,MAAM;cACP,MAAM;aACP,MAAM;CAChB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIhD,CAAC;AAIF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,MAAM,CAOxE;AAID,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,MAAM,CAIvE;AAID,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG1C;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAI3C;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAY1C;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKnD;AAID,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAS3E;AAID,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAI3E;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE7C;AAID,wBAAgB,UAAU,CAAC,YAAY,EAAE,OAAO,GAAG,MAAM,CAExD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAMzE;AAID,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO7C;AAID,wBAAgB,OAAO,IAAI,IAAI,CAE9B;AAID,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAE9C;AAID,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE5C;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE9C"}
@@ -0,0 +1,125 @@
1
+ import chalk from "chalk";
2
+ import Table from "cli-table3";
3
+ // --- Colors & Severity ---
4
+ export const severity = {
5
+ critical: (s) => chalk.red(s),
6
+ warning: (s) => chalk.yellow(s),
7
+ info: (s) => chalk.blue(s),
8
+ ok: (s) => chalk.green(s),
9
+ muted: (s) => chalk.gray(s),
10
+ bold: (s) => chalk.bold(s),
11
+ dim: (s) => chalk.dim(s),
12
+ };
13
+ export const SEVERITY_ICON = {
14
+ critical: "🔴",
15
+ warning: "🟡",
16
+ info: "🔵",
17
+ };
18
+ // --- Token Bar ---
19
+ export function tokenBar(used, total, width = 20) {
20
+ const pct = Math.min(used / total, 1);
21
+ const filled = Math.round(pct * width);
22
+ const empty = width - filled;
23
+ const bar = "█".repeat(filled) + "░".repeat(empty);
24
+ const color = pct > 0.9 ? chalk.red : pct > 0.7 ? chalk.yellow : chalk.green;
25
+ return color(bar);
26
+ }
27
+ // --- Cost Bar (for daily chart) ---
28
+ export function costBar(usd, maxUsd, width = 16) {
29
+ const pct = maxUsd > 0 ? Math.min(usd / maxUsd, 1) : 0;
30
+ const filled = Math.round(pct * width);
31
+ return chalk.cyan("█".repeat(filled)) + chalk.gray("░".repeat(width - filled));
32
+ }
33
+ // --- Number Formatting ---
34
+ export function fmtUsd(usd) {
35
+ if (usd === 0)
36
+ return chalk.gray("$0.00");
37
+ return chalk.green(`$${usd.toFixed(2)}`);
38
+ }
39
+ export function fmtTokens(n) {
40
+ if (n >= 1_000_000)
41
+ return `${(n / 1_000_000).toFixed(1)}M`;
42
+ if (n >= 1_000)
43
+ return `${(n / 1_000).toFixed(1)}K`;
44
+ return String(n);
45
+ }
46
+ export function fmtDate(ts) {
47
+ const d = new Date(ts * 1000);
48
+ const now = new Date();
49
+ const isToday = d.toDateString() === now.toDateString();
50
+ const yesterday = new Date(now);
51
+ yesterday.setDate(yesterday.getDate() - 1);
52
+ const isYesterday = d.toDateString() === yesterday.toDateString();
53
+ const timeStr = d.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" });
54
+ if (isToday)
55
+ return `Today ${timeStr}`;
56
+ if (isYesterday)
57
+ return `Yesterday ${timeStr}`;
58
+ return `${d.toLocaleDateString([], { month: "short", day: "numeric" })} ${timeStr}`;
59
+ }
60
+ export function fmtDuration(minutes) {
61
+ if (minutes < 60)
62
+ return `${minutes}min`;
63
+ const h = Math.floor(minutes / 60);
64
+ const m = minutes % 60;
65
+ return m > 0 ? `${h}h ${m}min` : `${h}h`;
66
+ }
67
+ // --- Tables ---
68
+ export function makeTable(head, colWidths) {
69
+ return new Table({
70
+ head: head.map((h) => chalk.bold.white(h)),
71
+ colWidths,
72
+ style: {
73
+ head: [],
74
+ border: ["gray"],
75
+ },
76
+ });
77
+ }
78
+ // --- Section Headers ---
79
+ export function header(icon, title, subtitle) {
80
+ console.log();
81
+ console.log(`${icon} ${chalk.bold(title)}${subtitle ? chalk.dim(" " + subtitle) : ""}`);
82
+ console.log(chalk.dim("─".repeat(50)));
83
+ }
84
+ export function subheader(title) {
85
+ console.log(chalk.dim(`\n ${title}`));
86
+ }
87
+ // --- Status Indicators ---
88
+ export function truncBadge(wasTruncated) {
89
+ return wasTruncated ? chalk.red("⚠ TRUNC") : chalk.green("✓ ok");
90
+ }
91
+ export function qualityBadge(quality) {
92
+ switch (quality) {
93
+ case "good": return chalk.green("✓ Summary adequate");
94
+ case "partial": return chalk.yellow("⚠ Partial loss detected");
95
+ case "poor": return chalk.red("✗ Significant loss detected");
96
+ }
97
+ }
98
+ // --- Role Icons ---
99
+ export function roleIcon(role) {
100
+ switch (role) {
101
+ case "user": return "👤";
102
+ case "assistant": return "🤖";
103
+ case "tool": return "🔧";
104
+ default: return "•";
105
+ }
106
+ }
107
+ // --- Divider ---
108
+ export function divider() {
109
+ console.log(chalk.dim("─".repeat(50)));
110
+ }
111
+ // --- JSON output helper ---
112
+ export function outputJson(data) {
113
+ console.log(JSON.stringify(data, null, 2));
114
+ }
115
+ // --- Error ---
116
+ export function printError(msg) {
117
+ console.error(chalk.red(`Error: ${msg}`));
118
+ }
119
+ export function printWarning(msg) {
120
+ console.error(chalk.yellow(`Warning: ${msg}`));
121
+ }
122
+ export function printSuccess(msg) {
123
+ console.log(chalk.green(`✅ ${msg}`));
124
+ }
125
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/cli/format.ts"],"names":[],"mappings":"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"}