@blazingagents/sdk 0.1.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 (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +366 -0
  3. package/dist/chat-transport.d.ts +17 -0
  4. package/dist/chat-transport.js +58 -0
  5. package/dist/client.d.ts +38 -0
  6. package/dist/client.js +86 -0
  7. package/dist/contracts/api.d.ts +256 -0
  8. package/dist/contracts/api.js +189 -0
  9. package/dist/contracts/entities/agent-tools.d.ts +26 -0
  10. package/dist/contracts/entities/agent-tools.js +52 -0
  11. package/dist/contracts/entities/agents.d.ts +183 -0
  12. package/dist/contracts/entities/agents.js +153 -0
  13. package/dist/contracts/entities/artifacts.d.ts +71 -0
  14. package/dist/contracts/entities/artifacts.js +71 -0
  15. package/dist/contracts/entities/attribution.d.ts +27 -0
  16. package/dist/contracts/entities/attribution.js +27 -0
  17. package/dist/contracts/entities/chat.d.ts +269 -0
  18. package/dist/contracts/entities/chat.js +198 -0
  19. package/dist/contracts/entities/mcp-connections.d.ts +421 -0
  20. package/dist/contracts/entities/mcp-connections.js +473 -0
  21. package/dist/contracts/entities/memories.d.ts +56 -0
  22. package/dist/contracts/entities/memories.js +62 -0
  23. package/dist/contracts/entities/prompts.d.ts +61 -0
  24. package/dist/contracts/entities/prompts.js +96 -0
  25. package/dist/contracts/entities/providers.d.ts +123 -0
  26. package/dist/contracts/entities/providers.js +111 -0
  27. package/dist/contracts/entities/sessions.d.ts +156 -0
  28. package/dist/contracts/entities/sessions.js +120 -0
  29. package/dist/contracts/entities/skills.d.ts +167 -0
  30. package/dist/contracts/entities/skills.js +153 -0
  31. package/dist/contracts/entities/tasks.d.ts +457 -0
  32. package/dist/contracts/entities/tasks.js +252 -0
  33. package/dist/contracts/entities/tenants.d.ts +69 -0
  34. package/dist/contracts/entities/tenants.js +54 -0
  35. package/dist/contracts/entities/usage.d.ts +95 -0
  36. package/dist/contracts/entities/usage.js +117 -0
  37. package/dist/contracts/entities/workspaces.d.ts +89 -0
  38. package/dist/contracts/entities/workspaces.js +71 -0
  39. package/dist/contracts/ids.d.ts +57 -0
  40. package/dist/contracts/ids.js +79 -0
  41. package/dist/contracts/index.d.ts +15 -0
  42. package/dist/contracts/index.js +16 -0
  43. package/dist/contracts/limitations.d.ts +138 -0
  44. package/dist/contracts/limitations.js +140 -0
  45. package/dist/contracts/utils.d.ts +3 -0
  46. package/dist/contracts/utils.js +7 -0
  47. package/dist/errors.d.ts +33 -0
  48. package/dist/errors.js +48 -0
  49. package/dist/generation.d.ts +5 -0
  50. package/dist/generation.js +422 -0
  51. package/dist/http.d.ts +21 -0
  52. package/dist/http.js +307 -0
  53. package/dist/index.d.ts +20 -0
  54. package/dist/index.js +13 -0
  55. package/dist/relay.d.ts +20 -0
  56. package/dist/relay.js +113 -0
  57. package/dist/resources/agents.d.ts +8 -0
  58. package/dist/resources/agents.js +82 -0
  59. package/dist/resources/artifacts.d.ts +5 -0
  60. package/dist/resources/artifacts.js +29 -0
  61. package/dist/resources/mcp-connections.d.ts +2 -0
  62. package/dist/resources/mcp-connections.js +40 -0
  63. package/dist/resources/memories.d.ts +7 -0
  64. package/dist/resources/memories.js +33 -0
  65. package/dist/resources/prompts.d.ts +6 -0
  66. package/dist/resources/prompts.js +36 -0
  67. package/dist/resources/providers.d.ts +5 -0
  68. package/dist/resources/providers.js +38 -0
  69. package/dist/resources/sessions.d.ts +8 -0
  70. package/dist/resources/sessions.js +49 -0
  71. package/dist/resources/skills.d.ts +2 -0
  72. package/dist/resources/skills.js +49 -0
  73. package/dist/resources/tasks.d.ts +7 -0
  74. package/dist/resources/tasks.js +63 -0
  75. package/dist/resources/tenant.d.ts +6 -0
  76. package/dist/resources/tenant.js +19 -0
  77. package/dist/resources/usage.d.ts +7 -0
  78. package/dist/resources/usage.js +19 -0
  79. package/dist/resources/workspaces.d.ts +2 -0
  80. package/dist/resources/workspaces.js +31 -0
  81. package/dist/types.d.ts +381 -0
  82. package/dist/types.js +1 -0
  83. package/package.json +65 -0
@@ -0,0 +1,256 @@
1
+ import { z } from "zod";
2
+ export declare const clientRequestCorrelationSchema: z.ZodString;
3
+ export declare const apiErrorIssueSchema: z.ZodObject<{
4
+ code: z.ZodString;
5
+ location: z.ZodEnum<{
6
+ body: "body";
7
+ header: "header";
8
+ path: "path";
9
+ query: "query";
10
+ }>;
11
+ message: z.ZodString;
12
+ path: z.ZodString;
13
+ }, z.core.$strict>;
14
+ export type ApiErrorIssue = z.infer<typeof apiErrorIssueSchema>;
15
+ /**
16
+ * `/v1` error envelope — see docs/adr/0003-ai-sdk-native-wire-protocol.md.
17
+ * Closed producer code set; `code` is what SDKs switch on and `message` is
18
+ * human-only. Resource-specific codes preserve stable product outcomes that
19
+ * callers need to distinguish.
20
+ */
21
+ export declare const apiErrorCodeSchema: z.ZodEnum<{
22
+ admin_agent_managed: "admin_agent_managed";
23
+ agent_disabled: "agent_disabled";
24
+ agent_mcp_connection_not_found: "agent_mcp_connection_not_found";
25
+ agent_mcp_connections_invalid: "agent_mcp_connections_invalid";
26
+ agent_name_conflict: "agent_name_conflict";
27
+ agent_version_not_found: "agent_version_not_found";
28
+ api_key_limit_reached: "api_key_limit_reached";
29
+ artifact_session_cap_reached: "artifact_session_cap_reached";
30
+ checkout_evidence_mismatch: "checkout_evidence_mismatch";
31
+ internal: "internal";
32
+ invalid_cursor: "invalid_cursor";
33
+ invalid_request: "invalid_request";
34
+ mcp_connection_authentication_failed: "mcp_connection_authentication_failed";
35
+ mcp_connection_discovery_failed: "mcp_connection_discovery_failed";
36
+ mcp_connection_in_use: "mcp_connection_in_use";
37
+ mcp_connection_invalid: "mcp_connection_invalid";
38
+ mcp_connection_limit_reached: "mcp_connection_limit_reached";
39
+ mcp_connection_name_conflict: "mcp_connection_name_conflict";
40
+ mcp_connection_stale_credential_version: "mcp_connection_stale_credential_version";
41
+ mcp_connection_unreachable: "mcp_connection_unreachable";
42
+ message_not_found: "message_not_found";
43
+ model_discovery_unsupported: "model_discovery_unsupported";
44
+ model_not_found: "model_not_found";
45
+ model_validation_unavailable: "model_validation_unavailable";
46
+ not_found: "not_found";
47
+ prompt_limit_reached: "prompt_limit_reached";
48
+ prompt_name_conflict: "prompt_name_conflict";
49
+ prompt_variable_missing: "prompt_variable_missing";
50
+ prompt_variable_unknown: "prompt_variable_unknown";
51
+ provider_historical_use: "provider_historical_use";
52
+ provider_in_use: "provider_in_use";
53
+ provider_limit_reached: "provider_limit_reached";
54
+ provider_name_conflict: "provider_name_conflict";
55
+ provider_not_found: "provider_not_found";
56
+ provider_required: "provider_required";
57
+ quota_exceeded: "quota_exceeded";
58
+ rate_limited: "rate_limited";
59
+ service_unavailable: "service_unavailable";
60
+ session_busy: "session_busy";
61
+ session_version_mismatch: "session_version_mismatch";
62
+ skill_invalid_archive: "skill_invalid_archive";
63
+ skill_invalid_markdown: "skill_invalid_markdown";
64
+ skill_limit_reached: "skill_limit_reached";
65
+ skill_name_conflict: "skill_name_conflict";
66
+ skill_not_found: "skill_not_found";
67
+ skill_too_many_files: "skill_too_many_files";
68
+ skill_uncompressed_too_large: "skill_uncompressed_too_large";
69
+ subscription_required: "subscription_required";
70
+ task_active_run_exists: "task_active_run_exists";
71
+ tool_approval_continuation_not_found: "tool_approval_continuation_not_found";
72
+ tool_approval_decision_conflict: "tool_approval_decision_conflict";
73
+ unauthorized: "unauthorized";
74
+ usage_credit_required: "usage_credit_required";
75
+ validation_failed: "validation_failed";
76
+ workspace_busy: "workspace_busy";
77
+ workspace_in_use: "workspace_in_use";
78
+ workspace_not_found: "workspace_not_found";
79
+ }>;
80
+ export declare const apiErrorSchema: z.ZodObject<{
81
+ code: z.ZodEnum<{
82
+ admin_agent_managed: "admin_agent_managed";
83
+ agent_disabled: "agent_disabled";
84
+ agent_mcp_connection_not_found: "agent_mcp_connection_not_found";
85
+ agent_mcp_connections_invalid: "agent_mcp_connections_invalid";
86
+ agent_name_conflict: "agent_name_conflict";
87
+ agent_version_not_found: "agent_version_not_found";
88
+ api_key_limit_reached: "api_key_limit_reached";
89
+ artifact_session_cap_reached: "artifact_session_cap_reached";
90
+ checkout_evidence_mismatch: "checkout_evidence_mismatch";
91
+ internal: "internal";
92
+ invalid_cursor: "invalid_cursor";
93
+ invalid_request: "invalid_request";
94
+ mcp_connection_authentication_failed: "mcp_connection_authentication_failed";
95
+ mcp_connection_discovery_failed: "mcp_connection_discovery_failed";
96
+ mcp_connection_in_use: "mcp_connection_in_use";
97
+ mcp_connection_invalid: "mcp_connection_invalid";
98
+ mcp_connection_limit_reached: "mcp_connection_limit_reached";
99
+ mcp_connection_name_conflict: "mcp_connection_name_conflict";
100
+ mcp_connection_stale_credential_version: "mcp_connection_stale_credential_version";
101
+ mcp_connection_unreachable: "mcp_connection_unreachable";
102
+ message_not_found: "message_not_found";
103
+ model_discovery_unsupported: "model_discovery_unsupported";
104
+ model_not_found: "model_not_found";
105
+ model_validation_unavailable: "model_validation_unavailable";
106
+ not_found: "not_found";
107
+ prompt_limit_reached: "prompt_limit_reached";
108
+ prompt_name_conflict: "prompt_name_conflict";
109
+ prompt_variable_missing: "prompt_variable_missing";
110
+ prompt_variable_unknown: "prompt_variable_unknown";
111
+ provider_historical_use: "provider_historical_use";
112
+ provider_in_use: "provider_in_use";
113
+ provider_limit_reached: "provider_limit_reached";
114
+ provider_name_conflict: "provider_name_conflict";
115
+ provider_not_found: "provider_not_found";
116
+ provider_required: "provider_required";
117
+ quota_exceeded: "quota_exceeded";
118
+ rate_limited: "rate_limited";
119
+ service_unavailable: "service_unavailable";
120
+ session_busy: "session_busy";
121
+ session_version_mismatch: "session_version_mismatch";
122
+ skill_invalid_archive: "skill_invalid_archive";
123
+ skill_invalid_markdown: "skill_invalid_markdown";
124
+ skill_limit_reached: "skill_limit_reached";
125
+ skill_name_conflict: "skill_name_conflict";
126
+ skill_not_found: "skill_not_found";
127
+ skill_too_many_files: "skill_too_many_files";
128
+ skill_uncompressed_too_large: "skill_uncompressed_too_large";
129
+ subscription_required: "subscription_required";
130
+ task_active_run_exists: "task_active_run_exists";
131
+ tool_approval_continuation_not_found: "tool_approval_continuation_not_found";
132
+ tool_approval_decision_conflict: "tool_approval_decision_conflict";
133
+ unauthorized: "unauthorized";
134
+ usage_credit_required: "usage_credit_required";
135
+ validation_failed: "validation_failed";
136
+ workspace_busy: "workspace_busy";
137
+ workspace_in_use: "workspace_in_use";
138
+ workspace_not_found: "workspace_not_found";
139
+ }>;
140
+ details: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
141
+ message: z.ZodString;
142
+ param: z.ZodOptional<z.ZodString>;
143
+ }, z.core.$strict>;
144
+ export declare const apiErrorResponseSchema: z.ZodObject<{
145
+ error: z.ZodObject<{
146
+ code: z.ZodEnum<{
147
+ admin_agent_managed: "admin_agent_managed";
148
+ agent_disabled: "agent_disabled";
149
+ agent_mcp_connection_not_found: "agent_mcp_connection_not_found";
150
+ agent_mcp_connections_invalid: "agent_mcp_connections_invalid";
151
+ agent_name_conflict: "agent_name_conflict";
152
+ agent_version_not_found: "agent_version_not_found";
153
+ api_key_limit_reached: "api_key_limit_reached";
154
+ artifact_session_cap_reached: "artifact_session_cap_reached";
155
+ checkout_evidence_mismatch: "checkout_evidence_mismatch";
156
+ internal: "internal";
157
+ invalid_cursor: "invalid_cursor";
158
+ invalid_request: "invalid_request";
159
+ mcp_connection_authentication_failed: "mcp_connection_authentication_failed";
160
+ mcp_connection_discovery_failed: "mcp_connection_discovery_failed";
161
+ mcp_connection_in_use: "mcp_connection_in_use";
162
+ mcp_connection_invalid: "mcp_connection_invalid";
163
+ mcp_connection_limit_reached: "mcp_connection_limit_reached";
164
+ mcp_connection_name_conflict: "mcp_connection_name_conflict";
165
+ mcp_connection_stale_credential_version: "mcp_connection_stale_credential_version";
166
+ mcp_connection_unreachable: "mcp_connection_unreachable";
167
+ message_not_found: "message_not_found";
168
+ model_discovery_unsupported: "model_discovery_unsupported";
169
+ model_not_found: "model_not_found";
170
+ model_validation_unavailable: "model_validation_unavailable";
171
+ not_found: "not_found";
172
+ prompt_limit_reached: "prompt_limit_reached";
173
+ prompt_name_conflict: "prompt_name_conflict";
174
+ prompt_variable_missing: "prompt_variable_missing";
175
+ prompt_variable_unknown: "prompt_variable_unknown";
176
+ provider_historical_use: "provider_historical_use";
177
+ provider_in_use: "provider_in_use";
178
+ provider_limit_reached: "provider_limit_reached";
179
+ provider_name_conflict: "provider_name_conflict";
180
+ provider_not_found: "provider_not_found";
181
+ provider_required: "provider_required";
182
+ quota_exceeded: "quota_exceeded";
183
+ rate_limited: "rate_limited";
184
+ service_unavailable: "service_unavailable";
185
+ session_busy: "session_busy";
186
+ session_version_mismatch: "session_version_mismatch";
187
+ skill_invalid_archive: "skill_invalid_archive";
188
+ skill_invalid_markdown: "skill_invalid_markdown";
189
+ skill_limit_reached: "skill_limit_reached";
190
+ skill_name_conflict: "skill_name_conflict";
191
+ skill_not_found: "skill_not_found";
192
+ skill_too_many_files: "skill_too_many_files";
193
+ skill_uncompressed_too_large: "skill_uncompressed_too_large";
194
+ subscription_required: "subscription_required";
195
+ task_active_run_exists: "task_active_run_exists";
196
+ tool_approval_continuation_not_found: "tool_approval_continuation_not_found";
197
+ tool_approval_decision_conflict: "tool_approval_decision_conflict";
198
+ unauthorized: "unauthorized";
199
+ usage_credit_required: "usage_credit_required";
200
+ validation_failed: "validation_failed";
201
+ workspace_busy: "workspace_busy";
202
+ workspace_in_use: "workspace_in_use";
203
+ workspace_not_found: "workspace_not_found";
204
+ }>;
205
+ details: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
206
+ message: z.ZodString;
207
+ param: z.ZodOptional<z.ZodString>;
208
+ }, z.core.$strict>;
209
+ }, z.core.$strict>;
210
+ declare const receivedApiErrorCodeSchema: z.ZodString;
211
+ export declare const receivedApiErrorResponseSchema: z.ZodObject<{
212
+ error: z.ZodObject<{
213
+ code: z.ZodString;
214
+ details: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
215
+ message: z.ZodString;
216
+ param: z.ZodOptional<z.ZodString>;
217
+ }, z.core.$loose>;
218
+ }, z.core.$loose>;
219
+ export type ApiErrorCode = z.infer<typeof apiErrorCodeSchema>;
220
+ export type ApiError = z.infer<typeof apiErrorSchema>;
221
+ export type ApiErrorResponse = z.infer<typeof apiErrorResponseSchema>;
222
+ export type ReceivedApiErrorCode = z.infer<typeof receivedApiErrorCodeSchema>;
223
+ export interface ApiErrorOptions {
224
+ details?: Record<string, unknown>;
225
+ param?: string;
226
+ }
227
+ export declare function apiError(code: ApiErrorCode, message: string, options?: ApiErrorOptions): ApiErrorResponse;
228
+ /**
229
+ * Cursor pagination — `{ data, nextCursor }` on unbounded list surfaces,
230
+ * including sessions, transcripts, artifacts, and memories.
231
+ * `nextCursor` is opaque (base64 of the keyset); `null` means no more pages.
232
+ */
233
+ export declare function paginatedResponse<T>(data: T[], nextCursor: string | null): {
234
+ data: T[];
235
+ nextCursor: string | null;
236
+ };
237
+ export declare const cursorSchema: z.ZodString;
238
+ export declare function paginatedResponseSchema<T extends z.ZodTypeAny>(itemSchema: T): z.ZodObject<{
239
+ data: z.ZodArray<T>;
240
+ nextCursor: z.ZodNullable<z.ZodString>;
241
+ }, z.core.$strict>;
242
+ /**
243
+ * Opaque keyset cursor helpers. Cursors are base64url-encoded JSON of the
244
+ * keyset tuple the endpoint paginates by — never a raw value, never a row
245
+ * id alone. The repo-wide pattern: keyset-backed `{ data, nextCursor }`,
246
+ * mapping 1:1 onto `useInfiniteQuery`. Decode failures surface as
247
+ * `INVALID_CURSOR` (the caller wraps the throw).
248
+ */
249
+ export declare class CursorDecodeError extends Error {
250
+ readonly errorCode = "INVALID_CURSOR";
251
+ readonly statusCode = 400;
252
+ constructor(message: string, options?: ErrorOptions);
253
+ }
254
+ export declare function encodeCursor(payload: Record<string, unknown>): string;
255
+ export declare function decodeCursor(cursor: string): Record<string, unknown>;
256
+ export {};
@@ -0,0 +1,189 @@
1
+ import { z } from "zod";
2
+ export const clientRequestCorrelationSchema = z
3
+ .string()
4
+ .regex(/^[A-Za-z0-9._:-]{1,128}$/);
5
+ export const apiErrorIssueSchema = z
6
+ .object({
7
+ code: z.string().min(1),
8
+ location: z.enum(["body", "path", "query", "header"]),
9
+ message: z.string().min(1),
10
+ path: z.string(),
11
+ })
12
+ .strict();
13
+ /**
14
+ * `/v1` error envelope — see docs/adr/0003-ai-sdk-native-wire-protocol.md.
15
+ * Closed producer code set; `code` is what SDKs switch on and `message` is
16
+ * human-only. Resource-specific codes preserve stable product outcomes that
17
+ * callers need to distinguish.
18
+ */
19
+ export const apiErrorCodeSchema = z.enum([
20
+ "invalid_request",
21
+ "validation_failed",
22
+ "unauthorized",
23
+ "not_found",
24
+ "quota_exceeded",
25
+ "subscription_required",
26
+ "usage_credit_required",
27
+ "rate_limited",
28
+ "internal",
29
+ "service_unavailable",
30
+ "checkout_evidence_mismatch",
31
+ "agent_disabled",
32
+ "admin_agent_managed",
33
+ "agent_version_not_found",
34
+ "agent_mcp_connection_not_found",
35
+ "agent_mcp_connections_invalid",
36
+ "agent_name_conflict",
37
+ "provider_required",
38
+ "api_key_limit_reached",
39
+ "artifact_session_cap_reached",
40
+ "invalid_cursor",
41
+ "message_not_found",
42
+ "prompt_limit_reached",
43
+ "prompt_name_conflict",
44
+ "prompt_variable_missing",
45
+ "prompt_variable_unknown",
46
+ "provider_in_use",
47
+ "provider_historical_use",
48
+ "provider_limit_reached",
49
+ "provider_name_conflict",
50
+ "provider_not_found",
51
+ "model_discovery_unsupported",
52
+ "model_not_found",
53
+ "model_validation_unavailable",
54
+ "mcp_connection_limit_reached",
55
+ "mcp_connection_name_conflict",
56
+ "mcp_connection_stale_credential_version",
57
+ "mcp_connection_invalid",
58
+ "mcp_connection_authentication_failed",
59
+ "mcp_connection_in_use",
60
+ "mcp_connection_unreachable",
61
+ "mcp_connection_discovery_failed",
62
+ "workspace_not_found",
63
+ "workspace_in_use",
64
+ "workspace_busy",
65
+ "session_busy",
66
+ "session_version_mismatch",
67
+ "tool_approval_continuation_not_found",
68
+ "tool_approval_decision_conflict",
69
+ "skill_invalid_archive",
70
+ "skill_invalid_markdown",
71
+ "skill_limit_reached",
72
+ "skill_name_conflict",
73
+ "skill_not_found",
74
+ "skill_too_many_files",
75
+ "skill_uncompressed_too_large",
76
+ "task_active_run_exists",
77
+ ]);
78
+ export const apiErrorSchema = z
79
+ .object({
80
+ code: apiErrorCodeSchema,
81
+ details: z
82
+ .record(z.string(), z.unknown())
83
+ .refine((value) => Object.keys(value).length > 0)
84
+ .optional(),
85
+ message: z.string().min(1),
86
+ param: z.string().optional(),
87
+ })
88
+ .strict();
89
+ export const apiErrorResponseSchema = z
90
+ .object({
91
+ error: apiErrorSchema,
92
+ })
93
+ .strict();
94
+ const receivedApiErrorCodeSchema = z.string().min(1);
95
+ const receivedApiErrorSchema = z
96
+ .object({
97
+ code: receivedApiErrorCodeSchema,
98
+ details: z.record(z.string(), z.unknown()).optional(),
99
+ message: z.string().min(1),
100
+ param: z.string().optional(),
101
+ })
102
+ .passthrough();
103
+ export const receivedApiErrorResponseSchema = z
104
+ .object({
105
+ error: receivedApiErrorSchema,
106
+ })
107
+ .passthrough();
108
+ export function apiError(code, message, options = {}) {
109
+ return {
110
+ error: {
111
+ code,
112
+ ...(options.details && Object.keys(options.details).length > 0
113
+ ? { details: options.details }
114
+ : {}),
115
+ message,
116
+ ...(options.param === undefined ? {} : { param: options.param }),
117
+ },
118
+ };
119
+ }
120
+ /**
121
+ * Cursor pagination — `{ data, nextCursor }` on unbounded list surfaces,
122
+ * including sessions, transcripts, artifacts, and memories.
123
+ * `nextCursor` is opaque (base64 of the keyset); `null` means no more pages.
124
+ */
125
+ export function paginatedResponse(data, nextCursor) {
126
+ return { data, nextCursor };
127
+ }
128
+ export const cursorSchema = z.string().trim().min(1);
129
+ export function paginatedResponseSchema(itemSchema) {
130
+ return z
131
+ .object({
132
+ data: z.array(itemSchema),
133
+ nextCursor: z.string().nullable(),
134
+ })
135
+ .strict();
136
+ }
137
+ /**
138
+ * Opaque keyset cursor helpers. Cursors are base64url-encoded JSON of the
139
+ * keyset tuple the endpoint paginates by — never a raw value, never a row
140
+ * id alone. The repo-wide pattern: keyset-backed `{ data, nextCursor }`,
141
+ * mapping 1:1 onto `useInfiniteQuery`. Decode failures surface as
142
+ * `INVALID_CURSOR` (the caller wraps the throw).
143
+ */
144
+ export class CursorDecodeError extends Error {
145
+ errorCode = "INVALID_CURSOR";
146
+ statusCode = 400;
147
+ constructor(message, options) {
148
+ super(message, options);
149
+ this.name = "CursorDecodeError";
150
+ }
151
+ }
152
+ const BASE64_PLUS = /\+/g;
153
+ const BASE64_SLASH = /\//g;
154
+ const BASE64_PADDING = /[=]+$/;
155
+ const BASE64_DASH = /-/g;
156
+ const BASE64_UNDERSCORE = /_/g;
157
+ export function encodeCursor(payload) {
158
+ const json = JSON.stringify(payload);
159
+ const bytes = new TextEncoder().encode(json);
160
+ let binary = "";
161
+ for (const byte of bytes) {
162
+ binary += String.fromCharCode(byte);
163
+ }
164
+ return btoa(binary)
165
+ .replace(BASE64_PLUS, "-")
166
+ .replace(BASE64_SLASH, "_")
167
+ .replace(BASE64_PADDING, "");
168
+ }
169
+ export function decodeCursor(cursor) {
170
+ let json;
171
+ try {
172
+ const binary = atob(cursor.replace(BASE64_DASH, "+").replace(BASE64_UNDERSCORE, "/"));
173
+ const bytes = new Uint8Array(binary.length);
174
+ for (let i = 0; i < binary.length; i += 1) {
175
+ bytes[i] = binary.charCodeAt(i);
176
+ }
177
+ json = new TextDecoder().decode(bytes);
178
+ const parsed = JSON.parse(json);
179
+ if (parsed === null ||
180
+ typeof parsed !== "object" ||
181
+ Array.isArray(parsed)) {
182
+ throw new Error("cursor payload is not an object");
183
+ }
184
+ return parsed;
185
+ }
186
+ catch (cause) {
187
+ throw new CursorDecodeError("Invalid cursor", { cause });
188
+ }
189
+ }
@@ -0,0 +1,26 @@
1
+ /** Tool groups an Agent can attach. File operations use its durable Workspace. */
2
+ export declare const agentToolGroupIds: readonly ["workspace", "write_todos", "memory"];
3
+ export type AgentToolGroupId = (typeof agentToolGroupIds)[number];
4
+ export interface AgentToolGroup {
5
+ description: string;
6
+ id: AgentToolGroupId;
7
+ name: string;
8
+ tools: readonly string[];
9
+ }
10
+ export declare const AGENT_TOOL_CATALOG: readonly [{
11
+ readonly id: "workspace";
12
+ readonly name: "File operations";
13
+ readonly description: "Read, write, edit, search, and run shell commands in the attached durable Workspace.";
14
+ readonly tools: readonly ["read", "write", "edit", "grep", "glob", "bash", "publish_artifacts"];
15
+ }, {
16
+ readonly id: "write_todos";
17
+ readonly name: "Task planning";
18
+ readonly description: "Create and manage a structured todo list to plan and track multi-step work.";
19
+ readonly tools: readonly ["write_todos"];
20
+ }, {
21
+ readonly id: "memory";
22
+ readonly name: "Memory";
23
+ readonly description: "Save, recall, search, update, and delete durable notes owned by this Agent.";
24
+ readonly tools: readonly ["save_memory", "get_memory", "search_memories", "update_memory", "delete_memory"];
25
+ }];
26
+ export declare function expandToolGroups(ids: Iterable<string>): Set<string>;
@@ -0,0 +1,52 @@
1
+ /** Tool groups an Agent can attach. File operations use its durable Workspace. */
2
+ export const agentToolGroupIds = [
3
+ "workspace",
4
+ "write_todos",
5
+ "memory",
6
+ ];
7
+ export const AGENT_TOOL_CATALOG = [
8
+ {
9
+ id: "workspace",
10
+ name: "File operations",
11
+ description: "Read, write, edit, search, and run shell commands in the attached durable Workspace.",
12
+ tools: [
13
+ "read",
14
+ "write",
15
+ "edit",
16
+ "grep",
17
+ "glob",
18
+ "bash",
19
+ "publish_artifacts",
20
+ ],
21
+ },
22
+ {
23
+ id: "write_todos",
24
+ name: "Task planning",
25
+ description: "Create and manage a structured todo list to plan and track multi-step work.",
26
+ tools: ["write_todos"],
27
+ },
28
+ {
29
+ id: "memory",
30
+ name: "Memory",
31
+ description: "Save, recall, search, update, and delete durable notes owned by this Agent.",
32
+ tools: [
33
+ "save_memory",
34
+ "get_memory",
35
+ "search_memories",
36
+ "update_memory",
37
+ "delete_memory",
38
+ ],
39
+ },
40
+ ];
41
+ export function expandToolGroups(ids) {
42
+ const result = new Set();
43
+ for (const id of ids) {
44
+ const group = AGENT_TOOL_CATALOG.find((candidate) => candidate.id === id);
45
+ if (group) {
46
+ for (const tool of group.tools) {
47
+ result.add(tool);
48
+ }
49
+ }
50
+ }
51
+ return result;
52
+ }