@alan512/experienceengine 0.3.6 → 0.4.1
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 +15 -4
- package/README.zh-CN.md +15 -4
- package/dist/adapters/antigravity/artifact-analyzer.d.ts +27 -0
- package/dist/adapters/antigravity/artifact-analyzer.js +151 -0
- package/dist/adapters/antigravity/artifact-analyzer.js.map +1 -0
- package/dist/adapters/codex/behavior-loop.d.ts +15 -43
- package/dist/adapters/codex/behavior-loop.js +2 -215
- package/dist/adapters/codex/behavior-loop.js.map +1 -1
- package/dist/adapters/codex/mcp-server.d.ts +37 -44
- package/dist/adapters/codex/mcp-server.js +5 -427
- package/dist/adapters/codex/mcp-server.js.map +1 -1
- package/dist/adapters/shared-mcp/action-registry.d.ts +121 -0
- package/dist/adapters/shared-mcp/action-registry.js +435 -0
- package/dist/adapters/shared-mcp/action-registry.js.map +1 -0
- package/dist/adapters/shared-mcp/behavior-loop.d.ts +91 -0
- package/dist/adapters/shared-mcp/behavior-loop.js +218 -0
- package/dist/adapters/shared-mcp/behavior-loop.js.map +1 -0
- package/dist/adapters/shared-mcp/server.d.ts +113 -0
- package/dist/adapters/shared-mcp/server.js +423 -0
- package/dist/adapters/shared-mcp/server.js.map +1 -0
- package/dist/cli/commands/agy-exec.d.ts +23 -0
- package/dist/cli/commands/agy-exec.js +92 -0
- package/dist/cli/commands/agy-exec.js.map +1 -0
- package/dist/cli/commands/antigravity-hook.d.ts +58 -0
- package/dist/cli/commands/antigravity-hook.js +192 -0
- package/dist/cli/commands/antigravity-hook.js.map +1 -0
- package/dist/cli/commands/antigravity.d.ts +8 -0
- package/dist/cli/commands/antigravity.js +37 -0
- package/dist/cli/commands/antigravity.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +2 -0
- package/dist/cli/commands/doctor.js +160 -3
- 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/install.d.ts +3 -1
- package/dist/cli/commands/install.js +32 -2
- package/dist/cli/commands/install.js.map +1 -1
- package/dist/cli/commands/maintenance.js +80 -2
- package/dist/cli/commands/maintenance.js.map +1 -1
- package/dist/cli/commands/mcp-server.js +10 -2
- package/dist/cli/commands/mcp-server.js.map +1 -1
- package/dist/cli/commands/repair.d.ts +1 -1
- package/dist/cli/commands/repair.js +21 -3
- package/dist/cli/commands/repair.js.map +1 -1
- package/dist/cli/commands/upgrade.d.ts +4 -1
- package/dist/cli/commands/upgrade.js +25 -2
- package/dist/cli/commands/upgrade.js.map +1 -1
- package/dist/cli/dispatch.js +22 -6
- package/dist/cli/dispatch.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/install/antigravity-global-wiring.d.ts +25 -0
- package/dist/install/antigravity-global-wiring.js +165 -0
- package/dist/install/antigravity-global-wiring.js.map +1 -0
- package/dist/install/antigravity-project-wiring.d.ts +24 -0
- package/dist/install/antigravity-project-wiring.js +380 -0
- package/dist/install/antigravity-project-wiring.js.map +1 -0
- package/dist/install/antigravity.d.ts +78 -0
- package/dist/install/antigravity.js +169 -0
- package/dist/install/antigravity.js.map +1 -0
- package/dist/install/host-detection.d.ts +1 -1
- package/dist/install/host-detection.js +2 -1
- package/dist/install/host-detection.js.map +1 -1
- package/dist/install/public-install.d.ts +2 -0
- package/dist/install/public-install.js +8 -0
- package/dist/install/public-install.js.map +1 -1
- package/dist/interaction/operational-actions-service.d.ts +8 -5
- package/dist/interaction/operational-actions-service.js +36 -6
- package/dist/interaction/operational-actions-service.js.map +1 -1
- package/dist/interaction/operational-service.d.ts +3 -1
- package/dist/interaction/operational-service.js +9 -0
- package/dist/interaction/operational-service.js.map +1 -1
- 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 +112 -2
- package/dist/types/plugin.d.ts +1 -0
- package/docs/releases/v0.4.0.md +39 -0
- package/docs/releases/v0.4.1.md +22 -0
- package/docs/user-guide.md +119 -3
- package/openclaw.plugin.json +1 -1
- package/package.json +68 -68
|
@@ -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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trajectory-compiler.js","sourceRoot":"","sources":["../../src/compiler/trajectory-compiler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ToolEvent, NormalizedToolEvent, CompiledTrajectoryExpectations, TrajectoryExpectation, AttributionConfidence } from "../types/domain.js";
|
|
2
|
+
export type TrajectoryMatchResult = {
|
|
3
|
+
verdict: "adoption_detected" | "non_adoption_detected" | "contra_adoption_detected" | "guidance_prevented_failure" | "guidance_caused_failure" | "trajectory_unknown";
|
|
4
|
+
confidence: AttributionConfidence;
|
|
5
|
+
matchedExpectationIds: string[];
|
|
6
|
+
violatedExpectationIds: string[];
|
|
7
|
+
evidenceRefs: string[];
|
|
8
|
+
};
|
|
9
|
+
export declare class TrajectoryMatcher {
|
|
10
|
+
/**
|
|
11
|
+
* Main matching engine comparing compiled expectations against tool event timelines.
|
|
12
|
+
*/
|
|
13
|
+
static match(expectations: CompiledTrajectoryExpectations, events: ToolEvent[], outcome: "success" | "failure" | "unknown"): TrajectoryMatchResult;
|
|
14
|
+
/**
|
|
15
|
+
* Core element comparator for expectations and normalized events.
|
|
16
|
+
*/
|
|
17
|
+
static matches(exp: TrajectoryExpectation, event: NormalizedToolEvent): boolean;
|
|
18
|
+
}
|
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
import { CommandNormalizer } from "./command-normalizer.js";
|
|
2
|
+
export class TrajectoryMatcher {
|
|
3
|
+
/**
|
|
4
|
+
* Main matching engine comparing compiled expectations against tool event timelines.
|
|
5
|
+
*/
|
|
6
|
+
static match(expectations, events, outcome) {
|
|
7
|
+
const totalExpectations = (expectations.orderedExpectations?.length || 0) + (expectations.unorderedExpectations?.length || 0);
|
|
8
|
+
if (totalExpectations === 0) {
|
|
9
|
+
return {
|
|
10
|
+
verdict: "trajectory_unknown",
|
|
11
|
+
confidence: "low",
|
|
12
|
+
matchedExpectationIds: [],
|
|
13
|
+
violatedExpectationIds: [],
|
|
14
|
+
evidenceRefs: []
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
// Check for insufficient tool events / unsupported tool formats
|
|
18
|
+
const isSupportedTool = (toolName) => {
|
|
19
|
+
const isCmd = /^(run_command|bash|execute_command|terminal|sh)$/i.test(toolName);
|
|
20
|
+
const isArtifact = /^(write_to_file|replace_file_content|multi_replace_file_content|view_file|read_file|write_file|apply_patch)$/i.test(toolName);
|
|
21
|
+
return isCmd || isArtifact;
|
|
22
|
+
};
|
|
23
|
+
const hasAnySupportedTool = events && events.some(e => isSupportedTool(e.tool_name));
|
|
24
|
+
if (!events || events.length === 0 || !hasAnySupportedTool) {
|
|
25
|
+
return {
|
|
26
|
+
verdict: "trajectory_unknown",
|
|
27
|
+
confidence: "low",
|
|
28
|
+
matchedExpectationIds: [],
|
|
29
|
+
violatedExpectationIds: [],
|
|
30
|
+
evidenceRefs: []
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
const normalizedEvents = events.map(e => CommandNormalizer.normalizeToolEvent(e));
|
|
34
|
+
const matchedExpectationIds = [];
|
|
35
|
+
const violatedExpectationIds = [];
|
|
36
|
+
// De-duplicate evidence refs (ToolEvent.event_id)
|
|
37
|
+
const evidenceRefsSet = new Set();
|
|
38
|
+
// Exclude success_signal (via e.requiredForAdoption !== false) from standard command recommendations to prevent non_adoption false alarms
|
|
39
|
+
const recommendIds = new Set([
|
|
40
|
+
...expectations.orderedExpectations.map(e => e.id),
|
|
41
|
+
...expectations.unorderedExpectations.filter(e => e.type === "recommend" && e.requiredForAdoption !== false).map(e => e.id)
|
|
42
|
+
]);
|
|
43
|
+
const avoidIds = new Set(expectations.unorderedExpectations.filter(e => e.type === "avoid").map(e => e.id));
|
|
44
|
+
// Helper to scan for matched event from a start index
|
|
45
|
+
const findEventIndex = (exp, fromIndex) => {
|
|
46
|
+
for (let i = fromIndex; i < normalizedEvents.length; i++) {
|
|
47
|
+
const ev = normalizedEvents[i];
|
|
48
|
+
if (!ev)
|
|
49
|
+
continue;
|
|
50
|
+
// Positive expectations should not be fail events
|
|
51
|
+
if (ev.status === "failure")
|
|
52
|
+
continue;
|
|
53
|
+
if (this.matches(exp, ev)) {
|
|
54
|
+
return i;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return -1;
|
|
58
|
+
};
|
|
59
|
+
// 1. Greedy Sequence Alignment for orderedExpectations (Recommended commands)
|
|
60
|
+
let currentPointer = 0;
|
|
61
|
+
for (const exp of expectations.orderedExpectations) {
|
|
62
|
+
const idx = findEventIndex(exp, currentPointer);
|
|
63
|
+
if (idx !== -1) {
|
|
64
|
+
matchedExpectationIds.push(exp.id);
|
|
65
|
+
const originalEvent = events[idx];
|
|
66
|
+
if (originalEvent?.event_id) {
|
|
67
|
+
evidenceRefsSet.add(originalEvent.event_id);
|
|
68
|
+
}
|
|
69
|
+
currentPointer = idx + 1; // Move cursor beyond this matched event
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
violatedExpectationIds.push(exp.id);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// 2. Global Unordered Expectations Analysis
|
|
76
|
+
for (const exp of expectations.unorderedExpectations) {
|
|
77
|
+
if (exp.type === "recommend") {
|
|
78
|
+
// Global search anywhere in the timeline
|
|
79
|
+
let foundIdx = -1;
|
|
80
|
+
for (let i = 0; i < normalizedEvents.length; i++) {
|
|
81
|
+
const ev = normalizedEvents[i];
|
|
82
|
+
if (ev && ev.status !== "failure" && this.matches(exp, ev)) {
|
|
83
|
+
foundIdx = i;
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (foundIdx !== -1) {
|
|
88
|
+
matchedExpectationIds.push(exp.id);
|
|
89
|
+
const originalEvent = events[foundIdx];
|
|
90
|
+
if (originalEvent?.event_id) {
|
|
91
|
+
evidenceRefsSet.add(originalEvent.event_id);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
violatedExpectationIds.push(exp.id);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else if (exp.type === "avoid") {
|
|
99
|
+
// Violations can happen anywhere in the timeline, regardless of success/failure
|
|
100
|
+
const violatingIndices = [];
|
|
101
|
+
for (let i = 0; i < normalizedEvents.length; i++) {
|
|
102
|
+
const ev = normalizedEvents[i];
|
|
103
|
+
if (ev && this.matches(exp, ev)) {
|
|
104
|
+
violatingIndices.push(i);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (violatingIndices.length > 0) {
|
|
108
|
+
// If triggered, it is a VIOLATION
|
|
109
|
+
violatedExpectationIds.push(exp.id);
|
|
110
|
+
for (const idx of violatingIndices) {
|
|
111
|
+
const originalEvent = events[idx];
|
|
112
|
+
if (originalEvent?.event_id) {
|
|
113
|
+
evidenceRefsSet.add(originalEvent.event_id);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// 3. Causal Trajectory Verdict Decision Flow
|
|
120
|
+
const violatedRecommendCount = violatedExpectationIds.filter(id => recommendIds.has(id)).length;
|
|
121
|
+
const violatedAvoidCount = violatedExpectationIds.filter(id => avoidIds.has(id)).length;
|
|
122
|
+
const matchedRecommendCount = matchedExpectationIds.filter(id => recommendIds.has(id)).length;
|
|
123
|
+
const totalRecommendCount = recommendIds.size;
|
|
124
|
+
let verdict = "non_adoption_detected";
|
|
125
|
+
let confidence = "low";
|
|
126
|
+
const hasViolatedAvoid = violatedAvoidCount > 0;
|
|
127
|
+
const hasRecommends = totalRecommendCount > 0;
|
|
128
|
+
const hasAvoids = avoidIds.size > 0;
|
|
129
|
+
const successExpectations = expectations.unorderedExpectations.filter(e => e.sourceField === "success_signal");
|
|
130
|
+
const hasSuccessSignal = successExpectations.length > 0;
|
|
131
|
+
const allSuccessSignalsMet = hasSuccessSignal && successExpectations.every(e => matchedExpectationIds.includes(e.id));
|
|
132
|
+
let isAdopted = false;
|
|
133
|
+
if (hasRecommends) {
|
|
134
|
+
isAdopted = (violatedRecommendCount === 0);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
if (hasAvoids) {
|
|
138
|
+
isAdopted = true;
|
|
139
|
+
}
|
|
140
|
+
else if (hasSuccessSignal) {
|
|
141
|
+
isAdopted = allSuccessSignalsMet;
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
isAdopted = true;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// OpenSpec P1: Avoid step violation defaults to non_adoption/contra_adoption,
|
|
148
|
+
// and CANNOT be assumed causal_harm unless a direct failed event or failure signature is correlated.
|
|
149
|
+
const isCausalHarmConfirmed = () => {
|
|
150
|
+
if (outcome !== "failure")
|
|
151
|
+
return false;
|
|
152
|
+
for (const expId of violatedExpectationIds) {
|
|
153
|
+
if (!avoidIds.has(expId))
|
|
154
|
+
continue;
|
|
155
|
+
const exp = expectations.unorderedExpectations.find(e => e.id === expId);
|
|
156
|
+
if (!exp)
|
|
157
|
+
continue;
|
|
158
|
+
// 1. If any avoid-expectation itself failed
|
|
159
|
+
for (const ev of normalizedEvents) {
|
|
160
|
+
if (ev.status === "failure" && this.matches(exp, ev)) {
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// 2. If a failed command in the timeline contains the avoided action's keywords
|
|
165
|
+
if (exp.actionType === "command" && exp.commandPattern) {
|
|
166
|
+
const cleanPattern = exp.commandPattern.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
167
|
+
for (const ev of normalizedEvents) {
|
|
168
|
+
if (ev.status === "failure" && ev.normalizedInput) {
|
|
169
|
+
const cleanInput = ev.normalizedInput.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
170
|
+
if (cleanInput.includes(cleanPattern)) {
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return false;
|
|
178
|
+
};
|
|
179
|
+
if (hasViolatedAvoid) {
|
|
180
|
+
if (isCausalHarmConfirmed()) {
|
|
181
|
+
verdict = "guidance_caused_failure";
|
|
182
|
+
confidence = "high";
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
verdict = "contra_adoption_detected";
|
|
186
|
+
confidence = "medium";
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
if (isAdopted) {
|
|
191
|
+
if (outcome === "success") {
|
|
192
|
+
// If we have an explicit success_signal defined, we MUST have successfully matched it
|
|
193
|
+
// in order to upgrade the verdict to guidance_prevented_failure.
|
|
194
|
+
// Otherwise, a standard adopt + success outcome is simply adoption_detected.
|
|
195
|
+
if (hasSuccessSignal) {
|
|
196
|
+
if (allSuccessSignalsMet) {
|
|
197
|
+
verdict = "guidance_prevented_failure";
|
|
198
|
+
confidence = "high";
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
// Recommended steps were met and task succeeded, but success_signal expectation failed to match
|
|
202
|
+
verdict = "adoption_detected";
|
|
203
|
+
confidence = "medium";
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
// No success_signal defined, so recommended steps were adopted.
|
|
208
|
+
// We cannot claim guidance_prevented_failure (no prevented-failure evidence chain).
|
|
209
|
+
verdict = "adoption_detected";
|
|
210
|
+
confidence = "medium";
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
verdict = "adoption_detected";
|
|
215
|
+
confidence = "medium";
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
verdict = "non_adoption_detected";
|
|
220
|
+
if (matchedRecommendCount > 0) {
|
|
221
|
+
confidence = "medium";
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
confidence = "low";
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return {
|
|
229
|
+
verdict,
|
|
230
|
+
confidence,
|
|
231
|
+
matchedExpectationIds,
|
|
232
|
+
violatedExpectationIds,
|
|
233
|
+
evidenceRefs: Array.from(evidenceRefsSet)
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Core element comparator for expectations and normalized events.
|
|
238
|
+
*/
|
|
239
|
+
static matches(exp, event) {
|
|
240
|
+
// 1. ToolNamePattern match (if present)
|
|
241
|
+
if (exp.toolNamePattern) {
|
|
242
|
+
const regex = new RegExp(`^(?:${exp.toolNamePattern})$`, "i");
|
|
243
|
+
if (!regex.test(event.toolName)) {
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
// 2. Command action alignment
|
|
248
|
+
if (exp.actionType === "command" && exp.commandPattern) {
|
|
249
|
+
const isCmdTool = event.toolName === "run_command" ||
|
|
250
|
+
["bash", "execute_command", "terminal", "sh"].includes(event.toolName.toLowerCase());
|
|
251
|
+
if (isCmdTool) {
|
|
252
|
+
const expCmd = CommandNormalizer.normalizeCommand(exp.commandPattern);
|
|
253
|
+
if (expCmd.commandFamily && event.commandFamily) {
|
|
254
|
+
if (expCmd.commandFamily.toLowerCase() === event.commandFamily.toLowerCase()) {
|
|
255
|
+
if (expCmd.subcommand) {
|
|
256
|
+
if (expCmd.subcommand.toLowerCase() === (event.subcommand || "").toLowerCase()) {
|
|
257
|
+
return true;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
// No subcommand required in expectation
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
// Substring fallback for robust matching (scrubbing spaces & underscores)
|
|
267
|
+
const cleanExp = exp.commandPattern.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
268
|
+
const cleanInput = (event.normalizedInput || "").toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
269
|
+
if (cleanInput.includes(cleanExp) || cleanExp.includes(cleanInput)) {
|
|
270
|
+
return true;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return false;
|
|
274
|
+
}
|
|
275
|
+
// 3. Artifact action alignment
|
|
276
|
+
if (exp.actionType === "artifact" && exp.artifactPattern) {
|
|
277
|
+
const expPatternClean = exp.artifactPattern.toLowerCase().trim();
|
|
278
|
+
const cleanPath = (p) => {
|
|
279
|
+
let clean = p.replace(/\\/g, "/").trim();
|
|
280
|
+
while (clean.startsWith("./") || clean.startsWith("/")) {
|
|
281
|
+
if (clean.startsWith("./")) {
|
|
282
|
+
clean = clean.slice(2);
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
clean = clean.slice(1);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return clean;
|
|
289
|
+
};
|
|
290
|
+
const expPathClean = cleanPath(expPatternClean);
|
|
291
|
+
const hasDirectory = expPathClean.includes("/");
|
|
292
|
+
// Path-boundary-aware suffix check: ensures the expectation aligns at
|
|
293
|
+
// the start of the event path or after a "/" separator, preventing
|
|
294
|
+
// false positives like "mylib/utils.ts" matching expectation "lib/utils.ts".
|
|
295
|
+
const isPathSuffix = (eventPath, suffix) => {
|
|
296
|
+
return eventPath === suffix || eventPath.endsWith("/" + suffix);
|
|
297
|
+
};
|
|
298
|
+
let matchesPattern = false;
|
|
299
|
+
// If expectation is purely an extension filter (e.g. ts, js, py, *.ts, .ts)
|
|
300
|
+
const cleanPattern = expPathClean.startsWith("*.")
|
|
301
|
+
? expPathClean.slice(2)
|
|
302
|
+
: expPathClean.startsWith(".")
|
|
303
|
+
? expPathClean.slice(1)
|
|
304
|
+
: expPathClean;
|
|
305
|
+
const isExtensionOnly = !cleanPattern.includes("/") &&
|
|
306
|
+
!cleanPattern.includes("\\") &&
|
|
307
|
+
!cleanPattern.includes(".");
|
|
308
|
+
// Build the list of candidate paths from the event
|
|
309
|
+
const candidates = [];
|
|
310
|
+
if (event.artifactPaths && event.artifactPaths.length > 0) {
|
|
311
|
+
for (const p of event.artifactPaths) {
|
|
312
|
+
const cp = cleanPath(p).toLowerCase();
|
|
313
|
+
candidates.push({
|
|
314
|
+
path: cp,
|
|
315
|
+
name: CommandNormalizer.getBasename(cp) || undefined,
|
|
316
|
+
extension: CommandNormalizer.getExtension(cp) || undefined
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
const cp = cleanPath(event.artifactPath || event.normalizedInput || "").toLowerCase();
|
|
322
|
+
candidates.push({
|
|
323
|
+
path: cp,
|
|
324
|
+
name: event.artifactName ? event.artifactName.toLowerCase() : (CommandNormalizer.getBasename(cp) || undefined),
|
|
325
|
+
extension: event.artifactExtension ? event.artifactExtension.toLowerCase() : (CommandNormalizer.getExtension(cp) || undefined)
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
if (hasDirectory) {
|
|
329
|
+
for (const cand of candidates) {
|
|
330
|
+
if (isPathSuffix(cand.path, expPathClean)) {
|
|
331
|
+
matchesPattern = true;
|
|
332
|
+
break;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
if (isExtensionOnly) {
|
|
338
|
+
for (const cand of candidates) {
|
|
339
|
+
if (cand.extension === cleanPattern) {
|
|
340
|
+
matchesPattern = true;
|
|
341
|
+
break;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
if (!matchesPattern) {
|
|
346
|
+
const expBasename = CommandNormalizer.getBasename(expPathClean);
|
|
347
|
+
for (const cand of candidates) {
|
|
348
|
+
if (cand.name === expBasename) {
|
|
349
|
+
matchesPattern = true;
|
|
350
|
+
break;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
// Input fallback
|
|
356
|
+
if (!matchesPattern && event.normalizedInput) {
|
|
357
|
+
const cleanInput = cleanPath(event.normalizedInput.toLowerCase());
|
|
358
|
+
if (hasDirectory) {
|
|
359
|
+
if (isPathSuffix(cleanInput, expPathClean)) {
|
|
360
|
+
matchesPattern = true;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
else {
|
|
364
|
+
if (cleanInput.includes(expPathClean)) {
|
|
365
|
+
matchesPattern = true;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
if (!matchesPattern) {
|
|
370
|
+
return false;
|
|
371
|
+
}
|
|
372
|
+
// Pattern matched! Now check the read/write action alignment if defined
|
|
373
|
+
const expAction = exp.artifactAction || "any";
|
|
374
|
+
if (expAction === "any") {
|
|
375
|
+
return true;
|
|
376
|
+
}
|
|
377
|
+
const isReadTool = /^(read_file|view_file)$/i.test(event.toolName);
|
|
378
|
+
const isWriteTool = /^(write_to_file|replace_file_content|multi_replace_file_content|write_file|apply_patch)$/i.test(event.toolName);
|
|
379
|
+
if (expAction === "read") {
|
|
380
|
+
return isReadTool;
|
|
381
|
+
}
|
|
382
|
+
if (expAction === "write") {
|
|
383
|
+
return isWriteTool;
|
|
384
|
+
}
|
|
385
|
+
return true;
|
|
386
|
+
}
|
|
387
|
+
// 4. Generic prose element fuzzy matcher
|
|
388
|
+
if (exp.actionType === "generic") {
|
|
389
|
+
const cleanOriginal = exp.originalStep.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
390
|
+
if (!cleanOriginal)
|
|
391
|
+
return false;
|
|
392
|
+
const cleanInput = (event.normalizedInput || "").toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
393
|
+
const cleanOutput = (event.normalizedOutput || "").toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
394
|
+
if (cleanInput.includes(cleanOriginal) || cleanOriginal.includes(cleanInput) ||
|
|
395
|
+
cleanOutput.includes(cleanOriginal) || cleanOriginal.includes(cleanOutput)) {
|
|
396
|
+
return true;
|
|
397
|
+
}
|
|
398
|
+
// Stopwords for prose keywords filtering
|
|
399
|
+
const stopwords = new Set([
|
|
400
|
+
"the", "and", "for", "with", "this", "that", "you", "your", "not", "dont",
|
|
401
|
+
"run", "do", "execute", "should", "must", "avoid", "make", "sure", "please"
|
|
402
|
+
]);
|
|
403
|
+
const expWords = exp.originalStep.toLowerCase()
|
|
404
|
+
.split(/[^a-z0-9]+/)
|
|
405
|
+
.filter(w => w.length > 3 && !stopwords.has(w));
|
|
406
|
+
if (expWords.length > 0) {
|
|
407
|
+
const inputLower = (event.normalizedInput || "").toLowerCase();
|
|
408
|
+
const outputLower = (event.normalizedOutput || "").toLowerCase();
|
|
409
|
+
const matchCount = expWords.filter(w => inputLower.includes(w) || outputLower.includes(w)).length;
|
|
410
|
+
// Matches if 50%+ of prose keywords or at least 2 distinct keywords overlap
|
|
411
|
+
if (matchCount >= Math.min(2, expWords.length)) {
|
|
412
|
+
return true;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
return false;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
//# sourceMappingURL=trajectory-matcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trajectory-matcher.js","sourceRoot":"","sources":["../../src/compiler/trajectory-matcher.ts"],"names":[],"mappings":"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"}
|