@matthias-hausberger/beige 0.0.1 → 0.0.2-alpha1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +34 -7
  2. package/dist/cli.js +0 -0
  3. package/package.json +15 -15
  4. package/dist/config/loader.spec.d.ts +0 -2
  5. package/dist/config/loader.spec.d.ts.map +0 -1
  6. package/dist/config/loader.spec.js +0 -195
  7. package/dist/config/loader.spec.js.map +0 -1
  8. package/dist/config/schema.spec.d.ts +0 -2
  9. package/dist/config/schema.spec.d.ts.map +0 -1
  10. package/dist/config/schema.spec.js +0 -180
  11. package/dist/config/schema.spec.js.map +0 -1
  12. package/dist/gateway/api.spec.d.ts +0 -2
  13. package/dist/gateway/api.spec.d.ts.map +0 -1
  14. package/dist/gateway/api.spec.js +0 -256
  15. package/dist/gateway/api.spec.js.map +0 -1
  16. package/dist/gateway/audit.spec.d.ts +0 -2
  17. package/dist/gateway/audit.spec.d.ts.map +0 -1
  18. package/dist/gateway/audit.spec.js +0 -212
  19. package/dist/gateway/audit.spec.js.map +0 -1
  20. package/dist/gateway/policy.spec.d.ts +0 -2
  21. package/dist/gateway/policy.spec.d.ts.map +0 -1
  22. package/dist/gateway/policy.spec.js +0 -121
  23. package/dist/gateway/policy.spec.js.map +0 -1
  24. package/dist/gateway/provider-health.spec.d.ts +0 -2
  25. package/dist/gateway/provider-health.spec.d.ts.map +0 -1
  26. package/dist/gateway/provider-health.spec.js +0 -278
  27. package/dist/gateway/provider-health.spec.js.map +0 -1
  28. package/dist/gateway/session-settings.spec.d.ts +0 -2
  29. package/dist/gateway/session-settings.spec.d.ts.map +0 -1
  30. package/dist/gateway/session-settings.spec.js +0 -141
  31. package/dist/gateway/session-settings.spec.js.map +0 -1
  32. package/dist/gateway/sessions.spec.d.ts +0 -2
  33. package/dist/gateway/sessions.spec.d.ts.map +0 -1
  34. package/dist/gateway/sessions.spec.js +0 -190
  35. package/dist/gateway/sessions.spec.js.map +0 -1
  36. package/dist/skills/registry.spec.d.ts +0 -2
  37. package/dist/skills/registry.spec.d.ts.map +0 -1
  38. package/dist/skills/registry.spec.js +0 -220
  39. package/dist/skills/registry.spec.js.map +0 -1
  40. package/dist/socket/protocol.spec.d.ts +0 -2
  41. package/dist/socket/protocol.spec.d.ts.map +0 -1
  42. package/dist/socket/protocol.spec.js +0 -135
  43. package/dist/socket/protocol.spec.js.map +0 -1
  44. package/dist/socket/server.spec.d.ts +0 -2
  45. package/dist/socket/server.spec.d.ts.map +0 -1
  46. package/dist/socket/server.spec.js +0 -333
  47. package/dist/socket/server.spec.js.map +0 -1
  48. package/dist/toolkit/registry.spec.d.ts +0 -2
  49. package/dist/toolkit/registry.spec.d.ts.map +0 -1
  50. package/dist/toolkit/registry.spec.js +0 -194
  51. package/dist/toolkit/registry.spec.js.map +0 -1
  52. package/dist/toolkit/schema.spec.d.ts +0 -2
  53. package/dist/toolkit/schema.spec.d.ts.map +0 -1
  54. package/dist/toolkit/schema.spec.js +0 -202
  55. package/dist/toolkit/schema.spec.js.map +0 -1
  56. package/dist/tools/core.spec.d.ts +0 -2
  57. package/dist/tools/core.spec.d.ts.map +0 -1
  58. package/dist/tools/core.spec.js +0 -315
  59. package/dist/tools/core.spec.js.map +0 -1
  60. package/dist/tools/registry.spec.d.ts +0 -2
  61. package/dist/tools/registry.spec.d.ts.map +0 -1
  62. package/dist/tools/registry.spec.js +0 -228
  63. package/dist/tools/registry.spec.js.map +0 -1
  64. package/dist/tools/runner.spec.d.ts +0 -2
  65. package/dist/tools/runner.spec.d.ts.map +0 -1
  66. package/dist/tools/runner.spec.js +0 -129
  67. package/dist/tools/runner.spec.js.map +0 -1
package/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  Secure, sandboxed agent system. Let agents write and execute code — safely.
4
4
 
5
+ **📚 [Documentation](https://beige.mintlify.app)** — Full docs at beige.mintlify.app
6
+
5
7
  ## What is Beige?
6
8
 
7
9
  Beige is an open-source agent gateway that runs AI agents inside Docker sandboxes. Agents have 4 core tools (`read`, `write`, `patch`, `exec`) and can use additional tools exposed as executables. All tool calls route through the gateway for policy enforcement and audit logging.
@@ -104,13 +106,38 @@ Channels
104
106
  Policy Engine → Audit Logger → Tool Runner
105
107
  ```
106
108
 
107
- See [docs/](docs/) for full documentation:
108
- - [Installation](docs/installation.md) — npm vs source install, setup flow, detection logic
109
- - [System Overview](docs/system-overview.md) — architecture diagrams
110
- - [Request Flows](docs/request-flows.md) — sequence diagrams for every request type
111
- - [Security Model](docs/security-model.md) sandboxing, identity, threat model
112
- - [Tools](docs/tools.md) — how to write and use tools
113
- - [Configuration](docs/configuration.md) full config reference
109
+ ## Documentation
110
+
111
+ Full documentation is available at **[beige.mintlify.app](https://beige.mintlify.app)**:
112
+
113
+ | Section | Description |
114
+ |---------|-------------|
115
+ | [**Introduction**](https://beige.mintlify.app/introduction) | What Beige is, why we built it, and how it works |
116
+ | [**Getting Started**](https://beige.mintlify.app/getting-started) | Install and run your first agent |
117
+ | [**The Gateway**](https://beige.mintlify.app/gateway) | Deep dive into architecture and security |
118
+ | [**Agents**](https://beige.mintlify.app/agents) | Configure providers, models, tools, and skills |
119
+ | [**Channels & Tools**](https://beige.mintlify.app/channels-and-tools) | TUI, Telegram, HTTP API, and extensibility |
120
+
121
+ ### Reference Documentation
122
+
123
+ - [Configuration Reference](docs/configuration.mdx) — Complete config file reference
124
+ - [Tools Reference](docs/tools.mdx) — Tool packages, launchers, socket protocol
125
+ - [Toolkits Reference](docs/toolkits.mdx) — Installing and creating toolkits
126
+ - [Skills Reference](docs/skills.mdx) — Creating knowledge packages
127
+ - [HTTP API Reference](docs/api.mdx) — Full REST API reference
128
+ - [Security Model](docs/security-model.mdx) — Threat model and defense in depth
129
+
130
+ ### Design Documents
131
+
132
+ - [Vision](project/vision.md) — Original design goals
133
+ - [Use Cases](project/usecases.md) — Personal use cases that motivated the project
134
+
135
+ ### External Resources
136
+
137
+ - [pi SDK](https://pi.dev) — The LLM SDK that powers Beige
138
+ - [OpenClaw](https://openclaw.ai) — Inspiration for personal agents
139
+ - ["What if you don't need MCP?"](https://mariozechner.at/posts/2025-11-02-what-if-you-dont-need-mcp/) — Why CLI tools beat MCP bloat
140
+ - ["Code Mode"](https://blog.cloudflare.com/code-mode/) — Why LLMs are better at writing code than calling tools
114
141
 
115
142
  ## Configuration
116
143
 
package/dist/cli.js CHANGED
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matthias-hausberger/beige",
3
- "version": "0.0.1",
3
+ "version": "0.0.2-alpha1",
4
4
  "description": "Secure sandboxed agent system",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -21,18 +21,6 @@
21
21
  "dist",
22
22
  "tools"
23
23
  ],
24
- "scripts": {
25
- "beige": "tsx src/cli.ts",
26
- "build": "tsc",
27
- "start": "node dist/cli.js",
28
- "build:sandbox": "docker build -t beige-sandbox:latest ./sandbox",
29
- "test": "vitest run",
30
- "test:watch": "vitest",
31
- "test:coverage": "vitest run --coverage",
32
- "docs:dev": "cd docs && mintlify dev --port 3333",
33
- "docs:build": "cd docs && mintlify build",
34
- "docs:deploy": "cd docs && mintlify deploy"
35
- },
36
24
  "dependencies": {
37
25
  "@mariozechner/pi-ai": "^0.56.1",
38
26
  "@mariozechner/pi-coding-agent": "latest",
@@ -72,5 +60,17 @@
72
60
  "url": "https://github.com/matthias-hausberger/beige/issues"
73
61
  },
74
62
  "homepage": "https://github.com/matthias-hausberger/beige#readme",
75
- "license": "MIT"
76
- }
63
+ "license": "MIT",
64
+ "scripts": {
65
+ "beige": "tsx src/cli.ts",
66
+ "build": "tsc",
67
+ "start": "node dist/cli.js",
68
+ "build:sandbox": "docker build -t beige-sandbox:latest ./sandbox",
69
+ "test": "vitest run",
70
+ "test:watch": "vitest",
71
+ "test:coverage": "vitest run --coverage",
72
+ "docs:dev": "cd docs && mintlify dev --port 3333",
73
+ "docs:build": "cd docs && mintlify build",
74
+ "docs:deploy": "cd docs && mintlify deploy"
75
+ }
76
+ }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=loader.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"loader.spec.d.ts","sourceRoot":"","sources":["../../src/config/loader.spec.ts"],"names":[],"mappings":""}
@@ -1,195 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
- import { writeFileSync, mkdirSync, rmSync } from "fs";
3
- import { join } from "path";
4
- import { tmpdir } from "os";
5
- import { loadConfig } from "./loader.js";
6
- describe("loadConfig", () => {
7
- let tempDir;
8
- beforeEach(() => {
9
- tempDir = join(tmpdir(), `beige-test-${Date.now()}`);
10
- mkdirSync(tempDir, { recursive: true });
11
- });
12
- afterEach(() => {
13
- rmSync(tempDir, { recursive: true, force: true });
14
- });
15
- describe("JSON5 parsing", () => {
16
- it("parses valid JSON5 with comments", () => {
17
- const configPath = join(tempDir, "config.json5");
18
- writeFileSync(configPath, `
19
- {
20
- // This is a comment
21
- llm: {
22
- providers: {
23
- anthropic: { apiKey: "test-key" },
24
- },
25
- },
26
- tools: {},
27
- agents: {
28
- /* Multi-line
29
- comment */
30
- assistant: {
31
- model: { provider: "anthropic", model: "claude-sonnet-4-20250514" },
32
- tools: [],
33
- },
34
- },
35
- channels: {},
36
- }
37
- `);
38
- const config = loadConfig(configPath);
39
- expect(config.llm.providers.anthropic.apiKey).toBe("test-key");
40
- expect(config.agents.assistant).toBeDefined();
41
- });
42
- it("parses unquoted keys", () => {
43
- const configPath = join(tempDir, "config.json5");
44
- writeFileSync(configPath, `
45
- {
46
- llm: { providers: { anthropic: { apiKey: "test" } } },
47
- tools: {},
48
- agents: { assistant: { model: { provider: "anthropic", model: "claude" }, tools: [] } },
49
- channels: {},
50
- }
51
- `);
52
- const config = loadConfig(configPath);
53
- expect(config.llm.providers.anthropic).toBeDefined();
54
- });
55
- it("parses trailing commas", () => {
56
- const configPath = join(tempDir, "config.json5");
57
- writeFileSync(configPath, `
58
- {
59
- llm: { providers: { anthropic: { apiKey: "test", }, }, },
60
- tools: {},
61
- agents: {
62
- assistant: { model: { provider: "anthropic", model: "claude", }, tools: [], },
63
- },
64
- channels: {},
65
- }
66
- `);
67
- const config = loadConfig(configPath);
68
- expect(config.llm.providers.anthropic.apiKey).toBe("test");
69
- });
70
- });
71
- describe("environment variable resolution", () => {
72
- it("resolves ${ENV_VAR} references", () => {
73
- process.env.TEST_API_KEY = "my-secret-key";
74
- const configPath = join(tempDir, "config.json5");
75
- writeFileSync(configPath, `
76
- {
77
- llm: { providers: { anthropic: { apiKey: "\${TEST_API_KEY}" } } },
78
- tools: {},
79
- agents: { assistant: { model: { provider: "anthropic", model: "claude" }, tools: [] } },
80
- channels: {},
81
- }
82
- `);
83
- const config = loadConfig(configPath);
84
- expect(config.llm.providers.anthropic.apiKey).toBe("my-secret-key");
85
- delete process.env.TEST_API_KEY;
86
- });
87
- it("resolves env vars in nested objects", () => {
88
- process.env.TEST_TOKEN = "bot-token-123";
89
- const configPath = join(tempDir, "config.json5");
90
- writeFileSync(configPath, `
91
- {
92
- llm: { providers: { anthropic: { apiKey: "test" } } },
93
- tools: {},
94
- agents: { assistant: { model: { provider: "anthropic", model: "claude" }, tools: [] } },
95
- channels: {
96
- telegram: {
97
- enabled: true,
98
- token: "\${TEST_TOKEN}",
99
- allowedUsers: [123],
100
- agentMapping: { default: "assistant" },
101
- },
102
- },
103
- }
104
- `);
105
- const config = loadConfig(configPath);
106
- expect(config.channels.telegram?.token).toBe("bot-token-123");
107
- delete process.env.TEST_TOKEN;
108
- });
109
- it("throws when env var is not set", () => {
110
- delete process.env.NONEXISTENT_VAR;
111
- const configPath = join(tempDir, "config.json5");
112
- writeFileSync(configPath, `
113
- {
114
- llm: { providers: { anthropic: { apiKey: "\${NONEXISTENT_VAR}" } } },
115
- tools: {},
116
- agents: { assistant: { model: { provider: "anthropic", model: "claude" }, tools: [] } },
117
- channels: {},
118
- }
119
- `);
120
- expect(() => loadConfig(configPath)).toThrow("NONEXISTENT_VAR");
121
- });
122
- it("resolves env vars in arrays", () => {
123
- process.env.ALLOWED_USER = "999888";
124
- const configPath = join(tempDir, "config.json5");
125
- writeFileSync(configPath, `
126
- {
127
- llm: { providers: { anthropic: { apiKey: "test" } } },
128
- tools: {},
129
- agents: { assistant: { model: { provider: "anthropic", model: "claude" }, tools: [] } },
130
- channels: {
131
- telegram: {
132
- enabled: true,
133
- token: "test",
134
- allowedUsers: [123, "\${ALLOWED_USER}"],
135
- agentMapping: { default: "assistant" },
136
- },
137
- },
138
- }
139
- `);
140
- const config = loadConfig(configPath);
141
- // Note: JSON5 parses strings in number arrays as strings
142
- // The actual validation would convert these
143
- expect(config.channels.telegram?.allowedUsers).toContain("999888");
144
- delete process.env.ALLOWED_USER;
145
- });
146
- });
147
- describe("path resolution", () => {
148
- it("resolves relative tool paths against config directory", () => {
149
- const configPath = join(tempDir, "config.json5");
150
- writeFileSync(configPath, `
151
- {
152
- llm: { providers: { anthropic: { apiKey: "test" } } },
153
- tools: {
154
- mytool: { path: "./tools/mytool", target: "gateway" },
155
- },
156
- agents: { assistant: { model: { provider: "anthropic", model: "claude" }, tools: ["mytool"] } },
157
- channels: {},
158
- }
159
- `);
160
- const config = loadConfig(configPath);
161
- expect(config.tools.mytool.path).toBe(join(tempDir, "tools/mytool"));
162
- });
163
- it("keeps absolute tool paths unchanged", () => {
164
- const configPath = join(tempDir, "config.json5");
165
- writeFileSync(configPath, `
166
- {
167
- llm: { providers: { anthropic: { apiKey: "test" } } },
168
- tools: {
169
- mytool: { path: "/absolute/path/to/tool", target: "gateway" },
170
- },
171
- agents: { assistant: { model: { provider: "anthropic", model: "claude" }, tools: ["mytool"] } },
172
- channels: {},
173
- }
174
- `);
175
- const config = loadConfig(configPath);
176
- expect(config.tools.mytool.path).toBe("/absolute/path/to/tool");
177
- });
178
- });
179
- describe("validation", () => {
180
- it("validates config schema after loading", () => {
181
- const configPath = join(tempDir, "config.json5");
182
- writeFileSync(configPath, `
183
- {
184
- llm: { providers: {} },
185
- tools: {},
186
- agents: {},
187
- channels: {},
188
- }
189
- `);
190
- // Should not throw - empty providers/agents is valid
191
- expect(() => loadConfig(configPath)).not.toThrow();
192
- });
193
- });
194
- });
195
- //# sourceMappingURL=loader.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"loader.spec.js","sourceRoot":"","sources":["../../src/config/loader.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAc,MAAM,IAAI,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,IAAI,OAAe,CAAC;IAEpB,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACrD,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;YACjD,aAAa,CAAC,UAAU,EAAE;;;;;;;;;;;;;;;;;;;OAmBzB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;YAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;YACjD,aAAa,CAAC,UAAU,EAAE;;;;;;;OAOzB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;YAChC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;YACjD,aAAa,CAAC,UAAU,EAAE;;;;;;;;;OASzB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC/C,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,eAAe,CAAC;YAE3C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;YACjD,aAAa,CAAC,UAAU,EAAE;;;;;;;OAOzB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAEpE,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,eAAe,CAAC;YAEzC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;YACjD,aAAa,CAAC,UAAU,EAAE;;;;;;;;;;;;;;OAczB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAE9D,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;YAEnC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;YACjD,aAAa,CAAC,UAAU,EAAE;;;;;;;OAOzB,CAAC,CAAC;YAEH,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,QAAQ,CAAC;YAEpC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;YACjD,aAAa,CAAC,UAAU,EAAE;;;;;;;;;;;;;;OAczB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;YACtC,yDAAyD;YACzD,4CAA4C;YAC5C,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAEnE,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;YACjD,aAAa,CAAC,UAAU,EAAE;;;;;;;;;OASzB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;YACjD,aAAa,CAAC,UAAU,EAAE;;;;;;;;;OASzB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;YACjD,aAAa,CAAC,UAAU,EAAE;;;;;;;OAOzB,CAAC,CAAC;YAEH,qDAAqD;YACrD,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=schema.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema.spec.d.ts","sourceRoot":"","sources":["../../src/config/schema.spec.ts"],"names":[],"mappings":""}
@@ -1,180 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { validateConfig } from "./schema.js";
3
- import { createMinimalConfig, createFullConfig } from "../test/fixtures.js";
4
- describe("validateConfig", () => {
5
- describe("valid configs", () => {
6
- it("accepts minimal valid config", () => {
7
- const config = createMinimalConfig();
8
- expect(() => validateConfig(config)).not.toThrow();
9
- });
10
- it("accepts full config with tools and multiple agents", () => {
11
- const config = createFullConfig();
12
- expect(() => validateConfig(config)).not.toThrow();
13
- });
14
- it("accepts config with fallback models", () => {
15
- const config = createMinimalConfig({
16
- agents: {
17
- assistant: {
18
- model: { provider: "anthropic", model: "claude-sonnet-4-20250514" },
19
- fallbackModels: [
20
- { provider: "openai", model: "gpt-4o" },
21
- ],
22
- tools: [],
23
- },
24
- },
25
- });
26
- expect(() => validateConfig(config)).not.toThrow();
27
- });
28
- it("accepts config with thinking level", () => {
29
- const config = createMinimalConfig({
30
- agents: {
31
- assistant: {
32
- model: {
33
- provider: "anthropic",
34
- model: "claude-sonnet-4-20250514",
35
- thinkingLevel: "high",
36
- },
37
- tools: [],
38
- },
39
- },
40
- });
41
- expect(() => validateConfig(config)).not.toThrow();
42
- });
43
- it("accepts config with sandbox options", () => {
44
- const config = createMinimalConfig({
45
- agents: {
46
- assistant: {
47
- model: { provider: "anthropic", model: "claude-sonnet-4-20250514" },
48
- tools: [],
49
- sandbox: {
50
- image: "custom-sandbox:v1",
51
- extraMounts: { "/host/path": "/container/path" },
52
- extraEnv: { DEBUG: "true" },
53
- },
54
- },
55
- },
56
- });
57
- expect(() => validateConfig(config)).not.toThrow();
58
- });
59
- it("accepts config with gateway settings", () => {
60
- const config = createMinimalConfig({
61
- gateway: {
62
- host: "0.0.0.0",
63
- port: 8080,
64
- logFile: "/var/log/beige.log",
65
- },
66
- });
67
- expect(() => validateConfig(config)).not.toThrow();
68
- });
69
- });
70
- describe("missing required fields", () => {
71
- it("throws when llm.providers is missing", () => {
72
- const config = { ...createMinimalConfig(), llm: {} };
73
- expect(() => validateConfig(config)).toThrow("llm.providers is required");
74
- });
75
- it("throws when tools is missing", () => {
76
- const { tools, ...config } = createMinimalConfig();
77
- expect(() => validateConfig(config)).toThrow("tools is required");
78
- });
79
- it("throws when agents is missing", () => {
80
- const { agents, ...config } = createMinimalConfig();
81
- expect(() => validateConfig(config)).toThrow("agents is required");
82
- });
83
- });
84
- describe("agent validation", () => {
85
- it("throws when agent model.provider is missing", () => {
86
- const config = createMinimalConfig({
87
- agents: {
88
- assistant: {
89
- model: { provider: "", model: "claude-sonnet-4-20250514" },
90
- tools: [],
91
- },
92
- },
93
- });
94
- expect(() => validateConfig(config)).toThrow("model requires provider");
95
- });
96
- it("throws when agent model.model is missing", () => {
97
- const config = createMinimalConfig({
98
- agents: {
99
- assistant: {
100
- model: { provider: "anthropic", model: "" },
101
- tools: [],
102
- },
103
- },
104
- });
105
- expect(() => validateConfig(config)).toThrow("model requires provider and model");
106
- });
107
- it("throws when agent references unknown tool", () => {
108
- const config = createMinimalConfig({
109
- agents: {
110
- assistant: {
111
- model: { provider: "anthropic", model: "claude-sonnet-4-20250514" },
112
- tools: ["nonexistent-tool"],
113
- },
114
- },
115
- });
116
- expect(() => validateConfig(config)).toThrow("unknown tool 'nonexistent-tool'");
117
- });
118
- it("throws when agent references unknown skill", () => {
119
- const config = createMinimalConfig({
120
- skills: {
121
- "code-review": { path: "/skills/code-review" },
122
- },
123
- agents: {
124
- assistant: {
125
- model: { provider: "anthropic", model: "claude-sonnet-4-20250514" },
126
- tools: [],
127
- skills: ["nonexistent-skill"],
128
- },
129
- },
130
- });
131
- expect(() => validateConfig(config)).toThrow("unknown skill 'nonexistent-skill'");
132
- });
133
- it("accepts config with skills", () => {
134
- const config = createMinimalConfig({
135
- skills: {
136
- "code-review": { path: "/skills/code-review" },
137
- "testing": { path: "/skills/testing" },
138
- },
139
- agents: {
140
- assistant: {
141
- model: { provider: "anthropic", model: "claude-sonnet-4-20250514" },
142
- tools: [],
143
- skills: ["code-review", "testing"],
144
- },
145
- },
146
- });
147
- expect(() => validateConfig(config)).not.toThrow();
148
- });
149
- });
150
- describe("channel validation", () => {
151
- it("throws when telegram agentMapping.default references unknown agent", () => {
152
- const config = createMinimalConfig({
153
- channels: {
154
- telegram: {
155
- enabled: true,
156
- token: "test-token",
157
- allowedUsers: [123],
158
- agentMapping: { default: "nonexistent-agent" },
159
- },
160
- },
161
- });
162
- expect(() => validateConfig(config)).toThrow("unknown agent 'nonexistent-agent'");
163
- });
164
- it("accepts disabled telegram channel even with invalid agent mapping", () => {
165
- const config = createMinimalConfig({
166
- channels: {
167
- telegram: {
168
- enabled: false,
169
- token: "test-token",
170
- allowedUsers: [123],
171
- agentMapping: { default: "nonexistent-agent" },
172
- },
173
- },
174
- });
175
- // Disabled channels are not validated for agent references
176
- expect(() => validateConfig(config)).not.toThrow();
177
- });
178
- });
179
- });
180
- //# sourceMappingURL=schema.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema.spec.js","sourceRoot":"","sources":["../../src/config/schema.spec.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=api.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.spec.d.ts","sourceRoot":"","sources":["../../src/gateway/api.spec.ts"],"names":[],"mappings":""}