@ctxprotocol/sdk 0.8.4 → 0.8.5
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 +16 -5
- package/dist/client/index.cjs +48 -50
- package/dist/client/index.cjs.map +1 -1
- package/dist/client/index.d.cts +143 -10
- package/dist/client/index.d.ts +143 -10
- package/dist/client/index.js +48 -50
- package/dist/client/index.js.map +1 -1
- package/dist/index.cjs +48 -50
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +48 -50
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -96,7 +96,7 @@ const result = await client.tools.execute({
|
|
|
96
96
|
console.log(result.session); // methodPrice, spent, remaining, maxSpend, ...
|
|
97
97
|
```
|
|
98
98
|
|
|
99
|
-
**Query mode** gives you curated answers — the server
|
|
99
|
+
**Query mode** gives you curated answers — the server runs a discovery-first planner contract (`discover/probe -> plan-from-evidence -> execute -> bounded fallback`) with model-aware context budgeting and AI synthesis for one flat fee:
|
|
100
100
|
```typescript
|
|
101
101
|
const answer = await client.query.run({
|
|
102
102
|
query: "What are the top whale movements on Base?",
|
|
@@ -109,7 +109,9 @@ console.log(answer.response); // AI-synthesized answer
|
|
|
109
109
|
console.log(answer.toolsUsed); // Which tools were used
|
|
110
110
|
console.log(answer.cost); // Cost breakdown
|
|
111
111
|
console.log(answer.dataUrl); // Optional blob URL with full data
|
|
112
|
-
console.log(answer.developerTrace?.summary); // retries/
|
|
112
|
+
console.log(answer.developerTrace?.summary); // retries/fallbacks/loops summary
|
|
113
|
+
console.log(answer.developerTrace?.diagnostics?.selection); // lane + scout probe diagnostics
|
|
114
|
+
console.log(answer.orchestrationMetrics); // high-level first-pass / rediscovery metrics
|
|
113
115
|
```
|
|
114
116
|
|
|
115
117
|
> Mixed listings are first-class: one listing can expose methods to both surfaces. Methods without `_meta.pricing.executeUsd` remain query-only until priced.
|
|
@@ -400,13 +402,18 @@ const closed = await client.tools.closeSession("sess_123");
|
|
|
400
402
|
|
|
401
403
|
#### `client.query.run(options)`
|
|
402
404
|
|
|
403
|
-
Run an agentic query. The server
|
|
405
|
+
Run an agentic query. The server applies discovery-first orchestration (`discover/probe -> plan-from-evidence -> execute -> bounded fallback`) with up to 100 MCP calls per response turn, then returns an AI-synthesized answer.
|
|
404
406
|
|
|
405
407
|
`queryDepth` controls orchestration depth:
|
|
406
408
|
- `fast`: lower-latency path for simple lookups.
|
|
407
409
|
- `auto`: server routes to either `fast` or `deep` from query intent + selected tool complexity.
|
|
408
410
|
- `deep`: completeness-oriented path (default when omitted).
|
|
409
411
|
|
|
412
|
+
`includeDeveloperTrace` and `orchestrationMetrics` expose optional rollout diagnostics.
|
|
413
|
+
`developerTrace.summary` reports aggregate retry/fallback counters, while
|
|
414
|
+
`developerTrace.diagnostics.selection` exposes runtime lane and scout probe signals
|
|
415
|
+
used by discovery-first planning.
|
|
416
|
+
|
|
410
417
|
```typescript
|
|
411
418
|
// Simple string
|
|
412
419
|
const answer = await client.query.run("What are the top whale movements on Base?");
|
|
@@ -428,7 +435,9 @@ console.log(answer.cost); // { modelCostUsd, toolCostUsd, totalCostUsd }
|
|
|
428
435
|
console.log(answer.durationMs); // Total time
|
|
429
436
|
console.log(answer.data); // Optional execution data (when includeData=true)
|
|
430
437
|
console.log(answer.dataUrl); // Optional blob URL (when includeDataUrl=true)
|
|
431
|
-
console.log(answer.developerTrace?.summary); // Optional trace summary (retries/
|
|
438
|
+
console.log(answer.developerTrace?.summary); // Optional trace summary (retries/fallbacks/loops)
|
|
439
|
+
console.log(answer.developerTrace?.diagnostics?.selection?.deepMode); // Optional deep lane trace
|
|
440
|
+
console.log(answer.orchestrationMetrics); // Optional high-level first-pass metrics
|
|
432
441
|
```
|
|
433
442
|
|
|
434
443
|
When retrieval-first synthesis rollout is enabled server-side, full-data or truncation-sensitive query requests can switch to retrieval-first context assembly using private stage artifacts and canonical execution data slices. `includeData` and `includeDataUrl` continue to reference the same canonical dataset used for synthesis.
|
|
@@ -483,6 +492,7 @@ import type {
|
|
|
483
492
|
QueryOptions,
|
|
484
493
|
QueryResult,
|
|
485
494
|
QueryDeveloperTrace,
|
|
495
|
+
QueryOrchestrationMetrics,
|
|
486
496
|
QueryCost,
|
|
487
497
|
QueryStreamEvent,
|
|
488
498
|
ContextErrorCode,
|
|
@@ -560,7 +570,8 @@ interface QueryResult {
|
|
|
560
570
|
durationMs: number;
|
|
561
571
|
data?: unknown; // Optional execution data (includeData=true)
|
|
562
572
|
dataUrl?: string; // Optional blob URL (includeDataUrl=true)
|
|
563
|
-
developerTrace?: QueryDeveloperTrace; // Optional
|
|
573
|
+
developerTrace?: QueryDeveloperTrace; // Optional runtime trace + diagnostics
|
|
574
|
+
orchestrationMetrics?: QueryOrchestrationMetrics; // Optional first-pass outcome metrics
|
|
564
575
|
}
|
|
565
576
|
```
|
|
566
577
|
|
package/dist/client/index.cjs
CHANGED
|
@@ -340,7 +340,7 @@ var Query = class {
|
|
|
340
340
|
* Run an agentic query and wait for the full response.
|
|
341
341
|
*
|
|
342
342
|
* The server discovers relevant tools (or uses the ones you specify),
|
|
343
|
-
* executes the
|
|
343
|
+
* executes the discovery-first pipeline (up to 100 MCP calls per tool),
|
|
344
344
|
* and returns an AI-synthesized answer. Payment is settled after
|
|
345
345
|
* successful execution via deferred settlement.
|
|
346
346
|
*
|
|
@@ -369,48 +369,25 @@ var Query = class {
|
|
|
369
369
|
*/
|
|
370
370
|
async run(options) {
|
|
371
371
|
const opts = typeof options === "string" ? { query: options } : options;
|
|
372
|
-
|
|
373
|
-
const
|
|
374
|
-
"
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
queryDepth: opts.queryDepth,
|
|
386
|
-
stream: false
|
|
387
|
-
})
|
|
372
|
+
let terminalError;
|
|
373
|
+
for await (const event of this.stream(opts)) {
|
|
374
|
+
if (event.type === "error") {
|
|
375
|
+
terminalError = {
|
|
376
|
+
error: event.error,
|
|
377
|
+
...event.code ? { code: event.code } : {},
|
|
378
|
+
...event.scope ? { scope: event.scope } : {},
|
|
379
|
+
...event.reasonCode ? { reasonCode: event.reasonCode } : {}
|
|
380
|
+
};
|
|
381
|
+
continue;
|
|
382
|
+
}
|
|
383
|
+
if (event.type === "done") {
|
|
384
|
+
return event.result;
|
|
388
385
|
}
|
|
389
|
-
);
|
|
390
|
-
if ("error" in response) {
|
|
391
|
-
throw new ContextError(
|
|
392
|
-
response.error,
|
|
393
|
-
response.code,
|
|
394
|
-
void 0,
|
|
395
|
-
response.helpUrl
|
|
396
|
-
);
|
|
397
386
|
}
|
|
398
|
-
if (
|
|
399
|
-
|
|
400
|
-
toolsUsed: response.toolsUsed,
|
|
401
|
-
durationMs: response.durationMs
|
|
402
|
-
}) : void 0);
|
|
403
|
-
return {
|
|
404
|
-
response: response.response,
|
|
405
|
-
toolsUsed: response.toolsUsed,
|
|
406
|
-
cost: response.cost,
|
|
407
|
-
durationMs: response.durationMs,
|
|
408
|
-
data: response.data,
|
|
409
|
-
dataUrl: response.dataUrl,
|
|
410
|
-
developerTrace
|
|
411
|
-
};
|
|
387
|
+
if (terminalError) {
|
|
388
|
+
throw new ContextError(terminalError.error, terminalError.code);
|
|
412
389
|
}
|
|
413
|
-
throw new ContextError("
|
|
390
|
+
throw new ContextError("Streaming query ended before done event");
|
|
414
391
|
}
|
|
415
392
|
/**
|
|
416
393
|
* Run an agentic query with streaming. Returns an async iterable that
|
|
@@ -420,6 +397,7 @@ var Query = class {
|
|
|
420
397
|
* - `tool-status` — A tool started executing or changed status
|
|
421
398
|
* - `text-delta` — A chunk of the AI response text
|
|
422
399
|
* - `developer-trace` — Runtime trace metadata (when includeDeveloperTrace=true)
|
|
400
|
+
* - `error` — A structured query/runtime error emitted before stream completion
|
|
423
401
|
* - `done` — The full response is complete (includes final `QueryResult`)
|
|
424
402
|
*
|
|
425
403
|
* @param options - Query options or a plain string question
|
|
@@ -441,6 +419,9 @@ var Query = class {
|
|
|
441
419
|
* case "done":
|
|
442
420
|
* console.log("\nCost:", event.result.cost.totalCostUsd);
|
|
443
421
|
* break;
|
|
422
|
+
* case "error":
|
|
423
|
+
* console.error("Stream error:", event.error);
|
|
424
|
+
* break;
|
|
444
425
|
* }
|
|
445
426
|
* }
|
|
446
427
|
* ```
|
|
@@ -459,6 +440,7 @@ var Query = class {
|
|
|
459
440
|
includeDataUrl: opts.includeDataUrl,
|
|
460
441
|
includeDeveloperTrace: opts.includeDeveloperTrace,
|
|
461
442
|
queryDepth: opts.queryDepth,
|
|
443
|
+
debugScoutDeepMode: opts.debugScoutDeepMode,
|
|
462
444
|
stream: true
|
|
463
445
|
})
|
|
464
446
|
});
|
|
@@ -496,10 +478,13 @@ var Query = class {
|
|
|
496
478
|
event.result.developerTrace
|
|
497
479
|
);
|
|
498
480
|
if (!mergedTrace && opts.includeDeveloperTrace) {
|
|
499
|
-
mergedTrace = this.buildSyntheticTraceFromStreamStatus({
|
|
481
|
+
mergedTrace = statusTimeline.length > 0 ? this.buildSyntheticTraceFromStreamStatus({
|
|
500
482
|
statusTimeline,
|
|
501
483
|
toolsUsed: event.result.toolsUsed,
|
|
502
484
|
durationMs: event.result.durationMs
|
|
485
|
+
}) : this.buildSyntheticTraceFromRunResult({
|
|
486
|
+
toolsUsed: event.result.toolsUsed,
|
|
487
|
+
durationMs: event.result.durationMs
|
|
503
488
|
});
|
|
504
489
|
}
|
|
505
490
|
if (mergedTrace) {
|
|
@@ -616,30 +601,34 @@ var ContextClient = class {
|
|
|
616
601
|
*
|
|
617
602
|
* @internal
|
|
618
603
|
*/
|
|
619
|
-
async _fetch(endpoint, options = {}) {
|
|
604
|
+
async _fetch(endpoint, options = {}, fetchOptions) {
|
|
620
605
|
if (this._closed) {
|
|
621
606
|
throw new ContextError("Client has been closed");
|
|
622
607
|
}
|
|
623
608
|
const url = `${this.baseUrl}${endpoint}`;
|
|
624
609
|
const maxRetries = 3;
|
|
625
610
|
const timeoutMs = this.requestTimeoutMs;
|
|
611
|
+
const method = (options.method ?? "GET").toUpperCase();
|
|
612
|
+
const requestHeaders = new Headers(options.headers);
|
|
613
|
+
const canRetryRequest = fetchOptions?.retry === false ? false : method === "GET" || method === "HEAD" || method === "OPTIONS" || requestHeaders.has("Idempotency-Key");
|
|
626
614
|
let lastError;
|
|
627
615
|
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
628
616
|
const controller = new AbortController();
|
|
629
617
|
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
618
|
+
const mergedHeaders = new Headers(requestHeaders);
|
|
619
|
+
if (!mergedHeaders.has("Content-Type")) {
|
|
620
|
+
mergedHeaders.set("Content-Type", "application/json");
|
|
621
|
+
}
|
|
622
|
+
mergedHeaders.set("Authorization", `Bearer ${this.apiKey}`);
|
|
630
623
|
try {
|
|
631
624
|
const response = await fetch(url, {
|
|
632
625
|
...options,
|
|
633
626
|
signal: controller.signal,
|
|
634
|
-
headers:
|
|
635
|
-
"Content-Type": "application/json",
|
|
636
|
-
Authorization: `Bearer ${this.apiKey}`,
|
|
637
|
-
...options.headers
|
|
638
|
-
}
|
|
627
|
+
headers: mergedHeaders
|
|
639
628
|
});
|
|
640
629
|
clearTimeout(timeout);
|
|
641
630
|
if (!response.ok) {
|
|
642
|
-
if (response.status >= 500 && attempt < maxRetries) {
|
|
631
|
+
if (response.status >= 500 && canRetryRequest && attempt < maxRetries) {
|
|
643
632
|
const delay = Math.min(1e3 * 2 ** attempt, 1e4);
|
|
644
633
|
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
645
634
|
continue;
|
|
@@ -658,7 +647,16 @@ var ContextClient = class {
|
|
|
658
647
|
}
|
|
659
648
|
throw new ContextError(errorMessage, errorCode, response.status, helpUrl);
|
|
660
649
|
}
|
|
661
|
-
|
|
650
|
+
try {
|
|
651
|
+
return await response.json();
|
|
652
|
+
} catch (error) {
|
|
653
|
+
const parseError = error instanceof Error ? error : new Error(String(error));
|
|
654
|
+
throw new ContextError(
|
|
655
|
+
`Failed to parse JSON response: ${parseError.message}`,
|
|
656
|
+
void 0,
|
|
657
|
+
response.status
|
|
658
|
+
);
|
|
659
|
+
}
|
|
662
660
|
} catch (error) {
|
|
663
661
|
clearTimeout(timeout);
|
|
664
662
|
if (error instanceof ContextError) {
|
|
@@ -666,7 +664,7 @@ var ContextClient = class {
|
|
|
666
664
|
}
|
|
667
665
|
lastError = error instanceof Error ? error : new Error(String(error));
|
|
668
666
|
const isRetryable = lastError.name === "AbortError" || lastError.message.includes("fetch failed") || lastError.message.includes("ECONNRESET") || lastError.message.includes("ETIMEDOUT");
|
|
669
|
-
if (isRetryable && attempt < maxRetries) {
|
|
667
|
+
if (isRetryable && canRetryRequest && attempt < maxRetries) {
|
|
670
668
|
const delay = Math.min(1e3 * 2 ** attempt, 1e4);
|
|
671
669
|
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
672
670
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/types.ts","../../src/client/resources/discovery.ts","../../src/client/resources/tools.ts","../../src/client/resources/query.ts","../../src/client/client.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Configuration options for initializing the ContextClient\n */\nexport interface ContextClientOptions {\n /**\n * Your Context Protocol API key\n * @example \"sk_live_abc123...\"\n */\n apiKey: string;\n\n /**\n * Base URL for the Context Protocol API\n * @default \"https://www.ctxprotocol.com\"\n */\n baseUrl?: string;\n\n /**\n * Request timeout for non-streaming API calls in milliseconds.\n * @default 300000\n */\n requestTimeoutMs?: number;\n\n /**\n * Request timeout for establishing streaming API calls in milliseconds.\n * @default 600000\n */\n streamTimeoutMs?: number;\n}\n\n/**\n * An individual MCP tool exposed by a tool listing\n */\nexport interface McpToolRateLimitHints {\n /** Suggested request budget for this method */\n maxRequestsPerMinute?: number;\n\n /** Suggested parallel call ceiling for this method */\n maxConcurrency?: number;\n\n /** Suggested minimum delay between sequential calls */\n cooldownMs?: number;\n\n /** Whether this method already supports bulk/batch retrieval */\n supportsBulk?: boolean;\n\n /** Preferred batch-oriented methods to call instead of fan-out loops */\n recommendedBatchTools?: string[];\n\n /** Optional human-readable notes for planning */\n notes?: string;\n}\n\nexport type DiscoveryMode = \"query\" | \"execute\";\nexport type McpToolSurface = \"answer\" | \"execute\" | \"both\";\nexport type McpToolLatencyClass = \"instant\" | \"fast\" | \"slow\" | \"streaming\";\n\nexport interface McpToolPricingMeta {\n executeUsd?: string;\n queryUsd?: string;\n [key: string]: unknown;\n}\n\nexport interface McpToolMeta {\n /** Declared method surface */\n surface?: McpToolSurface;\n\n /** Whether this method can be selected in query mode */\n queryEligible?: boolean;\n\n /** Declared latency class for planner/runtime gating */\n latencyClass?: McpToolLatencyClass;\n\n /** Method-level pricing metadata */\n pricing?: McpToolPricingMeta;\n\n /** Derived discovery flag for execute eligibility */\n executeEligible?: boolean;\n\n /** Derived discovery field for explicit execute pricing visibility */\n executePriceUsd?: string;\n\n /** Context injection requirements handled by the Context runtime */\n contextRequirements?: string[];\n\n /**\n * Optional planner/runtime pacing hints.\n * Tool contributors can publish these to reduce rate-limit failures.\n */\n rateLimit?: McpToolRateLimitHints;\n rateLimitHints?: McpToolRateLimitHints;\n\n /** Flat aliases accepted for convenience */\n maxRequestsPerMinute?: number;\n maxConcurrency?: number;\n cooldownMs?: number;\n supportsBulk?: boolean;\n recommendedBatchTools?: string[];\n notes?: string;\n\n [key: string]: unknown;\n}\n\nexport interface StructuredMethodGuidanceHints {\n /** Suggested call-order sequence extracted from method descriptions */\n callOrderHints?: string[];\n\n /** Parameter usage caveats extracted from method descriptions */\n parameterCaveats?: string[];\n\n /** Edge-case behavior notes extracted from method descriptions */\n edgeCaseNotes?: string[];\n}\n\nexport interface McpTool {\n /** Name of the MCP tool method */\n name: string;\n\n /** Description of what this method does */\n description: string;\n\n /**\n * JSON Schema for the input arguments this tool accepts.\n * Used by LLMs to generate correct arguments.\n */\n inputSchema?: Record<string, unknown>;\n\n /**\n * JSON Schema for the output this tool returns.\n * Used by LLMs to understand the response structure.\n */\n outputSchema?: Record<string, unknown>;\n\n /** MCP metadata extensions (context injection, rate-limit hints) */\n _meta?: McpToolMeta;\n\n /** Explicit execute eligibility in discovery responses */\n executeEligible?: boolean;\n\n /** Explicit execute price visibility in discovery responses */\n executePriceUsd?: string | null;\n\n /** Whether this method has normalized structured guidance hints */\n hasStructuredGuidance?: boolean;\n\n /** Optional structured guidance hints derived from the method description */\n structuredGuidance?: StructuredMethodGuidanceHints;\n}\n\n/**\n * Represents a tool available on the Context Protocol marketplace\n */\nexport interface Tool {\n /** Unique identifier for the tool (UUID) */\n id: string;\n\n /** Human-readable name of the tool */\n name: string;\n\n /** Description of what the tool does */\n description: string;\n\n /** Price per execution in USDC */\n price: string;\n\n /** Tool category (e.g., \"defi\", \"nft\") */\n category?: string;\n\n /** Whether the tool is verified by Context Protocol */\n isVerified?: boolean;\n\n /** Tool type - currently always \"mcp\" */\n kind?: string;\n\n /**\n * Available MCP tool methods\n * Use items from this array as `toolName` when executing\n */\n mcpTools?: McpTool[];\n\n // Trust metrics (Level 2 - Reputation Ledger)\n /** Total number of queries processed */\n totalQueries?: number;\n\n /** Success rate percentage (0-100) */\n successRate?: string;\n\n /** Uptime percentage (0-100) */\n uptimePercent?: string;\n\n /** Total USDC staked by the developer */\n totalStaked?: string;\n\n /** Whether the tool has \"Proven\" status (100+ queries, >95% success, >98% uptime) */\n isProven?: boolean;\n}\n\n/**\n * Response from the tools search endpoint\n */\nexport interface SearchResponse {\n /** Array of matching tools */\n tools: Tool[];\n\n /** Discovery mode used by the server */\n mode?: DiscoveryMode;\n\n /** The search query that was used */\n query: string;\n\n /** Total number of results */\n count: number;\n}\n\n/**\n * Options for searching tools\n */\nexport interface SearchOptions {\n /** Search query (semantic search) */\n query?: string;\n\n /** Maximum number of results (1-50, default 10) */\n limit?: number;\n\n /** Discovery mode with billing semantics */\n mode?: DiscoveryMode;\n\n /** Optional explicit method surface filter */\n surface?: McpToolSurface;\n\n /** Require methods marked query eligible */\n queryEligible?: boolean;\n\n /** Require explicit method execute pricing */\n requireExecutePricing?: boolean;\n\n /** Exclude methods by latency class */\n excludeLatencyClasses?: McpToolLatencyClass[];\n\n /** Convenience switch to exclude slow methods in query mode */\n excludeSlow?: boolean;\n}\n\n/**\n * Options for executing a tool\n */\nexport interface ExecuteOptions {\n /** The UUID of the tool to execute (from search results) */\n toolId: string;\n\n /** The specific MCP tool name to call (from tool's mcpTools array) */\n toolName: string;\n\n /** Arguments to pass to the tool */\n args?: Record<string, unknown>;\n\n /**\n * Optional idempotency key (UUID recommended).\n * Reuse the same key when retrying the same logical request.\n */\n idempotencyKey?: string;\n\n /** Explicit execute mode label for request clarity */\n mode?: \"execute\";\n\n /** Optional execute session identifier */\n sessionId?: string;\n\n /** Optional per-session spend budget envelope (USD) */\n maxSpendUsd?: string;\n\n /** Request session closure after this execute call settles */\n closeSession?: boolean;\n}\n\nexport type ExecuteSessionStatus = \"open\" | \"closed\" | \"expired\";\n\nexport interface ExecuteSessionSpend {\n mode: \"execute\";\n sessionId: string | null;\n methodPrice: string;\n spent: string;\n remaining: string | null;\n maxSpend: string | null;\n\n /** Optional lifecycle fields when the API returns session state */\n status?: ExecuteSessionStatus;\n expiresAt?: string;\n closeRequested?: boolean;\n pendingAccruedCount?: number;\n pendingAccruedUsd?: string;\n}\n\n/**\n * Successful execution response from the API\n */\nexport interface ExecuteApiSuccessResponse {\n success: true;\n mode: \"execute\";\n\n /** The result data from the tool execution */\n result: unknown;\n\n /** Information about the executed tool */\n tool: {\n id: string;\n name: string;\n };\n\n /** Method-level execute pricing used for this call */\n method: {\n name: string;\n executePriceUsd: string;\n };\n\n /** Spend envelope visibility for execute sessions */\n session: ExecuteSessionSpend;\n\n /** Execution duration in milliseconds */\n durationMs: number;\n}\n\n/**\n * Error response from the API\n */\nexport interface ExecuteApiErrorResponse {\n /** Human-readable error message */\n error: string;\n\n /** Explicit mode label for clarity */\n mode?: \"execute\";\n\n /** Error code for programmatic handling */\n code?: ContextErrorCode;\n\n /** URL to help resolve the issue */\n helpUrl?: string;\n\n /** Optional spend envelope context when available */\n session?: ExecuteSessionSpend;\n}\n\n/**\n * Raw API response from the execute endpoint\n */\nexport type ExecuteApiResponse = ExecuteApiSuccessResponse | ExecuteApiErrorResponse;\n\nexport interface ExecuteSessionStartOptions {\n /** Maximum spend budget for the session (USD string) */\n maxSpendUsd: string;\n}\n\nexport interface ExecuteSessionApiSuccessResponse {\n success: true;\n mode: \"execute\";\n session: ExecuteSessionSpend;\n}\n\nexport type ExecuteSessionApiResponse =\n | ExecuteSessionApiSuccessResponse\n | ExecuteApiErrorResponse;\n\nexport interface ExecuteSessionResult {\n mode: \"execute\";\n session: ExecuteSessionSpend;\n}\n\n/**\n * The resolved result returned to the user after SDK processing\n */\nexport interface ExecutionResult<T = unknown> {\n mode: \"execute\";\n\n /** The data returned by the tool */\n result: T;\n\n /** Information about the executed tool */\n tool: {\n id: string;\n name: string;\n };\n\n /** Method-level execute pricing used for this call */\n method: {\n name: string;\n executePriceUsd: string;\n };\n\n /** Spend envelope visibility for execute calls */\n session: ExecuteSessionSpend;\n\n /** Execution duration in milliseconds */\n durationMs: number;\n}\n\n// ---------------------------------------------------------------------------\n// Query types (pay-per-response / agentic mode)\n// ---------------------------------------------------------------------------\n\n/** Supported orchestration depth modes for query execution. */\nexport type QueryDepth = \"fast\" | \"auto\" | \"deep\";\n\n/**\n * Options for the agentic query endpoint (pay-per-response).\n *\n * Unlike `execute()` which calls a single tool once, `query()` sends a\n * natural-language question and lets the server handle tool discovery,\n * multi-tool orchestration, self-healing retries, and AI synthesis.\n * One flat fee covers up to 100 MCP skill calls per tool.\n */\nexport interface QueryOptions {\n /** The natural-language question to answer */\n query: string;\n\n /**\n * Optional tool IDs to use. When omitted the server discovers tools\n * automatically (Auto Mode). When provided, only these tools are used\n * (Manual Mode).\n */\n tools?: string[];\n\n /**\n * Optional model ID for query orchestration/synthesis.\n * Supported IDs are published by the Context API.\n */\n modelId?: string;\n\n /**\n * Include execution data inline in the query response.\n * Useful for headless agents that need raw structured outputs.\n */\n includeData?: boolean;\n\n /**\n * Persist execution data to Vercel Blob and return a download URL.\n * Useful for large payload workflows where inline JSON is not ideal.\n */\n includeDataUrl?: boolean;\n\n /**\n * Include machine-readable developer trace output for this query response.\n * When enabled, the server may return timeline data describing retries,\n * fallbacks, loop checks, and intermediate recovery behavior.\n */\n includeDeveloperTrace?: boolean;\n\n /**\n * Query orchestration depth mode:\n * - `fast`: lower-latency path\n * - `auto`: server decides between fast/deep\n * - `deep`: full completeness-oriented path\n */\n queryDepth?: QueryDepth;\n\n /**\n * Optional idempotency key (UUID recommended).\n * Reuse the same key when retrying the same logical request.\n */\n idempotencyKey?: string;\n}\n\n/**\n * Tool reference attached to developer trace timeline steps.\n */\nexport interface QueryDeveloperTraceToolRef {\n id?: string;\n name?: string;\n method?: string;\n [key: string]: unknown;\n}\n\n/**\n * Loop metadata attached to developer trace timeline steps.\n */\nexport interface QueryDeveloperTraceLoopInfo {\n name?: string;\n iteration?: number;\n maxIterations?: number;\n [key: string]: unknown;\n}\n\n/**\n * A single developer-trace timeline step.\n */\nexport interface QueryDeveloperTraceStep {\n stepType?: string;\n event?: string;\n status?: string;\n message?: string;\n timestampMs?: number;\n tool?: QueryDeveloperTraceToolRef;\n attempt?: number;\n loop?: QueryDeveloperTraceLoopInfo;\n metadata?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\n/**\n * Aggregate counters that summarize developer-trace behavior.\n */\nexport interface QueryDeveloperTraceSummary {\n toolCalls?: number;\n retryCount?: number;\n selfHealCount?: number;\n fallbackCount?: number;\n failureCount?: number;\n recoveryCount?: number;\n completionChecks?: number;\n loopCount?: number;\n [key: string]: unknown;\n}\n\n/**\n * Developer Mode trace payload returned per query response (opt-in).\n */\nexport interface QueryDeveloperTrace {\n summary?: QueryDeveloperTraceSummary;\n timeline?: QueryDeveloperTraceStep[];\n [key: string]: unknown;\n}\n\n/**\n * Information about a tool that was used during a query response\n */\nexport interface QueryToolUsage {\n /** Tool ID */\n id: string;\n\n /** Tool name */\n name: string;\n\n /** Number of MCP skill calls made for this tool */\n skillCalls: number;\n}\n\n/**\n * Cost breakdown for a query response.\n * All values are strings representing USD amounts.\n */\nexport interface QueryCost {\n /** AI model inference cost */\n modelCostUsd: string;\n\n /** Sum of all tool fees */\n toolCostUsd: string;\n\n /** Total cost (model + tools) */\n totalCostUsd: string;\n}\n\n/**\n * The resolved result of a pay-per-response query\n */\nexport interface QueryResult {\n /** The AI-synthesized response text */\n response: string;\n\n /** Tools that were used to answer the query */\n toolsUsed: QueryToolUsage[];\n\n /** Cost breakdown */\n cost: QueryCost;\n\n /** Total duration in milliseconds */\n durationMs: number;\n\n /** Optional execution data from tools (when includeData=true) */\n data?: unknown;\n\n /** Optional blob URL for persisted execution data (when includeDataUrl=true) */\n dataUrl?: string;\n\n /** Optional machine-readable Developer Mode trace payload */\n developerTrace?: QueryDeveloperTrace;\n}\n\n/**\n * Successful response from the /api/v1/query endpoint\n */\nexport interface QueryApiSuccessResponse {\n success: true;\n response: string;\n toolsUsed: QueryToolUsage[];\n cost: QueryCost;\n durationMs: number;\n data?: unknown;\n dataUrl?: string;\n developerTrace?: QueryDeveloperTrace;\n}\n\n/**\n * Raw API response from the query endpoint\n */\nexport type QueryApiResponse = QueryApiSuccessResponse | ExecuteApiErrorResponse;\n\n// ---------------------------------------------------------------------------\n// Query stream event types\n// ---------------------------------------------------------------------------\n\n/** Emitted when a tool starts or changes execution status */\nexport interface QueryStreamToolStatusEvent {\n type: \"tool-status\";\n tool: { id: string; name: string };\n status: string;\n}\n\n/** Emitted for each chunk of the AI response text */\nexport interface QueryStreamTextDeltaEvent {\n type: \"text-delta\";\n delta: string;\n}\n\n/** Emitted when the server streams developer trace updates/chunks */\nexport interface QueryStreamDeveloperTraceEvent {\n type: \"developer-trace\";\n trace: QueryDeveloperTrace;\n}\n\n/** Emitted when the full response is complete */\nexport interface QueryStreamDoneEvent {\n type: \"done\";\n result: QueryResult;\n}\n\n/**\n * Union of all events emitted during a streaming query\n */\nexport type QueryStreamEvent =\n | QueryStreamToolStatusEvent\n | QueryStreamTextDeltaEvent\n | QueryStreamDeveloperTraceEvent\n | QueryStreamDoneEvent;\n\n// ---------------------------------------------------------------------------\n// Error types\n// ---------------------------------------------------------------------------\n\n/**\n * Specific error codes returned by the Context Protocol API\n */\nexport type ContextErrorCode =\n | \"unauthorized\"\n | \"no_wallet\"\n | \"insufficient_allowance\"\n | \"payment_failed\"\n | \"execution_failed\"\n | \"query_failed\"\n | \"invalid_tool_method\"\n | \"method_not_execute_eligible\"\n | \"invalid_max_spend\"\n | \"session_not_found\"\n | \"session_forbidden\"\n | \"session_closed\"\n | \"session_expired\"\n | \"max_spend_mismatch\"\n | \"session_budget_exceeded\";\n\n/**\n * Error thrown by the Context Protocol client\n */\nexport class ContextError extends Error {\n constructor(\n message: string,\n public readonly code?: ContextErrorCode | string,\n public readonly statusCode?: number,\n public readonly helpUrl?: string\n ) {\n super(message);\n this.name = \"ContextError\";\n Object.setPrototypeOf(this, ContextError.prototype);\n }\n}\n","import type { SearchOptions, SearchResponse, Tool } from \"../types.js\";\nimport type { ContextClient } from \"../client.js\";\n\n/**\n * Discovery resource for searching and finding tools on the Context Protocol marketplace\n */\nexport class Discovery {\n constructor(private client: ContextClient) {}\n\n /**\n * Search for tools matching a query string.\n *\n * Backward-compatible signatures:\n * - `search(\"gas prices\", 10)`\n * - `search({ query: \"gas prices\", limit: 10, mode: \"execute\" })`\n */\n async search(query: string, limit?: number): Promise<Tool[]>;\n async search(options: SearchOptions): Promise<Tool[]>;\n async search(\n queryOrOptions: string | SearchOptions,\n limit?: number\n ): Promise<Tool[]> {\n const options: SearchOptions =\n typeof queryOrOptions === \"string\"\n ? { query: queryOrOptions, limit }\n : queryOrOptions;\n\n const params = new URLSearchParams();\n const query = options.query ?? \"\";\n\n if (query) {\n params.set(\"q\", query);\n }\n\n if (options.limit !== undefined) {\n params.set(\"limit\", String(options.limit));\n }\n\n if (options.mode) {\n params.set(\"mode\", options.mode);\n }\n\n if (options.surface) {\n params.set(\"surface\", options.surface);\n }\n\n if (options.queryEligible !== undefined) {\n params.set(\"queryEligible\", String(options.queryEligible));\n }\n\n if (options.requireExecutePricing !== undefined) {\n params.set(\n \"requireExecutePricing\",\n String(options.requireExecutePricing)\n );\n }\n\n if (\n options.excludeLatencyClasses &&\n options.excludeLatencyClasses.length > 0\n ) {\n params.set(\"excludeLatency\", options.excludeLatencyClasses.join(\",\"));\n }\n\n if (options.excludeSlow !== undefined) {\n params.set(\"excludeSlow\", String(options.excludeSlow));\n }\n\n const queryString = params.toString();\n const endpoint = `/api/v1/tools/search${queryString ? `?${queryString}` : \"\"}`;\n\n const response = await this.client._fetch<SearchResponse>(endpoint);\n\n return response.tools;\n }\n\n /**\n * Get featured/popular tools (empty query search)\n *\n * @param limit - Maximum number of results (1-50, default 10)\n * @returns Array of featured tools\n *\n * @example\n * ```typescript\n * const featured = await client.discovery.getFeatured(5);\n * ```\n */\n async getFeatured(\n limit?: number,\n options?: Omit<SearchOptions, \"query\" | \"limit\">\n ): Promise<Tool[]> {\n return this.search({\n ...(options ?? {}),\n query: \"\",\n ...(limit !== undefined ? { limit } : {}),\n });\n }\n}\n","import type {\n ExecuteOptions,\n ExecuteApiResponse,\n ExecuteSessionApiResponse,\n ExecuteSessionResult,\n ExecuteSessionStartOptions,\n ExecutionResult,\n} from \"../types.js\";\nimport { ContextError } from \"../types.js\";\nimport type { ContextClient } from \"../client.js\";\n\n/**\n * Tools resource for executing tools on the Context Protocol marketplace\n */\nexport class Tools {\n constructor(private client: ContextClient) {}\n\n /**\n * Execute a tool with the provided arguments\n *\n * @param options - Execution options\n * @param options.toolId - The UUID of the tool (from search results)\n * @param options.toolName - The specific MCP tool method to call (from tool's mcpTools array)\n * @param options.args - Arguments to pass to the tool\n * @returns The execution result with the tool's output data\n *\n * @throws {ContextError} With code `no_wallet` if wallet not set up\n * @throws {ContextError} With code `insufficient_allowance` if spending cap not set\n * @throws {ContextError} With code `payment_failed` if payment settlement fails\n * @throws {ContextError} With code `execution_failed` if tool execution fails\n *\n * @example\n * ```typescript\n * // First, search for a tool\n * const tools = await client.discovery.search(\"gas prices\");\n * const tool = tools[0];\n *\n * // Execute a specific method from the tool's mcpTools\n * const result = await client.tools.execute({\n * toolId: tool.id,\n * toolName: tool.mcpTools[0].name, // e.g., \"get_gas_prices\"\n * args: { chainId: 1 }\n * });\n *\n * console.log(result.result); // The tool's output\n * console.log(result.durationMs); // Execution time\n * ```\n */\n async execute<T = unknown>(options: ExecuteOptions): Promise<ExecutionResult<T>> {\n const {\n toolId,\n toolName,\n args,\n idempotencyKey,\n mode,\n sessionId,\n maxSpendUsd,\n closeSession,\n } = options;\n const headers = idempotencyKey\n ? { \"Idempotency-Key\": idempotencyKey }\n : undefined;\n\n const response = await this.client._fetch<ExecuteApiResponse>(\n \"/api/v1/tools/execute\",\n {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n toolId,\n toolName,\n args,\n mode: mode ?? \"execute\",\n sessionId,\n maxSpendUsd,\n closeSession,\n }),\n }\n );\n\n // Handle error response\n if (\"error\" in response) {\n throw new ContextError(\n response.error,\n response.code,\n undefined, // Don't hardcode - this was a 200 OK with error body\n response.helpUrl\n );\n }\n\n // Handle success response\n if (response.success) {\n return {\n mode: response.mode,\n result: response.result as T,\n tool: response.tool,\n method: response.method,\n session: response.session,\n durationMs: response.durationMs,\n };\n }\n\n // Fallback - shouldn't reach here with valid API responses\n throw new ContextError(\"Unexpected response format from API\");\n }\n\n /**\n * Start an execute session with a max spend budget.\n */\n async startSession(\n options: ExecuteSessionStartOptions\n ): Promise<ExecuteSessionResult> {\n const response = await this.client._fetch<ExecuteSessionApiResponse>(\n \"/api/v1/tools/execute/sessions\",\n {\n method: \"POST\",\n body: JSON.stringify({\n mode: \"execute\",\n maxSpendUsd: options.maxSpendUsd,\n }),\n }\n );\n\n return this.resolveSessionLifecycleResponse(response);\n }\n\n /**\n * Fetch current execute session status by ID.\n */\n async getSession(sessionId: string): Promise<ExecuteSessionResult> {\n if (!sessionId) {\n throw new ContextError(\"sessionId is required\");\n }\n\n const encodedSessionId = encodeURIComponent(sessionId);\n const response = await this.client._fetch<ExecuteSessionApiResponse>(\n `/api/v1/tools/execute/sessions/${encodedSessionId}`\n );\n\n return this.resolveSessionLifecycleResponse(response);\n }\n\n /**\n * Close an execute session by ID.\n */\n async closeSession(sessionId: string): Promise<ExecuteSessionResult> {\n if (!sessionId) {\n throw new ContextError(\"sessionId is required\");\n }\n\n const encodedSessionId = encodeURIComponent(sessionId);\n const response = await this.client._fetch<ExecuteSessionApiResponse>(\n `/api/v1/tools/execute/sessions/${encodedSessionId}/close`,\n {\n method: \"POST\",\n body: JSON.stringify({ mode: \"execute\" }),\n }\n );\n\n return this.resolveSessionLifecycleResponse(response);\n }\n\n private resolveSessionLifecycleResponse(\n response: ExecuteSessionApiResponse\n ): ExecuteSessionResult {\n if (\"error\" in response) {\n throw new ContextError(\n response.error,\n response.code,\n undefined,\n response.helpUrl\n );\n }\n\n if (response.success) {\n return {\n mode: response.mode,\n session: response.session,\n };\n }\n\n throw new ContextError(\"Unexpected response format from API\");\n }\n}\n","import type {\n QueryOptions,\n QueryApiResponse,\n QueryDeveloperTrace,\n QueryResult,\n QueryStreamEvent,\n} from \"../types.js\";\nimport { ContextError } from \"../types.js\";\nimport type { ContextClient } from \"../client.js\";\n\n/**\n * Query resource for pay-per-response agentic queries.\n *\n * Unlike `tools.execute()` which calls a single tool once (pay-per-request),\n * the Query resource sends a natural-language question and lets the server\n * handle tool discovery, multi-tool orchestration, self-healing retries,\n * completeness checks, and AI synthesis — all for one flat fee.\n *\n * This is the \"prepared meal\" vs \"raw ingredients\" distinction:\n * - `tools.execute()` = raw data, full control, predictable cost\n * - `query.run()` / `query.stream()` = curated intelligence, one payment\n */\nexport class Query {\n constructor(private client: ContextClient) {}\n\n private buildSyntheticTraceFromRunResult(params: {\n toolsUsed: Array<{ id: string; name: string; skillCalls: number }>;\n durationMs: number;\n }): QueryDeveloperTrace {\n const timeline = params.toolsUsed.map((tool, index) => ({\n stepType: \"tool-call\",\n event: \"tool-call\",\n status: \"success\",\n timestampMs: index,\n tool: {\n id: tool.id,\n name: tool.name,\n },\n metadata: {\n skillCalls: tool.skillCalls,\n synthetic: true,\n },\n }));\n\n const toolCalls = params.toolsUsed.reduce(\n (sum, tool) => sum + Math.max(tool.skillCalls, 0),\n 0\n );\n\n return {\n summary: {\n toolCalls,\n retryCount: 0,\n selfHealCount: 0,\n fallbackCount: 0,\n failureCount: 0,\n recoveryCount: 0,\n completionChecks: 0,\n loopCount: 0,\n },\n timeline,\n source: \"sdk-fallback\",\n synthetic: true,\n reason: \"backend_trace_missing\",\n durationMs: params.durationMs,\n };\n }\n\n private buildSyntheticTraceFromStreamStatus(params: {\n statusTimeline: Array<{\n status: string;\n tool: { id: string; name: string };\n }>;\n toolsUsed: Array<{ id: string; name: string; skillCalls: number }>;\n durationMs: number;\n }): QueryDeveloperTrace {\n const timeline = params.statusTimeline.map((entry, index) => ({\n stepType: \"tool-status\",\n event: \"tool-status\",\n status: entry.status,\n timestampMs: index,\n tool:\n entry.tool.name || entry.tool.id\n ? {\n id: entry.tool.id || undefined,\n name: entry.tool.name || undefined,\n }\n : undefined,\n metadata: { synthetic: true },\n }));\n\n const toolCallsFromUsage = params.toolsUsed.reduce(\n (sum, tool) => sum + Math.max(tool.skillCalls, 0),\n 0\n );\n const toolCallsFromStatus = params.statusTimeline.filter(\n (entry) => entry.status === \"tool-complete\"\n ).length;\n const toolCalls = toolCallsFromUsage > 0 ? toolCallsFromUsage : toolCallsFromStatus;\n\n const retryCount = params.statusTimeline.filter((entry) =>\n /(retry|fix|reflect|recover)/i.test(entry.status)\n ).length;\n const completionChecks = params.statusTimeline.filter((entry) =>\n /complet/i.test(entry.status)\n ).length;\n\n return {\n summary: {\n toolCalls,\n retryCount,\n selfHealCount: retryCount,\n fallbackCount: 0,\n failureCount: 0,\n recoveryCount: 0,\n completionChecks,\n loopCount: retryCount,\n },\n timeline,\n source: \"sdk-fallback\",\n synthetic: true,\n reason: \"backend_trace_missing\",\n durationMs: params.durationMs,\n };\n }\n\n private mergeDeveloperTrace(\n first: QueryDeveloperTrace | undefined,\n second: QueryDeveloperTrace | undefined\n ): QueryDeveloperTrace | undefined {\n if (!first) return second;\n if (!second) return first;\n\n const firstTimeline = Array.isArray(first.timeline) ? first.timeline : [];\n const secondTimeline = Array.isArray(second.timeline) ? second.timeline : [];\n const mergedTimeline = [...firstTimeline, ...secondTimeline];\n\n return {\n ...first,\n ...second,\n summary: {\n ...(typeof first.summary === \"object\" && first.summary ? first.summary : {}),\n ...(typeof second.summary === \"object\" && second.summary\n ? second.summary\n : {}),\n },\n ...(mergedTimeline.length > 0 ? { timeline: mergedTimeline } : {}),\n };\n }\n\n private parseStreamEvent(rawData: string): QueryStreamEvent | undefined {\n const parsed = JSON.parse(rawData) as unknown;\n if (!parsed || typeof parsed !== \"object\") {\n return undefined;\n }\n\n const event = parsed as QueryStreamEvent;\n if (typeof (event as { type?: unknown }).type !== \"string\") {\n return undefined;\n }\n\n return event;\n }\n\n /**\n * Run an agentic query and wait for the full response.\n *\n * The server discovers relevant tools (or uses the ones you specify),\n * executes the full agentic pipeline (up to 100 MCP calls per tool),\n * and returns an AI-synthesized answer. Payment is settled after\n * successful execution via deferred settlement.\n *\n * @param options - Query options or a plain string question\n * @returns The complete query result with response text, tools used, and cost\n *\n * @throws {ContextError} With code `no_wallet` if wallet not set up\n * @throws {ContextError} With code `insufficient_allowance` if spending cap not set\n * @throws {ContextError} With code `payment_failed` if payment settlement fails\n * @throws {ContextError} With code `execution_failed` if the agentic pipeline fails\n *\n * @example\n * ```typescript\n * // Simple question — server discovers tools automatically\n * const answer = await client.query.run(\"What are the top whale movements on Base?\");\n * console.log(answer.response); // AI-synthesized answer\n * console.log(answer.toolsUsed); // Which tools were used\n * console.log(answer.cost); // Cost breakdown\n *\n * // With specific tools (Manual Mode)\n * const answer = await client.query.run({\n * query: \"Analyze whale activity\",\n * tools: [\"tool-uuid-1\", \"tool-uuid-2\"],\n * });\n * ```\n */\n async run(options: QueryOptions | string): Promise<QueryResult> {\n const opts = typeof options === \"string\" ? { query: options } : options;\n const headers = opts.idempotencyKey\n ? { \"Idempotency-Key\": opts.idempotencyKey }\n : undefined;\n\n const response = await this.client._fetch<QueryApiResponse>(\n \"/api/v1/query\",\n {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n query: opts.query,\n tools: opts.tools,\n modelId: opts.modelId,\n includeData: opts.includeData,\n includeDataUrl: opts.includeDataUrl,\n includeDeveloperTrace: opts.includeDeveloperTrace,\n queryDepth: opts.queryDepth,\n stream: false,\n }),\n }\n );\n\n // Handle error response\n if (\"error\" in response) {\n throw new ContextError(\n response.error,\n response.code,\n undefined,\n response.helpUrl\n );\n }\n\n // Handle success response\n if (response.success) {\n const developerTrace =\n response.developerTrace ??\n (opts.includeDeveloperTrace\n ? this.buildSyntheticTraceFromRunResult({\n toolsUsed: response.toolsUsed,\n durationMs: response.durationMs,\n })\n : undefined);\n return {\n response: response.response,\n toolsUsed: response.toolsUsed,\n cost: response.cost,\n durationMs: response.durationMs,\n data: response.data,\n dataUrl: response.dataUrl,\n developerTrace,\n };\n }\n\n throw new ContextError(\"Unexpected response format from query API\");\n }\n\n /**\n * Run an agentic query with streaming. Returns an async iterable that\n * yields events as the server processes the query in real-time.\n *\n * Event types:\n * - `tool-status` — A tool started executing or changed status\n * - `text-delta` — A chunk of the AI response text\n * - `developer-trace` — Runtime trace metadata (when includeDeveloperTrace=true)\n * - `done` — The full response is complete (includes final `QueryResult`)\n *\n * @param options - Query options or a plain string question\n * @returns An async iterable of stream events\n *\n * @example\n * ```typescript\n * for await (const event of client.query.stream(\"What are the top whale movements?\")) {\n * switch (event.type) {\n * case \"tool-status\":\n * console.log(`Tool ${event.tool.name}: ${event.status}`);\n * break;\n * case \"text-delta\":\n * process.stdout.write(event.delta);\n * break;\n * case \"developer-trace\":\n * console.log(\"Trace summary:\", event.trace.summary);\n * break;\n * case \"done\":\n * console.log(\"\\nCost:\", event.result.cost.totalCostUsd);\n * break;\n * }\n * }\n * ```\n */\n async *stream(\n options: QueryOptions | string\n ): AsyncGenerator<QueryStreamEvent> {\n const opts = typeof options === \"string\" ? { query: options } : options;\n const headers = opts.idempotencyKey\n ? { \"Idempotency-Key\": opts.idempotencyKey }\n : undefined;\n\n const response = await this.client._fetchRaw(\"/api/v1/query\", {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n query: opts.query,\n tools: opts.tools,\n modelId: opts.modelId,\n includeData: opts.includeData,\n includeDataUrl: opts.includeDataUrl,\n includeDeveloperTrace: opts.includeDeveloperTrace,\n queryDepth: opts.queryDepth,\n stream: true,\n }),\n });\n\n const body = response.body;\n if (!body) {\n throw new ContextError(\"No response body for streaming query\");\n }\n\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n let aggregatedTrace: QueryDeveloperTrace | undefined;\n const statusTimeline: Array<{\n status: string;\n tool: { id: string; name: string };\n }> = [];\n\n const parseAndHydrateEvent = (\n rawData: string\n ): QueryStreamEvent | undefined => {\n const event = this.parseStreamEvent(rawData);\n if (!event) {\n return undefined;\n }\n\n if (event.type === \"developer-trace\") {\n aggregatedTrace = this.mergeDeveloperTrace(aggregatedTrace, event.trace);\n return event;\n }\n\n if (event.type === \"tool-status\") {\n statusTimeline.push({\n status: event.status,\n tool: {\n id: event.tool.id,\n name: event.tool.name,\n },\n });\n return event;\n }\n\n if (event.type === \"done\") {\n let mergedTrace = this.mergeDeveloperTrace(\n aggregatedTrace,\n event.result.developerTrace\n );\n if (!mergedTrace && opts.includeDeveloperTrace) {\n mergedTrace = this.buildSyntheticTraceFromStreamStatus({\n statusTimeline,\n toolsUsed: event.result.toolsUsed,\n durationMs: event.result.durationMs,\n });\n }\n if (mergedTrace) {\n event.result.developerTrace = mergedTrace;\n }\n }\n\n return event;\n };\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.startsWith(\"data: \")) {\n const data = trimmed.slice(6);\n if (data === \"[DONE]\") return;\n try {\n const event = parseAndHydrateEvent(data);\n if (event) {\n yield event;\n }\n } catch {\n // Skip malformed SSE events\n }\n }\n }\n }\n\n // Process any remaining buffer\n if (buffer.trim().startsWith(\"data: \")) {\n const data = buffer.trim().slice(6);\n if (data !== \"[DONE]\") {\n try {\n const event = parseAndHydrateEvent(data);\n if (event) {\n yield event;\n }\n } catch {\n // Skip malformed SSE events\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n","import type { ContextClientOptions } from \"./types.js\";\nimport { ContextError } from \"./types.js\";\nimport { Discovery } from \"./resources/discovery.js\";\nimport { Tools } from \"./resources/tools.js\";\nimport { Query } from \"./resources/query.js\";\n\nconst DEFAULT_BASE_URL = \"https://www.ctxprotocol.com\";\nconst DEFAULT_REQUEST_TIMEOUT_MS = 300_000;\nconst DEFAULT_STREAM_TIMEOUT_MS = 600_000;\n\n/**\n * The official TypeScript client for the Context Protocol.\n *\n * Use this client to discover and execute AI tools programmatically.\n *\n * @example\n * ```typescript\n * import { ContextClient } from \"@contextprotocol/client\";\n *\n * const client = new ContextClient({\n * apiKey: \"sk_live_...\"\n * });\n *\n * // Pay-per-request: Execute a specific tool\n * const result = await client.tools.execute({\n * toolId: \"tool-uuid\",\n * toolName: \"get_gas_prices\",\n * args: { chainId: 1 }\n * });\n *\n * // Pay-per-response: Ask a question, get a curated answer\n * const answer = await client.query.run(\"What are the top whale movements on Base?\");\n * console.log(answer.response);\n * ```\n */\nexport class ContextClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly requestTimeoutMs: number;\n private readonly streamTimeoutMs: number;\n private _closed = false;\n\n /**\n * Discovery resource for searching tools\n */\n public readonly discovery: Discovery;\n\n /**\n * Tools resource for executing tools (pay-per-request)\n */\n public readonly tools: Tools;\n\n /**\n * Query resource for agentic queries (pay-per-response).\n *\n * Unlike `tools.execute()` which calls a single tool once, `query` sends\n * a natural-language question and lets the server handle tool discovery,\n * multi-tool orchestration, self-healing, and AI synthesis — one flat fee.\n */\n public readonly query: Query;\n\n /**\n * Creates a new Context Protocol client\n *\n * @param options - Client configuration options\n * @param options.apiKey - Your Context Protocol API key (format: sk_live_...)\n * @param options.baseUrl - Optional base URL override (defaults to https://www.ctxprotocol.com)\n * @param options.requestTimeoutMs - Optional timeout for non-streaming requests (default 300000ms)\n * @param options.streamTimeoutMs - Optional timeout for establishing stream requests (default 600000ms)\n */\n constructor(options: ContextClientOptions) {\n if (!options.apiKey) {\n throw new ContextError(\"API key is required\");\n }\n\n const requestTimeoutMs = options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;\n const streamTimeoutMs = options.streamTimeoutMs ?? DEFAULT_STREAM_TIMEOUT_MS;\n\n if (!Number.isFinite(requestTimeoutMs) || requestTimeoutMs <= 0) {\n throw new ContextError(\"requestTimeoutMs must be a positive number\");\n }\n\n if (!Number.isFinite(streamTimeoutMs) || streamTimeoutMs <= 0) {\n throw new ContextError(\"streamTimeoutMs must be a positive number\");\n }\n\n this.apiKey = options.apiKey;\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.requestTimeoutMs = requestTimeoutMs;\n this.streamTimeoutMs = streamTimeoutMs;\n\n // Initialize resources\n this.discovery = new Discovery(this);\n this.tools = new Tools(this);\n this.query = new Query(this);\n }\n\n /**\n * Close the client and clean up resources.\n * After calling close(), any in-flight requests may be aborted.\n */\n close(): void {\n this._closed = true;\n }\n\n /**\n * Internal method for making authenticated HTTP requests\n * Includes timeout and retry with exponential backoff for transient errors\n *\n * @internal\n */\n async _fetch<T>(endpoint: string, options: RequestInit = {}): Promise<T> {\n if (this._closed) {\n throw new ContextError(\"Client has been closed\");\n }\n\n const url = `${this.baseUrl}${endpoint}`;\n const maxRetries = 3;\n const timeoutMs = this.requestTimeoutMs;\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n ...options.headers,\n },\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) {\n // Retry on 5xx server errors\n if (response.status >= 500 && attempt < maxRetries) {\n const delay = Math.min(1000 * 2 ** attempt, 10_000);\n await new Promise((resolve) => setTimeout(resolve, delay));\n continue;\n }\n\n let errorMessage = `HTTP ${response.status}: ${response.statusText}`;\n let errorCode: string | undefined;\n let helpUrl: string | undefined;\n\n try {\n const errorBody = await response.json();\n if (errorBody.error) {\n errorMessage = errorBody.error;\n errorCode = errorBody.code;\n helpUrl = errorBody.helpUrl;\n }\n } catch {\n // Use default error message if JSON parsing fails\n }\n\n throw new ContextError(errorMessage, errorCode, response.status, helpUrl);\n }\n\n return response.json() as Promise<T>;\n } catch (error) {\n clearTimeout(timeout);\n\n if (error instanceof ContextError) {\n throw error;\n }\n\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Retry on network errors and timeouts\n const isRetryable =\n lastError.name === \"AbortError\" ||\n lastError.message.includes(\"fetch failed\") ||\n lastError.message.includes(\"ECONNRESET\") ||\n lastError.message.includes(\"ETIMEDOUT\");\n\n if (isRetryable && attempt < maxRetries) {\n const delay = Math.min(1000 * 2 ** attempt, 10_000);\n await new Promise((resolve) => setTimeout(resolve, delay));\n continue;\n }\n\n if (lastError.name === \"AbortError\") {\n throw new ContextError(\n `Request timed out after ${timeoutMs / 1000}s`,\n undefined,\n 408\n );\n }\n\n throw new ContextError(\n lastError.message,\n undefined,\n undefined\n );\n }\n }\n\n throw lastError ?? new ContextError(\"Request failed after retries\");\n }\n\n /**\n * Internal method for making authenticated HTTP requests that returns\n * the raw Response object. Used for streaming endpoints (SSE).\n * Includes a configurable timeout for stream setup.\n *\n * @internal\n */\n async _fetchRaw(endpoint: string, options: RequestInit = {}): Promise<Response> {\n if (this._closed) {\n throw new ContextError(\"Client has been closed\");\n }\n\n const url = `${this.baseUrl}${endpoint}`;\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.streamTimeoutMs);\n\n let response: Response;\n try {\n response = await fetch(url, {\n ...options,\n signal: controller.signal,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n ...options.headers,\n },\n });\n } catch (error) {\n clearTimeout(timeout);\n const lastError = error instanceof Error ? error : new Error(String(error));\n if (lastError.name === \"AbortError\") {\n throw new ContextError(\n `Streaming request timed out after ${this.streamTimeoutMs / 1000}s`,\n undefined,\n 408\n );\n }\n throw new ContextError(lastError.message);\n }\n\n clearTimeout(timeout);\n\n if (!response.ok) {\n let errorMessage = `HTTP ${response.status}: ${response.statusText}`;\n let errorCode: string | undefined;\n let helpUrl: string | undefined;\n\n try {\n const errorBody = await response.json();\n if (errorBody.error) {\n errorMessage = errorBody.error;\n errorCode = errorBody.code;\n helpUrl = errorBody.helpUrl;\n }\n } catch {\n // Use default error message if JSON parsing fails\n }\n\n throw new ContextError(errorMessage, errorCode, response.status, helpUrl);\n }\n\n return response;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/client/types.ts","../../src/client/resources/discovery.ts","../../src/client/resources/tools.ts","../../src/client/resources/query.ts","../../src/client/client.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Configuration options for initializing the ContextClient\n */\nexport interface ContextClientOptions {\n /**\n * Your Context Protocol API key\n * @example \"sk_live_abc123...\"\n */\n apiKey: string;\n\n /**\n * Base URL for the Context Protocol API\n * @default \"https://www.ctxprotocol.com\"\n */\n baseUrl?: string;\n\n /**\n * Request timeout for non-streaming API calls in milliseconds.\n * @default 300000\n */\n requestTimeoutMs?: number;\n\n /**\n * Request timeout for establishing streaming API calls in milliseconds.\n * @default 600000\n */\n streamTimeoutMs?: number;\n}\n\n/**\n * An individual MCP tool exposed by a tool listing\n */\nexport interface McpToolRateLimitHints {\n /** Suggested request budget for this method */\n maxRequestsPerMinute?: number;\n\n /** Suggested parallel call ceiling for this method */\n maxConcurrency?: number;\n\n /** Suggested minimum delay between sequential calls */\n cooldownMs?: number;\n\n /** Whether this method already supports bulk/batch retrieval */\n supportsBulk?: boolean;\n\n /** Preferred batch-oriented methods to call instead of fan-out loops */\n recommendedBatchTools?: string[];\n\n /** Optional human-readable notes for planning */\n notes?: string;\n}\n\nexport type DiscoveryMode = \"query\" | \"execute\";\nexport type McpToolSurface = \"answer\" | \"execute\" | \"both\";\nexport type McpToolLatencyClass = \"instant\" | \"fast\" | \"slow\" | \"streaming\";\n\nexport interface McpToolPricingMeta {\n executeUsd?: string;\n queryUsd?: string;\n [key: string]: unknown;\n}\n\nexport interface McpToolMeta {\n /** Declared method surface */\n surface?: McpToolSurface;\n\n /** Whether this method can be selected in query mode */\n queryEligible?: boolean;\n\n /** Declared latency class for planner/runtime gating */\n latencyClass?: McpToolLatencyClass;\n\n /** Method-level pricing metadata */\n pricing?: McpToolPricingMeta;\n\n /** Derived discovery flag for execute eligibility */\n executeEligible?: boolean;\n\n /** Derived discovery field for explicit execute pricing visibility */\n executePriceUsd?: string;\n\n /** Context injection requirements handled by the Context runtime */\n contextRequirements?: string[];\n\n /**\n * Optional planner/runtime pacing hints.\n * Tool contributors can publish these to reduce rate-limit failures.\n */\n rateLimit?: McpToolRateLimitHints;\n rateLimitHints?: McpToolRateLimitHints;\n\n /** Flat aliases accepted for convenience */\n maxRequestsPerMinute?: number;\n maxConcurrency?: number;\n cooldownMs?: number;\n supportsBulk?: boolean;\n recommendedBatchTools?: string[];\n notes?: string;\n\n [key: string]: unknown;\n}\n\nexport interface StructuredMethodGuidanceHints {\n /** Suggested call-order sequence extracted from method descriptions */\n callOrderHints?: string[];\n\n /** Parameter usage caveats extracted from method descriptions */\n parameterCaveats?: string[];\n\n /** Edge-case behavior notes extracted from method descriptions */\n edgeCaseNotes?: string[];\n}\n\nexport interface McpTool {\n /** Name of the MCP tool method */\n name: string;\n\n /** Description of what this method does */\n description: string;\n\n /**\n * JSON Schema for the input arguments this tool accepts.\n * Used by LLMs to generate correct arguments.\n */\n inputSchema?: Record<string, unknown>;\n\n /**\n * JSON Schema for the output this tool returns.\n * Used by LLMs to understand the response structure.\n */\n outputSchema?: Record<string, unknown>;\n\n /** MCP metadata extensions (context injection, rate-limit hints) */\n _meta?: McpToolMeta;\n\n /** Explicit execute eligibility in discovery responses */\n executeEligible?: boolean;\n\n /** Explicit execute price visibility in discovery responses */\n executePriceUsd?: string | null;\n\n /** Whether this method has normalized structured guidance hints */\n hasStructuredGuidance?: boolean;\n\n /** Optional structured guidance hints derived from the method description */\n structuredGuidance?: StructuredMethodGuidanceHints;\n}\n\n/**\n * Represents a tool available on the Context Protocol marketplace\n */\nexport interface Tool {\n /** Unique identifier for the tool (UUID) */\n id: string;\n\n /** Human-readable name of the tool */\n name: string;\n\n /** Description of what the tool does */\n description: string;\n\n /** Price per execution in USDC */\n price: string;\n\n /** Tool category (e.g., \"defi\", \"nft\") */\n category?: string;\n\n /** Whether the tool is verified by Context Protocol */\n isVerified?: boolean;\n\n /** Tool type - currently always \"mcp\" */\n kind?: string;\n\n /**\n * Available MCP tool methods\n * Use items from this array as `toolName` when executing\n */\n mcpTools?: McpTool[];\n\n // Trust metrics (Level 2 - Reputation Ledger)\n /** Total number of queries processed */\n totalQueries?: number;\n\n /** Success rate percentage (0-100) */\n successRate?: string;\n\n /** Uptime percentage (0-100) */\n uptimePercent?: string;\n\n /** Total USDC staked by the developer */\n totalStaked?: string;\n\n /** Whether the tool has \"Proven\" status (100+ queries, >95% success, >98% uptime) */\n isProven?: boolean;\n}\n\n/**\n * Response from the tools search endpoint\n */\nexport interface SearchResponse {\n /** Array of matching tools */\n tools: Tool[];\n\n /** Discovery mode used by the server */\n mode?: DiscoveryMode;\n\n /** The search query that was used */\n query: string;\n\n /** Total number of results */\n count: number;\n}\n\n/**\n * Options for searching tools\n */\nexport interface SearchOptions {\n /** Search query (semantic search) */\n query?: string;\n\n /** Maximum number of results (1-50, default 10) */\n limit?: number;\n\n /** Discovery mode with billing semantics */\n mode?: DiscoveryMode;\n\n /** Optional explicit method surface filter */\n surface?: McpToolSurface;\n\n /** Require methods marked query eligible */\n queryEligible?: boolean;\n\n /** Require explicit method execute pricing */\n requireExecutePricing?: boolean;\n\n /** Exclude methods by latency class */\n excludeLatencyClasses?: McpToolLatencyClass[];\n\n /** Convenience switch to exclude slow methods in query mode */\n excludeSlow?: boolean;\n}\n\n/**\n * Options for executing a tool\n */\nexport interface ExecuteOptions {\n /** The UUID of the tool to execute (from search results) */\n toolId: string;\n\n /** The specific MCP tool name to call (from tool's mcpTools array) */\n toolName: string;\n\n /** Arguments to pass to the tool */\n args?: Record<string, unknown>;\n\n /**\n * Optional idempotency key (UUID recommended).\n * Reuse the same key when retrying the same logical request.\n */\n idempotencyKey?: string;\n\n /** Explicit execute mode label for request clarity */\n mode?: \"execute\";\n\n /** Optional execute session identifier */\n sessionId?: string;\n\n /** Optional per-session spend budget envelope (USD) */\n maxSpendUsd?: string;\n\n /** Request session closure after this execute call settles */\n closeSession?: boolean;\n}\n\nexport type ExecuteSessionStatus = \"open\" | \"closed\" | \"expired\";\n\nexport interface ExecuteSessionSpend {\n mode: \"execute\";\n sessionId: string | null;\n methodPrice: string;\n spent: string;\n remaining: string | null;\n maxSpend: string | null;\n\n /** Optional lifecycle fields when the API returns session state */\n status?: ExecuteSessionStatus;\n expiresAt?: string;\n closeRequested?: boolean;\n pendingAccruedCount?: number;\n pendingAccruedUsd?: string;\n}\n\n/**\n * Successful execution response from the API\n */\nexport interface ExecuteApiSuccessResponse {\n success: true;\n mode: \"execute\";\n\n /** The result data from the tool execution */\n result: unknown;\n\n /** Information about the executed tool */\n tool: {\n id: string;\n name: string;\n };\n\n /** Method-level execute pricing used for this call */\n method: {\n name: string;\n executePriceUsd: string;\n };\n\n /** Spend envelope visibility for execute sessions */\n session: ExecuteSessionSpend;\n\n /** Execution duration in milliseconds */\n durationMs: number;\n}\n\n/**\n * Error response from the API\n */\nexport interface ExecuteApiErrorResponse {\n /** Human-readable error message */\n error: string;\n\n /** Explicit mode label for clarity */\n mode?: \"execute\";\n\n /** Error code for programmatic handling */\n code?: ContextErrorCode;\n\n /** URL to help resolve the issue */\n helpUrl?: string;\n\n /** Optional spend envelope context when available */\n session?: ExecuteSessionSpend;\n}\n\n/**\n * Raw API response from the execute endpoint\n */\nexport type ExecuteApiResponse = ExecuteApiSuccessResponse | ExecuteApiErrorResponse;\n\nexport interface ExecuteSessionStartOptions {\n /** Maximum spend budget for the session (USD string) */\n maxSpendUsd: string;\n}\n\nexport interface ExecuteSessionApiSuccessResponse {\n success: true;\n mode: \"execute\";\n session: ExecuteSessionSpend;\n}\n\nexport type ExecuteSessionApiResponse =\n | ExecuteSessionApiSuccessResponse\n | ExecuteApiErrorResponse;\n\nexport interface ExecuteSessionResult {\n mode: \"execute\";\n session: ExecuteSessionSpend;\n}\n\n/**\n * The resolved result returned to the user after SDK processing\n */\nexport interface ExecutionResult<T = unknown> {\n mode: \"execute\";\n\n /** The data returned by the tool */\n result: T;\n\n /** Information about the executed tool */\n tool: {\n id: string;\n name: string;\n };\n\n /** Method-level execute pricing used for this call */\n method: {\n name: string;\n executePriceUsd: string;\n };\n\n /** Spend envelope visibility for execute calls */\n session: ExecuteSessionSpend;\n\n /** Execution duration in milliseconds */\n durationMs: number;\n}\n\n// ---------------------------------------------------------------------------\n// Query types (pay-per-response / agentic mode)\n// ---------------------------------------------------------------------------\n\n/** Supported orchestration depth modes for query execution. */\nexport type QueryDepth = \"fast\" | \"auto\" | \"deep\";\nexport type QueryDeepMode = \"deep-light\" | \"deep-heavy\";\n\n/**\n * Options for the agentic query endpoint (pay-per-response).\n *\n * Unlike `execute()` which calls a single tool once, `query()` sends a\n * natural-language question and lets the server handle discovery-first\n * orchestration (`discover/probe -> plan-from-evidence -> execute ->\n * bounded fallback`) plus synthesis.\n * One flat fee covers up to 100 MCP skill calls per tool.\n */\nexport interface QueryOptions {\n /** The natural-language question to answer */\n query: string;\n\n /**\n * Optional tool IDs to use. When omitted the server discovers tools\n * automatically (Auto Mode). When provided, only these tools are used\n * (Manual Mode).\n */\n tools?: string[];\n\n /**\n * Optional model ID for query orchestration/synthesis.\n * Supported IDs are published by the Context API.\n */\n modelId?: string;\n\n /**\n * Include execution data inline in the query response.\n * Useful for headless agents that need raw structured outputs.\n */\n includeData?: boolean;\n\n /**\n * Persist execution data to Vercel Blob and return a download URL.\n * Useful for large payload workflows where inline JSON is not ideal.\n */\n includeDataUrl?: boolean;\n\n /**\n * Include machine-readable developer trace output for this query response.\n * When enabled, the server may return summary counters plus diagnostics\n * for lane selection, scout probe adequacy, and bounded fallback behavior.\n */\n includeDeveloperTrace?: boolean;\n\n /**\n * Query orchestration depth mode:\n * - `fast`: lower-latency path\n * - `auto`: server decides between fast/deep\n * - `deep`: full completeness-oriented path\n */\n queryDepth?: QueryDepth;\n\n /**\n * Development/testing only: force the server's internal deep lane.\n * Ignored by normal production usage and invalid when `queryDepth` is `fast`.\n */\n debugScoutDeepMode?: QueryDeepMode;\n\n /**\n * Optional idempotency key (UUID recommended).\n * Reuse the same key when retrying the same logical request.\n */\n idempotencyKey?: string;\n}\n\n/**\n * Tool reference attached to developer trace timeline steps.\n */\nexport interface QueryDeveloperTraceToolRef {\n id?: string;\n name?: string;\n method?: string;\n [key: string]: unknown;\n}\n\n/**\n * Loop metadata attached to developer trace timeline steps.\n */\nexport interface QueryDeveloperTraceLoopInfo {\n name?: string;\n iteration?: number;\n maxIterations?: number;\n [key: string]: unknown;\n}\n\n/**\n * Tool selection metadata attached to discovery/planning diagnostics.\n */\nexport interface QueryDeveloperTraceToolSelection {\n toolId: string;\n toolName: string;\n selectedMethodCount: number;\n selectedMethods: string[];\n omittedSelectedMethodCount: number;\n priceUsd?: string;\n}\n\n/**\n * Initial planner diagnostic details.\n */\nexport interface QueryPlanningTraceDiagnostic {\n plannerQuery: string;\n scoutEvidenceAttached: boolean;\n scoutEvidencePromptBlock: string | null;\n allowedModules: string[];\n}\n\n/**\n * Rediscovery/fallback diagnostic details.\n */\nexport interface QueryRediscoveryTraceDiagnostic {\n considered: boolean;\n executed: boolean;\n skipReason: string | null;\n missingCapability: string | null;\n rediscoveryQuery: string | null;\n capabilityLooksLikeSearchNeed: boolean;\n allowSearchFallbackOnElapsedCap: boolean;\n searchFallbackUsed: boolean;\n preRediscoveryBudgetReasonCode: string | null;\n candidateSearchResults: QueryDeveloperTraceToolSelection[];\n selectedAlternatives: QueryDeveloperTraceToolSelection[];\n mergedTools: QueryDeveloperTraceToolSelection[];\n usingPaidFallback: boolean;\n branchPlan: QueryPlanningTraceDiagnostic | null;\n}\n\n/**\n * Rich developer-trace diagnostics for discovery-first orchestration internals.\n */\nexport interface QueryDeveloperTraceDiagnostics {\n selection: {\n selectedDepth: string;\n deepMode: string | null;\n debugScoutDeepMode: string | null;\n plannerReasoningStage: string;\n scoutEnabled: boolean;\n preserveFastOneShot: boolean;\n candidateMethodCount: number;\n scoutProbeStatus: string;\n scoutProbeAdequacy: string;\n scoutProbeConfidence: number;\n scoutMetadataConfidence: number;\n scoutProbeShortlistedMethodCount: number;\n scoutProbeMissingCapability: string | null;\n scoutPrePlanProbeCalls: number;\n scoutPrePlanProbeBudgetReasonCode: string | null;\n scoutChangedInitialPlan: boolean;\n scoutChangedPlannerReasoningStage: boolean;\n scoutInitialSelectedDepth: string;\n scoutInitialDeepMode: string | null;\n scoutInitialPlannerReasoningStage: string;\n scoutInitialReasonCode: string;\n scoutFinalReasonCode: string;\n scoutEvidenceAttachedToPlanning: boolean;\n scoutLlmSelectionUsed: boolean;\n scoutLlmSelectionFallback: boolean;\n scoutLlmSelectionLatencyMs: number | null;\n selectedTools: QueryDeveloperTraceToolSelection[];\n };\n planning: {\n initial: QueryPlanningTraceDiagnostic;\n };\n cost?: {\n planningCostUsd: number;\n initialExecutionCostUsd: number;\n rediscoveryAdditionalCostUsd: number;\n synthesisCostUsd: number;\n totalModelCostUsd: number;\n toolCostUsd: number;\n totalChargedUsd: number;\n };\n completeness: {\n evaluations: unknown[];\n triggerNeedsDifferentTools: boolean;\n triggerMissingCapability: string | null;\n };\n rediscovery: QueryRediscoveryTraceDiagnostic | null;\n [key: string]: unknown;\n}\n\n/**\n * A single developer-trace timeline step.\n */\nexport interface QueryDeveloperTraceStep {\n stepType?: string;\n event?: string;\n status?: string;\n message?: string;\n timestampMs?: number;\n tool?: QueryDeveloperTraceToolRef;\n attempt?: number;\n loop?: QueryDeveloperTraceLoopInfo;\n metadata?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\n/**\n * Aggregate counters that summarize developer-trace behavior.\n */\nexport interface QueryDeveloperTraceSummary {\n toolCalls?: number;\n retryCount?: number;\n selfHealCount?: number;\n fallbackCount?: number;\n failureCount?: number;\n recoveryCount?: number;\n completionChecks?: number;\n loopCount?: number;\n [key: string]: unknown;\n}\n\n/**\n * Developer Mode trace payload returned per query response (opt-in).\n */\nexport interface QueryDeveloperTrace {\n summary?: QueryDeveloperTraceSummary;\n timeline?: QueryDeveloperTraceStep[];\n requestId?: string;\n query?: string;\n source?: string;\n diagnostics?: QueryDeveloperTraceDiagnostics;\n [key: string]: unknown;\n}\n\n/**\n * Information about a tool that was used during a query response\n */\nexport interface QueryToolUsage {\n /** Tool ID */\n id: string;\n\n /** Tool name */\n name: string;\n\n /** Number of MCP skill calls made for this tool */\n skillCalls: number;\n}\n\n/**\n * Cost breakdown for a query response.\n * All values are strings representing USD amounts.\n */\nexport interface QueryCost {\n /** AI model inference cost */\n modelCostUsd: string;\n\n /** Sum of all tool fees */\n toolCostUsd: string;\n\n /** Total cost (model + tools) */\n totalCostUsd: string;\n}\n\n/**\n * High-level orchestration outcome metrics returned by the query API.\n */\nexport interface QueryOrchestrationMetrics {\n parityStage: string;\n orchestrationMode: string;\n /** Whether the first plan path succeeded without fallback. */\n firstPassSuccess: boolean;\n /** Whether execution signaled a missing capability on first pass. */\n capabilityMissSignaled: boolean;\n /** Whether bounded rediscovery/fallback executed. */\n rediscoveryExecuted: boolean;\n}\n\n/**\n * The resolved result of a pay-per-response query\n */\nexport interface QueryResult {\n /** The AI-synthesized response text */\n response: string;\n\n /** Tools that were used to answer the query */\n toolsUsed: QueryToolUsage[];\n\n /** Cost breakdown */\n cost: QueryCost;\n\n /** Total duration in milliseconds */\n durationMs: number;\n\n /** Optional execution data from tools (when includeData=true) */\n data?: unknown;\n\n /** Optional blob URL for persisted execution data (when includeDataUrl=true) */\n dataUrl?: string;\n\n /** Optional machine-readable Developer Mode trace payload */\n developerTrace?: QueryDeveloperTrace;\n\n /** Optional orchestration outcome metrics for benchmarking and rollout analysis */\n orchestrationMetrics?: QueryOrchestrationMetrics;\n}\n\n/**\n * Successful response from the /api/v1/query endpoint\n */\nexport interface QueryApiSuccessResponse {\n success: true;\n response: string;\n toolsUsed: QueryToolUsage[];\n cost: QueryCost;\n durationMs: number;\n data?: unknown;\n dataUrl?: string;\n developerTrace?: QueryDeveloperTrace;\n orchestrationMetrics?: QueryOrchestrationMetrics;\n}\n\n/**\n * Raw API response from the query endpoint\n */\nexport type QueryApiResponse = QueryApiSuccessResponse | ExecuteApiErrorResponse;\n\n// ---------------------------------------------------------------------------\n// Query stream event types\n// ---------------------------------------------------------------------------\n\n/** Emitted when a tool starts or changes execution status */\nexport interface QueryStreamToolStatusEvent {\n type: \"tool-status\";\n tool: { id: string; name: string };\n status: string;\n}\n\n/** Emitted for each chunk of the AI response text */\nexport interface QueryStreamTextDeltaEvent {\n type: \"text-delta\";\n delta: string;\n}\n\n/** Emitted when the server streams developer trace updates/chunks */\nexport interface QueryStreamDeveloperTraceEvent {\n type: \"developer-trace\";\n trace: QueryDeveloperTrace;\n}\n\n/** Emitted when the full response is complete */\nexport interface QueryStreamDoneEvent {\n type: \"done\";\n result: QueryResult;\n}\n\n/** Emitted when the server reports a recoverable or terminal query error */\nexport interface QueryStreamErrorEvent {\n type: \"error\";\n error: string;\n code?: ContextErrorCode | string;\n scope?: string;\n reasonCode?: string;\n}\n\n/**\n * Union of all events emitted during a streaming query\n */\nexport type QueryStreamEvent =\n | QueryStreamToolStatusEvent\n | QueryStreamTextDeltaEvent\n | QueryStreamDeveloperTraceEvent\n | QueryStreamDoneEvent\n | QueryStreamErrorEvent;\n\n// ---------------------------------------------------------------------------\n// Error types\n// ---------------------------------------------------------------------------\n\n/**\n * Specific error codes returned by the Context Protocol API\n */\nexport type ContextErrorCode =\n | \"unauthorized\"\n | \"no_wallet\"\n | \"insufficient_allowance\"\n | \"payment_failed\"\n | \"execution_failed\"\n | \"query_failed\"\n | \"invalid_tool_method\"\n | \"method_not_execute_eligible\"\n | \"invalid_max_spend\"\n | \"session_not_found\"\n | \"session_forbidden\"\n | \"session_closed\"\n | \"session_expired\"\n | \"max_spend_mismatch\"\n | \"session_budget_exceeded\";\n\n/**\n * Error thrown by the Context Protocol client\n */\nexport class ContextError extends Error {\n constructor(\n message: string,\n public readonly code?: ContextErrorCode | string,\n public readonly statusCode?: number,\n public readonly helpUrl?: string\n ) {\n super(message);\n this.name = \"ContextError\";\n Object.setPrototypeOf(this, ContextError.prototype);\n }\n}\n","import type { SearchOptions, SearchResponse, Tool } from \"../types.js\";\nimport type { ContextClient } from \"../client.js\";\n\n/**\n * Discovery resource for searching and finding tools on the Context Protocol marketplace\n */\nexport class Discovery {\n constructor(private client: ContextClient) {}\n\n /**\n * Search for tools matching a query string.\n *\n * Backward-compatible signatures:\n * - `search(\"gas prices\", 10)`\n * - `search({ query: \"gas prices\", limit: 10, mode: \"execute\" })`\n */\n async search(query: string, limit?: number): Promise<Tool[]>;\n async search(options: SearchOptions): Promise<Tool[]>;\n async search(\n queryOrOptions: string | SearchOptions,\n limit?: number\n ): Promise<Tool[]> {\n const options: SearchOptions =\n typeof queryOrOptions === \"string\"\n ? { query: queryOrOptions, limit }\n : queryOrOptions;\n\n const params = new URLSearchParams();\n const query = options.query ?? \"\";\n\n if (query) {\n params.set(\"q\", query);\n }\n\n if (options.limit !== undefined) {\n params.set(\"limit\", String(options.limit));\n }\n\n if (options.mode) {\n params.set(\"mode\", options.mode);\n }\n\n if (options.surface) {\n params.set(\"surface\", options.surface);\n }\n\n if (options.queryEligible !== undefined) {\n params.set(\"queryEligible\", String(options.queryEligible));\n }\n\n if (options.requireExecutePricing !== undefined) {\n params.set(\n \"requireExecutePricing\",\n String(options.requireExecutePricing)\n );\n }\n\n if (\n options.excludeLatencyClasses &&\n options.excludeLatencyClasses.length > 0\n ) {\n params.set(\"excludeLatency\", options.excludeLatencyClasses.join(\",\"));\n }\n\n if (options.excludeSlow !== undefined) {\n params.set(\"excludeSlow\", String(options.excludeSlow));\n }\n\n const queryString = params.toString();\n const endpoint = `/api/v1/tools/search${queryString ? `?${queryString}` : \"\"}`;\n\n const response = await this.client._fetch<SearchResponse>(endpoint);\n\n return response.tools;\n }\n\n /**\n * Get featured/popular tools (empty query search)\n *\n * @param limit - Maximum number of results (1-50, default 10)\n * @returns Array of featured tools\n *\n * @example\n * ```typescript\n * const featured = await client.discovery.getFeatured(5);\n * ```\n */\n async getFeatured(\n limit?: number,\n options?: Omit<SearchOptions, \"query\" | \"limit\">\n ): Promise<Tool[]> {\n return this.search({\n ...(options ?? {}),\n query: \"\",\n ...(limit !== undefined ? { limit } : {}),\n });\n }\n}\n","import type {\n ExecuteOptions,\n ExecuteApiResponse,\n ExecuteSessionApiResponse,\n ExecuteSessionResult,\n ExecuteSessionStartOptions,\n ExecutionResult,\n} from \"../types.js\";\nimport { ContextError } from \"../types.js\";\nimport type { ContextClient } from \"../client.js\";\n\n/**\n * Tools resource for executing tools on the Context Protocol marketplace\n */\nexport class Tools {\n constructor(private client: ContextClient) {}\n\n /**\n * Execute a tool with the provided arguments\n *\n * @param options - Execution options\n * @param options.toolId - The UUID of the tool (from search results)\n * @param options.toolName - The specific MCP tool method to call (from tool's mcpTools array)\n * @param options.args - Arguments to pass to the tool\n * @returns The execution result with the tool's output data\n *\n * @throws {ContextError} With code `no_wallet` if wallet not set up\n * @throws {ContextError} With code `insufficient_allowance` if spending cap not set\n * @throws {ContextError} With code `payment_failed` if payment settlement fails\n * @throws {ContextError} With code `execution_failed` if tool execution fails\n *\n * @example\n * ```typescript\n * // First, search for a tool\n * const tools = await client.discovery.search(\"gas prices\");\n * const tool = tools[0];\n *\n * // Execute a specific method from the tool's mcpTools\n * const result = await client.tools.execute({\n * toolId: tool.id,\n * toolName: tool.mcpTools[0].name, // e.g., \"get_gas_prices\"\n * args: { chainId: 1 }\n * });\n *\n * console.log(result.result); // The tool's output\n * console.log(result.durationMs); // Execution time\n * ```\n */\n async execute<T = unknown>(options: ExecuteOptions): Promise<ExecutionResult<T>> {\n const {\n toolId,\n toolName,\n args,\n idempotencyKey,\n mode,\n sessionId,\n maxSpendUsd,\n closeSession,\n } = options;\n const headers = idempotencyKey\n ? { \"Idempotency-Key\": idempotencyKey }\n : undefined;\n\n const response = await this.client._fetch<ExecuteApiResponse>(\n \"/api/v1/tools/execute\",\n {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n toolId,\n toolName,\n args,\n mode: mode ?? \"execute\",\n sessionId,\n maxSpendUsd,\n closeSession,\n }),\n }\n );\n\n // Handle error response\n if (\"error\" in response) {\n throw new ContextError(\n response.error,\n response.code,\n undefined, // Don't hardcode - this was a 200 OK with error body\n response.helpUrl\n );\n }\n\n // Handle success response\n if (response.success) {\n return {\n mode: response.mode,\n result: response.result as T,\n tool: response.tool,\n method: response.method,\n session: response.session,\n durationMs: response.durationMs,\n };\n }\n\n // Fallback - shouldn't reach here with valid API responses\n throw new ContextError(\"Unexpected response format from API\");\n }\n\n /**\n * Start an execute session with a max spend budget.\n */\n async startSession(\n options: ExecuteSessionStartOptions\n ): Promise<ExecuteSessionResult> {\n const response = await this.client._fetch<ExecuteSessionApiResponse>(\n \"/api/v1/tools/execute/sessions\",\n {\n method: \"POST\",\n body: JSON.stringify({\n mode: \"execute\",\n maxSpendUsd: options.maxSpendUsd,\n }),\n }\n );\n\n return this.resolveSessionLifecycleResponse(response);\n }\n\n /**\n * Fetch current execute session status by ID.\n */\n async getSession(sessionId: string): Promise<ExecuteSessionResult> {\n if (!sessionId) {\n throw new ContextError(\"sessionId is required\");\n }\n\n const encodedSessionId = encodeURIComponent(sessionId);\n const response = await this.client._fetch<ExecuteSessionApiResponse>(\n `/api/v1/tools/execute/sessions/${encodedSessionId}`\n );\n\n return this.resolveSessionLifecycleResponse(response);\n }\n\n /**\n * Close an execute session by ID.\n */\n async closeSession(sessionId: string): Promise<ExecuteSessionResult> {\n if (!sessionId) {\n throw new ContextError(\"sessionId is required\");\n }\n\n const encodedSessionId = encodeURIComponent(sessionId);\n const response = await this.client._fetch<ExecuteSessionApiResponse>(\n `/api/v1/tools/execute/sessions/${encodedSessionId}/close`,\n {\n method: \"POST\",\n body: JSON.stringify({ mode: \"execute\" }),\n }\n );\n\n return this.resolveSessionLifecycleResponse(response);\n }\n\n private resolveSessionLifecycleResponse(\n response: ExecuteSessionApiResponse\n ): ExecuteSessionResult {\n if (\"error\" in response) {\n throw new ContextError(\n response.error,\n response.code,\n undefined,\n response.helpUrl\n );\n }\n\n if (response.success) {\n return {\n mode: response.mode,\n session: response.session,\n };\n }\n\n throw new ContextError(\"Unexpected response format from API\");\n }\n}\n","import type {\n QueryOptions,\n QueryDeveloperTrace,\n QueryResult,\n QueryStreamEvent,\n} from \"../types.js\";\nimport { ContextError } from \"../types.js\";\nimport type { ContextClient } from \"../client.js\";\n\n/**\n * Query resource for pay-per-response agentic queries.\n *\n * Unlike `tools.execute()` which calls a single tool once (pay-per-request),\n * the Query resource sends a natural-language question and lets the server\n * handle discovery-first orchestration (`discover/probe -> plan-from-evidence ->\n * execute -> bounded fallback`) plus AI synthesis — all for one flat fee.\n *\n * This is the \"prepared meal\" vs \"raw ingredients\" distinction:\n * - `tools.execute()` = raw data, full control, predictable cost\n * - `query.run()` / `query.stream()` = curated intelligence, one payment\n */\nexport class Query {\n constructor(private client: ContextClient) {}\n\n private buildSyntheticTraceFromRunResult(params: {\n toolsUsed: Array<{ id: string; name: string; skillCalls: number }>;\n durationMs: number;\n }): QueryDeveloperTrace {\n const timeline = params.toolsUsed.map((tool, index) => ({\n stepType: \"tool-call\",\n event: \"tool-call\",\n status: \"success\",\n timestampMs: index,\n tool: {\n id: tool.id,\n name: tool.name,\n },\n metadata: {\n skillCalls: tool.skillCalls,\n synthetic: true,\n },\n }));\n\n const toolCalls = params.toolsUsed.reduce(\n (sum, tool) => sum + Math.max(tool.skillCalls, 0),\n 0\n );\n\n return {\n summary: {\n toolCalls,\n retryCount: 0,\n selfHealCount: 0,\n fallbackCount: 0,\n failureCount: 0,\n recoveryCount: 0,\n completionChecks: 0,\n loopCount: 0,\n },\n timeline,\n source: \"sdk-fallback\",\n synthetic: true,\n reason: \"backend_trace_missing\",\n durationMs: params.durationMs,\n };\n }\n\n private buildSyntheticTraceFromStreamStatus(params: {\n statusTimeline: Array<{\n status: string;\n tool: { id: string; name: string };\n }>;\n toolsUsed: Array<{ id: string; name: string; skillCalls: number }>;\n durationMs: number;\n }): QueryDeveloperTrace {\n const timeline = params.statusTimeline.map((entry, index) => ({\n stepType: \"tool-status\",\n event: \"tool-status\",\n status: entry.status,\n timestampMs: index,\n tool:\n entry.tool.name || entry.tool.id\n ? {\n id: entry.tool.id || undefined,\n name: entry.tool.name || undefined,\n }\n : undefined,\n metadata: { synthetic: true },\n }));\n\n const toolCallsFromUsage = params.toolsUsed.reduce(\n (sum, tool) => sum + Math.max(tool.skillCalls, 0),\n 0\n );\n const toolCallsFromStatus = params.statusTimeline.filter(\n (entry) => entry.status === \"tool-complete\"\n ).length;\n const toolCalls = toolCallsFromUsage > 0 ? toolCallsFromUsage : toolCallsFromStatus;\n\n const retryCount = params.statusTimeline.filter((entry) =>\n /(retry|fix|reflect|recover)/i.test(entry.status)\n ).length;\n const completionChecks = params.statusTimeline.filter((entry) =>\n /complet/i.test(entry.status)\n ).length;\n\n return {\n summary: {\n toolCalls,\n retryCount,\n selfHealCount: retryCount,\n fallbackCount: 0,\n failureCount: 0,\n recoveryCount: 0,\n completionChecks,\n loopCount: retryCount,\n },\n timeline,\n source: \"sdk-fallback\",\n synthetic: true,\n reason: \"backend_trace_missing\",\n durationMs: params.durationMs,\n };\n }\n\n private mergeDeveloperTrace(\n first: QueryDeveloperTrace | undefined,\n second: QueryDeveloperTrace | undefined\n ): QueryDeveloperTrace | undefined {\n if (!first) return second;\n if (!second) return first;\n\n const firstTimeline = Array.isArray(first.timeline) ? first.timeline : [];\n const secondTimeline = Array.isArray(second.timeline) ? second.timeline : [];\n const mergedTimeline = [...firstTimeline, ...secondTimeline];\n\n return {\n ...first,\n ...second,\n summary: {\n ...(typeof first.summary === \"object\" && first.summary ? first.summary : {}),\n ...(typeof second.summary === \"object\" && second.summary\n ? second.summary\n : {}),\n },\n ...(mergedTimeline.length > 0 ? { timeline: mergedTimeline } : {}),\n };\n }\n\n private parseStreamEvent(rawData: string): QueryStreamEvent | undefined {\n const parsed = JSON.parse(rawData) as unknown;\n if (!parsed || typeof parsed !== \"object\") {\n return undefined;\n }\n\n const event = parsed as QueryStreamEvent;\n if (typeof (event as { type?: unknown }).type !== \"string\") {\n return undefined;\n }\n\n return event;\n }\n\n /**\n * Run an agentic query and wait for the full response.\n *\n * The server discovers relevant tools (or uses the ones you specify),\n * executes the discovery-first pipeline (up to 100 MCP calls per tool),\n * and returns an AI-synthesized answer. Payment is settled after\n * successful execution via deferred settlement.\n *\n * @param options - Query options or a plain string question\n * @returns The complete query result with response text, tools used, and cost\n *\n * @throws {ContextError} With code `no_wallet` if wallet not set up\n * @throws {ContextError} With code `insufficient_allowance` if spending cap not set\n * @throws {ContextError} With code `payment_failed` if payment settlement fails\n * @throws {ContextError} With code `execution_failed` if the agentic pipeline fails\n *\n * @example\n * ```typescript\n * // Simple question — server discovers tools automatically\n * const answer = await client.query.run(\"What are the top whale movements on Base?\");\n * console.log(answer.response); // AI-synthesized answer\n * console.log(answer.toolsUsed); // Which tools were used\n * console.log(answer.cost); // Cost breakdown\n *\n * // With specific tools (Manual Mode)\n * const answer = await client.query.run({\n * query: \"Analyze whale activity\",\n * tools: [\"tool-uuid-1\", \"tool-uuid-2\"],\n * });\n * ```\n */\n async run(options: QueryOptions | string): Promise<QueryResult> {\n const opts = typeof options === \"string\" ? { query: options } : options;\n let terminalError:\n | { error: string; code?: string; scope?: string; reasonCode?: string }\n | undefined;\n\n for await (const event of this.stream(opts)) {\n if (event.type === \"error\") {\n terminalError = {\n error: event.error,\n ...(event.code ? { code: event.code } : {}),\n ...(event.scope ? { scope: event.scope } : {}),\n ...(event.reasonCode ? { reasonCode: event.reasonCode } : {}),\n };\n continue;\n }\n\n if (event.type === \"done\") {\n return event.result;\n }\n }\n\n if (terminalError) {\n throw new ContextError(terminalError.error, terminalError.code);\n }\n\n throw new ContextError(\"Streaming query ended before done event\");\n }\n\n /**\n * Run an agentic query with streaming. Returns an async iterable that\n * yields events as the server processes the query in real-time.\n *\n * Event types:\n * - `tool-status` — A tool started executing or changed status\n * - `text-delta` — A chunk of the AI response text\n * - `developer-trace` — Runtime trace metadata (when includeDeveloperTrace=true)\n * - `error` — A structured query/runtime error emitted before stream completion\n * - `done` — The full response is complete (includes final `QueryResult`)\n *\n * @param options - Query options or a plain string question\n * @returns An async iterable of stream events\n *\n * @example\n * ```typescript\n * for await (const event of client.query.stream(\"What are the top whale movements?\")) {\n * switch (event.type) {\n * case \"tool-status\":\n * console.log(`Tool ${event.tool.name}: ${event.status}`);\n * break;\n * case \"text-delta\":\n * process.stdout.write(event.delta);\n * break;\n * case \"developer-trace\":\n * console.log(\"Trace summary:\", event.trace.summary);\n * break;\n * case \"done\":\n * console.log(\"\\nCost:\", event.result.cost.totalCostUsd);\n * break;\n * case \"error\":\n * console.error(\"Stream error:\", event.error);\n * break;\n * }\n * }\n * ```\n */\n async *stream(\n options: QueryOptions | string\n ): AsyncGenerator<QueryStreamEvent> {\n const opts = typeof options === \"string\" ? { query: options } : options;\n const headers = opts.idempotencyKey\n ? { \"Idempotency-Key\": opts.idempotencyKey }\n : undefined;\n\n const response = await this.client._fetchRaw(\"/api/v1/query\", {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n query: opts.query,\n tools: opts.tools,\n modelId: opts.modelId,\n includeData: opts.includeData,\n includeDataUrl: opts.includeDataUrl,\n includeDeveloperTrace: opts.includeDeveloperTrace,\n queryDepth: opts.queryDepth,\n debugScoutDeepMode: opts.debugScoutDeepMode,\n stream: true,\n }),\n });\n\n const body = response.body;\n if (!body) {\n throw new ContextError(\"No response body for streaming query\");\n }\n\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n let aggregatedTrace: QueryDeveloperTrace | undefined;\n const statusTimeline: Array<{\n status: string;\n tool: { id: string; name: string };\n }> = [];\n\n const parseAndHydrateEvent = (\n rawData: string\n ): QueryStreamEvent | undefined => {\n const event = this.parseStreamEvent(rawData);\n if (!event) {\n return undefined;\n }\n\n if (event.type === \"developer-trace\") {\n aggregatedTrace = this.mergeDeveloperTrace(aggregatedTrace, event.trace);\n return event;\n }\n\n if (event.type === \"tool-status\") {\n statusTimeline.push({\n status: event.status,\n tool: {\n id: event.tool.id,\n name: event.tool.name,\n },\n });\n return event;\n }\n\n if (event.type === \"done\") {\n let mergedTrace = this.mergeDeveloperTrace(\n aggregatedTrace,\n event.result.developerTrace\n );\n if (!mergedTrace && opts.includeDeveloperTrace) {\n mergedTrace =\n statusTimeline.length > 0\n ? this.buildSyntheticTraceFromStreamStatus({\n statusTimeline,\n toolsUsed: event.result.toolsUsed,\n durationMs: event.result.durationMs,\n })\n : this.buildSyntheticTraceFromRunResult({\n toolsUsed: event.result.toolsUsed,\n durationMs: event.result.durationMs,\n });\n }\n if (mergedTrace) {\n event.result.developerTrace = mergedTrace;\n }\n }\n\n return event;\n };\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.startsWith(\"data: \")) {\n const data = trimmed.slice(6);\n if (data === \"[DONE]\") return;\n try {\n const event = parseAndHydrateEvent(data);\n if (event) {\n yield event;\n }\n } catch {\n // Skip malformed SSE events\n }\n }\n }\n }\n\n // Process any remaining buffer\n if (buffer.trim().startsWith(\"data: \")) {\n const data = buffer.trim().slice(6);\n if (data !== \"[DONE]\") {\n try {\n const event = parseAndHydrateEvent(data);\n if (event) {\n yield event;\n }\n } catch {\n // Skip malformed SSE events\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n","import type { ContextClientOptions } from \"./types.js\";\nimport { ContextError } from \"./types.js\";\nimport { Discovery } from \"./resources/discovery.js\";\nimport { Tools } from \"./resources/tools.js\";\nimport { Query } from \"./resources/query.js\";\n\nconst DEFAULT_BASE_URL = \"https://www.ctxprotocol.com\";\nconst DEFAULT_REQUEST_TIMEOUT_MS = 300_000;\nconst DEFAULT_STREAM_TIMEOUT_MS = 600_000;\n\n/**\n * The official TypeScript client for the Context Protocol.\n *\n * Use this client to discover and execute AI tools programmatically.\n *\n * @example\n * ```typescript\n * import { ContextClient } from \"@contextprotocol/client\";\n *\n * const client = new ContextClient({\n * apiKey: \"sk_live_...\"\n * });\n *\n * // Pay-per-request: Execute a specific tool\n * const result = await client.tools.execute({\n * toolId: \"tool-uuid\",\n * toolName: \"get_gas_prices\",\n * args: { chainId: 1 }\n * });\n *\n * // Pay-per-response: Ask a question, get a curated answer\n * const answer = await client.query.run(\"What are the top whale movements on Base?\");\n * console.log(answer.response);\n * ```\n */\nexport class ContextClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly requestTimeoutMs: number;\n private readonly streamTimeoutMs: number;\n private _closed = false;\n\n /**\n * Discovery resource for searching tools\n */\n public readonly discovery: Discovery;\n\n /**\n * Tools resource for executing tools (pay-per-request)\n */\n public readonly tools: Tools;\n\n /**\n * Query resource for agentic queries (pay-per-response).\n *\n * Unlike `tools.execute()` which calls a single tool once, `query` sends\n * a natural-language question and lets the server handle tool discovery,\n * multi-tool orchestration, self-healing, and AI synthesis — one flat fee.\n */\n public readonly query: Query;\n\n /**\n * Creates a new Context Protocol client\n *\n * @param options - Client configuration options\n * @param options.apiKey - Your Context Protocol API key (format: sk_live_...)\n * @param options.baseUrl - Optional base URL override (defaults to https://www.ctxprotocol.com)\n * @param options.requestTimeoutMs - Optional timeout for non-streaming requests (default 300000ms)\n * @param options.streamTimeoutMs - Optional timeout for establishing stream requests (default 600000ms)\n */\n constructor(options: ContextClientOptions) {\n if (!options.apiKey) {\n throw new ContextError(\"API key is required\");\n }\n\n const requestTimeoutMs = options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;\n const streamTimeoutMs = options.streamTimeoutMs ?? DEFAULT_STREAM_TIMEOUT_MS;\n\n if (!Number.isFinite(requestTimeoutMs) || requestTimeoutMs <= 0) {\n throw new ContextError(\"requestTimeoutMs must be a positive number\");\n }\n\n if (!Number.isFinite(streamTimeoutMs) || streamTimeoutMs <= 0) {\n throw new ContextError(\"streamTimeoutMs must be a positive number\");\n }\n\n this.apiKey = options.apiKey;\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.requestTimeoutMs = requestTimeoutMs;\n this.streamTimeoutMs = streamTimeoutMs;\n\n // Initialize resources\n this.discovery = new Discovery(this);\n this.tools = new Tools(this);\n this.query = new Query(this);\n }\n\n /**\n * Close the client and clean up resources.\n * After calling close(), any in-flight requests may be aborted.\n */\n close(): void {\n this._closed = true;\n }\n\n /**\n * Internal method for making authenticated HTTP requests\n * Includes timeout and retry with exponential backoff for transient errors\n *\n * @internal\n */\n async _fetch<T>(\n endpoint: string,\n options: RequestInit = {},\n fetchOptions?: { retry?: boolean }\n ): Promise<T> {\n if (this._closed) {\n throw new ContextError(\"Client has been closed\");\n }\n\n const url = `${this.baseUrl}${endpoint}`;\n const maxRetries = 3;\n const timeoutMs = this.requestTimeoutMs;\n const method = (options.method ?? \"GET\").toUpperCase();\n const requestHeaders = new Headers(options.headers);\n const canRetryRequest =\n fetchOptions?.retry === false\n ? false\n : method === \"GET\" ||\n method === \"HEAD\" ||\n method === \"OPTIONS\" ||\n requestHeaders.has(\"Idempotency-Key\");\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n const mergedHeaders = new Headers(requestHeaders);\n if (!mergedHeaders.has(\"Content-Type\")) {\n mergedHeaders.set(\"Content-Type\", \"application/json\");\n }\n mergedHeaders.set(\"Authorization\", `Bearer ${this.apiKey}`);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n headers: mergedHeaders,\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) {\n // Retry on 5xx server errors\n if (response.status >= 500 && canRetryRequest && attempt < maxRetries) {\n const delay = Math.min(1000 * 2 ** attempt, 10_000);\n await new Promise((resolve) => setTimeout(resolve, delay));\n continue;\n }\n\n let errorMessage = `HTTP ${response.status}: ${response.statusText}`;\n let errorCode: string | undefined;\n let helpUrl: string | undefined;\n\n try {\n const errorBody = await response.json();\n if (errorBody.error) {\n errorMessage = errorBody.error;\n errorCode = errorBody.code;\n helpUrl = errorBody.helpUrl;\n }\n } catch {\n // Use default error message if JSON parsing fails\n }\n\n throw new ContextError(errorMessage, errorCode, response.status, helpUrl);\n }\n\n try {\n return (await response.json()) as T;\n } catch (error) {\n const parseError = error instanceof Error ? error : new Error(String(error));\n throw new ContextError(\n `Failed to parse JSON response: ${parseError.message}`,\n undefined,\n response.status\n );\n }\n } catch (error) {\n clearTimeout(timeout);\n\n if (error instanceof ContextError) {\n throw error;\n }\n\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Retry on network errors and timeouts\n const isRetryable =\n lastError.name === \"AbortError\" ||\n lastError.message.includes(\"fetch failed\") ||\n lastError.message.includes(\"ECONNRESET\") ||\n lastError.message.includes(\"ETIMEDOUT\");\n\n if (isRetryable && canRetryRequest && attempt < maxRetries) {\n const delay = Math.min(1000 * 2 ** attempt, 10_000);\n await new Promise((resolve) => setTimeout(resolve, delay));\n continue;\n }\n\n if (lastError.name === \"AbortError\") {\n throw new ContextError(\n `Request timed out after ${timeoutMs / 1000}s`,\n undefined,\n 408\n );\n }\n\n throw new ContextError(\n lastError.message,\n undefined,\n undefined\n );\n }\n }\n\n throw lastError ?? new ContextError(\"Request failed after retries\");\n }\n\n /**\n * Internal method for making authenticated HTTP requests that returns\n * the raw Response object. Used for streaming endpoints (SSE).\n * Includes a configurable timeout for stream setup.\n *\n * @internal\n */\n async _fetchRaw(endpoint: string, options: RequestInit = {}): Promise<Response> {\n if (this._closed) {\n throw new ContextError(\"Client has been closed\");\n }\n\n const url = `${this.baseUrl}${endpoint}`;\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.streamTimeoutMs);\n\n let response: Response;\n try {\n response = await fetch(url, {\n ...options,\n signal: controller.signal,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n ...options.headers,\n },\n });\n } catch (error) {\n clearTimeout(timeout);\n const lastError = error instanceof Error ? error : new Error(String(error));\n if (lastError.name === \"AbortError\") {\n throw new ContextError(\n `Streaming request timed out after ${this.streamTimeoutMs / 1000}s`,\n undefined,\n 408\n );\n }\n throw new ContextError(lastError.message);\n }\n\n clearTimeout(timeout);\n\n if (!response.ok) {\n let errorMessage = `HTTP ${response.status}: ${response.statusText}`;\n let errorCode: string | undefined;\n let helpUrl: string | undefined;\n\n try {\n const errorBody = await response.json();\n if (errorBody.error) {\n errorMessage = errorBody.error;\n errorCode = errorBody.code;\n helpUrl = errorBody.helpUrl;\n }\n } catch {\n // Use default error message if JSON parsing fails\n }\n\n throw new ContextError(errorMessage, errorCode, response.status, helpUrl);\n }\n\n return response;\n }\n}\n"]}
|