cloison-runtime 0.1.0
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 +21 -0
- package/README.md +313 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +47 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/index.d.ts +57 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +27 -0
- package/dist/config/index.js.map +1 -0
- package/dist/credentials/index.d.ts +4 -0
- package/dist/credentials/index.d.ts.map +1 -0
- package/dist/credentials/index.js +3 -0
- package/dist/credentials/index.js.map +1 -0
- package/dist/credentials/proxy.d.ts +3 -0
- package/dist/credentials/proxy.d.ts.map +1 -0
- package/dist/credentials/proxy.js +11 -0
- package/dist/credentials/proxy.js.map +1 -0
- package/dist/credentials/store.d.ts +7 -0
- package/dist/credentials/store.d.ts.map +1 -0
- package/dist/credentials/store.js +115 -0
- package/dist/credentials/store.js.map +1 -0
- package/dist/credentials/types.d.ts +14 -0
- package/dist/credentials/types.d.ts.map +1 -0
- package/dist/credentials/types.js +2 -0
- package/dist/credentials/types.js.map +1 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/runner.d.ts +7 -0
- package/dist/hooks/runner.d.ts.map +1 -0
- package/dist/hooks/runner.js +20 -0
- package/dist/hooks/runner.js.map +1 -0
- package/dist/hooks/types.d.ts +39 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +2 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +58 -0
- package/dist/index.js.map +1 -0
- package/dist/infra/env.d.ts +2 -0
- package/dist/infra/env.d.ts.map +1 -0
- package/dist/infra/env.js +6 -0
- package/dist/infra/env.js.map +1 -0
- package/dist/infra/warning-filter.d.ts +8 -0
- package/dist/infra/warning-filter.d.ts.map +1 -0
- package/dist/infra/warning-filter.js +66 -0
- package/dist/infra/warning-filter.js.map +1 -0
- package/dist/logging/subsystem.d.ts +29 -0
- package/dist/logging/subsystem.d.ts.map +1 -0
- package/dist/logging/subsystem.js +322 -0
- package/dist/logging/subsystem.js.map +1 -0
- package/dist/memory/embedding-batch.d.ts +38 -0
- package/dist/memory/embedding-batch.d.ts.map +1 -0
- package/dist/memory/embedding-batch.js +253 -0
- package/dist/memory/embedding-batch.js.map +1 -0
- package/dist/memory/embedding-cache.d.ts +16 -0
- package/dist/memory/embedding-cache.d.ts.map +1 -0
- package/dist/memory/embedding-cache.js +113 -0
- package/dist/memory/embedding-cache.js.map +1 -0
- package/dist/memory/embeddings-debug.d.ts +2 -0
- package/dist/memory/embeddings-debug.d.ts.map +1 -0
- package/dist/memory/embeddings-debug.js +12 -0
- package/dist/memory/embeddings-debug.js.map +1 -0
- package/dist/memory/embeddings.d.ts +17 -0
- package/dist/memory/embeddings.d.ts.map +1 -0
- package/dist/memory/embeddings.js +203 -0
- package/dist/memory/embeddings.js.map +1 -0
- package/dist/memory/file-indexer.d.ts +26 -0
- package/dist/memory/file-indexer.d.ts.map +1 -0
- package/dist/memory/file-indexer.js +260 -0
- package/dist/memory/file-indexer.js.map +1 -0
- package/dist/memory/fs-utils.d.ts +12 -0
- package/dist/memory/fs-utils.d.ts.map +1 -0
- package/dist/memory/fs-utils.js +24 -0
- package/dist/memory/fs-utils.js.map +1 -0
- package/dist/memory/hybrid.d.ts +46 -0
- package/dist/memory/hybrid.d.ts.map +1 -0
- package/dist/memory/hybrid.js +85 -0
- package/dist/memory/hybrid.js.map +1 -0
- package/dist/memory/index.d.ts +17 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +15 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/internal.d.ts +39 -0
- package/dist/memory/internal.d.ts.map +1 -0
- package/dist/memory/internal.js +292 -0
- package/dist/memory/internal.js.map +1 -0
- package/dist/memory/manager-search.d.ts +61 -0
- package/dist/memory/manager-search.d.ts.map +1 -0
- package/dist/memory/manager-search.js +102 -0
- package/dist/memory/manager-search.js.map +1 -0
- package/dist/memory/mmr.d.ts +63 -0
- package/dist/memory/mmr.d.ts.map +1 -0
- package/dist/memory/mmr.js +165 -0
- package/dist/memory/mmr.js.map +1 -0
- package/dist/memory/query-expansion.d.ts +42 -0
- package/dist/memory/query-expansion.d.ts.map +1 -0
- package/dist/memory/query-expansion.js +776 -0
- package/dist/memory/query-expansion.js.map +1 -0
- package/dist/memory/session-indexer.d.ts +41 -0
- package/dist/memory/session-indexer.d.ts.map +1 -0
- package/dist/memory/session-indexer.js +367 -0
- package/dist/memory/session-indexer.js.map +1 -0
- package/dist/memory/simple-manager.d.ts +29 -0
- package/dist/memory/simple-manager.d.ts.map +1 -0
- package/dist/memory/simple-manager.js +216 -0
- package/dist/memory/simple-manager.js.map +1 -0
- package/dist/memory/sqlite.d.ts +2 -0
- package/dist/memory/sqlite.d.ts.map +1 -0
- package/dist/memory/sqlite.js +16 -0
- package/dist/memory/sqlite.js.map +1 -0
- package/dist/memory/ssrf.d.ts +18 -0
- package/dist/memory/ssrf.d.ts.map +1 -0
- package/dist/memory/ssrf.js +396 -0
- package/dist/memory/ssrf.js.map +1 -0
- package/dist/memory/temporal-decay.d.ts +26 -0
- package/dist/memory/temporal-decay.d.ts.map +1 -0
- package/dist/memory/temporal-decay.js +120 -0
- package/dist/memory/temporal-decay.js.map +1 -0
- package/dist/memory/types.d.ts +95 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +2 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/package.json +68 -0
- package/dist/platform/index.d.ts +3 -0
- package/dist/platform/index.d.ts.map +1 -0
- package/dist/platform/index.js +2 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/platform/platform.d.ts +3 -0
- package/dist/platform/platform.d.ts.map +1 -0
- package/dist/platform/platform.js +91 -0
- package/dist/platform/platform.js.map +1 -0
- package/dist/platform/types.d.ts +18 -0
- package/dist/platform/types.d.ts.map +1 -0
- package/dist/platform/types.js +2 -0
- package/dist/platform/types.js.map +1 -0
- package/dist/runtime/agent.d.ts +36 -0
- package/dist/runtime/agent.d.ts.map +1 -0
- package/dist/runtime/agent.js +250 -0
- package/dist/runtime/agent.js.map +1 -0
- package/dist/runtime/api-key-rotation.d.ts +26 -0
- package/dist/runtime/api-key-rotation.d.ts.map +1 -0
- package/dist/runtime/api-key-rotation.js +174 -0
- package/dist/runtime/api-key-rotation.js.map +1 -0
- package/dist/runtime/context-guard.d.ts +32 -0
- package/dist/runtime/context-guard.d.ts.map +1 -0
- package/dist/runtime/context-guard.js +61 -0
- package/dist/runtime/context-guard.js.map +1 -0
- package/dist/runtime/failover-error.d.ts +62 -0
- package/dist/runtime/failover-error.d.ts.map +1 -0
- package/dist/runtime/failover-error.js +733 -0
- package/dist/runtime/failover-error.js.map +1 -0
- package/dist/runtime/failover-policy.d.ts +5 -0
- package/dist/runtime/failover-policy.d.ts.map +1 -0
- package/dist/runtime/failover-policy.js +18 -0
- package/dist/runtime/failover-policy.js.map +1 -0
- package/dist/runtime/index.d.ts +13 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +13 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/memory-flush.d.ts +24 -0
- package/dist/runtime/memory-flush.d.ts.map +1 -0
- package/dist/runtime/memory-flush.js +64 -0
- package/dist/runtime/memory-flush.js.map +1 -0
- package/dist/runtime/memory-tools.d.ts +14 -0
- package/dist/runtime/memory-tools.d.ts.map +1 -0
- package/dist/runtime/memory-tools.js +58 -0
- package/dist/runtime/memory-tools.js.map +1 -0
- package/dist/runtime/model-fallback.d.ts +56 -0
- package/dist/runtime/model-fallback.d.ts.map +1 -0
- package/dist/runtime/model-fallback.js +301 -0
- package/dist/runtime/model-fallback.js.map +1 -0
- package/dist/runtime/model-fallback.types.d.ts +14 -0
- package/dist/runtime/model-fallback.types.d.ts.map +1 -0
- package/dist/runtime/model-fallback.types.js +3 -0
- package/dist/runtime/model-fallback.types.js.map +1 -0
- package/dist/runtime/retry.d.ts +24 -0
- package/dist/runtime/retry.d.ts.map +1 -0
- package/dist/runtime/retry.js +100 -0
- package/dist/runtime/retry.js.map +1 -0
- package/dist/runtime/session-pruning.d.ts +22 -0
- package/dist/runtime/session-pruning.d.ts.map +1 -0
- package/dist/runtime/session-pruning.js +118 -0
- package/dist/runtime/session-pruning.js.map +1 -0
- package/dist/runtime/stream-adapters.d.ts +11 -0
- package/dist/runtime/stream-adapters.d.ts.map +1 -0
- package/dist/runtime/stream-adapters.js +46 -0
- package/dist/runtime/stream-adapters.js.map +1 -0
- package/dist/runtime/subagent.d.ts +83 -0
- package/dist/runtime/subagent.d.ts.map +1 -0
- package/dist/runtime/subagent.js +190 -0
- package/dist/runtime/subagent.js.map +1 -0
- package/dist/runtime/tool-result-truncation.d.ts +25 -0
- package/dist/runtime/tool-result-truncation.d.ts.map +1 -0
- package/dist/runtime/tool-result-truncation.js +115 -0
- package/dist/runtime/tool-result-truncation.js.map +1 -0
- package/dist/sandbox/cgroup.d.ts +20 -0
- package/dist/sandbox/cgroup.d.ts.map +1 -0
- package/dist/sandbox/cgroup.js +82 -0
- package/dist/sandbox/cgroup.js.map +1 -0
- package/dist/sandbox/index.d.ts +12 -0
- package/dist/sandbox/index.d.ts.map +1 -0
- package/dist/sandbox/index.js +10 -0
- package/dist/sandbox/index.js.map +1 -0
- package/dist/sandbox/ipc.d.ts +26 -0
- package/dist/sandbox/ipc.d.ts.map +1 -0
- package/dist/sandbox/ipc.js +154 -0
- package/dist/sandbox/ipc.js.map +1 -0
- package/dist/sandbox/manager.d.ts +4 -0
- package/dist/sandbox/manager.d.ts.map +1 -0
- package/dist/sandbox/manager.js +251 -0
- package/dist/sandbox/manager.js.map +1 -0
- package/dist/sandbox/namespace.d.ts +12 -0
- package/dist/sandbox/namespace.d.ts.map +1 -0
- package/dist/sandbox/namespace.js +119 -0
- package/dist/sandbox/namespace.js.map +1 -0
- package/dist/sandbox/proxy-tools.d.ts +14 -0
- package/dist/sandbox/proxy-tools.d.ts.map +1 -0
- package/dist/sandbox/proxy-tools.js +63 -0
- package/dist/sandbox/proxy-tools.js.map +1 -0
- package/dist/sandbox/rootfs.d.ts +20 -0
- package/dist/sandbox/rootfs.d.ts.map +1 -0
- package/dist/sandbox/rootfs.js +247 -0
- package/dist/sandbox/rootfs.js.map +1 -0
- package/dist/sandbox/seccomp-apply.d.ts +9 -0
- package/dist/sandbox/seccomp-apply.d.ts.map +1 -0
- package/dist/sandbox/seccomp-apply.js +227 -0
- package/dist/sandbox/seccomp-apply.js.map +1 -0
- package/dist/sandbox/seccomp.d.ts +13 -0
- package/dist/sandbox/seccomp.d.ts.map +1 -0
- package/dist/sandbox/seccomp.js +120 -0
- package/dist/sandbox/seccomp.js.map +1 -0
- package/dist/sandbox/types.d.ts +66 -0
- package/dist/sandbox/types.d.ts.map +1 -0
- package/dist/sandbox/types.js +8 -0
- package/dist/sandbox/types.js.map +1 -0
- package/dist/sandbox/worker.d.ts +15 -0
- package/dist/sandbox/worker.d.ts.map +1 -0
- package/dist/sandbox/worker.js +151 -0
- package/dist/sandbox/worker.js.map +1 -0
- package/dist/sessions/index.d.ts +3 -0
- package/dist/sessions/index.d.ts.map +1 -0
- package/dist/sessions/index.js +3 -0
- package/dist/sessions/index.js.map +1 -0
- package/dist/sessions/store.d.ts +17 -0
- package/dist/sessions/store.d.ts.map +1 -0
- package/dist/sessions/store.js +70 -0
- package/dist/sessions/store.js.map +1 -0
- package/dist/sessions/transcript-events.d.ts +11 -0
- package/dist/sessions/transcript-events.d.ts.map +1 -0
- package/dist/sessions/transcript-events.js +40 -0
- package/dist/sessions/transcript-events.js.map +1 -0
- package/dist/shared/agent-session.d.ts +10 -0
- package/dist/shared/agent-session.d.ts.map +1 -0
- package/dist/shared/agent-session.js +33 -0
- package/dist/shared/agent-session.js.map +1 -0
- package/dist/shared/constants.d.ts +6 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/constants.js +17 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/fs.d.ts +7 -0
- package/dist/shared/fs.d.ts.map +1 -0
- package/dist/shared/fs.js +14 -0
- package/dist/shared/fs.js.map +1 -0
- package/dist/shared/index.d.ts +4 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +4 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/skills/enablement.d.ts +10 -0
- package/dist/skills/enablement.d.ts.map +1 -0
- package/dist/skills/enablement.js +52 -0
- package/dist/skills/enablement.js.map +1 -0
- package/dist/skills/index.d.ts +4 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +4 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/loader.d.ts +8 -0
- package/dist/skills/loader.d.ts.map +1 -0
- package/dist/skills/loader.js +8 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/registry.d.ts +19 -0
- package/dist/skills/registry.d.ts.map +1 -0
- package/dist/skills/registry.js +106 -0
- package/dist/skills/registry.js.map +1 -0
- package/dist/utils/boolean.d.ts +6 -0
- package/dist/utils/boolean.d.ts.map +1 -0
- package/dist/utils/boolean.js +28 -0
- package/dist/utils/boolean.js.map +1 -0
- package/dist/utils/run-with-concurrency.d.ts +12 -0
- package/dist/utils/run-with-concurrency.d.ts.map +1 -0
- package/dist/utils/run-with-concurrency.js +40 -0
- package/dist/utils/run-with-concurrency.js.map +1 -0
- package/dist/utils.d.ts +3 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +38 -0
- package/dist/utils.js.map +1 -0
- package/dist/workspace/index.d.ts +3 -0
- package/dist/workspace/index.d.ts.map +1 -0
- package/dist/workspace/index.js +2 -0
- package/dist/workspace/index.js.map +1 -0
- package/dist/workspace/runner.d.ts +19 -0
- package/dist/workspace/runner.d.ts.map +1 -0
- package/dist/workspace/runner.js +491 -0
- package/dist/workspace/runner.js.map +1 -0
- package/dist/workspace/types.d.ts +37 -0
- package/dist/workspace/types.d.ts.map +1 -0
- package/dist/workspace/types.js +2 -0
- package/dist/workspace/types.js.map +1 -0
- package/dist/workspace/workspace.d.ts +12 -0
- package/dist/workspace/workspace.d.ts.map +1 -0
- package/dist/workspace/workspace.js +85 -0
- package/dist/workspace/workspace.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { createAgentSession, SessionManager, codingTools, } from "@mariozechner/pi-coding-agent";
|
|
2
|
+
import { getModel } from "@mariozechner/pi-ai";
|
|
3
|
+
import { createHookRunner } from "../hooks/index.js";
|
|
4
|
+
import { createSimpleMemoryManager } from "../memory/index.js";
|
|
5
|
+
import { createEmbeddingProvider } from "../memory/embeddings.js";
|
|
6
|
+
import { getOrCreateSession, updateSession, } from "../sessions/index.js";
|
|
7
|
+
import { loadWorkspaceSkills } from "../skills/index.js";
|
|
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";
|
|
19
|
+
import * as path from "node:path";
|
|
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
|
+
}
|
|
27
|
+
export async function createRuntime(overrides) {
|
|
28
|
+
assertLinux();
|
|
29
|
+
const fileConfig = loadConfig(overrides?.configPath);
|
|
30
|
+
const config = { ...fileConfig, ...overrides };
|
|
31
|
+
const stateDir = resolveStateDir(config);
|
|
32
|
+
if (config.logging) {
|
|
33
|
+
configureLogger(config.logging);
|
|
34
|
+
}
|
|
35
|
+
const hooks = createHookRunner();
|
|
36
|
+
const memoryDir = config.memory?.dir ?? path.join(stateDir, "memory");
|
|
37
|
+
// Create embedding provider from config if available
|
|
38
|
+
const embeddingProvider = config.memory?.embeddingProvider
|
|
39
|
+
? createEmbeddingProvider(config.memory.embeddingProvider)
|
|
40
|
+
: undefined;
|
|
41
|
+
const memory = createSimpleMemoryManager({ dbDir: memoryDir, embeddingProvider });
|
|
42
|
+
fs.mkdirSync(stateDir, { recursive: true });
|
|
43
|
+
const memoryFlushState = createMemoryFlushState();
|
|
44
|
+
async function run(options) {
|
|
45
|
+
const sessionId = options.sessionId ?? `session_${Date.now()}`;
|
|
46
|
+
const requestedModelId = options.model ?? config.model ?? DEFAULT_MODEL;
|
|
47
|
+
const requestedProvider = (options.provider ?? config.provider ?? DEFAULT_PROVIDER);
|
|
48
|
+
const workspaceDir = options.workspaceDir ?? config.workspaceDir ?? process.cwd();
|
|
49
|
+
const sessionsDir = path.join(stateDir, "sessions", sessionId);
|
|
50
|
+
fs.mkdirSync(sessionsDir, { recursive: true });
|
|
51
|
+
await getOrCreateSession(stateDir, sessionId, { model: requestedModelId });
|
|
52
|
+
await hooks.run("session_start", { sessionId });
|
|
53
|
+
await hooks.run("before_agent_start", {
|
|
54
|
+
sessionId,
|
|
55
|
+
message: options.message,
|
|
56
|
+
model: requestedModelId,
|
|
57
|
+
});
|
|
58
|
+
let skillsPrompt = "";
|
|
59
|
+
if (config.skills?.enabled !== false) {
|
|
60
|
+
try {
|
|
61
|
+
const snapshot = loadWorkspaceSkills(workspaceDir);
|
|
62
|
+
skillsPrompt = snapshot.promptText;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// skills loading is optional
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const systemPrompt = [
|
|
69
|
+
options.systemPrompt ?? config.systemPrompt ?? "",
|
|
70
|
+
skillsPrompt,
|
|
71
|
+
]
|
|
72
|
+
.filter(Boolean)
|
|
73
|
+
.join("\n\n");
|
|
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
|
+
});
|
|
226
|
+
}
|
|
227
|
+
return runWithKey(uniqueKeys[0] ?? "");
|
|
228
|
+
}
|
|
229
|
+
const fallbackResult = await runWithModelFallback({
|
|
230
|
+
provider: requestedProvider,
|
|
231
|
+
model: requestedModelId,
|
|
232
|
+
fallbacks: options.fallbacks,
|
|
233
|
+
run: executeWithModel,
|
|
234
|
+
});
|
|
235
|
+
await hooks.run("after_agent_end", {
|
|
236
|
+
sessionId,
|
|
237
|
+
result: fallbackResult.result.response,
|
|
238
|
+
});
|
|
239
|
+
await hooks.run("session_end", { sessionId });
|
|
240
|
+
await updateSession(stateDir, sessionId, {
|
|
241
|
+
model: fallbackResult.model,
|
|
242
|
+
});
|
|
243
|
+
return {
|
|
244
|
+
...fallbackResult.result,
|
|
245
|
+
fallbackUsed: fallbackResult.attempts.length > 0,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
return { run, hooks, memory, config };
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/runtime/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,WAAW,GAKZ,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAmB,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAA4B,MAAM,oBAAoB,CAAC;AACzF,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EACL,kBAAkB,EAClB,aAAa,GACd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,mBAAmB,EAAsB,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EACL,UAAU,EACV,eAAe,GAEhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,8BAA8B,GAC/B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACnH,OAAO,EACL,yBAAyB,EACzB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,0BAA0B,GAE3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,MAAM,GAAG,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;AAmC7C,SAAS,WAAW;IAClB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,SAAuC;IAEvC,WAAW,EAAE,CAAC;IACd,MAAM,UAAU,GAAG,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACrD,MAAM,MAAM,GAAuB,EAAE,GAAG,UAAU,EAAE,GAAG,SAAS,EAAE,CAAC;IACnE,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAEzC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEtE,qDAAqD;IACrD,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB;QACxD,CAAC,CAAC,uBAAuB,CAAC,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC;QAC1D,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,MAAM,GAAG,yBAAyB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAElF,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,MAAM,gBAAgB,GAAG,sBAAsB,EAAE,CAAC;IAElD,KAAK,UAAU,GAAG,CAAC,OAAwB;QACzC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,WAAW,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC/D,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,aAAa,CAAC;QACxE,MAAM,iBAAiB,GACrB,CAAC,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,IAAI,gBAAgB,CAAW,CAAC;QACtE,MAAM,YAAY,GAChB,OAAO,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAE/D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;QAC/D,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE/C,MAAM,kBAAkB,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAE3E,MAAM,KAAK,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAChD,MAAM,KAAK,CAAC,GAAG,CAAC,oBAAoB,EAAE;YACpC,SAAS;YACT,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,KAAK,EAAE,gBAAgB;SACxB,CAAC,CAAC;QAEH,IAAI,YAAY,GAAG,EAAE,CAAC;QACtB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,KAAK,KAAK,EAAE,CAAC;YACrC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAkB,mBAAmB,CAAC,YAAY,CAAC,CAAC;gBAClE,YAAY,GAAG,QAAQ,CAAC,UAAU,CAAC;YACrC,CAAC;YAAC,MAAM,CAAC;gBACP,6BAA6B;YAC/B,CAAC;QACH,CAAC;QAED,MAAM,YAAY,GAAG;YACnB,OAAO,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,IAAI,EAAE;YACjD,YAAY;SACb;aACE,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,MAAM,CAAC,CAAC;QAEhB,KAAK,UAAU,gBAAgB,CAC7B,QAAgB,EAChB,OAAe;YAEf,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YAE7C,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,IAAI,OAAO,CAAC,MAAM;gBAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACjD,IAAI,OAAO,CAAC,OAAO;gBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;YACtD,IAAI,MAAM,CAAC,MAAM;gBAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC/C,OAAO,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC;YAElD,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACrE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACnC,IAAI,MAAM;oBAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtC,CAAC;YAED,KAAK,UAAU,UAAU,CAAC,MAAc;gBACtC,MAAM,KAAK,GAAG,QAAQ,CACpB,QAA0C,EAC1C,OAAgB,CACjB,CAAC;gBAEF,MAAM,OAAO,GAAG,wBAAwB,CAAC;oBACvC,kBAAkB,EAAE,KAAK,CAAC,aAAa;oBACvC,mBAAmB,EAAE,OAAO,CAAC,aAAa;iBAC3C,CAAC,CAAC;gBACH,MAAM,QAAQ,GAAG,0BAA0B,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC/D,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;oBACzB,MAAM,IAAI,KAAK,CACb,6BAA6B,QAAQ,CAAC,MAAM,sBAAsB,8BAA8B,GAAG,CACpG,CAAC;gBACJ,CAAC;gBAED,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC7C,IAAI,MAAM;oBAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;gBAEzC,IAAI,CAAC;oBACH,MAAM,cAAc,GAAG,qBAAqB,CAC1C,cAAc,EACd,YAAY,EACZ,WAAW,CACZ,CAAC;oBAEF,MAAM,WAAW,GACf,MAAM,CAAC,MAAM,EAAE,OAAO,KAAK,KAAK;wBAC9B,CAAC,CAAE,iBAAiB,CAAC,MAAM,CAAiC;wBAC5D,CAAC,CAAC,EAAE,CAAC;oBAET,MAAM,WAAW,GAAqB;wBACpC,GAAG,WAAW;wBACd,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;qBACzB,CAAC;oBAEF,IAAI,OAAO,CAAC,eAAe,KAAK,KAAK,EAAE,CAAC;wBACtC,MAAM,OAAO,GAAG,kBAAkB,CAAC;4BACjC,OAAO,EAAE;gCACP,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;oCACZ,MAAM,OAAO,GAAG,IAAkC,CAAC;oCACnD,OAAO,GAAG,CAAC;wCACT,GAAG,OAAO;wCACV,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,kEAAkE;qCACzG,CAAC,CAAC;gCACL,CAAC;6BACF;yBACF,CAAC,CAAC;wBACH,WAAW,CAAC,IAAI,CAAC,OAAoC,CAAC,CAAC;oBACzD,CAAC;oBAED,MAAM,WAAW,GAA8B;wBAC7C,GAAG,EAAE,YAAY;wBACjB,KAAK;wBACL,KAAK,EAAE,CAAC,GAAG,WAAW,CAAC;wBACvB,WAAW;wBACX,cAAc;qBACf,CAAC;oBAEF,OAAO,MAAM,UAAU,CACrB,KAAK,IAAI,EAAE;wBACT,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,kBAAkB,CAAC,WAAW,CAAC,CAAC;wBAE1D,MAAM,eAAe,GAAG,IAAI,GAAG,EAG5B,CAAC;wBACJ,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CACnC,CAAC,KAAwB,EAAE,EAAE;4BAC3B,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;4BACzB,IAAI,KAAK,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;gCAC1C,eAAe,CAAC,GAAG,CACjB,KAAK,CAAC,UAAU,EACf,KAAK,CAAC,IAAgC,IAAI,EAAE,CAC9C,CAAC;gCACF,KAAK;qCACF,GAAG,CAAC,kBAAkB,EAAE;oCACvB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oCACxB,KAAK,EACF,KAAK,CAAC,IAAgC,IAAI,EAAE;iCAChD,CAAC;qCACD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;4BACrB,CAAC;4BACD,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;gCACxC,MAAM,KAAK,GACT,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;gCAC9C,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gCACzC,KAAK;qCACF,GAAG,CAAC,iBAAiB,EAAE;oCACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oCACxB,KAAK;oCACL,MAAM,EAAE,KAAK,CAAC,MAAM;iCACrB,CAAC;qCACD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;4BACrB,CAAC;wBACH,CAAC,CACF,CAAC;wBAEF,IAAI,CAAC;4BACH,MAAM,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;wBACjD,CAAC;gCAAS,CAAC;4BACT,WAAW,EAAE,CAAC;wBAChB,CAAC;wBAED,MAAM,YAAY,GAAG,wBAAwB,CAC3C,OAAO,CAAC,QAAQ,CACjB,CAAC;wBACF,OAAO;4BACL,QAAQ,EAAE,YAAY;4BACtB,SAAS;4BACT,QAAQ;4BACR,KAAK,EAAE,OAAO;yBACf,CAAC;oBACJ,CAAC,EACD;wBACE,QAAQ,EAAE,OAAO,CAAC,UAAU,IAAI,CAAC;wBACjC,UAAU,EAAE,IAAI;wBAChB,UAAU,EAAE,MAAM;wBAClB,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE;4BACnB,MAAM,GAAG,GACP,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;4BACnD,IAAI,4BAA4B,CAAC,GAAG,CAAC,EAAE,CAAC;gCACtC,GAAG,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;gCACtC,IACE,MAAM,CAAC,MAAM,EAAE,OAAO,KAAK,KAAK;oCAChC,oBAAoB,CAAC;wCACnB,eAAe,EAAE,OAAO,CAAC,MAAM;wCAC/B,mBAAmB,EAAE,OAAO,CAAC,MAAM;wCACnC,SAAS;wCACT,KAAK,EAAE,gBAAgB;qCACxB,CAAC,EACF,CAAC;oCACD,GAAG,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;oCAChD,iBAAiB,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;oCAC/C,GAAG,CAAC;wCACF,OAAO,EAAE,mBAAmB;wCAC5B,SAAS;wCACT,KAAK,EAAE,OAAO;wCACd,QAAQ;wCACR,MAAM;wCACN,YAAY,EAAE,0BAA0B;wCACxC,eAAe,EAAE,KAAK;wCACtB,UAAU,EAAE,CAAC;qCACd,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE;wCACpB,GAAG,CAAC,IAAI,CAAC,wBAAwB,QAAQ,YAAY,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oCACtG,CAAC,CAAC,CAAC;gCACL,CAAC;gCACD,OAAO,IAAI,CAAC;4BACd,CAAC;4BACD,OAAO,uBAAuB,CAAC,GAAG,CAAC,IAAI,qBAAqB,CAAC,GAAG,CAAC,CAAC;wBACpE,CAAC;wBACD,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE;4BAC5B,GAAG,CAAC,IAAI,CACN,iBAAiB,OAAO,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAChF,CAAC;wBACJ,CAAC;qBACF,CACF,CAAC;gBACJ,CAAC;wBAAS,CAAC;oBACT,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;wBACnC,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBAC7B,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,gBAAgB,CAAC;oBACzC,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,OAAO,yBAAyB,CAAC;oBAC/B,QAAQ;oBACR,OAAO,EAAE,UAAU;oBACnB,OAAO,EAAE,UAAU;iBACpB,CAAC,CAAC;YACL,CAAC;YAED,OAAO,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,cAAc,GAAG,MAAM,oBAAoB,CAAC;YAChD,QAAQ,EAAE,iBAAiB;YAC3B,KAAK,EAAE,gBAAgB;YACvB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,GAAG,EAAE,gBAAgB;SACtB,CAAC,CAAC;QAEH,MAAM,KAAK,CAAC,GAAG,CAAC,iBAAiB,EAAE;YACjC,SAAS;YACT,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,QAAQ;SACvC,CAAC,CAAC;QACH,MAAM,KAAK,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAE9C,MAAM,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE;YACvC,KAAK,EAAE,cAAc,CAAC,KAAK;SAC5B,CAAC,CAAC;QAEH,OAAO;YACL,GAAG,cAAc,CAAC,MAAM;YACxB,YAAY,EAAE,cAAc,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;SACjD,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AACxC,CAAC"}
|
|
@@ -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: "CLOISON_LIVE_ANTHROPIC_KEY",
|
|
11
|
+
listVar: "CLOISON_LIVE_ANTHROPIC_KEYS",
|
|
12
|
+
primaryVar: "ANTHROPIC_API_KEY",
|
|
13
|
+
prefixedVar: "ANTHROPIC_API_KEY_",
|
|
14
|
+
},
|
|
15
|
+
google: {
|
|
16
|
+
liveSingle: "CLOISON_LIVE_GEMINI_KEY",
|
|
17
|
+
listVar: "GEMINI_API_KEYS",
|
|
18
|
+
primaryVar: "GEMINI_API_KEY",
|
|
19
|
+
prefixedVar: "GEMINI_API_KEY_",
|
|
20
|
+
},
|
|
21
|
+
"google-vertex": {
|
|
22
|
+
liveSingle: "CLOISON_LIVE_GEMINI_KEY",
|
|
23
|
+
listVar: "GEMINI_API_KEYS",
|
|
24
|
+
primaryVar: "GEMINI_API_KEY",
|
|
25
|
+
prefixedVar: "GEMINI_API_KEY_",
|
|
26
|
+
},
|
|
27
|
+
openai: {
|
|
28
|
+
liveSingle: "CLOISON_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 ?? `CLOISON_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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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export type FailoverReason = "auth" | "auth_permanent" | "format" | "rate_limit" | "overloaded" | "billing" | "timeout" | "model_not_found" | "session_expired" | "unknown";
|
|
2
|
+
export type FailoverSignal = {
|
|
3
|
+
status?: number;
|
|
4
|
+
code?: string;
|
|
5
|
+
message?: string;
|
|
6
|
+
};
|
|
7
|
+
export type FailoverClassification = {
|
|
8
|
+
kind: "reason";
|
|
9
|
+
reason: FailoverReason;
|
|
10
|
+
} | {
|
|
11
|
+
kind: "context_overflow";
|
|
12
|
+
};
|
|
13
|
+
export declare class FailoverError extends Error {
|
|
14
|
+
readonly reason: FailoverReason;
|
|
15
|
+
readonly provider?: string;
|
|
16
|
+
readonly model?: string;
|
|
17
|
+
readonly profileId?: string;
|
|
18
|
+
readonly status?: number;
|
|
19
|
+
readonly code?: string;
|
|
20
|
+
constructor(message: string, params: {
|
|
21
|
+
reason: FailoverReason;
|
|
22
|
+
provider?: string;
|
|
23
|
+
model?: string;
|
|
24
|
+
profileId?: string;
|
|
25
|
+
status?: number;
|
|
26
|
+
code?: string;
|
|
27
|
+
cause?: unknown;
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
export declare function isFailoverError(err: unknown): err is FailoverError;
|
|
31
|
+
export declare function resolveFailoverStatus(reason: FailoverReason): number | undefined;
|
|
32
|
+
export declare function isRateLimitErrorMessage(raw: string): boolean;
|
|
33
|
+
export declare function isTimeoutErrorMessage(raw: string): boolean;
|
|
34
|
+
export declare function isOverloadedErrorMessage(raw: string): boolean;
|
|
35
|
+
export declare function isBillingErrorMessage(raw: string): boolean;
|
|
36
|
+
export declare function isAuthPermanentErrorMessage(raw: string): boolean;
|
|
37
|
+
export declare function isAuthErrorMessage(raw: string): boolean;
|
|
38
|
+
export declare function isTransientHttpError(raw: string): boolean;
|
|
39
|
+
export declare function isModelNotFoundErrorMessage(raw: string): boolean;
|
|
40
|
+
export declare function isImageDimensionErrorMessage(raw: string): boolean;
|
|
41
|
+
export declare function isImageSizeError(errorMessage?: string): boolean;
|
|
42
|
+
export declare function isCliSessionExpiredErrorMessage(raw: string): boolean;
|
|
43
|
+
export declare function isPeriodicUsageLimitErrorMessage(raw: string): boolean;
|
|
44
|
+
export declare function matchesProviderContextOverflow(errorMessage: string): boolean;
|
|
45
|
+
export declare function classifyProviderSpecificError(errorMessage: string): FailoverReason | null;
|
|
46
|
+
export declare function isContextOverflowError(errorMessage?: string): boolean;
|
|
47
|
+
export declare function isLikelyContextOverflowError(errorMessage?: string): boolean;
|
|
48
|
+
export declare function classifyFailoverSignal(signal: FailoverSignal): FailoverClassification | null;
|
|
49
|
+
export declare function isTimeoutError(err: unknown): boolean;
|
|
50
|
+
export declare function resolveFailoverReasonFromError(err: unknown): FailoverReason | null;
|
|
51
|
+
export declare function describeFailoverError(err: unknown): {
|
|
52
|
+
message: string;
|
|
53
|
+
reason?: FailoverReason;
|
|
54
|
+
status?: number;
|
|
55
|
+
code?: string;
|
|
56
|
+
};
|
|
57
|
+
export declare function coerceToFailoverError(err: unknown, context?: {
|
|
58
|
+
provider?: string;
|
|
59
|
+
model?: string;
|
|
60
|
+
profileId?: string;
|
|
61
|
+
}): FailoverError | null;
|
|
62
|
+
//# sourceMappingURL=failover-error.d.ts.map
|