@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,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":"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"}
|
|
@@ -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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"}
|