@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,574 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import { createAgentSession, InteractiveMode, AuthStorage, ModelRegistry, SessionManager, SettingsManager, createExtensionRuntime, } from "@mariozechner/pi-coding-agent";
3
+ import { getModel } from "@mariozechner/pi-ai";
4
+ import { resolve, basename } from "path";
5
+ import { homedir } from "os";
6
+ import { readdirSync, existsSync } from "fs";
7
+ import { SessionSettingsStore, resolveSessionSetting } from "../gateway/session-settings.js";
8
+ import { BeigeSessionStore } from "../gateway/sessions.js";
9
+ import { loadSkills, buildSkillContext, validateSkillDeps } from "../skills/registry.js";
10
+ /**
11
+ * TUI channel — runs in a separate process and connects to the gateway HTTP API.
12
+ *
13
+ * Architecture:
14
+ * - The LLM session runs locally (pi InteractiveMode — full pi experience)
15
+ * - Core tool execution (read/write/patch/exec) is proxied to the gateway API
16
+ * - The gateway owns the sandboxes, audit, and policy enforcement
17
+ *
18
+ * This gives you the best of both worlds:
19
+ * - Full pi TUI (editor, streaming, model switching, compaction, history)
20
+ * - Sandboxed tool execution managed by the gateway
21
+ *
22
+ * Commands:
23
+ * - /new — Start a fresh session
24
+ * - /resume — Pick a previous session to continue
25
+ * - /sessions — List saved sessions for the current agent
26
+ * - /agent [name] — Switch to a different beige agent
27
+ * - /v on|off — Toggle verbose tool-call notifications
28
+ * - /verbose on|off — Same as /v
29
+ */
30
+ const DEFAULT_GATEWAY_URL = "http://127.0.0.1:7433";
31
+ export async function launchTUI(opts) {
32
+ const { config } = opts;
33
+ const gatewayUrl = opts.gatewayUrl ?? DEFAULT_GATEWAY_URL;
34
+ // Verify gateway is reachable
35
+ try {
36
+ const res = await fetch(`${gatewayUrl}/api/health`);
37
+ if (!res.ok)
38
+ throw new Error(`HTTP ${res.status}`);
39
+ console.log(`[TUI] Connected to gateway at ${gatewayUrl}`);
40
+ }
41
+ catch (err) {
42
+ console.error(`[TUI] Cannot connect to gateway at ${gatewayUrl}\n` +
43
+ ` Start the gateway first: beige\n` +
44
+ ` Error: ${err instanceof Error ? err.message : err}`);
45
+ process.exit(1);
46
+ }
47
+ // Fetch available agents from gateway
48
+ const agentsRes = await fetch(`${gatewayUrl}/api/agents`);
49
+ const { agents } = (await agentsRes.json());
50
+ const agentNames = agents.map((a) => a.name);
51
+ let agentName = opts.agentName;
52
+ if (!agentName) {
53
+ agentName = agentNames[0];
54
+ if (agentNames.length > 1) {
55
+ console.log(`[TUI] No agent specified, using '${agentName}'. Available: ${agentNames.join(", ")}`);
56
+ }
57
+ }
58
+ const agentInfo = agents.find((a) => a.name === agentName);
59
+ if (!agentInfo) {
60
+ console.error(`[TUI] Unknown agent '${agentName}'. Available: ${agentNames.join(", ")}`);
61
+ process.exit(1);
62
+ }
63
+ // ── Auth (LLM keys — session runs locally) ────────────────
64
+ const authStorage = AuthStorage.create();
65
+ for (const [provider, providerConfig] of Object.entries(config.llm.providers)) {
66
+ if (providerConfig.apiKey) {
67
+ authStorage.setRuntimeApiKey(provider, providerConfig.apiKey);
68
+ }
69
+ }
70
+ const modelRegistry = new ModelRegistry(authStorage);
71
+ // ── Load skills ────────────────────────────────────────────
72
+ const loadedSkills = await loadSkills(config);
73
+ // ── Shared state ──────────────────────────────────────────
74
+ const settingsStore = new SessionSettingsStore();
75
+ const sessionStore = new BeigeSessionStore();
76
+ const toolStartHandlerRef = { fn: undefined };
77
+ const state = {
78
+ agentName,
79
+ agentConfig: config.agents[agentName],
80
+ session: null,
81
+ toolStartHandlerRef,
82
+ gatewayUrl,
83
+ config,
84
+ authStorage,
85
+ modelRegistry,
86
+ settingsStore,
87
+ sessionStore,
88
+ loadedSkills,
89
+ };
90
+ // Wire initial verbose state
91
+ const sessionKey = BeigeSessionStore.tuiKey(agentName);
92
+ const initialVerbose = resolveSessionSetting("verbose", false, undefined, settingsStore.get(sessionKey, "verbose"));
93
+ if (initialVerbose) {
94
+ toolStartHandlerRef.fn = makeTUIToolStartHandler();
95
+ }
96
+ // ── Build extension with all commands ─────────────────────
97
+ const extensionsResult = await buildBeigeExtension(state, agentNames);
98
+ // ── Create initial session ────────────────────────────────
99
+ await createSession(state, extensionsResult);
100
+ if (!state.session) {
101
+ console.error("[TUI] Failed to create initial session");
102
+ process.exit(1);
103
+ }
104
+ // ── Launch pi TUI ─────────────────────────────────────────
105
+ console.log(`[TUI] Agent: ${agentName} (${state.agentConfig.model.provider}/${state.agentConfig.model.model})`);
106
+ console.log(`[TUI] Tools: ${agentInfo.tools.join(", ") || "(core only)"}`);
107
+ console.log(`[TUI] Verbose: ${initialVerbose ? "on" : "off"} — use /verbose on|off to toggle`);
108
+ console.log(`[TUI] Commands: /new, /resume, /sessions, /agent <name>, /verbose on|off`);
109
+ const mode = new InteractiveMode(state.session, {});
110
+ await mode.run();
111
+ }
112
+ // ── Session creation ──────────────────────────────────────────────────────────
113
+ /**
114
+ * Create a new pi session for the current agent in state.
115
+ */
116
+ async function createSession(state, extensionsResult) {
117
+ const { agentName, agentConfig, gatewayUrl, authStorage, modelRegistry, toolStartHandlerRef, loadedSkills } = state;
118
+ // Fetch agent info from gateway
119
+ const agentsRes = await fetch(`${gatewayUrl}/api/agents`);
120
+ const { agents } = (await agentsRes.json());
121
+ const agentInfo = agents.find((a) => a.name === agentName);
122
+ const toolNames = agentInfo?.tools ?? [];
123
+ const skillNames = agentInfo?.skills ?? [];
124
+ // Validate skill dependencies
125
+ validateSkillDeps(skillNames, toolNames, loadedSkills);
126
+ const model = resolveModel(agentConfig, modelRegistry);
127
+ const coreTools = createProxyTools(agentName, gatewayUrl, toolStartHandlerRef);
128
+ const toolContext = buildToolContext(toolNames);
129
+ const skillContext = buildSkillContext(skillNames, loadedSkills);
130
+ const systemPrompt = buildSystemPrompt(agentName, toolContext, skillContext);
131
+ const sessionsDir = resolve(homedir(), ".beige", "sessions", agentName);
132
+ let sessionManager;
133
+ try {
134
+ sessionManager = SessionManager.continueRecent(process.cwd(), sessionsDir);
135
+ }
136
+ catch {
137
+ sessionManager = SessionManager.create(process.cwd(), sessionsDir);
138
+ }
139
+ const resourceLoader = {
140
+ getExtensions: () => extensionsResult,
141
+ getSkills: () => ({ skills: [], diagnostics: [] }),
142
+ getPrompts: () => ({ prompts: [], diagnostics: [] }),
143
+ getThemes: () => ({ themes: [], diagnostics: [] }),
144
+ getAgentsFiles: () => ({ agentsFiles: [] }),
145
+ getSystemPrompt: () => systemPrompt,
146
+ getAppendSystemPrompt: () => [],
147
+ getPathMetadata: () => new Map(),
148
+ extendResources: () => { },
149
+ reload: async () => { },
150
+ };
151
+ const { session } = await createAgentSession({
152
+ model,
153
+ thinkingLevel: agentConfig.model.thinkingLevel ?? "off",
154
+ tools: [],
155
+ customTools: coreTools,
156
+ sessionManager,
157
+ settingsManager: SettingsManager.inMemory({
158
+ compaction: { enabled: true },
159
+ retry: { enabled: true, maxRetries: 3 },
160
+ }),
161
+ resourceLoader,
162
+ authStorage,
163
+ modelRegistry,
164
+ });
165
+ state.session = session;
166
+ }
167
+ // ── Beige extension factory ───────────────────────────────────────────────────
168
+ /**
169
+ * Build the inline "beige" extension that registers all TUI commands.
170
+ */
171
+ async function buildBeigeExtension(state, availableAgents) {
172
+ const runtime = createExtensionRuntime();
173
+ // ── /verbose and /v ───────────────────────────────────────
174
+ const handleVerbose = async (args, ctx) => {
175
+ const sessionKey = BeigeSessionStore.tuiKey(state.agentName);
176
+ const arg = args.trim().toLowerCase();
177
+ if (!arg || (arg !== "on" && arg !== "off")) {
178
+ const current = state.settingsStore.get(sessionKey, "verbose") ?? false;
179
+ ctx.ui.notify(`Verbose mode is currently ${current ? "ON" : "OFF"}. Usage: /verbose on|off`, "info");
180
+ return;
181
+ }
182
+ const enable = arg === "on";
183
+ state.settingsStore.set(sessionKey, "verbose", enable);
184
+ state.toolStartHandlerRef.fn = enable ? makeTUIToolStartHandler() : undefined;
185
+ ctx.ui.notify(enable
186
+ ? "🔊 Verbose mode ON — tool calls will be shown as they execute."
187
+ : "🔇 Verbose mode OFF — tool calls are hidden.", "info");
188
+ };
189
+ // ── /new ──────────────────────────────────────────────────
190
+ const handleNew = async (_args, ctx) => {
191
+ const oldSession = state.session;
192
+ if (oldSession) {
193
+ oldSession.dispose();
194
+ }
195
+ // Create new session directory entry
196
+ const sessionsDir = resolve(homedir(), ".beige", "sessions", state.agentName);
197
+ const sessionManager = SessionManager.create(process.cwd(), sessionsDir);
198
+ const resourceLoader = await buildResourceLoader(state);
199
+ const model = resolveModel(state.agentConfig, state.modelRegistry);
200
+ const coreTools = createProxyTools(state.agentName, state.gatewayUrl, state.toolStartHandlerRef);
201
+ const { session } = await createAgentSession({
202
+ model,
203
+ thinkingLevel: state.agentConfig.model.thinkingLevel ?? "off",
204
+ tools: [],
205
+ customTools: coreTools,
206
+ sessionManager,
207
+ settingsManager: SettingsManager.inMemory({
208
+ compaction: { enabled: true },
209
+ retry: { enabled: true, maxRetries: 3 },
210
+ }),
211
+ resourceLoader,
212
+ authStorage: state.authStorage,
213
+ modelRegistry: state.modelRegistry,
214
+ });
215
+ state.session = session;
216
+ ctx.ui.notify("🆕 New session started.", "info");
217
+ };
218
+ // ── /sessions ─────────────────────────────────────────────
219
+ const handleSessions = async (_args, ctx) => {
220
+ const sessions = listSessions(state.agentName);
221
+ if (sessions.length === 0) {
222
+ ctx.ui.notify("No saved sessions for this agent.", "info");
223
+ return;
224
+ }
225
+ const lines = [`📋 Sessions for agent '${state.agentName}':`, ""];
226
+ for (let i = 0; i < Math.min(sessions.length, 10); i++) {
227
+ const s = sessions[i];
228
+ const date = s.timestamp.toLocaleDateString();
229
+ const time = s.timestamp.toLocaleTimeString();
230
+ lines.push(` ${i + 1}. ${basename(s.file)} (${date} ${time})`);
231
+ }
232
+ if (sessions.length > 10) {
233
+ lines.push(` ... and ${sessions.length - 10} more`);
234
+ }
235
+ lines.push("");
236
+ lines.push("Use /resume <number> to continue a session.");
237
+ ctx.ui.notify(lines.join("\n"), "info");
238
+ };
239
+ // ── /resume ───────────────────────────────────────────────
240
+ const handleResume = async (args, ctx) => {
241
+ const sessions = listSessions(state.agentName);
242
+ if (sessions.length === 0) {
243
+ ctx.ui.notify("No saved sessions to resume.", "info");
244
+ return;
245
+ }
246
+ const arg = args.trim();
247
+ let index = parseInt(arg, 10) - 1;
248
+ if (isNaN(index) || index < 0 || index >= sessions.length) {
249
+ if (arg === "") {
250
+ // Show list if no arg provided
251
+ ctx.ui.notify(`Usage: /resume <number>\n\nSessions:\n${sessions
252
+ .slice(0, 5)
253
+ .map((s, i) => ` ${i + 1}. ${basename(s.file)}`)
254
+ .join("\n")}`, "info");
255
+ }
256
+ else {
257
+ ctx.ui.notify(`Invalid session number. Use /sessions to see available sessions.`, "error");
258
+ }
259
+ return;
260
+ }
261
+ const targetSession = sessions[index];
262
+ // Dispose old session
263
+ if (state.session) {
264
+ state.session.dispose();
265
+ }
266
+ // Resume the selected session
267
+ const sessionManager = SessionManager.open(targetSession.file);
268
+ const resourceLoader = await buildResourceLoader(state);
269
+ const model = resolveModel(state.agentConfig, state.modelRegistry);
270
+ const coreTools = createProxyTools(state.agentName, state.gatewayUrl, state.toolStartHandlerRef);
271
+ const { session } = await createAgentSession({
272
+ model,
273
+ thinkingLevel: state.agentConfig.model.thinkingLevel ?? "off",
274
+ tools: [],
275
+ customTools: coreTools,
276
+ sessionManager,
277
+ settingsManager: SettingsManager.inMemory({
278
+ compaction: { enabled: true },
279
+ retry: { enabled: true, maxRetries: 3 },
280
+ }),
281
+ resourceLoader,
282
+ authStorage: state.authStorage,
283
+ modelRegistry: state.modelRegistry,
284
+ });
285
+ state.session = session;
286
+ ctx.ui.notify(`📂 Resumed session: ${basename(targetSession.file)}`, "info");
287
+ };
288
+ // ── /agent ────────────────────────────────────────────────
289
+ const handleAgent = async (args, ctx) => {
290
+ const arg = args.trim();
291
+ if (!arg) {
292
+ ctx.ui.notify(`Current agent: ${state.agentName}\n\nAvailable agents:\n${availableAgents.map((a) => ` • ${a}`).join("\n")}\n\nUsage: /agent <name>`, "info");
293
+ return;
294
+ }
295
+ if (!availableAgents.includes(arg)) {
296
+ ctx.ui.notify(`Unknown agent '${arg}'. Available: ${availableAgents.join(", ")}`, "error");
297
+ return;
298
+ }
299
+ if (arg === state.agentName) {
300
+ ctx.ui.notify(`Already using agent '${arg}'.`, "info");
301
+ return;
302
+ }
303
+ // Switch to new agent
304
+ const newAgentConfig = state.config.agents[arg];
305
+ if (!newAgentConfig) {
306
+ ctx.ui.notify(`Agent '${arg}' not found in config.`, "error");
307
+ return;
308
+ }
309
+ // Dispose old session
310
+ if (state.session) {
311
+ state.session.dispose();
312
+ }
313
+ // Update state
314
+ state.agentName = arg;
315
+ state.agentConfig = newAgentConfig;
316
+ // Create new session for the new agent
317
+ const extensionsResult = await buildBeigeExtension(state, availableAgents);
318
+ await createSession(state, extensionsResult);
319
+ // Update verbose handler for new session key
320
+ const sessionKey = BeigeSessionStore.tuiKey(arg);
321
+ const verbose = resolveSessionSetting("verbose", false, undefined, state.settingsStore.get(sessionKey, "verbose"));
322
+ state.toolStartHandlerRef.fn = verbose ? makeTUIToolStartHandler() : undefined;
323
+ ctx.ui.notify(`🔄 Switched to agent '${arg}'.`, "info");
324
+ };
325
+ // Build the extension object
326
+ const extension = {
327
+ path: "<beige-tui>",
328
+ resolvedPath: "<beige-tui>",
329
+ handlers: new Map(),
330
+ tools: new Map(),
331
+ messageRenderers: new Map(),
332
+ commands: new Map([
333
+ ["verbose", { name: "verbose", description: "Toggle tool-call notifications: /verbose on|off", handler: handleVerbose }],
334
+ ["v", { name: "v", description: "Shorthand for /verbose: /v on|off", handler: handleVerbose }],
335
+ ["new", { name: "new", description: "Start a fresh session", handler: handleNew }],
336
+ ["sessions", { name: "sessions", description: "List saved sessions for the current agent", handler: handleSessions }],
337
+ ["resume", { name: "resume", description: "Resume a previous session: /resume <number>", handler: handleResume }],
338
+ ["agent", { name: "agent", description: "Switch to a different agent: /agent <name>", handler: handleAgent }],
339
+ ]),
340
+ flags: new Map(),
341
+ shortcuts: new Map(),
342
+ };
343
+ return { extensions: [extension], errors: [], runtime };
344
+ }
345
+ // ── Resource loader helper ────────────────────────────────────────────────────
346
+ async function buildResourceLoader(state) {
347
+ // Fetch agent info from gateway
348
+ const agentsRes = await fetch(`${state.gatewayUrl}/api/agents`);
349
+ const { agents } = (await agentsRes.json());
350
+ const agentInfo = agents.find((a) => a.name === state.agentName);
351
+ const toolNames = agentInfo?.tools ?? [];
352
+ const skillNames = agentInfo?.skills ?? [];
353
+ const toolContext = buildToolContext(toolNames);
354
+ const skillContext = buildSkillContext(skillNames, state.loadedSkills);
355
+ const systemPrompt = buildSystemPrompt(state.agentName, toolContext, skillContext);
356
+ // Build minimal extension result for resource loader
357
+ const runtime = createExtensionRuntime();
358
+ const extensionsResult = {
359
+ extensions: [],
360
+ errors: [],
361
+ runtime,
362
+ };
363
+ return {
364
+ getExtensions: () => extensionsResult,
365
+ getSkills: () => ({ skills: [], diagnostics: [] }),
366
+ getPrompts: () => ({ prompts: [], diagnostics: [] }),
367
+ getThemes: () => ({ themes: [], diagnostics: [] }),
368
+ getAgentsFiles: () => ({ agentsFiles: [] }),
369
+ getSystemPrompt: () => systemPrompt,
370
+ getAppendSystemPrompt: () => [],
371
+ getPathMetadata: () => new Map(),
372
+ extendResources: () => { },
373
+ reload: async () => { },
374
+ };
375
+ }
376
+ function listSessions(agentName) {
377
+ const sessionsDir = resolve(homedir(), ".beige", "sessions", agentName);
378
+ if (!existsSync(sessionsDir))
379
+ return [];
380
+ const files = readdirSync(sessionsDir).filter((f) => f.endsWith(".jsonl"));
381
+ return files
382
+ .map((f) => ({
383
+ file: resolve(sessionsDir, f),
384
+ timestamp: extractTimestampFromFilename(f),
385
+ }))
386
+ .sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());
387
+ }
388
+ function extractTimestampFromFilename(filename) {
389
+ // Format: 20260305-120000-a1b2c3.jsonl
390
+ const match = filename.match(/^(\d{8})-(\d{6})-/);
391
+ if (!match)
392
+ return new Date(0);
393
+ const dateStr = match[1]; // 20260305
394
+ const timeStr = match[2]; // 120000
395
+ const year = parseInt(dateStr.slice(0, 4), 10);
396
+ const month = parseInt(dateStr.slice(4, 6), 10) - 1;
397
+ const day = parseInt(dateStr.slice(6, 8), 10);
398
+ const hour = parseInt(timeStr.slice(0, 2), 10);
399
+ const minute = parseInt(timeStr.slice(2, 4), 10);
400
+ const second = parseInt(timeStr.slice(4, 6), 10);
401
+ return new Date(year, month, day, hour, minute, second);
402
+ }
403
+ // ── TUI tool-start handler ────────────────────────────────────────────────────
404
+ function makeTUIToolStartHandler() {
405
+ return (toolName, params) => {
406
+ const label = formatToolCall(toolName, params);
407
+ process.stderr.write(`\r🔧 ${label}\n`);
408
+ };
409
+ }
410
+ function formatToolCall(toolName, params) {
411
+ switch (toolName) {
412
+ case "exec": {
413
+ const cmd = String(params.command ?? "");
414
+ return `exec: ${cmd.length > 100 ? cmd.slice(0, 97) + "…" : cmd}`;
415
+ }
416
+ case "read": {
417
+ return `read: ${params.path}`;
418
+ }
419
+ case "write": {
420
+ const bytes = params.bytes != null ? ` (${params.bytes} bytes)` : "";
421
+ return `write: ${params.path}${bytes}`;
422
+ }
423
+ case "patch": {
424
+ return `patch: ${params.path}`;
425
+ }
426
+ default:
427
+ return `${toolName}: ${JSON.stringify(params).slice(0, 100)}`;
428
+ }
429
+ }
430
+ // ── Proxy core tools ──────────────────────────────────────────────────────────
431
+ function createProxyTools(agentName, gatewayUrl, handlerRef) {
432
+ async function callGateway(tool, params) {
433
+ const res = await fetch(`${gatewayUrl}/api/agents/${encodeURIComponent(agentName)}/exec`, {
434
+ method: "POST",
435
+ headers: { "Content-Type": "application/json" },
436
+ body: JSON.stringify({ tool, params }),
437
+ });
438
+ if (!res.ok) {
439
+ const text = await res.text();
440
+ return {
441
+ content: [{ type: "text", text: `Gateway error (${res.status}): ${text}` }],
442
+ isError: true,
443
+ };
444
+ }
445
+ return (await res.json());
446
+ }
447
+ return [
448
+ {
449
+ name: "read",
450
+ label: "Read File",
451
+ description: "Read the contents of a file in the sandbox. Paths are relative to /workspace or absolute within the sandbox.",
452
+ parameters: Type.Object({
453
+ path: Type.String({ description: "File path to read" }),
454
+ offset: Type.Optional(Type.Number({ description: "Line number to start reading from (1-indexed)" })),
455
+ limit: Type.Optional(Type.Number({ description: "Maximum number of lines to read" })),
456
+ }),
457
+ execute: async (_toolCallId, params) => {
458
+ const p = params;
459
+ handlerRef.fn?.("read", { path: p.path });
460
+ const result = await callGateway("read", p);
461
+ return { content: result.content, details: {}, isError: result.isError };
462
+ },
463
+ },
464
+ {
465
+ name: "write",
466
+ label: "Write File",
467
+ description: "Write content to a file in the sandbox. Creates parent directories if needed.",
468
+ parameters: Type.Object({
469
+ path: Type.String({ description: "File path to write" }),
470
+ content: Type.String({ description: "Content to write to the file" }),
471
+ }),
472
+ execute: async (_toolCallId, params) => {
473
+ const p = params;
474
+ handlerRef.fn?.("write", { path: p.path, bytes: Buffer.byteLength(p.content) });
475
+ const result = await callGateway("write", p);
476
+ return { content: result.content, details: {}, isError: result.isError };
477
+ },
478
+ },
479
+ {
480
+ name: "patch",
481
+ label: "Patch File",
482
+ description: "Apply a find-and-replace patch to a file in the sandbox. The oldText must match exactly.",
483
+ parameters: Type.Object({
484
+ path: Type.String({ description: "File path to patch" }),
485
+ oldText: Type.String({ description: "Exact text to find and replace" }),
486
+ newText: Type.String({ description: "New text to replace with" }),
487
+ }),
488
+ execute: async (_toolCallId, params) => {
489
+ const p = params;
490
+ handlerRef.fn?.("patch", { path: p.path });
491
+ const result = await callGateway("patch", p);
492
+ return { content: result.content, details: {}, isError: result.isError };
493
+ },
494
+ },
495
+ {
496
+ name: "exec",
497
+ label: "Execute Command",
498
+ description: "Execute a command in the sandbox. The command runs in /workspace by default.",
499
+ parameters: Type.Object({
500
+ command: Type.String({ description: "The command to execute" }),
501
+ timeout: Type.Optional(Type.Number({ description: "Timeout in seconds (default: 120)" })),
502
+ }),
503
+ execute: async (_toolCallId, params) => {
504
+ const p = params;
505
+ handlerRef.fn?.("exec", { command: p.command });
506
+ const result = await callGateway("exec", p);
507
+ return { content: result.content, details: {}, isError: result.isError };
508
+ },
509
+ },
510
+ ];
511
+ }
512
+ // ── Helpers ───────────────────────────────────────────────────────────────────
513
+ function buildToolContext(toolNames) {
514
+ if (toolNames.length === 0)
515
+ return "";
516
+ const lines = [
517
+ "## Available Tools",
518
+ "",
519
+ "The following tools are available via `/tools/bin/` in the sandbox:",
520
+ "",
521
+ ];
522
+ for (const name of toolNames) {
523
+ lines.push(`- **${name}** — run with \`exec: /tools/bin/${name} <args>\``);
524
+ }
525
+ lines.push("");
526
+ lines.push("Read tool documentation: `exec: cat /tools/packages/<name>/README.md`");
527
+ return lines.join("\n");
528
+ }
529
+ function buildSystemPrompt(agentName, toolContext, skillContext = "") {
530
+ return `You are an AI agent named "${agentName}" running inside a secure sandbox managed by the Beige agent system.
531
+
532
+ ## Environment
533
+
534
+ - You run inside a Docker container with a writable workspace at \`/workspace\`.
535
+ - You have 4 core tools: \`read\`, \`write\`, \`patch\`, and \`exec\`.
536
+ - Additional tools are available as executables in \`/tools/bin/\`. Run them with \`exec\`.
537
+ - Tool documentation is available in \`/tools/packages/<name>/\`.
538
+ - Your working directory is \`/workspace\`. Files you create persist here.
539
+ - You can write and execute scripts (TypeScript via Deno, shell scripts, Python, etc.).
540
+
541
+ ## How to Use Tools
542
+
543
+ To call a tool, use the \`exec\` core tool:
544
+ \`\`\`
545
+ exec: /tools/bin/<tool-name> <args...>
546
+ \`\`\`
547
+
548
+ To write and run a script:
549
+ 1. Use \`write\` to create a script file in \`/workspace\`
550
+ 2. Use \`exec\` to run it (e.g., \`exec deno run --allow-all /workspace/script.ts\`)
551
+
552
+ Scripts can call tools by executing \`/tools/bin/<tool-name>\` as subprocesses.
553
+
554
+ ${toolContext}
555
+ ${skillContext}
556
+ ## Guidelines
557
+
558
+ - Be helpful and proactive.
559
+ - When tasks require multiple steps, write scripts to chain tool calls.
560
+ - If you're unsure about a tool, read its documentation in \`/tools/packages/<name>/\`.
561
+ - Always handle errors gracefully.
562
+ `;
563
+ }
564
+ function resolveModel(agentConfig, modelRegistry) {
565
+ const { provider, model: modelId } = agentConfig.model;
566
+ const model = getModel(provider, modelId);
567
+ if (model)
568
+ return model;
569
+ const custom = modelRegistry.find(provider, modelId);
570
+ if (custom)
571
+ return custom;
572
+ throw new Error(`Model not found: ${provider}/${modelId}`);
573
+ }
574
+ //# sourceMappingURL=tui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/channels/tui.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Beige CLI
4
+ *
5
+ * Usage:
6
+ * beige Show help
7
+ * beige gateway start Start the gateway as a background daemon
8
+ * beige gateway start --foreground Start the gateway in the foreground (for debugging)
9
+ * beige gateway stop Stop the running gateway daemon
10
+ * beige gateway restart Gracefully restart the gateway (drain, reload config, recreate sandboxes)
11
+ * beige gateway status Show whether the gateway daemon is running
12
+ * beige gateway logs Show gateway logs
13
+ * beige gateway logs -f Follow gateway logs (tail -f)
14
+ * beige tui [agent] Connect to a running gateway via TUI
15
+ * beige install <source> Install a toolkit (npm, github, local, url)
16
+ * beige toolkit <command> Manage toolkits
17
+ * beige --config <path> Use a specific config file
18
+ *
19
+ * Shell 1: beige ← starts gateway daemon
20
+ * Shell 2: beige tui testo ← interactive TUI, proxies tools to gateway
21
+ */
22
+ export {};
23
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;GAmBG"}