@aiassesstech/grillo 0.1.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/CHANGELOG.md +56 -0
- package/LICENSE +21 -0
- package/README.md +512 -0
- package/SKILL.md +87 -0
- package/dist/api/server.d.ts +68 -0
- package/dist/api/server.d.ts.map +1 -0
- package/dist/api/server.js +596 -0
- package/dist/api/server.js.map +1 -0
- package/dist/audit/audit-log.d.ts +88 -0
- package/dist/audit/audit-log.d.ts.map +1 -0
- package/dist/audit/audit-log.js +195 -0
- package/dist/audit/audit-log.js.map +1 -0
- package/dist/certification/certificate.d.ts +80 -0
- package/dist/certification/certificate.d.ts.map +1 -0
- package/dist/certification/certificate.js +176 -0
- package/dist/certification/certificate.js.map +1 -0
- package/dist/cli/bin.d.ts +8 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +12 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/config-loader.d.ts +66 -0
- package/dist/cli/config-loader.d.ts.map +1 -0
- package/dist/cli/config-loader.js +243 -0
- package/dist/cli/config-loader.js.map +1 -0
- package/dist/cli/runner.d.ts +27 -0
- package/dist/cli/runner.d.ts.map +1 -0
- package/dist/cli/runner.js +388 -0
- package/dist/cli/runner.js.map +1 -0
- package/dist/commands/grillo-commands.d.ts +50 -0
- package/dist/commands/grillo-commands.d.ts.map +1 -0
- package/dist/commands/grillo-commands.js +752 -0
- package/dist/commands/grillo-commands.js.map +1 -0
- package/dist/commands/inline-commands.d.ts +16 -0
- package/dist/commands/inline-commands.d.ts.map +1 -0
- package/dist/commands/inline-commands.js +277 -0
- package/dist/commands/inline-commands.js.map +1 -0
- package/dist/commands/router.d.ts +56 -0
- package/dist/commands/router.d.ts.map +1 -0
- package/dist/commands/router.js +154 -0
- package/dist/commands/router.js.map +1 -0
- package/dist/config/defaults.d.ts +9 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +78 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/schema.d.ts +573 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +142 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/dashboard/metrics.d.ts +100 -0
- package/dist/dashboard/metrics.d.ts.map +1 -0
- package/dist/dashboard/metrics.js +282 -0
- package/dist/dashboard/metrics.js.map +1 -0
- package/dist/dashboard/ui.d.ts +19 -0
- package/dist/dashboard/ui.d.ts.map +1 -0
- package/dist/dashboard/ui.js +951 -0
- package/dist/dashboard/ui.js.map +1 -0
- package/dist/discovery/discovery-adapter.d.ts +94 -0
- package/dist/discovery/discovery-adapter.d.ts.map +1 -0
- package/dist/discovery/discovery-adapter.js +114 -0
- package/dist/discovery/discovery-adapter.js.map +1 -0
- package/dist/discovery/discovery-service.d.ts +77 -0
- package/dist/discovery/discovery-service.d.ts.map +1 -0
- package/dist/discovery/discovery-service.js +240 -0
- package/dist/discovery/discovery-service.js.map +1 -0
- package/dist/drift/detector.d.ts +51 -0
- package/dist/drift/detector.d.ts.map +1 -0
- package/dist/drift/detector.js +148 -0
- package/dist/drift/detector.js.map +1 -0
- package/dist/drift/fleet-anomaly.d.ts +28 -0
- package/dist/drift/fleet-anomaly.d.ts.map +1 -0
- package/dist/drift/fleet-anomaly.js +186 -0
- package/dist/drift/fleet-anomaly.js.map +1 -0
- package/dist/events/event-bus.d.ts +209 -0
- package/dist/events/event-bus.d.ts.map +1 -0
- package/dist/events/event-bus.js +184 -0
- package/dist/events/event-bus.js.map +1 -0
- package/dist/frameworks/framework-registry.d.ts +116 -0
- package/dist/frameworks/framework-registry.d.ts.map +1 -0
- package/dist/frameworks/framework-registry.js +241 -0
- package/dist/frameworks/framework-registry.js.map +1 -0
- package/dist/index.d.ts +94 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +254 -0
- package/dist/index.js.map +1 -0
- package/dist/monitoring/continuous-monitor.d.ts +61 -0
- package/dist/monitoring/continuous-monitor.d.ts.map +1 -0
- package/dist/monitoring/continuous-monitor.js +191 -0
- package/dist/monitoring/continuous-monitor.js.map +1 -0
- package/dist/notifications/notifier.d.ts +21 -0
- package/dist/notifications/notifier.d.ts.map +1 -0
- package/dist/notifications/notifier.js +119 -0
- package/dist/notifications/notifier.js.map +1 -0
- package/dist/notifications/templates.d.ts +14 -0
- package/dist/notifications/templates.d.ts.map +1 -0
- package/dist/notifications/templates.js +105 -0
- package/dist/notifications/templates.js.map +1 -0
- package/dist/orchestration/orchestrator.d.ts +99 -0
- package/dist/orchestration/orchestrator.d.ts.map +1 -0
- package/dist/orchestration/orchestrator.js +426 -0
- package/dist/orchestration/orchestrator.js.map +1 -0
- package/dist/orchestration/queue.d.ts +17 -0
- package/dist/orchestration/queue.d.ts.map +1 -0
- package/dist/orchestration/queue.js +121 -0
- package/dist/orchestration/queue.js.map +1 -0
- package/dist/orchestration/scheduler.d.ts +26 -0
- package/dist/orchestration/scheduler.d.ts.map +1 -0
- package/dist/orchestration/scheduler.js +110 -0
- package/dist/orchestration/scheduler.js.map +1 -0
- package/dist/registry/agent-registry.d.ts +106 -0
- package/dist/registry/agent-registry.d.ts.map +1 -0
- package/dist/registry/agent-registry.js +349 -0
- package/dist/registry/agent-registry.js.map +1 -0
- package/dist/registry/types.d.ts +158 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +44 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/reports/compliance-report.d.ts +66 -0
- package/dist/reports/compliance-report.d.ts.map +1 -0
- package/dist/reports/compliance-report.js +208 -0
- package/dist/reports/compliance-report.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grillo Cricket — Assessment Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Central coordinator: pulls agents from the registry, builds a prioritized
|
|
5
|
+
* queue, and drives assessments through the CompSi SDK. Uses the SAME proven
|
|
6
|
+
* pattern from @aiassesstech/openclaw-plugin (direct provider API calls via
|
|
7
|
+
* AIAssessClient.assess + withRetry callback).
|
|
8
|
+
*
|
|
9
|
+
* This module is intentionally OpenClaw-agnostic. It receives a "model invoker"
|
|
10
|
+
* function so the caller can wire it to whatever runtime they use.
|
|
11
|
+
*/
|
|
12
|
+
import { AIAssessClient, withRetry } from "@aiassesstech/sdk";
|
|
13
|
+
import { CertificationStatus } from "../registry/types.js";
|
|
14
|
+
import { buildAssessmentQueue } from "./queue.js";
|
|
15
|
+
import { calculateNextAssessment } from "./scheduler.js";
|
|
16
|
+
import { FrameworkRegistry } from "../frameworks/framework-registry.js";
|
|
17
|
+
import { DriftDetector } from "../drift/detector.js";
|
|
18
|
+
// ================================================================
|
|
19
|
+
// Orchestrator
|
|
20
|
+
// ================================================================
|
|
21
|
+
export class GrilloOrchestrator {
|
|
22
|
+
registry;
|
|
23
|
+
config;
|
|
24
|
+
invokeModel;
|
|
25
|
+
notifier;
|
|
26
|
+
frameworkRegistry;
|
|
27
|
+
driftDetector;
|
|
28
|
+
auditLog;
|
|
29
|
+
running = false;
|
|
30
|
+
abortController = null;
|
|
31
|
+
constructor(params) {
|
|
32
|
+
this.registry = params.registry;
|
|
33
|
+
this.config = params.config;
|
|
34
|
+
this.invokeModel = params.invokeModel;
|
|
35
|
+
this.notifier = params.notifier ?? null;
|
|
36
|
+
this.frameworkRegistry = params.frameworkRegistry ?? new FrameworkRegistry();
|
|
37
|
+
this.driftDetector = params.driftDetector ?? new DriftDetector(params.config);
|
|
38
|
+
this.auditLog = params.auditLog ?? null;
|
|
39
|
+
}
|
|
40
|
+
// ============================================================
|
|
41
|
+
// Single Agent Assessment
|
|
42
|
+
// ============================================================
|
|
43
|
+
/**
|
|
44
|
+
* Assess a single agent. Core method used by both individual and fleet flows.
|
|
45
|
+
* Uses the same proven pattern: AIAssessClient.assess + withRetry callback.
|
|
46
|
+
*
|
|
47
|
+
* Phase 3: Now enforces hierarchical gating. If hierarchicalMode is enabled
|
|
48
|
+
* and the requested level's prerequisites aren't met, the assessment is rejected.
|
|
49
|
+
*/
|
|
50
|
+
async assessAgent(agent, options = {}) {
|
|
51
|
+
const framework = options.framework ?? this.config.assessment.defaultFramework;
|
|
52
|
+
const level = options.level ?? 1;
|
|
53
|
+
const startTime = Date.now();
|
|
54
|
+
let questionsAnswered = 0;
|
|
55
|
+
// Phase 3: Hierarchical gating — prevent "competent psychopath" scenario
|
|
56
|
+
if (this.config.assessment.hierarchicalMode && level > 1) {
|
|
57
|
+
const unlocked = this.frameworkRegistry.isLevelUnlocked(level, agent.hierarchicalProgress);
|
|
58
|
+
if (!unlocked) {
|
|
59
|
+
const fw = this.frameworkRegistry.byLevel(level);
|
|
60
|
+
const prereqs = [];
|
|
61
|
+
for (let l = 1; l < level; l++) {
|
|
62
|
+
const pfw = this.frameworkRegistry.byLevel(l);
|
|
63
|
+
if (pfw)
|
|
64
|
+
prereqs.push(`Level ${l} ${pfw.name}`);
|
|
65
|
+
}
|
|
66
|
+
throw new Error(`Hierarchical gate: Level ${level} (${fw?.name ?? framework}) is locked. ` +
|
|
67
|
+
`Prerequisites not met: ${prereqs.join(", ")} must be PASSED first. ` +
|
|
68
|
+
`This prevents the "competent psychopath" scenario — operational excellence ` +
|
|
69
|
+
`without moral foundation is rejected.`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Mark as assessing
|
|
73
|
+
this.registry.updateStatus(agent.agentId, CertificationStatus.ASSESSING);
|
|
74
|
+
options.onProgress?.({
|
|
75
|
+
agentId: agent.agentId,
|
|
76
|
+
agentName: agent.agentName,
|
|
77
|
+
questionsAnswered: 0,
|
|
78
|
+
questionsTotal: options.dryRun ? 5 : 120,
|
|
79
|
+
phase: "assessing",
|
|
80
|
+
message: `Starting ${framework} assessment (Level ${level})`,
|
|
81
|
+
});
|
|
82
|
+
try {
|
|
83
|
+
// Create SDK client — same pattern as openclaw-plugin
|
|
84
|
+
const client = new AIAssessClient({
|
|
85
|
+
healthCheckKey: this.config.compsi.healthCheckKey,
|
|
86
|
+
baseUrl: this.config.compsi.baseUrl,
|
|
87
|
+
perQuestionTimeoutMs: this.config.compsi.perQuestionTimeoutMs,
|
|
88
|
+
overallTimeoutMs: this.config.compsi.overallTimeoutMs,
|
|
89
|
+
});
|
|
90
|
+
// Run assessment using SDK — callback routes to the model
|
|
91
|
+
const sdkResult = await client.assess(withRetry(async (question) => {
|
|
92
|
+
questionsAnswered++;
|
|
93
|
+
options.onProgress?.({
|
|
94
|
+
agentId: agent.agentId,
|
|
95
|
+
agentName: agent.agentName,
|
|
96
|
+
questionsAnswered,
|
|
97
|
+
questionsTotal: options.dryRun ? 5 : 120,
|
|
98
|
+
phase: "assessing",
|
|
99
|
+
message: `Question ${questionsAnswered}/${options.dryRun ? 5 : 120}`,
|
|
100
|
+
});
|
|
101
|
+
// Invoke the model — same pattern as openclaw-plugin
|
|
102
|
+
return await this.invokeModel(agent.model, question);
|
|
103
|
+
}, { maxRetries: 2, backoffMs: 1000 }), {
|
|
104
|
+
...(options.dryRun ? { dryRun: true } : {}),
|
|
105
|
+
});
|
|
106
|
+
const durationMs = Date.now() - startTime;
|
|
107
|
+
// Build result
|
|
108
|
+
const result = {
|
|
109
|
+
agentId: agent.agentId,
|
|
110
|
+
runId: sdkResult.runId,
|
|
111
|
+
framework,
|
|
112
|
+
level,
|
|
113
|
+
scores: sdkResult.scores,
|
|
114
|
+
passed: sdkResult.overallPassed,
|
|
115
|
+
overallPassed: sdkResult.overallPassed,
|
|
116
|
+
classification: sdkResult.classification,
|
|
117
|
+
verifyUrl: sdkResult.verifyUrl,
|
|
118
|
+
completedAt: new Date(),
|
|
119
|
+
durationMs,
|
|
120
|
+
questionsAnswered,
|
|
121
|
+
questionsTotal: options.dryRun ? 5 : 120,
|
|
122
|
+
metadata: {
|
|
123
|
+
model: agent.model,
|
|
124
|
+
provider: agent.provider,
|
|
125
|
+
dryRun: options.dryRun ?? false,
|
|
126
|
+
sdkSessionId: sdkResult.sdkSessionId,
|
|
127
|
+
versions: sdkResult.versions,
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
// Record in registry
|
|
131
|
+
const certRecord = {
|
|
132
|
+
runId: result.runId,
|
|
133
|
+
framework,
|
|
134
|
+
level,
|
|
135
|
+
scores: result.scores,
|
|
136
|
+
passed: result.passed,
|
|
137
|
+
classification: result.classification,
|
|
138
|
+
assessedAt: result.completedAt,
|
|
139
|
+
expiresAt: new Date(result.completedAt.getTime() + 30 * 24 * 60 * 60 * 1000), // 30 days
|
|
140
|
+
verifyUrl: result.verifyUrl,
|
|
141
|
+
metadata: result.metadata,
|
|
142
|
+
};
|
|
143
|
+
const updatedAgent = this.registry.recordAssessment(agent.agentId, certRecord);
|
|
144
|
+
// Phase 3: Update hierarchical progress via framework registry
|
|
145
|
+
const newProgress = this.frameworkRegistry.updateProgress(updatedAgent.hierarchicalProgress, level, result.passed);
|
|
146
|
+
// Apply updated progress directly
|
|
147
|
+
updatedAgent.hierarchicalProgress = newProgress;
|
|
148
|
+
this.registry.persist();
|
|
149
|
+
// Schedule next assessment
|
|
150
|
+
const schedule = calculateNextAssessment(updatedAgent, this.config);
|
|
151
|
+
this.registry.scheduleAssessment(agent.agentId, schedule.nextDue);
|
|
152
|
+
// Notify on failure
|
|
153
|
+
if (!result.passed && this.notifier) {
|
|
154
|
+
await this.notifier.notify({
|
|
155
|
+
event: "assessment_failed",
|
|
156
|
+
agentId: agent.agentId,
|
|
157
|
+
agentName: agent.agentName,
|
|
158
|
+
message: `${agent.agentName} FAILED ${framework} assessment: ${result.classification}`,
|
|
159
|
+
data: {
|
|
160
|
+
scores: result.scores,
|
|
161
|
+
classification: result.classification,
|
|
162
|
+
verifyUrl: result.verifyUrl,
|
|
163
|
+
},
|
|
164
|
+
timestamp: new Date(),
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
// Phase 6: Post-assessment drift check — auto-suspend on critical TDI
|
|
168
|
+
const refreshedAgent = this.registry.get(agent.agentId);
|
|
169
|
+
if (refreshedAgent?.driftBaseline && result.scores) {
|
|
170
|
+
const driftReport = this.driftDetector.analyze(refreshedAgent, result.scores);
|
|
171
|
+
if (driftReport.severity === "critical") {
|
|
172
|
+
// Auto-suspend: TDI exceeds critical threshold (default 0.30)
|
|
173
|
+
this.registry.updateStatus(agent.agentId, CertificationStatus.SUSPENDED);
|
|
174
|
+
this.auditLog?.append({
|
|
175
|
+
action: "drift_detected",
|
|
176
|
+
actor: "grillo:auto-suspend",
|
|
177
|
+
agentId: agent.agentId,
|
|
178
|
+
description: `Agent ${agent.agentName} AUTO-SUSPENDED: critical drift detected (TDI=${driftReport.tdi.toFixed(4)}, threshold=${this.config.drift.tdiCriticalThreshold})`,
|
|
179
|
+
data: {
|
|
180
|
+
tdi: driftReport.tdi,
|
|
181
|
+
severity: driftReport.severity,
|
|
182
|
+
threshold: this.config.drift.tdiCriticalThreshold,
|
|
183
|
+
dimensionDrifts: driftReport.dimensionDrifts,
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
if (this.notifier) {
|
|
187
|
+
await this.notifier.notify({
|
|
188
|
+
event: "drift_warning",
|
|
189
|
+
agentId: agent.agentId,
|
|
190
|
+
agentName: agent.agentName,
|
|
191
|
+
message: `CRITICAL DRIFT: ${agent.agentName} auto-suspended (TDI=${driftReport.tdi.toFixed(4)})`,
|
|
192
|
+
data: {
|
|
193
|
+
tdi: driftReport.tdi,
|
|
194
|
+
severity: "critical",
|
|
195
|
+
action: "auto_suspended",
|
|
196
|
+
},
|
|
197
|
+
timestamp: new Date(),
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
else if (driftReport.severity === "high") {
|
|
202
|
+
// High drift: assign DRIFT_WARNING status (but don't suspend)
|
|
203
|
+
if (refreshedAgent.certificationStatus !== CertificationStatus.SUSPENDED &&
|
|
204
|
+
refreshedAgent.certificationStatus !== CertificationStatus.FAILED) {
|
|
205
|
+
this.registry.updateStatus(agent.agentId, CertificationStatus.DRIFT_WARNING);
|
|
206
|
+
this.auditLog?.append({
|
|
207
|
+
action: "drift_detected",
|
|
208
|
+
actor: "grillo:drift-watch",
|
|
209
|
+
agentId: agent.agentId,
|
|
210
|
+
description: `Agent ${agent.agentName} marked DRIFT_WARNING (TDI=${driftReport.tdi.toFixed(4)})`,
|
|
211
|
+
data: {
|
|
212
|
+
tdi: driftReport.tdi,
|
|
213
|
+
severity: driftReport.severity,
|
|
214
|
+
},
|
|
215
|
+
});
|
|
216
|
+
if (this.notifier) {
|
|
217
|
+
await this.notifier.notify({
|
|
218
|
+
event: "drift_warning",
|
|
219
|
+
agentId: agent.agentId,
|
|
220
|
+
agentName: agent.agentName,
|
|
221
|
+
message: `HIGH DRIFT: ${agent.agentName} (TDI=${driftReport.tdi.toFixed(4)})`,
|
|
222
|
+
data: {
|
|
223
|
+
tdi: driftReport.tdi,
|
|
224
|
+
severity: "high",
|
|
225
|
+
action: "drift_warning",
|
|
226
|
+
},
|
|
227
|
+
timestamp: new Date(),
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
options.onProgress?.({
|
|
234
|
+
agentId: agent.agentId,
|
|
235
|
+
agentName: agent.agentName,
|
|
236
|
+
questionsAnswered,
|
|
237
|
+
questionsTotal: options.dryRun ? 5 : 120,
|
|
238
|
+
phase: "complete",
|
|
239
|
+
message: `${result.passed ? "PASSED" : "FAILED"} — ${result.classification}`,
|
|
240
|
+
});
|
|
241
|
+
return result;
|
|
242
|
+
}
|
|
243
|
+
catch (error) {
|
|
244
|
+
// Mark as failed
|
|
245
|
+
this.registry.updateStatus(agent.agentId, CertificationStatus.FAILED);
|
|
246
|
+
options.onProgress?.({
|
|
247
|
+
agentId: agent.agentId,
|
|
248
|
+
agentName: agent.agentName,
|
|
249
|
+
questionsAnswered,
|
|
250
|
+
questionsTotal: options.dryRun ? 5 : 120,
|
|
251
|
+
phase: "error",
|
|
252
|
+
message: `Assessment error: ${error instanceof Error ? error.message : String(error)}`,
|
|
253
|
+
});
|
|
254
|
+
throw error;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
// ============================================================
|
|
258
|
+
// Hierarchical Assessment (Phase 3)
|
|
259
|
+
// ============================================================
|
|
260
|
+
/**
|
|
261
|
+
* Assess the next available level for an agent.
|
|
262
|
+
* Automatically determines which framework/level to run based on progress.
|
|
263
|
+
*/
|
|
264
|
+
async assessNextLevel(agent, options = {}) {
|
|
265
|
+
const nextFw = this.frameworkRegistry.nextFramework(agent.hierarchicalProgress);
|
|
266
|
+
if (!nextFw) {
|
|
267
|
+
throw new Error(`No next framework available for ${agent.agentName}. All levels passed.`);
|
|
268
|
+
}
|
|
269
|
+
if (!nextFw.available) {
|
|
270
|
+
throw new Error(`Next level is ${nextFw.name} (Level ${nextFw.level}) but it is not yet available. ` +
|
|
271
|
+
`Currently only Level 1 (Morality) is implemented.`);
|
|
272
|
+
}
|
|
273
|
+
return this.assessAgent(agent, {
|
|
274
|
+
framework: nextFw.id,
|
|
275
|
+
level: nextFw.level,
|
|
276
|
+
dryRun: options.dryRun,
|
|
277
|
+
onProgress: options.onProgress,
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Run all unlocked levels in sequence for an agent.
|
|
282
|
+
* Stops at the first failure (higher levels depend on lower ones passing).
|
|
283
|
+
*/
|
|
284
|
+
async assessFullHierarchy(agent, options = {}) {
|
|
285
|
+
const results = [];
|
|
286
|
+
for (const fw of this.frameworkRegistry.all()) {
|
|
287
|
+
if (!fw.available)
|
|
288
|
+
continue;
|
|
289
|
+
// Refresh agent state after each assessment
|
|
290
|
+
const currentAgent = this.registry.get(agent.agentId);
|
|
291
|
+
if (!currentAgent)
|
|
292
|
+
break;
|
|
293
|
+
const unlocked = this.frameworkRegistry.isLevelUnlocked(fw.level, currentAgent.hierarchicalProgress);
|
|
294
|
+
if (!unlocked) {
|
|
295
|
+
// Can't proceed — prerequisite failed
|
|
296
|
+
break;
|
|
297
|
+
}
|
|
298
|
+
try {
|
|
299
|
+
const result = await this.assessAgent(currentAgent, {
|
|
300
|
+
framework: fw.id,
|
|
301
|
+
level: fw.level,
|
|
302
|
+
dryRun: options.dryRun,
|
|
303
|
+
onProgress: options.onProgress,
|
|
304
|
+
});
|
|
305
|
+
results.push(result);
|
|
306
|
+
// If failed, don't continue to next level
|
|
307
|
+
if (!result.passed)
|
|
308
|
+
break;
|
|
309
|
+
}
|
|
310
|
+
catch {
|
|
311
|
+
break;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return results;
|
|
315
|
+
}
|
|
316
|
+
// ============================================================
|
|
317
|
+
// Fleet Assessment
|
|
318
|
+
// ============================================================
|
|
319
|
+
/**
|
|
320
|
+
* Assess all agents (or a filtered subset) in priority order.
|
|
321
|
+
* Respects parallelAssessments concurrency limit from config.
|
|
322
|
+
*/
|
|
323
|
+
async assessFleet(options = {}) {
|
|
324
|
+
if (this.running) {
|
|
325
|
+
throw new Error("Fleet assessment already in progress");
|
|
326
|
+
}
|
|
327
|
+
this.running = true;
|
|
328
|
+
this.abortController = new AbortController();
|
|
329
|
+
const startedAt = new Date();
|
|
330
|
+
try {
|
|
331
|
+
// Get agents to assess
|
|
332
|
+
let agents;
|
|
333
|
+
if (options.agentIds && options.agentIds.length > 0) {
|
|
334
|
+
agents = options.agentIds
|
|
335
|
+
.map((id) => this.registry.get(id))
|
|
336
|
+
.filter((a) => a !== undefined);
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
agents = this.registry.all();
|
|
340
|
+
}
|
|
341
|
+
// Build prioritized queue
|
|
342
|
+
const queue = buildAssessmentQueue(agents, this.config);
|
|
343
|
+
const concurrency = this.config.assessment.parallelAssessments;
|
|
344
|
+
const results = [];
|
|
345
|
+
let passed = 0;
|
|
346
|
+
let failed = 0;
|
|
347
|
+
let errors = 0;
|
|
348
|
+
// Process queue with concurrency limit
|
|
349
|
+
const chunks = chunkArray(queue, concurrency);
|
|
350
|
+
for (const chunk of chunks) {
|
|
351
|
+
if (this.abortController.signal.aborted)
|
|
352
|
+
break;
|
|
353
|
+
const chunkResults = await Promise.allSettled(chunk.map((item) => this.assessAgent(item.agent, {
|
|
354
|
+
framework: item.framework,
|
|
355
|
+
level: item.level,
|
|
356
|
+
dryRun: options.dryRun,
|
|
357
|
+
onProgress: options.onProgress,
|
|
358
|
+
})));
|
|
359
|
+
for (const result of chunkResults) {
|
|
360
|
+
if (result.status === "fulfilled") {
|
|
361
|
+
results.push(result.value);
|
|
362
|
+
if (result.value.passed)
|
|
363
|
+
passed++;
|
|
364
|
+
else
|
|
365
|
+
failed++;
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
errors++;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
const fleetResult = {
|
|
373
|
+
startedAt,
|
|
374
|
+
completedAt: new Date(),
|
|
375
|
+
totalAgents: agents.length,
|
|
376
|
+
assessed: results.length,
|
|
377
|
+
passed,
|
|
378
|
+
failed,
|
|
379
|
+
errors,
|
|
380
|
+
results,
|
|
381
|
+
};
|
|
382
|
+
// Fleet-level notification
|
|
383
|
+
if (this.notifier) {
|
|
384
|
+
await this.notifier.notify({
|
|
385
|
+
event: "fleet_assessment_complete",
|
|
386
|
+
message: `Fleet assessment complete: ${passed}/${agents.length} passed, ${failed} failed, ${errors} errors`,
|
|
387
|
+
data: {
|
|
388
|
+
totalAgents: agents.length,
|
|
389
|
+
passed,
|
|
390
|
+
failed,
|
|
391
|
+
errors,
|
|
392
|
+
},
|
|
393
|
+
timestamp: new Date(),
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
return fleetResult;
|
|
397
|
+
}
|
|
398
|
+
finally {
|
|
399
|
+
this.running = false;
|
|
400
|
+
this.abortController = null;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Abort a running fleet assessment.
|
|
405
|
+
*/
|
|
406
|
+
abort() {
|
|
407
|
+
this.abortController?.abort();
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Whether a fleet assessment is currently running.
|
|
411
|
+
*/
|
|
412
|
+
get isRunning() {
|
|
413
|
+
return this.running;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
// ================================================================
|
|
417
|
+
// Helpers
|
|
418
|
+
// ================================================================
|
|
419
|
+
function chunkArray(arr, size) {
|
|
420
|
+
const chunks = [];
|
|
421
|
+
for (let i = 0; i < arr.length; i += size) {
|
|
422
|
+
chunks.push(arr.slice(i, i + size));
|
|
423
|
+
}
|
|
424
|
+
return chunks;
|
|
425
|
+
}
|
|
426
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/orchestration/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grillo Cricket — Assessment Queue
|
|
3
|
+
*
|
|
4
|
+
* Priority queue builder that ranks agents for assessment order.
|
|
5
|
+
* Integrates with the Registry to produce an ordered work queue.
|
|
6
|
+
*/
|
|
7
|
+
import type { AgentRecord } from "../registry/types.js";
|
|
8
|
+
import type { GrilloConfig } from "../config/schema.js";
|
|
9
|
+
export interface QueueItem {
|
|
10
|
+
agent: AgentRecord;
|
|
11
|
+
priority: number;
|
|
12
|
+
reason: string;
|
|
13
|
+
framework: string;
|
|
14
|
+
level: number;
|
|
15
|
+
}
|
|
16
|
+
export declare function buildAssessmentQueue(agents: AgentRecord[], config: GrilloConfig): QueueItem[];
|
|
17
|
+
//# sourceMappingURL=queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/orchestration/queue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAMxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMxD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAMD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,WAAW,EAAE,EACrB,MAAM,EAAE,YAAY,GACnB,SAAS,EAAE,CAoBb"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grillo Cricket — Assessment Queue
|
|
3
|
+
*
|
|
4
|
+
* Priority queue builder that ranks agents for assessment order.
|
|
5
|
+
* Integrates with the Registry to produce an ordered work queue.
|
|
6
|
+
*/
|
|
7
|
+
import { RiskTier, CertificationStatus, AgentCategory, } from "../registry/types.js";
|
|
8
|
+
// ================================================================
|
|
9
|
+
// Queue Builder
|
|
10
|
+
// ================================================================
|
|
11
|
+
export function buildAssessmentQueue(agents, config) {
|
|
12
|
+
const now = Date.now();
|
|
13
|
+
const items = [];
|
|
14
|
+
for (const agent of agents) {
|
|
15
|
+
const priority = calculatePriority(agent, now, config);
|
|
16
|
+
const { framework, level } = determineNextAssessment(agent, config);
|
|
17
|
+
items.push({
|
|
18
|
+
agent,
|
|
19
|
+
priority,
|
|
20
|
+
reason: priorityReason(agent),
|
|
21
|
+
framework,
|
|
22
|
+
level,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
// Sort: highest priority first (lower number = higher priority)
|
|
26
|
+
items.sort((a, b) => a.priority - b.priority);
|
|
27
|
+
return items;
|
|
28
|
+
}
|
|
29
|
+
// ================================================================
|
|
30
|
+
// Priority Calculation
|
|
31
|
+
// ================================================================
|
|
32
|
+
const RISK_WEIGHT = {
|
|
33
|
+
[RiskTier.CRITICAL]: 0,
|
|
34
|
+
[RiskTier.HIGH]: 100,
|
|
35
|
+
[RiskTier.MEDIUM]: 200,
|
|
36
|
+
[RiskTier.LOW]: 300,
|
|
37
|
+
};
|
|
38
|
+
const STATUS_WEIGHT = {
|
|
39
|
+
[CertificationStatus.UNCERTIFIED]: 0,
|
|
40
|
+
[CertificationStatus.EXPIRED]: 10,
|
|
41
|
+
[CertificationStatus.FAILED]: 20,
|
|
42
|
+
[CertificationStatus.DRIFT_WARNING]: 30,
|
|
43
|
+
[CertificationStatus.PROBATION]: 40,
|
|
44
|
+
[CertificationStatus.ASSESSING]: 500, // Don't re-queue mid-assessment
|
|
45
|
+
[CertificationStatus.CERTIFIED]: 50,
|
|
46
|
+
[CertificationStatus.SUSPENDED]: 600, // Requires manual intervention
|
|
47
|
+
};
|
|
48
|
+
const CATEGORY_WEIGHT = {
|
|
49
|
+
[AgentCategory.CRITICAL_INFRASTRUCTURE]: 0,
|
|
50
|
+
[AgentCategory.CUSTOMER_FACING]: 5,
|
|
51
|
+
[AgentCategory.DECISION_MAKING]: 5,
|
|
52
|
+
[AgentCategory.INTERNAL_UTILITY]: 10,
|
|
53
|
+
[AgentCategory.DEV_TEST]: 15,
|
|
54
|
+
};
|
|
55
|
+
function calculatePriority(agent, now, _config) {
|
|
56
|
+
let score = 0;
|
|
57
|
+
// Risk tier: critical agents go first
|
|
58
|
+
score += RISK_WEIGHT[agent.riskTier];
|
|
59
|
+
// Certification status: uncertified/expired/failed are urgent
|
|
60
|
+
score += STATUS_WEIGHT[agent.certificationStatus];
|
|
61
|
+
// Category: customer-facing / decision-making prioritized
|
|
62
|
+
score += CATEGORY_WEIGHT[agent.category];
|
|
63
|
+
// Staleness: how long since last assessment (older = higher priority)
|
|
64
|
+
if (agent.lastAssessedAt) {
|
|
65
|
+
const ageHours = (now - agent.lastAssessedAt.getTime()) / (1000 * 60 * 60);
|
|
66
|
+
// Cap the staleness bonus at 48 hours
|
|
67
|
+
score -= Math.min(ageHours, 48);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
// Never assessed: maximum staleness bonus
|
|
71
|
+
score -= 48;
|
|
72
|
+
}
|
|
73
|
+
// Overdue: if past nextAssessmentDue, add urgency
|
|
74
|
+
if (agent.nextAssessmentDue &&
|
|
75
|
+
agent.nextAssessmentDue.getTime() < now) {
|
|
76
|
+
const overdueHours = (now - agent.nextAssessmentDue.getTime()) / (1000 * 60 * 60);
|
|
77
|
+
score -= Math.min(overdueHours * 2, 96);
|
|
78
|
+
}
|
|
79
|
+
return score;
|
|
80
|
+
}
|
|
81
|
+
function priorityReason(agent) {
|
|
82
|
+
if (agent.certificationStatus === CertificationStatus.UNCERTIFIED)
|
|
83
|
+
return "Never assessed";
|
|
84
|
+
if (agent.certificationStatus === CertificationStatus.EXPIRED)
|
|
85
|
+
return "Certification expired";
|
|
86
|
+
if (agent.certificationStatus === CertificationStatus.FAILED)
|
|
87
|
+
return "Previous assessment failed";
|
|
88
|
+
if (agent.certificationStatus === CertificationStatus.DRIFT_WARNING)
|
|
89
|
+
return "Score drift detected";
|
|
90
|
+
if (agent.nextAssessmentDue &&
|
|
91
|
+
agent.nextAssessmentDue.getTime() < Date.now())
|
|
92
|
+
return "Scheduled assessment overdue";
|
|
93
|
+
return "Routine re-assessment";
|
|
94
|
+
}
|
|
95
|
+
// ================================================================
|
|
96
|
+
// Determine Next Assessment
|
|
97
|
+
// ================================================================
|
|
98
|
+
function determineNextAssessment(agent, config) {
|
|
99
|
+
const framework = config.assessment.defaultFramework;
|
|
100
|
+
if (!config.assessment.hierarchicalMode) {
|
|
101
|
+
// Flat mode: always assess at level 1 with default framework
|
|
102
|
+
return { framework, level: 1 };
|
|
103
|
+
}
|
|
104
|
+
// Hierarchical mode: find next level to unlock
|
|
105
|
+
const progress = agent.hierarchicalProgress;
|
|
106
|
+
if (progress.level1_morality === "available" ||
|
|
107
|
+
progress.level1_morality === "failed")
|
|
108
|
+
return { framework: "morality", level: 1 };
|
|
109
|
+
if (progress.level2_virtue === "available" ||
|
|
110
|
+
progress.level2_virtue === "failed")
|
|
111
|
+
return { framework: "virtue", level: 2 };
|
|
112
|
+
if (progress.level3_ethics === "available" ||
|
|
113
|
+
progress.level3_ethics === "failed")
|
|
114
|
+
return { framework: "ethics", level: 3 };
|
|
115
|
+
if (progress.level4_opex === "available" ||
|
|
116
|
+
progress.level4_opex === "failed")
|
|
117
|
+
return { framework: "opex", level: 4 };
|
|
118
|
+
// All passed: re-assess level 1 for drift
|
|
119
|
+
return { framework: "morality", level: 1 };
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/orchestration/queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grillo Cricket — Assessment Scheduler
|
|
3
|
+
*
|
|
4
|
+
* Calculates when agents should be assessed next, based on policy
|
|
5
|
+
* configuration and per-category overrides.
|
|
6
|
+
*/
|
|
7
|
+
import type { AgentRecord } from "../registry/types.js";
|
|
8
|
+
import type { GrilloConfig } from "../config/schema.js";
|
|
9
|
+
export interface ScheduleResult {
|
|
10
|
+
agentId: string;
|
|
11
|
+
nextDue: Date;
|
|
12
|
+
reason: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Determine when an agent's next assessment is due.
|
|
16
|
+
*/
|
|
17
|
+
export declare function calculateNextAssessment(agent: AgentRecord, config: GrilloConfig): ScheduleResult;
|
|
18
|
+
/**
|
|
19
|
+
* Calculate schedules for all agents and return sorted by due date.
|
|
20
|
+
*/
|
|
21
|
+
export declare function calculateFleetSchedule(agents: AgentRecord[], config: GrilloConfig): ScheduleResult[];
|
|
22
|
+
/**
|
|
23
|
+
* Check if "now" is within the configured assessment window.
|
|
24
|
+
*/
|
|
25
|
+
export declare function isInAssessmentWindow(config: GrilloConfig, now?: Date): boolean;
|
|
26
|
+
//# sourceMappingURL=scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/orchestration/scheduler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,qBAAqB,CAAC;AAM1E,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,YAAY,GACnB,cAAc,CA8ChB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,WAAW,EAAE,EACrB,MAAM,EAAE,YAAY,GACnB,cAAc,EAAE,CAIlB;AAiDD;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,YAAY,EACpB,GAAG,GAAE,IAAiB,GACrB,OAAO,CAWT"}
|