clawvault 3.2.1 → 3.4.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/README.md +56 -16
- package/bin/clawvault.js +0 -2
- package/bin/command-registration.test.js +15 -2
- package/bin/help-contract.test.js +16 -0
- package/bin/register-core-commands.js +88 -0
- package/bin/register-core-commands.test.js +80 -0
- package/bin/register-maintenance-commands.js +84 -7
- package/bin/register-query-commands.js +45 -28
- package/bin/register-query-commands.test.js +15 -0
- package/bin/test-helpers/cli-command-fixtures.js +1 -0
- package/dist/chunk-2PKBIKDH.js +130 -0
- package/dist/{chunk-U67V476Y.js → chunk-2ZDO52B4.js} +18 -1
- package/dist/{chunk-ZZA73MFY.js → chunk-33DOSHTA.js} +176 -36
- package/dist/chunk-35JCYSRR.js +158 -0
- package/dist/{chunk-AZYOKJYC.js → chunk-4PY655YM.js} +13 -1
- package/dist/{chunk-2JQ3O2YL.js → chunk-5EFSWZO6.js} +3 -3
- package/dist/{chunk-Y3TIJEBP.js → chunk-7SWP5FKU.js} +34 -613
- package/dist/{chunk-4VQTUVH7.js → chunk-7YZWHM36.js} +52 -26
- package/dist/{chunk-URXDAUVH.js → chunk-AXSJIFOJ.js} +174 -1
- package/dist/{chunk-4ITRXIVT.js → chunk-BLQXXX7Q.js} +6 -6
- package/dist/chunk-CSHO3PJB.js +684 -0
- package/dist/chunk-D5U3Q4N5.js +872 -0
- package/dist/chunk-DCF4KMFD.js +158 -0
- package/dist/{chunk-S5OJEGFG.js → chunk-DOIUYIXV.js} +2 -2
- package/dist/{chunk-YXQCA6B7.js → chunk-DVOUSOR3.js} +112 -7
- package/dist/{chunk-YDWHS4LJ.js → chunk-ECGJYWNA.js} +205 -33
- package/dist/{chunk-QMHPQYUV.js → chunk-EL6UBSX5.js} +7 -6
- package/dist/chunk-FZ5I2NF7.js +352 -0
- package/dist/{chunk-WJVWINEM.js → chunk-GFCHWMGD.js} +55 -6
- package/dist/{chunk-GNJL4YGR.js → chunk-GJO3CFUN.js} +30 -6
- package/dist/chunk-H3JZIB5O.js +322 -0
- package/dist/chunk-HEHO7SMV.js +51 -0
- package/dist/{chunk-UCQAOZHW.js → chunk-HGDDW24U.js} +3 -3
- package/dist/chunk-J3YUXVID.js +907 -0
- package/dist/{chunk-Y6VJKXGL.js → chunk-KCYWJDDW.js} +1 -1
- package/dist/{chunk-P5EPF6MB.js → chunk-MW5C6ZQA.js} +110 -13
- package/dist/chunk-NSXYM6EZ.js +255 -0
- package/dist/{chunk-YNIPYN4F.js → chunk-OFOCU2V4.js} +6 -5
- package/dist/{chunk-42MXU7A6.js → chunk-P62WHA27.js} +58 -47
- package/dist/chunk-PTWPPVC7.js +972 -0
- package/dist/{chunk-FAKNOB7Y.js → chunk-QFWERBDP.js} +2 -2
- package/dist/chunk-QYQAGBTM.js +2097 -0
- package/dist/chunk-RL2L6I6K.js +223 -0
- package/dist/{chunk-IIOU45CK.js → chunk-S7N7HI5E.js} +2 -2
- package/dist/{chunk-ECRZL5XR.js → chunk-T7E764W3.js} +23 -7
- package/dist/{chunk-MNPUYCHQ.js → chunk-TWMI3SNN.js} +6 -5
- package/dist/{chunk-2RAZ4ZFE.js → chunk-VBILES4B.js} +1 -1
- package/dist/{chunk-PI4WMLMG.js → chunk-VXAGOLDP.js} +1 -1
- package/dist/{chunk-SS4B7P7V.js → chunk-YIDV4VV2.js} +1 -1
- package/dist/chunk-YTRZNA64.js +37 -0
- package/dist/chunk-ZKWPCBYT.js +600 -0
- package/dist/cli/index.js +28 -21
- package/dist/commands/archive.js +3 -3
- package/dist/commands/backlog.js +1 -1
- package/dist/commands/benchmark.d.ts +12 -0
- package/dist/commands/benchmark.js +12 -0
- package/dist/commands/blocked.js +1 -1
- package/dist/commands/canvas.js +2 -2
- package/dist/commands/checkpoint.js +1 -1
- package/dist/commands/compat.js +1 -1
- package/dist/commands/context.js +8 -7
- package/dist/commands/doctor.d.ts +8 -3
- package/dist/commands/doctor.js +8 -22
- package/dist/commands/embed.js +6 -5
- package/dist/commands/entities.d.ts +8 -1
- package/dist/commands/entities.js +46 -3
- package/dist/commands/graph.js +4 -4
- package/dist/commands/inbox.d.ts +23 -0
- package/dist/commands/inbox.js +11 -0
- package/dist/commands/inject.d.ts +1 -1
- package/dist/commands/inject.js +5 -5
- package/dist/commands/kanban.js +1 -1
- package/dist/commands/link.js +5 -5
- package/dist/commands/maintain.d.ts +32 -0
- package/dist/commands/maintain.js +13 -0
- package/dist/commands/migrate-observations.js +3 -3
- package/dist/commands/observe.js +11 -10
- package/dist/commands/project.js +2 -2
- package/dist/commands/rebuild-embeddings.js +48 -17
- package/dist/commands/rebuild.js +9 -8
- package/dist/commands/recall.d.ts +14 -0
- package/dist/commands/recall.js +15 -0
- package/dist/commands/recover.js +1 -1
- package/dist/commands/reflect.js +6 -6
- package/dist/commands/repair-session.js +1 -1
- package/dist/commands/replay.js +10 -9
- package/dist/commands/session-recap.js +1 -1
- package/dist/commands/setup.js +4 -3
- package/dist/commands/shell-init.js +1 -1
- package/dist/commands/sleep.d.ts +1 -1
- package/dist/commands/sleep.js +20 -18
- package/dist/commands/status.js +40 -26
- package/dist/commands/sync-bd.js +3 -3
- package/dist/commands/tailscale.js +3 -3
- package/dist/commands/task.js +1 -1
- package/dist/commands/template.js +1 -1
- package/dist/commands/wake.d.ts +1 -1
- package/dist/commands/wake.js +10 -9
- package/dist/index.d.ts +233 -16
- package/dist/index.js +325 -111
- package/dist/{inject-DYUrDqQO.d.ts → inject-DEb_jpLi.d.ts} +3 -1
- package/dist/lib/auto-linker.js +2 -2
- package/dist/lib/canvas-layout.js +1 -1
- package/dist/lib/config.js +2 -2
- package/dist/lib/entity-index.js +1 -1
- package/dist/lib/project-utils.js +2 -2
- package/dist/lib/session-repair.js +1 -1
- package/dist/lib/session-utils.js +1 -1
- package/dist/lib/tailscale.js +1 -1
- package/dist/lib/task-utils.js +1 -1
- package/dist/lib/template-engine.js +1 -1
- package/dist/lib/webdav.js +1 -1
- package/dist/onnxruntime_binding-5QEF3SUC.node +0 -0
- package/dist/onnxruntime_binding-BKPKNEGC.node +0 -0
- package/dist/onnxruntime_binding-FMOXGIUT.node +0 -0
- package/dist/onnxruntime_binding-OI2KMXC5.node +0 -0
- package/dist/onnxruntime_binding-UX44MLAZ.node +0 -0
- package/dist/onnxruntime_binding-Y2W7N7WY.node +0 -0
- package/dist/openclaw-plugin--gqA2BZw.d.ts +267 -0
- package/dist/openclaw-plugin.d.ts +4 -0
- package/dist/openclaw-plugin.js +20 -0
- package/dist/transformers.node-A2ZRORSQ.js +46775 -0
- package/dist/types-CbL-wIKi.d.ts +36 -0
- package/dist/{types-BbWJoC1c.d.ts → types-DslKvCaj.d.ts} +51 -1
- package/hooks/clawvault/HOOK.md +25 -8
- package/hooks/clawvault/handler.js +215 -78
- package/hooks/clawvault/handler.test.js +109 -43
- package/hooks/clawvault/integrity.js +112 -0
- package/hooks/clawvault/integrity.test.js +32 -0
- package/hooks/clawvault/openclaw.plugin.json +133 -15
- package/openclaw.plugin.json +161 -194
- package/package.json +8 -5
- package/bin/register-workgraph-commands.js +0 -451
- package/dist/chunk-5PJ4STIC.js +0 -465
- package/dist/chunk-ERNE2FZ5.js +0 -189
- package/dist/chunk-HR4KN6S2.js +0 -152
- package/dist/chunk-IJBFGPCS.js +0 -33
- package/dist/chunk-K7PNYS45.js +0 -93
- package/dist/chunk-NTOPJI7W.js +0 -207
- package/dist/chunk-PG56HX5T.js +0 -154
- package/dist/chunk-QPDDIHXE.js +0 -501
- package/dist/chunk-WIOLLGAD.js +0 -190
- package/dist/chunk-WMGIIABP.js +0 -15
- package/dist/ledger-B7g7jhqG.d.ts +0 -44
- package/dist/plugin/index.d.ts +0 -352
- package/dist/plugin/index.js +0 -4264
- package/dist/registry-BR4326o0.d.ts +0 -30
- package/dist/store-CA-6sKCJ.d.ts +0 -34
- package/dist/thread-B9LhXNU0.d.ts +0 -41
- package/dist/workgraph/index.d.ts +0 -5
- package/dist/workgraph/index.js +0 -23
- package/dist/workgraph/ledger.d.ts +0 -2
- package/dist/workgraph/ledger.js +0 -25
- package/dist/workgraph/registry.d.ts +0 -2
- package/dist/workgraph/registry.js +0 -19
- package/dist/workgraph/store.d.ts +0 -2
- package/dist/workgraph/store.js +0 -25
- package/dist/workgraph/thread.d.ts +0 -2
- package/dist/workgraph/thread.js +0 -25
- package/dist/workgraph/types.d.ts +0 -54
- package/dist/workgraph/types.js +0 -7
|
@@ -0,0 +1,600 @@
|
|
|
1
|
+
import {
|
|
2
|
+
parseSessionFile
|
|
3
|
+
} from "./chunk-MW5C6ZQA.js";
|
|
4
|
+
import {
|
|
5
|
+
Compressor
|
|
6
|
+
} from "./chunk-J3YUXVID.js";
|
|
7
|
+
import {
|
|
8
|
+
normalizeObservationContent,
|
|
9
|
+
parseObservationMarkdown
|
|
10
|
+
} from "./chunk-FHFUXL6G.js";
|
|
11
|
+
|
|
12
|
+
// src/commands/benchmark.ts
|
|
13
|
+
import * as path2 from "path";
|
|
14
|
+
|
|
15
|
+
// src/observer/benchmark/format.ts
|
|
16
|
+
function percent(value) {
|
|
17
|
+
return `${(value * 100).toFixed(1)}%`;
|
|
18
|
+
}
|
|
19
|
+
function formatObserverBenchmarkSummary(report) {
|
|
20
|
+
const lines = [];
|
|
21
|
+
lines.push("Observer benchmark report");
|
|
22
|
+
lines.push(`Generated: ${report.generatedAt}`);
|
|
23
|
+
lines.push(`Fixtures: ${report.fixtureCount}`);
|
|
24
|
+
lines.push(`Provider: ${report.provider}${report.model ? ` (${report.model})` : ""}`);
|
|
25
|
+
lines.push("");
|
|
26
|
+
lines.push("Aggregate metrics");
|
|
27
|
+
lines.push(`- Precision: ${percent(report.aggregate.precision)} (noise ${percent(report.aggregate.noiseRatio)})`);
|
|
28
|
+
lines.push(`- Recall (important events): ${percent(report.aggregate.recall)}`);
|
|
29
|
+
lines.push(`- Keyword preservation: ${percent(report.aggregate.keywordPreservation)}`);
|
|
30
|
+
lines.push(`- Type accuracy: ${percent(report.aggregate.typeAccuracy)}`);
|
|
31
|
+
lines.push(`- Overall score: ${percent(report.aggregate.overall)}`);
|
|
32
|
+
lines.push("");
|
|
33
|
+
lines.push("Per-fixture");
|
|
34
|
+
for (const fixture of report.fixtures) {
|
|
35
|
+
lines.push(`- ${fixture.fixtureId}`);
|
|
36
|
+
lines.push(` overall=${percent(fixture.scoring.metrics.overall)} precision=${percent(fixture.scoring.metrics.precision)} recall=${percent(fixture.scoring.metrics.recall)} keyword=${percent(fixture.scoring.metrics.keywordPreservation)} type=${percent(fixture.scoring.metrics.typeAccuracy)}`);
|
|
37
|
+
lines.push(` matches=${fixture.scoring.matches.length} expected=${fixture.expectedCount} actual=${fixture.actualCount} missed-important=${fixture.scoring.missedImportant.length} noise=${fixture.scoring.noiseObservations.length}`);
|
|
38
|
+
if (fixture.scoring.missingKeywords.length > 0) {
|
|
39
|
+
lines.push(` missing keywords: ${fixture.scoring.missingKeywords.slice(0, 5).join(", ")}${fixture.scoring.missingKeywords.length > 5 ? " \u2026" : ""}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return lines.join("\n");
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// src/observer/benchmark/fixtures.ts
|
|
46
|
+
import * as fs from "fs";
|
|
47
|
+
import * as path from "path";
|
|
48
|
+
function readJsonConfig(configPath) {
|
|
49
|
+
if (!fs.existsSync(configPath)) {
|
|
50
|
+
return {};
|
|
51
|
+
}
|
|
52
|
+
const raw = fs.readFileSync(configPath, "utf-8").trim();
|
|
53
|
+
if (!raw) {
|
|
54
|
+
return {};
|
|
55
|
+
}
|
|
56
|
+
const parsed = JSON.parse(raw);
|
|
57
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
58
|
+
throw new Error(`Invalid fixture config (expected object): ${configPath}`);
|
|
59
|
+
}
|
|
60
|
+
return parsed;
|
|
61
|
+
}
|
|
62
|
+
function ensureFile(filePath, label) {
|
|
63
|
+
if (!fs.existsSync(filePath)) {
|
|
64
|
+
throw new Error(`Missing ${label}: ${filePath}`);
|
|
65
|
+
}
|
|
66
|
+
const stat = fs.statSync(filePath);
|
|
67
|
+
if (!stat.isFile()) {
|
|
68
|
+
throw new Error(`${label} is not a file: ${filePath}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function loadObserverBenchmarkFixtures(fixturesDir) {
|
|
72
|
+
const resolvedRoot = path.resolve(fixturesDir);
|
|
73
|
+
if (!fs.existsSync(resolvedRoot)) {
|
|
74
|
+
throw new Error(`Fixtures directory not found: ${resolvedRoot}`);
|
|
75
|
+
}
|
|
76
|
+
if (!fs.statSync(resolvedRoot).isDirectory()) {
|
|
77
|
+
throw new Error(`Fixtures path is not a directory: ${resolvedRoot}`);
|
|
78
|
+
}
|
|
79
|
+
const fixtureDirs = fs.readdirSync(resolvedRoot, { withFileTypes: true }).filter((entry) => entry.isDirectory()).map((entry) => entry.name).sort((left, right) => left.localeCompare(right));
|
|
80
|
+
const fixtures = [];
|
|
81
|
+
for (const fixtureId of fixtureDirs) {
|
|
82
|
+
const fixtureDir = path.join(resolvedRoot, fixtureId);
|
|
83
|
+
const transcriptPath = path.join(fixtureDir, "transcript.md");
|
|
84
|
+
const expectedPath = path.join(fixtureDir, "expected.md");
|
|
85
|
+
const configPath = path.join(fixtureDir, "config.json");
|
|
86
|
+
ensureFile(transcriptPath, "transcript fixture");
|
|
87
|
+
ensureFile(expectedPath, "expected observations fixture");
|
|
88
|
+
const transcript = fs.readFileSync(transcriptPath, "utf-8");
|
|
89
|
+
const expected = fs.readFileSync(expectedPath, "utf-8");
|
|
90
|
+
const config = readJsonConfig(configPath);
|
|
91
|
+
fixtures.push({
|
|
92
|
+
id: fixtureId,
|
|
93
|
+
dir: fixtureDir,
|
|
94
|
+
transcriptPath,
|
|
95
|
+
expectedPath,
|
|
96
|
+
transcript,
|
|
97
|
+
expected,
|
|
98
|
+
config
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
if (fixtures.length === 0) {
|
|
102
|
+
throw new Error(`No fixture directories found in: ${resolvedRoot}`);
|
|
103
|
+
}
|
|
104
|
+
return fixtures;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// src/observer/benchmark/scoring.ts
|
|
108
|
+
var STOPWORDS = /* @__PURE__ */ new Set([
|
|
109
|
+
"a",
|
|
110
|
+
"an",
|
|
111
|
+
"and",
|
|
112
|
+
"are",
|
|
113
|
+
"as",
|
|
114
|
+
"at",
|
|
115
|
+
"be",
|
|
116
|
+
"been",
|
|
117
|
+
"by",
|
|
118
|
+
"for",
|
|
119
|
+
"from",
|
|
120
|
+
"had",
|
|
121
|
+
"has",
|
|
122
|
+
"have",
|
|
123
|
+
"he",
|
|
124
|
+
"her",
|
|
125
|
+
"his",
|
|
126
|
+
"i",
|
|
127
|
+
"in",
|
|
128
|
+
"is",
|
|
129
|
+
"it",
|
|
130
|
+
"its",
|
|
131
|
+
"me",
|
|
132
|
+
"my",
|
|
133
|
+
"of",
|
|
134
|
+
"on",
|
|
135
|
+
"or",
|
|
136
|
+
"our",
|
|
137
|
+
"she",
|
|
138
|
+
"that",
|
|
139
|
+
"the",
|
|
140
|
+
"their",
|
|
141
|
+
"them",
|
|
142
|
+
"they",
|
|
143
|
+
"this",
|
|
144
|
+
"to",
|
|
145
|
+
"was",
|
|
146
|
+
"we",
|
|
147
|
+
"were",
|
|
148
|
+
"will",
|
|
149
|
+
"with",
|
|
150
|
+
"you",
|
|
151
|
+
"your",
|
|
152
|
+
"about",
|
|
153
|
+
"after",
|
|
154
|
+
"before",
|
|
155
|
+
"can",
|
|
156
|
+
"did",
|
|
157
|
+
"do",
|
|
158
|
+
"done",
|
|
159
|
+
"if",
|
|
160
|
+
"into",
|
|
161
|
+
"just",
|
|
162
|
+
"not",
|
|
163
|
+
"now",
|
|
164
|
+
"out",
|
|
165
|
+
"over",
|
|
166
|
+
"should",
|
|
167
|
+
"than",
|
|
168
|
+
"then",
|
|
169
|
+
"there",
|
|
170
|
+
"these",
|
|
171
|
+
"those",
|
|
172
|
+
"today",
|
|
173
|
+
"tomorrow",
|
|
174
|
+
"update",
|
|
175
|
+
"updated",
|
|
176
|
+
"working",
|
|
177
|
+
"session",
|
|
178
|
+
"assistant",
|
|
179
|
+
"user"
|
|
180
|
+
]);
|
|
181
|
+
var WORD_TOKEN_RE = /[a-z0-9]+(?:[._/-][a-z0-9]+)*/g;
|
|
182
|
+
var TERM_TOKEN_RE = /[A-Za-z0-9][A-Za-z0-9._/-]{2,}/g;
|
|
183
|
+
function clamp01(value) {
|
|
184
|
+
if (!Number.isFinite(value)) {
|
|
185
|
+
return 0;
|
|
186
|
+
}
|
|
187
|
+
if (value < 0) {
|
|
188
|
+
return 0;
|
|
189
|
+
}
|
|
190
|
+
if (value > 1) {
|
|
191
|
+
return 1;
|
|
192
|
+
}
|
|
193
|
+
return value;
|
|
194
|
+
}
|
|
195
|
+
function round(value) {
|
|
196
|
+
return Math.round(clamp01(value) * 1e4) / 1e4;
|
|
197
|
+
}
|
|
198
|
+
function splitTokens(text) {
|
|
199
|
+
const lowered = normalizeObservationContent(text);
|
|
200
|
+
const matches = lowered.match(WORD_TOKEN_RE) ?? [];
|
|
201
|
+
return matches.filter((token) => token.length >= 2 && !STOPWORDS.has(token));
|
|
202
|
+
}
|
|
203
|
+
function toTokenSet(text) {
|
|
204
|
+
return new Set(splitTokens(text));
|
|
205
|
+
}
|
|
206
|
+
function overlapScore(expectedTokens, actualTokens) {
|
|
207
|
+
if (expectedTokens.size === 0 || actualTokens.size === 0) {
|
|
208
|
+
return 0;
|
|
209
|
+
}
|
|
210
|
+
let overlap = 0;
|
|
211
|
+
for (const token of expectedTokens) {
|
|
212
|
+
if (actualTokens.has(token)) {
|
|
213
|
+
overlap += 1;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return overlap / expectedTokens.size;
|
|
217
|
+
}
|
|
218
|
+
function containsTerm(haystack, term) {
|
|
219
|
+
const normalizedHaystack = haystack.toLowerCase();
|
|
220
|
+
const normalizedTerm = term.toLowerCase();
|
|
221
|
+
if (!normalizedTerm) {
|
|
222
|
+
return false;
|
|
223
|
+
}
|
|
224
|
+
if (/[^a-z0-9]/.test(normalizedTerm)) {
|
|
225
|
+
return normalizedHaystack.includes(normalizedTerm);
|
|
226
|
+
}
|
|
227
|
+
const escaped = normalizedTerm.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
228
|
+
const regex = new RegExp(`\\b${escaped}\\b`, "i");
|
|
229
|
+
return regex.test(normalizedHaystack);
|
|
230
|
+
}
|
|
231
|
+
function extractSearchTerms(text, minimumLength = 6) {
|
|
232
|
+
const matches = text.match(TERM_TOKEN_RE) ?? [];
|
|
233
|
+
const seen = /* @__PURE__ */ new Set();
|
|
234
|
+
const terms = [];
|
|
235
|
+
for (const raw of matches) {
|
|
236
|
+
const normalized = raw.toLowerCase();
|
|
237
|
+
if (normalized.length < minimumLength) {
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
if (STOPWORDS.has(normalized)) {
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
const hasSignal = /[A-Z]/.test(raw) || /\d/.test(raw) || /[._/-]/.test(raw) || normalized.length >= 8;
|
|
244
|
+
if (!hasSignal) {
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
if (!seen.has(normalized)) {
|
|
248
|
+
seen.add(normalized);
|
|
249
|
+
terms.push(raw);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return terms;
|
|
253
|
+
}
|
|
254
|
+
function extractKeywordSetFromTranscript(transcript, hints = []) {
|
|
255
|
+
const counts = /* @__PURE__ */ new Map();
|
|
256
|
+
for (const term of extractSearchTerms(transcript, 4)) {
|
|
257
|
+
const key = term.toLowerCase();
|
|
258
|
+
const current = counts.get(key) ?? { raw: term, count: 0 };
|
|
259
|
+
current.count += 1;
|
|
260
|
+
counts.set(key, current);
|
|
261
|
+
}
|
|
262
|
+
for (const hint of hints) {
|
|
263
|
+
const trimmed = hint.trim();
|
|
264
|
+
if (!trimmed) {
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
const key = trimmed.toLowerCase();
|
|
268
|
+
const current = counts.get(key) ?? { raw: trimmed, count: 0 };
|
|
269
|
+
current.count += 2;
|
|
270
|
+
counts.set(key, current);
|
|
271
|
+
}
|
|
272
|
+
const ranked = [...counts.values()].sort((left, right) => right.count - left.count || right.raw.length - left.raw.length || left.raw.localeCompare(right.raw)).map((entry) => entry.raw);
|
|
273
|
+
if (ranked.length > 0) {
|
|
274
|
+
return ranked.slice(0, 25);
|
|
275
|
+
}
|
|
276
|
+
const fallback = [...new Set(splitTokens(transcript))].filter((token) => token.length >= 5).slice(0, 12);
|
|
277
|
+
return fallback;
|
|
278
|
+
}
|
|
279
|
+
function matchObservationRecords(expected, actual, threshold = 0.35) {
|
|
280
|
+
const expectedTokens = expected.map((record) => toTokenSet(record.content));
|
|
281
|
+
const actualTokens = actual.map((record) => toTokenSet(record.content));
|
|
282
|
+
const expectedOrder = expected.map((record, index) => ({ index, importance: record.importance })).sort((left, right) => right.importance - left.importance).map((entry) => entry.index);
|
|
283
|
+
const usedActual = /* @__PURE__ */ new Set();
|
|
284
|
+
const matches = [];
|
|
285
|
+
for (const expectedIndex of expectedOrder) {
|
|
286
|
+
let bestIndex = -1;
|
|
287
|
+
let bestScore = 0;
|
|
288
|
+
for (let actualIndex = 0; actualIndex < actual.length; actualIndex += 1) {
|
|
289
|
+
if (usedActual.has(actualIndex)) {
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
const score = overlapScore(expectedTokens[expectedIndex] ?? /* @__PURE__ */ new Set(), actualTokens[actualIndex] ?? /* @__PURE__ */ new Set());
|
|
293
|
+
if (score > bestScore) {
|
|
294
|
+
bestScore = score;
|
|
295
|
+
bestIndex = actualIndex;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
if (bestIndex >= 0 && bestScore >= threshold) {
|
|
299
|
+
usedActual.add(bestIndex);
|
|
300
|
+
matches.push({
|
|
301
|
+
expectedIndex,
|
|
302
|
+
actualIndex: bestIndex,
|
|
303
|
+
similarity: round(bestScore)
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return matches.sort((left, right) => left.expectedIndex - right.expectedIndex);
|
|
308
|
+
}
|
|
309
|
+
function computeMetrics(expected, actual, matches, keywordSet, minimumImportanceForRecall) {
|
|
310
|
+
const matchedExpected = new Set(matches.map((match) => match.expectedIndex));
|
|
311
|
+
const matchedActual = new Set(matches.map((match) => match.actualIndex));
|
|
312
|
+
const precision = actual.length === 0 ? expected.length === 0 ? 1 : 0 : matchedActual.size / actual.length;
|
|
313
|
+
const noiseRatio = actual.length === 0 ? 0 : (actual.length - matchedActual.size) / actual.length;
|
|
314
|
+
const importantExpected = expected.filter((record) => record.importance >= minimumImportanceForRecall);
|
|
315
|
+
const totalImportantWeight = importantExpected.reduce((sum, record) => sum + record.importance, 0);
|
|
316
|
+
const matchedImportantWeight = matches.reduce((sum, match) => {
|
|
317
|
+
const record = expected[match.expectedIndex];
|
|
318
|
+
if (!record || record.importance < minimumImportanceForRecall) {
|
|
319
|
+
return sum;
|
|
320
|
+
}
|
|
321
|
+
return sum + record.importance;
|
|
322
|
+
}, 0);
|
|
323
|
+
const recall = totalImportantWeight === 0 ? 1 : matchedImportantWeight / totalImportantWeight;
|
|
324
|
+
let typeNumerator = 0;
|
|
325
|
+
let typeDenominator = 0;
|
|
326
|
+
for (const match of matches) {
|
|
327
|
+
const expectedRecord = expected[match.expectedIndex];
|
|
328
|
+
const actualRecord = actual[match.actualIndex];
|
|
329
|
+
if (!expectedRecord || !actualRecord) {
|
|
330
|
+
continue;
|
|
331
|
+
}
|
|
332
|
+
const weight = Math.max(0.2, expectedRecord.importance);
|
|
333
|
+
typeDenominator += weight;
|
|
334
|
+
if (expectedRecord.type === actualRecord.type) {
|
|
335
|
+
typeNumerator += weight;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
const typeAccuracy = typeDenominator === 0 ? expected.length === 0 && actual.length === 0 ? 1 : 0 : typeNumerator / typeDenominator;
|
|
339
|
+
const actualCombined = actual.map((record) => record.content).join("\n");
|
|
340
|
+
const missingKeywords = keywordSet.filter((keyword) => !containsTerm(actualCombined, keyword));
|
|
341
|
+
const keywordPreservation = keywordSet.length === 0 ? 1 : (keywordSet.length - missingKeywords.length) / keywordSet.length;
|
|
342
|
+
const keywordRewriteFlags = [];
|
|
343
|
+
for (const match of matches) {
|
|
344
|
+
const expectedRecord = expected[match.expectedIndex];
|
|
345
|
+
const actualRecord = actual[match.actualIndex];
|
|
346
|
+
if (!expectedRecord || !actualRecord) {
|
|
347
|
+
continue;
|
|
348
|
+
}
|
|
349
|
+
const expectedTerms = extractSearchTerms(expectedRecord.content, 5);
|
|
350
|
+
if (expectedTerms.length === 0) {
|
|
351
|
+
continue;
|
|
352
|
+
}
|
|
353
|
+
const missing = expectedTerms.filter((term) => !containsTerm(actualRecord.content, term));
|
|
354
|
+
if (missing.length > 0) {
|
|
355
|
+
keywordRewriteFlags.push({
|
|
356
|
+
expected: expectedRecord.content,
|
|
357
|
+
actual: actualRecord.content,
|
|
358
|
+
missingTerms: missing
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
const overall = precision * 0.3 + recall * 0.35 + keywordPreservation * 0.2 + typeAccuracy * 0.15;
|
|
363
|
+
return {
|
|
364
|
+
metrics: {
|
|
365
|
+
precision: round(precision),
|
|
366
|
+
noiseRatio: round(noiseRatio),
|
|
367
|
+
recall: round(recall),
|
|
368
|
+
typeAccuracy: round(typeAccuracy),
|
|
369
|
+
keywordPreservation: round(keywordPreservation),
|
|
370
|
+
overall: round(overall)
|
|
371
|
+
},
|
|
372
|
+
missedImportant: expected.filter((record, index) => record.importance >= minimumImportanceForRecall && !matchedExpected.has(index)),
|
|
373
|
+
noiseObservations: actual.filter((_, index) => !matchedActual.has(index)),
|
|
374
|
+
missingKeywords,
|
|
375
|
+
keywordRewriteFlags
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
function scoreFixtureObservations(input) {
|
|
379
|
+
const options = input.options ?? {};
|
|
380
|
+
const minimumImportanceForRecall = clamp01(options.minimumImportanceForRecall ?? 0.5);
|
|
381
|
+
const threshold = clamp01(options.matchThreshold ?? 0.35);
|
|
382
|
+
const expected = parseObservationMarkdown(input.expectedMarkdown);
|
|
383
|
+
const actual = parseObservationMarkdown(input.actualMarkdown);
|
|
384
|
+
const matches = matchObservationRecords(expected, actual, threshold);
|
|
385
|
+
const keywordSet = extractKeywordSetFromTranscript(input.transcript, options.keywordHints ?? []);
|
|
386
|
+
const computed = computeMetrics(expected, actual, matches, keywordSet, minimumImportanceForRecall);
|
|
387
|
+
return {
|
|
388
|
+
metrics: computed.metrics,
|
|
389
|
+
matches,
|
|
390
|
+
missedImportant: computed.missedImportant,
|
|
391
|
+
noiseObservations: computed.noiseObservations,
|
|
392
|
+
keywordSet,
|
|
393
|
+
missingKeywords: computed.missingKeywords,
|
|
394
|
+
keywordRewriteFlags: computed.keywordRewriteFlags
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
function compareObservationText(left, right) {
|
|
398
|
+
return normalizeObservationContent(left) === normalizeObservationContent(right);
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// src/observer/benchmark/runner.ts
|
|
402
|
+
var DEFAULT_PROVIDER = "mock";
|
|
403
|
+
var DEFAULT_NOW = /* @__PURE__ */ new Date("2026-03-10T12:00:00.000Z");
|
|
404
|
+
function parseFixtureNow(raw) {
|
|
405
|
+
if (!raw) {
|
|
406
|
+
return DEFAULT_NOW;
|
|
407
|
+
}
|
|
408
|
+
const parsed = new Date(raw);
|
|
409
|
+
if (Number.isNaN(parsed.getTime())) {
|
|
410
|
+
throw new Error(`Invalid fixture config now timestamp: ${raw}`);
|
|
411
|
+
}
|
|
412
|
+
return parsed;
|
|
413
|
+
}
|
|
414
|
+
function parseTranscriptMessages(rawTranscript, transcriptPath) {
|
|
415
|
+
const lineMessages = rawTranscript.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
|
|
416
|
+
if (lineMessages.length > 0) {
|
|
417
|
+
return lineMessages;
|
|
418
|
+
}
|
|
419
|
+
return parseSessionFile(transcriptPath);
|
|
420
|
+
}
|
|
421
|
+
function withNoLlm(enabled, task) {
|
|
422
|
+
if (!enabled) {
|
|
423
|
+
return task();
|
|
424
|
+
}
|
|
425
|
+
const previous = process.env.CLAWVAULT_NO_LLM;
|
|
426
|
+
process.env.CLAWVAULT_NO_LLM = "1";
|
|
427
|
+
return task().finally(() => {
|
|
428
|
+
if (previous === void 0) {
|
|
429
|
+
delete process.env.CLAWVAULT_NO_LLM;
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
432
|
+
process.env.CLAWVAULT_NO_LLM = previous;
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
function averageMetrics(rows) {
|
|
436
|
+
if (rows.length === 0) {
|
|
437
|
+
return {
|
|
438
|
+
precision: 0,
|
|
439
|
+
noiseRatio: 0,
|
|
440
|
+
recall: 0,
|
|
441
|
+
typeAccuracy: 0,
|
|
442
|
+
keywordPreservation: 0,
|
|
443
|
+
overall: 0
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
const totals = rows.reduce((acc, metrics) => {
|
|
447
|
+
acc.precision += metrics.precision;
|
|
448
|
+
acc.noiseRatio += metrics.noiseRatio;
|
|
449
|
+
acc.recall += metrics.recall;
|
|
450
|
+
acc.typeAccuracy += metrics.typeAccuracy;
|
|
451
|
+
acc.keywordPreservation += metrics.keywordPreservation;
|
|
452
|
+
acc.overall += metrics.overall;
|
|
453
|
+
return acc;
|
|
454
|
+
}, {
|
|
455
|
+
precision: 0,
|
|
456
|
+
noiseRatio: 0,
|
|
457
|
+
recall: 0,
|
|
458
|
+
typeAccuracy: 0,
|
|
459
|
+
keywordPreservation: 0,
|
|
460
|
+
overall: 0
|
|
461
|
+
});
|
|
462
|
+
const count = rows.length;
|
|
463
|
+
const round2 = (value) => Math.round(value / count * 1e4) / 1e4;
|
|
464
|
+
return {
|
|
465
|
+
precision: round2(totals.precision),
|
|
466
|
+
noiseRatio: round2(totals.noiseRatio),
|
|
467
|
+
recall: round2(totals.recall),
|
|
468
|
+
typeAccuracy: round2(totals.typeAccuracy),
|
|
469
|
+
keywordPreservation: round2(totals.keywordPreservation),
|
|
470
|
+
overall: round2(totals.overall)
|
|
471
|
+
};
|
|
472
|
+
}
|
|
473
|
+
function unique(values) {
|
|
474
|
+
return [...new Set(values)];
|
|
475
|
+
}
|
|
476
|
+
async function runObserverBenchmark(options) {
|
|
477
|
+
const fixtures = loadObserverBenchmarkFixtures(options.fixturesDir);
|
|
478
|
+
const fixtureResults = [];
|
|
479
|
+
for (const fixture of fixtures) {
|
|
480
|
+
const fixtureProvider = fixture.config.compression?.provider ?? options.provider ?? DEFAULT_PROVIDER;
|
|
481
|
+
const fixtureModel = fixture.config.compression?.model ?? options.model;
|
|
482
|
+
const fixtureNow = parseFixtureNow(fixture.config.now);
|
|
483
|
+
const messages = parseTranscriptMessages(fixture.transcript, fixture.transcriptPath);
|
|
484
|
+
const compressor = new Compressor({
|
|
485
|
+
provider: fixtureProvider === "mock" ? void 0 : fixtureProvider,
|
|
486
|
+
model: fixtureModel,
|
|
487
|
+
baseUrl: fixture.config.compression?.baseUrl,
|
|
488
|
+
apiKey: fixture.config.compression?.apiKey,
|
|
489
|
+
now: () => fixtureNow
|
|
490
|
+
});
|
|
491
|
+
const outputObservations = await withNoLlm(
|
|
492
|
+
fixtureProvider === "mock",
|
|
493
|
+
async () => compressor.compress(messages, fixture.config.existingObservations ?? "")
|
|
494
|
+
);
|
|
495
|
+
const scoring = scoreFixtureObservations({
|
|
496
|
+
transcript: fixture.transcript,
|
|
497
|
+
expectedMarkdown: fixture.expected,
|
|
498
|
+
actualMarkdown: outputObservations,
|
|
499
|
+
options: {
|
|
500
|
+
matchThreshold: fixture.config.scoring?.matchThreshold,
|
|
501
|
+
minimumImportanceForRecall: fixture.config.scoring?.minimumImportanceForRecall,
|
|
502
|
+
keywordHints: fixture.config.scoring?.keywordHints
|
|
503
|
+
}
|
|
504
|
+
});
|
|
505
|
+
const expectedRecords = parseObservationMarkdown(fixture.expected);
|
|
506
|
+
const actualRecords = parseObservationMarkdown(outputObservations);
|
|
507
|
+
fixtureResults.push({
|
|
508
|
+
fixtureId: fixture.id,
|
|
509
|
+
transcriptPath: fixture.transcriptPath,
|
|
510
|
+
expectedPath: fixture.expectedPath,
|
|
511
|
+
provider: fixtureProvider,
|
|
512
|
+
model: fixtureModel,
|
|
513
|
+
outputObservations,
|
|
514
|
+
expectedCount: expectedRecords.length,
|
|
515
|
+
actualCount: actualRecords.length,
|
|
516
|
+
expectedTypes: unique(expectedRecords.map((record) => record.type)),
|
|
517
|
+
actualTypes: unique(actualRecords.map((record) => record.type)),
|
|
518
|
+
scoring
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
const reportProvider = options.provider ?? DEFAULT_PROVIDER;
|
|
522
|
+
return {
|
|
523
|
+
generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
524
|
+
fixturesDir: options.fixturesDir,
|
|
525
|
+
provider: reportProvider,
|
|
526
|
+
model: options.model,
|
|
527
|
+
fixtureCount: fixtureResults.length,
|
|
528
|
+
aggregate: averageMetrics(fixtureResults.map((row) => row.scoring.metrics)),
|
|
529
|
+
fixtures: fixtureResults
|
|
530
|
+
};
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
// src/commands/benchmark.ts
|
|
534
|
+
var PROVIDERS = [
|
|
535
|
+
"mock",
|
|
536
|
+
"anthropic",
|
|
537
|
+
"openai",
|
|
538
|
+
"gemini",
|
|
539
|
+
"xai",
|
|
540
|
+
"openai-compatible",
|
|
541
|
+
"ollama",
|
|
542
|
+
"minimax",
|
|
543
|
+
"zai"
|
|
544
|
+
];
|
|
545
|
+
function parseReportFormat(raw) {
|
|
546
|
+
if (!raw || raw === "text") {
|
|
547
|
+
return "text";
|
|
548
|
+
}
|
|
549
|
+
if (raw === "json") {
|
|
550
|
+
return "json";
|
|
551
|
+
}
|
|
552
|
+
throw new Error(`Invalid --report-format value: ${raw}`);
|
|
553
|
+
}
|
|
554
|
+
function parseProvider(raw) {
|
|
555
|
+
if (!raw) {
|
|
556
|
+
return "mock";
|
|
557
|
+
}
|
|
558
|
+
if (!PROVIDERS.includes(raw)) {
|
|
559
|
+
throw new Error(`Invalid --provider value: ${raw}`);
|
|
560
|
+
}
|
|
561
|
+
return raw;
|
|
562
|
+
}
|
|
563
|
+
async function benchmarkObserverCommand(options) {
|
|
564
|
+
const provider = parseProvider(options.provider);
|
|
565
|
+
const reportFormat = parseReportFormat(options.reportFormat);
|
|
566
|
+
const fixturesDir = path2.resolve(options.fixturesDir ?? path2.join(process.cwd(), "testdata", "observer-benchmark"));
|
|
567
|
+
const report = await runObserverBenchmark({
|
|
568
|
+
fixturesDir,
|
|
569
|
+
provider,
|
|
570
|
+
model: options.model
|
|
571
|
+
});
|
|
572
|
+
if (reportFormat === "json") {
|
|
573
|
+
console.log(JSON.stringify(report, null, 2));
|
|
574
|
+
return;
|
|
575
|
+
}
|
|
576
|
+
console.log(formatObserverBenchmarkSummary(report));
|
|
577
|
+
}
|
|
578
|
+
function registerBenchmarkCommand(program) {
|
|
579
|
+
const benchmark = program.command("benchmark").description("Run quality benchmark harnesses");
|
|
580
|
+
benchmark.command("observer").description("Evaluate observer output quality against annotated transcripts").option("--fixtures-dir <path>", "Fixture root directory (default: testdata/observer-benchmark)").option("--provider <provider>", "Compression provider (mock|anthropic|openai|gemini|xai|openai-compatible|ollama|minimax|zai)", "mock").option("--model <model>", "Model override for live provider runs").option("--report-format <format>", "Report output format (json|text)", "text").action(async (rawOptions) => {
|
|
581
|
+
await benchmarkObserverCommand({
|
|
582
|
+
fixturesDir: rawOptions.fixturesDir,
|
|
583
|
+
provider: rawOptions.provider,
|
|
584
|
+
model: rawOptions.model,
|
|
585
|
+
reportFormat: rawOptions.reportFormat
|
|
586
|
+
});
|
|
587
|
+
});
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
export {
|
|
591
|
+
formatObserverBenchmarkSummary,
|
|
592
|
+
loadObserverBenchmarkFixtures,
|
|
593
|
+
extractKeywordSetFromTranscript,
|
|
594
|
+
matchObservationRecords,
|
|
595
|
+
scoreFixtureObservations,
|
|
596
|
+
compareObservationText,
|
|
597
|
+
runObserverBenchmark,
|
|
598
|
+
benchmarkObserverCommand,
|
|
599
|
+
registerBenchmarkCommand
|
|
600
|
+
};
|
package/dist/cli/index.js
CHANGED
|
@@ -1,36 +1,43 @@
|
|
|
1
1
|
import {
|
|
2
2
|
registerCliCommands
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import "../chunk-
|
|
3
|
+
} from "../chunk-DCF4KMFD.js";
|
|
4
|
+
import "../chunk-KCYWJDDW.js";
|
|
5
5
|
import "../chunk-TIGW564L.js";
|
|
6
6
|
import "../chunk-IVRIKYFE.js";
|
|
7
|
-
import "../chunk-
|
|
8
|
-
import "../chunk-
|
|
9
|
-
import "../chunk-
|
|
10
|
-
import "../chunk-
|
|
11
|
-
import "../chunk-
|
|
12
|
-
import "../chunk-
|
|
13
|
-
import "../chunk-
|
|
14
|
-
import "../chunk-AZYOKJYC.js";
|
|
7
|
+
import "../chunk-DOIUYIXV.js";
|
|
8
|
+
import "../chunk-TWMI3SNN.js";
|
|
9
|
+
import "../chunk-OFOCU2V4.js";
|
|
10
|
+
import "../chunk-D5U3Q4N5.js";
|
|
11
|
+
import "../chunk-BLQXXX7Q.js";
|
|
12
|
+
import "../chunk-VXAGOLDP.js";
|
|
13
|
+
import "../chunk-7SWP5FKU.js";
|
|
15
14
|
import "../chunk-HRLWZGMA.js";
|
|
16
|
-
import "../chunk-
|
|
15
|
+
import "../chunk-DVOUSOR3.js";
|
|
16
|
+
import "../chunk-4PY655YM.js";
|
|
17
|
+
import "../chunk-AXSJIFOJ.js";
|
|
18
|
+
import "../chunk-GFCHWMGD.js";
|
|
19
|
+
import "../chunk-T7E764W3.js";
|
|
20
|
+
import "../chunk-HEHO7SMV.js";
|
|
21
|
+
import "../chunk-2PKBIKDH.js";
|
|
22
|
+
import "../chunk-35JCYSRR.js";
|
|
17
23
|
import "../chunk-BSJ6RIT7.js";
|
|
18
|
-
import "../chunk-
|
|
19
|
-
import "../chunk-ECRZL5XR.js";
|
|
20
|
-
import "../chunk-WIOLLGAD.js";
|
|
21
|
-
import "../chunk-5PJ4STIC.js";
|
|
22
|
-
import "../chunk-YNIPYN4F.js";
|
|
23
|
-
import "../chunk-URXDAUVH.js";
|
|
24
|
-
import "../chunk-YXQCA6B7.js";
|
|
24
|
+
import "../chunk-ECGJYWNA.js";
|
|
25
25
|
import "../chunk-2CDEETQN.js";
|
|
26
|
+
import "../chunk-FZ5I2NF7.js";
|
|
27
|
+
import "../chunk-PTWPPVC7.js";
|
|
28
|
+
import "../chunk-H3JZIB5O.js";
|
|
26
29
|
import "../chunk-MQUJNOHK.js";
|
|
27
|
-
import "../chunk-
|
|
28
|
-
import "../chunk-
|
|
30
|
+
import "../chunk-GJO3CFUN.js";
|
|
31
|
+
import "../chunk-ZKWPCBYT.js";
|
|
32
|
+
import "../chunk-MW5C6ZQA.js";
|
|
33
|
+
import "../chunk-J3YUXVID.js";
|
|
34
|
+
import "../chunk-FHFUXL6G.js";
|
|
35
|
+
import "../chunk-33DOSHTA.js";
|
|
29
36
|
import "../chunk-Z2XBWN7A.js";
|
|
30
37
|
import "../chunk-QWQ3TIKS.js";
|
|
31
38
|
import "../chunk-MFAWT5O5.js";
|
|
32
39
|
import "../chunk-7766SIJP.js";
|
|
33
|
-
import "../chunk-
|
|
40
|
+
import "../chunk-2ZDO52B4.js";
|
|
34
41
|
export {
|
|
35
42
|
registerCliCommands
|
|
36
43
|
};
|
package/dist/commands/archive.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
archiveCommand,
|
|
3
3
|
registerArchiveCommand
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-VBILES4B.js";
|
|
5
5
|
import "../chunk-MQUJNOHK.js";
|
|
6
|
-
import "../chunk-
|
|
6
|
+
import "../chunk-GJO3CFUN.js";
|
|
7
7
|
import "../chunk-Z2XBWN7A.js";
|
|
8
|
-
import "../chunk-
|
|
8
|
+
import "../chunk-2ZDO52B4.js";
|
|
9
9
|
export {
|
|
10
10
|
archiveCommand,
|
|
11
11
|
registerArchiveCommand
|
package/dist/commands/backlog.js
CHANGED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
|
|
3
|
+
interface BenchmarkObserverCommandOptions {
|
|
4
|
+
fixturesDir?: string;
|
|
5
|
+
provider?: string;
|
|
6
|
+
model?: string;
|
|
7
|
+
reportFormat?: string;
|
|
8
|
+
}
|
|
9
|
+
declare function benchmarkObserverCommand(options: BenchmarkObserverCommandOptions): Promise<void>;
|
|
10
|
+
declare function registerBenchmarkCommand(program: Command): void;
|
|
11
|
+
|
|
12
|
+
export { type BenchmarkObserverCommandOptions, benchmarkObserverCommand, registerBenchmarkCommand };
|