@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.
Files changed (137) hide show
  1. package/README.md +15 -4
  2. package/README.zh-CN.md +15 -4
  3. package/dist/adapters/antigravity/artifact-analyzer.d.ts +27 -0
  4. package/dist/adapters/antigravity/artifact-analyzer.js +151 -0
  5. package/dist/adapters/antigravity/artifact-analyzer.js.map +1 -0
  6. package/dist/adapters/codex/behavior-loop.d.ts +15 -43
  7. package/dist/adapters/codex/behavior-loop.js +2 -215
  8. package/dist/adapters/codex/behavior-loop.js.map +1 -1
  9. package/dist/adapters/codex/mcp-server.d.ts +37 -44
  10. package/dist/adapters/codex/mcp-server.js +5 -427
  11. package/dist/adapters/codex/mcp-server.js.map +1 -1
  12. package/dist/adapters/shared-mcp/action-registry.d.ts +121 -0
  13. package/dist/adapters/shared-mcp/action-registry.js +435 -0
  14. package/dist/adapters/shared-mcp/action-registry.js.map +1 -0
  15. package/dist/adapters/shared-mcp/behavior-loop.d.ts +91 -0
  16. package/dist/adapters/shared-mcp/behavior-loop.js +218 -0
  17. package/dist/adapters/shared-mcp/behavior-loop.js.map +1 -0
  18. package/dist/adapters/shared-mcp/server.d.ts +113 -0
  19. package/dist/adapters/shared-mcp/server.js +423 -0
  20. package/dist/adapters/shared-mcp/server.js.map +1 -0
  21. package/dist/cli/commands/agy-exec.d.ts +23 -0
  22. package/dist/cli/commands/agy-exec.js +92 -0
  23. package/dist/cli/commands/agy-exec.js.map +1 -0
  24. package/dist/cli/commands/antigravity-hook.d.ts +58 -0
  25. package/dist/cli/commands/antigravity-hook.js +192 -0
  26. package/dist/cli/commands/antigravity-hook.js.map +1 -0
  27. package/dist/cli/commands/antigravity.d.ts +8 -0
  28. package/dist/cli/commands/antigravity.js +37 -0
  29. package/dist/cli/commands/antigravity.js.map +1 -0
  30. package/dist/cli/commands/doctor.d.ts +2 -0
  31. package/dist/cli/commands/doctor.js +160 -3
  32. package/dist/cli/commands/doctor.js.map +1 -1
  33. package/dist/cli/commands/inspect.js +78 -1
  34. package/dist/cli/commands/inspect.js.map +1 -1
  35. package/dist/cli/commands/install.d.ts +3 -1
  36. package/dist/cli/commands/install.js +32 -2
  37. package/dist/cli/commands/install.js.map +1 -1
  38. package/dist/cli/commands/maintenance.js +80 -2
  39. package/dist/cli/commands/maintenance.js.map +1 -1
  40. package/dist/cli/commands/mcp-server.js +10 -2
  41. package/dist/cli/commands/mcp-server.js.map +1 -1
  42. package/dist/cli/commands/repair.d.ts +1 -1
  43. package/dist/cli/commands/repair.js +21 -3
  44. package/dist/cli/commands/repair.js.map +1 -1
  45. package/dist/cli/commands/upgrade.d.ts +4 -1
  46. package/dist/cli/commands/upgrade.js +25 -2
  47. package/dist/cli/commands/upgrade.js.map +1 -1
  48. package/dist/cli/dispatch.js +22 -6
  49. package/dist/cli/dispatch.js.map +1 -1
  50. package/dist/compiler/command-normalizer.d.ts +27 -0
  51. package/dist/compiler/command-normalizer.js +263 -0
  52. package/dist/compiler/command-normalizer.js.map +1 -0
  53. package/dist/compiler/trajectory-compiler.d.ts +12 -0
  54. package/dist/compiler/trajectory-compiler.js +179 -0
  55. package/dist/compiler/trajectory-compiler.js.map +1 -0
  56. package/dist/compiler/trajectory-matcher.d.ts +18 -0
  57. package/dist/compiler/trajectory-matcher.js +419 -0
  58. package/dist/compiler/trajectory-matcher.js.map +1 -0
  59. package/dist/config/config-schema.d.ts +11 -0
  60. package/dist/config/config-schema.js +9 -0
  61. package/dist/config/config-schema.js.map +1 -1
  62. package/dist/config/default-config.js +1 -0
  63. package/dist/config/default-config.js.map +1 -1
  64. package/dist/controller/candidate-retriever.d.ts +3 -1
  65. package/dist/controller/candidate-retriever.js +247 -7
  66. package/dist/controller/candidate-retriever.js.map +1 -1
  67. package/dist/controller/intervention-controller.js +48 -21
  68. package/dist/controller/intervention-controller.js.map +1 -1
  69. package/dist/controller/trigger-evaluator.d.ts +2 -1
  70. package/dist/controller/trigger-evaluator.js +10 -4
  71. package/dist/controller/trigger-evaluator.js.map +1 -1
  72. package/dist/experience-management/node-lifecycle-governance.js +25 -6
  73. package/dist/experience-management/node-lifecycle-governance.js.map +1 -1
  74. package/dist/input/fingerprint-extractor.d.ts +53 -0
  75. package/dist/input/fingerprint-extractor.js +620 -0
  76. package/dist/input/fingerprint-extractor.js.map +1 -0
  77. package/dist/install/antigravity-global-wiring.d.ts +25 -0
  78. package/dist/install/antigravity-global-wiring.js +165 -0
  79. package/dist/install/antigravity-global-wiring.js.map +1 -0
  80. package/dist/install/antigravity-project-wiring.d.ts +24 -0
  81. package/dist/install/antigravity-project-wiring.js +380 -0
  82. package/dist/install/antigravity-project-wiring.js.map +1 -0
  83. package/dist/install/antigravity.d.ts +78 -0
  84. package/dist/install/antigravity.js +169 -0
  85. package/dist/install/antigravity.js.map +1 -0
  86. package/dist/install/host-detection.d.ts +1 -1
  87. package/dist/install/host-detection.js +2 -1
  88. package/dist/install/host-detection.js.map +1 -1
  89. package/dist/install/public-install.d.ts +2 -0
  90. package/dist/install/public-install.js +8 -0
  91. package/dist/install/public-install.js.map +1 -1
  92. package/dist/interaction/operational-actions-service.d.ts +8 -5
  93. package/dist/interaction/operational-actions-service.js +36 -6
  94. package/dist/interaction/operational-actions-service.js.map +1 -1
  95. package/dist/interaction/operational-service.d.ts +3 -1
  96. package/dist/interaction/operational-service.js +9 -0
  97. package/dist/interaction/operational-service.js.map +1 -1
  98. package/dist/interaction/service.d.ts +11 -1
  99. package/dist/interaction/service.js +11 -1
  100. package/dist/interaction/service.js.map +1 -1
  101. package/dist/maintenance/vector-migrator.d.ts +37 -0
  102. package/dist/maintenance/vector-migrator.js +170 -0
  103. package/dist/maintenance/vector-migrator.js.map +1 -0
  104. package/dist/plugin/openclaw-plugin.d.ts +8 -0
  105. package/dist/runtime/prompt-service.js +10 -0
  106. package/dist/runtime/prompt-service.js.map +1 -1
  107. package/dist/runtime/service.d.ts +2 -0
  108. package/dist/runtime/service.js +127 -2
  109. package/dist/runtime/service.js.map +1 -1
  110. package/dist/store/sqlite/db.js +18 -1
  111. package/dist/store/sqlite/db.js.map +1 -1
  112. package/dist/store/sqlite/repositories/attribution-record-repo.js +12 -0
  113. package/dist/store/sqlite/repositories/attribution-record-repo.js.map +1 -1
  114. package/dist/store/sqlite/repositories/node-repo.d.ts +1 -0
  115. package/dist/store/sqlite/repositories/node-repo.js +47 -2
  116. package/dist/store/sqlite/repositories/node-repo.js.map +1 -1
  117. package/dist/store/sqlite/repositories/scope-fingerprint-repo.d.ts +8 -0
  118. package/dist/store/sqlite/repositories/scope-fingerprint-repo.js +23 -0
  119. package/dist/store/sqlite/repositories/scope-fingerprint-repo.js.map +1 -0
  120. package/dist/store/sqlite/schema.sql +26 -0
  121. package/dist/store/vector/embeddings.d.ts +4 -2
  122. package/dist/store/vector/embeddings.js +19 -6
  123. package/dist/store/vector/embeddings.js.map +1 -1
  124. package/dist/store/vector/local-provider.d.ts +1 -1
  125. package/dist/store/vector/local-provider.js +40 -8
  126. package/dist/store/vector/local-provider.js.map +1 -1
  127. package/dist/store/vector/offline-manifest.d.ts +7 -0
  128. package/dist/store/vector/offline-manifest.js +162 -0
  129. package/dist/store/vector/offline-manifest.js.map +1 -0
  130. package/dist/store/vector/provider-types.d.ts +1 -0
  131. package/dist/types/domain.d.ts +112 -2
  132. package/dist/types/plugin.d.ts +1 -0
  133. package/docs/releases/v0.4.0.md +39 -0
  134. package/docs/releases/v0.4.1.md +22 -0
  135. package/docs/user-guide.md +119 -3
  136. package/openclaw.plugin.json +1 -1
  137. 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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"}