@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,144 @@
1
+ /**
2
+ * Beige first-time setup.
3
+ *
4
+ * Copies bundled tool packages into ~/.beige/tools/ and writes a default
5
+ * config.json5 when none exists. All operations are safe to re-run: existing
6
+ * files/directories are never overwritten.
7
+ *
8
+ * Source-install detection
9
+ * ────────────────────────
10
+ * When beige is run from a git clone (i.e. the developer installed deps with
11
+ * `npm install` / `pnpm install` but did not publish to npm) there is a `.git`
12
+ * directory sitting next to `package.json`. In that case we skip automatic
13
+ * first-run setup entirely — the developer works directly from the repo.
14
+ *
15
+ * npm-global-install detection
16
+ * ────────────────────────────
17
+ * When installed via `npm install -g beige` there is no `.git` directory in the
18
+ * package root, so `isSourceInstall()` returns false and setup can proceed.
19
+ */
20
+ import { existsSync, mkdirSync, writeFileSync, readdirSync, cpSync, statSync, } from "fs";
21
+ import { resolve, join } from "path";
22
+ import { homedir } from "os";
23
+ import { fileURLToPath } from "url";
24
+ // ── Resolve package root ─────────────────────────────────────────────────────
25
+ /** Absolute path to the beige package root (where package.json lives). */
26
+ function packageRoot() {
27
+ // In compiled output this file is at <root>/dist/install.js
28
+ const distDir = fileURLToPath(new URL(".", import.meta.url));
29
+ return resolve(distDir, "..");
30
+ }
31
+ // ── Source-install guard ─────────────────────────────────────────────────────
32
+ /**
33
+ * Returns true when beige is being run directly from a git checkout.
34
+ * A `.git` entry at the package root is the canonical signal.
35
+ */
36
+ export function isSourceInstall() {
37
+ return existsSync(resolve(packageRoot(), ".git"));
38
+ }
39
+ // ── Default config template ──────────────────────────────────────────────────
40
+ function defaultConfig(kvToolPath) {
41
+ return `{
42
+ // Beige default configuration — generated by 'beige setup'.
43
+ // Edit freely. This file will never be overwritten by beige.
44
+
45
+ llm: {
46
+ providers: {
47
+ anthropic: {
48
+ // Set your API key here or via the ANTHROPIC_API_KEY environment variable.
49
+ apiKey: "\${ANTHROPIC_API_KEY}",
50
+ },
51
+ },
52
+ },
53
+
54
+ tools: {
55
+ kv: {
56
+ // Persists key-value data across sessions on the gateway host.
57
+ path: "${kvToolPath}",
58
+ target: "gateway",
59
+ },
60
+ },
61
+
62
+ agents: {
63
+ beige: {
64
+ model: {
65
+ provider: "anthropic",
66
+ model: "claude-sonnet-4-20250514",
67
+ thinkingLevel: "off",
68
+ },
69
+ tools: ["kv"],
70
+ sandbox: {
71
+ image: "beige-sandbox:latest",
72
+ },
73
+ },
74
+ },
75
+ }
76
+ `;
77
+ }
78
+ // ── Helpers ──────────────────────────────────────────────────────────────────
79
+ function ensureDir(p) {
80
+ mkdirSync(p, { recursive: true });
81
+ }
82
+ /**
83
+ * Copy src → dst only if dst does not already exist.
84
+ * Works for both files and directories (recursive).
85
+ * Returns true when the copy was performed.
86
+ */
87
+ function safeCopy(src, dst) {
88
+ if (existsSync(dst))
89
+ return false;
90
+ const stat = statSync(src);
91
+ if (stat.isDirectory()) {
92
+ cpSync(src, dst, { recursive: true });
93
+ }
94
+ else {
95
+ writeFileSync(dst, ""); // create placeholder so cpSync isn't needed for files
96
+ cpSync(src, dst);
97
+ }
98
+ return true;
99
+ }
100
+ /**
101
+ * Run beige first-time setup.
102
+ *
103
+ * @param force When true, run even on a source install (used by `beige setup`).
104
+ */
105
+ export async function runSetup(options = {}) {
106
+ const created = [];
107
+ const skipped = [];
108
+ if (!options.force && isSourceInstall()) {
109
+ // Never auto-setup when running from source.
110
+ return { created, skipped };
111
+ }
112
+ const beigeDir = resolve(homedir(), ".beige");
113
+ const toolsDst = resolve(beigeDir, "tools");
114
+ const configDst = resolve(beigeDir, "config.json5");
115
+ ensureDir(beigeDir);
116
+ // ── Copy bundled tools ─────────────────────────────────────────────────────
117
+ const toolsSrc = resolve(packageRoot(), "tools");
118
+ if (existsSync(toolsSrc)) {
119
+ ensureDir(toolsDst);
120
+ const toolEntries = readdirSync(toolsSrc);
121
+ for (const entry of toolEntries) {
122
+ const src = join(toolsSrc, entry);
123
+ const dst = join(toolsDst, entry);
124
+ const copied = safeCopy(src, dst);
125
+ if (copied) {
126
+ created.push(dst);
127
+ }
128
+ else {
129
+ skipped.push(dst);
130
+ }
131
+ }
132
+ }
133
+ // ── Write default config ───────────────────────────────────────────────────
134
+ if (existsSync(configDst)) {
135
+ skipped.push(configDst);
136
+ }
137
+ else {
138
+ const kvToolPath = resolve(toolsDst, "kv");
139
+ writeFileSync(configDst, defaultConfig(kvToolPath), "utf-8");
140
+ created.push(configDst);
141
+ }
142
+ return { created, skipped };
143
+ }
144
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import type { BeigeConfig } from "../config/schema.js";
2
+ import type { LoadedTool } from "../tools/registry.js";
3
+ import type { LoadedSkill } from "../skills/registry.js";
4
+ export interface ExecResult {
5
+ stdout: string;
6
+ stderr: string;
7
+ exitCode: number;
8
+ }
9
+ /**
10
+ * Manages Docker sandbox containers for agents.
11
+ */
12
+ export declare class SandboxManager {
13
+ private config;
14
+ private loadedTools;
15
+ private loadedSkills;
16
+ private docker;
17
+ private containers;
18
+ private beigeDir;
19
+ constructor(config: BeigeConfig, loadedTools: Map<string, LoadedTool>, loadedSkills: Map<string, LoadedSkill>);
20
+ /**
21
+ * Create and start a sandbox container for an agent.
22
+ */
23
+ createSandbox(agentName: string): Promise<void>;
24
+ /**
25
+ * Execute a command inside an agent's sandbox container.
26
+ */
27
+ exec(agentName: string, cmd: string[], stdin?: string, timeout?: number, env?: Record<string, string>): Promise<ExecResult>;
28
+ /**
29
+ * Remove an agent's sandbox container.
30
+ */
31
+ removeSandbox(agentName: string): Promise<void>;
32
+ /**
33
+ * Stop all sandbox containers.
34
+ */
35
+ shutdown(): Promise<void>;
36
+ /**
37
+ * Check which agents use a beige-managed image and, if any do, ensure the
38
+ * image is built before containers are created.
39
+ *
40
+ * - Skipped entirely when no agent references a beige-sandbox image.
41
+ * - Skipped when the image already exists (unless `force` is true).
42
+ * - Builds one image per unique beige image tag referenced across all agents.
43
+ */
44
+ ensureSandboxImage(force?: boolean): Promise<void>;
45
+ /**
46
+ * Build the beige-sandbox Docker image from the bundled Dockerfile.
47
+ * Streams build output to stdout so the user can see progress.
48
+ */
49
+ private buildSandboxImage;
50
+ /**
51
+ * Returns true when `image` is a beige-managed image (i.e. one we build).
52
+ */
53
+ private isBeigeImage;
54
+ /**
55
+ * Returns true when the given Docker image tag already exists locally.
56
+ */
57
+ private imageExists;
58
+ /**
59
+ * Generate tool launcher scripts for an agent.
60
+ */
61
+ private generateLaunchers;
62
+ }
63
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/sandbox/manager.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,qBAAqB,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAMzD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,cAAc;IAMvB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,YAAY;IAPtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAuC;IACzD,OAAO,CAAC,QAAQ,CAAS;gBAGf,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EACpC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC;IAOhD;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA8ErD;;OAEG;IACG,IAAI,CACR,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EAAE,EACb,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,EAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,OAAO,CAAC,UAAU,CAAC;IA2FtB;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYrD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B;;;;;;;OAOG;IACG,kBAAkB,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBtD;;;OAGG;YACW,iBAAiB;IAmC/B;;OAEG;IACH,OAAO,CAAC,YAAY;IAKpB;;OAEG;YACW,WAAW;IASzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAuB1B"}
@@ -0,0 +1,294 @@
1
+ import Docker from "dockerode";
2
+ import { mkdirSync, writeFileSync, chmodSync } from "fs";
3
+ import { resolve, join } from "path";
4
+ import { homedir } from "os";
5
+ import { PassThrough } from "stream";
6
+ import { fileURLToPath } from "url";
7
+ /** The image name prefix we build and manage. Any image starting with this is ours. */
8
+ const BEIGE_IMAGE_PREFIX = "beige-sandbox";
9
+ const BEIGE_IMAGE_DEFAULT = "beige-sandbox:latest";
10
+ /**
11
+ * Manages Docker sandbox containers for agents.
12
+ */
13
+ export class SandboxManager {
14
+ config;
15
+ loadedTools;
16
+ loadedSkills;
17
+ docker;
18
+ containers = new Map();
19
+ beigeDir;
20
+ constructor(config, loadedTools, loadedSkills) {
21
+ this.config = config;
22
+ this.loadedTools = loadedTools;
23
+ this.loadedSkills = loadedSkills;
24
+ this.docker = new Docker();
25
+ this.beigeDir = resolve(homedir(), ".beige");
26
+ mkdirSync(this.beigeDir, { recursive: true });
27
+ }
28
+ /**
29
+ * Create and start a sandbox container for an agent.
30
+ */
31
+ async createSandbox(agentName) {
32
+ const agentConfig = this.config.agents[agentName];
33
+ if (!agentConfig) {
34
+ throw new Error(`Unknown agent: ${agentName}`);
35
+ }
36
+ const image = agentConfig.sandbox?.image ?? "beige-sandbox:latest";
37
+ // Prepare host directories
38
+ const workspaceDir = resolve(this.beigeDir, "agents", agentName, "workspace");
39
+ const socketsDir = resolve(this.beigeDir, "sockets");
40
+ const socketPath = resolve(socketsDir, `${agentName}.sock`);
41
+ const launchersDir = resolve(this.beigeDir, "agents", agentName, "launchers");
42
+ mkdirSync(workspaceDir, { recursive: true });
43
+ mkdirSync(socketsDir, { recursive: true });
44
+ mkdirSync(launchersDir, { recursive: true });
45
+ // Generate tool launcher scripts
46
+ this.generateLaunchers(agentName, agentConfig, launchersDir);
47
+ // Build mount bindings
48
+ const binds = [
49
+ `${workspaceDir}:/workspace:rw`,
50
+ `${launchersDir}:/tools/bin:ro`,
51
+ `${socketPath}:/beige/gateway.sock`,
52
+ ];
53
+ // Mount tool packages (read-only)
54
+ for (const toolName of agentConfig.tools) {
55
+ const tool = this.loadedTools.get(toolName);
56
+ if (tool) {
57
+ binds.push(`${tool.path}:/tools/packages/${toolName}:ro`);
58
+ }
59
+ }
60
+ // Mount skill packages (read-only)
61
+ for (const skillName of agentConfig.skills ?? []) {
62
+ const skill = this.loadedSkills.get(skillName);
63
+ if (skill) {
64
+ binds.push(`${skill.path}:/skills/${skillName}:ro`);
65
+ }
66
+ }
67
+ // Extra mounts from config
68
+ if (agentConfig.sandbox?.extraMounts) {
69
+ for (const [host, container] of Object.entries(agentConfig.sandbox.extraMounts)) {
70
+ binds.push(`${host}:${container}`);
71
+ }
72
+ }
73
+ // Remove existing container if any
74
+ await this.removeSandbox(agentName);
75
+ console.log(`[SANDBOX] Creating container for agent '${agentName}' (image: ${image})`);
76
+ const container = await this.docker.createContainer({
77
+ Image: image,
78
+ name: `beige-${agentName}`,
79
+ Hostname: `beige-${agentName}`,
80
+ WorkingDir: "/workspace",
81
+ Cmd: ["sleep", "infinity"], // Keep container running
82
+ HostConfig: {
83
+ Binds: binds,
84
+ // No env vars from host — agent cannot access gateway secrets
85
+ },
86
+ // Only pass safe, non-secret env vars
87
+ Env: Object.entries(agentConfig.sandbox?.extraEnv ?? {}).map(([k, v]) => `${k}=${v}`),
88
+ });
89
+ await container.start();
90
+ this.containers.set(agentName, container);
91
+ console.log(`[SANDBOX] Container started for agent '${agentName}' (${container.id.slice(0, 12)})`);
92
+ }
93
+ /**
94
+ * Execute a command inside an agent's sandbox container.
95
+ */
96
+ async exec(agentName, cmd, stdin, timeout, env) {
97
+ const container = this.containers.get(agentName);
98
+ if (!container) {
99
+ throw new Error(`No sandbox running for agent: ${agentName}`);
100
+ }
101
+ const agentConfig = this.config.agents[agentName];
102
+ const baseEnv = Object.entries(agentConfig?.sandbox?.extraEnv ?? {}).map(([k, v]) => `${k}=${v}`);
103
+ const additionalEnv = env ? Object.entries(env).map(([k, v]) => `${k}=${v}`) : [];
104
+ const exec = await container.exec({
105
+ Cmd: cmd,
106
+ AttachStdout: true,
107
+ AttachStderr: true,
108
+ AttachStdin: !!stdin,
109
+ WorkingDir: "/workspace",
110
+ Env: [...baseEnv, ...additionalEnv],
111
+ });
112
+ return new Promise((resolveExec, reject) => {
113
+ const timeoutMs = timeout ?? 120_000;
114
+ let timer;
115
+ exec.start({ hijack: !!stdin, stdin: !!stdin }, (err, stream) => {
116
+ if (err)
117
+ return reject(err);
118
+ let stdout = "";
119
+ let stderr = "";
120
+ if (stdin) {
121
+ // In hijack mode, we get a raw stream
122
+ stream.write(stdin);
123
+ stream.end();
124
+ // Demux the stream
125
+ const stdoutStream = new PassThrough();
126
+ const stderrStream = new PassThrough();
127
+ container.modem.demuxStream(stream, stdoutStream, stderrStream);
128
+ stdoutStream.on("data", (chunk) => {
129
+ stdout += chunk.toString();
130
+ });
131
+ stderrStream.on("data", (chunk) => {
132
+ stderr += chunk.toString();
133
+ });
134
+ stream.on("end", async () => {
135
+ clearTimeout(timer);
136
+ const inspect = await exec.inspect();
137
+ resolveExec({
138
+ stdout,
139
+ stderr,
140
+ exitCode: inspect.ExitCode ?? 1,
141
+ });
142
+ });
143
+ }
144
+ else {
145
+ // Non-hijack mode: use demuxStream
146
+ const stdoutStream = new PassThrough();
147
+ const stderrStream = new PassThrough();
148
+ container.modem.demuxStream(stream, stdoutStream, stderrStream);
149
+ stdoutStream.on("data", (chunk) => {
150
+ stdout += chunk.toString();
151
+ });
152
+ stderrStream.on("data", (chunk) => {
153
+ stderr += chunk.toString();
154
+ });
155
+ stream.on("end", async () => {
156
+ clearTimeout(timer);
157
+ const inspect = await exec.inspect();
158
+ resolveExec({
159
+ stdout,
160
+ stderr,
161
+ exitCode: inspect.ExitCode ?? 1,
162
+ });
163
+ });
164
+ }
165
+ timer = setTimeout(() => {
166
+ stream.destroy();
167
+ reject(new Error(`Execution timed out after ${timeoutMs}ms`));
168
+ }, timeoutMs);
169
+ });
170
+ });
171
+ }
172
+ /**
173
+ * Remove an agent's sandbox container.
174
+ */
175
+ async removeSandbox(agentName) {
176
+ // Try to remove by name
177
+ try {
178
+ const existing = this.docker.getContainer(`beige-${agentName}`);
179
+ await existing.stop().catch(() => { });
180
+ await existing.remove({ force: true });
181
+ }
182
+ catch {
183
+ // Container doesn't exist, that's fine
184
+ }
185
+ this.containers.delete(agentName);
186
+ }
187
+ /**
188
+ * Stop all sandbox containers.
189
+ */
190
+ async shutdown() {
191
+ for (const [agentName] of this.containers) {
192
+ await this.removeSandbox(agentName);
193
+ }
194
+ }
195
+ /**
196
+ * Check which agents use a beige-managed image and, if any do, ensure the
197
+ * image is built before containers are created.
198
+ *
199
+ * - Skipped entirely when no agent references a beige-sandbox image.
200
+ * - Skipped when the image already exists (unless `force` is true).
201
+ * - Builds one image per unique beige image tag referenced across all agents.
202
+ */
203
+ async ensureSandboxImage(force = false) {
204
+ // Collect the set of beige-managed image tags that agents actually need.
205
+ const needed = new Set();
206
+ for (const agentConfig of Object.values(this.config.agents)) {
207
+ const image = agentConfig.sandbox?.image ?? BEIGE_IMAGE_DEFAULT;
208
+ if (this.isBeigeImage(image)) {
209
+ needed.add(image);
210
+ }
211
+ }
212
+ if (needed.size === 0) {
213
+ console.log("[SANDBOX] No agents use a beige-sandbox image — skipping image build");
214
+ return;
215
+ }
216
+ for (const image of needed) {
217
+ if (!force && (await this.imageExists(image))) {
218
+ console.log(`[SANDBOX] Image '${image}' already exists — skipping build`);
219
+ continue;
220
+ }
221
+ await this.buildSandboxImage(image);
222
+ }
223
+ }
224
+ /**
225
+ * Build the beige-sandbox Docker image from the bundled Dockerfile.
226
+ * Streams build output to stdout so the user can see progress.
227
+ */
228
+ async buildSandboxImage(tag) {
229
+ // sandbox/ lives two directories up from src/sandbox/manager.ts
230
+ // At runtime (dist/sandbox/manager.js) it's still two levels up from dist/.
231
+ // We resolve relative to this file using import.meta.url.
232
+ // src/sandbox/manager.ts → up to src/sandbox → up to project root
233
+ const projectRoot = resolve(fileURLToPath(new URL("../..", import.meta.url)));
234
+ const sandboxDir = resolve(projectRoot, "sandbox");
235
+ console.log(`[SANDBOX] Building image '${tag}' from ${sandboxDir} ...`);
236
+ const stream = await this.docker.buildImage({ context: sandboxDir, src: ["Dockerfile", "tool-client.ts"] }, { t: tag });
237
+ // Stream build output line-by-line
238
+ await new Promise((res, rej) => {
239
+ this.docker.modem.followProgress(stream, (err) => (err ? rej(err) : res()), (event) => {
240
+ if (event.error) {
241
+ process.stderr.write(`[SANDBOX BUILD] ${event.error}`);
242
+ }
243
+ else if (event.stream) {
244
+ process.stdout.write(`[SANDBOX BUILD] ${event.stream}`);
245
+ }
246
+ else if (event.status) {
247
+ process.stdout.write(`[SANDBOX BUILD] ${event.status}\n`);
248
+ }
249
+ });
250
+ });
251
+ console.log(`[SANDBOX] Image '${tag}' built successfully ✓`);
252
+ }
253
+ /**
254
+ * Returns true when `image` is a beige-managed image (i.e. one we build).
255
+ */
256
+ isBeigeImage(image) {
257
+ // Match "beige-sandbox", "beige-sandbox:latest", "beige-sandbox:custom-tag", etc.
258
+ return image === BEIGE_IMAGE_PREFIX || image.startsWith(`${BEIGE_IMAGE_PREFIX}:`);
259
+ }
260
+ /**
261
+ * Returns true when the given Docker image tag already exists locally.
262
+ */
263
+ async imageExists(image) {
264
+ try {
265
+ await this.docker.getImage(image).inspect();
266
+ return true;
267
+ }
268
+ catch {
269
+ return false;
270
+ }
271
+ }
272
+ /**
273
+ * Generate tool launcher scripts for an agent.
274
+ */
275
+ generateLaunchers(agentName, agentConfig, launchersDir) {
276
+ for (const toolName of agentConfig.tools) {
277
+ const tool = this.loadedTools.get(toolName);
278
+ if (!tool)
279
+ continue;
280
+ // Generate a launcher script that calls the tool-client
281
+ const launcher = [
282
+ "#!/bin/sh",
283
+ `# Auto-generated by beige gateway. DO NOT EDIT.`,
284
+ `# Tool: ${toolName} | Target: ${tool.manifest.target}`,
285
+ `exec /beige/tool-client "${toolName}" "$@"`,
286
+ "",
287
+ ].join("\n");
288
+ const launcherPath = join(launchersDir, toolName);
289
+ writeFileSync(launcherPath, launcher);
290
+ chmodSync(launcherPath, 0o755);
291
+ }
292
+ }
293
+ }
294
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/sandbox/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { loadSkillManifest, loadSkills, buildSkillContext, validateSkillDeps, type LoadedSkill, } from "./registry.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,UAAU,EACV,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,WAAW,GACjB,MAAM,eAAe,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { loadSkillManifest, loadSkills, buildSkillContext, validateSkillDeps, } from "./registry.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,UAAU,EACV,iBAAiB,EACjB,iBAAiB,GAElB,MAAM,eAAe,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { BeigeConfig, SkillManifest } from "../config/schema.js";
2
+ export interface LoadedSkill {
3
+ name: string;
4
+ manifest: SkillManifest;
5
+ path: string;
6
+ }
7
+ export declare function loadSkillManifest(skillPath: string): SkillManifest;
8
+ export declare function loadSkills(config: BeigeConfig): Promise<Map<string, LoadedSkill>>;
9
+ export declare function buildSkillContext(agentSkills: string[], loadedSkills: Map<string, LoadedSkill>): string;
10
+ export declare function validateSkillDeps(agentSkills: string[], agentTools: string[], loadedSkills: Map<string, LoadedSkill>): void;
11
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/skills/registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEtE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAID,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,CAsBlE;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAkBvF;AAED,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EAAE,EACrB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,GACrC,MAAM,CAsBR;AAED,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EAAE,EACrB,UAAU,EAAE,MAAM,EAAE,EACpB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,GACrC,IAAI,CA8BN"}
@@ -0,0 +1,86 @@
1
+ import { readFileSync, existsSync } from "fs";
2
+ import { join } from "path";
3
+ const DEFAULT_CONTEXT_FILE = "README.md";
4
+ export function loadSkillManifest(skillPath) {
5
+ const manifestPath = join(skillPath, "skill.json");
6
+ if (!existsSync(manifestPath)) {
7
+ throw new Error(`Skill manifest not found: ${manifestPath}`);
8
+ }
9
+ try {
10
+ const content = readFileSync(manifestPath, "utf-8");
11
+ const manifest = JSON.parse(content);
12
+ if (!manifest.name || !manifest.description) {
13
+ throw new Error(`Skill manifest at ${manifestPath} requires 'name' and 'description'`);
14
+ }
15
+ return manifest;
16
+ }
17
+ catch (err) {
18
+ if (err instanceof SyntaxError) {
19
+ throw new Error(`Invalid JSON in skill manifest: ${manifestPath}`);
20
+ }
21
+ throw err;
22
+ }
23
+ }
24
+ export async function loadSkills(config) {
25
+ const skills = new Map();
26
+ if (!config.skills) {
27
+ return skills;
28
+ }
29
+ for (const [name, skillConfig] of Object.entries(config.skills)) {
30
+ const manifest = loadSkillManifest(skillConfig.path);
31
+ const loaded = {
32
+ name,
33
+ manifest,
34
+ path: skillConfig.path,
35
+ };
36
+ skills.set(name, loaded);
37
+ }
38
+ return skills;
39
+ }
40
+ export function buildSkillContext(agentSkills, loadedSkills) {
41
+ if (agentSkills.length === 0) {
42
+ return "";
43
+ }
44
+ const lines = [
45
+ "## Available Skills",
46
+ "",
47
+ "Skills provide specialized knowledge. Read their documentation in `/skills/<name>/`.",
48
+ "",
49
+ ];
50
+ for (const skillName of agentSkills) {
51
+ const skill = loadedSkills.get(skillName);
52
+ if (!skill)
53
+ continue;
54
+ lines.push(`### ${skillName}`);
55
+ lines.push(`${skill.manifest.description} — see /skills/${skillName}/`);
56
+ lines.push("");
57
+ }
58
+ return lines.join("\n");
59
+ }
60
+ export function validateSkillDeps(agentSkills, agentTools, loadedSkills) {
61
+ for (const skillName of agentSkills) {
62
+ const skill = loadedSkills.get(skillName);
63
+ if (!skill)
64
+ continue;
65
+ const requires = skill.manifest.requires;
66
+ if (!requires)
67
+ continue;
68
+ // Check tool dependencies
69
+ if (requires.tools) {
70
+ for (const requiredTool of requires.tools) {
71
+ if (!agentTools.includes(requiredTool)) {
72
+ throw new Error(`Skill '${skillName}' requires tool '${requiredTool}' but it's not available to this agent`);
73
+ }
74
+ }
75
+ }
76
+ // Check skill dependencies
77
+ if (requires.skills) {
78
+ for (const requiredSkill of requires.skills) {
79
+ if (!agentSkills.includes(requiredSkill)) {
80
+ throw new Error(`Skill '${skillName}' requires skill '${requiredSkill}' but it's not available to this agent`);
81
+ }
82
+ }
83
+ }
84
+ }
85
+ }
86
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/skills/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=registry.spec.d.ts.map