@amodalai/runtime 0.1.25 → 0.1.26
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/__tests__/providers.test.d.ts +6 -0
- package/dist/src/__tests__/providers.test.js +209 -0
- package/dist/src/__tests__/providers.test.js.map +1 -0
- package/dist/src/__tests__/sse-contract.test.d.ts +6 -0
- package/dist/src/__tests__/sse-contract.test.js +464 -0
- package/dist/src/__tests__/sse-contract.test.js.map +1 -0
- package/dist/src/__tests__/tools.test.d.ts +6 -0
- package/dist/src/__tests__/tools.test.js +583 -0
- package/dist/src/__tests__/tools.test.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.test.js +17 -13
- package/dist/src/agent/local-server.test.js.map +1 -1
- package/dist/src/agent/proactive/proactive-runner.js +6 -1
- package/dist/src/agent/proactive/proactive-runner.js.map +1 -1
- package/dist/src/agent/routes/admin-chat.js +1 -0
- package/dist/src/agent/routes/admin-chat.js.map +1 -1
- package/dist/src/agent/routes/automations.js +2 -0
- package/dist/src/agent/routes/automations.js.map +1 -1
- package/dist/src/agent/routes/evals.js +1 -0
- package/dist/src/agent/routes/evals.js.map +1 -1
- package/dist/src/agent/routes/files.js +3 -0
- package/dist/src/agent/routes/files.js.map +1 -1
- package/dist/src/agent/routes/inspect.js +4 -1
- package/dist/src/agent/routes/inspect.js.map +1 -1
- package/dist/src/agent/routes/stores.js +4 -0
- package/dist/src/agent/routes/stores.js.map +1 -1
- package/dist/src/agent/routes/task.js +1 -0
- package/dist/src/agent/routes/task.js.map +1 -1
- package/dist/src/agent/routes/webhooks.js +1 -0
- package/dist/src/agent/routes/webhooks.js.map +1 -1
- 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/config.test.d.ts +6 -0
- package/dist/src/config.test.js +235 -0
- package/dist/src/config.test.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 +6 -1
- package/dist/src/index.js +5 -1
- 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/routes/ai-stream.js +4 -1
- package/dist/src/routes/ai-stream.js.map +1 -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.js +1 -0
- package/dist/src/routes/chat.js.map +1 -1
- package/dist/src/routes/webhooks.js +3 -1
- package/dist/src/routes/webhooks.js.map +1 -1
- package/dist/src/server.test.js +66 -62
- package/dist/src/server.test.js.map +1 -1
- package/dist/src/session/session-manager.test.js +28 -24
- package/dist/src/session/session-manager.test.js.map +1 -1
- package/dist/src/session/session-runner.test.js +22 -18
- package/dist/src/session/session-runner.test.js.map +1 -1
- package/dist/src/stores/pglite-store-backend.js +6 -0
- package/dist/src/stores/pglite-store-backend.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task.js","sourceRoot":"","sources":["../../../../src/agent/routes/task.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"task.js","sourceRoot":"","sources":["../../../../src/agent/routes/task.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,7 @@ import { verifyHmacSignature } from '../proactive/delivery.js';
|
|
|
12
12
|
*/
|
|
13
13
|
export function createWebhookRouter(options) {
|
|
14
14
|
const router = Router();
|
|
15
|
+
// eslint-disable-next-line @typescript-eslint/no-misused-promises -- TODO: wrap async route handler
|
|
15
16
|
router.post('/webhooks/:name', async (req, res) => {
|
|
16
17
|
const automationName = req.params['name'] ?? '';
|
|
17
18
|
// HMAC verification
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../../../src/agent/routes/webhooks.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,MAAM,EAAC,MAAM,SAAS,CAAC;AAE/B,OAAO,EAAC,mBAAmB,EAAC,MAAM,0BAA0B,CAAC;AAQ7D;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAA6B;IAC/D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IAExB,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QACnE,MAAM,cAAc,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAEhD,oBAAoB;QACpB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;YACpD,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAClC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAE,mCAAmC,EAAC,CAAC,CAAC;gBACnE,OAAO;YACT,CAAC;YAED,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;gBAC1C,CAAC,CAAC,GAAG,CAAC,IAAI;gBACV,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAE7B,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;gBACpE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAE,2BAA2B,EAAC,CAAC,CAAC;gBAC3D,OAAO;YACT,CAAC;QACH,CAAC;QAED,+FAA+F;QAC/F,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC;QAE5D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YAC3E,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAC,CAAC,CAAC;gBAC5C,OAAO;YACT,CAAC;YAED,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAC,CAAC,CAAC;gBAC3D,OAAO;YACT,CAAC;YAED,GAAG,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAC,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAE,GAAG,EAAC,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
1
|
+
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../../../src/agent/routes/webhooks.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,MAAM,EAAC,MAAM,SAAS,CAAC;AAE/B,OAAO,EAAC,mBAAmB,EAAC,MAAM,0BAA0B,CAAC;AAQ7D;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAA6B;IAC/D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IAExB,oGAAoG;IACpG,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QACnE,MAAM,cAAc,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAEhD,oBAAoB;QACpB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;YACpD,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAClC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAE,mCAAmC,EAAC,CAAC,CAAC;gBACnE,OAAO;YACT,CAAC;YAED,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;gBAC1C,CAAC,CAAC,GAAG,CAAC,IAAI;gBACV,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAE7B,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;gBACpE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAE,2BAA2B,EAAC,CAAC,CAAC;gBAC3D,OAAO;YACT,CAAC;QACH,CAAC;QAED,+FAA+F;QAC/F,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC;QAE5D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YAC3E,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAC,CAAC,CAAC;gBAC5C,OAAO;YACT,CAAC;YAED,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAC,CAAC,CAAC;gBAC3D,OAAO;YACT,CAAC;YAED,GAAG,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAC,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAE,GAAG,EAAC,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -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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"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
7
|
+
import { mkdtempSync, writeFileSync, mkdirSync, rmSync } from 'node:fs';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { tmpdir } from 'node:os';
|
|
10
|
+
import { loadConfig } from './config.js';
|
|
11
|
+
import { ConfigError } from './errors.js';
|
|
12
|
+
function makeTempRepo(config) {
|
|
13
|
+
const dir = mkdtempSync(join(tmpdir(), 'amodal-config-test-'));
|
|
14
|
+
writeFileSync(join(dir, 'amodal.json'), JSON.stringify(config));
|
|
15
|
+
return dir;
|
|
16
|
+
}
|
|
17
|
+
const VALID_CONFIG = {
|
|
18
|
+
name: 'test-agent',
|
|
19
|
+
version: '1.0.0',
|
|
20
|
+
description: 'A test agent',
|
|
21
|
+
userContext: 'Always be helpful.',
|
|
22
|
+
models: {
|
|
23
|
+
main: { provider: 'anthropic', model: 'claude-sonnet-4-6' },
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
describe('loadConfig', () => {
|
|
27
|
+
let savedEnv;
|
|
28
|
+
beforeEach(() => {
|
|
29
|
+
savedEnv = {
|
|
30
|
+
ANTHROPIC_API_KEY: process.env['ANTHROPIC_API_KEY'],
|
|
31
|
+
LOG_LEVEL: process.env['LOG_LEVEL'],
|
|
32
|
+
};
|
|
33
|
+
process.env['ANTHROPIC_API_KEY'] = 'test-key';
|
|
34
|
+
});
|
|
35
|
+
afterEach(() => {
|
|
36
|
+
for (const [key, val] of Object.entries(savedEnv)) {
|
|
37
|
+
if (val === undefined)
|
|
38
|
+
delete process.env[key];
|
|
39
|
+
else
|
|
40
|
+
process.env[key] = val;
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
it('loads a valid config from amodal.json', () => {
|
|
44
|
+
const dir = makeTempRepo(VALID_CONFIG);
|
|
45
|
+
try {
|
|
46
|
+
const config = loadConfig({ repoPath: dir });
|
|
47
|
+
expect(config.name).toBe('test-agent');
|
|
48
|
+
expect(config.version).toBe('1.0.0');
|
|
49
|
+
expect(config.description).toBe('A test agent');
|
|
50
|
+
expect(config.userContext).toBe('Always be helpful.');
|
|
51
|
+
expect(config.primaryModel.provider).toBe('anthropic');
|
|
52
|
+
expect(config.primaryModel.model).toBe('claude-sonnet-4-6');
|
|
53
|
+
expect(config.repoPath).toBe(dir);
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
rmSync(dir, { recursive: true });
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
it('loads from .amodal/config.json if amodal.json missing', () => {
|
|
60
|
+
const dir = mkdtempSync(join(tmpdir(), 'amodal-config-test-'));
|
|
61
|
+
mkdirSync(join(dir, '.amodal'));
|
|
62
|
+
writeFileSync(join(dir, '.amodal', 'config.json'), JSON.stringify(VALID_CONFIG));
|
|
63
|
+
try {
|
|
64
|
+
const config = loadConfig({ repoPath: dir });
|
|
65
|
+
expect(config.name).toBe('test-agent');
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
rmSync(dir, { recursive: true });
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
it('throws ConfigError when no config file found', () => {
|
|
72
|
+
const dir = mkdtempSync(join(tmpdir(), 'amodal-config-test-'));
|
|
73
|
+
try {
|
|
74
|
+
expect(() => loadConfig({ repoPath: dir })).toThrow(ConfigError);
|
|
75
|
+
try {
|
|
76
|
+
loadConfig({ repoPath: dir });
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
expect(err).toBeInstanceOf(ConfigError);
|
|
80
|
+
const ce = err;
|
|
81
|
+
expect(ce.key).toBe('amodal.json');
|
|
82
|
+
expect(ce.suggestion).toContain('amodal init');
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
rmSync(dir, { recursive: true });
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
it('throws ConfigError when provider API key is missing', () => {
|
|
90
|
+
delete process.env['ANTHROPIC_API_KEY'];
|
|
91
|
+
const dir = makeTempRepo(VALID_CONFIG);
|
|
92
|
+
try {
|
|
93
|
+
expect(() => loadConfig({ repoPath: dir })).toThrow(ConfigError);
|
|
94
|
+
try {
|
|
95
|
+
loadConfig({ repoPath: dir });
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
const ce = err;
|
|
99
|
+
expect(ce.suggestion).toContain('ANTHROPIC_API_KEY');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
rmSync(dir, { recursive: true });
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
it('skips provider key check when credentials are explicit', () => {
|
|
107
|
+
delete process.env['ANTHROPIC_API_KEY'];
|
|
108
|
+
const dir = makeTempRepo({
|
|
109
|
+
...VALID_CONFIG,
|
|
110
|
+
models: {
|
|
111
|
+
main: {
|
|
112
|
+
provider: 'anthropic',
|
|
113
|
+
model: 'claude-sonnet-4-6',
|
|
114
|
+
credentials: { ANTHROPIC_API_KEY: 'inline-key' },
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
try {
|
|
119
|
+
const config = loadConfig({ repoPath: dir });
|
|
120
|
+
expect(config.primaryModel.credentials).toEqual({ ANTHROPIC_API_KEY: 'inline-key' });
|
|
121
|
+
}
|
|
122
|
+
finally {
|
|
123
|
+
rmSync(dir, { recursive: true });
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
it('applies runtime overrides', () => {
|
|
127
|
+
const dir = makeTempRepo(VALID_CONFIG);
|
|
128
|
+
try {
|
|
129
|
+
const config = loadConfig({
|
|
130
|
+
repoPath: dir,
|
|
131
|
+
overrides: {
|
|
132
|
+
primaryModel: { model: 'claude-opus-4-6' },
|
|
133
|
+
storeBackend: 'postgres',
|
|
134
|
+
postgresUrl: 'postgresql://localhost/test',
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
expect(config.primaryModel.model).toBe('claude-opus-4-6');
|
|
138
|
+
expect(config.primaryModel.provider).toBe('anthropic'); // preserved from base
|
|
139
|
+
expect(config.stores.backend).toBe('postgres');
|
|
140
|
+
expect(config.stores.postgresUrl).toBe('postgresql://localhost/test');
|
|
141
|
+
}
|
|
142
|
+
finally {
|
|
143
|
+
rmSync(dir, { recursive: true });
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
it('sets default store config', () => {
|
|
147
|
+
const dir = makeTempRepo(VALID_CONFIG);
|
|
148
|
+
try {
|
|
149
|
+
const config = loadConfig({ repoPath: dir });
|
|
150
|
+
expect(config.stores.backend).toBe('pglite');
|
|
151
|
+
expect(config.stores.dataDir).toBe(join(dir, '.amodal', 'store-data'));
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
rmSync(dir, { recursive: true });
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
it('sets default sandbox config', () => {
|
|
158
|
+
const dir = makeTempRepo(VALID_CONFIG);
|
|
159
|
+
try {
|
|
160
|
+
const config = loadConfig({ repoPath: dir });
|
|
161
|
+
expect(config.sandbox.shellExec).toBe(false);
|
|
162
|
+
expect(config.sandbox.maxTimeout).toBe(30000);
|
|
163
|
+
}
|
|
164
|
+
finally {
|
|
165
|
+
rmSync(dir, { recursive: true });
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
it('parses MCP server configs', () => {
|
|
169
|
+
const dir = makeTempRepo({
|
|
170
|
+
...VALID_CONFIG,
|
|
171
|
+
mcp: {
|
|
172
|
+
servers: {
|
|
173
|
+
'my-server': {
|
|
174
|
+
transport: 'stdio',
|
|
175
|
+
command: 'node',
|
|
176
|
+
args: ['server.js'],
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
});
|
|
181
|
+
try {
|
|
182
|
+
const config = loadConfig({ repoPath: dir });
|
|
183
|
+
expect(config.mcpServers['my-server']).toEqual({
|
|
184
|
+
transport: 'stdio',
|
|
185
|
+
command: 'node',
|
|
186
|
+
args: ['server.js'],
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
finally {
|
|
190
|
+
rmSync(dir, { recursive: true });
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
it('exposes raw config for backwards compatibility', () => {
|
|
194
|
+
const dir = makeTempRepo(VALID_CONFIG);
|
|
195
|
+
try {
|
|
196
|
+
const config = loadConfig({ repoPath: dir });
|
|
197
|
+
expect(config.raw.name).toBe('test-agent');
|
|
198
|
+
}
|
|
199
|
+
finally {
|
|
200
|
+
rmSync(dir, { recursive: true });
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
it('respects LOG_LEVEL env var', () => {
|
|
204
|
+
process.env['LOG_LEVEL'] = 'debug';
|
|
205
|
+
const dir = makeTempRepo(VALID_CONFIG);
|
|
206
|
+
try {
|
|
207
|
+
const config = loadConfig({ repoPath: dir });
|
|
208
|
+
expect(config.logLevel).toBe(1); // LogLevel.DEBUG
|
|
209
|
+
}
|
|
210
|
+
finally {
|
|
211
|
+
delete process.env['LOG_LEVEL'];
|
|
212
|
+
rmSync(dir, { recursive: true });
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
it('throws on invalid JSON', () => {
|
|
216
|
+
const dir = mkdtempSync(join(tmpdir(), 'amodal-config-test-'));
|
|
217
|
+
writeFileSync(join(dir, 'amodal.json'), 'not json{{{');
|
|
218
|
+
try {
|
|
219
|
+
expect(() => loadConfig({ repoPath: dir })).toThrow(ConfigError);
|
|
220
|
+
}
|
|
221
|
+
finally {
|
|
222
|
+
rmSync(dir, { recursive: true });
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
it('throws on missing required fields', () => {
|
|
226
|
+
const dir = makeTempRepo({ name: 'test' }); // missing version, models
|
|
227
|
+
try {
|
|
228
|
+
expect(() => loadConfig({ repoPath: dir })).toThrow(ConfigError);
|
|
229
|
+
}
|
|
230
|
+
finally {
|
|
231
|
+
rmSync(dir, { recursive: true });
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
//# sourceMappingURL=config.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/config.test.ts"],"names":[],"mappings":"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"}
|