@inferencesh/sdk 0.30.0 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ### Changed
11
+ - `approveTool` and `rejectTool` resolve the call's interrupt (`POST /interrupts/{id}/resolve`), the same answer as every other pause (a wait, a hook gate, a held turn); they no longer post to `/tools/{id}/invoke|reject`. A call that is not awaiting approval rejects with "Tool call … is not awaiting approval".
12
+ - `resolveInterrupt` (agent actions and `AgentsAPI`) takes an optional `reason`, sent with a deny as `data.reason`.
13
+
14
+ ## [0.31.0] - 2026-10-19
15
+
16
+ ### Added
17
+ - `pendingWait(interrupts)` and `PendingWait`: the wait a run is paused on by its agent's wait tool (`InterruptReasonWait`), with when it ends and the agent's note.
18
+ - Generated types: `InternalToolsConfig.wait`, `AgentTool.approval_timeout` (seconds a call waits for approval before it is refused), `InterruptReasonWait`.
19
+
10
20
  ## [0.30.0] - 2026-10-18
11
21
 
12
22
  ### Removed
@@ -5,7 +5,7 @@
5
5
  * These are created once per provider instance with access to dispatch.
6
6
  */
7
7
  import { ToolInvocationStatusAwaitingInput, ToolInvocationStatusInProgress, ToolTypeClient, } from '../types.js';
8
- import { isChatBusy, isMessageTerminal, isRunInterrupted, isRunWorking } from '../utils.js';
8
+ import { approvalInterrupt, isChatBusy, isMessageTerminal, isRunInterrupted, isRunWorking } from '../utils.js';
9
9
  import { StreamableManager } from '../http/streamable.js';
10
10
  import { PollManager } from '../http/poll.js';
11
11
  import { createLLMDeltaAccumulator } from '../delta.js';
@@ -29,6 +29,23 @@ function isTransient(err) {
29
29
  export function createActions(ctx) {
30
30
  const dispatchedToolInvocations = new Set();
31
31
  const { client, dispatch, getState, getConfig, getChatId, getClientToolHandlers, getStreamManager, setStreamManager, getStreamEnabled, getPollIntervalMs, callbacks } = ctx;
32
+ /**
33
+ * The interrupt a call awaiting approval waits on: approving or rejecting
34
+ * the call resolves it, like every other pause. The chat's pending
35
+ * interrupts carry it; when they have not caught up with the call yet, the
36
+ * run's are read from the api.
37
+ */
38
+ const approvalInterruptId = async (toolInvocationId) => {
39
+ const chat = getState().chat;
40
+ let interrupt = approvalInterrupt(chat?.pending_interrupts, toolInvocationId);
41
+ const runId = chat?.active_run?.id;
42
+ if (!interrupt && runId) {
43
+ interrupt = approvalInterrupt(await api.listRunInterrupts(client, runId), toolInvocationId);
44
+ }
45
+ if (!interrupt)
46
+ throw new Error(`Tool call ${toolInvocationId} is not awaiting approval`);
47
+ return interrupt.id;
48
+ };
32
49
  let prevChatWasBusy = false;
33
50
  // Bumped by every streamChat() and stopStream(). A stream whose generation
34
51
  // is no longer current (stopped, reset, switched to another chat) leaves
@@ -453,7 +470,7 @@ export function createActions(ctx) {
453
470
  },
454
471
  approveTool: async (toolInvocationId) => {
455
472
  try {
456
- await api.approveTool(client, toolInvocationId);
473
+ await api.resolveInterrupt(client, await approvalInterruptId(toolInvocationId), 'allow');
457
474
  }
458
475
  catch (error) {
459
476
  console.error('[AgentSDK] Failed to approve tool:', error);
@@ -466,7 +483,7 @@ export function createActions(ctx) {
466
483
  },
467
484
  rejectTool: async (toolInvocationId, reason) => {
468
485
  try {
469
- await api.rejectTool(client, toolInvocationId, reason);
486
+ await api.resolveInterrupt(client, await approvalInterruptId(toolInvocationId), 'deny', reason);
470
487
  }
471
488
  catch (error) {
472
489
  console.error('[AgentSDK] Failed to reject tool:', error);
@@ -46,24 +46,6 @@ export declare function submitToolResult(client: AgentClient, toolInvocationId:
46
46
  };
47
47
  form_data?: Record<string, unknown>;
48
48
  }, attachments?: FileRef[]): Promise<void>;
49
- /**
50
- * Approve a call awaiting approval; the api then runs it.
51
- *
52
- * Needs approvals:write, which only the account holder's own sign-in holds
53
- * (the web app, or a `belt login` session). An API key, an app's OAuth token
54
- * or the server proxy is refused with 403 `requires_sign_in`
55
- * (ErrorCodeRequiresSignIn); the error's message says what to do.
56
- */
57
- export declare function approveTool(client: AgentClient, toolInvocationId: string): Promise<void>;
58
- /**
59
- * Reject a call awaiting approval, with an optional reason the agent sees.
60
- *
61
- * Needs approvals:write, which only the account holder's own sign-in holds
62
- * (the web app, or a `belt login` session). An API key, an app's OAuth token
63
- * or the server proxy is refused with 403 `requires_sign_in`
64
- * (ErrorCodeRequiresSignIn); the error's message says what to do.
65
- */
66
- export declare function rejectTool(client: AgentClient, toolInvocationId: string, reason?: string): Promise<void>;
67
49
  /**
68
50
  * What "always allow" can save for a call awaiting approval, narrowest first.
69
51
  * The api computes the options from the call; each one, saved, answers it again.
@@ -94,14 +76,16 @@ export declare function explainTool(client: AgentClient, chatId: string, toolInv
94
76
  */
95
77
  export declare function updateChatSettings(client: AgentClient, chatId: string, settings: ChatSettingsRequest): Promise<ChatSettingsDTO>;
96
78
  /**
97
- * Allow or deny an interrupt gate on an agent run.
79
+ * Allow or deny an interrupt on an agent run: a tool call waiting for
80
+ * approval, a wait, a hook gate or a held turn, all the same way. `reason`,
81
+ * with deny, goes back to the agent with the refused call.
98
82
  *
99
83
  * Needs approvals:write, which only the account holder's own sign-in holds
100
84
  * (the web app, or a `belt login` session). An API key, an app's OAuth token
101
85
  * or the server proxy is refused with 403 `requires_sign_in`
102
86
  * (ErrorCodeRequiresSignIn); the error's message says what to do.
103
87
  */
104
- export declare function resolveInterrupt(client: AgentClient, interruptId: string, decision: 'allow' | 'deny'): Promise<InterruptDTO>;
88
+ export declare function resolveInterrupt(client: AgentClient, interruptId: string, decision: 'allow' | 'deny', reason?: string): Promise<InterruptDTO>;
105
89
  export declare function listRunInterrupts(client: AgentClient, runId: string): Promise<InterruptDTO[]>;
106
90
  export declare function uploadFile(client: AgentClient, file: globalThis.File): Promise<FileRef>;
107
91
  export declare function chatStreamRequest(client: AgentClient, chatId: string): StreamRequest;
package/dist/agent/api.js CHANGED
@@ -151,28 +151,6 @@ export async function submitToolResult(client, toolInvocationId, resultOrAction,
151
151
  }
152
152
  await client.http.request('post', `/tools/${toolInvocationId}`, { data });
153
153
  }
154
- /**
155
- * Approve a call awaiting approval; the api then runs it.
156
- *
157
- * Needs approvals:write, which only the account holder's own sign-in holds
158
- * (the web app, or a `belt login` session). An API key, an app's OAuth token
159
- * or the server proxy is refused with 403 `requires_sign_in`
160
- * (ErrorCodeRequiresSignIn); the error's message says what to do.
161
- */
162
- export async function approveTool(client, toolInvocationId) {
163
- await client.http.request('post', `/tools/${toolInvocationId}/invoke`);
164
- }
165
- /**
166
- * Reject a call awaiting approval, with an optional reason the agent sees.
167
- *
168
- * Needs approvals:write, which only the account holder's own sign-in holds
169
- * (the web app, or a `belt login` session). An API key, an app's OAuth token
170
- * or the server proxy is refused with 403 `requires_sign_in`
171
- * (ErrorCodeRequiresSignIn); the error's message says what to do.
172
- */
173
- export async function rejectTool(client, toolInvocationId, reason) {
174
- await client.http.request('post', `/tools/${toolInvocationId}/reject`, { data: { reason } });
175
- }
176
154
  /**
177
155
  * What "always allow" can save for a call awaiting approval, narrowest first.
178
156
  * The api computes the options from the call; each one, saved, answers it again.
@@ -219,16 +197,18 @@ export async function updateChatSettings(client, chatId, settings) {
219
197
  // Interrupt operations
220
198
  // =========================================================================
221
199
  /**
222
- * Allow or deny an interrupt gate on an agent run.
200
+ * Allow or deny an interrupt on an agent run: a tool call waiting for
201
+ * approval, a wait, a hook gate or a held turn, all the same way. `reason`,
202
+ * with deny, goes back to the agent with the refused call.
223
203
  *
224
204
  * Needs approvals:write, which only the account holder's own sign-in holds
225
205
  * (the web app, or a `belt login` session). An API key, an app's OAuth token
226
206
  * or the server proxy is refused with 403 `requires_sign_in`
227
207
  * (ErrorCodeRequiresSignIn); the error's message says what to do.
228
208
  */
229
- export async function resolveInterrupt(client, interruptId, decision) {
209
+ export async function resolveInterrupt(client, interruptId, decision, reason) {
230
210
  const resp = await client.http.request('post', `/interrupts/${interruptId}/resolve`, {
231
- data: { decision }
211
+ data: reason ? { decision, data: { reason } } : { decision }
232
212
  });
233
213
  return resp.data;
234
214
  }
@@ -134,7 +134,8 @@ export interface AgentChatActions {
134
134
  /** Answer an MCP tool call's input requests (AwaitingInput status with MCPInputState data) */
135
135
  submitMCPInput: (toolInvocationId: string, responses: Record<string, ElicitResult>) => Promise<void>;
136
136
  /**
137
- * Approve a tool (for HIL approval - AwaitingApproval status)
137
+ * Approve a tool (for HIL approval - AwaitingApproval status). Resolves the
138
+ * call's interrupt with allow, as resolveInterrupt does for every pause.
138
139
  *
139
140
  * Needs the account holder's own sign-in (approvals:write): with an API
140
141
  * key, an app's token or the server proxy it rejects with 403
@@ -142,7 +143,8 @@ export interface AgentChatActions {
142
143
  */
143
144
  approveTool: (toolInvocationId: string) => Promise<void>;
144
145
  /**
145
- * Reject a tool (for HIL approval - AwaitingApproval status)
146
+ * Reject a tool (for HIL approval - AwaitingApproval status). Resolves the
147
+ * call's interrupt with deny; `reason` goes back to the agent.
146
148
  *
147
149
  * Needs the account holder's own sign-in (approvals:write): with an API
148
150
  * key, an app's token or the server proxy it rejects with 403
@@ -219,13 +219,15 @@ export declare class AgentsAPI {
219
219
  form_data?: Record<string, unknown>;
220
220
  }, attachments?: FileRef[]): Promise<void>;
221
221
  /**
222
- * Resolve an interrupt gate on an agent run.
222
+ * Resolve an interrupt on an agent run: a tool call waiting for approval, a
223
+ * wait, a hook gate or a held turn, all the same way. `reason`, with deny,
224
+ * goes back to the agent with the refused call.
223
225
  *
224
226
  * Needs approvals:write, which only the account holder's own sign-in holds:
225
227
  * with an API key, an app's OAuth token or the server proxy it rejects with
226
228
  * 403 `requires_sign_in` (ErrorCodeRequiresSignIn).
227
229
  */
228
- resolveInterrupt(interruptId: string, decision: 'allow' | 'deny'): Promise<Response<InterruptDTO>>;
230
+ resolveInterrupt(interruptId: string, decision: 'allow' | 'deny', reason?: string): Promise<Response<InterruptDTO>>;
229
231
  /**
230
232
  * List pending interrupts for an agent run
231
233
  */
@@ -522,15 +522,17 @@ export class AgentsAPI {
522
522
  await this.http.request('post', `/tools/${toolInvocationId}`, { data });
523
523
  }
524
524
  /**
525
- * Resolve an interrupt gate on an agent run.
525
+ * Resolve an interrupt on an agent run: a tool call waiting for approval, a
526
+ * wait, a hook gate or a held turn, all the same way. `reason`, with deny,
527
+ * goes back to the agent with the refused call.
526
528
  *
527
529
  * Needs approvals:write, which only the account holder's own sign-in holds:
528
530
  * with an API key, an app's OAuth token or the server proxy it rejects with
529
531
  * 403 `requires_sign_in` (ErrorCodeRequiresSignIn).
530
532
  */
531
- async resolveInterrupt(interruptId, decision) {
533
+ async resolveInterrupt(interruptId, decision, reason) {
532
534
  return this.http.request('post', `/interrupts/${interruptId}/resolve`, {
533
- data: { decision }
535
+ data: reason ? { decision, data: { reason } } : { decision }
534
536
  });
535
537
  }
536
538
  /**
package/dist/index.d.ts CHANGED
@@ -36,8 +36,8 @@ export type { ClientTool, ClientToolHandler, ClientToolResult } from './tool-bui
36
36
  export { lifecycleHook, learningHooks } from './hook-builder.js';
37
37
  export type { LifecycleHookBuilder } from './hook-builder.js';
38
38
  export { DeltaAccumulator, createLLMDeltaAccumulator, type DeltaEvent, type FieldTags, type FieldTagsRegistry } from './delta.js';
39
- export { parseStatus, isTerminalStatus, isChatBusy, isAwaitingHuman, isRunTerminal, isRunInterrupted, isRunSettled, isRunWorking, isMessageTerminal, pendingApprovals, heldTurn, } from './utils.js';
40
- export type { PendingApproval, HeldTurn } from './utils.js';
39
+ export { parseStatus, isTerminalStatus, isChatBusy, isAwaitingHuman, isRunTerminal, isRunInterrupted, isRunSettled, isRunWorking, isMessageTerminal, pendingApprovals, heldTurn, pendingWait, } from './utils.js';
40
+ export type { PendingApproval, HeldTurn, PendingWait } from './utils.js';
41
41
  export * from './types.js';
42
42
  export type { TaskDTO as Task } from './types.js';
43
43
  import { HttpClient, type HttpClientConfig } from './http/client.js';
package/dist/index.js CHANGED
@@ -38,7 +38,7 @@ export { lifecycleHook, learningHooks } from './hook-builder.js';
38
38
  // Delta accumulator for streaming responses
39
39
  export { DeltaAccumulator, createLLMDeltaAccumulator } from './delta.js';
40
40
  // Status utilities (handle both int and string status values)
41
- export { parseStatus, isTerminalStatus, isChatBusy, isAwaitingHuman, isRunTerminal, isRunInterrupted, isRunSettled, isRunWorking, isMessageTerminal, pendingApprovals, heldTurn, } from './utils.js';
41
+ export { parseStatus, isTerminalStatus, isChatBusy, isAwaitingHuman, isRunTerminal, isRunInterrupted, isRunSettled, isRunWorking, isMessageTerminal, pendingApprovals, heldTurn, pendingWait, } from './utils.js';
42
42
  // Types - includes TaskStatus constants and all DTOs
43
43
  export * from './types.js';
44
44
  // =============================================================================
package/dist/types.d.ts CHANGED
@@ -17,6 +17,7 @@ export interface InternalToolsConfig {
17
17
  agent?: boolean;
18
18
  remote?: boolean;
19
19
  knowledge?: boolean;
20
+ wait?: boolean;
20
21
  }
21
22
  /**
22
23
  * AgentPermissions is what an agent's new chats in its own workspace may do
@@ -43,6 +44,11 @@ export interface AgentTool {
43
44
  description: string;
44
45
  type: ToolType;
45
46
  require_approval?: boolean;
47
+ /**
48
+ * ApprovalTimeout is how many seconds a call of this tool waits for its
49
+ * approval before it is refused. 0 waits until someone answers.
50
+ */
51
+ approval_timeout?: number;
46
52
  app?: AppToolConfig;
47
53
  agent?: AgentToolConfig;
48
54
  hook?: HookToolConfig;
@@ -97,6 +103,7 @@ export interface AgentToolDTO {
97
103
  description: string;
98
104
  type: ToolType;
99
105
  require_approval?: boolean;
106
+ approval_timeout?: number;
100
107
  app?: AppToolConfigDTO;
101
108
  agent?: AgentToolConfigDTO;
102
109
  hook?: HookToolConfigDTO;
@@ -5080,7 +5087,13 @@ export interface TaskLog {
5080
5087
  }
5081
5088
  /**
5082
5089
  * TaskDTO is the full API response for a task.
5090
+ * TaskEgress is what a task's sandbox sent to and received from the
5091
+ * internet through the engine's egress gateway, in bytes.
5083
5092
  */
5093
+ export interface TaskEgress {
5094
+ bytes_out: number;
5095
+ bytes_in: number;
5096
+ }
5084
5097
  export interface TaskDTO extends BaseModelDTO, PermissionModelDTO {
5085
5098
  graph_id?: string;
5086
5099
  user_public_key: string;
@@ -5114,6 +5127,12 @@ export interface TaskDTO extends BaseModelDTO, PermissionModelDTO {
5114
5127
  events: TaskEvent[];
5115
5128
  logs: TaskLog[];
5116
5129
  usage_events: (UsageEventDTO | undefined)[];
5130
+ /**
5131
+ * Egress is what the task's sandbox moved through the engine's egress
5132
+ * gateway, reported by the engine when the task ended. Absent for a
5133
+ * task that ran without the gateway.
5134
+ */
5135
+ egress?: TaskEgress;
5117
5136
  session_id?: string;
5118
5137
  session_timeout?: number;
5119
5138
  }
@@ -6711,6 +6730,13 @@ export declare const GraphEdgeTypeOutput: GraphEdgeType;
6711
6730
  * allow starts the turn, a deny ends the run.
6712
6731
  */
6713
6732
  export declare const InterruptResourceTurn: InterruptResourceType;
6733
+ /**
6734
+ * InterruptReasonWait is a tool call the agent made to wait: the run is
6735
+ * paused until the interrupt's deadline, when its own expiry trigger settles
6736
+ * it (allow), or until a person ends the wait sooner. Its resource is the
6737
+ * wait call (InterruptResourceToolInvocation).
6738
+ */
6739
+ export declare const InterruptReasonWait: InterruptReason;
6714
6740
  /**
6715
6741
  * MergeStrategy defines how a delta field should be merged by consumers.
6716
6742
  */
@@ -7841,7 +7867,7 @@ export declare const AgentRunStateRejected: AgentRunState;
7841
7867
  * InterruptReason describes why an agent run is in an interrupted state.
7842
7868
  * Aligns with AG-UI interrupt outcome reasons.
7843
7869
  */
7844
- export type InterruptReason = "tool_approval" | "client_tool" | "widget" | "auth" | "confirmation" | "hook_gate";
7870
+ export type InterruptReason = "wait" | "tool_approval" | "client_tool" | "widget" | "auth" | "confirmation" | "hook_gate";
7845
7871
  export declare const InterruptReasonToolApproval: InterruptReason;
7846
7872
  export declare const InterruptReasonClientTool: InterruptReason;
7847
7873
  export declare const InterruptReasonWidget: InterruptReason;
package/dist/types.js CHANGED
@@ -992,6 +992,13 @@ export const GraphEdgeTypeOutput = "output";
992
992
  * allow starts the turn, a deny ends the run.
993
993
  */
994
994
  export const InterruptResourceTurn = "turn";
995
+ /**
996
+ * InterruptReasonWait is a tool call the agent made to wait: the run is
997
+ * paused until the interrupt's deadline, when its own expiry trigger settles
998
+ * it (allow), or until a person ends the wait sooner. Its resource is the
999
+ * wait call (InterruptResourceToolInvocation).
1000
+ */
1001
+ export const InterruptReasonWait = "wait";
995
1002
  export const MergeStrategyConcat = "concat";
996
1003
  export const MergeStrategyReplace = "replace";
997
1004
  export const MergeStrategyIndexed = "indexed";
package/dist/utils.d.ts CHANGED
@@ -49,3 +49,16 @@ export type HeldTurn = {
49
49
  };
50
50
  /** The held turn among a run's pending interrupts, if one is held. */
51
51
  export declare function heldTurn(interrupts: InterruptDTO[] | null | undefined): HeldTurn | null;
52
+ /** The interrupt a tool call awaiting approval waits on, among a chat's or a run's pending interrupts. */
53
+ export declare function approvalInterrupt(interrupts: InterruptDTO[] | null | undefined, toolInvocationId: string): InterruptDTO | undefined;
54
+ /** A run paused by its agent's wait tool (InterruptReasonWait): it continues at `until`, or sooner when the person ends the wait ("continue now", allow) or cancels it (deny). */
55
+ export type PendingWait = {
56
+ interruptId: string;
57
+ runId: string;
58
+ /** When the wait ends, RFC3339; null when the api gives no deadline. */
59
+ until: string | null;
60
+ /** What the agent said it will do when the wait ends. */
61
+ note: string;
62
+ };
63
+ /** The wait among a run's pending interrupts, if the run is waiting. */
64
+ export declare function pendingWait(interrupts: InterruptDTO[] | null | undefined): PendingWait | null;
package/dist/utils.js CHANGED
@@ -2,7 +2,7 @@
2
2
  * Status utilities for handling both int and string-based status values.
3
3
  * Provides future compatibility when API migrates from int to string status.
4
4
  */
5
- import { InterruptReasonToolApproval, InterruptResourceTurn, InterruptStatusPending } from './types.js';
5
+ import { InterruptReasonToolApproval, InterruptReasonWait, InterruptResourceTurn, InterruptStatusPending } from './types.js';
6
6
  import { TaskStatusUnknown, TaskStatusReceived, TaskStatusQueued, TaskStatusDispatched, TaskStatusPreparing, TaskStatusServing, TaskStatusSettingUp, TaskStatusRunning, TaskStatusCancelling, TaskStatusUploading, TaskStatusCompleted, TaskStatusFailed, TaskStatusCancelled, TaskStatusRejected, AgentRunStateWorking, AgentRunStateSubmitted, AgentRunStateInputRequired, AgentRunStateAuthRequired, AgentRunStateCompleted, AgentRunStateFailed, AgentRunStateCanceled, AgentRunStateRejected, ChatMessageStatusReady, ChatMessageStatusFailed, ChatMessageStatusCancelled, ChatStatusBusy, ChatStatusAwaitingInput, } from './types.js';
7
7
  /** Map string status names to TaskStatus values (for future string-based API) */
8
8
  const STATUS_STRING_MAP = {
@@ -117,11 +117,27 @@ export function pendingApprovals(chat) {
117
117
  }
118
118
  return out;
119
119
  }
120
+ /** The first pending interrupt among a run's that matches. */
121
+ function pendingInterrupt(interrupts, match) {
122
+ return interrupts?.find(i => i.status === InterruptStatusPending && match(i));
123
+ }
120
124
  /** The held turn among a run's pending interrupts, if one is held. */
121
125
  export function heldTurn(interrupts) {
122
- const interrupt = interrupts?.find(i => i.resource_type === InterruptResourceTurn && i.status === InterruptStatusPending);
126
+ const interrupt = pendingInterrupt(interrupts, i => i.resource_type === InterruptResourceTurn);
123
127
  if (!interrupt)
124
128
  return null;
125
129
  const { steps } = parseMeta(interrupt);
126
130
  return { interruptId: interrupt.id, runId: interrupt.run_id, steps: typeof steps === 'number' ? steps : null };
127
131
  }
132
+ /** The interrupt a tool call awaiting approval waits on, among a chat's or a run's pending interrupts. */
133
+ export function approvalInterrupt(interrupts, toolInvocationId) {
134
+ return pendingInterrupt(interrupts, i => i.reason === InterruptReasonToolApproval && (i.resource_id || parseMeta(i).tool_invocation_id) === toolInvocationId);
135
+ }
136
+ /** The wait among a run's pending interrupts, if the run is waiting. */
137
+ export function pendingWait(interrupts) {
138
+ const interrupt = pendingInterrupt(interrupts, i => i.reason === InterruptReasonWait);
139
+ if (!interrupt)
140
+ return null;
141
+ const { note } = parseMeta(interrupt);
142
+ return { interruptId: interrupt.id, runId: interrupt.run_id, until: interrupt.expires_at ?? null, note: typeof note === 'string' ? note : '' };
143
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inferencesh/sdk",
3
- "version": "0.30.0",
3
+ "version": "0.32.0",
4
4
  "description": "Official JavaScript/TypeScript SDK for inference.sh - Run AI models with a simple API",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",