@amodalai/runtime 0.1.20 → 0.1.22

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 (46) hide show
  1. package/dist/src/agent/agent-runner.js +15 -5
  2. package/dist/src/agent/agent-runner.js.map +1 -1
  3. package/dist/src/agent/local-server.js +39 -35
  4. package/dist/src/agent/local-server.js.map +1 -1
  5. package/dist/src/agent/page-builder.d.ts +6 -0
  6. package/dist/src/agent/page-builder.js +37 -2
  7. package/dist/src/agent/page-builder.js.map +1 -1
  8. package/dist/src/agent/snapshot-server.js +2 -2
  9. package/dist/src/agent/snapshot-server.js.map +1 -1
  10. package/dist/src/agent/tool-context-builder.d.ts +1 -1
  11. package/dist/src/agent/tool-context-builder.js +18 -1
  12. package/dist/src/agent/tool-context-builder.js.map +1 -1
  13. package/dist/src/agent/tool-executor-local.js +20 -1
  14. package/dist/src/agent/tool-executor-local.js.map +1 -1
  15. package/dist/src/agent/tool-executor-local.test.js +1 -0
  16. package/dist/src/agent/tool-executor-local.test.js.map +1 -1
  17. package/dist/src/constants.d.ts +10 -0
  18. package/dist/src/constants.js +11 -0
  19. package/dist/src/constants.js.map +1 -0
  20. package/dist/src/index.d.ts +2 -2
  21. package/dist/src/index.js +1 -4
  22. package/dist/src/index.js.map +1 -1
  23. package/dist/src/server.d.ts +1 -3
  24. package/dist/src/server.js +0 -1
  25. package/dist/src/server.js.map +1 -1
  26. package/dist/src/session/custom-tool-adapter.js +18 -0
  27. package/dist/src/session/custom-tool-adapter.js.map +1 -1
  28. package/dist/src/session/session-manager.d.ts +7 -6
  29. package/dist/src/session/session-manager.js +84 -123
  30. package/dist/src/session/session-manager.js.map +1 -1
  31. package/dist/src/session/session-manager.test.js +10 -169
  32. package/dist/src/session/session-manager.test.js.map +1 -1
  33. package/dist/src/stores/pglite-store-backend.d.ts +10 -4
  34. package/dist/src/stores/pglite-store-backend.js +159 -111
  35. package/dist/src/stores/pglite-store-backend.js.map +1 -1
  36. package/dist/src/types.d.ts +8 -1
  37. package/dist/src/types.js +1 -0
  38. package/dist/src/types.js.map +1 -1
  39. package/dist/tsconfig.tsbuildinfo +1 -1
  40. package/package.json +2 -2
  41. package/dist/src/agent/routes/chat.d.ts +0 -35
  42. package/dist/src/agent/routes/chat.js +0 -88
  43. package/dist/src/agent/routes/chat.js.map +0 -1
  44. package/dist/src/agent/routes/chat.test.d.ts +0 -6
  45. package/dist/src/agent/routes/chat.test.js +0 -110
  46. package/dist/src/agent/routes/chat.test.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amodalai/runtime",
3
- "version": "0.1.20",
3
+ "version": "0.1.22",
4
4
  "description": "Agent Runtime Platform — HTTP server for repo and platform modes",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -26,7 +26,7 @@
26
26
  "node-cron": "^3.0.3",
27
27
  "zod": "^3.25.0",
28
28
  "express-rate-limit": "^7.5.0",
29
- "@amodalai/core": "0.1.20"
29
+ "@amodalai/core": "0.1.22"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@types/express": "^4.17.21",
@@ -1,35 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Amodal Labs, Inc.
4
- * SPDX-License-Identifier: MIT
5
- */
6
- import { Router } from 'express';
7
- import type { Request, Response } from 'express';
8
- import type { ManagedSession } from '../../session/session-manager.js';
9
- import type { SessionManager } from '../../session/session-manager.js';
10
- /**
11
- * Optional hook for customizing session creation.
12
- * When provided, called instead of sessionManager.create().
13
- * Receives the Express request and response (for auth context access).
14
- */
15
- export type SessionCreator = (req: Request, res: Response) => Promise<ManagedSession>;
16
- /**
17
- * Optional hook for hydrating a session from external storage.
18
- * Called when session_id is provided but not found in memory.
19
- */
20
- export type SessionHydrator = (req: Request, res: Response, sessionId: string) => Promise<ManagedSession | null>;
21
- /**
22
- * Optional hook called after each agent turn completes.
23
- * Used by hosted runtime to persist conversation history.
24
- */
25
- export type TurnCompleteHandler = (session: ManagedSession, req: Request, res: Response) => void;
26
- export interface ChatRouterOptions {
27
- sessionManager: SessionManager;
28
- /** Optional session creator hook — used by hosted runtime to inject app config from platform API */
29
- sessionCreator?: SessionCreator;
30
- /** Optional session hydrator — called when session_id not found in memory (e.g., load from platform API) */
31
- sessionHydrator?: SessionHydrator;
32
- /** Optional callback after each agent turn — used for persisting conversation history */
33
- onTurnComplete?: TurnCompleteHandler;
34
- }
35
- export declare function createChatRouter(options: ChatRouterOptions): Router;
@@ -1,88 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Amodal Labs, Inc.
4
- * SPDX-License-Identifier: MIT
5
- */
6
- import { Router } from 'express';
7
- import { AgentChatRequestSchema } from '../agent-types.js';
8
- import { streamMessage } from '../../session/session-runner.js';
9
- import { SSEEventType } from '../../types.js';
10
- export function createChatRouter(options) {
11
- const router = Router();
12
- router.post('/chat', async (req, res) => {
13
- const parsed = AgentChatRequestSchema.safeParse(req.body);
14
- if (!parsed.success) {
15
- res.status(400).json({
16
- error: {
17
- code: 'VALIDATION_ERROR',
18
- message: parsed.error.message,
19
- },
20
- });
21
- return;
22
- }
23
- const { message, session_id } = parsed.data;
24
- // SSE headers
25
- res.writeHead(200, {
26
- 'Content-Type': 'text/event-stream',
27
- 'Cache-Control': 'no-cache',
28
- 'Connection': 'keep-alive',
29
- });
30
- // Get or create session
31
- let session = session_id ? options.sessionManager.get(session_id) : undefined;
32
- // Try hydration if session not in memory
33
- if (!session && session_id && options.sessionHydrator) {
34
- try {
35
- session = await options.sessionHydrator(req, res, session_id) ?? undefined;
36
- }
37
- catch {
38
- // Hydration failed — fall through to create new session
39
- }
40
- }
41
- if (!session) {
42
- try {
43
- session = options.sessionCreator
44
- ? await options.sessionCreator(req, res)
45
- : await options.sessionManager.create();
46
- }
47
- catch (err) {
48
- const errMsg = err instanceof Error ? err.message : String(err);
49
- writeSSE(res, { type: SSEEventType.Error, message: errMsg, timestamp: ts() });
50
- writeSSE(res, { type: SSEEventType.Done, timestamp: ts() });
51
- res.end();
52
- return;
53
- }
54
- }
55
- // Send init event
56
- writeSSE(res, { type: SSEEventType.Init, session_id: session.id, timestamp: ts() });
57
- // Abort on client disconnect (use res, not req — req closes when body is consumed)
58
- const controller = new AbortController();
59
- res.on('close', () => controller.abort());
60
- try {
61
- for await (const event of streamMessage(session, message, controller.signal, undefined, options.sessionManager)) {
62
- if (controller.signal.aborted)
63
- break;
64
- writeSSE(res, event);
65
- }
66
- }
67
- catch (err) {
68
- if (!controller.signal.aborted) {
69
- const errMsg = err instanceof Error ? err.message : String(err);
70
- writeSSE(res, { type: SSEEventType.Error, message: errMsg, timestamp: ts() });
71
- writeSSE(res, { type: SSEEventType.Done, timestamp: ts() });
72
- }
73
- }
74
- // Notify after turn completes (e.g., persist history)
75
- if (options.onTurnComplete) {
76
- options.onTurnComplete(session, req, res);
77
- }
78
- res.end();
79
- });
80
- return router;
81
- }
82
- function writeSSE(res, event) {
83
- res.write(`data: ${JSON.stringify(event)}\n\n`);
84
- }
85
- function ts() {
86
- return new Date().toISOString();
87
- }
88
- //# sourceMappingURL=chat.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../../src/agent/routes/chat.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,110 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Amodal Labs, Inc.
4
- * SPDX-License-Identifier: MIT
5
- */
6
- import { describe, it, expect, vi, beforeEach } from 'vitest';
7
- import express from 'express';
8
- import request from 'supertest';
9
- import { createChatRouter } from './chat.js';
10
- // Mock session-runner
11
- vi.mock('../../session/session-runner.js', () => ({
12
- streamMessage: vi.fn(async function* () {
13
- yield { type: 'text_delta', content: 'Hello!', timestamp: new Date().toISOString() };
14
- yield { type: 'done', timestamp: new Date().toISOString() };
15
- }),
16
- }));
17
- function makeSessionManager() {
18
- const sessions = new Map();
19
- return {
20
- size: 0,
21
- create: vi.fn(async () => {
22
- const session = {
23
- id: 'session-1',
24
- runtime: { compiledContext: { systemPrompt: 'test' } },
25
- conversationHistory: [],
26
- createdAt: Date.now(),
27
- lastAccessedAt: Date.now(),
28
- planModeManager: {},
29
- exploreConfig: {},
30
- };
31
- sessions.set(session.id, session);
32
- return session;
33
- }),
34
- get: vi.fn((id) => sessions.get(id)),
35
- destroy: vi.fn(),
36
- cleanup: vi.fn(),
37
- updateBundle: vi.fn(),
38
- shutdown: vi.fn(),
39
- };
40
- }
41
- function createTestApp(sessionManager) {
42
- const app = express();
43
- app.use(express.json());
44
- app.use(createChatRouter({ sessionManager }));
45
- return app;
46
- }
47
- describe('repo-chat route', () => {
48
- let sessionManager;
49
- beforeEach(() => {
50
- sessionManager = makeSessionManager();
51
- });
52
- it('should reject invalid request body', async () => {
53
- const app = createTestApp(sessionManager);
54
- const res = await request(app).post('/chat').send({});
55
- expect(res.status).toBe(400);
56
- });
57
- it('should accept request without app_id', async () => {
58
- const app = createTestApp(sessionManager);
59
- const res = await request(app)
60
- .post('/chat')
61
- .send({ message: 'hello' })
62
- .set('Accept', 'text/event-stream');
63
- expect(res.status).toBe(200);
64
- });
65
- it('should return SSE events for valid request', async () => {
66
- const app = createTestApp(sessionManager);
67
- const res = await request(app)
68
- .post('/chat')
69
- .send({ message: 'hello' })
70
- .set('Accept', 'text/event-stream');
71
- expect(res.status).toBe(200);
72
- expect(res.headers['content-type']).toContain('text/event-stream');
73
- expect(res.text).toContain('data:');
74
- });
75
- it('should create a new session if no session_id', async () => {
76
- const app = createTestApp(sessionManager);
77
- await request(app)
78
- .post('/chat')
79
- .send({ message: 'hello' });
80
- expect(sessionManager.create).toHaveBeenCalled();
81
- });
82
- it('should reuse existing session if session_id provided', async () => {
83
- const app = createTestApp(sessionManager);
84
- // Create a session first
85
- await request(app)
86
- .post('/chat')
87
- .send({ message: 'hello' });
88
- // Reuse it
89
- await request(app)
90
- .post('/chat')
91
- .send({ message: 'follow up', session_id: 'session-1' });
92
- expect(sessionManager.get).toHaveBeenCalledWith('session-1');
93
- });
94
- it('should include init event in response', async () => {
95
- const app = createTestApp(sessionManager);
96
- const res = await request(app)
97
- .post('/chat')
98
- .send({ message: 'hello' });
99
- expect(res.text).toContain('"type":"init"');
100
- });
101
- it('should handle session creation failure', async () => {
102
- sessionManager.create.mockRejectedValue(new Error('Setup failed'));
103
- const app = createTestApp(sessionManager);
104
- const res = await request(app)
105
- .post('/chat')
106
- .send({ message: 'hello' });
107
- expect(res.text).toContain('"type":"error"');
108
- });
109
- });
110
- //# sourceMappingURL=chat.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"chat.test.js","sourceRoot":"","sources":["../../../../src/agent/routes/chat.test.ts"],"names":[],"mappings":"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"}