@octavus/server-sdk 0.1.0 → 0.1.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/index.d.ts +82 -1
- package/dist/index.js +59 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -293,6 +293,86 @@ declare class AgentSessionsApi extends BaseApiClient {
|
|
|
293
293
|
attach(sessionId: string, options?: SessionAttachOptions): AgentSession;
|
|
294
294
|
}
|
|
295
295
|
|
|
296
|
+
/**
|
|
297
|
+
* Schema for a single file upload request
|
|
298
|
+
*/
|
|
299
|
+
declare const fileUploadRequestSchema: z.ZodObject<{
|
|
300
|
+
filename: z.ZodString;
|
|
301
|
+
mediaType: z.ZodString;
|
|
302
|
+
size: z.ZodNumber;
|
|
303
|
+
}, z.core.$strip>;
|
|
304
|
+
/**
|
|
305
|
+
* Schema for a single file upload response
|
|
306
|
+
*/
|
|
307
|
+
declare const fileUploadInfoSchema: z.ZodObject<{
|
|
308
|
+
id: z.ZodString;
|
|
309
|
+
uploadUrl: z.ZodURL;
|
|
310
|
+
downloadUrl: z.ZodURL;
|
|
311
|
+
}, z.core.$strip>;
|
|
312
|
+
/**
|
|
313
|
+
* Schema for the upload URLs response
|
|
314
|
+
*/
|
|
315
|
+
declare const uploadUrlsResponseSchema: z.ZodObject<{
|
|
316
|
+
files: z.ZodArray<z.ZodObject<{
|
|
317
|
+
id: z.ZodString;
|
|
318
|
+
uploadUrl: z.ZodURL;
|
|
319
|
+
downloadUrl: z.ZodURL;
|
|
320
|
+
}, z.core.$strip>>;
|
|
321
|
+
}, z.core.$strip>;
|
|
322
|
+
type FileUploadRequest = z.infer<typeof fileUploadRequestSchema>;
|
|
323
|
+
type FileUploadInfo = z.infer<typeof fileUploadInfoSchema>;
|
|
324
|
+
type UploadUrlsResponse = z.infer<typeof uploadUrlsResponseSchema>;
|
|
325
|
+
/**
|
|
326
|
+
* API for file operations.
|
|
327
|
+
*
|
|
328
|
+
* Provides methods to generate presigned URLs for file uploads.
|
|
329
|
+
* Files are uploaded directly to S3, not through the platform.
|
|
330
|
+
*
|
|
331
|
+
* @example
|
|
332
|
+
* ```typescript
|
|
333
|
+
* // Get upload URLs
|
|
334
|
+
* const { files } = await client.files.getUploadUrls(sessionId, [
|
|
335
|
+
* { filename: 'image.png', mediaType: 'image/png', size: 12345 }
|
|
336
|
+
* ]);
|
|
337
|
+
*
|
|
338
|
+
* // Upload directly to S3
|
|
339
|
+
* await fetch(files[0].uploadUrl, {
|
|
340
|
+
* method: 'PUT',
|
|
341
|
+
* body: imageFile,
|
|
342
|
+
* headers: { 'Content-Type': 'image/png' }
|
|
343
|
+
* });
|
|
344
|
+
*
|
|
345
|
+
* // Use downloadUrl as FileReference in trigger input
|
|
346
|
+
* ```
|
|
347
|
+
*/
|
|
348
|
+
declare class FilesApi extends BaseApiClient {
|
|
349
|
+
/**
|
|
350
|
+
* Get presigned URLs for uploading files to a session.
|
|
351
|
+
*
|
|
352
|
+
* Returns upload URLs (PUT) and download URLs (GET) for each file.
|
|
353
|
+
* Upload URLs expire in 15 minutes, download URLs match session TTL (24 hours).
|
|
354
|
+
*
|
|
355
|
+
* @param sessionId - The session ID to associate files with
|
|
356
|
+
* @param files - Array of file metadata (filename, mediaType, size)
|
|
357
|
+
* @returns Upload info with presigned URLs for each file
|
|
358
|
+
*
|
|
359
|
+
* @throws ApiError if session doesn't exist or validation fails
|
|
360
|
+
*
|
|
361
|
+
* @example
|
|
362
|
+
* ```typescript
|
|
363
|
+
* const { files } = await client.files.getUploadUrls(sessionId, [
|
|
364
|
+
* { filename: 'photo.jpg', mediaType: 'image/jpeg', size: 102400 },
|
|
365
|
+
* { filename: 'doc.pdf', mediaType: 'application/pdf', size: 204800 },
|
|
366
|
+
* ]);
|
|
367
|
+
*
|
|
368
|
+
* // files[0].id - Use in FileReference
|
|
369
|
+
* // files[0].uploadUrl - PUT to this URL
|
|
370
|
+
* // files[0].downloadUrl - Use as FileReference.url
|
|
371
|
+
* ```
|
|
372
|
+
*/
|
|
373
|
+
getUploadUrls(sessionId: string, files: FileUploadRequest[]): Promise<UploadUrlsResponse>;
|
|
374
|
+
}
|
|
375
|
+
|
|
296
376
|
interface OctavusClientConfig {
|
|
297
377
|
baseUrl: string;
|
|
298
378
|
apiKey?: string;
|
|
@@ -301,10 +381,11 @@ interface OctavusClientConfig {
|
|
|
301
381
|
declare class OctavusClient {
|
|
302
382
|
readonly agents: AgentsApi;
|
|
303
383
|
readonly agentSessions: AgentSessionsApi;
|
|
384
|
+
readonly files: FilesApi;
|
|
304
385
|
readonly baseUrl: string;
|
|
305
386
|
private readonly apiKey?;
|
|
306
387
|
constructor(config: OctavusClientConfig);
|
|
307
388
|
getHeaders(): Record<string, string>;
|
|
308
389
|
}
|
|
309
390
|
|
|
310
|
-
export { type Agent, type AgentDefinition, type AgentDefinitionInput, type AgentFormat, type AgentPrompt, AgentSession, AgentSessionsApi, type AgentSettingsInput, type AgentUpdateInput, AgentsApi, ApiError, OctavusClient, type OctavusClientConfig, Resource, type SessionAttachOptions, type SessionState, type UISessionState, agentCreateResponseSchema, agentDefinitionInputSchema, agentDefinitionSchema, agentFormatSchema, agentPromptSchema, agentSchema, agentSettingsInputSchema, agentUpdateResponseSchema, agentsResponseSchema, toSSEStream };
|
|
391
|
+
export { type Agent, type AgentDefinition, type AgentDefinitionInput, type AgentFormat, type AgentPrompt, AgentSession, AgentSessionsApi, type AgentSettingsInput, type AgentUpdateInput, AgentsApi, ApiError, type FileUploadInfo, type FileUploadRequest, FilesApi, OctavusClient, type OctavusClientConfig, Resource, type SessionAttachOptions, type SessionState, type UISessionState, type UploadUrlsResponse, agentCreateResponseSchema, agentDefinitionInputSchema, agentDefinitionSchema, agentFormatSchema, agentPromptSchema, agentSchema, agentSettingsInputSchema, agentUpdateResponseSchema, agentsResponseSchema, fileUploadInfoSchema, fileUploadRequestSchema, toSSEStream, uploadUrlsResponseSchema };
|
package/dist/index.js
CHANGED
|
@@ -437,10 +437,63 @@ var AgentSessionsApi = class extends BaseApiClient {
|
|
|
437
437
|
}
|
|
438
438
|
};
|
|
439
439
|
|
|
440
|
+
// src/files.ts
|
|
441
|
+
import { z as z4 } from "zod";
|
|
442
|
+
var fileUploadRequestSchema = z4.object({
|
|
443
|
+
filename: z4.string().min(1).max(255),
|
|
444
|
+
mediaType: z4.string().min(1),
|
|
445
|
+
size: z4.number().int().positive()
|
|
446
|
+
});
|
|
447
|
+
var fileUploadInfoSchema = z4.object({
|
|
448
|
+
/** File ID to reference in messages */
|
|
449
|
+
id: z4.string(),
|
|
450
|
+
/** Presigned PUT URL for uploading to S3 */
|
|
451
|
+
uploadUrl: z4.url(),
|
|
452
|
+
/** Presigned GET URL for downloading after upload */
|
|
453
|
+
downloadUrl: z4.url()
|
|
454
|
+
});
|
|
455
|
+
var uploadUrlsResponseSchema = z4.object({
|
|
456
|
+
files: z4.array(fileUploadInfoSchema)
|
|
457
|
+
});
|
|
458
|
+
var FilesApi = class extends BaseApiClient {
|
|
459
|
+
/**
|
|
460
|
+
* Get presigned URLs for uploading files to a session.
|
|
461
|
+
*
|
|
462
|
+
* Returns upload URLs (PUT) and download URLs (GET) for each file.
|
|
463
|
+
* Upload URLs expire in 15 minutes, download URLs match session TTL (24 hours).
|
|
464
|
+
*
|
|
465
|
+
* @param sessionId - The session ID to associate files with
|
|
466
|
+
* @param files - Array of file metadata (filename, mediaType, size)
|
|
467
|
+
* @returns Upload info with presigned URLs for each file
|
|
468
|
+
*
|
|
469
|
+
* @throws ApiError if session doesn't exist or validation fails
|
|
470
|
+
*
|
|
471
|
+
* @example
|
|
472
|
+
* ```typescript
|
|
473
|
+
* const { files } = await client.files.getUploadUrls(sessionId, [
|
|
474
|
+
* { filename: 'photo.jpg', mediaType: 'image/jpeg', size: 102400 },
|
|
475
|
+
* { filename: 'doc.pdf', mediaType: 'application/pdf', size: 204800 },
|
|
476
|
+
* ]);
|
|
477
|
+
*
|
|
478
|
+
* // files[0].id - Use in FileReference
|
|
479
|
+
* // files[0].uploadUrl - PUT to this URL
|
|
480
|
+
* // files[0].downloadUrl - Use as FileReference.url
|
|
481
|
+
* ```
|
|
482
|
+
*/
|
|
483
|
+
async getUploadUrls(sessionId, files) {
|
|
484
|
+
return await this.httpPost(
|
|
485
|
+
"/api/files/upload-urls",
|
|
486
|
+
{ sessionId, files },
|
|
487
|
+
uploadUrlsResponseSchema
|
|
488
|
+
);
|
|
489
|
+
}
|
|
490
|
+
};
|
|
491
|
+
|
|
440
492
|
// src/client.ts
|
|
441
493
|
var OctavusClient = class {
|
|
442
494
|
agents;
|
|
443
495
|
agentSessions;
|
|
496
|
+
files;
|
|
444
497
|
baseUrl;
|
|
445
498
|
apiKey;
|
|
446
499
|
constructor(config) {
|
|
@@ -452,6 +505,7 @@ var OctavusClient = class {
|
|
|
452
505
|
};
|
|
453
506
|
this.agents = new AgentsApi(apiConfig);
|
|
454
507
|
this.agentSessions = new AgentSessionsApi(apiConfig);
|
|
508
|
+
this.files = new FilesApi(apiConfig);
|
|
455
509
|
}
|
|
456
510
|
getHeaders() {
|
|
457
511
|
const headers = {
|
|
@@ -472,6 +526,7 @@ export {
|
|
|
472
526
|
AgentSessionsApi,
|
|
473
527
|
AgentsApi,
|
|
474
528
|
ApiError,
|
|
529
|
+
FilesApi,
|
|
475
530
|
OctavusClient,
|
|
476
531
|
Resource,
|
|
477
532
|
agentCreateResponseSchema,
|
|
@@ -483,6 +538,9 @@ export {
|
|
|
483
538
|
agentSettingsInputSchema,
|
|
484
539
|
agentUpdateResponseSchema,
|
|
485
540
|
agentsResponseSchema,
|
|
486
|
-
|
|
541
|
+
fileUploadInfoSchema,
|
|
542
|
+
fileUploadRequestSchema,
|
|
543
|
+
toSSEStream,
|
|
544
|
+
uploadUrlsResponseSchema
|
|
487
545
|
};
|
|
488
546
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api-error.ts","../src/base-api-client.ts","../src/agent-types.ts","../src/agents.ts","../src/agent-sessions.ts","../src/session.ts","../src/client.ts","../src/resource.ts"],"sourcesContent":["import { z } from 'zod';\n\nconst ApiErrorResponseSchema = z.object({\n error: z.string().optional(),\n message: z.string().optional(),\n code: z.string().optional(),\n});\n\n/**\n * Error thrown when API request fails\n */\nexport class ApiError extends Error {\n constructor(\n message: string,\n public status: number,\n public code?: string,\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\ninterface ParsedApiError {\n message: string;\n code?: string;\n}\n\n/**\n * Parse error from API response using Zod\n */\nexport async function parseApiError(\n response: Response,\n defaultMessage: string,\n): Promise<ParsedApiError> {\n const fallbackMessage = `${defaultMessage}: ${response.statusText}`;\n\n try {\n const json: unknown = await response.json();\n const parsed = ApiErrorResponseSchema.safeParse(json);\n\n if (parsed.success) {\n return {\n message: parsed.data.error ?? parsed.data.message ?? fallbackMessage,\n code: parsed.data.code,\n };\n }\n } catch {\n // Use default message\n }\n\n return { message: fallbackMessage };\n}\n\n/**\n * Parse error from API response and throw ApiError\n */\nexport async function throwApiError(response: Response, defaultMessage: string): Promise<never> {\n const { message, code } = await parseApiError(response, defaultMessage);\n throw new ApiError(message, response.status, code);\n}\n","import type { ZodType } from 'zod';\nimport { throwApiError } from '@/api-error.js';\n\nexport { ApiError } from '@/api-error.js';\n\nexport interface ApiClientConfig {\n baseUrl: string;\n getHeaders: () => Record<string, string>;\n}\n\n/** Base class for API clients with shared HTTP utilities */\nexport abstract class BaseApiClient {\n protected readonly config: ApiClientConfig;\n\n constructor(config: ApiClientConfig) {\n this.config = config;\n }\n\n protected async httpGet<T>(path: string, schema: ZodType<T>): Promise<T> {\n const response = await fetch(`${this.config.baseUrl}${path}`, {\n method: 'GET',\n headers: this.config.getHeaders(),\n });\n\n if (!response.ok) {\n await throwApiError(response, 'Request failed');\n }\n\n const data: unknown = await response.json();\n return schema.parse(data);\n }\n\n protected async httpPost<T>(path: string, body: unknown, schema: ZodType<T>): Promise<T> {\n const response = await fetch(`${this.config.baseUrl}${path}`, {\n method: 'POST',\n headers: this.config.getHeaders(),\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n await throwApiError(response, 'Request failed');\n }\n\n const data: unknown = await response.json();\n return schema.parse(data);\n }\n\n protected async httpPatch<T>(path: string, body: unknown, schema: ZodType<T>): Promise<T> {\n const response = await fetch(`${this.config.baseUrl}${path}`, {\n method: 'PATCH',\n headers: this.config.getHeaders(),\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n await throwApiError(response, 'Request failed');\n }\n\n const data: unknown = await response.json();\n return schema.parse(data);\n }\n}\n","import { z } from 'zod';\n\n/** Agent format - interactive (chat) or generation (background task) */\nexport type AgentFormat = 'interactive' | 'generation';\n\n/**\n * Agent settings input - used when creating/updating agents\n */\nexport interface AgentSettingsInput {\n slug: string;\n name: string;\n description?: string;\n format: AgentFormat;\n}\n\n/**\n * Agent prompt - shared between input and response\n */\nexport interface AgentPrompt {\n name: string;\n content: string;\n}\n\n/**\n * Input for creating/updating an agent definition\n */\nexport interface AgentDefinitionInput {\n settings: AgentSettingsInput;\n protocol: string;\n prompts: AgentPrompt[];\n}\n\n/**\n * Agent summary returned from list endpoint\n */\nexport interface Agent {\n /** Agent slug (human-readable identifier within project) */\n slug: string;\n /** Agent ID - use this for API calls */\n id: string;\n name: string;\n description: string | null;\n format: AgentFormat;\n createdAt: string;\n updatedAt: string;\n projectId: string;\n}\n\n/**\n * Full agent definition returned from get endpoint\n */\nexport interface AgentDefinition {\n settings: AgentSettingsInput;\n protocol: string;\n prompts: AgentPrompt[];\n /** Agent ID - use this for API calls like createSession */\n id: string;\n}\n\n// Schemas\n\nexport const agentFormatSchema = z.enum(['interactive', 'generation']);\n\nexport const agentSettingsInputSchema = z.object({\n slug: z.string().min(1),\n name: z.string().min(1),\n description: z.string().optional(),\n format: agentFormatSchema,\n});\n\nexport const agentPromptSchema = z.object({\n name: z.string().min(1),\n content: z.string(),\n});\n\nexport const agentDefinitionInputSchema = z.object({\n settings: agentSettingsInputSchema,\n protocol: z.string().min(1),\n prompts: z.array(agentPromptSchema),\n});\n\nexport const agentSchema = z.object({\n slug: z.string(),\n id: z.string(),\n name: z.string(),\n description: z.string().nullable(),\n format: agentFormatSchema,\n createdAt: z.string(),\n updatedAt: z.string(),\n projectId: z.string(),\n});\n\nexport const agentsResponseSchema = z.object({\n agents: z.array(agentSchema),\n});\n\nexport const agentDefinitionSchema = z.object({\n settings: agentSettingsInputSchema,\n protocol: z.string(),\n prompts: z.array(agentPromptSchema),\n id: z.string(),\n});\n\nexport const agentCreateResponseSchema = z.object({\n agentId: z.string(),\n message: z.string(),\n});\n\nexport const agentUpdateResponseSchema = z.object({\n agentId: z.string(),\n message: z.string(),\n});\n","import { BaseApiClient, ApiError } from '@/base-api-client.js';\nimport {\n agentsResponseSchema,\n agentDefinitionSchema,\n agentCreateResponseSchema,\n agentUpdateResponseSchema,\n type Agent,\n type AgentDefinition,\n type AgentDefinitionInput,\n type AgentPrompt,\n} from '@/agent-types.js';\n\nexport interface AgentUpdateInput {\n protocol?: string;\n prompts?: AgentPrompt[];\n}\n\n/** API for managing agent definitions */\nexport class AgentsApi extends BaseApiClient {\n /** List all agents */\n async list(): Promise<Agent[]> {\n const response = await this.httpGet('/api/agents', agentsResponseSchema);\n return response.agents;\n }\n\n /** Get a single agent by ID */\n async get(agentId: string): Promise<AgentDefinition> {\n return await this.httpGet(`/api/agents/${agentId}`, agentDefinitionSchema);\n }\n\n /** Get a single agent by slug */\n async getBySlug(slug: string): Promise<AgentDefinition | null> {\n try {\n return await this.httpGet(`/api/agents/${slug}?by=slug`, agentDefinitionSchema);\n } catch (error) {\n if (error instanceof ApiError && error.status === 404) {\n return null;\n }\n throw error;\n }\n }\n\n /** Create a new agent. Throws if agent with same slug exists. */\n async create(definition: AgentDefinitionInput): Promise<string> {\n const response = await this.httpPost('/api/agents', definition, agentCreateResponseSchema);\n return response.agentId;\n }\n\n /** Partial update of an existing agent by ID */\n async update(agentId: string, update: AgentUpdateInput): Promise<string> {\n const response = await this.httpPatch(\n `/api/agents/${agentId}`,\n update,\n agentUpdateResponseSchema,\n );\n return response.agentId;\n }\n\n /** Partial update of an existing agent by slug */\n async updateBySlug(slug: string, update: AgentUpdateInput): Promise<string> {\n const response = await this.httpPatch(\n `/api/agents/${slug}?by=slug`,\n update,\n agentUpdateResponseSchema,\n );\n return response.agentId;\n }\n\n /**\n * Sync an agent definition - creates if new, updates if exists\n * Returns { agentId, created: boolean }\n */\n async sync(definition: AgentDefinitionInput): Promise<{ agentId: string; created: boolean }> {\n const existing = await this.getBySlug(definition.settings.slug);\n\n if (existing) {\n // Update existing agent\n const agentId = await this.update(existing.id, {\n protocol: definition.protocol,\n prompts: definition.prompts,\n });\n return { agentId, created: false };\n }\n // Create new agent\n const agentId = await this.create(definition);\n return { agentId, created: true };\n }\n}\n","import { z } from 'zod';\nimport {\n chatMessageSchema,\n uiMessageSchema,\n type ChatMessage,\n type ToolHandlers,\n type UIMessage,\n} from '@octavus/core';\nimport { BaseApiClient } from '@/base-api-client.js';\nimport { AgentSession } from '@/session.js';\nimport type { Resource } from '@/resource.js';\n\nconst createSessionResponseSchema = z.object({\n sessionId: z.string(),\n});\n\nconst sessionStateSchema = z.object({\n id: z.string(),\n agentId: z.string(),\n input: z.record(z.string(), z.unknown()),\n variables: z.record(z.string(), z.unknown()),\n resources: z.record(z.string(), z.unknown()),\n messages: z.array(chatMessageSchema),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\n\nconst uiSessionResponseSchema = z.object({\n sessionId: z.string(),\n agentId: z.string(),\n messages: z.array(uiMessageSchema),\n});\n\nexport interface SessionState {\n id: string;\n agentId: string;\n input: Record<string, unknown>;\n variables: Record<string, unknown>;\n resources: Record<string, unknown>;\n messages: ChatMessage[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface UISessionState {\n sessionId: string;\n agentId: string;\n messages: UIMessage[];\n}\n\nexport interface SessionAttachOptions {\n tools?: ToolHandlers;\n resources?: Resource[];\n}\n\n/** API for managing agent sessions */\nexport class AgentSessionsApi extends BaseApiClient {\n /** Create a new session for an agent */\n async create(agentId: string, input?: Record<string, unknown>): Promise<string> {\n const response = await this.httpPost(\n '/api/agent-sessions',\n { agentId, input },\n createSessionResponseSchema,\n );\n return response.sessionId;\n }\n\n /**\n * Get full session state (for internal/debug use)\n * Note: Contains all messages including hidden content\n */\n async get(sessionId: string): Promise<SessionState> {\n return await this.httpGet(`/api/agent-sessions/${sessionId}`, sessionStateSchema);\n }\n\n /**\n * Get UI-ready session messages (for client display)\n * Returns only visible messages with hidden content filtered out\n */\n async getMessages(sessionId: string): Promise<UISessionState> {\n return await this.httpGet(\n `/api/agent-sessions/${sessionId}?format=ui`,\n uiSessionResponseSchema,\n );\n }\n\n /** Attach to an existing session for triggering events */\n attach(sessionId: string, options: SessionAttachOptions = {}): AgentSession {\n return new AgentSession({\n sessionId,\n config: this.config,\n tools: options.tools,\n resources: options.resources,\n });\n }\n}\n","import {\n safeParseStreamEvent,\n type StreamEvent,\n type ToolHandlers,\n type PendingToolCall,\n type ToolResult,\n} from '@octavus/core';\nimport { parseApiError } from '@/api-error.js';\nimport type { ApiClientConfig } from '@/base-api-client.js';\nimport type { Resource } from '@/resource.js';\n\n/**\n * Converts an async iterable of stream events to an SSE-formatted ReadableStream.\n * Use this when you need to return an SSE response (e.g., HTTP endpoints).\n *\n * @example\n * ```typescript\n * const events = session.trigger('user-message', input);\n * return new Response(toSSEStream(events), {\n * headers: { 'Content-Type': 'text/event-stream' },\n * });\n * ```\n */\nexport function toSSEStream(events: AsyncIterable<StreamEvent>): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder();\n\n return new ReadableStream({\n async start(controller) {\n try {\n for await (const event of events) {\n controller.enqueue(encoder.encode(`data: ${JSON.stringify(event)}\\n\\n`));\n }\n controller.enqueue(encoder.encode('data: [DONE]\\n\\n'));\n controller.close();\n } catch (err) {\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: 'error', errorText: err instanceof Error ? err.message : 'Unknown error' })}\\n\\n`,\n ),\n );\n controller.close();\n }\n },\n });\n}\n\nexport interface SessionConfig {\n sessionId: string;\n config: ApiClientConfig;\n tools?: ToolHandlers;\n resources?: Resource[];\n}\n\n/** Handles streaming and tool continuation for agent sessions */\nexport class AgentSession {\n private sessionId: string;\n private config: ApiClientConfig;\n private toolHandlers: ToolHandlers;\n private resourceMap: Map<string, Resource>;\n\n constructor(sessionConfig: SessionConfig) {\n this.sessionId = sessionConfig.sessionId;\n this.config = sessionConfig.config;\n this.toolHandlers = sessionConfig.tools ?? {};\n this.resourceMap = new Map();\n\n // Index resources by name for fast lookup\n for (const resource of sessionConfig.resources ?? []) {\n this.resourceMap.set(resource.name, resource);\n }\n }\n\n /**\n * Trigger an agent action and stream the response as parsed events.\n *\n * This method:\n * 1. POSTs to the platform trigger endpoint\n * 2. Yields parsed stream events to the consumer\n * 3. When tool-request event is received: executes tools locally\n * 4. POSTs a new request with toolResults to continue\n * 5. Repeats until done (no more tool requests)\n *\n * @example\n * ```typescript\n * // For sockets: iterate events directly\n * for await (const event of session.trigger('user-message', input)) {\n * conn.write(JSON.stringify(event));\n * }\n *\n * // For HTTP: convert to SSE stream\n * const events = session.trigger('user-message', input);\n * return new Response(toSSEStream(events), {\n * headers: { 'Content-Type': 'text/event-stream' },\n * });\n * ```\n */\n async *trigger(\n triggerName: string,\n triggerInput?: Record<string, unknown>,\n ): AsyncGenerator<StreamEvent> {\n let toolResults: ToolResult[] | undefined;\n let continueLoop = true;\n\n while (continueLoop) {\n // Make request to platform (with toolResults on continuation)\n const response = await fetch(\n `${this.config.baseUrl}/api/agent-sessions/${this.sessionId}/trigger`,\n {\n method: 'POST',\n headers: this.config.getHeaders(),\n body: JSON.stringify({ triggerName, input: triggerInput, toolResults }),\n },\n );\n\n if (!response.ok) {\n const { message } = await parseApiError(response, 'Failed to trigger');\n yield { type: 'error', errorText: message };\n return;\n }\n\n if (!response.body) {\n yield { type: 'error', errorText: 'Response body is not readable' };\n return;\n }\n\n // Reset tool results for next iteration\n toolResults = undefined;\n\n // Read and process the SSE stream\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let pendingToolCalls: PendingToolCall[] | null = null;\n\n // Read stream until done\n let streamDone = false;\n while (!streamDone) {\n const { done, value } = await reader.read();\n\n if (done) {\n streamDone = true;\n continue;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (line.startsWith('data: ') && line !== 'data: [DONE]') {\n try {\n const parsed = safeParseStreamEvent(JSON.parse(line.slice(6)));\n if (!parsed.success) {\n // Skip malformed events\n continue;\n }\n const event = parsed.data;\n\n // Handle tool-request - execute tools and prepare continuation\n if (event.type === 'tool-request') {\n pendingToolCalls = event.toolCalls;\n // Don't forward tool-request to consumer\n continue;\n }\n\n if (event.type === 'finish') {\n if (event.finishReason === 'tool-calls' && pendingToolCalls) {\n continue;\n }\n yield event;\n continueLoop = false;\n continue;\n }\n\n // Handle resource updates\n if (event.type === 'resource-update') {\n this.handleResourceUpdate(event.name, event.value);\n }\n\n // Yield all other events to the consumer\n yield event;\n } catch {\n // Skip malformed JSON\n }\n }\n }\n }\n\n // If we have pending tool calls, execute them and continue\n if (pendingToolCalls && pendingToolCalls.length > 0) {\n toolResults = await Promise.all(\n pendingToolCalls.map(async (tc): Promise<ToolResult> => {\n const handler = this.toolHandlers[tc.toolName];\n if (!handler) {\n return {\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n error: `No handler for tool: ${tc.toolName}`,\n outputVariable: tc.outputVariable,\n blockIndex: tc.blockIndex,\n };\n }\n\n try {\n const result = await handler(tc.args);\n return {\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n result,\n outputVariable: tc.outputVariable,\n blockIndex: tc.blockIndex,\n };\n } catch (err) {\n return {\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n error: err instanceof Error ? err.message : 'Tool execution failed',\n outputVariable: tc.outputVariable,\n blockIndex: tc.blockIndex,\n };\n }\n }),\n );\n\n // Emit tool-output events immediately so UI updates right away\n // (before making continuation request)\n for (const tr of toolResults) {\n if (tr.error) {\n yield { type: 'tool-output-error', toolCallId: tr.toolCallId, errorText: tr.error };\n } else {\n yield { type: 'tool-output-available', toolCallId: tr.toolCallId, output: tr.result };\n }\n }\n\n // Continue loop with tool results\n } else {\n // No pending tools, we're done\n continueLoop = false;\n }\n }\n }\n\n getSessionId(): string {\n return this.sessionId;\n }\n\n private handleResourceUpdate(name: string, value: unknown): void {\n const resource = this.resourceMap.get(name);\n if (resource) {\n void resource.onUpdate(value);\n }\n }\n}\n","import type { ApiClientConfig } from '@/base-api-client.js';\nimport { AgentsApi } from '@/agents.js';\nimport { AgentSessionsApi } from '@/agent-sessions.js';\n\nexport interface OctavusClientConfig {\n baseUrl: string;\n apiKey?: string;\n}\n\n/** Client for interacting with the Octavus platform API */\nexport class OctavusClient {\n readonly agents: AgentsApi;\n readonly agentSessions: AgentSessionsApi;\n readonly baseUrl: string;\n private readonly apiKey?: string;\n\n constructor(config: OctavusClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n this.apiKey = config.apiKey;\n\n const apiConfig: ApiClientConfig = {\n baseUrl: this.baseUrl,\n getHeaders: () => this.getHeaders(),\n };\n\n this.agents = new AgentsApi(apiConfig);\n this.agentSessions = new AgentSessionsApi(apiConfig);\n }\n\n getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (this.apiKey) {\n headers.Authorization = `Bearer ${this.apiKey}`;\n }\n\n return headers;\n }\n}\n","/**\n * Base class for agent-managed resources.\n * Extend this class to define how each resource should be persisted when the agent updates it.\n */\nexport abstract class Resource {\n /** The resource name as defined in the agent protocol */\n abstract readonly name: string;\n\n /** Called when the agent updates this resource */\n abstract onUpdate(value: unknown): Promise<void> | void;\n}\n"],"mappings":"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","names":["z","agentId","z","z"]}
|
|
1
|
+
{"version":3,"sources":["../src/api-error.ts","../src/base-api-client.ts","../src/agent-types.ts","../src/agents.ts","../src/agent-sessions.ts","../src/session.ts","../src/files.ts","../src/client.ts","../src/resource.ts"],"sourcesContent":["import { z } from 'zod';\n\nconst ApiErrorResponseSchema = z.object({\n error: z.string().optional(),\n message: z.string().optional(),\n code: z.string().optional(),\n});\n\n/**\n * Error thrown when API request fails\n */\nexport class ApiError extends Error {\n constructor(\n message: string,\n public status: number,\n public code?: string,\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\ninterface ParsedApiError {\n message: string;\n code?: string;\n}\n\n/**\n * Parse error from API response using Zod\n */\nexport async function parseApiError(\n response: Response,\n defaultMessage: string,\n): Promise<ParsedApiError> {\n const fallbackMessage = `${defaultMessage}: ${response.statusText}`;\n\n try {\n const json: unknown = await response.json();\n const parsed = ApiErrorResponseSchema.safeParse(json);\n\n if (parsed.success) {\n return {\n message: parsed.data.error ?? parsed.data.message ?? fallbackMessage,\n code: parsed.data.code,\n };\n }\n } catch {\n // Use default message\n }\n\n return { message: fallbackMessage };\n}\n\n/**\n * Parse error from API response and throw ApiError\n */\nexport async function throwApiError(response: Response, defaultMessage: string): Promise<never> {\n const { message, code } = await parseApiError(response, defaultMessage);\n throw new ApiError(message, response.status, code);\n}\n","import type { ZodType } from 'zod';\nimport { throwApiError } from '@/api-error.js';\n\nexport { ApiError } from '@/api-error.js';\n\nexport interface ApiClientConfig {\n baseUrl: string;\n getHeaders: () => Record<string, string>;\n}\n\n/** Base class for API clients with shared HTTP utilities */\nexport abstract class BaseApiClient {\n protected readonly config: ApiClientConfig;\n\n constructor(config: ApiClientConfig) {\n this.config = config;\n }\n\n protected async httpGet<T>(path: string, schema: ZodType<T>): Promise<T> {\n const response = await fetch(`${this.config.baseUrl}${path}`, {\n method: 'GET',\n headers: this.config.getHeaders(),\n });\n\n if (!response.ok) {\n await throwApiError(response, 'Request failed');\n }\n\n const data: unknown = await response.json();\n return schema.parse(data);\n }\n\n protected async httpPost<T>(path: string, body: unknown, schema: ZodType<T>): Promise<T> {\n const response = await fetch(`${this.config.baseUrl}${path}`, {\n method: 'POST',\n headers: this.config.getHeaders(),\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n await throwApiError(response, 'Request failed');\n }\n\n const data: unknown = await response.json();\n return schema.parse(data);\n }\n\n protected async httpPatch<T>(path: string, body: unknown, schema: ZodType<T>): Promise<T> {\n const response = await fetch(`${this.config.baseUrl}${path}`, {\n method: 'PATCH',\n headers: this.config.getHeaders(),\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n await throwApiError(response, 'Request failed');\n }\n\n const data: unknown = await response.json();\n return schema.parse(data);\n }\n}\n","import { z } from 'zod';\n\n/** Agent format - interactive (chat) or generation (background task) */\nexport type AgentFormat = 'interactive' | 'generation';\n\n/**\n * Agent settings input - used when creating/updating agents\n */\nexport interface AgentSettingsInput {\n slug: string;\n name: string;\n description?: string;\n format: AgentFormat;\n}\n\n/**\n * Agent prompt - shared between input and response\n */\nexport interface AgentPrompt {\n name: string;\n content: string;\n}\n\n/**\n * Input for creating/updating an agent definition\n */\nexport interface AgentDefinitionInput {\n settings: AgentSettingsInput;\n protocol: string;\n prompts: AgentPrompt[];\n}\n\n/**\n * Agent summary returned from list endpoint\n */\nexport interface Agent {\n /** Agent slug (human-readable identifier within project) */\n slug: string;\n /** Agent ID - use this for API calls */\n id: string;\n name: string;\n description: string | null;\n format: AgentFormat;\n createdAt: string;\n updatedAt: string;\n projectId: string;\n}\n\n/**\n * Full agent definition returned from get endpoint\n */\nexport interface AgentDefinition {\n settings: AgentSettingsInput;\n protocol: string;\n prompts: AgentPrompt[];\n /** Agent ID - use this for API calls like createSession */\n id: string;\n}\n\n// Schemas\n\nexport const agentFormatSchema = z.enum(['interactive', 'generation']);\n\nexport const agentSettingsInputSchema = z.object({\n slug: z.string().min(1),\n name: z.string().min(1),\n description: z.string().optional(),\n format: agentFormatSchema,\n});\n\nexport const agentPromptSchema = z.object({\n name: z.string().min(1),\n content: z.string(),\n});\n\nexport const agentDefinitionInputSchema = z.object({\n settings: agentSettingsInputSchema,\n protocol: z.string().min(1),\n prompts: z.array(agentPromptSchema),\n});\n\nexport const agentSchema = z.object({\n slug: z.string(),\n id: z.string(),\n name: z.string(),\n description: z.string().nullable(),\n format: agentFormatSchema,\n createdAt: z.string(),\n updatedAt: z.string(),\n projectId: z.string(),\n});\n\nexport const agentsResponseSchema = z.object({\n agents: z.array(agentSchema),\n});\n\nexport const agentDefinitionSchema = z.object({\n settings: agentSettingsInputSchema,\n protocol: z.string(),\n prompts: z.array(agentPromptSchema),\n id: z.string(),\n});\n\nexport const agentCreateResponseSchema = z.object({\n agentId: z.string(),\n message: z.string(),\n});\n\nexport const agentUpdateResponseSchema = z.object({\n agentId: z.string(),\n message: z.string(),\n});\n","import { BaseApiClient, ApiError } from '@/base-api-client.js';\nimport {\n agentsResponseSchema,\n agentDefinitionSchema,\n agentCreateResponseSchema,\n agentUpdateResponseSchema,\n type Agent,\n type AgentDefinition,\n type AgentDefinitionInput,\n type AgentPrompt,\n} from '@/agent-types.js';\n\nexport interface AgentUpdateInput {\n protocol?: string;\n prompts?: AgentPrompt[];\n}\n\n/** API for managing agent definitions */\nexport class AgentsApi extends BaseApiClient {\n /** List all agents */\n async list(): Promise<Agent[]> {\n const response = await this.httpGet('/api/agents', agentsResponseSchema);\n return response.agents;\n }\n\n /** Get a single agent by ID */\n async get(agentId: string): Promise<AgentDefinition> {\n return await this.httpGet(`/api/agents/${agentId}`, agentDefinitionSchema);\n }\n\n /** Get a single agent by slug */\n async getBySlug(slug: string): Promise<AgentDefinition | null> {\n try {\n return await this.httpGet(`/api/agents/${slug}?by=slug`, agentDefinitionSchema);\n } catch (error) {\n if (error instanceof ApiError && error.status === 404) {\n return null;\n }\n throw error;\n }\n }\n\n /** Create a new agent. Throws if agent with same slug exists. */\n async create(definition: AgentDefinitionInput): Promise<string> {\n const response = await this.httpPost('/api/agents', definition, agentCreateResponseSchema);\n return response.agentId;\n }\n\n /** Partial update of an existing agent by ID */\n async update(agentId: string, update: AgentUpdateInput): Promise<string> {\n const response = await this.httpPatch(\n `/api/agents/${agentId}`,\n update,\n agentUpdateResponseSchema,\n );\n return response.agentId;\n }\n\n /** Partial update of an existing agent by slug */\n async updateBySlug(slug: string, update: AgentUpdateInput): Promise<string> {\n const response = await this.httpPatch(\n `/api/agents/${slug}?by=slug`,\n update,\n agentUpdateResponseSchema,\n );\n return response.agentId;\n }\n\n /**\n * Sync an agent definition - creates if new, updates if exists\n * Returns { agentId, created: boolean }\n */\n async sync(definition: AgentDefinitionInput): Promise<{ agentId: string; created: boolean }> {\n const existing = await this.getBySlug(definition.settings.slug);\n\n if (existing) {\n // Update existing agent\n const agentId = await this.update(existing.id, {\n protocol: definition.protocol,\n prompts: definition.prompts,\n });\n return { agentId, created: false };\n }\n // Create new agent\n const agentId = await this.create(definition);\n return { agentId, created: true };\n }\n}\n","import { z } from 'zod';\nimport {\n chatMessageSchema,\n uiMessageSchema,\n type ChatMessage,\n type ToolHandlers,\n type UIMessage,\n} from '@octavus/core';\nimport { BaseApiClient } from '@/base-api-client.js';\nimport { AgentSession } from '@/session.js';\nimport type { Resource } from '@/resource.js';\n\nconst createSessionResponseSchema = z.object({\n sessionId: z.string(),\n});\n\nconst sessionStateSchema = z.object({\n id: z.string(),\n agentId: z.string(),\n input: z.record(z.string(), z.unknown()),\n variables: z.record(z.string(), z.unknown()),\n resources: z.record(z.string(), z.unknown()),\n messages: z.array(chatMessageSchema),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\n\nconst uiSessionResponseSchema = z.object({\n sessionId: z.string(),\n agentId: z.string(),\n messages: z.array(uiMessageSchema),\n});\n\nexport interface SessionState {\n id: string;\n agentId: string;\n input: Record<string, unknown>;\n variables: Record<string, unknown>;\n resources: Record<string, unknown>;\n messages: ChatMessage[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface UISessionState {\n sessionId: string;\n agentId: string;\n messages: UIMessage[];\n}\n\nexport interface SessionAttachOptions {\n tools?: ToolHandlers;\n resources?: Resource[];\n}\n\n/** API for managing agent sessions */\nexport class AgentSessionsApi extends BaseApiClient {\n /** Create a new session for an agent */\n async create(agentId: string, input?: Record<string, unknown>): Promise<string> {\n const response = await this.httpPost(\n '/api/agent-sessions',\n { agentId, input },\n createSessionResponseSchema,\n );\n return response.sessionId;\n }\n\n /**\n * Get full session state (for internal/debug use)\n * Note: Contains all messages including hidden content\n */\n async get(sessionId: string): Promise<SessionState> {\n return await this.httpGet(`/api/agent-sessions/${sessionId}`, sessionStateSchema);\n }\n\n /**\n * Get UI-ready session messages (for client display)\n * Returns only visible messages with hidden content filtered out\n */\n async getMessages(sessionId: string): Promise<UISessionState> {\n return await this.httpGet(\n `/api/agent-sessions/${sessionId}?format=ui`,\n uiSessionResponseSchema,\n );\n }\n\n /** Attach to an existing session for triggering events */\n attach(sessionId: string, options: SessionAttachOptions = {}): AgentSession {\n return new AgentSession({\n sessionId,\n config: this.config,\n tools: options.tools,\n resources: options.resources,\n });\n }\n}\n","import {\n safeParseStreamEvent,\n type StreamEvent,\n type ToolHandlers,\n type PendingToolCall,\n type ToolResult,\n} from '@octavus/core';\nimport { parseApiError } from '@/api-error.js';\nimport type { ApiClientConfig } from '@/base-api-client.js';\nimport type { Resource } from '@/resource.js';\n\n/**\n * Converts an async iterable of stream events to an SSE-formatted ReadableStream.\n * Use this when you need to return an SSE response (e.g., HTTP endpoints).\n *\n * @example\n * ```typescript\n * const events = session.trigger('user-message', input);\n * return new Response(toSSEStream(events), {\n * headers: { 'Content-Type': 'text/event-stream' },\n * });\n * ```\n */\nexport function toSSEStream(events: AsyncIterable<StreamEvent>): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder();\n\n return new ReadableStream({\n async start(controller) {\n try {\n for await (const event of events) {\n controller.enqueue(encoder.encode(`data: ${JSON.stringify(event)}\\n\\n`));\n }\n controller.enqueue(encoder.encode('data: [DONE]\\n\\n'));\n controller.close();\n } catch (err) {\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: 'error', errorText: err instanceof Error ? err.message : 'Unknown error' })}\\n\\n`,\n ),\n );\n controller.close();\n }\n },\n });\n}\n\nexport interface SessionConfig {\n sessionId: string;\n config: ApiClientConfig;\n tools?: ToolHandlers;\n resources?: Resource[];\n}\n\n/** Handles streaming and tool continuation for agent sessions */\nexport class AgentSession {\n private sessionId: string;\n private config: ApiClientConfig;\n private toolHandlers: ToolHandlers;\n private resourceMap: Map<string, Resource>;\n\n constructor(sessionConfig: SessionConfig) {\n this.sessionId = sessionConfig.sessionId;\n this.config = sessionConfig.config;\n this.toolHandlers = sessionConfig.tools ?? {};\n this.resourceMap = new Map();\n\n // Index resources by name for fast lookup\n for (const resource of sessionConfig.resources ?? []) {\n this.resourceMap.set(resource.name, resource);\n }\n }\n\n /**\n * Trigger an agent action and stream the response as parsed events.\n *\n * This method:\n * 1. POSTs to the platform trigger endpoint\n * 2. Yields parsed stream events to the consumer\n * 3. When tool-request event is received: executes tools locally\n * 4. POSTs a new request with toolResults to continue\n * 5. Repeats until done (no more tool requests)\n *\n * @example\n * ```typescript\n * // For sockets: iterate events directly\n * for await (const event of session.trigger('user-message', input)) {\n * conn.write(JSON.stringify(event));\n * }\n *\n * // For HTTP: convert to SSE stream\n * const events = session.trigger('user-message', input);\n * return new Response(toSSEStream(events), {\n * headers: { 'Content-Type': 'text/event-stream' },\n * });\n * ```\n */\n async *trigger(\n triggerName: string,\n triggerInput?: Record<string, unknown>,\n ): AsyncGenerator<StreamEvent> {\n let toolResults: ToolResult[] | undefined;\n let continueLoop = true;\n\n while (continueLoop) {\n // Make request to platform (with toolResults on continuation)\n const response = await fetch(\n `${this.config.baseUrl}/api/agent-sessions/${this.sessionId}/trigger`,\n {\n method: 'POST',\n headers: this.config.getHeaders(),\n body: JSON.stringify({ triggerName, input: triggerInput, toolResults }),\n },\n );\n\n if (!response.ok) {\n const { message } = await parseApiError(response, 'Failed to trigger');\n yield { type: 'error', errorText: message };\n return;\n }\n\n if (!response.body) {\n yield { type: 'error', errorText: 'Response body is not readable' };\n return;\n }\n\n // Reset tool results for next iteration\n toolResults = undefined;\n\n // Read and process the SSE stream\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let pendingToolCalls: PendingToolCall[] | null = null;\n\n // Read stream until done\n let streamDone = false;\n while (!streamDone) {\n const { done, value } = await reader.read();\n\n if (done) {\n streamDone = true;\n continue;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (line.startsWith('data: ') && line !== 'data: [DONE]') {\n try {\n const parsed = safeParseStreamEvent(JSON.parse(line.slice(6)));\n if (!parsed.success) {\n // Skip malformed events\n continue;\n }\n const event = parsed.data;\n\n // Handle tool-request - execute tools and prepare continuation\n if (event.type === 'tool-request') {\n pendingToolCalls = event.toolCalls;\n // Don't forward tool-request to consumer\n continue;\n }\n\n if (event.type === 'finish') {\n if (event.finishReason === 'tool-calls' && pendingToolCalls) {\n continue;\n }\n yield event;\n continueLoop = false;\n continue;\n }\n\n // Handle resource updates\n if (event.type === 'resource-update') {\n this.handleResourceUpdate(event.name, event.value);\n }\n\n // Yield all other events to the consumer\n yield event;\n } catch {\n // Skip malformed JSON\n }\n }\n }\n }\n\n // If we have pending tool calls, execute them and continue\n if (pendingToolCalls && pendingToolCalls.length > 0) {\n toolResults = await Promise.all(\n pendingToolCalls.map(async (tc): Promise<ToolResult> => {\n const handler = this.toolHandlers[tc.toolName];\n if (!handler) {\n return {\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n error: `No handler for tool: ${tc.toolName}`,\n outputVariable: tc.outputVariable,\n blockIndex: tc.blockIndex,\n };\n }\n\n try {\n const result = await handler(tc.args);\n return {\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n result,\n outputVariable: tc.outputVariable,\n blockIndex: tc.blockIndex,\n };\n } catch (err) {\n return {\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n error: err instanceof Error ? err.message : 'Tool execution failed',\n outputVariable: tc.outputVariable,\n blockIndex: tc.blockIndex,\n };\n }\n }),\n );\n\n // Emit tool-output events immediately so UI updates right away\n // (before making continuation request)\n for (const tr of toolResults) {\n if (tr.error) {\n yield { type: 'tool-output-error', toolCallId: tr.toolCallId, errorText: tr.error };\n } else {\n yield { type: 'tool-output-available', toolCallId: tr.toolCallId, output: tr.result };\n }\n }\n\n // Continue loop with tool results\n } else {\n // No pending tools, we're done\n continueLoop = false;\n }\n }\n }\n\n getSessionId(): string {\n return this.sessionId;\n }\n\n private handleResourceUpdate(name: string, value: unknown): void {\n const resource = this.resourceMap.get(name);\n if (resource) {\n void resource.onUpdate(value);\n }\n }\n}\n","import { z } from 'zod';\nimport { BaseApiClient } from '@/base-api-client.js';\n\n// =============================================================================\n// Schemas\n// =============================================================================\n\n/**\n * Schema for a single file upload request\n */\nexport const fileUploadRequestSchema = z.object({\n filename: z.string().min(1).max(255),\n mediaType: z.string().min(1),\n size: z.number().int().positive(),\n});\n\n/**\n * Schema for a single file upload response\n */\nexport const fileUploadInfoSchema = z.object({\n /** File ID to reference in messages */\n id: z.string(),\n /** Presigned PUT URL for uploading to S3 */\n uploadUrl: z.url(),\n /** Presigned GET URL for downloading after upload */\n downloadUrl: z.url(),\n});\n\n/**\n * Schema for the upload URLs response\n */\nexport const uploadUrlsResponseSchema = z.object({\n files: z.array(fileUploadInfoSchema),\n});\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type FileUploadRequest = z.infer<typeof fileUploadRequestSchema>;\nexport type FileUploadInfo = z.infer<typeof fileUploadInfoSchema>;\nexport type UploadUrlsResponse = z.infer<typeof uploadUrlsResponseSchema>;\n\n// =============================================================================\n// API\n// =============================================================================\n\n/**\n * API for file operations.\n *\n * Provides methods to generate presigned URLs for file uploads.\n * Files are uploaded directly to S3, not through the platform.\n *\n * @example\n * ```typescript\n * // Get upload URLs\n * const { files } = await client.files.getUploadUrls(sessionId, [\n * { filename: 'image.png', mediaType: 'image/png', size: 12345 }\n * ]);\n *\n * // Upload directly to S3\n * await fetch(files[0].uploadUrl, {\n * method: 'PUT',\n * body: imageFile,\n * headers: { 'Content-Type': 'image/png' }\n * });\n *\n * // Use downloadUrl as FileReference in trigger input\n * ```\n */\nexport class FilesApi extends BaseApiClient {\n /**\n * Get presigned URLs for uploading files to a session.\n *\n * Returns upload URLs (PUT) and download URLs (GET) for each file.\n * Upload URLs expire in 15 minutes, download URLs match session TTL (24 hours).\n *\n * @param sessionId - The session ID to associate files with\n * @param files - Array of file metadata (filename, mediaType, size)\n * @returns Upload info with presigned URLs for each file\n *\n * @throws ApiError if session doesn't exist or validation fails\n *\n * @example\n * ```typescript\n * const { files } = await client.files.getUploadUrls(sessionId, [\n * { filename: 'photo.jpg', mediaType: 'image/jpeg', size: 102400 },\n * { filename: 'doc.pdf', mediaType: 'application/pdf', size: 204800 },\n * ]);\n *\n * // files[0].id - Use in FileReference\n * // files[0].uploadUrl - PUT to this URL\n * // files[0].downloadUrl - Use as FileReference.url\n * ```\n */\n async getUploadUrls(sessionId: string, files: FileUploadRequest[]): Promise<UploadUrlsResponse> {\n return await this.httpPost(\n '/api/files/upload-urls',\n { sessionId, files },\n uploadUrlsResponseSchema,\n );\n }\n}\n","import type { ApiClientConfig } from '@/base-api-client.js';\nimport { AgentsApi } from '@/agents.js';\nimport { AgentSessionsApi } from '@/agent-sessions.js';\nimport { FilesApi } from '@/files.js';\n\nexport interface OctavusClientConfig {\n baseUrl: string;\n apiKey?: string;\n}\n\n/** Client for interacting with the Octavus platform API */\nexport class OctavusClient {\n readonly agents: AgentsApi;\n readonly agentSessions: AgentSessionsApi;\n readonly files: FilesApi;\n readonly baseUrl: string;\n private readonly apiKey?: string;\n\n constructor(config: OctavusClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n this.apiKey = config.apiKey;\n\n const apiConfig: ApiClientConfig = {\n baseUrl: this.baseUrl,\n getHeaders: () => this.getHeaders(),\n };\n\n this.agents = new AgentsApi(apiConfig);\n this.agentSessions = new AgentSessionsApi(apiConfig);\n this.files = new FilesApi(apiConfig);\n }\n\n getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (this.apiKey) {\n headers.Authorization = `Bearer ${this.apiKey}`;\n }\n\n return headers;\n }\n}\n","/**\n * Base class for agent-managed resources.\n * Extend this class to define how each resource should be persisted when the agent updates it.\n */\nexport abstract class Resource {\n /** The resource name as defined in the agent protocol */\n abstract readonly name: string;\n\n /** Called when the agent updates this resource */\n abstract onUpdate(value: unknown): Promise<void> | void;\n}\n"],"mappings":"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","names":["z","agentId","z","z","z","z"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@octavus/server-sdk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Server SDK for integrating Octavus agents",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Octavus AI <dev@octavus.ai>",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"zod": "^4.1.13",
|
|
33
|
-
"@octavus/core": "^0.1.
|
|
33
|
+
"@octavus/core": "^0.1.1"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"tsup": "^8.3.5",
|