@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,148 @@
1
+ /**
2
+ * Grillo Cricket — Drift Detector
3
+ *
4
+ * Temporal Drift Index (TDI) calculator. Detects when an agent's scores
5
+ * drift from its established baseline. Framework-agnostic: works with
6
+ * any dimension set (LCSH, virtue, ethics, opex).
7
+ *
8
+ * TDI = sqrt(sum((current_i - baseline_i)^2) / n)
9
+ *
10
+ * The baseline is an EMA (exponential moving average) of all historical
11
+ * scores, so it adapts to legitimate model improvements while flagging
12
+ * sudden drops.
13
+ */
14
+ // ================================================================
15
+ // TDI Calculation
16
+ // ================================================================
17
+ /**
18
+ * Calculate the Temporal Drift Index between current scores and baseline.
19
+ *
20
+ * @returns TDI value (0 = no drift, higher = more drift)
21
+ */
22
+ export function calculateTDI(current, baseline) {
23
+ const dimensions = Object.keys(baseline);
24
+ if (dimensions.length === 0)
25
+ return 0;
26
+ let sumSquaredDiff = 0;
27
+ for (const dim of dimensions) {
28
+ const curr = current[dim] ?? 0;
29
+ const base = baseline[dim] ?? 0;
30
+ // Normalize to 0-1 range (scores are 0-10)
31
+ const diff = (curr - base) / 10;
32
+ sumSquaredDiff += diff * diff;
33
+ }
34
+ return Math.sqrt(sumSquaredDiff / dimensions.length);
35
+ }
36
+ /**
37
+ * Determine drift severity from TDI value.
38
+ */
39
+ export function driftSeverity(tdi, config) {
40
+ const { tdiWarningThreshold, tdiCriticalThreshold } = config.drift;
41
+ if (tdi < tdiWarningThreshold * 0.5)
42
+ return "none";
43
+ if (tdi < tdiWarningThreshold)
44
+ return "low";
45
+ if (tdi < tdiCriticalThreshold)
46
+ return "medium";
47
+ if (tdi < tdiCriticalThreshold * 1.5)
48
+ return "high";
49
+ return "critical";
50
+ }
51
+ /**
52
+ * Per-dimension drift breakdown.
53
+ */
54
+ export function dimensionDrifts(current, baseline) {
55
+ const drifts = {};
56
+ for (const dim of Object.keys(baseline)) {
57
+ const curr = current[dim] ?? 0;
58
+ const base = baseline[dim] ?? 0;
59
+ drifts[dim] = curr - base;
60
+ }
61
+ return drifts;
62
+ }
63
+ // ================================================================
64
+ // Drift Detector Service
65
+ // ================================================================
66
+ export class DriftDetector {
67
+ config;
68
+ constructor(config) {
69
+ this.config = config;
70
+ }
71
+ /**
72
+ * Analyze drift for a single agent given their current scores.
73
+ */
74
+ analyze(agent, currentScores) {
75
+ const baseline = agent.driftBaseline;
76
+ // No baseline = no drift (first assessment)
77
+ if (!baseline) {
78
+ return {
79
+ agentId: agent.agentId,
80
+ agentName: agent.agentName,
81
+ tdi: 0,
82
+ baseline: currentScores,
83
+ current: currentScores,
84
+ dimensionDrifts: {},
85
+ severity: "none",
86
+ assessedAt: new Date(),
87
+ };
88
+ }
89
+ const tdi = calculateTDI(currentScores, baseline);
90
+ const severity = driftSeverity(tdi, this.config);
91
+ const drifts = dimensionDrifts(currentScores, baseline);
92
+ return {
93
+ agentId: agent.agentId,
94
+ agentName: agent.agentName,
95
+ tdi,
96
+ baseline,
97
+ current: currentScores,
98
+ dimensionDrifts: drifts,
99
+ severity,
100
+ assessedAt: new Date(),
101
+ };
102
+ }
103
+ /**
104
+ * Update the baseline using EMA (exponential moving average).
105
+ * Returns the updated baseline.
106
+ */
107
+ updateBaseline(currentBaseline, newScores) {
108
+ const alpha = this.config.drift.baselineAlpha;
109
+ const updated = {};
110
+ for (const dim of Object.keys(currentBaseline)) {
111
+ const prev = currentBaseline[dim] ?? 0;
112
+ const curr = newScores[dim] ?? prev;
113
+ updated[dim] = prev * (1 - alpha) + curr * alpha;
114
+ }
115
+ // Include any new dimensions not in the baseline
116
+ for (const dim of Object.keys(newScores)) {
117
+ if (!(dim in updated)) {
118
+ updated[dim] = newScores[dim];
119
+ }
120
+ }
121
+ return updated;
122
+ }
123
+ /**
124
+ * Check if a drift report should trigger a notification.
125
+ */
126
+ shouldNotify(report) {
127
+ return report.severity === "high" || report.severity === "critical";
128
+ }
129
+ /**
130
+ * Format a drift report as a human-readable summary.
131
+ */
132
+ formatReport(report) {
133
+ const lines = [];
134
+ lines.push(`## Drift Report: ${report.agentName}`);
135
+ lines.push(`TDI: ${report.tdi.toFixed(4)} — Severity: ${report.severity.toUpperCase()}`);
136
+ lines.push("");
137
+ lines.push("| Dimension | Baseline | Current | Drift |");
138
+ lines.push("|-----------|----------|---------|-------|");
139
+ for (const [dim, drift] of Object.entries(report.dimensionDrifts)) {
140
+ const baseline = report.baseline[dim]?.toFixed(1) ?? "—";
141
+ const current = report.current[dim]?.toFixed(1) ?? "—";
142
+ const arrow = drift > 0 ? "+" : "";
143
+ lines.push(`| ${dim} | ${baseline} | ${current} | ${arrow}${drift.toFixed(1)} |`);
144
+ }
145
+ return lines.join("\n");
146
+ }
147
+ }
148
+ //# sourceMappingURL=detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/drift/detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH,mEAAmE;AACnE,kBAAkB;AAClB,mEAAmE;AAEnE;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAwB,EACxB,QAAyB;IAEzB,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAEtC,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChC,2CAA2C;QAC3C,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAChC,cAAc,IAAI,IAAI,GAAG,IAAI,CAAC;IAChC,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,GAAW,EACX,MAAoB;IAEpB,MAAM,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;IAEnE,IAAI,GAAG,GAAG,mBAAmB,GAAG,GAAG;QAAE,OAAO,MAAM,CAAC;IACnD,IAAI,GAAG,GAAG,mBAAmB;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,GAAG,GAAG,oBAAoB;QAAE,OAAO,QAAQ,CAAC;IAChD,IAAI,GAAG,GAAG,oBAAoB,GAAG,GAAG;QAAE,OAAO,MAAM,CAAC;IACpD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAwB,EACxB,QAAyB;IAEzB,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;IAC5B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,mEAAmE;AACnE,yBAAyB;AACzB,mEAAmE;AAEnE,MAAM,OAAO,aAAa;IACP,MAAM,CAAe;IAEtC,YAAY,MAAoB;QAC9B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,OAAO,CACL,KAAkB,EAClB,aAA8B;QAE9B,MAAM,QAAQ,GAAG,KAAK,CAAC,aAAa,CAAC;QAErC,4CAA4C;QAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;gBACL,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,GAAG,EAAE,CAAC;gBACN,QAAQ,EAAE,aAAa;gBACvB,OAAO,EAAE,aAAa;gBACtB,eAAe,EAAE,EAAE;gBACnB,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,IAAI,IAAI,EAAE;aACvB,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,YAAY,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,eAAe,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QAExD,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,GAAG;YACH,QAAQ;YACR,OAAO,EAAE,aAAa;YACtB,eAAe,EAAE,MAAM;YACvB,QAAQ;YACR,UAAU,EAAE,IAAI,IAAI,EAAE;SACvB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,cAAc,CACZ,eAAgC,EAChC,SAA0B;QAE1B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;QAC9C,MAAM,OAAO,GAAoB,EAAE,CAAC;QAEpC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC;QACnD,CAAC;QAED,iDAAiD;QACjD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,MAAmB;QAC9B,OAAO,MAAM,CAAC,QAAQ,KAAK,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,UAAU,CAAC;IACtE,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,MAAmB;QAC9B,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QACnD,KAAK,CAAC,IAAI,CAAC,QAAQ,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACzF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QACzD,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAEzD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC;YAClE,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;YACzD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;YACvD,MAAM,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CACR,KAAK,GAAG,MAAM,QAAQ,MAAM,OAAO,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CACtE,CAAC;QACJ,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Grillo Cricket — Fleet Anomaly Detection
3
+ *
4
+ * Detects fleet-level patterns that indicate systemic issues:
5
+ * - Provider drift: multiple agents using same provider show drift
6
+ * - Model drift: a model update degrades scores across agents
7
+ * - Category drift: an entire category shows correlated decline
8
+ * - Global drift: fleet-wide score degradation
9
+ */
10
+ import type { DriftReport, FleetAnomalyReport, AgentRecord } from "../registry/types.js";
11
+ import type { GrilloConfig } from "../config/schema.js";
12
+ export declare class FleetAnomalyDetector {
13
+ private readonly config;
14
+ constructor(config: GrilloConfig);
15
+ /**
16
+ * Analyze a batch of drift reports for fleet-level anomalies.
17
+ */
18
+ analyze(reports: DriftReport[], agents: AgentRecord[]): FleetAnomalyReport[];
19
+ private detectProviderDrift;
20
+ private detectModelDrift;
21
+ private detectCategoryDrift;
22
+ private detectGlobalDrift;
23
+ /**
24
+ * Format fleet anomalies into a human-readable report.
25
+ */
26
+ formatAnomalies(anomalies: FleetAnomalyReport[]): string;
27
+ }
28
+ //# sourceMappingURL=fleet-anomaly.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet-anomaly.d.ts","sourceRoot":"","sources":["../../src/drift/fleet-anomaly.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,kBAAkB,EAClB,WAAW,EACZ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMxD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAE1B,MAAM,EAAE,YAAY;IAIhC;;OAEG;IACH,OAAO,CACL,OAAO,EAAE,WAAW,EAAE,EACtB,MAAM,EAAE,WAAW,EAAE,GACpB,kBAAkB,EAAE;IA6DvB,OAAO,CAAC,mBAAmB;IAkC3B,OAAO,CAAC,gBAAgB;IAkCxB,OAAO,CAAC,mBAAmB;IAkC3B,OAAO,CAAC,iBAAiB;IAyBzB;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,kBAAkB,EAAE,GAAG,MAAM;CAuBzD"}
@@ -0,0 +1,186 @@
1
+ /**
2
+ * Grillo Cricket — Fleet Anomaly Detection
3
+ *
4
+ * Detects fleet-level patterns that indicate systemic issues:
5
+ * - Provider drift: multiple agents using same provider show drift
6
+ * - Model drift: a model update degrades scores across agents
7
+ * - Category drift: an entire category shows correlated decline
8
+ * - Global drift: fleet-wide score degradation
9
+ */
10
+ // ================================================================
11
+ // Fleet Anomaly Detector
12
+ // ================================================================
13
+ export class FleetAnomalyDetector {
14
+ config;
15
+ constructor(config) {
16
+ this.config = config;
17
+ }
18
+ /**
19
+ * Analyze a batch of drift reports for fleet-level anomalies.
20
+ */
21
+ analyze(reports, agents) {
22
+ const anomalies = [];
23
+ const now = new Date();
24
+ const minAgents = this.config.drift.fleetAnomalyMinAgents;
25
+ // Only consider reports with significant drift
26
+ const significantReports = reports.filter((r) => r.severity !== "none" && r.severity !== "low");
27
+ if (significantReports.length < minAgents)
28
+ return anomalies;
29
+ // Build agent lookup
30
+ const agentMap = new Map();
31
+ for (const agent of agents) {
32
+ agentMap.set(agent.agentId, agent);
33
+ }
34
+ // Check for provider-level anomalies
35
+ const providerAnomalies = this.detectProviderDrift(significantReports, agentMap, minAgents, now);
36
+ anomalies.push(...providerAnomalies);
37
+ // Check for model-level anomalies
38
+ const modelAnomalies = this.detectModelDrift(significantReports, agentMap, minAgents, now);
39
+ anomalies.push(...modelAnomalies);
40
+ // Check for category-level anomalies
41
+ const categoryAnomalies = this.detectCategoryDrift(significantReports, agentMap, minAgents, now);
42
+ anomalies.push(...categoryAnomalies);
43
+ // Check for global drift
44
+ const globalAnomaly = this.detectGlobalDrift(significantReports, reports.length, minAgents, now);
45
+ if (globalAnomaly)
46
+ anomalies.push(globalAnomaly);
47
+ return anomalies;
48
+ }
49
+ // ============================================================
50
+ // Provider Drift
51
+ // ============================================================
52
+ detectProviderDrift(reports, agents, minAgents, now) {
53
+ const anomalies = [];
54
+ const byProvider = groupBy(reports, (r) => {
55
+ const agent = agents.get(r.agentId);
56
+ return agent?.provider ?? "unknown";
57
+ });
58
+ for (const [provider, providerReports] of Object.entries(byProvider)) {
59
+ if (providerReports.length >= minAgents) {
60
+ const avgTDI = average(providerReports.map((r) => r.tdi));
61
+ anomalies.push({
62
+ detected: true,
63
+ anomalyType: "provider_drift",
64
+ affectedAgents: providerReports.map((r) => r.agentId),
65
+ commonFactor: provider,
66
+ averageTDI: avgTDI,
67
+ description: `Provider "${provider}" shows correlated drift across ${providerReports.length} agents (avg TDI: ${avgTDI.toFixed(4)})`,
68
+ detectedAt: now,
69
+ });
70
+ }
71
+ }
72
+ return anomalies;
73
+ }
74
+ // ============================================================
75
+ // Model Drift
76
+ // ============================================================
77
+ detectModelDrift(reports, agents, minAgents, now) {
78
+ const anomalies = [];
79
+ const byModel = groupBy(reports, (r) => {
80
+ const agent = agents.get(r.agentId);
81
+ return agent?.model ?? "unknown";
82
+ });
83
+ for (const [model, modelReports] of Object.entries(byModel)) {
84
+ if (modelReports.length >= minAgents) {
85
+ const avgTDI = average(modelReports.map((r) => r.tdi));
86
+ anomalies.push({
87
+ detected: true,
88
+ anomalyType: "model_drift",
89
+ affectedAgents: modelReports.map((r) => r.agentId),
90
+ commonFactor: model,
91
+ averageTDI: avgTDI,
92
+ description: `Model "${model}" shows correlated drift across ${modelReports.length} agents (avg TDI: ${avgTDI.toFixed(4)}). Possible model update or degradation.`,
93
+ detectedAt: now,
94
+ });
95
+ }
96
+ }
97
+ return anomalies;
98
+ }
99
+ // ============================================================
100
+ // Category Drift
101
+ // ============================================================
102
+ detectCategoryDrift(reports, agents, minAgents, now) {
103
+ const anomalies = [];
104
+ const byCategory = groupBy(reports, (r) => {
105
+ const agent = agents.get(r.agentId);
106
+ return agent?.category ?? "unknown";
107
+ });
108
+ for (const [category, catReports] of Object.entries(byCategory)) {
109
+ if (catReports.length >= minAgents) {
110
+ const avgTDI = average(catReports.map((r) => r.tdi));
111
+ anomalies.push({
112
+ detected: true,
113
+ anomalyType: "category_drift",
114
+ affectedAgents: catReports.map((r) => r.agentId),
115
+ commonFactor: category,
116
+ averageTDI: avgTDI,
117
+ description: `Category "${category}" shows correlated drift across ${catReports.length} agents (avg TDI: ${avgTDI.toFixed(4)})`,
118
+ detectedAt: now,
119
+ });
120
+ }
121
+ }
122
+ return anomalies;
123
+ }
124
+ // ============================================================
125
+ // Global Drift
126
+ // ============================================================
127
+ detectGlobalDrift(significantReports, totalReports, minAgents, now) {
128
+ // Global drift: >50% of fleet shows significant drift
129
+ if (totalReports >= minAgents &&
130
+ significantReports.length / totalReports > 0.5) {
131
+ const avgTDI = average(significantReports.map((r) => r.tdi));
132
+ return {
133
+ detected: true,
134
+ anomalyType: "global_drift",
135
+ affectedAgents: significantReports.map((r) => r.agentId),
136
+ commonFactor: "fleet-wide",
137
+ averageTDI: avgTDI,
138
+ description: `Fleet-wide drift detected: ${significantReports.length}/${totalReports} agents (${((significantReports.length / totalReports) * 100).toFixed(0)}%) showing significant drift (avg TDI: ${avgTDI.toFixed(4)})`,
139
+ detectedAt: now,
140
+ };
141
+ }
142
+ return null;
143
+ }
144
+ /**
145
+ * Format fleet anomalies into a human-readable report.
146
+ */
147
+ formatAnomalies(anomalies) {
148
+ if (anomalies.length === 0) {
149
+ return "No fleet-level anomalies detected.";
150
+ }
151
+ const lines = [
152
+ "# Fleet Anomaly Report",
153
+ "",
154
+ `**${anomalies.length} anomal${anomalies.length === 1 ? "y" : "ies"} detected**`,
155
+ "",
156
+ ];
157
+ for (const anomaly of anomalies) {
158
+ lines.push(`## ${anomaly.anomalyType.replace("_", " ").toUpperCase()}`);
159
+ lines.push(`- **Factor:** ${anomaly.commonFactor}`);
160
+ lines.push(`- **Affected agents:** ${anomaly.affectedAgents.length}`);
161
+ lines.push(`- **Average TDI:** ${anomaly.averageTDI.toFixed(4)}`);
162
+ lines.push(`- ${anomaly.description}`);
163
+ lines.push("");
164
+ }
165
+ return lines.join("\n");
166
+ }
167
+ }
168
+ // ================================================================
169
+ // Helpers
170
+ // ================================================================
171
+ function groupBy(items, keyFn) {
172
+ const groups = {};
173
+ for (const item of items) {
174
+ const key = keyFn(item);
175
+ if (!groups[key])
176
+ groups[key] = [];
177
+ groups[key].push(item);
178
+ }
179
+ return groups;
180
+ }
181
+ function average(values) {
182
+ if (values.length === 0)
183
+ return 0;
184
+ return values.reduce((sum, v) => sum + v, 0) / values.length;
185
+ }
186
+ //# sourceMappingURL=fleet-anomaly.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet-anomaly.js","sourceRoot":"","sources":["../../src/drift/fleet-anomaly.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,209 @@
1
+ /**
2
+ * Grillo Cricket — Typed Event Bus
3
+ *
4
+ * Central nervous system for inter-service communication.
5
+ * All Grillo services emit and listen for events through this bus,
6
+ * enabling loose coupling and easy extension (e.g., webhook dispatch).
7
+ *
8
+ * Design: synchronous local delivery, async webhook fan-out.
9
+ */
10
+ export interface GrilloEvents {
11
+ "assessment:started": {
12
+ agentId: string;
13
+ agentName: string;
14
+ framework: string;
15
+ level: number;
16
+ };
17
+ "assessment:completed": {
18
+ agentId: string;
19
+ agentName: string;
20
+ framework: string;
21
+ level: number;
22
+ passed: boolean;
23
+ classification: string;
24
+ runId: string;
25
+ scores: Record<string, number>;
26
+ durationMs: number;
27
+ };
28
+ "assessment:failed": {
29
+ agentId: string;
30
+ agentName: string;
31
+ error: string;
32
+ };
33
+ "certification:granted": {
34
+ agentId: string;
35
+ agentName: string;
36
+ level: number;
37
+ classification: string;
38
+ expiresAt: string;
39
+ };
40
+ "certification:expired": {
41
+ agentId: string;
42
+ agentName: string;
43
+ };
44
+ "certification:suspended": {
45
+ agentId: string;
46
+ agentName: string;
47
+ reason?: string;
48
+ };
49
+ "certification:reinstated": {
50
+ agentId: string;
51
+ agentName: string;
52
+ };
53
+ "drift:detected": {
54
+ agentId: string;
55
+ agentName: string;
56
+ severity: string;
57
+ tdi: number;
58
+ dimensions: Record<string, {
59
+ current: number;
60
+ baseline: number;
61
+ delta: number;
62
+ }>;
63
+ };
64
+ "drift:fleet_anomaly": {
65
+ anomalyType: string;
66
+ affectedAgents: string[];
67
+ details: string;
68
+ };
69
+ "hierarchy:level_unlocked": {
70
+ agentId: string;
71
+ agentName: string;
72
+ level: number;
73
+ frameworkName: string;
74
+ };
75
+ "hierarchy:gate_blocked": {
76
+ agentId: string;
77
+ agentName: string;
78
+ requestedLevel: number;
79
+ missingPrerequisites: string[];
80
+ };
81
+ "discovery:scan_completed": {
82
+ source: string;
83
+ newAgents: number;
84
+ existingAgents: number;
85
+ orphanedAgents: number;
86
+ durationMs: number;
87
+ };
88
+ "discovery:new_agent": {
89
+ agentId: string;
90
+ agentName: string;
91
+ model: string;
92
+ provider: string;
93
+ source: string;
94
+ };
95
+ "agent:registered": {
96
+ agentId: string;
97
+ agentName: string;
98
+ model: string;
99
+ provider: string;
100
+ };
101
+ "agent:deregistered": {
102
+ agentId: string;
103
+ agentName: string;
104
+ };
105
+ "monitor:started": Record<string, never>;
106
+ "monitor:stopped": Record<string, never>;
107
+ "monitor:tick": {
108
+ windowOpen: boolean;
109
+ dueAgents: number;
110
+ };
111
+ "assessment:bypass_granted": {
112
+ agentId: string;
113
+ agentName: string;
114
+ reason: string;
115
+ authorizedBy: string;
116
+ expiresAt: string;
117
+ };
118
+ "config:changed": {
119
+ key: string;
120
+ value: unknown;
121
+ actor: string;
122
+ };
123
+ "drift:auto_suspended": {
124
+ agentId: string;
125
+ agentName: string;
126
+ tdi: number;
127
+ threshold: number;
128
+ severity: string;
129
+ };
130
+ "system:health_check": {
131
+ healthy: boolean;
132
+ services: Record<string, boolean>;
133
+ };
134
+ "system:error": {
135
+ service: string;
136
+ error: string;
137
+ fatal: boolean;
138
+ };
139
+ }
140
+ export type GrilloEventName = keyof GrilloEvents;
141
+ export type GrilloEventPayload<E extends GrilloEventName> = GrilloEvents[E];
142
+ export interface GrilloEvent<E extends GrilloEventName = GrilloEventName> {
143
+ name: E;
144
+ payload: GrilloEvents[E];
145
+ timestamp: Date;
146
+ source?: string;
147
+ }
148
+ type EventHandler<E extends GrilloEventName> = (event: GrilloEvent<E>) => void | Promise<void>;
149
+ export declare class GrilloEventBus {
150
+ private handlers;
151
+ private wildcardHandlers;
152
+ private webhookUrls;
153
+ private eventHistory;
154
+ private readonly maxHistory;
155
+ constructor(options?: {
156
+ maxHistory?: number;
157
+ });
158
+ /**
159
+ * Listen for a specific event.
160
+ * Returns an unsubscribe function.
161
+ */
162
+ on<E extends GrilloEventName>(event: E, handler: EventHandler<E>): () => void;
163
+ /**
164
+ * Listen for ALL events (wildcard).
165
+ * Returns an unsubscribe function.
166
+ */
167
+ onAll(handler: EventHandler<GrilloEventName>): () => void;
168
+ /**
169
+ * Listen for an event ONCE, then auto-unsubscribe.
170
+ */
171
+ once<E extends GrilloEventName>(event: E, handler: EventHandler<E>): () => void;
172
+ /**
173
+ * Emit an event to all listeners + webhook subscribers.
174
+ */
175
+ emit<E extends GrilloEventName>(name: E, payload: GrilloEvents[E], source?: string): Promise<void>;
176
+ /**
177
+ * Register a webhook URL for specific events or all events (*).
178
+ */
179
+ registerWebhook(url: string, events: Array<GrilloEventName | "*">): void;
180
+ /**
181
+ * Remove a webhook URL.
182
+ */
183
+ removeWebhook(url: string): void;
184
+ /**
185
+ * List all registered webhooks.
186
+ */
187
+ listWebhooks(): Array<{
188
+ url: string;
189
+ events: string[];
190
+ }>;
191
+ private dispatchWebhooks;
192
+ /**
193
+ * Get recent event history, optionally filtered by event name.
194
+ */
195
+ history(filter?: {
196
+ event?: GrilloEventName;
197
+ limit?: number;
198
+ }): GrilloEvent[];
199
+ /**
200
+ * Get count of handlers for each event.
201
+ */
202
+ stats(): Record<string, number>;
203
+ /**
204
+ * Remove all handlers and webhooks.
205
+ */
206
+ clear(): void;
207
+ }
208
+ export {};
209
+ //# sourceMappingURL=event-bus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../src/events/event-bus.ts"],"names":[],"mappings":"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"}