@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.
- package/LICENSE.md +8 -0
- package/README.md +183 -0
- package/dist/channels/registry.d.ts +14 -0
- package/dist/channels/registry.d.ts.map +1 -0
- package/dist/channels/registry.js +14 -0
- package/dist/channels/registry.js.map +1 -0
- package/dist/channels/telegram.d.ts +92 -0
- package/dist/channels/telegram.d.ts.map +1 -0
- package/dist/channels/telegram.js +469 -0
- package/dist/channels/telegram.js.map +1 -0
- package/dist/channels/tui.d.ts +8 -0
- package/dist/channels/tui.d.ts.map +1 -0
- package/dist/channels/tui.js +574 -0
- package/dist/channels/tui.js.map +1 -0
- package/dist/cli.d.ts +23 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +571 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/loader.d.ts +6 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +103 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/loader.spec.d.ts +2 -0
- package/dist/config/loader.spec.d.ts.map +1 -0
- package/dist/config/loader.spec.js +195 -0
- package/dist/config/loader.spec.js.map +1 -0
- package/dist/config/schema.d.ts +107 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +42 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/schema.spec.d.ts +2 -0
- package/dist/config/schema.spec.d.ts.map +1 -0
- package/dist/config/schema.spec.js +180 -0
- package/dist/config/schema.spec.js.map +1 -0
- package/dist/gateway/agent-manager.d.ts +138 -0
- package/dist/gateway/agent-manager.d.ts.map +1 -0
- package/dist/gateway/agent-manager.js +532 -0
- package/dist/gateway/agent-manager.js.map +1 -0
- package/dist/gateway/api.d.ts +43 -0
- package/dist/gateway/api.d.ts.map +1 -0
- package/dist/gateway/api.js +256 -0
- package/dist/gateway/api.js.map +1 -0
- package/dist/gateway/api.spec.d.ts +2 -0
- package/dist/gateway/api.spec.d.ts.map +1 -0
- package/dist/gateway/api.spec.js +256 -0
- package/dist/gateway/api.spec.js.map +1 -0
- package/dist/gateway/audit.d.ts +38 -0
- package/dist/gateway/audit.d.ts.map +1 -0
- package/dist/gateway/audit.js +82 -0
- package/dist/gateway/audit.js.map +1 -0
- package/dist/gateway/audit.spec.d.ts +2 -0
- package/dist/gateway/audit.spec.d.ts.map +1 -0
- package/dist/gateway/audit.spec.js +212 -0
- package/dist/gateway/audit.spec.js.map +1 -0
- package/dist/gateway/gateway.d.ts +27 -0
- package/dist/gateway/gateway.d.ts.map +1 -0
- package/dist/gateway/gateway.js +158 -0
- package/dist/gateway/gateway.js.map +1 -0
- package/dist/gateway/policy.d.ts +27 -0
- package/dist/gateway/policy.d.ts.map +1 -0
- package/dist/gateway/policy.js +40 -0
- package/dist/gateway/policy.js.map +1 -0
- package/dist/gateway/policy.spec.d.ts +2 -0
- package/dist/gateway/policy.spec.d.ts.map +1 -0
- package/dist/gateway/policy.spec.js +121 -0
- package/dist/gateway/policy.spec.js.map +1 -0
- package/dist/gateway/provider-health.d.ts +83 -0
- package/dist/gateway/provider-health.d.ts.map +1 -0
- package/dist/gateway/provider-health.js +219 -0
- package/dist/gateway/provider-health.js.map +1 -0
- package/dist/gateway/provider-health.spec.d.ts +2 -0
- package/dist/gateway/provider-health.spec.d.ts.map +1 -0
- package/dist/gateway/provider-health.spec.js +278 -0
- package/dist/gateway/provider-health.spec.js.map +1 -0
- package/dist/gateway/session-settings.d.ts +62 -0
- package/dist/gateway/session-settings.d.ts.map +1 -0
- package/dist/gateway/session-settings.js +91 -0
- package/dist/gateway/session-settings.js.map +1 -0
- package/dist/gateway/session-settings.spec.d.ts +2 -0
- package/dist/gateway/session-settings.spec.d.ts.map +1 -0
- package/dist/gateway/session-settings.spec.js +141 -0
- package/dist/gateway/session-settings.spec.js.map +1 -0
- package/dist/gateway/sessions.d.ts +68 -0
- package/dist/gateway/sessions.d.ts.map +1 -0
- package/dist/gateway/sessions.js +177 -0
- package/dist/gateway/sessions.js.map +1 -0
- package/dist/gateway/sessions.spec.d.ts +2 -0
- package/dist/gateway/sessions.spec.d.ts.map +1 -0
- package/dist/gateway/sessions.spec.js +190 -0
- package/dist/gateway/sessions.spec.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +39 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +144 -0
- package/dist/install.js.map +1 -0
- package/dist/sandbox/manager.d.ts +63 -0
- package/dist/sandbox/manager.d.ts.map +1 -0
- package/dist/sandbox/manager.js +294 -0
- package/dist/sandbox/manager.js.map +1 -0
- package/dist/skills/index.d.ts +2 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +2 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/registry.d.ts +11 -0
- package/dist/skills/registry.d.ts.map +1 -0
- package/dist/skills/registry.js +86 -0
- package/dist/skills/registry.js.map +1 -0
- package/dist/skills/registry.spec.d.ts +2 -0
- package/dist/skills/registry.spec.d.ts.map +1 -0
- package/dist/skills/registry.spec.js +220 -0
- package/dist/skills/registry.spec.js.map +1 -0
- package/dist/socket/protocol.d.ts +21 -0
- package/dist/socket/protocol.d.ts.map +1 -0
- package/dist/socket/protocol.js +7 -0
- package/dist/socket/protocol.js.map +1 -0
- package/dist/socket/protocol.spec.d.ts +2 -0
- package/dist/socket/protocol.spec.d.ts.map +1 -0
- package/dist/socket/protocol.spec.js +135 -0
- package/dist/socket/protocol.spec.js.map +1 -0
- package/dist/socket/server.d.ts +21 -0
- package/dist/socket/server.d.ts.map +1 -0
- package/dist/socket/server.js +133 -0
- package/dist/socket/server.js.map +1 -0
- package/dist/socket/server.spec.d.ts +2 -0
- package/dist/socket/server.spec.d.ts.map +1 -0
- package/dist/socket/server.spec.js +333 -0
- package/dist/socket/server.spec.js.map +1 -0
- package/dist/test/fixtures.d.ts +47 -0
- package/dist/test/fixtures.d.ts.map +1 -0
- package/dist/test/fixtures.js +144 -0
- package/dist/test/fixtures.js.map +1 -0
- package/dist/toolkit/index.d.ts +4 -0
- package/dist/toolkit/index.d.ts.map +1 -0
- package/dist/toolkit/index.js +4 -0
- package/dist/toolkit/index.js.map +1 -0
- package/dist/toolkit/installer.d.ts +26 -0
- package/dist/toolkit/installer.d.ts.map +1 -0
- package/dist/toolkit/installer.js +247 -0
- package/dist/toolkit/installer.js.map +1 -0
- package/dist/toolkit/registry.d.ts +19 -0
- package/dist/toolkit/registry.d.ts.map +1 -0
- package/dist/toolkit/registry.js +119 -0
- package/dist/toolkit/registry.js.map +1 -0
- package/dist/toolkit/registry.spec.d.ts +2 -0
- package/dist/toolkit/registry.spec.d.ts.map +1 -0
- package/dist/toolkit/registry.spec.js +194 -0
- package/dist/toolkit/registry.spec.js.map +1 -0
- package/dist/toolkit/schema.d.ts +61 -0
- package/dist/toolkit/schema.d.ts.map +1 -0
- package/dist/toolkit/schema.js +116 -0
- package/dist/toolkit/schema.js.map +1 -0
- package/dist/toolkit/schema.spec.d.ts +2 -0
- package/dist/toolkit/schema.spec.d.ts.map +1 -0
- package/dist/toolkit/schema.spec.js +202 -0
- package/dist/toolkit/schema.spec.js.map +1 -0
- package/dist/tools/core.d.ts +10 -0
- package/dist/tools/core.d.ts.map +1 -0
- package/dist/tools/core.js +246 -0
- package/dist/tools/core.js.map +1 -0
- package/dist/tools/core.spec.d.ts +2 -0
- package/dist/tools/core.spec.d.ts.map +1 -0
- package/dist/tools/core.spec.js +315 -0
- package/dist/tools/core.spec.js.map +1 -0
- package/dist/tools/registry.d.ts +15 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +62 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/registry.spec.d.ts +2 -0
- package/dist/tools/registry.spec.d.ts.map +1 -0
- package/dist/tools/registry.spec.js +228 -0
- package/dist/tools/registry.spec.js.map +1 -0
- package/dist/tools/runner.d.ts +25 -0
- package/dist/tools/runner.d.ts.map +1 -0
- package/dist/tools/runner.js +35 -0
- package/dist/tools/runner.js.map +1 -0
- package/dist/tools/runner.spec.d.ts +2 -0
- package/dist/tools/runner.spec.d.ts.map +1 -0
- package/dist/tools/runner.spec.js +129 -0
- package/dist/tools/runner.spec.js.map +1 -0
- package/dist/types/session.d.ts +8 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +23 -0
- package/dist/types/session.js.map +1 -0
- package/package.json +76 -0
- package/tools/README.md +1 -0
- package/tools/kv/README.md +150 -0
- package/tools/kv/index.ts +149 -0
- package/tools/kv/tool.json +23 -0
- package/tools/message/README.md +53 -0
- package/tools/message/index.ts +183 -0
- 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"}
|