opena2a-cli 0.1.2 → 0.2.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.
Files changed (63) hide show
  1. package/README.md +225 -1
  2. package/dist/commands/guard-hooks.d.ts +27 -0
  3. package/dist/commands/guard-hooks.d.ts.map +1 -0
  4. package/dist/commands/guard-hooks.js +207 -0
  5. package/dist/commands/guard-hooks.js.map +1 -0
  6. package/dist/commands/guard-policy.d.ts +54 -0
  7. package/dist/commands/guard-policy.d.ts.map +1 -0
  8. package/dist/commands/guard-policy.js +251 -0
  9. package/dist/commands/guard-policy.js.map +1 -0
  10. package/dist/commands/guard-signing.d.ts +52 -0
  11. package/dist/commands/guard-signing.d.ts.map +1 -0
  12. package/dist/commands/guard-signing.js +185 -0
  13. package/dist/commands/guard-signing.js.map +1 -0
  14. package/dist/commands/guard-snapshots.d.ts +54 -0
  15. package/dist/commands/guard-snapshots.d.ts.map +1 -0
  16. package/dist/commands/guard-snapshots.js +346 -0
  17. package/dist/commands/guard-snapshots.js.map +1 -0
  18. package/dist/commands/guard.d.ts +60 -4
  19. package/dist/commands/guard.d.ts.map +1 -1
  20. package/dist/commands/guard.js +475 -95
  21. package/dist/commands/guard.js.map +1 -1
  22. package/dist/commands/init.js +3 -4
  23. package/dist/commands/init.js.map +1 -1
  24. package/dist/commands/shield.d.ts +3 -0
  25. package/dist/commands/shield.d.ts.map +1 -1
  26. package/dist/commands/shield.js +458 -30
  27. package/dist/commands/shield.js.map +1 -1
  28. package/dist/index.js +15 -6
  29. package/dist/index.js.map +1 -1
  30. package/dist/router.d.ts.map +1 -1
  31. package/dist/router.js +1 -0
  32. package/dist/router.js.map +1 -1
  33. package/dist/shield/arp-bridge.d.ts +62 -0
  34. package/dist/shield/arp-bridge.d.ts.map +1 -0
  35. package/dist/shield/arp-bridge.js +198 -0
  36. package/dist/shield/arp-bridge.js.map +1 -0
  37. package/dist/shield/baselines.d.ts +58 -0
  38. package/dist/shield/baselines.d.ts.map +1 -0
  39. package/dist/shield/baselines.js +371 -0
  40. package/dist/shield/baselines.js.map +1 -0
  41. package/dist/shield/findings.d.ts +52 -0
  42. package/dist/shield/findings.d.ts.map +1 -0
  43. package/dist/shield/findings.js +336 -0
  44. package/dist/shield/findings.js.map +1 -0
  45. package/dist/shield/integrity.d.ts.map +1 -1
  46. package/dist/shield/integrity.js +6 -2
  47. package/dist/shield/integrity.js.map +1 -1
  48. package/dist/shield/report-html.d.ts +29 -0
  49. package/dist/shield/report-html.d.ts.map +1 -0
  50. package/dist/shield/report-html.js +596 -0
  51. package/dist/shield/report-html.js.map +1 -0
  52. package/dist/shield/sarif.d.ts +65 -0
  53. package/dist/shield/sarif.d.ts.map +1 -0
  54. package/dist/shield/sarif.js +108 -0
  55. package/dist/shield/sarif.js.map +1 -0
  56. package/dist/shield/status.d.ts.map +1 -1
  57. package/dist/shield/status.js +6 -6
  58. package/dist/shield/status.js.map +1 -1
  59. package/dist/shield/types.d.ts +19 -1
  60. package/dist/shield/types.d.ts.map +1 -1
  61. package/dist/shield/types.js +2 -1
  62. package/dist/shield/types.js.map +1 -1
  63. package/package.json +1 -1
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+ /**
3
+ * ARP-Shield Event Bridge
4
+ *
5
+ * Translates ARP (Agent Runtime Protection) events into Shield's
6
+ * tamper-evident hash chain. Supports both bulk import of existing
7
+ * ARP event logs and live bridging during ARP monitoring.
8
+ *
9
+ * ARP events live in .opena2a/arp/events.jsonl (ARP native format).
10
+ * Shield events live in ~/.opena2a/shield/events.jsonl (hash-chained).
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.translateARPEvent = translateARPEvent;
14
+ exports.importARPEvents = importARPEvents;
15
+ exports.getARPStats = getARPStats;
16
+ const node_fs_1 = require("node:fs");
17
+ const node_path_1 = require("node:path");
18
+ const events_js_1 = require("./events.js");
19
+ // ---------------------------------------------------------------------------
20
+ // Translation
21
+ // ---------------------------------------------------------------------------
22
+ /** Map ARP category to Shield outcome. */
23
+ function mapOutcome(arpCategory, enforcement) {
24
+ if (enforcement === 'kill' || enforcement === 'pause')
25
+ return 'blocked';
26
+ if (arpCategory === 'violation' || arpCategory === 'threat')
27
+ return 'blocked';
28
+ if (arpCategory === 'anomaly')
29
+ return 'monitored';
30
+ return 'allowed';
31
+ }
32
+ /** Map ARP severity to Shield severity. */
33
+ function mapSeverity(arpSeverity) {
34
+ const map = {
35
+ info: 'info',
36
+ low: 'low',
37
+ medium: 'medium',
38
+ high: 'high',
39
+ critical: 'critical',
40
+ };
41
+ return map[arpSeverity] ?? 'info';
42
+ }
43
+ /** Build a human-readable action string from ARP event data. */
44
+ function buildAction(arp) {
45
+ const src = arp.source;
46
+ const cat = arp.category;
47
+ if (src === 'process')
48
+ return `process.${cat === 'normal' ? 'spawn' : cat}`;
49
+ if (src === 'network')
50
+ return `network.${cat === 'normal' ? 'connection' : cat}`;
51
+ if (src === 'filesystem')
52
+ return `filesystem.${cat === 'normal' ? 'access' : cat}`;
53
+ if (src === 'prompt')
54
+ return `prompt.${cat}`;
55
+ if (src === 'mcp-protocol')
56
+ return `mcp.${cat}`;
57
+ if (src === 'a2a-protocol')
58
+ return `a2a.${cat}`;
59
+ return `${src}.${cat}`;
60
+ }
61
+ /** Build a target string from ARP event data. */
62
+ function buildTarget(arp) {
63
+ const data = arp.data ?? {};
64
+ if (data.command)
65
+ return String(data.command);
66
+ if (data.host)
67
+ return String(data.host);
68
+ if (data.path)
69
+ return String(data.path);
70
+ if (data.name)
71
+ return String(data.name);
72
+ if (data.pid)
73
+ return `pid:${data.pid}`;
74
+ return arp.description?.slice(0, 80) ?? 'unknown';
75
+ }
76
+ /**
77
+ * Translate a single ARP event into a Shield writeEvent partial.
78
+ * This does NOT write the event -- caller decides when to persist.
79
+ */
80
+ function translateARPEvent(arp, agentName) {
81
+ return {
82
+ source: 'arp',
83
+ category: `arp.${arp.source}`,
84
+ severity: mapSeverity(arp.severity),
85
+ agent: agentName ?? arp.data?.agentName ?? null,
86
+ sessionId: null,
87
+ action: buildAction(arp),
88
+ target: buildTarget(arp),
89
+ outcome: mapOutcome(arp.category, arp.llmAssessment?.recommendation),
90
+ detail: {
91
+ arpEventId: arp.id,
92
+ arpSource: arp.source,
93
+ arpCategory: arp.category,
94
+ classifiedBy: arp.classifiedBy ?? 'L0-rules',
95
+ description: arp.description,
96
+ data: arp.data,
97
+ ...(arp.llmAssessment ? { llmAssessment: arp.llmAssessment } : {}),
98
+ },
99
+ orgId: null,
100
+ managed: false,
101
+ agentId: null,
102
+ };
103
+ }
104
+ // ---------------------------------------------------------------------------
105
+ // Bulk import
106
+ // ---------------------------------------------------------------------------
107
+ /**
108
+ * Read ARP events from .opena2a/arp/events.jsonl and import them into
109
+ * Shield's tamper-evident event log. Skips events that have already been
110
+ * imported (checks for matching arpEventId in existing Shield events).
111
+ *
112
+ * Returns the count of newly imported events.
113
+ */
114
+ function importARPEvents(targetDir, agentName) {
115
+ const arpEventsPath = (0, node_path_1.join)(targetDir, '.opena2a', 'arp', 'events.jsonl');
116
+ if (!(0, node_fs_1.existsSync)(arpEventsPath)) {
117
+ return { imported: 0, skipped: 0, errors: 0, total: 0 };
118
+ }
119
+ let content;
120
+ try {
121
+ content = (0, node_fs_1.readFileSync)(arpEventsPath, 'utf-8');
122
+ }
123
+ catch {
124
+ return { imported: 0, skipped: 0, errors: 0, total: 0 };
125
+ }
126
+ const lines = content.trim().split('\n').filter(Boolean);
127
+ // Build set of already-imported ARP event IDs
128
+ const existingEvents = (0, events_js_1.readEvents)({ count: 10000, source: 'arp' });
129
+ const importedIds = new Set();
130
+ for (const event of existingEvents) {
131
+ const detail = event.detail;
132
+ if (detail?.arpEventId) {
133
+ importedIds.add(String(detail.arpEventId));
134
+ }
135
+ }
136
+ let imported = 0;
137
+ let skipped = 0;
138
+ let errors = 0;
139
+ for (const line of lines) {
140
+ let arpEvent;
141
+ try {
142
+ arpEvent = JSON.parse(line);
143
+ }
144
+ catch {
145
+ errors++;
146
+ continue;
147
+ }
148
+ // Skip already-imported events
149
+ if (importedIds.has(arpEvent.id)) {
150
+ skipped++;
151
+ continue;
152
+ }
153
+ const partial = translateARPEvent(arpEvent, agentName);
154
+ (0, events_js_1.writeEvent)(partial);
155
+ imported++;
156
+ }
157
+ return { imported, skipped, errors, total: lines.length };
158
+ }
159
+ /**
160
+ * Compute stats from ARP events in Shield's log (source === 'arp').
161
+ * Used by shield report to populate runtimeProtection section.
162
+ */
163
+ function getARPStats(since) {
164
+ const events = (0, events_js_1.readEvents)({ source: 'arp', since, count: 10000 });
165
+ const stats = {
166
+ totalEvents: events.length,
167
+ anomalies: 0,
168
+ violations: 0,
169
+ threats: 0,
170
+ processEvents: 0,
171
+ networkEvents: 0,
172
+ filesystemEvents: 0,
173
+ promptEvents: 0,
174
+ enforcements: 0,
175
+ };
176
+ for (const event of events) {
177
+ const detail = event.detail;
178
+ const arpCategory = String(detail?.arpCategory ?? '');
179
+ if (arpCategory === 'anomaly')
180
+ stats.anomalies++;
181
+ if (arpCategory === 'violation')
182
+ stats.violations++;
183
+ if (arpCategory === 'threat')
184
+ stats.threats++;
185
+ if (event.category === 'arp.process')
186
+ stats.processEvents++;
187
+ if (event.category === 'arp.network')
188
+ stats.networkEvents++;
189
+ if (event.category === 'arp.filesystem')
190
+ stats.filesystemEvents++;
191
+ if (event.category === 'arp.prompt')
192
+ stats.promptEvents++;
193
+ if (event.outcome === 'blocked')
194
+ stats.enforcements++;
195
+ }
196
+ return stats;
197
+ }
198
+ //# sourceMappingURL=arp-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arp-bridge.js","sourceRoot":"","sources":["../../src/shield/arp-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Shield adaptive baselines: learn / suggest / protect enforcement flow.
3
+ *
4
+ * Baselines track observed agent behavior over time. The stability
5
+ * algorithm determines when behavior has settled enough to recommend
6
+ * a policy. The developer must explicitly approve before Shield
7
+ * starts enforcing.
8
+ *
9
+ * Storage: ~/.opena2a/shield/baselines/{agent}.json (mode 0o600)
10
+ */
11
+ import type { AgentBaseline } from './types.js';
12
+ /**
13
+ * Get or create a baseline for an agent.
14
+ *
15
+ * Checks the in-memory cache first, then disk, and finally creates
16
+ * a new baseline if none exists.
17
+ */
18
+ export declare function getBaseline(agent: string): AgentBaseline;
19
+ /** List all persisted baselines (loads from disk). */
20
+ export declare function listBaselines(): AgentBaseline[];
21
+ /**
22
+ * Record an observed action from an agent into their baseline.
23
+ *
24
+ * This is the primary entry point for the adaptive enforcement loop.
25
+ * It handles session tracking, new-behavior detection, and stability
26
+ * recomputation.
27
+ */
28
+ export declare function recordAction(agent: string, category: string, target: string): void;
29
+ /**
30
+ * Compute a stability score between 0.0 and 1.0.
31
+ *
32
+ * Stability measures the fraction of recent sessions that had no new
33
+ * behavior (no previously unseen processes, credentials, etc.).
34
+ *
35
+ * Returns 0 until minimum action and session thresholds are met.
36
+ */
37
+ export declare function computeStability(baseline: AgentBaseline): number;
38
+ /**
39
+ * Check whether a baseline should transition phases.
40
+ *
41
+ * - learn -> suggest: stability >= STABILITY_THRESHOLD
42
+ * - suggest -> protect: manual approval only (approvePolicy)
43
+ */
44
+ export declare function checkPhaseTransition(baseline: AgentBaseline): {
45
+ shouldTransition: boolean;
46
+ nextPhase: string;
47
+ reason: string;
48
+ };
49
+ /**
50
+ * Approve the recommended policy for an agent, transitioning
51
+ * from suggest to protect phase.
52
+ */
53
+ export declare function approvePolicy(agent: string): AgentBaseline;
54
+ /** Save a baseline to disk at ~/.opena2a/shield/baselines/{agent}.json. */
55
+ export declare function saveBaseline(baseline: AgentBaseline): void;
56
+ /** Load a baseline from disk. Returns null if not found or corrupted. */
57
+ export declare function loadBaseline(agent: string): AgentBaseline | null;
58
+ //# sourceMappingURL=baselines.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baselines.d.ts","sourceRoot":"","sources":["../../src/shield/baselines.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAaH,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,YAAY,CAAC;AAmF7D;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAaxD;AAED,sDAAsD;AACtD,wBAAgB,aAAa,IAAI,aAAa,EAAE,CAmB/C;AA6BD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,IAAI,CAkEN;AAMD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAuBhE;AAMD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,aAAa,GAAG;IAC7D,gBAAgB,EAAE,OAAO,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB,CA8CA;AAMD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAsB1D;AAuCD,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAW1D;AAED,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAkBhE"}
@@ -0,0 +1,371 @@
1
+ "use strict";
2
+ /**
3
+ * Shield adaptive baselines: learn / suggest / protect enforcement flow.
4
+ *
5
+ * Baselines track observed agent behavior over time. The stability
6
+ * algorithm determines when behavior has settled enough to recommend
7
+ * a policy. The developer must explicitly approve before Shield
8
+ * starts enforcing.
9
+ *
10
+ * Storage: ~/.opena2a/shield/baselines/{agent}.json (mode 0o600)
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.getBaseline = getBaseline;
14
+ exports.listBaselines = listBaselines;
15
+ exports.recordAction = recordAction;
16
+ exports.computeStability = computeStability;
17
+ exports.checkPhaseTransition = checkPhaseTransition;
18
+ exports.approvePolicy = approvePolicy;
19
+ exports.saveBaseline = saveBaseline;
20
+ exports.loadBaseline = loadBaseline;
21
+ const node_fs_1 = require("node:fs");
22
+ const node_os_1 = require("node:os");
23
+ const node_path_1 = require("node:path");
24
+ const types_js_1 = require("./types.js");
25
+ // ---------------------------------------------------------------------------
26
+ // Directory helpers
27
+ // ---------------------------------------------------------------------------
28
+ /** Return the absolute path to the baselines directory. */
29
+ function getBaselinesDir() {
30
+ const dir = (0, node_path_1.join)((0, node_os_1.homedir)(), '.opena2a', 'shield', types_js_1.SHIELD_BASELINES_DIR);
31
+ if (!(0, node_fs_1.existsSync)(dir)) {
32
+ (0, node_fs_1.mkdirSync)(dir, { recursive: true, mode: 0o700 });
33
+ }
34
+ return dir;
35
+ }
36
+ /** Return the path to a specific agent's baseline file. */
37
+ function baselinePath(agent) {
38
+ return (0, node_path_1.join)(getBaselinesDir(), `${agent}.json`);
39
+ }
40
+ // ---------------------------------------------------------------------------
41
+ // In-memory cache (keyed by agent name)
42
+ // ---------------------------------------------------------------------------
43
+ const cache = new Map();
44
+ const sessionStates = new Map();
45
+ // ---------------------------------------------------------------------------
46
+ // Baseline CRUD
47
+ // ---------------------------------------------------------------------------
48
+ /** Create a fresh baseline for an agent. */
49
+ function createBaseline(agent) {
50
+ const now = new Date().toISOString();
51
+ return {
52
+ agent,
53
+ observationStart: now,
54
+ observationEnd: now,
55
+ totalActions: 0,
56
+ totalSessions: 0,
57
+ phase: 'learn',
58
+ stabilityScore: 0,
59
+ lastNewBehaviorAt: null,
60
+ observed: {
61
+ processes: {},
62
+ credentials: {},
63
+ filesystemPaths: {},
64
+ networkHosts: {},
65
+ mcpServers: {},
66
+ },
67
+ recommended: null,
68
+ thresholds: {
69
+ maxProcessesPerHour: 0,
70
+ maxCredentialAccessPerSession: 0,
71
+ maxNewBinariesPerDay: 0,
72
+ },
73
+ };
74
+ }
75
+ /**
76
+ * Get or create a baseline for an agent.
77
+ *
78
+ * Checks the in-memory cache first, then disk, and finally creates
79
+ * a new baseline if none exists.
80
+ */
81
+ function getBaseline(agent) {
82
+ const cached = cache.get(agent);
83
+ if (cached)
84
+ return cached.baseline;
85
+ const loaded = loadBaseline(agent);
86
+ if (loaded) {
87
+ cache.set(agent, { baseline: loaded, lastActionAt: 0 });
88
+ return loaded;
89
+ }
90
+ const fresh = createBaseline(agent);
91
+ cache.set(agent, { baseline: fresh, lastActionAt: 0 });
92
+ return fresh;
93
+ }
94
+ /** List all persisted baselines (loads from disk). */
95
+ function listBaselines() {
96
+ const dir = getBaselinesDir();
97
+ const baselines = [];
98
+ let files;
99
+ try {
100
+ files = (0, node_fs_1.readdirSync)(dir);
101
+ }
102
+ catch {
103
+ return baselines;
104
+ }
105
+ for (const file of files) {
106
+ if (!file.endsWith('.json'))
107
+ continue;
108
+ const agent = file.replace(/\.json$/, '');
109
+ const bl = loadBaseline(agent);
110
+ if (bl)
111
+ baselines.push(bl);
112
+ }
113
+ return baselines;
114
+ }
115
+ // ---------------------------------------------------------------------------
116
+ // Recording actions
117
+ // ---------------------------------------------------------------------------
118
+ /** Map a category string to the corresponding observed bucket key. */
119
+ function categoryToBucket(category) {
120
+ switch (category) {
121
+ case 'process':
122
+ case 'processes':
123
+ return 'processes';
124
+ case 'credential':
125
+ case 'credentials':
126
+ return 'credentials';
127
+ case 'filesystem':
128
+ return 'filesystemPaths';
129
+ case 'network':
130
+ return 'networkHosts';
131
+ case 'mcp':
132
+ case 'mcpServers':
133
+ return 'mcpServers';
134
+ default:
135
+ return null;
136
+ }
137
+ }
138
+ /**
139
+ * Record an observed action from an agent into their baseline.
140
+ *
141
+ * This is the primary entry point for the adaptive enforcement loop.
142
+ * It handles session tracking, new-behavior detection, and stability
143
+ * recomputation.
144
+ */
145
+ function recordAction(agent, category, target) {
146
+ const baseline = getBaseline(agent);
147
+ const now = Date.now();
148
+ const nowIso = new Date(now).toISOString();
149
+ // --- Session tracking ---
150
+ let ss = sessionStates.get(agent);
151
+ if (!ss) {
152
+ ss = {
153
+ lastActionAt: 0,
154
+ currentSessionHadNewBehavior: false,
155
+ recentSessionNewBehavior: [],
156
+ };
157
+ sessionStates.set(agent, ss);
158
+ }
159
+ const elapsed = ss.lastActionAt === 0 ? Infinity : now - ss.lastActionAt;
160
+ if (elapsed >= types_js_1.SESSION_TIMEOUT_MS) {
161
+ // Close previous session if there was one
162
+ if (ss.lastActionAt !== 0) {
163
+ ss.recentSessionNewBehavior.push(ss.currentSessionHadNewBehavior);
164
+ // Keep only the last STABILITY_WINDOW_SESSIONS entries
165
+ if (ss.recentSessionNewBehavior.length > types_js_1.STABILITY_WINDOW_SESSIONS) {
166
+ ss.recentSessionNewBehavior = ss.recentSessionNewBehavior.slice(-types_js_1.STABILITY_WINDOW_SESSIONS);
167
+ }
168
+ }
169
+ // Start a new session
170
+ baseline.totalSessions += 1;
171
+ ss.currentSessionHadNewBehavior = false;
172
+ }
173
+ ss.lastActionAt = now;
174
+ // --- Record the action ---
175
+ baseline.totalActions += 1;
176
+ baseline.observationEnd = nowIso;
177
+ const bucket = categoryToBucket(category);
178
+ if (bucket) {
179
+ const observed = baseline.observed[bucket];
180
+ const isNew = !(target in observed);
181
+ observed[target] = (observed[target] ?? 0) + 1;
182
+ if (isNew) {
183
+ baseline.lastNewBehaviorAt = nowIso;
184
+ ss.currentSessionHadNewBehavior = true;
185
+ }
186
+ }
187
+ // --- Recompute stability ---
188
+ baseline.stabilityScore = computeStability(baseline);
189
+ // --- Auto-transition learn -> suggest ---
190
+ if (baseline.phase === 'learn') {
191
+ const transition = checkPhaseTransition(baseline);
192
+ if (transition.shouldTransition) {
193
+ baseline.phase = transition.nextPhase;
194
+ baseline.recommended = buildRecommendedPolicy(baseline);
195
+ }
196
+ }
197
+ // --- Persist ---
198
+ cache.set(agent, { baseline, lastActionAt: now });
199
+ saveBaseline(baseline);
200
+ }
201
+ // ---------------------------------------------------------------------------
202
+ // Stability computation
203
+ // ---------------------------------------------------------------------------
204
+ /**
205
+ * Compute a stability score between 0.0 and 1.0.
206
+ *
207
+ * Stability measures the fraction of recent sessions that had no new
208
+ * behavior (no previously unseen processes, credentials, etc.).
209
+ *
210
+ * Returns 0 until minimum action and session thresholds are met.
211
+ */
212
+ function computeStability(baseline) {
213
+ if (baseline.totalActions < types_js_1.LEARN_PHASE_MIN_ACTIONS ||
214
+ baseline.totalSessions < types_js_1.LEARN_PHASE_MIN_SESSIONS) {
215
+ return 0;
216
+ }
217
+ const ss = sessionStates.get(baseline.agent);
218
+ if (!ss)
219
+ return 0;
220
+ // Include the current in-progress session in the window
221
+ const sessions = [
222
+ ...ss.recentSessionNewBehavior,
223
+ ss.currentSessionHadNewBehavior,
224
+ ];
225
+ // Take only the last STABILITY_WINDOW_SESSIONS
226
+ const window = sessions.slice(-types_js_1.STABILITY_WINDOW_SESSIONS);
227
+ if (window.length === 0)
228
+ return 0;
229
+ const stableSessions = window.filter((hadNew) => !hadNew).length;
230
+ return stableSessions / window.length;
231
+ }
232
+ // ---------------------------------------------------------------------------
233
+ // Phase transitions
234
+ // ---------------------------------------------------------------------------
235
+ /**
236
+ * Check whether a baseline should transition phases.
237
+ *
238
+ * - learn -> suggest: stability >= STABILITY_THRESHOLD
239
+ * - suggest -> protect: manual approval only (approvePolicy)
240
+ */
241
+ function checkPhaseTransition(baseline) {
242
+ if (baseline.phase === 'learn') {
243
+ if (baseline.totalActions < types_js_1.LEARN_PHASE_MIN_ACTIONS) {
244
+ return {
245
+ shouldTransition: false,
246
+ nextPhase: 'learn',
247
+ reason: `Need ${types_js_1.LEARN_PHASE_MIN_ACTIONS - baseline.totalActions} more actions before stability check`,
248
+ };
249
+ }
250
+ if (baseline.totalSessions < types_js_1.LEARN_PHASE_MIN_SESSIONS) {
251
+ return {
252
+ shouldTransition: false,
253
+ nextPhase: 'learn',
254
+ reason: `Need ${types_js_1.LEARN_PHASE_MIN_SESSIONS - baseline.totalSessions} more sessions before stability check`,
255
+ };
256
+ }
257
+ const stability = computeStability(baseline);
258
+ if (stability >= types_js_1.STABILITY_THRESHOLD) {
259
+ return {
260
+ shouldTransition: true,
261
+ nextPhase: 'suggest',
262
+ reason: `Stability score ${stability.toFixed(2)} >= ${types_js_1.STABILITY_THRESHOLD} threshold`,
263
+ };
264
+ }
265
+ return {
266
+ shouldTransition: false,
267
+ nextPhase: 'learn',
268
+ reason: `Stability score ${stability.toFixed(2)} < ${types_js_1.STABILITY_THRESHOLD} threshold`,
269
+ };
270
+ }
271
+ if (baseline.phase === 'suggest') {
272
+ return {
273
+ shouldTransition: false,
274
+ nextPhase: 'suggest',
275
+ reason: 'Awaiting developer approval to transition to protect',
276
+ };
277
+ }
278
+ // Already in protect phase
279
+ return {
280
+ shouldTransition: false,
281
+ nextPhase: 'protect',
282
+ reason: 'Already in protect phase',
283
+ };
284
+ }
285
+ // ---------------------------------------------------------------------------
286
+ // Policy approval (suggest -> protect)
287
+ // ---------------------------------------------------------------------------
288
+ /**
289
+ * Approve the recommended policy for an agent, transitioning
290
+ * from suggest to protect phase.
291
+ */
292
+ function approvePolicy(agent) {
293
+ const baseline = getBaseline(agent);
294
+ if (baseline.phase !== 'suggest') {
295
+ throw new Error(`Cannot approve policy for agent "${agent}" in phase "${baseline.phase}". ` +
296
+ 'Agent must be in suggest phase.');
297
+ }
298
+ if (!baseline.recommended) {
299
+ baseline.recommended = buildRecommendedPolicy(baseline);
300
+ }
301
+ baseline.phase = 'protect';
302
+ cache.set(agent, {
303
+ baseline,
304
+ lastActionAt: cache.get(agent)?.lastActionAt ?? 0,
305
+ });
306
+ saveBaseline(baseline);
307
+ return baseline;
308
+ }
309
+ // ---------------------------------------------------------------------------
310
+ // Recommended policy builder
311
+ // ---------------------------------------------------------------------------
312
+ /** Build a recommended policy from observed behavior. */
313
+ function buildRecommendedPolicy(baseline) {
314
+ const toAllowList = (observed) => Object.keys(observed);
315
+ return {
316
+ processes: {
317
+ allow: toAllowList(baseline.observed.processes),
318
+ deny: [],
319
+ },
320
+ credentials: {
321
+ allow: toAllowList(baseline.observed.credentials),
322
+ deny: [],
323
+ },
324
+ filesystem: {
325
+ allow: toAllowList(baseline.observed.filesystemPaths),
326
+ deny: [],
327
+ },
328
+ network: {
329
+ allow: toAllowList(baseline.observed.networkHosts),
330
+ deny: [],
331
+ },
332
+ mcpServers: {
333
+ allow: toAllowList(baseline.observed.mcpServers),
334
+ deny: [],
335
+ },
336
+ };
337
+ }
338
+ // ---------------------------------------------------------------------------
339
+ // Persistence
340
+ // ---------------------------------------------------------------------------
341
+ /** Save a baseline to disk at ~/.opena2a/shield/baselines/{agent}.json. */
342
+ function saveBaseline(baseline) {
343
+ const filePath = baselinePath(baseline.agent);
344
+ const data = JSON.stringify(baseline, null, 2) + '\n';
345
+ (0, node_fs_1.writeFileSync)(filePath, data, { encoding: 'utf-8', mode: 0o600 });
346
+ try {
347
+ (0, node_fs_1.chmodSync)(filePath, 0o600);
348
+ }
349
+ catch {
350
+ // Best-effort
351
+ }
352
+ }
353
+ /** Load a baseline from disk. Returns null if not found or corrupted. */
354
+ function loadBaseline(agent) {
355
+ const filePath = baselinePath(agent);
356
+ if (!(0, node_fs_1.existsSync)(filePath))
357
+ return null;
358
+ try {
359
+ const raw = (0, node_fs_1.readFileSync)(filePath, 'utf-8');
360
+ const parsed = JSON.parse(raw);
361
+ // Basic validation
362
+ if (!parsed.agent || typeof parsed.totalActions !== 'number') {
363
+ return null;
364
+ }
365
+ return parsed;
366
+ }
367
+ catch {
368
+ return null;
369
+ }
370
+ }
371
+ //# sourceMappingURL=baselines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baselines.js","sourceRoot":"","sources":["../../src/shield/baselines.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;AAsGH,kCAaC;AAGD,sCAmBC;AAoCD,oCAsEC;AAcD,4CAuBC;AAYD,oDAkDC;AAUD,sCAsBC;AAwCD,oCAWC;AAGD,oCAkBC;AA5bD,qCAOiB;AACjB,qCAAkC;AAClC,yCAAiC;AAGjC,yCAOoB;AAEpB,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,2DAA2D;AAC3D,SAAS,eAAe;IACtB,MAAM,GAAG,GAAG,IAAA,gBAAI,EAAC,IAAA,iBAAO,GAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,+BAAoB,CAAC,CAAC;IACxE,IAAI,CAAC,IAAA,oBAAU,EAAC,GAAG,CAAC,EAAE,CAAC;QACrB,IAAA,mBAAS,EAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,2DAA2D;AAC3D,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,IAAA,gBAAI,EAAC,eAAe,EAAE,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC;AAClD,CAAC;AAED,8EAA8E;AAC9E,wCAAwC;AACxC,8EAA8E;AAE9E,MAAM,KAAK,GAAG,IAAI,GAAG,EAA6D,CAAC;AAiBnF,MAAM,aAAa,GAAG,IAAI,GAAG,EAAwB,CAAC;AAEtD,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,4CAA4C;AAC5C,SAAS,cAAc,CAAC,KAAa;IACnC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO;QACL,KAAK;QACL,gBAAgB,EAAE,GAAG;QACrB,cAAc,EAAE,GAAG;QACnB,YAAY,EAAE,CAAC;QACf,aAAa,EAAE,CAAC;QAChB,KAAK,EAAE,OAAO;QACd,cAAc,EAAE,CAAC;QACjB,iBAAiB,EAAE,IAAI;QACvB,QAAQ,EAAE;YACR,SAAS,EAAE,EAAE;YACb,WAAW,EAAE,EAAE;YACf,eAAe,EAAE,EAAE;YACnB,YAAY,EAAE,EAAE;YAChB,UAAU,EAAE,EAAE;SACf;QACD,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE;YACV,mBAAmB,EAAE,CAAC;YACtB,6BAA6B,EAAE,CAAC;YAChC,oBAAoB,EAAE,CAAC;SACxB;KACF,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAgB,WAAW,CAAC,KAAa;IACvC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC;IAEnC,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;QACxD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACpC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;IACvD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,sDAAsD;AACtD,SAAgB,aAAa;IAC3B,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAoB,EAAE,CAAC;IAEtC,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,IAAA,qBAAW,EAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAS;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC1C,MAAM,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,EAAE;YAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,sEAAsE;AACtE,SAAS,gBAAgB,CACvB,QAAgB;IAEhB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,SAAS,CAAC;QACf,KAAK,WAAW;YACd,OAAO,WAAW,CAAC;QACrB,KAAK,YAAY,CAAC;QAClB,KAAK,aAAa;YAChB,OAAO,aAAa,CAAC;QACvB,KAAK,YAAY;YACf,OAAO,iBAAiB,CAAC;QAC3B,KAAK,SAAS;YACZ,OAAO,cAAc,CAAC;QACxB,KAAK,KAAK,CAAC;QACX,KAAK,YAAY;YACf,OAAO,YAAY,CAAC;QACtB;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,YAAY,CAC1B,KAAa,EACb,QAAgB,EAChB,MAAc;IAEd,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IAE3C,2BAA2B;IAC3B,IAAI,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,EAAE,GAAG;YACH,YAAY,EAAE,CAAC;YACf,4BAA4B,EAAE,KAAK;YACnC,wBAAwB,EAAE,EAAE;SAC7B,CAAC;QACF,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC;IACzE,IAAI,OAAO,IAAI,6BAAkB,EAAE,CAAC;QAClC,0CAA0C;QAC1C,IAAI,EAAE,CAAC,YAAY,KAAK,CAAC,EAAE,CAAC;YAC1B,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC,4BAA4B,CAAC,CAAC;YAClE,uDAAuD;YACvD,IAAI,EAAE,CAAC,wBAAwB,CAAC,MAAM,GAAG,oCAAyB,EAAE,CAAC;gBACnE,EAAE,CAAC,wBAAwB,GAAG,EAAE,CAAC,wBAAwB,CAAC,KAAK,CAC7D,CAAC,oCAAyB,CAC3B,CAAC;YACJ,CAAC;QACH,CAAC;QACD,sBAAsB;QACtB,QAAQ,CAAC,aAAa,IAAI,CAAC,CAAC;QAC5B,EAAE,CAAC,4BAA4B,GAAG,KAAK,CAAC;IAC1C,CAAC;IACD,EAAE,CAAC,YAAY,GAAG,GAAG,CAAC;IAEtB,4BAA4B;IAC5B,QAAQ,CAAC,YAAY,IAAI,CAAC,CAAC;IAC3B,QAAQ,CAAC,cAAc,GAAG,MAAM,CAAC;IAEjC,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC;QAEpC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAE/C,IAAI,KAAK,EAAE,CAAC;YACV,QAAQ,CAAC,iBAAiB,GAAG,MAAM,CAAC;YACpC,EAAE,CAAC,4BAA4B,GAAG,IAAI,CAAC;QACzC,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,QAAQ,CAAC,cAAc,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAErD,2CAA2C;IAC3C,IAAI,QAAQ,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,UAAU,CAAC,gBAAgB,EAAE,CAAC;YAChC,QAAQ,CAAC,KAAK,GAAG,UAAU,CAAC,SAAsB,CAAC;YACnD,QAAQ,CAAC,WAAW,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC;IAClD,YAAY,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC;AAED,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E;;;;;;;GAOG;AACH,SAAgB,gBAAgB,CAAC,QAAuB;IACtD,IACE,QAAQ,CAAC,YAAY,GAAG,kCAAuB;QAC/C,QAAQ,CAAC,aAAa,GAAG,mCAAwB,EACjD,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,CAAC;IAElB,wDAAwD;IACxD,MAAM,QAAQ,GAAG;QACf,GAAG,EAAE,CAAC,wBAAwB;QAC9B,EAAE,CAAC,4BAA4B;KAChC,CAAC;IAEF,+CAA+C;IAC/C,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,oCAAyB,CAAC,CAAC;IAC1D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAElC,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IACjE,OAAO,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;AACxC,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E;;;;;GAKG;AACH,SAAgB,oBAAoB,CAAC,QAAuB;IAK1D,IAAI,QAAQ,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;QAC/B,IAAI,QAAQ,CAAC,YAAY,GAAG,kCAAuB,EAAE,CAAC;YACpD,OAAO;gBACL,gBAAgB,EAAE,KAAK;gBACvB,SAAS,EAAE,OAAO;gBAClB,MAAM,EAAE,QAAQ,kCAAuB,GAAG,QAAQ,CAAC,YAAY,sCAAsC;aACtG,CAAC;QACJ,CAAC;QACD,IAAI,QAAQ,CAAC,aAAa,GAAG,mCAAwB,EAAE,CAAC;YACtD,OAAO;gBACL,gBAAgB,EAAE,KAAK;gBACvB,SAAS,EAAE,OAAO;gBAClB,MAAM,EAAE,QAAQ,mCAAwB,GAAG,QAAQ,CAAC,aAAa,uCAAuC;aACzG,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,SAAS,IAAI,8BAAmB,EAAE,CAAC;YACrC,OAAO;gBACL,gBAAgB,EAAE,IAAI;gBACtB,SAAS,EAAE,SAAS;gBACpB,MAAM,EAAE,mBAAmB,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,8BAAmB,YAAY;aACtF,CAAC;QACJ,CAAC;QACD,OAAO;YACL,gBAAgB,EAAE,KAAK;YACvB,SAAS,EAAE,OAAO;YAClB,MAAM,EAAE,mBAAmB,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,8BAAmB,YAAY;SACrF,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO;YACL,gBAAgB,EAAE,KAAK;YACvB,SAAS,EAAE,SAAS;YACpB,MAAM,EAAE,sDAAsD;SAC/D,CAAC;IACJ,CAAC;IAED,2BAA2B;IAC3B,OAAO;QACL,gBAAgB,EAAE,KAAK;QACvB,SAAS,EAAE,SAAS;QACpB,MAAM,EAAE,0BAA0B;KACnC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,uCAAuC;AACvC,8EAA8E;AAE9E;;;GAGG;AACH,SAAgB,aAAa,CAAC,KAAa;IACzC,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAEpC,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,oCAAoC,KAAK,eAAe,QAAQ,CAAC,KAAK,KAAK;YACzE,iCAAiC,CACpC,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC1B,QAAQ,CAAC,WAAW,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAED,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC;IAC3B,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE;QACf,QAAQ;QACR,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,YAAY,IAAI,CAAC;KAClD,CAAC,CAAC;IACH,YAAY,CAAC,QAAQ,CAAC,CAAC;IAEvB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,8EAA8E;AAC9E,6BAA6B;AAC7B,8EAA8E;AAE9E,yDAAyD;AACzD,SAAS,sBAAsB,CAAC,QAAuB;IACrD,MAAM,WAAW,GAAG,CAAC,QAAgC,EAAY,EAAE,CACjE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAExB,OAAO;QACL,SAAS,EAAE;YACT,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC/C,IAAI,EAAE,EAAE;SACT;QACD,WAAW,EAAE;YACX,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC;YACjD,IAAI,EAAE,EAAE;SACT;QACD,UAAU,EAAE;YACV,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC;YACrD,IAAI,EAAE,EAAE;SACT;QACD,OAAO,EAAE;YACP,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC;YAClD,IAAI,EAAE,EAAE;SACT;QACD,UAAU,EAAE;YACV,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC;YAChD,IAAI,EAAE,EAAE;SACT;KACF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,2EAA2E;AAC3E,SAAgB,YAAY,CAAC,QAAuB;IAClD,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IAEtD,IAAA,uBAAa,EAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAElE,IAAI,CAAC;QACH,IAAA,mBAAS,EAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,SAAgB,YAAY,CAAC,KAAa;IACxC,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAErC,IAAI,CAAC,IAAA,oBAAU,EAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAA,sBAAY,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAkB,CAAC;QAEhD,mBAAmB;QACnB,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,MAAM,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;YAC7D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}