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,113 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Ops Agent — Handles deployment verification, health checks,
|
|
3
|
+
// and infrastructure operations
|
|
4
|
+
// ============================================================
|
|
5
|
+
import { SpecializedAgent, } from '../specialized-agent.js';
|
|
6
|
+
export class OpsAgent extends SpecializedAgent {
|
|
7
|
+
constructor(messageBus, opts) {
|
|
8
|
+
super('ops-agent', 'ops', [
|
|
9
|
+
{ name: 'deploy_verify', description: 'Verify deployment configuration and results', tools: ['file_read', 'shell'] },
|
|
10
|
+
{ name: 'health_check', description: 'Run health checks against running services', tools: ['shell'] },
|
|
11
|
+
{ name: 'infra_audit', description: 'Audit infrastructure configuration', tools: ['file_read'] },
|
|
12
|
+
], messageBus, { model: opts?.model, initialTrust: 'untrusted' });
|
|
13
|
+
}
|
|
14
|
+
onMessage(_message) {
|
|
15
|
+
// Ops agent primarily receives task assignments
|
|
16
|
+
}
|
|
17
|
+
async executeTask(task) {
|
|
18
|
+
const contextSnippets = task.contextRefs
|
|
19
|
+
.map(ref => `Context: ${ref.summary}\n${ref.content ?? ''}`)
|
|
20
|
+
.join('\n\n');
|
|
21
|
+
const systemPrompt = `You are an Ops Agent — a specialized AI that handles deployment verification and infrastructure operations.
|
|
22
|
+
|
|
23
|
+
Your job: Given deployment tasks or health check requirements, produce structured operational results.
|
|
24
|
+
|
|
25
|
+
Rules:
|
|
26
|
+
1. Every deployment verification must include pre-conditions and post-conditions.
|
|
27
|
+
2. Health checks must specify what endpoints/services were checked and their status.
|
|
28
|
+
3. Report rollback recommendations if any check fails.
|
|
29
|
+
4. Flag security misconfigurations (exposed secrets, missing auth, open ports).
|
|
30
|
+
5. State claims explicitly — they will be verified.
|
|
31
|
+
|
|
32
|
+
Respond with JSON:
|
|
33
|
+
{
|
|
34
|
+
"checks": [
|
|
35
|
+
{
|
|
36
|
+
"name": "...",
|
|
37
|
+
"target": "...",
|
|
38
|
+
"status": "pass" | "fail" | "warn",
|
|
39
|
+
"details": "...",
|
|
40
|
+
"rollbackRecommendation": "..." | null
|
|
41
|
+
}
|
|
42
|
+
],
|
|
43
|
+
"deploymentManifest": { "files": ["..."], "envVars": ["..."], "services": ["..."] } | null,
|
|
44
|
+
"summary": "...",
|
|
45
|
+
"claims": ["..."]
|
|
46
|
+
}`;
|
|
47
|
+
const userPrompt = `OPS TASK: ${task.goal}
|
|
48
|
+
|
|
49
|
+
CONSTRAINTS:
|
|
50
|
+
${task.constraints.map(c => `- ${c}`).join('\n')}
|
|
51
|
+
|
|
52
|
+
CONTEXT:
|
|
53
|
+
${contextSnippets || 'No additional context provided.'}
|
|
54
|
+
|
|
55
|
+
Execute the ops task now. Be explicit about what was checked and what the results are.`;
|
|
56
|
+
try {
|
|
57
|
+
const { content } = await this.callClaude(systemPrompt, userPrompt);
|
|
58
|
+
const parsed = this.parseOpsResponse(content);
|
|
59
|
+
const artifactType = parsed.checks.length > 0 ? 'health_check' : 'deploy_result';
|
|
60
|
+
const failedChecks = parsed.checks.filter(c => c.status === 'fail');
|
|
61
|
+
const artifact = this.makeArtifact(artifactType, content, {
|
|
62
|
+
metadata: {
|
|
63
|
+
checkCount: parsed.checks.length,
|
|
64
|
+
passCount: parsed.checks.filter(c => c.status === 'pass').length,
|
|
65
|
+
failCount: failedChecks.length,
|
|
66
|
+
warnCount: parsed.checks.filter(c => c.status === 'warn').length,
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
return {
|
|
70
|
+
taskId: task.taskId,
|
|
71
|
+
status: failedChecks.length > 0 ? 'blocked' : 'completed',
|
|
72
|
+
artifacts: [artifact],
|
|
73
|
+
summary: parsed.summary,
|
|
74
|
+
claimsAboutArtifacts: parsed.claims,
|
|
75
|
+
blockers: failedChecks.length > 0
|
|
76
|
+
? failedChecks.map(c => `${c.name}: ${c.details}`)
|
|
77
|
+
: undefined,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
return {
|
|
82
|
+
taskId: task.taskId,
|
|
83
|
+
status: 'failed',
|
|
84
|
+
artifacts: [],
|
|
85
|
+
summary: `Ops task failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
86
|
+
claimsAboutArtifacts: [],
|
|
87
|
+
blockers: [err instanceof Error ? err.message : String(err)],
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
parseOpsResponse(raw) {
|
|
92
|
+
let cleaned = raw.trim();
|
|
93
|
+
if (cleaned.startsWith('```')) {
|
|
94
|
+
cleaned = cleaned.replace(/^```(?:json)?\s*/, '').replace(/\s*```$/, '');
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
const parsed = JSON.parse(cleaned);
|
|
98
|
+
return {
|
|
99
|
+
checks: Array.isArray(parsed.checks) ? parsed.checks : [],
|
|
100
|
+
summary: typeof parsed.summary === 'string' ? parsed.summary : 'No summary',
|
|
101
|
+
claims: Array.isArray(parsed.claims) ? parsed.claims : [],
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return {
|
|
106
|
+
checks: [],
|
|
107
|
+
summary: 'Failed to parse ops response',
|
|
108
|
+
claims: [],
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=ops-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ops-agent.js","sourceRoot":"","sources":["../../../src/runtime/agents/ops-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { SpecializedAgent, type TaskAssignmentPayload, type TaskResultPayload } from '../specialized-agent.js';
|
|
2
|
+
import type { AgentMessage } from '../types.js';
|
|
3
|
+
import type { MessageBus } from '../message-bus.js';
|
|
4
|
+
export declare class ResearchAgent extends SpecializedAgent {
|
|
5
|
+
constructor(messageBus: MessageBus, opts?: {
|
|
6
|
+
model?: string;
|
|
7
|
+
});
|
|
8
|
+
protected onMessage(_message: AgentMessage): void;
|
|
9
|
+
executeTask(task: TaskAssignmentPayload): Promise<TaskResultPayload>;
|
|
10
|
+
private parseResearchResponse;
|
|
11
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Research Agent — Investigates problems, reads docs, provides
|
|
3
|
+
// sourced findings with citations and confidence levels
|
|
4
|
+
// ============================================================
|
|
5
|
+
import { SpecializedAgent, } from '../specialized-agent.js';
|
|
6
|
+
export class ResearchAgent extends SpecializedAgent {
|
|
7
|
+
constructor(messageBus, opts) {
|
|
8
|
+
super('research-agent', 'research', [
|
|
9
|
+
{ name: 'investigate', description: 'Investigate problems and error messages', tools: ['file_read'] },
|
|
10
|
+
{ name: 'read_docs', description: 'Read documentation and API references', tools: ['file_read'] },
|
|
11
|
+
{ name: 'search_codebase', description: 'Search codebase for patterns and usage', tools: ['file_read'] },
|
|
12
|
+
], messageBus, { model: opts?.model, initialTrust: 'untrusted' });
|
|
13
|
+
}
|
|
14
|
+
onMessage(_message) {
|
|
15
|
+
// Research agent primarily receives questions and task assignments
|
|
16
|
+
}
|
|
17
|
+
async executeTask(task) {
|
|
18
|
+
const contextSnippets = task.contextRefs
|
|
19
|
+
.map(ref => `Context: ${ref.summary}\n${ref.content ?? ''}`)
|
|
20
|
+
.join('\n\n');
|
|
21
|
+
const systemPrompt = `You are a Research Agent — a specialized AI that investigates problems and provides sourced findings.
|
|
22
|
+
|
|
23
|
+
Your job: Given a question or problem, research it thoroughly and provide findings with citations.
|
|
24
|
+
|
|
25
|
+
Rules:
|
|
26
|
+
1. Every finding MUST include a source citation (file path, URL, or documentation reference).
|
|
27
|
+
2. State confidence level for each finding: high (verified against source), medium (inferred from context), low (best guess).
|
|
28
|
+
3. Unsourced claims must be explicitly marked as "unsourced — needs verification."
|
|
29
|
+
4. Distinguish between facts (from docs/code) and inferences (your reasoning).
|
|
30
|
+
5. If you cannot find an answer, say so clearly — do not fabricate sources.
|
|
31
|
+
|
|
32
|
+
Respond with JSON:
|
|
33
|
+
{
|
|
34
|
+
"findings": [
|
|
35
|
+
{
|
|
36
|
+
"claim": "...",
|
|
37
|
+
"source": "...",
|
|
38
|
+
"sourceType": "file" | "documentation" | "codebase_pattern" | "inference" | "unsourced",
|
|
39
|
+
"confidence": "high" | "medium" | "low",
|
|
40
|
+
"evidence": "..."
|
|
41
|
+
}
|
|
42
|
+
],
|
|
43
|
+
"summary": "...",
|
|
44
|
+
"claims": ["..."],
|
|
45
|
+
"unanswered": ["..."]
|
|
46
|
+
}`;
|
|
47
|
+
const userPrompt = `RESEARCH TASK: ${task.goal}
|
|
48
|
+
|
|
49
|
+
CONSTRAINTS:
|
|
50
|
+
${task.constraints.map(c => `- ${c}`).join('\n')}
|
|
51
|
+
|
|
52
|
+
CONTEXT:
|
|
53
|
+
${contextSnippets || 'No additional context provided.'}
|
|
54
|
+
|
|
55
|
+
Research this now. Cite your sources. Flag anything you cannot verify.`;
|
|
56
|
+
try {
|
|
57
|
+
const { content } = await this.callClaude(systemPrompt, userPrompt);
|
|
58
|
+
const parsed = this.parseResearchResponse(content);
|
|
59
|
+
const artifact = this.makeArtifact('research_finding', content, {
|
|
60
|
+
metadata: {
|
|
61
|
+
findingCount: parsed.findings.length,
|
|
62
|
+
unansweredCount: parsed.unanswered.length,
|
|
63
|
+
confidenceCounts: {
|
|
64
|
+
high: parsed.findings.filter(f => f.confidence === 'high').length,
|
|
65
|
+
medium: parsed.findings.filter(f => f.confidence === 'medium').length,
|
|
66
|
+
low: parsed.findings.filter(f => f.confidence === 'low').length,
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
return {
|
|
71
|
+
taskId: task.taskId,
|
|
72
|
+
status: parsed.unanswered.length > 0 && parsed.findings.length === 0 ? 'blocked' : 'completed',
|
|
73
|
+
artifacts: [artifact],
|
|
74
|
+
summary: parsed.summary,
|
|
75
|
+
claimsAboutArtifacts: parsed.claims,
|
|
76
|
+
blockers: parsed.unanswered.length > 0 ? parsed.unanswered : undefined,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
return {
|
|
81
|
+
taskId: task.taskId,
|
|
82
|
+
status: 'failed',
|
|
83
|
+
artifacts: [],
|
|
84
|
+
summary: `Research failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
85
|
+
claimsAboutArtifacts: [],
|
|
86
|
+
blockers: [err instanceof Error ? err.message : String(err)],
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
parseResearchResponse(raw) {
|
|
91
|
+
let cleaned = raw.trim();
|
|
92
|
+
if (cleaned.startsWith('```')) {
|
|
93
|
+
cleaned = cleaned.replace(/^```(?:json)?\s*/, '').replace(/\s*```$/, '');
|
|
94
|
+
}
|
|
95
|
+
try {
|
|
96
|
+
const parsed = JSON.parse(cleaned);
|
|
97
|
+
return {
|
|
98
|
+
findings: Array.isArray(parsed.findings) ? parsed.findings : [],
|
|
99
|
+
summary: typeof parsed.summary === 'string' ? parsed.summary : 'No summary',
|
|
100
|
+
claims: Array.isArray(parsed.claims) ? parsed.claims : [],
|
|
101
|
+
unanswered: Array.isArray(parsed.unanswered) ? parsed.unanswered : [],
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return {
|
|
106
|
+
findings: [],
|
|
107
|
+
summary: 'Failed to parse research response',
|
|
108
|
+
claims: [],
|
|
109
|
+
unanswered: [],
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=research-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research-agent.js","sourceRoot":"","sources":["../../../src/runtime/agents/research-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { SpecializedAgent, type TaskAssignmentPayload, type TaskResultPayload } from '../specialized-agent.js';
|
|
2
|
+
import type { AgentMessage } from '../types.js';
|
|
3
|
+
import type { MessageBus } from '../message-bus.js';
|
|
4
|
+
export declare class TestAgent extends SpecializedAgent {
|
|
5
|
+
constructor(messageBus: MessageBus, opts?: {
|
|
6
|
+
model?: string;
|
|
7
|
+
});
|
|
8
|
+
protected onMessage(_message: AgentMessage): void;
|
|
9
|
+
executeTask(task: TaskAssignmentPayload): Promise<TaskResultPayload>;
|
|
10
|
+
private parseTestResponse;
|
|
11
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Test Agent — Writes tests, runs suites, reports coverage
|
|
3
|
+
// with test quality verification (meaningful vs trivial)
|
|
4
|
+
// ============================================================
|
|
5
|
+
import { SpecializedAgent, } from '../specialized-agent.js';
|
|
6
|
+
export class TestAgent extends SpecializedAgent {
|
|
7
|
+
constructor(messageBus, opts) {
|
|
8
|
+
super('test-agent', 'test', [
|
|
9
|
+
{ name: 'write_tests', description: 'Write unit and integration tests', tools: ['file_write'] },
|
|
10
|
+
{ name: 'run_tests', description: 'Run test suites and report results', tools: ['shell'] },
|
|
11
|
+
{ name: 'coverage', description: 'Analyze code coverage', tools: ['shell', 'file_read'] },
|
|
12
|
+
], messageBus, { model: opts?.model, initialTrust: 'untrusted' });
|
|
13
|
+
}
|
|
14
|
+
onMessage(_message) {
|
|
15
|
+
// Test agent primarily receives task assignments
|
|
16
|
+
}
|
|
17
|
+
async executeTask(task) {
|
|
18
|
+
const contextSnippets = task.contextRefs
|
|
19
|
+
.map(ref => `Context: ${ref.summary}\n${ref.content ?? ''}`)
|
|
20
|
+
.join('\n\n');
|
|
21
|
+
const systemPrompt = `You are a Test Agent — a specialized AI that writes and analyzes tests.
|
|
22
|
+
|
|
23
|
+
Your job: Given code and requirements, produce meaningful tests with real assertions.
|
|
24
|
+
|
|
25
|
+
Rules:
|
|
26
|
+
1. Every test must verify actual behavior, not just assert(true).
|
|
27
|
+
2. Minimize mocking — prefer real function calls over mock objects.
|
|
28
|
+
3. Cover edge cases: empty inputs, null/undefined, boundary values, error paths.
|
|
29
|
+
4. State what each test verifies as explicit claims (these will be quality-checked).
|
|
30
|
+
5. Include at least one negative test (expected failure case).
|
|
31
|
+
6. Report mock usage honestly — how many mocks vs real interactions.
|
|
32
|
+
|
|
33
|
+
Respond with JSON:
|
|
34
|
+
{
|
|
35
|
+
"testFiles": [{ "path": "...", "content": "...", "language": "..." }],
|
|
36
|
+
"summary": "...",
|
|
37
|
+
"claims": ["..."],
|
|
38
|
+
"testQuality": {
|
|
39
|
+
"totalTests": <number>,
|
|
40
|
+
"meaningfulTests": <number>,
|
|
41
|
+
"trivialTests": <number>,
|
|
42
|
+
"mockCount": <number>,
|
|
43
|
+
"realInteractionCount": <number>
|
|
44
|
+
}
|
|
45
|
+
}`;
|
|
46
|
+
const userPrompt = `TASK: ${task.goal}
|
|
47
|
+
|
|
48
|
+
CONSTRAINTS:
|
|
49
|
+
${task.constraints.map(c => `- ${c}`).join('\n')}
|
|
50
|
+
|
|
51
|
+
CONTEXT:
|
|
52
|
+
${contextSnippets || 'No additional context provided.'}
|
|
53
|
+
|
|
54
|
+
Write meaningful tests now. Remember: trivial tests (assert true, no-op mocks) will be detected and rejected.`;
|
|
55
|
+
try {
|
|
56
|
+
const { content } = await this.callClaude(systemPrompt, userPrompt);
|
|
57
|
+
const parsed = this.parseTestResponse(content);
|
|
58
|
+
const artifacts = parsed.testFiles.map(f => this.makeArtifact('test_file', f.content, {
|
|
59
|
+
path: f.path,
|
|
60
|
+
language: f.language,
|
|
61
|
+
metadata: {
|
|
62
|
+
testQuality: parsed.testQuality,
|
|
63
|
+
},
|
|
64
|
+
}));
|
|
65
|
+
return {
|
|
66
|
+
taskId: task.taskId,
|
|
67
|
+
status: 'completed',
|
|
68
|
+
artifacts,
|
|
69
|
+
summary: parsed.summary,
|
|
70
|
+
claimsAboutArtifacts: parsed.claims,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
return {
|
|
75
|
+
taskId: task.taskId,
|
|
76
|
+
status: 'failed',
|
|
77
|
+
artifacts: [],
|
|
78
|
+
summary: `Test generation failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
79
|
+
claimsAboutArtifacts: [],
|
|
80
|
+
blockers: [err instanceof Error ? err.message : String(err)],
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
parseTestResponse(raw) {
|
|
85
|
+
let cleaned = raw.trim();
|
|
86
|
+
if (cleaned.startsWith('```')) {
|
|
87
|
+
cleaned = cleaned.replace(/^```(?:json)?\s*/, '').replace(/\s*```$/, '');
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
const parsed = JSON.parse(cleaned);
|
|
91
|
+
return {
|
|
92
|
+
testFiles: Array.isArray(parsed.testFiles) ? parsed.testFiles : [],
|
|
93
|
+
summary: typeof parsed.summary === 'string' ? parsed.summary : 'No summary',
|
|
94
|
+
claims: Array.isArray(parsed.claims) ? parsed.claims : [],
|
|
95
|
+
testQuality: {
|
|
96
|
+
totalTests: typeof parsed.testQuality?.totalTests === 'number' ? parsed.testQuality.totalTests : 0,
|
|
97
|
+
meaningfulTests: typeof parsed.testQuality?.meaningfulTests === 'number' ? parsed.testQuality.meaningfulTests : 0,
|
|
98
|
+
trivialTests: typeof parsed.testQuality?.trivialTests === 'number' ? parsed.testQuality.trivialTests : 0,
|
|
99
|
+
mockCount: typeof parsed.testQuality?.mockCount === 'number' ? parsed.testQuality.mockCount : 0,
|
|
100
|
+
realInteractionCount: typeof parsed.testQuality?.realInteractionCount === 'number' ? parsed.testQuality.realInteractionCount : 0,
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return {
|
|
106
|
+
testFiles: [{ path: 'test.ts', content: raw, language: 'typescript' }],
|
|
107
|
+
summary: 'Raw test output (failed to parse structured response)',
|
|
108
|
+
claims: [],
|
|
109
|
+
testQuality: { totalTests: 0, meaningfulTests: 0, trivialTests: 0, mockCount: 0, realInteractionCount: 0 },
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=test-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-agent.js","sourceRoot":"","sources":["../../../src/runtime/agents/test-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -46,8 +46,8 @@ export class AuditLog {
|
|
|
46
46
|
if (entry.prevHash !== prevHash) {
|
|
47
47
|
return { valid: false, entries: entries.length, brokenAt: i };
|
|
48
48
|
}
|
|
49
|
-
// Compute hash of this entry (
|
|
50
|
-
//
|
|
49
|
+
// Compute hash of this entry (including prevHash, matching append logic)
|
|
50
|
+
// The full serialized line with prevHash set is what gets hashed
|
|
51
51
|
const line = JSON.stringify(entry);
|
|
52
52
|
prevHash = createHash('sha256').update(line).digest('hex');
|
|
53
53
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-log.js","sourceRoot":"","sources":["../../src/runtime/audit-log.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,2CAA2C;AAC3C,iEAAiE;AACjE,+DAA+D;AAE/D,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,+DAA+D;AAE/D,MAAM,OAAO,QAAQ;IACF,QAAQ,CAAS;IAC1B,QAAQ,GAAW,EAAE,CAAC;IAE9B,YAAY,QAAgB;QAC1B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,KAAiB;QAC5B,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAE9B,yDAAyD;QACzD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAC3C,CAAC;QAED,iBAAiB;QACjB,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE/B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEhE,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,eAAe;QAKnB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC;QACnD,CAAC;QAED,IAAI,QAAQ,GAAG,EAAE,CAAC;QAElB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAEzB,6CAA6C;YAC7C,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAChC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;YAChE,CAAC;YAED,
|
|
1
|
+
{"version":3,"file":"audit-log.js","sourceRoot":"","sources":["../../src/runtime/audit-log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { CapabilityRegistry, ToolDefinition, ModificationLogEntry } from './types.js';
|
|
2
|
+
export declare class CapabilityRegistryManager {
|
|
3
|
+
private registry;
|
|
4
|
+
private registryPath;
|
|
5
|
+
private versionHistory;
|
|
6
|
+
constructor(registryPath: string);
|
|
7
|
+
/**
|
|
8
|
+
* Load the registry from disk. Creates an empty one if not found.
|
|
9
|
+
*/
|
|
10
|
+
load(): Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* Save the registry to disk with updated manifest hash.
|
|
13
|
+
*/
|
|
14
|
+
save(): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Get the current registry state (readonly snapshot).
|
|
17
|
+
*/
|
|
18
|
+
getRegistry(): CapabilityRegistry;
|
|
19
|
+
/**
|
|
20
|
+
* Add a new tool to the registry.
|
|
21
|
+
* The tool must have status 'approved' before calling this.
|
|
22
|
+
*/
|
|
23
|
+
addTool(tool: ToolDefinition, approvedBy: string, proposalId: string): void;
|
|
24
|
+
/**
|
|
25
|
+
* Deprecate a tool. It remains in the registry but is no longer active.
|
|
26
|
+
*/
|
|
27
|
+
deprecateTool(toolId: string, deprecatedBy: string, _reason: string): void;
|
|
28
|
+
/**
|
|
29
|
+
* Rollback the registry to the previous version.
|
|
30
|
+
* Returns true if rollback succeeded, false if no history available.
|
|
31
|
+
*/
|
|
32
|
+
rollback(rolledBackBy: string): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Find a tool by ID across active and deprecated pools.
|
|
35
|
+
*/
|
|
36
|
+
findTool(toolId: string): ToolDefinition | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* List all active tools.
|
|
39
|
+
*/
|
|
40
|
+
listActiveTools(): readonly ToolDefinition[];
|
|
41
|
+
/**
|
|
42
|
+
* List all deprecated tools.
|
|
43
|
+
*/
|
|
44
|
+
listDeprecatedTools(): readonly ToolDefinition[];
|
|
45
|
+
/**
|
|
46
|
+
* Get the modification history.
|
|
47
|
+
*/
|
|
48
|
+
getModificationHistory(): readonly ModificationLogEntry[];
|
|
49
|
+
/**
|
|
50
|
+
* Verify registry integrity by recomputing the manifest hash.
|
|
51
|
+
*/
|
|
52
|
+
verifyIntegrity(): {
|
|
53
|
+
valid: boolean;
|
|
54
|
+
expected: string;
|
|
55
|
+
actual: string;
|
|
56
|
+
};
|
|
57
|
+
private createEmptyRegistry;
|
|
58
|
+
private pushHistory;
|
|
59
|
+
private incrementVersion;
|
|
60
|
+
private logModification;
|
|
61
|
+
private computeManifestHash;
|
|
62
|
+
}
|