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.
Files changed (150) hide show
  1. package/dist/api/pricing-enforcer.d.ts +45 -0
  2. package/dist/api/pricing-enforcer.js +144 -0
  3. package/dist/api/pricing-enforcer.js.map +1 -0
  4. package/dist/api/server.d.ts +28 -0
  5. package/dist/api/server.js +265 -0
  6. package/dist/api/server.js.map +1 -0
  7. package/dist/api/team-session.d.ts +59 -0
  8. package/dist/api/team-session.js +240 -0
  9. package/dist/api/team-session.js.map +1 -0
  10. package/dist/cli.js +142 -2
  11. package/dist/cli.js.map +1 -1
  12. package/dist/commands/api.d.ts +4 -0
  13. package/dist/commands/api.js +50 -0
  14. package/dist/commands/api.js.map +1 -0
  15. package/dist/commands/runtime.d.ts +69 -0
  16. package/dist/commands/runtime.js +673 -0
  17. package/dist/commands/runtime.js.map +1 -1
  18. package/dist/runtime/agent-loop.d.ts +6 -0
  19. package/dist/runtime/agent-loop.js +87 -5
  20. package/dist/runtime/agent-loop.js.map +1 -1
  21. package/dist/runtime/agent-spawner.d.ts +56 -0
  22. package/dist/runtime/agent-spawner.js +217 -0
  23. package/dist/runtime/agent-spawner.js.map +1 -0
  24. package/dist/runtime/agents/code-agent.d.ts +11 -0
  25. package/dist/runtime/agents/code-agent.js +90 -0
  26. package/dist/runtime/agents/code-agent.js.map +1 -0
  27. package/dist/runtime/agents/coordinator-agent.d.ts +20 -0
  28. package/dist/runtime/agents/coordinator-agent.js +182 -0
  29. package/dist/runtime/agents/coordinator-agent.js.map +1 -0
  30. package/dist/runtime/agents/ops-agent.d.ts +11 -0
  31. package/dist/runtime/agents/ops-agent.js +113 -0
  32. package/dist/runtime/agents/ops-agent.js.map +1 -0
  33. package/dist/runtime/agents/research-agent.d.ts +11 -0
  34. package/dist/runtime/agents/research-agent.js +114 -0
  35. package/dist/runtime/agents/research-agent.js.map +1 -0
  36. package/dist/runtime/agents/review-agent.d.ts +11 -0
  37. package/dist/runtime/agents/review-agent.js +96 -0
  38. package/dist/runtime/agents/review-agent.js.map +1 -0
  39. package/dist/runtime/agents/test-agent.d.ts +11 -0
  40. package/dist/runtime/agents/test-agent.js +114 -0
  41. package/dist/runtime/agents/test-agent.js.map +1 -0
  42. package/dist/runtime/capability-registry.d.ts +62 -0
  43. package/dist/runtime/capability-registry.js +191 -0
  44. package/dist/runtime/capability-registry.js.map +1 -0
  45. package/dist/runtime/collusion-detector.d.ts +35 -0
  46. package/dist/runtime/collusion-detector.js +97 -0
  47. package/dist/runtime/collusion-detector.js.map +1 -0
  48. package/dist/runtime/composition-verifier.d.ts +22 -0
  49. package/dist/runtime/composition-verifier.js +265 -0
  50. package/dist/runtime/composition-verifier.js.map +1 -0
  51. package/dist/runtime/confidence-calibrator.d.ts +10 -0
  52. package/dist/runtime/confidence-calibrator.js +95 -0
  53. package/dist/runtime/confidence-calibrator.js.map +1 -0
  54. package/dist/runtime/domain-coverage-analyzer.d.ts +24 -0
  55. package/dist/runtime/domain-coverage-analyzer.js +178 -0
  56. package/dist/runtime/domain-coverage-analyzer.js.map +1 -0
  57. package/dist/runtime/enriched-prompt-builder.d.ts +25 -0
  58. package/dist/runtime/enriched-prompt-builder.js +173 -0
  59. package/dist/runtime/enriched-prompt-builder.js.map +1 -0
  60. package/dist/runtime/gap-detector.d.ts +6 -0
  61. package/dist/runtime/gap-detector.js +111 -0
  62. package/dist/runtime/gap-detector.js.map +1 -0
  63. package/dist/runtime/human-escalation.d.ts +41 -0
  64. package/dist/runtime/human-escalation.js +122 -0
  65. package/dist/runtime/human-escalation.js.map +1 -0
  66. package/dist/runtime/kill-switch.d.ts +51 -0
  67. package/dist/runtime/kill-switch.js +185 -0
  68. package/dist/runtime/kill-switch.js.map +1 -0
  69. package/dist/runtime/layer2-guardian.d.ts +81 -0
  70. package/dist/runtime/layer2-guardian.js +263 -0
  71. package/dist/runtime/layer2-guardian.js.map +1 -0
  72. package/dist/runtime/message-bus.d.ts +57 -0
  73. package/dist/runtime/message-bus.js +115 -0
  74. package/dist/runtime/message-bus.js.map +1 -0
  75. package/dist/runtime/multi-agent-loop.d.ts +37 -0
  76. package/dist/runtime/multi-agent-loop.js +411 -0
  77. package/dist/runtime/multi-agent-loop.js.map +1 -0
  78. package/dist/runtime/pattern-extractor.d.ts +20 -0
  79. package/dist/runtime/pattern-extractor.js +257 -0
  80. package/dist/runtime/pattern-extractor.js.map +1 -0
  81. package/dist/runtime/planner.d.ts +2 -2
  82. package/dist/runtime/planner.js +10 -7
  83. package/dist/runtime/planner.js.map +1 -1
  84. package/dist/runtime/prompt-safety-analyzer.d.ts +17 -0
  85. package/dist/runtime/prompt-safety-analyzer.js +230 -0
  86. package/dist/runtime/prompt-safety-analyzer.js.map +1 -0
  87. package/dist/runtime/reasoner.d.ts +2 -2
  88. package/dist/runtime/reasoner.js +9 -5
  89. package/dist/runtime/reasoner.js.map +1 -1
  90. package/dist/runtime/reflector.d.ts +7 -1
  91. package/dist/runtime/reflector.js.map +1 -1
  92. package/dist/runtime/rollback-manager.d.ts +50 -0
  93. package/dist/runtime/rollback-manager.js +157 -0
  94. package/dist/runtime/rollback-manager.js.map +1 -0
  95. package/dist/runtime/rule-canary-deployer.d.ts +69 -0
  96. package/dist/runtime/rule-canary-deployer.js +289 -0
  97. package/dist/runtime/rule-canary-deployer.js.map +1 -0
  98. package/dist/runtime/rule-conflict-detector.d.ts +48 -0
  99. package/dist/runtime/rule-conflict-detector.js +214 -0
  100. package/dist/runtime/rule-conflict-detector.js.map +1 -0
  101. package/dist/runtime/rule-meta-verifier.d.ts +18 -0
  102. package/dist/runtime/rule-meta-verifier.js +275 -0
  103. package/dist/runtime/rule-meta-verifier.js.map +1 -0
  104. package/dist/runtime/rule-proposal-manager.d.ts +95 -0
  105. package/dist/runtime/rule-proposal-manager.js +190 -0
  106. package/dist/runtime/rule-proposal-manager.js.map +1 -0
  107. package/dist/runtime/safety-enforcer.d.ts +35 -0
  108. package/dist/runtime/safety-enforcer.js +165 -0
  109. package/dist/runtime/safety-enforcer.js.map +1 -0
  110. package/dist/runtime/safety-status.d.ts +48 -0
  111. package/dist/runtime/safety-status.js +119 -0
  112. package/dist/runtime/safety-status.js.map +1 -0
  113. package/dist/runtime/shadow-runner.d.ts +14 -0
  114. package/dist/runtime/shadow-runner.js +190 -0
  115. package/dist/runtime/shadow-runner.js.map +1 -0
  116. package/dist/runtime/shared-memory.d.ts +47 -0
  117. package/dist/runtime/shared-memory.js +151 -0
  118. package/dist/runtime/shared-memory.js.map +1 -0
  119. package/dist/runtime/specialized-agent.d.ts +72 -0
  120. package/dist/runtime/specialized-agent.js +123 -0
  121. package/dist/runtime/specialized-agent.js.map +1 -0
  122. package/dist/runtime/stall-detector.d.ts +13 -0
  123. package/dist/runtime/stall-detector.js +121 -0
  124. package/dist/runtime/stall-detector.js.map +1 -0
  125. package/dist/runtime/strategy-library.d.ts +11 -0
  126. package/dist/runtime/strategy-library.js +142 -0
  127. package/dist/runtime/strategy-library.js.map +1 -0
  128. package/dist/runtime/supabase-experience-store.d.ts +19 -0
  129. package/dist/runtime/supabase-experience-store.js +215 -0
  130. package/dist/runtime/supabase-experience-store.js.map +1 -0
  131. package/dist/runtime/tool-approval.d.ts +51 -0
  132. package/dist/runtime/tool-approval.js +148 -0
  133. package/dist/runtime/tool-approval.js.map +1 -0
  134. package/dist/runtime/tool-sandbox.d.ts +43 -0
  135. package/dist/runtime/tool-sandbox.js +394 -0
  136. package/dist/runtime/tool-sandbox.js.map +1 -0
  137. package/dist/runtime/tool-verifier.d.ts +18 -0
  138. package/dist/runtime/tool-verifier.js +323 -0
  139. package/dist/runtime/tool-verifier.js.map +1 -0
  140. package/dist/runtime/trust-manager.d.ts +63 -0
  141. package/dist/runtime/trust-manager.js +212 -0
  142. package/dist/runtime/trust-manager.js.map +1 -0
  143. package/dist/runtime/two-agent-loop.d.ts +35 -0
  144. package/dist/runtime/two-agent-loop.js +208 -0
  145. package/dist/runtime/two-agent-loop.js.map +1 -0
  146. package/dist/runtime/types.d.ts +939 -1
  147. package/dist/runtime/verification-intensity.d.ts +34 -0
  148. package/dist/runtime/verification-intensity.js +104 -0
  149. package/dist/runtime/verification-intensity.js.map +1 -0
  150. 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
+ }