tryassay 0.3.0 → 0.11.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/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 +142 -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 +69 -0
- package/dist/commands/runtime.js +673 -0
- package/dist/commands/runtime.js.map +1 -1
- package/dist/runtime/agent-loop.d.ts +6 -0
- package/dist/runtime/agent-loop.js +87 -5
- package/dist/runtime/agent-loop.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/code-agent.d.ts +11 -0
- package/dist/runtime/agents/code-agent.js +90 -0
- package/dist/runtime/agents/code-agent.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/review-agent.d.ts +11 -0
- package/dist/runtime/agents/review-agent.js +96 -0
- package/dist/runtime/agents/review-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/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/composition-verifier.d.ts +22 -0
- package/dist/runtime/composition-verifier.js +265 -0
- package/dist/runtime/composition-verifier.js.map +1 -0
- package/dist/runtime/confidence-calibrator.d.ts +10 -0
- package/dist/runtime/confidence-calibrator.js +95 -0
- package/dist/runtime/confidence-calibrator.js.map +1 -0
- 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/enriched-prompt-builder.d.ts +25 -0
- package/dist/runtime/enriched-prompt-builder.js +173 -0
- package/dist/runtime/enriched-prompt-builder.js.map +1 -0
- package/dist/runtime/gap-detector.d.ts +6 -0
- package/dist/runtime/gap-detector.js +111 -0
- package/dist/runtime/gap-detector.js.map +1 -0
- 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/message-bus.d.ts +57 -0
- package/dist/runtime/message-bus.js +115 -0
- package/dist/runtime/message-bus.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/pattern-extractor.d.ts +20 -0
- package/dist/runtime/pattern-extractor.js +257 -0
- package/dist/runtime/pattern-extractor.js.map +1 -0
- package/dist/runtime/planner.d.ts +2 -2
- package/dist/runtime/planner.js +10 -7
- package/dist/runtime/planner.js.map +1 -1
- 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/reasoner.d.ts +2 -2
- package/dist/runtime/reasoner.js +9 -5
- package/dist/runtime/reasoner.js.map +1 -1
- package/dist/runtime/reflector.d.ts +7 -1
- package/dist/runtime/reflector.js.map +1 -1
- 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/shadow-runner.d.ts +14 -0
- package/dist/runtime/shadow-runner.js +190 -0
- package/dist/runtime/shadow-runner.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 +72 -0
- package/dist/runtime/specialized-agent.js +123 -0
- package/dist/runtime/specialized-agent.js.map +1 -0
- 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/strategy-library.d.ts +11 -0
- package/dist/runtime/strategy-library.js +142 -0
- package/dist/runtime/strategy-library.js.map +1 -0
- package/dist/runtime/supabase-experience-store.d.ts +19 -0
- package/dist/runtime/supabase-experience-store.js +215 -0
- package/dist/runtime/supabase-experience-store.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 +63 -0
- package/dist/runtime/trust-manager.js +212 -0
- package/dist/runtime/trust-manager.js.map +1 -0
- package/dist/runtime/two-agent-loop.d.ts +35 -0
- package/dist/runtime/two-agent-loop.js +208 -0
- package/dist/runtime/two-agent-loop.js.map +1 -0
- package/dist/runtime/types.d.ts +939 -1
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"strategy-library.js","sourceRoot":"","sources":["../../src/runtime/strategy-library.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ExperienceStoreInterface } from './reflector.js';
|
|
2
|
+
import type { Experience, ExperienceOutcome, SkillProfile, ScoredExperience } from './types.js';
|
|
3
|
+
export declare class SupabaseExperienceStore implements ExperienceStoreInterface {
|
|
4
|
+
private supabase;
|
|
5
|
+
private localFallback;
|
|
6
|
+
private online;
|
|
7
|
+
constructor(supabaseUrl: string, supabaseKey: string, localFallbackPath: string);
|
|
8
|
+
save(experience: Experience): Promise<void>;
|
|
9
|
+
search(query: string, limit?: number): Promise<ScoredExperience[]>;
|
|
10
|
+
getByDomain(domain: string, limit?: number): Promise<Experience[]>;
|
|
11
|
+
getByOutcome(outcome: ExperienceOutcome, limit?: number): Promise<Experience[]>;
|
|
12
|
+
getRecent(limit?: number): Promise<Experience[]>;
|
|
13
|
+
count(): Promise<number>;
|
|
14
|
+
getStats(): Promise<SkillProfile[]>;
|
|
15
|
+
getRelevantExperiences(context: string, limit?: number): Promise<Experience[]>;
|
|
16
|
+
isOnline(): boolean;
|
|
17
|
+
private fallbackSearch;
|
|
18
|
+
private rowToExperience;
|
|
19
|
+
}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Assay Verified Agent Runtime — Supabase Experience Store
|
|
3
|
+
// Replaces NDJSON file with Supabase pgvector for semantic search.
|
|
4
|
+
// Falls back to local file when Supabase is unreachable.
|
|
5
|
+
// ============================================================
|
|
6
|
+
import { createClient } from '@supabase/supabase-js';
|
|
7
|
+
import { ExperienceStore } from './reflector.js';
|
|
8
|
+
// ── Embedding ─────────────────────────────────────────────────
|
|
9
|
+
function buildEmbeddingText(exp) {
|
|
10
|
+
const parts = [
|
|
11
|
+
exp.domain,
|
|
12
|
+
exp.decision.reasoning.slice(0, 300),
|
|
13
|
+
exp.lessons.join('. '),
|
|
14
|
+
exp.outcome,
|
|
15
|
+
exp.delta?.slice(0, 200) ?? '',
|
|
16
|
+
];
|
|
17
|
+
return parts.filter(Boolean).join(' | ');
|
|
18
|
+
}
|
|
19
|
+
async function computeEmbedding(text) {
|
|
20
|
+
// Use Anthropic's message API to generate a pseudo-embedding
|
|
21
|
+
// by hashing the semantic content. For production, swap to
|
|
22
|
+
// a dedicated embedding model (OpenAI text-embedding-3-small
|
|
23
|
+
// or Voyage AI). For now, use OpenAI since it's already a dep.
|
|
24
|
+
const { default: OpenAI } = await import('openai');
|
|
25
|
+
const client = new OpenAI();
|
|
26
|
+
const response = await client.embeddings.create({
|
|
27
|
+
model: 'text-embedding-3-small',
|
|
28
|
+
input: text.slice(0, 8000),
|
|
29
|
+
});
|
|
30
|
+
return response.data[0].embedding;
|
|
31
|
+
}
|
|
32
|
+
// ── SupabaseExperienceStore ──────────────────────────────────
|
|
33
|
+
export class SupabaseExperienceStore {
|
|
34
|
+
supabase;
|
|
35
|
+
localFallback;
|
|
36
|
+
online = true;
|
|
37
|
+
constructor(supabaseUrl, supabaseKey, localFallbackPath) {
|
|
38
|
+
this.supabase = createClient(supabaseUrl, supabaseKey);
|
|
39
|
+
this.localFallback = new ExperienceStore(localFallbackPath);
|
|
40
|
+
}
|
|
41
|
+
async save(experience) {
|
|
42
|
+
// Always write to local fallback
|
|
43
|
+
await this.localFallback.save(experience);
|
|
44
|
+
// Try Supabase
|
|
45
|
+
try {
|
|
46
|
+
const embeddingText = buildEmbeddingText(experience);
|
|
47
|
+
const embedding = await computeEmbedding(embeddingText);
|
|
48
|
+
const { error } = await this.supabase.from('experiences').insert({
|
|
49
|
+
id: experience.id,
|
|
50
|
+
agent_name: experience.observation.source === 'filesystem'
|
|
51
|
+
? 'default'
|
|
52
|
+
: 'default',
|
|
53
|
+
domain: experience.domain,
|
|
54
|
+
outcome: experience.outcome,
|
|
55
|
+
delta: experience.delta,
|
|
56
|
+
lessons: experience.lessons,
|
|
57
|
+
tags: experience.tags,
|
|
58
|
+
timestamp: experience.timestamp,
|
|
59
|
+
observation: experience.observation,
|
|
60
|
+
decision: experience.decision,
|
|
61
|
+
plan: experience.plan,
|
|
62
|
+
verification: experience.verification,
|
|
63
|
+
execution: experience.execution,
|
|
64
|
+
embedding: embedding,
|
|
65
|
+
});
|
|
66
|
+
if (error) {
|
|
67
|
+
console.error(`[SupabaseStore] Insert error: ${error.message}`);
|
|
68
|
+
this.online = false;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
this.online = true;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
76
|
+
console.error(`[SupabaseStore] Save failed, using local only: ${msg}`);
|
|
77
|
+
this.online = false;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async search(query, limit = 5) {
|
|
81
|
+
if (!this.online) {
|
|
82
|
+
return this.fallbackSearch(query, limit);
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
const queryEmbedding = await computeEmbedding(query);
|
|
86
|
+
const { data, error } = await this.supabase.rpc('match_experiences', {
|
|
87
|
+
query_embedding: queryEmbedding,
|
|
88
|
+
match_threshold: 0.3,
|
|
89
|
+
match_count: limit,
|
|
90
|
+
});
|
|
91
|
+
if (error || !data) {
|
|
92
|
+
console.error(`[SupabaseStore] Search error: ${error?.message}`);
|
|
93
|
+
return this.fallbackSearch(query, limit);
|
|
94
|
+
}
|
|
95
|
+
return data.map((row) => ({
|
|
96
|
+
experience: this.rowToExperience(row),
|
|
97
|
+
similarity: row.similarity,
|
|
98
|
+
}));
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
102
|
+
console.error(`[SupabaseStore] Search failed, using fallback: ${msg}`);
|
|
103
|
+
this.online = false;
|
|
104
|
+
return this.fallbackSearch(query, limit);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async getByDomain(domain, limit = 50) {
|
|
108
|
+
if (!this.online) {
|
|
109
|
+
return this.localFallback.getByDomain(domain);
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
const { data, error } = await this.supabase
|
|
113
|
+
.from('experiences')
|
|
114
|
+
.select('*')
|
|
115
|
+
.eq('domain', domain)
|
|
116
|
+
.order('timestamp', { ascending: false })
|
|
117
|
+
.limit(limit);
|
|
118
|
+
if (error || !data) {
|
|
119
|
+
return this.localFallback.getByDomain(domain);
|
|
120
|
+
}
|
|
121
|
+
return data.map((row) => this.rowToExperience(row));
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return this.localFallback.getByDomain(domain);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
async getByOutcome(outcome, limit = 50) {
|
|
128
|
+
if (!this.online) {
|
|
129
|
+
return [];
|
|
130
|
+
}
|
|
131
|
+
try {
|
|
132
|
+
const { data, error } = await this.supabase
|
|
133
|
+
.from('experiences')
|
|
134
|
+
.select('*')
|
|
135
|
+
.eq('outcome', outcome)
|
|
136
|
+
.order('timestamp', { ascending: false })
|
|
137
|
+
.limit(limit);
|
|
138
|
+
if (error || !data)
|
|
139
|
+
return [];
|
|
140
|
+
return data.map((row) => this.rowToExperience(row));
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return [];
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
async getRecent(limit = 10) {
|
|
147
|
+
if (!this.online) {
|
|
148
|
+
return [];
|
|
149
|
+
}
|
|
150
|
+
try {
|
|
151
|
+
const { data, error } = await this.supabase
|
|
152
|
+
.from('experiences')
|
|
153
|
+
.select('*')
|
|
154
|
+
.order('timestamp', { ascending: false })
|
|
155
|
+
.limit(limit);
|
|
156
|
+
if (error || !data)
|
|
157
|
+
return [];
|
|
158
|
+
return data.map((row) => this.rowToExperience(row));
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return [];
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
async count() {
|
|
165
|
+
if (!this.online)
|
|
166
|
+
return 0;
|
|
167
|
+
try {
|
|
168
|
+
const { count, error } = await this.supabase
|
|
169
|
+
.from('experiences')
|
|
170
|
+
.select('*', { count: 'exact', head: true });
|
|
171
|
+
if (error || count === null)
|
|
172
|
+
return 0;
|
|
173
|
+
return count;
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return 0;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
async getStats() {
|
|
180
|
+
return this.localFallback.getStats();
|
|
181
|
+
}
|
|
182
|
+
// Interface compatibility method
|
|
183
|
+
async getRelevantExperiences(context, limit = 5) {
|
|
184
|
+
const scored = await this.search(context, limit);
|
|
185
|
+
return scored.map(s => s.experience);
|
|
186
|
+
}
|
|
187
|
+
isOnline() {
|
|
188
|
+
return this.online;
|
|
189
|
+
}
|
|
190
|
+
// ── Helpers ─────────────────────────────────────────────────
|
|
191
|
+
async fallbackSearch(query, limit) {
|
|
192
|
+
const results = await this.localFallback.getRelevantExperiences(query, limit);
|
|
193
|
+
return results.map((exp, i) => ({
|
|
194
|
+
experience: exp,
|
|
195
|
+
similarity: 1 - (i * 0.1), // approximate ranking
|
|
196
|
+
}));
|
|
197
|
+
}
|
|
198
|
+
rowToExperience(row) {
|
|
199
|
+
return {
|
|
200
|
+
id: row.id,
|
|
201
|
+
observation: row.observation,
|
|
202
|
+
decision: row.decision,
|
|
203
|
+
plan: row.plan,
|
|
204
|
+
verification: row.verification,
|
|
205
|
+
execution: row.execution,
|
|
206
|
+
outcome: row.outcome,
|
|
207
|
+
delta: row.delta ?? '',
|
|
208
|
+
lessons: row.lessons ?? [],
|
|
209
|
+
domain: row.domain,
|
|
210
|
+
tags: row.tags ?? [],
|
|
211
|
+
timestamp: row.timestamp,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=supabase-experience-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase-experience-store.js","sourceRoot":"","sources":["../../src/runtime/supabase-experience-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { ToolDefinition, ToolVerification, ModificationProposal, ModificationApproval, ProposalStatus } from './types.js';
|
|
2
|
+
import { ToolVerifier } from './tool-verifier.js';
|
|
3
|
+
import { CapabilityRegistryManager } from './capability-registry.js';
|
|
4
|
+
export interface PendingApproval {
|
|
5
|
+
readonly proposal: ModificationProposal;
|
|
6
|
+
readonly verification: ToolVerification;
|
|
7
|
+
readonly toolDefinition: ToolDefinition;
|
|
8
|
+
readonly toolSourceDir: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class ToolApprovalManager {
|
|
11
|
+
private verifier;
|
|
12
|
+
private registry;
|
|
13
|
+
private pendingApprovals;
|
|
14
|
+
private approvalHistoryPath;
|
|
15
|
+
constructor(registry: CapabilityRegistryManager, verifier?: ToolVerifier, approvalHistoryPath?: string);
|
|
16
|
+
/**
|
|
17
|
+
* Propose a new tool. Runs verification and queues for human approval.
|
|
18
|
+
* Returns the proposal ID and verification result.
|
|
19
|
+
*/
|
|
20
|
+
propose(tool: ToolDefinition, toolSourceDir: string, justification: {
|
|
21
|
+
capability_gap: string;
|
|
22
|
+
evidence: string[];
|
|
23
|
+
expected_impact: string;
|
|
24
|
+
risk_assessment: string;
|
|
25
|
+
}): Promise<{
|
|
26
|
+
proposalId: string;
|
|
27
|
+
verification: ToolVerification;
|
|
28
|
+
status: ProposalStatus;
|
|
29
|
+
}>;
|
|
30
|
+
/**
|
|
31
|
+
* List all pending approvals.
|
|
32
|
+
*/
|
|
33
|
+
listPending(): PendingApproval[];
|
|
34
|
+
/**
|
|
35
|
+
* Get a specific pending approval.
|
|
36
|
+
*/
|
|
37
|
+
getPending(proposalId: string): PendingApproval | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* Approve a pending tool proposal. Activates the tool in the registry.
|
|
40
|
+
*/
|
|
41
|
+
approve(proposalId: string, approvedBy: string, reasoning: string, conditions?: string[]): Promise<ModificationApproval>;
|
|
42
|
+
/**
|
|
43
|
+
* Reject a pending tool proposal.
|
|
44
|
+
*/
|
|
45
|
+
reject(proposalId: string, rejectedBy: string, reasoning: string): Promise<ModificationApproval>;
|
|
46
|
+
/**
|
|
47
|
+
* Rollback the last registry change.
|
|
48
|
+
*/
|
|
49
|
+
rollback(rolledBackBy: string): Promise<boolean>;
|
|
50
|
+
private logApproval;
|
|
51
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Assay Verified Agent Runtime — Tool Approval Flow
|
|
3
|
+
// Orchestrates: propose → verify → approve → activate
|
|
4
|
+
// Human approval is required before any tool goes active.
|
|
5
|
+
// ============================================================
|
|
6
|
+
import { randomUUID } from 'node:crypto';
|
|
7
|
+
import { mkdir, appendFile } from 'node:fs/promises';
|
|
8
|
+
import { dirname } from 'node:path';
|
|
9
|
+
import { ToolVerifier } from './tool-verifier.js';
|
|
10
|
+
// ── Tool Approval Manager ──────────────────────────────────
|
|
11
|
+
export class ToolApprovalManager {
|
|
12
|
+
verifier;
|
|
13
|
+
registry;
|
|
14
|
+
pendingApprovals = new Map();
|
|
15
|
+
approvalHistoryPath;
|
|
16
|
+
constructor(registry, verifier, approvalHistoryPath) {
|
|
17
|
+
this.registry = registry;
|
|
18
|
+
this.verifier = verifier ?? new ToolVerifier();
|
|
19
|
+
this.approvalHistoryPath = approvalHistoryPath ?? '.assay/tool-approvals.ndjson';
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Propose a new tool. Runs verification and queues for human approval.
|
|
23
|
+
* Returns the proposal ID and verification result.
|
|
24
|
+
*/
|
|
25
|
+
async propose(tool, toolSourceDir, justification) {
|
|
26
|
+
const proposalId = `mod_${Date.now()}_${randomUUID().slice(0, 8)}`;
|
|
27
|
+
// Create the proposal
|
|
28
|
+
const proposal = {
|
|
29
|
+
id: proposalId,
|
|
30
|
+
type: 'tool',
|
|
31
|
+
timestamp: new Date().toISOString(),
|
|
32
|
+
title: `New tool: ${tool.name}`,
|
|
33
|
+
description: tool.description,
|
|
34
|
+
payload: tool,
|
|
35
|
+
justification,
|
|
36
|
+
safety: {
|
|
37
|
+
modifies_layer2: false,
|
|
38
|
+
modifies_approval_framework: false,
|
|
39
|
+
trust_level_required: 'provisional',
|
|
40
|
+
rollback_plan: `Deprecate tool ${tool.id} and rollback registry`,
|
|
41
|
+
},
|
|
42
|
+
proposed_by: tool.created_by,
|
|
43
|
+
status: 'verifying',
|
|
44
|
+
};
|
|
45
|
+
// Run verification
|
|
46
|
+
const verification = await this.verifier.verify(tool, toolSourceDir);
|
|
47
|
+
// Update proposal status based on verification
|
|
48
|
+
let status;
|
|
49
|
+
if (verification.verdict === 'reject') {
|
|
50
|
+
status = 'rejected';
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
status = 'pending_approval';
|
|
54
|
+
// Queue for human approval
|
|
55
|
+
this.pendingApprovals.set(proposalId, {
|
|
56
|
+
proposal: { ...proposal, status, verification_id: verification.verification_id },
|
|
57
|
+
verification,
|
|
58
|
+
toolDefinition: tool,
|
|
59
|
+
toolSourceDir,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return { proposalId, verification, status };
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* List all pending approvals.
|
|
66
|
+
*/
|
|
67
|
+
listPending() {
|
|
68
|
+
return Array.from(this.pendingApprovals.values());
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get a specific pending approval.
|
|
72
|
+
*/
|
|
73
|
+
getPending(proposalId) {
|
|
74
|
+
return this.pendingApprovals.get(proposalId);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Approve a pending tool proposal. Activates the tool in the registry.
|
|
78
|
+
*/
|
|
79
|
+
async approve(proposalId, approvedBy, reasoning, conditions) {
|
|
80
|
+
const pending = this.pendingApprovals.get(proposalId);
|
|
81
|
+
if (!pending) {
|
|
82
|
+
throw new Error(`No pending approval found for proposal "${proposalId}"`);
|
|
83
|
+
}
|
|
84
|
+
const approval = {
|
|
85
|
+
proposal_id: proposalId,
|
|
86
|
+
decision: 'approved',
|
|
87
|
+
decided_by: approvedBy,
|
|
88
|
+
decided_at: new Date().toISOString(),
|
|
89
|
+
reasoning,
|
|
90
|
+
conditions,
|
|
91
|
+
};
|
|
92
|
+
// Activate the tool in the registry
|
|
93
|
+
const approvedTool = {
|
|
94
|
+
...pending.toolDefinition,
|
|
95
|
+
status: 'approved',
|
|
96
|
+
};
|
|
97
|
+
this.registry.addTool(approvedTool, approvedBy, proposalId);
|
|
98
|
+
await this.registry.save();
|
|
99
|
+
// Remove from pending
|
|
100
|
+
this.pendingApprovals.delete(proposalId);
|
|
101
|
+
// Log the approval
|
|
102
|
+
await this.logApproval(approval);
|
|
103
|
+
return approval;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Reject a pending tool proposal.
|
|
107
|
+
*/
|
|
108
|
+
async reject(proposalId, rejectedBy, reasoning) {
|
|
109
|
+
const pending = this.pendingApprovals.get(proposalId);
|
|
110
|
+
if (!pending) {
|
|
111
|
+
throw new Error(`No pending approval found for proposal "${proposalId}"`);
|
|
112
|
+
}
|
|
113
|
+
const approval = {
|
|
114
|
+
proposal_id: proposalId,
|
|
115
|
+
decision: 'rejected',
|
|
116
|
+
decided_by: rejectedBy,
|
|
117
|
+
decided_at: new Date().toISOString(),
|
|
118
|
+
reasoning,
|
|
119
|
+
};
|
|
120
|
+
// Remove from pending
|
|
121
|
+
this.pendingApprovals.delete(proposalId);
|
|
122
|
+
// Log the rejection
|
|
123
|
+
await this.logApproval(approval);
|
|
124
|
+
return approval;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Rollback the last registry change.
|
|
128
|
+
*/
|
|
129
|
+
async rollback(rolledBackBy) {
|
|
130
|
+
const success = this.registry.rollback(rolledBackBy);
|
|
131
|
+
if (success) {
|
|
132
|
+
await this.registry.save();
|
|
133
|
+
}
|
|
134
|
+
return success;
|
|
135
|
+
}
|
|
136
|
+
// ── Private ──────────────────────────────────────────────
|
|
137
|
+
async logApproval(approval) {
|
|
138
|
+
try {
|
|
139
|
+
await mkdir(dirname(this.approvalHistoryPath), { recursive: true });
|
|
140
|
+
const line = JSON.stringify(approval) + '\n';
|
|
141
|
+
await appendFile(this.approvalHistoryPath, line, 'utf-8');
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// Non-critical: approval history logging failure doesn't block the flow
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=tool-approval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-approval.js","sourceRoot":"","sources":["../../src/runtime/tool-approval.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { ToolDefinition, ToolConstraints, ToolTestResult } from './types.js';
|
|
2
|
+
export interface SandboxRequest {
|
|
3
|
+
readonly toolId: string;
|
|
4
|
+
readonly entryPoint: string;
|
|
5
|
+
readonly functionName: string;
|
|
6
|
+
readonly input: unknown;
|
|
7
|
+
readonly constraints: ToolConstraints;
|
|
8
|
+
}
|
|
9
|
+
export interface SandboxResponse {
|
|
10
|
+
readonly status: 'success' | 'error' | 'timeout' | 'constraint_violation';
|
|
11
|
+
readonly output?: unknown;
|
|
12
|
+
readonly error?: string;
|
|
13
|
+
readonly durationMs: number;
|
|
14
|
+
readonly memoryUsageMb?: number;
|
|
15
|
+
readonly networkAttempts?: readonly string[];
|
|
16
|
+
readonly filesystemWrites?: readonly string[];
|
|
17
|
+
}
|
|
18
|
+
export declare class ToolSandbox {
|
|
19
|
+
private sandboxDir;
|
|
20
|
+
constructor(sandboxBaseDir?: string);
|
|
21
|
+
/**
|
|
22
|
+
* Execute a tool in a sandboxed child process.
|
|
23
|
+
* Enforces all constraints from the ToolDefinition.
|
|
24
|
+
*/
|
|
25
|
+
execute(request: SandboxRequest): Promise<SandboxResponse>;
|
|
26
|
+
/**
|
|
27
|
+
* Run a full test suite against a tool: happy path, malformed input,
|
|
28
|
+
* timeout behavior, and constraint compliance.
|
|
29
|
+
*/
|
|
30
|
+
runTestSuite(tool: ToolDefinition, toolSourceDir: string): Promise<{
|
|
31
|
+
happy_path: ToolTestResult;
|
|
32
|
+
malformed_input: ToolTestResult;
|
|
33
|
+
timeout_behavior: ToolTestResult;
|
|
34
|
+
constraint_compliance: ToolTestResult;
|
|
35
|
+
}>;
|
|
36
|
+
private forkAndRun;
|
|
37
|
+
private generateRunnerScript;
|
|
38
|
+
private runSingleTest;
|
|
39
|
+
private runTimeoutTest;
|
|
40
|
+
private runConstraintComplianceTest;
|
|
41
|
+
private generateHappyPathInput;
|
|
42
|
+
private generateMalformedInput;
|
|
43
|
+
}
|