@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,110 @@
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
+ /**
8
+ * Determine when an agent's next assessment is due.
9
+ */
10
+ export function calculateNextAssessment(agent, config) {
11
+ const policy = config.assessment;
12
+ const categoryOverride = config.categories[agent.category];
13
+ // Determine effective frequency
14
+ const frequency = categoryOverride?.frequency ?? policy.frequency;
15
+ if (frequency === "on_demand") {
16
+ return {
17
+ agentId: agent.agentId,
18
+ nextDue: new Date("9999-12-31T23:59:59Z"), // Far future — manual trigger only
19
+ reason: "On-demand only (no automatic schedule)",
20
+ };
21
+ }
22
+ if (frequency === "startup_only") {
23
+ // Only due if never assessed
24
+ if (!agent.lastAssessedAt) {
25
+ return {
26
+ agentId: agent.agentId,
27
+ nextDue: new Date(), // Due immediately
28
+ reason: "Startup assessment (never assessed)",
29
+ };
30
+ }
31
+ return {
32
+ agentId: agent.agentId,
33
+ nextDue: new Date("9999-12-31T23:59:59Z"),
34
+ reason: "Already assessed at startup",
35
+ };
36
+ }
37
+ // For daily/weekly/continuous, calculate from last assessment
38
+ const baseDate = agent.lastAssessedAt ?? agent.registeredAt;
39
+ const intervalMs = frequencyToMs(frequency);
40
+ const nextDue = new Date(baseDate.getTime() + intervalMs);
41
+ // Apply window constraint
42
+ const constrained = applyWindow(nextDue, policy);
43
+ return {
44
+ agentId: agent.agentId,
45
+ nextDue: constrained,
46
+ reason: `${frequency} schedule (${categoryOverride ? `${agent.category} override` : "default policy"})`,
47
+ };
48
+ }
49
+ /**
50
+ * Calculate schedules for all agents and return sorted by due date.
51
+ */
52
+ export function calculateFleetSchedule(agents, config) {
53
+ const results = agents.map((a) => calculateNextAssessment(a, config));
54
+ results.sort((a, b) => a.nextDue.getTime() - b.nextDue.getTime());
55
+ return results;
56
+ }
57
+ // ================================================================
58
+ // Helpers
59
+ // ================================================================
60
+ function frequencyToMs(frequency) {
61
+ switch (frequency) {
62
+ case "continuous":
63
+ return 4 * 60 * 60 * 1000; // 4 hours
64
+ case "daily":
65
+ return 24 * 60 * 60 * 1000; // 24 hours
66
+ case "weekly":
67
+ return 7 * 24 * 60 * 60 * 1000; // 7 days
68
+ default:
69
+ return 24 * 60 * 60 * 1000; // Default: daily
70
+ }
71
+ }
72
+ /**
73
+ * If the next due date falls outside the assessment window, push it
74
+ * to the start of the next window.
75
+ */
76
+ function applyWindow(nextDue, policy) {
77
+ const [startH, startM] = policy.window.start.split(":").map(Number);
78
+ const [endH, endM] = policy.window.end.split(":").map(Number);
79
+ const hour = nextDue.getHours();
80
+ const minute = nextDue.getMinutes();
81
+ const startMinutes = startH * 60 + startM;
82
+ const endMinutes = endH * 60 + endM;
83
+ const currentMinutes = hour * 60 + minute;
84
+ if (currentMinutes >= startMinutes && currentMinutes <= endMinutes) {
85
+ // Within window — no adjustment needed
86
+ return nextDue;
87
+ }
88
+ // Outside window — push to next window start
89
+ const adjusted = new Date(nextDue);
90
+ if (currentMinutes > endMinutes) {
91
+ // Past window — push to tomorrow's start
92
+ adjusted.setDate(adjusted.getDate() + 1);
93
+ }
94
+ adjusted.setHours(startH, startM, 0, 0);
95
+ return adjusted;
96
+ }
97
+ /**
98
+ * Check if "now" is within the configured assessment window.
99
+ */
100
+ export function isInAssessmentWindow(config, now = new Date()) {
101
+ const [startH, startM] = config.assessment.window.start
102
+ .split(":")
103
+ .map(Number);
104
+ const [endH, endM] = config.assessment.window.end.split(":").map(Number);
105
+ const startMinutes = startH * 60 + startM;
106
+ const endMinutes = endH * 60 + endM;
107
+ const currentMinutes = now.getHours() * 60 + now.getMinutes();
108
+ return currentMinutes >= startMinutes && currentMinutes <= endMinutes;
109
+ }
110
+ //# sourceMappingURL=scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/orchestration/scheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Grillo Cricket — Agent Registry
3
+ *
4
+ * In-memory registry of all agents under Grillo's jurisdiction.
5
+ * Phase 1: JSON file persistence. Phase 2+: SQLite / Postgres.
6
+ *
7
+ * Responsibilities:
8
+ * - Register / deregister agents
9
+ * - Track certification status and history
10
+ * - Query by status, category, risk tier
11
+ * - Calculate who needs assessment next
12
+ * - Persist to disk (JSON) for crash recovery
13
+ */
14
+ import { type AgentRecord, type CertificationRecord, AgentCategory, CertificationStatus, RiskTier } from "./types.js";
15
+ export interface RegistryOptions {
16
+ /** Path to persist registry data. Set to null for ephemeral (testing). */
17
+ persistPath?: string | null;
18
+ /** Auto-persist after mutations. Default: true */
19
+ autoPersist?: boolean;
20
+ }
21
+ export interface RegisterAgentInput {
22
+ agentId: string;
23
+ agentName: string;
24
+ agentType: string;
25
+ category?: AgentCategory;
26
+ provider: string;
27
+ model: string;
28
+ riskTier?: RiskTier;
29
+ tags?: string[];
30
+ metadata?: Record<string, unknown>;
31
+ }
32
+ export interface RegistryQuery {
33
+ status?: CertificationStatus | CertificationStatus[];
34
+ category?: AgentCategory | AgentCategory[];
35
+ riskTier?: RiskTier | RiskTier[];
36
+ tags?: string[];
37
+ /** Only agents whose next assessment is due before this date. */
38
+ assessmentDueBefore?: Date;
39
+ }
40
+ export declare class AgentRegistry {
41
+ private agents;
42
+ private readonly persistPath;
43
+ private readonly autoPersist;
44
+ constructor(options?: RegistryOptions);
45
+ /**
46
+ * Register a new agent or update an existing one.
47
+ */
48
+ register(input: RegisterAgentInput): AgentRecord;
49
+ /**
50
+ * Get a single agent by ID.
51
+ */
52
+ get(agentId: string): AgentRecord | undefined;
53
+ /**
54
+ * Deregister an agent. Returns true if it existed.
55
+ */
56
+ deregister(agentId: string): boolean;
57
+ /**
58
+ * Get all registered agents.
59
+ */
60
+ all(): AgentRecord[];
61
+ /**
62
+ * Count of registered agents.
63
+ */
64
+ get size(): number;
65
+ /**
66
+ * Query agents matching given filters. All conditions are AND'd.
67
+ */
68
+ query(q: RegistryQuery): AgentRecord[];
69
+ /**
70
+ * Get all agents that are due for assessment now.
71
+ */
72
+ dueForAssessment(): AgentRecord[];
73
+ /**
74
+ * Get agents ordered by assessment priority (highest risk first, then oldest assessment).
75
+ */
76
+ prioritized(): AgentRecord[];
77
+ /**
78
+ * Record a completed assessment for an agent.
79
+ */
80
+ recordAssessment(agentId: string, record: CertificationRecord): AgentRecord;
81
+ /**
82
+ * Update an agent's certification status directly.
83
+ */
84
+ updateStatus(agentId: string, status: CertificationStatus): AgentRecord;
85
+ /**
86
+ * Set the next assessment due date for an agent.
87
+ */
88
+ scheduleAssessment(agentId: string, dueAt: Date): AgentRecord;
89
+ persist(): void;
90
+ private loadFromDisk;
91
+ private maybePersist;
92
+ summary(): RegistrySummary;
93
+ }
94
+ export interface RegistrySummary {
95
+ total: number;
96
+ certified: number;
97
+ failed: number;
98
+ uncertified: number;
99
+ assessing: number;
100
+ expired: number;
101
+ driftWarning: number;
102
+ byStatus: Record<CertificationStatus, number>;
103
+ byCategory: Record<AgentCategory, number>;
104
+ byRiskTier: Record<RiskTier, number>;
105
+ }
106
+ //# sourceMappingURL=agent-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-registry.d.ts","sourceRoot":"","sources":["../../src/registry/agent-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,mBAAmB,EAExB,aAAa,EACb,mBAAmB,EACnB,QAAQ,EAET,MAAM,YAAY,CAAC;AAMpB,MAAM,WAAW,eAAe;IAC9B,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,kDAAkD;IAClD,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAMD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAMD,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,mBAAmB,GAAG,mBAAmB,EAAE,CAAC;IACrD,QAAQ,CAAC,EAAE,aAAa,GAAG,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,EAAE,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,iEAAiE;IACjE,mBAAmB,CAAC,EAAE,IAAI,CAAC;CAC5B;AAMD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAU;gBAE1B,OAAO,GAAE,eAAoB;IAYzC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,kBAAkB,GAAG,WAAW;IA4BhD;;OAEG;IACH,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI7C;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAMpC;;OAEG;IACH,GAAG,IAAI,WAAW,EAAE;IAIpB;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAMD;;OAEG;IACH,KAAK,CAAC,CAAC,EAAE,aAAa,GAAG,WAAW,EAAE;IAoCtC;;OAEG;IACH,gBAAgB,IAAI,WAAW,EAAE;IAIjC;;OAEG;IACH,WAAW,IAAI,WAAW,EAAE;IAkD5B;;OAEG;IACH,gBAAgB,CACd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,mBAAmB,GAC1B,WAAW;IA8Dd;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,WAAW;IAQvE;;OAEG;IACH,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,WAAW;IAY7D,OAAO,IAAI,IAAI;IAaf,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,YAAY;IAQpB,OAAO,IAAI,eAAe;CA0B3B;AAMD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;IAC9C,UAAU,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC1C,UAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;CACtC"}
@@ -0,0 +1,349 @@
1
+ /**
2
+ * Grillo Cricket — Agent Registry
3
+ *
4
+ * In-memory registry of all agents under Grillo's jurisdiction.
5
+ * Phase 1: JSON file persistence. Phase 2+: SQLite / Postgres.
6
+ *
7
+ * Responsibilities:
8
+ * - Register / deregister agents
9
+ * - Track certification status and history
10
+ * - Query by status, category, risk tier
11
+ * - Calculate who needs assessment next
12
+ * - Persist to disk (JSON) for crash recovery
13
+ */
14
+ import * as fs from "node:fs";
15
+ import * as path from "node:path";
16
+ import { AgentCategory, CertificationStatus, RiskTier, LevelStatus, } from "./types.js";
17
+ // ================================================================
18
+ // Agent Registry Service
19
+ // ================================================================
20
+ export class AgentRegistry {
21
+ agents = new Map();
22
+ persistPath;
23
+ autoPersist;
24
+ constructor(options = {}) {
25
+ this.persistPath = options.persistPath ?? null;
26
+ this.autoPersist = options.autoPersist ?? true;
27
+ if (this.persistPath) {
28
+ this.loadFromDisk();
29
+ }
30
+ }
31
+ // ============================================================
32
+ // CRUD Operations
33
+ // ============================================================
34
+ /**
35
+ * Register a new agent or update an existing one.
36
+ */
37
+ register(input) {
38
+ const existing = this.agents.get(input.agentId);
39
+ const record = {
40
+ agentId: input.agentId,
41
+ agentName: input.agentName,
42
+ agentType: input.agentType,
43
+ category: input.category ?? AgentCategory.INTERNAL_UTILITY,
44
+ provider: input.provider,
45
+ model: input.model,
46
+ registeredAt: existing?.registeredAt ?? new Date(),
47
+ lastAssessedAt: existing?.lastAssessedAt ?? null,
48
+ nextAssessmentDue: existing?.nextAssessmentDue ?? null,
49
+ certificationStatus: existing?.certificationStatus ?? CertificationStatus.UNCERTIFIED,
50
+ certificationHistory: existing?.certificationHistory ?? [],
51
+ riskTier: input.riskTier ?? existing?.riskTier ?? RiskTier.MEDIUM,
52
+ hierarchicalProgress: existing?.hierarchicalProgress ?? defaultProgress(),
53
+ driftBaseline: existing?.driftBaseline ?? null,
54
+ tags: input.tags ?? existing?.tags ?? [],
55
+ metadata: { ...(existing?.metadata ?? {}), ...(input.metadata ?? {}) },
56
+ };
57
+ this.agents.set(input.agentId, record);
58
+ this.maybePersist();
59
+ return record;
60
+ }
61
+ /**
62
+ * Get a single agent by ID.
63
+ */
64
+ get(agentId) {
65
+ return this.agents.get(agentId);
66
+ }
67
+ /**
68
+ * Deregister an agent. Returns true if it existed.
69
+ */
70
+ deregister(agentId) {
71
+ const removed = this.agents.delete(agentId);
72
+ if (removed)
73
+ this.maybePersist();
74
+ return removed;
75
+ }
76
+ /**
77
+ * Get all registered agents.
78
+ */
79
+ all() {
80
+ return Array.from(this.agents.values());
81
+ }
82
+ /**
83
+ * Count of registered agents.
84
+ */
85
+ get size() {
86
+ return this.agents.size;
87
+ }
88
+ // ============================================================
89
+ // Query
90
+ // ============================================================
91
+ /**
92
+ * Query agents matching given filters. All conditions are AND'd.
93
+ */
94
+ query(q) {
95
+ let results = this.all();
96
+ if (q.status !== undefined) {
97
+ const statuses = toArray(q.status);
98
+ results = results.filter((a) => statuses.includes(a.certificationStatus));
99
+ }
100
+ if (q.category !== undefined) {
101
+ const categories = toArray(q.category);
102
+ results = results.filter((a) => categories.includes(a.category));
103
+ }
104
+ if (q.riskTier !== undefined) {
105
+ const tiers = toArray(q.riskTier);
106
+ results = results.filter((a) => tiers.includes(a.riskTier));
107
+ }
108
+ if (q.tags && q.tags.length > 0) {
109
+ results = results.filter((a) => q.tags.some((tag) => a.tags.includes(tag)));
110
+ }
111
+ if (q.assessmentDueBefore) {
112
+ const cutoff = q.assessmentDueBefore.getTime();
113
+ results = results.filter((a) => a.nextAssessmentDue === null ||
114
+ a.nextAssessmentDue.getTime() <= cutoff);
115
+ }
116
+ return results;
117
+ }
118
+ /**
119
+ * Get all agents that are due for assessment now.
120
+ */
121
+ dueForAssessment() {
122
+ return this.query({ assessmentDueBefore: new Date() });
123
+ }
124
+ /**
125
+ * Get agents ordered by assessment priority (highest risk first, then oldest assessment).
126
+ */
127
+ prioritized() {
128
+ const riskOrder = {
129
+ [RiskTier.CRITICAL]: 0,
130
+ [RiskTier.HIGH]: 1,
131
+ [RiskTier.MEDIUM]: 2,
132
+ [RiskTier.LOW]: 3,
133
+ };
134
+ return this.all().sort((a, b) => {
135
+ // Higher risk first
136
+ const riskDiff = riskOrder[a.riskTier] - riskOrder[b.riskTier];
137
+ if (riskDiff !== 0)
138
+ return riskDiff;
139
+ // Uncertified / expired first
140
+ const statusPriority = (s) => {
141
+ switch (s) {
142
+ case CertificationStatus.UNCERTIFIED:
143
+ return 0;
144
+ case CertificationStatus.EXPIRED:
145
+ return 1;
146
+ case CertificationStatus.FAILED:
147
+ return 2;
148
+ case CertificationStatus.DRIFT_WARNING:
149
+ return 3;
150
+ case CertificationStatus.PROBATION:
151
+ return 4;
152
+ case CertificationStatus.ASSESSING:
153
+ return 5;
154
+ case CertificationStatus.CERTIFIED:
155
+ return 6;
156
+ case CertificationStatus.SUSPENDED:
157
+ return 7;
158
+ }
159
+ };
160
+ const statusDiff = statusPriority(a.certificationStatus) -
161
+ statusPriority(b.certificationStatus);
162
+ if (statusDiff !== 0)
163
+ return statusDiff;
164
+ // Oldest assessment first
165
+ const aTime = a.lastAssessedAt?.getTime() ?? 0;
166
+ const bTime = b.lastAssessedAt?.getTime() ?? 0;
167
+ return aTime - bTime;
168
+ });
169
+ }
170
+ // ============================================================
171
+ // Certification Updates
172
+ // ============================================================
173
+ /**
174
+ * Record a completed assessment for an agent.
175
+ */
176
+ recordAssessment(agentId, record) {
177
+ const agent = this.agents.get(agentId);
178
+ if (!agent)
179
+ throw new Error(`Agent not found: ${agentId}`);
180
+ agent.certificationHistory.push(record);
181
+ agent.lastAssessedAt = record.assessedAt;
182
+ if (record.passed) {
183
+ // Phase 6: PROBATION — if agent was FAILED and now passes, assign PROBATION
184
+ // instead of immediate CERTIFIED. Requires consecutive passes to regain full trust.
185
+ const previousStatus = agent.certificationStatus;
186
+ if (previousStatus === CertificationStatus.FAILED ||
187
+ previousStatus === CertificationStatus.SUSPENDED ||
188
+ previousStatus === CertificationStatus.DRIFT_WARNING) {
189
+ agent.certificationStatus = CertificationStatus.PROBATION;
190
+ }
191
+ else if (previousStatus === CertificationStatus.PROBATION) {
192
+ // Second consecutive pass from PROBATION -> fully CERTIFIED
193
+ agent.certificationStatus = CertificationStatus.CERTIFIED;
194
+ }
195
+ else {
196
+ agent.certificationStatus = CertificationStatus.CERTIFIED;
197
+ }
198
+ // Update hierarchical progress
199
+ if (record.level === 1)
200
+ agent.hierarchicalProgress.level1_morality = LevelStatus.PASSED;
201
+ if (record.level === 2)
202
+ agent.hierarchicalProgress.level2_virtue = LevelStatus.PASSED;
203
+ if (record.level === 3)
204
+ agent.hierarchicalProgress.level3_ethics = LevelStatus.PASSED;
205
+ if (record.level === 4)
206
+ agent.hierarchicalProgress.level4_opex = LevelStatus.PASSED;
207
+ }
208
+ else {
209
+ agent.certificationStatus = CertificationStatus.FAILED;
210
+ if (record.level === 1)
211
+ agent.hierarchicalProgress.level1_morality = LevelStatus.FAILED;
212
+ if (record.level === 2)
213
+ agent.hierarchicalProgress.level2_virtue = LevelStatus.FAILED;
214
+ if (record.level === 3)
215
+ agent.hierarchicalProgress.level3_ethics = LevelStatus.FAILED;
216
+ if (record.level === 4)
217
+ agent.hierarchicalProgress.level4_opex = LevelStatus.FAILED;
218
+ }
219
+ // Update drift baseline (EMA) if we have scores
220
+ if (record.scores) {
221
+ if (!agent.driftBaseline) {
222
+ agent.driftBaseline = { ...record.scores };
223
+ }
224
+ else {
225
+ // Exponential moving average
226
+ const alpha = 0.3;
227
+ for (const [dim, score] of Object.entries(record.scores)) {
228
+ const prev = agent.driftBaseline[dim] ?? score;
229
+ agent.driftBaseline[dim] = prev * (1 - alpha) + score * alpha;
230
+ }
231
+ }
232
+ }
233
+ this.maybePersist();
234
+ return agent;
235
+ }
236
+ /**
237
+ * Update an agent's certification status directly.
238
+ */
239
+ updateStatus(agentId, status) {
240
+ const agent = this.agents.get(agentId);
241
+ if (!agent)
242
+ throw new Error(`Agent not found: ${agentId}`);
243
+ agent.certificationStatus = status;
244
+ this.maybePersist();
245
+ return agent;
246
+ }
247
+ /**
248
+ * Set the next assessment due date for an agent.
249
+ */
250
+ scheduleAssessment(agentId, dueAt) {
251
+ const agent = this.agents.get(agentId);
252
+ if (!agent)
253
+ throw new Error(`Agent not found: ${agentId}`);
254
+ agent.nextAssessmentDue = dueAt;
255
+ this.maybePersist();
256
+ return agent;
257
+ }
258
+ // ============================================================
259
+ // Persistence — JSON file (Phase 1)
260
+ // ============================================================
261
+ persist() {
262
+ if (!this.persistPath)
263
+ return;
264
+ const dir = path.dirname(this.persistPath);
265
+ if (!fs.existsSync(dir)) {
266
+ fs.mkdirSync(dir, { recursive: true });
267
+ }
268
+ const data = JSON.stringify(this.all(), dateReplacer, 2);
269
+ // Atomic write: write to temp then rename
270
+ const tmp = this.persistPath + ".tmp";
271
+ fs.writeFileSync(tmp, data, "utf-8");
272
+ fs.renameSync(tmp, this.persistPath);
273
+ }
274
+ loadFromDisk() {
275
+ if (!this.persistPath || !fs.existsSync(this.persistPath))
276
+ return;
277
+ try {
278
+ const raw = fs.readFileSync(this.persistPath, "utf-8");
279
+ const records = JSON.parse(raw, dateReviver);
280
+ for (const record of records) {
281
+ this.agents.set(record.agentId, record);
282
+ }
283
+ }
284
+ catch {
285
+ // Corrupted file — start fresh
286
+ console.warn(`[grillo:registry] Failed to load registry from ${this.persistPath}, starting fresh`);
287
+ }
288
+ }
289
+ maybePersist() {
290
+ if (this.autoPersist)
291
+ this.persist();
292
+ }
293
+ // ============================================================
294
+ // Summary / Stats
295
+ // ============================================================
296
+ summary() {
297
+ const agents = this.all();
298
+ const byStatus = {};
299
+ const byCategory = {};
300
+ const byRiskTier = {};
301
+ for (const a of agents) {
302
+ byStatus[a.certificationStatus] =
303
+ (byStatus[a.certificationStatus] ?? 0) + 1;
304
+ byCategory[a.category] = (byCategory[a.category] ?? 0) + 1;
305
+ byRiskTier[a.riskTier] = (byRiskTier[a.riskTier] ?? 0) + 1;
306
+ }
307
+ return {
308
+ total: agents.length,
309
+ certified: byStatus[CertificationStatus.CERTIFIED] ?? 0,
310
+ failed: byStatus[CertificationStatus.FAILED] ?? 0,
311
+ uncertified: byStatus[CertificationStatus.UNCERTIFIED] ?? 0,
312
+ assessing: byStatus[CertificationStatus.ASSESSING] ?? 0,
313
+ expired: byStatus[CertificationStatus.EXPIRED] ?? 0,
314
+ driftWarning: byStatus[CertificationStatus.DRIFT_WARNING] ?? 0,
315
+ byStatus: byStatus,
316
+ byCategory: byCategory,
317
+ byRiskTier: byRiskTier,
318
+ };
319
+ }
320
+ }
321
+ // ================================================================
322
+ // Helpers
323
+ // ================================================================
324
+ function defaultProgress() {
325
+ return {
326
+ level1_morality: LevelStatus.AVAILABLE,
327
+ level2_virtue: LevelStatus.LOCKED,
328
+ level3_ethics: LevelStatus.LOCKED,
329
+ level4_opex: LevelStatus.LOCKED,
330
+ };
331
+ }
332
+ function toArray(val) {
333
+ return Array.isArray(val) ? val : [val];
334
+ }
335
+ /** JSON.stringify replacer: convert Date to ISO string. */
336
+ function dateReplacer(_key, value) {
337
+ if (value instanceof Date)
338
+ return value.toISOString();
339
+ return value;
340
+ }
341
+ /** JSON.parse reviver: convert ISO date strings back to Date. */
342
+ function dateReviver(_key, value) {
343
+ if (typeof value === "string" &&
344
+ /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(value)) {
345
+ return new Date(value);
346
+ }
347
+ return value;
348
+ }
349
+ //# sourceMappingURL=agent-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-registry.js","sourceRoot":"","sources":["../../src/registry/agent-registry.ts"],"names":[],"mappings":"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"}