@amodalai/runtime 0.1.25 → 0.2.0
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 +84 -0
- package/dist/src/__fixtures__/smoke-agent/amodal.json +11 -0
- package/dist/src/__fixtures__/smoke-agent/automations/test-auto.md +5 -0
- package/dist/src/__fixtures__/smoke-agent/connections/mock-api/access.json +11 -0
- package/dist/src/__fixtures__/smoke-agent/connections/mock-api/spec.json +4 -0
- package/dist/src/__fixtures__/smoke-agent/connections/mock-api/surface.md +9 -0
- package/dist/src/__fixtures__/smoke-agent/connections/mock-mcp/access.json +3 -0
- package/dist/src/__fixtures__/smoke-agent/connections/mock-mcp/spec.json +8 -0
- package/dist/src/__fixtures__/smoke-agent/evals/basic-eval.md +12 -0
- package/dist/src/__fixtures__/smoke-agent/knowledge/test-knowledge.md +3 -0
- package/dist/src/__fixtures__/smoke-agent/skills/test-skill/SKILL.md +11 -0
- package/dist/src/__fixtures__/smoke-agent/stores/test-items.json +11 -0
- package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/handler.d.ts +18 -0
- package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/handler.js +22 -0
- package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/handler.js.map +1 -0
- package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/tool.json +17 -0
- package/dist/src/__fixtures__/smoke.test.js +718 -0
- package/dist/src/__fixtures__/smoke.test.js.map +1 -0
- package/dist/src/{agent/stores-e2e.test.d.ts → __tests__/providers.test.d.ts} +1 -1
- package/dist/src/__tests__/providers.test.js +209 -0
- package/dist/src/__tests__/providers.test.js.map +1 -0
- package/dist/src/__tests__/test-providers.d.ts +40 -0
- package/dist/src/__tests__/test-providers.js +61 -0
- package/dist/src/__tests__/test-providers.js.map +1 -0
- package/dist/src/agent/agent-types.d.ts +2 -2
- package/dist/src/agent/config-watcher.test.js +18 -14
- package/dist/src/agent/config-watcher.test.js.map +1 -1
- package/dist/src/agent/local-server.d.ts +3 -3
- package/dist/src/agent/local-server.js +213 -122
- package/dist/src/agent/local-server.js.map +1 -1
- package/dist/src/agent/local-server.test.js +17 -13
- package/dist/src/agent/local-server.test.js.map +1 -1
- package/dist/src/agent/loop-types.d.ts +175 -0
- package/dist/src/agent/loop-types.js +20 -0
- package/dist/src/agent/loop-types.js.map +1 -0
- package/dist/src/agent/loop.d.ts +31 -0
- package/dist/src/agent/loop.js +139 -0
- package/dist/src/agent/loop.js.map +1 -0
- package/dist/src/agent/{tool-context-builder.test.d.ts → loop.test.d.ts} +1 -1
- package/dist/src/agent/loop.test.js +1030 -0
- package/dist/src/agent/loop.test.js.map +1 -0
- package/dist/src/agent/mcp-config.d.ts +28 -0
- package/dist/src/agent/mcp-config.js +57 -0
- package/dist/src/agent/mcp-config.js.map +1 -0
- package/dist/src/agent/page-builder.js +6 -1
- package/dist/src/agent/page-builder.js.map +1 -1
- package/dist/src/agent/proactive/proactive-runner.d.ts +24 -8
- package/dist/src/agent/proactive/proactive-runner.js +36 -33
- package/dist/src/agent/proactive/proactive-runner.js.map +1 -1
- package/dist/src/agent/proactive/proactive-runner.test.d.ts +1 -1
- package/dist/src/agent/proactive/proactive-runner.test.js +75 -87
- package/dist/src/agent/proactive/proactive-runner.test.js.map +1 -1
- package/dist/src/agent/routes/admin-chat.d.ts +15 -3
- package/dist/src/agent/routes/admin-chat.js +63 -17
- package/dist/src/agent/routes/admin-chat.js.map +1 -1
- package/dist/src/agent/routes/automations.js +5 -4
- package/dist/src/agent/routes/automations.js.map +1 -1
- package/dist/src/agent/routes/evals.d.ts +3 -2
- package/dist/src/agent/routes/evals.js +25 -11
- package/dist/src/agent/routes/evals.js.map +1 -1
- package/dist/src/agent/routes/files.js +7 -6
- package/dist/src/agent/routes/files.js.map +1 -1
- package/dist/src/agent/routes/inspect.d.ts +6 -2
- package/dist/src/agent/routes/inspect.js +32 -15
- package/dist/src/agent/routes/inspect.js.map +1 -1
- package/dist/src/agent/routes/inspect.test.js +18 -42
- package/dist/src/agent/routes/inspect.test.js.map +1 -1
- package/dist/src/agent/routes/stores.js +9 -8
- package/dist/src/agent/routes/stores.js.map +1 -1
- package/dist/src/agent/routes/task.d.ts +15 -3
- package/dist/src/agent/routes/task.js +16 -6
- package/dist/src/agent/routes/task.js.map +1 -1
- package/dist/src/agent/routes/task.test.d.ts +1 -1
- package/dist/src/agent/routes/task.test.js +70 -53
- package/dist/src/agent/routes/task.test.js.map +1 -1
- package/dist/src/agent/routes/webhooks.js +12 -2
- package/dist/src/agent/routes/webhooks.js.map +1 -1
- package/dist/src/agent/session-store.d.ts +11 -2
- package/dist/src/agent/session-store.js +1 -1
- package/dist/src/agent/session-store.js.map +1 -1
- package/dist/src/agent/snapshot-server.d.ts +2 -22
- package/dist/src/agent/snapshot-server.js +50 -27
- package/dist/src/agent/snapshot-server.js.map +1 -1
- package/dist/src/agent/states/compacting.d.ts +14 -0
- package/dist/src/agent/states/compacting.js +258 -0
- package/dist/src/agent/states/compacting.js.map +1 -0
- package/dist/src/agent/states/confirming.d.ts +10 -0
- package/dist/src/agent/states/confirming.js +76 -0
- package/dist/src/agent/states/confirming.js.map +1 -0
- package/dist/src/agent/states/dispatching.d.ts +18 -0
- package/dist/src/agent/states/dispatching.js +241 -0
- package/dist/src/agent/states/dispatching.js.map +1 -0
- package/dist/src/agent/states/executing.d.ts +21 -0
- package/dist/src/agent/states/executing.js +308 -0
- package/dist/src/agent/states/executing.js.map +1 -0
- package/dist/src/agent/states/streaming.d.ts +10 -0
- package/dist/src/agent/states/streaming.js +155 -0
- package/dist/src/agent/states/streaming.js.map +1 -0
- package/dist/src/agent/states/thinking.d.ts +13 -0
- package/dist/src/agent/states/thinking.js +233 -0
- package/dist/src/agent/states/thinking.js.map +1 -0
- package/dist/src/agent/token-estimate.d.ts +17 -0
- package/dist/src/agent/token-estimate.js +13 -0
- package/dist/src/agent/token-estimate.js.map +1 -0
- package/dist/src/agent/tool-executor-local.js +9 -18
- package/dist/src/agent/tool-executor-local.js.map +1 -1
- package/dist/src/agent/tool-executor-local.test.js +3 -5
- package/dist/src/agent/tool-executor-local.test.js.map +1 -1
- package/dist/src/api/create-agent.d.ts +15 -0
- package/dist/src/api/create-agent.js +137 -0
- package/dist/src/api/create-agent.js.map +1 -0
- package/dist/src/api/types.d.ts +68 -0
- package/dist/src/api/types.js +7 -0
- package/dist/src/api/types.js.map +1 -0
- package/dist/src/config.d.ts +96 -0
- package/dist/src/config.js +221 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/{agent/custom-tools-e2e.test.d.ts → config.test.d.ts} +1 -1
- package/dist/src/config.test.js +235 -0
- package/dist/src/config.test.js.map +1 -0
- package/dist/src/context/compiler.d.ts +13 -0
- package/dist/src/context/compiler.js +358 -0
- package/dist/src/context/compiler.js.map +1 -0
- package/dist/src/context/compiler.test.d.ts +6 -0
- package/dist/src/context/compiler.test.js +532 -0
- package/dist/src/context/compiler.test.js.map +1 -0
- package/dist/src/context/types.d.ts +110 -0
- package/dist/src/context/types.js +7 -0
- package/dist/src/context/types.js.map +1 -0
- package/dist/src/errors.d.ts +145 -0
- package/dist/src/errors.js +218 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/errors.test.d.ts +6 -0
- package/dist/src/errors.test.js +203 -0
- package/dist/src/errors.test.js.map +1 -0
- package/dist/src/index.d.ts +38 -6
- package/dist/src/index.js +40 -22
- package/dist/src/index.js.map +1 -1
- package/dist/src/logger.d.ts +15 -31
- package/dist/src/logger.js +19 -78
- package/dist/src/logger.js.map +1 -1
- package/dist/src/logger.test.d.ts +6 -0
- package/dist/src/logger.test.js +198 -0
- package/dist/src/logger.test.js.map +1 -0
- package/dist/src/providers/create-provider.d.ts +23 -0
- package/dist/src/providers/create-provider.js +185 -0
- package/dist/src/providers/create-provider.js.map +1 -0
- package/dist/src/providers/create-provider.test.d.ts +6 -0
- package/dist/src/providers/create-provider.test.js +95 -0
- package/dist/src/providers/create-provider.test.js.map +1 -0
- package/dist/src/providers/failover.d.ts +38 -0
- package/dist/src/providers/failover.js +147 -0
- package/dist/src/providers/failover.js.map +1 -0
- package/dist/src/providers/failover.test.d.ts +6 -0
- package/dist/src/providers/failover.test.js +169 -0
- package/dist/src/providers/failover.test.js.map +1 -0
- package/dist/src/providers/types.d.ts +110 -0
- package/dist/src/providers/types.js +7 -0
- package/dist/src/providers/types.js.map +1 -0
- package/dist/src/routes/ai-stream.d.ts +13 -10
- package/dist/src/routes/ai-stream.js +76 -38
- package/dist/src/routes/ai-stream.js.map +1 -1
- package/dist/src/routes/chat-new.test.d.ts +6 -0
- package/dist/src/routes/chat-new.test.js +107 -0
- package/dist/src/routes/chat-new.test.js.map +1 -0
- package/dist/src/routes/chat-stream-new.test.d.ts +6 -0
- package/dist/src/routes/chat-stream-new.test.js +135 -0
- package/dist/src/routes/chat-stream-new.test.js.map +1 -0
- package/dist/src/routes/chat-stream.d.ts +14 -4
- package/dist/src/routes/chat-stream.js +47 -27
- package/dist/src/routes/chat-stream.js.map +1 -1
- package/dist/src/routes/chat.d.ts +13 -4
- package/dist/src/routes/chat.js +60 -22
- package/dist/src/routes/chat.js.map +1 -1
- package/dist/src/routes/health.d.ts +3 -2
- package/dist/src/routes/health.js.map +1 -1
- package/dist/src/routes/route-helpers.d.ts +50 -0
- package/dist/src/routes/route-helpers.js +80 -0
- package/dist/src/routes/route-helpers.js.map +1 -0
- package/dist/src/routes/session-resolver.d.ts +72 -0
- package/dist/src/routes/session-resolver.js +123 -0
- package/dist/src/routes/session-resolver.js.map +1 -0
- package/dist/src/routes/session-resolver.test.d.ts +6 -0
- package/dist/src/routes/session-resolver.test.js +206 -0
- package/dist/src/routes/session-resolver.test.js.map +1 -0
- package/dist/src/routes/webhooks.d.ts +3 -1
- package/dist/src/routes/webhooks.js +12 -2
- package/dist/src/routes/webhooks.js.map +1 -1
- package/dist/src/security/permission-checker.d.ts +80 -0
- package/dist/src/security/permission-checker.js +75 -0
- package/dist/src/security/permission-checker.js.map +1 -0
- package/dist/src/security/permission-checker.test.d.ts +6 -0
- package/dist/src/security/permission-checker.test.js +208 -0
- package/dist/src/security/permission-checker.test.js.map +1 -0
- package/dist/src/server.d.ts +12 -11
- package/dist/src/server.js +44 -46
- package/dist/src/server.js.map +1 -1
- package/dist/src/server.test.d.ts +1 -1
- package/dist/src/server.test.js +6 -140
- package/dist/src/server.test.js.map +1 -1
- package/dist/src/session/manager.d.ts +98 -0
- package/dist/src/session/manager.js +364 -0
- package/dist/src/session/manager.js.map +1 -0
- package/dist/src/session/manager.test.d.ts +6 -0
- package/dist/src/session/manager.test.js +315 -0
- package/dist/src/session/manager.test.js.map +1 -0
- package/dist/src/session/session-builder.d.ts +71 -0
- package/dist/src/session/session-builder.js +364 -0
- package/dist/src/session/session-builder.js.map +1 -0
- package/dist/src/session/session-builder.test.d.ts +6 -0
- package/dist/src/session/session-builder.test.js +352 -0
- package/dist/src/session/session-builder.test.js.map +1 -0
- package/dist/src/session/store.d.ts +57 -0
- package/dist/src/session/store.js +167 -0
- package/dist/src/session/store.js.map +1 -0
- package/dist/src/session/store.test.d.ts +6 -0
- package/dist/src/session/store.test.js +145 -0
- package/dist/src/session/store.test.js.map +1 -0
- package/dist/src/session/stream-hooks.d.ts +39 -0
- package/dist/src/session/stream-hooks.js +7 -0
- package/dist/src/session/stream-hooks.js.map +1 -0
- package/dist/src/session/tool-context-factory.d.ts +60 -0
- package/dist/src/session/tool-context-factory.js +190 -0
- package/dist/src/session/tool-context-factory.js.map +1 -0
- package/dist/src/session/tool-context-factory.test.d.ts +6 -0
- package/dist/src/session/tool-context-factory.test.js +287 -0
- package/dist/src/session/tool-context-factory.test.js.map +1 -0
- package/dist/src/session/types.d.ts +188 -0
- package/dist/src/session/types.js +7 -0
- package/dist/src/session/types.js.map +1 -0
- package/dist/src/stores/drizzle-store-backend.d.ts +49 -0
- package/dist/src/stores/drizzle-store-backend.js +306 -0
- package/dist/src/stores/drizzle-store-backend.js.map +1 -0
- package/dist/src/stores/drizzle-store-backend.test.d.ts +6 -0
- package/dist/src/stores/drizzle-store-backend.test.js +215 -0
- package/dist/src/stores/drizzle-store-backend.test.js.map +1 -0
- package/dist/src/stores/index.d.ts +4 -0
- package/dist/src/stores/index.js +2 -0
- package/dist/src/stores/index.js.map +1 -1
- package/dist/src/stores/pglite-store-backend.d.ts +16 -19
- package/dist/src/stores/pglite-store-backend.js +85 -233
- package/dist/src/stores/pglite-store-backend.js.map +1 -1
- package/dist/src/stores/postgres-store-backend.d.ts +30 -0
- package/dist/src/stores/postgres-store-backend.js +100 -0
- package/dist/src/stores/postgres-store-backend.js.map +1 -0
- package/dist/src/stores/schema.d.ts +491 -0
- package/dist/src/stores/schema.js +57 -0
- package/dist/src/stores/schema.js.map +1 -0
- package/dist/src/tools/admin-file-tools.d.ts +13 -0
- package/dist/src/tools/admin-file-tools.js +200 -0
- package/dist/src/tools/admin-file-tools.js.map +1 -0
- package/dist/src/tools/admin-file-tools.test.d.ts +6 -0
- package/dist/src/tools/admin-file-tools.test.js +152 -0
- package/dist/src/tools/admin-file-tools.test.js.map +1 -0
- package/dist/src/tools/custom-tool-adapter.d.ts +41 -0
- package/dist/src/tools/custom-tool-adapter.js +190 -0
- package/dist/src/tools/custom-tool-adapter.js.map +1 -0
- package/dist/src/tools/custom-tool-adapter.test.d.ts +6 -0
- package/dist/src/tools/custom-tool-adapter.test.js +244 -0
- package/dist/src/tools/custom-tool-adapter.test.js.map +1 -0
- package/dist/src/tools/dispatch-tool.d.ts +52 -0
- package/dist/src/tools/dispatch-tool.js +71 -0
- package/dist/src/tools/dispatch-tool.js.map +1 -0
- package/dist/src/tools/dispatch-tool.test.d.ts +6 -0
- package/dist/src/tools/dispatch-tool.test.js +75 -0
- package/dist/src/tools/dispatch-tool.test.js.map +1 -0
- package/dist/src/tools/mcp-tool-adapter.d.ts +18 -0
- package/dist/src/tools/mcp-tool-adapter.js +135 -0
- package/dist/src/tools/mcp-tool-adapter.js.map +1 -0
- package/dist/src/tools/mcp-tool-adapter.test.d.ts +6 -0
- package/dist/src/tools/mcp-tool-adapter.test.js +227 -0
- package/dist/src/tools/mcp-tool-adapter.test.js.map +1 -0
- package/dist/src/tools/registry.d.ts +25 -0
- package/dist/src/tools/registry.js +72 -0
- package/dist/src/tools/registry.js.map +1 -0
- package/dist/src/tools/registry.test.d.ts +6 -0
- package/dist/src/tools/registry.test.js +121 -0
- package/dist/src/tools/registry.test.js.map +1 -0
- package/dist/src/tools/request-tool.d.ts +42 -0
- package/dist/src/tools/request-tool.js +190 -0
- package/dist/src/tools/request-tool.js.map +1 -0
- package/dist/src/tools/request-tool.test.d.ts +6 -0
- package/dist/src/tools/request-tool.test.js +254 -0
- package/dist/src/tools/request-tool.test.js.map +1 -0
- package/dist/src/tools/store-tools.d.ts +29 -0
- package/dist/src/tools/store-tools.js +224 -0
- package/dist/src/tools/store-tools.js.map +1 -0
- package/dist/src/tools/store-tools.test.d.ts +6 -0
- package/dist/src/tools/store-tools.test.js +216 -0
- package/dist/src/tools/store-tools.test.js.map +1 -0
- package/dist/src/tools/types.d.ts +111 -0
- package/dist/src/tools/types.js +7 -0
- package/dist/src/tools/types.js.map +1 -0
- package/dist/src/types.d.ts +20 -12
- package/dist/src/types.js +3 -2
- package/dist/src/types.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +13 -3
- package/dist/src/agent/agent-runner.d.ts +0 -33
- package/dist/src/agent/agent-runner.js +0 -1040
- package/dist/src/agent/agent-runner.js.map +0 -1
- package/dist/src/agent/custom-tools-e2e.test.js +0 -566
- package/dist/src/agent/custom-tools-e2e.test.js.map +0 -1
- package/dist/src/agent/request-helper.d.ts +0 -16
- package/dist/src/agent/request-helper.js +0 -96
- package/dist/src/agent/request-helper.js.map +0 -1
- package/dist/src/agent/stores-e2e.test.js +0 -433
- package/dist/src/agent/stores-e2e.test.js.map +0 -1
- package/dist/src/agent/tool-context-builder.d.ts +0 -11
- package/dist/src/agent/tool-context-builder.js +0 -102
- package/dist/src/agent/tool-context-builder.js.map +0 -1
- package/dist/src/agent/tool-context-builder.test.js +0 -152
- package/dist/src/agent/tool-context-builder.test.js.map +0 -1
- package/dist/src/agent/write-repo-file.test.js +0 -270
- package/dist/src/agent/write-repo-file.test.js.map +0 -1
- package/dist/src/cron/heartbeat-runner.d.ts +0 -21
- package/dist/src/cron/heartbeat-runner.js +0 -79
- package/dist/src/cron/heartbeat-runner.js.map +0 -1
- package/dist/src/cron/heartbeat-runner.test.d.ts +0 -6
- package/dist/src/cron/heartbeat-runner.test.js +0 -120
- package/dist/src/cron/heartbeat-runner.test.js.map +0 -1
- package/dist/src/cron/heartbeat-scheduler.d.ts +0 -26
- package/dist/src/cron/heartbeat-scheduler.js +0 -55
- package/dist/src/cron/heartbeat-scheduler.js.map +0 -1
- package/dist/src/cron/heartbeat-scheduler.test.d.ts +0 -6
- package/dist/src/cron/heartbeat-scheduler.test.js +0 -61
- package/dist/src/cron/heartbeat-scheduler.test.js.map +0 -1
- package/dist/src/routes/ai-stream.test.d.ts +0 -6
- package/dist/src/routes/ai-stream.test.js +0 -586
- package/dist/src/routes/ai-stream.test.js.map +0 -1
- package/dist/src/routes/ask-user-response.d.ts +0 -30
- package/dist/src/routes/ask-user-response.js +0 -61
- package/dist/src/routes/ask-user-response.js.map +0 -1
- package/dist/src/routes/ask-user-response.test.d.ts +0 -6
- package/dist/src/routes/ask-user-response.test.js +0 -88
- package/dist/src/routes/ask-user-response.test.js.map +0 -1
- package/dist/src/routes/chat-stream.test.d.ts +0 -6
- package/dist/src/routes/chat-stream.test.js +0 -155
- package/dist/src/routes/chat-stream.test.js.map +0 -1
- package/dist/src/routes/chat.test.d.ts +0 -6
- package/dist/src/routes/chat.test.js +0 -99
- package/dist/src/routes/chat.test.js.map +0 -1
- package/dist/src/routes/widget-actions.d.ts +0 -49
- package/dist/src/routes/widget-actions.js +0 -78
- package/dist/src/routes/widget-actions.js.map +0 -1
- package/dist/src/session/custom-tool-adapter.d.ts +0 -74
- package/dist/src/session/custom-tool-adapter.js +0 -180
- package/dist/src/session/custom-tool-adapter.js.map +0 -1
- package/dist/src/session/history-converter.d.ts +0 -21
- package/dist/src/session/history-converter.js +0 -59
- package/dist/src/session/history-converter.js.map +0 -1
- package/dist/src/session/history-converter.test.d.ts +0 -6
- package/dist/src/session/history-converter.test.js +0 -130
- package/dist/src/session/history-converter.test.js.map +0 -1
- package/dist/src/session/session-manager.d.ts +0 -219
- package/dist/src/session/session-manager.js +0 -915
- package/dist/src/session/session-manager.js.map +0 -1
- package/dist/src/session/session-manager.test.d.ts +0 -6
- package/dist/src/session/session-manager.test.js +0 -451
- package/dist/src/session/session-manager.test.js.map +0 -1
- package/dist/src/session/session-runner.d.ts +0 -45
- package/dist/src/session/session-runner.js +0 -719
- package/dist/src/session/session-runner.js.map +0 -1
- package/dist/src/session/session-runner.test.d.ts +0 -6
- package/dist/src/session/session-runner.test.js +0 -830
- package/dist/src/session/session-runner.test.js.map +0 -1
- /package/dist/src/{agent/write-repo-file.test.d.ts → __fixtures__/smoke.test.d.ts} +0 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
import { loadRepo, McpManager } from '@amodalai/core';
|
|
7
|
+
import { StandaloneSessionManager } from '../session/manager.js';
|
|
8
|
+
import { buildSessionComponents } from '../session/session-builder.js';
|
|
9
|
+
import { LocalToolExecutor } from '../agent/tool-executor-local.js';
|
|
10
|
+
import { buildMcpConfigs } from '../agent/mcp-config.js';
|
|
11
|
+
import { createPGLiteStoreBackend } from '../stores/pglite-store-backend.js';
|
|
12
|
+
import { createLogger } from '../logger.js';
|
|
13
|
+
import { SessionError } from '../errors.js';
|
|
14
|
+
import { LOCAL_APP_ID } from '../constants.js';
|
|
15
|
+
const MCP_STARTUP_TIMEOUT_MS = 30_000;
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// createAgent
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
/**
|
|
20
|
+
* Create a running agent from a repo path or pre-loaded bundle.
|
|
21
|
+
*
|
|
22
|
+
* This is the main entry point for programmatic use of the Amodal runtime.
|
|
23
|
+
* It loads the agent configuration, initializes stores, MCP connections,
|
|
24
|
+
* and the session manager, then returns an Agent handle for creating
|
|
25
|
+
* sessions and streaming messages.
|
|
26
|
+
*/
|
|
27
|
+
export async function createAgent(config) {
|
|
28
|
+
const logger = config.logger ?? createLogger({ component: 'agent' });
|
|
29
|
+
// Load bundle
|
|
30
|
+
const bundle = config.bundle ?? await loadRepo({ localPath: config.repoPath });
|
|
31
|
+
// Store backend
|
|
32
|
+
let storeBackend = config.storeBackend ?? null;
|
|
33
|
+
if (!storeBackend && bundle.stores.length > 0 && config.repoPath) {
|
|
34
|
+
const dataDir = `${config.repoPath}/.amodal/store-data`;
|
|
35
|
+
storeBackend = await createPGLiteStoreBackend(bundle.stores, dataDir);
|
|
36
|
+
}
|
|
37
|
+
// Tool executor
|
|
38
|
+
const toolExecutor = bundle.tools.length > 0 ? new LocalToolExecutor() : undefined;
|
|
39
|
+
// MCP — with timeout to prevent hanging on broken MCP servers
|
|
40
|
+
let mcpManager = config.mcpManager ?? null;
|
|
41
|
+
if (!mcpManager) {
|
|
42
|
+
const mcpConfigs = buildMcpConfigs(bundle);
|
|
43
|
+
if (Object.keys(mcpConfigs).length > 0) {
|
|
44
|
+
const manager = new McpManager();
|
|
45
|
+
try {
|
|
46
|
+
await Promise.race([
|
|
47
|
+
manager.startServers(mcpConfigs),
|
|
48
|
+
new Promise((_, reject) => {
|
|
49
|
+
setTimeout(() => reject(new Error('MCP startup timed out')), MCP_STARTUP_TIMEOUT_MS);
|
|
50
|
+
}),
|
|
51
|
+
]);
|
|
52
|
+
if (manager.connectedCount > 0) {
|
|
53
|
+
mcpManager = manager;
|
|
54
|
+
logger.info('mcp_initialized', { servers: manager.connectedCount });
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
logger.warn('mcp_startup_failed', { error: err instanceof Error ? err.message : String(err) });
|
|
59
|
+
// Continue without MCP — agent still works for non-MCP tools
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Session manager
|
|
64
|
+
const sessionManager = new StandaloneSessionManager({
|
|
65
|
+
logger,
|
|
66
|
+
ttlMs: config.sessionTtlMs,
|
|
67
|
+
});
|
|
68
|
+
sessionManager.start();
|
|
69
|
+
// Build components once (reused for each session)
|
|
70
|
+
const components = buildSessionComponents({
|
|
71
|
+
bundle,
|
|
72
|
+
storeBackend,
|
|
73
|
+
mcpManager,
|
|
74
|
+
logger,
|
|
75
|
+
toolExecutor,
|
|
76
|
+
});
|
|
77
|
+
return {
|
|
78
|
+
createSession(opts) {
|
|
79
|
+
const session = sessionManager.create({
|
|
80
|
+
tenantId: opts?.tenantId ?? LOCAL_APP_ID,
|
|
81
|
+
userId: opts?.userId ?? 'api',
|
|
82
|
+
provider: components.provider,
|
|
83
|
+
toolRegistry: components.toolRegistry,
|
|
84
|
+
permissionChecker: components.permissionChecker,
|
|
85
|
+
systemPrompt: components.systemPrompt,
|
|
86
|
+
userRoles: opts?.userRoles ?? components.userRoles,
|
|
87
|
+
toolContextFactory: components.toolContextFactory,
|
|
88
|
+
});
|
|
89
|
+
return createAgentSession(sessionManager, session.id, components);
|
|
90
|
+
},
|
|
91
|
+
async resumeSession(sessionId) {
|
|
92
|
+
const existing = sessionManager.get(sessionId);
|
|
93
|
+
if (existing) {
|
|
94
|
+
return createAgentSession(sessionManager, existing.id, components);
|
|
95
|
+
}
|
|
96
|
+
return null;
|
|
97
|
+
},
|
|
98
|
+
getSystemPrompt() {
|
|
99
|
+
return components.systemPrompt;
|
|
100
|
+
},
|
|
101
|
+
getBundle() {
|
|
102
|
+
return bundle;
|
|
103
|
+
},
|
|
104
|
+
async shutdown() {
|
|
105
|
+
await sessionManager.shutdown();
|
|
106
|
+
if (mcpManager) {
|
|
107
|
+
await mcpManager.shutdown();
|
|
108
|
+
}
|
|
109
|
+
if (storeBackend) {
|
|
110
|
+
await storeBackend.close();
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
// ---------------------------------------------------------------------------
|
|
116
|
+
// AgentSession wrapper
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
function createAgentSession(sessionManager, sessionId, components) {
|
|
119
|
+
const session = sessionManager.get(sessionId);
|
|
120
|
+
if (!session) {
|
|
121
|
+
throw new SessionError(`Session "${sessionId}" not found`, {
|
|
122
|
+
sessionId,
|
|
123
|
+
context: { operation: 'createAgentSession' },
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
get id() { return sessionId; },
|
|
128
|
+
get session() { return session; },
|
|
129
|
+
async *stream(message, opts) {
|
|
130
|
+
yield* sessionManager.runMessage(sessionId, message, {
|
|
131
|
+
signal: opts?.signal,
|
|
132
|
+
buildToolContext: components.toolContextFactory,
|
|
133
|
+
});
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=create-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-agent.js","sourceRoot":"","sources":["../../../src/api/create-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Public API types for the Amodal runtime.
|
|
8
|
+
*
|
|
9
|
+
* These are the only types ISV consumers should depend on.
|
|
10
|
+
* Internal types (state machine, tool registry internals, etc.)
|
|
11
|
+
* are not exported from the public API.
|
|
12
|
+
*/
|
|
13
|
+
import type { AgentBundle, StoreBackend } from '@amodalai/types';
|
|
14
|
+
import type { McpManager } from '@amodalai/core';
|
|
15
|
+
import type { LLMProvider, ProviderConfig } from '../providers/types.js';
|
|
16
|
+
import type { Session } from '../session/types.js';
|
|
17
|
+
import type { SSEEvent } from '../types.js';
|
|
18
|
+
import type { StreamHooks } from '../session/stream-hooks.js';
|
|
19
|
+
import type { Logger } from '../logger.js';
|
|
20
|
+
/** Configuration for creating an agent. */
|
|
21
|
+
export interface AgentConfig {
|
|
22
|
+
/** Path to the agent repo (local mode). */
|
|
23
|
+
repoPath?: string;
|
|
24
|
+
/** Pre-loaded agent bundle (alternative to repoPath). */
|
|
25
|
+
bundle?: AgentBundle;
|
|
26
|
+
/** LLM provider override (default: created from bundle model config). */
|
|
27
|
+
provider?: LLMProvider;
|
|
28
|
+
/** Provider config override (default: from bundle model config). */
|
|
29
|
+
providerConfig?: ProviderConfig;
|
|
30
|
+
/** Custom store backend (default: PGLite in .amodal/store-data). */
|
|
31
|
+
storeBackend?: StoreBackend;
|
|
32
|
+
/** MCP manager (default: created from bundle MCP configs). */
|
|
33
|
+
mcpManager?: McpManager;
|
|
34
|
+
/** Logger (default: built-in structured logger). */
|
|
35
|
+
logger?: Logger;
|
|
36
|
+
/** Session TTL in milliseconds (default: 30 minutes). */
|
|
37
|
+
sessionTtlMs?: number;
|
|
38
|
+
/** Stream hooks for audit logging, usage reporting, and persistence. */
|
|
39
|
+
streamHooks?: StreamHooks;
|
|
40
|
+
}
|
|
41
|
+
/** A running agent instance. */
|
|
42
|
+
export interface Agent {
|
|
43
|
+
/** Create a new chat session. */
|
|
44
|
+
createSession(opts?: {
|
|
45
|
+
tenantId?: string;
|
|
46
|
+
userId?: string;
|
|
47
|
+
userRoles?: string[];
|
|
48
|
+
}): AgentSession;
|
|
49
|
+
/** Resume an existing session by ID. Returns null if not found. */
|
|
50
|
+
resumeSession(sessionId: string): Promise<AgentSession | null>;
|
|
51
|
+
/** Get the agent's compiled system prompt. */
|
|
52
|
+
getSystemPrompt(): string;
|
|
53
|
+
/** Get the agent bundle. */
|
|
54
|
+
getBundle(): AgentBundle;
|
|
55
|
+
/** Shut down the agent (close store, MCP, cleanup). */
|
|
56
|
+
shutdown(): Promise<void>;
|
|
57
|
+
}
|
|
58
|
+
/** A chat session — send messages and receive SSE events. */
|
|
59
|
+
export interface AgentSession {
|
|
60
|
+
/** Session ID. */
|
|
61
|
+
readonly id: string;
|
|
62
|
+
/** Send a message and stream SSE events back. */
|
|
63
|
+
stream(message: string, opts?: {
|
|
64
|
+
signal?: AbortSignal;
|
|
65
|
+
}): AsyncGenerator<SSEEvent>;
|
|
66
|
+
/** The underlying session object (for advanced use). */
|
|
67
|
+
readonly session: Session;
|
|
68
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/api/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
import type { ModelConfig, AmodalConfigSchema } from '@amodalai/core';
|
|
7
|
+
import type { z } from 'zod';
|
|
8
|
+
/** The raw amodal.json shape (Zod-inferred, NOT the AmodalConfig class wrapper) */
|
|
9
|
+
type RepoConfig = z.infer<typeof AmodalConfigSchema>;
|
|
10
|
+
import { LogLevel } from './logger.js';
|
|
11
|
+
export type { ModelConfig } from '@amodalai/core';
|
|
12
|
+
export interface AgentConfig {
|
|
13
|
+
/** Agent name from amodal.json */
|
|
14
|
+
readonly name: string;
|
|
15
|
+
/** Agent version */
|
|
16
|
+
readonly version: string;
|
|
17
|
+
/** Agent description */
|
|
18
|
+
readonly description?: string;
|
|
19
|
+
/** Standing instructions for the LLM (userContext from amodal.json) */
|
|
20
|
+
readonly userContext?: string;
|
|
21
|
+
/** Custom base system prompt (overrides default) */
|
|
22
|
+
readonly basePrompt?: string;
|
|
23
|
+
/** Subagent names to disable */
|
|
24
|
+
readonly disabledSubagents: string[];
|
|
25
|
+
/** Primary model configuration */
|
|
26
|
+
readonly primaryModel: ModelConfig;
|
|
27
|
+
/** Secondary model for simple tasks (optional) */
|
|
28
|
+
readonly simpleModel?: ModelConfig;
|
|
29
|
+
/** Advanced model for complex reasoning (optional) */
|
|
30
|
+
readonly advancedModel?: ModelConfig;
|
|
31
|
+
/** All models keyed by role name */
|
|
32
|
+
readonly models: Record<string, ModelConfig>;
|
|
33
|
+
/** Store backend configuration */
|
|
34
|
+
readonly stores: {
|
|
35
|
+
readonly backend: 'pglite' | 'postgres';
|
|
36
|
+
readonly dataDir: string;
|
|
37
|
+
readonly postgresUrl?: string;
|
|
38
|
+
};
|
|
39
|
+
/** MCP server configurations */
|
|
40
|
+
readonly mcpServers: Record<string, McpServerConfig>;
|
|
41
|
+
/** Sandbox/shell execution settings */
|
|
42
|
+
readonly sandbox: {
|
|
43
|
+
readonly shellExec: boolean;
|
|
44
|
+
readonly maxTimeout: number;
|
|
45
|
+
readonly template?: string;
|
|
46
|
+
};
|
|
47
|
+
/** Platform integration (optional) */
|
|
48
|
+
readonly platform?: {
|
|
49
|
+
readonly projectId: string;
|
|
50
|
+
readonly apiKey: string;
|
|
51
|
+
};
|
|
52
|
+
/** Webhook secret for proactive automations */
|
|
53
|
+
readonly webhookSecret?: string;
|
|
54
|
+
/** Log level */
|
|
55
|
+
readonly logLevel: LogLevel;
|
|
56
|
+
/** Repo path (absolute) */
|
|
57
|
+
readonly repoPath: string;
|
|
58
|
+
/** Raw amodal.json (for consumers that need fields not in this interface) */
|
|
59
|
+
readonly raw: RepoConfig;
|
|
60
|
+
}
|
|
61
|
+
export interface McpServerConfig {
|
|
62
|
+
transport: 'stdio' | 'sse' | 'http';
|
|
63
|
+
command?: string;
|
|
64
|
+
args?: string[];
|
|
65
|
+
env?: Record<string, string>;
|
|
66
|
+
url?: string;
|
|
67
|
+
headers?: Record<string, string>;
|
|
68
|
+
trust?: boolean;
|
|
69
|
+
}
|
|
70
|
+
export interface ConfigOverrides {
|
|
71
|
+
/** Override log level */
|
|
72
|
+
logLevel?: LogLevel;
|
|
73
|
+
/** Override primary model */
|
|
74
|
+
primaryModel?: Partial<ModelConfig>;
|
|
75
|
+
/** Override store backend */
|
|
76
|
+
storeBackend?: 'pglite' | 'postgres';
|
|
77
|
+
/** Override store data directory */
|
|
78
|
+
storeDataDir?: string;
|
|
79
|
+
/** Override postgres URL */
|
|
80
|
+
postgresUrl?: string;
|
|
81
|
+
}
|
|
82
|
+
export interface LoadConfigOptions {
|
|
83
|
+
/** Path to the agent repo root (must contain .amodal/ or amodal.json) */
|
|
84
|
+
repoPath: string;
|
|
85
|
+
/** Runtime overrides from createAgent() */
|
|
86
|
+
overrides?: ConfigOverrides;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Load, validate, and return the unified agent config.
|
|
90
|
+
*
|
|
91
|
+
* Reads amodal.json from the repo, resolves env: references,
|
|
92
|
+
* applies environment variable overrides, applies runtime overrides,
|
|
93
|
+
* and validates the result. Throws ConfigError with actionable
|
|
94
|
+
* messages on any failure.
|
|
95
|
+
*/
|
|
96
|
+
export declare function loadConfig(opts: LoadConfigOptions): AgentConfig;
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Unified runtime configuration.
|
|
8
|
+
*
|
|
9
|
+
* Consolidates amodal.json, environment variables, and runtime overrides
|
|
10
|
+
* into a single typed, validated config object. Replaces the split between
|
|
11
|
+
* core's AmodalConfig schema and the upstream gemini-cli-core Config wrapper.
|
|
12
|
+
*
|
|
13
|
+
* Config precedence (highest to lowest):
|
|
14
|
+
* 1. Runtime overrides (passed to createAgent() by ISVs)
|
|
15
|
+
* 2. Environment variables
|
|
16
|
+
* 3. amodal.json in the agent repo
|
|
17
|
+
* 4. Sensible defaults
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* import { loadConfig } from './config.js';
|
|
22
|
+
*
|
|
23
|
+
* const config = loadConfig({
|
|
24
|
+
* repoPath: '/path/to/agent',
|
|
25
|
+
* overrides: { logLevel: 'debug' },
|
|
26
|
+
* });
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
30
|
+
import { join } from 'node:path';
|
|
31
|
+
import { parseConfigJson } from '@amodalai/core';
|
|
32
|
+
import { ConfigError } from './errors.js';
|
|
33
|
+
import { LogLevel } from './logger.js';
|
|
34
|
+
/** Parse log level from string — duplicated here to avoid circular dep with logger.ts */
|
|
35
|
+
function parseLogLevelStr(value) {
|
|
36
|
+
switch (value?.toLowerCase()) {
|
|
37
|
+
case 'trace': return LogLevel.TRACE;
|
|
38
|
+
case 'debug': return LogLevel.DEBUG;
|
|
39
|
+
case 'info': return LogLevel.INFO;
|
|
40
|
+
case 'warn': return LogLevel.WARN;
|
|
41
|
+
case 'error': return LogLevel.ERROR;
|
|
42
|
+
case 'fatal': return LogLevel.FATAL;
|
|
43
|
+
case 'none': return LogLevel.NONE;
|
|
44
|
+
case undefined: return LogLevel.INFO;
|
|
45
|
+
default: return LogLevel.INFO;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Known provider API key environment variable names.
|
|
50
|
+
*/
|
|
51
|
+
/** Default sandbox timeout in ms when not specified in amodal.json. */
|
|
52
|
+
const DEFAULT_SANDBOX_TIMEOUT_MS = 30_000;
|
|
53
|
+
/**
|
|
54
|
+
* Known provider API key environment variable names.
|
|
55
|
+
*/
|
|
56
|
+
const PROVIDER_ENV_KEYS = {
|
|
57
|
+
anthropic: 'ANTHROPIC_API_KEY',
|
|
58
|
+
openai: 'OPENAI_API_KEY',
|
|
59
|
+
google: 'GOOGLE_API_KEY',
|
|
60
|
+
deepseek: 'DEEPSEEK_API_KEY',
|
|
61
|
+
groq: 'GROQ_API_KEY',
|
|
62
|
+
mistral: 'MISTRAL_API_KEY',
|
|
63
|
+
xai: 'XAI_API_KEY',
|
|
64
|
+
bedrock: 'AWS_ACCESS_KEY_ID', // Bedrock uses AWS credential chain
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Load, validate, and return the unified agent config.
|
|
68
|
+
*
|
|
69
|
+
* Reads amodal.json from the repo, resolves env: references,
|
|
70
|
+
* applies environment variable overrides, applies runtime overrides,
|
|
71
|
+
* and validates the result. Throws ConfigError with actionable
|
|
72
|
+
* messages on any failure.
|
|
73
|
+
*/
|
|
74
|
+
export function loadConfig(opts) {
|
|
75
|
+
const { repoPath, overrides } = opts;
|
|
76
|
+
// 1. Find and read amodal.json
|
|
77
|
+
const configPath = findConfigFile(repoPath);
|
|
78
|
+
if (!configPath) {
|
|
79
|
+
throw new ConfigError('Config file not found', {
|
|
80
|
+
key: 'amodal.json',
|
|
81
|
+
suggestion: `Create an amodal.json in ${repoPath} or run 'amodal init' to scaffold a new agent.`,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
let raw;
|
|
85
|
+
try {
|
|
86
|
+
raw = readFileSync(configPath, 'utf-8');
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
throw new ConfigError(`Cannot read config file: ${configPath}`, {
|
|
90
|
+
key: 'amodal.json',
|
|
91
|
+
suggestion: 'Check file permissions.',
|
|
92
|
+
cause: err,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
// 2. Parse and validate (core's parseConfigJson handles Zod + env: resolution)
|
|
96
|
+
let repoConfig;
|
|
97
|
+
try {
|
|
98
|
+
repoConfig = parseConfigJson(raw);
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
if (err instanceof Error && err.message.includes('not set')) {
|
|
102
|
+
// Extract the env var name from the error message
|
|
103
|
+
const match = err.message.match(/"(\w+)" is not set/);
|
|
104
|
+
const varName = match?.[1] ?? 'UNKNOWN';
|
|
105
|
+
throw new ConfigError(`Environment variable "${varName}" is not set`, {
|
|
106
|
+
key: `env:${varName}`,
|
|
107
|
+
suggestion: `Set ${varName} in your .env file or environment. This is referenced in amodal.json.`,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
throw new ConfigError(err instanceof Error ? err.message : String(err), {
|
|
111
|
+
key: 'amodal.json',
|
|
112
|
+
suggestion: 'Check your amodal.json for syntax errors or invalid values.',
|
|
113
|
+
cause: err,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
// 3. Validate provider API key is available
|
|
117
|
+
validateProviderKey(repoConfig.models.main);
|
|
118
|
+
// 4. Build the unified config
|
|
119
|
+
const storeDataDir = overrides?.storeDataDir
|
|
120
|
+
?? repoConfig.stores?.dataDir
|
|
121
|
+
?? join(repoPath, '.amodal', 'store-data');
|
|
122
|
+
const storeBackend = overrides?.storeBackend ?? repoConfig.stores?.backend ?? 'pglite';
|
|
123
|
+
let postgresUrl = overrides?.postgresUrl ?? repoConfig.stores?.postgresUrl;
|
|
124
|
+
if (postgresUrl && postgresUrl.startsWith('env:')) {
|
|
125
|
+
const envVar = postgresUrl.slice(4);
|
|
126
|
+
postgresUrl = process.env[envVar];
|
|
127
|
+
if (!postgresUrl && storeBackend === 'postgres') {
|
|
128
|
+
throw new ConfigError(`Postgres URL environment variable "${envVar}" is not set`, {
|
|
129
|
+
key: 'stores.postgresUrl',
|
|
130
|
+
suggestion: `Set ${envVar} in your .env file. Required when stores.backend is 'postgres'.`,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const logLevel = overrides?.logLevel
|
|
135
|
+
?? parseLogLevelStr(process.env['LOG_LEVEL'])
|
|
136
|
+
?? LogLevel.INFO;
|
|
137
|
+
const mcpServers = {};
|
|
138
|
+
if (repoConfig.mcp?.servers) {
|
|
139
|
+
for (const [name, server] of Object.entries(repoConfig.mcp.servers)) {
|
|
140
|
+
mcpServers[name] = server;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const config = {
|
|
144
|
+
name: repoConfig.name,
|
|
145
|
+
version: repoConfig.version,
|
|
146
|
+
description: repoConfig.description,
|
|
147
|
+
userContext: repoConfig.userContext,
|
|
148
|
+
basePrompt: repoConfig.basePrompt,
|
|
149
|
+
disabledSubagents: repoConfig.disabledSubagents ?? [],
|
|
150
|
+
primaryModel: applyModelOverrides(repoConfig.models.main, overrides?.primaryModel),
|
|
151
|
+
simpleModel: repoConfig.models.simple,
|
|
152
|
+
advancedModel: repoConfig.models.advanced,
|
|
153
|
+
models: {
|
|
154
|
+
main: applyModelOverrides(repoConfig.models.main, overrides?.primaryModel),
|
|
155
|
+
...(repoConfig.models.simple && { simple: repoConfig.models.simple }),
|
|
156
|
+
...(repoConfig.models.advanced && { advanced: repoConfig.models.advanced }),
|
|
157
|
+
},
|
|
158
|
+
stores: {
|
|
159
|
+
backend: storeBackend,
|
|
160
|
+
dataDir: storeDataDir,
|
|
161
|
+
postgresUrl,
|
|
162
|
+
},
|
|
163
|
+
mcpServers,
|
|
164
|
+
sandbox: {
|
|
165
|
+
shellExec: repoConfig.sandbox?.shellExec ?? false,
|
|
166
|
+
maxTimeout: repoConfig.sandbox?.maxTimeout ?? DEFAULT_SANDBOX_TIMEOUT_MS,
|
|
167
|
+
template: repoConfig.sandbox?.template,
|
|
168
|
+
},
|
|
169
|
+
platform: repoConfig.platform,
|
|
170
|
+
webhookSecret: repoConfig.proactive?.webhook,
|
|
171
|
+
logLevel,
|
|
172
|
+
repoPath,
|
|
173
|
+
raw: repoConfig,
|
|
174
|
+
};
|
|
175
|
+
return config;
|
|
176
|
+
}
|
|
177
|
+
// ---------------------------------------------------------------------------
|
|
178
|
+
// Helpers
|
|
179
|
+
// ---------------------------------------------------------------------------
|
|
180
|
+
function findConfigFile(repoPath) {
|
|
181
|
+
// Check both locations: root amodal.json and .amodal/config.json
|
|
182
|
+
const candidates = [
|
|
183
|
+
join(repoPath, 'amodal.json'),
|
|
184
|
+
join(repoPath, '.amodal', 'config.json'),
|
|
185
|
+
];
|
|
186
|
+
return candidates.find((p) => existsSync(p));
|
|
187
|
+
}
|
|
188
|
+
function validateProviderKey(model) {
|
|
189
|
+
// If explicit credentials are provided, skip env var check
|
|
190
|
+
if (model.credentials && Object.keys(model.credentials).length > 0) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const provider = model.provider;
|
|
194
|
+
const envKey = PROVIDER_ENV_KEYS[provider];
|
|
195
|
+
if (!envKey) {
|
|
196
|
+
// Unknown provider — if they have a baseUrl, it's OpenAI-compatible and needs OPENAI_API_KEY
|
|
197
|
+
if (model.baseUrl) {
|
|
198
|
+
const key = model.credentials?.['OPENAI_API_KEY'] ?? process.env['OPENAI_API_KEY'];
|
|
199
|
+
if (!key) {
|
|
200
|
+
throw new ConfigError(`OpenAI-compatible provider "${provider}" requires an API key`, {
|
|
201
|
+
key: 'models.main.credentials',
|
|
202
|
+
suggestion: `Set OPENAI_API_KEY in your environment or add credentials.OPENAI_API_KEY to the model config.`,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
const key = process.env[envKey];
|
|
209
|
+
if (!key) {
|
|
210
|
+
throw new ConfigError(`Provider API key not found`, {
|
|
211
|
+
key: `models.main.provider (${provider})`,
|
|
212
|
+
suggestion: `Set ${envKey} in your .env file or environment.\n Checked: amodal.json → models.main.credentials\n Checked: env → ${envKey}`,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
function applyModelOverrides(base, overrides) {
|
|
217
|
+
if (!overrides)
|
|
218
|
+
return base;
|
|
219
|
+
return { ...base, ...overrides };
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
|