@amodalai/runtime 0.3.69 → 0.3.71
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/src/auth/__fixtures__/custom-strategy.d.ts +8 -0
- package/dist/src/auth/__fixtures__/custom-strategy.js +27 -0
- package/dist/src/auth/__fixtures__/custom-strategy.js.map +1 -0
- package/dist/src/auth/compose.d.ts +55 -0
- package/dist/src/auth/compose.js +142 -0
- package/dist/src/auth/compose.js.map +1 -0
- package/dist/src/auth/compose.test.d.ts +6 -0
- package/dist/src/auth/compose.test.js +159 -0
- package/dist/src/auth/compose.test.js.map +1 -0
- package/dist/src/auth/config.d.ts +261 -0
- package/dist/src/auth/config.js +107 -0
- package/dist/src/auth/config.js.map +1 -0
- package/dist/src/auth/config.test.d.ts +6 -0
- package/dist/src/auth/config.test.js +85 -0
- package/dist/src/auth/config.test.js.map +1 -0
- package/dist/src/auth/factory.d.ts +19 -0
- package/dist/src/auth/factory.js +57 -0
- package/dist/src/auth/factory.js.map +1 -0
- package/dist/src/auth/factory.test.d.ts +6 -0
- package/dist/src/auth/factory.test.js +60 -0
- package/dist/src/auth/factory.test.js.map +1 -0
- package/dist/src/auth/index.d.ts +48 -0
- package/dist/src/auth/index.js +19 -0
- package/dist/src/auth/index.js.map +1 -0
- package/dist/src/auth/strategies/amodal.d.ts +36 -0
- package/dist/src/auth/strategies/amodal.js +28 -0
- package/dist/src/auth/strategies/amodal.js.map +1 -0
- package/dist/src/auth/strategies/api-key.d.ts +41 -0
- package/dist/src/auth/strategies/api-key.js +63 -0
- package/dist/src/auth/strategies/api-key.js.map +1 -0
- package/dist/src/auth/strategies/auth-modes.integration.test.d.ts +6 -0
- package/dist/src/auth/strategies/auth-modes.integration.test.js +363 -0
- package/dist/src/auth/strategies/auth-modes.integration.test.js.map +1 -0
- package/dist/src/auth/strategies/cookie.d.ts +41 -0
- package/dist/src/auth/strategies/cookie.js +84 -0
- package/dist/src/auth/strategies/cookie.js.map +1 -0
- package/dist/src/auth/strategies/custom-loader.d.ts +17 -0
- package/dist/src/auth/strategies/custom-loader.js +37 -0
- package/dist/src/auth/strategies/custom-loader.js.map +1 -0
- package/dist/src/auth/strategies/header.d.ts +35 -0
- package/dist/src/auth/strategies/header.js +42 -0
- package/dist/src/auth/strategies/header.js.map +1 -0
- package/dist/src/auth/strategies/jwks.d.ts +38 -0
- package/dist/src/auth/strategies/jwks.js +86 -0
- package/dist/src/auth/strategies/jwks.js.map +1 -0
- package/dist/src/auth/strategies/jwt-secret.d.ts +25 -0
- package/dist/src/auth/strategies/jwt-secret.js +82 -0
- package/dist/src/auth/strategies/jwt-secret.js.map +1 -0
- package/dist/src/auth/strategies/jwt-secret.test.d.ts +6 -0
- package/dist/src/auth/strategies/jwt-secret.test.js +75 -0
- package/dist/src/auth/strategies/jwt-secret.test.js.map +1 -0
- package/dist/src/auth/strategies/none.d.ts +37 -0
- package/dist/src/auth/strategies/none.js +31 -0
- package/dist/src/auth/strategies/none.js.map +1 -0
- package/dist/src/auth/strategies/oidc.d.ts +48 -0
- package/dist/src/auth/strategies/oidc.integration.test.d.ts +6 -0
- package/dist/src/auth/strategies/oidc.integration.test.js +290 -0
- package/dist/src/auth/strategies/oidc.integration.test.js.map +1 -0
- package/dist/src/auth/strategies/oidc.js +284 -0
- package/dist/src/auth/strategies/oidc.js.map +1 -0
- package/dist/src/auth/strategies/oidc.test.d.ts +6 -0
- package/dist/src/auth/strategies/oidc.test.js +111 -0
- package/dist/src/auth/strategies/oidc.test.js.map +1 -0
- package/dist/src/auth/strategies/strategies.test.d.ts +6 -0
- package/dist/src/auth/strategies/strategies.test.js +190 -0
- package/dist/src/auth/strategies/strategies.test.js.map +1 -0
- package/dist/src/auth/types.d.ts +95 -0
- package/dist/src/auth/types.js +7 -0
- package/dist/src/auth/types.js.map +1 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/routes/session-resolver.d.ts +10 -10
- package/dist/src/routes/session-resolver.js +33 -17
- package/dist/src/routes/session-resolver.js.map +1 -1
- package/dist/src/routes/session-resolver.test.js +121 -80
- package/dist/src/routes/session-resolver.test.js.map +1 -1
- package/dist/src/session/drizzle-session-store.d.ts +8 -12
- package/dist/src/session/drizzle-session-store.js +38 -37
- package/dist/src/session/drizzle-session-store.js.map +1 -1
- package/dist/src/session/store.d.ts +5 -5
- package/dist/src/session/store.js +54 -38
- package/dist/src/session/store.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -4
|
@@ -13,10 +13,10 @@
|
|
|
13
13
|
* Errors bubble up as SessionStoreError — callers at module edges
|
|
14
14
|
* (session manager, routes) are responsible for handling.
|
|
15
15
|
*/
|
|
16
|
-
import { eq, lt, desc, and } from
|
|
17
|
-
import { SessionStoreError } from
|
|
18
|
-
import { notifySessionUpdated } from
|
|
19
|
-
import { buildListConditions, encodeCursor, rowToPersistedSession, sessionToRow, } from
|
|
16
|
+
import { eq, lt, desc, and, sql } from "drizzle-orm";
|
|
17
|
+
import { SessionStoreError } from "../errors.js";
|
|
18
|
+
import { notifySessionUpdated } from "@amodalai/db";
|
|
19
|
+
import { buildListConditions, encodeCursor, rowToPersistedSession, sessionToRow, } from "./store.js";
|
|
20
20
|
const DEFAULT_LIST_LIMIT = 50;
|
|
21
21
|
export class DrizzleSessionStore {
|
|
22
22
|
/** Exposed for channel session mapper to share the connection pool. */
|
|
@@ -44,7 +44,7 @@ export class DrizzleSessionStore {
|
|
|
44
44
|
// Intentionally empty — initialization happens in the factories.
|
|
45
45
|
}
|
|
46
46
|
async save(session) {
|
|
47
|
-
this.ensureOpen(
|
|
47
|
+
this.ensureOpen("save");
|
|
48
48
|
const values = sessionToRow(session);
|
|
49
49
|
try {
|
|
50
50
|
await this.db
|
|
@@ -63,9 +63,9 @@ export class DrizzleSessionStore {
|
|
|
63
63
|
});
|
|
64
64
|
}
|
|
65
65
|
catch (cause) {
|
|
66
|
-
throw new SessionStoreError(
|
|
66
|
+
throw new SessionStoreError("Failed to save session", {
|
|
67
67
|
backend: this.backendName,
|
|
68
|
-
operation:
|
|
68
|
+
operation: "save",
|
|
69
69
|
cause,
|
|
70
70
|
context: { sessionId: session.id },
|
|
71
71
|
});
|
|
@@ -73,10 +73,12 @@ export class DrizzleSessionStore {
|
|
|
73
73
|
// Best-effort NOTIFY so Studio/listeners see session updates in real time.
|
|
74
74
|
try {
|
|
75
75
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Drizzle db is NodePgDatabase
|
|
76
|
-
await notifySessionUpdated(this.db, {
|
|
76
|
+
await notifySessionUpdated(this.db, {
|
|
77
|
+
sessionId: session.id,
|
|
78
|
+
});
|
|
77
79
|
}
|
|
78
80
|
catch (err) {
|
|
79
|
-
this.logger.warn(
|
|
81
|
+
this.logger.warn("session_notify_failed", {
|
|
80
82
|
sessionId: session.id,
|
|
81
83
|
error: err instanceof Error ? err.message : String(err),
|
|
82
84
|
});
|
|
@@ -85,7 +87,7 @@ export class DrizzleSessionStore {
|
|
|
85
87
|
await this.hooks.onAfterSave(session);
|
|
86
88
|
}
|
|
87
89
|
async load(sessionId) {
|
|
88
|
-
this.ensureOpen(
|
|
90
|
+
this.ensureOpen("load");
|
|
89
91
|
try {
|
|
90
92
|
const rows = await this.db
|
|
91
93
|
.select()
|
|
@@ -99,16 +101,16 @@ export class DrizzleSessionStore {
|
|
|
99
101
|
catch (cause) {
|
|
100
102
|
if (cause instanceof SessionStoreError)
|
|
101
103
|
throw cause;
|
|
102
|
-
throw new SessionStoreError(
|
|
104
|
+
throw new SessionStoreError("Failed to load session", {
|
|
103
105
|
backend: this.backendName,
|
|
104
|
-
operation:
|
|
106
|
+
operation: "load",
|
|
105
107
|
cause,
|
|
106
108
|
context: { sessionId },
|
|
107
109
|
});
|
|
108
110
|
}
|
|
109
111
|
}
|
|
110
112
|
async list(opts) {
|
|
111
|
-
this.ensureOpen(
|
|
113
|
+
this.ensureOpen("list");
|
|
112
114
|
const limit = opts?.limit ?? DEFAULT_LIST_LIMIT;
|
|
113
115
|
const where = buildListConditions(this.backendName, opts, this.table);
|
|
114
116
|
try {
|
|
@@ -129,15 +131,15 @@ export class DrizzleSessionStore {
|
|
|
129
131
|
catch (cause) {
|
|
130
132
|
if (cause instanceof SessionStoreError)
|
|
131
133
|
throw cause;
|
|
132
|
-
throw new SessionStoreError(
|
|
134
|
+
throw new SessionStoreError("Failed to list sessions", {
|
|
133
135
|
backend: this.backendName,
|
|
134
|
-
operation:
|
|
136
|
+
operation: "list",
|
|
135
137
|
cause,
|
|
136
138
|
});
|
|
137
139
|
}
|
|
138
140
|
}
|
|
139
141
|
async delete(sessionId) {
|
|
140
|
-
this.ensureOpen(
|
|
142
|
+
this.ensureOpen("delete");
|
|
141
143
|
let result;
|
|
142
144
|
try {
|
|
143
145
|
result = await this.db
|
|
@@ -146,9 +148,9 @@ export class DrizzleSessionStore {
|
|
|
146
148
|
.returning({ id: this.table.id });
|
|
147
149
|
}
|
|
148
150
|
catch (cause) {
|
|
149
|
-
throw new SessionStoreError(
|
|
151
|
+
throw new SessionStoreError("Failed to delete session", {
|
|
150
152
|
backend: this.backendName,
|
|
151
|
-
operation:
|
|
153
|
+
operation: "delete",
|
|
152
154
|
cause,
|
|
153
155
|
context: { sessionId },
|
|
154
156
|
});
|
|
@@ -160,7 +162,7 @@ export class DrizzleSessionStore {
|
|
|
160
162
|
return deleted;
|
|
161
163
|
}
|
|
162
164
|
async cleanup(before) {
|
|
163
|
-
this.ensureOpen(
|
|
165
|
+
this.ensureOpen("cleanup");
|
|
164
166
|
let result;
|
|
165
167
|
try {
|
|
166
168
|
result = await this.db
|
|
@@ -169,15 +171,15 @@ export class DrizzleSessionStore {
|
|
|
169
171
|
.returning({ id: this.table.id });
|
|
170
172
|
}
|
|
171
173
|
catch (cause) {
|
|
172
|
-
throw new SessionStoreError(
|
|
174
|
+
throw new SessionStoreError("Failed to cleanup sessions", {
|
|
173
175
|
backend: this.backendName,
|
|
174
|
-
operation:
|
|
176
|
+
operation: "cleanup",
|
|
175
177
|
cause,
|
|
176
178
|
context: { before: before.toISOString() },
|
|
177
179
|
});
|
|
178
180
|
}
|
|
179
181
|
if (result.length > 0) {
|
|
180
|
-
this.logger.info(
|
|
182
|
+
this.logger.info("session_store_cleanup", {
|
|
181
183
|
backend: this.backendName,
|
|
182
184
|
deleted: result.length,
|
|
183
185
|
});
|
|
@@ -191,30 +193,29 @@ export class DrizzleSessionStore {
|
|
|
191
193
|
* Find the most recent session ID for a given scope_id.
|
|
192
194
|
* Returns null if no session exists for that scope.
|
|
193
195
|
*
|
|
194
|
-
*
|
|
195
|
-
*
|
|
196
|
-
* so it can't be efficiently indexed or filtered here. This is safe
|
|
197
|
-
* in production (Neon per agent — only one agent's data in the DB).
|
|
198
|
-
* In shared-DB local dev, scope_ids are opaque ISV-controlled
|
|
199
|
-
* identifiers that won't collide across agents in practice.
|
|
196
|
+
* When agentId is provided, filters the metadata-scoped agent id as well.
|
|
197
|
+
* This avoids cross-agent scope collisions in local shared Postgres.
|
|
200
198
|
*/
|
|
201
|
-
async findByScopeId(scopeId) {
|
|
202
|
-
this.ensureOpen(
|
|
199
|
+
async findByScopeId(scopeId, agentId) {
|
|
200
|
+
this.ensureOpen("findByScopeId");
|
|
203
201
|
try {
|
|
202
|
+
const conditions = [eq(this.table.scopeId, scopeId)];
|
|
203
|
+
if (agentId)
|
|
204
|
+
conditions.push(sql `${this.table.metadata}->>'agentId' = ${agentId}`);
|
|
204
205
|
const rows = await this.db
|
|
205
206
|
.select({ id: this.table.id })
|
|
206
207
|
.from(this.table)
|
|
207
|
-
.where(and(
|
|
208
|
+
.where(and(...conditions))
|
|
208
209
|
.orderBy(desc(this.table.updatedAt))
|
|
209
210
|
.limit(1);
|
|
210
211
|
return rows[0]?.id ?? null;
|
|
211
212
|
}
|
|
212
213
|
catch (cause) {
|
|
213
|
-
throw new SessionStoreError(
|
|
214
|
+
throw new SessionStoreError("Failed to find session by scope", {
|
|
214
215
|
backend: this.backendName,
|
|
215
|
-
operation:
|
|
216
|
+
operation: "findByScopeId",
|
|
216
217
|
cause,
|
|
217
|
-
context: { scopeId },
|
|
218
|
+
context: { scopeId, agentId },
|
|
218
219
|
});
|
|
219
220
|
}
|
|
220
221
|
}
|
|
@@ -226,16 +227,16 @@ export class DrizzleSessionStore {
|
|
|
226
227
|
await this.onClose();
|
|
227
228
|
}
|
|
228
229
|
catch (cause) {
|
|
229
|
-
throw new SessionStoreError(
|
|
230
|
+
throw new SessionStoreError("Failed to close session store", {
|
|
230
231
|
backend: this.backendName,
|
|
231
|
-
operation:
|
|
232
|
+
operation: "close",
|
|
232
233
|
cause,
|
|
233
234
|
});
|
|
234
235
|
}
|
|
235
236
|
}
|
|
236
237
|
ensureOpen(operation) {
|
|
237
238
|
if (this.closed) {
|
|
238
|
-
throw new SessionStoreError(
|
|
239
|
+
throw new SessionStoreError("Session store is closed", {
|
|
239
240
|
backend: this.backendName,
|
|
240
241
|
operation,
|
|
241
242
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drizzle-session-store.js","sourceRoot":"","sources":["../../../src/session/drizzle-session-store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;GASG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"drizzle-session-store.js","sourceRoot":"","sources":["../../../src/session/drizzle-session-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,10 +14,10 @@
|
|
|
14
14
|
*
|
|
15
15
|
* The Drizzle schema lives in `@amodalai/db`.
|
|
16
16
|
*/
|
|
17
|
-
import { and } from
|
|
18
|
-
import type { AnyPgColumn } from
|
|
19
|
-
import type { agentSessions } from
|
|
20
|
-
import type { PersistedSession } from
|
|
17
|
+
import { and } from "drizzle-orm";
|
|
18
|
+
import type { AnyPgColumn } from "drizzle-orm/pg-core";
|
|
19
|
+
import type { agentSessions } from "@amodalai/db";
|
|
20
|
+
import type { PersistedSession } from "./types.js";
|
|
21
21
|
/**
|
|
22
22
|
* Options for `SessionStore.list()`.
|
|
23
23
|
*
|
|
@@ -111,7 +111,7 @@ export interface SessionStore {
|
|
|
111
111
|
* Find the most recent session for a scope. Returns the session ID or null.
|
|
112
112
|
* Optional — only implemented by stores that support scope-based lookup.
|
|
113
113
|
*/
|
|
114
|
-
findByScopeId?(scopeId: string): Promise<string | null>;
|
|
114
|
+
findByScopeId?(scopeId: string, agentId?: string): Promise<string | null>;
|
|
115
115
|
}
|
|
116
116
|
export declare function validateFilterKey(backend: string, key: string): void;
|
|
117
117
|
/** Encode a cursor as opaque base64 of "updatedAt.ms|id". */
|
|
@@ -14,11 +14,11 @@
|
|
|
14
14
|
*
|
|
15
15
|
* The Drizzle schema lives in `@amodalai/db`.
|
|
16
16
|
*/
|
|
17
|
-
import { and, eq, lt, or, gte, lte, sql } from
|
|
18
|
-
import { randomUUID } from
|
|
19
|
-
import { SessionStoreError } from
|
|
20
|
-
import { scrubMessagesForPersistence } from
|
|
21
|
-
const IMAGE_REF_PREFIX =
|
|
17
|
+
import { and, eq, lt, or, gte, lte, sql } from "drizzle-orm";
|
|
18
|
+
import { randomUUID } from "node:crypto";
|
|
19
|
+
import { SessionStoreError } from "../errors.js";
|
|
20
|
+
import { scrubMessagesForPersistence } from "./credential-scrubber.js";
|
|
21
|
+
const IMAGE_REF_PREFIX = "__amodal_imgref:";
|
|
22
22
|
const IMAGE_REF_PATTERN = /^__amodal_imgref:([a-f0-9-]+)__$/;
|
|
23
23
|
// ---------------------------------------------------------------------------
|
|
24
24
|
// Shared helpers
|
|
@@ -34,32 +34,35 @@ export function validateFilterKey(backend, key) {
|
|
|
34
34
|
if (!SAFE_KEY_RE.test(key)) {
|
|
35
35
|
throw new SessionStoreError(`Invalid filter field name: ${JSON.stringify(key)}`, {
|
|
36
36
|
backend,
|
|
37
|
-
operation:
|
|
38
|
-
context: {
|
|
37
|
+
operation: "list",
|
|
38
|
+
context: {
|
|
39
|
+
key,
|
|
40
|
+
expected: "identifier: letters, digits, underscore only",
|
|
41
|
+
},
|
|
39
42
|
});
|
|
40
43
|
}
|
|
41
44
|
}
|
|
42
45
|
/** Encode a cursor as opaque base64 of "updatedAt.ms|id". */
|
|
43
46
|
export function encodeCursor(updatedAt, id) {
|
|
44
|
-
return Buffer.from(`${updatedAt.getTime()}|${id}`,
|
|
47
|
+
return Buffer.from(`${updatedAt.getTime()}|${id}`, "utf8").toString("base64url");
|
|
45
48
|
}
|
|
46
49
|
/** Decode a cursor; throws SessionStoreError on malformed input. */
|
|
47
50
|
export function decodeCursor(backend, cursor) {
|
|
48
51
|
try {
|
|
49
|
-
const decoded = Buffer.from(cursor,
|
|
50
|
-
const sep = decoded.indexOf(
|
|
52
|
+
const decoded = Buffer.from(cursor, "base64url").toString("utf8");
|
|
53
|
+
const sep = decoded.indexOf("|");
|
|
51
54
|
if (sep < 0)
|
|
52
|
-
throw new Error(
|
|
55
|
+
throw new Error("missing separator");
|
|
53
56
|
const ms = Number(decoded.slice(0, sep));
|
|
54
57
|
const id = decoded.slice(sep + 1);
|
|
55
58
|
if (!Number.isFinite(ms) || !id)
|
|
56
|
-
throw new Error(
|
|
59
|
+
throw new Error("bad parts");
|
|
57
60
|
return { updatedAt: new Date(ms), id };
|
|
58
61
|
}
|
|
59
62
|
catch (cause) {
|
|
60
|
-
throw new SessionStoreError(
|
|
63
|
+
throw new SessionStoreError("Invalid pagination cursor", {
|
|
61
64
|
backend,
|
|
62
|
-
operation:
|
|
65
|
+
operation: "list",
|
|
63
66
|
cause,
|
|
64
67
|
});
|
|
65
68
|
}
|
|
@@ -77,22 +80,28 @@ export function decodeCursor(backend, cursor) {
|
|
|
77
80
|
function extractImages(messages) {
|
|
78
81
|
const imageData = {};
|
|
79
82
|
const cleaned = messages.map((msg) => {
|
|
80
|
-
if (msg.role !==
|
|
83
|
+
if (msg.role !== "user" || !Array.isArray(msg.content))
|
|
81
84
|
return msg;
|
|
82
|
-
const hasImage = msg.content.some((p) => typeof p ===
|
|
85
|
+
const hasImage = msg.content.some((p) => typeof p === "object" &&
|
|
86
|
+
"type" in p &&
|
|
87
|
+
p.type === "image" &&
|
|
88
|
+
"image" in p);
|
|
83
89
|
if (!hasImage)
|
|
84
90
|
return msg;
|
|
85
91
|
return {
|
|
86
92
|
...msg,
|
|
87
93
|
content: msg.content.map((part) => {
|
|
88
|
-
if (typeof part !==
|
|
94
|
+
if (typeof part !== "object" ||
|
|
95
|
+
!("type" in part) ||
|
|
96
|
+
part.type !== "image" ||
|
|
97
|
+
!("image" in part)) {
|
|
89
98
|
return part;
|
|
90
99
|
}
|
|
91
100
|
const refId = randomUUID().slice(0, 12);
|
|
92
|
-
const data = typeof part.image ===
|
|
93
|
-
const mimeType = String(part.mediaType ??
|
|
101
|
+
const data = typeof part.image === "string" ? part.image : "";
|
|
102
|
+
const mimeType = String(part.mediaType ?? "image/png");
|
|
94
103
|
imageData[refId] = { mimeType, data };
|
|
95
|
-
return { type:
|
|
104
|
+
return { type: "text", text: `${IMAGE_REF_PREFIX}${refId}__` };
|
|
96
105
|
}),
|
|
97
106
|
};
|
|
98
107
|
});
|
|
@@ -107,16 +116,23 @@ function rehydrateImages(messages, imageData) {
|
|
|
107
116
|
if (!imageData || Object.keys(imageData).length === 0)
|
|
108
117
|
return messages;
|
|
109
118
|
return messages.map((msg) => {
|
|
110
|
-
if (msg.role !==
|
|
119
|
+
if (msg.role !== "user" || !Array.isArray(msg.content))
|
|
111
120
|
return msg;
|
|
112
|
-
const hasRef = msg.content.some((p) => typeof p ===
|
|
113
|
-
|
|
121
|
+
const hasRef = msg.content.some((p) => typeof p === "object" &&
|
|
122
|
+
"type" in p &&
|
|
123
|
+
p.type === "text" &&
|
|
124
|
+
"text" in p &&
|
|
125
|
+
typeof p.text === "string" &&
|
|
126
|
+
p.text.startsWith(IMAGE_REF_PREFIX));
|
|
114
127
|
if (!hasRef)
|
|
115
128
|
return msg;
|
|
116
129
|
return {
|
|
117
130
|
...msg,
|
|
118
131
|
content: msg.content.map((part) => {
|
|
119
|
-
if (typeof part !==
|
|
132
|
+
if (typeof part !== "object" ||
|
|
133
|
+
!("type" in part) ||
|
|
134
|
+
part.type !== "text" ||
|
|
135
|
+
!("text" in part)) {
|
|
120
136
|
return part;
|
|
121
137
|
}
|
|
122
138
|
const text = String(part.text);
|
|
@@ -127,7 +143,7 @@ function rehydrateImages(messages, imageData) {
|
|
|
127
143
|
if (!ref)
|
|
128
144
|
return part; // ref missing — leave placeholder
|
|
129
145
|
return {
|
|
130
|
-
type:
|
|
146
|
+
type: "image",
|
|
131
147
|
image: ref.data,
|
|
132
148
|
mediaType: ref.mimeType,
|
|
133
149
|
};
|
|
@@ -140,11 +156,9 @@ export function sessionToRow(session) {
|
|
|
140
156
|
// Merge any existing image data from the session (prior turns) with
|
|
141
157
|
// newly extracted images from this turn.
|
|
142
158
|
const mergedImageData = { ...(session.imageData ?? {}), ...imageData };
|
|
143
|
-
//
|
|
144
|
-
//
|
|
145
|
-
//
|
|
146
|
-
// can recognize a pasted token and redirect per the F.4 rule);
|
|
147
|
-
// only what hits the database is sanitized.
|
|
159
|
+
// Sanitize credential-shaped substrings at the persistence boundary.
|
|
160
|
+
// Active turn handling still sees raw user text, but stored transcripts
|
|
161
|
+
// must not retain pasted tokens.
|
|
148
162
|
const scrubbedMessages = scrubMessagesForPersistence(messages);
|
|
149
163
|
return {
|
|
150
164
|
id: session.id,
|
|
@@ -174,16 +188,18 @@ function dedupeToolResults(messages) {
|
|
|
174
188
|
const seenToolCallIds = new Set();
|
|
175
189
|
const out = [];
|
|
176
190
|
for (const msg of messages) {
|
|
177
|
-
if (msg.role !==
|
|
191
|
+
if (msg.role !== "tool" || !Array.isArray(msg.content)) {
|
|
178
192
|
out.push(msg);
|
|
179
193
|
continue;
|
|
180
194
|
}
|
|
181
195
|
const keptBlocks = msg.content.filter((block) => {
|
|
182
|
-
if (typeof block !==
|
|
196
|
+
if (typeof block !== "object" ||
|
|
197
|
+
!("type" in block) ||
|
|
198
|
+
block.type !== "tool-result") {
|
|
183
199
|
return true;
|
|
184
200
|
}
|
|
185
201
|
const id = block.toolCallId;
|
|
186
|
-
if (typeof id !==
|
|
202
|
+
if (typeof id !== "string")
|
|
187
203
|
return true;
|
|
188
204
|
if (seenToolCallIds.has(id))
|
|
189
205
|
return false;
|
|
@@ -210,14 +226,14 @@ export function rowToPersistedSession(backend, row) {
|
|
|
210
226
|
if (row.version !== 1) {
|
|
211
227
|
throw new SessionStoreError(`Unsupported persisted session version: ${row.version}`, {
|
|
212
228
|
backend,
|
|
213
|
-
operation:
|
|
229
|
+
operation: "load",
|
|
214
230
|
context: { sessionId: row.id, version: row.version, supported: 1 },
|
|
215
231
|
});
|
|
216
232
|
}
|
|
217
233
|
if (!Array.isArray(row.messages)) {
|
|
218
|
-
throw new SessionStoreError(
|
|
234
|
+
throw new SessionStoreError("Persisted session has non-array messages payload", {
|
|
219
235
|
backend,
|
|
220
|
-
operation:
|
|
236
|
+
operation: "load",
|
|
221
237
|
context: { sessionId: row.id, messagesType: typeof row.messages },
|
|
222
238
|
});
|
|
223
239
|
}
|
|
@@ -228,7 +244,7 @@ export function rowToPersistedSession(backend, row) {
|
|
|
228
244
|
return {
|
|
229
245
|
version: 1,
|
|
230
246
|
id: row.id,
|
|
231
|
-
scopeId: row.scopeId ??
|
|
247
|
+
scopeId: row.scopeId ?? "",
|
|
232
248
|
messages: rehydrateImages(dedupedMessages, imageData),
|
|
233
249
|
tokenUsage: row.tokenUsage,
|
|
234
250
|
metadata: (row.metadata ?? {}),
|
|
@@ -267,7 +283,7 @@ export function buildListConditions(backend, opts, table) {
|
|
|
267
283
|
// text; we coerce the user-supplied value to its JSON string form
|
|
268
284
|
// via parameter binding, so non-string values like numbers/bools
|
|
269
285
|
// compare correctly: metadata->>'n' = '42'.
|
|
270
|
-
const textVal = typeof val ===
|
|
286
|
+
const textVal = typeof val === "string" ? val : JSON.stringify(val);
|
|
271
287
|
conditions.push(sql `${table.metadata}->>${sql.raw(`'${key}'`)} = ${textVal}`);
|
|
272
288
|
}
|
|
273
289
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/session/store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;GAUG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/session/store.ts"],"names":[],"mappings":"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"}
|