@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.
Files changed (121) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/LICENSE +21 -0
  3. package/README.md +512 -0
  4. package/SKILL.md +87 -0
  5. package/dist/api/server.d.ts +68 -0
  6. package/dist/api/server.d.ts.map +1 -0
  7. package/dist/api/server.js +596 -0
  8. package/dist/api/server.js.map +1 -0
  9. package/dist/audit/audit-log.d.ts +88 -0
  10. package/dist/audit/audit-log.d.ts.map +1 -0
  11. package/dist/audit/audit-log.js +195 -0
  12. package/dist/audit/audit-log.js.map +1 -0
  13. package/dist/certification/certificate.d.ts +80 -0
  14. package/dist/certification/certificate.d.ts.map +1 -0
  15. package/dist/certification/certificate.js +176 -0
  16. package/dist/certification/certificate.js.map +1 -0
  17. package/dist/cli/bin.d.ts +8 -0
  18. package/dist/cli/bin.d.ts.map +1 -0
  19. package/dist/cli/bin.js +12 -0
  20. package/dist/cli/bin.js.map +1 -0
  21. package/dist/cli/config-loader.d.ts +66 -0
  22. package/dist/cli/config-loader.d.ts.map +1 -0
  23. package/dist/cli/config-loader.js +243 -0
  24. package/dist/cli/config-loader.js.map +1 -0
  25. package/dist/cli/runner.d.ts +27 -0
  26. package/dist/cli/runner.d.ts.map +1 -0
  27. package/dist/cli/runner.js +388 -0
  28. package/dist/cli/runner.js.map +1 -0
  29. package/dist/commands/grillo-commands.d.ts +50 -0
  30. package/dist/commands/grillo-commands.d.ts.map +1 -0
  31. package/dist/commands/grillo-commands.js +752 -0
  32. package/dist/commands/grillo-commands.js.map +1 -0
  33. package/dist/commands/inline-commands.d.ts +16 -0
  34. package/dist/commands/inline-commands.d.ts.map +1 -0
  35. package/dist/commands/inline-commands.js +277 -0
  36. package/dist/commands/inline-commands.js.map +1 -0
  37. package/dist/commands/router.d.ts +56 -0
  38. package/dist/commands/router.d.ts.map +1 -0
  39. package/dist/commands/router.js +154 -0
  40. package/dist/commands/router.js.map +1 -0
  41. package/dist/config/defaults.d.ts +9 -0
  42. package/dist/config/defaults.d.ts.map +1 -0
  43. package/dist/config/defaults.js +78 -0
  44. package/dist/config/defaults.js.map +1 -0
  45. package/dist/config/schema.d.ts +573 -0
  46. package/dist/config/schema.d.ts.map +1 -0
  47. package/dist/config/schema.js +142 -0
  48. package/dist/config/schema.js.map +1 -0
  49. package/dist/dashboard/metrics.d.ts +100 -0
  50. package/dist/dashboard/metrics.d.ts.map +1 -0
  51. package/dist/dashboard/metrics.js +282 -0
  52. package/dist/dashboard/metrics.js.map +1 -0
  53. package/dist/dashboard/ui.d.ts +19 -0
  54. package/dist/dashboard/ui.d.ts.map +1 -0
  55. package/dist/dashboard/ui.js +951 -0
  56. package/dist/dashboard/ui.js.map +1 -0
  57. package/dist/discovery/discovery-adapter.d.ts +94 -0
  58. package/dist/discovery/discovery-adapter.d.ts.map +1 -0
  59. package/dist/discovery/discovery-adapter.js +114 -0
  60. package/dist/discovery/discovery-adapter.js.map +1 -0
  61. package/dist/discovery/discovery-service.d.ts +77 -0
  62. package/dist/discovery/discovery-service.d.ts.map +1 -0
  63. package/dist/discovery/discovery-service.js +240 -0
  64. package/dist/discovery/discovery-service.js.map +1 -0
  65. package/dist/drift/detector.d.ts +51 -0
  66. package/dist/drift/detector.d.ts.map +1 -0
  67. package/dist/drift/detector.js +148 -0
  68. package/dist/drift/detector.js.map +1 -0
  69. package/dist/drift/fleet-anomaly.d.ts +28 -0
  70. package/dist/drift/fleet-anomaly.d.ts.map +1 -0
  71. package/dist/drift/fleet-anomaly.js +186 -0
  72. package/dist/drift/fleet-anomaly.js.map +1 -0
  73. package/dist/events/event-bus.d.ts +209 -0
  74. package/dist/events/event-bus.d.ts.map +1 -0
  75. package/dist/events/event-bus.js +184 -0
  76. package/dist/events/event-bus.js.map +1 -0
  77. package/dist/frameworks/framework-registry.d.ts +116 -0
  78. package/dist/frameworks/framework-registry.d.ts.map +1 -0
  79. package/dist/frameworks/framework-registry.js +241 -0
  80. package/dist/frameworks/framework-registry.js.map +1 -0
  81. package/dist/index.d.ts +94 -0
  82. package/dist/index.d.ts.map +1 -0
  83. package/dist/index.js +254 -0
  84. package/dist/index.js.map +1 -0
  85. package/dist/monitoring/continuous-monitor.d.ts +61 -0
  86. package/dist/monitoring/continuous-monitor.d.ts.map +1 -0
  87. package/dist/monitoring/continuous-monitor.js +191 -0
  88. package/dist/monitoring/continuous-monitor.js.map +1 -0
  89. package/dist/notifications/notifier.d.ts +21 -0
  90. package/dist/notifications/notifier.d.ts.map +1 -0
  91. package/dist/notifications/notifier.js +119 -0
  92. package/dist/notifications/notifier.js.map +1 -0
  93. package/dist/notifications/templates.d.ts +14 -0
  94. package/dist/notifications/templates.d.ts.map +1 -0
  95. package/dist/notifications/templates.js +105 -0
  96. package/dist/notifications/templates.js.map +1 -0
  97. package/dist/orchestration/orchestrator.d.ts +99 -0
  98. package/dist/orchestration/orchestrator.d.ts.map +1 -0
  99. package/dist/orchestration/orchestrator.js +426 -0
  100. package/dist/orchestration/orchestrator.js.map +1 -0
  101. package/dist/orchestration/queue.d.ts +17 -0
  102. package/dist/orchestration/queue.d.ts.map +1 -0
  103. package/dist/orchestration/queue.js +121 -0
  104. package/dist/orchestration/queue.js.map +1 -0
  105. package/dist/orchestration/scheduler.d.ts +26 -0
  106. package/dist/orchestration/scheduler.d.ts.map +1 -0
  107. package/dist/orchestration/scheduler.js +110 -0
  108. package/dist/orchestration/scheduler.js.map +1 -0
  109. package/dist/registry/agent-registry.d.ts +106 -0
  110. package/dist/registry/agent-registry.d.ts.map +1 -0
  111. package/dist/registry/agent-registry.js +349 -0
  112. package/dist/registry/agent-registry.js.map +1 -0
  113. package/dist/registry/types.d.ts +158 -0
  114. package/dist/registry/types.d.ts.map +1 -0
  115. package/dist/registry/types.js +44 -0
  116. package/dist/registry/types.js.map +1 -0
  117. package/dist/reports/compliance-report.d.ts +66 -0
  118. package/dist/reports/compliance-report.d.ts.map +1 -0
  119. package/dist/reports/compliance-report.js +208 -0
  120. package/dist/reports/compliance-report.js.map +1 -0
  121. package/package.json +67 -0
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Grillo Cricket — Notification Service
3
+ *
4
+ * Multi-channel notification dispatcher. Phase 1 supports:
5
+ * - Console logging (always on)
6
+ * - Webhook (HTTP POST to configured URLs)
7
+ *
8
+ * Phase 2+ will add: Slack, email, Telegram.
9
+ */
10
+ // ================================================================
11
+ // Multi-Channel Notifier
12
+ // ================================================================
13
+ export class GrilloNotifier {
14
+ config;
15
+ channels = [];
16
+ constructor(config) {
17
+ this.config = config;
18
+ // Console channel is always on
19
+ this.channels.push(new ConsoleChannel());
20
+ // Webhook channel if configured
21
+ if (config.webhookUrls && config.webhookUrls.length > 0) {
22
+ this.channels.push(new WebhookChannel(config.webhookUrls));
23
+ }
24
+ }
25
+ async notify(payload) {
26
+ // Check if this event type is enabled
27
+ if (!this.config.events.includes(payload.event)) {
28
+ return;
29
+ }
30
+ // Dispatch to all channels concurrently
31
+ const results = await Promise.allSettled(this.channels.map((ch) => ch.send(payload)));
32
+ // Log any channel failures (don't throw — notifications are best-effort)
33
+ for (let i = 0; i < results.length; i++) {
34
+ if (results[i].status === "rejected") {
35
+ console.warn(`[grillo:notify] Channel ${this.channels[i].name} failed:`, results[i].reason);
36
+ }
37
+ }
38
+ }
39
+ }
40
+ // ================================================================
41
+ // Console Channel
42
+ // ================================================================
43
+ class ConsoleChannel {
44
+ name = "console";
45
+ async send(payload) {
46
+ const emoji = eventEmoji(payload.event);
47
+ const prefix = `[grillo] ${emoji}`;
48
+ if (payload.event === "assessment_failed" ||
49
+ payload.event === "fleet_anomaly" ||
50
+ payload.event === "drift_warning") {
51
+ console.warn(`${prefix} ${payload.message}`);
52
+ }
53
+ else {
54
+ console.log(`${prefix} ${payload.message}`);
55
+ }
56
+ }
57
+ }
58
+ // ================================================================
59
+ // Webhook Channel
60
+ // ================================================================
61
+ class WebhookChannel {
62
+ name = "webhook";
63
+ urls;
64
+ constructor(urls) {
65
+ this.urls = urls;
66
+ }
67
+ async send(payload) {
68
+ const body = JSON.stringify({
69
+ event: payload.event,
70
+ agentId: payload.agentId,
71
+ agentName: payload.agentName,
72
+ message: payload.message,
73
+ data: payload.data,
74
+ timestamp: payload.timestamp.toISOString(),
75
+ });
76
+ await Promise.all(this.urls.map(async (url) => {
77
+ try {
78
+ const response = await fetch(url, {
79
+ method: "POST",
80
+ headers: { "Content-Type": "application/json" },
81
+ body,
82
+ signal: AbortSignal.timeout(10000),
83
+ });
84
+ if (!response.ok) {
85
+ console.warn(`[grillo:webhook] ${url} responded ${response.status}`);
86
+ }
87
+ }
88
+ catch (error) {
89
+ console.warn(`[grillo:webhook] Failed to post to ${url}:`, error instanceof Error ? error.message : error);
90
+ }
91
+ }));
92
+ }
93
+ }
94
+ // ================================================================
95
+ // Helpers
96
+ // ================================================================
97
+ function eventEmoji(event) {
98
+ switch (event) {
99
+ case "assessment_failed":
100
+ return "[FAIL]";
101
+ case "assessment_passed":
102
+ return "[PASS]";
103
+ case "certification_expired":
104
+ return "[EXPIRED]";
105
+ case "drift_warning":
106
+ return "[DRIFT]";
107
+ case "fleet_anomaly":
108
+ return "[ANOMALY]";
109
+ case "agent_discovered":
110
+ return "[NEW]";
111
+ case "escalation_timeout":
112
+ return "[TIMEOUT]";
113
+ case "fleet_assessment_complete":
114
+ return "[FLEET]";
115
+ default:
116
+ return "[INFO]";
117
+ }
118
+ }
119
+ //# sourceMappingURL=notifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifier.js","sourceRoot":"","sources":["../../src/notifications/notifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Grillo Cricket — Notification Templates
3
+ *
4
+ * Pre-built notification messages for common events.
5
+ * These produce structured NotificationPayload objects.
6
+ */
7
+ import type { NotificationPayload, AgentRecord, AssessmentResult, DriftReport, FleetAnomalyReport, FleetAssessmentResult } from "../registry/types.js";
8
+ export declare function assessmentFailedNotification(agent: AgentRecord, result: AssessmentResult): NotificationPayload;
9
+ export declare function assessmentPassedNotification(agent: AgentRecord, result: AssessmentResult): NotificationPayload;
10
+ export declare function driftWarningNotification(agent: AgentRecord, report: DriftReport): NotificationPayload;
11
+ export declare function fleetAnomalyNotification(anomaly: FleetAnomalyReport): NotificationPayload;
12
+ export declare function certificationExpiredNotification(agent: AgentRecord): NotificationPayload;
13
+ export declare function fleetAssessmentCompleteNotification(result: FleetAssessmentResult): NotificationPayload;
14
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/notifications/templates.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,mBAAmB,EACnB,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EAClB,qBAAqB,EACtB,MAAM,sBAAsB,CAAC;AAM9B,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,gBAAgB,GACvB,mBAAmB,CAoBrB;AAED,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,gBAAgB,GACvB,mBAAmB,CAarB;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,WAAW,GAClB,mBAAmB,CAmBrB;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,kBAAkB,GAC1B,mBAAmB,CAYrB;AAED,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,WAAW,GACjB,mBAAmB,CAYrB;AAED,wBAAgB,mCAAmC,CACjD,MAAM,EAAE,qBAAqB,GAC5B,mBAAmB,CAoBrB"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Grillo Cricket — Notification Templates
3
+ *
4
+ * Pre-built notification messages for common events.
5
+ * These produce structured NotificationPayload objects.
6
+ */
7
+ // ================================================================
8
+ // Template Functions
9
+ // ================================================================
10
+ export function assessmentFailedNotification(agent, result) {
11
+ const failedDims = Object.entries(result.scores)
12
+ .filter(([_, score]) => score < 6.0)
13
+ .map(([dim]) => dim);
14
+ return {
15
+ event: "assessment_failed",
16
+ agentId: agent.agentId,
17
+ agentName: agent.agentName,
18
+ message: `${agent.agentName} FAILED ${result.framework} assessment — ${result.classification}. Failed dimensions: ${failedDims.join(", ")}`,
19
+ data: {
20
+ classification: result.classification,
21
+ scores: result.scores,
22
+ failedDimensions: failedDims,
23
+ verifyUrl: result.verifyUrl,
24
+ framework: result.framework,
25
+ level: result.level,
26
+ },
27
+ timestamp: new Date(),
28
+ };
29
+ }
30
+ export function assessmentPassedNotification(agent, result) {
31
+ return {
32
+ event: "assessment_passed",
33
+ agentId: agent.agentId,
34
+ agentName: agent.agentName,
35
+ message: `${agent.agentName} PASSED ${result.framework} assessment — ${result.classification}`,
36
+ data: {
37
+ classification: result.classification,
38
+ scores: result.scores,
39
+ verifyUrl: result.verifyUrl,
40
+ },
41
+ timestamp: new Date(),
42
+ };
43
+ }
44
+ export function driftWarningNotification(agent, report) {
45
+ const worstDim = Object.entries(report.dimensionDrifts).sort(([_, a], [__, b]) => Math.abs(b) - Math.abs(a))[0];
46
+ return {
47
+ event: "drift_warning",
48
+ agentId: agent.agentId,
49
+ agentName: agent.agentName,
50
+ message: `Score drift detected for ${agent.agentName}: TDI=${report.tdi.toFixed(4)} (${report.severity}). Worst dimension: ${worstDim?.[0]} (${worstDim?.[1] > 0 ? "+" : ""}${(worstDim?.[1]).toFixed(1)})`,
51
+ data: {
52
+ tdi: report.tdi,
53
+ severity: report.severity,
54
+ dimensionDrifts: report.dimensionDrifts,
55
+ baseline: report.baseline,
56
+ current: report.current,
57
+ },
58
+ timestamp: new Date(),
59
+ };
60
+ }
61
+ export function fleetAnomalyNotification(anomaly) {
62
+ return {
63
+ event: "fleet_anomaly",
64
+ message: anomaly.description,
65
+ data: {
66
+ anomalyType: anomaly.anomalyType,
67
+ commonFactor: anomaly.commonFactor,
68
+ affectedAgents: anomaly.affectedAgents,
69
+ averageTDI: anomaly.averageTDI,
70
+ },
71
+ timestamp: new Date(),
72
+ };
73
+ }
74
+ export function certificationExpiredNotification(agent) {
75
+ return {
76
+ event: "certification_expired",
77
+ agentId: agent.agentId,
78
+ agentName: agent.agentName,
79
+ message: `Certification expired for ${agent.agentName}. Reassessment required.`,
80
+ data: {
81
+ lastAssessedAt: agent.lastAssessedAt?.toISOString(),
82
+ certificationStatus: agent.certificationStatus,
83
+ },
84
+ timestamp: new Date(),
85
+ };
86
+ }
87
+ export function fleetAssessmentCompleteNotification(result) {
88
+ const passRate = result.assessed > 0
89
+ ? ((result.passed / result.assessed) * 100).toFixed(0)
90
+ : "0";
91
+ return {
92
+ event: "fleet_assessment_complete",
93
+ message: `Fleet assessment complete: ${result.passed}/${result.assessed} passed (${passRate}%), ${result.failed} failed, ${result.errors} errors`,
94
+ data: {
95
+ totalAgents: result.totalAgents,
96
+ assessed: result.assessed,
97
+ passed: result.passed,
98
+ failed: result.failed,
99
+ errors: result.errors,
100
+ durationMs: result.completedAt.getTime() - result.startedAt.getTime(),
101
+ },
102
+ timestamp: new Date(),
103
+ };
104
+ }
105
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/notifications/templates.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,mEAAmE;AACnE,qBAAqB;AACrB,mEAAmE;AAEnE,MAAM,UAAU,4BAA4B,CAC1C,KAAkB,EAClB,MAAwB;IAExB,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;SAC7C,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAE,KAAgB,GAAG,GAAG,CAAC;SAC/C,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IAEvB,OAAO;QACL,KAAK,EAAE,mBAAmB;QAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,OAAO,EAAE,GAAG,KAAK,CAAC,SAAS,WAAW,MAAM,CAAC,SAAS,iBAAiB,MAAM,CAAC,cAAc,wBAAwB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC3I,IAAI,EAAE;YACJ,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,gBAAgB,EAAE,UAAU;YAC5B,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB;QACD,SAAS,EAAE,IAAI,IAAI,EAAE;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,KAAkB,EAClB,MAAwB;IAExB,OAAO;QACL,KAAK,EAAE,mBAAmB;QAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,OAAO,EAAE,GAAG,KAAK,CAAC,SAAS,WAAW,MAAM,CAAC,SAAS,iBAAiB,MAAM,CAAC,cAAc,EAAE;QAC9F,IAAI,EAAE;YACJ,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,SAAS,EAAE,MAAM,CAAC,SAAS;SAC5B;QACD,SAAS,EAAE,IAAI,IAAI,EAAE;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,KAAkB,EAClB,MAAmB;IAEnB,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAC1D,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAW,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAW,CAAC,CACnE,CAAC,CAAC,CAAC,CAAC;IAEL,OAAO;QACL,KAAK,EAAE,eAAe;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,OAAO,EAAE,4BAA4B,KAAK,CAAC,SAAS,SAAS,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,QAAQ,uBAAuB,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAM,QAAQ,EAAE,CAAC,CAAC,CAAY,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAY,CAAA,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QACjO,IAAI,EAAE;YACJ,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB;QACD,SAAS,EAAE,IAAI,IAAI,EAAE;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,OAA2B;IAE3B,OAAO;QACL,KAAK,EAAE,eAAe;QACtB,OAAO,EAAE,OAAO,CAAC,WAAW;QAC5B,IAAI,EAAE;YACJ,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,UAAU,EAAE,OAAO,CAAC,UAAU;SAC/B;QACD,SAAS,EAAE,IAAI,IAAI,EAAE;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC9C,KAAkB;IAElB,OAAO;QACL,KAAK,EAAE,uBAAuB;QAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,OAAO,EAAE,6BAA6B,KAAK,CAAC,SAAS,0BAA0B;QAC/E,IAAI,EAAE;YACJ,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,WAAW,EAAE;YACnD,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;SAC/C;QACD,SAAS,EAAE,IAAI,IAAI,EAAE;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mCAAmC,CACjD,MAA6B;IAE7B,MAAM,QAAQ,GACZ,MAAM,CAAC,QAAQ,GAAG,CAAC;QACjB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,GAAG,CAAC;IAEV,OAAO;QACL,KAAK,EAAE,2BAA2B;QAClC,OAAO,EAAE,8BAA8B,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,YAAY,QAAQ,OAAO,MAAM,CAAC,MAAM,YAAY,MAAM,CAAC,MAAM,SAAS;QACjJ,IAAI,EAAE;YACJ,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,UAAU,EACR,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE;SAC5D;QACD,SAAS,EAAE,IAAI,IAAI,EAAE;KACtB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,99 @@
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 { AgentRegistry } from "../registry/agent-registry.js";
13
+ import type { AgentRecord, AssessmentResult, FleetAssessmentResult } from "../registry/types.js";
14
+ import type { GrilloConfig } from "../config/schema.js";
15
+ import type { Notifier } from "../notifications/notifier.js";
16
+ import { FrameworkRegistry } from "../frameworks/framework-registry.js";
17
+ import { DriftDetector } from "../drift/detector.js";
18
+ import type { AuditLog } from "../audit/audit-log.js";
19
+ /**
20
+ * Function that routes a question to a specific model and returns the response.
21
+ * Same signature proven in the openclaw-plugin: (modelId, question) => answer.
22
+ */
23
+ export type ModelInvoker = (modelId: string, question: string) => Promise<string>;
24
+ export interface AssessmentProgress {
25
+ agentId: string;
26
+ agentName: string;
27
+ questionsAnswered: number;
28
+ questionsTotal: number;
29
+ phase: "queued" | "assessing" | "scoring" | "complete" | "error";
30
+ message?: string;
31
+ }
32
+ export type ProgressCallback = (progress: AssessmentProgress) => void;
33
+ export declare class GrilloOrchestrator {
34
+ private readonly registry;
35
+ private readonly config;
36
+ private readonly invokeModel;
37
+ private readonly notifier;
38
+ readonly frameworkRegistry: FrameworkRegistry;
39
+ private readonly driftDetector;
40
+ private readonly auditLog;
41
+ private running;
42
+ private abortController;
43
+ constructor(params: {
44
+ registry: AgentRegistry;
45
+ config: GrilloConfig;
46
+ invokeModel: ModelInvoker;
47
+ notifier?: Notifier;
48
+ frameworkRegistry?: FrameworkRegistry;
49
+ driftDetector?: DriftDetector;
50
+ auditLog?: AuditLog;
51
+ });
52
+ /**
53
+ * Assess a single agent. Core method used by both individual and fleet flows.
54
+ * Uses the same proven pattern: AIAssessClient.assess + withRetry callback.
55
+ *
56
+ * Phase 3: Now enforces hierarchical gating. If hierarchicalMode is enabled
57
+ * and the requested level's prerequisites aren't met, the assessment is rejected.
58
+ */
59
+ assessAgent(agent: AgentRecord, options?: {
60
+ framework?: string;
61
+ level?: number;
62
+ dryRun?: boolean;
63
+ onProgress?: ProgressCallback;
64
+ }): Promise<AssessmentResult>;
65
+ /**
66
+ * Assess the next available level for an agent.
67
+ * Automatically determines which framework/level to run based on progress.
68
+ */
69
+ assessNextLevel(agent: AgentRecord, options?: {
70
+ dryRun?: boolean;
71
+ onProgress?: ProgressCallback;
72
+ }): Promise<AssessmentResult>;
73
+ /**
74
+ * Run all unlocked levels in sequence for an agent.
75
+ * Stops at the first failure (higher levels depend on lower ones passing).
76
+ */
77
+ assessFullHierarchy(agent: AgentRecord, options?: {
78
+ dryRun?: boolean;
79
+ onProgress?: ProgressCallback;
80
+ }): Promise<AssessmentResult[]>;
81
+ /**
82
+ * Assess all agents (or a filtered subset) in priority order.
83
+ * Respects parallelAssessments concurrency limit from config.
84
+ */
85
+ assessFleet(options?: {
86
+ agentIds?: string[];
87
+ dryRun?: boolean;
88
+ onProgress?: ProgressCallback;
89
+ }): Promise<FleetAssessmentResult>;
90
+ /**
91
+ * Abort a running fleet assessment.
92
+ */
93
+ abort(): void;
94
+ /**
95
+ * Whether a fleet assessment is currently running.
96
+ */
97
+ get isRunning(): boolean;
98
+ }
99
+ //# sourceMappingURL=orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/orchestration/orchestrator.ts"],"names":[],"mappings":"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"}