@matthias-hausberger/beige 0.0.1

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 (194) hide show
  1. package/LICENSE.md +8 -0
  2. package/README.md +183 -0
  3. package/dist/channels/registry.d.ts +14 -0
  4. package/dist/channels/registry.d.ts.map +1 -0
  5. package/dist/channels/registry.js +14 -0
  6. package/dist/channels/registry.js.map +1 -0
  7. package/dist/channels/telegram.d.ts +92 -0
  8. package/dist/channels/telegram.d.ts.map +1 -0
  9. package/dist/channels/telegram.js +469 -0
  10. package/dist/channels/telegram.js.map +1 -0
  11. package/dist/channels/tui.d.ts +8 -0
  12. package/dist/channels/tui.d.ts.map +1 -0
  13. package/dist/channels/tui.js +574 -0
  14. package/dist/channels/tui.js.map +1 -0
  15. package/dist/cli.d.ts +23 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +571 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/config/loader.d.ts +6 -0
  20. package/dist/config/loader.d.ts.map +1 -0
  21. package/dist/config/loader.js +103 -0
  22. package/dist/config/loader.js.map +1 -0
  23. package/dist/config/loader.spec.d.ts +2 -0
  24. package/dist/config/loader.spec.d.ts.map +1 -0
  25. package/dist/config/loader.spec.js +195 -0
  26. package/dist/config/loader.spec.js.map +1 -0
  27. package/dist/config/schema.d.ts +107 -0
  28. package/dist/config/schema.d.ts.map +1 -0
  29. package/dist/config/schema.js +42 -0
  30. package/dist/config/schema.js.map +1 -0
  31. package/dist/config/schema.spec.d.ts +2 -0
  32. package/dist/config/schema.spec.d.ts.map +1 -0
  33. package/dist/config/schema.spec.js +180 -0
  34. package/dist/config/schema.spec.js.map +1 -0
  35. package/dist/gateway/agent-manager.d.ts +138 -0
  36. package/dist/gateway/agent-manager.d.ts.map +1 -0
  37. package/dist/gateway/agent-manager.js +532 -0
  38. package/dist/gateway/agent-manager.js.map +1 -0
  39. package/dist/gateway/api.d.ts +43 -0
  40. package/dist/gateway/api.d.ts.map +1 -0
  41. package/dist/gateway/api.js +256 -0
  42. package/dist/gateway/api.js.map +1 -0
  43. package/dist/gateway/api.spec.d.ts +2 -0
  44. package/dist/gateway/api.spec.d.ts.map +1 -0
  45. package/dist/gateway/api.spec.js +256 -0
  46. package/dist/gateway/api.spec.js.map +1 -0
  47. package/dist/gateway/audit.d.ts +38 -0
  48. package/dist/gateway/audit.d.ts.map +1 -0
  49. package/dist/gateway/audit.js +82 -0
  50. package/dist/gateway/audit.js.map +1 -0
  51. package/dist/gateway/audit.spec.d.ts +2 -0
  52. package/dist/gateway/audit.spec.d.ts.map +1 -0
  53. package/dist/gateway/audit.spec.js +212 -0
  54. package/dist/gateway/audit.spec.js.map +1 -0
  55. package/dist/gateway/gateway.d.ts +27 -0
  56. package/dist/gateway/gateway.d.ts.map +1 -0
  57. package/dist/gateway/gateway.js +158 -0
  58. package/dist/gateway/gateway.js.map +1 -0
  59. package/dist/gateway/policy.d.ts +27 -0
  60. package/dist/gateway/policy.d.ts.map +1 -0
  61. package/dist/gateway/policy.js +40 -0
  62. package/dist/gateway/policy.js.map +1 -0
  63. package/dist/gateway/policy.spec.d.ts +2 -0
  64. package/dist/gateway/policy.spec.d.ts.map +1 -0
  65. package/dist/gateway/policy.spec.js +121 -0
  66. package/dist/gateway/policy.spec.js.map +1 -0
  67. package/dist/gateway/provider-health.d.ts +83 -0
  68. package/dist/gateway/provider-health.d.ts.map +1 -0
  69. package/dist/gateway/provider-health.js +219 -0
  70. package/dist/gateway/provider-health.js.map +1 -0
  71. package/dist/gateway/provider-health.spec.d.ts +2 -0
  72. package/dist/gateway/provider-health.spec.d.ts.map +1 -0
  73. package/dist/gateway/provider-health.spec.js +278 -0
  74. package/dist/gateway/provider-health.spec.js.map +1 -0
  75. package/dist/gateway/session-settings.d.ts +62 -0
  76. package/dist/gateway/session-settings.d.ts.map +1 -0
  77. package/dist/gateway/session-settings.js +91 -0
  78. package/dist/gateway/session-settings.js.map +1 -0
  79. package/dist/gateway/session-settings.spec.d.ts +2 -0
  80. package/dist/gateway/session-settings.spec.d.ts.map +1 -0
  81. package/dist/gateway/session-settings.spec.js +141 -0
  82. package/dist/gateway/session-settings.spec.js.map +1 -0
  83. package/dist/gateway/sessions.d.ts +68 -0
  84. package/dist/gateway/sessions.d.ts.map +1 -0
  85. package/dist/gateway/sessions.js +177 -0
  86. package/dist/gateway/sessions.js.map +1 -0
  87. package/dist/gateway/sessions.spec.d.ts +2 -0
  88. package/dist/gateway/sessions.spec.d.ts.map +1 -0
  89. package/dist/gateway/sessions.spec.js +190 -0
  90. package/dist/gateway/sessions.spec.js.map +1 -0
  91. package/dist/index.d.ts +11 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +10 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/install.d.ts +39 -0
  96. package/dist/install.d.ts.map +1 -0
  97. package/dist/install.js +144 -0
  98. package/dist/install.js.map +1 -0
  99. package/dist/sandbox/manager.d.ts +63 -0
  100. package/dist/sandbox/manager.d.ts.map +1 -0
  101. package/dist/sandbox/manager.js +294 -0
  102. package/dist/sandbox/manager.js.map +1 -0
  103. package/dist/skills/index.d.ts +2 -0
  104. package/dist/skills/index.d.ts.map +1 -0
  105. package/dist/skills/index.js +2 -0
  106. package/dist/skills/index.js.map +1 -0
  107. package/dist/skills/registry.d.ts +11 -0
  108. package/dist/skills/registry.d.ts.map +1 -0
  109. package/dist/skills/registry.js +86 -0
  110. package/dist/skills/registry.js.map +1 -0
  111. package/dist/skills/registry.spec.d.ts +2 -0
  112. package/dist/skills/registry.spec.d.ts.map +1 -0
  113. package/dist/skills/registry.spec.js +220 -0
  114. package/dist/skills/registry.spec.js.map +1 -0
  115. package/dist/socket/protocol.d.ts +21 -0
  116. package/dist/socket/protocol.d.ts.map +1 -0
  117. package/dist/socket/protocol.js +7 -0
  118. package/dist/socket/protocol.js.map +1 -0
  119. package/dist/socket/protocol.spec.d.ts +2 -0
  120. package/dist/socket/protocol.spec.d.ts.map +1 -0
  121. package/dist/socket/protocol.spec.js +135 -0
  122. package/dist/socket/protocol.spec.js.map +1 -0
  123. package/dist/socket/server.d.ts +21 -0
  124. package/dist/socket/server.d.ts.map +1 -0
  125. package/dist/socket/server.js +133 -0
  126. package/dist/socket/server.js.map +1 -0
  127. package/dist/socket/server.spec.d.ts +2 -0
  128. package/dist/socket/server.spec.d.ts.map +1 -0
  129. package/dist/socket/server.spec.js +333 -0
  130. package/dist/socket/server.spec.js.map +1 -0
  131. package/dist/test/fixtures.d.ts +47 -0
  132. package/dist/test/fixtures.d.ts.map +1 -0
  133. package/dist/test/fixtures.js +144 -0
  134. package/dist/test/fixtures.js.map +1 -0
  135. package/dist/toolkit/index.d.ts +4 -0
  136. package/dist/toolkit/index.d.ts.map +1 -0
  137. package/dist/toolkit/index.js +4 -0
  138. package/dist/toolkit/index.js.map +1 -0
  139. package/dist/toolkit/installer.d.ts +26 -0
  140. package/dist/toolkit/installer.d.ts.map +1 -0
  141. package/dist/toolkit/installer.js +247 -0
  142. package/dist/toolkit/installer.js.map +1 -0
  143. package/dist/toolkit/registry.d.ts +19 -0
  144. package/dist/toolkit/registry.d.ts.map +1 -0
  145. package/dist/toolkit/registry.js +119 -0
  146. package/dist/toolkit/registry.js.map +1 -0
  147. package/dist/toolkit/registry.spec.d.ts +2 -0
  148. package/dist/toolkit/registry.spec.d.ts.map +1 -0
  149. package/dist/toolkit/registry.spec.js +194 -0
  150. package/dist/toolkit/registry.spec.js.map +1 -0
  151. package/dist/toolkit/schema.d.ts +61 -0
  152. package/dist/toolkit/schema.d.ts.map +1 -0
  153. package/dist/toolkit/schema.js +116 -0
  154. package/dist/toolkit/schema.js.map +1 -0
  155. package/dist/toolkit/schema.spec.d.ts +2 -0
  156. package/dist/toolkit/schema.spec.d.ts.map +1 -0
  157. package/dist/toolkit/schema.spec.js +202 -0
  158. package/dist/toolkit/schema.spec.js.map +1 -0
  159. package/dist/tools/core.d.ts +10 -0
  160. package/dist/tools/core.d.ts.map +1 -0
  161. package/dist/tools/core.js +246 -0
  162. package/dist/tools/core.js.map +1 -0
  163. package/dist/tools/core.spec.d.ts +2 -0
  164. package/dist/tools/core.spec.d.ts.map +1 -0
  165. package/dist/tools/core.spec.js +315 -0
  166. package/dist/tools/core.spec.js.map +1 -0
  167. package/dist/tools/registry.d.ts +15 -0
  168. package/dist/tools/registry.d.ts.map +1 -0
  169. package/dist/tools/registry.js +62 -0
  170. package/dist/tools/registry.js.map +1 -0
  171. package/dist/tools/registry.spec.d.ts +2 -0
  172. package/dist/tools/registry.spec.d.ts.map +1 -0
  173. package/dist/tools/registry.spec.js +228 -0
  174. package/dist/tools/registry.spec.js.map +1 -0
  175. package/dist/tools/runner.d.ts +25 -0
  176. package/dist/tools/runner.d.ts.map +1 -0
  177. package/dist/tools/runner.js +35 -0
  178. package/dist/tools/runner.js.map +1 -0
  179. package/dist/tools/runner.spec.d.ts +2 -0
  180. package/dist/tools/runner.spec.d.ts.map +1 -0
  181. package/dist/tools/runner.spec.js +129 -0
  182. package/dist/tools/runner.spec.js.map +1 -0
  183. package/dist/types/session.d.ts +8 -0
  184. package/dist/types/session.d.ts.map +1 -0
  185. package/dist/types/session.js +23 -0
  186. package/dist/types/session.js.map +1 -0
  187. package/package.json +76 -0
  188. package/tools/README.md +1 -0
  189. package/tools/kv/README.md +150 -0
  190. package/tools/kv/index.ts +149 -0
  191. package/tools/kv/tool.json +23 -0
  192. package/tools/message/README.md +53 -0
  193. package/tools/message/index.ts +183 -0
  194. package/tools/message/tool.json +11 -0
@@ -0,0 +1,333 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import { AgentSocketServer } from "./server.js";
3
+ import { PolicyEngine } from "../gateway/policy.js";
4
+ import { ToolRunner } from "../tools/runner.js";
5
+ import { AuditLogger } from "../gateway/audit.js";
6
+ import { createFullConfig } from "../test/fixtures.js";
7
+ import { createConnection } from "net";
8
+ import { mkdirSync, rmSync } from "fs";
9
+ import { join } from "path";
10
+ import { tmpdir } from "os";
11
+ import { encodeMessage, decodeMessage } from "./protocol.js";
12
+ describe("AgentSocketServer", () => {
13
+ let tempDir;
14
+ let socketPath;
15
+ let server;
16
+ let policy;
17
+ let toolRunner;
18
+ let auditLogger;
19
+ let auditLogPath;
20
+ beforeEach(async () => {
21
+ tempDir = join(tmpdir(), `beige-socket-test-${Date.now()}`);
22
+ mkdirSync(tempDir, { recursive: true });
23
+ socketPath = join(tempDir, "test-agent.sock");
24
+ auditLogPath = join(tempDir, "audit.jsonl");
25
+ const config = createFullConfig();
26
+ policy = new PolicyEngine(config);
27
+ toolRunner = new ToolRunner();
28
+ auditLogger = new AuditLogger(auditLogPath);
29
+ server = new AgentSocketServer("assistant", socketPath, auditLogger, policy, toolRunner);
30
+ await server.start();
31
+ });
32
+ afterEach(async () => {
33
+ await server.stop();
34
+ rmSync(tempDir, { recursive: true, force: true });
35
+ });
36
+ // Helper to send request and receive response
37
+ const sendRequest = (request) => {
38
+ return new Promise((resolve, reject) => {
39
+ const client = createConnection(socketPath, () => {
40
+ client.write(encodeMessage(request));
41
+ client.end(); // Close connection after sending
42
+ });
43
+ let buffer = "";
44
+ client.on("data", (data) => {
45
+ buffer += data.toString();
46
+ });
47
+ client.on("close", () => {
48
+ try {
49
+ if (buffer.trim()) {
50
+ const response = decodeMessage(buffer.trim());
51
+ resolve(response);
52
+ }
53
+ else {
54
+ reject(new Error("No response received"));
55
+ }
56
+ }
57
+ catch (err) {
58
+ reject(err);
59
+ }
60
+ });
61
+ client.on("error", reject);
62
+ // Timeout after 5 seconds
63
+ setTimeout(() => {
64
+ client.destroy();
65
+ reject(new Error("Connection timeout"));
66
+ }, 5000);
67
+ });
68
+ };
69
+ describe("connection handling", () => {
70
+ it("accepts connections on the socket", async () => {
71
+ const request = {
72
+ type: "tool_request",
73
+ tool: "unknown",
74
+ args: [],
75
+ };
76
+ // Should not throw - connection is accepted and response received
77
+ const response = await sendRequest(request);
78
+ expect(response).toBeDefined();
79
+ });
80
+ it("handles multiple sequential requests", async () => {
81
+ const request = {
82
+ type: "tool_request",
83
+ tool: "unknown",
84
+ args: [],
85
+ };
86
+ const response1 = await sendRequest(request);
87
+ const response2 = await sendRequest(request);
88
+ expect(response1).toBeDefined();
89
+ expect(response2).toBeDefined();
90
+ });
91
+ });
92
+ describe("policy enforcement", () => {
93
+ it("denies tool not in agent's allowed list", async () => {
94
+ // "assistant" only has "kv" tool, not "browser"
95
+ const request = {
96
+ type: "tool_request",
97
+ tool: "browser",
98
+ args: ["navigate", "https://example.com"],
99
+ };
100
+ const response = await sendRequest(request);
101
+ expect(response.success).toBe(false);
102
+ expect(response.error).toContain("Permission denied");
103
+ expect(response.exitCode).toBe(1);
104
+ });
105
+ it("allows tool in agent's allowed list", async () => {
106
+ // Register a handler for the "kv" tool
107
+ toolRunner.registerHandler("kv", async () => ({
108
+ output: "OK",
109
+ exitCode: 0,
110
+ }));
111
+ const request = {
112
+ type: "tool_request",
113
+ tool: "kv",
114
+ args: ["set", "key", "value"],
115
+ };
116
+ const response = await sendRequest(request);
117
+ expect(response.success).toBe(true);
118
+ expect(response.output).toBe("OK");
119
+ expect(response.exitCode).toBe(0);
120
+ });
121
+ });
122
+ describe("tool execution", () => {
123
+ it("executes registered handler", async () => {
124
+ toolRunner.registerHandler("kv", async (args) => ({
125
+ output: `Got args: ${args.join(", ")}`,
126
+ exitCode: 0,
127
+ }));
128
+ const request = {
129
+ type: "tool_request",
130
+ tool: "kv",
131
+ args: ["get", "mykey"],
132
+ };
133
+ const response = await sendRequest(request);
134
+ expect(response.success).toBe(true);
135
+ expect(response.output).toBe("Got args: get, mykey");
136
+ });
137
+ it("returns error for unknown tool (no handler)", async () => {
138
+ // "kv" is allowed but no handler registered
139
+ const request = {
140
+ type: "tool_request",
141
+ tool: "kv",
142
+ args: ["get", "key"],
143
+ };
144
+ const response = await sendRequest(request);
145
+ // ToolRunner returns "Unknown tool" in output, not error
146
+ // success is false because exitCode is 1
147
+ expect(response.success).toBe(false);
148
+ expect(response.exitCode).toBe(1);
149
+ // The error message is in output field when tool returns non-zero exit
150
+ expect(response.output ?? response.error).toBeDefined();
151
+ });
152
+ it("handles handler errors", async () => {
153
+ toolRunner.registerHandler("kv", async () => {
154
+ throw new Error("Handler crashed");
155
+ });
156
+ const request = {
157
+ type: "tool_request",
158
+ tool: "kv",
159
+ args: [],
160
+ };
161
+ const response = await sendRequest(request);
162
+ expect(response.success).toBe(false);
163
+ expect(response.error).toContain("Handler crashed");
164
+ expect(response.exitCode).toBe(1);
165
+ });
166
+ });
167
+ describe("message protocol", () => {
168
+ it("rejects unknown message types", async () => {
169
+ const response = await new Promise((resolve, reject) => {
170
+ const client = createConnection(socketPath, () => {
171
+ client.write(Buffer.from(JSON.stringify({ type: "unknown" }) + "\n"));
172
+ client.end();
173
+ });
174
+ let buffer = "";
175
+ client.on("data", (data) => {
176
+ buffer += data.toString();
177
+ });
178
+ client.on("close", () => {
179
+ try {
180
+ resolve(decodeMessage(buffer.trim()));
181
+ }
182
+ catch (err) {
183
+ reject(err);
184
+ }
185
+ });
186
+ client.on("error", reject);
187
+ setTimeout(() => {
188
+ client.destroy();
189
+ reject(new Error("Timeout"));
190
+ }, 5000);
191
+ });
192
+ expect(response.success).toBe(false);
193
+ expect(response.error).toContain("Unknown message type");
194
+ });
195
+ it("handles malformed JSON", async () => {
196
+ const response = await new Promise((resolve, reject) => {
197
+ const client = createConnection(socketPath, () => {
198
+ client.write(Buffer.from("not valid json\n"));
199
+ client.end();
200
+ });
201
+ let buffer = "";
202
+ client.on("data", (data) => {
203
+ buffer += data.toString();
204
+ });
205
+ client.on("close", () => {
206
+ try {
207
+ resolve(decodeMessage(buffer.trim()));
208
+ }
209
+ catch (err) {
210
+ reject(err);
211
+ }
212
+ });
213
+ client.on("error", reject);
214
+ setTimeout(() => {
215
+ client.destroy();
216
+ reject(new Error("Timeout"));
217
+ }, 5000);
218
+ });
219
+ expect(response.success).toBe(false);
220
+ expect(response.error).toContain("Invalid request");
221
+ });
222
+ it("handles multiple messages in single data chunk", async () => {
223
+ toolRunner.registerHandler("kv", async (args) => ({
224
+ output: `args: ${args[0]}`,
225
+ exitCode: 0,
226
+ }));
227
+ const responses = await new Promise((resolve, reject) => {
228
+ const client = createConnection(socketPath, () => {
229
+ // Send two messages at once
230
+ const msg1 = { type: "tool_request", tool: "kv", args: ["first"] };
231
+ const msg2 = { type: "tool_request", tool: "kv", args: ["second"] };
232
+ client.write(encodeMessage(msg1));
233
+ client.write(encodeMessage(msg2));
234
+ client.end();
235
+ });
236
+ let buffer = "";
237
+ client.on("data", (data) => {
238
+ buffer += data.toString();
239
+ });
240
+ client.on("close", () => {
241
+ try {
242
+ const lines = buffer.trim().split("\n");
243
+ const responses = lines.map((line) => decodeMessage(line.trim()));
244
+ resolve(responses);
245
+ }
246
+ catch (err) {
247
+ reject(err);
248
+ }
249
+ });
250
+ client.on("error", reject);
251
+ setTimeout(() => {
252
+ client.destroy();
253
+ reject(new Error("Timeout"));
254
+ }, 5000);
255
+ });
256
+ expect(responses.length).toBe(2);
257
+ expect(responses[0].output).toBe("args: first");
258
+ expect(responses[1].output).toBe("args: second");
259
+ });
260
+ });
261
+ describe("audit logging", () => {
262
+ it("logs allowed tool calls", async () => {
263
+ toolRunner.registerHandler("kv", async () => ({
264
+ output: "OK",
265
+ exitCode: 0,
266
+ }));
267
+ await sendRequest({ type: "tool_request", tool: "kv", args: ["test"] });
268
+ const { readFileSync } = await import("fs");
269
+ const log = readFileSync(auditLogPath, "utf-8");
270
+ const lines = log.trim().split("\n");
271
+ // Should have "started" and "finished" entries
272
+ expect(lines.length).toBeGreaterThanOrEqual(2);
273
+ const finishedEntry = JSON.parse(lines[lines.length - 1]);
274
+ expect(finishedEntry.tool).toBe("kv");
275
+ expect(finishedEntry.decision).toBe("allowed");
276
+ });
277
+ it("logs denied tool calls", async () => {
278
+ // "browser" is not allowed for "assistant"
279
+ await sendRequest({ type: "tool_request", tool: "browser", args: [] });
280
+ const { readFileSync } = await import("fs");
281
+ const log = readFileSync(auditLogPath, "utf-8");
282
+ const lines = log.trim().split("\n");
283
+ const entry = JSON.parse(lines[0]);
284
+ expect(entry.tool).toBe("browser");
285
+ expect(entry.decision).toBe("denied");
286
+ });
287
+ });
288
+ describe("server lifecycle", () => {
289
+ it("removes socket file on stop", async () => {
290
+ const { existsSync } = await import("fs");
291
+ expect(existsSync(socketPath)).toBe(true);
292
+ await server.stop();
293
+ expect(existsSync(socketPath)).toBe(false);
294
+ });
295
+ it("cleans up stale socket file on start", async () => {
296
+ const { writeFileSync, existsSync } = await import("fs");
297
+ // Stop the first server
298
+ await server.stop();
299
+ // Create a stale socket file
300
+ writeFileSync(socketPath, "stale");
301
+ // Start a new server - should clean up the stale file
302
+ const newServer = new AgentSocketServer("assistant", socketPath, auditLogger, policy, toolRunner);
303
+ await newServer.start();
304
+ // Should be able to connect
305
+ const request = {
306
+ type: "tool_request",
307
+ tool: "unknown",
308
+ args: [],
309
+ };
310
+ const response = await new Promise((resolve, reject) => {
311
+ const client = createConnection(socketPath, () => {
312
+ client.write(encodeMessage(request));
313
+ client.end();
314
+ });
315
+ let buffer = "";
316
+ client.on("data", (data) => {
317
+ buffer += data.toString();
318
+ });
319
+ client.on("close", () => {
320
+ resolve(decodeMessage(buffer.trim()));
321
+ });
322
+ client.on("error", reject);
323
+ setTimeout(() => {
324
+ client.destroy();
325
+ reject(new Error("Timeout"));
326
+ }, 5000);
327
+ });
328
+ expect(response).toBeDefined();
329
+ await newServer.stop();
330
+ });
331
+ });
332
+ });
333
+ //# sourceMappingURL=server.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.spec.js","sourceRoot":"","sources":["../../src/socket/server.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Shared test fixtures and factories.
3
+ * Import from './test/fixtures.js' (relative to src/).
4
+ */
5
+ import type { BeigeConfig, AgentConfig, ToolConfig, LLMProviderConfig, SkillConfig } from "../config/schema.js";
6
+ /**
7
+ * Minimal valid config for testing.
8
+ */
9
+ export declare function createMinimalConfig(overrides?: Partial<BeigeConfig>): BeigeConfig;
10
+ /**
11
+ * Full config with tools and multiple agents.
12
+ */
13
+ export declare function createFullConfig(): BeigeConfig;
14
+ /**
15
+ * Create a mock agent config.
16
+ */
17
+ export declare function createAgentConfig(overrides?: Partial<AgentConfig>): AgentConfig;
18
+ /**
19
+ * Create a mock tool config.
20
+ */
21
+ export declare function createToolConfig(overrides?: Partial<ToolConfig>): ToolConfig;
22
+ /**
23
+ * Create a mock provider config.
24
+ */
25
+ export declare function createProviderConfig(overrides?: Partial<LLMProviderConfig>): LLMProviderConfig;
26
+ /**
27
+ * Create a mock skill config.
28
+ */
29
+ export declare function createSkillConfig(overrides?: Partial<SkillConfig>): SkillConfig;
30
+ /**
31
+ * Sample tool manifest for testing.
32
+ */
33
+ export declare const sampleToolManifest: {
34
+ name: string;
35
+ description: string;
36
+ commands: string[];
37
+ target: "gateway";
38
+ };
39
+ /**
40
+ * Create a temp directory for tests that need file system access.
41
+ * Returns the directory path and a cleanup function.
42
+ */
43
+ export declare function createTempDir(): {
44
+ path: string;
45
+ cleanup: () => void;
46
+ };
47
+ //# sourceMappingURL=fixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../src/test/fixtures.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEhH;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,GAAE,OAAO,CAAC,WAAW,CAAM,GAAG,WAAW,CAiBrF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,WAAW,CA6C9C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,GAAE,OAAO,CAAC,WAAW,CAAM,GAAG,WAAW,CAMnF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,GAAE,OAAO,CAAC,UAAU,CAAM,GAAG,UAAU,CAMhF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,GAAE,OAAO,CAAC,iBAAiB,CAAM,GAAG,iBAAiB,CAKlG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,GAAE,OAAO,CAAC,WAAW,CAAM,GAAG,WAAW,CAKnF;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;CAK9B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,aAAa,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,CAkBrE"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Shared test fixtures and factories.
3
+ * Import from './test/fixtures.js' (relative to src/).
4
+ */
5
+ /**
6
+ * Minimal valid config for testing.
7
+ */
8
+ export function createMinimalConfig(overrides = {}) {
9
+ return {
10
+ llm: {
11
+ providers: {
12
+ anthropic: { apiKey: "test-key" },
13
+ },
14
+ },
15
+ tools: {},
16
+ agents: {
17
+ assistant: {
18
+ model: { provider: "anthropic", model: "claude-sonnet-4-20250514" },
19
+ tools: [],
20
+ },
21
+ },
22
+ channels: {},
23
+ ...overrides,
24
+ };
25
+ }
26
+ /**
27
+ * Full config with tools and multiple agents.
28
+ */
29
+ export function createFullConfig() {
30
+ return {
31
+ llm: {
32
+ providers: {
33
+ anthropic: { apiKey: "test-anthropic-key" },
34
+ openai: { apiKey: "test-openai-key", baseUrl: "https://api.openai.com/v1" },
35
+ },
36
+ },
37
+ tools: {
38
+ kv: {
39
+ path: "/tools/kv",
40
+ target: "gateway",
41
+ },
42
+ browser: {
43
+ path: "/tools/browser",
44
+ target: "sandbox",
45
+ config: { headless: true },
46
+ },
47
+ },
48
+ agents: {
49
+ assistant: {
50
+ model: { provider: "anthropic", model: "claude-sonnet-4-20250514" },
51
+ tools: ["kv"],
52
+ },
53
+ researcher: {
54
+ model: { provider: "anthropic", model: "claude-sonnet-4-20250514", thinkingLevel: "medium" },
55
+ fallbackModels: [
56
+ { provider: "openai", model: "gpt-4o" },
57
+ ],
58
+ tools: ["kv", "browser"],
59
+ },
60
+ restricted: {
61
+ model: { provider: "anthropic", model: "claude-sonnet-4-20250514" },
62
+ tools: [],
63
+ },
64
+ },
65
+ channels: {
66
+ telegram: {
67
+ enabled: true,
68
+ token: "test-token",
69
+ allowedUsers: [123456789],
70
+ agentMapping: { default: "assistant" },
71
+ },
72
+ },
73
+ };
74
+ }
75
+ /**
76
+ * Create a mock agent config.
77
+ */
78
+ export function createAgentConfig(overrides = {}) {
79
+ return {
80
+ model: { provider: "anthropic", model: "claude-sonnet-4-20250514" },
81
+ tools: [],
82
+ ...overrides,
83
+ };
84
+ }
85
+ /**
86
+ * Create a mock tool config.
87
+ */
88
+ export function createToolConfig(overrides = {}) {
89
+ return {
90
+ path: "/tools/test",
91
+ target: "gateway",
92
+ ...overrides,
93
+ };
94
+ }
95
+ /**
96
+ * Create a mock provider config.
97
+ */
98
+ export function createProviderConfig(overrides = {}) {
99
+ return {
100
+ apiKey: "test-key",
101
+ ...overrides,
102
+ };
103
+ }
104
+ /**
105
+ * Create a mock skill config.
106
+ */
107
+ export function createSkillConfig(overrides = {}) {
108
+ return {
109
+ path: "/skills/test",
110
+ ...overrides,
111
+ };
112
+ }
113
+ /**
114
+ * Sample tool manifest for testing.
115
+ */
116
+ export const sampleToolManifest = {
117
+ name: "test-tool",
118
+ description: "A test tool for unit tests",
119
+ commands: ["run <arg>", "status"],
120
+ target: "gateway",
121
+ };
122
+ /**
123
+ * Create a temp directory for tests that need file system access.
124
+ * Returns the directory path and a cleanup function.
125
+ */
126
+ export function createTempDir() {
127
+ const { tmpdir } = require("os");
128
+ const { mkdirSync, rmSync } = require("fs");
129
+ const { join } = require("path");
130
+ const path = join(tmpdir(), `beige-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
131
+ mkdirSync(path, { recursive: true });
132
+ return {
133
+ path,
134
+ cleanup: () => {
135
+ try {
136
+ rmSync(path, { recursive: true, force: true });
137
+ }
138
+ catch {
139
+ // Ignore cleanup errors
140
+ }
141
+ },
142
+ };
143
+ }
144
+ //# sourceMappingURL=fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../../src/test/fixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from "./schema.js";
2
+ export * from "./registry.js";
3
+ export * from "./installer.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/toolkit/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from "./schema.js";
2
+ export * from "./registry.js";
3
+ export * from "./installer.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/toolkit/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Toolkit installer.
3
+ *
4
+ * Handles installing toolkits from various sources:
5
+ * - npm packages (@scope/name or name)
6
+ * - GitHub repositories (github:owner/repo)
7
+ * - Local paths (./path or /absolute/path)
8
+ * - URLs (https://...)
9
+ */
10
+ import { type ValidatedToolkit } from "./schema.js";
11
+ export interface InstallResult {
12
+ success: boolean;
13
+ toolkit?: ValidatedToolkit;
14
+ installed?: boolean;
15
+ updated?: boolean;
16
+ error?: string;
17
+ conflicts?: string[];
18
+ }
19
+ export declare function installToolkit(sourceStr: string, options?: {
20
+ force?: boolean;
21
+ }): Promise<InstallResult>;
22
+ export declare function removeToolkit(name: string): {
23
+ success: boolean;
24
+ error?: string;
25
+ };
26
+ //# sourceMappingURL=installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/toolkit/installer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,EAEL,KAAK,gBAAgB,EAGtB,MAAM,aAAa,CAAC;AAerB,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAwCD,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,aAAa,CAAC,CAqFjH;AA2ID,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAUhF"}