@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.
Files changed (97) hide show
  1. package/LICENSE +267 -0
  2. package/README.md +207 -0
  3. package/apis/octelium.binpb +0 -0
  4. package/dist/agent/pi/auth.d.ts +32 -0
  5. package/dist/agent/pi/auth.js +279 -0
  6. package/dist/agent/pi/auth.js.map +1 -0
  7. package/dist/agent/pi/backend.d.ts +77 -0
  8. package/dist/agent/pi/backend.js +518 -0
  9. package/dist/agent/pi/backend.js.map +1 -0
  10. package/dist/agent/pi/mapper.d.ts +33 -0
  11. package/dist/agent/pi/mapper.js +386 -0
  12. package/dist/agent/pi/mapper.js.map +1 -0
  13. package/dist/agent/pi/model.d.ts +47 -0
  14. package/dist/agent/pi/model.js +199 -0
  15. package/dist/agent/pi/model.js.map +1 -0
  16. package/dist/agent/prompt.d.ts +22 -0
  17. package/dist/agent/prompt.js +75 -0
  18. package/dist/agent/prompt.js.map +1 -0
  19. package/dist/agent/resources.d.ts +13 -0
  20. package/dist/agent/resources.js +78 -0
  21. package/dist/agent/resources.js.map +1 -0
  22. package/dist/agent/tools/builtin.d.ts +13 -0
  23. package/dist/agent/tools/builtin.js +80 -0
  24. package/dist/agent/tools/builtin.js.map +1 -0
  25. package/dist/agent/tools/octelium.d.ts +28 -0
  26. package/dist/agent/tools/octelium.js +236 -0
  27. package/dist/agent/tools/octelium.js.map +1 -0
  28. package/dist/agent/tools/present.d.ts +61 -0
  29. package/dist/agent/tools/present.js +273 -0
  30. package/dist/agent/tools/present.js.map +1 -0
  31. package/dist/agent/tools/util.d.ts +19 -0
  32. package/dist/agent/tools/util.js +103 -0
  33. package/dist/agent/tools/util.js.map +1 -0
  34. package/dist/agent/tools/web.d.ts +24 -0
  35. package/dist/agent/tools/web.js +237 -0
  36. package/dist/agent/tools/web.js.map +1 -0
  37. package/dist/agent/types.d.ts +60 -0
  38. package/dist/agent/types.js +2 -0
  39. package/dist/agent/types.js.map +1 -0
  40. package/dist/app.d.ts +36 -0
  41. package/dist/app.js +126 -0
  42. package/dist/app.js.map +1 -0
  43. package/dist/cli.d.ts +2 -0
  44. package/dist/cli.js +249 -0
  45. package/dist/cli.js.map +1 -0
  46. package/dist/config.d.ts +159 -0
  47. package/dist/config.js +251 -0
  48. package/dist/config.js.map +1 -0
  49. package/dist/errors.d.ts +13 -0
  50. package/dist/errors.js +18 -0
  51. package/dist/errors.js.map +1 -0
  52. package/dist/index.d.ts +6 -0
  53. package/dist/index.js +6 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/log.d.ts +11 -0
  56. package/dist/log.js +41 -0
  57. package/dist/log.js.map +1 -0
  58. package/dist/octelium/catalog.d.ts +61 -0
  59. package/dist/octelium/catalog.js +595 -0
  60. package/dist/octelium/catalog.js.map +1 -0
  61. package/dist/octelium/client.d.ts +53 -0
  62. package/dist/octelium/client.js +201 -0
  63. package/dist/octelium/client.js.map +1 -0
  64. package/dist/octelium/search.d.ts +24 -0
  65. package/dist/octelium/search.js +211 -0
  66. package/dist/octelium/search.js.map +1 -0
  67. package/dist/protocol/index.d.ts +432 -0
  68. package/dist/protocol/index.js +44 -0
  69. package/dist/protocol/index.js.map +1 -0
  70. package/dist/runs/builder.d.ts +17 -0
  71. package/dist/runs/builder.js +81 -0
  72. package/dist/runs/builder.js.map +1 -0
  73. package/dist/runs/manager.d.ts +52 -0
  74. package/dist/runs/manager.js +536 -0
  75. package/dist/runs/manager.js.map +1 -0
  76. package/dist/server/http.d.ts +9 -0
  77. package/dist/server/http.js +100 -0
  78. package/dist/server/http.js.map +1 -0
  79. package/dist/server/server.d.ts +48 -0
  80. package/dist/server/server.js +483 -0
  81. package/dist/server/server.js.map +1 -0
  82. package/dist/skills.d.ts +4 -0
  83. package/dist/skills.js +69 -0
  84. package/dist/skills.js.map +1 -0
  85. package/dist/store/conversations.d.ts +26 -0
  86. package/dist/store/conversations.js +183 -0
  87. package/dist/store/conversations.js.map +1 -0
  88. package/dist/store/files.d.ts +27 -0
  89. package/dist/store/files.js +161 -0
  90. package/dist/store/files.js.map +1 -0
  91. package/dist/store/settings.d.ts +14 -0
  92. package/dist/store/settings.js +48 -0
  93. package/dist/store/settings.js.map +1 -0
  94. package/dist/version.d.ts +1 -0
  95. package/dist/version.js +11 -0
  96. package/dist/version.js.map +1 -0
  97. package/package.json +57 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/server/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import * as http from "node:http";
2
+ import type { AddressInfo } from "node:net";
3
+ import type { AgentBackend } from "../agent/types.ts";
4
+ import type { Identity } from "../agent/pi/backend.ts";
5
+ import type { Config } from "../config.ts";
6
+ import type { Logger } from "../log.ts";
7
+ import type { OcteliumClient } from "../octelium/client.ts";
8
+ import { type AgentInfo } from "../protocol/index.ts";
9
+ import type { RunManager } from "../runs/manager.ts";
10
+ import { type ConversationStore } from "../store/conversations.ts";
11
+ import { type FileStore } from "../store/files.ts";
12
+ export interface ServerDeps {
13
+ config: Config;
14
+ store: ConversationStore;
15
+ files: FileStore;
16
+ runs: RunManager;
17
+ backend: AgentBackend & {
18
+ issues?: string[];
19
+ };
20
+ octelium: OcteliumClient;
21
+ identity?: Identity;
22
+ issues?: string[];
23
+ version: string;
24
+ logger: Logger;
25
+ }
26
+ export declare class AgentServer {
27
+ private deps;
28
+ private routes;
29
+ readonly server: http.Server;
30
+ private sseResponses;
31
+ constructor(deps: ServerDeps);
32
+ private route;
33
+ private registerRoutes;
34
+ private auth;
35
+ info(): AgentInfo;
36
+ private allowedOrigin;
37
+ private checkAuth;
38
+ private handle;
39
+ private createConversation;
40
+ private getConversation;
41
+ private updateConversation;
42
+ private deleteConversation;
43
+ private streamEvents;
44
+ private uploadFile;
45
+ private downloadArtifact;
46
+ listen(host: string, port: number): Promise<AddressInfo>;
47
+ close(): Promise<void>;
48
+ }
@@ -0,0 +1,483 @@
1
+ import * as crypto from "node:crypto";
2
+ import * as fs from "node:fs";
3
+ import * as http from "node:http";
4
+ import { badRequest, forbidden, HTTPError, notFound, payloadTooLarge, unauthorized, } from "../errors.js";
5
+ import { API_PREFIX, BLOCK_TYPES, PROTOCOL_VERSION, TERMINAL_RUN_EVENT_TYPES, } from "../protocol/index.js";
6
+ import { isValidID } from "../store/conversations.js";
7
+ import { FileTooLargeError } from "../store/files.js";
8
+ import { contentDisposition, originMatches, readJSON, requestOrigin, sendError, sendJSON, sendNoContent, } from "./http.js";
9
+ const inlineMimeTypes = new Set([
10
+ "image/png",
11
+ "image/jpeg",
12
+ "image/gif",
13
+ "image/webp",
14
+ "application/pdf",
15
+ "text/plain",
16
+ "text/csv",
17
+ "text/markdown",
18
+ "application/json",
19
+ ]);
20
+ const heartbeatMs = 15000;
21
+ export class AgentServer {
22
+ deps;
23
+ routes = [];
24
+ server;
25
+ sseResponses = new Set();
26
+ constructor(deps) {
27
+ this.deps = deps;
28
+ this.registerRoutes();
29
+ this.server = http.createServer((req, res) => {
30
+ void this.handle(req, res);
31
+ });
32
+ this.server.requestTimeout = 0;
33
+ this.server.headersTimeout = 60000;
34
+ this.server.keepAliveTimeout = 65000;
35
+ }
36
+ route(method, path, handler) {
37
+ const keys = [];
38
+ const pattern = new RegExp(`^${path.replace(/:(\w+)/g, (_m, key) => {
39
+ keys.push(key);
40
+ return "([^/]+)";
41
+ })}$`);
42
+ this.routes.push({ method, pattern, keys, handler });
43
+ }
44
+ registerRoutes() {
45
+ this.route("GET", "/healthz", (_req, res) => {
46
+ sendJSON(res, 200, { status: "ok" });
47
+ });
48
+ this.route("GET", `${API_PREFIX}/info`, (_req, res) => {
49
+ sendJSON(res, 200, this.info());
50
+ });
51
+ this.route("GET", `${API_PREFIX}/conversations`, (_req, res) => {
52
+ const body = {
53
+ items: this.deps.store.list(),
54
+ };
55
+ sendJSON(res, 200, body);
56
+ });
57
+ this.route("POST", `${API_PREFIX}/conversations`, (req, res) => this.createConversation(req, res));
58
+ this.route("GET", `${API_PREFIX}/conversations/:id`, (_req, res, params) => this.getConversation(res, params.id));
59
+ this.route("PATCH", `${API_PREFIX}/conversations/:id`, (req, res, params) => this.updateConversation(req, res, params.id));
60
+ this.route("DELETE", `${API_PREFIX}/conversations/:id`, (_req, res, params) => this.deleteConversation(res, params.id));
61
+ this.route("POST", `${API_PREFIX}/conversations/:id/runs`, async (req, res, params) => {
62
+ const body = await readJSON(req);
63
+ if (!body.input || typeof body.input !== "object") {
64
+ throw badRequest('The "input" field is required');
65
+ }
66
+ sendJSON(res, 201, this.deps.runs.startRun(params.id, body.input));
67
+ });
68
+ this.route("GET", `${API_PREFIX}/runs/:id`, (_req, res, params) => {
69
+ const snapshot = this.deps.runs.getSnapshot(params.id);
70
+ if (!snapshot) {
71
+ throw notFound(`Run not found: ${params.id}`);
72
+ }
73
+ sendJSON(res, 200, snapshot);
74
+ });
75
+ this.route("GET", `${API_PREFIX}/runs/:id/events`, (req, res, params, url) => this.streamEvents(req, res, params.id, url));
76
+ this.route("POST", `${API_PREFIX}/runs/:id/cancel`, (_req, res, params) => {
77
+ sendJSON(res, 200, this.deps.runs.cancel(params.id));
78
+ });
79
+ this.route("POST", `${API_PREFIX}/runs/:id/approvals/:approvalId`, async (req, res, params) => {
80
+ const body = await readJSON(req);
81
+ if (body.reason !== undefined && typeof body.reason !== "string") {
82
+ throw badRequest('The "reason" field must be a string');
83
+ }
84
+ sendJSON(res, 200, this.deps.runs.decideApproval(params.id, params.approvalId, body.decision, body.reason?.slice(0, 2000)));
85
+ });
86
+ this.route("POST", `${API_PREFIX}/files`, (req, res, _params, url) => this.uploadFile(req, res, url));
87
+ this.route("GET", `${API_PREFIX}/files/:id`, (_req, res, params) => {
88
+ const file = this.deps.files.getUpload(params.id);
89
+ if (!file) {
90
+ throw notFound(`File not found: ${params.id}`);
91
+ }
92
+ sendJSON(res, 200, file);
93
+ });
94
+ this.route("GET", `${API_PREFIX}/artifacts/:id`, (_req, res, params) => {
95
+ const artifact = this.deps.files.getArtifact(params.id);
96
+ if (!artifact) {
97
+ throw notFound(`Artifact not found: ${params.id}`);
98
+ }
99
+ sendJSON(res, 200, artifact.info);
100
+ });
101
+ this.route("GET", `${API_PREFIX}/artifacts/:id/content`, (_req, res, params, url) => this.downloadArtifact(res, params.id, url));
102
+ this.route("GET", `${API_PREFIX}/models`, async (_req, res) => {
103
+ const { backend } = this.deps;
104
+ if (!backend.listModels) {
105
+ throw notFound("Model selection is not supported");
106
+ }
107
+ sendJSON(res, 200, await backend.listModels());
108
+ });
109
+ this.route("PUT", `${API_PREFIX}/model`, async (req, res) => {
110
+ const { backend } = this.deps;
111
+ if (!backend.setModel) {
112
+ throw notFound("Model selection is not supported");
113
+ }
114
+ const body = await readJSON(req);
115
+ sendJSON(res, 200, await backend.setModel(body));
116
+ });
117
+ this.route("GET", `${API_PREFIX}/auth/providers`, async (_req, res) => {
118
+ const body = {
119
+ items: await this.auth().listProviders(),
120
+ };
121
+ sendJSON(res, 200, body);
122
+ });
123
+ this.route("DELETE", `${API_PREFIX}/auth/providers/:id`, async (_req, res, params) => {
124
+ await this.auth().logout(params.id);
125
+ sendNoContent(res);
126
+ });
127
+ this.route("POST", `${API_PREFIX}/auth/logins`, async (req, res) => {
128
+ const body = await readJSON(req);
129
+ if (typeof body.provider !== "string" || body.provider === "") {
130
+ throw badRequest('The "provider" field is required');
131
+ }
132
+ if (body.selectModel !== undefined &&
133
+ typeof body.selectModel !== "boolean") {
134
+ throw badRequest('The "selectModel" field must be a boolean');
135
+ }
136
+ sendJSON(res, 201, this.auth().startLogin(body));
137
+ });
138
+ this.route("GET", `${API_PREFIX}/auth/logins/:id`, (_req, res, params) => {
139
+ const login = this.auth().getLogin(params.id);
140
+ if (!login) {
141
+ throw notFound(`Login not found: ${params.id}`);
142
+ }
143
+ sendJSON(res, 200, login);
144
+ });
145
+ this.route("POST", `${API_PREFIX}/auth/logins/:id/prompts/:promptId`, async (req, res, params) => {
146
+ const body = await readJSON(req);
147
+ sendJSON(res, 200, this.auth().answerLogin(params.id, params.promptId, body.value));
148
+ });
149
+ this.route("DELETE", `${API_PREFIX}/auth/logins/:id`, (_req, res, params) => {
150
+ sendJSON(res, 200, this.auth().cancelLogin(params.id));
151
+ });
152
+ }
153
+ auth() {
154
+ if (!this.deps.backend.auth) {
155
+ throw notFound("Signing in is not supported");
156
+ }
157
+ return this.deps.backend.auth;
158
+ }
159
+ info() {
160
+ const { config, backend, octelium, identity } = this.deps;
161
+ const issues = [...(this.deps.issues ?? []), ...(backend.issues ?? [])];
162
+ return {
163
+ name: "octelium-console-agent",
164
+ version: this.deps.version,
165
+ protocolVersion: PROTOCOL_VERSION,
166
+ status: issues.length === 0 ? "ready" : "degraded",
167
+ issues,
168
+ model: backend.model,
169
+ thinkingLevel: backend.thinkingLevel,
170
+ octelium: {
171
+ domain: config.octelium.domain,
172
+ mode: octelium.mode,
173
+ user: identity?.user,
174
+ },
175
+ workspace: identity?.workspace,
176
+ capabilities: {
177
+ blockTypes: BLOCK_TYPES,
178
+ webSearch: !!config.webSearch,
179
+ approvals: config.approvals.octeliumAPI !== "never" || config.approvals.bash,
180
+ uploads: { maxBytes: config.server.maxUploadBytes },
181
+ models: !!backend.listModels,
182
+ login: !!backend.auth,
183
+ },
184
+ };
185
+ }
186
+ allowedOrigin(req, origin) {
187
+ if (origin === requestOrigin(req)) {
188
+ return true;
189
+ }
190
+ return this.deps.config.server.allowedOrigins.some((pattern) => originMatches(origin, pattern));
191
+ }
192
+ checkAuth(req, url) {
193
+ const token = this.deps.config.server.authToken;
194
+ if (!token) {
195
+ return;
196
+ }
197
+ const header = req.headers.authorization ?? "";
198
+ const provided = header.startsWith("Bearer ")
199
+ ? header.slice(7)
200
+ : (url.searchParams.get("access_token") ?? "");
201
+ const a = Buffer.from(provided);
202
+ const b = Buffer.from(token);
203
+ if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) {
204
+ throw unauthorized();
205
+ }
206
+ }
207
+ async handle(req, res) {
208
+ const started = Date.now();
209
+ let url;
210
+ try {
211
+ url = new URL(req.url ?? "/", "http://localhost");
212
+ }
213
+ catch {
214
+ sendError(res, badRequest("Invalid URL"));
215
+ return;
216
+ }
217
+ res.setHeader("x-content-type-options", "nosniff");
218
+ res.setHeader("referrer-policy", "no-referrer");
219
+ try {
220
+ const origin = req.headers.origin;
221
+ if (origin) {
222
+ if (!this.allowedOrigin(req, origin)) {
223
+ throw forbidden("Origin not allowed");
224
+ }
225
+ if (this.deps.config.server.cors) {
226
+ res.setHeader("access-control-allow-origin", origin);
227
+ res.setHeader("access-control-allow-credentials", "true");
228
+ res.setHeader("vary", "Origin");
229
+ if (req.method === "OPTIONS") {
230
+ res.writeHead(204, {
231
+ "access-control-allow-methods": "GET, POST, PUT, PATCH, DELETE, OPTIONS",
232
+ "access-control-allow-headers": "authorization, content-type, last-event-id, x-file-name",
233
+ "access-control-max-age": "600",
234
+ });
235
+ res.end();
236
+ return;
237
+ }
238
+ }
239
+ }
240
+ const candidates = this.routes.filter((r) => r.pattern.test(url.pathname));
241
+ if (candidates.length === 0) {
242
+ throw notFound();
243
+ }
244
+ const route = candidates.find((r) => r.method === req.method);
245
+ if (!route) {
246
+ throw new HTTPError(405, "method_not_allowed", "Method not allowed");
247
+ }
248
+ if (url.pathname.startsWith(`${API_PREFIX}/`)) {
249
+ this.checkAuth(req, url);
250
+ }
251
+ const match = route.pattern.exec(url.pathname);
252
+ const params = {};
253
+ route.keys.forEach((key, i) => {
254
+ try {
255
+ params[key] = decodeURIComponent(match[i + 1]);
256
+ }
257
+ catch {
258
+ throw notFound();
259
+ }
260
+ });
261
+ for (const key of ["id", "approvalId", "promptId"]) {
262
+ if (params[key] !== undefined && !isValidID(params[key])) {
263
+ throw notFound();
264
+ }
265
+ }
266
+ await route.handler(req, res, params, url);
267
+ }
268
+ catch (err) {
269
+ if (!(err instanceof HTTPError)) {
270
+ this.deps.logger.error("Request failed", {
271
+ method: req.method,
272
+ path: url.pathname,
273
+ error: err,
274
+ });
275
+ }
276
+ sendError(res, err);
277
+ }
278
+ finally {
279
+ this.deps.logger.debug("Request", {
280
+ method: req.method,
281
+ path: url.pathname,
282
+ status: res.statusCode,
283
+ durationMs: Date.now() - started,
284
+ });
285
+ }
286
+ }
287
+ async createConversation(req, res) {
288
+ const body = await readJSON(req);
289
+ if (body.title !== undefined && typeof body.title !== "string") {
290
+ throw badRequest('The "title" field must be a string');
291
+ }
292
+ const { store, runs } = this.deps;
293
+ const conversation = store.create(body.title?.slice(0, 200));
294
+ const ret = { conversation };
295
+ if (body.input) {
296
+ try {
297
+ ret.run = runs.startRun(conversation.id, body.input);
298
+ }
299
+ catch (err) {
300
+ store.delete(conversation.id);
301
+ throw err;
302
+ }
303
+ ret.conversation = store.get(conversation.id) ?? conversation;
304
+ }
305
+ sendJSON(res, 201, ret);
306
+ }
307
+ getConversation(res, id) {
308
+ const { store, runs } = this.deps;
309
+ const conversation = store.get(id);
310
+ if (!conversation) {
311
+ throw notFound(`Conversation not found: ${id}`);
312
+ }
313
+ const body = {
314
+ conversation,
315
+ messages: store.getMessages(id),
316
+ activeRun: runs.getActiveSnapshot(id),
317
+ };
318
+ sendJSON(res, 200, body);
319
+ }
320
+ async updateConversation(req, res, id) {
321
+ const body = await readJSON(req);
322
+ if (body.title !== undefined && typeof body.title !== "string") {
323
+ throw badRequest('The "title" field must be a string');
324
+ }
325
+ const conversation = this.deps.store.update(id, {
326
+ title: body.title?.slice(0, 200),
327
+ });
328
+ if (!conversation) {
329
+ throw notFound(`Conversation not found: ${id}`);
330
+ }
331
+ sendJSON(res, 200, conversation);
332
+ }
333
+ async deleteConversation(res, id) {
334
+ const { store, runs, backend } = this.deps;
335
+ if (!store.get(id)) {
336
+ throw notFound(`Conversation not found: ${id}`);
337
+ }
338
+ await runs.cancelConversation(id);
339
+ backend.forgetConversation(id);
340
+ runs.forgetConversation(id);
341
+ store.delete(id);
342
+ sendNoContent(res);
343
+ }
344
+ streamEvents(req, res, runId, url) {
345
+ const lastEventID = req.headers["last-event-id"] ??
346
+ url.searchParams.get("after") ??
347
+ "0";
348
+ const afterSeq = Number.parseInt(lastEventID, 10) || 0;
349
+ let closed = false;
350
+ let heartbeat;
351
+ const write = (event) => {
352
+ if (closed) {
353
+ return;
354
+ }
355
+ res.write(`id: ${event.seq}\nevent: ${event.type}\ndata: ${JSON.stringify(event)}\n\n`);
356
+ if (TERMINAL_RUN_EVENT_TYPES.includes(event.type)) {
357
+ close();
358
+ }
359
+ };
360
+ let unsubscribe = () => { };
361
+ const close = () => {
362
+ if (closed) {
363
+ return;
364
+ }
365
+ closed = true;
366
+ if (heartbeat) {
367
+ clearInterval(heartbeat);
368
+ }
369
+ unsubscribe();
370
+ this.sseResponses.delete(res);
371
+ res.end();
372
+ };
373
+ const sub = this.deps.runs.subscribe(runId, afterSeq, write);
374
+ if (!sub) {
375
+ throw notFound(`Run not found: ${runId}`);
376
+ }
377
+ unsubscribe = sub.unsubscribe;
378
+ if (sub.finished && sub.replay.length === 0) {
379
+ sendNoContent(res);
380
+ return;
381
+ }
382
+ res.writeHead(200, {
383
+ "content-type": "text/event-stream; charset=utf-8",
384
+ "cache-control": "no-cache, no-transform",
385
+ connection: "keep-alive",
386
+ "x-accel-buffering": "no",
387
+ });
388
+ res.flushHeaders();
389
+ res.write("retry: 3000\n\n");
390
+ this.sseResponses.add(res);
391
+ req.on("close", close);
392
+ res.on("error", close);
393
+ for (const event of sub.replay) {
394
+ write(event);
395
+ }
396
+ if (sub.finished) {
397
+ close();
398
+ return;
399
+ }
400
+ heartbeat = setInterval(() => {
401
+ if (!closed) {
402
+ res.write(": ping\n\n");
403
+ }
404
+ }, heartbeatMs);
405
+ heartbeat.unref();
406
+ }
407
+ async uploadFile(req, res, url) {
408
+ const header = req.headers["x-file-name"];
409
+ let name = url.searchParams.get("name") ?? undefined;
410
+ if (!name && header) {
411
+ try {
412
+ name = decodeURIComponent(header);
413
+ }
414
+ catch {
415
+ name = header;
416
+ }
417
+ }
418
+ if (!name) {
419
+ throw badRequest('The "name" query parameter is required');
420
+ }
421
+ const maxBytes = this.deps.config.server.maxUploadBytes;
422
+ if (Number(req.headers["content-length"] ?? "0") > maxBytes) {
423
+ throw payloadTooLarge(`The file exceeds ${maxBytes} bytes`);
424
+ }
425
+ const contentType = (req.headers["content-type"] ?? "")
426
+ .split(";")[0]
427
+ .trim();
428
+ try {
429
+ const info = await this.deps.files.saveUpload(name, contentType || undefined, req, maxBytes);
430
+ sendJSON(res, 201, info);
431
+ }
432
+ catch (err) {
433
+ if (err instanceof FileTooLargeError) {
434
+ throw payloadTooLarge(err.message);
435
+ }
436
+ throw err;
437
+ }
438
+ }
439
+ downloadArtifact(res, id, url) {
440
+ const artifact = this.deps.files.getArtifact(id);
441
+ if (!artifact) {
442
+ throw notFound(`Artifact not found: ${id}`);
443
+ }
444
+ const { info, filePath } = artifact;
445
+ const wantsInline = url.searchParams.get("inline") === "1";
446
+ const inline = wantsInline && inlineMimeTypes.has(info.mimeType);
447
+ const contentType = info.mimeType.startsWith("text/") || info.mimeType === "application/json"
448
+ ? `${info.mimeType}; charset=utf-8`
449
+ : info.mimeType;
450
+ const stat = fs.statSync(filePath);
451
+ res.writeHead(200, {
452
+ "content-type": contentType,
453
+ "content-length": stat.size,
454
+ "content-disposition": contentDisposition(inline ? "inline" : "attachment", info.name),
455
+ "content-security-policy": "sandbox; default-src 'none'; img-src 'self' data:; style-src 'unsafe-inline'",
456
+ "cache-control": "private, no-store",
457
+ });
458
+ fs.createReadStream(filePath)
459
+ .on("error", () => res.destroy())
460
+ .pipe(res);
461
+ }
462
+ async listen(host, port) {
463
+ await new Promise((resolve, reject) => {
464
+ this.server.once("error", reject);
465
+ this.server.listen(port, host, () => {
466
+ this.server.off("error", reject);
467
+ resolve();
468
+ });
469
+ });
470
+ return this.server.address();
471
+ }
472
+ async close() {
473
+ for (const res of this.sseResponses) {
474
+ res.end();
475
+ }
476
+ this.sseResponses.clear();
477
+ await new Promise((resolve) => {
478
+ this.server.close(() => resolve());
479
+ this.server.closeAllConnections?.();
480
+ });
481
+ }
482
+ }
483
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Config, SkillsRepository } from "./config.ts";
2
+ import type { Logger } from "./log.ts";
3
+ export declare const repositoryDir: (dataDir: string, repo: SkillsRepository) => string;
4
+ export declare const syncSkills: (config: Config, logger: Logger, timeoutMs?: number) => Promise<string[]>;
package/dist/skills.js ADDED
@@ -0,0 +1,69 @@
1
+ import { execFile } from "node:child_process";
2
+ import * as crypto from "node:crypto";
3
+ import * as fs from "node:fs";
4
+ import * as path from "node:path";
5
+ import { promisify } from "node:util";
6
+ const execFileAsync = promisify(execFile);
7
+ const git = async (args, timeoutMs) => execFileAsync("git", args, {
8
+ timeout: timeoutMs,
9
+ env: { ...process.env, GIT_TERMINAL_PROMPT: "0" },
10
+ });
11
+ export const repositoryDir = (dataDir, repo) => path.join(dataDir, "skills", crypto
12
+ .createHash("sha256")
13
+ .update(`${repo.url}#${repo.ref ?? ""}`)
14
+ .digest("hex")
15
+ .slice(0, 16));
16
+ const syncRepository = async (dir, repo, timeoutMs) => {
17
+ if (fs.existsSync(path.join(dir, ".git"))) {
18
+ await git(["-C", dir, "fetch", "--depth", "1", "origin", repo.ref ?? "HEAD"], timeoutMs);
19
+ await git(["-C", dir, "checkout", "--force", "FETCH_HEAD"], timeoutMs);
20
+ return;
21
+ }
22
+ const tmp = `${dir}.tmp-${process.pid}`;
23
+ fs.rmSync(tmp, { recursive: true, force: true });
24
+ fs.mkdirSync(path.dirname(dir), { recursive: true });
25
+ await git([
26
+ "clone",
27
+ "--depth",
28
+ "1",
29
+ ...(repo.ref ? ["--branch", repo.ref] : []),
30
+ repo.url,
31
+ tmp,
32
+ ], timeoutMs);
33
+ fs.rmSync(dir, { recursive: true, force: true });
34
+ fs.renameSync(tmp, dir);
35
+ };
36
+ export const syncSkills = async (config, logger, timeoutMs = 30000) => {
37
+ if (!config.skills.enabled) {
38
+ return [];
39
+ }
40
+ const ret = [];
41
+ for (const p of config.skills.paths) {
42
+ if (fs.existsSync(p)) {
43
+ ret.push(p);
44
+ }
45
+ else {
46
+ logger.warn("Skills path does not exist", { path: p });
47
+ }
48
+ }
49
+ for (const repo of config.skills.repositories) {
50
+ const dir = repositoryDir(config.dataDir, repo);
51
+ try {
52
+ await syncRepository(dir, repo, timeoutMs);
53
+ }
54
+ catch (err) {
55
+ logger.warn("Could not synchronize the skills repository", {
56
+ url: repo.url,
57
+ ref: repo.ref,
58
+ error: err,
59
+ });
60
+ }
61
+ if (!fs.existsSync(dir)) {
62
+ continue;
63
+ }
64
+ const skillsDir = path.join(dir, repo.path ?? "skills");
65
+ ret.push(fs.existsSync(skillsDir) ? skillsDir : dir);
66
+ }
67
+ return ret;
68
+ };
69
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"}