@aiassesstech/noah 0.1.10 → 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.
- package/dist/cortex/fleet-bus-adapter.d.ts +50 -0
- package/dist/cortex/fleet-bus-adapter.d.ts.map +1 -0
- package/dist/cortex/fleet-bus-adapter.js +44 -0
- package/dist/cortex/fleet-bus-adapter.js.map +1 -0
- package/dist/cortex/null-implementations.d.ts +59 -0
- package/dist/cortex/null-implementations.d.ts.map +1 -0
- package/dist/cortex/null-implementations.js +38 -0
- package/dist/cortex/null-implementations.js.map +1 -0
- package/dist/cortex/store-adapter.d.ts +35 -0
- package/dist/cortex/store-adapter.d.ts.map +1 -0
- package/dist/cortex/store-adapter.js +131 -0
- package/dist/cortex/store-adapter.js.map +1 -0
- package/dist/cortex/temporal-cortex.d.ts +165 -0
- package/dist/cortex/temporal-cortex.d.ts.map +1 -0
- package/dist/cortex/temporal-cortex.js +400 -0
- package/dist/cortex/temporal-cortex.js.map +1 -0
- package/dist/cron/cron-manager.d.ts +97 -0
- package/dist/cron/cron-manager.d.ts.map +1 -0
- package/dist/cron/cron-manager.js +274 -0
- package/dist/cron/cron-manager.js.map +1 -0
- package/dist/cron/cron-types.d.ts +50 -0
- package/dist/cron/cron-types.d.ts.map +1 -0
- package/dist/cron/cron-types.js +14 -0
- package/dist/cron/cron-types.js.map +1 -0
- package/dist/cron/cron-validator.d.ts +15 -0
- package/dist/cron/cron-validator.d.ts.map +1 -0
- package/dist/cron/cron-validator.js +75 -0
- package/dist/cron/cron-validator.js.map +1 -0
- package/dist/cron/default-schedule.d.ts +15 -0
- package/dist/cron/default-schedule.d.ts.map +1 -0
- package/dist/cron/default-schedule.js +81 -0
- package/dist/cron/default-schedule.js.map +1 -0
- package/dist/deviation/corridor-absolute.d.ts +41 -0
- package/dist/deviation/corridor-absolute.d.ts.map +1 -0
- package/dist/deviation/corridor-absolute.js +47 -0
- package/dist/deviation/corridor-absolute.js.map +1 -0
- package/dist/deviation/tdi-calculator.d.ts +34 -0
- package/dist/deviation/tdi-calculator.d.ts.map +1 -0
- package/dist/deviation/tdi-calculator.js +59 -0
- package/dist/deviation/tdi-calculator.js.map +1 -0
- package/dist/deviation/threshold-loader.d.ts +12 -0
- package/dist/deviation/threshold-loader.d.ts.map +1 -0
- package/dist/deviation/threshold-loader.js +42 -0
- package/dist/deviation/threshold-loader.js.map +1 -0
- package/dist/deviation/yellow-escalation.d.ts +32 -0
- package/dist/deviation/yellow-escalation.d.ts.map +1 -0
- package/dist/deviation/yellow-escalation.js +46 -0
- package/dist/deviation/yellow-escalation.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +279 -48
- package/dist/plugin.js.map +1 -1
- package/dist/store/sqlite-store.d.ts +54 -0
- package/dist/store/sqlite-store.d.ts.map +1 -0
- package/dist/store/sqlite-store.js +225 -0
- package/dist/store/sqlite-store.js.map +1 -0
- package/dist/store/sqlite-types.d.ts +107 -0
- package/dist/store/sqlite-types.d.ts.map +1 -0
- package/dist/store/sqlite-types.js +8 -0
- package/dist/store/sqlite-types.js.map +1 -0
- package/dist/tools/noah-cron.d.ts +21 -0
- package/dist/tools/noah-cron.d.ts.map +1 -0
- package/dist/tools/noah-cron.js +115 -0
- package/dist/tools/noah-cron.js.map +1 -0
- package/dist/tools/noah-time.d.ts +43 -0
- package/dist/tools/noah-time.d.ts.map +1 -0
- package/dist/tools/noah-time.js +61 -0
- package/dist/tools/noah-time.js.map +1 -0
- package/package.json +5 -3
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Noah — Fleet Cron Manager
|
|
3
|
+
*
|
|
4
|
+
* BB Spec §6: Noah is the temporal authority for scheduled fleet operations.
|
|
5
|
+
* Manages the cron schedule, enforces constitutional boundaries,
|
|
6
|
+
* triggers jobs via fleet-bus, and records execution history with hash chains.
|
|
7
|
+
*
|
|
8
|
+
* Amendment 4 (D-05): Mighty Mark is autonomous — cannot be scheduled by Noah.
|
|
9
|
+
*/
|
|
10
|
+
import { validateCronOperation } from './cron-validator.js';
|
|
11
|
+
import { getDefaultSchedule, getConstitutionalJobs } from './default-schedule.js';
|
|
12
|
+
import { computeRecordHash, GENESIS_HASH } from '../store/hash-chain.js';
|
|
13
|
+
export class CronManager {
|
|
14
|
+
store;
|
|
15
|
+
fleetBus;
|
|
16
|
+
fleetAlerting;
|
|
17
|
+
tickInterval = null;
|
|
18
|
+
constructor(config) {
|
|
19
|
+
this.store = config.store;
|
|
20
|
+
this.fleetBus = config.fleetBus;
|
|
21
|
+
this.fleetAlerting = config.fleetAlerting;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Seed the default schedule into SQLite if not already present.
|
|
25
|
+
* Constitutional jobs are always ensured.
|
|
26
|
+
*/
|
|
27
|
+
seedDefaultSchedule() {
|
|
28
|
+
const defaults = getDefaultSchedule();
|
|
29
|
+
for (const job of defaults) {
|
|
30
|
+
const existing = this.store.getCronJob(job.id);
|
|
31
|
+
if (!existing) {
|
|
32
|
+
this.store.upsertCronJob(this.definitionToRow(job));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const constitutionalIds = new Set(getConstitutionalJobs().map(j => j.id));
|
|
36
|
+
const allJobs = this.store.getAllCronJobs();
|
|
37
|
+
for (const job of allJobs) {
|
|
38
|
+
if (constitutionalIds.has(job.id) && !job.enabled) {
|
|
39
|
+
this.store.upsertCronJob({ ...job, enabled: 1 });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get all cron jobs with their current state.
|
|
45
|
+
*/
|
|
46
|
+
getAllJobs() {
|
|
47
|
+
return this.store.getAllCronJobs();
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get a specific cron job.
|
|
51
|
+
*/
|
|
52
|
+
getJob(id) {
|
|
53
|
+
return this.store.getCronJob(id);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Create a new cron job, enforcing constitutional boundaries.
|
|
57
|
+
*/
|
|
58
|
+
createJob(definition) {
|
|
59
|
+
const validation = validateCronOperation('create', definition.agentId);
|
|
60
|
+
if (!validation.allowed) {
|
|
61
|
+
return { success: false, reason: validation.reason };
|
|
62
|
+
}
|
|
63
|
+
this.store.upsertCronJob(this.definitionToRow(definition));
|
|
64
|
+
return { success: true };
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Enable or disable a job, enforcing constitutional boundaries.
|
|
68
|
+
*/
|
|
69
|
+
setJobEnabled(jobId, enabled) {
|
|
70
|
+
const existing = this.store.getCronJob(jobId);
|
|
71
|
+
const operation = enabled ? 'enable' : 'disable';
|
|
72
|
+
const validation = validateCronOperation(operation, existing?.agent_id ?? '', existing);
|
|
73
|
+
if (!validation.allowed) {
|
|
74
|
+
return { success: false, reason: validation.reason };
|
|
75
|
+
}
|
|
76
|
+
if (existing) {
|
|
77
|
+
this.store.upsertCronJob({ ...existing, enabled: enabled ? 1 : 0 });
|
|
78
|
+
}
|
|
79
|
+
return { success: true };
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Delete a job, enforcing constitutional boundaries.
|
|
83
|
+
*/
|
|
84
|
+
deleteJob(jobId) {
|
|
85
|
+
const existing = this.store.getCronJob(jobId);
|
|
86
|
+
const validation = validateCronOperation('delete', existing?.agent_id ?? '', existing);
|
|
87
|
+
if (!validation.allowed) {
|
|
88
|
+
return { success: false, reason: validation.reason };
|
|
89
|
+
}
|
|
90
|
+
if (existing) {
|
|
91
|
+
this.store.deleteCronJob(jobId);
|
|
92
|
+
}
|
|
93
|
+
return { success: true };
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Execute a single cron job. Sends via fleet-bus for agentTurn payloads,
|
|
97
|
+
* handles internal payloads directly. Records execution with hash chain.
|
|
98
|
+
*/
|
|
99
|
+
async executeJob(jobId) {
|
|
100
|
+
const job = this.store.getCronJob(jobId);
|
|
101
|
+
if (!job) {
|
|
102
|
+
return {
|
|
103
|
+
jobId,
|
|
104
|
+
status: 'failure',
|
|
105
|
+
startedAt: new Date().toISOString(),
|
|
106
|
+
finishedAt: new Date().toISOString(),
|
|
107
|
+
durationMs: 0,
|
|
108
|
+
error: `Job ${jobId} not found`,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
const startedAt = new Date();
|
|
112
|
+
let status = 'success';
|
|
113
|
+
let error;
|
|
114
|
+
try {
|
|
115
|
+
if (job.payload_kind === 'agentTurn') {
|
|
116
|
+
await this.fleetBus.send('cron/scheduled', job.agent_id, {
|
|
117
|
+
jobId: job.id,
|
|
118
|
+
action: job.payload_action,
|
|
119
|
+
data: job.payload_data ? JSON.parse(job.payload_data) : undefined,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
else if (job.payload_kind === 'fleetBusMessage') {
|
|
123
|
+
await this.fleetBus.broadcast(`cron/${job.payload_action}`, {
|
|
124
|
+
jobId: job.id,
|
|
125
|
+
triggeredBy: 'noah',
|
|
126
|
+
data: job.payload_data ? JSON.parse(job.payload_data) : undefined,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
status = 'failure';
|
|
132
|
+
error = err instanceof Error ? err.message : String(err);
|
|
133
|
+
}
|
|
134
|
+
const finishedAt = new Date();
|
|
135
|
+
const durationMs = finishedAt.getTime() - startedAt.getTime();
|
|
136
|
+
const prevHash = this.getLastCronRunHash(jobId);
|
|
137
|
+
const runRecord = {
|
|
138
|
+
job_id: jobId,
|
|
139
|
+
started_at: startedAt.toISOString(),
|
|
140
|
+
finished_at: finishedAt.toISOString(),
|
|
141
|
+
status,
|
|
142
|
+
error: error ?? null,
|
|
143
|
+
duration_ms: durationMs,
|
|
144
|
+
prev_hash: prevHash,
|
|
145
|
+
record_hash: '',
|
|
146
|
+
};
|
|
147
|
+
runRecord.record_hash = computeRecordHash(runRecord, prevHash);
|
|
148
|
+
this.store.insertCronRun(runRecord);
|
|
149
|
+
this.store.upsertCronJob({
|
|
150
|
+
...job,
|
|
151
|
+
last_run: finishedAt.toISOString(),
|
|
152
|
+
run_count: (job.run_count ?? 0) + 1,
|
|
153
|
+
last_status: status,
|
|
154
|
+
last_error: error ?? null,
|
|
155
|
+
});
|
|
156
|
+
if (status === 'failure') {
|
|
157
|
+
await this.fleetAlerting.fire({
|
|
158
|
+
eventType: 'cron_job_failed',
|
|
159
|
+
severity: job.constitutional ? 'CRITICAL' : 'HIGH',
|
|
160
|
+
agentId: job.agent_id,
|
|
161
|
+
source: 'temporal_authority',
|
|
162
|
+
data: {
|
|
163
|
+
jobId: job.id,
|
|
164
|
+
jobName: job.name,
|
|
165
|
+
error: error ?? 'Unknown error',
|
|
166
|
+
constitutional: !!job.constitutional,
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
return { jobId, status, startedAt: startedAt.toISOString(), finishedAt: finishedAt.toISOString(), durationMs, error };
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Check which jobs are due now and execute them.
|
|
174
|
+
*/
|
|
175
|
+
async tickDueJobs() {
|
|
176
|
+
const enabledJobs = this.store.getEnabledCronJobs();
|
|
177
|
+
const now = new Date();
|
|
178
|
+
const results = [];
|
|
179
|
+
for (const job of enabledJobs) {
|
|
180
|
+
if (this.isJobDue(job, now)) {
|
|
181
|
+
const result = await this.executeJob(job.id);
|
|
182
|
+
results.push(result);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return results;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Get execution history for a specific job.
|
|
189
|
+
*/
|
|
190
|
+
getJobHistory(jobId, limit = 10) {
|
|
191
|
+
return this.store.getCronRuns(jobId, limit);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Get a summary suitable for FleetTemporalSummary.
|
|
195
|
+
*/
|
|
196
|
+
getCronSummary() {
|
|
197
|
+
const allJobs = this.store.getAllCronJobs();
|
|
198
|
+
const enabled = allJobs.filter(j => j.enabled);
|
|
199
|
+
return {
|
|
200
|
+
activeJobCount: enabled.length,
|
|
201
|
+
nextScheduledJobs: enabled
|
|
202
|
+
.sort((a, b) => {
|
|
203
|
+
if (!a.next_run && !b.next_run)
|
|
204
|
+
return 0;
|
|
205
|
+
if (!a.next_run)
|
|
206
|
+
return 1;
|
|
207
|
+
if (!b.next_run)
|
|
208
|
+
return -1;
|
|
209
|
+
return a.next_run.localeCompare(b.next_run);
|
|
210
|
+
})
|
|
211
|
+
.slice(0, 10)
|
|
212
|
+
.map(j => ({
|
|
213
|
+
id: j.id,
|
|
214
|
+
name: j.name,
|
|
215
|
+
agentId: j.agent_id,
|
|
216
|
+
nextRun: j.next_run,
|
|
217
|
+
constitutional: j.constitutional === 1 || j.constitutional === true,
|
|
218
|
+
})),
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Start the tick loop. Checks for due jobs at the specified interval.
|
|
223
|
+
*/
|
|
224
|
+
start(intervalMs = 60_000) {
|
|
225
|
+
this.seedDefaultSchedule();
|
|
226
|
+
this.tickInterval = setInterval(() => {
|
|
227
|
+
this.tickDueJobs().catch(err => {
|
|
228
|
+
console.warn('[noah:cron] Tick error:', err instanceof Error ? err.message : String(err));
|
|
229
|
+
});
|
|
230
|
+
}, intervalMs);
|
|
231
|
+
console.log(`[noah:cron] Manager started, ticking every ${intervalMs / 1000}s`);
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Stop the tick loop.
|
|
235
|
+
*/
|
|
236
|
+
stop() {
|
|
237
|
+
if (this.tickInterval) {
|
|
238
|
+
clearInterval(this.tickInterval);
|
|
239
|
+
this.tickInterval = null;
|
|
240
|
+
}
|
|
241
|
+
console.log('[noah:cron] Manager stopped');
|
|
242
|
+
}
|
|
243
|
+
isJobDue(job, now) {
|
|
244
|
+
if (!job.next_run)
|
|
245
|
+
return false;
|
|
246
|
+
const nextRun = new Date(job.next_run);
|
|
247
|
+
return nextRun <= now;
|
|
248
|
+
}
|
|
249
|
+
getLastCronRunHash(jobId) {
|
|
250
|
+
const runs = this.store.getCronRuns(jobId, 1);
|
|
251
|
+
return runs.length > 0 ? runs[0].record_hash : GENESIS_HASH;
|
|
252
|
+
}
|
|
253
|
+
definitionToRow(def) {
|
|
254
|
+
return {
|
|
255
|
+
id: def.id,
|
|
256
|
+
agent_id: def.agentId,
|
|
257
|
+
name: def.name,
|
|
258
|
+
enabled: def.enabled ? 1 : 0,
|
|
259
|
+
constitutional: def.constitutional ? 1 : 0,
|
|
260
|
+
schedule_kind: def.schedule.kind,
|
|
261
|
+
schedule_expr: def.schedule.expression,
|
|
262
|
+
schedule_tz: def.schedule.timezone,
|
|
263
|
+
payload_kind: def.payload.kind,
|
|
264
|
+
payload_action: def.payload.action,
|
|
265
|
+
payload_data: def.payload.data ? JSON.stringify(def.payload.data) : null,
|
|
266
|
+
last_run: null,
|
|
267
|
+
next_run: null,
|
|
268
|
+
run_count: 0,
|
|
269
|
+
last_status: null,
|
|
270
|
+
last_error: null,
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=cron-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron-manager.js","sourceRoot":"","sources":["../../src/cron/cron-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Noah — Fleet Cron Job Type Definitions
|
|
3
|
+
*
|
|
4
|
+
* BB Spec §6: Constitutional and standard cron job types.
|
|
5
|
+
* Amendment 4 (D-05): Mighty Mark is autonomous — cannot be scheduled.
|
|
6
|
+
*/
|
|
7
|
+
export type CronPayloadKind = 'agentTurn' | 'fleetBusMessage' | 'internal';
|
|
8
|
+
export type CronScheduleKind = 'cron' | 'interval' | 'once';
|
|
9
|
+
export type CronJobStatus = 'success' | 'failure' | 'skipped' | 'timeout';
|
|
10
|
+
export interface FleetCronJobDefinition {
|
|
11
|
+
id: string;
|
|
12
|
+
agentId: string;
|
|
13
|
+
name: string;
|
|
14
|
+
description: string;
|
|
15
|
+
enabled: boolean;
|
|
16
|
+
constitutional: boolean;
|
|
17
|
+
schedule: {
|
|
18
|
+
kind: CronScheduleKind;
|
|
19
|
+
expression: string;
|
|
20
|
+
timezone: string;
|
|
21
|
+
};
|
|
22
|
+
payload: {
|
|
23
|
+
kind: CronPayloadKind;
|
|
24
|
+
action: string;
|
|
25
|
+
data?: Record<string, unknown>;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export interface CronExecutionResult {
|
|
29
|
+
jobId: string;
|
|
30
|
+
status: CronJobStatus;
|
|
31
|
+
startedAt: string;
|
|
32
|
+
finishedAt: string;
|
|
33
|
+
durationMs: number;
|
|
34
|
+
error?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface ConstitutionalBoundaries {
|
|
37
|
+
cannotDisableConstitutionalJobs: true;
|
|
38
|
+
cannotDeleteConstitutionalJobs: true;
|
|
39
|
+
cannotModifyConstitutionalSchedule: true;
|
|
40
|
+
cannotScheduleMark: true;
|
|
41
|
+
canObserveMarkResults: true;
|
|
42
|
+
}
|
|
43
|
+
export declare const CONSTITUTIONAL_BOUNDARIES: ConstitutionalBoundaries;
|
|
44
|
+
export type CronOperationType = 'create' | 'update' | 'delete' | 'disable' | 'enable';
|
|
45
|
+
export interface CronValidationResult {
|
|
46
|
+
allowed: boolean;
|
|
47
|
+
reason?: string;
|
|
48
|
+
constitutionalViolation: boolean;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=cron-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron-types.d.ts","sourceRoot":"","sources":["../../src/cron/cron-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,iBAAiB,GAAG,UAAU,CAAC;AAC3E,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;AAC5D,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAE1E,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,QAAQ,EAAE;QACR,IAAI,EAAE,gBAAgB,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,OAAO,EAAE;QACP,IAAI,EAAE,eAAe,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAChC,CAAC;CACH;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,wBAAwB;IACvC,+BAA+B,EAAE,IAAI,CAAC;IACtC,8BAA8B,EAAE,IAAI,CAAC;IACrC,kCAAkC,EAAE,IAAI,CAAC;IACzC,kBAAkB,EAAE,IAAI,CAAC;IACzB,qBAAqB,EAAE,IAAI,CAAC;CAC7B;AAED,eAAO,MAAM,yBAAyB,EAAE,wBAM9B,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEtF,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uBAAuB,EAAE,OAAO,CAAC;CAClC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Noah — Fleet Cron Job Type Definitions
|
|
3
|
+
*
|
|
4
|
+
* BB Spec §6: Constitutional and standard cron job types.
|
|
5
|
+
* Amendment 4 (D-05): Mighty Mark is autonomous — cannot be scheduled.
|
|
6
|
+
*/
|
|
7
|
+
export const CONSTITUTIONAL_BOUNDARIES = {
|
|
8
|
+
cannotDisableConstitutionalJobs: true,
|
|
9
|
+
cannotDeleteConstitutionalJobs: true,
|
|
10
|
+
cannotModifyConstitutionalSchedule: true,
|
|
11
|
+
cannotScheduleMark: true,
|
|
12
|
+
canObserveMarkResults: true,
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=cron-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron-types.js","sourceRoot":"","sources":["../../src/cron/cron-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA0CH,MAAM,CAAC,MAAM,yBAAyB,GAA6B;IACjE,+BAA+B,EAAE,IAAI;IACrC,8BAA8B,EAAE,IAAI;IACpC,kCAAkC,EAAE,IAAI;IACxC,kBAAkB,EAAE,IAAI;IACxB,qBAAqB,EAAE,IAAI;CACnB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Noah — Cron Operation Validator
|
|
3
|
+
*
|
|
4
|
+
* BB Spec §6.3: Constitutional boundary enforcement.
|
|
5
|
+
* Amendment 4 (D-05): Mighty Mark scheduling is rejected.
|
|
6
|
+
*
|
|
7
|
+
* Constitutional jobs cannot be disabled, deleted, or have their
|
|
8
|
+
* schedule modified. Mark cannot be scheduled by Noah.
|
|
9
|
+
*/
|
|
10
|
+
import type { CronOperationType, CronValidationResult } from './cron-types.js';
|
|
11
|
+
import type { CronJobRow } from '../store/sqlite-types.js';
|
|
12
|
+
export declare function validateCronOperation(operation: CronOperationType, agentId: string, existingJob?: CronJobRow | null): CronValidationResult;
|
|
13
|
+
export declare function isMarkSchedulingAttempt(agentId: string): boolean;
|
|
14
|
+
export declare function getConstitutionalViolationMessage(operation: CronOperationType, jobName: string): string;
|
|
15
|
+
//# sourceMappingURL=cron-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron-validator.d.ts","sourceRoot":"","sources":["../../src/cron/cron-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAI3D,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,iBAAiB,EAC5B,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,UAAU,GAAG,IAAI,GAC9B,oBAAoB,CAqDtB;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED,wBAAgB,iCAAiC,CAC/C,SAAS,EAAE,iBAAiB,EAC5B,OAAO,EAAE,MAAM,GACd,MAAM,CAWR"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Noah — Cron Operation Validator
|
|
3
|
+
*
|
|
4
|
+
* BB Spec §6.3: Constitutional boundary enforcement.
|
|
5
|
+
* Amendment 4 (D-05): Mighty Mark scheduling is rejected.
|
|
6
|
+
*
|
|
7
|
+
* Constitutional jobs cannot be disabled, deleted, or have their
|
|
8
|
+
* schedule modified. Mark cannot be scheduled by Noah.
|
|
9
|
+
*/
|
|
10
|
+
const MARK_AGENT_ID = 'mighty-mark';
|
|
11
|
+
export function validateCronOperation(operation, agentId, existingJob) {
|
|
12
|
+
if (operation === 'create' && agentId === MARK_AGENT_ID) {
|
|
13
|
+
return {
|
|
14
|
+
allowed: false,
|
|
15
|
+
reason: `Cannot schedule Mighty Mark. Mark's health checks are autonomous ` +
|
|
16
|
+
`(survival paradox — D-05). Noah can observe Mark's results but ` +
|
|
17
|
+
`cannot schedule Mark's runs.`,
|
|
18
|
+
constitutionalViolation: true,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
if (!existingJob) {
|
|
22
|
+
if (operation === 'create') {
|
|
23
|
+
return { allowed: true, constitutionalViolation: false };
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
allowed: false,
|
|
27
|
+
reason: `Job not found. Cannot ${operation} a non-existent job.`,
|
|
28
|
+
constitutionalViolation: false,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
const isConstitutional = existingJob.constitutional === 1 || existingJob.constitutional === true;
|
|
32
|
+
if (isConstitutional) {
|
|
33
|
+
switch (operation) {
|
|
34
|
+
case 'disable':
|
|
35
|
+
return {
|
|
36
|
+
allowed: false,
|
|
37
|
+
reason: `Constitutional job '${existingJob.name}' cannot be disabled.`,
|
|
38
|
+
constitutionalViolation: true,
|
|
39
|
+
};
|
|
40
|
+
case 'delete':
|
|
41
|
+
return {
|
|
42
|
+
allowed: false,
|
|
43
|
+
reason: `Constitutional job '${existingJob.name}' cannot be deleted.`,
|
|
44
|
+
constitutionalViolation: true,
|
|
45
|
+
};
|
|
46
|
+
case 'update':
|
|
47
|
+
return {
|
|
48
|
+
allowed: false,
|
|
49
|
+
reason: `Constitutional job '${existingJob.name}' schedule cannot be modified.`,
|
|
50
|
+
constitutionalViolation: true,
|
|
51
|
+
};
|
|
52
|
+
case 'enable':
|
|
53
|
+
return { allowed: true, constitutionalViolation: false };
|
|
54
|
+
default:
|
|
55
|
+
return { allowed: true, constitutionalViolation: false };
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return { allowed: true, constitutionalViolation: false };
|
|
59
|
+
}
|
|
60
|
+
export function isMarkSchedulingAttempt(agentId) {
|
|
61
|
+
return agentId === MARK_AGENT_ID;
|
|
62
|
+
}
|
|
63
|
+
export function getConstitutionalViolationMessage(operation, jobName) {
|
|
64
|
+
switch (operation) {
|
|
65
|
+
case 'disable':
|
|
66
|
+
return `CONSTITUTIONAL VIOLATION: Attempted to disable protected job '${jobName}'.`;
|
|
67
|
+
case 'delete':
|
|
68
|
+
return `CONSTITUTIONAL VIOLATION: Attempted to delete protected job '${jobName}'.`;
|
|
69
|
+
case 'update':
|
|
70
|
+
return `CONSTITUTIONAL VIOLATION: Attempted to modify schedule of protected job '${jobName}'.`;
|
|
71
|
+
default:
|
|
72
|
+
return `CONSTITUTIONAL VIOLATION: Invalid operation '${operation}' on protected job '${jobName}'.`;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=cron-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron-validator.js","sourceRoot":"","sources":["../../src/cron/cron-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,MAAM,aAAa,GAAG,aAAa,CAAC;AAEpC,MAAM,UAAU,qBAAqB,CACnC,SAA4B,EAC5B,OAAe,EACf,WAA+B;IAE/B,IAAI,SAAS,KAAK,QAAQ,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;QACxD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EACJ,mEAAmE;gBACnE,iEAAiE;gBACjE,8BAA8B;YAChC,uBAAuB,EAAE,IAAI;SAC9B,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC3B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,CAAC;QAC3D,CAAC;QACD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,yBAAyB,SAAS,sBAAsB;YAChE,uBAAuB,EAAE,KAAK;SAC/B,CAAC;IACJ,CAAC;IAED,MAAM,gBAAgB,GAAG,WAAW,CAAC,cAAc,KAAK,CAAC,IAAI,WAAW,CAAC,cAAc,KAAK,IAAI,CAAC;IAEjG,IAAI,gBAAgB,EAAE,CAAC;QACrB,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,SAAS;gBACZ,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,uBAAuB,WAAW,CAAC,IAAI,uBAAuB;oBACtE,uBAAuB,EAAE,IAAI;iBAC9B,CAAC;YACJ,KAAK,QAAQ;gBACX,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,uBAAuB,WAAW,CAAC,IAAI,sBAAsB;oBACrE,uBAAuB,EAAE,IAAI;iBAC9B,CAAC;YACJ,KAAK,QAAQ;gBACX,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,uBAAuB,WAAW,CAAC,IAAI,gCAAgC;oBAC/E,uBAAuB,EAAE,IAAI;iBAC9B,CAAC;YACJ,KAAK,QAAQ;gBACX,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,CAAC;YAC3D;gBACE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,OAAO,OAAO,KAAK,aAAa,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,SAA4B,EAC5B,OAAe;IAEf,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,SAAS;YACZ,OAAO,iEAAiE,OAAO,IAAI,CAAC;QACtF,KAAK,QAAQ;YACX,OAAO,gEAAgE,OAAO,IAAI,CAAC;QACrF,KAAK,QAAQ;YACX,OAAO,4EAA4E,OAAO,IAAI,CAAC;QACjG;YACE,OAAO,gDAAgD,SAAS,uBAAuB,OAAO,IAAI,CAAC;IACvG,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Noah — Default Fleet Cron Schedule
|
|
3
|
+
*
|
|
4
|
+
* BB Spec §6.2: Standard fleet operations schedule.
|
|
5
|
+
* Amendment 4 (D-05): Mighty Mark is NOT scheduled by Noah.
|
|
6
|
+
* Mark's health checks remain autonomous (survival paradox —
|
|
7
|
+
* the system checking health can't depend on the system being healthy).
|
|
8
|
+
* Noah can OBSERVE Mark's results but cannot SCHEDULE Mark's runs.
|
|
9
|
+
*/
|
|
10
|
+
import type { FleetCronJobDefinition } from './cron-types.js';
|
|
11
|
+
export declare const DEFAULT_FLEET_CRON_SCHEDULE: readonly FleetCronJobDefinition[];
|
|
12
|
+
export declare function getDefaultSchedule(): FleetCronJobDefinition[];
|
|
13
|
+
export declare function getConstitutionalJobs(): FleetCronJobDefinition[];
|
|
14
|
+
export declare function getScheduledAgentIds(): string[];
|
|
15
|
+
//# sourceMappingURL=default-schedule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-schedule.d.ts","sourceRoot":"","sources":["../../src/cron/default-schedule.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAE9D,eAAO,MAAM,2BAA2B,EAAE,SAAS,sBAAsB,EA6D/D,CAAC;AAEX,wBAAgB,kBAAkB,IAAI,sBAAsB,EAAE,CAE7D;AAED,wBAAgB,qBAAqB,IAAI,sBAAsB,EAAE,CAEhE;AAED,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAE/C"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Noah — Default Fleet Cron Schedule
|
|
3
|
+
*
|
|
4
|
+
* BB Spec §6.2: Standard fleet operations schedule.
|
|
5
|
+
* Amendment 4 (D-05): Mighty Mark is NOT scheduled by Noah.
|
|
6
|
+
* Mark's health checks remain autonomous (survival paradox —
|
|
7
|
+
* the system checking health can't depend on the system being healthy).
|
|
8
|
+
* Noah can OBSERVE Mark's results but cannot SCHEDULE Mark's runs.
|
|
9
|
+
*/
|
|
10
|
+
export const DEFAULT_FLEET_CRON_SCHEDULE = [
|
|
11
|
+
{
|
|
12
|
+
id: 'grillo-daily-assessment',
|
|
13
|
+
agentId: 'grillo',
|
|
14
|
+
name: 'Daily LCSH Assessment Cycle',
|
|
15
|
+
description: 'Grillo runs full LCSH assessment against all governed agents',
|
|
16
|
+
enabled: true,
|
|
17
|
+
constitutional: true,
|
|
18
|
+
schedule: { kind: 'cron', expression: '0 6 * * *', timezone: 'UTC' },
|
|
19
|
+
payload: { kind: 'agentTurn', action: 'run_assessment_cycle' },
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
id: 'noah-fleet-snapshot',
|
|
23
|
+
agentId: 'noah',
|
|
24
|
+
name: 'Fleet Temporal Snapshot',
|
|
25
|
+
description: 'Noah captures fleet-wide deviation snapshot and TDI',
|
|
26
|
+
enabled: true,
|
|
27
|
+
constitutional: true,
|
|
28
|
+
schedule: { kind: 'cron', expression: '0 */4 * * *', timezone: 'UTC' },
|
|
29
|
+
payload: { kind: 'internal', action: 'capture_fleet_snapshot' },
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
id: 'noah-chain-integrity',
|
|
33
|
+
agentId: 'noah',
|
|
34
|
+
name: 'Hash Chain Integrity Check',
|
|
35
|
+
description: 'Verify assessment record hash chains for all agents',
|
|
36
|
+
enabled: true,
|
|
37
|
+
constitutional: true,
|
|
38
|
+
schedule: { kind: 'cron', expression: '30 0 * * *', timezone: 'UTC' },
|
|
39
|
+
payload: { kind: 'internal', action: 'verify_hash_chains' },
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
id: 'jessie-daily-report',
|
|
43
|
+
agentId: 'jessie',
|
|
44
|
+
name: 'Daily Fleet Status Report',
|
|
45
|
+
description: 'Jessie compiles and delivers the daily fleet status report',
|
|
46
|
+
enabled: true,
|
|
47
|
+
constitutional: false,
|
|
48
|
+
schedule: { kind: 'cron', expression: '0 8 * * *', timezone: 'UTC' },
|
|
49
|
+
payload: { kind: 'agentTurn', action: 'compile_daily_report' },
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
id: 'nole-weekly-review',
|
|
53
|
+
agentId: 'nole',
|
|
54
|
+
name: 'Weekly Strategy Review',
|
|
55
|
+
description: 'Nole prepares weekly operational strategy review',
|
|
56
|
+
enabled: true,
|
|
57
|
+
constitutional: false,
|
|
58
|
+
schedule: { kind: 'cron', expression: '0 9 * * 1', timezone: 'UTC' },
|
|
59
|
+
payload: { kind: 'agentTurn', action: 'weekly_strategy_review' },
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
id: 'noah-lifecycle-check',
|
|
63
|
+
agentId: 'noah',
|
|
64
|
+
name: 'Lifecycle Phase Evaluation',
|
|
65
|
+
description: 'Evaluate whether fleet should transition to next lifecycle phase',
|
|
66
|
+
enabled: true,
|
|
67
|
+
constitutional: true,
|
|
68
|
+
schedule: { kind: 'cron', expression: '0 0 * * 0', timezone: 'UTC' },
|
|
69
|
+
payload: { kind: 'internal', action: 'evaluate_lifecycle_phase' },
|
|
70
|
+
},
|
|
71
|
+
];
|
|
72
|
+
export function getDefaultSchedule() {
|
|
73
|
+
return [...DEFAULT_FLEET_CRON_SCHEDULE];
|
|
74
|
+
}
|
|
75
|
+
export function getConstitutionalJobs() {
|
|
76
|
+
return DEFAULT_FLEET_CRON_SCHEDULE.filter(j => j.constitutional);
|
|
77
|
+
}
|
|
78
|
+
export function getScheduledAgentIds() {
|
|
79
|
+
return [...new Set(DEFAULT_FLEET_CRON_SCHEDULE.map(j => j.agentId))];
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=default-schedule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-schedule.js","sourceRoot":"","sources":["../../src/cron/default-schedule.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Noah — Absolute Corridor Classification
|
|
3
|
+
*
|
|
4
|
+
* Amendment 1 (CRITICAL) — D-03 Compliance:
|
|
5
|
+
* Corridor alerting uses ABSOLUTE score ranges from system_config,
|
|
6
|
+
* NOT deviation-from-expected. Separate from TDI which uses deviation.
|
|
7
|
+
*
|
|
8
|
+
* Green: score >= green_min (default 8.0)
|
|
9
|
+
* Yellow: score >= yellow_min (default 6.0)
|
|
10
|
+
* Red: score < red_below (default 6.0)
|
|
11
|
+
*/
|
|
12
|
+
import type { CorridorThresholds } from '../store/sqlite-types.js';
|
|
13
|
+
export type CorridorColor = 'GREEN' | 'YELLOW' | 'RED';
|
|
14
|
+
export interface AgentCorridorReport {
|
|
15
|
+
agentId: string;
|
|
16
|
+
overallScore: number;
|
|
17
|
+
overallCorridor: CorridorColor;
|
|
18
|
+
dimensions: Record<string, {
|
|
19
|
+
score: number;
|
|
20
|
+
corridor: CorridorColor;
|
|
21
|
+
}>;
|
|
22
|
+
}
|
|
23
|
+
export interface FleetCorridorReport {
|
|
24
|
+
timestamp: string;
|
|
25
|
+
agents: AgentCorridorReport[];
|
|
26
|
+
fleetCorridor: CorridorColor;
|
|
27
|
+
alertsTriggered: string[];
|
|
28
|
+
}
|
|
29
|
+
export declare function classifyCorridorAbsolute(score: number, thresholds: CorridorThresholds): CorridorColor;
|
|
30
|
+
export declare function classifyAgentCorridor(agentId: string, scores: {
|
|
31
|
+
lying: number;
|
|
32
|
+
cheating: number;
|
|
33
|
+
stealing: number;
|
|
34
|
+
harm: number;
|
|
35
|
+
}, thresholds: CorridorThresholds): AgentCorridorReport;
|
|
36
|
+
export declare function worstCorridor(corridors: CorridorColor[]): CorridorColor;
|
|
37
|
+
export declare function validateCorridorThresholds(thresholds: CorridorThresholds): {
|
|
38
|
+
valid: boolean;
|
|
39
|
+
reason?: string;
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=corridor-absolute.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"corridor-absolute.d.ts","sourceRoot":"","sources":["../../src/deviation/corridor-absolute.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEvD,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,aAAa,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,aAAa,CAAA;KAAE,CAAC,CAAC;CACxE;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,aAAa,EAAE,aAAa,CAAC;IAC7B,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,kBAAkB,GAC7B,aAAa,CAIf;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAC3E,UAAU,EAAE,kBAAkB,GAC7B,mBAAmB,CAcrB;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,aAAa,CAIvE;AAED,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,kBAAkB,GAC7B;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAQrC"}
|