bulkhead-runtime 0.1.0 → 2026.4.5-beta.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 (199) hide show
  1. package/README.md +337 -234
  2. package/dist/cli.js +5 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/config/index.d.ts +28 -0
  5. package/dist/config/index.d.ts.map +1 -1
  6. package/dist/config/index.js +9 -6
  7. package/dist/config/index.js.map +1 -1
  8. package/dist/credentials/store.d.ts.map +1 -1
  9. package/dist/credentials/store.js +39 -15
  10. package/dist/credentials/store.js.map +1 -1
  11. package/dist/index.d.ts +18 -0
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +38 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/infra/warning-filter.js +1 -1
  16. package/dist/infra/warning-filter.js.map +1 -1
  17. package/dist/logging/subsystem.d.ts +15 -1
  18. package/dist/logging/subsystem.d.ts.map +1 -1
  19. package/dist/logging/subsystem.js +310 -45
  20. package/dist/logging/subsystem.js.map +1 -1
  21. package/dist/memory/embedding-batch.d.ts +38 -0
  22. package/dist/memory/embedding-batch.d.ts.map +1 -0
  23. package/dist/memory/embedding-batch.js +253 -0
  24. package/dist/memory/embedding-batch.js.map +1 -0
  25. package/dist/memory/embedding-cache.d.ts +16 -0
  26. package/dist/memory/embedding-cache.d.ts.map +1 -0
  27. package/dist/memory/embedding-cache.js +113 -0
  28. package/dist/memory/embedding-cache.js.map +1 -0
  29. package/dist/memory/embeddings-debug.js +1 -1
  30. package/dist/memory/embeddings.d.ts +1 -0
  31. package/dist/memory/embeddings.d.ts.map +1 -1
  32. package/dist/memory/embeddings.js +115 -92
  33. package/dist/memory/embeddings.js.map +1 -1
  34. package/dist/memory/file-indexer.d.ts +26 -0
  35. package/dist/memory/file-indexer.d.ts.map +1 -0
  36. package/dist/memory/file-indexer.js +245 -0
  37. package/dist/memory/file-indexer.js.map +1 -0
  38. package/dist/memory/hybrid.d.ts.map +1 -1
  39. package/dist/memory/hybrid.js +6 -2
  40. package/dist/memory/hybrid.js.map +1 -1
  41. package/dist/memory/index.d.ts +5 -0
  42. package/dist/memory/index.d.ts.map +1 -1
  43. package/dist/memory/index.js +5 -2
  44. package/dist/memory/index.js.map +1 -1
  45. package/dist/memory/session-indexer.d.ts +41 -0
  46. package/dist/memory/session-indexer.d.ts.map +1 -0
  47. package/dist/memory/session-indexer.js +341 -0
  48. package/dist/memory/session-indexer.js.map +1 -0
  49. package/dist/memory/simple-manager.d.ts +6 -0
  50. package/dist/memory/simple-manager.d.ts.map +1 -1
  51. package/dist/memory/simple-manager.js +35 -12
  52. package/dist/memory/simple-manager.js.map +1 -1
  53. package/dist/memory/ssrf.d.ts +18 -0
  54. package/dist/memory/ssrf.d.ts.map +1 -0
  55. package/dist/memory/ssrf.js +316 -0
  56. package/dist/memory/ssrf.js.map +1 -0
  57. package/dist/package.json +8 -5
  58. package/dist/platform/platform.d.ts.map +1 -1
  59. package/dist/platform/platform.js +30 -7
  60. package/dist/platform/platform.js.map +1 -1
  61. package/dist/platform/types.d.ts +2 -0
  62. package/dist/platform/types.d.ts.map +1 -1
  63. package/dist/runtime/agent.d.ts +8 -0
  64. package/dist/runtime/agent.d.ts.map +1 -1
  65. package/dist/runtime/agent.js +194 -46
  66. package/dist/runtime/agent.js.map +1 -1
  67. package/dist/runtime/api-key-rotation.d.ts +26 -0
  68. package/dist/runtime/api-key-rotation.d.ts.map +1 -0
  69. package/dist/runtime/api-key-rotation.js +174 -0
  70. package/dist/runtime/api-key-rotation.js.map +1 -0
  71. package/dist/runtime/context-guard.d.ts +32 -0
  72. package/dist/runtime/context-guard.d.ts.map +1 -0
  73. package/dist/runtime/context-guard.js +61 -0
  74. package/dist/runtime/context-guard.js.map +1 -0
  75. package/dist/runtime/failover-error.d.ts +62 -0
  76. package/dist/runtime/failover-error.d.ts.map +1 -0
  77. package/dist/runtime/failover-error.js +733 -0
  78. package/dist/runtime/failover-error.js.map +1 -0
  79. package/dist/runtime/failover-policy.d.ts +5 -0
  80. package/dist/runtime/failover-policy.d.ts.map +1 -0
  81. package/dist/runtime/failover-policy.js +18 -0
  82. package/dist/runtime/failover-policy.js.map +1 -0
  83. package/dist/runtime/index.d.ts +11 -0
  84. package/dist/runtime/index.d.ts.map +1 -1
  85. package/dist/runtime/index.js +11 -0
  86. package/dist/runtime/index.js.map +1 -1
  87. package/dist/runtime/memory-flush.d.ts +24 -0
  88. package/dist/runtime/memory-flush.d.ts.map +1 -0
  89. package/dist/runtime/memory-flush.js +64 -0
  90. package/dist/runtime/memory-flush.js.map +1 -0
  91. package/dist/runtime/memory-tools.d.ts +14 -0
  92. package/dist/runtime/memory-tools.d.ts.map +1 -0
  93. package/dist/runtime/memory-tools.js +58 -0
  94. package/dist/runtime/memory-tools.js.map +1 -0
  95. package/dist/runtime/model-fallback.d.ts +56 -0
  96. package/dist/runtime/model-fallback.d.ts.map +1 -0
  97. package/dist/runtime/model-fallback.js +301 -0
  98. package/dist/runtime/model-fallback.js.map +1 -0
  99. package/dist/runtime/model-fallback.types.d.ts +14 -0
  100. package/dist/runtime/model-fallback.types.d.ts.map +1 -0
  101. package/dist/runtime/model-fallback.types.js +3 -0
  102. package/dist/runtime/model-fallback.types.js.map +1 -0
  103. package/dist/runtime/retry.d.ts +24 -0
  104. package/dist/runtime/retry.d.ts.map +1 -0
  105. package/dist/runtime/retry.js +102 -0
  106. package/dist/runtime/retry.js.map +1 -0
  107. package/dist/runtime/session-pruning.d.ts +22 -0
  108. package/dist/runtime/session-pruning.d.ts.map +1 -0
  109. package/dist/runtime/session-pruning.js +118 -0
  110. package/dist/runtime/session-pruning.js.map +1 -0
  111. package/dist/runtime/stream-adapters.d.ts +11 -0
  112. package/dist/runtime/stream-adapters.d.ts.map +1 -0
  113. package/dist/runtime/stream-adapters.js +46 -0
  114. package/dist/runtime/stream-adapters.js.map +1 -0
  115. package/dist/runtime/subagent.d.ts +83 -0
  116. package/dist/runtime/subagent.d.ts.map +1 -0
  117. package/dist/runtime/subagent.js +190 -0
  118. package/dist/runtime/subagent.js.map +1 -0
  119. package/dist/runtime/tool-result-truncation.d.ts +25 -0
  120. package/dist/runtime/tool-result-truncation.d.ts.map +1 -0
  121. package/dist/runtime/tool-result-truncation.js +115 -0
  122. package/dist/runtime/tool-result-truncation.js.map +1 -0
  123. package/dist/sandbox/cgroup.d.ts +4 -1
  124. package/dist/sandbox/cgroup.d.ts.map +1 -1
  125. package/dist/sandbox/cgroup.js +28 -15
  126. package/dist/sandbox/cgroup.js.map +1 -1
  127. package/dist/sandbox/index.d.ts +2 -1
  128. package/dist/sandbox/index.d.ts.map +1 -1
  129. package/dist/sandbox/index.js +2 -1
  130. package/dist/sandbox/index.js.map +1 -1
  131. package/dist/sandbox/ipc.d.ts +4 -1
  132. package/dist/sandbox/ipc.d.ts.map +1 -1
  133. package/dist/sandbox/ipc.js +33 -17
  134. package/dist/sandbox/ipc.js.map +1 -1
  135. package/dist/sandbox/manager.d.ts +1 -2
  136. package/dist/sandbox/manager.d.ts.map +1 -1
  137. package/dist/sandbox/manager.js +132 -130
  138. package/dist/sandbox/manager.js.map +1 -1
  139. package/dist/sandbox/namespace.d.ts +1 -1
  140. package/dist/sandbox/namespace.d.ts.map +1 -1
  141. package/dist/sandbox/namespace.js +36 -37
  142. package/dist/sandbox/namespace.js.map +1 -1
  143. package/dist/sandbox/rootfs.d.ts +6 -1
  144. package/dist/sandbox/rootfs.d.ts.map +1 -1
  145. package/dist/sandbox/rootfs.js +114 -30
  146. package/dist/sandbox/rootfs.js.map +1 -1
  147. package/dist/sandbox/seccomp-apply.d.ts +9 -0
  148. package/dist/sandbox/seccomp-apply.d.ts.map +1 -0
  149. package/dist/sandbox/seccomp-apply.js +227 -0
  150. package/dist/sandbox/seccomp-apply.js.map +1 -0
  151. package/dist/sandbox/seccomp.js +3 -3
  152. package/dist/sandbox/seccomp.js.map +1 -1
  153. package/dist/sandbox/types.d.ts +1 -3
  154. package/dist/sandbox/types.d.ts.map +1 -1
  155. package/dist/sandbox/types.js.map +1 -1
  156. package/dist/sandbox/worker.d.ts +3 -0
  157. package/dist/sandbox/worker.d.ts.map +1 -1
  158. package/dist/sandbox/worker.js +84 -17
  159. package/dist/sandbox/worker.js.map +1 -1
  160. package/dist/sessions/index.d.ts +1 -0
  161. package/dist/sessions/index.d.ts.map +1 -1
  162. package/dist/sessions/index.js +1 -0
  163. package/dist/sessions/index.js.map +1 -1
  164. package/dist/sessions/store.d.ts +2 -2
  165. package/dist/sessions/store.d.ts.map +1 -1
  166. package/dist/sessions/store.js +49 -27
  167. package/dist/sessions/store.js.map +1 -1
  168. package/dist/sessions/transcript-events.d.ts +11 -0
  169. package/dist/sessions/transcript-events.d.ts.map +1 -0
  170. package/dist/sessions/transcript-events.js +40 -0
  171. package/dist/sessions/transcript-events.js.map +1 -0
  172. package/dist/shared/agent-session.d.ts +10 -0
  173. package/dist/shared/agent-session.d.ts.map +1 -0
  174. package/dist/shared/agent-session.js +33 -0
  175. package/dist/shared/agent-session.js.map +1 -0
  176. package/dist/shared/constants.d.ts +6 -0
  177. package/dist/shared/constants.d.ts.map +1 -0
  178. package/dist/shared/constants.js +11 -0
  179. package/dist/shared/constants.js.map +1 -0
  180. package/dist/shared/fs.d.ts +7 -0
  181. package/dist/shared/fs.d.ts.map +1 -0
  182. package/dist/shared/fs.js +14 -0
  183. package/dist/shared/fs.js.map +1 -0
  184. package/dist/shared/index.d.ts +4 -0
  185. package/dist/shared/index.d.ts.map +1 -0
  186. package/dist/shared/index.js +4 -0
  187. package/dist/shared/index.js.map +1 -0
  188. package/dist/skills/enablement.d.ts.map +1 -1
  189. package/dist/skills/enablement.js +2 -2
  190. package/dist/skills/enablement.js.map +1 -1
  191. package/dist/workspace/runner.d.ts.map +1 -1
  192. package/dist/workspace/runner.js +353 -106
  193. package/dist/workspace/runner.js.map +1 -1
  194. package/dist/workspace/types.d.ts +1 -0
  195. package/dist/workspace/types.d.ts.map +1 -1
  196. package/dist/workspace/workspace.d.ts.map +1 -1
  197. package/dist/workspace/workspace.js +12 -3
  198. package/dist/workspace/workspace.js.map +1 -1
  199. package/package.json +1 -1
@@ -6,12 +6,32 @@ import { createEmbeddingProvider } from "../memory/embeddings.js";
6
6
  import { getOrCreateSession, updateSession, } from "../sessions/index.js";
7
7
  import { loadWorkspaceSkills } from "../skills/index.js";
8
8
  import { loadConfig, resolveStateDir, } from "../config/index.js";
9
+ import { DEFAULT_MODEL, DEFAULT_PROVIDER, LINUX_REQUIRED_MESSAGE, buildProviderEnvKey, resolveSessionManager, extractAssistantResponse, } from "../shared/index.js";
10
+ import { createMemoryTools } from "./memory-tools.js";
11
+ import { runWithModelFallback } from "./model-fallback.js";
12
+ import { resolveContextWindowInfo, evaluateContextWindowGuard, CONTEXT_WINDOW_HARD_MIN_TOKENS, } from "./context-guard.js";
13
+ import { retryAsync } from "./retry.js";
14
+ import { isLikelyContextOverflowError, isTimeoutErrorMessage, isRateLimitErrorMessage } from "./failover-error.js";
15
+ import { executeWithApiKeyRotation, collectProviderApiKeys, } from "./api-key-rotation.js";
16
+ import { createSubagentTool } from "./subagent.js";
17
+ import { shouldRunMemoryFlush, createMemoryFlushState, markMemoryFlushed, MEMORY_FLUSH_PROMPT, MEMORY_FLUSH_SYSTEM_PROMPT, } from "./memory-flush.js";
18
+ import { createSubsystemLogger, configureLogger } from "../logging/subsystem.js";
9
19
  import * as path from "node:path";
10
20
  import * as fs from "node:fs";
21
+ const log = createSubsystemLogger("runtime");
22
+ function assertLinux() {
23
+ if (process.platform !== "linux") {
24
+ throw new Error(LINUX_REQUIRED_MESSAGE);
25
+ }
26
+ }
11
27
  export async function createRuntime(overrides) {
12
- const fileConfig = loadConfig(overrides?.stateDir);
28
+ assertLinux();
29
+ const fileConfig = loadConfig(overrides?.configPath);
13
30
  const config = { ...fileConfig, ...overrides };
14
31
  const stateDir = resolveStateDir(config);
32
+ if (config.logging) {
33
+ configureLogger(config.logging);
34
+ }
15
35
  const hooks = createHookRunner();
16
36
  const memoryDir = config.memory?.dir ?? path.join(stateDir, "memory");
17
37
  // Create embedding provider from config if available
@@ -20,21 +40,20 @@ export async function createRuntime(overrides) {
20
40
  : undefined;
21
41
  const memory = createSimpleMemoryManager({ dbDir: memoryDir, embeddingProvider });
22
42
  fs.mkdirSync(stateDir, { recursive: true });
43
+ const memoryFlushState = createMemoryFlushState();
23
44
  async function run(options) {
24
45
  const sessionId = options.sessionId ?? `session_${Date.now()}`;
25
- const modelId = options.model ?? config.model ?? "claude-sonnet-4-20250514";
26
- const provider = (options.provider ?? config.provider ?? "anthropic");
27
- const providerEnvKey = `${provider.toUpperCase().replace(/-/g, "_")}_API_KEY`;
28
- const apiKey = options.apiKey ?? config.apiKey ?? process.env[providerEnvKey] ?? "";
46
+ const requestedModelId = options.model ?? config.model ?? DEFAULT_MODEL;
47
+ const requestedProvider = (options.provider ?? config.provider ?? DEFAULT_PROVIDER);
29
48
  const workspaceDir = options.workspaceDir ?? config.workspaceDir ?? process.cwd();
30
- const sessionsDir = path.join(stateDir, "sessions");
49
+ const sessionsDir = path.join(stateDir, "sessions", sessionId);
31
50
  fs.mkdirSync(sessionsDir, { recursive: true });
32
- getOrCreateSession(stateDir, sessionId, { model: modelId });
51
+ await getOrCreateSession(stateDir, sessionId, { model: requestedModelId });
33
52
  await hooks.run("session_start", { sessionId });
34
53
  await hooks.run("before_agent_start", {
35
54
  sessionId,
36
55
  message: options.message,
37
- model: modelId,
56
+ model: requestedModelId,
38
57
  });
39
58
  let skillsPrompt = "";
40
59
  if (config.skills?.enabled !== false) {
@@ -52,50 +71,179 @@ export async function createRuntime(overrides) {
52
71
  ]
53
72
  .filter(Boolean)
54
73
  .join("\n\n");
55
- const model = getModel(provider, modelId);
56
- // Set API key in environment for the provider
57
- if (apiKey) {
58
- const envKey = `${provider.toUpperCase().replace(/-/g, "_")}_API_KEY`;
59
- process.env[envKey] = apiKey;
60
- }
61
- const sessionManager = SessionManager.create(workspaceDir, sessionsDir);
62
- const sessionOpts = {
63
- cwd: workspaceDir,
64
- model,
65
- tools: [...codingTools],
66
- customTools: options.tools,
67
- sessionManager,
68
- };
69
- const { session } = await createAgentSession(sessionOpts);
70
- let responseText = "";
71
- const unsubscribe = session.subscribe((event) => {
72
- options.onEvent?.(event);
73
- });
74
- try {
75
- await session.sendUserMessage(options.message);
76
- }
77
- finally {
78
- unsubscribe();
79
- }
80
- // Extract text from the last assistant message's content blocks
81
- const messages = session.messages;
82
- for (let i = messages.length - 1; i >= 0; i--) {
83
- const msg = messages[i];
84
- if (msg.role === "assistant" && Array.isArray(msg.content)) {
85
- responseText = msg.content
86
- .filter((block) => block.type === "text")
87
- .map((block) => block.text ?? "")
88
- .join("");
89
- break;
74
+ async function executeWithModel(provider, modelId) {
75
+ const envKey = buildProviderEnvKey(provider);
76
+ const apiKeys = [];
77
+ if (options.apiKey)
78
+ apiKeys.push(options.apiKey);
79
+ if (options.apiKeys)
80
+ apiKeys.push(...options.apiKeys);
81
+ if (config.apiKey)
82
+ apiKeys.push(config.apiKey);
83
+ apiKeys.push(...collectProviderApiKeys(provider));
84
+ const uniqueKeys = [...new Set(apiKeys.filter((k) => k.length > 0))];
85
+ if (uniqueKeys.length === 0) {
86
+ const envVal = process.env[envKey];
87
+ if (envVal)
88
+ uniqueKeys.push(envVal);
89
+ }
90
+ async function runWithKey(apiKey) {
91
+ const model = getModel(provider, modelId);
92
+ const ctxInfo = resolveContextWindowInfo({
93
+ modelContextWindow: model.contextWindow,
94
+ configContextTokens: options.contextTokens,
95
+ });
96
+ const ctxGuard = evaluateContextWindowGuard({ info: ctxInfo });
97
+ if (ctxGuard.shouldBlock) {
98
+ throw new Error(`Context window too small (${ctxGuard.tokens} tokens). Minimum: ${CONTEXT_WINDOW_HARD_MIN_TOKENS}.`);
99
+ }
100
+ const previousEnvValue = process.env[envKey];
101
+ if (apiKey)
102
+ process.env[envKey] = apiKey;
103
+ try {
104
+ const sessionManager = resolveSessionManager(SessionManager, workspaceDir, sessionsDir);
105
+ const memoryTools = config.memory?.enabled !== false
106
+ ? createMemoryTools(memory)
107
+ : [];
108
+ const customTools = [
109
+ ...memoryTools,
110
+ ...(options.tools ?? []),
111
+ ];
112
+ if (options.enableSubagents !== false) {
113
+ const subTool = createSubagentTool({
114
+ runtime: {
115
+ run: (opts) => {
116
+ const subOpts = opts;
117
+ return run({
118
+ ...subOpts,
119
+ systemPrompt: subOpts.systemPrompt ?? "You are a helpful sub-agent. Be concise and focused on the task.",
120
+ });
121
+ },
122
+ },
123
+ });
124
+ customTools.push(subTool);
125
+ }
126
+ const sessionOpts = {
127
+ cwd: workspaceDir,
128
+ model,
129
+ tools: [...codingTools],
130
+ customTools,
131
+ sessionManager,
132
+ };
133
+ return await retryAsync(async () => {
134
+ const { session } = await createAgentSession(sessionOpts);
135
+ const pendingToolArgs = new Map();
136
+ const unsubscribe = session.subscribe((event) => {
137
+ options.onEvent?.(event);
138
+ if (event.type === "tool_execution_start") {
139
+ pendingToolArgs.set(event.toolCallId, event.args ?? {});
140
+ hooks
141
+ .run("before_tool_call", {
142
+ toolName: event.toolName,
143
+ input: event.args ?? {},
144
+ })
145
+ .catch(() => { });
146
+ }
147
+ if (event.type === "tool_execution_end") {
148
+ const input = pendingToolArgs.get(event.toolCallId) ?? {};
149
+ pendingToolArgs.delete(event.toolCallId);
150
+ hooks
151
+ .run("after_tool_call", {
152
+ toolName: event.toolName,
153
+ input,
154
+ result: event.result,
155
+ })
156
+ .catch(() => { });
157
+ }
158
+ });
159
+ try {
160
+ await session.sendUserMessage(options.message);
161
+ }
162
+ finally {
163
+ unsubscribe();
164
+ }
165
+ const responseText = extractAssistantResponse(session.messages);
166
+ return {
167
+ response: responseText,
168
+ sessionId,
169
+ provider,
170
+ model: modelId,
171
+ };
172
+ }, {
173
+ attempts: options.maxRetries ?? 2,
174
+ minDelayMs: 1000,
175
+ maxDelayMs: 10_000,
176
+ shouldRetry: (err) => {
177
+ const msg = err instanceof Error ? err.message : String(err);
178
+ if (isLikelyContextOverflowError(msg)) {
179
+ log.warn("context overflow detected");
180
+ if (config.memory?.enabled !== false &&
181
+ shouldRunMemoryFlush({
182
+ estimatedTokens: ctxInfo.tokens,
183
+ contextWindowTokens: ctxInfo.tokens,
184
+ sessionId,
185
+ state: memoryFlushState,
186
+ })) {
187
+ log.info("running pre-compaction memory flush");
188
+ markMemoryFlushed(memoryFlushState, sessionId);
189
+ run({
190
+ message: MEMORY_FLUSH_PROMPT,
191
+ sessionId,
192
+ model: modelId,
193
+ provider,
194
+ apiKey,
195
+ systemPrompt: MEMORY_FLUSH_SYSTEM_PROMPT,
196
+ enableSubagents: false,
197
+ maxRetries: 1,
198
+ }).catch((flushErr) => {
199
+ log.warn(`memory flush failed: ${flushErr instanceof Error ? flushErr.message : String(flushErr)}`);
200
+ });
201
+ }
202
+ return true;
203
+ }
204
+ return isRateLimitErrorMessage(msg) || isTimeoutErrorMessage(msg);
205
+ },
206
+ onRetry: ({ attempt, err }) => {
207
+ log.warn(`retry attempt ${attempt}: ${err instanceof Error ? err.message : String(err)}`);
208
+ },
209
+ });
210
+ }
211
+ finally {
212
+ if (previousEnvValue === undefined) {
213
+ delete process.env[envKey];
214
+ }
215
+ else {
216
+ process.env[envKey] = previousEnvValue;
217
+ }
218
+ }
219
+ }
220
+ if (uniqueKeys.length > 1) {
221
+ return executeWithApiKeyRotation({
222
+ provider,
223
+ apiKeys: uniqueKeys,
224
+ execute: runWithKey,
225
+ });
90
226
  }
227
+ return runWithKey(uniqueKeys[0] ?? "");
91
228
  }
229
+ const fallbackResult = await runWithModelFallback({
230
+ provider: requestedProvider,
231
+ model: requestedModelId,
232
+ fallbacks: options.fallbacks,
233
+ run: executeWithModel,
234
+ });
92
235
  await hooks.run("after_agent_end", {
93
236
  sessionId,
94
- result: responseText,
237
+ result: fallbackResult.result.response,
95
238
  });
96
239
  await hooks.run("session_end", { sessionId });
97
- updateSession(stateDir, sessionId, { model: modelId });
98
- return { response: responseText, sessionId };
240
+ await updateSession(stateDir, sessionId, {
241
+ model: fallbackResult.model,
242
+ });
243
+ return {
244
+ ...fallbackResult.result,
245
+ fallbackUsed: fallbackResult.attempts.length > 0,
246
+ };
99
247
  }
100
248
  return { run, hooks, memory, config };
101
249
  }
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/runtime/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/runtime/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export declare function collectProviderApiKeys(provider: string): string[];
2
+ export declare function isApiKeyRateLimitError(message: string): boolean;
3
+ export declare function isAnthropicBillingError(message: string): boolean;
4
+ export declare function collectProviderApiKeysForExecution(params: {
5
+ provider: string;
6
+ primaryApiKey?: string;
7
+ }): string[];
8
+ export interface ApiKeyRotationOptions<T> {
9
+ provider: string;
10
+ apiKeys: string[];
11
+ execute: (apiKey: string) => Promise<T>;
12
+ shouldRetry?: (params: {
13
+ apiKey: string;
14
+ error: unknown;
15
+ attempt: number;
16
+ message: string;
17
+ }) => boolean;
18
+ onRetry?: (params: {
19
+ apiKey: string;
20
+ error: unknown;
21
+ attempt: number;
22
+ message: string;
23
+ }) => void;
24
+ }
25
+ export declare function executeWithApiKeyRotation<T>(params: ApiKeyRotationOptions<T>): Promise<T>;
26
+ //# sourceMappingURL=api-key-rotation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-key-rotation.d.ts","sourceRoot":"","sources":["../../src/runtime/api-key-rotation.ts"],"names":[],"mappings":"AAmFA,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAyBjE;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAS/D;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAWhE;AAgBD,wBAAgB,kCAAkC,CAAC,MAAM,EAAE;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,MAAM,EAAE,CAGX;AAOD,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IACxC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,OAAO,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,KAAK,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,OAAO,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,KAAK,IAAI,CAAC;CACZ;AAED,wBAAsB,yBAAyB,CAAC,CAAC,EAC/C,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAC/B,OAAO,CAAC,CAAC,CAAC,CA2BZ"}
@@ -0,0 +1,174 @@
1
+ // Ported from OpenClaw src/agents/api-key-rotation.ts + src/agents/live-auth-keys.ts
2
+ // --- Key collection (from live-auth-keys.ts) ---
3
+ const KEY_SPLIT_RE = /[\s,;]+/g;
4
+ const PROVIDER_PREFIX_OVERRIDES = {
5
+ google: "GEMINI",
6
+ "google-vertex": "GEMINI",
7
+ };
8
+ const PROVIDER_API_KEY_CONFIG = {
9
+ anthropic: {
10
+ liveSingle: "BULKHEAD_LIVE_ANTHROPIC_KEY",
11
+ listVar: "BULKHEAD_LIVE_ANTHROPIC_KEYS",
12
+ primaryVar: "ANTHROPIC_API_KEY",
13
+ prefixedVar: "ANTHROPIC_API_KEY_",
14
+ },
15
+ google: {
16
+ liveSingle: "BULKHEAD_LIVE_GEMINI_KEY",
17
+ listVar: "GEMINI_API_KEYS",
18
+ primaryVar: "GEMINI_API_KEY",
19
+ prefixedVar: "GEMINI_API_KEY_",
20
+ },
21
+ "google-vertex": {
22
+ liveSingle: "BULKHEAD_LIVE_GEMINI_KEY",
23
+ listVar: "GEMINI_API_KEYS",
24
+ primaryVar: "GEMINI_API_KEY",
25
+ prefixedVar: "GEMINI_API_KEY_",
26
+ },
27
+ openai: {
28
+ liveSingle: "BULKHEAD_LIVE_OPENAI_KEY",
29
+ listVar: "OPENAI_API_KEYS",
30
+ primaryVar: "OPENAI_API_KEY",
31
+ prefixedVar: "OPENAI_API_KEY_",
32
+ },
33
+ };
34
+ function normalizeProviderId(raw) {
35
+ return raw.trim().toLowerCase().replace(/[^a-z0-9-]/g, "");
36
+ }
37
+ function parseKeyList(raw) {
38
+ if (!raw)
39
+ return [];
40
+ return raw.split(KEY_SPLIT_RE).map((v) => v.trim()).filter(Boolean);
41
+ }
42
+ function collectEnvPrefixedKeys(prefix) {
43
+ const keys = [];
44
+ for (const [name, value] of Object.entries(process.env)) {
45
+ if (!name.startsWith(prefix))
46
+ continue;
47
+ const trimmed = value?.trim();
48
+ if (!trimmed)
49
+ continue;
50
+ keys.push(trimmed);
51
+ }
52
+ return keys;
53
+ }
54
+ function resolveProviderApiKeyConfig(provider) {
55
+ const normalized = normalizeProviderId(provider);
56
+ const custom = PROVIDER_API_KEY_CONFIG[normalized];
57
+ const base = PROVIDER_PREFIX_OVERRIDES[normalized] ?? normalized.toUpperCase().replace(/-/g, "_");
58
+ const liveSingle = custom?.liveSingle ?? `BULKHEAD_LIVE_${base}_KEY`;
59
+ const listVar = custom?.listVar ?? `${base}_API_KEYS`;
60
+ const primaryVar = custom?.primaryVar ?? `${base}_API_KEY`;
61
+ const prefixedVar = custom?.prefixedVar ?? `${base}_API_KEY_`;
62
+ if (normalized === "google" || normalized === "google-vertex") {
63
+ return { liveSingle, listVar, primaryVar, prefixedVar, fallbackVars: ["GOOGLE_API_KEY"] };
64
+ }
65
+ return { liveSingle, listVar, primaryVar, prefixedVar, fallbackVars: [] };
66
+ }
67
+ export function collectProviderApiKeys(provider) {
68
+ const config = resolveProviderApiKeyConfig(provider);
69
+ const forcedSingle = config.liveSingle ? process.env[config.liveSingle]?.trim() : undefined;
70
+ if (forcedSingle)
71
+ return [forcedSingle];
72
+ const fromList = parseKeyList(config.listVar ? process.env[config.listVar] : undefined);
73
+ const primary = config.primaryVar ? process.env[config.primaryVar]?.trim() : undefined;
74
+ const fromPrefixed = config.prefixedVar ? collectEnvPrefixedKeys(config.prefixedVar) : [];
75
+ const fallback = config.fallbackVars
76
+ .map((envVar) => process.env[envVar]?.trim())
77
+ .filter(Boolean);
78
+ const seen = new Set();
79
+ const add = (value) => {
80
+ if (!value || seen.has(value))
81
+ return;
82
+ seen.add(value);
83
+ };
84
+ for (const value of fromList)
85
+ add(value);
86
+ add(primary);
87
+ for (const value of fromPrefixed)
88
+ add(value);
89
+ for (const value of fallback)
90
+ add(value);
91
+ return Array.from(seen);
92
+ }
93
+ export function isApiKeyRateLimitError(message) {
94
+ const lower = message.toLowerCase();
95
+ if (lower.includes("rate_limit"))
96
+ return true;
97
+ if (lower.includes("rate limit"))
98
+ return true;
99
+ if (lower.includes("429"))
100
+ return true;
101
+ if (lower.includes("quota exceeded") || lower.includes("quota_exceeded"))
102
+ return true;
103
+ if (lower.includes("resource exhausted") || lower.includes("resource_exhausted"))
104
+ return true;
105
+ if (lower.includes("too many requests"))
106
+ return true;
107
+ return false;
108
+ }
109
+ export function isAnthropicBillingError(message) {
110
+ const lower = message.toLowerCase();
111
+ if (lower.includes("credit balance"))
112
+ return true;
113
+ if (lower.includes("insufficient credit"))
114
+ return true;
115
+ if (lower.includes("insufficient credits"))
116
+ return true;
117
+ if (lower.includes("payment required"))
118
+ return true;
119
+ if (lower.includes("billing") && lower.includes("disabled"))
120
+ return true;
121
+ if (/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|\b(?:got|returned|received)\s+(?:a\s+)?402\b|^\s*402\spayment/i.test(lower))
122
+ return true;
123
+ return false;
124
+ }
125
+ // --- API key rotation (from api-key-rotation.ts) ---
126
+ function dedupeApiKeys(raw) {
127
+ const seen = new Set();
128
+ const keys = [];
129
+ for (const value of raw) {
130
+ const apiKey = value.trim();
131
+ if (!apiKey || seen.has(apiKey))
132
+ continue;
133
+ seen.add(apiKey);
134
+ keys.push(apiKey);
135
+ }
136
+ return keys;
137
+ }
138
+ export function collectProviderApiKeysForExecution(params) {
139
+ const { primaryApiKey, provider } = params;
140
+ return dedupeApiKeys([primaryApiKey?.trim() ?? "", ...collectProviderApiKeys(provider)]);
141
+ }
142
+ function formatErrorMessage(error) {
143
+ if (error instanceof Error)
144
+ return error.message;
145
+ return String(error);
146
+ }
147
+ export async function executeWithApiKeyRotation(params) {
148
+ const keys = dedupeApiKeys(params.apiKeys);
149
+ if (keys.length === 0) {
150
+ throw new Error(`No API keys configured for provider "${params.provider}".`);
151
+ }
152
+ let lastError;
153
+ for (let attempt = 0; attempt < keys.length; attempt += 1) {
154
+ const apiKey = keys[attempt];
155
+ try {
156
+ return await params.execute(apiKey);
157
+ }
158
+ catch (error) {
159
+ lastError = error;
160
+ const message = formatErrorMessage(error);
161
+ const retryable = params.shouldRetry
162
+ ? params.shouldRetry({ apiKey, error, attempt, message })
163
+ : isApiKeyRateLimitError(message);
164
+ if (!retryable || attempt + 1 >= keys.length)
165
+ break;
166
+ params.onRetry?.({ apiKey, error, attempt, message });
167
+ }
168
+ }
169
+ if (lastError === undefined) {
170
+ throw new Error(`Failed to run API request for ${params.provider}.`);
171
+ }
172
+ throw lastError;
173
+ }
174
+ //# sourceMappingURL=api-key-rotation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-key-rotation.js","sourceRoot":"","sources":["../../src/runtime/api-key-rotation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export declare const CONTEXT_WINDOW_HARD_MIN_TOKENS = 16000;
2
+ export declare const CONTEXT_WINDOW_WARN_BELOW_TOKENS = 32000;
3
+ export type ContextWindowSource = "model" | "modelsConfig" | "agentContextTokens" | "default";
4
+ export interface ContextWindowInfo {
5
+ tokens: number;
6
+ source: ContextWindowSource;
7
+ }
8
+ export interface ContextWindowGuardResult extends ContextWindowInfo {
9
+ shouldWarn: boolean;
10
+ shouldBlock: boolean;
11
+ }
12
+ export declare function resolveContextWindowInfo(params: {
13
+ modelContextWindow?: number;
14
+ configContextTokens?: number;
15
+ modelsProviderConfig?: Array<{
16
+ id?: string;
17
+ contextWindow?: number;
18
+ }>;
19
+ modelId?: string;
20
+ defaultTokens?: number;
21
+ }): ContextWindowInfo;
22
+ export declare function evaluateContextWindowGuard(params: {
23
+ info: ContextWindowInfo;
24
+ warnBelowTokens?: number;
25
+ hardMinTokens?: number;
26
+ }): ContextWindowGuardResult;
27
+ export declare function estimateTokens(text: string): number;
28
+ export declare function estimateMessagesTokens(messages: Array<{
29
+ role: string;
30
+ content: string;
31
+ }>): number;
32
+ //# sourceMappingURL=context-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-guard.d.ts","sourceRoot":"","sources":["../../src/runtime/context-guard.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,8BAA8B,QAAS,CAAC;AACrD,eAAO,MAAM,gCAAgC,QAAS,CAAC;AAKvD,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,cAAc,GAAG,oBAAoB,GAAG,SAAS,CAAC;AAE9F,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,mBAAmB,CAAC;CAC7B;AAED,MAAM,WAAW,wBAAyB,SAAQ,iBAAiB;IACjE,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;CACtB;AAQD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE;IAC/C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,iBAAiB,CAmBpB;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,IAAI,EAAE,iBAAiB,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,wBAAwB,CAyB3B;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GACjD,MAAM,CAMR"}
@@ -0,0 +1,61 @@
1
+ // Ported from OpenClaw src/agents/context-window-guard.ts
2
+ // Identical thresholds (16K hard min, 32K warn) and resolution logic.
3
+ import { createSubsystemLogger } from "../logging/subsystem.js";
4
+ const log = createSubsystemLogger("context-guard");
5
+ export const CONTEXT_WINDOW_HARD_MIN_TOKENS = 16_000;
6
+ export const CONTEXT_WINDOW_WARN_BELOW_TOKENS = 32_000;
7
+ const DEFAULT_CONTEXT_TOKENS = 128_000;
8
+ const CHARS_PER_TOKEN = 4;
9
+ function normalizePositiveInt(value) {
10
+ if (typeof value !== "number" || !Number.isFinite(value))
11
+ return null;
12
+ const int = Math.floor(value);
13
+ return int > 0 ? int : null;
14
+ }
15
+ export function resolveContextWindowInfo(params) {
16
+ // Check models.providers config first (highest priority override)
17
+ if (params.modelsProviderConfig && params.modelId) {
18
+ const match = params.modelsProviderConfig.find((m) => m?.id === params.modelId);
19
+ const fromConfig = normalizePositiveInt(match?.contextWindow);
20
+ if (fromConfig)
21
+ return { tokens: fromConfig, source: "modelsConfig" };
22
+ }
23
+ const fromModel = normalizePositiveInt(params.modelContextWindow);
24
+ const baseInfo = fromModel
25
+ ? { tokens: fromModel, source: "model" }
26
+ : { tokens: Math.floor(params.defaultTokens ?? DEFAULT_CONTEXT_TOKENS), source: "default" };
27
+ const capTokens = normalizePositiveInt(params.configContextTokens);
28
+ if (capTokens && capTokens < baseInfo.tokens) {
29
+ return { tokens: capTokens, source: "agentContextTokens" };
30
+ }
31
+ return baseInfo;
32
+ }
33
+ export function evaluateContextWindowGuard(params) {
34
+ const warnBelow = Math.max(1, Math.floor(params.warnBelowTokens ?? CONTEXT_WINDOW_WARN_BELOW_TOKENS));
35
+ const hardMin = Math.max(1, Math.floor(params.hardMinTokens ?? CONTEXT_WINDOW_HARD_MIN_TOKENS));
36
+ const tokens = Math.max(0, Math.floor(params.info.tokens));
37
+ const result = {
38
+ ...params.info,
39
+ tokens,
40
+ shouldWarn: tokens > 0 && tokens < warnBelow,
41
+ shouldBlock: tokens > 0 && tokens < hardMin,
42
+ };
43
+ if (result.shouldBlock) {
44
+ log.error(`context window too small: ${tokens} tokens (minimum: ${hardMin})`);
45
+ }
46
+ else if (result.shouldWarn) {
47
+ log.warn(`context window is small: ${tokens} tokens (recommended: >${warnBelow})`);
48
+ }
49
+ return result;
50
+ }
51
+ export function estimateTokens(text) {
52
+ return Math.ceil(text.length / CHARS_PER_TOKEN);
53
+ }
54
+ export function estimateMessagesTokens(messages) {
55
+ let total = 0;
56
+ for (const msg of messages) {
57
+ total += estimateTokens(msg.content ?? "") + 4;
58
+ }
59
+ return total;
60
+ }
61
+ //# sourceMappingURL=context-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-guard.js","sourceRoot":"","sources":["../../src/runtime/context-guard.ts"],"names":[],"mappings":"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"}