@amodalai/runtime 0.3.22 → 0.3.24
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/__fixtures__/smoke.test.js +127 -25
- package/dist/src/__fixtures__/smoke.test.js.map +1 -1
- package/dist/src/agent/local-server.js +4 -180
- package/dist/src/agent/local-server.js.map +1 -1
- package/dist/src/agent/routes/stores.js +5 -5
- package/dist/src/agent/routes/stores.js.map +1 -1
- package/dist/src/agent/routes/stores.test.js +1 -1
- package/dist/src/agent/routes/stores.test.js.map +1 -1
- package/dist/src/credentials.d.ts +44 -0
- package/dist/src/credentials.js +58 -0
- package/dist/src/credentials.js.map +1 -0
- package/dist/src/credentials.test.d.ts +6 -0
- package/dist/src/credentials.test.js +108 -0
- package/dist/src/credentials.test.js.map +1 -0
- package/dist/src/events/store-event-wrapper.js +12 -12
- package/dist/src/events/store-event-wrapper.js.map +1 -1
- package/dist/src/events/store-event-wrapper.test.js +9 -9
- package/dist/src/events/store-event-wrapper.test.js.map +1 -1
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.js +6 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/middleware/auth.d.ts +4 -0
- package/dist/src/middleware/auth.js.map +1 -1
- package/dist/src/routes/chat-stream.js +12 -0
- package/dist/src/routes/chat-stream.js.map +1 -1
- package/dist/src/routes/chat.js +12 -0
- package/dist/src/routes/chat.js.map +1 -1
- package/dist/src/routes/session-resolver.d.ts +11 -0
- package/dist/src/routes/session-resolver.js +30 -6
- package/dist/src/routes/session-resolver.js.map +1 -1
- package/dist/src/routes/sessions-history.d.ts +22 -0
- package/dist/src/routes/sessions-history.js +186 -0
- package/dist/src/routes/sessions-history.js.map +1 -0
- package/dist/src/scope.d.ts +18 -0
- package/dist/src/scope.js +15 -0
- package/dist/src/scope.js.map +1 -0
- package/dist/src/scope.test.d.ts +6 -0
- package/dist/src/scope.test.js +64 -0
- package/dist/src/scope.test.js.map +1 -0
- package/dist/src/server.js +12 -0
- package/dist/src/server.js.map +1 -1
- package/dist/src/session/drizzle-session-store.d.ts +12 -0
- package/dist/src/session/drizzle-session-store.js +33 -1
- package/dist/src/session/drizzle-session-store.js.map +1 -1
- package/dist/src/session/manager.d.ts +3 -1
- package/dist/src/session/manager.js +15 -1
- package/dist/src/session/manager.js.map +1 -1
- package/dist/src/session/session-builder.d.ts +11 -0
- package/dist/src/session/session-builder.js +22 -7
- package/dist/src/session/session-builder.js.map +1 -1
- package/dist/src/session/store.d.ts +6 -0
- package/dist/src/session/store.js +2 -3
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/store.test.js +4 -0
- package/dist/src/session/store.test.js.map +1 -1
- package/dist/src/session/tool-context-factory.d.ts +17 -1
- package/dist/src/session/tool-context-factory.js +95 -9
- package/dist/src/session/tool-context-factory.js.map +1 -1
- package/dist/src/session/tool-context-factory.test.js +2 -1
- package/dist/src/session/tool-context-factory.test.js.map +1 -1
- package/dist/src/session/types.d.ts +6 -0
- package/dist/src/stores/drizzle-store-backend.d.ts +6 -6
- package/dist/src/stores/drizzle-store-backend.js +24 -19
- package/dist/src/stores/drizzle-store-backend.js.map +1 -1
- package/dist/src/stores/drizzle-store-backend.test.js +41 -41
- package/dist/src/stores/drizzle-store-backend.test.js.map +1 -1
- package/dist/src/stores/index.d.ts +1 -0
- package/dist/src/stores/index.js +1 -0
- package/dist/src/stores/index.js.map +1 -1
- package/dist/src/stores/scoped-store-backend.d.ts +36 -0
- package/dist/src/stores/scoped-store-backend.js +59 -0
- package/dist/src/stores/scoped-store-backend.js.map +1 -0
- package/dist/src/stores/scoped-store-backend.test.d.ts +6 -0
- package/dist/src/stores/scoped-store-backend.test.js +159 -0
- package/dist/src/stores/scoped-store-backend.test.js.map +1 -0
- package/dist/src/tools/custom-tool-adapter.d.ts +1 -1
- package/dist/src/tools/custom-tool-adapter.js +1 -1
- package/dist/src/tools/custom-tool-adapter.js.map +1 -1
- package/dist/src/tools/custom-tool-adapter.test.js +2 -1
- package/dist/src/tools/custom-tool-adapter.test.js.map +1 -1
- package/dist/src/tools/fetch-url-tool.test.js +1 -0
- package/dist/src/tools/fetch-url-tool.test.js.map +1 -1
- package/dist/src/tools/mcp-tool-adapter.test.js +1 -0
- package/dist/src/tools/mcp-tool-adapter.test.js.map +1 -1
- package/dist/src/tools/memory-tool.d.ts +5 -3
- package/dist/src/tools/memory-tool.js +30 -30
- package/dist/src/tools/memory-tool.js.map +1 -1
- package/dist/src/tools/memory-tool.test.js +1 -0
- package/dist/src/tools/memory-tool.test.js.map +1 -1
- package/dist/src/tools/registry.test.js +1 -0
- package/dist/src/tools/registry.test.js.map +1 -1
- package/dist/src/tools/request-tool.test.js +1 -0
- package/dist/src/tools/request-tool.test.js.map +1 -1
- package/dist/src/tools/store-tools.js +7 -7
- package/dist/src/tools/store-tools.js.map +1 -1
- package/dist/src/tools/store-tools.test.js +8 -7
- package/dist/src/tools/store-tools.test.js.map +1 -1
- package/dist/src/tools/types.d.ts +4 -0
- package/dist/src/tools/web-search-tool.test.js +1 -0
- package/dist/src/tools/web-search-tool.test.js.map +1 -1
- package/dist/src/types.d.ts +10 -0
- package/dist/src/types.js +4 -0
- package/dist/src/types.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Session history REST routes.
|
|
8
|
+
*
|
|
9
|
+
* Provides GET/PATCH/DELETE for /sessions/history endpoints.
|
|
10
|
+
* Used by both local-server and hosted runtime via createServer.
|
|
11
|
+
*/
|
|
12
|
+
import { Router } from 'express';
|
|
13
|
+
import type { SessionStore } from '../session/store.js';
|
|
14
|
+
import type { StandaloneSessionManager } from '../session/manager.js';
|
|
15
|
+
import type { RuntimeEventBus } from '../events/event-bus.js';
|
|
16
|
+
export interface SessionsHistoryRouterOptions {
|
|
17
|
+
sessionStore: SessionStore;
|
|
18
|
+
sessionManager: StandaloneSessionManager;
|
|
19
|
+
eventBus: RuntimeEventBus;
|
|
20
|
+
appId: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function createSessionsHistoryRouter(options: SessionsHistoryRouterOptions): Router;
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Session history REST routes.
|
|
8
|
+
*
|
|
9
|
+
* Provides GET/PATCH/DELETE for /sessions/history endpoints.
|
|
10
|
+
* Used by both local-server and hosted runtime via createServer.
|
|
11
|
+
*/
|
|
12
|
+
import { Router } from 'express';
|
|
13
|
+
import { asyncHandler } from './route-helpers.js';
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Helpers
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
const SUMMARY_EXCERPT_MAX = 80;
|
|
18
|
+
function isRecord(x) {
|
|
19
|
+
return typeof x === 'object' && x !== null && !Array.isArray(x);
|
|
20
|
+
}
|
|
21
|
+
function isTextPart(part) {
|
|
22
|
+
return isRecord(part) && part['type'] === 'text' && typeof part['text'] === 'string';
|
|
23
|
+
}
|
|
24
|
+
function isToolCallPart(part) {
|
|
25
|
+
return (isRecord(part) &&
|
|
26
|
+
part['type'] === 'tool-call' &&
|
|
27
|
+
typeof part['toolCallId'] === 'string' &&
|
|
28
|
+
typeof part['toolName'] === 'string');
|
|
29
|
+
}
|
|
30
|
+
function getMessageRole(raw) {
|
|
31
|
+
if (!isRecord(raw))
|
|
32
|
+
return null;
|
|
33
|
+
const role = raw['role'];
|
|
34
|
+
return typeof role === 'string' ? role : null;
|
|
35
|
+
}
|
|
36
|
+
function getMessageContent(raw) {
|
|
37
|
+
if (!isRecord(raw))
|
|
38
|
+
return undefined;
|
|
39
|
+
return raw['content'];
|
|
40
|
+
}
|
|
41
|
+
function excerpt(s) {
|
|
42
|
+
return s.length > SUMMARY_EXCERPT_MAX ? `${s.slice(0, SUMMARY_EXCERPT_MAX)}…` : s;
|
|
43
|
+
}
|
|
44
|
+
function extractStringArray(value) {
|
|
45
|
+
if (!Array.isArray(value))
|
|
46
|
+
return [];
|
|
47
|
+
return value.filter((v) => typeof v === 'string');
|
|
48
|
+
}
|
|
49
|
+
function extractFirstUserText(messages) {
|
|
50
|
+
for (const raw of messages) {
|
|
51
|
+
if (getMessageRole(raw) !== 'user')
|
|
52
|
+
continue;
|
|
53
|
+
const content = getMessageContent(raw);
|
|
54
|
+
if (typeof content === 'string')
|
|
55
|
+
return excerpt(content);
|
|
56
|
+
if (Array.isArray(content)) {
|
|
57
|
+
const firstText = content.find(isTextPart);
|
|
58
|
+
if (firstText)
|
|
59
|
+
return excerpt(firstText.text);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
function flattenModelMessage(raw) {
|
|
65
|
+
const role = getMessageRole(raw);
|
|
66
|
+
if (role !== 'user' && role !== 'assistant')
|
|
67
|
+
return null;
|
|
68
|
+
const content = getMessageContent(raw);
|
|
69
|
+
if (typeof content === 'string') {
|
|
70
|
+
return { role, text: content };
|
|
71
|
+
}
|
|
72
|
+
if (Array.isArray(content)) {
|
|
73
|
+
const text = content.filter(isTextPart).map((p) => p.text).join('');
|
|
74
|
+
const toolCalls = role === 'assistant'
|
|
75
|
+
? content.filter(isToolCallPart).map((p) => ({
|
|
76
|
+
toolId: p.toolCallId,
|
|
77
|
+
toolName: p.toolName,
|
|
78
|
+
parameters: isRecord(p.input) ? p.input : {},
|
|
79
|
+
}))
|
|
80
|
+
: [];
|
|
81
|
+
if (text.length === 0 && toolCalls.length === 0)
|
|
82
|
+
return null;
|
|
83
|
+
return toolCalls.length > 0 ? { role, text, toolCalls } : { role, text };
|
|
84
|
+
}
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
const SESSION_LIST_LIMIT = 500;
|
|
88
|
+
export function createSessionsHistoryRouter(options) {
|
|
89
|
+
const { sessionStore, sessionManager, eventBus, appId } = options;
|
|
90
|
+
const router = Router();
|
|
91
|
+
// List sessions
|
|
92
|
+
router.get('/sessions/history', asyncHandler(async (_req, res) => {
|
|
93
|
+
const filter = { appId };
|
|
94
|
+
const { sessions: rows } = await sessionStore.list({ limit: SESSION_LIST_LIMIT, filter });
|
|
95
|
+
const items = rows.map((s) => {
|
|
96
|
+
const title = typeof s.metadata['title'] === 'string' ? s.metadata['title'] : undefined;
|
|
97
|
+
return {
|
|
98
|
+
id: s.id,
|
|
99
|
+
app_id: typeof s.metadata['appId'] === 'string' ? s.metadata['appId'] : appId,
|
|
100
|
+
title: title ?? extractFirstUserText(s.messages) ?? 'Untitled',
|
|
101
|
+
tags: extractStringArray(s.metadata['tags']),
|
|
102
|
+
status: 'active',
|
|
103
|
+
message_count: s.messages.length,
|
|
104
|
+
created_at: s.createdAt.toISOString(),
|
|
105
|
+
updated_at: s.updatedAt.toISOString(),
|
|
106
|
+
};
|
|
107
|
+
});
|
|
108
|
+
res.json(items);
|
|
109
|
+
}));
|
|
110
|
+
// Get single session with messages
|
|
111
|
+
router.get('/sessions/history/:id', asyncHandler(async (req, res) => {
|
|
112
|
+
const persisted = await sessionStore.load(req.params['id'] ?? '');
|
|
113
|
+
if (!persisted) {
|
|
114
|
+
res.status(404).json({ error: 'Session not found' });
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const title = typeof persisted.metadata['title'] === 'string' ? persisted.metadata['title'] : undefined;
|
|
118
|
+
const rawMessages = persisted.messages.map(flattenModelMessage).filter((m) => m !== null);
|
|
119
|
+
const messages = rawMessages.map((m) => ({
|
|
120
|
+
type: m.role === 'user' ? 'user' : 'assistant_text',
|
|
121
|
+
id: `hist-${Math.random().toString(36).slice(2)}`,
|
|
122
|
+
text: m.text,
|
|
123
|
+
timestamp: persisted.updatedAt.toISOString(),
|
|
124
|
+
...(m.toolCalls ? { toolCalls: m.toolCalls } : {}),
|
|
125
|
+
}));
|
|
126
|
+
res.json({
|
|
127
|
+
id: persisted.id,
|
|
128
|
+
app_id: typeof persisted.metadata['appId'] === 'string' ? persisted.metadata['appId'] : appId,
|
|
129
|
+
title: title ?? extractFirstUserText(persisted.messages) ?? 'Untitled',
|
|
130
|
+
tags: extractStringArray(persisted.metadata['tags']),
|
|
131
|
+
status: 'active',
|
|
132
|
+
message_count: persisted.messages.length,
|
|
133
|
+
created_at: persisted.createdAt.toISOString(),
|
|
134
|
+
updated_at: persisted.updatedAt.toISOString(),
|
|
135
|
+
messages,
|
|
136
|
+
});
|
|
137
|
+
}));
|
|
138
|
+
// Rename session
|
|
139
|
+
router.patch('/sessions/history/:id', asyncHandler(async (req, res) => {
|
|
140
|
+
const sessionId = req.params['id'] ?? '';
|
|
141
|
+
const body = req.body;
|
|
142
|
+
if (!body || typeof body !== 'object') {
|
|
143
|
+
res.status(400).json({ error: 'Request body required' });
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- validated above: body is a non-null object
|
|
147
|
+
const updates = body;
|
|
148
|
+
const live = sessionManager.get(sessionId);
|
|
149
|
+
if (live) {
|
|
150
|
+
if (typeof updates['title'] === 'string')
|
|
151
|
+
live.metadata.title = updates['title'];
|
|
152
|
+
if (Array.isArray(updates['tags']))
|
|
153
|
+
live.metadata['tags'] = updates['tags'];
|
|
154
|
+
await sessionManager.persist(live);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
const persisted = await sessionStore.load(sessionId);
|
|
158
|
+
if (!persisted) {
|
|
159
|
+
res.status(404).json({ error: 'Session not found' });
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
if (typeof updates['title'] === 'string')
|
|
163
|
+
persisted.metadata.title = updates['title'];
|
|
164
|
+
if (Array.isArray(updates['tags']))
|
|
165
|
+
persisted.metadata['tags'] = updates['tags'];
|
|
166
|
+
persisted.updatedAt = new Date();
|
|
167
|
+
await sessionStore.save(persisted);
|
|
168
|
+
}
|
|
169
|
+
eventBus.emit({ type: 'session_updated', sessionId, appId, title: typeof updates['title'] === 'string' ? updates['title'] : undefined });
|
|
170
|
+
res.json({ ok: true });
|
|
171
|
+
}));
|
|
172
|
+
// Delete session
|
|
173
|
+
router.delete('/sessions/history/:id', asyncHandler(async (req, res) => {
|
|
174
|
+
const sessionId = req.params['id'] ?? '';
|
|
175
|
+
await sessionManager.destroy(sessionId);
|
|
176
|
+
const deleted = await sessionStore.delete(sessionId);
|
|
177
|
+
if (!deleted) {
|
|
178
|
+
res.status(404).json({ error: 'Session not found' });
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
eventBus.emit({ type: 'session_deleted', sessionId });
|
|
182
|
+
res.json({ ok: true });
|
|
183
|
+
}));
|
|
184
|
+
return router;
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=sessions-history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions-history.js","sourceRoot":"","sources":["../../../src/routes/sessions-history.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
import type { AuthContext } from './middleware/auth.js';
|
|
7
|
+
export interface ResolvedScope {
|
|
8
|
+
scopeId: string;
|
|
9
|
+
scopeContext?: Record<string, string>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Resolve scope from JWT claims (auth context) or request body.
|
|
13
|
+
* JWT takes precedence. Defaults to '' (agent-level, no scope).
|
|
14
|
+
*/
|
|
15
|
+
export declare function resolveScope(req: {
|
|
16
|
+
scope_id?: string;
|
|
17
|
+
context?: Record<string, string>;
|
|
18
|
+
}, auth?: AuthContext): ResolvedScope;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Resolve scope from JWT claims (auth context) or request body.
|
|
8
|
+
* JWT takes precedence. Defaults to '' (agent-level, no scope).
|
|
9
|
+
*/
|
|
10
|
+
export function resolveScope(req, auth) {
|
|
11
|
+
const scopeId = auth?.scopeId ?? req.scope_id ?? '';
|
|
12
|
+
const scopeContext = auth?.scopeContext ?? req.context;
|
|
13
|
+
return { scopeId, scopeContext };
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=scope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/scope.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,GAA0D,EAC1D,IAAkB;IAElB,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;IACpD,MAAM,YAAY,GAAG,IAAI,EAAE,YAAY,IAAI,GAAG,CAAC,OAAO,CAAC;IACvD,OAAO,EAAC,OAAO,EAAE,YAAY,EAAC,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect } from 'vitest';
|
|
7
|
+
import { resolveScope } from './scope.js';
|
|
8
|
+
function makeAuth(overrides = {}) {
|
|
9
|
+
return {
|
|
10
|
+
applicationId: 'app-1',
|
|
11
|
+
authMethod: 'api-key',
|
|
12
|
+
...overrides,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
describe('resolveScope', () => {
|
|
16
|
+
it('returns scopeId from auth context when present', () => {
|
|
17
|
+
const auth = makeAuth({ scopeId: 'user-42' });
|
|
18
|
+
const result = resolveScope({}, auth);
|
|
19
|
+
expect(result.scopeId).toBe('user-42');
|
|
20
|
+
});
|
|
21
|
+
it('returns scopeId from request body when auth has none', () => {
|
|
22
|
+
const auth = makeAuth();
|
|
23
|
+
const result = resolveScope({ scope_id: 'body-scope' }, auth);
|
|
24
|
+
expect(result.scopeId).toBe('body-scope');
|
|
25
|
+
});
|
|
26
|
+
it('auth scopeId takes precedence over request body scopeId', () => {
|
|
27
|
+
const auth = makeAuth({ scopeId: 'auth-scope' });
|
|
28
|
+
const result = resolveScope({ scope_id: 'body-scope' }, auth);
|
|
29
|
+
expect(result.scopeId).toBe('auth-scope');
|
|
30
|
+
});
|
|
31
|
+
it('defaults to empty string when neither auth nor body has scopeId', () => {
|
|
32
|
+
const auth = makeAuth();
|
|
33
|
+
const result = resolveScope({}, auth);
|
|
34
|
+
expect(result.scopeId).toBe('');
|
|
35
|
+
});
|
|
36
|
+
it('defaults to empty string when no auth and no body scopeId', () => {
|
|
37
|
+
const result = resolveScope({});
|
|
38
|
+
expect(result.scopeId).toBe('');
|
|
39
|
+
});
|
|
40
|
+
it('returns scopeContext from auth when present', () => {
|
|
41
|
+
const ctx = { plan: 'pro', region: 'us-west' };
|
|
42
|
+
const auth = makeAuth({ scopeId: 'u1', scopeContext: ctx });
|
|
43
|
+
const result = resolveScope({}, auth);
|
|
44
|
+
expect(result.scopeContext).toEqual(ctx);
|
|
45
|
+
});
|
|
46
|
+
it('falls back to context from request body when auth has none', () => {
|
|
47
|
+
const ctx = { plan: 'free' };
|
|
48
|
+
const auth = makeAuth();
|
|
49
|
+
const result = resolveScope({ context: ctx }, auth);
|
|
50
|
+
expect(result.scopeContext).toEqual(ctx);
|
|
51
|
+
});
|
|
52
|
+
it('auth scopeContext takes precedence over request body context', () => {
|
|
53
|
+
const authCtx = { plan: 'enterprise' };
|
|
54
|
+
const bodyCtx = { plan: 'free' };
|
|
55
|
+
const auth = makeAuth({ scopeContext: authCtx });
|
|
56
|
+
const result = resolveScope({ context: bodyCtx }, auth);
|
|
57
|
+
expect(result.scopeContext).toEqual(authCtx);
|
|
58
|
+
});
|
|
59
|
+
it('scopeContext is undefined when neither auth nor body has it', () => {
|
|
60
|
+
const result = resolveScope({});
|
|
61
|
+
expect(result.scopeContext).toBeUndefined();
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
//# sourceMappingURL=scope.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope.test.js","sourceRoot":"","sources":["../../src/scope.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAC,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAC,YAAY,EAAC,MAAM,YAAY,CAAC;AAGxC,SAAS,QAAQ,CAAC,YAAkC,EAAE;IACpD,OAAO;QACL,aAAa,EAAE,OAAO;QACtB,UAAU,EAAE,SAAS;QACrB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAC,OAAO,EAAE,SAAS,EAAC,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,YAAY,CAAC,EAAC,QAAQ,EAAE,YAAY,EAAC,EAAE,IAAI,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAC,OAAO,EAAE,YAAY,EAAC,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,YAAY,CAAC,EAAC,QAAQ,EAAE,YAAY,EAAC,EAAE,IAAI,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,GAAG,GAAG,EAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAC,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAC,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,GAAG,GAAG,EAAC,IAAI,EAAE,MAAM,EAAC,CAAC;QAC3B,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,YAAY,CAAC,EAAC,OAAO,EAAE,GAAG,EAAC,EAAE,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,OAAO,GAAG,EAAC,IAAI,EAAE,YAAY,EAAC,CAAC;QACrC,MAAM,OAAO,GAAG,EAAC,IAAI,EAAE,MAAM,EAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAC,YAAY,EAAE,OAAO,EAAC,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,YAAY,CAAC,EAAC,OAAO,EAAE,OAAO,EAAC,EAAE,IAAI,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,aAAa,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/src/server.js
CHANGED
|
@@ -21,6 +21,7 @@ import { MessageDedupCache } from './channels/dedup-cache.js';
|
|
|
21
21
|
import { log, createLogger } from './logger.js';
|
|
22
22
|
import { defaultRoleProvider } from './role-provider.js';
|
|
23
23
|
import { asyncHandler } from './routes/route-helpers.js';
|
|
24
|
+
import { createSessionsHistoryRouter } from './routes/sessions-history.js';
|
|
24
25
|
/**
|
|
25
26
|
* Create the Express server with all routes, session management, and graceful shutdown.
|
|
26
27
|
*/
|
|
@@ -40,6 +41,8 @@ export function createServer(options) {
|
|
|
40
41
|
mcpManager: null,
|
|
41
42
|
logger: log,
|
|
42
43
|
};
|
|
44
|
+
// Event bus for session lifecycle events
|
|
45
|
+
const eventBus = new RuntimeEventBus();
|
|
43
46
|
// --- Express app ---
|
|
44
47
|
const app = express();
|
|
45
48
|
// CORS middleware
|
|
@@ -145,6 +148,15 @@ export function createServer(options) {
|
|
|
145
148
|
}));
|
|
146
149
|
log.info('channels_router_mounted', { channels: [...options.channelAdapters.keys()] });
|
|
147
150
|
}
|
|
151
|
+
// Session history routes (when session store is available)
|
|
152
|
+
if (options.sessionStore) {
|
|
153
|
+
app.use(createSessionsHistoryRouter({
|
|
154
|
+
sessionStore: options.sessionStore,
|
|
155
|
+
sessionManager,
|
|
156
|
+
eventBus,
|
|
157
|
+
appId: config.appId ?? 'local',
|
|
158
|
+
}));
|
|
159
|
+
}
|
|
148
160
|
// Additional routers (e.g., session history proxy from hosting layer)
|
|
149
161
|
if (options.additionalRouters) {
|
|
150
162
|
for (const router of options.additionalRouters) {
|
package/dist/src/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;;;;GAMG;AAEH,OAAO,OAAO,MAAM,SAAS,CAAC;AAI9B,OAAO,EAAC,YAAY,EAAC,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAC,sBAAsB,EAAC,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAC,oBAAoB,EAAC,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAC,wBAAwB,EAAC,MAAM,sBAAsB,CAAC;AAK9D,OAAO,EAAC,eAAe,EAAC,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAC,oBAAoB,EAAC,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAC,GAAG,EAAE,YAAY,EAAC,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAC,mBAAmB,EAAoB,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAC,YAAY,EAAC,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -49,6 +49,18 @@ export declare class DrizzleSessionStore implements SessionStore {
|
|
|
49
49
|
list(opts?: SessionListOptions): Promise<SessionListResult>;
|
|
50
50
|
delete(sessionId: string): Promise<boolean>;
|
|
51
51
|
cleanup(before: Date): Promise<number>;
|
|
52
|
+
/**
|
|
53
|
+
* Find the most recent session ID for a given scope_id.
|
|
54
|
+
* Returns null if no session exists for that scope.
|
|
55
|
+
*
|
|
56
|
+
* Note: this queries by scope_id only, without filtering by appId.
|
|
57
|
+
* The sessions table stores appId in metadata JSONB (not a column),
|
|
58
|
+
* so it can't be efficiently indexed or filtered here. This is safe
|
|
59
|
+
* in production (Neon per agent — only one agent's data in the DB).
|
|
60
|
+
* In shared-DB local dev, scope_ids are opaque ISV-controlled
|
|
61
|
+
* identifiers that won't collide across agents in practice.
|
|
62
|
+
*/
|
|
63
|
+
findByScopeId(scopeId: string): Promise<string | null>;
|
|
52
64
|
close(): Promise<void>;
|
|
53
65
|
private ensureOpen;
|
|
54
66
|
}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* Errors bubble up as SessionStoreError — callers at module edges
|
|
16
16
|
* (session manager, routes) are responsible for handling.
|
|
17
17
|
*/
|
|
18
|
-
import { eq, lt, desc } from 'drizzle-orm';
|
|
18
|
+
import { eq, lt, desc, and } from 'drizzle-orm';
|
|
19
19
|
import { SessionStoreError } from '../errors.js';
|
|
20
20
|
import { notifySessionUpdated } from '@amodalai/db';
|
|
21
21
|
import { buildListConditions, encodeCursor, rowToPersistedSession, sessionToRow, } from './store.js';
|
|
@@ -55,6 +55,7 @@ export class DrizzleSessionStore {
|
|
|
55
55
|
.onConflictDoUpdate({
|
|
56
56
|
target: this.table.id,
|
|
57
57
|
set: {
|
|
58
|
+
scopeId: values.scopeId,
|
|
58
59
|
messages: values.messages,
|
|
59
60
|
tokenUsage: values.tokenUsage,
|
|
60
61
|
metadata: values.metadata,
|
|
@@ -188,6 +189,37 @@ export class DrizzleSessionStore {
|
|
|
188
189
|
}
|
|
189
190
|
return result.length;
|
|
190
191
|
}
|
|
192
|
+
/**
|
|
193
|
+
* Find the most recent session ID for a given scope_id.
|
|
194
|
+
* Returns null if no session exists for that scope.
|
|
195
|
+
*
|
|
196
|
+
* Note: this queries by scope_id only, without filtering by appId.
|
|
197
|
+
* The sessions table stores appId in metadata JSONB (not a column),
|
|
198
|
+
* so it can't be efficiently indexed or filtered here. This is safe
|
|
199
|
+
* in production (Neon per agent — only one agent's data in the DB).
|
|
200
|
+
* In shared-DB local dev, scope_ids are opaque ISV-controlled
|
|
201
|
+
* identifiers that won't collide across agents in practice.
|
|
202
|
+
*/
|
|
203
|
+
async findByScopeId(scopeId) {
|
|
204
|
+
this.ensureOpen('findByScopeId');
|
|
205
|
+
try {
|
|
206
|
+
const rows = await this.db
|
|
207
|
+
.select({ id: this.table.id })
|
|
208
|
+
.from(this.table)
|
|
209
|
+
.where(and(eq(this.table.scopeId, scopeId)))
|
|
210
|
+
.orderBy(desc(this.table.updatedAt))
|
|
211
|
+
.limit(1);
|
|
212
|
+
return rows[0]?.id ?? null;
|
|
213
|
+
}
|
|
214
|
+
catch (cause) {
|
|
215
|
+
throw new SessionStoreError('Failed to find session by scope', {
|
|
216
|
+
backend: this.backendName,
|
|
217
|
+
operation: 'findByScopeId',
|
|
218
|
+
cause,
|
|
219
|
+
context: { scopeId },
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
}
|
|
191
223
|
async close() {
|
|
192
224
|
if (this.closed)
|
|
193
225
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drizzle-session-store.js","sourceRoot":"","sources":["../../../src/session/drizzle-session-store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;;GAWG;AAEH,OAAO,EAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAC,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"drizzle-session-store.js","sourceRoot":"","sources":["../../../src/session/drizzle-session-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,7 @@ import type { Session, SessionManagerOptions, CreateSessionOptions, PersistedSes
|
|
|
17
17
|
export declare class StandaloneSessionManager {
|
|
18
18
|
private readonly sessions;
|
|
19
19
|
private readonly pendingResumes;
|
|
20
|
-
|
|
20
|
+
readonly store: SessionStore | null;
|
|
21
21
|
private readonly logger;
|
|
22
22
|
private readonly ttlMs;
|
|
23
23
|
private readonly cleanupIntervalMs;
|
|
@@ -90,6 +90,8 @@ export declare class StandaloneSessionManager {
|
|
|
90
90
|
}): Promise<PersistedSession[]>;
|
|
91
91
|
/** Number of active in-memory sessions. */
|
|
92
92
|
get size(): number;
|
|
93
|
+
/** Get the backing session store (for advanced queries like findByScopeId). */
|
|
94
|
+
getStore(): SessionStore | null;
|
|
93
95
|
/**
|
|
94
96
|
* Destroy a session. Removes from memory and optionally from store.
|
|
95
97
|
*/
|
|
@@ -109,21 +109,28 @@ export class StandaloneSessionManager {
|
|
|
109
109
|
const id = randomUUID();
|
|
110
110
|
const now = Date.now();
|
|
111
111
|
const appId = opts.appId ?? 'local';
|
|
112
|
+
const scopeId = opts.scopeId ?? '';
|
|
112
113
|
// Persist appId into metadata so SessionStore.list() can filter by it
|
|
113
114
|
// (e.g. exclude eval-runner / admin sessions from the chat history UI).
|
|
114
115
|
const metadata = { ...(opts.metadata ?? {}), appId };
|
|
116
|
+
// Create a child logger with scopeId so all downstream log events for this
|
|
117
|
+
// session automatically include scope_id for correlation and filtering.
|
|
118
|
+
const sessionLogger = scopeId
|
|
119
|
+
? this.logger.child({ scopeId })
|
|
120
|
+
: this.logger;
|
|
115
121
|
const session = {
|
|
116
122
|
id,
|
|
117
123
|
provider: opts.provider,
|
|
118
124
|
toolRegistry: opts.toolRegistry,
|
|
119
125
|
permissionChecker: opts.permissionChecker,
|
|
120
|
-
logger:
|
|
126
|
+
logger: sessionLogger,
|
|
121
127
|
systemPrompt: opts.systemPrompt,
|
|
122
128
|
messages: opts.messages ?? [],
|
|
123
129
|
usage: opts.usage ?? { inputTokens: 0, outputTokens: 0, totalTokens: 0 },
|
|
124
130
|
model: opts.provider.model,
|
|
125
131
|
providerName: opts.provider.provider,
|
|
126
132
|
appId,
|
|
133
|
+
scopeId,
|
|
127
134
|
metadata,
|
|
128
135
|
createdAt: now,
|
|
129
136
|
lastAccessedAt: now,
|
|
@@ -138,6 +145,7 @@ export class StandaloneSessionManager {
|
|
|
138
145
|
model: session.model,
|
|
139
146
|
provider: session.providerName,
|
|
140
147
|
appId: session.appId,
|
|
148
|
+
scopeId: session.scopeId,
|
|
141
149
|
toolCount: opts.toolRegistry.size,
|
|
142
150
|
});
|
|
143
151
|
this.eventBus?.emit({
|
|
@@ -245,6 +253,7 @@ export class StandaloneSessionManager {
|
|
|
245
253
|
const persisted = {
|
|
246
254
|
version: 1,
|
|
247
255
|
id: session.id,
|
|
256
|
+
scopeId: session.scopeId,
|
|
248
257
|
messages: session.messages,
|
|
249
258
|
tokenUsage: session.usage,
|
|
250
259
|
metadata: session.metadata,
|
|
@@ -338,6 +347,10 @@ export class StandaloneSessionManager {
|
|
|
338
347
|
get size() {
|
|
339
348
|
return this.sessions.size;
|
|
340
349
|
}
|
|
350
|
+
/** Get the backing session store (for advanced queries like findByScopeId). */
|
|
351
|
+
getStore() {
|
|
352
|
+
return this.store;
|
|
353
|
+
}
|
|
341
354
|
// -------------------------------------------------------------------------
|
|
342
355
|
// Destroy / Cleanup
|
|
343
356
|
// -------------------------------------------------------------------------
|
|
@@ -413,6 +426,7 @@ function makeNoOpToolContext(session) {
|
|
|
413
426
|
log: (message) => { session.logger.debug('tool_log', { session: session.id, message }); },
|
|
414
427
|
signal: AbortSignal.timeout(30_000),
|
|
415
428
|
sessionId: session.id,
|
|
429
|
+
scopeId: '',
|
|
416
430
|
});
|
|
417
431
|
}
|
|
418
432
|
//# sourceMappingURL=manager.js.map
|