tryassay 0.6.0 → 0.11.1
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/dist/api/pricing-enforcer.d.ts +45 -0
- package/dist/api/pricing-enforcer.js +144 -0
- package/dist/api/pricing-enforcer.js.map +1 -0
- package/dist/api/server.d.ts +28 -0
- package/dist/api/server.js +265 -0
- package/dist/api/server.js.map +1 -0
- package/dist/api/team-session.d.ts +59 -0
- package/dist/api/team-session.js +240 -0
- package/dist/api/team-session.js.map +1 -0
- package/dist/cli.js +123 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/api.d.ts +4 -0
- package/dist/commands/api.js +50 -0
- package/dist/commands/api.js.map +1 -0
- package/dist/commands/runtime.d.ts +61 -0
- package/dist/commands/runtime.js +554 -0
- package/dist/commands/runtime.js.map +1 -1
- package/dist/runtime/agent-spawner.d.ts +56 -0
- package/dist/runtime/agent-spawner.js +217 -0
- package/dist/runtime/agent-spawner.js.map +1 -0
- package/dist/runtime/agents/coordinator-agent.d.ts +20 -0
- package/dist/runtime/agents/coordinator-agent.js +182 -0
- package/dist/runtime/agents/coordinator-agent.js.map +1 -0
- package/dist/runtime/agents/ops-agent.d.ts +11 -0
- package/dist/runtime/agents/ops-agent.js +113 -0
- package/dist/runtime/agents/ops-agent.js.map +1 -0
- package/dist/runtime/agents/research-agent.d.ts +11 -0
- package/dist/runtime/agents/research-agent.js +114 -0
- package/dist/runtime/agents/research-agent.js.map +1 -0
- package/dist/runtime/agents/test-agent.d.ts +11 -0
- package/dist/runtime/agents/test-agent.js +114 -0
- package/dist/runtime/agents/test-agent.js.map +1 -0
- package/dist/runtime/audit-log.js +2 -2
- package/dist/runtime/audit-log.js.map +1 -1
- package/dist/runtime/capability-registry.d.ts +62 -0
- package/dist/runtime/capability-registry.js +191 -0
- package/dist/runtime/capability-registry.js.map +1 -0
- package/dist/runtime/collusion-detector.d.ts +35 -0
- package/dist/runtime/collusion-detector.js +97 -0
- package/dist/runtime/collusion-detector.js.map +1 -0
- package/dist/runtime/control-server.js +8 -4
- package/dist/runtime/control-server.js.map +1 -1
- package/dist/runtime/domain-coverage-analyzer.d.ts +24 -0
- package/dist/runtime/domain-coverage-analyzer.js +178 -0
- package/dist/runtime/domain-coverage-analyzer.js.map +1 -0
- package/dist/runtime/executor.js +27 -12
- package/dist/runtime/executor.js.map +1 -1
- package/dist/runtime/human-escalation.d.ts +41 -0
- package/dist/runtime/human-escalation.js +122 -0
- package/dist/runtime/human-escalation.js.map +1 -0
- package/dist/runtime/kill-switch.d.ts +51 -0
- package/dist/runtime/kill-switch.js +185 -0
- package/dist/runtime/kill-switch.js.map +1 -0
- package/dist/runtime/layer2-guardian.d.ts +81 -0
- package/dist/runtime/layer2-guardian.js +263 -0
- package/dist/runtime/layer2-guardian.js.map +1 -0
- package/dist/runtime/multi-agent-loop.d.ts +37 -0
- package/dist/runtime/multi-agent-loop.js +411 -0
- package/dist/runtime/multi-agent-loop.js.map +1 -0
- package/dist/runtime/prompt-safety-analyzer.d.ts +17 -0
- package/dist/runtime/prompt-safety-analyzer.js +230 -0
- package/dist/runtime/prompt-safety-analyzer.js.map +1 -0
- package/dist/runtime/rollback-manager.d.ts +50 -0
- package/dist/runtime/rollback-manager.js +157 -0
- package/dist/runtime/rollback-manager.js.map +1 -0
- package/dist/runtime/rule-canary-deployer.d.ts +69 -0
- package/dist/runtime/rule-canary-deployer.js +289 -0
- package/dist/runtime/rule-canary-deployer.js.map +1 -0
- package/dist/runtime/rule-conflict-detector.d.ts +48 -0
- package/dist/runtime/rule-conflict-detector.js +214 -0
- package/dist/runtime/rule-conflict-detector.js.map +1 -0
- package/dist/runtime/rule-meta-verifier.d.ts +18 -0
- package/dist/runtime/rule-meta-verifier.js +275 -0
- package/dist/runtime/rule-meta-verifier.js.map +1 -0
- package/dist/runtime/rule-proposal-manager.d.ts +95 -0
- package/dist/runtime/rule-proposal-manager.js +190 -0
- package/dist/runtime/rule-proposal-manager.js.map +1 -0
- package/dist/runtime/safety-enforcer.d.ts +35 -0
- package/dist/runtime/safety-enforcer.js +165 -0
- package/dist/runtime/safety-enforcer.js.map +1 -0
- package/dist/runtime/safety-status.d.ts +48 -0
- package/dist/runtime/safety-status.js +119 -0
- package/dist/runtime/safety-status.js.map +1 -0
- package/dist/runtime/shared-memory.d.ts +47 -0
- package/dist/runtime/shared-memory.js +151 -0
- package/dist/runtime/shared-memory.js.map +1 -0
- package/dist/runtime/specialized-agent.d.ts +5 -0
- package/dist/runtime/specialized-agent.js +37 -0
- package/dist/runtime/specialized-agent.js.map +1 -1
- package/dist/runtime/stall-detector.d.ts +13 -0
- package/dist/runtime/stall-detector.js +121 -0
- package/dist/runtime/stall-detector.js.map +1 -0
- package/dist/runtime/tool-approval.d.ts +51 -0
- package/dist/runtime/tool-approval.js +148 -0
- package/dist/runtime/tool-approval.js.map +1 -0
- package/dist/runtime/tool-sandbox.d.ts +43 -0
- package/dist/runtime/tool-sandbox.js +394 -0
- package/dist/runtime/tool-sandbox.js.map +1 -0
- package/dist/runtime/tool-verifier.d.ts +18 -0
- package/dist/runtime/tool-verifier.js +323 -0
- package/dist/runtime/tool-verifier.js.map +1 -0
- package/dist/runtime/trust-manager.d.ts +33 -3
- package/dist/runtime/trust-manager.js +128 -26
- package/dist/runtime/trust-manager.js.map +1 -1
- package/dist/runtime/types.d.ts +652 -0
- package/dist/runtime/verification-intensity.d.ts +34 -0
- package/dist/runtime/verification-intensity.js +104 -0
- package/dist/runtime/verification-intensity.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Assay Verified Agent Runtime — Safety Policy Enforcer
|
|
3
|
+
// Circuit breakers that halt the system when safety thresholds
|
|
4
|
+
// are exceeded. Integrates trust, collusion, and stall signals.
|
|
5
|
+
// ============================================================
|
|
6
|
+
import { randomUUID } from 'node:crypto';
|
|
7
|
+
// ── Safety Enforcer ────────────────────────────────────────
|
|
8
|
+
export class SafetyEnforcer {
|
|
9
|
+
policy;
|
|
10
|
+
trustManager;
|
|
11
|
+
collusionDetector;
|
|
12
|
+
escalationManager;
|
|
13
|
+
breakers = [];
|
|
14
|
+
halted = false;
|
|
15
|
+
haltReason = null;
|
|
16
|
+
constructor(policy, trustManager, collusionDetector, escalationManager) {
|
|
17
|
+
this.policy = policy;
|
|
18
|
+
this.trustManager = trustManager;
|
|
19
|
+
this.collusionDetector = collusionDetector;
|
|
20
|
+
this.escalationManager = escalationManager;
|
|
21
|
+
// Initialize circuit breakers
|
|
22
|
+
this.breakers = [
|
|
23
|
+
{
|
|
24
|
+
id: randomUUID(),
|
|
25
|
+
rule: 'max_formal_overrides_per_session',
|
|
26
|
+
currentValue: 0,
|
|
27
|
+
threshold: policy.escalationRules.maxFormalOverridesBeforeHalt,
|
|
28
|
+
tripped: false,
|
|
29
|
+
action: 'halt',
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
id: randomUUID(),
|
|
33
|
+
rule: 'max_trust_demotions_per_agent',
|
|
34
|
+
currentValue: 0,
|
|
35
|
+
threshold: policy.escalationRules.maxTrustDemotions,
|
|
36
|
+
tripped: false,
|
|
37
|
+
action: 'escalate',
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
id: randomUUID(),
|
|
41
|
+
rule: 'max_reject_cycles_per_task',
|
|
42
|
+
currentValue: 0,
|
|
43
|
+
threshold: policy.escalationRules.maxRejectCyclesPerTask,
|
|
44
|
+
tripped: false,
|
|
45
|
+
action: 'escalate',
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
id: randomUUID(),
|
|
49
|
+
rule: 'critical_collusion_detected',
|
|
50
|
+
currentValue: 0,
|
|
51
|
+
threshold: 1,
|
|
52
|
+
tripped: false,
|
|
53
|
+
action: 'halt',
|
|
54
|
+
},
|
|
55
|
+
];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Check all safety signals and trip breakers if thresholds exceeded.
|
|
59
|
+
* Returns whether the system should halt.
|
|
60
|
+
*/
|
|
61
|
+
evaluate(context) {
|
|
62
|
+
if (this.halted) {
|
|
63
|
+
return { shouldHalt: true, trippedBreakers: [], reason: this.haltReason };
|
|
64
|
+
}
|
|
65
|
+
const tripped = [];
|
|
66
|
+
// Check formal override count across all agents
|
|
67
|
+
const allAgents = this.trustManager.getAllAgents();
|
|
68
|
+
let totalOverrides = 0;
|
|
69
|
+
let maxDemotions = 0;
|
|
70
|
+
for (const agent of allAgents) {
|
|
71
|
+
const stats = this.trustManager.getSessionStats(agent.id);
|
|
72
|
+
totalOverrides += stats.overrides;
|
|
73
|
+
if (stats.demotions > maxDemotions) {
|
|
74
|
+
maxDemotions = stats.demotions;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Formal override breaker
|
|
78
|
+
const overrideBreaker = this.breakers.find(b => b.rule === 'max_formal_overrides_per_session');
|
|
79
|
+
overrideBreaker.currentValue = totalOverrides;
|
|
80
|
+
if (totalOverrides >= overrideBreaker.threshold && !overrideBreaker.tripped) {
|
|
81
|
+
overrideBreaker.tripped = true;
|
|
82
|
+
overrideBreaker.trippedAt = new Date().toISOString();
|
|
83
|
+
tripped.push(overrideBreaker);
|
|
84
|
+
}
|
|
85
|
+
// Trust demotion breaker
|
|
86
|
+
const demotionBreaker = this.breakers.find(b => b.rule === 'max_trust_demotions_per_agent');
|
|
87
|
+
demotionBreaker.currentValue = maxDemotions;
|
|
88
|
+
if (maxDemotions >= demotionBreaker.threshold && !demotionBreaker.tripped) {
|
|
89
|
+
demotionBreaker.tripped = true;
|
|
90
|
+
demotionBreaker.trippedAt = new Date().toISOString();
|
|
91
|
+
tripped.push(demotionBreaker);
|
|
92
|
+
// Find which agent triggered this
|
|
93
|
+
const collapsedAgent = allAgents.find(a => {
|
|
94
|
+
const stats = this.trustManager.getSessionStats(a.id);
|
|
95
|
+
return stats.demotions >= demotionBreaker.threshold;
|
|
96
|
+
});
|
|
97
|
+
if (collapsedAgent) {
|
|
98
|
+
this.escalationManager.escalateTrustCollapse(collapsedAgent.id, maxDemotions, context);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Critical collusion breaker
|
|
102
|
+
const collusionBreaker = this.breakers.find(b => b.rule === 'critical_collusion_detected');
|
|
103
|
+
const criticalCollusions = this.collusionDetector.getCriticalEvents();
|
|
104
|
+
collusionBreaker.currentValue = criticalCollusions.length;
|
|
105
|
+
if (criticalCollusions.length >= collusionBreaker.threshold && !collusionBreaker.tripped) {
|
|
106
|
+
collusionBreaker.tripped = true;
|
|
107
|
+
collusionBreaker.trippedAt = new Date().toISOString();
|
|
108
|
+
tripped.push(collusionBreaker);
|
|
109
|
+
// Escalate each critical collusion event
|
|
110
|
+
for (const event of criticalCollusions) {
|
|
111
|
+
this.escalationManager.escalateCollusion(event, context);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Determine if we should halt
|
|
115
|
+
const haltBreakers = tripped.filter(b => b.action === 'halt');
|
|
116
|
+
if (haltBreakers.length > 0) {
|
|
117
|
+
this.halted = true;
|
|
118
|
+
this.haltReason = `Safety halt: ${haltBreakers.map(b => b.rule).join(', ')}`;
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
shouldHalt: this.halted,
|
|
122
|
+
trippedBreakers: tripped,
|
|
123
|
+
reason: this.haltReason,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Check if a specific task has exceeded reject cycles.
|
|
128
|
+
*/
|
|
129
|
+
checkTaskRejectCycles(taskId, attempts, context) {
|
|
130
|
+
const rejectBreaker = this.breakers.find(b => b.rule === 'max_reject_cycles_per_task');
|
|
131
|
+
if (attempts >= rejectBreaker.threshold) {
|
|
132
|
+
rejectBreaker.currentValue = attempts;
|
|
133
|
+
if (!rejectBreaker.tripped) {
|
|
134
|
+
rejectBreaker.tripped = true;
|
|
135
|
+
rejectBreaker.trippedAt = new Date().toISOString();
|
|
136
|
+
}
|
|
137
|
+
this.escalationManager.escalateStall([{ taskId, type: 'reject_loop', duration: 0, attempts, suggestedAction: 'escalate' }], context);
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
/** Get all circuit breakers and their states. */
|
|
143
|
+
getBreakers() {
|
|
144
|
+
return this.breakers;
|
|
145
|
+
}
|
|
146
|
+
/** Check if the system is halted. */
|
|
147
|
+
isHalted() {
|
|
148
|
+
return this.halted;
|
|
149
|
+
}
|
|
150
|
+
/** Get the halt reason if halted. */
|
|
151
|
+
getHaltReason() {
|
|
152
|
+
return this.haltReason;
|
|
153
|
+
}
|
|
154
|
+
/** Reset all circuit breakers (e.g., after human intervention). */
|
|
155
|
+
reset() {
|
|
156
|
+
this.halted = false;
|
|
157
|
+
this.haltReason = null;
|
|
158
|
+
for (const breaker of this.breakers) {
|
|
159
|
+
breaker.tripped = false;
|
|
160
|
+
breaker.currentValue = 0;
|
|
161
|
+
delete breaker.trippedAt;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=safety-enforcer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safety-enforcer.js","sourceRoot":"","sources":["../../src/runtime/safety-enforcer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Layer2Guardian } from './layer2-guardian.js';
|
|
2
|
+
import { KillSwitch } from './kill-switch.js';
|
|
3
|
+
import { RollbackManager } from './rollback-manager.js';
|
|
4
|
+
import type { IntegrityCheckResult, KillSwitchEvent, RollbackEvent } from './types.js';
|
|
5
|
+
export interface SafetyReport {
|
|
6
|
+
readonly timestamp: string;
|
|
7
|
+
readonly overall_status: 'safe' | 'degraded' | 'critical' | 'halted';
|
|
8
|
+
readonly layer2: {
|
|
9
|
+
readonly integrity: IntegrityCheckResult | null;
|
|
10
|
+
readonly manifest_present: boolean;
|
|
11
|
+
readonly permissions_valid: boolean;
|
|
12
|
+
readonly permission_findings: readonly {
|
|
13
|
+
path: string;
|
|
14
|
+
issue: string;
|
|
15
|
+
}[];
|
|
16
|
+
};
|
|
17
|
+
readonly kill_switch: {
|
|
18
|
+
readonly system_halted: boolean;
|
|
19
|
+
readonly suspended_count: number;
|
|
20
|
+
readonly suspended_entities: readonly {
|
|
21
|
+
target: string;
|
|
22
|
+
level: string;
|
|
23
|
+
reason: string;
|
|
24
|
+
since: string;
|
|
25
|
+
}[];
|
|
26
|
+
readonly recent_events: readonly KillSwitchEvent[];
|
|
27
|
+
};
|
|
28
|
+
readonly rollback: {
|
|
29
|
+
readonly total_rollbacks: number;
|
|
30
|
+
readonly recent_rollbacks: readonly RollbackEvent[];
|
|
31
|
+
readonly auto_rollbacks: number;
|
|
32
|
+
readonly human_rollbacks: number;
|
|
33
|
+
readonly layer2_rollbacks: number;
|
|
34
|
+
};
|
|
35
|
+
readonly recommendations: readonly string[];
|
|
36
|
+
}
|
|
37
|
+
export declare class SafetyStatusReporter {
|
|
38
|
+
private guardian;
|
|
39
|
+
private killSwitch;
|
|
40
|
+
private rollbackManager;
|
|
41
|
+
constructor(guardian: Layer2Guardian, killSwitch: KillSwitch, rollbackManager: RollbackManager);
|
|
42
|
+
/**
|
|
43
|
+
* Generate a comprehensive safety status report.
|
|
44
|
+
*/
|
|
45
|
+
generateReport(): Promise<SafetyReport>;
|
|
46
|
+
private determineOverallStatus;
|
|
47
|
+
private generateRecommendations;
|
|
48
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Assay Verified Agent Runtime — Safety Status Reporter
|
|
3
|
+
// Aggregates all safety subsystems into a single report:
|
|
4
|
+
// - Layer 2 integrity
|
|
5
|
+
// - Kill switch state
|
|
6
|
+
// - Rollback history
|
|
7
|
+
// - Suspended entities
|
|
8
|
+
// - Overall safety posture
|
|
9
|
+
// ============================================================
|
|
10
|
+
// ── Safety Status Reporter ─────────────────────────────
|
|
11
|
+
export class SafetyStatusReporter {
|
|
12
|
+
guardian;
|
|
13
|
+
killSwitch;
|
|
14
|
+
rollbackManager;
|
|
15
|
+
constructor(guardian, killSwitch, rollbackManager) {
|
|
16
|
+
this.guardian = guardian;
|
|
17
|
+
this.killSwitch = killSwitch;
|
|
18
|
+
this.rollbackManager = rollbackManager;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Generate a comprehensive safety status report.
|
|
22
|
+
*/
|
|
23
|
+
async generateReport() {
|
|
24
|
+
// Layer 2 status
|
|
25
|
+
const audit = await this.guardian.fullAudit();
|
|
26
|
+
// Kill switch status
|
|
27
|
+
const suspended = this.killSwitch.getSuspended();
|
|
28
|
+
const suspendedEntries = Array.from(suspended.entries()).map(([target, event]) => ({
|
|
29
|
+
target,
|
|
30
|
+
level: event.level,
|
|
31
|
+
reason: event.reason,
|
|
32
|
+
since: event.timestamp,
|
|
33
|
+
}));
|
|
34
|
+
const ksEvents = this.killSwitch.getEventLog();
|
|
35
|
+
const recentKsEvents = ksEvents.slice(-10); // Last 10 events
|
|
36
|
+
// Rollback status
|
|
37
|
+
const rollbackHistory = this.rollbackManager.getHistory();
|
|
38
|
+
const recentRollbacks = rollbackHistory.slice(-10);
|
|
39
|
+
const autoRollbacks = rollbackHistory.filter(r => r.trigger === 'automatic').length;
|
|
40
|
+
const humanRollbacks = rollbackHistory.filter(r => r.trigger === 'human').length;
|
|
41
|
+
const layer2Rollbacks = rollbackHistory.filter(r => r.trigger === 'layer2').length;
|
|
42
|
+
// Recommendations
|
|
43
|
+
const recommendations = this.generateRecommendations(audit, suspended.size, rollbackHistory);
|
|
44
|
+
// Overall status
|
|
45
|
+
const overallStatus = this.determineOverallStatus(audit, this.killSwitch.isSystemHalted(), suspended.size, rollbackHistory);
|
|
46
|
+
return {
|
|
47
|
+
timestamp: new Date().toISOString(),
|
|
48
|
+
overall_status: overallStatus,
|
|
49
|
+
layer2: {
|
|
50
|
+
integrity: audit.integrity,
|
|
51
|
+
manifest_present: audit.manifestPresent,
|
|
52
|
+
permissions_valid: audit.permissions.valid,
|
|
53
|
+
permission_findings: audit.permissions.findings,
|
|
54
|
+
},
|
|
55
|
+
kill_switch: {
|
|
56
|
+
system_halted: this.killSwitch.isSystemHalted(),
|
|
57
|
+
suspended_count: suspended.size,
|
|
58
|
+
suspended_entities: suspendedEntries,
|
|
59
|
+
recent_events: recentKsEvents,
|
|
60
|
+
},
|
|
61
|
+
rollback: {
|
|
62
|
+
total_rollbacks: rollbackHistory.length,
|
|
63
|
+
recent_rollbacks: recentRollbacks,
|
|
64
|
+
auto_rollbacks: autoRollbacks,
|
|
65
|
+
human_rollbacks: humanRollbacks,
|
|
66
|
+
layer2_rollbacks: layer2Rollbacks,
|
|
67
|
+
},
|
|
68
|
+
recommendations,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
// ── Private helpers ────────────────────────────────────
|
|
72
|
+
determineOverallStatus(audit, systemHalted, suspendedCount, rollbackHistory) {
|
|
73
|
+
if (systemHalted)
|
|
74
|
+
return 'halted';
|
|
75
|
+
if (audit.integrity.overall === 'violation')
|
|
76
|
+
return 'critical';
|
|
77
|
+
if (!audit.manifestPresent)
|
|
78
|
+
return 'degraded';
|
|
79
|
+
if (!audit.permissions.valid)
|
|
80
|
+
return 'degraded';
|
|
81
|
+
// Recent rollbacks indicate instability
|
|
82
|
+
const recentRollbacks = rollbackHistory.filter(r => {
|
|
83
|
+
const age = Date.now() - new Date(r.timestamp).getTime();
|
|
84
|
+
return age < 60 * 60 * 1000; // Last hour
|
|
85
|
+
});
|
|
86
|
+
if (recentRollbacks.length >= 3)
|
|
87
|
+
return 'degraded';
|
|
88
|
+
if (suspendedCount > 0)
|
|
89
|
+
return 'degraded';
|
|
90
|
+
return 'safe';
|
|
91
|
+
}
|
|
92
|
+
generateRecommendations(audit, suspendedCount, rollbackHistory) {
|
|
93
|
+
const recommendations = [];
|
|
94
|
+
if (!audit.manifestPresent) {
|
|
95
|
+
recommendations.push('No Layer 2 manifest found. Run "tryassay runtime safety sign" to generate one.');
|
|
96
|
+
}
|
|
97
|
+
if (audit.integrity.overall === 'violation') {
|
|
98
|
+
recommendations.push('CRITICAL: Layer 2 integrity violation detected. Redeploy verified Layer 2 artifacts immediately.');
|
|
99
|
+
}
|
|
100
|
+
if (!audit.permissions.valid) {
|
|
101
|
+
for (const finding of audit.permissions.findings) {
|
|
102
|
+
recommendations.push(`Fix permissions: ${finding.path} — ${finding.issue}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (suspendedCount > 0) {
|
|
106
|
+
recommendations.push(`${suspendedCount} entity(ies) currently suspended. Review and release or replace.`);
|
|
107
|
+
}
|
|
108
|
+
// Check for repeated auto-rollbacks (indicates systemic issue)
|
|
109
|
+
const autoRollbacks = rollbackHistory.filter(r => r.trigger === 'automatic');
|
|
110
|
+
if (autoRollbacks.length >= 5) {
|
|
111
|
+
recommendations.push(`${autoRollbacks.length} automatic rollbacks recorded. Review tool/rule quality before deploying new capabilities.`);
|
|
112
|
+
}
|
|
113
|
+
if (recommendations.length === 0) {
|
|
114
|
+
recommendations.push('All safety systems operating normally.');
|
|
115
|
+
}
|
|
116
|
+
return recommendations;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=safety-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safety-status.js","sourceRoot":"","sources":["../../src/runtime/safety-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { MemoryEntry, MemoryEntryType, MemoryFilter, MemoryConflict, ConflictResolution, BoundaryVerificationStatus, BoundaryClaim } from './types.js';
|
|
2
|
+
export declare class SharedMemoryStore {
|
|
3
|
+
private entries;
|
|
4
|
+
private conflicts;
|
|
5
|
+
/**
|
|
6
|
+
* Add a new entry to shared memory.
|
|
7
|
+
* Checks for conflicts with existing entries by the same tags.
|
|
8
|
+
* Returns the entry ID and any detected conflicts.
|
|
9
|
+
*/
|
|
10
|
+
add(type: MemoryEntryType, content: string, author: string, opts?: {
|
|
11
|
+
tags?: string[];
|
|
12
|
+
verificationStatus?: BoundaryVerificationStatus;
|
|
13
|
+
claims?: readonly BoundaryClaim[];
|
|
14
|
+
confidence?: number;
|
|
15
|
+
supersedes?: string;
|
|
16
|
+
}): {
|
|
17
|
+
entryId: string;
|
|
18
|
+
conflicts: MemoryConflict[];
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Query entries by filter criteria.
|
|
22
|
+
*/
|
|
23
|
+
query(filter: MemoryFilter): readonly MemoryEntry[];
|
|
24
|
+
/** Get entries by tag. */
|
|
25
|
+
getByTag(tag: string): readonly MemoryEntry[];
|
|
26
|
+
/** Get entries by author agent ID. */
|
|
27
|
+
getByAgent(agentId: string): readonly MemoryEntry[];
|
|
28
|
+
/** Get only entries where all claims passed verification. */
|
|
29
|
+
getVerified(): readonly MemoryEntry[];
|
|
30
|
+
/** Get all detected conflicts. */
|
|
31
|
+
getConflicts(): readonly MemoryConflict[];
|
|
32
|
+
/** Get only open (unresolved) conflicts. */
|
|
33
|
+
getOpenConflicts(): readonly MemoryConflict[];
|
|
34
|
+
/** Resolve a conflict. */
|
|
35
|
+
resolveConflict(conflictId: string, resolution: ConflictResolution): boolean;
|
|
36
|
+
/** Escalate a conflict for human resolution. */
|
|
37
|
+
escalateConflict(conflictId: string): boolean;
|
|
38
|
+
/** Get all entries (for snapshots and audit). */
|
|
39
|
+
getAllEntries(): readonly MemoryEntry[];
|
|
40
|
+
/** Get entry by ID. */
|
|
41
|
+
getEntry(entryId: string): MemoryEntry | undefined;
|
|
42
|
+
/** Get the entry that superseded a given entry. */
|
|
43
|
+
getSuperseding(entryId: string): MemoryEntry | undefined;
|
|
44
|
+
/** Update verification status of an entry after boundary verification. */
|
|
45
|
+
updateVerification(entryId: string, status: BoundaryVerificationStatus, claims?: readonly BoundaryClaim[], confidence?: number): void;
|
|
46
|
+
private detectConflicts;
|
|
47
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Assay Verified Agent Runtime — Shared Memory Store
|
|
3
|
+
// Append-only shared state with conflict detection.
|
|
4
|
+
// Agents write facts, decisions, conventions, findings.
|
|
5
|
+
// No mutable shared state — conflicts are detected, not hidden.
|
|
6
|
+
// ============================================================
|
|
7
|
+
import { randomUUID } from 'node:crypto';
|
|
8
|
+
// ── Shared Memory Store ────────────────────────────────────
|
|
9
|
+
export class SharedMemoryStore {
|
|
10
|
+
entries = [];
|
|
11
|
+
conflicts = [];
|
|
12
|
+
/**
|
|
13
|
+
* Add a new entry to shared memory.
|
|
14
|
+
* Checks for conflicts with existing entries by the same tags.
|
|
15
|
+
* Returns the entry ID and any detected conflicts.
|
|
16
|
+
*/
|
|
17
|
+
add(type, content, author, opts) {
|
|
18
|
+
const entry = {
|
|
19
|
+
id: randomUUID(),
|
|
20
|
+
type,
|
|
21
|
+
content,
|
|
22
|
+
author,
|
|
23
|
+
tags: opts?.tags ?? [],
|
|
24
|
+
verificationStatus: opts?.verificationStatus ?? 'unverified',
|
|
25
|
+
claims: opts?.claims ?? [],
|
|
26
|
+
confidence: opts?.confidence ?? 0.5,
|
|
27
|
+
createdAt: new Date().toISOString(),
|
|
28
|
+
supersedes: opts?.supersedes,
|
|
29
|
+
};
|
|
30
|
+
this.entries.push(entry);
|
|
31
|
+
// Detect conflicts: entries with overlapping tags that make contradictory claims
|
|
32
|
+
const newConflicts = this.detectConflicts(entry);
|
|
33
|
+
this.conflicts.push(...newConflicts);
|
|
34
|
+
return { entryId: entry.id, conflicts: newConflicts };
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Query entries by filter criteria.
|
|
38
|
+
*/
|
|
39
|
+
query(filter) {
|
|
40
|
+
return this.entries.filter(entry => {
|
|
41
|
+
if (filter.type && entry.type !== filter.type)
|
|
42
|
+
return false;
|
|
43
|
+
if (filter.tags && filter.tags.length > 0) {
|
|
44
|
+
const hasTag = filter.tags.some(t => entry.tags.includes(t));
|
|
45
|
+
if (!hasTag)
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
if (filter.minConfidence !== undefined && entry.confidence < filter.minConfidence)
|
|
49
|
+
return false;
|
|
50
|
+
if (filter.verificationStatus && entry.verificationStatus !== filter.verificationStatus)
|
|
51
|
+
return false;
|
|
52
|
+
if (filter.author && entry.author !== filter.author)
|
|
53
|
+
return false;
|
|
54
|
+
if (filter.since && entry.createdAt < filter.since)
|
|
55
|
+
return false;
|
|
56
|
+
return true;
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
/** Get entries by tag. */
|
|
60
|
+
getByTag(tag) {
|
|
61
|
+
return this.entries.filter(e => e.tags.includes(tag));
|
|
62
|
+
}
|
|
63
|
+
/** Get entries by author agent ID. */
|
|
64
|
+
getByAgent(agentId) {
|
|
65
|
+
return this.entries.filter(e => e.author === agentId);
|
|
66
|
+
}
|
|
67
|
+
/** Get only entries where all claims passed verification. */
|
|
68
|
+
getVerified() {
|
|
69
|
+
return this.entries.filter(e => e.verificationStatus === 'verified' || e.verificationStatus === 'formally_verified');
|
|
70
|
+
}
|
|
71
|
+
/** Get all detected conflicts. */
|
|
72
|
+
getConflicts() {
|
|
73
|
+
return this.conflicts;
|
|
74
|
+
}
|
|
75
|
+
/** Get only open (unresolved) conflicts. */
|
|
76
|
+
getOpenConflicts() {
|
|
77
|
+
return this.conflicts.filter(c => c.status === 'open');
|
|
78
|
+
}
|
|
79
|
+
/** Resolve a conflict. */
|
|
80
|
+
resolveConflict(conflictId, resolution) {
|
|
81
|
+
const conflict = this.conflicts.find(c => c.id === conflictId);
|
|
82
|
+
if (!conflict || conflict.status !== 'open')
|
|
83
|
+
return false;
|
|
84
|
+
// Mutate the conflict record (conflicts are mutable tracking state)
|
|
85
|
+
conflict.resolution = resolution;
|
|
86
|
+
conflict.status = 'resolved';
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
/** Escalate a conflict for human resolution. */
|
|
90
|
+
escalateConflict(conflictId) {
|
|
91
|
+
const conflict = this.conflicts.find(c => c.id === conflictId);
|
|
92
|
+
if (!conflict || conflict.status !== 'open')
|
|
93
|
+
return false;
|
|
94
|
+
conflict.status = 'escalated';
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
/** Get all entries (for snapshots and audit). */
|
|
98
|
+
getAllEntries() {
|
|
99
|
+
return this.entries;
|
|
100
|
+
}
|
|
101
|
+
/** Get entry by ID. */
|
|
102
|
+
getEntry(entryId) {
|
|
103
|
+
return this.entries.find(e => e.id === entryId);
|
|
104
|
+
}
|
|
105
|
+
/** Get the entry that superseded a given entry. */
|
|
106
|
+
getSuperseding(entryId) {
|
|
107
|
+
return this.entries.find(e => e.supersedes === entryId);
|
|
108
|
+
}
|
|
109
|
+
/** Update verification status of an entry after boundary verification. */
|
|
110
|
+
updateVerification(entryId, status, claims, confidence) {
|
|
111
|
+
const entry = this.entries.find(e => e.id === entryId);
|
|
112
|
+
if (!entry)
|
|
113
|
+
return;
|
|
114
|
+
entry.verificationStatus = status;
|
|
115
|
+
if (claims) {
|
|
116
|
+
entry.claims = claims;
|
|
117
|
+
}
|
|
118
|
+
if (confidence !== undefined) {
|
|
119
|
+
entry.confidence = confidence;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// ── Private ─────────────────────────────────────────────
|
|
123
|
+
detectConflicts(newEntry) {
|
|
124
|
+
const detected = [];
|
|
125
|
+
// Only check entries with overlapping tags
|
|
126
|
+
if (newEntry.tags.length === 0)
|
|
127
|
+
return detected;
|
|
128
|
+
// Find entries that share tags and are the same type
|
|
129
|
+
const candidates = this.entries.filter(existing => existing.id !== newEntry.id &&
|
|
130
|
+
existing.type === newEntry.type &&
|
|
131
|
+
existing.tags.some(t => newEntry.tags.includes(t)) &&
|
|
132
|
+
!existing.supersedes && // Don't conflict with superseded entries
|
|
133
|
+
!newEntry.supersedes // If new entry supersedes something, that's resolution, not conflict
|
|
134
|
+
);
|
|
135
|
+
for (const candidate of candidates) {
|
|
136
|
+
// Simple heuristic: if two entries of the same type with the same tags
|
|
137
|
+
// have different content and are from different authors, flag as potential conflict
|
|
138
|
+
if (candidate.author !== newEntry.author &&
|
|
139
|
+
candidate.content !== newEntry.content) {
|
|
140
|
+
detected.push({
|
|
141
|
+
id: randomUUID(),
|
|
142
|
+
entries: [candidate, newEntry],
|
|
143
|
+
detectedBy: 'assay',
|
|
144
|
+
status: 'open',
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return detected;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=shared-memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-memory.js","sourceRoot":"","sources":["../../src/runtime/shared-memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -65,3 +65,8 @@ export declare abstract class SpecializedAgent {
|
|
|
65
65
|
metadata?: Record<string, unknown>;
|
|
66
66
|
}): BoundaryArtifact;
|
|
67
67
|
}
|
|
68
|
+
export declare function checkModelDiversity(agents: AgentIdentity[]): {
|
|
69
|
+
diverse: boolean;
|
|
70
|
+
providers: Map<string, string[]>;
|
|
71
|
+
recommendation: string | null;
|
|
72
|
+
};
|
|
@@ -83,4 +83,41 @@ export class SpecializedAgent {
|
|
|
83
83
|
};
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
|
+
// ── Model Diversity Checker ────────────────────────────────
|
|
87
|
+
export function checkModelDiversity(agents) {
|
|
88
|
+
const providers = new Map();
|
|
89
|
+
for (const agent of agents) {
|
|
90
|
+
// Extract provider from model name (e.g., "claude-sonnet-4-5" -> "anthropic")
|
|
91
|
+
const provider = inferProvider(agent.model);
|
|
92
|
+
const existing = providers.get(provider) ?? [];
|
|
93
|
+
existing.push(agent.name);
|
|
94
|
+
providers.set(provider, existing);
|
|
95
|
+
}
|
|
96
|
+
// Model diversity is satisfied if agents that verify each other
|
|
97
|
+
// use different providers
|
|
98
|
+
const allSameProvider = providers.size === 1;
|
|
99
|
+
const recommendation = allSameProvider
|
|
100
|
+
? 'All agents use the same provider. Consider using different providers for Code and Review agents to reduce correlated failures.'
|
|
101
|
+
: null;
|
|
102
|
+
return {
|
|
103
|
+
diverse: !allSameProvider,
|
|
104
|
+
providers,
|
|
105
|
+
recommendation,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
function inferProvider(model) {
|
|
109
|
+
if (model.startsWith('claude') || model.includes('anthropic'))
|
|
110
|
+
return 'anthropic';
|
|
111
|
+
if (model.startsWith('gpt') || model.includes('openai'))
|
|
112
|
+
return 'openai';
|
|
113
|
+
if (model.startsWith('gemini') || model.includes('google'))
|
|
114
|
+
return 'google';
|
|
115
|
+
if (model.startsWith('llama') || model.includes('meta'))
|
|
116
|
+
return 'meta';
|
|
117
|
+
if (model.startsWith('mistral'))
|
|
118
|
+
return 'mistral';
|
|
119
|
+
if (model.startsWith('deepseek'))
|
|
120
|
+
return 'deepseek';
|
|
121
|
+
return 'unknown';
|
|
122
|
+
}
|
|
86
123
|
//# sourceMappingURL=specialized-agent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"specialized-agent.js","sourceRoot":"","sources":["../../src/runtime/specialized-agent.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"specialized-agent.js","sourceRoot":"","sources":["../../src/runtime/specialized-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { TaskGraph, StallReport } from './types.js';
|
|
2
|
+
export declare class StallDetector {
|
|
3
|
+
/**
|
|
4
|
+
* Detect stalls in a task graph.
|
|
5
|
+
* Returns stall reports for any problematic tasks.
|
|
6
|
+
*/
|
|
7
|
+
detectStalls(graph: TaskGraph, thresholdMs: number): StallReport[];
|
|
8
|
+
/**
|
|
9
|
+
* Detect circular dependencies in the task graph.
|
|
10
|
+
* Returns task IDs involved in deadlock cycles.
|
|
11
|
+
*/
|
|
12
|
+
private detectDeadlocks;
|
|
13
|
+
}
|