@red-codes/agentguard 1.0.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/LICENSE +190 -0
- package/README.md +298 -0
- package/dist/adapters/claude-code.d.ts +24 -0
- package/dist/adapters/claude-code.d.ts.map +1 -0
- package/dist/adapters/claude-code.js +99 -0
- package/dist/adapters/claude-code.js.map +1 -0
- package/dist/adapters/file.d.ts +3 -0
- package/dist/adapters/file.d.ts.map +1 -0
- package/dist/adapters/file.js +35 -0
- package/dist/adapters/file.js.map +1 -0
- package/dist/adapters/git.d.ts +3 -0
- package/dist/adapters/git.d.ts.map +1 -0
- package/dist/adapters/git.js +61 -0
- package/dist/adapters/git.js.map +1 -0
- package/dist/adapters/registry.d.ts +5 -0
- package/dist/adapters/registry.d.ts.map +1 -0
- package/dist/adapters/registry.js +15 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/adapters/shell.d.ts +8 -0
- package/dist/adapters/shell.d.ts.map +1 -0
- package/dist/adapters/shell.js +27 -0
- package/dist/adapters/shell.js.map +1 -0
- package/dist/cli/args.d.ts +25 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +63 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/bin.d.ts +3 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +5769 -0
- package/dist/cli/bin.js.map +7 -0
- package/dist/cli/colors.d.ts +11 -0
- package/dist/cli/colors.d.ts.map +1 -0
- package/dist/cli/colors.js +44 -0
- package/dist/cli/colors.js.map +1 -0
- package/dist/cli/commands/claude-hook.d.ts +2 -0
- package/dist/cli/commands/claude-hook.d.ts.map +1 -0
- package/dist/cli/commands/claude-hook.js +110 -0
- package/dist/cli/commands/claude-hook.js.map +1 -0
- package/dist/cli/commands/claude-init.d.ts +2 -0
- package/dist/cli/commands/claude-init.d.ts.map +1 -0
- package/dist/cli/commands/claude-init.js +150 -0
- package/dist/cli/commands/claude-init.js.map +1 -0
- package/dist/cli/commands/export.d.ts +11 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +113 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/guard.d.ts +12 -0
- package/dist/cli/commands/guard.d.ts.map +1 -0
- package/dist/cli/commands/guard.js +145 -0
- package/dist/cli/commands/guard.js.map +1 -0
- package/dist/cli/commands/import.d.ts +2 -0
- package/dist/cli/commands/import.d.ts.map +1 -0
- package/dist/cli/commands/import.js +115 -0
- package/dist/cli/commands/import.js.map +1 -0
- package/dist/cli/commands/inspect.d.ts +3 -0
- package/dist/cli/commands/inspect.d.ts.map +1 -0
- package/dist/cli/commands/inspect.js +185 -0
- package/dist/cli/commands/inspect.js.map +1 -0
- package/dist/cli/commands/plugin.d.ts +7 -0
- package/dist/cli/commands/plugin.d.ts.map +1 -0
- package/dist/cli/commands/plugin.js +234 -0
- package/dist/cli/commands/plugin.js.map +1 -0
- package/dist/cli/commands/replay.d.ts +12 -0
- package/dist/cli/commands/replay.d.ts.map +1 -0
- package/dist/cli/commands/replay.js +208 -0
- package/dist/cli/commands/replay.js.map +1 -0
- package/dist/cli/file-event-store.d.ts +41 -0
- package/dist/cli/file-event-store.d.ts.map +1 -0
- package/dist/cli/file-event-store.js +219 -0
- package/dist/cli/file-event-store.js.map +1 -0
- package/dist/cli/policy-resolver.d.ts +4 -0
- package/dist/cli/policy-resolver.d.ts.map +1 -0
- package/dist/cli/policy-resolver.js +62 -0
- package/dist/cli/policy-resolver.js.map +1 -0
- package/dist/cli/recorder.d.ts +36 -0
- package/dist/cli/recorder.d.ts.map +1 -0
- package/dist/cli/recorder.js +85 -0
- package/dist/cli/recorder.js.map +1 -0
- package/dist/cli/replay.d.ts +2 -0
- package/dist/cli/replay.d.ts.map +1 -0
- package/dist/cli/replay.js +310 -0
- package/dist/cli/replay.js.map +1 -0
- package/dist/cli/session-store.d.ts +41 -0
- package/dist/cli/session-store.d.ts.map +1 -0
- package/dist/cli/session-store.js +95 -0
- package/dist/cli/session-store.js.map +1 -0
- package/dist/cli/tui.d.ts +24 -0
- package/dist/cli/tui.d.ts.map +1 -0
- package/dist/cli/tui.js +197 -0
- package/dist/cli/tui.js.map +1 -0
- package/dist/core/actions.d.ts +11 -0
- package/dist/core/actions.d.ts.map +1 -0
- package/dist/core/actions.js +112 -0
- package/dist/core/actions.js.map +1 -0
- package/dist/core/adapters.d.ts +19 -0
- package/dist/core/adapters.d.ts.map +1 -0
- package/dist/core/adapters.js +85 -0
- package/dist/core/adapters.js.map +1 -0
- package/dist/core/execution-log/bridge.d.ts +12 -0
- package/dist/core/execution-log/bridge.d.ts.map +1 -0
- package/dist/core/execution-log/bridge.js +112 -0
- package/dist/core/execution-log/bridge.js.map +1 -0
- package/dist/core/execution-log/event-log.d.ts +7 -0
- package/dist/core/execution-log/event-log.d.ts.map +1 -0
- package/dist/core/execution-log/event-log.js +103 -0
- package/dist/core/execution-log/event-log.js.map +1 -0
- package/dist/core/execution-log/event-projections.d.ts +28 -0
- package/dist/core/execution-log/event-projections.d.ts.map +1 -0
- package/dist/core/execution-log/event-projections.js +272 -0
- package/dist/core/execution-log/event-projections.js.map +1 -0
- package/dist/core/execution-log/event-schema.d.ts +56 -0
- package/dist/core/execution-log/event-schema.d.ts.map +1 -0
- package/dist/core/execution-log/event-schema.js +160 -0
- package/dist/core/execution-log/event-schema.js.map +1 -0
- package/dist/core/execution-log/index.d.ts +7 -0
- package/dist/core/execution-log/index.d.ts.map +1 -0
- package/dist/core/execution-log/index.js +13 -0
- package/dist/core/execution-log/index.js.map +1 -0
- package/dist/core/hash.d.ts +5 -0
- package/dist/core/hash.d.ts.map +1 -0
- package/dist/core/hash.js +13 -0
- package/dist/core/hash.js.map +1 -0
- package/dist/core/rng.d.ts +29 -0
- package/dist/core/rng.d.ts.map +1 -0
- package/dist/core/rng.js +48 -0
- package/dist/core/rng.js.map +1 -0
- package/dist/core/types.d.ts +746 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +8 -0
- package/dist/core/types.js.map +1 -0
- package/dist/events/bus.d.ts +24 -0
- package/dist/events/bus.d.ts.map +1 -0
- package/dist/events/bus.js +64 -0
- package/dist/events/bus.js.map +1 -0
- package/dist/events/decision-jsonl.d.ts +8 -0
- package/dist/events/decision-jsonl.d.ts.map +1 -0
- package/dist/events/decision-jsonl.js +44 -0
- package/dist/events/decision-jsonl.js.map +1 -0
- package/dist/events/jsonl.d.ts +8 -0
- package/dist/events/jsonl.d.ts.map +1 -0
- package/dist/events/jsonl.js +46 -0
- package/dist/events/jsonl.js.map +1 -0
- package/dist/events/schema.d.ts +59 -0
- package/dist/events/schema.d.ts.map +1 -0
- package/dist/events/schema.js +296 -0
- package/dist/events/schema.js.map +1 -0
- package/dist/events/store.d.ts +7 -0
- package/dist/events/store.d.ts.map +1 -0
- package/dist/events/store.js +64 -0
- package/dist/events/store.js.map +1 -0
- package/dist/invariants/checker.d.ts +15 -0
- package/dist/invariants/checker.d.ts.map +1 -0
- package/dist/invariants/checker.js +52 -0
- package/dist/invariants/checker.js.map +1 -0
- package/dist/invariants/definitions.d.ts +33 -0
- package/dist/invariants/definitions.d.ts.map +1 -0
- package/dist/invariants/definitions.js +168 -0
- package/dist/invariants/definitions.js.map +1 -0
- package/dist/kernel/aab.d.ts +26 -0
- package/dist/kernel/aab.d.ts.map +1 -0
- package/dist/kernel/aab.js +149 -0
- package/dist/kernel/aab.js.map +1 -0
- package/dist/kernel/blast-radius.d.ts +60 -0
- package/dist/kernel/blast-radius.d.ts.map +1 -0
- package/dist/kernel/blast-radius.js +146 -0
- package/dist/kernel/blast-radius.js.map +1 -0
- package/dist/kernel/decision.d.ts +40 -0
- package/dist/kernel/decision.d.ts.map +1 -0
- package/dist/kernel/decision.js +92 -0
- package/dist/kernel/decision.js.map +1 -0
- package/dist/kernel/decisions/factory.d.ts +12 -0
- package/dist/kernel/decisions/factory.d.ts.map +1 -0
- package/dist/kernel/decisions/factory.js +56 -0
- package/dist/kernel/decisions/factory.js.map +1 -0
- package/dist/kernel/decisions/types.d.ts +70 -0
- package/dist/kernel/decisions/types.d.ts.map +1 -0
- package/dist/kernel/decisions/types.js +5 -0
- package/dist/kernel/decisions/types.js.map +1 -0
- package/dist/kernel/evidence.d.ts +29 -0
- package/dist/kernel/evidence.d.ts.map +1 -0
- package/dist/kernel/evidence.js +61 -0
- package/dist/kernel/evidence.js.map +1 -0
- package/dist/kernel/kernel.d.ts +47 -0
- package/dist/kernel/kernel.d.ts.map +1 -0
- package/dist/kernel/kernel.js +377 -0
- package/dist/kernel/kernel.js.map +1 -0
- package/dist/kernel/monitor.d.ts +35 -0
- package/dist/kernel/monitor.d.ts.map +1 -0
- package/dist/kernel/monitor.js +144 -0
- package/dist/kernel/monitor.js.map +1 -0
- package/dist/kernel/replay-comparator.d.ts +72 -0
- package/dist/kernel/replay-comparator.d.ts.map +1 -0
- package/dist/kernel/replay-comparator.js +251 -0
- package/dist/kernel/replay-comparator.js.map +1 -0
- package/dist/kernel/replay-engine.d.ts +108 -0
- package/dist/kernel/replay-engine.d.ts.map +1 -0
- package/dist/kernel/replay-engine.js +241 -0
- package/dist/kernel/replay-engine.js.map +1 -0
- package/dist/kernel/replay-processor.d.ts +109 -0
- package/dist/kernel/replay-processor.d.ts.map +1 -0
- package/dist/kernel/replay-processor.js +118 -0
- package/dist/kernel/replay-processor.js.map +1 -0
- package/dist/kernel/simulation/filesystem-simulator.d.ts +3 -0
- package/dist/kernel/simulation/filesystem-simulator.d.ts.map +1 -0
- package/dist/kernel/simulation/filesystem-simulator.js +81 -0
- package/dist/kernel/simulation/filesystem-simulator.js.map +1 -0
- package/dist/kernel/simulation/git-simulator.d.ts +5 -0
- package/dist/kernel/simulation/git-simulator.d.ts.map +1 -0
- package/dist/kernel/simulation/git-simulator.js +115 -0
- package/dist/kernel/simulation/git-simulator.js.map +1 -0
- package/dist/kernel/simulation/package-simulator.d.ts +5 -0
- package/dist/kernel/simulation/package-simulator.d.ts.map +1 -0
- package/dist/kernel/simulation/package-simulator.js +164 -0
- package/dist/kernel/simulation/package-simulator.js.map +1 -0
- package/dist/kernel/simulation/registry.d.ts +3 -0
- package/dist/kernel/simulation/registry.d.ts.map +1 -0
- package/dist/kernel/simulation/registry.js +24 -0
- package/dist/kernel/simulation/registry.js.map +1 -0
- package/dist/kernel/simulation/types.d.ts +35 -0
- package/dist/kernel/simulation/types.d.ts.map +1 -0
- package/dist/kernel/simulation/types.js +4 -0
- package/dist/kernel/simulation/types.js.map +1 -0
- package/dist/plugins/discovery.d.ts +45 -0
- package/dist/plugins/discovery.d.ts.map +1 -0
- package/dist/plugins/discovery.js +89 -0
- package/dist/plugins/discovery.js.map +1 -0
- package/dist/plugins/index.d.ts +10 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +7 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/registry.d.ts +52 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +148 -0
- package/dist/plugins/registry.js.map +1 -0
- package/dist/plugins/sandbox.d.ts +87 -0
- package/dist/plugins/sandbox.d.ts.map +1 -0
- package/dist/plugins/sandbox.js +122 -0
- package/dist/plugins/sandbox.js.map +1 -0
- package/dist/plugins/types.d.ts +61 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +16 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/plugins/validator.d.ts +36 -0
- package/dist/plugins/validator.d.ts.map +1 -0
- package/dist/plugins/validator.js +276 -0
- package/dist/plugins/validator.js.map +1 -0
- package/dist/policy/evaluator.d.ts +41 -0
- package/dist/policy/evaluator.d.ts.map +1 -0
- package/dist/policy/evaluator.js +111 -0
- package/dist/policy/evaluator.js.map +1 -0
- package/dist/policy/loader.d.ts +13 -0
- package/dist/policy/loader.d.ts.map +1 -0
- package/dist/policy/loader.js +118 -0
- package/dist/policy/loader.js.map +1 -0
- package/dist/policy/pack-loader.d.ts +40 -0
- package/dist/policy/pack-loader.d.ts.map +1 -0
- package/dist/policy/pack-loader.js +138 -0
- package/dist/policy/pack-loader.js.map +1 -0
- package/dist/policy/yaml-loader.d.ts +23 -0
- package/dist/policy/yaml-loader.d.ts.map +1 -0
- package/dist/policy/yaml-loader.js +222 -0
- package/dist/policy/yaml-loader.js.map +1 -0
- package/dist/renderers/index.d.ts +6 -0
- package/dist/renderers/index.d.ts.map +1 -0
- package/dist/renderers/index.js +4 -0
- package/dist/renderers/index.js.map +1 -0
- package/dist/renderers/registry.d.ts +39 -0
- package/dist/renderers/registry.d.ts.map +1 -0
- package/dist/renderers/registry.js +97 -0
- package/dist/renderers/registry.js.map +1 -0
- package/dist/renderers/tui-renderer.d.ts +18 -0
- package/dist/renderers/tui-renderer.d.ts.map +1 -0
- package/dist/renderers/tui-renderer.js +57 -0
- package/dist/renderers/tui-renderer.js.map +1 -0
- package/dist/renderers/types.d.ts +52 -0
- package/dist/renderers/types.d.ts.map +1 -0
- package/dist/renderers/types.js +4 -0
- package/dist/renderers/types.js.map +1 -0
- package/dist/telemetry/index.d.ts +3 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +2 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/runtimeLogger.d.ts +9 -0
- package/dist/telemetry/runtimeLogger.d.ts.map +1 -0
- package/dist/telemetry/runtimeLogger.js +68 -0
- package/dist/telemetry/runtimeLogger.js.map +1 -0
- package/dist/telemetry/types.d.ts +22 -0
- package/dist/telemetry/types.d.ts.map +1 -0
- package/dist/telemetry/types.js +4 -0
- package/dist/telemetry/types.js.map +1 -0
- package/hooks/post-commit +57 -0
- package/hooks/post-merge +33 -0
- package/hooks/pre-commit +28 -0
- package/package.json +72 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
// Execution Event Log — append-only event log with causal chain support.
|
|
2
|
+
// Stores execution events and supports query, replay, trace, and NDJSON serialization.
|
|
3
|
+
// No DOM, no Node.js APIs — pure domain logic.
|
|
4
|
+
import { validateExecutionEvent } from './event-schema.js';
|
|
5
|
+
/**
|
|
6
|
+
* Create an in-memory execution event log.
|
|
7
|
+
* Append-only with support for causal chain tracing and NDJSON persistence.
|
|
8
|
+
*/
|
|
9
|
+
export function createExecutionEventLog() {
|
|
10
|
+
let events = [];
|
|
11
|
+
const indexById = new Map();
|
|
12
|
+
function rebuildIndex() {
|
|
13
|
+
indexById.clear();
|
|
14
|
+
for (let i = 0; i < events.length; i++) {
|
|
15
|
+
indexById.set(events[i].id, i);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
append(event) {
|
|
20
|
+
const { valid, errors } = validateExecutionEvent(event);
|
|
21
|
+
if (!valid) {
|
|
22
|
+
throw new Error(`Cannot append invalid execution event: ${errors.join('; ')}`);
|
|
23
|
+
}
|
|
24
|
+
if (event.causedBy && !indexById.has(event.causedBy)) {
|
|
25
|
+
// causedBy references must point to events already in the log,
|
|
26
|
+
// or to events from a previous session (allow unknown references)
|
|
27
|
+
}
|
|
28
|
+
indexById.set(event.id, events.length);
|
|
29
|
+
events.push(event);
|
|
30
|
+
},
|
|
31
|
+
query(filter = {}) {
|
|
32
|
+
let result = events;
|
|
33
|
+
if (filter.kind) {
|
|
34
|
+
result = result.filter((e) => e.kind === filter.kind);
|
|
35
|
+
}
|
|
36
|
+
if (filter.actor) {
|
|
37
|
+
result = result.filter((e) => e.actor === filter.actor);
|
|
38
|
+
}
|
|
39
|
+
if (filter.source) {
|
|
40
|
+
result = result.filter((e) => e.source === filter.source);
|
|
41
|
+
}
|
|
42
|
+
if (filter.since !== undefined) {
|
|
43
|
+
result = result.filter((e) => e.timestamp >= filter.since);
|
|
44
|
+
}
|
|
45
|
+
if (filter.until !== undefined) {
|
|
46
|
+
result = result.filter((e) => e.timestamp <= filter.until);
|
|
47
|
+
}
|
|
48
|
+
if (filter.agentRunId) {
|
|
49
|
+
result = result.filter((e) => e.context.agentRunId === filter.agentRunId);
|
|
50
|
+
}
|
|
51
|
+
if (filter.file) {
|
|
52
|
+
result = result.filter((e) => e.context.file === filter.file);
|
|
53
|
+
}
|
|
54
|
+
return result;
|
|
55
|
+
},
|
|
56
|
+
replay(fromId) {
|
|
57
|
+
if (!fromId)
|
|
58
|
+
return [...events];
|
|
59
|
+
const idx = indexById.get(fromId);
|
|
60
|
+
if (idx === undefined)
|
|
61
|
+
return [];
|
|
62
|
+
return events.slice(idx);
|
|
63
|
+
},
|
|
64
|
+
trace(eventId) {
|
|
65
|
+
const chain = [];
|
|
66
|
+
const visited = new Set();
|
|
67
|
+
let currentId = eventId;
|
|
68
|
+
while (currentId && !visited.has(currentId)) {
|
|
69
|
+
visited.add(currentId);
|
|
70
|
+
const idx = indexById.get(currentId);
|
|
71
|
+
if (idx === undefined)
|
|
72
|
+
break;
|
|
73
|
+
const event = events[idx];
|
|
74
|
+
chain.unshift(event);
|
|
75
|
+
currentId = event.causedBy;
|
|
76
|
+
}
|
|
77
|
+
return chain;
|
|
78
|
+
},
|
|
79
|
+
count() {
|
|
80
|
+
return events.length;
|
|
81
|
+
},
|
|
82
|
+
clear() {
|
|
83
|
+
events = [];
|
|
84
|
+
indexById.clear();
|
|
85
|
+
},
|
|
86
|
+
toNDJSON() {
|
|
87
|
+
return events.map((e) => JSON.stringify(e)).join('\n');
|
|
88
|
+
},
|
|
89
|
+
fromNDJSON(ndjson) {
|
|
90
|
+
const lines = ndjson.split('\n').filter((line) => line.trim().length > 0);
|
|
91
|
+
let loaded = 0;
|
|
92
|
+
for (const line of lines) {
|
|
93
|
+
const parsed = JSON.parse(line);
|
|
94
|
+
indexById.set(parsed.id, events.length);
|
|
95
|
+
events.push(parsed);
|
|
96
|
+
loaded++;
|
|
97
|
+
}
|
|
98
|
+
rebuildIndex();
|
|
99
|
+
return loaded;
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=event-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-log.js","sourceRoot":"","sources":["../../../src/core/execution-log/event-log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ExecutionEvent, ExecutionEventLog, FailureCluster, EncounterMapping, RiskScore } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Build the full causal chain leading to an event.
|
|
4
|
+
* Walks `causedBy` references back to the root cause.
|
|
5
|
+
* Returns events in chronological order (root first).
|
|
6
|
+
*/
|
|
7
|
+
export declare function buildCausalChain(log: ExecutionEventLog, eventId: string): ExecutionEvent[];
|
|
8
|
+
/**
|
|
9
|
+
* Score an agent run by its risk profile.
|
|
10
|
+
* Higher score = more risk. Based on failures, violations,
|
|
11
|
+
* skipped tests, sensitive file edits, and action velocity.
|
|
12
|
+
*/
|
|
13
|
+
export declare function scoreAgentRun(log: ExecutionEventLog, agentRunId: string): RiskScore;
|
|
14
|
+
export interface ClusterOptions {
|
|
15
|
+
readonly windowMs?: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Cluster related failures by file and time proximity.
|
|
19
|
+
* Groups failures that share a common file or occur within a time window.
|
|
20
|
+
*/
|
|
21
|
+
export declare function clusterFailures(log: ExecutionEventLog, options?: ClusterOptions): FailureCluster[];
|
|
22
|
+
/**
|
|
23
|
+
* Map an execution event to a game encounter.
|
|
24
|
+
* Only failure events produce encounters.
|
|
25
|
+
* Returns null for non-failure events.
|
|
26
|
+
*/
|
|
27
|
+
export declare function mapToEncounter(event: ExecutionEvent): EncounterMapping | null;
|
|
28
|
+
//# sourceMappingURL=event-projections.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-projections.d.ts","sourceRoot":"","sources":["../../../src/core/execution-log/event-projections.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,SAAS,EAGV,MAAM,aAAa,CAAC;AAerB;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,EAAE,CAE1F;AA6BD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,CAsFnF;AAID,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,iBAAiB,EACtB,OAAO,GAAE,cAAmB,GAC3B,cAAc,EAAE,CA0FlB;AA8CD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,gBAAgB,GAAG,IAAI,CAe7E"}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
// Execution Event Projections — derived views from the execution event stream.
|
|
2
|
+
// Causal chain construction, risk scoring, failure clustering, encounter mapping.
|
|
3
|
+
// No DOM, no Node.js APIs — pure domain logic.
|
|
4
|
+
import { simpleHash } from '../hash.js';
|
|
5
|
+
import { FAILURE_KINDS, VIOLATION_KINDS, AGENT_ACTION_KINDS, TESTS_SKIPPED, RUNTIME_EXCEPTION, TEST_SUITE_FAILED, DEPLOYMENT_FAILED, BUILD_FAILED, } from './event-schema.js';
|
|
6
|
+
// --- Causal Chain ---
|
|
7
|
+
/**
|
|
8
|
+
* Build the full causal chain leading to an event.
|
|
9
|
+
* Walks `causedBy` references back to the root cause.
|
|
10
|
+
* Returns events in chronological order (root first).
|
|
11
|
+
*/
|
|
12
|
+
export function buildCausalChain(log, eventId) {
|
|
13
|
+
return log.trace(eventId);
|
|
14
|
+
}
|
|
15
|
+
// --- Risk Scoring ---
|
|
16
|
+
const RISK_WEIGHTS = {
|
|
17
|
+
failure: 10,
|
|
18
|
+
violation: 25,
|
|
19
|
+
skippedTests: 15,
|
|
20
|
+
sensitiveFileEdit: 20,
|
|
21
|
+
highActionRate: 5,
|
|
22
|
+
};
|
|
23
|
+
const SENSITIVE_PATTERNS = [
|
|
24
|
+
/auth/i,
|
|
25
|
+
/security/i,
|
|
26
|
+
/password/i,
|
|
27
|
+
/secret/i,
|
|
28
|
+
/key/i,
|
|
29
|
+
/token/i,
|
|
30
|
+
/credential/i,
|
|
31
|
+
/\.env/i,
|
|
32
|
+
/migration/i,
|
|
33
|
+
/deploy/i,
|
|
34
|
+
];
|
|
35
|
+
function isSensitiveFile(file) {
|
|
36
|
+
return SENSITIVE_PATTERNS.some((p) => p.test(file));
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Score an agent run by its risk profile.
|
|
40
|
+
* Higher score = more risk. Based on failures, violations,
|
|
41
|
+
* skipped tests, sensitive file edits, and action velocity.
|
|
42
|
+
*/
|
|
43
|
+
export function scoreAgentRun(log, agentRunId) {
|
|
44
|
+
const events = log.query({ agentRunId });
|
|
45
|
+
const factors = [];
|
|
46
|
+
let totalScore = 0;
|
|
47
|
+
let failureCount = 0;
|
|
48
|
+
let violationCount = 0;
|
|
49
|
+
// Count failures
|
|
50
|
+
const failures = events.filter((e) => FAILURE_KINDS.has(e.kind));
|
|
51
|
+
failureCount = failures.length;
|
|
52
|
+
if (failureCount > 0) {
|
|
53
|
+
const weight = failureCount * RISK_WEIGHTS.failure;
|
|
54
|
+
totalScore += weight;
|
|
55
|
+
factors.push({
|
|
56
|
+
name: 'failures',
|
|
57
|
+
weight,
|
|
58
|
+
detail: `${failureCount} failure(s) during agent run`,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
// Count violations
|
|
62
|
+
const violations = events.filter((e) => VIOLATION_KINDS.has(e.kind));
|
|
63
|
+
violationCount = violations.length;
|
|
64
|
+
if (violationCount > 0) {
|
|
65
|
+
const weight = violationCount * RISK_WEIGHTS.violation;
|
|
66
|
+
totalScore += weight;
|
|
67
|
+
factors.push({
|
|
68
|
+
name: 'violations',
|
|
69
|
+
weight,
|
|
70
|
+
detail: `${violationCount} policy/invariant violation(s)`,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
// Skipped tests
|
|
74
|
+
const skipped = events.filter((e) => e.kind === TESTS_SKIPPED);
|
|
75
|
+
if (skipped.length > 0) {
|
|
76
|
+
totalScore += RISK_WEIGHTS.skippedTests;
|
|
77
|
+
factors.push({
|
|
78
|
+
name: 'skipped_tests',
|
|
79
|
+
weight: RISK_WEIGHTS.skippedTests,
|
|
80
|
+
detail: `Tests were skipped ${skipped.length} time(s)`,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
// Sensitive file edits
|
|
84
|
+
const agentActions = events.filter((e) => AGENT_ACTION_KINDS.has(e.kind));
|
|
85
|
+
const sensitiveEdits = agentActions.filter((e) => e.context.file && isSensitiveFile(e.context.file));
|
|
86
|
+
if (sensitiveEdits.length > 0) {
|
|
87
|
+
const weight = sensitiveEdits.length * RISK_WEIGHTS.sensitiveFileEdit;
|
|
88
|
+
totalScore += weight;
|
|
89
|
+
factors.push({
|
|
90
|
+
name: 'sensitive_file_edits',
|
|
91
|
+
weight,
|
|
92
|
+
detail: `${sensitiveEdits.length} edit(s) to sensitive files`,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
// High action rate (>50 actions in a single run is suspicious)
|
|
96
|
+
if (agentActions.length > 50) {
|
|
97
|
+
totalScore += RISK_WEIGHTS.highActionRate;
|
|
98
|
+
factors.push({
|
|
99
|
+
name: 'high_action_rate',
|
|
100
|
+
weight: RISK_WEIGHTS.highActionRate,
|
|
101
|
+
detail: `${agentActions.length} agent actions in a single run`,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
// Determine risk level
|
|
105
|
+
let level;
|
|
106
|
+
if (totalScore >= 75)
|
|
107
|
+
level = 'critical';
|
|
108
|
+
else if (totalScore >= 40)
|
|
109
|
+
level = 'high';
|
|
110
|
+
else if (totalScore >= 15)
|
|
111
|
+
level = 'medium';
|
|
112
|
+
else
|
|
113
|
+
level = 'low';
|
|
114
|
+
return {
|
|
115
|
+
agentRunId,
|
|
116
|
+
score: totalScore,
|
|
117
|
+
level,
|
|
118
|
+
factors,
|
|
119
|
+
eventCount: events.length,
|
|
120
|
+
failureCount,
|
|
121
|
+
violationCount,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Cluster related failures by file and time proximity.
|
|
126
|
+
* Groups failures that share a common file or occur within a time window.
|
|
127
|
+
*/
|
|
128
|
+
export function clusterFailures(log, options = {}) {
|
|
129
|
+
const windowMs = options.windowMs ?? 60_000; // 1 minute default
|
|
130
|
+
const failures = log.query({}).filter((e) => FAILURE_KINDS.has(e.kind));
|
|
131
|
+
if (failures.length === 0)
|
|
132
|
+
return [];
|
|
133
|
+
// Group by file, then by time proximity
|
|
134
|
+
const byFile = new Map();
|
|
135
|
+
const noFile = [];
|
|
136
|
+
for (const event of failures) {
|
|
137
|
+
const file = event.context.file ?? event.payload.file;
|
|
138
|
+
if (file) {
|
|
139
|
+
const existing = byFile.get(file) ?? [];
|
|
140
|
+
existing.push(event);
|
|
141
|
+
byFile.set(file, existing);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
noFile.push(event);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
const clusters = [];
|
|
148
|
+
// File-based clusters
|
|
149
|
+
for (const [file, fileEvents] of byFile) {
|
|
150
|
+
const sorted = [...fileEvents].sort((a, b) => a.timestamp - b.timestamp);
|
|
151
|
+
let clusterEvents = [sorted[0]];
|
|
152
|
+
for (let i = 1; i < sorted.length; i++) {
|
|
153
|
+
if (sorted[i].timestamp - sorted[i - 1].timestamp <= windowMs) {
|
|
154
|
+
clusterEvents.push(sorted[i]);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
if (clusterEvents.length > 0) {
|
|
158
|
+
clusters.push({
|
|
159
|
+
id: simpleHash(`cluster:${file}:${clusterEvents[0].id}`),
|
|
160
|
+
rootEvent: clusterEvents[0],
|
|
161
|
+
events: clusterEvents,
|
|
162
|
+
commonFile: file,
|
|
163
|
+
commonKind: getMostCommonKind(clusterEvents),
|
|
164
|
+
severity: Math.min(5, clusterEvents.length),
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
clusterEvents = [sorted[i]];
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (clusterEvents.length > 0) {
|
|
171
|
+
clusters.push({
|
|
172
|
+
id: simpleHash(`cluster:${file}:${clusterEvents[0].id}`),
|
|
173
|
+
rootEvent: clusterEvents[0],
|
|
174
|
+
events: clusterEvents,
|
|
175
|
+
commonFile: file,
|
|
176
|
+
commonKind: getMostCommonKind(clusterEvents),
|
|
177
|
+
severity: Math.min(5, clusterEvents.length),
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// Time-based clusters for events without files
|
|
182
|
+
if (noFile.length > 0) {
|
|
183
|
+
const sorted = [...noFile].sort((a, b) => a.timestamp - b.timestamp);
|
|
184
|
+
let clusterEvents = [sorted[0]];
|
|
185
|
+
for (let i = 1; i < sorted.length; i++) {
|
|
186
|
+
if (sorted[i].timestamp - sorted[i - 1].timestamp <= windowMs) {
|
|
187
|
+
clusterEvents.push(sorted[i]);
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
if (clusterEvents.length > 0) {
|
|
191
|
+
clusters.push({
|
|
192
|
+
id: simpleHash(`cluster:time:${clusterEvents[0].id}`),
|
|
193
|
+
rootEvent: clusterEvents[0],
|
|
194
|
+
events: clusterEvents,
|
|
195
|
+
commonKind: getMostCommonKind(clusterEvents),
|
|
196
|
+
severity: Math.min(5, clusterEvents.length),
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
clusterEvents = [sorted[i]];
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (clusterEvents.length > 0) {
|
|
203
|
+
clusters.push({
|
|
204
|
+
id: simpleHash(`cluster:time:${clusterEvents[0].id}`),
|
|
205
|
+
rootEvent: clusterEvents[0],
|
|
206
|
+
events: clusterEvents,
|
|
207
|
+
commonKind: getMostCommonKind(clusterEvents),
|
|
208
|
+
severity: Math.min(5, clusterEvents.length),
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return clusters.sort((a, b) => b.severity - a.severity);
|
|
213
|
+
}
|
|
214
|
+
function getMostCommonKind(events) {
|
|
215
|
+
const counts = new Map();
|
|
216
|
+
for (const e of events) {
|
|
217
|
+
counts.set(e.kind, (counts.get(e.kind) ?? 0) + 1);
|
|
218
|
+
}
|
|
219
|
+
let maxKind = events[0].kind;
|
|
220
|
+
let maxCount = 0;
|
|
221
|
+
for (const [kind, count] of counts) {
|
|
222
|
+
if (count > maxCount) {
|
|
223
|
+
maxKind = kind;
|
|
224
|
+
maxCount = count;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return maxKind;
|
|
228
|
+
}
|
|
229
|
+
// --- Encounter Mapping ---
|
|
230
|
+
const KIND_TO_ENCOUNTER = {
|
|
231
|
+
[RUNTIME_EXCEPTION]: {
|
|
232
|
+
encounterType: 'monster',
|
|
233
|
+
severity: 3,
|
|
234
|
+
name: 'Runtime Wraith',
|
|
235
|
+
},
|
|
236
|
+
[TEST_SUITE_FAILED]: {
|
|
237
|
+
encounterType: 'monster',
|
|
238
|
+
severity: 2,
|
|
239
|
+
name: 'Test Phantom',
|
|
240
|
+
},
|
|
241
|
+
[BUILD_FAILED]: {
|
|
242
|
+
encounterType: 'monster',
|
|
243
|
+
severity: 2,
|
|
244
|
+
name: 'Build Specter',
|
|
245
|
+
},
|
|
246
|
+
[DEPLOYMENT_FAILED]: {
|
|
247
|
+
encounterType: 'boss',
|
|
248
|
+
severity: 4,
|
|
249
|
+
name: 'Deploy Colossus',
|
|
250
|
+
},
|
|
251
|
+
};
|
|
252
|
+
/**
|
|
253
|
+
* Map an execution event to a game encounter.
|
|
254
|
+
* Only failure events produce encounters.
|
|
255
|
+
* Returns null for non-failure events.
|
|
256
|
+
*/
|
|
257
|
+
export function mapToEncounter(event) {
|
|
258
|
+
const mapping = KIND_TO_ENCOUNTER[event.kind];
|
|
259
|
+
if (!mapping)
|
|
260
|
+
return null;
|
|
261
|
+
const description = event.payload.message
|
|
262
|
+
? String(event.payload.message)
|
|
263
|
+
: `${event.kind} in ${event.context.file ?? 'unknown'}`;
|
|
264
|
+
return {
|
|
265
|
+
eventId: event.id,
|
|
266
|
+
encounterType: mapping.encounterType,
|
|
267
|
+
severity: mapping.severity,
|
|
268
|
+
name: mapping.name,
|
|
269
|
+
description,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=event-projections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-projections.js","sourceRoot":"","sources":["../../../src/core/execution-log/event-projections.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { Actor, EventSource, ExecutionContext, ExecutionEvent, ValidationResult } from '../types.js';
|
|
2
|
+
export declare const AGENT_EDIT_FILE = "AgentEditFile";
|
|
3
|
+
export declare const AGENT_RUN_COMMAND = "AgentRunCommand";
|
|
4
|
+
export declare const AGENT_CREATE_FILE = "AgentCreateFile";
|
|
5
|
+
export declare const AGENT_DELETE_FILE = "AgentDeleteFile";
|
|
6
|
+
export declare const TEST_SUITE_STARTED = "TestSuiteStarted";
|
|
7
|
+
export declare const TEST_SUITE_PASSED = "TestSuitePassed";
|
|
8
|
+
export declare const TEST_SUITE_FAILED = "TestSuiteFailed";
|
|
9
|
+
export declare const TESTS_SKIPPED = "TestsSkipped";
|
|
10
|
+
export declare const LINT_VIOLATION = "LintViolation";
|
|
11
|
+
export declare const BUILD_STARTED = "BuildStarted";
|
|
12
|
+
export declare const BUILD_SUCCEEDED = "BuildSucceeded";
|
|
13
|
+
export declare const BUILD_FAILED = "BuildFailed";
|
|
14
|
+
export declare const FILE_DELETED = "FileDeleted";
|
|
15
|
+
export declare const DEPENDENCY_INSTALLED = "DependencyInstalled";
|
|
16
|
+
export declare const DEPENDENCY_REMOVED = "DependencyRemoved";
|
|
17
|
+
export declare const MIGRATION_EXECUTED = "MigrationExecuted";
|
|
18
|
+
export declare const PR_CREATED = "PRCreated";
|
|
19
|
+
export declare const PR_MERGED = "PRMerged";
|
|
20
|
+
export declare const BRANCH_CREATED = "BranchCreated";
|
|
21
|
+
export declare const RUNTIME_EXCEPTION = "RuntimeException";
|
|
22
|
+
export declare const DEPLOYMENT_STARTED = "DeploymentStarted";
|
|
23
|
+
export declare const DEPLOYMENT_SUCCEEDED = "DeploymentSucceeded";
|
|
24
|
+
export declare const DEPLOYMENT_FAILED = "DeploymentFailed";
|
|
25
|
+
export declare const POLICY_VIOLATION_DETECTED = "PolicyViolationDetected";
|
|
26
|
+
export declare const INVARIANT_CHECK_FAILED = "InvariantCheckFailed";
|
|
27
|
+
export declare const APPROVAL_REQUIRED = "ApprovalRequired";
|
|
28
|
+
export declare const APPROVAL_GRANTED = "ApprovalGranted";
|
|
29
|
+
/** All known execution event kinds */
|
|
30
|
+
export declare const ALL_EXECUTION_EVENT_KINDS: Set<string>;
|
|
31
|
+
/** Kinds that represent failures */
|
|
32
|
+
export declare const FAILURE_KINDS: Set<string>;
|
|
33
|
+
/** Kinds that represent governance violations */
|
|
34
|
+
export declare const VIOLATION_KINDS: Set<string>;
|
|
35
|
+
/** Kinds that represent agent actions */
|
|
36
|
+
export declare const AGENT_ACTION_KINDS: Set<string>;
|
|
37
|
+
/** Reset the counter. Exported for test determinism. */
|
|
38
|
+
export declare function resetExecutionEventCounter(): void;
|
|
39
|
+
/**
|
|
40
|
+
* Validate an execution event object.
|
|
41
|
+
*/
|
|
42
|
+
export declare function validateExecutionEvent(event: Record<string, unknown>): ValidationResult;
|
|
43
|
+
export interface CreateExecutionEventOptions {
|
|
44
|
+
readonly actor: Actor;
|
|
45
|
+
readonly source: EventSource;
|
|
46
|
+
readonly context?: ExecutionContext;
|
|
47
|
+
readonly payload?: Record<string, unknown>;
|
|
48
|
+
readonly causedBy?: string;
|
|
49
|
+
readonly timestamp?: number;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Create a validated execution event.
|
|
53
|
+
* Assigns a unique ID and content fingerprint.
|
|
54
|
+
*/
|
|
55
|
+
export declare function createExecutionEvent(kind: string, options: CreateExecutionEventOptions): ExecutionEvent;
|
|
56
|
+
//# sourceMappingURL=event-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-schema.d.ts","sourceRoot":"","sources":["../../../src/core/execution-log/event-schema.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,KAAK,EACL,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAMrB,eAAO,MAAM,eAAe,kBAAkB,CAAC;AAC/C,eAAO,MAAM,iBAAiB,oBAAoB,CAAC;AACnD,eAAO,MAAM,iBAAiB,oBAAoB,CAAC;AACnD,eAAO,MAAM,iBAAiB,oBAAoB,CAAC;AAGnD,eAAO,MAAM,kBAAkB,qBAAqB,CAAC;AACrD,eAAO,MAAM,iBAAiB,oBAAoB,CAAC;AACnD,eAAO,MAAM,iBAAiB,oBAAoB,CAAC;AACnD,eAAO,MAAM,aAAa,iBAAiB,CAAC;AAC5C,eAAO,MAAM,cAAc,kBAAkB,CAAC;AAC9C,eAAO,MAAM,aAAa,iBAAiB,CAAC;AAC5C,eAAO,MAAM,eAAe,mBAAmB,CAAC;AAChD,eAAO,MAAM,YAAY,gBAAgB,CAAC;AAG1C,eAAO,MAAM,YAAY,gBAAgB,CAAC;AAC1C,eAAO,MAAM,oBAAoB,wBAAwB,CAAC;AAC1D,eAAO,MAAM,kBAAkB,sBAAsB,CAAC;AACtD,eAAO,MAAM,kBAAkB,sBAAsB,CAAC;AACtD,eAAO,MAAM,UAAU,cAAc,CAAC;AACtC,eAAO,MAAM,SAAS,aAAa,CAAC;AACpC,eAAO,MAAM,cAAc,kBAAkB,CAAC;AAG9C,eAAO,MAAM,iBAAiB,qBAAqB,CAAC;AACpD,eAAO,MAAM,kBAAkB,sBAAsB,CAAC;AACtD,eAAO,MAAM,oBAAoB,wBAAwB,CAAC;AAC1D,eAAO,MAAM,iBAAiB,qBAAqB,CAAC;AAGpD,eAAO,MAAM,yBAAyB,4BAA4B,CAAC;AACnE,eAAO,MAAM,sBAAsB,yBAAyB,CAAC;AAC7D,eAAO,MAAM,iBAAiB,qBAAqB,CAAC;AACpD,eAAO,MAAM,gBAAgB,oBAAoB,CAAC;AAElD,sCAAsC;AACtC,eAAO,MAAM,yBAAyB,aA4BpC,CAAC;AAEH,oCAAoC;AACpC,eAAO,MAAM,aAAa,aAOxB,CAAC;AAEH,iDAAiD;AACjD,eAAO,MAAM,eAAe,aAAuE,CAAC;AAEpG,yCAAyC;AACzC,eAAO,MAAM,kBAAkB,aAK7B,CAAC;AAKH,wDAAwD;AACxD,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD;AAmBD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,gBAAgB,CA2CvF;AAID,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,2BAA2B,GACnC,cAAc,CAyBhB"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
// Execution Event schema — defines the universal execution event format.
|
|
2
|
+
// All development environment actions become execution events.
|
|
3
|
+
// No DOM, no Node.js APIs — pure data definitions.
|
|
4
|
+
import { simpleHash } from '../hash.js';
|
|
5
|
+
// --- Execution Event Kinds ---
|
|
6
|
+
// Agent actions
|
|
7
|
+
export const AGENT_EDIT_FILE = 'AgentEditFile';
|
|
8
|
+
export const AGENT_RUN_COMMAND = 'AgentRunCommand';
|
|
9
|
+
export const AGENT_CREATE_FILE = 'AgentCreateFile';
|
|
10
|
+
export const AGENT_DELETE_FILE = 'AgentDeleteFile';
|
|
11
|
+
// CI/CD
|
|
12
|
+
export const TEST_SUITE_STARTED = 'TestSuiteStarted';
|
|
13
|
+
export const TEST_SUITE_PASSED = 'TestSuitePassed';
|
|
14
|
+
export const TEST_SUITE_FAILED = 'TestSuiteFailed';
|
|
15
|
+
export const TESTS_SKIPPED = 'TestsSkipped';
|
|
16
|
+
export const LINT_VIOLATION = 'LintViolation';
|
|
17
|
+
export const BUILD_STARTED = 'BuildStarted';
|
|
18
|
+
export const BUILD_SUCCEEDED = 'BuildSucceeded';
|
|
19
|
+
export const BUILD_FAILED = 'BuildFailed';
|
|
20
|
+
// Git
|
|
21
|
+
export const FILE_DELETED = 'FileDeleted';
|
|
22
|
+
export const DEPENDENCY_INSTALLED = 'DependencyInstalled';
|
|
23
|
+
export const DEPENDENCY_REMOVED = 'DependencyRemoved';
|
|
24
|
+
export const MIGRATION_EXECUTED = 'MigrationExecuted';
|
|
25
|
+
export const PR_CREATED = 'PRCreated';
|
|
26
|
+
export const PR_MERGED = 'PRMerged';
|
|
27
|
+
export const BRANCH_CREATED = 'BranchCreated';
|
|
28
|
+
// Runtime
|
|
29
|
+
export const RUNTIME_EXCEPTION = 'RuntimeException';
|
|
30
|
+
export const DEPLOYMENT_STARTED = 'DeploymentStarted';
|
|
31
|
+
export const DEPLOYMENT_SUCCEEDED = 'DeploymentSucceeded';
|
|
32
|
+
export const DEPLOYMENT_FAILED = 'DeploymentFailed';
|
|
33
|
+
// Governance
|
|
34
|
+
export const POLICY_VIOLATION_DETECTED = 'PolicyViolationDetected';
|
|
35
|
+
export const INVARIANT_CHECK_FAILED = 'InvariantCheckFailed';
|
|
36
|
+
export const APPROVAL_REQUIRED = 'ApprovalRequired';
|
|
37
|
+
export const APPROVAL_GRANTED = 'ApprovalGranted';
|
|
38
|
+
/** All known execution event kinds */
|
|
39
|
+
export const ALL_EXECUTION_EVENT_KINDS = new Set([
|
|
40
|
+
AGENT_EDIT_FILE,
|
|
41
|
+
AGENT_RUN_COMMAND,
|
|
42
|
+
AGENT_CREATE_FILE,
|
|
43
|
+
AGENT_DELETE_FILE,
|
|
44
|
+
TEST_SUITE_STARTED,
|
|
45
|
+
TEST_SUITE_PASSED,
|
|
46
|
+
TEST_SUITE_FAILED,
|
|
47
|
+
TESTS_SKIPPED,
|
|
48
|
+
LINT_VIOLATION,
|
|
49
|
+
BUILD_STARTED,
|
|
50
|
+
BUILD_SUCCEEDED,
|
|
51
|
+
BUILD_FAILED,
|
|
52
|
+
FILE_DELETED,
|
|
53
|
+
DEPENDENCY_INSTALLED,
|
|
54
|
+
DEPENDENCY_REMOVED,
|
|
55
|
+
MIGRATION_EXECUTED,
|
|
56
|
+
PR_CREATED,
|
|
57
|
+
PR_MERGED,
|
|
58
|
+
BRANCH_CREATED,
|
|
59
|
+
RUNTIME_EXCEPTION,
|
|
60
|
+
DEPLOYMENT_STARTED,
|
|
61
|
+
DEPLOYMENT_SUCCEEDED,
|
|
62
|
+
DEPLOYMENT_FAILED,
|
|
63
|
+
POLICY_VIOLATION_DETECTED,
|
|
64
|
+
INVARIANT_CHECK_FAILED,
|
|
65
|
+
APPROVAL_REQUIRED,
|
|
66
|
+
APPROVAL_GRANTED,
|
|
67
|
+
]);
|
|
68
|
+
/** Kinds that represent failures */
|
|
69
|
+
export const FAILURE_KINDS = new Set([
|
|
70
|
+
TEST_SUITE_FAILED,
|
|
71
|
+
BUILD_FAILED,
|
|
72
|
+
RUNTIME_EXCEPTION,
|
|
73
|
+
DEPLOYMENT_FAILED,
|
|
74
|
+
POLICY_VIOLATION_DETECTED,
|
|
75
|
+
INVARIANT_CHECK_FAILED,
|
|
76
|
+
]);
|
|
77
|
+
/** Kinds that represent governance violations */
|
|
78
|
+
export const VIOLATION_KINDS = new Set([POLICY_VIOLATION_DETECTED, INVARIANT_CHECK_FAILED]);
|
|
79
|
+
/** Kinds that represent agent actions */
|
|
80
|
+
export const AGENT_ACTION_KINDS = new Set([
|
|
81
|
+
AGENT_EDIT_FILE,
|
|
82
|
+
AGENT_RUN_COMMAND,
|
|
83
|
+
AGENT_CREATE_FILE,
|
|
84
|
+
AGENT_DELETE_FILE,
|
|
85
|
+
]);
|
|
86
|
+
// --- Event ID Generation ---
|
|
87
|
+
let eventCounter = 0;
|
|
88
|
+
/** Reset the counter. Exported for test determinism. */
|
|
89
|
+
export function resetExecutionEventCounter() {
|
|
90
|
+
eventCounter = 0;
|
|
91
|
+
}
|
|
92
|
+
function generateId(timestamp) {
|
|
93
|
+
return `xev_${timestamp}_${++eventCounter}`;
|
|
94
|
+
}
|
|
95
|
+
function fingerprintExecutionEvent(kind, actor, source, payload) {
|
|
96
|
+
const payloadKeys = Object.keys(payload).sort();
|
|
97
|
+
const parts = payloadKeys.map((k) => `${k}=${JSON.stringify(payload[k])}`);
|
|
98
|
+
return simpleHash(`${kind}:${actor}:${source}:${parts.join(',')}`);
|
|
99
|
+
}
|
|
100
|
+
// --- Validation ---
|
|
101
|
+
/**
|
|
102
|
+
* Validate an execution event object.
|
|
103
|
+
*/
|
|
104
|
+
export function validateExecutionEvent(event) {
|
|
105
|
+
const errors = [];
|
|
106
|
+
if (!event || typeof event !== 'object') {
|
|
107
|
+
return { valid: false, errors: ['ExecutionEvent must be a non-null object'] };
|
|
108
|
+
}
|
|
109
|
+
const requiredFields = ['id', 'timestamp', 'actor', 'source', 'kind', 'context', 'payload'];
|
|
110
|
+
for (const field of requiredFields) {
|
|
111
|
+
if (event[field] === undefined || event[field] === null) {
|
|
112
|
+
errors.push(`ExecutionEvent missing required field: ${field}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const validActors = ['human', 'agent', 'system'];
|
|
116
|
+
if (event.actor && !validActors.includes(event.actor)) {
|
|
117
|
+
errors.push(`Invalid actor: ${event.actor}. Must be one of: ${validActors.join(', ')}`);
|
|
118
|
+
}
|
|
119
|
+
const validSources = ['cli', 'ci', 'git', 'runtime', 'editor', 'governance'];
|
|
120
|
+
if (event.source && !validSources.includes(event.source)) {
|
|
121
|
+
errors.push(`Invalid source: ${event.source}. Must be one of: ${validSources.join(', ')}`);
|
|
122
|
+
}
|
|
123
|
+
if (event.context !== undefined &&
|
|
124
|
+
(typeof event.context !== 'object' || event.context === null)) {
|
|
125
|
+
errors.push('ExecutionEvent context must be an object');
|
|
126
|
+
}
|
|
127
|
+
if (event.payload !== undefined &&
|
|
128
|
+
(typeof event.payload !== 'object' || event.payload === null)) {
|
|
129
|
+
errors.push('ExecutionEvent payload must be an object');
|
|
130
|
+
}
|
|
131
|
+
return { valid: errors.length === 0, errors };
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Create a validated execution event.
|
|
135
|
+
* Assigns a unique ID and content fingerprint.
|
|
136
|
+
*/
|
|
137
|
+
export function createExecutionEvent(kind, options) {
|
|
138
|
+
const timestamp = options.timestamp ?? Date.now();
|
|
139
|
+
const context = options.context ?? {};
|
|
140
|
+
const payload = options.payload ?? {};
|
|
141
|
+
const id = generateId(timestamp);
|
|
142
|
+
const fingerprint = fingerprintExecutionEvent(kind, options.actor, options.source, payload);
|
|
143
|
+
const event = {
|
|
144
|
+
id,
|
|
145
|
+
timestamp,
|
|
146
|
+
actor: options.actor,
|
|
147
|
+
source: options.source,
|
|
148
|
+
kind,
|
|
149
|
+
context,
|
|
150
|
+
payload,
|
|
151
|
+
fingerprint,
|
|
152
|
+
...(options.causedBy ? { causedBy: options.causedBy } : {}),
|
|
153
|
+
};
|
|
154
|
+
const { valid, errors } = validateExecutionEvent(event);
|
|
155
|
+
if (!valid) {
|
|
156
|
+
throw new Error(`Invalid execution event: ${errors.join('; ')}`);
|
|
157
|
+
}
|
|
158
|
+
return event;
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=event-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-schema.js","sourceRoot":"","sources":["../../../src/core/execution-log/event-schema.ts"],"names":[],"mappings":"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"}
|