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,45 @@
|
|
|
1
|
+
import type { PricingTier, PricingTierConfig, ApiKeyInfo, AgentSpecialization } from '../runtime/types.js';
|
|
2
|
+
export declare class PricingEnforcer {
|
|
3
|
+
private apiKeys;
|
|
4
|
+
/** Register an API key with its tier. */
|
|
5
|
+
registerKey(key: string, tier: PricingTier, organizationId: string): void;
|
|
6
|
+
/** Get the tier config for an API key. */
|
|
7
|
+
getTierConfig(apiKey: string): PricingTierConfig | null;
|
|
8
|
+
/** Get API key info. */
|
|
9
|
+
getKeyInfo(apiKey: string): ApiKeyInfo | null;
|
|
10
|
+
/**
|
|
11
|
+
* Check if the requested agents are allowed for this tier.
|
|
12
|
+
* Returns the agents that are allowed and any that were filtered out.
|
|
13
|
+
*/
|
|
14
|
+
filterAgents(apiKey: string, requestedAgents: readonly AgentSpecialization[]): {
|
|
15
|
+
allowed: AgentSpecialization[];
|
|
16
|
+
denied: AgentSpecialization[];
|
|
17
|
+
reason: string | null;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Record a verification and check if the monthly limit is exceeded.
|
|
21
|
+
* Returns whether the verification is allowed (within limits or overage).
|
|
22
|
+
*/
|
|
23
|
+
recordVerification(apiKey: string): {
|
|
24
|
+
allowed: boolean;
|
|
25
|
+
isOverage: boolean;
|
|
26
|
+
count: number;
|
|
27
|
+
limit: number;
|
|
28
|
+
overageCostCents: number;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Get current usage for an API key.
|
|
32
|
+
*/
|
|
33
|
+
getUsage(apiKey: string): {
|
|
34
|
+
verificationsUsed: number;
|
|
35
|
+
verificationsLimit: number;
|
|
36
|
+
overageCount: number;
|
|
37
|
+
estimatedOverageCostCents: number;
|
|
38
|
+
} | null;
|
|
39
|
+
/**
|
|
40
|
+
* Reset monthly verification count (called at billing cycle).
|
|
41
|
+
*/
|
|
42
|
+
resetMonthlyUsage(apiKey: string): void;
|
|
43
|
+
/** Check if an API key exists and is valid. */
|
|
44
|
+
isValidKey(apiKey: string): boolean;
|
|
45
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Assay Verified Team API — Pricing Enforcer
|
|
3
|
+
// Tracks verification counts per API key and enforces tier limits.
|
|
4
|
+
// ============================================================
|
|
5
|
+
// ── Tier Configurations ────────────────────────────────────
|
|
6
|
+
const TIER_CONFIGS = {
|
|
7
|
+
team: {
|
|
8
|
+
tier: 'team',
|
|
9
|
+
name: 'Team',
|
|
10
|
+
maxAgents: 2,
|
|
11
|
+
maxVerificationsPerMonth: 500,
|
|
12
|
+
hasFormalVerifier: false,
|
|
13
|
+
hasHumanEscalation: false,
|
|
14
|
+
overageCostCents: 5,
|
|
15
|
+
allowedAgentTypes: ['code', 'review'],
|
|
16
|
+
},
|
|
17
|
+
pro: {
|
|
18
|
+
tier: 'pro',
|
|
19
|
+
name: 'Pro',
|
|
20
|
+
maxAgents: 6,
|
|
21
|
+
maxVerificationsPerMonth: 5000,
|
|
22
|
+
hasFormalVerifier: true,
|
|
23
|
+
hasHumanEscalation: true,
|
|
24
|
+
overageCostCents: 3,
|
|
25
|
+
allowedAgentTypes: ['coordinator', 'code', 'review', 'test', 'ops', 'research'],
|
|
26
|
+
},
|
|
27
|
+
platform: {
|
|
28
|
+
tier: 'platform',
|
|
29
|
+
name: 'Platform',
|
|
30
|
+
maxAgents: 6,
|
|
31
|
+
maxVerificationsPerMonth: 100_000,
|
|
32
|
+
hasFormalVerifier: true,
|
|
33
|
+
hasHumanEscalation: true,
|
|
34
|
+
overageCostCents: 1,
|
|
35
|
+
allowedAgentTypes: ['coordinator', 'code', 'review', 'test', 'ops', 'research'],
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
// ── Pricing Enforcer ───────────────────────────────────────
|
|
39
|
+
export class PricingEnforcer {
|
|
40
|
+
apiKeys = new Map();
|
|
41
|
+
/** Register an API key with its tier. */
|
|
42
|
+
registerKey(key, tier, organizationId) {
|
|
43
|
+
this.apiKeys.set(key, {
|
|
44
|
+
key,
|
|
45
|
+
tier,
|
|
46
|
+
organizationId,
|
|
47
|
+
createdAt: new Date().toISOString(),
|
|
48
|
+
verificationsThisMonth: 0,
|
|
49
|
+
monthlyLimit: TIER_CONFIGS[tier].maxVerificationsPerMonth,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/** Get the tier config for an API key. */
|
|
53
|
+
getTierConfig(apiKey) {
|
|
54
|
+
const info = this.apiKeys.get(apiKey);
|
|
55
|
+
if (!info)
|
|
56
|
+
return null;
|
|
57
|
+
return TIER_CONFIGS[info.tier];
|
|
58
|
+
}
|
|
59
|
+
/** Get API key info. */
|
|
60
|
+
getKeyInfo(apiKey) {
|
|
61
|
+
return this.apiKeys.get(apiKey) ?? null;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Check if the requested agents are allowed for this tier.
|
|
65
|
+
* Returns the agents that are allowed and any that were filtered out.
|
|
66
|
+
*/
|
|
67
|
+
filterAgents(apiKey, requestedAgents) {
|
|
68
|
+
const config = this.getTierConfig(apiKey);
|
|
69
|
+
if (!config) {
|
|
70
|
+
return { allowed: [], denied: [...requestedAgents], reason: 'Invalid API key' };
|
|
71
|
+
}
|
|
72
|
+
const allowed = [];
|
|
73
|
+
const denied = [];
|
|
74
|
+
for (const agent of requestedAgents) {
|
|
75
|
+
if (config.allowedAgentTypes.includes(agent)) {
|
|
76
|
+
allowed.push(agent);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
denied.push(agent);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Enforce max agent count
|
|
83
|
+
if (allowed.length > config.maxAgents) {
|
|
84
|
+
const overflow = allowed.splice(config.maxAgents);
|
|
85
|
+
denied.push(...overflow);
|
|
86
|
+
}
|
|
87
|
+
const reason = denied.length > 0
|
|
88
|
+
? `${config.name} tier: max ${config.maxAgents} agents, allowed types: ${config.allowedAgentTypes.join(', ')}`
|
|
89
|
+
: null;
|
|
90
|
+
return { allowed, denied, reason };
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Record a verification and check if the monthly limit is exceeded.
|
|
94
|
+
* Returns whether the verification is allowed (within limits or overage).
|
|
95
|
+
*/
|
|
96
|
+
recordVerification(apiKey) {
|
|
97
|
+
const info = this.apiKeys.get(apiKey);
|
|
98
|
+
if (!info) {
|
|
99
|
+
return { allowed: false, isOverage: false, count: 0, limit: 0, overageCostCents: 0 };
|
|
100
|
+
}
|
|
101
|
+
const config = TIER_CONFIGS[info.tier];
|
|
102
|
+
const newCount = info.verificationsThisMonth + 1;
|
|
103
|
+
// Update count (mutable for tracking)
|
|
104
|
+
info.verificationsThisMonth = newCount;
|
|
105
|
+
const isOverage = newCount > info.monthlyLimit;
|
|
106
|
+
return {
|
|
107
|
+
allowed: true, // Always allow, but track overage
|
|
108
|
+
isOverage,
|
|
109
|
+
count: newCount,
|
|
110
|
+
limit: info.monthlyLimit,
|
|
111
|
+
overageCostCents: isOverage ? config.overageCostCents : 0,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get current usage for an API key.
|
|
116
|
+
*/
|
|
117
|
+
getUsage(apiKey) {
|
|
118
|
+
const info = this.apiKeys.get(apiKey);
|
|
119
|
+
if (!info)
|
|
120
|
+
return null;
|
|
121
|
+
const config = TIER_CONFIGS[info.tier];
|
|
122
|
+
const overageCount = Math.max(0, info.verificationsThisMonth - info.monthlyLimit);
|
|
123
|
+
return {
|
|
124
|
+
verificationsUsed: info.verificationsThisMonth,
|
|
125
|
+
verificationsLimit: info.monthlyLimit,
|
|
126
|
+
overageCount,
|
|
127
|
+
estimatedOverageCostCents: overageCount * config.overageCostCents,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Reset monthly verification count (called at billing cycle).
|
|
132
|
+
*/
|
|
133
|
+
resetMonthlyUsage(apiKey) {
|
|
134
|
+
const info = this.apiKeys.get(apiKey);
|
|
135
|
+
if (info) {
|
|
136
|
+
info.verificationsThisMonth = 0;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/** Check if an API key exists and is valid. */
|
|
140
|
+
isValidKey(apiKey) {
|
|
141
|
+
return this.apiKeys.has(apiKey);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=pricing-enforcer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pricing-enforcer.js","sourceRoot":"","sources":["../../src/api/pricing-enforcer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export declare class TeamApiServer {
|
|
2
|
+
private pricingEnforcer;
|
|
3
|
+
private sessionManager;
|
|
4
|
+
private server;
|
|
5
|
+
private port;
|
|
6
|
+
constructor(opts?: {
|
|
7
|
+
port?: number;
|
|
8
|
+
});
|
|
9
|
+
/** Register an API key for testing/development. */
|
|
10
|
+
registerApiKey(key: string, tier: 'team' | 'pro' | 'platform', orgId: string): void;
|
|
11
|
+
/** Start the HTTP server. */
|
|
12
|
+
start(): Promise<void>;
|
|
13
|
+
/** Stop the HTTP server. */
|
|
14
|
+
stop(): Promise<void>;
|
|
15
|
+
/** Get the port the server is listening on. */
|
|
16
|
+
getPort(): number;
|
|
17
|
+
private handleRequest;
|
|
18
|
+
private handleHealth;
|
|
19
|
+
private handleTeamCreate;
|
|
20
|
+
private handleTeamStream;
|
|
21
|
+
private handleTeamStatus;
|
|
22
|
+
private handleTeamStop;
|
|
23
|
+
private handleTeamAudit;
|
|
24
|
+
private extractApiKey;
|
|
25
|
+
private readBody;
|
|
26
|
+
private sendJson;
|
|
27
|
+
private sendError;
|
|
28
|
+
}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Assay Verified Team API — REST Server
|
|
3
|
+
// POST /api/v1/team/create — spawn a verified team
|
|
4
|
+
// GET /api/v1/team/:id/stream — SSE real-time updates
|
|
5
|
+
// GET /api/v1/team/:id/status — team status
|
|
6
|
+
// POST /api/v1/team/:id/stop — stop a running team
|
|
7
|
+
// GET /api/v1/team/:id/audit — audit log with pagination
|
|
8
|
+
// ============================================================
|
|
9
|
+
import { createServer } from 'node:http';
|
|
10
|
+
import { PricingEnforcer } from './pricing-enforcer.js';
|
|
11
|
+
import { TeamSessionManager } from './team-session.js';
|
|
12
|
+
// ── API Server ─────────────────────────────────────────────
|
|
13
|
+
export class TeamApiServer {
|
|
14
|
+
pricingEnforcer;
|
|
15
|
+
sessionManager;
|
|
16
|
+
server = null;
|
|
17
|
+
port;
|
|
18
|
+
constructor(opts) {
|
|
19
|
+
this.port = opts?.port ?? 3800;
|
|
20
|
+
this.pricingEnforcer = new PricingEnforcer();
|
|
21
|
+
this.sessionManager = new TeamSessionManager();
|
|
22
|
+
}
|
|
23
|
+
/** Register an API key for testing/development. */
|
|
24
|
+
registerApiKey(key, tier, orgId) {
|
|
25
|
+
this.pricingEnforcer.registerKey(key, tier, orgId);
|
|
26
|
+
}
|
|
27
|
+
/** Start the HTTP server. */
|
|
28
|
+
start() {
|
|
29
|
+
return new Promise((resolve) => {
|
|
30
|
+
this.server = createServer((req, res) => {
|
|
31
|
+
this.handleRequest(req, res).catch((err) => {
|
|
32
|
+
this.sendError(res, 500, err instanceof Error ? err.message : 'Internal error');
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
this.server.listen(this.port, () => {
|
|
36
|
+
resolve();
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/** Stop the HTTP server. */
|
|
41
|
+
stop() {
|
|
42
|
+
return new Promise((resolve) => {
|
|
43
|
+
if (this.server) {
|
|
44
|
+
this.server.close(() => resolve());
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
resolve();
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
/** Get the port the server is listening on. */
|
|
52
|
+
getPort() {
|
|
53
|
+
return this.port;
|
|
54
|
+
}
|
|
55
|
+
// ── Request Router ────────────────────────────────────────
|
|
56
|
+
async handleRequest(req, res) {
|
|
57
|
+
const url = new URL(req.url ?? '/', `http://localhost:${this.port}`);
|
|
58
|
+
const path = url.pathname;
|
|
59
|
+
const method = req.method ?? 'GET';
|
|
60
|
+
// CORS headers
|
|
61
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
62
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
|
|
63
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
|
|
64
|
+
if (method === 'OPTIONS') {
|
|
65
|
+
res.writeHead(204);
|
|
66
|
+
res.end();
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
// Authenticate
|
|
70
|
+
const apiKey = this.extractApiKey(req);
|
|
71
|
+
if (!apiKey && path !== '/health') {
|
|
72
|
+
this.sendError(res, 401, 'Missing API key. Include Authorization: Bearer <key>');
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (apiKey && !this.pricingEnforcer.isValidKey(apiKey) && path !== '/health') {
|
|
76
|
+
this.sendError(res, 403, 'Invalid API key');
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// Route
|
|
80
|
+
if (path === '/health' && method === 'GET') {
|
|
81
|
+
return this.handleHealth(res);
|
|
82
|
+
}
|
|
83
|
+
if (path === '/api/v1/team/create' && method === 'POST') {
|
|
84
|
+
return this.handleTeamCreate(req, res, apiKey);
|
|
85
|
+
}
|
|
86
|
+
const teamMatch = path.match(/^\/api\/v1\/team\/([^/]+)\/(.+)$/);
|
|
87
|
+
if (teamMatch) {
|
|
88
|
+
const sessionId = teamMatch[1];
|
|
89
|
+
const action = teamMatch[2];
|
|
90
|
+
switch (action) {
|
|
91
|
+
case 'stream':
|
|
92
|
+
if (method === 'GET')
|
|
93
|
+
return this.handleTeamStream(res, sessionId);
|
|
94
|
+
break;
|
|
95
|
+
case 'status':
|
|
96
|
+
if (method === 'GET')
|
|
97
|
+
return this.handleTeamStatus(res, sessionId);
|
|
98
|
+
break;
|
|
99
|
+
case 'stop':
|
|
100
|
+
if (method === 'POST')
|
|
101
|
+
return this.handleTeamStop(res, sessionId);
|
|
102
|
+
break;
|
|
103
|
+
case 'audit':
|
|
104
|
+
if (method === 'GET')
|
|
105
|
+
return this.handleTeamAudit(res, sessionId, url);
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
this.sendError(res, 404, `Not found: ${method} ${path}`);
|
|
110
|
+
}
|
|
111
|
+
// ── Handlers ──────────────────────────────────────────────
|
|
112
|
+
handleHealth(res) {
|
|
113
|
+
this.sendJson(res, 200, {
|
|
114
|
+
status: 'ok',
|
|
115
|
+
service: 'assay-verified-team-api',
|
|
116
|
+
version: '0.9.0',
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
async handleTeamCreate(req, res, apiKey) {
|
|
120
|
+
const body = await this.readBody(req);
|
|
121
|
+
let request;
|
|
122
|
+
try {
|
|
123
|
+
request = JSON.parse(body);
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
this.sendError(res, 400, 'Invalid JSON body');
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
if (!request.goal || typeof request.goal !== 'string') {
|
|
130
|
+
this.sendError(res, 400, 'Missing required field: goal');
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
// Determine agents
|
|
134
|
+
const requestedAgents = request.agents
|
|
135
|
+
? [...request.agents]
|
|
136
|
+
: ['coordinator', 'code', 'review', 'test'];
|
|
137
|
+
// Enforce pricing tier
|
|
138
|
+
const { allowed, denied, reason } = this.pricingEnforcer.filterAgents(apiKey, requestedAgents);
|
|
139
|
+
if (allowed.length === 0) {
|
|
140
|
+
this.sendError(res, 403, reason ?? 'No agents allowed for this tier');
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
// Create session
|
|
144
|
+
const sessionId = this.sessionManager.create(apiKey, request.goal, allowed, {
|
|
145
|
+
models: request.models,
|
|
146
|
+
maxConcurrentTasks: request.maxConcurrentTasks,
|
|
147
|
+
stallTimeoutMs: request.stallTimeoutMs,
|
|
148
|
+
});
|
|
149
|
+
const response = {
|
|
150
|
+
sessionId,
|
|
151
|
+
streamUrl: `/api/v1/team/${sessionId}/stream`,
|
|
152
|
+
statusUrl: `/api/v1/team/${sessionId}/status`,
|
|
153
|
+
agents: allowed,
|
|
154
|
+
createdAt: new Date().toISOString(),
|
|
155
|
+
};
|
|
156
|
+
if (denied.length > 0) {
|
|
157
|
+
this.sendJson(res, 201, {
|
|
158
|
+
...response,
|
|
159
|
+
warnings: [`Agents not available on your tier: ${denied.join(', ')}. ${reason}`],
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
this.sendJson(res, 201, response);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
handleTeamStream(res, sessionId) {
|
|
167
|
+
const session = this.sessionManager.getSession(sessionId);
|
|
168
|
+
if (!session) {
|
|
169
|
+
this.sendError(res, 404, `Session not found: ${sessionId}`);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
// Set SSE headers
|
|
173
|
+
res.writeHead(200, {
|
|
174
|
+
'Content-Type': 'text/event-stream',
|
|
175
|
+
'Cache-Control': 'no-cache',
|
|
176
|
+
'Connection': 'keep-alive',
|
|
177
|
+
});
|
|
178
|
+
// Send initial connection event
|
|
179
|
+
res.write(`event: connected\ndata: ${JSON.stringify({ sessionId, status: session.status })}\n\n`);
|
|
180
|
+
// If already complete, send final event and close
|
|
181
|
+
if (session.status !== 'running') {
|
|
182
|
+
res.write(`event: complete\ndata: ${JSON.stringify({ status: session.status })}\n\n`);
|
|
183
|
+
res.end();
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
// Register as SSE client
|
|
187
|
+
const writer = {
|
|
188
|
+
write: (data) => { res.write(data); },
|
|
189
|
+
end: () => { res.end(); },
|
|
190
|
+
};
|
|
191
|
+
this.sessionManager.registerSSEClient(sessionId, writer);
|
|
192
|
+
// Clean up on client disconnect
|
|
193
|
+
res.on('close', () => {
|
|
194
|
+
this.sessionManager.removeSSEClient(sessionId, writer);
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
handleTeamStatus(res, sessionId) {
|
|
198
|
+
const status = this.sessionManager.getStatus(sessionId);
|
|
199
|
+
if (!status) {
|
|
200
|
+
this.sendError(res, 404, `Session not found: ${sessionId}`);
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
const response = {
|
|
204
|
+
sessionId,
|
|
205
|
+
status: status.session.status,
|
|
206
|
+
taskGraph: status.session.result?.taskGraph ?? null,
|
|
207
|
+
agents: [], // Would need trust manager access
|
|
208
|
+
verificationCount: status.verificationCount,
|
|
209
|
+
auditEntryCount: status.auditEntryCount,
|
|
210
|
+
durationMs: status.durationMs,
|
|
211
|
+
stalls: status.session.result?.stalls ?? [],
|
|
212
|
+
};
|
|
213
|
+
this.sendJson(res, 200, response);
|
|
214
|
+
}
|
|
215
|
+
handleTeamStop(res, sessionId) {
|
|
216
|
+
const stopped = this.sessionManager.stop(sessionId);
|
|
217
|
+
if (!stopped) {
|
|
218
|
+
this.sendError(res, 404, `Session not found or not running: ${sessionId}`);
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
this.sendJson(res, 200, { sessionId, status: 'halted' });
|
|
222
|
+
}
|
|
223
|
+
handleTeamAudit(res, sessionId, url) {
|
|
224
|
+
const offset = parseInt(url.searchParams.get('offset') ?? '0', 10);
|
|
225
|
+
const limit = Math.min(parseInt(url.searchParams.get('limit') ?? '50', 10), 200);
|
|
226
|
+
const audit = this.sessionManager.getAuditTrail(sessionId, offset, limit);
|
|
227
|
+
if (!audit) {
|
|
228
|
+
this.sendError(res, 404, `Session not found: ${sessionId}`);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
const response = {
|
|
232
|
+
sessionId,
|
|
233
|
+
entries: audit.entries,
|
|
234
|
+
total: audit.total,
|
|
235
|
+
offset,
|
|
236
|
+
limit,
|
|
237
|
+
};
|
|
238
|
+
this.sendJson(res, 200, response);
|
|
239
|
+
}
|
|
240
|
+
// ── Helpers ───────────────────────────────────────────────
|
|
241
|
+
extractApiKey(req) {
|
|
242
|
+
const auth = req.headers.authorization;
|
|
243
|
+
if (auth?.startsWith('Bearer ')) {
|
|
244
|
+
return auth.slice(7);
|
|
245
|
+
}
|
|
246
|
+
return null;
|
|
247
|
+
}
|
|
248
|
+
readBody(req) {
|
|
249
|
+
return new Promise((resolve, reject) => {
|
|
250
|
+
let body = '';
|
|
251
|
+
req.on('data', (chunk) => { body += chunk; });
|
|
252
|
+
req.on('end', () => resolve(body));
|
|
253
|
+
req.on('error', reject);
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
sendJson(res, status, data) {
|
|
257
|
+
res.writeHead(status, { 'Content-Type': 'application/json' });
|
|
258
|
+
res.end(JSON.stringify(data));
|
|
259
|
+
}
|
|
260
|
+
sendError(res, status, message) {
|
|
261
|
+
res.writeHead(status, { 'Content-Type': 'application/json' });
|
|
262
|
+
res.end(JSON.stringify({ error: message }));
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,wCAAwC;AACxC,mDAAmD;AACnD,uDAAuD;AACvD,6CAA6C;AAC7C,mDAAmD;AACnD,0DAA0D;AAC1D,+DAA+D;AAE/D,OAAO,EAAE,YAAY,EAA6C,MAAM,WAAW,CAAC;AACpF,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAkB,MAAM,mBAAmB,CAAC;AASvE,8DAA8D;AAE9D,MAAM,OAAO,aAAa;IAChB,eAAe,CAAkB;IACjC,cAAc,CAAqB;IACnC,MAAM,GAA2C,IAAI,CAAC;IACtD,IAAI,CAAS;IAErB,YAAY,IAAwB;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC;QAC/B,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAC7C,IAAI,CAAC,cAAc,GAAG,IAAI,kBAAkB,EAAE,CAAC;IACjD,CAAC;IAED,mDAAmD;IACnD,cAAc,CAAC,GAAW,EAAE,IAAiC,EAAE,KAAa;QAC1E,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC;IAED,6BAA6B;IAC7B,KAAK;QACH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;gBACtC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;oBACzC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;gBAClF,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE;gBACjC,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,4BAA4B;IAC5B,IAAI;QACF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACN,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,+CAA+C;IAC/C,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,6DAA6D;IAErD,KAAK,CAAC,aAAa,CAAC,GAAoB,EAAE,GAAmB;QACnE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,oBAAoB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC;QAC1B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC;QAEnC,eAAe;QACf,GAAG,CAAC,SAAS,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QAClD,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,oBAAoB,CAAC,CAAC;QACpE,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,6BAA6B,CAAC,CAAC;QAE7E,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,eAAe;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAClC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,sDAAsD,CAAC,CAAC;YACjF,OAAO;QACT,CAAC;QACD,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7E,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,QAAQ;QACR,IAAI,IAAI,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YAC3C,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,IAAI,KAAK,qBAAqB,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACxD,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAO,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACjE,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAE5B,QAAQ,MAAM,EAAE,CAAC;gBACf,KAAK,QAAQ;oBACX,IAAI,MAAM,KAAK,KAAK;wBAAE,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;oBACnE,MAAM;gBACR,KAAK,QAAQ;oBACX,IAAI,MAAM,KAAK,KAAK;wBAAE,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;oBACnE,MAAM;gBACR,KAAK,MAAM;oBACT,IAAI,MAAM,KAAK,MAAM;wBAAE,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;oBAClE,MAAM;gBACR,KAAK,OAAO;oBACV,IAAI,MAAM,KAAK,KAAK;wBAAE,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;oBACvE,MAAM;YACV,CAAC;QACH,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,cAAc,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,6DAA6D;IAErD,YAAY,CAAC,GAAmB;QACtC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE;YACtB,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,yBAAyB;YAClC,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAC5B,GAAoB,EACpB,GAAmB,EACnB,MAAc;QAEd,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,OAA0B,CAAC;QAE/B,IAAI,CAAC;YACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,mBAAmB,CAAC,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtD,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,8BAA8B,CAAC,CAAC;YACzD,OAAO;QACT,CAAC;QAED,mBAAmB;QACnB,MAAM,eAAe,GAA0B,OAAO,CAAC,MAAM;YAC3D,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;YACrB,CAAC,CAAC,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAE9C,uBAAuB;QACvB,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QAC/F,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,IAAI,iCAAiC,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;QAED,iBAAiB;QACjB,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE;YAC1E,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;YAC9C,cAAc,EAAE,OAAO,CAAC,cAAc;SACvC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAuB;YACnC,SAAS;YACT,SAAS,EAAE,gBAAgB,SAAS,SAAS;YAC7C,SAAS,EAAE,gBAAgB,SAAS,SAAS;YAC7C,MAAM,EAAE,OAAO;YACf,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE;gBACtB,GAAG,QAAQ;gBACX,QAAQ,EAAE,CAAC,sCAAsC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC;aACjF,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,GAAmB,EAAE,SAAiB;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC1D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,sBAAsB,SAAS,EAAE,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QAED,kBAAkB;QAClB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;YACjB,cAAc,EAAE,mBAAmB;YACnC,eAAe,EAAE,UAAU;YAC3B,YAAY,EAAE,YAAY;SAC3B,CAAC,CAAC;QAEH,gCAAgC;QAChC,GAAG,CAAC,KAAK,CAAC,2BAA2B,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;QAElG,kDAAkD;QAClD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,GAAG,CAAC,KAAK,CAAC,0BAA0B,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;YACtF,GAAG,CAAC,GAAG,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,yBAAyB;QACzB,MAAM,MAAM,GAAc;YACxB,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC7C,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;SAC1B,CAAC;QAEF,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAEzD,gCAAgC;QAChC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACnB,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,gBAAgB,CAAC,GAAmB,EAAE,SAAiB;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,sBAAsB,SAAS,EAAE,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAuB;YACnC,SAAS;YACT,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;YAC7B,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI,IAAI;YACnD,MAAM,EAAE,EAAE,EAAE,kCAAkC;YAC9C,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE;SAC5C,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC;IAEO,cAAc,CAAC,GAAmB,EAAE,SAAiB;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,qCAAqC,SAAS,EAAE,CAAC,CAAC;YAC3E,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC3D,CAAC;IAEO,eAAe,CAAC,GAAmB,EAAE,SAAiB,EAAE,GAAQ;QACtE,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;QACnE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QAEjF,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAC1E,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,sBAAsB,SAAS,EAAE,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAsB;YAClC,SAAS;YACT,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM;YACN,KAAK;SACN,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,6DAA6D;IAErD,aAAa,CAAC,GAAoB;QACxC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;QACvC,IAAI,IAAI,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,QAAQ,CAAC,GAAoB;QACnC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YACnC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,QAAQ,CAAC,GAAmB,EAAE,MAAc,EAAE,IAAa;QACjE,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC9D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAChC,CAAC;IAEO,SAAS,CAAC,GAAmB,EAAE,MAAc,EAAE,OAAe;QACpE,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC9D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAC9C,CAAC;CACF"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import type { TeamSession, AgentSpecialization, AuditEntry } from '../runtime/types.js';
|
|
3
|
+
export declare class TeamSessionManager extends EventEmitter {
|
|
4
|
+
private sessions;
|
|
5
|
+
private loops;
|
|
6
|
+
/**
|
|
7
|
+
* Create a new team session. Returns the session ID.
|
|
8
|
+
* The session starts immediately and runs asynchronously.
|
|
9
|
+
*/
|
|
10
|
+
create(apiKey: string, goal: string, agents: AgentSpecialization[], opts?: {
|
|
11
|
+
models?: Partial<Record<AgentSpecialization, string>>;
|
|
12
|
+
maxConcurrentTasks?: number;
|
|
13
|
+
stallTimeoutMs?: number;
|
|
14
|
+
codebaseRoot?: string;
|
|
15
|
+
}): string;
|
|
16
|
+
/**
|
|
17
|
+
* Get session info.
|
|
18
|
+
*/
|
|
19
|
+
getSession(sessionId: string): TeamSession | null;
|
|
20
|
+
/**
|
|
21
|
+
* Get detailed status including trust levels and task graph.
|
|
22
|
+
*/
|
|
23
|
+
getStatus(sessionId: string): {
|
|
24
|
+
session: TeamSession;
|
|
25
|
+
verificationCount: number;
|
|
26
|
+
auditEntryCount: number;
|
|
27
|
+
durationMs: number;
|
|
28
|
+
} | null;
|
|
29
|
+
/**
|
|
30
|
+
* Get audit trail for a session.
|
|
31
|
+
*/
|
|
32
|
+
getAuditTrail(sessionId: string, offset?: number, limit?: number): {
|
|
33
|
+
entries: readonly AuditEntry[];
|
|
34
|
+
total: number;
|
|
35
|
+
} | null;
|
|
36
|
+
/**
|
|
37
|
+
* Register an SSE client for real-time updates.
|
|
38
|
+
*/
|
|
39
|
+
registerSSEClient(sessionId: string, writer: SSEWriter): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Remove an SSE client.
|
|
42
|
+
*/
|
|
43
|
+
removeSSEClient(sessionId: string, writer: SSEWriter): void;
|
|
44
|
+
/**
|
|
45
|
+
* Stop a running session.
|
|
46
|
+
*/
|
|
47
|
+
stop(sessionId: string): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* List all sessions for an API key.
|
|
50
|
+
*/
|
|
51
|
+
listSessions(apiKey: string): TeamSession[];
|
|
52
|
+
private broadcastSSE;
|
|
53
|
+
private closeSSE;
|
|
54
|
+
private auditToSSEType;
|
|
55
|
+
}
|
|
56
|
+
export interface SSEWriter {
|
|
57
|
+
write(data: string): void;
|
|
58
|
+
end(): void;
|
|
59
|
+
}
|