@amodalai/runtime 0.1.15 → 0.1.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/dist/src/agent/agent-runner.js +13 -1
  2. package/dist/src/agent/agent-runner.js.map +1 -1
  3. package/dist/src/agent/config-watcher.d.ts +2 -2
  4. package/dist/src/agent/config-watcher.js +28 -15
  5. package/dist/src/agent/config-watcher.js.map +1 -1
  6. package/dist/src/agent/config-watcher.test.js +13 -4
  7. package/dist/src/agent/config-watcher.test.js.map +1 -1
  8. package/dist/src/agent/eval-store.d.ts +14 -0
  9. package/dist/src/agent/eval-store.js +44 -0
  10. package/dist/src/agent/eval-store.js.map +1 -1
  11. package/dist/src/agent/feedback-store.d.ts +39 -0
  12. package/dist/src/agent/feedback-store.js +98 -0
  13. package/dist/src/agent/feedback-store.js.map +1 -0
  14. package/dist/src/agent/local-server.d.ts +1 -1
  15. package/dist/src/agent/local-server.js +48 -28
  16. package/dist/src/agent/local-server.js.map +1 -1
  17. package/dist/src/agent/local-server.test.js +2 -1
  18. package/dist/src/agent/local-server.test.js.map +1 -1
  19. package/dist/src/agent/proactive/proactive-runner.d.ts +3 -3
  20. package/dist/src/agent/proactive/proactive-runner.js +3 -3
  21. package/dist/src/agent/proactive/proactive-runner.js.map +1 -1
  22. package/dist/src/agent/proactive/proactive-runner.test.js +2 -2
  23. package/dist/src/agent/proactive/proactive-runner.test.js.map +1 -1
  24. package/dist/src/agent/routes/admin-chat.d.ts +3 -2
  25. package/dist/src/agent/routes/admin-chat.js +3 -3
  26. package/dist/src/agent/routes/admin-chat.js.map +1 -1
  27. package/dist/src/agent/routes/chat.d.ts +6 -6
  28. package/dist/src/agent/routes/chat.js +3 -3
  29. package/dist/src/agent/routes/chat.js.map +1 -1
  30. package/dist/src/agent/routes/chat.test.js +7 -6
  31. package/dist/src/agent/routes/chat.test.js.map +1 -1
  32. package/dist/src/agent/routes/evals.d.ts +2 -2
  33. package/dist/src/agent/routes/evals.js +143 -68
  34. package/dist/src/agent/routes/evals.js.map +1 -1
  35. package/dist/src/agent/routes/feedback.d.ts +11 -0
  36. package/dist/src/agent/routes/feedback.js +72 -0
  37. package/dist/src/agent/routes/feedback.js.map +1 -0
  38. package/dist/src/agent/routes/files.js +118 -12
  39. package/dist/src/agent/routes/files.js.map +1 -1
  40. package/dist/src/agent/routes/inspect.d.ts +2 -2
  41. package/dist/src/agent/routes/inspect.js +44 -22
  42. package/dist/src/agent/routes/inspect.js.map +1 -1
  43. package/dist/src/agent/routes/inspect.test.js +11 -16
  44. package/dist/src/agent/routes/inspect.test.js.map +1 -1
  45. package/dist/src/agent/routes/task.d.ts +2 -2
  46. package/dist/src/agent/routes/task.js +4 -4
  47. package/dist/src/agent/routes/task.js.map +1 -1
  48. package/dist/src/agent/routes/task.test.js.map +1 -1
  49. package/dist/src/agent/session-store.d.ts +2 -2
  50. package/dist/src/agent/session-store.js +9 -6
  51. package/dist/src/agent/session-store.js.map +1 -1
  52. package/dist/src/agent/snapshot-server.js +10 -2
  53. package/dist/src/agent/snapshot-server.js.map +1 -1
  54. package/dist/src/cron/heartbeat-runner.d.ts +3 -6
  55. package/dist/src/cron/heartbeat-runner.js +1 -10
  56. package/dist/src/cron/heartbeat-runner.js.map +1 -1
  57. package/dist/src/index.d.ts +5 -3
  58. package/dist/src/index.js +4 -9
  59. package/dist/src/index.js.map +1 -1
  60. package/dist/src/middleware/auth.d.ts +3 -19
  61. package/dist/src/middleware/auth.js +0 -118
  62. package/dist/src/middleware/auth.js.map +1 -1
  63. package/dist/src/routes/ai-stream.d.ts +8 -7
  64. package/dist/src/routes/ai-stream.js +3 -16
  65. package/dist/src/routes/ai-stream.js.map +1 -1
  66. package/dist/src/routes/chat-stream.d.ts +4 -3
  67. package/dist/src/routes/chat-stream.js +5 -17
  68. package/dist/src/routes/chat-stream.js.map +1 -1
  69. package/dist/src/routes/chat.d.ts +4 -2
  70. package/dist/src/routes/chat.js +2 -14
  71. package/dist/src/routes/chat.js.map +1 -1
  72. package/dist/src/routes/chat.test.js +2 -2
  73. package/dist/src/routes/chat.test.js.map +1 -1
  74. package/dist/src/server.d.ts +16 -3
  75. package/dist/src/server.js +24 -27
  76. package/dist/src/server.js.map +1 -1
  77. package/dist/src/server.test.js +37 -6
  78. package/dist/src/server.test.js.map +1 -1
  79. package/dist/src/session/admin-file-tools.d.ts +136 -0
  80. package/dist/src/session/admin-file-tools.js +240 -0
  81. package/dist/src/session/admin-file-tools.js.map +1 -0
  82. package/dist/src/session/custom-tool-adapter.d.ts +74 -0
  83. package/dist/src/session/custom-tool-adapter.js +149 -0
  84. package/dist/src/session/custom-tool-adapter.js.map +1 -0
  85. package/dist/src/session/session-manager.d.ts +101 -3
  86. package/dist/src/session/session-manager.js +467 -31
  87. package/dist/src/session/session-manager.js.map +1 -1
  88. package/dist/src/session/session-manager.test.js +93 -58
  89. package/dist/src/session/session-manager.test.js.map +1 -1
  90. package/dist/src/session/session-runner.d.ts +29 -13
  91. package/dist/src/session/session-runner.js +40 -91
  92. package/dist/src/session/session-runner.js.map +1 -1
  93. package/dist/src/session/session-runner.test.js +70 -80
  94. package/dist/src/session/session-runner.test.js.map +1 -1
  95. package/dist/src/types.d.ts +1 -0
  96. package/dist/tsconfig.tsbuildinfo +1 -1
  97. package/package.json +2 -2
  98. package/dist/src/agent/agent-runner.test.d.ts +0 -6
  99. package/dist/src/agent/agent-runner.test.js +0 -552
  100. package/dist/src/agent/agent-runner.test.js.map +0 -1
  101. package/dist/src/agent/session-manager.d.ts +0 -88
  102. package/dist/src/agent/session-manager.js +0 -341
  103. package/dist/src/agent/session-manager.js.map +0 -1
  104. package/dist/src/agent/session-manager.test.d.ts +0 -6
  105. package/dist/src/agent/session-manager.test.js +0 -145
  106. package/dist/src/agent/session-manager.test.js.map +0 -1
  107. package/dist/src/audit/audit-client.d.ts +0 -46
  108. package/dist/src/audit/audit-client.js +0 -83
  109. package/dist/src/audit/audit-client.js.map +0 -1
  110. package/dist/src/middleware/auth.test.d.ts +0 -6
  111. package/dist/src/middleware/auth.test.js +0 -260
  112. package/dist/src/middleware/auth.test.js.map +0 -1
  113. package/dist/src/routes/sessions.d.ts +0 -14
  114. package/dist/src/routes/sessions.js +0 -82
  115. package/dist/src/routes/sessions.js.map +0 -1
  116. package/dist/src/utils/jwt-verify.d.ts +0 -19
  117. package/dist/src/utils/jwt-verify.js +0 -32
  118. package/dist/src/utils/jwt-verify.js.map +0 -1
  119. package/dist/src/utils/jwt-verify.test.d.ts +0 -6
  120. package/dist/src/utils/jwt-verify.test.js +0 -150
  121. package/dist/src/utils/jwt-verify.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,6 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Amodal Labs, Inc.
4
- * SPDX-License-Identifier: MIT
5
- */
6
- export {};
@@ -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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"}
@@ -1,46 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Amodal Labs, Inc.
4
- * SPDX-License-Identifier: MIT
5
- */
6
- /**
7
- * Batching HTTP client that posts audit entries to the platform API.
8
- * Fire-and-forget — never blocks chat processing.
9
- */
10
- export interface AuditEntry {
11
- event: string;
12
- resource_name: string;
13
- author?: string;
14
- details?: Record<string, unknown>;
15
- timestamp?: string;
16
- }
17
- export interface AuditClientOptions {
18
- /** Platform API base URL */
19
- platformApiUrl: string;
20
- /** Flush interval in ms (default 2000) */
21
- flushIntervalMs?: number;
22
- /** Max batch size before auto-flush (default 20) */
23
- maxBatchSize?: number;
24
- }
25
- export declare class AuditClient {
26
- private readonly platformApiUrl;
27
- private readonly flushIntervalMs;
28
- private readonly maxBatchSize;
29
- private readonly pending;
30
- private flushTimer;
31
- constructor(options: AuditClientOptions);
32
- /**
33
- * Queue an audit entry for batched delivery.
34
- * Fire-and-forget — never throws.
35
- */
36
- log(appId: string, token: string, entry: AuditEntry): void;
37
- /**
38
- * Flush all pending batches immediately.
39
- */
40
- flush(): Promise<void>;
41
- /**
42
- * Stop the flush timer and drain remaining entries.
43
- */
44
- shutdown(): Promise<void>;
45
- private send;
46
- }