@agent-os-sdk/client 0.3.14 → 0.4.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.
Files changed (66) hide show
  1. package/dist/client/AgentOsClient.d.ts.map +1 -1
  2. package/dist/client/AgentOsClient.js +4 -5
  3. package/dist/client/config.d.ts +49 -0
  4. package/dist/client/config.d.ts.map +1 -0
  5. package/dist/client/config.js +62 -0
  6. package/dist/client/pagination.d.ts +105 -0
  7. package/dist/client/pagination.d.ts.map +1 -0
  8. package/dist/client/pagination.js +117 -0
  9. package/dist/client/raw.d.ts +65 -0
  10. package/dist/client/raw.d.ts.map +1 -1
  11. package/dist/client/raw.js +78 -17
  12. package/dist/client/retry.d.ts +37 -0
  13. package/dist/client/retry.d.ts.map +1 -0
  14. package/dist/client/retry.js +108 -0
  15. package/dist/client/timeout.d.ts +26 -0
  16. package/dist/client/timeout.d.ts.map +1 -0
  17. package/dist/client/timeout.js +51 -0
  18. package/dist/errors/factory.d.ts +20 -0
  19. package/dist/errors/factory.d.ts.map +1 -0
  20. package/dist/errors/factory.js +97 -0
  21. package/dist/errors/index.d.ts +210 -0
  22. package/dist/errors/index.d.ts.map +1 -0
  23. package/dist/errors/index.js +283 -0
  24. package/dist/index.d.ts +11 -3
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +26 -0
  27. package/dist/modules/audit.d.ts +27 -4
  28. package/dist/modules/audit.d.ts.map +1 -1
  29. package/dist/modules/audit.js +58 -2
  30. package/dist/modules/catalog.d.ts +28 -4
  31. package/dist/modules/catalog.d.ts.map +1 -1
  32. package/dist/modules/catalog.js +15 -1
  33. package/dist/modules/checkpoints.d.ts +1 -1
  34. package/dist/modules/checkpoints.d.ts.map +1 -1
  35. package/dist/modules/info.d.ts +49 -0
  36. package/dist/modules/info.d.ts.map +1 -1
  37. package/dist/modules/info.js +66 -0
  38. package/dist/modules/runs.d.ts +103 -0
  39. package/dist/modules/runs.d.ts.map +1 -1
  40. package/dist/modules/runs.js +258 -0
  41. package/dist/modules/tenants.d.ts +4 -1
  42. package/dist/modules/tenants.d.ts.map +1 -1
  43. package/dist/modules/tenants.js +3 -0
  44. package/dist/modules/threads.d.ts +24 -0
  45. package/dist/modules/threads.d.ts.map +1 -1
  46. package/dist/modules/threads.js +48 -1
  47. package/dist/sse/client.d.ts.map +1 -1
  48. package/dist/sse/client.js +17 -5
  49. package/package.json +1 -1
  50. package/src/client/AgentOsClient.ts +4 -7
  51. package/src/client/config.ts +100 -0
  52. package/src/client/pagination.ts +218 -0
  53. package/src/client/raw.ts +138 -17
  54. package/src/client/retry.ts +150 -0
  55. package/src/client/timeout.ts +59 -0
  56. package/src/errors/factory.ts +135 -0
  57. package/src/errors/index.ts +365 -0
  58. package/src/index.ts +72 -2
  59. package/src/modules/audit.ts +77 -6
  60. package/src/modules/catalog.ts +38 -5
  61. package/src/modules/checkpoints.ts +1 -1
  62. package/src/modules/info.ts +108 -0
  63. package/src/modules/runs.ts +333 -0
  64. package/src/modules/tenants.ts +5 -2
  65. package/src/modules/threads.ts +57 -1
  66. package/src/sse/client.ts +21 -5
@@ -1 +1 @@
1
- {"version":3,"file":"threads.d.ts","sourceRoot":"","sources":["../../src/modules/threads.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"threads.d.ts","sourceRoot":"","sources":["../../src/modules/threads.ts"],"names":[],"mappings":"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"}
@@ -21,12 +21,22 @@ export class ThreadsModule {
21
21
  * @example
22
22
  * ```ts
23
23
  * const { data: thread } = await client.threads.create();
24
+ *
25
+ * // With idempotency (safe to retry)
26
+ * const { data: thread } = await client.threads.create({
27
+ * idempotency_key: "my-unique-key"
28
+ * });
24
29
  * ```
25
30
  */
26
31
  async create(body) {
32
+ // Send Idempotency-Key in HEADER (enterprise standard) + body (backend compat)
33
+ const headers = { ...this.headers() };
34
+ if (body?.idempotency_key) {
35
+ headers["Idempotency-Key"] = body.idempotency_key;
36
+ }
27
37
  return this.client.POST("/v1/api/threads", {
28
38
  body: body ?? {},
29
- headers: this.headers(),
39
+ headers,
30
40
  });
31
41
  }
32
42
  /**
@@ -55,6 +65,43 @@ export class ThreadsModule {
55
65
  headers: this.headers(),
56
66
  });
57
67
  }
68
+ /**
69
+ * Iterate through all threads with automatic pagination.
70
+ *
71
+ * @example
72
+ * ```ts
73
+ * for await (const thread of client.threads.iterate()) {
74
+ * console.log(thread.id);
75
+ * }
76
+ * ```
77
+ */
78
+ async *iterate(filters, options) {
79
+ const pageSize = options?.pageSize ?? 100;
80
+ const maxItems = options?.maxItems ?? Infinity;
81
+ let offset = 0;
82
+ let yielded = 0;
83
+ let hasMore = true;
84
+ while (hasMore && yielded < maxItems) {
85
+ if (options?.signal?.aborted)
86
+ return;
87
+ const response = await this.list({
88
+ ...filters,
89
+ limit: Math.min(pageSize, maxItems - yielded),
90
+ offset,
91
+ });
92
+ if (response.error)
93
+ throw response.error;
94
+ const data = response.data;
95
+ for (const thread of data.items) {
96
+ if (yielded >= maxItems)
97
+ return;
98
+ yield thread;
99
+ yielded++;
100
+ }
101
+ offset += data.items.length;
102
+ hasMore = offset < data.total && data.items.length > 0;
103
+ }
104
+ }
58
105
  /**
59
106
  * Delete a thread.
60
107
  */
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/sse/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/sse/client.ts"],"names":[],"mappings":"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"}
@@ -31,6 +31,8 @@ export async function* parseSSE(response, options) {
31
31
  const reader = response.body.getReader();
32
32
  const decoder = new TextDecoder();
33
33
  let buffer = "";
34
+ // State must be maintained across chunks
35
+ let currentEvent = { event: "message" };
34
36
  try {
35
37
  while (true) {
36
38
  const { done, value } = await reader.read();
@@ -38,15 +40,29 @@ export async function* parseSSE(response, options) {
38
40
  break;
39
41
  buffer += decoder.decode(value, { stream: true });
40
42
  const lines = buffer.split("\n");
43
+ // Keep the last partial line in the buffer
41
44
  buffer = lines.pop() ?? "";
42
- let currentEvent = { event: "message" };
43
45
  for (const line of lines) {
46
+ const trimmed = line.trim();
47
+ if (trimmed === "") {
48
+ // Empty line triggers event dispatch if we have data
49
+ if (currentEvent.data !== undefined) {
50
+ yield currentEvent;
51
+ }
52
+ // Reset for next event
53
+ currentEvent = { event: "message" };
54
+ continue;
55
+ }
44
56
  if (line.startsWith("event:")) {
45
57
  currentEvent.event = line.slice(6).trim();
46
58
  }
47
59
  else if (line.startsWith("data:")) {
48
60
  const dataStr = line.slice(5).trim();
49
61
  try {
62
+ // Accumulate data if meaningful (though standard SSE usually has one data line per event,
63
+ // multiline data is possible but rare in this specific protocol.
64
+ // For simplicity and matching current backend, we overwrite or concatenation check could be stricter).
65
+ // Given strict JSON protocol, we assume valid info per data line or single data line.
50
66
  currentEvent.data = JSON.parse(dataStr);
51
67
  }
52
68
  catch {
@@ -59,10 +75,6 @@ export async function* parseSSE(response, options) {
59
75
  else if (line.startsWith("retry:")) {
60
76
  currentEvent.retry = parseInt(line.slice(6).trim(), 10);
61
77
  }
62
- else if (line === "" && currentEvent.data !== undefined) {
63
- yield currentEvent;
64
- currentEvent = { event: "message" };
65
- }
66
78
  }
67
79
  }
68
80
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-os-sdk/client",
3
- "version": "0.3.14",
3
+ "version": "0.4.0",
4
4
  "description": "Official TypeScript SDK for Agent OS platform",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -264,14 +264,11 @@ export class AgentOsClient {
264
264
  headers["Authorization"] = `Bearer ${token}`;
265
265
  }
266
266
 
267
- // CRITICAL: Workspace ID is REQUIRED for JWT auth
268
- if (!workspaceId) {
269
- throw new Error(
270
- "[AgentOS SDK] No active workspace selected. " +
271
- "Call getWorkspaceId() must return a valid workspace ID."
272
- );
267
+ // Workspace ID is optional for bootstrap endpoints (e.g., /me)
268
+ // Most endpoints require it, but the header provider allows empty strings
269
+ if (workspaceId) {
270
+ headers["X-Workspace-Id"] = workspaceId;
273
271
  }
274
- headers["X-Workspace-Id"] = workspaceId;
275
272
  // NO X-Tenant-Id (backend derives from workspace membership)
276
273
  }
277
274
 
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Agent OS SDK - Network Configuration
3
+ *
4
+ * Centralized configuration for timeouts, retries, and network policies.
5
+ */
6
+
7
+ /**
8
+ * Retry configuration for network requests.
9
+ */
10
+ export interface RetryConfig {
11
+ /** Maximum retry attempts (default: 3) */
12
+ maxRetries: number;
13
+
14
+ /** Base delay between retries in ms (default: 1000) */
15
+ baseDelayMs: number;
16
+
17
+ /** Maximum delay between retries in ms (default: 30000) */
18
+ maxDelayMs: number;
19
+
20
+ /** Jitter factor to prevent thundering herd (0-1, default: 0.2) */
21
+ jitterFactor: number;
22
+
23
+ /** HTTP status codes that trigger retry (default: [408, 429, 500, 502, 503, 504]) */
24
+ retryableStatuses: number[];
25
+ }
26
+
27
+ /**
28
+ * Full network configuration for the SDK client.
29
+ */
30
+ export interface NetworkConfig {
31
+ /** Timeout per request attempt in milliseconds (default: 30000) */
32
+ timeoutMs: number;
33
+
34
+ /** Retry configuration */
35
+ retry: RetryConfig;
36
+ }
37
+
38
+ /**
39
+ * Default network configuration.
40
+ * Balanced for most use cases - 30s timeout, 3 retries with exponential backoff.
41
+ */
42
+ export const DEFAULT_NETWORK_CONFIG: NetworkConfig = {
43
+ timeoutMs: 30_000,
44
+ retry: {
45
+ maxRetries: 3,
46
+ baseDelayMs: 1_000,
47
+ maxDelayMs: 30_000,
48
+ jitterFactor: 0.2,
49
+ retryableStatuses: [408, 429, 500, 502, 503, 504],
50
+ },
51
+ };
52
+
53
+ /**
54
+ * Aggressive configuration for interactive UIs.
55
+ * Shorter timeouts, fewer retries.
56
+ */
57
+ export const INTERACTIVE_NETWORK_CONFIG: NetworkConfig = {
58
+ timeoutMs: 10_000,
59
+ retry: {
60
+ maxRetries: 1,
61
+ baseDelayMs: 500,
62
+ maxDelayMs: 5_000,
63
+ jitterFactor: 0.1,
64
+ retryableStatuses: [429, 503, 504],
65
+ },
66
+ };
67
+
68
+ /**
69
+ * Patient configuration for background jobs.
70
+ * Longer timeouts, more retries.
71
+ */
72
+ export const BACKGROUND_NETWORK_CONFIG: NetworkConfig = {
73
+ timeoutMs: 120_000,
74
+ retry: {
75
+ maxRetries: 5,
76
+ baseDelayMs: 2_000,
77
+ maxDelayMs: 60_000,
78
+ jitterFactor: 0.3,
79
+ retryableStatuses: [408, 429, 500, 502, 503, 504],
80
+ },
81
+ };
82
+
83
+ /**
84
+ * Merges user config with defaults.
85
+ */
86
+ export function mergeNetworkConfig(
87
+ userConfig?: Partial<NetworkConfig>
88
+ ): NetworkConfig {
89
+ if (!userConfig) {
90
+ return DEFAULT_NETWORK_CONFIG;
91
+ }
92
+
93
+ return {
94
+ timeoutMs: userConfig.timeoutMs ?? DEFAULT_NETWORK_CONFIG.timeoutMs,
95
+ retry: {
96
+ ...DEFAULT_NETWORK_CONFIG.retry,
97
+ ...userConfig.retry,
98
+ },
99
+ };
100
+ }
@@ -0,0 +1,218 @@
1
+ /**
2
+ * Agent OS SDK - Pagination Utilities
3
+ *
4
+ * Auto-paginating iterators that support both offset and cursor pagination.
5
+ * Designed to work with any list endpoint.
6
+ */
7
+
8
+ import type { APIResponse } from "./raw.js";
9
+
10
+ // ============================================================================
11
+ // Response Types
12
+ // ============================================================================
13
+
14
+ /**
15
+ * Offset-based paginated response.
16
+ * Most common format for list endpoints.
17
+ */
18
+ export interface OffsetPaginatedResponse<T> {
19
+ items: T[];
20
+ total: number;
21
+ }
22
+
23
+ /**
24
+ * Cursor-based paginated response.
25
+ * Better for large datasets and real-time consistency.
26
+ */
27
+ export interface CursorPaginatedResponse<T> {
28
+ items: T[];
29
+ next_cursor?: string;
30
+ has_more: boolean;
31
+ }
32
+
33
+ /**
34
+ * Union type for both pagination styles.
35
+ */
36
+ export type PaginatedResponse<T> =
37
+ | OffsetPaginatedResponse<T>
38
+ | CursorPaginatedResponse<T>;
39
+
40
+ // ============================================================================
41
+ // Parameter Types
42
+ // ============================================================================
43
+
44
+ /**
45
+ * Offset pagination parameters.
46
+ */
47
+ export interface OffsetParams {
48
+ limit?: number;
49
+ offset?: number;
50
+ }
51
+
52
+ /**
53
+ * Cursor pagination parameters.
54
+ */
55
+ export interface CursorParams {
56
+ limit?: number;
57
+ after?: string;
58
+ }
59
+
60
+ /**
61
+ * Combined pagination parameters.
62
+ */
63
+ export type PaginationParams = OffsetParams | CursorParams;
64
+
65
+ // ============================================================================
66
+ // Type Guards
67
+ // ============================================================================
68
+
69
+ /**
70
+ * Checks if response uses cursor pagination.
71
+ */
72
+ function isCursorResponse<T>(response: PaginatedResponse<T>): response is CursorPaginatedResponse<T> {
73
+ return "has_more" in response;
74
+ }
75
+
76
+ // ============================================================================
77
+ // Paginate Function
78
+ // ============================================================================
79
+
80
+ /**
81
+ * Options for pagination behavior.
82
+ */
83
+ export interface PaginateOptions {
84
+ /** Number of items per page (default: 100) */
85
+ pageSize?: number;
86
+
87
+ /** Maximum total items to fetch (default: unlimited) */
88
+ maxItems?: number;
89
+
90
+ /** AbortSignal for cancellation */
91
+ signal?: AbortSignal;
92
+ }
93
+
94
+ /**
95
+ * Creates an async iterator that automatically paginates through results.
96
+ * Supports both offset and cursor pagination transparently.
97
+ *
98
+ * @example
99
+ * // Basic usage
100
+ * for await (const run of paginate(
101
+ * (p) => client.runs.list(p),
102
+ * { status: "completed" }
103
+ * )) {
104
+ * console.log(run.id);
105
+ * }
106
+ *
107
+ * @example
108
+ * // With options
109
+ * for await (const agent of paginate(
110
+ * (p) => client.agents.list(p),
111
+ * { workspace_id: "ws_123" },
112
+ * { pageSize: 50, maxItems: 200 }
113
+ * )) {
114
+ * console.log(agent.name);
115
+ * }
116
+ */
117
+ export async function* paginate<T, P extends PaginationParams>(
118
+ fetchPage: (params: P) => Promise<APIResponse<PaginatedResponse<T>>>,
119
+ baseParams: Omit<P, "limit" | "offset" | "after">,
120
+ options?: PaginateOptions
121
+ ): AsyncGenerator<T, void, unknown> {
122
+ const pageSize = options?.pageSize ?? 100;
123
+ const maxItems = options?.maxItems ?? Infinity;
124
+ const signal = options?.signal;
125
+
126
+ let offset = 0;
127
+ let cursor: string | undefined;
128
+ let hasMore = true;
129
+ let yielded = 0;
130
+
131
+ while (hasMore && yielded < maxItems) {
132
+ // Check for cancellation
133
+ if (signal?.aborted) {
134
+ return;
135
+ }
136
+
137
+ // Build params based on pagination style
138
+ const params = {
139
+ ...baseParams,
140
+ limit: Math.min(pageSize, maxItems - yielded),
141
+ ...(cursor !== undefined ? { after: cursor } : { offset }),
142
+ } as P;
143
+
144
+ const response = await fetchPage(params);
145
+
146
+ if (response.error) {
147
+ throw response.error;
148
+ }
149
+
150
+ const data = response.data!;
151
+
152
+ for (const item of data.items) {
153
+ if (yielded >= maxItems) {
154
+ return;
155
+ }
156
+ yield item;
157
+ yielded++;
158
+ }
159
+
160
+ // Update pagination state based on response type
161
+ if (isCursorResponse(data)) {
162
+ cursor = data.next_cursor;
163
+ hasMore = data.has_more && data.items.length > 0;
164
+ } else {
165
+ offset += data.items.length;
166
+ hasMore = offset < data.total && data.items.length > 0;
167
+ }
168
+ }
169
+ }
170
+
171
+ // ============================================================================
172
+ // Collect Utility
173
+ // ============================================================================
174
+
175
+ /**
176
+ * Collects all items from a paginated endpoint into an array.
177
+ * Useful when you need all items at once.
178
+ *
179
+ * @example
180
+ * const allRuns = await collectAll(
181
+ * (p) => client.runs.list(p),
182
+ * { status: "completed" },
183
+ * { maxItems: 1000 }
184
+ * );
185
+ */
186
+ export async function collectAll<T, P extends PaginationParams>(
187
+ fetchPage: (params: P) => Promise<APIResponse<PaginatedResponse<T>>>,
188
+ baseParams: Omit<P, "limit" | "offset" | "after">,
189
+ options?: PaginateOptions
190
+ ): Promise<T[]> {
191
+ const items: T[] = [];
192
+
193
+ for await (const item of paginate(fetchPage, baseParams, options)) {
194
+ items.push(item);
195
+ }
196
+
197
+ return items;
198
+ }
199
+
200
+ /**
201
+ * Gets the first item from a paginated endpoint.
202
+ * More efficient than collecting all items when you only need one.
203
+ *
204
+ * @example
205
+ * const latestRun = await getFirst(
206
+ * (p) => client.runs.list({ ...p, order: "desc" }),
207
+ * { agent_id: "agent_123" }
208
+ * );
209
+ */
210
+ export async function getFirst<T, P extends PaginationParams>(
211
+ fetchPage: (params: P) => Promise<APIResponse<PaginatedResponse<T>>>,
212
+ baseParams: Omit<P, "limit" | "offset" | "after">
213
+ ): Promise<T | undefined> {
214
+ for await (const item of paginate(fetchPage, baseParams, { pageSize: 1, maxItems: 1 })) {
215
+ return item;
216
+ }
217
+ return undefined;
218
+ }