@kya-os/mcp-i-cloudflare 1.4.1-canary.1 → 1.4.1-canary.11
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/README.md +120 -1
- package/dist/adapter.d.ts +6 -0
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +29 -0
- package/dist/adapter.js.map +1 -1
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +13 -0
- package/dist/agent.js.map +1 -1
- package/dist/app.d.ts +6 -3
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +14 -1
- package/dist/app.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +19 -2
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/runtime.d.ts +22 -8
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +130 -28
- package/dist/runtime.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +23 -4
- package/dist/server.js.map +1 -1
- package/dist/services/admin.service.d.ts.map +1 -1
- package/dist/services/admin.service.js +36 -3
- package/dist/services/admin.service.js.map +1 -1
- package/dist/services/consent-config.service.d.ts +46 -0
- package/dist/services/consent-config.service.d.ts.map +1 -0
- package/dist/services/consent-config.service.js +157 -0
- package/dist/services/consent-config.service.js.map +1 -0
- package/dist/services/consent-page-renderer.d.ts +137 -0
- package/dist/services/consent-page-renderer.d.ts.map +1 -0
- package/dist/services/consent-page-renderer.js +539 -0
- package/dist/services/consent-page-renderer.js.map +1 -0
- package/dist/services/consent.service.d.ts +58 -3
- package/dist/services/consent.service.d.ts.map +1 -1
- package/dist/services/consent.service.js +373 -18
- package/dist/services/consent.service.js.map +1 -1
- package/dist/services/proof-batch-queue.d.ts +104 -0
- package/dist/services/proof-batch-queue.d.ts.map +1 -0
- package/dist/services/proof-batch-queue.js +209 -0
- package/dist/services/proof-batch-queue.js.map +1 -0
- package/dist/services/proof.service.d.ts +38 -1
- package/dist/services/proof.service.d.ts.map +1 -1
- package/dist/services/proof.service.js +214 -21
- package/dist/services/proof.service.js.map +1 -1
- package/dist/services/transport.service.d.ts +47 -0
- package/dist/services/transport.service.d.ts.map +1 -0
- package/dist/services/transport.service.js +76 -0
- package/dist/services/transport.service.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proof Batch Queue (Cloudflare Workers Implementation)
|
|
3
|
+
*
|
|
4
|
+
* Platform-agnostic proof batching for Cloudflare Workers.
|
|
5
|
+
* Copied from @kya-os/mcp-i to avoid pulling in @swc/core dependency.
|
|
6
|
+
*
|
|
7
|
+
* Collects proofs in memory and submits them in batches to AgentShield.
|
|
8
|
+
* This prevents blocking tool execution while ensuring proofs are eventually submitted.
|
|
9
|
+
*
|
|
10
|
+
* Performance:
|
|
11
|
+
* - Batch size: 10 proofs (configurable)
|
|
12
|
+
* - Flush interval: 5 seconds (configurable)
|
|
13
|
+
* - Fire-and-forget submission (doesn't block tool execution)
|
|
14
|
+
*
|
|
15
|
+
* Retry Strategy:
|
|
16
|
+
* - Exponential backoff: 1s, 2s, 4s, 8s, 16s
|
|
17
|
+
* - Max retries: 5
|
|
18
|
+
* - Failed proofs logged and dropped after max retries
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* AgentShield proof submission destination
|
|
22
|
+
*
|
|
23
|
+
* Submits proofs to AgentShield's /api/v1/bouncer/proofs endpoint
|
|
24
|
+
* with proper authentication and session grouping.
|
|
25
|
+
*/
|
|
26
|
+
export class AgentShieldProofDestination {
|
|
27
|
+
name = 'AgentShield';
|
|
28
|
+
apiUrl;
|
|
29
|
+
apiKey;
|
|
30
|
+
constructor(apiUrl, apiKey) {
|
|
31
|
+
this.apiUrl = apiUrl.replace(/\/$/, '');
|
|
32
|
+
this.apiKey = apiKey;
|
|
33
|
+
}
|
|
34
|
+
async submit(proofs) {
|
|
35
|
+
if (proofs.length === 0) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
// Extract session_id from first proof for AgentShield session grouping
|
|
39
|
+
// AgentShield uses this for analytics and detection monitoring
|
|
40
|
+
const sessionId = proofs[0]?.meta?.sessionId || 'unknown';
|
|
41
|
+
// AgentShield API format requires delegation_id and session_id wrapper
|
|
42
|
+
const requestBody = {
|
|
43
|
+
delegation_id: null, // null for proofs without delegation context
|
|
44
|
+
session_id: sessionId, // AgentShield session grouping (same as meta.sessionId)
|
|
45
|
+
proofs: proofs
|
|
46
|
+
};
|
|
47
|
+
const response = await fetch(`${this.apiUrl}/api/v1/bouncer/proofs`, {
|
|
48
|
+
method: 'POST',
|
|
49
|
+
headers: {
|
|
50
|
+
'Content-Type': 'application/json',
|
|
51
|
+
'Authorization': `Bearer ${this.apiKey}`, // Bearer token format
|
|
52
|
+
},
|
|
53
|
+
body: JSON.stringify(requestBody),
|
|
54
|
+
});
|
|
55
|
+
if (!response.ok) {
|
|
56
|
+
// Include response body in error for debugging
|
|
57
|
+
const errorBody = await response.text().catch(() => 'Unable to read error body');
|
|
58
|
+
throw new Error(`AgentShield proof submission failed: ${response.status} ${response.statusText}\n${errorBody}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Proof Batch Queue
|
|
64
|
+
*
|
|
65
|
+
* Collects proofs and submits them in batches to multiple destinations.
|
|
66
|
+
*
|
|
67
|
+
* Note: In Cloudflare Workers, timers don't persist across requests,
|
|
68
|
+
* so automatic flush timers are disabled. Use manual flush() calls via cron jobs.
|
|
69
|
+
*/
|
|
70
|
+
export class ProofBatchQueue {
|
|
71
|
+
queue = [];
|
|
72
|
+
pendingBatches = [];
|
|
73
|
+
config;
|
|
74
|
+
closed = false;
|
|
75
|
+
// Stats
|
|
76
|
+
stats = {
|
|
77
|
+
queued: 0,
|
|
78
|
+
submitted: 0,
|
|
79
|
+
failed: 0,
|
|
80
|
+
batchesSubmitted: 0,
|
|
81
|
+
};
|
|
82
|
+
constructor(config) {
|
|
83
|
+
this.config = {
|
|
84
|
+
destinations: config.destinations,
|
|
85
|
+
maxBatchSize: config.maxBatchSize || 10,
|
|
86
|
+
flushIntervalMs: config.flushIntervalMs || 5000,
|
|
87
|
+
maxRetries: config.maxRetries || 5,
|
|
88
|
+
debug: config.debug || false,
|
|
89
|
+
};
|
|
90
|
+
// Note: Timers are disabled in Cloudflare Workers
|
|
91
|
+
// Flush must be called manually via cron jobs
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Add proof to queue
|
|
95
|
+
*/
|
|
96
|
+
enqueue(proof) {
|
|
97
|
+
if (this.closed) {
|
|
98
|
+
console.warn('[ProofBatchQueue] Queue is closed, dropping proof');
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
this.queue.push(proof);
|
|
102
|
+
this.stats.queued++;
|
|
103
|
+
if (this.config.debug) {
|
|
104
|
+
console.log(`[ProofBatchQueue] Enqueued proof (queue size: ${this.queue.length})`);
|
|
105
|
+
}
|
|
106
|
+
// Flush immediately if batch size reached (Cloudflare Workers compatible)
|
|
107
|
+
if (this.queue.length >= this.config.maxBatchSize) {
|
|
108
|
+
this.flush();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Flush queue immediately (submit all queued proofs)
|
|
113
|
+
*/
|
|
114
|
+
async flush() {
|
|
115
|
+
if (this.queue.length === 0) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const proofs = this.queue.splice(0, this.config.maxBatchSize);
|
|
119
|
+
if (this.config.debug) {
|
|
120
|
+
console.log(`[ProofBatchQueue] Flushing ${proofs.length} proofs to ${this.config.destinations.length} destinations`);
|
|
121
|
+
}
|
|
122
|
+
// Submit to all destinations
|
|
123
|
+
for (const destination of this.config.destinations) {
|
|
124
|
+
const batch = {
|
|
125
|
+
proofs: [...proofs], // Copy proofs for each destination
|
|
126
|
+
destination,
|
|
127
|
+
retryCount: 0,
|
|
128
|
+
};
|
|
129
|
+
this.submitBatch(batch); // Fire-and-forget
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Submit batch to destination (with retries)
|
|
134
|
+
*/
|
|
135
|
+
async submitBatch(batch) {
|
|
136
|
+
try {
|
|
137
|
+
await batch.destination.submit(batch.proofs);
|
|
138
|
+
this.stats.submitted += batch.proofs.length;
|
|
139
|
+
this.stats.batchesSubmitted++;
|
|
140
|
+
if (this.config.debug) {
|
|
141
|
+
console.log(`[ProofBatchQueue] Successfully submitted ${batch.proofs.length} proofs to ${batch.destination.name}`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
console.error(`[ProofBatchQueue] Failed to submit to ${batch.destination.name}:`, error);
|
|
146
|
+
// Retry with exponential backoff
|
|
147
|
+
if (batch.retryCount < this.config.maxRetries) {
|
|
148
|
+
batch.retryCount++;
|
|
149
|
+
const backoffMs = Math.min(1000 * Math.pow(2, batch.retryCount - 1), 16000);
|
|
150
|
+
batch.nextRetryAt = Date.now() + backoffMs;
|
|
151
|
+
this.pendingBatches.push(batch);
|
|
152
|
+
if (this.config.debug) {
|
|
153
|
+
console.log(`[ProofBatchQueue] Scheduling retry ${batch.retryCount}/${this.config.maxRetries} in ${backoffMs}ms`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
// Max retries exceeded, drop batch
|
|
158
|
+
this.stats.failed += batch.proofs.length;
|
|
159
|
+
console.error(`[ProofBatchQueue] Max retries exceeded for ${batch.destination.name}, dropping ${batch.proofs.length} proofs`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Retry pending batches that are ready
|
|
165
|
+
* Called by cron job or manually
|
|
166
|
+
*/
|
|
167
|
+
async retryPending() {
|
|
168
|
+
const now = Date.now();
|
|
169
|
+
const retryBatches = this.pendingBatches.filter((batch) => batch.nextRetryAt && batch.nextRetryAt <= now);
|
|
170
|
+
if (retryBatches.length > 0) {
|
|
171
|
+
// Remove from pending
|
|
172
|
+
this.pendingBatches = this.pendingBatches.filter((batch) => !retryBatches.includes(batch));
|
|
173
|
+
// Retry each batch
|
|
174
|
+
for (const batch of retryBatches) {
|
|
175
|
+
this.submitBatch(batch); // Fire-and-forget
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Close queue and flush remaining proofs
|
|
181
|
+
*/
|
|
182
|
+
async close() {
|
|
183
|
+
if (this.closed) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
this.closed = true;
|
|
187
|
+
// Flush remaining proofs
|
|
188
|
+
if (this.queue.length > 0) {
|
|
189
|
+
await this.flush();
|
|
190
|
+
}
|
|
191
|
+
// Wait for pending batches (with timeout)
|
|
192
|
+
const timeout = 5000; // 5 seconds
|
|
193
|
+
const startTime = Date.now();
|
|
194
|
+
while (this.pendingBatches.length > 0 && Date.now() - startTime < timeout) {
|
|
195
|
+
await this.retryPending();
|
|
196
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
197
|
+
}
|
|
198
|
+
if (this.pendingBatches.length > 0) {
|
|
199
|
+
console.warn(`[ProofBatchQueue] Closing with ${this.pendingBatches.length} pending batches (timed out)`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Get queue statistics
|
|
204
|
+
*/
|
|
205
|
+
getStats() {
|
|
206
|
+
return { ...this.stats };
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=proof-batch-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proof-batch-queue.js","sourceRoot":"","sources":["../../src/services/proof-batch-queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Handles proof submission to AgentShield API with optional context
|
|
5
5
|
* for dashboard integration.
|
|
6
|
+
*
|
|
7
|
+
* Supports both direct submission and batch queue submission.
|
|
6
8
|
*/
|
|
7
9
|
import type { DetachedProof } from '@kya-os/contracts/proof';
|
|
8
10
|
import type { CloudflareRuntimeConfig } from '../config';
|
|
@@ -19,14 +21,49 @@ export interface ProofSubmissionContext {
|
|
|
19
21
|
export declare class ProofService {
|
|
20
22
|
private config;
|
|
21
23
|
private runtime?;
|
|
24
|
+
private batchQueue?;
|
|
25
|
+
private firstProofSubmitted;
|
|
22
26
|
constructor(config: CloudflareRuntimeConfig, runtime?: CloudflareRuntime);
|
|
23
27
|
/**
|
|
24
28
|
* Submit proof to AgentShield API
|
|
25
|
-
* Uses
|
|
29
|
+
* Uses batch queue if available, otherwise falls back to direct submission.
|
|
26
30
|
*
|
|
27
31
|
* Also submits optional context for AgentShield dashboard integration.
|
|
28
32
|
* Context provides plaintext tool/args data while proof provides cryptographic verification.
|
|
33
|
+
*
|
|
34
|
+
* IMPORTANT: First proof is submitted immediately (not batched) to ensure
|
|
35
|
+
* dashboard setup detection works correctly.
|
|
29
36
|
*/
|
|
30
37
|
submitProof(proof: DetachedProof, context: ProofSubmissionContext): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Direct proof submission (fallback when batch queue not available)
|
|
40
|
+
*/
|
|
41
|
+
private submitProofDirect;
|
|
42
|
+
/**
|
|
43
|
+
* Flush pending proofs in batch queue
|
|
44
|
+
*
|
|
45
|
+
* Called by scheduled cron job (configured in wrangler.toml).
|
|
46
|
+
*
|
|
47
|
+
* Cron Configuration:
|
|
48
|
+
* Add this to your wrangler.toml to enable automatic proof flushing:
|
|
49
|
+
*
|
|
50
|
+
* [triggers.crons]
|
|
51
|
+
* cron = "every 5 minutes" # Flush proof batches every 5 minutes
|
|
52
|
+
*
|
|
53
|
+
* The cron job will call the scheduled handler exported from your Worker,
|
|
54
|
+
* which routes to MCPICloudflareServer.handleScheduled(), which then calls
|
|
55
|
+
* this flush() method.
|
|
56
|
+
*
|
|
57
|
+
* Why cron instead of timers?
|
|
58
|
+
* - Cloudflare Workers are stateless and don't persist timers across requests
|
|
59
|
+
* - Cron jobs provide reliable cross-request batching
|
|
60
|
+
* - Proofs are still batched within requests (auto-flush when batch size reached)
|
|
61
|
+
*
|
|
62
|
+
* Flush frequency:
|
|
63
|
+
* - Default: Every minute (adjustable in wrangler.toml)
|
|
64
|
+
* - Proofs are also flushed immediately when batch size is reached
|
|
65
|
+
* - Failed proofs are retried with exponential backoff
|
|
66
|
+
*/
|
|
67
|
+
flush(): Promise<void>;
|
|
31
68
|
}
|
|
32
69
|
//# sourceMappingURL=proof.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proof.service.d.ts","sourceRoot":"","sources":["../../src/services/proof.service.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"proof.service.d.ts","sourceRoot":"","sources":["../../src/services/proof.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAmB,MAAM,YAAY,CAAC;AAIrE,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,OAAO,CAAC,CAAoB;IACpC,OAAO,CAAC,UAAU,CAAC,CAAkB;IACrC,OAAO,CAAC,mBAAmB,CAAS;gBAExB,MAAM,EAAE,uBAAuB,EAAE,OAAO,CAAC,EAAE,iBAAiB;IAkFxE;;;;;;;;;OASG;IACG,WAAW,CACf,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,IAAI,CAAC;IA0ChB;;OAEG;YACW,iBAAiB;IAmI/B;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ7B"}
|
|
@@ -3,26 +3,141 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Handles proof submission to AgentShield API with optional context
|
|
5
5
|
* for dashboard integration.
|
|
6
|
+
*
|
|
7
|
+
* Supports both direct submission and batch queue submission.
|
|
6
8
|
*/
|
|
9
|
+
import { ProofBatchQueue, AgentShieldProofDestination } from './proof-batch-queue';
|
|
7
10
|
export class ProofService {
|
|
8
11
|
config;
|
|
9
12
|
runtime;
|
|
13
|
+
batchQueue;
|
|
14
|
+
firstProofSubmitted = false; // Track if first proof has been submitted
|
|
10
15
|
constructor(config, runtime) {
|
|
11
16
|
this.config = config;
|
|
12
17
|
this.runtime = runtime;
|
|
18
|
+
// Log service creation for debugging
|
|
19
|
+
const proofingConfig = this.config.proofing;
|
|
20
|
+
const hasApiKey = proofingConfig?.batchQueue?.destinations?.some((dest) => dest.type === 'agentshield' && dest.apiKey);
|
|
21
|
+
console.log('[ProofService] Initialized:', {
|
|
22
|
+
proofingEnabled: proofingConfig?.enabled || false,
|
|
23
|
+
hasApiKey: !!hasApiKey,
|
|
24
|
+
hasDestinations: !!(proofingConfig?.batchQueue?.destinations?.length),
|
|
25
|
+
destinationCount: proofingConfig?.batchQueue?.destinations?.length || 0,
|
|
26
|
+
apiKeyPresent: !!proofingConfig?.batchQueue?.destinations?.[0]?.apiKey,
|
|
27
|
+
apiUrl: proofingConfig?.batchQueue?.destinations?.[0]?.apiUrl || 'not-set',
|
|
28
|
+
});
|
|
29
|
+
// Warn if proofing is enabled but no API key is configured
|
|
30
|
+
if (proofingConfig?.enabled && !hasApiKey) {
|
|
31
|
+
console.warn('[ProofService] ⚠️ Proofing is enabled but AGENTSHIELD_API_KEY is not set!');
|
|
32
|
+
console.warn('[ProofService] To enable proof submission:');
|
|
33
|
+
console.warn('[ProofService] 1. Set AGENTSHIELD_API_KEY in .dev.vars (for local dev)');
|
|
34
|
+
console.warn('[ProofService] 2. Run: wrangler secret put AGENTSHIELD_API_KEY (for production)');
|
|
35
|
+
}
|
|
36
|
+
// Initialize batch queue if configured
|
|
37
|
+
// Note: In Cloudflare Workers, timers don't persist across requests,
|
|
38
|
+
// so we rely on manual flush() calls via cron jobs instead of automatic timers
|
|
39
|
+
if (proofingConfig?.enabled && proofingConfig.batchQueue?.destinations?.length) {
|
|
40
|
+
try {
|
|
41
|
+
const destinations = [];
|
|
42
|
+
for (const destConfig of proofingConfig.batchQueue.destinations) {
|
|
43
|
+
if (destConfig.type === 'agentshield') {
|
|
44
|
+
// Only create destination if API key is present and not empty
|
|
45
|
+
if (destConfig.apiKey?.length && destConfig.apiUrl?.length) {
|
|
46
|
+
destinations.push(new AgentShieldProofDestination(destConfig.apiUrl, destConfig.apiKey));
|
|
47
|
+
console.log('[ProofService] Added AgentShield destination:', {
|
|
48
|
+
apiUrl: destConfig.apiUrl,
|
|
49
|
+
hasApiKey: !!destConfig.apiKey,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
console.warn('[ProofService] Skipping AgentShield destination - missing API key or URL:', {
|
|
54
|
+
hasApiKey: !!destConfig.apiKey,
|
|
55
|
+
hasApiUrl: !!destConfig.apiUrl,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (destinations.length > 0) {
|
|
61
|
+
// Create batch queue without timers (Cloudflare Workers compatible)
|
|
62
|
+
// Timers won't work in Workers, so we rely on manual flush() via cron
|
|
63
|
+
this.batchQueue = new ProofBatchQueue({
|
|
64
|
+
destinations,
|
|
65
|
+
maxBatchSize: proofingConfig.batchQueue.maxBatchSize || 10,
|
|
66
|
+
flushIntervalMs: proofingConfig.batchQueue.flushIntervalMs || 5000,
|
|
67
|
+
maxRetries: proofingConfig.batchQueue.maxRetries || 3,
|
|
68
|
+
debug: proofingConfig.batchQueue.debug || false,
|
|
69
|
+
});
|
|
70
|
+
console.log('[ProofService] Batch queue initialized (Cloudflare Workers mode - manual flush via cron):', {
|
|
71
|
+
maxBatchSize: proofingConfig.batchQueue.maxBatchSize || 10,
|
|
72
|
+
flushIntervalMs: proofingConfig.batchQueue.flushIntervalMs || 5000,
|
|
73
|
+
destinations: destinations.length,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
console.warn('[ProofService] No valid destinations configured - batch queue not initialized');
|
|
78
|
+
// Warn in production if no API key configured
|
|
79
|
+
if (this.config.environment === 'production') {
|
|
80
|
+
console.warn('[ProofService] No AGENTSHIELD_API_KEY configured - proofs will not be submitted');
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
console.error('[ProofService] Failed to initialize batch queue:', error);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
13
88
|
}
|
|
14
89
|
/**
|
|
15
90
|
* Submit proof to AgentShield API
|
|
16
|
-
* Uses
|
|
91
|
+
* Uses batch queue if available, otherwise falls back to direct submission.
|
|
17
92
|
*
|
|
18
93
|
* Also submits optional context for AgentShield dashboard integration.
|
|
19
94
|
* Context provides plaintext tool/args data while proof provides cryptographic verification.
|
|
95
|
+
*
|
|
96
|
+
* IMPORTANT: First proof is submitted immediately (not batched) to ensure
|
|
97
|
+
* dashboard setup detection works correctly.
|
|
20
98
|
*/
|
|
21
99
|
async submitProof(proof, context) {
|
|
22
100
|
if (!proof.jws || !proof.meta) {
|
|
23
101
|
console.warn('[ProofService] Proof missing jws or meta, skipping submission');
|
|
24
102
|
return;
|
|
25
103
|
}
|
|
104
|
+
// Submit first proof immediately for dashboard setup detection
|
|
105
|
+
// This ensures the dashboard can detect the server and tools immediately
|
|
106
|
+
if (!this.firstProofSubmitted && this.batchQueue) {
|
|
107
|
+
console.log('[ProofService] Submitting first proof immediately for dashboard setup detection');
|
|
108
|
+
this.firstProofSubmitted = true;
|
|
109
|
+
// Submit first proof directly, then use batching for subsequent proofs
|
|
110
|
+
await this.submitProofDirect(proof, context);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
// Use batch queue if available (recommended for batching)
|
|
114
|
+
// Note: In Cloudflare Workers, the queue batches within request context
|
|
115
|
+
// but relies on cron jobs for cross-request flushing
|
|
116
|
+
if (this.batchQueue) {
|
|
117
|
+
try {
|
|
118
|
+
console.log('[ProofService] Enqueuing proof to batch queue:', {
|
|
119
|
+
did: proof.meta.did,
|
|
120
|
+
sessionId: proof.meta.sessionId,
|
|
121
|
+
toolName: context.toolName,
|
|
122
|
+
scopeId: proof.meta.scopeId,
|
|
123
|
+
mcpServerUrl: context.mcpServerUrl || 'not-set',
|
|
124
|
+
});
|
|
125
|
+
// Enqueue proof - batch queue will auto-flush when batch size is reached
|
|
126
|
+
this.batchQueue.enqueue(proof);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
console.error('[ProofService] Failed to enqueue proof, falling back to direct submission:', error);
|
|
131
|
+
// Fall through to direct submission
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Fallback to direct submission if batch queue not available
|
|
135
|
+
await this.submitProofDirect(proof, context);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Direct proof submission (fallback when batch queue not available)
|
|
139
|
+
*/
|
|
140
|
+
async submitProofDirect(proof, context) {
|
|
26
141
|
// Get AgentShield config from proofing config
|
|
27
142
|
const proofingConfig = this.config.proofing;
|
|
28
143
|
if (!proofingConfig?.enabled || !proofingConfig.batchQueue?.destinations) {
|
|
@@ -32,11 +147,22 @@ export class ProofService {
|
|
|
32
147
|
// Find AgentShield destination
|
|
33
148
|
const agentShieldDest = proofingConfig.batchQueue.destinations.find((dest) => dest.type === 'agentshield' && dest.apiKey);
|
|
34
149
|
if (!agentShieldDest || !agentShieldDest.apiKey || !agentShieldDest.apiUrl) {
|
|
35
|
-
console.log('[ProofService] No AgentShield destination configured'
|
|
150
|
+
console.log('[ProofService] No AgentShield destination configured:', {
|
|
151
|
+
hasDestinations: !!(proofingConfig.batchQueue.destinations?.length),
|
|
152
|
+
foundDest: !!agentShieldDest,
|
|
153
|
+
hasApiKey: !!agentShieldDest?.apiKey,
|
|
154
|
+
hasApiUrl: !!agentShieldDest?.apiUrl,
|
|
155
|
+
});
|
|
36
156
|
return;
|
|
37
157
|
}
|
|
38
158
|
const apiUrl = agentShieldDest.apiUrl;
|
|
39
159
|
const apiKey = agentShieldDest.apiKey;
|
|
160
|
+
// Log API key presence (not value) for debugging
|
|
161
|
+
console.log('[ProofService] Direct submission config:', {
|
|
162
|
+
apiUrl,
|
|
163
|
+
hasApiKey: !!apiKey,
|
|
164
|
+
apiKeyLength: apiKey?.length || 0,
|
|
165
|
+
});
|
|
40
166
|
// Get tool call context from runtime (if available)
|
|
41
167
|
const toolCallContext = this.runtime?.getLastToolCallContext();
|
|
42
168
|
// Proof already has correct format from CloudflareRuntime
|
|
@@ -67,28 +193,95 @@ export class ProofService {
|
|
|
67
193
|
jwsFormat: proof.jws.split('.').length === 3 ? 'valid (3 parts)' : 'invalid',
|
|
68
194
|
contextTool: requestBody.context.toolCalls[0]?.tool,
|
|
69
195
|
contextScopeId: requestBody.context.toolCalls[0]?.scopeId,
|
|
70
|
-
mcpServerUrl: requestBody.context.mcpServerUrl || 'not-set'
|
|
196
|
+
mcpServerUrl: requestBody.context.mcpServerUrl || 'not-set',
|
|
197
|
+
requestBodySize: JSON.stringify(requestBody).length,
|
|
71
198
|
});
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
|
|
199
|
+
try {
|
|
200
|
+
const response = await fetch(`${apiUrl}/api/v1/bouncer/proofs`, {
|
|
201
|
+
method: 'POST',
|
|
202
|
+
headers: {
|
|
203
|
+
'Content-Type': 'application/json',
|
|
204
|
+
'Authorization': `Bearer ${apiKey}`
|
|
205
|
+
},
|
|
206
|
+
body: JSON.stringify(requestBody)
|
|
207
|
+
});
|
|
208
|
+
const responseText = await response.text();
|
|
209
|
+
if (!response.ok) {
|
|
210
|
+
console.error('[ProofService] Submission failed:', {
|
|
211
|
+
status: response.status,
|
|
212
|
+
statusText: response.statusText,
|
|
213
|
+
response: responseText.substring(0, 500), // Limit response size in logs
|
|
214
|
+
});
|
|
215
|
+
throw new Error(`AgentShield error: ${response.status}`);
|
|
216
|
+
}
|
|
217
|
+
let responseData;
|
|
218
|
+
try {
|
|
219
|
+
responseData = JSON.parse(responseText);
|
|
220
|
+
}
|
|
221
|
+
catch (parseError) {
|
|
222
|
+
console.error('[ProofService] Failed to parse response:', {
|
|
223
|
+
responseText: responseText.substring(0, 500),
|
|
224
|
+
error: parseError,
|
|
225
|
+
});
|
|
226
|
+
throw new Error('Invalid JSON response from AgentShield');
|
|
227
|
+
}
|
|
228
|
+
console.log('[ProofService] Response:', {
|
|
229
|
+
success: responseData.success,
|
|
230
|
+
received: responseData.received,
|
|
231
|
+
processed: responseData.processed,
|
|
232
|
+
accepted: responseData.accepted,
|
|
233
|
+
rejected: responseData.rejected,
|
|
234
|
+
errors: responseData.errors?.length || 0,
|
|
235
|
+
});
|
|
236
|
+
if (responseData.accepted) {
|
|
237
|
+
console.log('[ProofService] ✅ Proofs accepted:', responseData.accepted);
|
|
238
|
+
}
|
|
239
|
+
if (responseData.rejected) {
|
|
240
|
+
console.log('[ProofService] ❌ Proofs rejected:', responseData.rejected);
|
|
241
|
+
}
|
|
242
|
+
if (responseData.errors && responseData.errors.length > 0) {
|
|
243
|
+
console.error('[ProofService] Proof errors:', responseData.errors);
|
|
244
|
+
}
|
|
84
245
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
246
|
+
catch (error) {
|
|
247
|
+
console.error('[ProofService] Submission error:', {
|
|
248
|
+
error: error instanceof Error ? error.message : String(error),
|
|
249
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
250
|
+
});
|
|
251
|
+
throw error;
|
|
89
252
|
}
|
|
90
|
-
|
|
91
|
-
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Flush pending proofs in batch queue
|
|
256
|
+
*
|
|
257
|
+
* Called by scheduled cron job (configured in wrangler.toml).
|
|
258
|
+
*
|
|
259
|
+
* Cron Configuration:
|
|
260
|
+
* Add this to your wrangler.toml to enable automatic proof flushing:
|
|
261
|
+
*
|
|
262
|
+
* [triggers.crons]
|
|
263
|
+
* cron = "every 5 minutes" # Flush proof batches every 5 minutes
|
|
264
|
+
*
|
|
265
|
+
* The cron job will call the scheduled handler exported from your Worker,
|
|
266
|
+
* which routes to MCPICloudflareServer.handleScheduled(), which then calls
|
|
267
|
+
* this flush() method.
|
|
268
|
+
*
|
|
269
|
+
* Why cron instead of timers?
|
|
270
|
+
* - Cloudflare Workers are stateless and don't persist timers across requests
|
|
271
|
+
* - Cron jobs provide reliable cross-request batching
|
|
272
|
+
* - Proofs are still batched within requests (auto-flush when batch size reached)
|
|
273
|
+
*
|
|
274
|
+
* Flush frequency:
|
|
275
|
+
* - Default: Every minute (adjustable in wrangler.toml)
|
|
276
|
+
* - Proofs are also flushed immediately when batch size is reached
|
|
277
|
+
* - Failed proofs are retried with exponential backoff
|
|
278
|
+
*/
|
|
279
|
+
async flush() {
|
|
280
|
+
if (this.batchQueue) {
|
|
281
|
+
console.log('[ProofService] Flushing batch queue...');
|
|
282
|
+
await this.batchQueue.flush();
|
|
283
|
+
// Also retry any pending batches
|
|
284
|
+
await this.batchQueue.retryPending();
|
|
92
285
|
}
|
|
93
286
|
}
|
|
94
287
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proof.service.js","sourceRoot":"","sources":["../../src/services/proof.service.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"proof.service.js","sourceRoot":"","sources":["../../src/services/proof.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transport Detection Service
|
|
3
|
+
*
|
|
4
|
+
* Detects the transport type (HTTP, SSE, STDIO) and determines the appropriate
|
|
5
|
+
* consent strategy (server-hosted vs dashboard-hosted).
|
|
6
|
+
*
|
|
7
|
+
* Related Spec: MCP-I Phase 0 Implementation Plan, Task B.2
|
|
8
|
+
*/
|
|
9
|
+
export type TransportType = 'http' | 'sse' | 'stdio';
|
|
10
|
+
export type ConsentStrategy = 'server-hosted' | 'dashboard-hosted';
|
|
11
|
+
/**
|
|
12
|
+
* Transport Service
|
|
13
|
+
*
|
|
14
|
+
* Provides utilities for detecting transport type and determining consent strategy
|
|
15
|
+
*/
|
|
16
|
+
export declare class TransportService {
|
|
17
|
+
/**
|
|
18
|
+
* Detect the current transport type
|
|
19
|
+
*
|
|
20
|
+
* Detection logic:
|
|
21
|
+
* - Cloudflare Workers: Always HTTP capable (Request/Response available)
|
|
22
|
+
* - STDIO transport: process.stdin/stdout available (no HTTP server)
|
|
23
|
+
* - Default: HTTP (most common)
|
|
24
|
+
*
|
|
25
|
+
* @returns Detected transport type
|
|
26
|
+
*/
|
|
27
|
+
static detectTransport(): TransportType;
|
|
28
|
+
/**
|
|
29
|
+
* Get consent strategy based on transport type
|
|
30
|
+
*
|
|
31
|
+
* Strategy selection:
|
|
32
|
+
* - STDIO: dashboard-hosted (can't serve HTTP pages)
|
|
33
|
+
* - HTTP/SSE: server-hosted (can serve consent pages)
|
|
34
|
+
*
|
|
35
|
+
* @param transport - Optional transport type (auto-detected if not provided)
|
|
36
|
+
* @returns Consent strategy
|
|
37
|
+
*/
|
|
38
|
+
static getConsentStrategy(transport?: TransportType): ConsentStrategy;
|
|
39
|
+
/**
|
|
40
|
+
* Check if server-hosted consent is available
|
|
41
|
+
*
|
|
42
|
+
* @param transport - Optional transport type (auto-detected if not provided)
|
|
43
|
+
* @returns true if server-hosted consent is available
|
|
44
|
+
*/
|
|
45
|
+
static canServeConsentPage(transport?: TransportType): boolean;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=transport.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.service.d.ts","sourceRoot":"","sources":["../../src/services/transport.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC;AACrD,MAAM,MAAM,eAAe,GAAG,eAAe,GAAG,kBAAkB,CAAC;AAEnE;;;;GAIG;AACH,qBAAa,gBAAgB;IAC3B;;;;;;;;;OASG;IACH,MAAM,CAAC,eAAe,IAAI,aAAa;IA2BvC;;;;;;;;;OASG;IACH,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,EAAE,aAAa,GAAG,eAAe;IAYrE;;;;;OAKG;IACH,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,aAAa,GAAG,OAAO;CAG/D"}
|