@qoder-ai/qoder-agent-sdk 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bridge/index.d.ts +1 -1
- package/dist/bridge/index.js +3 -3
- package/dist/browser/browser-query.d.ts +1 -1
- package/dist/browser/index.d.ts +1 -1
- package/dist/core/errors.d.ts +2 -2
- package/dist/core/process-transport.d.ts +2 -2
- package/dist/core/transport.d.ts +1 -1
- package/dist/direct-connect/direct-connect-transport.d.ts +1 -1
- package/dist/index.d.ts +5 -6
- package/dist/mcp/sdk-mcp-server.d.ts +1 -1
- package/dist/protocol/common.d.ts +75 -9
- package/dist/protocol/index.d.ts +1 -1
- package/dist/protocol/mcp.d.ts +1 -6
- package/dist/query/index.d.ts +1 -1
- package/dist/query/query.d.ts +2 -2
- package/dist/types/mcp.d.ts +3 -3
- package/dist/types/settings.d.ts +1 -4
- package/package.json +4 -15
- package/scripts/postinstall.cjs +1 -1
package/dist/bridge/index.d.ts
CHANGED
package/dist/bridge/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
function E(o){if(typeof o!="object"||o===null)return;let e=o,s=e.subtype;if(typeof s=="string")return s;let a=e.type;return typeof a=="string"?a:void 0}var C=class{url;sessionId;getAuthHeaders;lastSequenceNum;seenSequenceNums=new Set;abortController=null;state="idle";onData;onEvent;onClose;onConnect;constructor(e){this.url=e.url,this.sessionId=e.sessionId,this.getAuthHeaders=e.getAuthHeaders??(()=>({})),this.lastSequenceNum=e.initialSequenceNum??0}getLastSequenceNum(){return this.lastSequenceNum}isTerminating(){return this.state==="closing"||this.state==="closed"}async connect(){if(this.state!=="idle"&&this.state!=="reconnecting")return;this.state="connecting";let e=10,s=0;for(;s<e&&!this.isTerminating();)try{this.abortController=new AbortController;let a=new URL(this.url);this.lastSequenceNum>0&&a.searchParams.set("from_sequence_num",String(this.lastSequenceNum));let i={...this.getAuthHeaders(),Accept:"text/event-stream"
|
|
2
|
-
`);i=
|
|
3
|
-
`)}catch{}}close(){this.state="closing",this.abortController?.abort(),this.state="closed"}};var _=class{sessionUrl;getAuthHeaders;heartbeatIntervalMs;heartbeatTimer;writeQueue=[];flushTimer;initialized=!1;workerEpoch;onEpochMismatch;onAuthFailure;consecutiveAuthFailures=0;closed=!1;constructor(e){this.sessionUrl=e.sessionUrl,this.getAuthHeaders=e.getAuthHeaders,this.heartbeatIntervalMs=e.heartbeatIntervalMs??2e4,this.onEpochMismatch=e.onEpochMismatch,this.onAuthFailure=e.onAuthFailure}async initialize(e){this.workerEpoch=e,await this.putWorker({worker_status:"idle",worker_epoch:e}),this.heartbeatTimer=setInterval(()=>{this.sendHeartbeat().catch(()=>{})},this.heartbeatIntervalMs),this.initialized=!0}isInitialized(){return this.initialized}async writeEvent(e){this.writeQueue.push(e),this.scheduleFlush()}scheduleFlush(){this.flushTimer||(this.flushTimer=setTimeout(()=>{this.flushTimer=void 0,this.flushWriteQueue().catch(()=>{})},100))}async flushWriteQueue(){if(this.writeQueue.length===0||this.closed)return;let e=this.writeQueue.splice(0);try{let s=await fetch(`${this.sessionUrl}/worker/events`,{method:"POST",headers:{...this.getAuthHeaders(),"Content-Type":"application/json"
|
|
1
|
+
function E(o){if(typeof o!="object"||o===null)return;let e=o,s=e.subtype;if(typeof s=="string")return s;let a=e.type;return typeof a=="string"?a:void 0}var C=class{url;sessionId;getAuthHeaders;lastSequenceNum;seenSequenceNums=new Set;abortController=null;state="idle";onData;onEvent;onClose;onConnect;constructor(e){this.url=e.url,this.sessionId=e.sessionId,this.getAuthHeaders=e.getAuthHeaders??(()=>({})),this.lastSequenceNum=e.initialSequenceNum??0}getLastSequenceNum(){return this.lastSequenceNum}isTerminating(){return this.state==="closing"||this.state==="closed"}async connect(){if(this.state!=="idle"&&this.state!=="reconnecting")return;this.state="connecting";let e=10,s=0;for(;s<e&&!this.isTerminating();)try{this.abortController=new AbortController;let a=new URL(this.url);this.lastSequenceNum>0&&a.searchParams.set("from_sequence_num",String(this.lastSequenceNum));let i={...this.getAuthHeaders(),Accept:"text/event-stream"};this.lastSequenceNum>0&&(i["Last-Event-ID"]=String(this.lastSequenceNum));let r=await fetch(a.toString(),{headers:i,signal:this.abortController.signal});if(!r.ok){if(r.status===401||r.status===403){this.onClose?.(r.status);return}if(r.status===409){this.onClose?.(4090);return}throw new Error(`SSE connection failed: ${r.status}`)}if(this.state="connected",this.onConnect?.(),s=0,await this.readStream(r.body),this.isTerminating())return;this.state="reconnecting"}catch(a){if(this.isTerminating()||a.name==="AbortError")return;if(s++,s>=e){this.onClose?.();return}let i=Math.min(1e3*Math.pow(2,s-1),3e4);await new Promise(r=>setTimeout(r,i)),this.state="reconnecting"}}async readStream(e){let s=e.getReader(),a=new TextDecoder,i="",r="",d="";try{for(;;){let{done:c,value:p}=await s.read();if(c)break;i+=a.decode(p,{stream:!0});let S=i.split(`
|
|
2
|
+
`);i=S.pop()??"";for(let m of S)if(m.startsWith("event: "))r=m.substring(7).trim();else if(m.startsWith("data: "))d=m.substring(6);else if(m.startsWith("id: ")){let b=parseInt(m.substring(4),10);isNaN(b)||(this.lastSequenceNum=Math.max(this.lastSequenceNum,b))}else m===""&&(r&&d&&this.handleSSEEvent(r,d),r="",d="")}}finally{s.releaseLock()}}handleSSEEvent(e,s){if(e==="client_event")try{let a=JSON.parse(s),i=a.sequence_num;if(i!==void 0){if(this.seenSequenceNums.has(i))return;if(this.seenSequenceNums.add(i),this.lastSequenceNum=Math.max(this.lastSequenceNum,i),this.seenSequenceNums.size>1e3){let d=[...this.seenSequenceNums].sort((c,p)=>c-p).slice(0,500);for(let c of d)this.seenSequenceNums.delete(c)}}this.onEvent?.(a),a.payload?.type&&this.onData?.(JSON.stringify(a.payload)+`
|
|
3
|
+
`)}catch{}}close(){this.state="closing",this.abortController?.abort(),this.state="closed"}};var _=class{sessionUrl;getAuthHeaders;heartbeatIntervalMs;heartbeatTimer;writeQueue=[];flushTimer;initialized=!1;workerEpoch;onEpochMismatch;onAuthFailure;consecutiveAuthFailures=0;closed=!1;constructor(e){this.sessionUrl=e.sessionUrl,this.getAuthHeaders=e.getAuthHeaders,this.heartbeatIntervalMs=e.heartbeatIntervalMs??2e4,this.onEpochMismatch=e.onEpochMismatch,this.onAuthFailure=e.onAuthFailure}async initialize(e){this.workerEpoch=e,await this.putWorker({worker_status:"idle",worker_epoch:e}),this.heartbeatTimer=setInterval(()=>{this.sendHeartbeat().catch(()=>{})},this.heartbeatIntervalMs),this.initialized=!0}isInitialized(){return this.initialized}async writeEvent(e){this.writeQueue.push(e),this.scheduleFlush()}scheduleFlush(){this.flushTimer||(this.flushTimer=setTimeout(()=>{this.flushTimer=void 0,this.flushWriteQueue().catch(()=>{})},100))}async flushWriteQueue(){if(this.writeQueue.length===0||this.closed)return;let e=this.writeQueue.splice(0);try{let s=await fetch(`${this.sessionUrl}/worker/events`,{method:"POST",headers:{...this.getAuthHeaders(),"Content-Type":"application/json"},body:JSON.stringify({events:e})});this.handleResponseStatus(s.status)}catch{this.writeQueue.unshift(...e)}}async sendHeartbeat(){if(!this.closed)try{let e=await fetch(`${this.sessionUrl}/worker/heartbeat`,{method:"POST",headers:{...this.getAuthHeaders()}});this.handleResponseStatus(e.status),e.ok&&(this.consecutiveAuthFailures=0)}catch{}}async reportState(e){await this.putWorker({worker_status:e})}async reportMetadata(e){await this.putWorker({external_metadata:e})}async reportDelivery(e,s){if(!this.closed)try{await fetch(`${this.sessionUrl}/worker/events/${e}/delivery`,{method:"POST",headers:{...this.getAuthHeaders(),"Content-Type":"application/json"},body:JSON.stringify({status:s})})}catch{}}async putWorker(e){let s=await fetch(`${this.sessionUrl}/worker`,{method:"PUT",headers:{...this.getAuthHeaders(),"Content-Type":"application/json"},body:JSON.stringify(e)});this.handleResponseStatus(s.status)}handleResponseStatus(e){e===409&&this.onEpochMismatch?.(),(e===401||e===403)&&(this.consecutiveAuthFailures++,this.consecutiveAuthFailures>=10&&this.onAuthFailure?.())}async flush(){this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=void 0),await this.flushWriteQueue()}close(){this.closed=!0,this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=void 0),this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=void 0)}};async function H(o){let{sessionId:e,ingressToken:s,apiBaseUrl:a,epoch:i,initialSequenceNum:r=0,heartbeatIntervalMs:d=2e4,outboundOnly:c=!1,onInboundMessage:p,onPermissionResponse:S,canUseToolPreFilter:m,onPermissionResolved:b,onInterrupt:A,onSetModel:K,onSetMaxThinkingTokens:N,onSetPermissionMode:x,onClose:q}=o,k=`${a}/v1/code/sessions/${e}`,T=()=>({Authorization:`Bearer ${s}`}),P=new Set,I=new Set,v=new Map,y=new C({url:`${k}/worker/events/stream`,sessionId:e,getAuthHeaders:T,initialSequenceNum:r}),u=new _({sessionUrl:k,getAuthHeaders:T,heartbeatIntervalMs:d,onEpochMismatch:()=>q?.(4090),onAuthFailure:()=>q?.(401)});y.onData=t=>{try{let l=JSON.parse(t.trim());$(l,P,I,p,h=>{S?.(h),j(h)},M)}catch{}},y.onEvent=t=>{u.reportDelivery(t.event_id,"received").catch(()=>{})},y.onClose=t=>{q?.(t)};function M(t){let l=t.request,h=E(l);if(h==="interrupt"){A?.();let n={type:"control_response",response:{subtype:"success",request_id:t.request_id}};u.writeEvent(n).catch(()=>{})}else if(h==="set_model"){let n=l.model;K?.(n);let f={type:"control_response",response:{subtype:"success",request_id:t.request_id}};u.writeEvent(f).catch(()=>{})}else if(h==="set_max_thinking_tokens"){let n=l.tokens??null;N?.(n);let f={type:"control_response",response:{subtype:"success",request_id:t.request_id}};u.writeEvent(f).catch(()=>{})}else if(h==="set_permission_mode"){let n=l.mode,f=x?.(n),R=f&&!f.ok?{type:"control_response",response:{subtype:"error",request_id:t.request_id,error:f.error}}:{type:"control_response",response:{subtype:"success",request_id:t.request_id}};u.writeEvent(R).catch(()=>{})}else if(h==="can_use_tool"){let n=l,f=n.tool_name,R=n.input??{};if(v.set(t.request_id,f),!m)return;let O=new AbortController;Promise.resolve(m(f,R,{signal:O.signal,suggestions:n.permission_suggestions,blockedPath:n.blocked_path,decisionReason:n.decision_reason,decisionReasonType:n.decision_reason_type,classifierApprovable:n.classifier_approvable,title:n.title,displayName:n.display_name,description:n.description,toolUseID:n.tool_use_id,agentID:n.agent_id})).then(g=>{if(g===void 0)return;let w=g.behavior==="allow"?{...g,updatedInput:g.updatedInput??R,toolUseID:n.tool_use_id}:{...g,toolUseID:n.tool_use_id},U={type:"control_response",response:{subtype:"success",request_id:t.request_id,response:w}};v.delete(t.request_id),b?.(f,w),u.writeEvent(U).catch(()=>{})}).catch(g=>{let w={type:"control_response",response:{subtype:"error",request_id:t.request_id,error:g instanceof Error?g.message:String(g)}};v.delete(t.request_id),u.writeEvent(w).catch(()=>{})})}}function j(t){let l=t.response.request_id,h=v.get(l);if(!h||t.response.subtype!=="success")return;let n=t.response.response;!n||typeof n!="object"||!("behavior"in n)||(v.delete(l),b?.(h,n))}let D=i;if(D===void 0){let t=await fetch(`${k}/worker/register`,{method:"POST",headers:{...T()}});if(!t.ok)throw new Error(`Worker registration failed: ${t.status}`);D=(await t.json()).epoch}return await u.initialize(D),c||y.connect().catch(()=>{}),{get sessionId(){return e},getSequenceNum(){return y.getLastSequenceNum()},isConnected(){return u.isInitialized()},write(t){"uuid"in t&&t.uuid&&P.add(t.uuid),u.writeEvent(t).catch(()=>{})},sendResult(){u.writeEvent({type:"result_boundary"}).catch(()=>{})},sendControlRequest(t){u.writeEvent(t).catch(()=>{})},sendControlResponse(t){u.writeEvent(t).catch(()=>{})},sendControlCancelRequest(t){u.writeEvent({type:"control_cancel_request",request_id:t}).catch(()=>{})},async reconnectTransport(t){y.close(),u.close()},reportState(t){u.reportState(t).catch(()=>{})},reportMetadata(t){u.reportMetadata(t).catch(()=>{})},reportDelivery(t,l){u.reportDelivery(t,l).catch(()=>{})},async flush(){await u.flush()},close(){v.clear(),y.close(),u.close()}}}function $(o,e,s,a,i,r){if(o.type==="control_response"){i?.(o);return}if(o.type==="control_request"){r?.(o);return}o.uuid&&e.has(o.uuid)||o.uuid&&s.has(o.uuid)||(o.uuid&&s.add(o.uuid),o.type==="user"&&a?.(o))}async function F(o,e,s,a,i){try{let r=new AbortController,d=setTimeout(()=>r.abort(),a),c={title:s,bridge:{}};i?.length&&(c.tags=i);let p=await fetch(`${o}/v1/code/sessions`,{method:"POST",headers:{"x-api-key":e,"Content-Type":"application/json"},body:JSON.stringify(c),signal:r.signal});return clearTimeout(d),p.ok?(await p.json()).id??null:null}catch{return null}}async function B(o,e,s,a,i){try{let r=new AbortController,d=setTimeout(()=>r.abort(),a),c={"x-api-key":s,"Content-Type":"application/json"};i&&(c["X-Trusted-Device-Token"]=i);let p=await fetch(`${e}/v1/code/sessions/${o}/bridge`,{method:"POST",headers:c,body:JSON.stringify({}),signal:r.signal});return clearTimeout(d),p.ok?await p.json():null}catch{return null}}export{H as attachBridgeSession,F as createCodeSession,B as fetchRemoteCredentials};
|
|
@@ -16,7 +16,7 @@ export type BrowserQueryOptions = {
|
|
|
16
16
|
jsonSchema?: Record<string, unknown>;
|
|
17
17
|
};
|
|
18
18
|
/**
|
|
19
|
-
* Create a
|
|
19
|
+
* Create a Qoder query using WebSocket transport in the browser.
|
|
20
20
|
*
|
|
21
21
|
* Only SDK MCP servers (in-process) are supported in the browser.
|
|
22
22
|
* Process-based MCP servers require Node.js and are not available.
|
package/dist/browser/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Browser module — WebSocket-based
|
|
2
|
+
* Browser module — WebSocket-based Qoder query for browser environments.
|
|
3
3
|
*
|
|
4
4
|
* Re-exports commonly needed types from the main SDK alongside
|
|
5
5
|
* browser-specific types and the browser query function.
|
package/dist/core/errors.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Custom error types for the
|
|
2
|
+
* Custom error types for the Qoder Agent SDK.
|
|
3
3
|
*/
|
|
4
4
|
/**
|
|
5
5
|
* Thrown when an operation is aborted, typically via an AbortSignal.
|
|
@@ -11,7 +11,7 @@ export declare class AbortError extends Error {
|
|
|
11
11
|
/**
|
|
12
12
|
* Thrown when a direct-connect transport encounters an error.
|
|
13
13
|
* Direct-connect is an alternative transport that connects to a
|
|
14
|
-
* running
|
|
14
|
+
* running qodercli server via network rather than spawning a subprocess.
|
|
15
15
|
*/
|
|
16
16
|
export declare class DirectConnectError extends Error {
|
|
17
17
|
constructor(message: string);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* ProcessTransport — Spawns
|
|
2
|
+
* ProcessTransport — Spawns qodercli as a child process and
|
|
3
3
|
* manages stdin/stdout communication using JSONL (JSON Lines) format.
|
|
4
4
|
*
|
|
5
5
|
* This is the primary transport for Node.js environments. It:
|
|
@@ -20,7 +20,7 @@ import type { SpawnedProcess, SpawnOptions, SettingSource } from '../types/optio
|
|
|
20
20
|
* Options for configuring the ProcessTransport.
|
|
21
21
|
*
|
|
22
22
|
* These map 1:1 to the CLI flags and environment variables that the
|
|
23
|
-
*
|
|
23
|
+
* qodercli understands.
|
|
24
24
|
*/
|
|
25
25
|
export interface ProcessTransportOptions {
|
|
26
26
|
/** Path to the Qoder CLI executable (binary or script) */
|
package/dist/core/transport.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Transport interface for communicating with the
|
|
2
|
+
* Transport interface for communicating with the qodercli process.
|
|
3
3
|
*
|
|
4
4
|
* A Transport abstracts the bidirectional communication channel between
|
|
5
5
|
* the SDK and the CLI. All transports must implement this interface.
|
|
@@ -6,7 +6,7 @@ export interface DirectConnectOptions {
|
|
|
6
6
|
cwd?: string;
|
|
7
7
|
}
|
|
8
8
|
/**
|
|
9
|
-
* DirectConnectTransport — Connects to a remote
|
|
9
|
+
* DirectConnectTransport — Connects to a remote qodercli server via WebSocket.
|
|
10
10
|
*
|
|
11
11
|
* Flow:
|
|
12
12
|
* 1. POST /sessions -> creates a session, gets { sessionId, workDir, wsUrl }
|
package/dist/index.d.ts
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Qoder Agent SDK
|
|
3
3
|
*
|
|
4
|
-
* TypeScript SDK for programmatic access to
|
|
5
|
-
* Protocol-compatible drop-in replacement for @anthropic-ai/claude-agent-sdk.
|
|
4
|
+
* TypeScript SDK for programmatic access to qodercli capabilities.
|
|
6
5
|
*
|
|
7
|
-
* The SDK works by spawning a
|
|
6
|
+
* The SDK works by spawning a qodercli subprocess and communicating
|
|
8
7
|
* via a bidirectional JSON line protocol over stdin/stdout.
|
|
9
8
|
*
|
|
10
9
|
* @example Basic usage
|
|
11
10
|
* ```typescript
|
|
12
11
|
* import { query } from 'qoder-agent-sdk';
|
|
13
12
|
*
|
|
14
|
-
* for await (const message of query({ prompt: 'Hello,
|
|
13
|
+
* for await (const message of query({ prompt: 'Hello, Qoder!' })) {
|
|
15
14
|
* console.log(message);
|
|
16
15
|
* }
|
|
17
16
|
* ```
|
|
@@ -25,7 +24,7 @@
|
|
|
25
24
|
* // ... yield more messages
|
|
26
25
|
* }
|
|
27
26
|
*
|
|
28
|
-
* for await (const message of query({ prompt: userMessages(), options: { model: '
|
|
27
|
+
* for await (const message of query({ prompt: userMessages(), options: { model: 'performance' } })) {
|
|
29
28
|
* console.log(message);
|
|
30
29
|
* }
|
|
31
30
|
* ```
|
|
@@ -81,7 +80,7 @@ export type { AgentCreateParams, BetaManagedAgentsAgentToolName, BetaManagedAgen
|
|
|
81
80
|
export type { SettingSource as SettingSourceFromOptions } from './types/options.js';
|
|
82
81
|
export type { PermissionMode, PermissionBehavior, PermissionDecisionClassification, PermissionUpdateDestination, PermissionRuleValue, PermissionUpdate, PermissionResult, CanUseToolOptions, PermissionDecisionReasonType, ExitPlanModeApprovalDetails, } from './types/permissions.js';
|
|
83
82
|
export type { HookEvent, HookPermissionDecision, HookCallback, HookCallbackMatcher, HookInput, HookSpecificOutput, HookJSONOutput, AsyncHookJSONOutput, SyncHookJSONOutput, BaseHookInput, PreToolUseHookInput, PostToolUseHookInput, PostToolUseFailureHookInput, UserPromptSubmitHookInput, SessionStartHookInput, SessionEndHookInput, StopHookInput, SubagentStartHookInput, SubagentStopHookInput, PreCompactHookInput, PostCompactHookInput, PermissionRequestHookInput, InstructionsLoadedHookInput, CwdChangedHookInput, FileChangedHookInput, PreToolUseHookSpecificOutput, PostToolUseHookSpecificOutput, PostToolUseFailureHookSpecificOutput, UserPromptSubmitHookSpecificOutput, SessionStartHookSpecificOutput, SubagentStartHookSpecificOutput, PermissionRequestHookSpecificOutput, CwdChangedHookSpecificOutput, FileChangedHookSpecificOutput, } from './types/hooks.js';
|
|
84
|
-
export type { McpStdioServerConfig, McpSSEServerConfig, McpHttpServerConfig, McpSdkServerConfig, McpSdkServerConfigWithInstance,
|
|
83
|
+
export type { McpStdioServerConfig, McpSSEServerConfig, McpHttpServerConfig, McpSdkServerConfig, McpSdkServerConfigWithInstance, McpServerConfig, McpServerToolPolicy, McpServerConfigForProcessTransport, McpServerStatus, McpServerStatusConfig, } from './types/mcp.js';
|
|
85
84
|
export type { AgentDefinition, AgentInfo, AgentMcpServerSpec, } from './types/agents.js';
|
|
86
85
|
export type { SDKSessionInfo, SessionMessage, ListSessionsOptions, GetSessionInfoOptions, GetSessionMessagesOptions, GetSubagentMessagesOptions, ListSubagentsOptions, SessionMutationOptions, ForkSessionOptions, ForkSessionResult, RewindFilesResult, } from './types/session.js';
|
|
87
86
|
export type { Settings, SandboxSettings, SandboxNetworkConfig, SandboxFilesystemConfig, SandboxIgnoreViolations, ResolvedSettings, ResolvedSettingsSource, } from './types/settings.js';
|
|
@@ -60,7 +60,7 @@ export type CreateSdkMcpServerOptions = {
|
|
|
60
60
|
/**
|
|
61
61
|
* Creates an MCP server instance that runs in the same process as the SDK.
|
|
62
62
|
*
|
|
63
|
-
* Tools defined here are accessible to
|
|
63
|
+
* Tools defined here are accessible to qodercli without spawning a separate
|
|
64
64
|
* server process. The returned config object can be passed directly to the
|
|
65
65
|
* SDK's `mcpServers` option.
|
|
66
66
|
*
|
|
@@ -9,9 +9,61 @@
|
|
|
9
9
|
* Anything callback-shaped or carrying a runtime instance lives in the SDK
|
|
10
10
|
* package, not here.
|
|
11
11
|
*/
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
export type ContentBlock = {
|
|
13
|
+
type: string;
|
|
14
|
+
text?: string;
|
|
15
|
+
id?: string;
|
|
16
|
+
name?: string;
|
|
17
|
+
input?: unknown;
|
|
18
|
+
content?: unknown;
|
|
19
|
+
source?: unknown;
|
|
20
|
+
tool_use_id?: string;
|
|
21
|
+
is_error?: boolean;
|
|
22
|
+
[key: string]: unknown;
|
|
23
|
+
};
|
|
24
|
+
export type MessageParam = {
|
|
25
|
+
role: 'user';
|
|
26
|
+
content: string | ContentBlock[];
|
|
27
|
+
};
|
|
28
|
+
export type BetaStopReason = 'end_turn' | 'max_tokens' | 'stop_sequence' | 'tool_use' | 'pause_turn' | 'refusal' | string;
|
|
29
|
+
export type BetaUsage = {
|
|
30
|
+
cache_creation?: {
|
|
31
|
+
ephemeral_1h_input_tokens?: number | null;
|
|
32
|
+
ephemeral_5m_input_tokens?: number | null;
|
|
33
|
+
} | null;
|
|
34
|
+
cache_creation_input_tokens?: number | null;
|
|
35
|
+
cache_read_input_tokens?: number | null;
|
|
36
|
+
inference_geo?: string | null;
|
|
37
|
+
input_tokens?: number | null;
|
|
38
|
+
iterations?: unknown[] | null;
|
|
39
|
+
output_tokens?: number | null;
|
|
40
|
+
server_tool_use?: {
|
|
41
|
+
web_fetch_requests?: number | null;
|
|
42
|
+
web_search_requests?: number | null;
|
|
43
|
+
} | null;
|
|
44
|
+
service_tier?: string | null;
|
|
45
|
+
speed?: string | null;
|
|
46
|
+
};
|
|
47
|
+
export type BetaMessage = {
|
|
48
|
+
id?: string;
|
|
49
|
+
type?: 'message';
|
|
50
|
+
role: 'assistant';
|
|
51
|
+
content: ContentBlock[];
|
|
52
|
+
model?: string;
|
|
53
|
+
stop_reason?: BetaStopReason | null;
|
|
54
|
+
stop_sequence?: string | null;
|
|
55
|
+
usage?: BetaUsage;
|
|
56
|
+
[key: string]: unknown;
|
|
57
|
+
};
|
|
58
|
+
export type BetaRawMessageStreamEvent = {
|
|
59
|
+
type: string;
|
|
60
|
+
index?: number;
|
|
61
|
+
delta?: unknown;
|
|
62
|
+
content_block?: ContentBlock;
|
|
63
|
+
message?: BetaMessage;
|
|
64
|
+
usage?: BetaUsage;
|
|
65
|
+
[key: string]: unknown;
|
|
66
|
+
};
|
|
15
67
|
/**
|
|
16
68
|
* Wire-level UUID. We deliberately type it as plain `string` rather than
|
|
17
69
|
* `crypto.UUID`'s template literal — the wire is a string, and using a
|
|
@@ -22,17 +74,31 @@ export type { BetaMessage, BetaRawMessageStreamEvent, BetaUsage, BetaStopReason,
|
|
|
22
74
|
*/
|
|
23
75
|
export type UUID = string;
|
|
24
76
|
/**
|
|
25
|
-
*
|
|
77
|
+
* Usage with every SDK-consumed field non-null and required.
|
|
26
78
|
*
|
|
27
|
-
*
|
|
79
|
+
* Upstream usage types mark fields like `cache_creation_input_tokens` as
|
|
28
80
|
* `number | null | undefined`, but the runtime always emits a number (zeroed
|
|
29
|
-
* if absent). We tighten that here to remove null-checking noise on the
|
|
30
|
-
*
|
|
81
|
+
* if absent). We tighten that here to remove null-checking noise on the SDK
|
|
82
|
+
* side. The optional `request_id` is a Qoder-specific extension threaded
|
|
31
83
|
* through for tracing persisted transcripts.
|
|
32
84
|
*/
|
|
33
85
|
export type NonNullableUsage = {
|
|
34
|
-
|
|
35
|
-
|
|
86
|
+
cache_creation: {
|
|
87
|
+
ephemeral_1h_input_tokens: number;
|
|
88
|
+
ephemeral_5m_input_tokens: number;
|
|
89
|
+
};
|
|
90
|
+
cache_creation_input_tokens: number;
|
|
91
|
+
cache_read_input_tokens: number;
|
|
92
|
+
inference_geo: string;
|
|
93
|
+
input_tokens: number;
|
|
94
|
+
iterations: unknown[];
|
|
95
|
+
output_tokens: number;
|
|
96
|
+
server_tool_use: {
|
|
97
|
+
web_fetch_requests: number;
|
|
98
|
+
web_search_requests: number;
|
|
99
|
+
};
|
|
100
|
+
service_tier: string;
|
|
101
|
+
speed: string;
|
|
36
102
|
request_id?: string;
|
|
37
103
|
};
|
|
38
104
|
export type AccountInfo = {
|
package/dist/protocol/index.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ export type { UUID, BetaMessage, BetaRawMessageStreamEvent, BetaUsage, BetaStopR
|
|
|
17
17
|
export type { AICodeTrackingLaunchOptions, QoderAgentLaunchOptions, QoderCliFlagSettings, } from './launch.js';
|
|
18
18
|
export { buildQoderCliFlagSettings, buildQoderCliFlagSettingsArgs, } from './launch.js';
|
|
19
19
|
export type { PermissionMode, PermissionBehavior, PermissionDecisionClassification, PermissionUpdateDestination, PermissionRuleValue, PermissionUpdate, PermissionResult, } from './permissions.js';
|
|
20
|
-
export type { McpStdioServerConfig, McpSSEServerConfig, McpHttpServerConfig, McpSdkServerConfig,
|
|
20
|
+
export type { McpStdioServerConfig, McpSSEServerConfig, McpHttpServerConfig, McpSdkServerConfig, McpServerConfigForProcessTransport, McpServerStatus, McpServerStatusConfig, McpSetServersResult, OAuthToken, } from './mcp.js';
|
|
21
21
|
export type { SDKAssistantMessage, SDKUserMessage, SDKUserMessageReplay, SDKResultSuccess, SDKResultError, SDKResultMessage, SDKFileAttachment, SDKSystemMessage, SDKPartialAssistantMessage, SDKCompactBoundaryMessage, SDKStatusMessage, SDKAPIRetryMessage, SDKLocalCommandOutputMessage, SDKHookStartedMessage, SDKHookProgressMessage, SDKHookResponseMessage, SDKTaskNotificationMessage, SDKTaskStartedMessage, SDKTaskProgressMessage, SDKSessionStateChangedMessage, SDKSessionTitleChangedMessage, SDKBridgeStateMessage, SDKFilesPersistedEvent, SDKElicitationCompleteMessage, SDKPromptSuggestionMessage, SDKCloudAgentEventMessage, SDKPermissionDenial, SDKPermissionDeniedMessage, SDKPermissionDeniedReasonType, SDKMessage, } from './messages.js';
|
|
22
22
|
export type { BaseHookInput, PreToolUseHookInput, PostToolUseHookInput, PostToolUseFailureHookInput, UserPromptSubmitHookInput, SessionStartHookInput, SessionEndHookInput, StopHookInput, StopFailureHookInput, SubagentStartHookInput, SubagentStopHookInput, PreCompactHookInput, PostCompactHookInput, PermissionRequestHookInput, PermissionDeniedHookInput, SetupHookInput, TeammateIdleHookInput, TaskCreatedHookInput, TaskCompletedHookInput, ElicitationHookInput, ElicitationResultHookInput, ConfigChangeHookInput, WorktreeCreateHookInput, WorktreeRemoveHookInput, InstructionsLoadedHookInput, CwdChangedHookInput, FileChangedHookInput, HookInput, PreToolUseHookSpecificOutput, PostToolUseHookSpecificOutput, PostToolUseFailureHookSpecificOutput, UserPromptSubmitHookSpecificOutput, SessionStartHookSpecificOutput, SetupHookSpecificOutput, SubagentStartHookSpecificOutput, PermissionRequestHookSpecificOutput, ElicitationHookSpecificOutput, ElicitationResultHookSpecificOutput, CwdChangedHookSpecificOutput, FileChangedHookSpecificOutput, WorktreeCreateHookSpecificOutput, SyncHookJSONOutput, AsyncHookJSONOutput, HookJSONOutput, HookEvent, } from './hooks.js';
|
|
23
23
|
export type { AgentMcpServerSpec, AgentDefinition, AgentInfo, } from './agents.js';
|
package/dist/protocol/mcp.d.ts
CHANGED
|
@@ -30,11 +30,6 @@ export type McpSdkServerConfig = {
|
|
|
30
30
|
type: 'sdk';
|
|
31
31
|
name: string;
|
|
32
32
|
};
|
|
33
|
-
export type McpClaudeAIProxyServerConfig = {
|
|
34
|
-
type: 'claudeai-proxy';
|
|
35
|
-
url: string;
|
|
36
|
-
id: string;
|
|
37
|
-
};
|
|
38
33
|
export type McpServerConfigForProcessTransport = McpStdioServerConfig | McpSSEServerConfig | McpHttpServerConfig | McpSdkServerConfig;
|
|
39
34
|
export type McpServerStatus = {
|
|
40
35
|
name: string;
|
|
@@ -56,7 +51,7 @@ export type McpServerStatus = {
|
|
|
56
51
|
};
|
|
57
52
|
}>;
|
|
58
53
|
};
|
|
59
|
-
export type McpServerStatusConfig = McpServerConfigForProcessTransport
|
|
54
|
+
export type McpServerStatusConfig = McpServerConfigForProcessTransport;
|
|
60
55
|
export type McpSetServersResult = {
|
|
61
56
|
added: string[];
|
|
62
57
|
removed: string[];
|
package/dist/query/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Query engine module exports.
|
|
3
3
|
*
|
|
4
|
-
* This is the main entry point for the
|
|
4
|
+
* This is the main entry point for the Qoder Agent SDK query functionality.
|
|
5
5
|
*/
|
|
6
6
|
export { query } from './query.js';
|
|
7
7
|
export { QueryRunner } from './query-runner.js';
|
package/dist/query/query.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* query() — The main entry point for creating a
|
|
2
|
+
* query() — The main entry point for creating a Qoder Agent SDK query.
|
|
3
3
|
*
|
|
4
4
|
* This function:
|
|
5
5
|
* 1. Parses the Options object
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* ```ts
|
|
16
16
|
* const q = query({
|
|
17
17
|
* prompt: 'What is the capital of France?',
|
|
18
|
-
* options: { model: '
|
|
18
|
+
* options: { model: 'performance' },
|
|
19
19
|
* });
|
|
20
20
|
*
|
|
21
21
|
* for await (const msg of q) {
|
package/dist/types/mcp.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* carries a runtime `McpServer` instance and stays here.
|
|
7
7
|
*/
|
|
8
8
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
9
|
-
import type { McpStdioServerConfig as ProtocolMcpStdioServerConfig, McpSSEServerConfig as ProtocolMcpSSEServerConfig, McpHttpServerConfig as ProtocolMcpHttpServerConfig, McpSdkServerConfig as ProtocolMcpSdkServerConfig
|
|
9
|
+
import type { McpStdioServerConfig as ProtocolMcpStdioServerConfig, McpSSEServerConfig as ProtocolMcpSSEServerConfig, McpHttpServerConfig as ProtocolMcpHttpServerConfig, McpSdkServerConfig as ProtocolMcpSdkServerConfig } from '../protocol/index.js';
|
|
10
10
|
export type McpServerToolPolicy = {
|
|
11
11
|
name: string;
|
|
12
12
|
permission_policy: 'always_allow' | 'always_ask' | 'always_deny';
|
|
@@ -20,8 +20,8 @@ export type McpHttpServerConfig = ProtocolMcpHttpServerConfig & {
|
|
|
20
20
|
};
|
|
21
21
|
export type McpSdkServerConfig = ProtocolMcpSdkServerConfig;
|
|
22
22
|
export type McpServerConfigForProcessTransport = McpStdioServerConfig | McpSSEServerConfig | McpHttpServerConfig | McpSdkServerConfig;
|
|
23
|
-
export type McpServerStatusConfig = McpServerConfigForProcessTransport
|
|
24
|
-
export type {
|
|
23
|
+
export type McpServerStatusConfig = McpServerConfigForProcessTransport;
|
|
24
|
+
export type { McpServerStatus, McpSetServersResult, OAuthToken, } from '../protocol/index.js';
|
|
25
25
|
export type McpSdkServerConfigWithInstance = McpSdkServerConfig & {
|
|
26
26
|
instance: McpServer;
|
|
27
27
|
};
|
package/dist/types/settings.d.ts
CHANGED
|
@@ -149,7 +149,6 @@ type HttpHookEntry = {
|
|
|
149
149
|
};
|
|
150
150
|
type HookEntry = CommandHookEntry | PromptHookEntry | AgentHookEntry | HttpHookEntry;
|
|
151
151
|
export interface Settings {
|
|
152
|
-
$schema?: 'https://json.schemastore.org/claude-code-settings.json';
|
|
153
152
|
apiKeyHelper?: string;
|
|
154
153
|
awsCredentialExport?: string;
|
|
155
154
|
awsAuthRefresh?: string;
|
|
@@ -230,7 +229,6 @@ export interface Settings {
|
|
|
230
229
|
}>;
|
|
231
230
|
strictKnownMarketplaces?: MarketplaceSource[];
|
|
232
231
|
blockedMarketplaces?: MarketplaceSource[];
|
|
233
|
-
forceLoginMethod?: 'claudeai' | 'console';
|
|
234
232
|
forceLoginOrgUUID?: string;
|
|
235
233
|
otelHeadersHelper?: string;
|
|
236
234
|
outputStyle?: string;
|
|
@@ -288,7 +286,6 @@ export interface Settings {
|
|
|
288
286
|
sshIdentityFile?: string;
|
|
289
287
|
startDirectory?: string;
|
|
290
288
|
}[];
|
|
291
|
-
claudeMdExcludes?: string[];
|
|
292
289
|
pluginTrustMessage?: string;
|
|
293
290
|
[k: string]: unknown;
|
|
294
291
|
}
|
|
@@ -302,7 +299,7 @@ export type ResolvedSettings = {
|
|
|
302
299
|
sources: ResolvedSettingsSource[];
|
|
303
300
|
};
|
|
304
301
|
/**
|
|
305
|
-
*
|
|
302
|
+
* Filters escalating project default modes before SDK settings are applied.
|
|
306
303
|
*
|
|
307
304
|
* When the effective `permissions.defaultMode` is an escalating mode and the
|
|
308
305
|
* winning source is project settings, remove that default mode from the
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qoder-ai/qoder-agent-sdk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "TypeScript SDK for building Qoder-powered coding agents.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -51,6 +51,8 @@
|
|
|
51
51
|
"clean": "rm -rf dist",
|
|
52
52
|
"bundle": "npm run clean && tsc && node scripts/bundle.mjs",
|
|
53
53
|
"build:obfuscated": "npm run bundle",
|
|
54
|
+
"check:package-version": "node scripts/check-package-version.mjs",
|
|
55
|
+
"hooks:install": "sh scripts/install-git-hooks.sh",
|
|
54
56
|
"release:check": "bash scripts/release-npm.sh check",
|
|
55
57
|
"release:beta": "bash scripts/release-npm.sh beta",
|
|
56
58
|
"release:latest": "bash scripts/release-npm.sh latest",
|
|
@@ -58,16 +60,6 @@
|
|
|
58
60
|
"prepublishOnly": "npm run bundle",
|
|
59
61
|
"postinstall": "node scripts/postinstall.cjs",
|
|
60
62
|
"demo:minimal": "npm run demo:chat",
|
|
61
|
-
"demo:claude:basic": "node examples/claude-agent-sdk/basic-demo/demo.mjs",
|
|
62
|
-
"demo:claude:continue": "node examples/claude-agent-sdk/continue-session-demo/demo.mjs",
|
|
63
|
-
"demo:claude:streaming": "node examples/claude-agent-sdk/streaming-input-demo/demo.mjs",
|
|
64
|
-
"demo:claude:streaming-output": "node examples/claude-agent-sdk/streaming-output-demo/demo.mjs",
|
|
65
|
-
"demo:claude:tools": "node examples/claude-agent-sdk/custom-tools-demo/demo.mjs",
|
|
66
|
-
"demo:claude:permissions": "node examples/claude-agent-sdk/permissions-demo/demo.mjs",
|
|
67
|
-
"demo:claude:hooks": "node examples/claude-agent-sdk/hooks-demo/demo.mjs",
|
|
68
|
-
"demo:claude:subagents": "node examples/claude-agent-sdk/subagents-demo/demo.mjs",
|
|
69
|
-
"demo:claude:sessions": "node examples/claude-agent-sdk/session-management-demo/demo.mjs",
|
|
70
|
-
"demo:claude:chat": "node examples/claude-agent-sdk/interactive-chat-demo/demo.mjs",
|
|
71
63
|
"demo:image": "node examples/image-input-demo/demo.mjs",
|
|
72
64
|
"demo:models": "npm run build && node examples/list-models-demo/demo.mjs",
|
|
73
65
|
"demo:chat": "npm run build && node examples/interactive-chat-demo/demo.mjs",
|
|
@@ -98,7 +90,6 @@
|
|
|
98
90
|
},
|
|
99
91
|
"keywords": [
|
|
100
92
|
"qoder",
|
|
101
|
-
"claude",
|
|
102
93
|
"agent",
|
|
103
94
|
"sdk",
|
|
104
95
|
"cli",
|
|
@@ -106,19 +97,17 @@
|
|
|
106
97
|
"ai"
|
|
107
98
|
],
|
|
108
99
|
"dependencies": {
|
|
109
|
-
"@anthropic-ai/sdk": "^0.80.0",
|
|
110
100
|
"@modelcontextprotocol/sdk": "^1.27.1"
|
|
111
101
|
},
|
|
112
102
|
"peerDependencies": {
|
|
113
103
|
"zod": "^3.25.0 || ^4.0.0"
|
|
114
104
|
},
|
|
115
105
|
"devDependencies": {
|
|
116
|
-
"@anthropic-ai/claude-agent-sdk": "^0.2.104",
|
|
117
106
|
"@types/node": "^22.0.0",
|
|
118
107
|
"esbuild": "^0.24.2",
|
|
119
108
|
"typescript": "^5.7.0",
|
|
120
109
|
"zod": "^4.0.0"
|
|
121
110
|
},
|
|
122
|
-
"qoderCliVersion": "1.0.
|
|
111
|
+
"qoderCliVersion": "1.0.1",
|
|
123
112
|
"license": "SEE LICENSE IN LICENSE"
|
|
124
113
|
}
|
package/scripts/postinstall.cjs
CHANGED
|
@@ -20,7 +20,7 @@ const os = require('os');
|
|
|
20
20
|
const path = require('path');
|
|
21
21
|
|
|
22
22
|
const PROD_DOWNLOAD_BASE_URL =
|
|
23
|
-
'https://qoder
|
|
23
|
+
'https://download.qoder.com/qodercli/releases';
|
|
24
24
|
const DEV_DOWNLOAD_BASE_URL =
|
|
25
25
|
'https://qs-cli-dev.oss-cn-hangzhou.aliyuncs.com/qodercli/dev/releases';
|
|
26
26
|
const LOG_PREFIX = '[@qoder-ai/qoder-agent-sdk]';
|