@sumeru/server 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/LICENSE +18 -0
  2. package/dist/.build-fingerprint +1 -0
  3. package/dist/config.d.ts +14 -0
  4. package/dist/config.d.ts.map +1 -0
  5. package/dist/config.js +142 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/envelope.d.ts +28 -0
  8. package/dist/envelope.d.ts.map +1 -0
  9. package/dist/envelope.js +43 -0
  10. package/dist/envelope.js.map +1 -0
  11. package/dist/export/bundle.d.ts +28 -0
  12. package/dist/export/bundle.d.ts.map +1 -0
  13. package/dist/export/bundle.js +78 -0
  14. package/dist/export/bundle.js.map +1 -0
  15. package/dist/export/handler.d.ts +24 -0
  16. package/dist/export/handler.d.ts.map +1 -0
  17. package/dist/export/handler.js +102 -0
  18. package/dist/export/handler.js.map +1 -0
  19. package/dist/export/index.d.ts +3 -0
  20. package/dist/export/index.d.ts.map +1 -0
  21. package/dist/export/index.js +3 -0
  22. package/dist/export/index.js.map +1 -0
  23. package/dist/handler.d.ts +24 -0
  24. package/dist/handler.d.ts.map +1 -0
  25. package/dist/handler.js +622 -0
  26. package/dist/handler.js.map +1 -0
  27. package/dist/index.d.ts +12 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +10 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/ocas/index.d.ts +3 -0
  32. package/dist/ocas/index.d.ts.map +1 -0
  33. package/dist/ocas/index.js +3 -0
  34. package/dist/ocas/index.js.map +1 -0
  35. package/dist/ocas/schemas.d.ts +41 -0
  36. package/dist/ocas/schemas.d.ts.map +1 -0
  37. package/dist/ocas/schemas.js +108 -0
  38. package/dist/ocas/schemas.js.map +1 -0
  39. package/dist/ocas/store.d.ts +58 -0
  40. package/dist/ocas/store.d.ts.map +1 -0
  41. package/dist/ocas/store.js +139 -0
  42. package/dist/ocas/store.js.map +1 -0
  43. package/dist/search/handler.d.ts +54 -0
  44. package/dist/search/handler.d.ts.map +1 -0
  45. package/dist/search/handler.js +178 -0
  46. package/dist/search/handler.js.map +1 -0
  47. package/dist/search/index.d.ts +4 -0
  48. package/dist/search/index.d.ts.map +1 -0
  49. package/dist/search/index.js +3 -0
  50. package/dist/search/index.js.map +1 -0
  51. package/dist/search/sqlite-index.d.ts +49 -0
  52. package/dist/search/sqlite-index.d.ts.map +1 -0
  53. package/dist/search/sqlite-index.js +508 -0
  54. package/dist/search/sqlite-index.js.map +1 -0
  55. package/dist/search/types.d.ts +143 -0
  56. package/dist/search/types.d.ts.map +1 -0
  57. package/dist/search/types.js +10 -0
  58. package/dist/search/types.js.map +1 -0
  59. package/dist/session/cwd.d.ts +31 -0
  60. package/dist/session/cwd.d.ts.map +1 -0
  61. package/dist/session/cwd.js +54 -0
  62. package/dist/session/cwd.js.map +1 -0
  63. package/dist/session/id.d.ts +12 -0
  64. package/dist/session/id.d.ts.map +1 -0
  65. package/dist/session/id.js +76 -0
  66. package/dist/session/id.js.map +1 -0
  67. package/dist/session/index.d.ts +5 -0
  68. package/dist/session/index.d.ts.map +1 -0
  69. package/dist/session/index.js +4 -0
  70. package/dist/session/index.js.map +1 -0
  71. package/dist/session/store.d.ts +89 -0
  72. package/dist/session/store.d.ts.map +1 -0
  73. package/dist/session/store.js +258 -0
  74. package/dist/session/store.js.map +1 -0
  75. package/dist/sse/buffer.d.ts +53 -0
  76. package/dist/sse/buffer.d.ts.map +1 -0
  77. package/dist/sse/buffer.js +119 -0
  78. package/dist/sse/buffer.js.map +1 -0
  79. package/dist/sse/index.d.ts +3 -0
  80. package/dist/sse/index.d.ts.map +1 -0
  81. package/dist/sse/index.js +3 -0
  82. package/dist/sse/index.js.map +1 -0
  83. package/dist/sse/messages.d.ts +30 -0
  84. package/dist/sse/messages.d.ts.map +1 -0
  85. package/dist/sse/messages.js +489 -0
  86. package/dist/sse/messages.js.map +1 -0
  87. package/dist/start.d.ts +22 -0
  88. package/dist/start.d.ts.map +1 -0
  89. package/dist/start.js +86 -0
  90. package/dist/start.js.map +1 -0
  91. package/dist/types.d.ts +252 -0
  92. package/dist/types.d.ts.map +1 -0
  93. package/dist/types.js +10 -0
  94. package/dist/types.js.map +1 -0
  95. package/package.json +31 -0
@@ -0,0 +1,622 @@
1
+ import { envelope, errorEnvelope, gatewayEnvelope, gatewayListEnvelope, instanceEnvelope, sessionEnvelope, sessionListEnvelope, } from "./envelope.js";
2
+ import { handleSessionExport, matchSessionExport } from "./export/index.js";
3
+ import { handleSearchPerGateway, handleSearchTopLevel, isSearchRequest, } from "./search/index.js";
4
+ import { resolveSessionCwd } from "./session/cwd.js";
5
+ import { createSessionStore } from "./session/index.js";
6
+ import { toWire } from "./session/store.js";
7
+ import { handleMessageEndpoint, makeMessageBufferStore, } from "./sse/index.js";
8
+ const HASH_RE = /^[0-9A-HJKMNP-TV-Z]{13}$/;
9
+ const DEFAULT_HISTORY_LIMIT_CAP = 1000;
10
+ /**
11
+ * Build the request handler for a server with the given config.
12
+ *
13
+ * Phase 1 routes:
14
+ * GET / → 200 @sumeru/instance envelope
15
+ * GET /gateways → 200 @sumeru/gateway-list envelope
16
+ * GET /gateways/:name → 200 @sumeru/gateway envelope OR 404
17
+ *
18
+ * Phase 2 routes:
19
+ * POST /gateways/:name/sessions → 201 @sumeru/session envelope OR 400/404
20
+ * GET /gateways/:name/sessions → 200 @sumeru/session-list envelope OR 404
21
+ * GET /gateways/:name/sessions/:id → 200 @sumeru/session OR 404
22
+ * DELETE /gateways/:name/sessions/:id → 204 No Content OR 404
23
+ *
24
+ * Phase 3 routes:
25
+ * POST /gateways/:name/sessions/:id/messages → SSE (turn / heartbeat / done / error)
26
+ *
27
+ * All non-success bodies are `@sumeru/error` envelopes. Method mismatches
28
+ * return 405 with a populated `Allow` header.
29
+ */
30
+ export function createHandler(config) {
31
+ const sessions = createSessionStore(config.ocas);
32
+ const bufferStore = makeMessageBufferStore(config);
33
+ return (req, res) => {
34
+ const method = req.method ?? "GET";
35
+ const url = req.url ?? "/";
36
+ const path = stripQueryString(url);
37
+ const queryString = url.indexOf("?") === -1 ? "" : url.slice(url.indexOf("?") + 1);
38
+ // GET / (root)
39
+ if (path === "/") {
40
+ if (method === "GET") {
41
+ writeJson(res, 200, instanceEnvelope({
42
+ name: config.name,
43
+ version: config.version,
44
+ gateways: Object.keys(config.gateways),
45
+ }));
46
+ return;
47
+ }
48
+ methodNotAllowed(res, method, path, "GET");
49
+ return;
50
+ }
51
+ // /gateways or /gateways/
52
+ if (path === "/gateways" || path === "/gateways/") {
53
+ if (method === "GET") {
54
+ writeJson(res, 200, gatewayListEnvelope(buildGatewayList(config.gateways, config.adapters, sessions)));
55
+ return;
56
+ }
57
+ methodNotAllowed(res, method, path, "GET");
58
+ return;
59
+ }
60
+ // /ocas/<hash> (Phase 4 — single ocas object endpoint)
61
+ const ocasMatch = matchOcasObject(path);
62
+ if (ocasMatch !== null) {
63
+ handleOcasObject(req, res, method, path, ocasMatch, config.ocas);
64
+ return;
65
+ }
66
+ // /ocas or /ocas/ (no listing endpoint defined)
67
+ if (path === "/ocas" || path === "/ocas/") {
68
+ writeJson(res, 404, errorEnvelope("route_not_found", `No route for ${method} ${path}`));
69
+ return;
70
+ }
71
+ // /sessions or /sessions/ (Phase 5 — top-level cross-gateway search)
72
+ if (path === "/sessions" || path === "/sessions/") {
73
+ if (method !== "GET" && method !== "HEAD") {
74
+ methodNotAllowed(res, method, path, "GET");
75
+ return;
76
+ }
77
+ handleSearchTopLevel(res, queryString, config.ocas.searchIndex);
78
+ return;
79
+ }
80
+ // /gateways/<name>/sessions/<id>/export (Phase 5)
81
+ const exportMatch = matchSessionExport(path);
82
+ if (exportMatch !== null) {
83
+ void handleSessionExport(req, res, method, path, exportMatch, config.gateways, sessions, config.ocas);
84
+ return;
85
+ }
86
+ // /gateways/<name>/sessions/<id>/messages
87
+ const messagesMatch = matchSessionMessages(path);
88
+ if (messagesMatch !== null) {
89
+ void handleMessages(req, res, method, path, messagesMatch, queryString, config, sessions, bufferStore);
90
+ return;
91
+ }
92
+ // /gateways/<name>/sessions/<id> (and trailing slash variants)
93
+ const sessionDetail = matchSessionDetail(path);
94
+ if (sessionDetail !== null) {
95
+ void handleSessionDetail(method, path, sessionDetail.gatewayRaw, sessionDetail.idRaw, config.gateways, config.adapters, sessions, res);
96
+ return;
97
+ }
98
+ // /gateways/<name>/sessions or /gateways/<name>/sessions/
99
+ const sessionsCollection = matchSessionsCollection(path);
100
+ if (sessionsCollection !== null) {
101
+ void handleSessionsCollection(req, res, method, path, sessionsCollection, queryString, config, sessions);
102
+ return;
103
+ }
104
+ // /gateways/<name> or /gateways/<name>/
105
+ const detailMatch = matchGatewayDetail(path);
106
+ if (detailMatch !== null) {
107
+ if (method !== "GET") {
108
+ methodNotAllowed(res, method, path, "GET");
109
+ return;
110
+ }
111
+ const requested = decodePathSegment(detailMatch);
112
+ if (requested === null) {
113
+ writeJson(res, 404, errorEnvelope("gateway_not_found", `Gateway ${detailMatch} not found`));
114
+ return;
115
+ }
116
+ const cfg = config.gateways[requested];
117
+ if (cfg === undefined) {
118
+ writeJson(res, 404, errorEnvelope("gateway_not_found", `Gateway ${requested} not found`));
119
+ return;
120
+ }
121
+ writeJson(res, 200, gatewayEnvelope(buildGateway(requested, cfg, config.adapters, sessions)));
122
+ return;
123
+ }
124
+ // Unknown path
125
+ writeJson(res, 404, errorEnvelope("not_found", `No route for ${method} ${path}`));
126
+ };
127
+ }
128
+ // ─── Path matchers ───────────────────────────────────────
129
+ function stripQueryString(url) {
130
+ const q = url.indexOf("?");
131
+ return q === -1 ? url : url.slice(0, q);
132
+ }
133
+ function matchGatewayDetail(path) {
134
+ const prefix = "/gateways/";
135
+ if (!path.startsWith(prefix))
136
+ return null;
137
+ const rest = path.slice(prefix.length);
138
+ if (rest.length === 0)
139
+ return null;
140
+ const trimmed = rest.endsWith("/") ? rest.slice(0, -1) : rest;
141
+ if (trimmed.length === 0)
142
+ return null;
143
+ if (trimmed.includes("/"))
144
+ return null;
145
+ return trimmed;
146
+ }
147
+ /**
148
+ * Match `/gateways/<name>/sessions` (with optional trailing slash).
149
+ * Returns the raw (still URL-encoded) gateway name, or null if no match.
150
+ */
151
+ function matchSessionsCollection(path) {
152
+ const prefix = "/gateways/";
153
+ if (!path.startsWith(prefix))
154
+ return null;
155
+ const rest = path.slice(prefix.length);
156
+ const stripped = rest.endsWith("/") ? rest.slice(0, -1) : rest;
157
+ if (!stripped.endsWith("/sessions"))
158
+ return null;
159
+ const gatewayRaw = stripped.slice(0, -"/sessions".length);
160
+ if (gatewayRaw.length === 0)
161
+ return null;
162
+ if (gatewayRaw.includes("/"))
163
+ return null;
164
+ return gatewayRaw;
165
+ }
166
+ /**
167
+ * Match `/gateways/<name>/sessions/<id>` (with optional trailing slash).
168
+ * Returns raw (still URL-encoded) segments, or null.
169
+ */
170
+ function matchSessionDetail(path) {
171
+ const prefix = "/gateways/";
172
+ if (!path.startsWith(prefix))
173
+ return null;
174
+ const rest = path.slice(prefix.length);
175
+ const stripped = rest.endsWith("/") ? rest.slice(0, -1) : rest;
176
+ const parts = stripped.split("/");
177
+ if (parts.length !== 3)
178
+ return null;
179
+ const [gatewayRaw, sessionsLiteral, idRaw] = parts;
180
+ if (gatewayRaw === undefined || sessionsLiteral !== "sessions")
181
+ return null;
182
+ if (idRaw === undefined || idRaw.length === 0)
183
+ return null;
184
+ if (gatewayRaw.length === 0)
185
+ return null;
186
+ return { gatewayRaw, idRaw };
187
+ }
188
+ /** Match `/gateways/<name>/sessions/<id>/messages` (with optional trailing slash). */
189
+ function matchSessionMessages(path) {
190
+ const prefix = "/gateways/";
191
+ if (!path.startsWith(prefix))
192
+ return null;
193
+ const rest = path.slice(prefix.length);
194
+ const stripped = rest.endsWith("/") ? rest.slice(0, -1) : rest;
195
+ const parts = stripped.split("/");
196
+ if (parts.length !== 4)
197
+ return null;
198
+ const [gatewayRaw, sessionsLiteral, idRaw, messagesLiteral] = parts;
199
+ if (gatewayRaw === undefined || sessionsLiteral !== "sessions")
200
+ return null;
201
+ if (idRaw === undefined || idRaw.length === 0)
202
+ return null;
203
+ if (messagesLiteral !== "messages")
204
+ return null;
205
+ if (gatewayRaw.length === 0)
206
+ return null;
207
+ return { gatewayRaw, idRaw };
208
+ }
209
+ /**
210
+ * Match `/ocas/<hash>` (with optional trailing slash). Returns the raw segment
211
+ * (still URL-encoded form, but the hash regex rejects any encoded characters
212
+ * downstream). Returns null for `/ocas`, `/ocas/`, or `/ocas/<hash>/extra`.
213
+ */
214
+ function matchOcasObject(path) {
215
+ const prefix = "/ocas/";
216
+ if (!path.startsWith(prefix))
217
+ return null;
218
+ const rest = path.slice(prefix.length);
219
+ const stripped = rest.endsWith("/") ? rest.slice(0, -1) : rest;
220
+ if (stripped.length === 0)
221
+ return null;
222
+ if (stripped.includes("/"))
223
+ return null;
224
+ return stripped;
225
+ }
226
+ function decodePathSegment(segment) {
227
+ try {
228
+ return decodeURIComponent(segment);
229
+ }
230
+ catch {
231
+ return null;
232
+ }
233
+ }
234
+ // ─── Session collection: GET (list) / POST (create) ──────
235
+ async function handleSessionsCollection(req, res, method, path, gatewayRaw, queryString, config, sessions) {
236
+ const gateways = config.gateways;
237
+ const adapters = config.adapters;
238
+ const gatewayName = decodePathSegment(gatewayRaw);
239
+ if (gatewayName === null) {
240
+ writeJson(res, 404, errorEnvelope("gateway_not_found", `Gateway ${gatewayRaw} not found`));
241
+ return;
242
+ }
243
+ const gatewayCfg = gateways[gatewayName];
244
+ if (gatewayCfg === undefined) {
245
+ // 404 for unknown gateway is reported even on disallowed methods so
246
+ // callers see the most-specific failure (gateway_not_found, not 405).
247
+ writeJson(res, 404, errorEnvelope("gateway_not_found", `Gateway ${gatewayName} not found`));
248
+ return;
249
+ }
250
+ if (method === "GET" || method === "HEAD") {
251
+ // Phase 5: when ?q= is present and non-empty after trimming, switch
252
+ // to the search-result envelope. Otherwise fall through to Phase-2
253
+ // listing.
254
+ if (isSearchRequest(queryString)) {
255
+ handleSearchPerGateway(res, queryString, config.ocas.searchIndex, gatewayName);
256
+ return;
257
+ }
258
+ const list = sessions.list(gatewayName).map(toEntry);
259
+ writeJson(res, 200, sessionListEnvelope(list));
260
+ return;
261
+ }
262
+ if (method === "POST") {
263
+ const parsed = await readJsonBody(req);
264
+ if (!parsed.ok) {
265
+ writeJson(res, 400, errorEnvelope(parsed.error, parsed.message));
266
+ return;
267
+ }
268
+ const body = parsed.value;
269
+ const configResult = extractConfig(body);
270
+ if (!configResult.ok) {
271
+ writeJson(res, 400, errorEnvelope(configResult.error, configResult.message));
272
+ return;
273
+ }
274
+ // Resolve `config.cwd` against the instance workspaceRoot BEFORE
275
+ // invoking the adapter. The adapter sees the resolved absolute path
276
+ // (or no `cwd` key at all when null). The original opaque blob is
277
+ // preserved verbatim on the wire envelope and the in-memory session.
278
+ const userConfig = configResult.value;
279
+ const cwdResolution = resolveSessionCwd(config.workspaceRoot, userConfig.cwd);
280
+ if (!cwdResolution.ok) {
281
+ writeJson(res, 400, errorEnvelope("invalid_cwd", cwdResolution.message));
282
+ return;
283
+ }
284
+ const adapter = adapters[gatewayCfg.adapter];
285
+ if (adapter === undefined) {
286
+ writeJson(res, 503, errorEnvelope("adapter_unavailable", `Adapter '${gatewayCfg.adapter}' for gateway '${gatewayName}' is not registered`));
287
+ return;
288
+ }
289
+ const forwardedConfig = buildForwardedConfig(userConfig, cwdResolution.cwd);
290
+ let nativeRef;
291
+ try {
292
+ nativeRef = await adapter.createSession(forwardedConfig);
293
+ }
294
+ catch (err) {
295
+ const msg = err instanceof Error ? err.message : String(err);
296
+ const isTimeout = /timed out/i.test(msg);
297
+ writeJson(res, isTimeout ? 504 : 502, errorEnvelope(isTimeout ? "adapter_timeout" : "adapter_error", `${gatewayName} adapter failed: ${truncate(msg, 500)}`));
298
+ return;
299
+ }
300
+ let session;
301
+ try {
302
+ session = sessions.create(gatewayName, gatewayCfg.adapter, userConfig, nativeRef, cwdResolution.cwd);
303
+ }
304
+ catch (err) {
305
+ const msg = err instanceof Error ? err.message : String(err);
306
+ writeJson(res, 500, errorEnvelope("ocas_write_failed", `Failed to record session meta: ${truncate(msg, 500)}`));
307
+ return;
308
+ }
309
+ writeJson(res, 201, sessionEnvelope(toWire(session)));
310
+ return;
311
+ }
312
+ methodNotAllowed(res, method, path, "GET, POST");
313
+ }
314
+ // ─── Session detail: GET / DELETE ────────────────────────
315
+ async function handleSessionDetail(method, path, gatewayRaw, idRaw, gateways, adapters, sessions, res) {
316
+ const gatewayName = decodePathSegment(gatewayRaw);
317
+ if (gatewayName === null) {
318
+ writeJson(res, 404, errorEnvelope("gateway_not_found", `Gateway ${gatewayRaw} not found`));
319
+ return;
320
+ }
321
+ const gatewayCfg = gateways[gatewayName];
322
+ if (gatewayCfg === undefined) {
323
+ writeJson(res, 404, errorEnvelope("gateway_not_found", `Gateway ${gatewayName} not found`));
324
+ return;
325
+ }
326
+ const id = decodePathSegment(idRaw);
327
+ if (id === null) {
328
+ writeJson(res, 404, errorEnvelope("session_not_found", `Session ${idRaw} not found on gateway ${gatewayName}`));
329
+ return;
330
+ }
331
+ if (method === "GET") {
332
+ const session = sessions.get(gatewayName, id);
333
+ if (session === null) {
334
+ writeJson(res, 404, errorEnvelope("session_not_found", `Session ${id} not found on gateway ${gatewayName}`));
335
+ return;
336
+ }
337
+ writeJson(res, 200, sessionEnvelope(toWire(session)));
338
+ return;
339
+ }
340
+ if (method === "DELETE") {
341
+ const existing = sessions.get(gatewayName, id);
342
+ if (existing === null) {
343
+ writeJson(res, 404, errorEnvelope("session_not_found", `Session ${id} not found on gateway ${gatewayName}`));
344
+ return;
345
+ }
346
+ const nativeRef = sessions.getNativeRef(gatewayName, id);
347
+ const adapter = adapters[gatewayCfg.adapter];
348
+ if (nativeRef !== null &&
349
+ adapter !== undefined &&
350
+ existing.status !== "closed") {
351
+ try {
352
+ await adapter.close(nativeRef);
353
+ }
354
+ catch {
355
+ // Adapter close failure does NOT fail the HTTP DELETE — the
356
+ // session is logically dead in Sumeru regardless.
357
+ }
358
+ }
359
+ // `closed` and `already_closed` both return 204 (idempotent).
360
+ sessions.close(gatewayName, id);
361
+ writeNoContent(res);
362
+ return;
363
+ }
364
+ methodNotAllowed(res, method, path, "GET, DELETE");
365
+ }
366
+ // ─── Messages endpoint ───────────────────────────────────
367
+ async function handleMessages(req, res, method, path, parts, queryString, config, sessions, bufferStore) {
368
+ const gatewayName = decodePathSegment(parts.gatewayRaw);
369
+ if (gatewayName === null) {
370
+ writeJson(res, 404, errorEnvelope("gateway_not_found", `Gateway ${parts.gatewayRaw} not found`));
371
+ return;
372
+ }
373
+ if (config.gateways[gatewayName] === undefined) {
374
+ writeJson(res, 404, errorEnvelope("gateway_not_found", `Gateway ${gatewayName} not found`));
375
+ return;
376
+ }
377
+ const id = decodePathSegment(parts.idRaw);
378
+ if (id === null) {
379
+ writeJson(res, 404, errorEnvelope("session_not_found", `Session ${parts.idRaw} not found on gateway ${gatewayName}`));
380
+ return;
381
+ }
382
+ if (method === "GET") {
383
+ handleMessagesHistory(res, gatewayName, id, queryString, config, sessions);
384
+ return;
385
+ }
386
+ if (method !== "POST") {
387
+ methodNotAllowed(res, method, path, "GET, POST");
388
+ return;
389
+ }
390
+ await handleMessageEndpoint(req, res, gatewayName, id, {
391
+ sessions,
392
+ adapters: config.adapters,
393
+ config,
394
+ bufferStore,
395
+ });
396
+ }
397
+ /**
398
+ * GET /gateways/:name/sessions/:id/messages — return the full ordered turn
399
+ * sequence sourced from ocas via the per-session `turnHashes` pointer.
400
+ */
401
+ function handleMessagesHistory(res, gatewayName, id, queryString, config, sessions) {
402
+ const session = sessions.get(gatewayName, id);
403
+ if (session === null) {
404
+ writeJson(res, 404, errorEnvelope("session_not_found", `Session ${id} not found on gateway ${gatewayName}`));
405
+ return;
406
+ }
407
+ const params = new URLSearchParams(queryString);
408
+ const offsetRes = parseNonNegInt(params.get("offset"), "offset");
409
+ if (!offsetRes.ok) {
410
+ writeJson(res, 400, errorEnvelope("invalid_request", offsetRes.message));
411
+ return;
412
+ }
413
+ const limitRes = parseNonNegInt(params.get("limit"), "limit");
414
+ if (!limitRes.ok) {
415
+ writeJson(res, 400, errorEnvelope("invalid_request", limitRes.message));
416
+ return;
417
+ }
418
+ const total = session.turnHashes.length;
419
+ const offset = offsetRes.value ?? 0;
420
+ const requestedLimit = limitRes.value ?? Math.max(0, total - offset);
421
+ const limit = Math.min(requestedLimit, DEFAULT_HISTORY_LIMIT_CAP);
422
+ const slice = session.turnHashes.slice(offset, offset + limit);
423
+ const turns = [];
424
+ for (const h of slice) {
425
+ const node = config.ocas.store.cas.get(h);
426
+ if (node === null)
427
+ continue;
428
+ const payload = node.payload;
429
+ turns.push({ ...payload, hash: h });
430
+ }
431
+ const value = {
432
+ sessionId: session.id,
433
+ gateway: session.gateway,
434
+ total,
435
+ offset,
436
+ limit,
437
+ turns,
438
+ };
439
+ res.statusCode = 200;
440
+ res.setHeader("Content-Type", "application/json; charset=utf-8");
441
+ res.setHeader("Cache-Control", "no-store");
442
+ const payload = JSON.stringify(envelope("@sumeru/message-history", value));
443
+ res.setHeader("Content-Length", Buffer.byteLength(payload).toString());
444
+ res.end(payload);
445
+ }
446
+ function parseNonNegInt(raw, name) {
447
+ if (raw === null)
448
+ return { ok: true, value: null };
449
+ const trimmed = raw.trim();
450
+ if (trimmed.length === 0 || !/^[0-9]+$/.test(trimmed)) {
451
+ return {
452
+ ok: false,
453
+ message: `Query parameter '${name}' must be a non-negative integer (got '${raw}')`,
454
+ };
455
+ }
456
+ const n = Number.parseInt(trimmed, 10);
457
+ if (!Number.isFinite(n) || n < 0) {
458
+ return {
459
+ ok: false,
460
+ message: `Query parameter '${name}' must be a non-negative integer (got '${raw}')`,
461
+ };
462
+ }
463
+ return { ok: true, value: n };
464
+ }
465
+ // ─── /ocas/:hash endpoint ────────────────────────────────
466
+ function handleOcasObject(req, res, method, path, hash, ocas) {
467
+ if (method !== "GET" && method !== "HEAD") {
468
+ methodNotAllowed(res, method, path, "GET");
469
+ return;
470
+ }
471
+ if (!HASH_RE.test(hash)) {
472
+ writeJson(res, 400, errorEnvelope("invalid_hash", `Hash must be a 13-character Crockford Base32 string (got '${hash}')`));
473
+ return;
474
+ }
475
+ const node = ocas.store.cas.get(hash);
476
+ if (node === null) {
477
+ writeJson(res, 404, errorEnvelope("ocas_not_found", `No ocas node found for hash '${hash}'`));
478
+ return;
479
+ }
480
+ const ifNoneMatch = req.headers["if-none-match"];
481
+ if (typeof ifNoneMatch === "string" &&
482
+ ifNoneMatch.replace(/"/g, "") === hash) {
483
+ res.statusCode = 304;
484
+ res.setHeader("ETag", `"${hash}"`);
485
+ res.setHeader("Cache-Control", "public, max-age=31536000, immutable");
486
+ res.end();
487
+ return;
488
+ }
489
+ const typeName = ocas.schemaAliases[node.type] ?? node.type;
490
+ const body = JSON.stringify({ type: typeName, value: node.payload });
491
+ res.statusCode = 200;
492
+ res.setHeader("Content-Type", "application/json; charset=utf-8");
493
+ res.setHeader("ETag", `"${hash}"`);
494
+ res.setHeader("Cache-Control", "public, max-age=31536000, immutable");
495
+ res.setHeader("Content-Length", Buffer.byteLength(body).toString());
496
+ res.end(body);
497
+ }
498
+ // ─── Helpers ─────────────────────────────────────────────
499
+ function methodNotAllowed(res, method, path, allow) {
500
+ res.setHeader("Allow", allow);
501
+ writeJson(res, 405, errorEnvelope("method_not_allowed", `Method ${method} not allowed on ${path}`));
502
+ }
503
+ function buildGatewayList(gateways, adapters, sessions) {
504
+ const entries = [];
505
+ for (const [name, cfg] of Object.entries(gateways)) {
506
+ entries.push(buildGateway(name, cfg, adapters, sessions));
507
+ }
508
+ return entries;
509
+ }
510
+ function buildGateway(name, cfg, adapters, sessions) {
511
+ return {
512
+ name,
513
+ adapter: cfg.adapter,
514
+ status: adapters[cfg.adapter] !== undefined ? "ready" : "unavailable",
515
+ activeSessions: sessions.activeCount(name),
516
+ capabilities: {
517
+ resume: cfg.capabilities.resume,
518
+ streaming: cfg.capabilities.streaming,
519
+ },
520
+ };
521
+ }
522
+ function toEntry(session) {
523
+ return {
524
+ id: session.id,
525
+ gateway: session.gateway,
526
+ status: session.status,
527
+ createdAt: session.createdAt,
528
+ };
529
+ }
530
+ function writeJson(res, status, body) {
531
+ const payload = JSON.stringify(body);
532
+ res.statusCode = status;
533
+ res.setHeader("Content-Type", "application/json; charset=utf-8");
534
+ res.setHeader("Content-Length", Buffer.byteLength(payload).toString());
535
+ res.end(payload);
536
+ }
537
+ function writeNoContent(res) {
538
+ res.statusCode = 204;
539
+ // 204 must not have a body. Removing Content-Type is conventional.
540
+ res.removeHeader("Content-Type");
541
+ res.setHeader("Content-Length", "0");
542
+ res.end();
543
+ }
544
+ function truncate(s, max) {
545
+ if (s.length <= max)
546
+ return s;
547
+ return `${s.slice(0, max - 1)}…`;
548
+ }
549
+ async function readJsonBody(req) {
550
+ const chunks = [];
551
+ let total = 0;
552
+ const MAX = 1024 * 1024; // 1 MiB cap; well above any reasonable session config.
553
+ for await (const chunk of req) {
554
+ const buf = chunk instanceof Buffer ? chunk : Buffer.from(chunk);
555
+ total += buf.length;
556
+ if (total > MAX) {
557
+ return {
558
+ ok: false,
559
+ error: "invalid_request",
560
+ message: "Request body too large",
561
+ };
562
+ }
563
+ chunks.push(buf);
564
+ }
565
+ const raw = Buffer.concat(chunks).toString("utf-8").trim();
566
+ if (raw.length === 0) {
567
+ return { ok: true, value: {} };
568
+ }
569
+ let parsed;
570
+ try {
571
+ parsed = JSON.parse(raw);
572
+ }
573
+ catch (err) {
574
+ const detail = err instanceof Error ? err.message : String(err);
575
+ return {
576
+ ok: false,
577
+ error: "invalid_json",
578
+ message: `Request body is not valid JSON: ${detail}`,
579
+ };
580
+ }
581
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
582
+ return {
583
+ ok: false,
584
+ error: "invalid_request",
585
+ message: "Request body must be a JSON object",
586
+ };
587
+ }
588
+ return { ok: true, value: parsed };
589
+ }
590
+ function extractConfig(body) {
591
+ if (!("config" in body)) {
592
+ return { ok: true, value: {} };
593
+ }
594
+ const raw = body.config;
595
+ if (raw === undefined || raw === null) {
596
+ return { ok: true, value: {} };
597
+ }
598
+ if (typeof raw !== "object" || Array.isArray(raw)) {
599
+ return {
600
+ ok: false,
601
+ error: "invalid_request",
602
+ message: "Field 'config' must be a JSON object when provided",
603
+ };
604
+ }
605
+ return { ok: true, value: raw };
606
+ }
607
+ /**
608
+ * Build the opaque config blob the adapter will see.
609
+ *
610
+ * The user-supplied `cwd` (if any) is replaced with the server-resolved
611
+ * absolute path. When `resolvedCwd` is `null` (no cwd hint), the `cwd` key is
612
+ * removed entirely so adapters can fall back to their constructor / process
613
+ * default. Extracts `model` and `cwd` into the core `SessionConfig` shape.
614
+ */
615
+ function buildForwardedConfig(original, resolvedCwd) {
616
+ const model = typeof original.model === "string" && original.model.length > 0
617
+ ? original.model
618
+ : null;
619
+ const cwd = resolvedCwd;
620
+ return { model, cwd };
621
+ }
622
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"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"}