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,263 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Assay Verified Agent Runtime — Layer 2 Guardian
|
|
3
|
+
// Enforces immutability of the verification substrate.
|
|
4
|
+
//
|
|
5
|
+
// Four levels of enforcement:
|
|
6
|
+
// 1. Process isolation: validates caller is not an agent process
|
|
7
|
+
// 2. Filesystem permissions: verifies Layer 2 files are read-only
|
|
8
|
+
// 3. Cryptographic signing: SHA-256 hash verification of all artifacts
|
|
9
|
+
// 4. Immutable deployment: manifest-based integrity check on startup
|
|
10
|
+
//
|
|
11
|
+
// If ANY level detects a violation, the system halts.
|
|
12
|
+
// ============================================================
|
|
13
|
+
import { createHash } from 'node:crypto';
|
|
14
|
+
import { readFile, stat, writeFile, mkdir } from 'node:fs/promises';
|
|
15
|
+
import { join, dirname } from 'node:path';
|
|
16
|
+
// ── Layer 2 Component Paths (relative to project root) ───
|
|
17
|
+
const DEFAULT_LAYER2_COMPONENTS = [
|
|
18
|
+
{ component: 'formal_verifier', path: 'api/lib/formal-verifier.ts' },
|
|
19
|
+
{ component: 'verification_protocol', path: 'api/v1/forward.ts' },
|
|
20
|
+
{ component: 'approval_framework', path: 'src/runtime/tool-approval.ts' },
|
|
21
|
+
{ component: 'immutability_constraint', path: 'src/runtime/layer2-guardian.ts' },
|
|
22
|
+
{ component: 'kill_switch', path: 'src/runtime/kill-switch.ts' },
|
|
23
|
+
];
|
|
24
|
+
// ── Layer 2 Guardian ───────────────────────────────────
|
|
25
|
+
export class Layer2Guardian {
|
|
26
|
+
projectRoot;
|
|
27
|
+
manifestPath;
|
|
28
|
+
manifest = null;
|
|
29
|
+
componentPaths;
|
|
30
|
+
constructor(projectRoot, opts) {
|
|
31
|
+
this.projectRoot = projectRoot;
|
|
32
|
+
this.manifestPath = opts?.manifestPath ?? join(projectRoot, '.assay', 'layer2-manifest.json');
|
|
33
|
+
this.componentPaths = opts?.componentPaths ?? DEFAULT_LAYER2_COMPONENTS;
|
|
34
|
+
}
|
|
35
|
+
// ── Level 1: Process Isolation Validation ──────────────
|
|
36
|
+
/**
|
|
37
|
+
* Validate that a modification proposal does not target Layer 2.
|
|
38
|
+
* This is the first line of defense: structural prevention at the type level.
|
|
39
|
+
*/
|
|
40
|
+
validateProposal(proposal) {
|
|
41
|
+
// Type-level check: modifies_layer2 must be literal false
|
|
42
|
+
if (proposal.safety.modifies_layer2 !== false) {
|
|
43
|
+
return {
|
|
44
|
+
valid: false,
|
|
45
|
+
reason: 'BLOCKED: Proposal declares modifies_layer2 = true. Layer 2 cannot be modified by agents.',
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
if (proposal.safety.modifies_approval_framework !== false) {
|
|
49
|
+
return {
|
|
50
|
+
valid: false,
|
|
51
|
+
reason: 'BLOCKED: Proposal declares modifies_approval_framework = true. The approval framework is part of Layer 2.',
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
// Content check: scan the payload for references to Layer 2 files
|
|
55
|
+
const payloadStr = JSON.stringify(proposal.payload);
|
|
56
|
+
for (const comp of this.componentPaths) {
|
|
57
|
+
if (payloadStr.includes(comp.path)) {
|
|
58
|
+
return {
|
|
59
|
+
valid: false,
|
|
60
|
+
reason: `BLOCKED: Proposal payload references Layer 2 component "${comp.component}" (${comp.path}).`,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return { valid: true, reason: 'Proposal does not target Layer 2.' };
|
|
65
|
+
}
|
|
66
|
+
// ── Level 2: Filesystem Permission Verification ────────
|
|
67
|
+
/**
|
|
68
|
+
* Verify that Layer 2 files have appropriate permissions.
|
|
69
|
+
* In production, Layer 2 files should be owned by a different user
|
|
70
|
+
* and be read-only from the agent's perspective.
|
|
71
|
+
*/
|
|
72
|
+
async verifyPermissions() {
|
|
73
|
+
const findings = [];
|
|
74
|
+
for (const comp of this.componentPaths) {
|
|
75
|
+
const fullPath = join(this.projectRoot, comp.path);
|
|
76
|
+
try {
|
|
77
|
+
const stats = await stat(fullPath);
|
|
78
|
+
// Check that file is not world-writable
|
|
79
|
+
// mode & 0o002 checks the "others write" bit
|
|
80
|
+
const mode = stats.mode;
|
|
81
|
+
if (mode & 0o002) {
|
|
82
|
+
findings.push({
|
|
83
|
+
path: comp.path,
|
|
84
|
+
issue: `World-writable (mode: ${mode.toString(8)}). Layer 2 files must not be world-writable.`,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
// In development mode, we can't enforce strict ownership
|
|
88
|
+
// but we log the permissions for audit purposes
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
findings.push({
|
|
92
|
+
path: comp.path,
|
|
93
|
+
issue: `Cannot stat file: ${err instanceof Error ? err.message : String(err)}`,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
valid: findings.length === 0,
|
|
99
|
+
findings,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
// ── Level 3: Cryptographic Signing ─────────────────────
|
|
103
|
+
/**
|
|
104
|
+
* Generate a Layer 2 manifest by hashing all component files.
|
|
105
|
+
* This is called during deployment (by humans), not at runtime (by agents).
|
|
106
|
+
*/
|
|
107
|
+
async generateManifest(deployedBy) {
|
|
108
|
+
const components = [];
|
|
109
|
+
for (const comp of this.componentPaths) {
|
|
110
|
+
const fullPath = join(this.projectRoot, comp.path);
|
|
111
|
+
try {
|
|
112
|
+
const content = await readFile(fullPath, 'utf-8');
|
|
113
|
+
const hash = createHash('sha256').update(content).digest('hex');
|
|
114
|
+
const stats = await stat(fullPath);
|
|
115
|
+
components.push({
|
|
116
|
+
component: comp.component,
|
|
117
|
+
file_path: comp.path,
|
|
118
|
+
hash,
|
|
119
|
+
size_bytes: stats.size,
|
|
120
|
+
last_verified: new Date().toISOString(),
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
throw new Error(`Cannot read Layer 2 component "${comp.component}" at ${comp.path}: ${err instanceof Error ? err.message : String(err)}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Generate manifest hash (hash of all component hashes)
|
|
128
|
+
const allHashes = components.map(c => c.hash).join(':');
|
|
129
|
+
const manifestHash = createHash('sha256').update(allHashes).digest('hex');
|
|
130
|
+
const manifest = {
|
|
131
|
+
version: new Date().toISOString().replace(/[-:T]/g, '').slice(0, 14),
|
|
132
|
+
deployed_at: new Date().toISOString(),
|
|
133
|
+
deployed_by: deployedBy,
|
|
134
|
+
components,
|
|
135
|
+
manifest_hash: manifestHash,
|
|
136
|
+
signing_key_id: 'local-dev', // In production: HSM key ID
|
|
137
|
+
};
|
|
138
|
+
this.manifest = manifest;
|
|
139
|
+
return manifest;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Save the manifest to disk.
|
|
143
|
+
*/
|
|
144
|
+
async saveManifest(manifest) {
|
|
145
|
+
const m = manifest ?? this.manifest;
|
|
146
|
+
if (!m)
|
|
147
|
+
throw new Error('No manifest to save. Call generateManifest() first.');
|
|
148
|
+
await mkdir(dirname(this.manifestPath), { recursive: true });
|
|
149
|
+
await writeFile(this.manifestPath, JSON.stringify(m, null, 2), 'utf-8');
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Load the manifest from disk.
|
|
153
|
+
*/
|
|
154
|
+
async loadManifest() {
|
|
155
|
+
try {
|
|
156
|
+
const raw = await readFile(this.manifestPath, 'utf-8');
|
|
157
|
+
this.manifest = JSON.parse(raw);
|
|
158
|
+
return this.manifest;
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// ── Level 4: Integrity Verification on Startup ─────────
|
|
165
|
+
/**
|
|
166
|
+
* Verify Layer 2 integrity by comparing current file hashes
|
|
167
|
+
* against the signed manifest. Called at system startup.
|
|
168
|
+
*
|
|
169
|
+
* If ANY component has been modified, returns a violation.
|
|
170
|
+
* The caller MUST halt the system on violation.
|
|
171
|
+
*/
|
|
172
|
+
async verifyIntegrity() {
|
|
173
|
+
const manifest = this.manifest ?? await this.loadManifest();
|
|
174
|
+
if (!manifest) {
|
|
175
|
+
return {
|
|
176
|
+
timestamp: new Date().toISOString(),
|
|
177
|
+
manifest_version: 'none',
|
|
178
|
+
components_checked: 0,
|
|
179
|
+
components_valid: 0,
|
|
180
|
+
components_invalid: [{
|
|
181
|
+
component: 'formal_verifier',
|
|
182
|
+
file_path: 'N/A',
|
|
183
|
+
expected_hash: 'N/A',
|
|
184
|
+
actual_hash: 'N/A',
|
|
185
|
+
severity: 'critical',
|
|
186
|
+
action: 'halt',
|
|
187
|
+
}],
|
|
188
|
+
overall: 'violation',
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
const violations = [];
|
|
192
|
+
for (const entry of manifest.components) {
|
|
193
|
+
const fullPath = join(this.projectRoot, entry.file_path);
|
|
194
|
+
try {
|
|
195
|
+
const content = await readFile(fullPath, 'utf-8');
|
|
196
|
+
const actualHash = createHash('sha256').update(content).digest('hex');
|
|
197
|
+
if (actualHash !== entry.hash) {
|
|
198
|
+
violations.push({
|
|
199
|
+
component: entry.component,
|
|
200
|
+
file_path: entry.file_path,
|
|
201
|
+
expected_hash: entry.hash,
|
|
202
|
+
actual_hash: actualHash,
|
|
203
|
+
severity: 'critical',
|
|
204
|
+
action: 'halt',
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
violations.push({
|
|
210
|
+
component: entry.component,
|
|
211
|
+
file_path: entry.file_path,
|
|
212
|
+
expected_hash: entry.hash,
|
|
213
|
+
actual_hash: 'FILE_NOT_FOUND',
|
|
214
|
+
severity: 'critical',
|
|
215
|
+
action: 'halt',
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
// Also verify the manifest hash itself
|
|
220
|
+
const allHashes = manifest.components.map(c => c.hash).join(':');
|
|
221
|
+
const expectedManifestHash = createHash('sha256').update(allHashes).digest('hex');
|
|
222
|
+
if (expectedManifestHash !== manifest.manifest_hash) {
|
|
223
|
+
violations.push({
|
|
224
|
+
component: 'immutability_constraint',
|
|
225
|
+
file_path: this.manifestPath,
|
|
226
|
+
expected_hash: manifest.manifest_hash,
|
|
227
|
+
actual_hash: expectedManifestHash,
|
|
228
|
+
severity: 'critical',
|
|
229
|
+
action: 'halt',
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
return {
|
|
233
|
+
timestamp: new Date().toISOString(),
|
|
234
|
+
manifest_version: manifest.version,
|
|
235
|
+
components_checked: manifest.components.length,
|
|
236
|
+
components_valid: manifest.components.length - violations.length,
|
|
237
|
+
components_invalid: violations,
|
|
238
|
+
overall: violations.length === 0 ? 'valid' : 'violation',
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Run all four levels of verification.
|
|
243
|
+
* Returns a comprehensive status report.
|
|
244
|
+
*/
|
|
245
|
+
async fullAudit() {
|
|
246
|
+
const permissions = await this.verifyPermissions();
|
|
247
|
+
const integrity = await this.verifyIntegrity();
|
|
248
|
+
const manifestPresent = this.manifest !== null;
|
|
249
|
+
return {
|
|
250
|
+
permissions,
|
|
251
|
+
integrity,
|
|
252
|
+
manifestPresent,
|
|
253
|
+
overallSafe: permissions.valid && integrity.overall === 'valid' && manifestPresent,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Get the current manifest (if loaded).
|
|
258
|
+
*/
|
|
259
|
+
getManifest() {
|
|
260
|
+
return this.manifest;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=layer2-guardian.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layer2-guardian.js","sourceRoot":"","sources":["../../src/runtime/layer2-guardian.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import { SharedMemoryStore } from './shared-memory.js';
|
|
3
|
+
import type { AuditEntry, TeamConfig, TeamResult } from './types.js';
|
|
4
|
+
export declare class MultiAgentLoop extends EventEmitter {
|
|
5
|
+
private messageBus;
|
|
6
|
+
private compositionVerifier;
|
|
7
|
+
private trustManager;
|
|
8
|
+
private sharedMemory;
|
|
9
|
+
private stallDetector;
|
|
10
|
+
private agents;
|
|
11
|
+
private auditTrail;
|
|
12
|
+
private config;
|
|
13
|
+
private codebaseRoot;
|
|
14
|
+
constructor(codebaseRoot: string, config: TeamConfig);
|
|
15
|
+
/**
|
|
16
|
+
* Run the full multi-agent loop on a goal.
|
|
17
|
+
* 1. Coordinator decomposes goal into task graph
|
|
18
|
+
* 2. Ready tasks are assigned to agents
|
|
19
|
+
* 3. Each agent output passes through boundary verification
|
|
20
|
+
* 4. Completed tasks unlock dependent tasks
|
|
21
|
+
* 5. Stall detector monitors for problems
|
|
22
|
+
* 6. Loop until all tasks complete, fail, or escalate
|
|
23
|
+
*/
|
|
24
|
+
run(): Promise<TeamResult>;
|
|
25
|
+
/** Get the current audit trail. */
|
|
26
|
+
getAuditTrail(): readonly AuditEntry[];
|
|
27
|
+
/** Get the shared memory store. */
|
|
28
|
+
getSharedMemory(): SharedMemoryStore;
|
|
29
|
+
private updateReadyTasks;
|
|
30
|
+
private getReviewTarget;
|
|
31
|
+
private buildContextRefs;
|
|
32
|
+
private parseDecomposition;
|
|
33
|
+
private buildGraph;
|
|
34
|
+
private makeEmptyGraph;
|
|
35
|
+
private makeResult;
|
|
36
|
+
private audit;
|
|
37
|
+
}
|