@octelium/console-agent 0.1.0-b-ca02.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/LICENSE +267 -0
- package/README.md +207 -0
- package/apis/octelium.binpb +0 -0
- package/dist/agent/pi/auth.d.ts +32 -0
- package/dist/agent/pi/auth.js +279 -0
- package/dist/agent/pi/auth.js.map +1 -0
- package/dist/agent/pi/backend.d.ts +77 -0
- package/dist/agent/pi/backend.js +518 -0
- package/dist/agent/pi/backend.js.map +1 -0
- package/dist/agent/pi/mapper.d.ts +33 -0
- package/dist/agent/pi/mapper.js +386 -0
- package/dist/agent/pi/mapper.js.map +1 -0
- package/dist/agent/pi/model.d.ts +47 -0
- package/dist/agent/pi/model.js +199 -0
- package/dist/agent/pi/model.js.map +1 -0
- package/dist/agent/prompt.d.ts +22 -0
- package/dist/agent/prompt.js +75 -0
- package/dist/agent/prompt.js.map +1 -0
- package/dist/agent/resources.d.ts +13 -0
- package/dist/agent/resources.js +78 -0
- package/dist/agent/resources.js.map +1 -0
- package/dist/agent/tools/builtin.d.ts +13 -0
- package/dist/agent/tools/builtin.js +80 -0
- package/dist/agent/tools/builtin.js.map +1 -0
- package/dist/agent/tools/octelium.d.ts +28 -0
- package/dist/agent/tools/octelium.js +236 -0
- package/dist/agent/tools/octelium.js.map +1 -0
- package/dist/agent/tools/present.d.ts +61 -0
- package/dist/agent/tools/present.js +273 -0
- package/dist/agent/tools/present.js.map +1 -0
- package/dist/agent/tools/util.d.ts +19 -0
- package/dist/agent/tools/util.js +103 -0
- package/dist/agent/tools/util.js.map +1 -0
- package/dist/agent/tools/web.d.ts +24 -0
- package/dist/agent/tools/web.js +237 -0
- package/dist/agent/tools/web.js.map +1 -0
- package/dist/agent/types.d.ts +60 -0
- package/dist/agent/types.js +2 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/app.d.ts +36 -0
- package/dist/app.js +126 -0
- package/dist/app.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +249 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +159 -0
- package/dist/config.js +251 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +13 -0
- package/dist/errors.js +18 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/log.d.ts +11 -0
- package/dist/log.js +41 -0
- package/dist/log.js.map +1 -0
- package/dist/octelium/catalog.d.ts +61 -0
- package/dist/octelium/catalog.js +595 -0
- package/dist/octelium/catalog.js.map +1 -0
- package/dist/octelium/client.d.ts +53 -0
- package/dist/octelium/client.js +201 -0
- package/dist/octelium/client.js.map +1 -0
- package/dist/octelium/search.d.ts +24 -0
- package/dist/octelium/search.js +211 -0
- package/dist/octelium/search.js.map +1 -0
- package/dist/protocol/index.d.ts +432 -0
- package/dist/protocol/index.js +44 -0
- package/dist/protocol/index.js.map +1 -0
- package/dist/runs/builder.d.ts +17 -0
- package/dist/runs/builder.js +81 -0
- package/dist/runs/builder.js.map +1 -0
- package/dist/runs/manager.d.ts +52 -0
- package/dist/runs/manager.js +536 -0
- package/dist/runs/manager.js.map +1 -0
- package/dist/server/http.d.ts +9 -0
- package/dist/server/http.js +100 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server/server.d.ts +48 -0
- package/dist/server/server.js +483 -0
- package/dist/server/server.js.map +1 -0
- package/dist/skills.d.ts +4 -0
- package/dist/skills.js +69 -0
- package/dist/skills.js.map +1 -0
- package/dist/store/conversations.d.ts +26 -0
- package/dist/store/conversations.js +183 -0
- package/dist/store/conversations.js.map +1 -0
- package/dist/store/files.d.ts +27 -0
- package/dist/store/files.js +161 -0
- package/dist/store/files.js.map +1 -0
- package/dist/store/settings.d.ts +14 -0
- package/dist/store/settings.js +48 -0
- package/dist/store/settings.js.map +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +11 -0
- package/dist/version.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
export declare const PROTOCOL_VERSION = 1;
|
|
2
|
+
export declare const API_PREFIX = "/v1";
|
|
3
|
+
export declare const RESOURCE_URI_PREFIX = "octelium://resource/";
|
|
4
|
+
export interface ResourceRef {
|
|
5
|
+
apiVersion: string;
|
|
6
|
+
kind: string;
|
|
7
|
+
name?: string;
|
|
8
|
+
uid?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface ErrorInfo {
|
|
11
|
+
code?: string;
|
|
12
|
+
message: string;
|
|
13
|
+
}
|
|
14
|
+
export interface Usage {
|
|
15
|
+
inputTokens: number;
|
|
16
|
+
outputTokens: number;
|
|
17
|
+
cacheReadTokens: number;
|
|
18
|
+
cacheWriteTokens: number;
|
|
19
|
+
totalTokens: number;
|
|
20
|
+
cost: number;
|
|
21
|
+
}
|
|
22
|
+
export interface ModelInfo {
|
|
23
|
+
provider: string;
|
|
24
|
+
id: string;
|
|
25
|
+
name?: string;
|
|
26
|
+
api?: string;
|
|
27
|
+
reasoning?: boolean;
|
|
28
|
+
input?: ("text" | "image")[];
|
|
29
|
+
contextWindow?: number;
|
|
30
|
+
}
|
|
31
|
+
export interface Conversation {
|
|
32
|
+
id: string;
|
|
33
|
+
title: string;
|
|
34
|
+
createdAt: string;
|
|
35
|
+
updatedAt: string;
|
|
36
|
+
messageCount: number;
|
|
37
|
+
activeRunId?: string;
|
|
38
|
+
}
|
|
39
|
+
export type MessageRole = "user" | "assistant";
|
|
40
|
+
export type MessageStatus = "streaming" | "completed" | "failed" | "cancelled" | "interrupted";
|
|
41
|
+
export interface Message {
|
|
42
|
+
id: string;
|
|
43
|
+
conversationId: string;
|
|
44
|
+
role: MessageRole;
|
|
45
|
+
status: MessageStatus;
|
|
46
|
+
createdAt: string;
|
|
47
|
+
completedAt?: string;
|
|
48
|
+
runId?: string;
|
|
49
|
+
blocks: Block[];
|
|
50
|
+
attachments?: FileInfo[];
|
|
51
|
+
model?: ModelInfo;
|
|
52
|
+
usage?: Usage;
|
|
53
|
+
error?: ErrorInfo;
|
|
54
|
+
}
|
|
55
|
+
export type Block = MarkdownBlock | ThinkingBlock | ToolBlock | ApprovalBlock | TableBlock | ChartBlock | ResourcesBlock | ArtifactBlock | NoticeBlock | ErrorBlock;
|
|
56
|
+
export type BlockType = Block["type"];
|
|
57
|
+
export declare const BLOCK_TYPES: BlockType[];
|
|
58
|
+
export interface BlockBase {
|
|
59
|
+
id: string;
|
|
60
|
+
createdAt: string;
|
|
61
|
+
}
|
|
62
|
+
export interface MarkdownBlock extends BlockBase {
|
|
63
|
+
type: "markdown";
|
|
64
|
+
text: string;
|
|
65
|
+
}
|
|
66
|
+
export interface ThinkingBlock extends BlockBase {
|
|
67
|
+
type: "thinking";
|
|
68
|
+
text: string;
|
|
69
|
+
redacted?: boolean;
|
|
70
|
+
}
|
|
71
|
+
export type ToolStatus = "pending" | "running" | "awaiting_approval" | "completed" | "failed" | "rejected" | "cancelled";
|
|
72
|
+
export interface ToolBlock extends BlockBase {
|
|
73
|
+
type: "tool";
|
|
74
|
+
toolCallId: string;
|
|
75
|
+
name: string;
|
|
76
|
+
title: string;
|
|
77
|
+
status: ToolStatus;
|
|
78
|
+
input?: unknown;
|
|
79
|
+
output?: string;
|
|
80
|
+
outputTruncated?: boolean;
|
|
81
|
+
details?: ToolDetails;
|
|
82
|
+
startedAt?: string;
|
|
83
|
+
completedAt?: string;
|
|
84
|
+
}
|
|
85
|
+
export type ToolDetails = OcteliumAPICallDetails | CommandDetails | FileDetails | GenericToolDetails;
|
|
86
|
+
export type APIRisk = "read" | "write" | "destructive" | "sensitive";
|
|
87
|
+
export interface OcteliumAPICallDetails {
|
|
88
|
+
kind: "octelium_api";
|
|
89
|
+
method: string;
|
|
90
|
+
grpcMethod: string;
|
|
91
|
+
risk: APIRisk;
|
|
92
|
+
request?: unknown;
|
|
93
|
+
response?: unknown;
|
|
94
|
+
responseTruncated?: boolean;
|
|
95
|
+
resultPath?: string;
|
|
96
|
+
resources?: ResourceRef[];
|
|
97
|
+
error?: ErrorInfo;
|
|
98
|
+
}
|
|
99
|
+
export interface CommandDetails {
|
|
100
|
+
kind: "command";
|
|
101
|
+
command: string;
|
|
102
|
+
exitCode?: number;
|
|
103
|
+
}
|
|
104
|
+
export interface FileDetails {
|
|
105
|
+
kind: "file";
|
|
106
|
+
path: string;
|
|
107
|
+
operation: "read" | "write" | "edit";
|
|
108
|
+
diff?: string;
|
|
109
|
+
}
|
|
110
|
+
export interface GenericToolDetails {
|
|
111
|
+
kind: "generic";
|
|
112
|
+
data: unknown;
|
|
113
|
+
}
|
|
114
|
+
export type ApprovalStatus = "pending" | "approved" | "rejected" | "cancelled";
|
|
115
|
+
export interface ApprovalBlock extends BlockBase {
|
|
116
|
+
type: "approval";
|
|
117
|
+
approvalId: string;
|
|
118
|
+
toolCallId: string;
|
|
119
|
+
title: string;
|
|
120
|
+
description?: string;
|
|
121
|
+
risk: APIRisk;
|
|
122
|
+
status: ApprovalStatus;
|
|
123
|
+
preview?: ApprovalPreview;
|
|
124
|
+
reason?: string;
|
|
125
|
+
decidedAt?: string;
|
|
126
|
+
}
|
|
127
|
+
export interface ApprovalPreview {
|
|
128
|
+
method?: string;
|
|
129
|
+
request?: unknown;
|
|
130
|
+
command?: string;
|
|
131
|
+
}
|
|
132
|
+
export type TableColumnType = "string" | "number" | "boolean" | "datetime" | "json";
|
|
133
|
+
export interface TableColumn {
|
|
134
|
+
key: string;
|
|
135
|
+
label?: string;
|
|
136
|
+
type?: TableColumnType;
|
|
137
|
+
unit?: string;
|
|
138
|
+
}
|
|
139
|
+
export interface TableBlock extends BlockBase {
|
|
140
|
+
type: "table";
|
|
141
|
+
title?: string;
|
|
142
|
+
caption?: string;
|
|
143
|
+
columns: TableColumn[];
|
|
144
|
+
rows: Record<string, unknown>[];
|
|
145
|
+
totalRows: number;
|
|
146
|
+
truncated?: boolean;
|
|
147
|
+
}
|
|
148
|
+
export type ChartType = "line" | "area" | "bar" | "pie" | "scatter";
|
|
149
|
+
export type ChartAxisType = "time" | "category" | "number";
|
|
150
|
+
export interface ChartSeries {
|
|
151
|
+
key: string;
|
|
152
|
+
label?: string;
|
|
153
|
+
unit?: string;
|
|
154
|
+
}
|
|
155
|
+
export interface ChartSpec {
|
|
156
|
+
chartType: ChartType;
|
|
157
|
+
title?: string;
|
|
158
|
+
description?: string;
|
|
159
|
+
x: {
|
|
160
|
+
key: string;
|
|
161
|
+
label?: string;
|
|
162
|
+
type?: ChartAxisType;
|
|
163
|
+
};
|
|
164
|
+
y?: {
|
|
165
|
+
label?: string;
|
|
166
|
+
unit?: string;
|
|
167
|
+
};
|
|
168
|
+
series: ChartSeries[];
|
|
169
|
+
rows: Record<string, string | number | null>[];
|
|
170
|
+
stacked?: boolean;
|
|
171
|
+
}
|
|
172
|
+
export interface ChartBlock extends BlockBase {
|
|
173
|
+
type: "chart";
|
|
174
|
+
chart: ChartSpec;
|
|
175
|
+
}
|
|
176
|
+
export interface ResourceItem {
|
|
177
|
+
ref: ResourceRef;
|
|
178
|
+
uri: string;
|
|
179
|
+
snapshot?: Record<string, unknown>;
|
|
180
|
+
}
|
|
181
|
+
export interface ResourcesBlock extends BlockBase {
|
|
182
|
+
type: "resources";
|
|
183
|
+
title?: string;
|
|
184
|
+
resources: ResourceItem[];
|
|
185
|
+
}
|
|
186
|
+
export interface ArtifactInfo {
|
|
187
|
+
id: string;
|
|
188
|
+
name: string;
|
|
189
|
+
mimeType: string;
|
|
190
|
+
size: number;
|
|
191
|
+
title?: string;
|
|
192
|
+
description?: string;
|
|
193
|
+
createdAt: string;
|
|
194
|
+
url: string;
|
|
195
|
+
}
|
|
196
|
+
export interface ArtifactBlock extends BlockBase {
|
|
197
|
+
type: "artifact";
|
|
198
|
+
artifact: ArtifactInfo;
|
|
199
|
+
}
|
|
200
|
+
export interface NoticeBlock extends BlockBase {
|
|
201
|
+
type: "notice";
|
|
202
|
+
level: "info" | "warning";
|
|
203
|
+
text: string;
|
|
204
|
+
}
|
|
205
|
+
export interface ErrorBlock extends BlockBase {
|
|
206
|
+
type: "error";
|
|
207
|
+
message: string;
|
|
208
|
+
code?: string;
|
|
209
|
+
}
|
|
210
|
+
export type RunStatus = "running" | "awaiting_approval" | "completed" | "failed" | "cancelled";
|
|
211
|
+
export interface RunActivity {
|
|
212
|
+
kind: "retrying" | "compacting";
|
|
213
|
+
message: string;
|
|
214
|
+
}
|
|
215
|
+
export interface Run {
|
|
216
|
+
id: string;
|
|
217
|
+
conversationId: string;
|
|
218
|
+
status: RunStatus;
|
|
219
|
+
createdAt: string;
|
|
220
|
+
completedAt?: string;
|
|
221
|
+
userMessageId: string;
|
|
222
|
+
assistantMessageId: string;
|
|
223
|
+
lastSeq: number;
|
|
224
|
+
activity?: RunActivity;
|
|
225
|
+
usage?: Usage;
|
|
226
|
+
error?: ErrorInfo;
|
|
227
|
+
}
|
|
228
|
+
export type AgentEventPayload = {
|
|
229
|
+
type: "run.started";
|
|
230
|
+
run: Run;
|
|
231
|
+
} | {
|
|
232
|
+
type: "run.updated";
|
|
233
|
+
run: Run;
|
|
234
|
+
} | {
|
|
235
|
+
type: "run.completed";
|
|
236
|
+
run: Run;
|
|
237
|
+
} | {
|
|
238
|
+
type: "run.failed";
|
|
239
|
+
run: Run;
|
|
240
|
+
} | {
|
|
241
|
+
type: "run.cancelled";
|
|
242
|
+
run: Run;
|
|
243
|
+
} | {
|
|
244
|
+
type: "message.created";
|
|
245
|
+
message: Message;
|
|
246
|
+
} | {
|
|
247
|
+
type: "message.completed";
|
|
248
|
+
message: Message;
|
|
249
|
+
} | {
|
|
250
|
+
type: "block.created";
|
|
251
|
+
messageId: string;
|
|
252
|
+
block: Block;
|
|
253
|
+
} | {
|
|
254
|
+
type: "block.delta";
|
|
255
|
+
messageId: string;
|
|
256
|
+
blockId: string;
|
|
257
|
+
text: string;
|
|
258
|
+
} | {
|
|
259
|
+
type: "block.updated";
|
|
260
|
+
messageId: string;
|
|
261
|
+
block: Block;
|
|
262
|
+
} | {
|
|
263
|
+
type: "conversation.updated";
|
|
264
|
+
conversation: Conversation;
|
|
265
|
+
};
|
|
266
|
+
export type AgentEventType = AgentEventPayload["type"];
|
|
267
|
+
export type AgentEvent = {
|
|
268
|
+
seq: number;
|
|
269
|
+
ts: string;
|
|
270
|
+
conversationId: string;
|
|
271
|
+
runId: string;
|
|
272
|
+
} & AgentEventPayload;
|
|
273
|
+
export declare const TERMINAL_RUN_EVENT_TYPES: AgentEventType[];
|
|
274
|
+
export declare const isTerminalRunStatus: (status: RunStatus) => boolean;
|
|
275
|
+
export interface FileInfo {
|
|
276
|
+
id: string;
|
|
277
|
+
name: string;
|
|
278
|
+
mimeType: string;
|
|
279
|
+
size: number;
|
|
280
|
+
path: string;
|
|
281
|
+
createdAt: string;
|
|
282
|
+
}
|
|
283
|
+
export interface RunInput {
|
|
284
|
+
text: string;
|
|
285
|
+
attachments?: string[];
|
|
286
|
+
}
|
|
287
|
+
export interface CreateConversationRequest {
|
|
288
|
+
title?: string;
|
|
289
|
+
input?: RunInput;
|
|
290
|
+
}
|
|
291
|
+
export interface CreateConversationResponse {
|
|
292
|
+
conversation: Conversation;
|
|
293
|
+
run?: Run;
|
|
294
|
+
}
|
|
295
|
+
export interface UpdateConversationRequest {
|
|
296
|
+
title?: string;
|
|
297
|
+
}
|
|
298
|
+
export interface ListConversationsResponse {
|
|
299
|
+
items: Conversation[];
|
|
300
|
+
}
|
|
301
|
+
export interface RunSnapshot {
|
|
302
|
+
run: Run;
|
|
303
|
+
message?: Message;
|
|
304
|
+
}
|
|
305
|
+
export interface ConversationDetail {
|
|
306
|
+
conversation: Conversation;
|
|
307
|
+
messages: Message[];
|
|
308
|
+
activeRun?: RunSnapshot;
|
|
309
|
+
}
|
|
310
|
+
export interface CreateRunRequest {
|
|
311
|
+
input: RunInput;
|
|
312
|
+
}
|
|
313
|
+
export type ApprovalDecision = "approve" | "reject";
|
|
314
|
+
export interface ApprovalDecisionRequest {
|
|
315
|
+
decision: ApprovalDecision;
|
|
316
|
+
reason?: string;
|
|
317
|
+
}
|
|
318
|
+
export interface ErrorResponse {
|
|
319
|
+
error: {
|
|
320
|
+
code: string;
|
|
321
|
+
message: string;
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
export interface ModelsResponse {
|
|
325
|
+
current?: ModelInfo;
|
|
326
|
+
thinkingLevel?: string;
|
|
327
|
+
models: ModelInfo[];
|
|
328
|
+
error?: ErrorInfo;
|
|
329
|
+
}
|
|
330
|
+
export interface SetModelRequest {
|
|
331
|
+
provider: string;
|
|
332
|
+
id: string;
|
|
333
|
+
thinkingLevel?: string;
|
|
334
|
+
}
|
|
335
|
+
export interface AuthProvider {
|
|
336
|
+
id: string;
|
|
337
|
+
name: string;
|
|
338
|
+
loginLabel?: string;
|
|
339
|
+
subscription: boolean;
|
|
340
|
+
configured: boolean;
|
|
341
|
+
oauth: boolean;
|
|
342
|
+
}
|
|
343
|
+
export interface ListAuthProvidersResponse {
|
|
344
|
+
items: AuthProvider[];
|
|
345
|
+
}
|
|
346
|
+
export type LoginStatus = "pending" | "completed" | "failed" | "cancelled";
|
|
347
|
+
export type LoginEvent = {
|
|
348
|
+
type: "info";
|
|
349
|
+
message: string;
|
|
350
|
+
links?: {
|
|
351
|
+
url: string;
|
|
352
|
+
label?: string;
|
|
353
|
+
}[];
|
|
354
|
+
} | {
|
|
355
|
+
type: "auth_url";
|
|
356
|
+
url: string;
|
|
357
|
+
instructions?: string;
|
|
358
|
+
} | {
|
|
359
|
+
type: "device_code";
|
|
360
|
+
userCode: string;
|
|
361
|
+
verificationUri: string;
|
|
362
|
+
intervalSeconds?: number;
|
|
363
|
+
expiresInSeconds?: number;
|
|
364
|
+
} | {
|
|
365
|
+
type: "progress";
|
|
366
|
+
message: string;
|
|
367
|
+
};
|
|
368
|
+
export interface LoginPrompt {
|
|
369
|
+
id: string;
|
|
370
|
+
type: "text" | "secret" | "select" | "manual_code";
|
|
371
|
+
message: string;
|
|
372
|
+
placeholder?: string;
|
|
373
|
+
options?: {
|
|
374
|
+
id: string;
|
|
375
|
+
label: string;
|
|
376
|
+
description?: string;
|
|
377
|
+
}[];
|
|
378
|
+
}
|
|
379
|
+
export interface LoginSession {
|
|
380
|
+
id: string;
|
|
381
|
+
provider: string;
|
|
382
|
+
status: LoginStatus;
|
|
383
|
+
events: LoginEvent[];
|
|
384
|
+
prompt?: LoginPrompt;
|
|
385
|
+
model?: ModelInfo;
|
|
386
|
+
error?: ErrorInfo;
|
|
387
|
+
createdAt: string;
|
|
388
|
+
updatedAt: string;
|
|
389
|
+
}
|
|
390
|
+
export interface StartLoginRequest {
|
|
391
|
+
provider: string;
|
|
392
|
+
selectModel?: boolean;
|
|
393
|
+
}
|
|
394
|
+
export interface LoginPromptAnswer {
|
|
395
|
+
value: string;
|
|
396
|
+
}
|
|
397
|
+
export declare const isTerminalLoginStatus: (status: LoginStatus) => boolean;
|
|
398
|
+
export interface AgentInfo {
|
|
399
|
+
name: string;
|
|
400
|
+
version: string;
|
|
401
|
+
protocolVersion: number;
|
|
402
|
+
status: "ready" | "degraded";
|
|
403
|
+
issues: string[];
|
|
404
|
+
model?: ModelInfo;
|
|
405
|
+
thinkingLevel?: string;
|
|
406
|
+
octelium: {
|
|
407
|
+
domain?: string;
|
|
408
|
+
mode: "proxy" | "direct" | "disabled";
|
|
409
|
+
user?: {
|
|
410
|
+
name?: string;
|
|
411
|
+
uid?: string;
|
|
412
|
+
displayName?: string;
|
|
413
|
+
};
|
|
414
|
+
};
|
|
415
|
+
workspace?: {
|
|
416
|
+
name?: string;
|
|
417
|
+
hostname?: string;
|
|
418
|
+
};
|
|
419
|
+
capabilities: {
|
|
420
|
+
blockTypes: BlockType[];
|
|
421
|
+
webSearch: boolean;
|
|
422
|
+
approvals: boolean;
|
|
423
|
+
uploads: {
|
|
424
|
+
maxBytes: number;
|
|
425
|
+
};
|
|
426
|
+
models: boolean;
|
|
427
|
+
login: boolean;
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
export declare const formatResourceURI: (ref: ResourceRef) => string;
|
|
431
|
+
export declare const parseResourceURI: (uri: string) => ResourceRef | undefined;
|
|
432
|
+
export declare const resourceKey: (ref: ResourceRef) => string;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export const PROTOCOL_VERSION = 1;
|
|
2
|
+
export const API_PREFIX = "/v1";
|
|
3
|
+
export const RESOURCE_URI_PREFIX = "octelium://resource/";
|
|
4
|
+
export const BLOCK_TYPES = [
|
|
5
|
+
"markdown",
|
|
6
|
+
"thinking",
|
|
7
|
+
"tool",
|
|
8
|
+
"approval",
|
|
9
|
+
"table",
|
|
10
|
+
"chart",
|
|
11
|
+
"resources",
|
|
12
|
+
"artifact",
|
|
13
|
+
"notice",
|
|
14
|
+
"error",
|
|
15
|
+
];
|
|
16
|
+
export const TERMINAL_RUN_EVENT_TYPES = [
|
|
17
|
+
"run.completed",
|
|
18
|
+
"run.failed",
|
|
19
|
+
"run.cancelled",
|
|
20
|
+
];
|
|
21
|
+
export const isTerminalRunStatus = (status) => status === "completed" || status === "failed" || status === "cancelled";
|
|
22
|
+
export const isTerminalLoginStatus = (status) => status !== "pending";
|
|
23
|
+
export const formatResourceURI = (ref) => `${RESOURCE_URI_PREFIX}${ref.apiVersion}/${ref.kind}/${encodeURIComponent(ref.name ?? "")}`;
|
|
24
|
+
export const parseResourceURI = (uri) => {
|
|
25
|
+
if (!uri.startsWith(RESOURCE_URI_PREFIX)) {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
const parts = uri.slice(RESOURCE_URI_PREFIX.length).split("/");
|
|
29
|
+
if (parts.length !== 4 || parts.some((part) => part === "")) {
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
return {
|
|
34
|
+
apiVersion: `${parts[0]}/${parts[1]}`,
|
|
35
|
+
kind: parts[2],
|
|
36
|
+
name: decodeURIComponent(parts[3]),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
export const resourceKey = (ref) => `${ref.apiVersion}/${ref.kind}/${ref.name ?? ref.uid ?? ""}`;
|
|
44
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/protocol/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAElC,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,CAAC;AAEhC,MAAM,CAAC,MAAM,mBAAmB,GAAG,sBAAsB,CAAC;AA4E1D,MAAM,CAAC,MAAM,WAAW,GAAgB;IACtC,UAAU;IACV,UAAU;IACV,MAAM;IACN,UAAU;IACV,OAAO;IACP,OAAO;IACP,WAAW;IACX,UAAU;IACV,QAAQ;IACR,OAAO;CACR,CAAC;AA2OF,MAAM,CAAC,MAAM,wBAAwB,GAAqB;IACxD,eAAe;IACf,YAAY;IACZ,eAAe;CAChB,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAiB,EAAW,EAAE,CAChE,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,WAAW,CAAC;AAwI1E,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,MAAmB,EAAW,EAAE,CACpE,MAAM,KAAK,SAAS,CAAC;AAmCvB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAAgB,EAAU,EAAE,CAC5D,GAAG,mBAAmB,GAAG,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,IAAI,IAAI,kBAAkB,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;AAE9F,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,GAAW,EAA2B,EAAE;IACvE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACzC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,CAAC;QAC5D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,OAAO;YACL,UAAU,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE;YACrC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;YACd,IAAI,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SACnC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAgB,EAAU,EAAE,CACtD,GAAG,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AgentEventPayload, Block, Message, ToolBlock } from "../protocol/index.ts";
|
|
2
|
+
export type BlockInit = Block extends infer B ? B extends Block ? Omit<B, "id" | "createdAt"> : never : never;
|
|
3
|
+
export type EmitFn = (payload: AgentEventPayload) => void;
|
|
4
|
+
export declare class MessageBuilder {
|
|
5
|
+
readonly message: Message;
|
|
6
|
+
private emit;
|
|
7
|
+
private blocks;
|
|
8
|
+
private toolBlocks;
|
|
9
|
+
private counter;
|
|
10
|
+
private onChange?;
|
|
11
|
+
constructor(message: Message, emit: EmitFn, onChange?: () => void);
|
|
12
|
+
addBlock<B extends Block>(init: BlockInit): B;
|
|
13
|
+
appendText(blockId: string, delta: string): void;
|
|
14
|
+
updateBlock<B extends Block>(blockId: string, patch: Partial<Omit<B, "id" | "type" | "createdAt">>): B | undefined;
|
|
15
|
+
getBlock<B extends Block = Block>(blockId: string): B | undefined;
|
|
16
|
+
getToolBlock(toolCallId: string): ToolBlock | undefined;
|
|
17
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
export class MessageBuilder {
|
|
2
|
+
message;
|
|
3
|
+
emit;
|
|
4
|
+
blocks = new Map();
|
|
5
|
+
toolBlocks = new Map();
|
|
6
|
+
counter = 0;
|
|
7
|
+
onChange;
|
|
8
|
+
constructor(message, emit, onChange) {
|
|
9
|
+
this.message = message;
|
|
10
|
+
this.emit = emit;
|
|
11
|
+
this.onChange = onChange;
|
|
12
|
+
for (const block of message.blocks) {
|
|
13
|
+
this.blocks.set(block.id, block);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
addBlock(init) {
|
|
17
|
+
const block = {
|
|
18
|
+
...init,
|
|
19
|
+
id: `b${++this.counter}`,
|
|
20
|
+
createdAt: new Date().toISOString(),
|
|
21
|
+
};
|
|
22
|
+
this.message.blocks.push(block);
|
|
23
|
+
this.blocks.set(block.id, block);
|
|
24
|
+
if (block.type === "tool") {
|
|
25
|
+
this.toolBlocks.set(block.toolCallId, block.id);
|
|
26
|
+
}
|
|
27
|
+
this.emit({
|
|
28
|
+
type: "block.created",
|
|
29
|
+
messageId: this.message.id,
|
|
30
|
+
block: structuredClone(block),
|
|
31
|
+
});
|
|
32
|
+
this.onChange?.();
|
|
33
|
+
return block;
|
|
34
|
+
}
|
|
35
|
+
appendText(blockId, delta) {
|
|
36
|
+
const block = this.blocks.get(blockId);
|
|
37
|
+
if (!block || delta === "") {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (block.type !== "markdown" && block.type !== "thinking") {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
block.text += delta;
|
|
44
|
+
this.emit({
|
|
45
|
+
type: "block.delta",
|
|
46
|
+
messageId: this.message.id,
|
|
47
|
+
blockId,
|
|
48
|
+
text: delta,
|
|
49
|
+
});
|
|
50
|
+
this.onChange?.();
|
|
51
|
+
}
|
|
52
|
+
updateBlock(blockId, patch) {
|
|
53
|
+
const block = this.blocks.get(blockId);
|
|
54
|
+
if (!block) {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
for (const [key, value] of Object.entries(patch)) {
|
|
58
|
+
if (value === undefined) {
|
|
59
|
+
delete block[key];
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
block[key] = value;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
this.emit({
|
|
66
|
+
type: "block.updated",
|
|
67
|
+
messageId: this.message.id,
|
|
68
|
+
block: structuredClone(block),
|
|
69
|
+
});
|
|
70
|
+
this.onChange?.();
|
|
71
|
+
return block;
|
|
72
|
+
}
|
|
73
|
+
getBlock(blockId) {
|
|
74
|
+
return this.blocks.get(blockId);
|
|
75
|
+
}
|
|
76
|
+
getToolBlock(toolCallId) {
|
|
77
|
+
const id = this.toolBlocks.get(toolCallId);
|
|
78
|
+
return id ? this.blocks.get(id) : undefined;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/runs/builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { AgentEvent, ApprovalBlock, ApprovalDecision, Run, RunInput, RunSnapshot } from "../protocol/index.ts";
|
|
2
|
+
import type { AgentBackend, ToolContextProvider, ToolRunContext } from "../agent/types.ts";
|
|
3
|
+
import type { Logger } from "../log.ts";
|
|
4
|
+
import { type ConversationStore } from "../store/conversations.ts";
|
|
5
|
+
import type { FileStore } from "../store/files.ts";
|
|
6
|
+
export declare const DEFAULT_CONVERSATION_TITLE = "New conversation";
|
|
7
|
+
export interface Subscription {
|
|
8
|
+
replay: AgentEvent[];
|
|
9
|
+
finished: boolean;
|
|
10
|
+
unsubscribe: () => void;
|
|
11
|
+
}
|
|
12
|
+
export interface RunManagerOptions {
|
|
13
|
+
store: ConversationStore;
|
|
14
|
+
files: FileStore;
|
|
15
|
+
backend: AgentBackend;
|
|
16
|
+
logger: Logger;
|
|
17
|
+
maxConcurrentRuns: number;
|
|
18
|
+
generateTitles: boolean;
|
|
19
|
+
retentionMs?: number;
|
|
20
|
+
}
|
|
21
|
+
export declare const truncateTitle: (text: string, max?: number) => string;
|
|
22
|
+
export declare class RunManager implements ToolContextProvider {
|
|
23
|
+
private opts;
|
|
24
|
+
private runs;
|
|
25
|
+
private activeByConversation;
|
|
26
|
+
private resourceCaches;
|
|
27
|
+
private retentionMs;
|
|
28
|
+
constructor(opts: RunManagerOptions);
|
|
29
|
+
get activeRunCount(): number;
|
|
30
|
+
startRun(conversationId: string, input: RunInput): Run;
|
|
31
|
+
private execute;
|
|
32
|
+
private finalize;
|
|
33
|
+
private emit;
|
|
34
|
+
private flushDeltas;
|
|
35
|
+
private push;
|
|
36
|
+
private schedulePersist;
|
|
37
|
+
private setStatus;
|
|
38
|
+
private setActivity;
|
|
39
|
+
private generateTitle;
|
|
40
|
+
getRun(runId: string): Run | undefined;
|
|
41
|
+
getSnapshot(runId: string): RunSnapshot | undefined;
|
|
42
|
+
getActiveSnapshot(conversationId: string): RunSnapshot | undefined;
|
|
43
|
+
subscribe(runId: string, afterSeq: number, listener: (event: AgentEvent) => void): Subscription | undefined;
|
|
44
|
+
cancel(runId: string): Run;
|
|
45
|
+
cancelConversation(conversationId: string): Promise<void>;
|
|
46
|
+
forgetConversation(conversationId: string): void;
|
|
47
|
+
decideApproval(runId: string, approvalId: string, decision: ApprovalDecision, reason?: string): ApprovalBlock;
|
|
48
|
+
private requestApproval;
|
|
49
|
+
private resourceCache;
|
|
50
|
+
current(conversationId: string): ToolRunContext | undefined;
|
|
51
|
+
shutdown(timeoutMs?: number): Promise<void>;
|
|
52
|
+
}
|