@sema-agent/server 1.315.0 → 1.316.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.
- package/dist/http/idempotency.d.ts +1 -0
- package/dist/http/idempotency.js +3 -0
- package/dist/http/principal-gate.d.ts +12 -0
- package/dist/http/principal-gate.js +52 -0
- package/dist/http/route-ctx.d.ts +67 -0
- package/dist/http/route-ctx.js +2 -0
- package/dist/http/routes/attachments.d.ts +4 -0
- package/dist/http/routes/attachments.js +106 -0
- package/dist/http/routes/capabilities.d.ts +4 -0
- package/dist/http/routes/capabilities.js +111 -0
- package/dist/http/routes/images.d.ts +20 -0
- package/dist/http/routes/images.js +572 -0
- package/dist/http/routes/memory-policy.d.ts +4 -0
- package/dist/http/routes/memory-policy.js +105 -0
- package/dist/http/routes/observability.d.ts +4 -0
- package/dist/http/routes/observability.js +63 -0
- package/dist/http/routes/session-sync.d.ts +36 -0
- package/dist/http/routes/session-sync.js +513 -0
- package/dist/http/routes/sessions-list.d.ts +4 -0
- package/dist/http/routes/sessions-list.js +117 -0
- package/dist/http/routes/sessions.d.ts +17 -0
- package/dist/http/routes/sessions.js +746 -0
- package/dist/http/send.d.ts +6 -0
- package/dist/http/send.js +19 -0
- package/dist/http/server.d.ts +6 -7
- package/dist/http/server.js +125 -2413
- package/dist/http/sse-log.d.ts +25 -0
- package/dist/http/sse-log.js +59 -0
- package/dist/http/workspace-content.d.ts +3 -0
- package/dist/http/workspace-content.js +20 -0
- package/dist/plugins/approval-store-sql.d.ts +52 -0
- package/dist/plugins/approval-store-sql.js +119 -0
- package/dist/plugins/breaker-state-sql.d.ts +29 -0
- package/dist/plugins/breaker-state-sql.js +104 -0
- package/dist/plugins/file-snapshot-store-sql.d.ts +38 -0
- package/dist/plugins/file-snapshot-store-sql.js +210 -0
- package/dist/plugins/image-index-sql.d.ts +33 -0
- package/dist/plugins/image-index-sql.js +328 -0
- package/dist/plugins/outcome-ledger-sql.d.ts +70 -0
- package/dist/plugins/outcome-ledger-sql.js +158 -0
- package/dist/plugins/pg-approval-store.d.ts +1 -27
- package/dist/plugins/pg-approval-store.js +1 -83
- package/dist/plugins/pg-breaker-state.d.ts +1 -19
- package/dist/plugins/pg-breaker-state.js +1 -88
- package/dist/plugins/pg-file-snapshot-store.d.ts +1 -27
- package/dist/plugins/pg-file-snapshot-store.js +1 -190
- package/dist/plugins/pg-image-index.d.ts +1 -21
- package/dist/plugins/pg-image-index.js +1 -217
- package/dist/plugins/pg-outcome-ledger.d.ts +2 -22
- package/dist/plugins/pg-outcome-ledger.js +1 -104
- package/dist/plugins/pg-resume-anchor-store.d.ts +1 -13
- package/dist/plugins/pg-resume-anchor-store.js +1 -22
- package/dist/plugins/pg-run-store.d.ts +1 -75
- package/dist/plugins/pg-run-store.js +1 -287
- package/dist/plugins/pg-session-policy-store.d.ts +1 -11
- package/dist/plugins/pg-session-policy-store.js +1 -90
- package/dist/plugins/pg-tool-result-store.d.ts +1 -15
- package/dist/plugins/pg-tool-result-store.js +1 -52
- package/dist/plugins/pg-workflow-journal-store.d.ts +1 -20
- package/dist/plugins/pg-workflow-journal-store.js +1 -34
- package/dist/plugins/pg-workflow-run-store.d.ts +1 -55
- package/dist/plugins/pg-workflow-run-store.js +1 -220
- package/dist/plugins/resume-anchor-store-sql.d.ts +23 -0
- package/dist/plugins/resume-anchor-store-sql.js +38 -0
- package/dist/plugins/run-store-sql.d.ts +89 -0
- package/dist/plugins/run-store-sql.js +397 -0
- package/dist/plugins/session-policy-store-sql.d.ts +22 -0
- package/dist/plugins/session-policy-store-sql.js +109 -0
- package/dist/plugins/tidb-approval-store.d.ts +1 -39
- package/dist/plugins/tidb-approval-store.js +1 -71
- package/dist/plugins/tidb-breaker-state.d.ts +1 -17
- package/dist/plugins/tidb-breaker-state.js +1 -74
- package/dist/plugins/tidb-file-snapshot-store.d.ts +1 -27
- package/dist/plugins/tidb-file-snapshot-store.js +1 -192
- package/dist/plugins/tidb-image-index.d.ts +1 -19
- package/dist/plugins/tidb-image-index.js +1 -149
- package/dist/plugins/tidb-outcome-ledger.d.ts +1 -57
- package/dist/plugins/tidb-outcome-ledger.js +1 -97
- package/dist/plugins/tidb-resume-anchor-store.d.ts +1 -13
- package/dist/plugins/tidb-resume-anchor-store.js +1 -22
- package/dist/plugins/tidb-run-store.d.ts +1 -75
- package/dist/plugins/tidb-run-store.js +1 -306
- package/dist/plugins/tidb-session-policy-store.d.ts +1 -11
- package/dist/plugins/tidb-session-policy-store.js +1 -86
- package/dist/plugins/tidb-tool-result-store.d.ts +1 -13
- package/dist/plugins/tidb-tool-result-store.js +1 -38
- package/dist/plugins/tidb-workflow-journal-store.d.ts +1 -20
- package/dist/plugins/tidb-workflow-journal-store.js +1 -34
- package/dist/plugins/tidb-workflow-run-store.d.ts +1 -61
- package/dist/plugins/tidb-workflow-run-store.js +1 -231
- package/dist/plugins/tool-result-store-sql.d.ts +25 -0
- package/dist/plugins/tool-result-store-sql.js +69 -0
- package/dist/plugins/workflow-journal-store-sql.d.ts +30 -0
- package/dist/plugins/workflow-journal-store-sql.js +53 -0
- package/dist/plugins/workflow-run-store-sql.d.ts +85 -0
- package/dist/plugins/workflow-run-store-sql.js +299 -0
- package/package.json +1 -1
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { isUuidV7 } from "../../security.js";
|
|
2
|
+
import { sendJson } from "../send.js";
|
|
3
|
+
export async function handleSessionsList(req, res, url, ctx) {
|
|
4
|
+
const miss = { fell: false };
|
|
5
|
+
await handleSessionsListBody(req, res, url, ctx, miss);
|
|
6
|
+
return !miss.fell;
|
|
7
|
+
}
|
|
8
|
+
async function handleSessionsListBody(req, res, url, ctx, miss) {
|
|
9
|
+
const { deps } = ctx;
|
|
10
|
+
const { isFleetWide, sessionOwnerScope } = ctx.helpers;
|
|
11
|
+
if (req.method === "GET" && url === "/v1/sessions") {
|
|
12
|
+
const { fleetWide, gateOwner } = sessionOwnerScope(req);
|
|
13
|
+
if (!fleetWide && gateOwner === null) {
|
|
14
|
+
sendJson(res, 401, { error: "unauthorized" });
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const lister = deps.sessionStorage?.listSessions?.bind(deps.sessionStorage) ?? deps.runStore?.listSessions?.bind(deps.runStore);
|
|
18
|
+
if (!lister) {
|
|
19
|
+
sendJson(res, 501, { error: "session list requires a durable session store (SESSION_BACKEND=tidb)" });
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
await handleSessionList(res, lister, new URL(req.url ?? "", "http://x").searchParams, gateOwner);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (req.method === "GET" && url === "/v1/sendfile-links") {
|
|
26
|
+
const { fleetWide, gateOwner } = sessionOwnerScope(req);
|
|
27
|
+
if (!fleetWide && gateOwner === null) {
|
|
28
|
+
sendJson(res, 401, { error: "unauthorized" });
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (!deps.sendFileLedger) {
|
|
32
|
+
sendJson(res, 501, { error: "sendfile ledger requires a store backend (DB_BACKEND=tidb|pg|local) and the SendUserFile issuer configured" });
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const query = new URL(req.url ?? "", "http://x").searchParams;
|
|
36
|
+
const limitRaw = query.get("limit");
|
|
37
|
+
if (limitRaw !== null && !(/^[0-9]+$/.test(limitRaw) && Number(limitRaw) >= 1 && Number(limitRaw) <= 100)) {
|
|
38
|
+
sendJson(res, 400, { error: "limit must be a decimal integer in 1..100" });
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const limit = limitRaw === null ? 50 : Number(limitRaw);
|
|
42
|
+
const beforeRaw = query.get("before");
|
|
43
|
+
if (beforeRaw !== null && !isUuidV7(beforeRaw)) {
|
|
44
|
+
sendJson(res, 400, { error: "before must be a uuidv7 link id (the `id`/`nextBefore` of a previous page)" });
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const before = beforeRaw ?? undefined;
|
|
48
|
+
let scope;
|
|
49
|
+
if (gateOwner !== null) {
|
|
50
|
+
scope = gateOwner;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
const scopeRaw = query.get("scope");
|
|
54
|
+
if (scopeRaw === null) {
|
|
55
|
+
scope = "_";
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
const s = scopeRaw.trim();
|
|
59
|
+
if (s === "" || s.length > 190) {
|
|
60
|
+
sendJson(res, 400, { error: "scope must be a non-blank tenant principal of at most 190 characters (the sendfile_link.scope column width)" });
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
scope = s;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const rows = await deps.sendFileLedger.listByScope(scope, limit + 1, before);
|
|
67
|
+
const hasMore = rows.length > limit;
|
|
68
|
+
const page = hasMore ? rows.slice(0, limit) : rows;
|
|
69
|
+
sendJson(res, 200, {
|
|
70
|
+
links: page.map((r) => ({
|
|
71
|
+
id: r.id,
|
|
72
|
+
filename: r.filename,
|
|
73
|
+
size: r.size,
|
|
74
|
+
ttlSec: r.ttlSec,
|
|
75
|
+
track: r.track,
|
|
76
|
+
bucket: r.bucket,
|
|
77
|
+
key: r.objectKey,
|
|
78
|
+
createdAt: new Date(r.createdAt).toISOString(),
|
|
79
|
+
...(r.taskId !== undefined ? { taskId: r.taskId } : {}),
|
|
80
|
+
...(r.sessionId !== undefined ? { sessionId: r.sessionId } : {}),
|
|
81
|
+
})),
|
|
82
|
+
...(hasMore ? { nextBefore: page[page.length - 1].id } : {}),
|
|
83
|
+
});
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
miss.fell = true;
|
|
87
|
+
}
|
|
88
|
+
function encodeSessionCursor(c) {
|
|
89
|
+
return Buffer.from(JSON.stringify(c)).toString("base64url");
|
|
90
|
+
}
|
|
91
|
+
function decodeSessionCursor(s) {
|
|
92
|
+
if (!s)
|
|
93
|
+
return undefined;
|
|
94
|
+
try {
|
|
95
|
+
const o = JSON.parse(Buffer.from(s, "base64url").toString());
|
|
96
|
+
return o.lastActivityAt && o.sessionId && !Number.isNaN(Date.parse(o.lastActivityAt))
|
|
97
|
+
? { lastActivityAt: o.lastActivityAt, sessionId: o.sessionId }
|
|
98
|
+
: undefined;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return undefined;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async function handleSessionList(res, lister, query, forceOwner) {
|
|
105
|
+
const owner = forceOwner != null ? forceOwner : (query.get("owner") ?? undefined);
|
|
106
|
+
const limit = Math.min(100, Math.max(1, Number(query.get("limit") ?? 50) || 50));
|
|
107
|
+
const cursor = decodeSessionCursor(query.get("cursor"));
|
|
108
|
+
const qRaw = (query.get("q") ?? "").trim();
|
|
109
|
+
const q = qRaw ? qRaw.slice(0, 256) : undefined;
|
|
110
|
+
const rows = await lister({ ...(owner ? { owner } : {}), ...(cursor ? { cursor } : {}), limit: limit + 1, ...(q ? { q } : {}) });
|
|
111
|
+
const hasMore = rows.length > limit;
|
|
112
|
+
const page = hasMore ? rows.slice(0, limit) : rows;
|
|
113
|
+
const last = page[page.length - 1];
|
|
114
|
+
const nextCursor = hasMore && last ? encodeSessionCursor({ lastActivityAt: last.lastActivityAt, sessionId: last.sessionId }) : undefined;
|
|
115
|
+
sendJson(res, 200, { sessions: page, ...(nextCursor ? { nextCursor } : {}) });
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=sessions-list.js.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import type { RouteCtx } from "../route-ctx.js";
|
|
3
|
+
export interface SessionsLocal {
|
|
4
|
+
sseConnections: number;
|
|
5
|
+
sseOwnerLookups: number;
|
|
6
|
+
mcpStatusCache: Map<string, {
|
|
7
|
+
at: number;
|
|
8
|
+
panel: Promise<{
|
|
9
|
+
servers: unknown[];
|
|
10
|
+
asOf: string;
|
|
11
|
+
degraded?: boolean;
|
|
12
|
+
}>;
|
|
13
|
+
}>;
|
|
14
|
+
}
|
|
15
|
+
export declare function createSessionsLocal(): SessionsLocal;
|
|
16
|
+
export declare function handleSessions(req: IncomingMessage, res: ServerResponse, url: string, ctx: RouteCtx): Promise<boolean>;
|
|
17
|
+
//# sourceMappingURL=sessions.d.ts.map
|