@amodalai/runtime 0.1.14 → 0.1.16
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/agent/agent-runner.d.ts +20 -0
- package/dist/src/agent/agent-runner.js +165 -1
- package/dist/src/agent/agent-runner.js.map +1 -1
- package/dist/src/agent/config-watcher.d.ts +2 -2
- package/dist/src/agent/config-watcher.js +28 -15
- package/dist/src/agent/config-watcher.js.map +1 -1
- package/dist/src/agent/config-watcher.test.js +13 -4
- package/dist/src/agent/config-watcher.test.js.map +1 -1
- package/dist/src/agent/eval-store.d.ts +50 -0
- package/dist/src/agent/eval-store.js +137 -0
- package/dist/src/agent/eval-store.js.map +1 -0
- package/dist/src/agent/local-server.d.ts +1 -1
- package/dist/src/agent/local-server.js +44 -26
- package/dist/src/agent/local-server.js.map +1 -1
- package/dist/src/agent/local-server.test.js +2 -1
- package/dist/src/agent/local-server.test.js.map +1 -1
- package/dist/src/agent/proactive/proactive-runner.d.ts +3 -3
- package/dist/src/agent/proactive/proactive-runner.js +3 -3
- package/dist/src/agent/proactive/proactive-runner.js.map +1 -1
- package/dist/src/agent/proactive/proactive-runner.test.js +2 -2
- package/dist/src/agent/proactive/proactive-runner.test.js.map +1 -1
- package/dist/src/agent/routes/admin-chat.d.ts +2 -2
- package/dist/src/agent/routes/admin-chat.js +2 -2
- package/dist/src/agent/routes/admin-chat.js.map +1 -1
- package/dist/src/agent/routes/chat.d.ts +6 -6
- package/dist/src/agent/routes/chat.js +3 -3
- package/dist/src/agent/routes/chat.js.map +1 -1
- package/dist/src/agent/routes/chat.test.js +7 -6
- package/dist/src/agent/routes/chat.test.js.map +1 -1
- package/dist/src/agent/routes/evals.d.ts +16 -0
- package/dist/src/agent/routes/evals.js +383 -0
- package/dist/src/agent/routes/evals.js.map +1 -0
- package/dist/src/agent/routes/inspect.d.ts +2 -2
- package/dist/src/agent/routes/inspect.js +11 -22
- package/dist/src/agent/routes/inspect.js.map +1 -1
- package/dist/src/agent/routes/inspect.test.js +11 -16
- package/dist/src/agent/routes/inspect.test.js.map +1 -1
- package/dist/src/agent/routes/task.d.ts +2 -2
- package/dist/src/agent/routes/task.js +4 -4
- package/dist/src/agent/routes/task.js.map +1 -1
- package/dist/src/agent/routes/task.test.js.map +1 -1
- package/dist/src/agent/session-store.d.ts +2 -2
- package/dist/src/agent/session-store.js +9 -6
- package/dist/src/agent/session-store.js.map +1 -1
- package/dist/src/agent/snapshot-server.js +10 -2
- package/dist/src/agent/snapshot-server.js.map +1 -1
- package/dist/src/agent/{agent-runner.test.d.ts → write-repo-file.test.d.ts} +1 -1
- package/dist/src/agent/write-repo-file.test.js +270 -0
- package/dist/src/agent/write-repo-file.test.js.map +1 -0
- package/dist/src/index.d.ts +4 -1
- package/dist/src/index.js +3 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/routes/chat-stream.js +2 -1
- package/dist/src/routes/chat-stream.js.map +1 -1
- package/dist/src/server.js +0 -2
- package/dist/src/server.js.map +1 -1
- package/dist/src/server.test.js +37 -6
- package/dist/src/server.test.js.map +1 -1
- package/dist/src/session/custom-tool-adapter.d.ts +74 -0
- package/dist/src/session/custom-tool-adapter.js +149 -0
- package/dist/src/session/custom-tool-adapter.js.map +1 -0
- package/dist/src/session/session-manager.d.ts +67 -3
- package/dist/src/session/session-manager.js +313 -7
- package/dist/src/session/session-manager.js.map +1 -1
- package/dist/src/session/session-manager.test.js +63 -6
- package/dist/src/session/session-manager.test.js.map +1 -1
- package/dist/src/session/session-runner.js +12 -0
- package/dist/src/session/session-runner.js.map +1 -1
- package/dist/src/types.d.ts +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/dist/src/agent/agent-runner.test.js +0 -552
- package/dist/src/agent/agent-runner.test.js.map +0 -1
- package/dist/src/agent/session-manager.d.ts +0 -88
- package/dist/src/agent/session-manager.js +0 -341
- package/dist/src/agent/session-manager.js.map +0 -1
- package/dist/src/agent/session-manager.test.d.ts +0 -6
- package/dist/src/agent/session-manager.test.js +0 -145
- package/dist/src/agent/session-manager.test.js.map +0 -1
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Amodal Labs, Inc.
|
|
4
|
-
* SPDX-License-Identifier: MIT
|
|
5
|
-
*/
|
|
6
|
-
import type { AmodalRepo } from '@amodalai/core';
|
|
7
|
-
import { McpManager } from '@amodalai/core';
|
|
8
|
-
import type { RuntimeTelemetryEvent, CustomToolExecutor, CustomShellExecutor, StoreBackend } from '@amodalai/core';
|
|
9
|
-
import type { AgentSession } from './agent-types.js';
|
|
10
|
-
export type TelemetrySink = (event: RuntimeTelemetryEvent) => void;
|
|
11
|
-
export interface AgentSessionManagerOptions {
|
|
12
|
-
ttlMs?: number;
|
|
13
|
-
telemetrySink?: TelemetrySink;
|
|
14
|
-
toolExecutor?: CustomToolExecutor;
|
|
15
|
-
shellExecutor?: CustomShellExecutor;
|
|
16
|
-
storeBackend?: StoreBackend;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Manages repo-based sessions with TTL eviction.
|
|
20
|
-
*/
|
|
21
|
-
export declare class AgentSessionManager {
|
|
22
|
-
private repo;
|
|
23
|
-
private readonly sessions;
|
|
24
|
-
private readonly ttlMs;
|
|
25
|
-
private readonly telemetrySink?;
|
|
26
|
-
private readonly toolExecutor?;
|
|
27
|
-
private readonly shellExecutor?;
|
|
28
|
-
private readonly storeBackend?;
|
|
29
|
-
private platformTelemetry?;
|
|
30
|
-
private cleanupTimer;
|
|
31
|
-
private inspectMcp?;
|
|
32
|
-
private inspectMcpInitialized;
|
|
33
|
-
constructor(repo: AmodalRepo, options?: AgentSessionManagerOptions);
|
|
34
|
-
get size(): number;
|
|
35
|
-
/** Direct access to the repo for read-only operations (inspect, etc.) */
|
|
36
|
-
getRepo(): AmodalRepo;
|
|
37
|
-
/**
|
|
38
|
-
* Create a new session, optionally fetching user context for role extraction.
|
|
39
|
-
*/
|
|
40
|
-
create(appId: string, appToken?: string): Promise<AgentSession>;
|
|
41
|
-
/**
|
|
42
|
-
* Create an admin session for the config chat.
|
|
43
|
-
* Uses admin agent skills/knowledge but the user's connections.
|
|
44
|
-
*/
|
|
45
|
-
createAdminSession(): Promise<AgentSession>;
|
|
46
|
-
/**
|
|
47
|
-
* Create a session from a specific repo (e.g., enriched with tenant credentials).
|
|
48
|
-
* Used by hosted runtime when tenant-specific config is fetched from the platform API.
|
|
49
|
-
*/
|
|
50
|
-
createFromRepo(repo: AmodalRepo, appId: string): Promise<AgentSession>;
|
|
51
|
-
/**
|
|
52
|
-
* Re-register a session under a different ID (e.g., restoring original ID on hydration).
|
|
53
|
-
*/
|
|
54
|
-
reregister(session: AgentSession, newId: string): void;
|
|
55
|
-
/**
|
|
56
|
-
* Get an existing session by ID.
|
|
57
|
-
*/
|
|
58
|
-
get(sessionId: string): AgentSession | undefined;
|
|
59
|
-
/**
|
|
60
|
-
* Destroy a session.
|
|
61
|
-
*/
|
|
62
|
-
destroy(sessionId: string): void;
|
|
63
|
-
/**
|
|
64
|
-
* Remove sessions that have been idle longer than TTL.
|
|
65
|
-
* Returns the number of sessions removed.
|
|
66
|
-
*/
|
|
67
|
-
cleanup(): number;
|
|
68
|
-
/**
|
|
69
|
-
* Update the repo for all new sessions (hot reload).
|
|
70
|
-
* Existing sessions keep their old repo.
|
|
71
|
-
*/
|
|
72
|
-
updateRepo(repo: AmodalRepo): void;
|
|
73
|
-
/**
|
|
74
|
-
* Shut down all sessions and stop the cleanup timer.
|
|
75
|
-
*/
|
|
76
|
-
shutdown(): Promise<void>;
|
|
77
|
-
/**
|
|
78
|
-
* Initialize MCP servers for a session.
|
|
79
|
-
* Sources: connections with protocol=mcp, plus legacy amodal.json mcp.servers block.
|
|
80
|
-
*/
|
|
81
|
-
private initMcp;
|
|
82
|
-
/**
|
|
83
|
-
* Get a persistent MCP manager for inspect/health operations.
|
|
84
|
-
* Lazy-initialized on first call, reused across requests.
|
|
85
|
-
*/
|
|
86
|
-
getInspectMcpManager(): Promise<McpManager | undefined>;
|
|
87
|
-
private getConnectionsMap;
|
|
88
|
-
}
|
|
@@ -1,341 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Amodal Labs, Inc.
|
|
4
|
-
* SPDX-License-Identifier: MIT
|
|
5
|
-
*/
|
|
6
|
-
import { randomUUID } from 'node:crypto';
|
|
7
|
-
import { setupSession, PlanModeManager, prepareExploreConfig, extractRoles, buildConnectionsMap, PlatformTelemetrySink, McpManager, ensureAdminAgent, loadAdminAgent, } from '@amodalai/core';
|
|
8
|
-
import { fetchUserContext } from './user-context-fetcher.js';
|
|
9
|
-
/**
|
|
10
|
-
* Resolve env: references in a string record.
|
|
11
|
-
* "env:VAR_NAME" → process.env.VAR_NAME value
|
|
12
|
-
*/
|
|
13
|
-
function resolveEnvRefs(record) {
|
|
14
|
-
const resolved = {};
|
|
15
|
-
for (const [key, value] of Object.entries(record)) {
|
|
16
|
-
if (value.startsWith('env:')) {
|
|
17
|
-
const envVar = value.slice(4);
|
|
18
|
-
resolved[key] = process.env[envVar] ?? '';
|
|
19
|
-
}
|
|
20
|
-
else {
|
|
21
|
-
resolved[key] = value;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
return resolved;
|
|
25
|
-
}
|
|
26
|
-
const DEFAULT_TTL_MS = 30 * 60 * 1000; // 30 minutes
|
|
27
|
-
const CLEANUP_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes
|
|
28
|
-
/**
|
|
29
|
-
* Manages repo-based sessions with TTL eviction.
|
|
30
|
-
*/
|
|
31
|
-
export class AgentSessionManager {
|
|
32
|
-
repo;
|
|
33
|
-
sessions = new Map();
|
|
34
|
-
ttlMs;
|
|
35
|
-
telemetrySink;
|
|
36
|
-
toolExecutor;
|
|
37
|
-
shellExecutor;
|
|
38
|
-
storeBackend;
|
|
39
|
-
platformTelemetry;
|
|
40
|
-
cleanupTimer = null;
|
|
41
|
-
inspectMcp;
|
|
42
|
-
inspectMcpInitialized = false;
|
|
43
|
-
constructor(repo, options) {
|
|
44
|
-
this.repo = repo;
|
|
45
|
-
this.ttlMs = options?.ttlMs ?? DEFAULT_TTL_MS;
|
|
46
|
-
// If platform config is set and no explicit sink provided, create a platform sink
|
|
47
|
-
if (!options?.telemetrySink && repo.config.platform?.apiKey) {
|
|
48
|
-
const platformUrl = process.env['PLATFORM_API_URL'] ?? 'http://localhost:4000';
|
|
49
|
-
this.platformTelemetry = new PlatformTelemetrySink(platformUrl, repo.config.platform.apiKey);
|
|
50
|
-
this.telemetrySink = this.platformTelemetry.sink();
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
this.telemetrySink = options?.telemetrySink;
|
|
54
|
-
}
|
|
55
|
-
this.toolExecutor = options?.toolExecutor;
|
|
56
|
-
this.shellExecutor = options?.shellExecutor;
|
|
57
|
-
this.storeBackend = options?.storeBackend;
|
|
58
|
-
this.cleanupTimer = setInterval(() => {
|
|
59
|
-
this.cleanup();
|
|
60
|
-
}, CLEANUP_INTERVAL_MS);
|
|
61
|
-
// Unref so the timer doesn't keep the process alive
|
|
62
|
-
if (this.cleanupTimer && typeof this.cleanupTimer === 'object' && 'unref' in this.cleanupTimer) {
|
|
63
|
-
this.cleanupTimer.unref();
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
get size() {
|
|
67
|
-
return this.sessions.size;
|
|
68
|
-
}
|
|
69
|
-
/** Direct access to the repo for read-only operations (inspect, etc.) */
|
|
70
|
-
getRepo() {
|
|
71
|
-
return this.repo;
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Create a new session, optionally fetching user context for role extraction.
|
|
75
|
-
*/
|
|
76
|
-
async create(appId, appToken) {
|
|
77
|
-
let userRoles = [];
|
|
78
|
-
// Fetch user context if configured
|
|
79
|
-
if (this.repo.config.userContext && appToken) {
|
|
80
|
-
try {
|
|
81
|
-
const connectionsMap = this.getConnectionsMap();
|
|
82
|
-
const userData = await fetchUserContext(this.repo, appToken, connectionsMap);
|
|
83
|
-
userRoles = extractRoles(userData);
|
|
84
|
-
}
|
|
85
|
-
catch {
|
|
86
|
-
// Degraded but functional — empty roles
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
const runtime = setupSession({
|
|
90
|
-
repo: this.repo,
|
|
91
|
-
userId: appId,
|
|
92
|
-
userRoles,
|
|
93
|
-
isDelegated: false,
|
|
94
|
-
telemetrySink: this.telemetrySink,
|
|
95
|
-
});
|
|
96
|
-
const planModeManager = new PlanModeManager();
|
|
97
|
-
const exploreConfig = prepareExploreConfig(runtime);
|
|
98
|
-
const session = {
|
|
99
|
-
id: randomUUID(),
|
|
100
|
-
runtime,
|
|
101
|
-
appId,
|
|
102
|
-
conversationHistory: [],
|
|
103
|
-
createdAt: Date.now(),
|
|
104
|
-
lastAccessedAt: Date.now(),
|
|
105
|
-
planModeManager,
|
|
106
|
-
exploreConfig,
|
|
107
|
-
toolExecutor: this.toolExecutor,
|
|
108
|
-
shellExecutor: this.shellExecutor,
|
|
109
|
-
storeBackend: this.storeBackend,
|
|
110
|
-
};
|
|
111
|
-
// Start MCP servers if configured (non-blocking)
|
|
112
|
-
await this.initMcp(session, this.repo);
|
|
113
|
-
this.sessions.set(session.id, session);
|
|
114
|
-
return session;
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Create an admin session for the config chat.
|
|
118
|
-
* Uses admin agent skills/knowledge but the user's connections.
|
|
119
|
-
*/
|
|
120
|
-
async createAdminSession() {
|
|
121
|
-
// Resolve and load admin agent
|
|
122
|
-
const agentDir = await ensureAdminAgent(this.repo.origin);
|
|
123
|
-
const adminContent = await loadAdminAgent(agentDir);
|
|
124
|
-
// Build a modified repo: admin skills/knowledge + user connections
|
|
125
|
-
const adminRepo = {
|
|
126
|
-
...this.repo,
|
|
127
|
-
skills: adminContent.skills,
|
|
128
|
-
knowledge: adminContent.knowledge,
|
|
129
|
-
agents: {
|
|
130
|
-
main: adminContent.agentPrompt ?? undefined,
|
|
131
|
-
simple: undefined,
|
|
132
|
-
subagents: [],
|
|
133
|
-
},
|
|
134
|
-
// Keep user connections so admin can validate/test them
|
|
135
|
-
// Keep stores so admin can see store definitions
|
|
136
|
-
// Clear automations — admin doesn't need them
|
|
137
|
-
automations: [],
|
|
138
|
-
};
|
|
139
|
-
const runtime = setupSession({
|
|
140
|
-
repo: adminRepo,
|
|
141
|
-
userId: 'admin',
|
|
142
|
-
userRoles: ['admin'],
|
|
143
|
-
isDelegated: false,
|
|
144
|
-
telemetrySink: this.telemetrySink,
|
|
145
|
-
});
|
|
146
|
-
const planModeManager = new PlanModeManager();
|
|
147
|
-
const exploreConfig = prepareExploreConfig(runtime);
|
|
148
|
-
const session = {
|
|
149
|
-
id: randomUUID(),
|
|
150
|
-
runtime,
|
|
151
|
-
appId: 'admin',
|
|
152
|
-
conversationHistory: [],
|
|
153
|
-
createdAt: Date.now(),
|
|
154
|
-
lastAccessedAt: Date.now(),
|
|
155
|
-
planModeManager,
|
|
156
|
-
exploreConfig,
|
|
157
|
-
shellExecutor: this.shellExecutor,
|
|
158
|
-
};
|
|
159
|
-
this.sessions.set(session.id, session);
|
|
160
|
-
return session;
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Create a session from a specific repo (e.g., enriched with tenant credentials).
|
|
164
|
-
* Used by hosted runtime when tenant-specific config is fetched from the platform API.
|
|
165
|
-
*/
|
|
166
|
-
async createFromRepo(repo, appId) {
|
|
167
|
-
const runtime = setupSession({
|
|
168
|
-
repo,
|
|
169
|
-
userId: appId,
|
|
170
|
-
userRoles: [],
|
|
171
|
-
isDelegated: false,
|
|
172
|
-
telemetrySink: this.telemetrySink,
|
|
173
|
-
});
|
|
174
|
-
const planModeManager = new PlanModeManager();
|
|
175
|
-
const exploreConfig = prepareExploreConfig(runtime);
|
|
176
|
-
const session = {
|
|
177
|
-
id: randomUUID(),
|
|
178
|
-
runtime,
|
|
179
|
-
appId,
|
|
180
|
-
conversationHistory: [],
|
|
181
|
-
createdAt: Date.now(),
|
|
182
|
-
lastAccessedAt: Date.now(),
|
|
183
|
-
planModeManager,
|
|
184
|
-
exploreConfig,
|
|
185
|
-
toolExecutor: this.toolExecutor,
|
|
186
|
-
shellExecutor: this.shellExecutor,
|
|
187
|
-
storeBackend: this.storeBackend,
|
|
188
|
-
};
|
|
189
|
-
// Start MCP servers if configured (non-blocking)
|
|
190
|
-
await this.initMcp(session, repo);
|
|
191
|
-
this.sessions.set(session.id, session);
|
|
192
|
-
return session;
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* Re-register a session under a different ID (e.g., restoring original ID on hydration).
|
|
196
|
-
*/
|
|
197
|
-
reregister(session, newId) {
|
|
198
|
-
this.sessions.delete(session.id);
|
|
199
|
-
session.id = newId;
|
|
200
|
-
this.sessions.set(newId, session);
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* Get an existing session by ID.
|
|
204
|
-
*/
|
|
205
|
-
get(sessionId) {
|
|
206
|
-
const session = this.sessions.get(sessionId);
|
|
207
|
-
if (session) {
|
|
208
|
-
session.lastAccessedAt = Date.now();
|
|
209
|
-
}
|
|
210
|
-
return session;
|
|
211
|
-
}
|
|
212
|
-
/**
|
|
213
|
-
* Destroy a session.
|
|
214
|
-
*/
|
|
215
|
-
destroy(sessionId) {
|
|
216
|
-
this.sessions.delete(sessionId);
|
|
217
|
-
}
|
|
218
|
-
/**
|
|
219
|
-
* Remove sessions that have been idle longer than TTL.
|
|
220
|
-
* Returns the number of sessions removed.
|
|
221
|
-
*/
|
|
222
|
-
cleanup() {
|
|
223
|
-
const now = Date.now();
|
|
224
|
-
let removed = 0;
|
|
225
|
-
for (const [id, session] of this.sessions) {
|
|
226
|
-
if (now - session.lastAccessedAt > this.ttlMs) {
|
|
227
|
-
this.sessions.delete(id);
|
|
228
|
-
removed++;
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
return removed;
|
|
232
|
-
}
|
|
233
|
-
/**
|
|
234
|
-
* Update the repo for all new sessions (hot reload).
|
|
235
|
-
* Existing sessions keep their old repo.
|
|
236
|
-
*/
|
|
237
|
-
updateRepo(repo) {
|
|
238
|
-
this.repo = repo;
|
|
239
|
-
}
|
|
240
|
-
/**
|
|
241
|
-
* Shut down all sessions and stop the cleanup timer.
|
|
242
|
-
*/
|
|
243
|
-
async shutdown() {
|
|
244
|
-
if (this.cleanupTimer) {
|
|
245
|
-
clearInterval(this.cleanupTimer);
|
|
246
|
-
this.cleanupTimer = null;
|
|
247
|
-
}
|
|
248
|
-
if (this.platformTelemetry) {
|
|
249
|
-
await this.platformTelemetry.destroy();
|
|
250
|
-
this.platformTelemetry = undefined;
|
|
251
|
-
}
|
|
252
|
-
// Shutdown MCP managers for all sessions
|
|
253
|
-
for (const session of this.sessions.values()) {
|
|
254
|
-
if (session.mcpManager) {
|
|
255
|
-
await session.mcpManager.shutdown().catch(() => { });
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
// Shutdown the persistent inspect MCP manager
|
|
259
|
-
if (this.inspectMcp) {
|
|
260
|
-
await this.inspectMcp.shutdown().catch(() => { });
|
|
261
|
-
this.inspectMcp = undefined;
|
|
262
|
-
this.inspectMcpInitialized = false;
|
|
263
|
-
}
|
|
264
|
-
this.sessions.clear();
|
|
265
|
-
}
|
|
266
|
-
/**
|
|
267
|
-
* Initialize MCP servers for a session.
|
|
268
|
-
* Sources: connections with protocol=mcp, plus legacy amodal.json mcp.servers block.
|
|
269
|
-
*/
|
|
270
|
-
async initMcp(session, repo) {
|
|
271
|
-
const mcpServers = {};
|
|
272
|
-
// Build MCP configs from connections with protocol: "mcp"
|
|
273
|
-
for (const [name, conn] of repo.connections) {
|
|
274
|
-
if (conn.spec.protocol === 'mcp') {
|
|
275
|
-
// Resolve env: references in headers and env
|
|
276
|
-
const resolvedHeaders = conn.spec.headers ? resolveEnvRefs(conn.spec.headers) : undefined;
|
|
277
|
-
const resolvedEnv = conn.spec.env ? resolveEnvRefs(conn.spec.env) : undefined;
|
|
278
|
-
mcpServers[name] = {
|
|
279
|
-
transport: conn.spec.transport ?? 'stdio',
|
|
280
|
-
command: conn.spec.command,
|
|
281
|
-
args: conn.spec.args,
|
|
282
|
-
env: resolvedEnv,
|
|
283
|
-
url: conn.spec.url,
|
|
284
|
-
headers: resolvedHeaders,
|
|
285
|
-
trust: conn.spec.trust,
|
|
286
|
-
};
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
// Merge legacy amodal.json mcp.servers block
|
|
290
|
-
if (repo.mcpServers) {
|
|
291
|
-
for (const [name, config] of Object.entries(repo.mcpServers)) {
|
|
292
|
-
if (!mcpServers[name]) {
|
|
293
|
-
mcpServers[name] = config;
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
if (Object.keys(mcpServers).length === 0) {
|
|
298
|
-
return;
|
|
299
|
-
}
|
|
300
|
-
const manager = new McpManager();
|
|
301
|
-
try {
|
|
302
|
-
await manager.startServers(mcpServers);
|
|
303
|
-
if (manager.connectedCount > 0) {
|
|
304
|
-
session.mcpManager = manager;
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
catch (err) {
|
|
308
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
309
|
-
process.stderr.write(`[SESSION] MCP initialization failed: ${msg}\n`);
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
/**
|
|
313
|
-
* Get a persistent MCP manager for inspect/health operations.
|
|
314
|
-
* Lazy-initialized on first call, reused across requests.
|
|
315
|
-
*/
|
|
316
|
-
async getInspectMcpManager() {
|
|
317
|
-
if (this.inspectMcpInitialized)
|
|
318
|
-
return this.inspectMcp;
|
|
319
|
-
this.inspectMcpInitialized = true;
|
|
320
|
-
if (!this.repo.mcpServers || Object.keys(this.repo.mcpServers).length === 0) {
|
|
321
|
-
return undefined;
|
|
322
|
-
}
|
|
323
|
-
const manager = new McpManager();
|
|
324
|
-
try {
|
|
325
|
-
await manager.startServers(this.repo.mcpServers);
|
|
326
|
-
this.inspectMcp = manager;
|
|
327
|
-
return manager;
|
|
328
|
-
}
|
|
329
|
-
catch (err) {
|
|
330
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
331
|
-
process.stderr.write(`[INSPECT] MCP initialization failed: ${msg}\n`);
|
|
332
|
-
// Still return the manager so we can report error status
|
|
333
|
-
this.inspectMcp = manager;
|
|
334
|
-
return manager;
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
getConnectionsMap() {
|
|
338
|
-
return buildConnectionsMap(this.repo.connections);
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
//# sourceMappingURL=session-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../../src/agent/session-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Amodal Labs, Inc.
|
|
4
|
-
* SPDX-License-Identifier: MIT
|
|
5
|
-
*/
|
|
6
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
7
|
-
import { AgentSessionManager } from './session-manager.js';
|
|
8
|
-
// Mock setupSession and friends
|
|
9
|
-
vi.mock('@amodalai/core', async (importOriginal) => {
|
|
10
|
-
const actual = await importOriginal();
|
|
11
|
-
return {
|
|
12
|
-
...actual,
|
|
13
|
-
setupSession: vi.fn(() => ({
|
|
14
|
-
repo: makeRepo(),
|
|
15
|
-
scrubTracker: {},
|
|
16
|
-
fieldScrubber: { scrub: vi.fn() },
|
|
17
|
-
outputGuard: { guard: vi.fn(() => ({ output: '', modified: false, blocked: false, findings: [] })) },
|
|
18
|
-
actionGate: { evaluate: vi.fn(() => ({ decision: 'allow', escalated: false, endpointPath: '' })) },
|
|
19
|
-
contextCompiler: {},
|
|
20
|
-
compiledContext: { systemPrompt: 'test', tokenUsage: { total: 100000, used: 500, remaining: 99500, sectionBreakdown: {} }, sections: [] },
|
|
21
|
-
exploreContext: { systemPrompt: 'explore', tokenUsage: { total: 100000, used: 300, remaining: 99700, sectionBreakdown: {} }, sections: [] },
|
|
22
|
-
outputPipeline: { process: vi.fn((t) => ({ output: t, modified: false, blocked: false, findings: [] })), createStreamProcessor: vi.fn() },
|
|
23
|
-
telemetry: { logScrub: vi.fn(), logGuard: vi.fn(), logGate: vi.fn(), logExplore: vi.fn() },
|
|
24
|
-
connectionsMap: {},
|
|
25
|
-
userRoles: [],
|
|
26
|
-
sessionId: 'test-session',
|
|
27
|
-
isDelegated: false,
|
|
28
|
-
})),
|
|
29
|
-
prepareExploreConfig: vi.fn(() => ({
|
|
30
|
-
systemPrompt: 'explore',
|
|
31
|
-
model: { provider: 'anthropic', model: 'test' },
|
|
32
|
-
connectionsMap: {},
|
|
33
|
-
readOnly: true,
|
|
34
|
-
maxTurns: 10,
|
|
35
|
-
maxDepth: 2,
|
|
36
|
-
})),
|
|
37
|
-
PlanModeManager: vi.fn(() => ({
|
|
38
|
-
isActive: vi.fn(() => false),
|
|
39
|
-
getApprovedPlan: vi.fn(() => null),
|
|
40
|
-
getReason: vi.fn(() => null),
|
|
41
|
-
enter: vi.fn(),
|
|
42
|
-
approve: vi.fn(),
|
|
43
|
-
exit: vi.fn(),
|
|
44
|
-
getPlanningReminder: vi.fn(() => null),
|
|
45
|
-
getApprovedPlanContext: vi.fn(() => null),
|
|
46
|
-
})),
|
|
47
|
-
extractRoles: vi.fn(() => []),
|
|
48
|
-
buildConnectionsMap: vi.fn(() => ({})),
|
|
49
|
-
};
|
|
50
|
-
});
|
|
51
|
-
function makeRepo() {
|
|
52
|
-
return {
|
|
53
|
-
source: 'local',
|
|
54
|
-
origin: '/test',
|
|
55
|
-
config: {
|
|
56
|
-
name: 'test',
|
|
57
|
-
version: '1.0.0',
|
|
58
|
-
models: {
|
|
59
|
-
main: { provider: 'anthropic', model: 'claude-sonnet-4-20250514' },
|
|
60
|
-
},
|
|
61
|
-
},
|
|
62
|
-
connections: new Map(),
|
|
63
|
-
skills: [],
|
|
64
|
-
agents: { subagents: [] },
|
|
65
|
-
automations: [],
|
|
66
|
-
knowledge: [],
|
|
67
|
-
evals: [],
|
|
68
|
-
tools: [],
|
|
69
|
-
stores: [],
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
describe('AgentSessionManager', () => {
|
|
73
|
-
let manager;
|
|
74
|
-
beforeEach(() => {
|
|
75
|
-
vi.useFakeTimers();
|
|
76
|
-
manager = new AgentSessionManager(makeRepo(), { ttlMs: 1000 });
|
|
77
|
-
});
|
|
78
|
-
afterEach(async () => {
|
|
79
|
-
await manager.shutdown();
|
|
80
|
-
vi.useRealTimers();
|
|
81
|
-
});
|
|
82
|
-
it('should create a session', async () => {
|
|
83
|
-
const session = await manager.create('tenant-1');
|
|
84
|
-
expect(session.id).toBeTruthy();
|
|
85
|
-
expect(session.appId).toBe('tenant-1');
|
|
86
|
-
expect(session.conversationHistory).toEqual([]);
|
|
87
|
-
expect(manager.size).toBe(1);
|
|
88
|
-
});
|
|
89
|
-
it('should get an existing session', async () => {
|
|
90
|
-
const session = await manager.create('tenant-1');
|
|
91
|
-
const found = manager.get(session.id);
|
|
92
|
-
expect(found).toBeDefined();
|
|
93
|
-
expect(found?.id).toBe(session.id);
|
|
94
|
-
});
|
|
95
|
-
it('should return undefined for unknown session', () => {
|
|
96
|
-
expect(manager.get('nonexistent')).toBeUndefined();
|
|
97
|
-
});
|
|
98
|
-
it('should destroy a session', async () => {
|
|
99
|
-
const session = await manager.create('tenant-1');
|
|
100
|
-
manager.destroy(session.id);
|
|
101
|
-
expect(manager.get(session.id)).toBeUndefined();
|
|
102
|
-
expect(manager.size).toBe(0);
|
|
103
|
-
});
|
|
104
|
-
it('should clean up expired sessions', async () => {
|
|
105
|
-
await manager.create('tenant-1');
|
|
106
|
-
expect(manager.size).toBe(1);
|
|
107
|
-
vi.advanceTimersByTime(1500);
|
|
108
|
-
const removed = manager.cleanup();
|
|
109
|
-
expect(removed).toBe(1);
|
|
110
|
-
expect(manager.size).toBe(0);
|
|
111
|
-
});
|
|
112
|
-
it('should not clean up active sessions', async () => {
|
|
113
|
-
const session = await manager.create('tenant-1');
|
|
114
|
-
vi.advanceTimersByTime(500);
|
|
115
|
-
// Access the session to update lastAccessedAt
|
|
116
|
-
manager.get(session.id);
|
|
117
|
-
vi.advanceTimersByTime(600);
|
|
118
|
-
const removed = manager.cleanup();
|
|
119
|
-
expect(removed).toBe(0);
|
|
120
|
-
expect(manager.size).toBe(1);
|
|
121
|
-
});
|
|
122
|
-
it('should update repo for new sessions', async () => {
|
|
123
|
-
const newRepo = makeRepo();
|
|
124
|
-
newRepo.config.name = 'updated';
|
|
125
|
-
manager.updateRepo(newRepo);
|
|
126
|
-
// The next created session should use the new repo
|
|
127
|
-
const session = await manager.create('tenant-1');
|
|
128
|
-
expect(session).toBeDefined();
|
|
129
|
-
});
|
|
130
|
-
it('should shutdown cleanly', async () => {
|
|
131
|
-
await manager.create('tenant-1');
|
|
132
|
-
await manager.create('tenant-2');
|
|
133
|
-
expect(manager.size).toBe(2);
|
|
134
|
-
await manager.shutdown();
|
|
135
|
-
expect(manager.size).toBe(0);
|
|
136
|
-
});
|
|
137
|
-
it('should update lastAccessedAt on get', async () => {
|
|
138
|
-
const session = await manager.create('tenant-1');
|
|
139
|
-
const initialAccess = session.lastAccessedAt;
|
|
140
|
-
vi.advanceTimersByTime(100);
|
|
141
|
-
manager.get(session.id);
|
|
142
|
-
expect(session.lastAccessedAt).toBeGreaterThan(initialAccess);
|
|
143
|
-
});
|
|
144
|
-
});
|
|
145
|
-
//# sourceMappingURL=session-manager.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-manager.test.js","sourceRoot":"","sources":["../../../src/agent/session-manager.test.ts"],"names":[],"mappings":"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"}
|