@alan512/experienceengine 0.3.6 → 0.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 +7 -2
- package/README.zh-CN.md +7 -2
- package/dist/cli/commands/doctor.js +56 -0
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/inspect.js +78 -1
- package/dist/cli/commands/inspect.js.map +1 -1
- package/dist/cli/commands/maintenance.js +80 -2
- package/dist/cli/commands/maintenance.js.map +1 -1
- package/dist/compiler/command-normalizer.d.ts +27 -0
- package/dist/compiler/command-normalizer.js +263 -0
- package/dist/compiler/command-normalizer.js.map +1 -0
- package/dist/compiler/trajectory-compiler.d.ts +12 -0
- package/dist/compiler/trajectory-compiler.js +179 -0
- package/dist/compiler/trajectory-compiler.js.map +1 -0
- package/dist/compiler/trajectory-matcher.d.ts +18 -0
- package/dist/compiler/trajectory-matcher.js +419 -0
- package/dist/compiler/trajectory-matcher.js.map +1 -0
- package/dist/config/config-schema.d.ts +11 -0
- package/dist/config/config-schema.js +9 -0
- package/dist/config/config-schema.js.map +1 -1
- package/dist/config/default-config.js +1 -0
- package/dist/config/default-config.js.map +1 -1
- package/dist/controller/candidate-retriever.d.ts +3 -1
- package/dist/controller/candidate-retriever.js +247 -7
- package/dist/controller/candidate-retriever.js.map +1 -1
- package/dist/controller/intervention-controller.js +48 -21
- package/dist/controller/intervention-controller.js.map +1 -1
- package/dist/controller/trigger-evaluator.d.ts +2 -1
- package/dist/controller/trigger-evaluator.js +10 -4
- package/dist/controller/trigger-evaluator.js.map +1 -1
- package/dist/experience-management/node-lifecycle-governance.js +25 -6
- package/dist/experience-management/node-lifecycle-governance.js.map +1 -1
- package/dist/input/fingerprint-extractor.d.ts +53 -0
- package/dist/input/fingerprint-extractor.js +620 -0
- package/dist/input/fingerprint-extractor.js.map +1 -0
- package/dist/interaction/service.d.ts +11 -1
- package/dist/interaction/service.js +11 -1
- package/dist/interaction/service.js.map +1 -1
- package/dist/maintenance/vector-migrator.d.ts +37 -0
- package/dist/maintenance/vector-migrator.js +170 -0
- package/dist/maintenance/vector-migrator.js.map +1 -0
- package/dist/plugin/openclaw-plugin.d.ts +8 -0
- package/dist/runtime/prompt-service.js +10 -0
- package/dist/runtime/prompt-service.js.map +1 -1
- package/dist/runtime/service.d.ts +2 -0
- package/dist/runtime/service.js +127 -2
- package/dist/runtime/service.js.map +1 -1
- package/dist/store/sqlite/db.js +18 -1
- package/dist/store/sqlite/db.js.map +1 -1
- package/dist/store/sqlite/repositories/attribution-record-repo.js +12 -0
- package/dist/store/sqlite/repositories/attribution-record-repo.js.map +1 -1
- package/dist/store/sqlite/repositories/node-repo.d.ts +1 -0
- package/dist/store/sqlite/repositories/node-repo.js +47 -2
- package/dist/store/sqlite/repositories/node-repo.js.map +1 -1
- package/dist/store/sqlite/repositories/scope-fingerprint-repo.d.ts +8 -0
- package/dist/store/sqlite/repositories/scope-fingerprint-repo.js +23 -0
- package/dist/store/sqlite/repositories/scope-fingerprint-repo.js.map +1 -0
- package/dist/store/sqlite/schema.sql +26 -0
- package/dist/store/vector/embeddings.d.ts +4 -2
- package/dist/store/vector/embeddings.js +19 -6
- package/dist/store/vector/embeddings.js.map +1 -1
- package/dist/store/vector/local-provider.d.ts +1 -1
- package/dist/store/vector/local-provider.js +40 -8
- package/dist/store/vector/local-provider.js.map +1 -1
- package/dist/store/vector/offline-manifest.d.ts +7 -0
- package/dist/store/vector/offline-manifest.js +162 -0
- package/dist/store/vector/offline-manifest.js.map +1 -0
- package/dist/store/vector/provider-types.d.ts +1 -0
- package/dist/types/domain.d.ts +111 -1
- package/dist/types/plugin.d.ts +1 -0
- package/docs/releases/v0.4.0.md +39 -0
- package/docs/user-guide.md +41 -0
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
|
@@ -11,6 +11,8 @@ import { bootstrapDatabase, openDatabase } from "../../store/sqlite/db.js";
|
|
|
11
11
|
import { CandidateRepository } from "../../store/sqlite/repositories/candidate-repo.js";
|
|
12
12
|
import { NodeRepository } from "../../store/sqlite/repositories/node-repo.js";
|
|
13
13
|
import { resetManagedEmbeddingCache } from "../../store/vector/local-provider.js";
|
|
14
|
+
import { VectorMigrationPipeline } from "../../maintenance/vector-migrator.js";
|
|
15
|
+
import { embedQueryText } from "../../store/vector/embeddings.js";
|
|
14
16
|
const parseGovernanceDrainArgs = (args) => {
|
|
15
17
|
if (args[0] !== "drain") {
|
|
16
18
|
return null;
|
|
@@ -36,6 +38,38 @@ const parseGovernanceDrainArgs = (args) => {
|
|
|
36
38
|
}
|
|
37
39
|
return parsed;
|
|
38
40
|
};
|
|
41
|
+
const parseMigrateArgs = (args) => {
|
|
42
|
+
const parsed = {};
|
|
43
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
44
|
+
const value = args[index];
|
|
45
|
+
const next = args[index + 1];
|
|
46
|
+
if (value === "--batch-size" && next) {
|
|
47
|
+
const batchSize = Number(next);
|
|
48
|
+
if (Number.isInteger(batchSize) && batchSize > 0) {
|
|
49
|
+
parsed.batchSize = batchSize;
|
|
50
|
+
index += 1;
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (value === "--throttle-gap" && next) {
|
|
55
|
+
const throttleGap = Number(next);
|
|
56
|
+
if (Number.isInteger(throttleGap) && throttleGap >= 0) {
|
|
57
|
+
parsed.throttleGapMs = throttleGap;
|
|
58
|
+
index += 1;
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (value === "--max-total" && next) {
|
|
63
|
+
const maxTotal = Number(next);
|
|
64
|
+
if (Number.isInteger(maxTotal) && maxTotal > 0) {
|
|
65
|
+
parsed.maxTotal = maxTotal;
|
|
66
|
+
index += 1;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return parsed;
|
|
72
|
+
};
|
|
39
73
|
export const runMaintenanceCommand = async (action, argsOrDeps = [], maybeDeps = {}) => {
|
|
40
74
|
const args = Array.isArray(argsOrDeps) ? argsOrDeps : [];
|
|
41
75
|
const deps = Array.isArray(argsOrDeps) ? maybeDeps : argsOrDeps;
|
|
@@ -151,7 +185,7 @@ export const runMaintenanceCommand = async (action, argsOrDeps = [], maybeDeps =
|
|
|
151
185
|
const [sourceScopeId, targetScopeId] = args;
|
|
152
186
|
if (!sourceScopeId || !targetScopeId) {
|
|
153
187
|
console.log("[ExperienceEngine] merge-scope requires <sourceScopeId> <targetScopeId>.");
|
|
154
|
-
console.log("Usage: ee maintenance embeddings-reset|embedding-smoke|governance drain|redistill-rule-nodes|claude-validate-print|merge-scope <sourceScopeId> <targetScopeId>");
|
|
188
|
+
console.log("Usage: ee maintenance embeddings-reset|embedding-smoke|governance drain|redistill-rule-nodes|claude-validate-print|merge-scope <sourceScopeId> <targetScopeId>|migrate [--batch-size <n>] [--throttle-gap <ms>] [--max-total <n>]");
|
|
155
189
|
return;
|
|
156
190
|
}
|
|
157
191
|
const report = (deps.mergeScopesWithConfig ?? mergeScopesWithConfig)(config, sourceScopeId, targetScopeId);
|
|
@@ -160,6 +194,50 @@ export const runMaintenanceCommand = async (action, argsOrDeps = [], maybeDeps =
|
|
|
160
194
|
console.log(`[ExperienceEngine] Merged aggregates: taskStats=${report.merged.taskStats}`);
|
|
161
195
|
return;
|
|
162
196
|
}
|
|
163
|
-
|
|
197
|
+
if (action === "migrate") {
|
|
198
|
+
const parsed = parseMigrateArgs(args);
|
|
199
|
+
console.log("[ExperienceEngine] Detecting active embedding space...");
|
|
200
|
+
let currentSpace;
|
|
201
|
+
try {
|
|
202
|
+
const probeResult = await embedQueryText("migration_probe", { config });
|
|
203
|
+
currentSpace = probeResult.space;
|
|
204
|
+
console.log(`[ExperienceEngine] Active space: ${currentSpace.provider}/${currentSpace.model} (${currentSpace.dimensions}d, manifest=${currentSpace.manifestId || "none"})`);
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
208
|
+
console.error(`[ExperienceEngine] Failed to resolve active space: ${msg}`);
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
const db = openDatabase(config);
|
|
212
|
+
bootstrapDatabase(db);
|
|
213
|
+
try {
|
|
214
|
+
const pipeline = new VectorMigrationPipeline();
|
|
215
|
+
console.log("[ExperienceEngine] Discovering nodes needing migration...");
|
|
216
|
+
const pendingCount = pipeline.discoverPendingNodes(db, currentSpace);
|
|
217
|
+
console.log(`[ExperienceEngine] Discovered ${pendingCount} pending nodes.`);
|
|
218
|
+
if (pendingCount === 0) {
|
|
219
|
+
console.log("[ExperienceEngine] All vectors are up-to-date in active space. No migration needed.");
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
console.log("[ExperienceEngine] Running vector migration pipeline...");
|
|
223
|
+
const report = await pipeline.runMigration(db, currentSpace, {
|
|
224
|
+
config,
|
|
225
|
+
batchSize: parsed.batchSize,
|
|
226
|
+
throttleGapMs: parsed.throttleGapMs,
|
|
227
|
+
maxTotalToProcess: parsed.maxTotal
|
|
228
|
+
});
|
|
229
|
+
console.log("[ExperienceEngine] Vector migration finished!");
|
|
230
|
+
console.log(`[ExperienceEngine] Total discovered: ${report.totalDiscovered} | Processed: ${report.processed} | Succeeded: ${report.succeeded} | Failed: ${report.failed}`);
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
const msg = error instanceof Error ? error.stack || error.message : String(error);
|
|
234
|
+
console.error(`[ExperienceEngine] Fatal migration error: ${msg}`);
|
|
235
|
+
}
|
|
236
|
+
finally {
|
|
237
|
+
db.close();
|
|
238
|
+
}
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
console.log("Usage: ee maintenance embeddings-reset|embedding-smoke|governance drain|redistill-rule-nodes|claude-validate-print|merge-scope <sourceScopeId> <targetScopeId>|migrate [--batch-size <n>] [--throttle-gap <ms>] [--max-total <n>]");
|
|
164
242
|
};
|
|
165
243
|
//# sourceMappingURL=maintenance.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"maintenance.js","sourceRoot":"","sources":["../../../src/cli/commands/maintenance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AACtF,OAAO,EAAE,yBAAyB,EAAE,MAAM,mDAAmD,CAAC;AAC9F,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAA6B,MAAM,sCAAsC,CAAC;AACpG,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,mDAAmD,CAAC;AACxF,OAAO,EAAE,cAAc,EAAE,MAAM,8CAA8C,CAAC;AAC9E,OAAO,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"maintenance.js","sourceRoot":"","sources":["../../../src/cli/commands/maintenance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AACtF,OAAO,EAAE,yBAAyB,EAAE,MAAM,mDAAmD,CAAC;AAC9F,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAA6B,MAAM,sCAAsC,CAAC;AACpG,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,mDAAmD,CAAC;AACxF,OAAO,EAAE,cAAc,EAAE,MAAM,8CAA8C,CAAC;AAC9E,OAAO,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAClF,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAYlE,MAAM,wBAAwB,GAAG,CAAC,IAAc,EAAgD,EAAE;IAChG,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAA0C,EAAE,CAAC;IACzD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC7B,IAAI,KAAK,KAAK,OAAO,IAAI,IAAI,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC;YAClB,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,KAAK,KAAK,eAAe,IAAI,IAAI,EAAE,CAAC;YACtC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;gBACnD,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;gBAC/B,KAAK,IAAI,CAAC,CAAC;gBACX,SAAS;YACX,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,IAAc,EAAqE,EAAE;IAC7G,MAAM,MAAM,GAAsE,EAAE,CAAC;IACrF,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC7B,IAAI,KAAK,KAAK,cAAc,IAAI,IAAI,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;gBACjD,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;gBAC7B,KAAK,IAAI,CAAC,CAAC;gBACX,SAAS;YACX,CAAC;QACH,CAAC;QACD,IAAI,KAAK,KAAK,gBAAgB,IAAI,IAAI,EAAE,CAAC;YACvC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;gBACtD,MAAM,CAAC,aAAa,GAAG,WAAW,CAAC;gBACnC,KAAK,IAAI,CAAC,CAAC;gBACX,SAAS;YACX,CAAC;QACH,CAAC;QACD,IAAI,KAAK,KAAK,aAAa,IAAI,IAAI,EAAE,CAAC;YACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;gBAC/C,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBAC3B,KAAK,IAAI,CAAC,CAAC;gBACX,SAAS;YACX,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EACxC,MAAe,EACf,aAAyC,EAAE,EAC3C,YAA6B,EAAE,EAChB,EAAE;IACjB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;IACzD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;IAChE,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,EAAE,CAAC;IAEjD,IAAI,MAAM,KAAK,kBAAkB,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,0BAA0B,IAAI,0BAA0B,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAEjG,OAAO,CAAC,GAAG,CAAC,+CAA+C,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9E,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,sFAAsF,CAAC,CAAC;YACpG,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CACT,2DAA2D,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,UAAU,eAAe,CAC7G,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,MAAM,KAAK,iBAAiB,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC9G,OAAO,CAAC,GAAG,CACT,mDAAmD,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,GAAG,CACtF,CAAC;QACF,OAAO,CAAC,GAAG,CACT,iCAAiC,MAAM,CAAC,WAAW,WAAW,MAAM,CAAC,WAAW,IAAI,CACrF,CAAC;QACF,OAAO,CAAC,GAAG,CACT,mCAAmC,MAAM,CAAC,aAAa,WAAW,MAAM,CAAC,aAAa,IAAI,CAC3F,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;YACzF,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC;QACnE,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAChC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAAC,EAAE,EAAE;gBACjD,OAAO;gBACP,UAAU,EAAE,MAAM,CAAC,UAAU;aAC9B,CAAC,CAAC;YACH,MAAM,cAAc,GAAG,EAAE;iBACtB,OAAO,CAAC,oGAAoG,CAAC;iBAC7G,GAAG,CAAC,OAAO,CAAsB,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,qDAAqD,OAAO,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YAC/F,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,iDAAiD,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YACjF,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,+CAA+C,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YACtG,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,8CAA8C,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC;QACpF,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,MAAM,KAAK,sBAAsB,EAAE,CAAC;QACtC,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,6BAA6B,IAAI,6BAA6B,CAAC,CAAC;YACvF,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,cAAc,EAAE,MAAM,CAAC,iBAAiB;YACxC,cAAc,EAAE,MAAM,CAAC,oBAAoB;YAC3C,WAAW,EAAE,MAAM,CAAC,cAAc;YAClC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;YACzC,iBAAiB,EAAE,MAAM,CAAC,4BAA4B;SACvD,CAAC,CAAC;QAEH,IAAI,UAAU,CAAC,gBAAgB,KAAK,KAAK,EAAE,CAAC;YAC1C,OAAO,CAAC,GAAG,CACT,mFAAmF,UAAU,CAAC,gBAAgB,GAAG,CAClH,CAAC;YACF,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,sBAAsB,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;YACzD,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GACV,IAAI,CAAC,kBAAkB;YACrB,CAAC,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC;gBAC5B,MAAM;gBACN,aAAa,EAAE,SAAkB;gBACjC,QAAQ,EAAE,SAAkB;gBAC5B,SAAS,EAAE,SAAkB;aACrB,CAAC;YACb,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;gBAChB,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;gBAChC,iBAAiB,CAAC,EAAE,CAAC,CAAC;gBACtB,IAAI,CAAC;oBACH,OAAO,MAAM,kBAAkB,CAAC;wBAC9B,MAAM;wBACN,aAAa,EAAE,IAAI,mBAAmB,CAAC,EAAE,CAAC;wBAC1C,QAAQ,EAAE,IAAI,cAAc,CAAC,EAAE,CAAC;wBAChC,SAAS,EAAE,IAAI,YAAY,CAAC,MAAM,CAAC;qBACpC,CAAC,CAAC;gBACL,CAAC;wBAAS,CAAC;oBACT,EAAE,CAAC,KAAK,EAAE,CAAC;gBACb,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;QAEX,OAAO,CAAC,GAAG,CACT,oEAAoE,UAAU,CAAC,kBAAkB,EAAE,CACpG,CAAC;QACF,OAAO,CAAC,GAAG,CACT,iCAAiC,MAAM,CAAC,SAAS,gBAAgB,MAAM,CAAC,QAAQ,8BAA8B,MAAM,CAAC,kBAAkB,cAAc,MAAM,CAAC,MAAM,EAAE,CACrK,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,MAAM,KAAK,uBAAuB,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,mBAAmB,IAAI,wBAAwB,CAAC,EAAE,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,iCAAiC,MAAM,CAAC,QAAQ,IAAI,MAAM,EAAE,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,oCAAoC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACpG,OAAO,CAAC,GAAG,CAAC,kCAAkC,MAAM,CAAC,cAAc,IAAI,WAAW,EAAE,CAAC,CAAC;QACtF,OAAO,CAAC,GAAG,CACT,wCAAwC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,cAAc,GAAG,CACpG,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,wCAAwC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5F,OAAO,CAAC,GAAG,CACT,sDAAsD,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CACrG,CAAC;QACF,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,8CAA8C,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QACrF,CAAC;QACD,IAAI,MAAM,CAAC,wBAAwB,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,6CAA6C,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,MAAM,KAAK,aAAa,EAAE,CAAC;QAC7B,MAAM,CAAC,aAAa,EAAE,aAAa,CAAC,GAAG,IAAI,CAAC;QAC5C,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAC;YACxF,OAAO,CAAC,GAAG,CACT,mOAAmO,CACpO,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,qBAAqB,IAAI,qBAAqB,CAAC,CAAC,MAAM,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;QAC3G,OAAO,CAAC,GAAG,CAAC,mCAAmC,MAAM,CAAC,aAAa,SAAS,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC;QACrG,OAAO,CAAC,GAAG,CACT,qCAAqC,MAAM,CAAC,KAAK,CAAC,YAAY,aAAa,MAAM,CAAC,KAAK,CAAC,QAAQ,eAAe,MAAM,CAAC,KAAK,CAAC,UAAU,UAAU,MAAM,CAAC,KAAK,CAAC,KAAK,eAAe,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,CAC3M,CAAC;QACF,OAAO,CAAC,GAAG,CACT,mDAAmD,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAC7E,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAEtC,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACtE,IAAI,YAAY,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YACxE,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC;YACjC,OAAO,CAAC,GAAG,CACT,oCAAoC,YAAY,CAAC,QAAQ,IAAI,YAAY,CAAC,KAAK,KAAK,YAAY,CAAC,UAAU,eAAe,YAAY,CAAC,UAAU,IAAI,MAAM,GAAG,CAC/J,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnE,OAAO,CAAC,KAAK,CAAC,sDAAsD,GAAG,EAAE,CAAC,CAAC;YAC3E,OAAO;QACT,CAAC;QAED,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAChC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,uBAAuB,EAAE,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;YACzE,MAAM,YAAY,GAAG,QAAQ,CAAC,oBAAoB,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,iCAAiC,YAAY,iBAAiB,CAAC,CAAC;YAE5E,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,qFAAqF,CAAC,CAAC;gBACnG,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;YACvE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,EAAE,EAAE,YAAY,EAAE;gBAC3D,MAAM;gBACN,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,iBAAiB,EAAE,MAAM,CAAC,QAAQ;aACnC,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CACT,wCAAwC,MAAM,CAAC,eAAe,iBAAiB,MAAM,CAAC,SAAS,iBAAiB,MAAM,CAAC,SAAS,cAAc,MAAM,CAAC,MAAM,EAAE,CAC9J,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAClF,OAAO,CAAC,KAAK,CAAC,6CAA6C,GAAG,EAAE,CAAC,CAAC;QACpE,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;QACD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CACT,mOAAmO,CACpO,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ToolEvent, NormalizedToolEvent } from "../types/domain.js";
|
|
2
|
+
export declare class CommandNormalizer {
|
|
3
|
+
/**
|
|
4
|
+
* Redacts volatile components like UUIDs, absolute/relative paths, ports, and branch names.
|
|
5
|
+
*/
|
|
6
|
+
static redactVolatileTokens(input: string): string;
|
|
7
|
+
/**
|
|
8
|
+
* Helper to extract the basename from a file path.
|
|
9
|
+
*/
|
|
10
|
+
static getBasename(pathStr: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Helper to extract the file extension.
|
|
13
|
+
*/
|
|
14
|
+
static getExtension(pathStr: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Normalizes a raw shell command string to extract commandFamily, subcommand, and redacted inputs.
|
|
17
|
+
*/
|
|
18
|
+
static normalizeCommand(rawCommand: string): {
|
|
19
|
+
commandFamily?: string;
|
|
20
|
+
subcommand?: string;
|
|
21
|
+
normalizedInput: string;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Transforms a raw ToolEvent into a NormalizedToolEvent.
|
|
25
|
+
*/
|
|
26
|
+
static normalizeToolEvent(event: ToolEvent): NormalizedToolEvent;
|
|
27
|
+
}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
export class CommandNormalizer {
|
|
2
|
+
/**
|
|
3
|
+
* Redacts volatile components like UUIDs, absolute/relative paths, ports, and branch names.
|
|
4
|
+
*/
|
|
5
|
+
static redactVolatileTokens(input) {
|
|
6
|
+
if (!input)
|
|
7
|
+
return "";
|
|
8
|
+
let redacted = input;
|
|
9
|
+
// 1. Redact UUIDs
|
|
10
|
+
const uuidRegex = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi;
|
|
11
|
+
redacted = redacted.replace(uuidRegex, "[UUID]");
|
|
12
|
+
// 2. Redact absolute Windows and Unix paths
|
|
13
|
+
// Windows paths like C:\Users\...\file.ext or d:/project/...
|
|
14
|
+
const winPathRegex = /[a-zA-Z]:\\[^\s"']+/g;
|
|
15
|
+
redacted = redacted.replace(winPathRegex, "[PATH]");
|
|
16
|
+
const winForwardPathRegex = /[a-zA-Z]:\/(?!\/)[^\s"']+/g;
|
|
17
|
+
redacted = redacted.replace(winForwardPathRegex, "[PATH]");
|
|
18
|
+
// Unix paths like /home/user/... or /tmp/...
|
|
19
|
+
// Avoid redacting commands starting with slash or generic patterns, so we only match longer path-like strings
|
|
20
|
+
const unixPathRegex = /(?:^|[\s"'\(=])(\/(?:home|Users|tmp|usr|opt|var|etc|bin|projects?|workspace|app)[a-zA-Z0-9_\-\.\/]+)/gi;
|
|
21
|
+
redacted = redacted.replace(unixPathRegex, (match, p1) => {
|
|
22
|
+
return match.replace(p1, "[PATH]");
|
|
23
|
+
});
|
|
24
|
+
// 3. Redact port numbers (e.g. :3000 or :8080)
|
|
25
|
+
const portRegex = /:([0-9]{4,5})\b/g;
|
|
26
|
+
redacted = redacted.replace(portRegex, ":[PORT]");
|
|
27
|
+
// 4. Redact branch names in git checkout command, or any feature/issue branch patterns
|
|
28
|
+
// E.g., feature/issue-102 or bugfix/abc
|
|
29
|
+
const branchRegex = /\b(feature|bugfix|release|hotfix|origin)\/[a-zA-Z0-9_\-\.]+/gi;
|
|
30
|
+
redacted = redacted.replace(branchRegex, "[BRANCH]");
|
|
31
|
+
// Also redact the specific git branch argument in checkout/switch commands
|
|
32
|
+
const gitCheckoutRegex = /(git\s+(?:checkout|switch)\s+(-b\s+)?)([a-zA-Z0-9_\-\.\/]+)/gi;
|
|
33
|
+
redacted = redacted.replace(gitCheckoutRegex, (match, p1, p2, p3) => {
|
|
34
|
+
// If p3 is not an option (starts with -), redact it
|
|
35
|
+
if (p3 && !p3.startsWith("-")) {
|
|
36
|
+
return `${p1}[BRANCH]`;
|
|
37
|
+
}
|
|
38
|
+
return match;
|
|
39
|
+
});
|
|
40
|
+
return redacted;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Helper to extract the basename from a file path.
|
|
44
|
+
*/
|
|
45
|
+
static getBasename(pathStr) {
|
|
46
|
+
const normalized = pathStr.replace(/\\/g, "/");
|
|
47
|
+
const parts = normalized.split("/");
|
|
48
|
+
return parts[parts.length - 1] || "";
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Helper to extract the file extension.
|
|
52
|
+
*/
|
|
53
|
+
static getExtension(pathStr) {
|
|
54
|
+
const basename = this.getBasename(pathStr);
|
|
55
|
+
const dotIndex = basename.lastIndexOf(".");
|
|
56
|
+
if (dotIndex === -1 || dotIndex === 0)
|
|
57
|
+
return "";
|
|
58
|
+
return basename.slice(dotIndex + 1);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Normalizes a raw shell command string to extract commandFamily, subcommand, and redacted inputs.
|
|
62
|
+
*/
|
|
63
|
+
static normalizeCommand(rawCommand) {
|
|
64
|
+
const redacted = this.redactVolatileTokens(rawCommand.trim());
|
|
65
|
+
if (!redacted) {
|
|
66
|
+
return { normalizedInput: "" };
|
|
67
|
+
}
|
|
68
|
+
// Split into tokens
|
|
69
|
+
const tokens = redacted.split(/\s+/);
|
|
70
|
+
let rawExecutable = tokens[0] || "";
|
|
71
|
+
// Normalize executable path (e.g. .\node_modules\.bin\tsc -> tsc)
|
|
72
|
+
let executable = this.getBasename(rawExecutable).replace(/\.(exe|cmd|bat|sh)$/i, "").toLowerCase();
|
|
73
|
+
// Group common executables/aliases
|
|
74
|
+
if (["pnpm", "npm", "yarn", "bun", "npx"].includes(executable)) {
|
|
75
|
+
// Package managers
|
|
76
|
+
let subcommand = "";
|
|
77
|
+
// Find first non-option token after package manager
|
|
78
|
+
let subIdx = 1;
|
|
79
|
+
while (subIdx < tokens.length && tokens[subIdx]?.startsWith("-")) {
|
|
80
|
+
subIdx++;
|
|
81
|
+
}
|
|
82
|
+
const primarySub = tokens[subIdx] || "";
|
|
83
|
+
if (primarySub && !primarySub.startsWith("-")) {
|
|
84
|
+
subcommand = primarySub.toLowerCase();
|
|
85
|
+
if (subcommand === "run" || subcommand === "exec") {
|
|
86
|
+
// If "run" or "exec", try to capture the next script name (e.g. pnpm run build -> run_build, pnpm exec tsc -> exec_tsc)
|
|
87
|
+
let scriptIdx = subIdx + 1;
|
|
88
|
+
while (scriptIdx < tokens.length && tokens[scriptIdx]?.startsWith("-")) {
|
|
89
|
+
scriptIdx++;
|
|
90
|
+
}
|
|
91
|
+
const scriptName = tokens[scriptIdx] || "";
|
|
92
|
+
if (scriptName && !scriptName.startsWith("-")) {
|
|
93
|
+
subcommand = `${subcommand}_${scriptName.toLowerCase()}`;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
commandFamily: executable,
|
|
99
|
+
subcommand,
|
|
100
|
+
normalizedInput: redacted
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
if (executable === "git") {
|
|
104
|
+
let subcommand = "";
|
|
105
|
+
let subIdx = 1;
|
|
106
|
+
while (subIdx < tokens.length && tokens[subIdx]?.startsWith("-")) {
|
|
107
|
+
subIdx++;
|
|
108
|
+
}
|
|
109
|
+
const primarySub = tokens[subIdx] || "";
|
|
110
|
+
if (primarySub && !primarySub.startsWith("-")) {
|
|
111
|
+
subcommand = primarySub.toLowerCase();
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
commandFamily: "git",
|
|
115
|
+
subcommand,
|
|
116
|
+
normalizedInput: redacted
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
// Other known build/test tools
|
|
120
|
+
if (["tsc", "vitest", "jest", "mocha", "eslint", "prettier", "vite", "next"].includes(executable)) {
|
|
121
|
+
return {
|
|
122
|
+
commandFamily: executable,
|
|
123
|
+
subcommand: "run",
|
|
124
|
+
normalizedInput: redacted
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
// Fallback for general executables
|
|
128
|
+
return {
|
|
129
|
+
commandFamily: executable || undefined,
|
|
130
|
+
normalizedInput: redacted
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Transforms a raw ToolEvent into a NormalizedToolEvent.
|
|
135
|
+
*/
|
|
136
|
+
static normalizeToolEvent(event) {
|
|
137
|
+
const status = event.status;
|
|
138
|
+
const normalizedOutput = event.output_summary ? this.redactVolatileTokens(event.output_summary) : undefined;
|
|
139
|
+
// Handle command executions
|
|
140
|
+
const isCmdToolName = /^(run_command|bash|execute_command|terminal|sh)$/i.test(event.tool_name);
|
|
141
|
+
if (isCmdToolName && event.input_summary) {
|
|
142
|
+
const normalizedCmd = this.normalizeCommand(event.input_summary);
|
|
143
|
+
return {
|
|
144
|
+
toolName: event.tool_name,
|
|
145
|
+
commandFamily: normalizedCmd.commandFamily,
|
|
146
|
+
subcommand: normalizedCmd.subcommand,
|
|
147
|
+
normalizedInput: normalizedCmd.normalizedInput,
|
|
148
|
+
normalizedOutput,
|
|
149
|
+
status
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
// Handle host-native file tools
|
|
153
|
+
const isFileToolName = /^(write_to_file|replace_file_content|multi_replace_file_content|write_file|read_file|view_file|apply_patch)$/i.test(event.tool_name);
|
|
154
|
+
if (isFileToolName && event.input_summary) {
|
|
155
|
+
const trimmed = event.input_summary.trim();
|
|
156
|
+
const pathsSet = new Set();
|
|
157
|
+
const addPath = (p) => {
|
|
158
|
+
if (p && typeof p === "string") {
|
|
159
|
+
let cleaned = p.trim();
|
|
160
|
+
cleaned = cleaned.replace(/^['"]|['"]$/g, "").trim();
|
|
161
|
+
if (cleaned) {
|
|
162
|
+
pathsSet.add(cleaned.replace(/\\/g, "/"));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
const extractPathsFromString = (text) => {
|
|
167
|
+
// Regex to match:
|
|
168
|
+
// *** Update File: path
|
|
169
|
+
// *** Add File: path
|
|
170
|
+
// *** Delete File: path
|
|
171
|
+
// Stop at any double quote, backslash, or comma which might demarcate JSON fields.
|
|
172
|
+
const patchPattern = /\*\*\*\s+(?:Update|Add|Delete)\s+File:\s*([^\r\n"\\,]+)/gi;
|
|
173
|
+
let match;
|
|
174
|
+
while ((match = patchPattern.exec(text)) !== null) {
|
|
175
|
+
if (match[1]) {
|
|
176
|
+
addPath(match[1]);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Regex to match git/standard diff headers:
|
|
180
|
+
// --- a/path
|
|
181
|
+
// +++ b/path
|
|
182
|
+
// Support optional quotes that may prefix/suffix headers in JSON formatting
|
|
183
|
+
const diffPattern = /^(?:"?--- a\/|"?\+\+\+ b\/)([^\r\n\t "]+)/gm;
|
|
184
|
+
let diffMatch;
|
|
185
|
+
while ((diffMatch = diffPattern.exec(text)) !== null) {
|
|
186
|
+
if (diffMatch[1]) {
|
|
187
|
+
addPath(diffMatch[1]);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
const walkJson = (val) => {
|
|
192
|
+
if (!val)
|
|
193
|
+
return;
|
|
194
|
+
if (typeof val === "string") {
|
|
195
|
+
extractPathsFromString(val);
|
|
196
|
+
}
|
|
197
|
+
else if (Array.isArray(val)) {
|
|
198
|
+
for (const item of val) {
|
|
199
|
+
walkJson(item);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
else if (typeof val === "object") {
|
|
203
|
+
for (const key of Object.keys(val)) {
|
|
204
|
+
const lowKey = key.toLowerCase();
|
|
205
|
+
const isPathProp = lowKey === "path" ||
|
|
206
|
+
lowKey === "filepath" ||
|
|
207
|
+
lowKey === "targetfile" ||
|
|
208
|
+
lowKey === "filename" ||
|
|
209
|
+
lowKey === "file";
|
|
210
|
+
if (isPathProp && typeof val[key] === "string") {
|
|
211
|
+
addPath(val[key]);
|
|
212
|
+
}
|
|
213
|
+
walkJson(val[key]);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
// Unescape escaped newline structures and replace double backslashes
|
|
218
|
+
let normalizedText = trimmed
|
|
219
|
+
.replace(/\\r\\n/g, "\n")
|
|
220
|
+
.replace(/\\n/g, "\n")
|
|
221
|
+
.replace(/\\r/g, "\n")
|
|
222
|
+
.replace(/\\\\/g, "/");
|
|
223
|
+
// 1. Try parsing normalizedText as JSON
|
|
224
|
+
if (normalizedText.startsWith("{") || normalizedText.startsWith("[")) {
|
|
225
|
+
try {
|
|
226
|
+
const parsed = JSON.parse(normalizedText);
|
|
227
|
+
walkJson(parsed);
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
// ignore parsing error, fallback to raw string extraction
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
// 2. Also run regex on normalized text directly
|
|
234
|
+
extractPathsFromString(normalizedText);
|
|
235
|
+
// 3. Fallback if no paths were resolved
|
|
236
|
+
if (pathsSet.size === 0) {
|
|
237
|
+
addPath(trimmed);
|
|
238
|
+
}
|
|
239
|
+
const paths = Array.from(pathsSet);
|
|
240
|
+
const primaryPath = paths[0] || "";
|
|
241
|
+
const basename = this.getBasename(primaryPath);
|
|
242
|
+
const extension = this.getExtension(primaryPath);
|
|
243
|
+
return {
|
|
244
|
+
toolName: event.tool_name,
|
|
245
|
+
artifactName: basename || undefined,
|
|
246
|
+
artifactExtension: extension || undefined,
|
|
247
|
+
artifactPath: primaryPath || undefined,
|
|
248
|
+
artifactPaths: paths,
|
|
249
|
+
normalizedInput: this.redactVolatileTokens(trimmed),
|
|
250
|
+
normalizedOutput,
|
|
251
|
+
status
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
// Default normalization
|
|
255
|
+
return {
|
|
256
|
+
toolName: event.tool_name,
|
|
257
|
+
normalizedInput: event.input_summary ? this.redactVolatileTokens(event.input_summary) : undefined,
|
|
258
|
+
normalizedOutput,
|
|
259
|
+
status
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=command-normalizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-normalizer.js","sourceRoot":"","sources":["../../src/compiler/command-normalizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { TrajectoryExpectation, CompiledTrajectoryExpectations, TrajectoryExpectationType } from "../types/domain.js";
|
|
2
|
+
export declare class TrajectoryCompiler {
|
|
3
|
+
static cleanStepProse(step: string): string;
|
|
4
|
+
/**
|
|
5
|
+
* Compiles a single step prose into a TrajectoryExpectation structure.
|
|
6
|
+
*/
|
|
7
|
+
static compileStep(stepProse: string, type: TrajectoryExpectationType): TrajectoryExpectation;
|
|
8
|
+
/**
|
|
9
|
+
* Compiles recommended_steps, avoid_steps, success_signal, stop_condition, and escalation_condition of an ExperienceNode into CompiledTrajectoryExpectations.
|
|
10
|
+
*/
|
|
11
|
+
static compileNodeExpectations(recommendedSteps?: string[], avoidSteps?: string[], successSignal?: string, stopCondition?: string, escalationCondition?: string): CompiledTrajectoryExpectations;
|
|
12
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { createId } from "../utils/ids.js";
|
|
2
|
+
import { CommandNormalizer } from "./command-normalizer.js";
|
|
3
|
+
export class TrajectoryCompiler {
|
|
4
|
+
static cleanStepProse(step) {
|
|
5
|
+
if (!step)
|
|
6
|
+
return "";
|
|
7
|
+
return step
|
|
8
|
+
.replace(/^[\s\-\*\u2022\d\.\)]+/, "")
|
|
9
|
+
.trim();
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Compiles a single step prose into a TrajectoryExpectation structure.
|
|
13
|
+
*/
|
|
14
|
+
static compileStep(stepProse, type) {
|
|
15
|
+
const originalStep = stepProse.trim();
|
|
16
|
+
const cleanStep = this.cleanStepProse(originalStep);
|
|
17
|
+
const id = createId("exp");
|
|
18
|
+
// 1. Check for command features
|
|
19
|
+
// Match package manager followed by run/exec
|
|
20
|
+
const pkgManagerRegex = /\b(pnpm|npm|yarn|bun|npx)\s+(run|exec)\s+([a-zA-Z0-9_\-\.\/]+)/i;
|
|
21
|
+
const pkgManagerMatch = cleanStep.match(pkgManagerRegex);
|
|
22
|
+
let commandMatch = pkgManagerMatch;
|
|
23
|
+
let isPkgManager = false;
|
|
24
|
+
if (pkgManagerMatch) {
|
|
25
|
+
isPkgManager = true;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
// Match common executables (pnpm, npm, git, tsc, vitest, docker, etc.)
|
|
29
|
+
const commandRegex = /\b(pnpm|npm|yarn|bun|npx|git|tsc|vitest|jest|mocha|eslint|prettier|vite|next|docker)\b\s*([a-zA-Z0-9_\-\.\/]+)?/i;
|
|
30
|
+
commandMatch = cleanStep.match(commandRegex);
|
|
31
|
+
}
|
|
32
|
+
if (commandMatch) {
|
|
33
|
+
const exe = commandMatch[1]?.toLowerCase();
|
|
34
|
+
const sub = commandMatch[2]?.toLowerCase() || "";
|
|
35
|
+
const rawExtracted = commandMatch[0];
|
|
36
|
+
const norm = CommandNormalizer.normalizeCommand(rawExtracted);
|
|
37
|
+
const commandFamily = norm.commandFamily || exe;
|
|
38
|
+
const subcommand = norm.subcommand || (sub && !sub.startsWith("-") ? sub : undefined);
|
|
39
|
+
const commandPattern = subcommand
|
|
40
|
+
? `${commandFamily} ${subcommand}`
|
|
41
|
+
: commandFamily;
|
|
42
|
+
return {
|
|
43
|
+
id,
|
|
44
|
+
type,
|
|
45
|
+
actionType: "command",
|
|
46
|
+
toolNamePattern: "run_command|bash|execute_command|terminal|sh",
|
|
47
|
+
commandPattern,
|
|
48
|
+
originalStep,
|
|
49
|
+
ordered: type === "recommend" // Recommended commands are ordered; avoid commands check globally
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
// 2. Check for file / artifact manipulation features
|
|
53
|
+
// Match file extensions or edit verbs + files
|
|
54
|
+
const fileVerbRegex = /\b(edit|modify|write|create|touch|update|delete|remove|read|view|inspect)\s+([a-zA-Z0-9_\-\.\/\\\*]+\.[a-zA-Z0-9]+)/i;
|
|
55
|
+
const fileVerbMatch = cleanStep.match(fileVerbRegex);
|
|
56
|
+
const genericFileRegex = /\b([a-zA-Z0-9_\-\.\/\\\*]+\.([a-zA-Z0-9]+))\b/;
|
|
57
|
+
const genericFileMatch = cleanStep.match(genericFileRegex);
|
|
58
|
+
if (fileVerbMatch) {
|
|
59
|
+
const filePath = fileVerbMatch[2] || "";
|
|
60
|
+
const verb = (fileVerbMatch[1] || "").toLowerCase();
|
|
61
|
+
let artifactAction = "any";
|
|
62
|
+
if (["read", "view", "inspect"].includes(verb)) {
|
|
63
|
+
artifactAction = "read";
|
|
64
|
+
}
|
|
65
|
+
else if (["edit", "modify", "write", "create", "touch", "update", "delete", "remove"].includes(verb)) {
|
|
66
|
+
artifactAction = "write";
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
id,
|
|
70
|
+
type,
|
|
71
|
+
actionType: "artifact",
|
|
72
|
+
artifactPattern: filePath,
|
|
73
|
+
artifactAction,
|
|
74
|
+
originalStep,
|
|
75
|
+
ordered: false // Artifact touches can happen in any order
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
else if (genericFileMatch) {
|
|
79
|
+
const filePath = genericFileMatch[1] || "";
|
|
80
|
+
const ext = genericFileMatch[2] || "";
|
|
81
|
+
// Exclude false positives like common words (e.g. e.g. or i.e.)
|
|
82
|
+
if (ext && !["eg", "ie", "md", "txt"].includes(ext.toLowerCase())) {
|
|
83
|
+
return {
|
|
84
|
+
id,
|
|
85
|
+
type,
|
|
86
|
+
actionType: "artifact",
|
|
87
|
+
artifactPattern: filePath,
|
|
88
|
+
artifactAction: "any",
|
|
89
|
+
originalStep,
|
|
90
|
+
ordered: false
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// 3. Fallback to generic action type
|
|
95
|
+
return {
|
|
96
|
+
id,
|
|
97
|
+
type,
|
|
98
|
+
actionType: "generic",
|
|
99
|
+
originalStep,
|
|
100
|
+
ordered: false
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Compiles recommended_steps, avoid_steps, success_signal, stop_condition, and escalation_condition of an ExperienceNode into CompiledTrajectoryExpectations.
|
|
105
|
+
*/
|
|
106
|
+
static compileNodeExpectations(recommendedSteps, avoidSteps, successSignal, stopCondition, escalationCondition) {
|
|
107
|
+
const orderedExpectations = [];
|
|
108
|
+
const unorderedExpectations = [];
|
|
109
|
+
// Compile recommended steps
|
|
110
|
+
if (recommendedSteps && Array.isArray(recommendedSteps)) {
|
|
111
|
+
for (const step of recommendedSteps) {
|
|
112
|
+
if (!step.trim())
|
|
113
|
+
continue;
|
|
114
|
+
const exp = {
|
|
115
|
+
...this.compileStep(step, "recommend"),
|
|
116
|
+
sourceField: "recommended_steps",
|
|
117
|
+
requiredForAdoption: true
|
|
118
|
+
};
|
|
119
|
+
if (exp.ordered) {
|
|
120
|
+
orderedExpectations.push(exp);
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
unorderedExpectations.push(exp);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Compile avoid steps
|
|
128
|
+
if (avoidSteps && Array.isArray(avoidSteps)) {
|
|
129
|
+
for (const step of avoidSteps) {
|
|
130
|
+
if (!step.trim())
|
|
131
|
+
continue;
|
|
132
|
+
const exp = this.compileStep(step, "avoid");
|
|
133
|
+
// Avoid step expectations are ALWAYS unordered because they trigger non-adoption violations globally
|
|
134
|
+
unorderedExpectations.push({
|
|
135
|
+
...exp,
|
|
136
|
+
ordered: false,
|
|
137
|
+
sourceField: "avoid_steps",
|
|
138
|
+
requiredForAdoption: false
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Compile success_signal
|
|
143
|
+
if (successSignal && successSignal.trim()) {
|
|
144
|
+
const exp = this.compileStep(successSignal, "recommend");
|
|
145
|
+
unorderedExpectations.push({
|
|
146
|
+
...exp,
|
|
147
|
+
id: exp.id.replace("exp_", "success_"),
|
|
148
|
+
ordered: false,
|
|
149
|
+
sourceField: "success_signal",
|
|
150
|
+
requiredForAdoption: false
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
// Compile stop_condition
|
|
154
|
+
if (stopCondition && stopCondition.trim()) {
|
|
155
|
+
const exp = this.compileStep(stopCondition, "avoid");
|
|
156
|
+
unorderedExpectations.push({
|
|
157
|
+
...exp,
|
|
158
|
+
ordered: false,
|
|
159
|
+
sourceField: "stop_condition",
|
|
160
|
+
requiredForAdoption: false
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
// Compile escalation_condition
|
|
164
|
+
if (escalationCondition && escalationCondition.trim()) {
|
|
165
|
+
const exp = this.compileStep(escalationCondition, "avoid");
|
|
166
|
+
unorderedExpectations.push({
|
|
167
|
+
...exp,
|
|
168
|
+
ordered: false,
|
|
169
|
+
sourceField: "escalation_condition",
|
|
170
|
+
requiredForAdoption: false
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
return {
|
|
174
|
+
orderedExpectations,
|
|
175
|
+
unorderedExpectations
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=trajectory-compiler.js.map
|