@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,532 @@
1
+ import { getModel } from "@mariozechner/pi-ai";
2
+ import { createAgentSession, SessionManager, SettingsManager, createExtensionRuntime, } from "@mariozechner/pi-coding-agent";
3
+ import { createCoreTools } from "../tools/core.js";
4
+ import { buildToolContext } from "../tools/registry.js";
5
+ import { buildSkillContext, validateSkillDeps } from "../skills/registry.js";
6
+ import { ProviderHealthTracker, extractRateLimitInfo } from "./provider-health.js";
7
+ import { parseSessionKey } from "../types/session.js";
8
+ /**
9
+ * Manages agent sessions. Supports multiple concurrent sessions per agent
10
+ * (e.g. one per Telegram chat/thread).
11
+ *
12
+ * Each agent has one sandbox + socket. Sessions share the sandbox but have
13
+ * independent conversation histories.
14
+ *
15
+ * Supports fallback models: if the primary model fails after retries, it tries
16
+ * each fallback model in order. Rate limits are tracked per-provider/model.
17
+ */
18
+ export class AgentManager {
19
+ config;
20
+ sandbox;
21
+ audit;
22
+ loadedTools;
23
+ loadedSkills;
24
+ authStorage;
25
+ modelRegistry;
26
+ sessionStore;
27
+ /** sessionKey → ManagedSession */
28
+ sessions = new Map();
29
+ /** Tracks provider health and rate limits */
30
+ providerHealth = new ProviderHealthTracker();
31
+ constructor(config, sandbox, audit, loadedTools, loadedSkills, authStorage, modelRegistry, sessionStore) {
32
+ this.config = config;
33
+ this.sandbox = sandbox;
34
+ this.audit = audit;
35
+ this.loadedTools = loadedTools;
36
+ this.loadedSkills = loadedSkills;
37
+ this.authStorage = authStorage;
38
+ this.modelRegistry = modelRegistry;
39
+ this.sessionStore = sessionStore;
40
+ }
41
+ /**
42
+ * Get or create a session for a given key.
43
+ *
44
+ * @param sessionKey Unique key (e.g. "telegram:123:456" or "tui:assistant:default")
45
+ * @param agentName Which agent to use
46
+ * @param opts.forceNew If true, always create a new session (for /new command)
47
+ * @param opts.sessionFile If set, open this specific session file (for /resume)
48
+ * @param opts.onToolStart Callback fired when a core tool is about to execute (verbose mode)
49
+ */
50
+ async getOrCreateSession(sessionKey, agentName, opts) {
51
+ // If forceNew, dispose old session and create fresh
52
+ if (opts?.forceNew) {
53
+ await this.disposeSession(sessionKey);
54
+ }
55
+ // Return cached session if it exists
56
+ const existing = this.sessions.get(sessionKey);
57
+ if (existing)
58
+ return existing;
59
+ const agentConfig = this.config.agents[agentName];
60
+ if (!agentConfig) {
61
+ throw new Error(`Unknown agent: ${agentName}`);
62
+ }
63
+ // Determine session file
64
+ let sessionFile;
65
+ if (opts?.sessionFile) {
66
+ sessionFile = opts.sessionFile;
67
+ }
68
+ else if (!opts?.forceNew) {
69
+ sessionFile = this.sessionStore.getSessionFile(sessionKey);
70
+ }
71
+ // Create new session file if none exists
72
+ if (!sessionFile) {
73
+ sessionFile = this.sessionStore.createSession(sessionKey, agentName);
74
+ }
75
+ console.log(`[AGENT] Creating session for '${agentName}' (key: ${sessionKey})`);
76
+ // Validate skill dependencies
77
+ validateSkillDeps(agentConfig.skills ?? [], agentConfig.tools, this.loadedSkills);
78
+ // Build pi session — wire onToolStart so channels get notified on tool calls.
79
+ // Store the ref on the ManagedSession so it can be mutated at runtime (verbose toggle).
80
+ const toolStartHandlerRef = { fn: opts?.onToolStart };
81
+ const sessionContext = parseSessionKey(sessionKey);
82
+ const coreTools = createCoreTools(agentName, this.sandbox, this.audit, toolStartHandlerRef, sessionContext);
83
+ const toolContext = buildToolContext(agentConfig.tools, this.loadedTools);
84
+ const skillContext = buildSkillContext(agentConfig.skills ?? [], this.loadedSkills);
85
+ const systemPrompt = buildSystemPrompt(agentName, toolContext, skillContext);
86
+ const model = this.resolveModel(agentConfig);
87
+ const resourceLoader = {
88
+ getExtensions: () => ({ extensions: [], errors: [], runtime: createExtensionRuntime() }),
89
+ getSkills: () => ({ skills: [], diagnostics: [] }),
90
+ getPrompts: () => ({ prompts: [], diagnostics: [] }),
91
+ getThemes: () => ({ themes: [], diagnostics: [] }),
92
+ getAgentsFiles: () => ({ agentsFiles: [] }),
93
+ getSystemPrompt: () => systemPrompt,
94
+ getAppendSystemPrompt: () => [],
95
+ getPathMetadata: () => new Map(),
96
+ extendResources: () => { },
97
+ reload: async () => { },
98
+ };
99
+ // Use file-based session manager for persistence
100
+ let sessionManager;
101
+ try {
102
+ sessionManager = SessionManager.open(sessionFile);
103
+ }
104
+ catch {
105
+ // File doesn't exist yet or is empty — create new
106
+ const { dir } = await import("path").then((p) => ({ dir: p.dirname(sessionFile) }));
107
+ sessionManager = SessionManager.create(process.cwd(), dir);
108
+ }
109
+ const { session } = await createAgentSession({
110
+ model,
111
+ thinkingLevel: agentConfig.model.thinkingLevel ?? "off",
112
+ tools: [],
113
+ customTools: coreTools,
114
+ sessionManager,
115
+ settingsManager: SettingsManager.inMemory({
116
+ compaction: { enabled: true },
117
+ retry: { enabled: true, maxRetries: 3 },
118
+ }),
119
+ resourceLoader,
120
+ authStorage: this.authStorage,
121
+ modelRegistry: this.modelRegistry,
122
+ });
123
+ const managed = {
124
+ agentName,
125
+ sessionKey,
126
+ session,
127
+ currentModel: agentConfig.model,
128
+ inflightCount: 0,
129
+ drainResolvers: [],
130
+ toolStartHandlerRef,
131
+ };
132
+ this.sessions.set(sessionKey, managed);
133
+ console.log(`[AGENT] Session ready for '${agentName}' (key: ${sessionKey})`);
134
+ return managed;
135
+ }
136
+ /**
137
+ * Send a message to a session and collect the full response.
138
+ * Implements fallback logic: if the primary model fails after retries,
139
+ * tries each fallback model in order.
140
+ */
141
+ async prompt(sessionKey, agentName, message, opts) {
142
+ const agentConfig = this.config.agents[agentName];
143
+ if (!agentConfig) {
144
+ throw new Error(`Unknown agent: ${agentName}`);
145
+ }
146
+ // Build list of models to try: primary + fallbacks
147
+ const modelsToTry = this.getModelsToTry(agentConfig);
148
+ let lastError;
149
+ for (const modelRef of modelsToTry) {
150
+ const { provider, model: modelId } = modelRef;
151
+ // Skip if this model is in cooldown
152
+ if (this.providerHealth.isCoolingDown(provider, modelId)) {
153
+ const remaining = this.providerHealth.getRemainingCooldown(provider, modelId);
154
+ console.log(`[AGENT] Skipping ${provider}/${modelId} — in cooldown for ${Math.round(remaining / 1000)}s`);
155
+ continue;
156
+ }
157
+ console.log(`[AGENT] Attempting prompt with ${provider}/${modelId}`);
158
+ try {
159
+ const result = await this.promptWithModel(sessionKey, agentName, message, modelRef, opts);
160
+ // Success — mark provider as healthy
161
+ this.providerHealth.markHealthy(provider, modelId);
162
+ return result;
163
+ }
164
+ catch (err) {
165
+ const error = err instanceof Error ? err : new Error(String(err));
166
+ lastError = error;
167
+ // Check if it's a rate limit
168
+ const rateLimitInfo = extractRateLimitInfo(err);
169
+ if (rateLimitInfo.isRateLimit) {
170
+ this.providerHealth.markRateLimited(provider, modelId, rateLimitInfo.retryAfterMs, error.message);
171
+ console.log(`[AGENT] ${provider}/${modelId} rate limited, trying next model`);
172
+ continue;
173
+ }
174
+ // Non-rate-limit error — mark as failed but try next
175
+ this.providerHealth.markFailed(provider, modelId, error.message);
176
+ console.error(`[AGENT] ${provider}/${modelId} failed: ${error.message}, trying next model`);
177
+ }
178
+ }
179
+ // All models failed
180
+ throw new Error(`All models failed for agent '${agentName}'. Last error: ${lastError?.message ?? "unknown"}`);
181
+ }
182
+ /**
183
+ * Send a message and stream deltas via callback.
184
+ * Implements fallback logic: if the primary model fails after retries,
185
+ * tries each fallback model in order.
186
+ */
187
+ async promptStreaming(sessionKey, agentName, message, onDelta, opts) {
188
+ const agentConfig = this.config.agents[agentName];
189
+ if (!agentConfig) {
190
+ throw new Error(`Unknown agent: ${agentName}`);
191
+ }
192
+ // Build list of models to try: primary + fallbacks
193
+ const modelsToTry = this.getModelsToTry(agentConfig);
194
+ let lastError;
195
+ for (const modelRef of modelsToTry) {
196
+ const { provider, model: modelId } = modelRef;
197
+ // Skip if this model is in cooldown
198
+ if (this.providerHealth.isCoolingDown(provider, modelId)) {
199
+ const remaining = this.providerHealth.getRemainingCooldown(provider, modelId);
200
+ console.log(`[AGENT] Skipping ${provider}/${modelId} — in cooldown for ${Math.round(remaining / 1000)}s`);
201
+ continue;
202
+ }
203
+ console.log(`[AGENT] Attempting streaming prompt with ${provider}/${modelId}`);
204
+ try {
205
+ const result = await this.promptStreamingWithModel(sessionKey, agentName, message, onDelta, modelRef, opts);
206
+ // Success — mark provider as healthy
207
+ this.providerHealth.markHealthy(provider, modelId);
208
+ return result;
209
+ }
210
+ catch (err) {
211
+ const error = err instanceof Error ? err : new Error(String(err));
212
+ lastError = error;
213
+ // Check if it's a rate limit
214
+ const rateLimitInfo = extractRateLimitInfo(err);
215
+ if (rateLimitInfo.isRateLimit) {
216
+ this.providerHealth.markRateLimited(provider, modelId, rateLimitInfo.retryAfterMs, error.message);
217
+ console.log(`[AGENT] ${provider}/${modelId} rate limited, trying next model`);
218
+ continue;
219
+ }
220
+ // Non-rate-limit error — mark as failed but try next
221
+ this.providerHealth.markFailed(provider, modelId, error.message);
222
+ console.error(`[AGENT] ${provider}/${modelId} failed: ${error.message}, trying next model`);
223
+ }
224
+ }
225
+ // All models failed
226
+ throw new Error(`All models failed for agent '${agentName}'. Last error: ${lastError?.message ?? "unknown"}`);
227
+ }
228
+ /**
229
+ * Get the list of models to try, skipping those in cooldown.
230
+ * Returns primary model + fallbacks that are not currently rate-limited.
231
+ */
232
+ getModelsToTry(agentConfig) {
233
+ const models = [agentConfig.model];
234
+ if (agentConfig.fallbackModels) {
235
+ models.push(...agentConfig.fallbackModels);
236
+ }
237
+ return models;
238
+ }
239
+ /**
240
+ * Execute a prompt with a specific model (internal).
241
+ */
242
+ async promptWithModel(sessionKey, agentName, message, modelRef, opts) {
243
+ const managed = await this.getOrCreateSessionWithModel(sessionKey, agentName, modelRef, opts);
244
+ managed.inflightCount++;
245
+ try {
246
+ return await new Promise((resolve, reject) => {
247
+ let responseText = "";
248
+ const unsubscribe = managed.session.subscribe((event) => {
249
+ if (event.type === "message_update" &&
250
+ event.assistantMessageEvent.type === "text_delta") {
251
+ responseText += event.assistantMessageEvent.delta;
252
+ }
253
+ if (event.type === "agent_end") {
254
+ unsubscribe();
255
+ resolve(responseText);
256
+ }
257
+ });
258
+ managed.session.prompt(message).catch((err) => {
259
+ unsubscribe();
260
+ reject(err);
261
+ });
262
+ });
263
+ }
264
+ finally {
265
+ this.decrementInflight(managed);
266
+ }
267
+ }
268
+ /**
269
+ * Execute a streaming prompt with a specific model (internal).
270
+ */
271
+ async promptStreamingWithModel(sessionKey, agentName, message, onDelta, modelRef, opts) {
272
+ const managed = await this.getOrCreateSessionWithModel(sessionKey, agentName, modelRef, opts);
273
+ managed.inflightCount++;
274
+ try {
275
+ return await new Promise((resolve, reject) => {
276
+ let responseText = "";
277
+ const unsubscribe = managed.session.subscribe((event) => {
278
+ if (event.type === "message_update" &&
279
+ event.assistantMessageEvent.type === "text_delta") {
280
+ const delta = event.assistantMessageEvent.delta;
281
+ responseText += delta;
282
+ onDelta(delta);
283
+ }
284
+ if (event.type === "agent_end") {
285
+ unsubscribe();
286
+ resolve(responseText);
287
+ }
288
+ });
289
+ managed.session.prompt(message).catch((err) => {
290
+ unsubscribe();
291
+ reject(err);
292
+ });
293
+ });
294
+ }
295
+ finally {
296
+ this.decrementInflight(managed);
297
+ }
298
+ }
299
+ /**
300
+ * Get or create a session with a specific model.
301
+ * This allows switching models without creating a new session key.
302
+ */
303
+ async getOrCreateSessionWithModel(sessionKey, agentName, modelRef, opts) {
304
+ // If forceNew, dispose old session and create fresh
305
+ if (opts?.forceNew) {
306
+ await this.disposeSession(sessionKey);
307
+ }
308
+ // Check if we need to recreate the session with a different model
309
+ const existing = this.sessions.get(sessionKey);
310
+ // If session exists with the same model, return it
311
+ if (existing) {
312
+ const { provider, model: modelId } = modelRef;
313
+ const currentRef = existing.currentModel;
314
+ if (currentRef.provider === provider && currentRef.model === modelId) {
315
+ return existing;
316
+ }
317
+ // Different model — dispose and recreate
318
+ console.log(`[AGENT] Switching session ${sessionKey} from ${currentRef.provider}/${currentRef.model} to ${provider}/${modelId}`);
319
+ existing.session.dispose();
320
+ this.sessions.delete(sessionKey);
321
+ }
322
+ const agentConfig = this.config.agents[agentName];
323
+ if (!agentConfig) {
324
+ throw new Error(`Unknown agent: ${agentName}`);
325
+ }
326
+ // Determine session file
327
+ let sessionFile;
328
+ if (opts?.forceNew) {
329
+ sessionFile = this.sessionStore.createSession(sessionKey, agentName);
330
+ }
331
+ else {
332
+ sessionFile = this.sessionStore.getSessionFile(sessionKey);
333
+ if (!sessionFile) {
334
+ sessionFile = this.sessionStore.createSession(sessionKey, agentName);
335
+ }
336
+ }
337
+ console.log(`[AGENT] Creating session for '${agentName}' with model ${modelRef.provider}/${modelRef.model} (key: ${sessionKey})`);
338
+ // Validate skill dependencies
339
+ validateSkillDeps(agentConfig.skills ?? [], agentConfig.tools, this.loadedSkills);
340
+ // Build pi session
341
+ const toolStartHandlerRef = { fn: opts?.onToolStart };
342
+ const sessionContext = parseSessionKey(sessionKey);
343
+ const coreTools = createCoreTools(agentName, this.sandbox, this.audit, toolStartHandlerRef, sessionContext);
344
+ const toolContext = buildToolContext(agentConfig.tools, this.loadedTools);
345
+ const skillContext = buildSkillContext(agentConfig.skills ?? [], this.loadedSkills);
346
+ const systemPrompt = buildSystemPrompt(agentName, toolContext, skillContext);
347
+ const model = this.resolveModelFromRef(modelRef);
348
+ const resourceLoader = {
349
+ getExtensions: () => ({ extensions: [], errors: [], runtime: createExtensionRuntime() }),
350
+ getSkills: () => ({ skills: [], diagnostics: [] }),
351
+ getPrompts: () => ({ prompts: [], diagnostics: [] }),
352
+ getThemes: () => ({ themes: [], diagnostics: [] }),
353
+ getAgentsFiles: () => ({ agentsFiles: [] }),
354
+ getSystemPrompt: () => systemPrompt,
355
+ getAppendSystemPrompt: () => [],
356
+ getPathMetadata: () => new Map(),
357
+ extendResources: () => { },
358
+ reload: async () => { },
359
+ };
360
+ // Use file-based session manager for persistence
361
+ let sessionManager;
362
+ try {
363
+ sessionManager = SessionManager.open(sessionFile);
364
+ }
365
+ catch {
366
+ const { dir } = await import("path").then((p) => ({ dir: p.dirname(sessionFile) }));
367
+ sessionManager = SessionManager.create(process.cwd(), dir);
368
+ }
369
+ const { session } = await createAgentSession({
370
+ model,
371
+ thinkingLevel: modelRef.thinkingLevel ?? "off",
372
+ tools: [],
373
+ customTools: coreTools,
374
+ sessionManager,
375
+ settingsManager: SettingsManager.inMemory({
376
+ compaction: { enabled: true },
377
+ retry: { enabled: true, maxRetries: 3 },
378
+ }),
379
+ resourceLoader,
380
+ authStorage: this.authStorage,
381
+ modelRegistry: this.modelRegistry,
382
+ });
383
+ const managed = {
384
+ agentName,
385
+ sessionKey,
386
+ session,
387
+ currentModel: modelRef,
388
+ inflightCount: 0,
389
+ drainResolvers: [],
390
+ toolStartHandlerRef,
391
+ };
392
+ this.sessions.set(sessionKey, managed);
393
+ console.log(`[AGENT] Session ready for '${agentName}' (key: ${sessionKey})`);
394
+ return managed;
395
+ }
396
+ /**
397
+ * Wait for all currently in-flight prompt / promptStreaming calls to finish,
398
+ * then dispose every session. New calls made after drainAll() starts will
399
+ * still complete before disposal — drainAll() re-waits until quiet.
400
+ *
401
+ * Safe to call multiple times; idempotent once all sessions are disposed.
402
+ */
403
+ async drainAll() {
404
+ console.log("[AGENT] Draining in-flight LLM calls...");
405
+ // Wait for every managed session to have inflightCount === 0.
406
+ const drainSession = (managed) => {
407
+ if (managed.inflightCount === 0)
408
+ return Promise.resolve();
409
+ return new Promise((resolve) => {
410
+ managed.drainResolvers.push(resolve);
411
+ });
412
+ };
413
+ // Iteratively wait until the whole map is quiet (new sessions could be
414
+ // created by concurrent callers while we wait).
415
+ let quiet = false;
416
+ while (!quiet) {
417
+ const pending = [...this.sessions.values()];
418
+ await Promise.all(pending.map(drainSession));
419
+ // Check again — no new calls should have started after drainResolvers fire
420
+ quiet = [...this.sessions.values()].every((s) => s.inflightCount === 0);
421
+ }
422
+ console.log("[AGENT] All in-flight calls finished. Disposing sessions...");
423
+ for (const [, managed] of this.sessions) {
424
+ managed.session.dispose();
425
+ }
426
+ this.sessions.clear();
427
+ console.log("[AGENT] Sessions drained and disposed.");
428
+ }
429
+ /**
430
+ * Start a new session for a key (disposes old one).
431
+ * If an existing session has an onToolStart handler, it is re-registered.
432
+ */
433
+ async newSession(sessionKey, agentName, opts) {
434
+ // Carry over onToolStart from the old session if not explicitly provided
435
+ const existingHandler = this.sessions.get(sessionKey)?.toolStartHandlerRef.fn;
436
+ // Reset in session store — creates new file, keeps old one
437
+ this.sessionStore.resetSession(sessionKey, agentName);
438
+ return this.getOrCreateSession(sessionKey, agentName, {
439
+ forceNew: true,
440
+ onToolStart: opts?.onToolStart ?? existingHandler,
441
+ });
442
+ }
443
+ /**
444
+ * Update the onToolStart handler for an existing session without recreating it.
445
+ * Used when verbose mode is toggled at runtime.
446
+ */
447
+ updateToolStartHandler(sessionKey, onToolStart) {
448
+ const managed = this.sessions.get(sessionKey);
449
+ if (managed) {
450
+ // Mutating the ref updates all tool closures immediately — no recreation needed.
451
+ managed.toolStartHandlerRef.fn = onToolStart;
452
+ }
453
+ }
454
+ /**
455
+ * Dispose a specific session.
456
+ */
457
+ async disposeSession(sessionKey) {
458
+ const existing = this.sessions.get(sessionKey);
459
+ if (existing) {
460
+ existing.session.dispose();
461
+ this.sessions.delete(sessionKey);
462
+ }
463
+ }
464
+ /**
465
+ * Dispose all sessions immediately (no drain).
466
+ */
467
+ async shutdown() {
468
+ for (const [, managed] of this.sessions) {
469
+ managed.session.dispose();
470
+ }
471
+ this.sessions.clear();
472
+ }
473
+ // ── Private helpers ────────────────────────────────────────────────
474
+ decrementInflight(managed) {
475
+ managed.inflightCount = Math.max(0, managed.inflightCount - 1);
476
+ if (managed.inflightCount === 0 && managed.drainResolvers.length > 0) {
477
+ const resolvers = managed.drainResolvers.splice(0);
478
+ for (const resolve of resolvers)
479
+ resolve();
480
+ }
481
+ }
482
+ resolveModel(agentConfig) {
483
+ return this.resolveModelFromRef(agentConfig.model);
484
+ }
485
+ resolveModelFromRef(modelRef) {
486
+ const { provider, model: modelId } = modelRef;
487
+ const model = getModel(provider, modelId);
488
+ if (model)
489
+ return model;
490
+ const custom = this.modelRegistry.find(provider, modelId);
491
+ if (custom)
492
+ return custom;
493
+ throw new Error(`Model not found: ${provider}/${modelId}. Check your config and API keys.`);
494
+ }
495
+ }
496
+ export function buildSystemPrompt(agentName, toolContext, skillContext = "") {
497
+ return `You are an AI agent named "${agentName}" running inside a secure sandbox managed by the Beige agent system.
498
+
499
+ ## Environment
500
+
501
+ - You run inside a Docker container with a writable workspace at \`/workspace\`.
502
+ - You have 4 core tools: \`read\`, \`write\`, \`patch\`, and \`exec\`.
503
+ - Additional tools are available as executables in \`/tools/bin/\`. Run them with \`exec\`.
504
+ - Tool documentation is available in \`/tools/packages/<name>/\`.
505
+ - Your working directory is \`/workspace\`. Files you create persist here.
506
+ - You can write and execute scripts (TypeScript via Deno, shell scripts, Python, etc.).
507
+ - Your AGENTS.md file is at \`/workspace/AGENTS.md\`. You can read and modify it.
508
+
509
+ ## How to Use Tools
510
+
511
+ To call a tool, use the \`exec\` core tool:
512
+ \`\`\`
513
+ exec: /tools/bin/<tool-name> <args...>
514
+ \`\`\`
515
+
516
+ To write and run a script:
517
+ 1. Use \`write\` to create a script file in \`/workspace\`
518
+ 2. Use \`exec\` to run it (e.g., \`exec deno run --allow-all /workspace/script.ts\`)
519
+
520
+ Scripts can call tools by executing \`/tools/bin/<tool-name>\` as subprocesses.
521
+
522
+ ${toolContext}
523
+ ${skillContext}
524
+ ## Guidelines
525
+
526
+ - Be helpful and proactive.
527
+ - When tasks require multiple steps, write scripts to chain tool calls.
528
+ - If you're unsure about a tool, read its documentation in \`/tools/packages/<name>/\`.
529
+ - Always handle errors gracefully.
530
+ `;
531
+ }
532
+ //# sourceMappingURL=agent-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-manager.js","sourceRoot":"","sources":["../../src/gateway/agent-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { BeigeConfig } from "../config/schema.js";
2
+ import type { AgentManager } from "./agent-manager.js";
3
+ import type { BeigeSessionStore } from "./sessions.js";
4
+ import type { SandboxManager } from "../sandbox/manager.js";
5
+ import type { AuditLogger } from "./audit.js";
6
+ import type { Gateway } from "./gateway.js";
7
+ export interface GatewayAPIOptions {
8
+ config: BeigeConfig;
9
+ gateway: Gateway;
10
+ agentManager: AgentManager;
11
+ sessionStore: BeigeSessionStore;
12
+ sandbox: SandboxManager;
13
+ audit: AuditLogger;
14
+ port: number;
15
+ host: string;
16
+ }
17
+ /**
18
+ * HTTP API for the gateway.
19
+ *
20
+ * Endpoints:
21
+ * GET /api/health — health check
22
+ * GET /api/agents — list agents + their tool context
23
+ * POST /api/agents/:name/exec — execute core tool (read/write/patch/exec)
24
+ * POST /api/agents/:name/sessions/new — start a new session (returns session key)
25
+ * GET /api/agents/:name/sessions — list sessions for agent
26
+ *
27
+ * The TUI process connects here to proxy tool execution through the gateway,
28
+ * which owns the sandboxes, audit logging, and policy enforcement.
29
+ */
30
+ export declare class GatewayAPI {
31
+ private server;
32
+ private opts;
33
+ constructor(opts: GatewayAPIOptions);
34
+ start(): Promise<void>;
35
+ stop(): Promise<void>;
36
+ private handleRequest;
37
+ /**
38
+ * Execute a core tool in the agent's sandbox.
39
+ */
40
+ private executeTool;
41
+ private json;
42
+ }
43
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/gateway/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,iBAAiB,CAAC;IAChC,OAAO,EAAE,cAAc,CAAC;IACxB,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAoB;gBAEpB,IAAI,EAAE,iBAAiB;IAK7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAMb,aAAa;IA0H3B;;OAEG;YACW,WAAW;IAkHzB,OAAO,CAAC,IAAI;CAIb"}