diff --git a/.prettierignore b/.prettierignore
index 7cc13dd..36afd3b 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -2,6 +2,7 @@ CHANGELOG.md
/ecosystem-tests/*/**
/node_modules
/deno
+/packages/mcp-server/manifest.json
# don't format tsc output, will break source maps
dist
diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index 69e82f1..8ff2f5e 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,3 +1,3 @@
{
- ".": "2.6.0"
+ ".": "2.6.1"
}
diff --git a/.stats.yml b/.stats.yml
index 93a1821..c91eb54 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 6
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/mozilla%2Ftabstack-5e6e6508dca15391d72cbea74ec33838c511cbc17e046699142f97d1573b069a.yml
-openapi_spec_hash: b73b5922a495fd375736896912815d18
-config_hash: 57c64e5e8fe99c1bd7af536d82af4ad9
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/mozilla/tabstack-c97fe4d7e39fd2f35a75dc7fdeb6d3f19aab2f9b56d4983c3376a5433dc9e268.yml
+openapi_spec_hash: 8a4612fa101f82893c6edca118a86a2d
+config_hash: 5827ec0cdbbac0e7c5db2f5456f67dca
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b8edaf9..d4ef133 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,23 @@
# Changelog
+## 2.6.1 (2026-05-05)
+
+Full Changelog: [v2.6.0...v2.6.1](https://github.com/Mozilla-Ocho/tabstack-typescript/compare/v2.6.0...v2.6.1)
+
+### Features
+
+* **api:** add endpoint specfic timeouts ([4d6bd2e](https://github.com/Mozilla-Ocho/tabstack-typescript/commit/4d6bd2ec28d2424f239fd7fc763e0ed394f43a51))
+* **api:** manual updates ([cc20909](https://github.com/Mozilla-Ocho/tabstack-typescript/commit/cc209097670fa44ec405ed1740681d4a12f50586))
+* **automate:** emit task:trace_context SSE event with trace ID ([51cc989](https://github.com/Mozilla-Ocho/tabstack-typescript/commit/51cc9894ca8b828dcfe5413e3cee66384b071149))
+* support setting headers via env ([dc80807](https://github.com/Mozilla-Ocho/tabstack-typescript/commit/dc80807af38c51ce4a041a6ba331c62897aace6d))
+
+
+### Chores
+
+* avoid formatting file that gets changed during releases ([8bcebec](https://github.com/Mozilla-Ocho/tabstack-typescript/commit/8bcebec347f5b03762e7ff725a3c19a4425c0d3b))
+* **format:** run eslint and prettier separately ([0d94d58](https://github.com/Mozilla-Ocho/tabstack-typescript/commit/0d94d58968327fc93081582f0e4aa52c73ef3a77))
+* **internal:** codegen related update ([8ee7235](https://github.com/Mozilla-Ocho/tabstack-typescript/commit/8ee7235bb02f5696aa8f0682b5c91d18a9755eac))
+
## 2.6.0 (2026-04-24)
Full Changelog: [v2.5.0...v2.6.0](https://github.com/Mozilla-Ocho/tabstack-typescript/compare/v2.5.0...v2.6.0)
diff --git a/api.md b/api.md
index 9162456..911eadc 100644
--- a/api.md
+++ b/api.md
@@ -1,9 +1,17 @@
+# Shared
+
+Types:
+
+- GeotargetGeoTarget
+
# Agent
Types:
- AutomateEvent
- ResearchEvent
+- V1GlobalBuffer
+- V1ResearchQuestionAssessment
- AgentAutomateInputResponse
Methods:
diff --git a/package.json b/package.json
index 68a2514..59fa072 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@tabstack/sdk",
- "version": "2.6.0",
+ "version": "2.6.1",
"description": "The official TypeScript library for the Tabstack API",
"author": "Tabstack <>",
"types": "dist/index.d.ts",
diff --git a/packages/mcp-server/manifest.json b/packages/mcp-server/manifest.json
index bc32d20..3852213 100644
--- a/packages/mcp-server/manifest.json
+++ b/packages/mcp-server/manifest.json
@@ -1,7 +1,7 @@
{
"dxt_version": "0.2",
"name": "@tabstack/sdk-mcp",
- "version": "2.6.0",
+ "version": "2.6.1",
"description": "The official MCP Server for the Tabstack API",
"author": {
"name": "Tabstack"
@@ -16,7 +16,9 @@
"entry_point": "index.js",
"mcp_config": {
"command": "node",
- "args": ["${__dirname}/index.js"],
+ "args": [
+ "${__dirname}/index.js"
+ ],
"env": {
"TABSTACK_API_KEY": "${user_config.TABSTACK_API_KEY}"
}
@@ -37,5 +39,7 @@
"node": ">=18.0.0"
}
},
- "keywords": ["api"]
+ "keywords": [
+ "api"
+ ]
}
diff --git a/packages/mcp-server/package.json b/packages/mcp-server/package.json
index 4005555..26e9757 100644
--- a/packages/mcp-server/package.json
+++ b/packages/mcp-server/package.json
@@ -1,6 +1,6 @@
{
"name": "@tabstack/sdk-mcp",
- "version": "2.6.0",
+ "version": "2.6.1",
"description": "The official MCP Server for the Tabstack API",
"author": "Tabstack <>",
"types": "dist/index.d.ts",
diff --git a/packages/mcp-server/src/local-docs-search.ts b/packages/mcp-server/src/local-docs-search.ts
index 40a7b9f..b8e1805 100644
--- a/packages/mcp-server/src/local-docs-search.ts
+++ b/packages/mcp-server/src/local-docs-search.ts
@@ -70,9 +70,9 @@ const EMBEDDED_METHODS: MethodEntry[] = [
'url?: string;',
],
response:
- 'object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object',
+ 'object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object | object',
markdown:
- "## automate\n\n`client.agent.automate(task: string, data?: object, geo_target?: { country?: string; }, guardrails?: string, interactive?: boolean, maxIterations?: number, maxValidationAttempts?: number, url?: string): { data: object; event: 'agent:action'; } | { data: object; event: 'agent:extracted'; } | { data: object; event: 'agent:processing'; } | { data: object; event: 'agent:reasoned'; } | { data: object; event: 'agent:status'; } | { data: object; event: 'agent:step'; } | { data: object; event: 'agent:waiting'; } | { data: object; event: 'ai:generation'; } | { data: object; event: 'ai:generation:error'; } | { data: object; event: 'browser:action_completed'; } | { data: object; event: 'browser:action_started'; } | { data: object; event: 'browser:navigated'; } | { data: object; event: 'browser:reconnected'; } | { data: object; event: 'browser:screenshot_captured'; } | { data: object; event: 'browser:screenshot_captured_image'; } | { data: object; event: 'cdp:endpoint_connected'; } | { data: object; event: 'cdp:endpoint_cycle'; } | { data: object; event: 'complete'; } | { data: object; event: 'done'; } | { data: object; event: 'error'; } | { data: object; event: 'interactive:form_data:error'; } | { data: object; event: 'interactive:form_data:request'; } | { data: object; event: 'system:debug_compression'; } | { data: object; event: 'system:debug_message'; } | { data: object; event: 'task:aborted'; } | { data: object; event: 'task:completed'; } | { data: object; event: 'task:metrics'; } | { data: object; event: 'task:metrics_incremental'; } | { data: object; event: 'task:setup'; } | { data: object; event: 'task:started'; } | { data: object; event: 'task:validated'; } | { data: object; event: 'task:validation_error'; }`\n\n**post** `/automate`\n\nExecute AI-powered browser automation tasks using natural language with optional geotargeting. This endpoint **always streams** responses using Server-Sent Events (SSE).\n\n**Streaming Response:**\n- All responses are streamed using Server-Sent Events (`text/event-stream`)\n- Real-time progress updates and results as they're generated\n\n**Geotargeting:**\n- Optionally specify a country code for geotargeted browsing\n\n**Use Cases:**\n- Web scraping and data extraction\n- Form filling and interaction\n- Navigation and information gathering\n- Multi-step web workflows\n- Content analysis from web pages\n\n### Parameters\n\n- `task: string`\n The task description in natural language\n\n- `data?: object`\n JSON data to provide context for form filling or complex tasks\n\n- `geo_target?: { country?: string; }`\n Optional geotargeting parameters for proxy requests\n - `country?: string`\n Country code using ISO 3166-1 alpha-2 standard (2 letters, e.g., \"US\", \"GB\", \"JP\").\nSee: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2\n\n- `guardrails?: string`\n Safety constraints for execution\n\n- `interactive?: boolean`\n Enable interactive mode to allow human-in-the-loop input during task execution\n\n- `maxIterations?: number`\n Maximum task iterations\n\n- `maxValidationAttempts?: number`\n Maximum validation attempts\n\n- `url?: string`\n Starting URL for the task\n\n### Returns\n\n- `{ data: { action: string; iterationId: string; timestamp: number; ref?: string; value?: string; }; event: 'agent:action'; } | { data: { extractedData: string; iterationId: string; timestamp: number; }; event: 'agent:extracted'; } | { data: { hasScreenshot: boolean; iterationId: string; operation: string; timestamp: number; }; event: 'agent:processing'; } | { data: { iterationId: string; reasoning: string; timestamp: number; }; event: 'agent:reasoned'; } | { data: { iterationId: string; message: string; timestamp: number; }; event: 'agent:status'; } | { data: { currentIteration: number; iterationId: string; timestamp: number; }; event: 'agent:step'; } | { data: { iterationId: string; seconds: number; timestamp: number; }; event: 'agent:waiting'; } | { data: { finishReason: 'stop' | 'length' | 'content-filter' | 'tool-calls' | 'error' | 'other'; iterationId: string; prompt: string; schema: object; timestamp: number; usage: { inputTokens?: number; outputTokens?: number; totalTokens?: number; }; messages?: { content: string; role: 'system'; providerOptions?: object; } | { content: string | object | object | object[]; role: 'user'; providerOptions?: object; } | { content: string | object | object | object | object | object | object[]; role: 'assistant'; providerOptions?: object; } | { content: object | object[]; role: 'tool'; providerOptions?: object; }[]; object?: object; providerMetadata?: object; temperature?: number; warnings?: object[]; }; event: 'ai:generation'; } | { data: { error: string; iterationId: string; prompt: string; schema: object; timestamp: number; messages?: object[]; }; event: 'ai:generation:error'; } | { data: { iterationId: string; success: boolean; timestamp: number; error?: string; }; event: 'browser:action_completed'; } | { data: { action: string; iterationId: string; timestamp: number; ref?: string; value?: string; }; event: 'browser:action_started'; } | { data: { iterationId: string; timestamp: number; title: string; url: string; }; event: 'browser:navigated'; } | { data: { endpointIndex: number; iterationId: string; startingUrl: string; timestamp: number; total: number; }; event: 'browser:reconnected'; } | { data: { format: 'jpeg' | 'png'; iterationId: string; size: number; timestamp: number; }; event: 'browser:screenshot_captured'; } | { data: { image: string; iterationId: string; mediaType: 'image/jpeg' | 'image/png'; timestamp: number; }; event: 'browser:screenshot_captured_image'; } | { data: { endpointIndex: number; iterationId: string; timestamp: number; total: number; }; event: 'cdp:endpoint_connected'; } | { data: { attempt: number; error: string; iterationId: string; timestamp: number; total: number; }; event: 'cdp:endpoint_cycle'; } | { data: { finalAnswer: string; stats: { actions: number; durationMs: number; endTime: number; iterations: number; startTime: number; }; success: boolean; error?: { code: 'TASK_ABORTED' | 'MAX_ITERATIONS' | 'MAX_ERRORS' | 'TASK_FAILED'; message: string; }; }; event: 'complete'; } | { data: object; event: 'done'; } | { data: { error: { code: string; message: string; timestamp: string; }; success: false; }; event: 'error'; } | { data: { fieldErrors: object; fields: { fieldType: string; label: string; ref: string; required: boolean; currentValue?: string; description?: string; options?: string[]; }[]; formDescription: string; iterationId: string; pageTitle: string; pageUrl: string; requestId: string; timestamp: number; }; event: 'interactive:form_data:error'; } | { data: { fields: { fieldType: string; label: string; ref: string; required: boolean; currentValue?: string; description?: string; options?: string[]; }[]; formDescription: string; iterationId: string; pageTitle: string; pageUrl: string; requestId: string; timestamp: number; }; event: 'interactive:form_data:request'; } | { data: { compressedSize: number; compressionPercent: number; iterationId: string; originalSize: number; timestamp: number; }; event: 'system:debug_compression'; } | { data: { iterationId: string; messages: object[]; timestamp: number; }; event: 'system:debug_message'; } | { data: { finalAnswer: string; iterationId: string; reason: string; timestamp: number; }; event: 'task:aborted'; } | { data: { finalAnswer: string; iterationId: string; timestamp: number; success?: boolean; }; event: 'task:completed'; } | { data: { aiGenerationCount: number; aiGenerationErrorCount: number; eventCounts: object; iterationId: string; stepCount: number; timestamp: number; totalInputTokens: number; totalOutputTokens: number; }; event: 'task:metrics'; } | { data: { aiGenerationCount: number; aiGenerationErrorCount: number; eventCounts: object; iterationId: string; stepCount: number; timestamp: number; totalInputTokens: number; totalOutputTokens: number; }; event: 'task:metrics_incremental'; } | { data: { browserName: string; iterationId: string; task: string; timestamp: number; data?: object; guardrails?: string; hasApiKey?: boolean; keySource?: 'global' | 'env' | 'not_set'; model?: string; provider?: string; proxy?: string; pwCdpEndpoint?: string; pwCdpEndpointCount?: number; pwCdpEndpoints?: string[]; pwEndpoint?: string; url?: string; vision?: boolean; }; event: 'task:setup'; } | { data: { iterationId: string; plan: string; successCriteria: string; task: string; timestamp: number; url: string; actionItems?: string[]; }; event: 'task:started'; } | { data: { completionQuality: 'failed' | 'partial' | 'complete' | 'excellent'; finalAnswer: string; iterationId: string; observation: string; timestamp: number; feedback?: string; }; event: 'task:validated'; } | { data: { errors: string[]; iterationId: string; rawResponse: object; retryCount: number; timestamp: number; }; event: 'task:validation_error'; }`\n A Server-Sent Event from /v1/automate. Typed discriminated union keyed on event.\n\n### Example\n\n```typescript\nimport Tabstack from '@tabstack/sdk';\n\nconst client = new Tabstack();\n\nconst stream = await client.agent.automate({ task: 'Find the top 3 trending repositories and extract their names, descriptions, and star counts' });\nfor await (const automateEvent of stream) {\n console.log(automateEvent);\n}\n```",
+ "## automate\n\n`client.agent.automate(task: string, data?: object, geo_target?: { country?: string; }, guardrails?: string, interactive?: boolean, maxIterations?: number, maxValidationAttempts?: number, url?: string): { data: object; event: 'agent:action'; } | { data: object; event: 'agent:extracted'; } | { data: object; event: 'agent:processing'; } | { data: object; event: 'agent:reasoned'; } | { data: object; event: 'agent:status'; } | { data: object; event: 'agent:step'; } | { data: object; event: 'agent:waiting'; } | { data: object; event: 'ai:generation'; } | { data: object; event: 'ai:generation:error'; } | { data: object; event: 'browser:action_completed'; } | { data: object; event: 'browser:action_started'; } | { data: object; event: 'browser:navigated'; } | { data: object; event: 'browser:reconnected'; } | { data: object; event: 'browser:screenshot_captured'; } | { data: object; event: 'browser:screenshot_captured_image'; } | { data: object; event: 'cdp:endpoint_connected'; } | { data: object; event: 'cdp:endpoint_cycle'; } | { data: object; event: 'complete'; } | { data: object; event: 'done'; } | { data: object; event: 'error'; } | { data: object; event: 'interactive:form_data:error'; } | { data: object; event: 'interactive:form_data:request'; } | { data: object; event: 'system:debug_compression'; } | { data: object; event: 'system:debug_message'; } | { data: object; event: 'task:aborted'; } | { data: object; event: 'task:completed'; } | { data: object; event: 'task:metrics'; } | { data: object; event: 'task:metrics_incremental'; } | { data: object; event: 'task:setup'; } | { data: object; event: 'task:started'; } | { data: object; event: 'task:trace_context'; } | { data: object; event: 'task:validated'; } | { data: object; event: 'task:validation_error'; }`\n\n**post** `/automate`\n\nExecute AI-powered browser automation tasks using natural language with optional geotargeting. This endpoint **always streams** responses using Server-Sent Events (SSE).\n\n**Streaming Response:**\n- All responses are streamed using Server-Sent Events (`text/event-stream`)\n- Real-time progress updates and results as they're generated\n\n**Geotargeting:**\n- Optionally specify a country code for geotargeted browsing\n\n**Use Cases:**\n- Web scraping and data extraction\n- Form filling and interaction\n- Navigation and information gathering\n- Multi-step web workflows\n- Content analysis from web pages\n\n### Parameters\n\n- `task: string`\n The task description in natural language\n\n- `data?: object`\n JSON data to provide context for form filling or complex tasks\n\n- `geo_target?: { country?: string; }`\n Optional geotargeting parameters for proxy requests\n - `country?: string`\n Country code using ISO 3166-1 alpha-2 standard (2 letters, e.g., \"US\", \"GB\", \"JP\").\nSee: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2\n\n- `guardrails?: string`\n Safety constraints for execution\n\n- `interactive?: boolean`\n Enable interactive mode to allow human-in-the-loop input during task execution\n\n- `maxIterations?: number`\n Maximum task iterations\n\n- `maxValidationAttempts?: number`\n Maximum validation attempts\n\n- `url?: string`\n Starting URL for the task\n\n### Returns\n\n- `{ data: { action: string; iterationId: string; timestamp: number; ref?: string; value?: string; }; event: 'agent:action'; } | { data: { extractedData: string; iterationId: string; timestamp: number; }; event: 'agent:extracted'; } | { data: { hasScreenshot: boolean; iterationId: string; operation: string; timestamp: number; }; event: 'agent:processing'; } | { data: { iterationId: string; reasoning: string; timestamp: number; }; event: 'agent:reasoned'; } | { data: { iterationId: string; message: string; timestamp: number; }; event: 'agent:status'; } | { data: { currentIteration: number; iterationId: string; timestamp: number; }; event: 'agent:step'; } | { data: { iterationId: string; seconds: number; timestamp: number; }; event: 'agent:waiting'; } | { data: { finishReason: 'stop' | 'length' | 'content-filter' | 'tool-calls' | 'error' | 'other'; iterationId: string; prompt: string; schema: object; timestamp: number; usage: { inputTokens?: number; outputTokens?: number; totalTokens?: number; }; messages?: { content: string; role: 'system'; providerOptions?: object; } | { content: string | object | object | object[]; role: 'user'; providerOptions?: object; } | { content: string | object | object | object | object | object | object[]; role: 'assistant'; providerOptions?: object; } | { content: object | object[]; role: 'tool'; providerOptions?: object; }[]; object?: object; providerMetadata?: object; temperature?: number; warnings?: object[]; }; event: 'ai:generation'; } | { data: { error: string; iterationId: string; prompt: string; schema: object; timestamp: number; messages?: object[]; }; event: 'ai:generation:error'; } | { data: { iterationId: string; success: boolean; timestamp: number; error?: string; }; event: 'browser:action_completed'; } | { data: { action: string; iterationId: string; timestamp: number; ref?: string; value?: string; }; event: 'browser:action_started'; } | { data: { iterationId: string; timestamp: number; title: string; url: string; }; event: 'browser:navigated'; } | { data: { endpointIndex: number; iterationId: string; startingUrl: string; timestamp: number; total: number; }; event: 'browser:reconnected'; } | { data: { format: 'jpeg' | 'png'; iterationId: string; size: number; timestamp: number; }; event: 'browser:screenshot_captured'; } | { data: { image: string; iterationId: string; mediaType: 'image/jpeg' | 'image/png'; timestamp: number; }; event: 'browser:screenshot_captured_image'; } | { data: { endpointIndex: number; iterationId: string; timestamp: number; total: number; }; event: 'cdp:endpoint_connected'; } | { data: { attempt: number; error: string; iterationId: string; timestamp: number; total: number; }; event: 'cdp:endpoint_cycle'; } | { data: { finalAnswer: string; stats: { actions: number; durationMs: number; endTime: number; iterations: number; startTime: number; }; success: boolean; error?: { code: 'TASK_ABORTED' | 'MAX_ITERATIONS' | 'MAX_ERRORS' | 'TASK_FAILED'; message: string; }; }; event: 'complete'; } | { data: object; event: 'done'; } | { data: { error: { code: string; message: string; timestamp: string; }; success: false; }; event: 'error'; } | { data: { fieldErrors: object; fields: { fieldType: string; label: string; ref: string; required: boolean; currentValue?: string; description?: string; options?: string[]; }[]; formDescription: string; iterationId: string; pageTitle: string; pageUrl: string; requestId: string; timestamp: number; }; event: 'interactive:form_data:error'; } | { data: { fields: { fieldType: string; label: string; ref: string; required: boolean; currentValue?: string; description?: string; options?: string[]; }[]; formDescription: string; iterationId: string; pageTitle: string; pageUrl: string; requestId: string; timestamp: number; }; event: 'interactive:form_data:request'; } | { data: { compressedSize: number; compressionPercent: number; iterationId: string; originalSize: number; timestamp: number; }; event: 'system:debug_compression'; } | { data: { iterationId: string; messages: object[]; timestamp: number; }; event: 'system:debug_message'; } | { data: { finalAnswer: string; iterationId: string; reason: string; timestamp: number; }; event: 'task:aborted'; } | { data: { finalAnswer: string; iterationId: string; timestamp: number; success?: boolean; }; event: 'task:completed'; } | { data: { aiGenerationCount: number; aiGenerationErrorCount: number; eventCounts: object; iterationId: string; stepCount: number; timestamp: number; totalInputTokens: number; totalOutputTokens: number; }; event: 'task:metrics'; } | { data: { aiGenerationCount: number; aiGenerationErrorCount: number; eventCounts: object; iterationId: string; stepCount: number; timestamp: number; totalInputTokens: number; totalOutputTokens: number; }; event: 'task:metrics_incremental'; } | { data: { browserName: string; iterationId: string; task: string; timestamp: number; data?: object; guardrails?: string; hasApiKey?: boolean; keySource?: 'global' | 'env' | 'not_set'; model?: string; provider?: string; proxy?: string; pwCdpEndpoint?: string; pwCdpEndpointCount?: number; pwCdpEndpoints?: string[]; pwEndpoint?: string; url?: string; vision?: boolean; }; event: 'task:setup'; } | { data: { iterationId: string; plan: string; successCriteria: string; task: string; timestamp: number; url: string; actionItems?: string[]; }; event: 'task:started'; } | { data: { traceId: string; }; event: 'task:trace_context'; } | { data: { completionQuality: 'failed' | 'partial' | 'complete' | 'excellent'; finalAnswer: string; iterationId: string; observation: string; timestamp: number; feedback?: string; }; event: 'task:validated'; } | { data: { errors: string[]; iterationId: string; rawResponse: object; retryCount: number; timestamp: number; }; event: 'task:validation_error'; }`\n A Server-Sent Event from /v1/automate. Typed discriminated union keyed on event.\n\n### Example\n\n```typescript\nimport Tabstack from '@tabstack/sdk';\n\nconst client = new Tabstack();\n\nconst stream = await client.agent.automate({ task: 'Find the top 3 trending repositories and extract their names, descriptions, and star counts' });\nfor await (const automateEvent of stream) {\n console.log(automateEvent);\n}\n```",
perLanguage: {
typescript: {
method: 'client.agent.automate',
@@ -91,7 +91,7 @@ const EMBEDDED_METHODS: MethodEntry[] = [
},
http: {
example:
- 'curl https://api.tabstack.ai/v1/automate \\\n -H \'Content-Type: application/json\' \\\n -H "Authorization: Bearer $TABSTACK_API_KEY" \\\n -d "{\n \\"task\\": \\"Find the top 3 trending repositories and extract their names, descriptions, and star counts\\",\n \\"guardrails\\": \\"browse and extract only, don\'t interact with repositories\\",\n \\"maxIterations\\": 50,\n \\"maxValidationAttempts\\": 3,\n \\"url\\": \\"https://github.com/trending\\"\n }"',
+ 'curl https://api.tabstack.ai/v1/automate \\\n -H \'Content-Type: application/json\' \\\n -H "Authorization: Bearer $TABSTACK_API_KEY" \\\n --max-time 600 \\\n -d "{\n \\"task\\": \\"Find the top 3 trending repositories and extract their names, descriptions, and star counts\\",\n \\"guardrails\\": \\"browse and extract only, don\'t interact with repositories\\",\n \\"maxIterations\\": 50,\n \\"maxValidationAttempts\\": 3,\n \\"url\\": \\"https://github.com/trending\\"\n }"',
},
},
},
@@ -148,7 +148,7 @@ const EMBEDDED_METHODS: MethodEntry[] = [
response:
"{ data: object; event: 'analyzing:end'; } | { data: object; event: 'analyzing:start'; } | { data: object; event: 'complete'; } | { data: object; event: 'error'; } | { data: object; event: 'evaluating:end'; } | { data: object; event: 'evaluating:start'; } | { data: object; event: 'following:end'; } | { data: object; event: 'following:start'; } | { data: object; event: 'iteration:end'; } | { data: object; event: 'iteration:start'; } | { data: object; event: 'judging:end'; } | { data: object; event: 'judging:start'; } | { data: object; event: 'outlining:end'; } | { data: object; event: 'outlining:start'; } | { data: object; event: 'planning:end'; } | { data: object; event: 'planning:start'; } | { data: object; event: 'prefetching:end'; } | { data: object; event: 'prefetching:start'; } | { data: object; event: 'searching:end'; } | { data: object; event: 'searching:start'; } | { data: object; event: 'start'; } | { data: object; event: 'writing:end'; } | { data: object; event: 'writing:start'; }",
markdown:
- "## research\n\n`client.agent.research(query: string, fetch_timeout?: number, mode?: 'fast' | 'balanced', nocache?: boolean): { data: object; event: 'analyzing:end'; } | { data: object; event: 'analyzing:start'; } | { data: object; event: 'complete'; } | { data: object; event: 'error'; } | { data: object; event: 'evaluating:end'; } | { data: object; event: 'evaluating:start'; } | { data: object; event: 'following:end'; } | { data: object; event: 'following:start'; } | { data: object; event: 'iteration:end'; } | { data: object; event: 'iteration:start'; } | { data: object; event: 'judging:end'; } | { data: object; event: 'judging:start'; } | { data: object; event: 'outlining:end'; } | { data: object; event: 'outlining:start'; } | { data: object; event: 'planning:end'; } | { data: object; event: 'planning:start'; } | { data: object; event: 'prefetching:end'; } | { data: object; event: 'prefetching:start'; } | { data: object; event: 'searching:end'; } | { data: object; event: 'searching:start'; } | { data: object; event: 'start'; } | { data: object; event: 'writing:end'; } | { data: object; event: 'writing:start'; }`\n\n**post** `/research`\n\nExecute AI-powered research queries that search the web, analyze sources, and synthesize comprehensive answers. This endpoint **always streams** responses using Server-Sent Events (SSE).\n\n**Streaming Response:**\n- All responses are streamed using Server-Sent Events (`text/event-stream`)\n- Real-time progress updates as research progresses through phases\n\n**Research Modes:**\n- `fast` - Quick answers with minimal web searches (default)\n- `balanced` - Standard research with multiple iterations\n\n**Use Cases:**\n- Answering complex questions with cited sources\n- Synthesizing information from multiple web sources\n- Research reports on specific topics\n- Fact-checking and verification tasks\n\n### Parameters\n\n- `query: string`\n The research query or question to answer. Maximum 10,000 characters.\n\n- `fetch_timeout?: number`\n Timeout in seconds for fetching web pages\n\n- `mode?: 'fast' | 'balanced'`\n Research mode: fast (quick answers, default), balanced (standard research)\n\n- `nocache?: boolean`\n Skip cache and force fresh research\n\n### Returns\n\n- `{ data: { analyzed: number; failed: number; iteration: number; message: string; samples: { domain: string; title: string; url: string; urlSource: 'user-input' | 'search-result' | 'extracted-link'; relevance?: 'low' | 'medium' | 'high'; reliability?: 'low' | 'medium' | 'high'; summary?: string; }[]; timestamp: number; }; event: 'analyzing:end'; } | { data: { iteration: number; message: string; pageCount: number; timestamp: number; }; event: 'analyzing:start'; } | { data: { message: string; metadata: { executedQueries: string[][]; mode: 'fast' | 'balanced' | 'deep' | 'max' | 'ultra'; prompt: string; queryComplexity: 'simple' | 'moderate' | 'complex'; researchObjective: string; researchPlan: string; researchQuestions: string[]; totalPagesAnalyzed: number; citedPages?: object[]; gapEvaluations?: object[]; judgments?: object[]; metrics?: object; outline?: object; urlSources?: object; }; report: string; timestamp: number; }; event: 'complete'; } | { data: { error: { message: string; name: string; stack?: string; }; message: string; timestamp: number; activity?: string; iteration?: number; }; event: 'error'; } | { data: { coverage: 'Light' | 'Moderate' | 'Solid' | 'Comprehensive'; gaps: string; iteration: number; message: string; nextQueries: string[]; questionAssessments: { findings: string; question: string; status: 'answered' | 'partial' | 'unanswered'; }[]; shouldContinue: boolean; timestamp: number; }; event: 'evaluating:end'; } | { data: { iteration: number; message: string; pagesAnalyzed: number; questionCount: number; timestamp: number; }; event: 'evaluating:start'; } | { data: { failed: number; followed: number; iteration: number; message: string; samples: { domain: string; title: string; url: string; urlSource: 'user-input' | 'search-result' | 'extracted-link'; relevance?: 'low' | 'medium' | 'high'; reliability?: 'low' | 'medium' | 'high'; summary?: string; }[]; timestamp: number; }; event: 'following:end'; } | { data: { iteration: number; linkCount: number; message: string; timestamp: number; }; event: 'following:start'; } | { data: { isLast: boolean; iteration: number; message: string; timestamp: number; stopReason?: 'max_iterations' | 'coverage_sufficient'; }; event: 'iteration:end'; } | { data: { iteration: number; maxIterations: number; message: string; queries: string[]; timestamp: number; }; event: 'iteration:start'; } | { data: { approved: boolean; attempt: number; message: string; score: number; timestamp: number; feedback?: string; }; event: 'judging:end'; } | { data: { attempt: number; maxAttempts: number; message: string; timestamp: number; }; event: 'judging:start'; } | { data: { message: string; sourcesSelected: number; timestamp: number; }; event: 'outlining:end'; } | { data: { message: string; pagesAnalyzed: number; qualityPageCount: number; timestamp: number; }; event: 'outlining:start'; } | { data: { complexity: 'simple' | 'moderate' | 'complex'; message: string; objective: string; plan: string; queries: string[]; questions: string[]; timestamp: number; }; event: 'planning:end'; } | { data: { hasPrefetchedContext: boolean; message: string; timestamp: number; }; event: 'planning:start'; } | { data: { failed: number; fetched: number; message: string; timestamp: number; }; event: 'prefetching:end'; } | { data: { message: string; timestamp: number; urlCount: number; urls: string[]; }; event: 'prefetching:start'; } | { data: { iteration: number; message: string; timestamp: number; urlsFound: number; urlsNew: number; }; event: 'searching:end'; } | { data: { iteration: number; message: string; queries: string[]; timestamp: number; }; event: 'searching:start'; } | { data: { message: string; timestamp: number; }; event: 'start'; } | { data: { attempt: number; message: string; timestamp: number; }; event: 'writing:end'; } | { data: { attempt: number; isRevision: boolean; maxAttempts: number; message: string; timestamp: number; previousScore?: number; }; event: 'writing:start'; }`\n A Server-Sent Event from /v1/research. Typed discriminated union keyed on event.\n\n### Example\n\n```typescript\nimport Tabstack from '@tabstack/sdk';\n\nconst client = new Tabstack();\n\nconst stream = await client.agent.research({ query: 'What are the latest developments in quantum computing?' });\nfor await (const researchEvent of stream) {\n console.log(researchEvent);\n}\n```",
+ "## research\n\n`client.agent.research(query: string, fetch_timeout?: number, mode?: 'fast' | 'balanced', nocache?: boolean): { data: object; event: 'analyzing:end'; } | { data: object; event: 'analyzing:start'; } | { data: object; event: 'complete'; } | { data: object; event: 'error'; } | { data: object; event: 'evaluating:end'; } | { data: object; event: 'evaluating:start'; } | { data: object; event: 'following:end'; } | { data: object; event: 'following:start'; } | { data: object; event: 'iteration:end'; } | { data: object; event: 'iteration:start'; } | { data: object; event: 'judging:end'; } | { data: object; event: 'judging:start'; } | { data: object; event: 'outlining:end'; } | { data: object; event: 'outlining:start'; } | { data: object; event: 'planning:end'; } | { data: object; event: 'planning:start'; } | { data: object; event: 'prefetching:end'; } | { data: object; event: 'prefetching:start'; } | { data: object; event: 'searching:end'; } | { data: object; event: 'searching:start'; } | { data: object; event: 'start'; } | { data: object; event: 'writing:end'; } | { data: object; event: 'writing:start'; }`\n\n**post** `/research`\n\nExecute AI-powered research queries that search the web, analyze sources, and synthesize comprehensive answers. This endpoint **always streams** responses using Server-Sent Events (SSE).\n\n**Streaming Response:**\n- All responses are streamed using Server-Sent Events (`text/event-stream`)\n- Real-time progress updates as research progresses through phases\n\n**Research Modes:**\n- `fast` - Quick answers with minimal web searches (default)\n- `balanced` - Standard research with multiple iterations\n\n**Use Cases:**\n- Answering complex questions with cited sources\n- Synthesizing information from multiple web sources\n- Research reports on specific topics\n- Fact-checking and verification tasks\n\n### Parameters\n\n- `query: string`\n The research query or question to answer. Maximum 10,000 characters.\n\n- `fetch_timeout?: number`\n Timeout in seconds for fetching web pages\n\n- `mode?: 'fast' | 'balanced'`\n Research mode: fast (quick answers, default), balanced (standard research)\n\n- `nocache?: boolean`\n Skip cache and force fresh research\n\n### Returns\n\n- `{ data: { analyzed: number; failed: number; iteration: number; message: string; samples: { domain: string; title: string; url: string; urlSource: 'user-input' | 'search-result' | 'extracted-link'; relevance?: 'low' | 'medium' | 'high'; reliability?: 'low' | 'medium' | 'high'; summary?: string; }[]; timestamp: number; }; event: 'analyzing:end'; } | { data: { iteration: number; message: string; pageCount: number; timestamp: number; }; event: 'analyzing:start'; } | { data: { message: string; metadata: { executedQueries: string[][]; mode: 'fast' | 'balanced' | 'deep' | 'max' | 'ultra'; prompt: string; queryComplexity: 'simple' | 'moderate' | 'complex'; researchObjective: string; researchPlan: string; researchQuestions: string[]; totalPagesAnalyzed: number; citedPages?: object[]; gapEvaluations?: object[]; judgments?: object[]; metrics?: object; outline?: object; urlSources?: object; }; report: string; timestamp: number; }; event: 'complete'; } | { data: { error: { message: string; name: string; stack?: string; }; message: string; timestamp: number; activity?: string; iteration?: number; }; event: 'error'; } | { data: { coverage: 'Light' | 'Moderate' | 'Solid' | 'Comprehensive'; gaps: string; iteration: number; message: string; nextQueries: string[]; questionAssessments: object[]; shouldContinue: boolean; timestamp: number; }; event: 'evaluating:end'; } | { data: { iteration: number; message: string; pagesAnalyzed: number; questionCount: number; timestamp: number; }; event: 'evaluating:start'; } | { data: { failed: number; followed: number; iteration: number; message: string; samples: { domain: string; title: string; url: string; urlSource: 'user-input' | 'search-result' | 'extracted-link'; relevance?: 'low' | 'medium' | 'high'; reliability?: 'low' | 'medium' | 'high'; summary?: string; }[]; timestamp: number; }; event: 'following:end'; } | { data: { iteration: number; linkCount: number; message: string; timestamp: number; }; event: 'following:start'; } | { data: { isLast: boolean; iteration: number; message: string; timestamp: number; stopReason?: 'max_iterations' | 'coverage_sufficient'; }; event: 'iteration:end'; } | { data: { iteration: number; maxIterations: number; message: string; queries: string[]; timestamp: number; }; event: 'iteration:start'; } | { data: { approved: boolean; attempt: number; message: string; score: number; timestamp: number; feedback?: string; }; event: 'judging:end'; } | { data: { attempt: number; maxAttempts: number; message: string; timestamp: number; }; event: 'judging:start'; } | { data: { message: string; sourcesSelected: number; timestamp: number; }; event: 'outlining:end'; } | { data: { message: string; pagesAnalyzed: number; qualityPageCount: number; timestamp: number; }; event: 'outlining:start'; } | { data: { complexity: 'simple' | 'moderate' | 'complex'; message: string; objective: string; plan: string; queries: string[]; questions: string[]; timestamp: number; }; event: 'planning:end'; } | { data: { hasPrefetchedContext: boolean; message: string; timestamp: number; }; event: 'planning:start'; } | { data: { failed: number; fetched: number; message: string; timestamp: number; }; event: 'prefetching:end'; } | { data: { message: string; timestamp: number; urlCount: number; urls: string[]; }; event: 'prefetching:start'; } | { data: { iteration: number; message: string; timestamp: number; urlsFound: number; urlsNew: number; }; event: 'searching:end'; } | { data: { iteration: number; message: string; queries: string[]; timestamp: number; }; event: 'searching:start'; } | { data: { message: string; timestamp: number; }; event: 'start'; } | { data: { attempt: number; message: string; timestamp: number; }; event: 'writing:end'; } | { data: { attempt: number; isRevision: boolean; maxAttempts: number; message: string; timestamp: number; previousScore?: number; }; event: 'writing:start'; }`\n A Server-Sent Event from /v1/research. Typed discriminated union keyed on event.\n\n### Example\n\n```typescript\nimport Tabstack from '@tabstack/sdk';\n\nconst client = new Tabstack();\n\nconst stream = await client.agent.research({ query: 'What are the latest developments in quantum computing?' });\nfor await (const researchEvent of stream) {\n console.log(researchEvent);\n}\n```",
perLanguage: {
typescript: {
method: 'client.agent.research',
@@ -167,7 +167,7 @@ const EMBEDDED_METHODS: MethodEntry[] = [
},
http: {
example:
- 'curl https://api.tabstack.ai/v1/research \\\n -H \'Content-Type: application/json\' \\\n -H "Authorization: Bearer $TABSTACK_API_KEY" \\\n -d \'{\n "query": "What are the latest developments in quantum computing?",\n "fetch_timeout": 30,\n "mode": "fast"\n }\'',
+ 'curl https://api.tabstack.ai/v1/research \\\n -H \'Content-Type: application/json\' \\\n -H "Authorization: Bearer $TABSTACK_API_KEY" \\\n --max-time 600 \\\n -d \'{\n "query": "What are the latest developments in quantum computing?",\n "fetch_timeout": 30,\n "mode": "fast"\n }\'',
},
},
},
@@ -207,7 +207,7 @@ const EMBEDDED_METHODS: MethodEntry[] = [
},
http: {
example:
- 'curl https://api.tabstack.ai/v1/extract/json \\\n -H \'Content-Type: application/json\' \\\n -H "Authorization: Bearer $TABSTACK_API_KEY" \\\n -d \'{\n "json_schema": {\n "properties": {\n "stories": {\n "items": {\n "properties": {\n "author": {\n "description": "Author username",\n "type": "string"\n },\n "points": {\n "description": "Story points",\n "type": "number"\n },\n "title": {\n "description": "Story title",\n "type": "string"\n }\n },\n "type": "object"\n },\n "type": "array"\n }\n },\n "type": "object"\n },\n "url": "https://news.ycombinator.com",\n "effort": "standard"\n }\'',
+ 'curl https://api.tabstack.ai/v1/extract/json \\\n -H \'Content-Type: application/json\' \\\n -H "Authorization: Bearer $TABSTACK_API_KEY" \\\n --max-time 300 \\\n -d \'{\n "json_schema": {\n "properties": {\n "stories": {\n "items": {\n "properties": {\n "author": {\n "description": "Author username",\n "type": "string"\n },\n "points": {\n "description": "Story points",\n "type": "number"\n },\n "title": {\n "description": "Story title",\n "type": "string"\n }\n },\n "type": "object"\n },\n "type": "array"\n }\n },\n "type": "object"\n },\n "url": "https://news.ycombinator.com",\n "effort": "standard"\n }\'',
},
},
},
@@ -249,7 +249,7 @@ const EMBEDDED_METHODS: MethodEntry[] = [
},
http: {
example:
- 'curl https://api.tabstack.ai/v1/extract/markdown \\\n -H \'Content-Type: application/json\' \\\n -H "Authorization: Bearer $TABSTACK_API_KEY" \\\n -d \'{\n "url": "https://example.com/blog/article",\n "effort": "standard",\n "metadata": true\n }\'',
+ 'curl https://api.tabstack.ai/v1/extract/markdown \\\n -H \'Content-Type: application/json\' \\\n -H "Authorization: Bearer $TABSTACK_API_KEY" \\\n --max-time 180 \\\n -d \'{\n "url": "https://example.com/blog/article",\n "effort": "standard",\n "metadata": true\n }\'',
},
},
},
@@ -291,7 +291,7 @@ const EMBEDDED_METHODS: MethodEntry[] = [
},
http: {
example:
- 'curl https://api.tabstack.ai/v1/generate/json \\\n -H \'Content-Type: application/json\' \\\n -H "Authorization: Bearer $TABSTACK_API_KEY" \\\n -d "{\n \\"instructions\\": \\"For each story, categorize it (tech/business/science/other) and write a one-sentence summary explaining what it\'s about in simple terms.\\",\n \\"json_schema\\": {\n \\"properties\\": {\n \\"summaries\\": {\n \\"items\\": {\n \\"properties\\": {\n \\"category\\": {\n \\"description\\": \\"Story category (tech/business/science/etc)\\",\n \\"type\\": \\"string\\"\n },\n \\"summary\\": {\n \\"description\\": \\"One-sentence summary of the story\\",\n \\"type\\": \\"string\\"\n },\n \\"title\\": {\n \\"description\\": \\"Story title\\",\n \\"type\\": \\"string\\"\n }\n },\n \\"type\\": \\"object\\"\n },\n \\"type\\": \\"array\\"\n }\n },\n \\"type\\": \\"object\\"\n },\n \\"url\\": \\"https://news.ycombinator.com\\",\n \\"effort\\": \\"standard\\"\n }"',
+ 'curl https://api.tabstack.ai/v1/generate/json \\\n -H \'Content-Type: application/json\' \\\n -H "Authorization: Bearer $TABSTACK_API_KEY" \\\n --max-time 300 \\\n -d "{\n \\"instructions\\": \\"For each story, categorize it (tech/business/science/other) and write a one-sentence summary explaining what it\'s about in simple terms.\\",\n \\"json_schema\\": {\n \\"properties\\": {\n \\"summaries\\": {\n \\"items\\": {\n \\"properties\\": {\n \\"category\\": {\n \\"description\\": \\"Story category (tech/business/science/etc)\\",\n \\"type\\": \\"string\\"\n },\n \\"summary\\": {\n \\"description\\": \\"One-sentence summary of the story\\",\n \\"type\\": \\"string\\"\n },\n \\"title\\": {\n \\"description\\": \\"Story title\\",\n \\"type\\": \\"string\\"\n }\n },\n \\"type\\": \\"object\\"\n },\n \\"type\\": \\"array\\"\n }\n },\n \\"type\\": \\"object\\"\n },\n \\"url\\": \\"https://news.ycombinator.com\\",\n \\"effort\\": \\"standard\\"\n }"',
},
},
},
diff --git a/packages/mcp-server/src/server.ts b/packages/mcp-server/src/server.ts
index 96d5ca0..4434401 100644
--- a/packages/mcp-server/src/server.ts
+++ b/packages/mcp-server/src/server.ts
@@ -28,7 +28,7 @@ export const newMcpServer = async ({
new McpServer(
{
name: 'tabstack_sdk_api',
- version: '2.6.0',
+ version: '2.6.1',
},
{
instructions: await getInstructions({ stainlessApiKey, customInstructionsPath }),
diff --git a/scripts/fast-format b/scripts/fast-format
index e172313..f1873ae 100755
--- a/scripts/fast-format
+++ b/scripts/fast-format
@@ -31,8 +31,7 @@ if ! [ -z "$ESLINT_FILES" ]; then
fi
echo "==> Running prettier --write"
-PRETTIER_FILES="$(grep '\.\([mc]?tsx?\|[mc]?jsx?\|json\)$' "$FILE_LIST" || true)"
-if ! [ -z "$PRETTIER_FILES" ]; then
- echo "$PRETTIER_FILES" | xargs ./node_modules/.bin/prettier \
- --write --cache --cache-strategy metadata --no-error-on-unmatched-pattern
+if ! [ -z "$FILE_LIST" ]; then
+ cat "$FILE_LIST" | xargs ./node_modules/.bin/prettier \
+ --write --cache --cache-strategy metadata --no-error-on-unmatched-pattern --ignore-unknown
fi
diff --git a/scripts/utils/postprocess-files.cjs b/scripts/utils/postprocess-files.cjs
index deae575..a8cdeb7 100644
--- a/scripts/utils/postprocess-files.cjs
+++ b/scripts/utils/postprocess-files.cjs
@@ -23,12 +23,19 @@ async function postprocess() {
// strip out lib="dom", types="node", and types="react" references; these
// are needed at build time, but would pollute the user's TS environment
- const transformed = code.replace(
+ let transformed = code.replace(
/^ *\/\/\/ * ' '.repeat(match.length - 1) + '\n',
);
+ // TypeScript's declaration emitter collapses /** @ts-ignore */ onto the same
+ // line as the type declaration, which doesn't work. So we convert to // @ts-ignore
+ // on its own line to properly suppresses errors.
+ if (file.endsWith('.d.ts') || file.endsWith('.d.mts') || file.endsWith('.d.cts')) {
+ transformed = transformed.replace(/\/\*\* @ts-ignore\b[^*]*\*\/ /gm, '// @ts-ignore\n');
+ }
+
if (transformed !== code) {
console.error(`wrote ${path.relative(process.cwd(), file)}`);
await fs.promises.writeFile(file, transformed, 'utf8');
diff --git a/src/client.ts b/src/client.ts
index bea38b6..1c64324 100644
--- a/src/client.ts
+++ b/src/client.ts
@@ -25,6 +25,8 @@ import {
AgentResearchParams,
AutomateEvent,
ResearchEvent,
+ V1GlobalBuffer,
+ V1ResearchQuestionAssessment,
} from './resources/agent';
import {
Extract,
@@ -184,6 +186,18 @@ export class Tabstack {
this.fetch = options.fetch ?? Shims.getDefaultFetch();
this.#encoder = Opts.FallbackEncoder;
+ const customHeadersEnv = readEnv('TABSTACK_CUSTOM_HEADERS');
+ if (customHeadersEnv) {
+ const parsed: Record = {};
+ for (const line of customHeadersEnv.split('\n')) {
+ const colon = line.indexOf(':');
+ if (colon >= 0) {
+ parsed[line.substring(0, colon).trim()] = line.substring(colon + 1).trim();
+ }
+ }
+ options.defaultHeaders = { ...parsed, ...options.defaultHeaders };
+ }
+
this._options = options;
this.apiKey = apiKey;
@@ -750,6 +764,8 @@ export declare namespace Tabstack {
Agent as Agent,
type AutomateEvent as AutomateEvent,
type ResearchEvent as ResearchEvent,
+ type V1GlobalBuffer as V1GlobalBuffer,
+ type V1ResearchQuestionAssessment as V1ResearchQuestionAssessment,
type AgentAutomateInputResponse as AgentAutomateInputResponse,
type AgentAutomateParams as AgentAutomateParams,
type AgentAutomateInputParams as AgentAutomateInputParams,
@@ -769,4 +785,6 @@ export declare namespace Tabstack {
type GenerateJsonResponse as GenerateJsonResponse,
type GenerateJsonParams as GenerateJsonParams,
};
+
+ export type GeotargetGeoTarget = API.GeotargetGeoTarget;
}
diff --git a/src/resources/agent.ts b/src/resources/agent.ts
index 448f899..9047448 100644
--- a/src/resources/agent.ts
+++ b/src/resources/agent.ts
@@ -1,6 +1,8 @@
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
import { APIResource } from '../core/resource';
+import * as AgentAPI from './agent';
+import * as Shared from './shared';
import { APIPromise } from '../core/api-promise';
import { Stream } from '../core/streaming';
import { buildHeaders } from '../internal/headers';
@@ -43,6 +45,7 @@ export class Agent extends APIResource {
automate(body: AgentAutomateParams, options?: RequestOptions): APIPromise> {
return this._client.post('/automate', {
body,
+ timeout: (this._client as any)._options.timeout ?? 600000,
...options,
headers: buildHeaders([{ Accept: 'text/event-stream' }, options?.headers]),
stream: true,
@@ -112,6 +115,7 @@ export class Agent extends APIResource {
research(body: AgentResearchParams, options?: RequestOptions): APIPromise> {
return this._client.post('/research', {
body,
+ timeout: (this._client as any)._options.timeout ?? 600000,
...options,
headers: buildHeaders([{ Accept: 'text/event-stream' }, options?.headers]),
stream: true,
@@ -154,6 +158,7 @@ export type AutomateEvent =
| AutomateEvent.V1AutomateEventTaskMetricsIncremental
| AutomateEvent.V1AutomateEventTaskSetup
| AutomateEvent.V1AutomateEventTaskStarted
+ | AutomateEvent.V1AutomateEventTaskTraceContext
| AutomateEvent.V1AutomateEventTaskValidated
| AutomateEvent.V1AutomateEventTaskValidationError;
@@ -485,7 +490,7 @@ export namespace AutomateEvent {
* - data: a base64-encoded string, a Uint8Array, an ArrayBuffer, or a Buffer
* - URL: a URL that points to the image
*/
- image: string | Image.UnionMember1 | Image.ByteLength | Image.V1GlobalBuffer;
+ image: string | Image.UnionMember1 | Image.ByteLength | AgentAPI.V1GlobalBuffer;
type: 'image';
@@ -535,26 +540,6 @@ export namespace AutomateEvent {
export interface ByteLength {
byteLength: number;
}
-
- export interface V1GlobalBuffer {
- buffer: V1GlobalBuffer.Buffer;
-
- byteLength: number;
-
- byteOffset: number;
-
- BYTES_PER_ELEMENT: number;
-
- length: number;
-
- [k: string]: number | V1GlobalBuffer.Buffer | undefined;
- }
-
- export namespace V1GlobalBuffer {
- export interface Buffer {
- byteLength: number;
- }
- }
}
/**
@@ -567,7 +552,7 @@ export namespace AutomateEvent {
* - data: a base64-encoded string, a Uint8Array, an ArrayBuffer, or a Buffer
* - URL: a URL that points to the image
*/
- data: string | File.UnionMember1 | File.ByteLength | File.V1GlobalBuffer;
+ data: string | File.UnionMember1 | File.ByteLength | AgentAPI.V1GlobalBuffer;
/**
* IANA media type of the file.
@@ -622,26 +607,6 @@ export namespace AutomateEvent {
export interface ByteLength {
byteLength: number;
}
-
- export interface V1GlobalBuffer {
- buffer: V1GlobalBuffer.Buffer;
-
- byteLength: number;
-
- byteOffset: number;
-
- BYTES_PER_ELEMENT: number;
-
- length: number;
-
- [k: string]: number | V1GlobalBuffer.Buffer | undefined;
- }
-
- export namespace V1GlobalBuffer {
- export interface Buffer {
- byteLength: number;
- }
- }
}
}
@@ -723,7 +688,7 @@ export namespace AutomateEvent {
* - data: a base64-encoded string, a Uint8Array, an ArrayBuffer, or a Buffer
* - URL: a URL that points to the image
*/
- data: string | File.UnionMember1 | File.ByteLength | File.V1GlobalBuffer;
+ data: string | File.UnionMember1 | File.ByteLength | AgentAPI.V1GlobalBuffer;
/**
* IANA media type of the file.
@@ -778,26 +743,6 @@ export namespace AutomateEvent {
export interface ByteLength {
byteLength: number;
}
-
- export interface V1GlobalBuffer {
- buffer: V1GlobalBuffer.Buffer;
-
- byteLength: number;
-
- byteOffset: number;
-
- BYTES_PER_ELEMENT: number;
-
- length: number;
-
- [k: string]: number | V1GlobalBuffer.Buffer | undefined;
- }
-
- export namespace V1GlobalBuffer {
- export interface Buffer {
- byteLength: number;
- }
- }
}
/**
@@ -2674,6 +2619,34 @@ export namespace AutomateEvent {
}
}
+ /**
+ * Envelope for the "task:trace_context" event from /v1/automate.
+ */
+ export interface V1AutomateEventTaskTraceContext {
+ /**
+ * Payload for the task:trace_context event. Carries the OpenTelemetry trace ID for
+ * this /v1/automate request so consumers can deep-link to distributed-tracing UIs
+ * (e.g. Cloud Trace, Cloud Logging) for the run.
+ */
+ data: V1AutomateEventTaskTraceContext.Data;
+
+ event: 'task:trace_context';
+ }
+
+ export namespace V1AutomateEventTaskTraceContext {
+ /**
+ * Payload for the task:trace_context event. Carries the OpenTelemetry trace ID for
+ * this /v1/automate request so consumers can deep-link to distributed-tracing UIs
+ * (e.g. Cloud Trace, Cloud Logging) for the run.
+ */
+ export interface Data {
+ /**
+ * W3C trace ID — 32-character lowercase hexadecimal string.
+ */
+ traceId: string;
+ }
+ }
+
/**
* Envelope for the "task:validated" event from /v1/automate.
*/
@@ -2983,7 +2956,7 @@ export namespace ResearchEvent {
/**
* Assessment of each research question's status and findings
*/
- questionAssessments: Array;
+ questionAssessments: Array;
/**
* Research coverage level - assesses quality across all questions.
@@ -3028,29 +3001,6 @@ export namespace ResearchEvent {
searchQueries?: Array;
}
- export namespace GapEvaluation {
- /**
- * Assessment of a single research question
- */
- export interface QuestionAssessment {
- /**
- * What we learned (if answered/partial) or what's missing (if unanswered)
- */
- findings: string;
-
- /**
- * The research question being assessed
- */
- question: string;
-
- /**
- * Status: answered (clear info), partial (some info, gaps remain), unanswered (no
- * relevant info)
- */
- status: 'answered' | 'partial' | 'unanswered';
- }
- }
-
/**
* Judgment result from research judge
*/
@@ -3242,35 +3192,12 @@ export namespace ResearchEvent {
nextQueries: Array;
- questionAssessments: Array;
+ questionAssessments: Array;
shouldContinue: boolean;
timestamp: number;
}
-
- export namespace Data {
- /**
- * Assessment of a single research question
- */
- export interface QuestionAssessment {
- /**
- * What we learned (if answered/partial) or what's missing (if unanswered)
- */
- findings: string;
-
- /**
- * The research question being assessed
- */
- question: string;
-
- /**
- * Status: answered (clear info), partial (some info, gaps remain), unanswered (no
- * relevant info)
- */
- status: 'answered' | 'partial' | 'unanswered';
- }
- }
}
/**
@@ -3737,6 +3664,47 @@ export namespace ResearchEvent {
}
}
+export interface V1GlobalBuffer {
+ buffer: V1GlobalBuffer.Buffer;
+
+ byteLength: number;
+
+ byteOffset: number;
+
+ BYTES_PER_ELEMENT: number;
+
+ length: number;
+
+ [k: string]: number | V1GlobalBuffer.Buffer | undefined;
+}
+
+export namespace V1GlobalBuffer {
+ export interface Buffer {
+ byteLength: number;
+ }
+}
+
+/**
+ * Assessment of a single research question
+ */
+export interface V1ResearchQuestionAssessment {
+ /**
+ * What we learned (if answered/partial) or what's missing (if unanswered)
+ */
+ findings: string;
+
+ /**
+ * The research question being assessed
+ */
+ question: string;
+
+ /**
+ * Status: answered (clear info), partial (some info, gaps remain), unanswered (no
+ * relevant info)
+ */
+ status: 'answered' | 'partial' | 'unanswered';
+}
+
export interface AgentAutomateInputResponse {
status?: string;
}
@@ -3755,7 +3723,7 @@ export interface AgentAutomateParams {
/**
* Optional geotargeting parameters for proxy requests
*/
- geo_target?: AgentAutomateParams.GeoTarget;
+ geo_target?: Shared.GeotargetGeoTarget;
/**
* Safety constraints for execution
@@ -3783,19 +3751,6 @@ export interface AgentAutomateParams {
url?: string;
}
-export namespace AgentAutomateParams {
- /**
- * Optional geotargeting parameters for proxy requests
- */
- export interface GeoTarget {
- /**
- * Country code using ISO 3166-1 alpha-2 standard (2 letters, e.g., "US", "GB",
- * "JP"). See: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
- */
- country?: string;
- }
-}
-
export interface AgentAutomateInputParams {
/**
* Set to true to cancel/decline the request
@@ -3842,6 +3797,8 @@ export declare namespace Agent {
export {
type AutomateEvent as AutomateEvent,
type ResearchEvent as ResearchEvent,
+ type V1GlobalBuffer as V1GlobalBuffer,
+ type V1ResearchQuestionAssessment as V1ResearchQuestionAssessment,
type AgentAutomateInputResponse as AgentAutomateInputResponse,
type AgentAutomateParams as AgentAutomateParams,
type AgentAutomateInputParams as AgentAutomateInputParams,
diff --git a/src/resources/extract.ts b/src/resources/extract.ts
index 3c2fb80..ca0b186 100644
--- a/src/resources/extract.ts
+++ b/src/resources/extract.ts
@@ -1,6 +1,7 @@
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
import { APIResource } from '../core/resource';
+import * as Shared from './shared';
import { APIPromise } from '../core/api-promise';
import { RequestOptions } from '../internal/request-options';
@@ -41,7 +42,11 @@ export class Extract extends APIResource {
* ```
*/
json(body: ExtractJsonParams, options?: RequestOptions): APIPromise {
- return this._client.post('/extract/json', { body, ...options });
+ return this._client.post('/extract/json', {
+ body,
+ timeout: (this._client as any)._options.timeout ?? 300000,
+ ...options,
+ });
}
/**
@@ -56,7 +61,11 @@ export class Extract extends APIResource {
* ```
*/
markdown(body: ExtractMarkdownParams, options?: RequestOptions): APIPromise {
- return this._client.post('/extract/markdown', { body, ...options });
+ return this._client.post('/extract/markdown', {
+ body,
+ timeout: (this._client as any)._options.timeout ?? 180000,
+ ...options,
+ });
}
}
@@ -188,7 +197,7 @@ export interface ExtractJsonParams {
/**
* Optional geotargeting parameters for proxy requests
*/
- geo_target?: ExtractJsonParams.GeoTarget;
+ geo_target?: Shared.GeotargetGeoTarget;
/**
* Bypass cache and force fresh data retrieval
@@ -196,19 +205,6 @@ export interface ExtractJsonParams {
nocache?: boolean;
}
-export namespace ExtractJsonParams {
- /**
- * Optional geotargeting parameters for proxy requests
- */
- export interface GeoTarget {
- /**
- * Country code using ISO 3166-1 alpha-2 standard (2 letters, e.g., "US", "GB",
- * "JP"). See: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
- */
- country?: string;
- }
-}
-
export interface ExtractMarkdownParams {
/**
* URL to fetch and convert to markdown
@@ -225,7 +221,7 @@ export interface ExtractMarkdownParams {
/**
* Optional geotargeting parameters for proxy requests
*/
- geo_target?: ExtractMarkdownParams.GeoTarget;
+ geo_target?: Shared.GeotargetGeoTarget;
/**
* Include extracted metadata (Open Graph and HTML metadata) as a separate field in
@@ -239,19 +235,6 @@ export interface ExtractMarkdownParams {
nocache?: boolean;
}
-export namespace ExtractMarkdownParams {
- /**
- * Optional geotargeting parameters for proxy requests
- */
- export interface GeoTarget {
- /**
- * Country code using ISO 3166-1 alpha-2 standard (2 letters, e.g., "US", "GB",
- * "JP"). See: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
- */
- country?: string;
- }
-}
-
export declare namespace Extract {
export {
type ExtractJsonResponse as ExtractJsonResponse,
diff --git a/src/resources/generate.ts b/src/resources/generate.ts
index bfc3ee5..70939bc 100644
--- a/src/resources/generate.ts
+++ b/src/resources/generate.ts
@@ -1,6 +1,7 @@
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
import { APIResource } from '../core/resource';
+import * as Shared from './shared';
import { APIPromise } from '../core/api-promise';
import { RequestOptions } from '../internal/request-options';
@@ -38,7 +39,11 @@ export class Generate extends APIResource {
* ```
*/
json(body: GenerateJsonParams, options?: RequestOptions): APIPromise {
- return this._client.post('/generate/json', { body, ...options });
+ return this._client.post('/generate/json', {
+ body,
+ timeout: (this._client as any)._options.timeout ?? 300000,
+ ...options,
+ });
}
}
@@ -70,7 +75,7 @@ export interface GenerateJsonParams {
/**
* Optional geotargeting parameters for proxy requests
*/
- geo_target?: GenerateJsonParams.GeoTarget;
+ geo_target?: Shared.GeotargetGeoTarget;
/**
* Bypass cache and force fresh data retrieval
@@ -78,19 +83,6 @@ export interface GenerateJsonParams {
nocache?: boolean;
}
-export namespace GenerateJsonParams {
- /**
- * Optional geotargeting parameters for proxy requests
- */
- export interface GeoTarget {
- /**
- * Country code using ISO 3166-1 alpha-2 standard (2 letters, e.g., "US", "GB",
- * "JP"). See: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
- */
- country?: string;
- }
-}
-
export declare namespace Generate {
export { type GenerateJsonResponse as GenerateJsonResponse, type GenerateJsonParams as GenerateJsonParams };
}
diff --git a/src/resources/index.ts b/src/resources/index.ts
index 1cc30e7..d92728a 100644
--- a/src/resources/index.ts
+++ b/src/resources/index.ts
@@ -1,9 +1,12 @@
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+export * from './shared';
export {
Agent,
type AutomateEvent,
type ResearchEvent,
+ type V1GlobalBuffer,
+ type V1ResearchQuestionAssessment,
type AgentAutomateInputResponse,
type AgentAutomateParams,
type AgentAutomateInputParams,
diff --git a/src/resources/shared.ts b/src/resources/shared.ts
new file mode 100644
index 0000000..095e4e1
--- /dev/null
+++ b/src/resources/shared.ts
@@ -0,0 +1,9 @@
+// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+export interface GeotargetGeoTarget {
+ /**
+ * Country code using ISO 3166-1 alpha-2 standard (2 letters, e.g., "US", "GB",
+ * "JP"). See: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
+ */
+ country?: string;
+}
diff --git a/src/version.ts b/src/version.ts
index cc6e4a8..f9d065f 100644
--- a/src/version.ts
+++ b/src/version.ts
@@ -1 +1 @@
-export const VERSION = '2.6.0'; // x-release-please-version
+export const VERSION = '2.6.1'; // x-release-please-version