@amodalai/runtime 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/__fixtures__/README.md +4 -0
- package/dist/src/{agent/user-context-fetcher.test.d.ts → __fixtures__/e2e.test.d.ts} +1 -1
- package/dist/src/__fixtures__/e2e.test.js +211 -0
- package/dist/src/__fixtures__/e2e.test.js.map +1 -0
- package/dist/src/__fixtures__/smoke-agent/automations/delivery-callback-test.json +9 -0
- package/dist/src/__fixtures__/smoke-agent/connections/mock-mcp/spec.json +1 -1
- package/dist/src/__fixtures__/smoke.test.js +715 -29
- package/dist/src/__fixtures__/smoke.test.js.map +1 -1
- package/dist/src/__fixtures__/test-env.d.ts +27 -0
- package/dist/src/__fixtures__/test-env.js +64 -0
- package/dist/src/__fixtures__/test-env.js.map +1 -0
- package/dist/src/__fixtures__/test-helpers.d.ts +30 -0
- package/dist/src/__fixtures__/test-helpers.js +120 -0
- package/dist/src/__fixtures__/test-helpers.js.map +1 -0
- package/dist/src/agent/agent-types.d.ts +22 -0
- package/dist/src/agent/agent-types.js.map +1 -1
- package/dist/src/agent/automation-bridge.d.ts +9 -0
- package/dist/src/agent/automation-bridge.js +26 -0
- package/dist/src/agent/automation-bridge.js.map +1 -1
- package/dist/src/agent/automation-bridge.test.js +63 -0
- package/dist/src/agent/automation-bridge.test.js.map +1 -1
- package/dist/src/agent/local-server.d.ts +0 -7
- package/dist/src/agent/local-server.js +274 -87
- package/dist/src/agent/local-server.js.map +1 -1
- package/dist/src/agent/local-server.test.js +14 -11
- package/dist/src/agent/local-server.test.js.map +1 -1
- package/dist/src/agent/loop-types.d.ts +81 -7
- package/dist/src/agent/loop-types.js +4 -0
- package/dist/src/agent/loop-types.js.map +1 -1
- package/dist/src/agent/loop.js +16 -3
- package/dist/src/agent/loop.js.map +1 -1
- package/dist/src/agent/loop.test.js +572 -10
- package/dist/src/agent/loop.test.js.map +1 -1
- package/dist/src/agent/page-builder.js +20 -17
- package/dist/src/agent/page-builder.js.map +1 -1
- package/dist/src/agent/proactive/delivery-router.d.ts +68 -0
- package/dist/src/agent/proactive/delivery-router.js +337 -0
- package/dist/src/agent/proactive/delivery-router.js.map +1 -0
- package/dist/src/agent/proactive/delivery-router.test.d.ts +6 -0
- package/dist/src/agent/proactive/delivery-router.test.js +455 -0
- package/dist/src/agent/proactive/delivery-router.test.js.map +1 -0
- package/dist/src/agent/proactive/proactive-runner.d.ts +23 -1
- package/dist/src/agent/proactive/proactive-runner.js +42 -10
- package/dist/src/agent/proactive/proactive-runner.js.map +1 -1
- package/dist/src/agent/proactive/proactive-runner.test.js +0 -3
- package/dist/src/agent/proactive/proactive-runner.test.js.map +1 -1
- package/dist/src/agent/routes/admin-chat-abort.test.d.ts +6 -0
- package/dist/src/agent/routes/admin-chat-abort.test.js +206 -0
- package/dist/src/agent/routes/admin-chat-abort.test.js.map +1 -0
- package/dist/src/agent/routes/admin-chat.js +0 -3
- package/dist/src/agent/routes/admin-chat.js.map +1 -1
- package/dist/src/agent/routes/files.js +46 -52
- package/dist/src/agent/routes/files.js.map +1 -1
- package/dist/src/agent/routes/inspect.js +4 -6
- package/dist/src/agent/routes/inspect.js.map +1 -1
- package/dist/src/agent/routes/task.test.js +0 -3
- package/dist/src/agent/routes/task.test.js.map +1 -1
- package/dist/src/agent/snapshot-server.js +37 -3
- package/dist/src/agent/snapshot-server.js.map +1 -1
- package/dist/src/agent/states/compacting.js +5 -3
- package/dist/src/agent/states/compacting.js.map +1 -1
- package/dist/src/agent/states/confirming.js +3 -0
- package/dist/src/agent/states/confirming.js.map +1 -1
- package/dist/src/agent/states/dispatching.js +45 -2
- package/dist/src/agent/states/dispatching.js.map +1 -1
- package/dist/src/agent/states/executing.js +225 -81
- package/dist/src/agent/states/executing.js.map +1 -1
- package/dist/src/agent/states/streaming.js +14 -0
- package/dist/src/agent/states/streaming.js.map +1 -1
- package/dist/src/agent/states/thinking.d.ts +1 -1
- package/dist/src/agent/states/thinking.js +246 -29
- package/dist/src/agent/states/thinking.js.map +1 -1
- package/dist/src/agent/token-estimate.d.ts +20 -6
- package/dist/src/agent/token-estimate.js +24 -3
- package/dist/src/agent/token-estimate.js.map +1 -1
- package/dist/src/agent/token-estimate.test.d.ts +6 -0
- package/dist/src/agent/token-estimate.test.js +44 -0
- package/dist/src/agent/token-estimate.test.js.map +1 -0
- package/dist/src/agent/tool-executor-local.test.js +0 -1
- package/dist/src/agent/tool-executor-local.test.js.map +1 -1
- package/dist/src/agent/tool-harness-template.js +0 -1
- package/dist/src/agent/tool-harness-template.js.map +1 -1
- package/dist/src/api/create-agent.js +1 -5
- package/dist/src/api/create-agent.js.map +1 -1
- package/dist/src/api/types.d.ts +1 -5
- package/dist/src/channels/bootstrap.d.ts +59 -0
- package/dist/src/channels/bootstrap.js +84 -0
- package/dist/src/channels/bootstrap.js.map +1 -0
- package/dist/src/channels/channel-session-mapper.d.ts +42 -0
- package/dist/src/channels/channel-session-mapper.js +91 -0
- package/dist/src/channels/channel-session-mapper.js.map +1 -0
- package/dist/src/channels/dedup-cache.d.ts +17 -0
- package/dist/src/channels/dedup-cache.js +51 -0
- package/dist/src/channels/dedup-cache.js.map +1 -0
- package/dist/src/channels/dedup-cache.test.d.ts +6 -0
- package/dist/src/channels/dedup-cache.test.js +51 -0
- package/dist/src/channels/dedup-cache.test.js.map +1 -0
- package/dist/src/channels/errors.d.ts +28 -0
- package/dist/src/channels/errors.js +38 -0
- package/dist/src/channels/errors.js.map +1 -0
- package/dist/src/channels/in-memory-session-mapper.d.ts +34 -0
- package/dist/src/channels/in-memory-session-mapper.js +50 -0
- package/dist/src/channels/in-memory-session-mapper.js.map +1 -0
- package/dist/src/channels/plugin-loader.d.ts +20 -0
- package/dist/src/channels/plugin-loader.js +136 -0
- package/dist/src/channels/plugin-loader.js.map +1 -0
- package/dist/src/channels/plugin-loader.test.d.ts +6 -0
- package/dist/src/channels/plugin-loader.test.js +113 -0
- package/dist/src/channels/plugin-loader.test.js.map +1 -0
- package/dist/src/channels/routes.d.ts +29 -0
- package/dist/src/channels/routes.js +165 -0
- package/dist/src/channels/routes.js.map +1 -0
- package/dist/src/config.d.ts +0 -2
- package/dist/src/config.js +0 -1
- package/dist/src/config.js.map +1 -1
- package/dist/src/config.test.js +0 -2
- package/dist/src/config.test.js.map +1 -1
- package/dist/src/context/compiler.js +11 -34
- package/dist/src/context/compiler.js.map +1 -1
- package/dist/src/context/compiler.test.js +7 -60
- package/dist/src/context/compiler.test.js.map +1 -1
- package/dist/src/context/types.d.ts +0 -4
- package/dist/src/env-ref.d.ts +13 -0
- package/dist/src/env-ref.js +31 -0
- package/dist/src/env-ref.js.map +1 -0
- package/dist/src/env-ref.test.d.ts +6 -0
- package/dist/src/env-ref.test.js +34 -0
- package/dist/src/env-ref.test.js.map +1 -0
- package/dist/src/errors.d.ts +15 -0
- package/dist/src/errors.js +22 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/errors.test.js +2 -2
- package/dist/src/errors.test.js.map +1 -1
- package/dist/src/events/event-bus.d.ts +54 -0
- package/dist/src/events/event-bus.js +84 -0
- package/dist/src/events/event-bus.js.map +1 -0
- package/dist/src/events/event-bus.test.d.ts +6 -0
- package/dist/src/events/event-bus.test.js +112 -0
- package/dist/src/events/event-bus.test.js.map +1 -0
- package/dist/src/events/events-route.d.ts +36 -0
- package/dist/src/events/events-route.js +80 -0
- package/dist/src/events/events-route.js.map +1 -0
- package/dist/src/events/events-route.test.d.ts +6 -0
- package/dist/src/events/events-route.test.js +134 -0
- package/dist/src/events/events-route.test.js.map +1 -0
- package/dist/src/events/store-event-wrapper.d.ts +19 -0
- package/dist/src/events/store-event-wrapper.js +57 -0
- package/dist/src/events/store-event-wrapper.js.map +1 -0
- package/dist/src/events/store-event-wrapper.test.d.ts +6 -0
- package/dist/src/events/store-event-wrapper.test.js +91 -0
- package/dist/src/events/store-event-wrapper.test.js.map +1 -0
- package/dist/src/index.d.ts +13 -0
- package/dist/src/index.js +10 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/middleware/auth.d.ts +0 -2
- package/dist/src/middleware/auth.js.map +1 -1
- package/dist/src/providers/search-provider.d.ts +64 -0
- package/dist/src/providers/search-provider.js +174 -0
- package/dist/src/providers/search-provider.js.map +1 -0
- package/dist/src/providers/types.d.ts +8 -0
- package/dist/src/routes/ai-stream.d.ts +18 -4
- package/dist/src/routes/ai-stream.js +10 -2
- package/dist/src/routes/ai-stream.js.map +1 -1
- package/dist/src/routes/chat-stream.d.ts +9 -1
- package/dist/src/routes/chat-stream.js +3 -1
- package/dist/src/routes/chat-stream.js.map +1 -1
- package/dist/src/routes/chat.d.ts +6 -0
- package/dist/src/routes/chat.js +2 -1
- package/dist/src/routes/chat.js.map +1 -1
- package/dist/src/routes/session-resolver.d.ts +15 -2
- package/dist/src/routes/session-resolver.js +22 -25
- package/dist/src/routes/session-resolver.js.map +1 -1
- package/dist/src/routes/session-resolver.test.js +117 -20
- package/dist/src/routes/session-resolver.test.js.map +1 -1
- package/dist/src/server.d.ts +35 -1
- package/dist/src/server.js +33 -0
- package/dist/src/server.js.map +1 -1
- package/dist/src/session/drizzle-session-store.d.ts +57 -0
- package/dist/src/session/drizzle-session-store.js +204 -0
- package/dist/src/session/drizzle-session-store.js.map +1 -0
- package/dist/src/session/manager.d.ts +6 -3
- package/dist/src/session/manager.js +46 -19
- package/dist/src/session/manager.js.map +1 -1
- package/dist/src/session/manager.test.js +12 -18
- package/dist/src/session/manager.test.js.map +1 -1
- package/dist/src/session/pglite-session-store.d.ts +23 -0
- package/dist/src/session/pglite-session-store.js +86 -0
- package/dist/src/session/pglite-session-store.js.map +1 -0
- package/dist/src/session/postgres-session-store.d.ts +44 -0
- package/dist/src/session/postgres-session-store.js +153 -0
- package/dist/src/session/postgres-session-store.js.map +1 -0
- package/dist/src/session/session-builder.d.ts +0 -5
- package/dist/src/session/session-builder.js +22 -6
- package/dist/src/session/session-builder.js.map +1 -1
- package/dist/src/session/session-builder.test.js +3 -8
- package/dist/src/session/session-builder.test.js.map +1 -1
- package/dist/src/session/session-store-selector.d.ts +49 -0
- package/dist/src/session/session-store-selector.js +60 -0
- package/dist/src/session/session-store-selector.js.map +1 -0
- package/dist/src/session/session-store-selector.test.d.ts +6 -0
- package/dist/src/session/session-store-selector.test.js +79 -0
- package/dist/src/session/session-store-selector.test.js.map +1 -0
- package/dist/src/session/store.d.ts +146 -32
- package/dist/src/session/store.js +126 -138
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/store.test.js +385 -107
- package/dist/src/session/store.test.js.map +1 -1
- package/dist/src/session/tool-context-factory.d.ts +3 -7
- package/dist/src/session/tool-context-factory.js +1 -3
- package/dist/src/session/tool-context-factory.js.map +1 -1
- package/dist/src/session/tool-context-factory.test.js +1 -6
- package/dist/src/session/tool-context-factory.test.js.map +1 -1
- package/dist/src/session/types.d.ts +13 -10
- package/dist/src/stores/schema.d.ts +111 -34
- package/dist/src/stores/schema.js +21 -4
- package/dist/src/stores/schema.js.map +1 -1
- package/dist/src/tools/admin-file-tools.d.ts +29 -0
- package/dist/src/tools/admin-file-tools.js +527 -13
- package/dist/src/tools/admin-file-tools.js.map +1 -1
- package/dist/src/tools/admin-file-tools.test.js +380 -9
- package/dist/src/tools/admin-file-tools.test.js.map +1 -1
- package/dist/src/tools/custom-tool-adapter.js +0 -1
- package/dist/src/tools/custom-tool-adapter.js.map +1 -1
- package/dist/src/tools/custom-tool-adapter.test.js +0 -2
- package/dist/src/tools/custom-tool-adapter.test.js.map +1 -1
- package/dist/src/tools/dispatch-tool.d.ts +4 -4
- package/dist/src/tools/fetch-url-tool.d.ts +23 -0
- package/dist/src/tools/fetch-url-tool.js +333 -0
- package/dist/src/tools/fetch-url-tool.js.map +1 -0
- package/dist/src/tools/fetch-url-tool.test.d.ts +6 -0
- package/dist/src/tools/fetch-url-tool.test.js +227 -0
- package/dist/src/tools/fetch-url-tool.test.js.map +1 -0
- package/dist/src/tools/mcp-tool-adapter.test.js +0 -2
- package/dist/src/tools/mcp-tool-adapter.test.js.map +1 -1
- package/dist/src/tools/registry.test.js +0 -2
- package/dist/src/tools/registry.test.js.map +1 -1
- package/dist/src/tools/request-tool.test.js +0 -2
- package/dist/src/tools/request-tool.test.js.map +1 -1
- package/dist/src/tools/store-tools.test.js +0 -2
- package/dist/src/tools/store-tools.test.js.map +1 -1
- package/dist/src/tools/types.d.ts +20 -7
- package/dist/src/tools/web-search-tool.d.ts +31 -0
- package/dist/src/tools/web-search-tool.js +170 -0
- package/dist/src/tools/web-search-tool.js.map +1 -0
- package/dist/src/tools/web-search-tool.test.d.ts +6 -0
- package/dist/src/tools/web-search-tool.test.js +152 -0
- package/dist/src/tools/web-search-tool.test.js.map +1 -0
- package/dist/src/tools/web-tools-shared.d.ts +21 -0
- package/dist/src/tools/web-tools-shared.js +32 -0
- package/dist/src/tools/web-tools-shared.js.map +1 -0
- package/dist/src/types.d.ts +20 -4
- package/dist/src/types.js +13 -2
- package/dist/src/types.js.map +1 -1
- package/dist/src/types.test.js +0 -3
- package/dist/src/types.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +17 -3
- package/dist/src/agent/session-store.d.ts +0 -71
- package/dist/src/agent/session-store.js +0 -151
- package/dist/src/agent/session-store.js.map +0 -1
- package/dist/src/agent/user-context-fetcher.d.ts +0 -25
- package/dist/src/agent/user-context-fetcher.js +0 -79
- package/dist/src/agent/user-context-fetcher.js.map +0 -1
- package/dist/src/agent/user-context-fetcher.test.js +0 -121
- package/dist/src/agent/user-context-fetcher.test.js.map +0 -1
- package/dist/src/session/admin-file-tools.d.ts +0 -136
- package/dist/src/session/admin-file-tools.js +0 -240
- package/dist/src/session/admin-file-tools.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@amodalai/runtime",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "Agent Runtime Platform — HTTP server for repo and platform modes",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -23,18 +23,21 @@
|
|
|
23
23
|
"@ai-sdk/openai": "^3.0.50",
|
|
24
24
|
"@anthropic-ai/sdk": "^0.39.0",
|
|
25
25
|
"@electric-sql/pglite": "^0.3.15",
|
|
26
|
+
"@mozilla/readability": "^0.6.0",
|
|
26
27
|
"ai": "^6.0.145",
|
|
27
28
|
"drizzle-orm": "^0.45.2",
|
|
28
29
|
"esbuild": "0.25.5",
|
|
29
30
|
"express": "^4.21.0",
|
|
30
31
|
"express-rate-limit": "^7.5.0",
|
|
32
|
+
"glob": "^10.5.0",
|
|
31
33
|
"jose": "^6.0.0",
|
|
34
|
+
"linkedom": "^0.18.12",
|
|
32
35
|
"node-cron": "^3.0.3",
|
|
33
36
|
"pg": "^8.13.1",
|
|
34
37
|
"zod": "^3.25.0",
|
|
35
38
|
"zod-to-json-schema": "^3.25.2",
|
|
36
|
-
"@amodalai/core": "0.2.
|
|
37
|
-
"@amodalai/types": "0.2.
|
|
39
|
+
"@amodalai/core": "0.2.2",
|
|
40
|
+
"@amodalai/types": "0.2.2"
|
|
38
41
|
},
|
|
39
42
|
"devDependencies": {
|
|
40
43
|
"@types/express": "^4.17.21",
|
|
@@ -55,6 +58,17 @@
|
|
|
55
58
|
"format": "prettier --write .",
|
|
56
59
|
"test": "vitest run",
|
|
57
60
|
"test:smoke": "vitest run src/__fixtures__/smoke.test.ts",
|
|
61
|
+
"test:smoke:quick": "vitest run src/__fixtures__/smoke.test.ts -t 'health endpoint|streams chat with init|makes at least one tool call|persists data across store|calls MCP tool|reason=model_stop|reason=budget_exceeded'",
|
|
62
|
+
"test:smoke:anthropic": "SMOKE_TARGET=anthropic vitest run src/__fixtures__/smoke.test.ts",
|
|
63
|
+
"test:smoke:google": "SMOKE_TARGET=google vitest run src/__fixtures__/smoke.test.ts",
|
|
64
|
+
"test:smoke:openai": "SMOKE_TARGET=openai vitest run src/__fixtures__/smoke.test.ts",
|
|
65
|
+
"test:smoke:groq": "SMOKE_TARGET=groq vitest run src/__fixtures__/smoke.test.ts",
|
|
66
|
+
"test:e2e": "vitest run src/__fixtures__/e2e.test.ts",
|
|
67
|
+
"test:e2e:google": "E2E_TARGETS=google vitest run src/__fixtures__/e2e.test.ts",
|
|
68
|
+
"test:e2e:anthropic": "E2E_TARGETS=anthropic vitest run src/__fixtures__/e2e.test.ts",
|
|
69
|
+
"test:e2e:openai": "E2E_TARGETS=openai vitest run src/__fixtures__/e2e.test.ts",
|
|
70
|
+
"test:e2e:groq": "E2E_TARGETS=groq vitest run src/__fixtures__/e2e.test.ts",
|
|
71
|
+
"test:e2e:all": "E2E_TARGETS=google,anthropic,openai,groq vitest run src/__fixtures__/e2e.test.ts",
|
|
58
72
|
"test:ci": "pnpm --filter @amodalai/core run build && vitest run",
|
|
59
73
|
"typecheck": "tsc --emitDeclarationOnly",
|
|
60
74
|
"start": "node dist/src/index.js",
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
-
* SPDX-License-Identifier: MIT
|
|
5
|
-
*/
|
|
6
|
-
/** Minimal session shape needed for persistence. */
|
|
7
|
-
interface SessionLike {
|
|
8
|
-
id: string;
|
|
9
|
-
appId?: string;
|
|
10
|
-
title?: string;
|
|
11
|
-
conversationHistory?: unknown[];
|
|
12
|
-
messages?: unknown[];
|
|
13
|
-
createdAt: number;
|
|
14
|
-
lastAccessedAt: number;
|
|
15
|
-
}
|
|
16
|
-
interface PersistedSession {
|
|
17
|
-
id: string;
|
|
18
|
-
appId: string;
|
|
19
|
-
title?: string;
|
|
20
|
-
conversationHistory: unknown[];
|
|
21
|
-
createdAt: number;
|
|
22
|
-
lastAccessedAt: number;
|
|
23
|
-
automationName?: string;
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Persists session conversation history to disk.
|
|
27
|
-
* Sessions are stored as JSON files in .amodal/sessions/ under the repo root.
|
|
28
|
-
*/
|
|
29
|
-
export declare class SessionStore {
|
|
30
|
-
private readonly dir;
|
|
31
|
-
constructor(repoPath: string);
|
|
32
|
-
private ensureDir;
|
|
33
|
-
/**
|
|
34
|
-
* Resolve a session ID to a safe file path within the sessions directory.
|
|
35
|
-
* Returns the full path if valid, null if the ID is suspicious.
|
|
36
|
-
*/
|
|
37
|
-
private resolvePath;
|
|
38
|
-
/**
|
|
39
|
-
* Save a session's conversation history to disk.
|
|
40
|
-
*/
|
|
41
|
-
save(session: SessionLike, automationName?: string): void;
|
|
42
|
-
/**
|
|
43
|
-
* Load a session's persisted data by ID.
|
|
44
|
-
*/
|
|
45
|
-
load(sessionId: string): PersistedSession | null;
|
|
46
|
-
/**
|
|
47
|
-
* List all persisted sessions, newest first.
|
|
48
|
-
*/
|
|
49
|
-
list(): Array<{
|
|
50
|
-
id: string;
|
|
51
|
-
appId: string;
|
|
52
|
-
title?: string;
|
|
53
|
-
createdAt: number;
|
|
54
|
-
lastAccessedAt: number;
|
|
55
|
-
summary: string;
|
|
56
|
-
automationName?: string;
|
|
57
|
-
}>;
|
|
58
|
-
/**
|
|
59
|
-
* Update a session's title.
|
|
60
|
-
*/
|
|
61
|
-
updateTitle(sessionId: string, title: string): boolean;
|
|
62
|
-
/**
|
|
63
|
-
* Delete a session file.
|
|
64
|
-
*/
|
|
65
|
-
delete(sessionId: string): boolean;
|
|
66
|
-
/**
|
|
67
|
-
* Get the most recent session ID.
|
|
68
|
-
*/
|
|
69
|
-
latest(): string | null;
|
|
70
|
-
}
|
|
71
|
-
export {};
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
-
* SPDX-License-Identifier: MIT
|
|
5
|
-
*/
|
|
6
|
-
import { existsSync, mkdirSync, readFileSync, readdirSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
7
|
-
import { join, resolve } from 'node:path';
|
|
8
|
-
/**
|
|
9
|
-
* Persists session conversation history to disk.
|
|
10
|
-
* Sessions are stored as JSON files in .amodal/sessions/ under the repo root.
|
|
11
|
-
*/
|
|
12
|
-
export class SessionStore {
|
|
13
|
-
dir;
|
|
14
|
-
constructor(repoPath) {
|
|
15
|
-
this.dir = join(repoPath, '.amodal', 'sessions');
|
|
16
|
-
}
|
|
17
|
-
ensureDir() {
|
|
18
|
-
if (!existsSync(this.dir)) {
|
|
19
|
-
mkdirSync(this.dir, { recursive: true });
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Resolve a session ID to a safe file path within the sessions directory.
|
|
24
|
-
* Returns the full path if valid, null if the ID is suspicious.
|
|
25
|
-
*/
|
|
26
|
-
resolvePath(sessionId) {
|
|
27
|
-
const trimmed = sessionId.trim();
|
|
28
|
-
if (trimmed.length === 0 || trimmed.length > 128)
|
|
29
|
-
return null;
|
|
30
|
-
if (!/^[A-Za-z0-9_-]+$/.test(trimmed))
|
|
31
|
-
return null;
|
|
32
|
-
const resolved = resolve(this.dir, `${trimmed}.json`);
|
|
33
|
-
// Ensure the resolved path is still inside the sessions directory
|
|
34
|
-
if (!resolved.startsWith(resolve(this.dir) + '/'))
|
|
35
|
-
return null;
|
|
36
|
-
return resolved;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Save a session's conversation history to disk.
|
|
40
|
-
*/
|
|
41
|
-
save(session, automationName) {
|
|
42
|
-
const file = this.resolvePath(session.id);
|
|
43
|
-
if (!file)
|
|
44
|
-
return;
|
|
45
|
-
this.ensureDir();
|
|
46
|
-
const data = {
|
|
47
|
-
id: session.id,
|
|
48
|
-
appId: session.appId ?? 'local',
|
|
49
|
-
title: session.title,
|
|
50
|
-
conversationHistory: session.conversationHistory ?? session.messages ?? [],
|
|
51
|
-
createdAt: session.createdAt,
|
|
52
|
-
lastAccessedAt: session.lastAccessedAt,
|
|
53
|
-
automationName,
|
|
54
|
-
};
|
|
55
|
-
writeFileSync(file, JSON.stringify(data, null, 2));
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Load a session's persisted data by ID.
|
|
59
|
-
*/
|
|
60
|
-
load(sessionId) {
|
|
61
|
-
const file = this.resolvePath(sessionId);
|
|
62
|
-
if (!file)
|
|
63
|
-
return null;
|
|
64
|
-
if (!existsSync(file))
|
|
65
|
-
return null;
|
|
66
|
-
try {
|
|
67
|
-
const raw = JSON.parse(readFileSync(file, 'utf-8'));
|
|
68
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Trusted local file we wrote
|
|
69
|
-
return raw;
|
|
70
|
-
}
|
|
71
|
-
catch {
|
|
72
|
-
return null;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* List all persisted sessions, newest first.
|
|
77
|
-
*/
|
|
78
|
-
list() {
|
|
79
|
-
if (!existsSync(this.dir))
|
|
80
|
-
return [];
|
|
81
|
-
const files = readdirSync(this.dir).filter((f) => f.endsWith('.json'));
|
|
82
|
-
const sessions = [];
|
|
83
|
-
for (const file of files) {
|
|
84
|
-
try {
|
|
85
|
-
const raw = JSON.parse(readFileSync(join(this.dir, file), 'utf-8'));
|
|
86
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Trusted local file we wrote
|
|
87
|
-
const data = raw;
|
|
88
|
-
// Use title if set, otherwise extract first user message
|
|
89
|
-
let summary = 'Untitled';
|
|
90
|
-
if (data.title) {
|
|
91
|
-
summary = data.title;
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
// SessionMessage format: {type: 'user', text: string}
|
|
95
|
-
// Legacy LLMMessage format: {role: 'user', content: string}
|
|
96
|
-
const isUserMsg = (m) => typeof m === 'object' && m !== null && ((('type' in m && m['type'] === 'user' && 'text' in m && typeof m['text'] === 'string')) ||
|
|
97
|
-
(('role' in m && m['role'] === 'user' && 'content' in m && typeof m['content'] === 'string')));
|
|
98
|
-
const firstUserMsg = data.conversationHistory.find(isUserMsg);
|
|
99
|
-
if (firstUserMsg) {
|
|
100
|
-
summary = ('text' in firstUserMsg ? firstUserMsg.text : firstUserMsg.content).slice(0, 80);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
sessions.push({
|
|
104
|
-
id: data.id,
|
|
105
|
-
appId: data.appId,
|
|
106
|
-
title: data.title,
|
|
107
|
-
createdAt: data.createdAt,
|
|
108
|
-
lastAccessedAt: data.lastAccessedAt,
|
|
109
|
-
summary,
|
|
110
|
-
automationName: data.automationName,
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
catch {
|
|
114
|
-
// Skip corrupt files
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
return sessions.sort((a, b) => b.lastAccessedAt - a.lastAccessedAt);
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* Update a session's title.
|
|
121
|
-
*/
|
|
122
|
-
updateTitle(sessionId, title) {
|
|
123
|
-
const file = this.resolvePath(sessionId);
|
|
124
|
-
if (!file || !existsSync(file))
|
|
125
|
-
return false;
|
|
126
|
-
const raw = JSON.parse(readFileSync(file, 'utf-8'));
|
|
127
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Trusted local file we wrote
|
|
128
|
-
const data = raw;
|
|
129
|
-
data.title = title;
|
|
130
|
-
writeFileSync(file, JSON.stringify(data, null, 2));
|
|
131
|
-
return true;
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Delete a session file.
|
|
135
|
-
*/
|
|
136
|
-
delete(sessionId) {
|
|
137
|
-
const file = this.resolvePath(sessionId);
|
|
138
|
-
if (!file || !existsSync(file))
|
|
139
|
-
return false;
|
|
140
|
-
unlinkSync(file);
|
|
141
|
-
return true;
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* Get the most recent session ID.
|
|
145
|
-
*/
|
|
146
|
-
latest() {
|
|
147
|
-
const sessions = this.list();
|
|
148
|
-
return sessions.length > 0 ? sessions[0].id : null;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
//# sourceMappingURL=session-store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../../src/agent/session-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Amodal Labs, Inc.
|
|
4
|
-
* SPDX-License-Identifier: MIT
|
|
5
|
-
*/
|
|
6
|
-
import type { AgentBundle } from '@amodalai/core';
|
|
7
|
-
import type { ConnectionsMap } from '@amodalai/core';
|
|
8
|
-
/**
|
|
9
|
-
* Fetches user context from a configured endpoint.
|
|
10
|
-
*
|
|
11
|
-
* The `config.userContext` value is a string like "GET crm/users/me"
|
|
12
|
-
* (method connection/path). The connection auth is resolved from
|
|
13
|
-
* the connections map.
|
|
14
|
-
*/
|
|
15
|
-
export declare function fetchUserContext(repo: AgentBundle, appToken: string, connectionsMap: ConnectionsMap): Promise<Record<string, unknown>>;
|
|
16
|
-
interface ParsedSpec {
|
|
17
|
-
method: string;
|
|
18
|
-
connection: string;
|
|
19
|
-
path: string;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Parse "GET crm/users/me" → {method: "GET", connection: "crm", path: "users/me"}
|
|
23
|
-
*/
|
|
24
|
-
declare function parseUserContextSpec(spec: string): ParsedSpec | null;
|
|
25
|
-
export { parseUserContextSpec as _parseUserContextSpecForTesting };
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Amodal Labs, Inc.
|
|
4
|
-
* SPDX-License-Identifier: MIT
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* Fetches user context from a configured endpoint.
|
|
8
|
-
*
|
|
9
|
-
* The `config.userContext` value is a string like "GET crm/users/me"
|
|
10
|
-
* (method connection/path). The connection auth is resolved from
|
|
11
|
-
* the connections map.
|
|
12
|
-
*/
|
|
13
|
-
export async function fetchUserContext(repo, appToken, connectionsMap) {
|
|
14
|
-
const spec = repo.config.userContext;
|
|
15
|
-
if (!spec) {
|
|
16
|
-
return {};
|
|
17
|
-
}
|
|
18
|
-
const parsed = parseUserContextSpec(spec);
|
|
19
|
-
if (!parsed) {
|
|
20
|
-
return {};
|
|
21
|
-
}
|
|
22
|
-
const connConfig = connectionsMap[parsed.connection];
|
|
23
|
-
if (!connConfig) {
|
|
24
|
-
return {};
|
|
25
|
-
}
|
|
26
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- SDK boundary: connections map values are records
|
|
27
|
-
const baseUrl = connConfig['base_url'];
|
|
28
|
-
if (!baseUrl) {
|
|
29
|
-
return {};
|
|
30
|
-
}
|
|
31
|
-
const url = `${baseUrl.replace(/\/$/, '')}/${parsed.path.replace(/^\//, '')}`;
|
|
32
|
-
const headers = {
|
|
33
|
-
'Content-Type': 'application/json',
|
|
34
|
-
'Authorization': `Bearer ${appToken}`,
|
|
35
|
-
};
|
|
36
|
-
const controller = new AbortController();
|
|
37
|
-
const timeout = setTimeout(() => controller.abort(), 5000);
|
|
38
|
-
try {
|
|
39
|
-
const response = await fetch(url, {
|
|
40
|
-
method: parsed.method,
|
|
41
|
-
headers,
|
|
42
|
-
signal: controller.signal,
|
|
43
|
-
});
|
|
44
|
-
if (!response.ok) {
|
|
45
|
-
return {};
|
|
46
|
-
}
|
|
47
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- SDK boundary: expecting JSON object from API
|
|
48
|
-
const data = (await response.json());
|
|
49
|
-
return data;
|
|
50
|
-
}
|
|
51
|
-
catch {
|
|
52
|
-
return {};
|
|
53
|
-
}
|
|
54
|
-
finally {
|
|
55
|
-
clearTimeout(timeout);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Parse "GET crm/users/me" → {method: "GET", connection: "crm", path: "users/me"}
|
|
60
|
-
*/
|
|
61
|
-
function parseUserContextSpec(spec) {
|
|
62
|
-
const parts = spec.trim().split(/\s+/);
|
|
63
|
-
if (parts.length < 2) {
|
|
64
|
-
return null;
|
|
65
|
-
}
|
|
66
|
-
const method = parts[0]?.toUpperCase() ?? '';
|
|
67
|
-
const fullPath = parts[1] ?? '';
|
|
68
|
-
const slashIdx = fullPath.indexOf('/');
|
|
69
|
-
if (slashIdx === -1) {
|
|
70
|
-
return { method, connection: fullPath, path: '/' };
|
|
71
|
-
}
|
|
72
|
-
return {
|
|
73
|
-
method,
|
|
74
|
-
connection: fullPath.substring(0, slashIdx),
|
|
75
|
-
path: fullPath.substring(slashIdx),
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
export { parseUserContextSpec as _parseUserContextSpecForTesting };
|
|
79
|
-
//# sourceMappingURL=user-context-fetcher.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"user-context-fetcher.js","sourceRoot":"","sources":["../../../src/agent/user-context-fetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,121 +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 { fetchUserContext, _parseUserContextSpecForTesting as parseSpec } from './user-context-fetcher.js';
|
|
8
|
-
function makeRepo(userContext) {
|
|
9
|
-
return {
|
|
10
|
-
source: 'local',
|
|
11
|
-
origin: '/test',
|
|
12
|
-
config: {
|
|
13
|
-
name: 'test',
|
|
14
|
-
version: '1.0.0',
|
|
15
|
-
userContext,
|
|
16
|
-
models: {
|
|
17
|
-
main: { provider: 'anthropic', model: 'claude-sonnet-4-20250514' },
|
|
18
|
-
},
|
|
19
|
-
},
|
|
20
|
-
connections: new Map(),
|
|
21
|
-
skills: [],
|
|
22
|
-
agents: { subagents: [] },
|
|
23
|
-
automations: [],
|
|
24
|
-
knowledge: [],
|
|
25
|
-
evals: [],
|
|
26
|
-
tools: [],
|
|
27
|
-
stores: [],
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
describe('parseUserContextSpec', () => {
|
|
31
|
-
it('should parse "GET crm/users/me"', () => {
|
|
32
|
-
const result = parseSpec('GET crm/users/me');
|
|
33
|
-
expect(result).toEqual({
|
|
34
|
-
method: 'GET',
|
|
35
|
-
connection: 'crm',
|
|
36
|
-
path: '/users/me',
|
|
37
|
-
});
|
|
38
|
-
});
|
|
39
|
-
it('should parse "POST api/auth"', () => {
|
|
40
|
-
const result = parseSpec('POST api/auth');
|
|
41
|
-
expect(result).toEqual({
|
|
42
|
-
method: 'POST',
|
|
43
|
-
connection: 'api',
|
|
44
|
-
path: '/auth',
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
|
-
it('should handle connection with no path', () => {
|
|
48
|
-
const result = parseSpec('GET crm');
|
|
49
|
-
expect(result).toEqual({
|
|
50
|
-
method: 'GET',
|
|
51
|
-
connection: 'crm',
|
|
52
|
-
path: '/',
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
it('should return null for empty string', () => {
|
|
56
|
-
const result = parseSpec('');
|
|
57
|
-
expect(result).toBeNull();
|
|
58
|
-
});
|
|
59
|
-
it('should return null for single word', () => {
|
|
60
|
-
const result = parseSpec('GET');
|
|
61
|
-
expect(result).toBeNull();
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
describe('fetchUserContext', () => {
|
|
65
|
-
beforeEach(() => {
|
|
66
|
-
vi.restoreAllMocks();
|
|
67
|
-
});
|
|
68
|
-
it('should return empty object when no userContext configured', async () => {
|
|
69
|
-
const repo = makeRepo();
|
|
70
|
-
const result = await fetchUserContext(repo, 'token', {});
|
|
71
|
-
expect(result).toEqual({});
|
|
72
|
-
});
|
|
73
|
-
it('should return empty object when connection not found', async () => {
|
|
74
|
-
const repo = makeRepo('GET unknown/users/me');
|
|
75
|
-
const result = await fetchUserContext(repo, 'token', {});
|
|
76
|
-
expect(result).toEqual({});
|
|
77
|
-
});
|
|
78
|
-
it('should return empty object when base_url missing', async () => {
|
|
79
|
-
const repo = makeRepo('GET crm/users/me');
|
|
80
|
-
const connMap = {
|
|
81
|
-
crm: { no_base_url: true },
|
|
82
|
-
};
|
|
83
|
-
const result = await fetchUserContext(repo, 'token', connMap);
|
|
84
|
-
expect(result).toEqual({});
|
|
85
|
-
});
|
|
86
|
-
it('should fetch user context successfully', async () => {
|
|
87
|
-
const repo = makeRepo('GET crm/users/me');
|
|
88
|
-
const connMap = {
|
|
89
|
-
crm: { base_url: 'https://api.example.com' },
|
|
90
|
-
};
|
|
91
|
-
const mockResponse = { role: 'admin', name: 'Test User' };
|
|
92
|
-
vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response(JSON.stringify(mockResponse), { status: 200 }));
|
|
93
|
-
const result = await fetchUserContext(repo, 'my-token', connMap);
|
|
94
|
-
expect(result).toEqual(mockResponse);
|
|
95
|
-
expect(fetch).toHaveBeenCalledWith('https://api.example.com/users/me', expect.objectContaining({
|
|
96
|
-
method: 'GET',
|
|
97
|
-
headers: expect.objectContaining({
|
|
98
|
-
Authorization: 'Bearer my-token',
|
|
99
|
-
}),
|
|
100
|
-
}));
|
|
101
|
-
});
|
|
102
|
-
it('should return empty object on HTTP error', async () => {
|
|
103
|
-
const repo = makeRepo('GET crm/users/me');
|
|
104
|
-
const connMap = {
|
|
105
|
-
crm: { base_url: 'https://api.example.com' },
|
|
106
|
-
};
|
|
107
|
-
vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response('Not Found', { status: 404 }));
|
|
108
|
-
const result = await fetchUserContext(repo, 'token', connMap);
|
|
109
|
-
expect(result).toEqual({});
|
|
110
|
-
});
|
|
111
|
-
it('should return empty object on fetch error', async () => {
|
|
112
|
-
const repo = makeRepo('GET crm/users/me');
|
|
113
|
-
const connMap = {
|
|
114
|
-
crm: { base_url: 'https://api.example.com' },
|
|
115
|
-
};
|
|
116
|
-
vi.spyOn(globalThis, 'fetch').mockRejectedValue(new Error('Network error'));
|
|
117
|
-
const result = await fetchUserContext(repo, 'token', connMap);
|
|
118
|
-
expect(result).toEqual({});
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
//# sourceMappingURL=user-context-fetcher.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"user-context-fetcher.test.js","sourceRoot":"","sources":["../../../src/agent/user-context-fetcher.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,136 +0,0 @@
|
|
|
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 {};
|