@amodalai/runtime 0.1.16 → 0.1.18
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-types.d.ts +0 -6
- package/dist/src/agent/agent-types.js +0 -2
- package/dist/src/agent/agent-types.js.map +1 -1
- package/dist/src/agent/agent-types.test.js +0 -11
- package/dist/src/agent/agent-types.test.js.map +1 -1
- package/dist/src/agent/feedback-store.d.ts +39 -0
- package/dist/src/agent/feedback-store.js +98 -0
- package/dist/src/agent/feedback-store.js.map +1 -0
- package/dist/src/agent/local-server.js +21 -5
- package/dist/src/agent/local-server.js.map +1 -1
- package/dist/src/agent/routes/admin-chat.d.ts +1 -0
- package/dist/src/agent/routes/admin-chat.js +1 -1
- package/dist/src/agent/routes/admin-chat.js.map +1 -1
- package/dist/src/agent/routes/chat.d.ts +2 -2
- package/dist/src/agent/routes/chat.js +4 -4
- package/dist/src/agent/routes/chat.js.map +1 -1
- package/dist/src/agent/routes/chat.test.js +14 -20
- package/dist/src/agent/routes/chat.test.js.map +1 -1
- package/dist/src/agent/routes/evals.js +34 -47
- package/dist/src/agent/routes/evals.js.map +1 -1
- package/dist/src/agent/routes/feedback.d.ts +11 -0
- package/dist/src/agent/routes/feedback.js +72 -0
- package/dist/src/agent/routes/feedback.js.map +1 -0
- package/dist/src/agent/routes/files.js +118 -12
- package/dist/src/agent/routes/files.js.map +1 -1
- package/dist/src/agent/routes/inspect.js +33 -0
- package/dist/src/agent/routes/inspect.js.map +1 -1
- package/dist/src/agent/routes/task.js +2 -4
- package/dist/src/agent/routes/task.js.map +1 -1
- package/dist/src/cron/heartbeat-runner.d.ts +3 -6
- package/dist/src/cron/heartbeat-runner.js +1 -10
- package/dist/src/cron/heartbeat-runner.js.map +1 -1
- package/dist/src/index.d.ts +4 -5
- package/dist/src/index.js +3 -10
- package/dist/src/index.js.map +1 -1
- package/dist/src/middleware/auth.d.ts +3 -19
- package/dist/src/middleware/auth.js +0 -118
- package/dist/src/middleware/auth.js.map +1 -1
- package/dist/src/routes/ai-stream.d.ts +8 -7
- package/dist/src/routes/ai-stream.js +3 -16
- package/dist/src/routes/ai-stream.js.map +1 -1
- package/dist/src/routes/chat-stream.d.ts +4 -3
- package/dist/src/routes/chat-stream.js +3 -16
- package/dist/src/routes/chat-stream.js.map +1 -1
- package/dist/src/routes/chat.d.ts +4 -2
- package/dist/src/routes/chat.js +2 -14
- package/dist/src/routes/chat.js.map +1 -1
- package/dist/src/routes/chat.test.js +2 -2
- package/dist/src/routes/chat.test.js.map +1 -1
- package/dist/src/server.d.ts +16 -3
- package/dist/src/server.js +24 -25
- package/dist/src/server.js.map +1 -1
- package/dist/src/session/admin-file-tools.d.ts +136 -0
- package/dist/src/session/admin-file-tools.js +240 -0
- package/dist/src/session/admin-file-tools.js.map +1 -0
- package/dist/src/session/session-manager.d.ts +37 -3
- package/dist/src/session/session-manager.js +174 -44
- package/dist/src/session/session-manager.js.map +1 -1
- package/dist/src/session/session-manager.test.js +30 -52
- package/dist/src/session/session-manager.test.js.map +1 -1
- package/dist/src/session/session-runner.d.ts +29 -13
- package/dist/src/session/session-runner.js +28 -91
- package/dist/src/session/session-runner.js.map +1 -1
- package/dist/src/session/session-runner.test.js +70 -80
- package/dist/src/session/session-runner.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/dist/src/audit/audit-client.d.ts +0 -46
- package/dist/src/audit/audit-client.js +0 -83
- package/dist/src/audit/audit-client.js.map +0 -1
- package/dist/src/middleware/auth.test.d.ts +0 -6
- package/dist/src/middleware/auth.test.js +0 -260
- package/dist/src/middleware/auth.test.js.map +0 -1
- package/dist/src/routes/sessions.d.ts +0 -14
- package/dist/src/routes/sessions.js +0 -82
- package/dist/src/routes/sessions.js.map +0 -1
- package/dist/src/utils/jwt-verify.d.ts +0 -19
- package/dist/src/utils/jwt-verify.js +0 -32
- package/dist/src/utils/jwt-verify.js.map +0 -1
- package/dist/src/utils/jwt-verify.test.d.ts +0 -6
- package/dist/src/utils/jwt-verify.test.js +0 -150
- package/dist/src/utils/jwt-verify.test.js.map +0 -1
|
@@ -4,10 +4,12 @@
|
|
|
4
4
|
* SPDX-License-Identifier: MIT
|
|
5
5
|
*/
|
|
6
6
|
import { Router } from 'express';
|
|
7
|
+
import type { AuthContext } from '../middleware/auth.js';
|
|
7
8
|
import type { SessionManager } from '../session/session-manager.js';
|
|
8
|
-
import type
|
|
9
|
+
import { type StreamHooks } from '../session/session-runner.js';
|
|
9
10
|
export interface ChatRouterOptions {
|
|
10
11
|
sessionManager: SessionManager;
|
|
11
|
-
|
|
12
|
+
/** Factory that builds per-request stream hooks from the auth context */
|
|
13
|
+
createStreamHooks?: (auth?: AuthContext) => StreamHooks;
|
|
12
14
|
}
|
|
13
15
|
export declare function createChatRouter(options: ChatRouterOptions): Router;
|
package/dist/src/routes/chat.js
CHANGED
|
@@ -29,20 +29,8 @@ export function createChatRouter(options) {
|
|
|
29
29
|
const controller = new AbortController();
|
|
30
30
|
// Abort on client disconnect
|
|
31
31
|
res.on('close', () => controller.abort());
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
if (options.auditClient) {
|
|
35
|
-
const auth = getAuthContext(res);
|
|
36
|
-
if (auth?.token && auth.applicationId) {
|
|
37
|
-
audit = {
|
|
38
|
-
auditClient: options.auditClient,
|
|
39
|
-
appId: auth.applicationId,
|
|
40
|
-
token: auth.token,
|
|
41
|
-
orgId: auth.orgId,
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
const result = await runMessage(session, message, controller.signal, audit);
|
|
32
|
+
const hooks = options.createStreamHooks?.(getAuthContext(res));
|
|
33
|
+
const result = await runMessage(session, message, controller.signal, hooks);
|
|
46
34
|
res.json(result);
|
|
47
35
|
}
|
|
48
36
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/routes/chat.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/routes/chat.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,OAAO,EAAE,UAAU,EAAoB,MAAM,8BAA8B,CAAC;AAQ5E,MAAM,UAAU,gBAAgB,CAAC,OAA0B;IACzD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IAExB,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACzE,IAAI,CAAC;YACH,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;YAE1D,wBAAwB;YACxB,IAAI,OAAO,CAAC;YACZ,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBACjD,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,MAAM,IAAI,QAAQ,CAAC,GAAG,EAAE,mBAAmB,EAAE,WAAW,UAAU,YAAY,CAAC,CAAC;gBAClF,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;gBACjC,OAAO,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;YAC7F,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YAEzC,6BAA6B;YAC7B,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;YAE1C,MAAM,KAAK,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC5E,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -13,10 +13,10 @@ const mockRunMessage = vi.fn();
|
|
|
13
13
|
vi.mock('../session/session-runner.js', () => ({
|
|
14
14
|
runMessage: (...args) => mockRunMessage(...args),
|
|
15
15
|
}));
|
|
16
|
-
function createApp(sessionManager
|
|
16
|
+
function createApp(sessionManager) {
|
|
17
17
|
const app = express();
|
|
18
18
|
app.use(express.json());
|
|
19
|
-
app.use(createChatRouter({ sessionManager: sessionManager
|
|
19
|
+
app.use(createChatRouter({ sessionManager: sessionManager }));
|
|
20
20
|
app.use(errorHandler);
|
|
21
21
|
return app;
|
|
22
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.test.js","sourceRoot":"","sources":["../../../src/routes/chat.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,OAAO,MAAM,WAAW,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAE9D,sBAAsB;AACtB,MAAM,cAAc,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAC/B,EAAE,CAAC,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7C,UAAU,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;CAC5D,CAAC,CAAC,CAAC;AAEJ,SAAS,SAAS,CAAC,cAAuC
|
|
1
|
+
{"version":3,"file":"chat.test.js","sourceRoot":"","sources":["../../../src/routes/chat.test.ts"],"names":[],"mappings":"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"}
|
package/dist/src/server.d.ts
CHANGED
|
@@ -7,6 +7,9 @@ import express from 'express';
|
|
|
7
7
|
import type { Express } from 'express';
|
|
8
8
|
import type http from 'node:http';
|
|
9
9
|
import type { ConfigParameters } from '@amodalai/core';
|
|
10
|
+
import type { StreamHooks } from './session/session-runner.js';
|
|
11
|
+
import type { AuthContext } from './middleware/auth.js';
|
|
12
|
+
import type { SessionStore } from './session/session-manager.js';
|
|
10
13
|
import type { ServerConfig } from './types.js';
|
|
11
14
|
export interface ServerInstance {
|
|
12
15
|
app: Express;
|
|
@@ -20,12 +23,22 @@ export interface CreateServerOptions {
|
|
|
20
23
|
config: ServerConfig;
|
|
21
24
|
/** Version string for /version endpoint */
|
|
22
25
|
version?: string;
|
|
23
|
-
/** Platform API URL
|
|
26
|
+
/** Platform API URL (used by SessionManager for AgentSDK config loading) */
|
|
24
27
|
platformApiUrl?: string;
|
|
25
|
-
/**
|
|
26
|
-
|
|
28
|
+
/** Middleware to mount before all routes (e.g., request enrichment) */
|
|
29
|
+
preMiddleware?: express.RequestHandler;
|
|
27
30
|
/** Middleware to mount before the error handler (e.g., static file serving) */
|
|
28
31
|
fallbackMiddleware?: express.RequestHandler;
|
|
32
|
+
/** Auth middleware for protected routes (injected by hosting layer) */
|
|
33
|
+
authMiddleware?: express.RequestHandler;
|
|
34
|
+
/** Additional routers to mount (e.g., session history proxy) */
|
|
35
|
+
additionalRouters?: express.Router[];
|
|
36
|
+
/** Factory that builds per-request stream hooks from the auth context */
|
|
37
|
+
createStreamHooks?: (auth?: AuthContext) => StreamHooks;
|
|
38
|
+
/** Pluggable session store for hydrating sessions (e.g., platform API, local DB) */
|
|
39
|
+
sessionStore?: SessionStore;
|
|
40
|
+
/** Shutdown callback for hosting layer cleanup (e.g., drain audit batches) */
|
|
41
|
+
onShutdown?: () => Promise<void>;
|
|
29
42
|
}
|
|
30
43
|
/**
|
|
31
44
|
* Create the Express server with all routes, session management,
|
package/dist/src/server.js
CHANGED
|
@@ -5,18 +5,15 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import express from 'express';
|
|
7
7
|
import { errorHandler } from './middleware/error-handler.js';
|
|
8
|
-
import { createAuthMiddleware } from './middleware/auth.js';
|
|
9
8
|
import { createHealthRouter } from './routes/health.js';
|
|
10
9
|
import { createChatStreamRouter } from './routes/chat-stream.js';
|
|
11
10
|
import { createWebhookRouter } from './routes/webhooks.js';
|
|
12
11
|
import { createWidgetActionsRouter } from './routes/widget-actions.js';
|
|
13
12
|
import { createAskUserResponseRouter } from './routes/ask-user-response.js';
|
|
14
|
-
import { createSessionsRouter } from './routes/sessions.js';
|
|
15
13
|
import { createAIStreamRouter } from './routes/ai-stream.js';
|
|
16
14
|
import { SessionManager } from './session/session-manager.js';
|
|
17
15
|
import { createAutomationRunner } from './cron/heartbeat-runner.js';
|
|
18
16
|
import { AutomationScheduler } from './cron/heartbeat-scheduler.js';
|
|
19
|
-
import { AuditClient } from './audit/audit-client.js';
|
|
20
17
|
/**
|
|
21
18
|
* Create the Express server with all routes, session management,
|
|
22
19
|
* automation scheduling, and graceful shutdown.
|
|
@@ -29,13 +26,13 @@ export function createServer(options) {
|
|
|
29
26
|
baseParams,
|
|
30
27
|
ttlMs: config.sessionTtlMs,
|
|
31
28
|
platformApiUrl: options.platformApiUrl,
|
|
29
|
+
sessionStore: options.sessionStore,
|
|
32
30
|
});
|
|
33
|
-
// --- Audit client (batching HTTP poster to platform API) ---
|
|
34
|
-
const auditClient = options.platformApiUrl
|
|
35
|
-
? new AuditClient({ platformApiUrl: options.platformApiUrl })
|
|
36
|
-
: undefined;
|
|
37
31
|
// --- Automation runner ---
|
|
38
|
-
const runAutomation = createAutomationRunner({
|
|
32
|
+
const runAutomation = createAutomationRunner({
|
|
33
|
+
sessionManager,
|
|
34
|
+
streamHooks: options.createStreamHooks?.(),
|
|
35
|
+
});
|
|
39
36
|
// --- Automation scheduler (cron) ---
|
|
40
37
|
const automationScheduler = new AutomationScheduler();
|
|
41
38
|
// --- Express app ---
|
|
@@ -54,29 +51,31 @@ export function createServer(options) {
|
|
|
54
51
|
next();
|
|
55
52
|
});
|
|
56
53
|
app.use(express.json());
|
|
54
|
+
// Pre-route middleware (e.g., request enrichment in hosted mode)
|
|
55
|
+
if (options.preMiddleware) {
|
|
56
|
+
app.use(options.preMiddleware);
|
|
57
|
+
}
|
|
57
58
|
// Routes
|
|
58
59
|
app.use(createHealthRouter({
|
|
59
60
|
sessionManager,
|
|
60
61
|
version: options.version,
|
|
61
62
|
startedAt,
|
|
62
63
|
}));
|
|
63
|
-
// Auth middleware for
|
|
64
|
-
if (options.
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
});
|
|
69
|
-
app.use('/chat', authMiddleware);
|
|
70
|
-
app.use('/chat/stream', authMiddleware);
|
|
71
|
-
app.use('/sessions', authMiddleware);
|
|
64
|
+
// Auth middleware for protected routes (injected by hosting layer)
|
|
65
|
+
if (options.authMiddleware) {
|
|
66
|
+
app.use('/chat', options.authMiddleware);
|
|
67
|
+
app.use('/chat/stream', options.authMiddleware);
|
|
68
|
+
app.use('/sessions', options.authMiddleware);
|
|
72
69
|
}
|
|
73
|
-
app.use(createChatStreamRouter({ sessionManager,
|
|
74
|
-
app.use(createAIStreamRouter({ sessionManager,
|
|
70
|
+
app.use(createChatStreamRouter({ sessionManager, createStreamHooks: options.createStreamHooks }));
|
|
71
|
+
app.use(createAIStreamRouter({ sessionManager, createStreamHooks: options.createStreamHooks }));
|
|
75
72
|
app.use(createWidgetActionsRouter({ sessionManager }));
|
|
76
73
|
app.use(createAskUserResponseRouter({ sessionManager }));
|
|
77
|
-
//
|
|
78
|
-
if (options.
|
|
79
|
-
|
|
74
|
+
// Additional routers (e.g., session history proxy from hosting layer)
|
|
75
|
+
if (options.additionalRouters) {
|
|
76
|
+
for (const router of options.additionalRouters) {
|
|
77
|
+
app.use(router);
|
|
78
|
+
}
|
|
80
79
|
}
|
|
81
80
|
app.use(createWebhookRouter({
|
|
82
81
|
automations: config.automations,
|
|
@@ -118,9 +117,9 @@ export function createServer(options) {
|
|
|
118
117
|
});
|
|
119
118
|
server = null;
|
|
120
119
|
}
|
|
121
|
-
//
|
|
122
|
-
if (
|
|
123
|
-
await
|
|
120
|
+
// Hosting layer cleanup (e.g., drain audit batches)
|
|
121
|
+
if (options.onShutdown) {
|
|
122
|
+
await options.onShutdown();
|
|
124
123
|
}
|
|
125
124
|
// Drain sessions
|
|
126
125
|
await sessionManager.shutdown();
|
package/dist/src/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,OAAO,MAAM,SAAS,CAAC;AAI9B,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
/** @internal Exported for testing */
|
|
7
|
+
export declare function isAllowedRepoPath(relPath: string): boolean;
|
|
8
|
+
interface ToolResult {
|
|
9
|
+
llmContent: string;
|
|
10
|
+
returnDisplay?: string;
|
|
11
|
+
error?: {
|
|
12
|
+
message: string;
|
|
13
|
+
type: string;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export declare function createReadRepoFileTool(repoRoot: string): {
|
|
17
|
+
name: string;
|
|
18
|
+
displayName: string;
|
|
19
|
+
description: string;
|
|
20
|
+
kind: "declarative";
|
|
21
|
+
parameterSchema: Record<string, unknown>;
|
|
22
|
+
readonly isReadOnly: boolean;
|
|
23
|
+
readonly toolAnnotations: undefined;
|
|
24
|
+
readonly schema: {
|
|
25
|
+
name: string;
|
|
26
|
+
description: string;
|
|
27
|
+
parametersJsonSchema: Record<string, unknown>;
|
|
28
|
+
};
|
|
29
|
+
getSchema(): {
|
|
30
|
+
name: string;
|
|
31
|
+
description: string;
|
|
32
|
+
parametersJsonSchema: Record<string, unknown>;
|
|
33
|
+
};
|
|
34
|
+
build(params: Record<string, unknown>): {
|
|
35
|
+
name: string;
|
|
36
|
+
params: Record<string, unknown>;
|
|
37
|
+
execute: () => Promise<ToolResult>;
|
|
38
|
+
};
|
|
39
|
+
silentBuild(params: Record<string, unknown>): {
|
|
40
|
+
name: string;
|
|
41
|
+
params: Record<string, unknown>;
|
|
42
|
+
execute: () => Promise<ToolResult>;
|
|
43
|
+
};
|
|
44
|
+
validateBuildAndExecute(params: Record<string, unknown>): Promise<ToolResult>;
|
|
45
|
+
};
|
|
46
|
+
export declare function createWriteRepoFileTool(repoRoot: string): {
|
|
47
|
+
name: string;
|
|
48
|
+
displayName: string;
|
|
49
|
+
description: string;
|
|
50
|
+
kind: "declarative";
|
|
51
|
+
parameterSchema: Record<string, unknown>;
|
|
52
|
+
readonly isReadOnly: boolean;
|
|
53
|
+
readonly toolAnnotations: undefined;
|
|
54
|
+
readonly schema: {
|
|
55
|
+
name: string;
|
|
56
|
+
description: string;
|
|
57
|
+
parametersJsonSchema: Record<string, unknown>;
|
|
58
|
+
};
|
|
59
|
+
getSchema(): {
|
|
60
|
+
name: string;
|
|
61
|
+
description: string;
|
|
62
|
+
parametersJsonSchema: Record<string, unknown>;
|
|
63
|
+
};
|
|
64
|
+
build(params: Record<string, unknown>): {
|
|
65
|
+
name: string;
|
|
66
|
+
params: Record<string, unknown>;
|
|
67
|
+
execute: () => Promise<ToolResult>;
|
|
68
|
+
};
|
|
69
|
+
silentBuild(params: Record<string, unknown>): {
|
|
70
|
+
name: string;
|
|
71
|
+
params: Record<string, unknown>;
|
|
72
|
+
execute: () => Promise<ToolResult>;
|
|
73
|
+
};
|
|
74
|
+
validateBuildAndExecute(params: Record<string, unknown>): Promise<ToolResult>;
|
|
75
|
+
};
|
|
76
|
+
export declare function createDeleteRepoFileTool(repoRoot: string): {
|
|
77
|
+
name: string;
|
|
78
|
+
displayName: string;
|
|
79
|
+
description: string;
|
|
80
|
+
kind: "declarative";
|
|
81
|
+
parameterSchema: Record<string, unknown>;
|
|
82
|
+
readonly isReadOnly: boolean;
|
|
83
|
+
readonly toolAnnotations: undefined;
|
|
84
|
+
readonly schema: {
|
|
85
|
+
name: string;
|
|
86
|
+
description: string;
|
|
87
|
+
parametersJsonSchema: Record<string, unknown>;
|
|
88
|
+
};
|
|
89
|
+
getSchema(): {
|
|
90
|
+
name: string;
|
|
91
|
+
description: string;
|
|
92
|
+
parametersJsonSchema: Record<string, unknown>;
|
|
93
|
+
};
|
|
94
|
+
build(params: Record<string, unknown>): {
|
|
95
|
+
name: string;
|
|
96
|
+
params: Record<string, unknown>;
|
|
97
|
+
execute: () => Promise<ToolResult>;
|
|
98
|
+
};
|
|
99
|
+
silentBuild(params: Record<string, unknown>): {
|
|
100
|
+
name: string;
|
|
101
|
+
params: Record<string, unknown>;
|
|
102
|
+
execute: () => Promise<ToolResult>;
|
|
103
|
+
};
|
|
104
|
+
validateBuildAndExecute(params: Record<string, unknown>): Promise<ToolResult>;
|
|
105
|
+
};
|
|
106
|
+
export declare function createInternalApiTool(getPort: () => number | null): {
|
|
107
|
+
name: string;
|
|
108
|
+
displayName: string;
|
|
109
|
+
description: string;
|
|
110
|
+
kind: "declarative";
|
|
111
|
+
parameterSchema: Record<string, unknown>;
|
|
112
|
+
readonly isReadOnly: boolean;
|
|
113
|
+
readonly toolAnnotations: undefined;
|
|
114
|
+
readonly schema: {
|
|
115
|
+
name: string;
|
|
116
|
+
description: string;
|
|
117
|
+
parametersJsonSchema: Record<string, unknown>;
|
|
118
|
+
};
|
|
119
|
+
getSchema(): {
|
|
120
|
+
name: string;
|
|
121
|
+
description: string;
|
|
122
|
+
parametersJsonSchema: Record<string, unknown>;
|
|
123
|
+
};
|
|
124
|
+
build(params: Record<string, unknown>): {
|
|
125
|
+
name: string;
|
|
126
|
+
params: Record<string, unknown>;
|
|
127
|
+
execute: () => Promise<ToolResult>;
|
|
128
|
+
};
|
|
129
|
+
silentBuild(params: Record<string, unknown>): {
|
|
130
|
+
name: string;
|
|
131
|
+
params: Record<string, unknown>;
|
|
132
|
+
execute: () => Promise<ToolResult>;
|
|
133
|
+
};
|
|
134
|
+
validateBuildAndExecute(params: Record<string, unknown>): Promise<ToolResult>;
|
|
135
|
+
};
|
|
136
|
+
export {};
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Admin-only file tools for reading, writing, and deleting agent config files.
|
|
8
|
+
* These tools are registered on admin sessions only, and only for local repos.
|
|
9
|
+
*
|
|
10
|
+
* Ported from the old agent-runner.ts admin tool implementation.
|
|
11
|
+
*/
|
|
12
|
+
import { readFile, writeFile, unlink, mkdir } from 'node:fs/promises';
|
|
13
|
+
import * as path from 'node:path';
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Path validation
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
const ALLOWED_REPO_DIRS = [
|
|
18
|
+
'skills/',
|
|
19
|
+
'knowledge/',
|
|
20
|
+
'connections/',
|
|
21
|
+
'stores/',
|
|
22
|
+
'pages/',
|
|
23
|
+
'automations/',
|
|
24
|
+
'evals/',
|
|
25
|
+
'agents/',
|
|
26
|
+
'tools/',
|
|
27
|
+
'amodal_packages/', // installed packages (read-only)
|
|
28
|
+
];
|
|
29
|
+
const BLOCKED_FILENAMES = [
|
|
30
|
+
'.env',
|
|
31
|
+
'amodal.json',
|
|
32
|
+
'package.json',
|
|
33
|
+
'pnpm-lock.yaml',
|
|
34
|
+
'tsconfig.json',
|
|
35
|
+
];
|
|
36
|
+
const READ_ONLY_DIRS = [
|
|
37
|
+
'amodal_packages/',
|
|
38
|
+
];
|
|
39
|
+
/** @internal Exported for testing */
|
|
40
|
+
export function isAllowedRepoPath(relPath) {
|
|
41
|
+
const basename = path.basename(relPath);
|
|
42
|
+
if (BLOCKED_FILENAMES.includes(basename))
|
|
43
|
+
return false;
|
|
44
|
+
return ALLOWED_REPO_DIRS.some((dir) => relPath.startsWith(dir));
|
|
45
|
+
}
|
|
46
|
+
function isReadOnlyPath(relPath) {
|
|
47
|
+
return READ_ONLY_DIRS.some((dir) => relPath.startsWith(dir));
|
|
48
|
+
}
|
|
49
|
+
function validatePath(repoRoot, rawPath) {
|
|
50
|
+
if (!rawPath || rawPath.startsWith('/')) {
|
|
51
|
+
return { error: 'Path must be relative to the repo root (no leading /)' };
|
|
52
|
+
}
|
|
53
|
+
if (rawPath.includes('..')) {
|
|
54
|
+
return { error: 'Path traversal (..) is not allowed' };
|
|
55
|
+
}
|
|
56
|
+
const normalized = path.normalize(rawPath);
|
|
57
|
+
if (!isAllowedRepoPath(normalized)) {
|
|
58
|
+
return { error: `Path "${normalized}" is not in an allowed directory. Allowed: ${ALLOWED_REPO_DIRS.join(', ')}. Blocked files: ${BLOCKED_FILENAMES.join(', ')}` };
|
|
59
|
+
}
|
|
60
|
+
const resolved = path.resolve(repoRoot, normalized);
|
|
61
|
+
if (!resolved.startsWith(repoRoot)) {
|
|
62
|
+
return { error: 'Resolved path escapes the repo directory' };
|
|
63
|
+
}
|
|
64
|
+
return { resolved, relative: normalized };
|
|
65
|
+
}
|
|
66
|
+
// ---------------------------------------------------------------------------
|
|
67
|
+
// Base adapter matching upstream DeclarativeTool interface
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
function createToolAdapter(opts) {
|
|
70
|
+
return {
|
|
71
|
+
name: opts.name,
|
|
72
|
+
displayName: opts.name,
|
|
73
|
+
description: opts.description,
|
|
74
|
+
kind: 'declarative',
|
|
75
|
+
parameterSchema: opts.parameters,
|
|
76
|
+
get isReadOnly() { return opts.name === 'read_repo_file'; },
|
|
77
|
+
get toolAnnotations() { return undefined; },
|
|
78
|
+
get schema() { return this.getSchema(); },
|
|
79
|
+
getSchema() {
|
|
80
|
+
return {
|
|
81
|
+
name: opts.name,
|
|
82
|
+
description: opts.description,
|
|
83
|
+
parametersJsonSchema: opts.parameters,
|
|
84
|
+
};
|
|
85
|
+
},
|
|
86
|
+
build(params) {
|
|
87
|
+
return {
|
|
88
|
+
name: opts.name,
|
|
89
|
+
params,
|
|
90
|
+
execute: async () => opts.execute(params),
|
|
91
|
+
};
|
|
92
|
+
},
|
|
93
|
+
silentBuild(params) {
|
|
94
|
+
return this.build(params);
|
|
95
|
+
},
|
|
96
|
+
async validateBuildAndExecute(params) {
|
|
97
|
+
return opts.execute(params);
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
// ---------------------------------------------------------------------------
|
|
102
|
+
// Tool factories
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
export function createReadRepoFileTool(repoRoot) {
|
|
105
|
+
return createToolAdapter({
|
|
106
|
+
name: 'read_repo_file',
|
|
107
|
+
description: 'Read a file from the agent repo. Path is relative to repo root. Allowed directories: skills/, knowledge/, connections/, stores/, pages/, automations/, evals/, agents/, tools/.',
|
|
108
|
+
parameters: {
|
|
109
|
+
type: 'object',
|
|
110
|
+
properties: {
|
|
111
|
+
path: { type: 'string', description: 'File path relative to repo root (e.g. "knowledge/formatting-rules.md")' },
|
|
112
|
+
},
|
|
113
|
+
required: ['path'],
|
|
114
|
+
},
|
|
115
|
+
async execute(params) {
|
|
116
|
+
const rawPath = String(params['path'] ?? '');
|
|
117
|
+
const validation = validatePath(repoRoot, rawPath);
|
|
118
|
+
if ('error' in validation) {
|
|
119
|
+
return { llmContent: `Error: ${validation.error}`, error: { message: validation.error, type: 'VALIDATION_ERROR' } };
|
|
120
|
+
}
|
|
121
|
+
try {
|
|
122
|
+
const content = await readFile(validation.resolved, 'utf-8');
|
|
123
|
+
return { llmContent: content, returnDisplay: `Read ${validation.relative}` };
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
const isNotFound = err instanceof Error && 'code' in err && (err.code) === 'ENOENT'; // eslint-disable-line @typescript-eslint/no-unsafe-type-assertion -- checking errno;
|
|
127
|
+
const msg = isNotFound ? `File not found: ${validation.relative}` : (err instanceof Error ? err.message : String(err));
|
|
128
|
+
return { llmContent: `Error: ${msg}`, error: { message: msg, type: 'EXECUTION_FAILED' } };
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
export function createWriteRepoFileTool(repoRoot) {
|
|
134
|
+
return createToolAdapter({
|
|
135
|
+
name: 'write_repo_file',
|
|
136
|
+
description: 'Create or update a file in the agent repo. Use this to add skills, knowledge, pages, automations, tools, store schemas, evals, connection docs, or agent overrides. Path is relative to repo root. Allowed directories: skills/, knowledge/, connections/, stores/, pages/, automations/, evals/, agents/, tools/.',
|
|
137
|
+
parameters: {
|
|
138
|
+
type: 'object',
|
|
139
|
+
properties: {
|
|
140
|
+
path: { type: 'string', description: 'File path relative to repo root (e.g. "knowledge/formatting-rules.md")' },
|
|
141
|
+
content: { type: 'string', description: 'Full file content to write' },
|
|
142
|
+
},
|
|
143
|
+
required: ['path', 'content'],
|
|
144
|
+
},
|
|
145
|
+
async execute(params) {
|
|
146
|
+
const rawPath = String(params['path'] ?? '');
|
|
147
|
+
const content = String(params['content'] ?? '');
|
|
148
|
+
const validation = validatePath(repoRoot, rawPath);
|
|
149
|
+
if ('error' in validation) {
|
|
150
|
+
return { llmContent: `Error: ${validation.error}`, error: { message: validation.error, type: 'VALIDATION_ERROR' } };
|
|
151
|
+
}
|
|
152
|
+
if (isReadOnlyPath(validation.relative)) {
|
|
153
|
+
return { llmContent: `Error: ${validation.relative} is read-only (installed package)`, error: { message: 'Cannot write to installed packages', type: 'VALIDATION_ERROR' } };
|
|
154
|
+
}
|
|
155
|
+
if (!content) {
|
|
156
|
+
return { llmContent: 'Error: Content must not be empty', error: { message: 'Content must not be empty', type: 'VALIDATION_ERROR' } };
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
await mkdir(path.dirname(validation.resolved), { recursive: true });
|
|
160
|
+
await writeFile(validation.resolved, content, 'utf-8');
|
|
161
|
+
return { llmContent: `Wrote ${validation.relative} (${String(content.length)} bytes)`, returnDisplay: `Wrote ${validation.relative}` };
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
165
|
+
return { llmContent: `Error: ${msg}`, error: { message: msg, type: 'EXECUTION_FAILED' } };
|
|
166
|
+
}
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
export function createDeleteRepoFileTool(repoRoot) {
|
|
171
|
+
return createToolAdapter({
|
|
172
|
+
name: 'delete_repo_file',
|
|
173
|
+
description: 'Delete a file from the agent repo. Always confirm with the user before deleting. Path is relative to repo root. Same directory restrictions as write_repo_file.',
|
|
174
|
+
parameters: {
|
|
175
|
+
type: 'object',
|
|
176
|
+
properties: {
|
|
177
|
+
path: { type: 'string', description: 'File path relative to repo root (e.g. "evals/old-test.md")' },
|
|
178
|
+
},
|
|
179
|
+
required: ['path'],
|
|
180
|
+
},
|
|
181
|
+
async execute(params) {
|
|
182
|
+
const rawPath = String(params['path'] ?? '');
|
|
183
|
+
const validation = validatePath(repoRoot, rawPath);
|
|
184
|
+
if ('error' in validation) {
|
|
185
|
+
return { llmContent: `Error: ${validation.error}`, error: { message: validation.error, type: 'VALIDATION_ERROR' } };
|
|
186
|
+
}
|
|
187
|
+
if (isReadOnlyPath(validation.relative)) {
|
|
188
|
+
return { llmContent: `Error: ${validation.relative} is read-only (installed package)`, error: { message: 'Cannot delete installed packages', type: 'VALIDATION_ERROR' } };
|
|
189
|
+
}
|
|
190
|
+
try {
|
|
191
|
+
await unlink(validation.resolved);
|
|
192
|
+
return { llmContent: `Deleted ${validation.relative}`, returnDisplay: `Deleted ${validation.relative}` };
|
|
193
|
+
}
|
|
194
|
+
catch (err) {
|
|
195
|
+
const isNotFound = err instanceof Error && 'code' in err && (err.code) === 'ENOENT'; // eslint-disable-line @typescript-eslint/no-unsafe-type-assertion -- checking errno;
|
|
196
|
+
const msg = isNotFound ? `File not found: ${validation.relative}` : (err instanceof Error ? err.message : String(err));
|
|
197
|
+
return { llmContent: `Error: ${msg}`, error: { message: msg, type: 'EXECUTION_FAILED' } };
|
|
198
|
+
}
|
|
199
|
+
},
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
// ---------------------------------------------------------------------------
|
|
203
|
+
// Internal API tool — lets admin query the local runtime's own endpoints
|
|
204
|
+
// ---------------------------------------------------------------------------
|
|
205
|
+
export function createInternalApiTool(getPort) {
|
|
206
|
+
return createToolAdapter({
|
|
207
|
+
name: 'internal_api',
|
|
208
|
+
description: `Query the amodal runtime's internal API. Use this to check eval results, connection health, agent context, store data, and automation status. The endpoint is relative to the local server (e.g. "/api/evals/runs" or "/inspect/health"). Only GET requests are supported.`,
|
|
209
|
+
parameters: {
|
|
210
|
+
type: 'object',
|
|
211
|
+
properties: {
|
|
212
|
+
endpoint: { type: 'string', description: 'API path (e.g. "/api/evals/runs", "/inspect/health", "/api/stores")' },
|
|
213
|
+
},
|
|
214
|
+
required: ['endpoint'],
|
|
215
|
+
},
|
|
216
|
+
async execute(params) {
|
|
217
|
+
const endpoint = String(params['endpoint'] ?? '');
|
|
218
|
+
const port = getPort();
|
|
219
|
+
if (!port) {
|
|
220
|
+
return { llmContent: 'Error: Server not ready', error: { message: 'Server not ready', type: 'EXECUTION_FAILED' } };
|
|
221
|
+
}
|
|
222
|
+
try {
|
|
223
|
+
const resp = await fetch(`http://127.0.0.1:${port}${endpoint}`);
|
|
224
|
+
const text = await resp.text();
|
|
225
|
+
try {
|
|
226
|
+
const json = JSON.parse(text);
|
|
227
|
+
return { llmContent: JSON.stringify(json, null, 2), returnDisplay: `GET ${endpoint} → ${resp.status}` };
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
return { llmContent: text, returnDisplay: `GET ${endpoint} → ${resp.status}` };
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
catch (err) {
|
|
234
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
235
|
+
return { llmContent: `Error: ${msg}`, error: { message: msg, type: 'EXECUTION_FAILED' } };
|
|
236
|
+
}
|
|
237
|
+
},
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=admin-file-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-file-tools.js","sourceRoot":"","sources":["../../../src/session/admin-file-tools.ts"],"names":[],"mappings":"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"}
|