@octavus/server-sdk 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/dist/index.d.ts +272 -0
- package/dist/index.js +472 -0
- package/dist/index.js.map +1 -0
- package/package.json +48 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Octavus AI
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { ZodType, z } from 'zod';
|
|
2
|
+
import { ToolHandlers, ChatMessage } from '@octavus/core';
|
|
3
|
+
export { ChatMessage, ToolHandler, ToolHandlers } from '@octavus/core';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Error thrown when API request fails
|
|
7
|
+
*/
|
|
8
|
+
declare class ApiError extends Error {
|
|
9
|
+
status: number;
|
|
10
|
+
code?: string | undefined;
|
|
11
|
+
constructor(message: string, status: number, code?: string | undefined);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
interface ApiClientConfig {
|
|
15
|
+
baseUrl: string;
|
|
16
|
+
getHeaders: () => Record<string, string>;
|
|
17
|
+
}
|
|
18
|
+
/** Base class for API clients with shared HTTP utilities */
|
|
19
|
+
declare abstract class BaseApiClient {
|
|
20
|
+
protected readonly config: ApiClientConfig;
|
|
21
|
+
constructor(config: ApiClientConfig);
|
|
22
|
+
protected httpGet<T>(path: string, schema: ZodType<T>): Promise<T>;
|
|
23
|
+
protected httpPost<T>(path: string, body: unknown, schema: ZodType<T>): Promise<T>;
|
|
24
|
+
protected httpPatch<T>(path: string, body: unknown, schema: ZodType<T>): Promise<T>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Agent format - interactive (chat) or generation (background task) */
|
|
28
|
+
type AgentFormat = 'interactive' | 'generation';
|
|
29
|
+
/**
|
|
30
|
+
* Agent settings input - used when creating/updating agents
|
|
31
|
+
*/
|
|
32
|
+
interface AgentSettingsInput {
|
|
33
|
+
slug: string;
|
|
34
|
+
name: string;
|
|
35
|
+
description?: string;
|
|
36
|
+
format: AgentFormat;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Agent prompt - shared between input and response
|
|
40
|
+
*/
|
|
41
|
+
interface AgentPrompt {
|
|
42
|
+
name: string;
|
|
43
|
+
content: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Input for creating/updating an agent definition
|
|
47
|
+
*/
|
|
48
|
+
interface AgentDefinitionInput {
|
|
49
|
+
settings: AgentSettingsInput;
|
|
50
|
+
protocol: string;
|
|
51
|
+
prompts: AgentPrompt[];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Agent summary returned from list endpoint
|
|
55
|
+
*/
|
|
56
|
+
interface Agent {
|
|
57
|
+
/** Agent slug (human-readable identifier within project) */
|
|
58
|
+
slug: string;
|
|
59
|
+
/** Database ID - use this for API calls */
|
|
60
|
+
id: string;
|
|
61
|
+
name: string;
|
|
62
|
+
description: string | null;
|
|
63
|
+
format: AgentFormat;
|
|
64
|
+
createdAt: string;
|
|
65
|
+
updatedAt: string;
|
|
66
|
+
projectId: string;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Full agent definition returned from get endpoint
|
|
70
|
+
*/
|
|
71
|
+
interface AgentDefinition {
|
|
72
|
+
settings: AgentSettingsInput;
|
|
73
|
+
protocol: string;
|
|
74
|
+
prompts: AgentPrompt[];
|
|
75
|
+
/** Database ID - use this for API calls like createSession */
|
|
76
|
+
id: string;
|
|
77
|
+
}
|
|
78
|
+
declare const agentFormatSchema: z.ZodEnum<{
|
|
79
|
+
interactive: "interactive";
|
|
80
|
+
generation: "generation";
|
|
81
|
+
}>;
|
|
82
|
+
declare const agentSettingsInputSchema: z.ZodObject<{
|
|
83
|
+
slug: z.ZodString;
|
|
84
|
+
name: z.ZodString;
|
|
85
|
+
description: z.ZodOptional<z.ZodString>;
|
|
86
|
+
format: z.ZodEnum<{
|
|
87
|
+
interactive: "interactive";
|
|
88
|
+
generation: "generation";
|
|
89
|
+
}>;
|
|
90
|
+
}, z.core.$strip>;
|
|
91
|
+
declare const agentPromptSchema: z.ZodObject<{
|
|
92
|
+
name: z.ZodString;
|
|
93
|
+
content: z.ZodString;
|
|
94
|
+
}, z.core.$strip>;
|
|
95
|
+
declare const agentDefinitionInputSchema: z.ZodObject<{
|
|
96
|
+
settings: z.ZodObject<{
|
|
97
|
+
slug: z.ZodString;
|
|
98
|
+
name: z.ZodString;
|
|
99
|
+
description: z.ZodOptional<z.ZodString>;
|
|
100
|
+
format: z.ZodEnum<{
|
|
101
|
+
interactive: "interactive";
|
|
102
|
+
generation: "generation";
|
|
103
|
+
}>;
|
|
104
|
+
}, z.core.$strip>;
|
|
105
|
+
protocol: z.ZodString;
|
|
106
|
+
prompts: z.ZodArray<z.ZodObject<{
|
|
107
|
+
name: z.ZodString;
|
|
108
|
+
content: z.ZodString;
|
|
109
|
+
}, z.core.$strip>>;
|
|
110
|
+
}, z.core.$strip>;
|
|
111
|
+
declare const agentSchema: z.ZodObject<{
|
|
112
|
+
slug: z.ZodString;
|
|
113
|
+
id: z.ZodString;
|
|
114
|
+
name: z.ZodString;
|
|
115
|
+
description: z.ZodNullable<z.ZodString>;
|
|
116
|
+
format: z.ZodEnum<{
|
|
117
|
+
interactive: "interactive";
|
|
118
|
+
generation: "generation";
|
|
119
|
+
}>;
|
|
120
|
+
createdAt: z.ZodString;
|
|
121
|
+
updatedAt: z.ZodString;
|
|
122
|
+
projectId: z.ZodString;
|
|
123
|
+
}, z.core.$strip>;
|
|
124
|
+
declare const agentsResponseSchema: z.ZodObject<{
|
|
125
|
+
agents: z.ZodArray<z.ZodObject<{
|
|
126
|
+
slug: z.ZodString;
|
|
127
|
+
id: z.ZodString;
|
|
128
|
+
name: z.ZodString;
|
|
129
|
+
description: z.ZodNullable<z.ZodString>;
|
|
130
|
+
format: z.ZodEnum<{
|
|
131
|
+
interactive: "interactive";
|
|
132
|
+
generation: "generation";
|
|
133
|
+
}>;
|
|
134
|
+
createdAt: z.ZodString;
|
|
135
|
+
updatedAt: z.ZodString;
|
|
136
|
+
projectId: z.ZodString;
|
|
137
|
+
}, z.core.$strip>>;
|
|
138
|
+
}, z.core.$strip>;
|
|
139
|
+
declare const agentDefinitionSchema: z.ZodObject<{
|
|
140
|
+
settings: z.ZodObject<{
|
|
141
|
+
slug: z.ZodString;
|
|
142
|
+
name: z.ZodString;
|
|
143
|
+
description: z.ZodOptional<z.ZodString>;
|
|
144
|
+
format: z.ZodEnum<{
|
|
145
|
+
interactive: "interactive";
|
|
146
|
+
generation: "generation";
|
|
147
|
+
}>;
|
|
148
|
+
}, z.core.$strip>;
|
|
149
|
+
protocol: z.ZodString;
|
|
150
|
+
prompts: z.ZodArray<z.ZodObject<{
|
|
151
|
+
name: z.ZodString;
|
|
152
|
+
content: z.ZodString;
|
|
153
|
+
}, z.core.$strip>>;
|
|
154
|
+
id: z.ZodString;
|
|
155
|
+
}, z.core.$strip>;
|
|
156
|
+
declare const agentCreateResponseSchema: z.ZodObject<{
|
|
157
|
+
agentId: z.ZodString;
|
|
158
|
+
message: z.ZodString;
|
|
159
|
+
}, z.core.$strip>;
|
|
160
|
+
declare const agentUpdateResponseSchema: z.ZodObject<{
|
|
161
|
+
agentId: z.ZodString;
|
|
162
|
+
message: z.ZodString;
|
|
163
|
+
}, z.core.$strip>;
|
|
164
|
+
|
|
165
|
+
interface AgentUpdateInput {
|
|
166
|
+
protocol?: string;
|
|
167
|
+
prompts?: AgentPrompt[];
|
|
168
|
+
}
|
|
169
|
+
/** API for managing agent definitions */
|
|
170
|
+
declare class AgentsApi extends BaseApiClient {
|
|
171
|
+
/** List all agents */
|
|
172
|
+
list(): Promise<Agent[]>;
|
|
173
|
+
/** Get a single agent by ID */
|
|
174
|
+
get(agentId: string): Promise<AgentDefinition>;
|
|
175
|
+
/** Get a single agent by slug */
|
|
176
|
+
getBySlug(slug: string): Promise<AgentDefinition | null>;
|
|
177
|
+
/** Create a new agent. Throws if agent with same slug exists. */
|
|
178
|
+
create(definition: AgentDefinitionInput): Promise<string>;
|
|
179
|
+
/** Partial update of an existing agent by ID */
|
|
180
|
+
update(agentId: string, update: AgentUpdateInput): Promise<string>;
|
|
181
|
+
/** Partial update of an existing agent by slug */
|
|
182
|
+
updateBySlug(slug: string, update: AgentUpdateInput): Promise<string>;
|
|
183
|
+
/**
|
|
184
|
+
* Sync an agent definition - creates if new, updates if exists
|
|
185
|
+
* Returns { agentId, created: boolean }
|
|
186
|
+
*/
|
|
187
|
+
sync(definition: AgentDefinitionInput): Promise<{
|
|
188
|
+
agentId: string;
|
|
189
|
+
created: boolean;
|
|
190
|
+
}>;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Base class for agent-managed resources.
|
|
195
|
+
* Extend this class to define how each resource should be persisted when the agent updates it.
|
|
196
|
+
*/
|
|
197
|
+
declare abstract class Resource {
|
|
198
|
+
/** The resource name as defined in the agent protocol */
|
|
199
|
+
abstract readonly name: string;
|
|
200
|
+
/** Called when the agent updates this resource */
|
|
201
|
+
abstract onUpdate(value: unknown): Promise<void> | void;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
interface SessionConfig {
|
|
205
|
+
sessionId: string;
|
|
206
|
+
config: ApiClientConfig;
|
|
207
|
+
tools?: ToolHandlers;
|
|
208
|
+
resources?: Resource[];
|
|
209
|
+
}
|
|
210
|
+
/** Handles streaming and tool continuation for agent sessions */
|
|
211
|
+
declare class AgentSession {
|
|
212
|
+
private sessionId;
|
|
213
|
+
private config;
|
|
214
|
+
private toolHandlers;
|
|
215
|
+
private resourceMap;
|
|
216
|
+
constructor(sessionConfig: SessionConfig);
|
|
217
|
+
/**
|
|
218
|
+
* Trigger an agent action and stream the response.
|
|
219
|
+
*
|
|
220
|
+
* This method:
|
|
221
|
+
* 1. POSTs to the platform trigger endpoint
|
|
222
|
+
* 2. Reads the SSE stream, forwarding events to consumer
|
|
223
|
+
* 3. When tool-request event is received: executes tools locally
|
|
224
|
+
* 4. POSTs a new request with toolResults to continue
|
|
225
|
+
* 5. Repeats until done (no more tool requests)
|
|
226
|
+
*/
|
|
227
|
+
trigger(triggerName: string, triggerInput?: Record<string, unknown>): {
|
|
228
|
+
stream: ReadableStream<Uint8Array>;
|
|
229
|
+
};
|
|
230
|
+
getSessionId(): string;
|
|
231
|
+
private handleResourceUpdate;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
interface SessionState {
|
|
235
|
+
id: string;
|
|
236
|
+
agentId: string;
|
|
237
|
+
input: Record<string, unknown>;
|
|
238
|
+
variables: Record<string, unknown>;
|
|
239
|
+
resources: Record<string, unknown>;
|
|
240
|
+
messages: ChatMessage[];
|
|
241
|
+
createdAt: string;
|
|
242
|
+
updatedAt: string;
|
|
243
|
+
}
|
|
244
|
+
interface SessionAttachOptions {
|
|
245
|
+
tools?: ToolHandlers;
|
|
246
|
+
resources?: Resource[];
|
|
247
|
+
}
|
|
248
|
+
/** API for managing agent sessions */
|
|
249
|
+
declare class AgentSessionsApi extends BaseApiClient {
|
|
250
|
+
/** Create a new session for an agent */
|
|
251
|
+
create(agentId: string, input?: Record<string, unknown>): Promise<string>;
|
|
252
|
+
/** Get session state */
|
|
253
|
+
get(sessionId: string): Promise<SessionState>;
|
|
254
|
+
/** Attach to an existing session for triggering events */
|
|
255
|
+
attach(sessionId: string, options?: SessionAttachOptions): AgentSession;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
interface OctavusClientConfig {
|
|
259
|
+
baseUrl: string;
|
|
260
|
+
apiKey?: string;
|
|
261
|
+
}
|
|
262
|
+
/** Client for interacting with the Octavus platform API */
|
|
263
|
+
declare class OctavusClient {
|
|
264
|
+
readonly agents: AgentsApi;
|
|
265
|
+
readonly agentSessions: AgentSessionsApi;
|
|
266
|
+
readonly baseUrl: string;
|
|
267
|
+
private readonly apiKey?;
|
|
268
|
+
constructor(config: OctavusClientConfig);
|
|
269
|
+
getHeaders(): Record<string, string>;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
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, agentCreateResponseSchema, agentDefinitionInputSchema, agentDefinitionSchema, agentFormatSchema, agentPromptSchema, agentSchema, agentSettingsInputSchema, agentUpdateResponseSchema, agentsResponseSchema };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
// src/api-error.ts
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
var ApiErrorResponseSchema = z.object({
|
|
4
|
+
error: z.string().optional(),
|
|
5
|
+
message: z.string().optional(),
|
|
6
|
+
code: z.string().optional()
|
|
7
|
+
});
|
|
8
|
+
var ApiError = class extends Error {
|
|
9
|
+
constructor(message, status, code) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.status = status;
|
|
12
|
+
this.code = code;
|
|
13
|
+
this.name = "ApiError";
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
async function parseApiError(response, defaultMessage) {
|
|
17
|
+
const fallbackMessage = `${defaultMessage}: ${response.statusText}`;
|
|
18
|
+
try {
|
|
19
|
+
const json = await response.json();
|
|
20
|
+
const parsed = ApiErrorResponseSchema.safeParse(json);
|
|
21
|
+
if (parsed.success) {
|
|
22
|
+
return {
|
|
23
|
+
message: parsed.data.error ?? parsed.data.message ?? fallbackMessage,
|
|
24
|
+
code: parsed.data.code
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
} catch {
|
|
28
|
+
}
|
|
29
|
+
return { message: fallbackMessage };
|
|
30
|
+
}
|
|
31
|
+
async function throwApiError(response, defaultMessage) {
|
|
32
|
+
const { message, code } = await parseApiError(response, defaultMessage);
|
|
33
|
+
throw new ApiError(message, response.status, code);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// src/base-api-client.ts
|
|
37
|
+
var BaseApiClient = class {
|
|
38
|
+
config;
|
|
39
|
+
constructor(config) {
|
|
40
|
+
this.config = config;
|
|
41
|
+
}
|
|
42
|
+
async httpGet(path, schema) {
|
|
43
|
+
const response = await fetch(`${this.config.baseUrl}${path}`, {
|
|
44
|
+
method: "GET",
|
|
45
|
+
headers: this.config.getHeaders()
|
|
46
|
+
});
|
|
47
|
+
if (!response.ok) {
|
|
48
|
+
await throwApiError(response, "Request failed");
|
|
49
|
+
}
|
|
50
|
+
const data = await response.json();
|
|
51
|
+
return schema.parse(data);
|
|
52
|
+
}
|
|
53
|
+
async httpPost(path, body, schema) {
|
|
54
|
+
const response = await fetch(`${this.config.baseUrl}${path}`, {
|
|
55
|
+
method: "POST",
|
|
56
|
+
headers: this.config.getHeaders(),
|
|
57
|
+
body: JSON.stringify(body)
|
|
58
|
+
});
|
|
59
|
+
if (!response.ok) {
|
|
60
|
+
await throwApiError(response, "Request failed");
|
|
61
|
+
}
|
|
62
|
+
const data = await response.json();
|
|
63
|
+
return schema.parse(data);
|
|
64
|
+
}
|
|
65
|
+
async httpPatch(path, body, schema) {
|
|
66
|
+
const response = await fetch(`${this.config.baseUrl}${path}`, {
|
|
67
|
+
method: "PATCH",
|
|
68
|
+
headers: this.config.getHeaders(),
|
|
69
|
+
body: JSON.stringify(body)
|
|
70
|
+
});
|
|
71
|
+
if (!response.ok) {
|
|
72
|
+
await throwApiError(response, "Request failed");
|
|
73
|
+
}
|
|
74
|
+
const data = await response.json();
|
|
75
|
+
return schema.parse(data);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
// src/agent-types.ts
|
|
80
|
+
import { z as z2 } from "zod";
|
|
81
|
+
var agentFormatSchema = z2.enum(["interactive", "generation"]);
|
|
82
|
+
var agentSettingsInputSchema = z2.object({
|
|
83
|
+
slug: z2.string().min(1),
|
|
84
|
+
name: z2.string().min(1),
|
|
85
|
+
description: z2.string().optional(),
|
|
86
|
+
format: agentFormatSchema
|
|
87
|
+
});
|
|
88
|
+
var agentPromptSchema = z2.object({
|
|
89
|
+
name: z2.string().min(1),
|
|
90
|
+
content: z2.string()
|
|
91
|
+
});
|
|
92
|
+
var agentDefinitionInputSchema = z2.object({
|
|
93
|
+
settings: agentSettingsInputSchema,
|
|
94
|
+
protocol: z2.string().min(1),
|
|
95
|
+
prompts: z2.array(agentPromptSchema)
|
|
96
|
+
});
|
|
97
|
+
var agentSchema = z2.object({
|
|
98
|
+
slug: z2.string(),
|
|
99
|
+
id: z2.string(),
|
|
100
|
+
name: z2.string(),
|
|
101
|
+
description: z2.string().nullable(),
|
|
102
|
+
format: agentFormatSchema,
|
|
103
|
+
createdAt: z2.string(),
|
|
104
|
+
updatedAt: z2.string(),
|
|
105
|
+
projectId: z2.string()
|
|
106
|
+
});
|
|
107
|
+
var agentsResponseSchema = z2.object({
|
|
108
|
+
agents: z2.array(agentSchema)
|
|
109
|
+
});
|
|
110
|
+
var agentDefinitionSchema = z2.object({
|
|
111
|
+
settings: agentSettingsInputSchema,
|
|
112
|
+
protocol: z2.string(),
|
|
113
|
+
prompts: z2.array(agentPromptSchema),
|
|
114
|
+
id: z2.string()
|
|
115
|
+
});
|
|
116
|
+
var agentCreateResponseSchema = z2.object({
|
|
117
|
+
agentId: z2.string(),
|
|
118
|
+
message: z2.string()
|
|
119
|
+
});
|
|
120
|
+
var agentUpdateResponseSchema = z2.object({
|
|
121
|
+
agentId: z2.string(),
|
|
122
|
+
message: z2.string()
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
// src/agents.ts
|
|
126
|
+
var AgentsApi = class extends BaseApiClient {
|
|
127
|
+
/** List all agents */
|
|
128
|
+
async list() {
|
|
129
|
+
const response = await this.httpGet("/api/agents", agentsResponseSchema);
|
|
130
|
+
return response.agents;
|
|
131
|
+
}
|
|
132
|
+
/** Get a single agent by ID */
|
|
133
|
+
async get(agentId) {
|
|
134
|
+
return await this.httpGet(`/api/agents/${agentId}`, agentDefinitionSchema);
|
|
135
|
+
}
|
|
136
|
+
/** Get a single agent by slug */
|
|
137
|
+
async getBySlug(slug) {
|
|
138
|
+
try {
|
|
139
|
+
return await this.httpGet(`/api/agents/${slug}?by=slug`, agentDefinitionSchema);
|
|
140
|
+
} catch (error) {
|
|
141
|
+
if (error instanceof ApiError && error.status === 404) {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
throw error;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/** Create a new agent. Throws if agent with same slug exists. */
|
|
148
|
+
async create(definition) {
|
|
149
|
+
const response = await this.httpPost("/api/agents", definition, agentCreateResponseSchema);
|
|
150
|
+
return response.agentId;
|
|
151
|
+
}
|
|
152
|
+
/** Partial update of an existing agent by ID */
|
|
153
|
+
async update(agentId, update) {
|
|
154
|
+
const response = await this.httpPatch(
|
|
155
|
+
`/api/agents/${agentId}`,
|
|
156
|
+
update,
|
|
157
|
+
agentUpdateResponseSchema
|
|
158
|
+
);
|
|
159
|
+
return response.agentId;
|
|
160
|
+
}
|
|
161
|
+
/** Partial update of an existing agent by slug */
|
|
162
|
+
async updateBySlug(slug, update) {
|
|
163
|
+
const response = await this.httpPatch(
|
|
164
|
+
`/api/agents/${slug}?by=slug`,
|
|
165
|
+
update,
|
|
166
|
+
agentUpdateResponseSchema
|
|
167
|
+
);
|
|
168
|
+
return response.agentId;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Sync an agent definition - creates if new, updates if exists
|
|
172
|
+
* Returns { agentId, created: boolean }
|
|
173
|
+
*/
|
|
174
|
+
async sync(definition) {
|
|
175
|
+
const existing = await this.getBySlug(definition.settings.slug);
|
|
176
|
+
if (existing) {
|
|
177
|
+
const agentId2 = await this.update(existing.id, {
|
|
178
|
+
protocol: definition.protocol,
|
|
179
|
+
prompts: definition.prompts
|
|
180
|
+
});
|
|
181
|
+
return { agentId: agentId2, created: false };
|
|
182
|
+
}
|
|
183
|
+
const agentId = await this.create(definition);
|
|
184
|
+
return { agentId, created: true };
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
// src/agent-sessions.ts
|
|
189
|
+
import { z as z3 } from "zod";
|
|
190
|
+
import { chatMessageSchema } from "@octavus/core";
|
|
191
|
+
|
|
192
|
+
// src/session.ts
|
|
193
|
+
import {
|
|
194
|
+
safeParseStreamEvent
|
|
195
|
+
} from "@octavus/core";
|
|
196
|
+
var AgentSession = class {
|
|
197
|
+
sessionId;
|
|
198
|
+
config;
|
|
199
|
+
toolHandlers;
|
|
200
|
+
resourceMap;
|
|
201
|
+
constructor(sessionConfig) {
|
|
202
|
+
this.sessionId = sessionConfig.sessionId;
|
|
203
|
+
this.config = sessionConfig.config;
|
|
204
|
+
this.toolHandlers = sessionConfig.tools ?? {};
|
|
205
|
+
this.resourceMap = /* @__PURE__ */ new Map();
|
|
206
|
+
for (const resource of sessionConfig.resources ?? []) {
|
|
207
|
+
this.resourceMap.set(resource.name, resource);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Trigger an agent action and stream the response.
|
|
212
|
+
*
|
|
213
|
+
* This method:
|
|
214
|
+
* 1. POSTs to the platform trigger endpoint
|
|
215
|
+
* 2. Reads the SSE stream, forwarding events to consumer
|
|
216
|
+
* 3. When tool-request event is received: executes tools locally
|
|
217
|
+
* 4. POSTs a new request with toolResults to continue
|
|
218
|
+
* 5. Repeats until done (no more tool requests)
|
|
219
|
+
*/
|
|
220
|
+
trigger(triggerName, triggerInput) {
|
|
221
|
+
const encoder = new TextEncoder();
|
|
222
|
+
const sessionId = this.sessionId;
|
|
223
|
+
const config = this.config;
|
|
224
|
+
const tools = this.toolHandlers;
|
|
225
|
+
const onResourceUpdate = (name, value) => this.handleResourceUpdate(name, value);
|
|
226
|
+
const { readable, writable } = new TransformStream();
|
|
227
|
+
const streamWriter = writable.getWriter();
|
|
228
|
+
async function executeContinuationLoop() {
|
|
229
|
+
let toolResults;
|
|
230
|
+
let continueLoop = true;
|
|
231
|
+
try {
|
|
232
|
+
while (continueLoop) {
|
|
233
|
+
const response = await fetch(
|
|
234
|
+
`${config.baseUrl}/api/agent-sessions/${sessionId}/trigger`,
|
|
235
|
+
{
|
|
236
|
+
method: "POST",
|
|
237
|
+
headers: config.getHeaders(),
|
|
238
|
+
body: JSON.stringify({ triggerName, input: triggerInput, toolResults })
|
|
239
|
+
}
|
|
240
|
+
);
|
|
241
|
+
if (!response.ok) {
|
|
242
|
+
const { message } = await parseApiError(response, "Failed to trigger");
|
|
243
|
+
await streamWriter.write(
|
|
244
|
+
encoder.encode(`data: ${JSON.stringify({ type: "error", message })}
|
|
245
|
+
|
|
246
|
+
`)
|
|
247
|
+
);
|
|
248
|
+
await streamWriter.close();
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
if (!response.body) {
|
|
252
|
+
throw new Error("Response body is not readable");
|
|
253
|
+
}
|
|
254
|
+
toolResults = void 0;
|
|
255
|
+
const reader = response.body.getReader();
|
|
256
|
+
const decoder = new TextDecoder();
|
|
257
|
+
let buffer = "";
|
|
258
|
+
let pendingToolCalls = null;
|
|
259
|
+
let streamDone = false;
|
|
260
|
+
while (!streamDone) {
|
|
261
|
+
const { done, value } = await reader.read();
|
|
262
|
+
if (done) {
|
|
263
|
+
streamDone = true;
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
buffer += decoder.decode(value, { stream: true });
|
|
267
|
+
const lines = buffer.split("\n");
|
|
268
|
+
buffer = lines.pop() ?? "";
|
|
269
|
+
for (const line of lines) {
|
|
270
|
+
if (line.startsWith("data: ") && line !== "data: [DONE]") {
|
|
271
|
+
try {
|
|
272
|
+
const parsed = safeParseStreamEvent(JSON.parse(line.slice(6)));
|
|
273
|
+
if (!parsed.success) {
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
276
|
+
const event = parsed.data;
|
|
277
|
+
if (event.type === "tool-request") {
|
|
278
|
+
pendingToolCalls = event.toolCalls;
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
if (event.type === "done") {
|
|
282
|
+
if (event.finishReason === "tool-calls" && pendingToolCalls) {
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
await streamWriter.write(encoder.encode(`data: ${JSON.stringify(event)}
|
|
286
|
+
|
|
287
|
+
`));
|
|
288
|
+
continueLoop = false;
|
|
289
|
+
continue;
|
|
290
|
+
}
|
|
291
|
+
if (event.type === "resource-update") {
|
|
292
|
+
onResourceUpdate(event.name, event.value);
|
|
293
|
+
}
|
|
294
|
+
await streamWriter.write(encoder.encode(`data: ${JSON.stringify(event)}
|
|
295
|
+
|
|
296
|
+
`));
|
|
297
|
+
} catch {
|
|
298
|
+
}
|
|
299
|
+
} else if (line === "data: [DONE]") {
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
if (pendingToolCalls && pendingToolCalls.length > 0) {
|
|
304
|
+
toolResults = await Promise.all(
|
|
305
|
+
pendingToolCalls.map(async (tc) => {
|
|
306
|
+
const handler = tools[tc.toolName];
|
|
307
|
+
if (!handler) {
|
|
308
|
+
return {
|
|
309
|
+
toolCallId: tc.toolCallId,
|
|
310
|
+
toolName: tc.toolName,
|
|
311
|
+
error: `No handler for tool: ${tc.toolName}`,
|
|
312
|
+
outputVariable: tc.outputVariable,
|
|
313
|
+
blockIndex: tc.blockIndex
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
try {
|
|
317
|
+
const result = await handler(tc.args);
|
|
318
|
+
return {
|
|
319
|
+
toolCallId: tc.toolCallId,
|
|
320
|
+
toolName: tc.toolName,
|
|
321
|
+
result,
|
|
322
|
+
outputVariable: tc.outputVariable,
|
|
323
|
+
blockIndex: tc.blockIndex
|
|
324
|
+
};
|
|
325
|
+
} catch (err) {
|
|
326
|
+
return {
|
|
327
|
+
toolCallId: tc.toolCallId,
|
|
328
|
+
toolName: tc.toolName,
|
|
329
|
+
error: err instanceof Error ? err.message : "Tool execution failed",
|
|
330
|
+
outputVariable: tc.outputVariable,
|
|
331
|
+
blockIndex: tc.blockIndex
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
})
|
|
335
|
+
);
|
|
336
|
+
for (const tr of toolResults) {
|
|
337
|
+
if (tr.error) {
|
|
338
|
+
await streamWriter.write(
|
|
339
|
+
encoder.encode(
|
|
340
|
+
`data: ${JSON.stringify({ type: "tool-call-error", toolCallId: tr.toolCallId, error: tr.error })}
|
|
341
|
+
|
|
342
|
+
`
|
|
343
|
+
)
|
|
344
|
+
);
|
|
345
|
+
} else {
|
|
346
|
+
await streamWriter.write(
|
|
347
|
+
encoder.encode(
|
|
348
|
+
`data: ${JSON.stringify({ type: "tool-call-result", toolCallId: tr.toolCallId, result: tr.result })}
|
|
349
|
+
|
|
350
|
+
`
|
|
351
|
+
)
|
|
352
|
+
);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
} else {
|
|
356
|
+
continueLoop = false;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
await streamWriter.write(encoder.encode("data: [DONE]\n\n"));
|
|
360
|
+
await streamWriter.close();
|
|
361
|
+
} catch (err) {
|
|
362
|
+
await streamWriter.write(
|
|
363
|
+
encoder.encode(
|
|
364
|
+
`data: ${JSON.stringify({ type: "error", message: err instanceof Error ? err.message : "Unknown error" })}
|
|
365
|
+
|
|
366
|
+
`
|
|
367
|
+
)
|
|
368
|
+
);
|
|
369
|
+
await streamWriter.close();
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
void executeContinuationLoop();
|
|
373
|
+
return { stream: readable };
|
|
374
|
+
}
|
|
375
|
+
getSessionId() {
|
|
376
|
+
return this.sessionId;
|
|
377
|
+
}
|
|
378
|
+
handleResourceUpdate(name, value) {
|
|
379
|
+
const resource = this.resourceMap.get(name);
|
|
380
|
+
if (resource) {
|
|
381
|
+
void resource.onUpdate(value);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
};
|
|
385
|
+
|
|
386
|
+
// src/agent-sessions.ts
|
|
387
|
+
var createSessionResponseSchema = z3.object({
|
|
388
|
+
sessionId: z3.string()
|
|
389
|
+
});
|
|
390
|
+
var sessionStateSchema = z3.object({
|
|
391
|
+
id: z3.string(),
|
|
392
|
+
agentId: z3.string(),
|
|
393
|
+
input: z3.record(z3.string(), z3.unknown()),
|
|
394
|
+
variables: z3.record(z3.string(), z3.unknown()),
|
|
395
|
+
resources: z3.record(z3.string(), z3.unknown()),
|
|
396
|
+
messages: z3.array(chatMessageSchema),
|
|
397
|
+
createdAt: z3.string(),
|
|
398
|
+
updatedAt: z3.string()
|
|
399
|
+
});
|
|
400
|
+
var AgentSessionsApi = class extends BaseApiClient {
|
|
401
|
+
/** Create a new session for an agent */
|
|
402
|
+
async create(agentId, input) {
|
|
403
|
+
const response = await this.httpPost(
|
|
404
|
+
"/api/agent-sessions",
|
|
405
|
+
{ agentId, input },
|
|
406
|
+
createSessionResponseSchema
|
|
407
|
+
);
|
|
408
|
+
return response.sessionId;
|
|
409
|
+
}
|
|
410
|
+
/** Get session state */
|
|
411
|
+
async get(sessionId) {
|
|
412
|
+
return await this.httpGet(`/api/agent-sessions/${sessionId}`, sessionStateSchema);
|
|
413
|
+
}
|
|
414
|
+
/** Attach to an existing session for triggering events */
|
|
415
|
+
attach(sessionId, options = {}) {
|
|
416
|
+
return new AgentSession({
|
|
417
|
+
sessionId,
|
|
418
|
+
config: this.config,
|
|
419
|
+
tools: options.tools,
|
|
420
|
+
resources: options.resources
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
};
|
|
424
|
+
|
|
425
|
+
// src/client.ts
|
|
426
|
+
var OctavusClient = class {
|
|
427
|
+
agents;
|
|
428
|
+
agentSessions;
|
|
429
|
+
baseUrl;
|
|
430
|
+
apiKey;
|
|
431
|
+
constructor(config) {
|
|
432
|
+
this.baseUrl = config.baseUrl.replace(/\/$/, "");
|
|
433
|
+
this.apiKey = config.apiKey;
|
|
434
|
+
const apiConfig = {
|
|
435
|
+
baseUrl: this.baseUrl,
|
|
436
|
+
getHeaders: () => this.getHeaders()
|
|
437
|
+
};
|
|
438
|
+
this.agents = new AgentsApi(apiConfig);
|
|
439
|
+
this.agentSessions = new AgentSessionsApi(apiConfig);
|
|
440
|
+
}
|
|
441
|
+
getHeaders() {
|
|
442
|
+
const headers = {
|
|
443
|
+
"Content-Type": "application/json"
|
|
444
|
+
};
|
|
445
|
+
if (this.apiKey) {
|
|
446
|
+
headers.Authorization = `Bearer ${this.apiKey}`;
|
|
447
|
+
}
|
|
448
|
+
return headers;
|
|
449
|
+
}
|
|
450
|
+
};
|
|
451
|
+
|
|
452
|
+
// src/resource.ts
|
|
453
|
+
var Resource = class {
|
|
454
|
+
};
|
|
455
|
+
export {
|
|
456
|
+
AgentSession,
|
|
457
|
+
AgentSessionsApi,
|
|
458
|
+
AgentsApi,
|
|
459
|
+
ApiError,
|
|
460
|
+
OctavusClient,
|
|
461
|
+
Resource,
|
|
462
|
+
agentCreateResponseSchema,
|
|
463
|
+
agentDefinitionInputSchema,
|
|
464
|
+
agentDefinitionSchema,
|
|
465
|
+
agentFormatSchema,
|
|
466
|
+
agentPromptSchema,
|
|
467
|
+
agentSchema,
|
|
468
|
+
agentSettingsInputSchema,
|
|
469
|
+
agentUpdateResponseSchema,
|
|
470
|
+
agentsResponseSchema
|
|
471
|
+
};
|
|
472
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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 /** Database 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 /** Database 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 { chatMessageSchema, type ChatMessage, type ToolHandlers } 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\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 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 /** Get session state */\n async get(sessionId: string): Promise<SessionState> {\n return await this.httpGet(`/api/agent-sessions/${sessionId}`, sessionStateSchema);\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 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\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.\n *\n * This method:\n * 1. POSTs to the platform trigger endpoint\n * 2. Reads the SSE stream, forwarding events to 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 trigger(\n triggerName: string,\n triggerInput?: Record<string, unknown>,\n ): {\n stream: ReadableStream<Uint8Array>;\n } {\n const encoder = new TextEncoder();\n const sessionId = this.sessionId;\n const config = this.config;\n const tools = this.toolHandlers;\n const onResourceUpdate = (name: string, value: unknown) =>\n this.handleResourceUpdate(name, value);\n\n // Use a TransformStream to create a controllable output\n const { readable, writable } = new TransformStream<Uint8Array, Uint8Array>();\n const streamWriter = writable.getWriter();\n\n // Execute the continuation loop in the background\n async function executeContinuationLoop() {\n let toolResults: ToolResult[] | undefined;\n let continueLoop = true;\n\n try {\n while (continueLoop) {\n // Make request to platform (with toolResults on continuation)\n const response = await fetch(\n `${config.baseUrl}/api/agent-sessions/${sessionId}/trigger`,\n {\n method: 'POST',\n headers: 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 await streamWriter.write(\n encoder.encode(`data: ${JSON.stringify({ type: 'error', message })}\\n\\n`),\n );\n await streamWriter.close();\n return;\n }\n\n if (!response.body) {\n throw new Error('Response body is not readable');\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 // Handle done event\n if (event.type === 'done') {\n if (event.finishReason === 'tool-calls' && pendingToolCalls) {\n // Tools need execution - don't forward done yet\n continue;\n }\n // Forward done event and exit loop\n await streamWriter.write(encoder.encode(`data: ${JSON.stringify(event)}\\n\\n`));\n continueLoop = false;\n continue;\n }\n\n // Handle resource updates\n if (event.type === 'resource-update') {\n onResourceUpdate(event.name, event.value);\n }\n\n // Forward all other events to the consumer\n await streamWriter.write(encoder.encode(`data: ${JSON.stringify(event)}\\n\\n`));\n } catch {\n // Skip malformed JSON\n }\n } else if (line === 'data: [DONE]') {\n // Platform stream closed\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 = tools[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-call-result events immediately so UI updates right away\n // (before making continuation request)\n for (const tr of toolResults) {\n if (tr.error) {\n await streamWriter.write(\n encoder.encode(\n `data: ${JSON.stringify({ type: 'tool-call-error', toolCallId: tr.toolCallId, error: tr.error })}\\n\\n`,\n ),\n );\n } else {\n await streamWriter.write(\n encoder.encode(\n `data: ${JSON.stringify({ type: 'tool-call-result', toolCallId: tr.toolCallId, result: tr.result })}\\n\\n`,\n ),\n );\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 // Send final DONE marker\n await streamWriter.write(encoder.encode('data: [DONE]\\n\\n'));\n await streamWriter.close();\n } catch (err) {\n await streamWriter.write(\n encoder.encode(\n `data: ${JSON.stringify({ type: 'error', message: err instanceof Error ? err.message : 'Unknown error' })}\\n\\n`,\n ),\n );\n await streamWriter.close();\n }\n }\n\n void executeContinuationLoop();\n\n return { stream: readable };\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"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@octavus/server-sdk",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Server SDK for integrating Octavus agents",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Octavus AI <hello@octavus.ai>",
|
|
7
|
+
"homepage": "https://octavus.dev",
|
|
8
|
+
"keywords": [
|
|
9
|
+
"octavus",
|
|
10
|
+
"ai",
|
|
11
|
+
"agents",
|
|
12
|
+
"sdk",
|
|
13
|
+
"server",
|
|
14
|
+
"tools"
|
|
15
|
+
],
|
|
16
|
+
"type": "module",
|
|
17
|
+
"sideEffects": false,
|
|
18
|
+
"main": "./dist/index.js",
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"exports": {
|
|
21
|
+
".": {
|
|
22
|
+
"types": "./dist/index.d.ts",
|
|
23
|
+
"import": "./dist/index.js"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"dist"
|
|
28
|
+
],
|
|
29
|
+
"publishConfig": {
|
|
30
|
+
"access": "public"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"zod": "^4.1.13",
|
|
34
|
+
"@octavus/core": "^0.0.1"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"tsup": "^8.3.5",
|
|
38
|
+
"typescript": "^5.6.3"
|
|
39
|
+
},
|
|
40
|
+
"scripts": {
|
|
41
|
+
"build": "tsup",
|
|
42
|
+
"dev": "tsup --watch",
|
|
43
|
+
"lint": "eslint src/ --max-warnings 0",
|
|
44
|
+
"lint:fix": "eslint src/ --max-warnings 0 --fix",
|
|
45
|
+
"type-check": "tsc --noEmit",
|
|
46
|
+
"clean": "rm -rf dist .turbo"
|
|
47
|
+
}
|
|
48
|
+
}
|